57 : StdExpansion(Ba.GetNumModes(), 1, Ba),
58 StdExpansion1D(Ba.GetNumModes(), Ba), StdRegions::StdSegExp(Ba),
61 std::bind(&
SegExp::CreateMatrix, this,
std::placeholders::_1),
62 std::string(
"SegExpMatrix")),
63 m_staticCondMatrixManager(
std::bind(&
Expansion::CreateStaticCondMatrix,
64 this,
std::placeholders::_1),
65 std::string(
"SegExpStaticCondMatrix"))
74 : StdExpansion(S), StdExpansion1D(S), StdRegions::StdSegExp(S),
76 m_staticCondMatrixManager(S.m_staticCondMatrixManager)
100 int nquad0 =
m_base[0]->GetNumPoints();
116 ival = StdSegExp::v_Integral(tmp);
150 int nquad0 =
m_base[0]->GetNumPoints();
161 Vmath::Vmul(nquad0, &gmat[0][0], 1, &diff[0], 1, &out_d0[0], 1);
166 Vmath::Vmul(nquad0, &gmat[1][0], 1, &diff[0], 1, &out_d1[0], 1);
171 Vmath::Vmul(nquad0, &gmat[2][0], 1, &diff[0], 1, &out_d2[0], 1);
178 Vmath::Smul(nquad0, gmat[0][0], diff, 1, out_d0, 1);
183 Vmath::Smul(nquad0, gmat[1][0], diff, 1, out_d1, 1);
188 Vmath::Smul(nquad0, gmat[2][0], diff, 1, out_d2, 1);
204 int nquad0 =
m_base[0]->GetNumPoints();
205 int coordim =
m_geom->GetCoordim();
243 int nquad0 =
m_base[0]->GetNumPoints();
246 int coordim =
m_geom->GetCoordim();
258 cout <<
"der_n" << endl;
259 for (
int k = 0; k < coordim; ++k)
267 for (
int i = 0; i < nquad0; i++)
269 cout <<
"nx= " << normals[0][i] <<
" ny=" << normals[1][i]
273 "normal vectors do not exist: check if a"
274 "boundary region is defined as I ");
276 Vmath::Vmul(nquad0, normals[0], 1, inarray_d0, 1, out_dn_tmp, 1);
277 Vmath::Vadd(nquad0, out_dn_tmp, 1, out_dn, 1, out_dn, 1);
279 Vmath::Vmul(nquad0, normals[1], 1, inarray_d1, 1, out_dn_tmp, 1);
280 Vmath::Vadd(nquad0, out_dn_tmp, 1, out_dn, 1, out_dn, 1);
282 for (
int i = 0; i < nquad0; i++)
284 cout <<
"deps/dx =" << inarray_d0[i]
285 <<
" deps/dy=" << inarray_d1[i] << endl;
315 ASSERTL1(
false,
"input dir is out of range");
349 if (
m_base[0]->Collocation())
365 out = (*matsys) * in;
373 if (
m_base[0]->Collocation())
403 "Cannot use FwdTrans_BndConstrained with these points.");
408 ASSERTL0(
false,
"This type of FwdTrans is not defined"
409 "for this expansion type");
412 fill(outarray.get(), outarray.get() +
m_ncoeffs, 0.0);
440 Blas::Dgemv(
'N', nInteriorDofs, nInteriorDofs, matsys->Scale(),
441 &((matsys->GetOwnedMatrix())->GetPtr())[0],
442 nInteriorDofs, tmp1.get() + offset, 1, 0.0,
443 outarray.get() + offset, 1);
509 int nquad0 =
m_base[0]->GetNumPoints();
522 StdSegExp::v_IProductWRTBase(base, tmp, outarray, coll_check);
529 ASSERTL1(dir < 3,
"input dir is out of range");
531 "input dir is out of range");
533 int nquad =
m_base[0]->GetNumPoints();
541 Vmath::Vmul(nquad, gmat[dir], 1, inarray, 1, tmp1, 1);
545 Vmath::Smul(nquad, gmat[dir][0], inarray, 1, tmp1, 1);
555 int nq =
m_base[0]->GetNumPoints();
563 Vmath::Vmul(nq, &Fx[0], 1, &normals[0][0], 1, &Fn[0], 1);
564 Vmath::Vvtvp(nq, &Fy[0], 1, &normals[1][0], 1, &Fn[0], 1, &Fn[0], 1);
590 return StdExpansion1D::v_PhysEvaluate(Lcoord, physvals);
599 m_geom->GetLocCoords(coord, Lcoord);
601 return StdExpansion1D::v_PhysEvaluate(Lcoord, physvals);
606 std::array<NekDouble, 3> &firstOrderDerivs)
610 m_geom->GetLocCoords(coord, Lcoord);
611 return StdSegExp::v_PhysEvaluate(Lcoord, inarray, firstOrderDerivs);
616 std::array<NekDouble, 3> &firstOrderDerivs,
617 std::array<NekDouble, 6> &secondOrderDerivs)
621 m_geom->GetLocCoords(coord, Lcoord);
622 return StdSegExp::v_PhysEvaluate(Lcoord, inarray, firstOrderDerivs,
631 ASSERTL1(Lcoords[0] >= -1.0 && Lcoords[0] <= 1.0,
632 "Local coordinates are not in region [-1,1]");
635 for (i = 0; i <
m_geom->GetCoordim(); ++i)
637 coords[i] =
m_geom->GetCoord(i, Lcoords);
653 int nquad =
m_base[0]->GetNumPoints();
660 outarray = inarray[0];
663 outarray = inarray[nquad - 1];
678 Blas::Ddot(nquad, mat_gauss->GetOwnedMatrix()->GetPtr().get(), 1,
693 outarray[0] = result;
699 int nquad =
m_base[0]->GetNumPoints();
701 ASSERTL1(vertex == 0 || vertex == 1,
"Vertex value should be 0 or 1");
705 map[0] = vertex == 0 ? 0 : nquad - 1;
719 if (&inarray[0] != &outarray[0])
734 m_base[0]->GetBasisKey());
740 m_base[0]->GetPointsKey());
764 const NekDouble *data,
const std::vector<unsigned int> &nummodes,
765 const int mode_offset,
NekDouble *coeffs,
766 [[maybe_unused]] std::vector<LibUtilities::BasisType> &fromType)
772 int fillorder = min((
int)nummodes[mode_offset],
m_ncoeffs);
801 ASSERTL0(
false,
"basis is either not set up or not hierarchicial");
818 for (i = 0; i < vCoordDim; ++i)
824 size_t nbnd = vertex;
837 for (i = 0; i < vCoordDim; ++i)
843 for (i = 0; i < vCoordDim; ++i)
849 ASSERTL0(
false,
"point is out of range (point < 2)");
854 for (i = 0; i < vCoordDim; ++i)
856 vert += normal[i][0] * normal[i][0];
858 vert = 1.0 /
sqrt(vert);
862 for (i = 0; i < vCoordDim; ++i)
864 Vmath::Smul(nqe, vert, normal[i], 1, normal[i], 1);
878 int nquad =
m_base[0]->GetNumPoints();
888 switch (
m_geom->GetCoordim())
897 Vmath::Vmul(nquad, &gmat[0][0], 1, dPhysValuesdx.get(), 1,
898 dPhysValuesdx.get(), 1);
902 Blas::Dscal(nquad, gmat[0][0], dPhysValuesdx.get(), 1);
910 PhysDeriv(physValues, dPhysValuesdx, dPhysValuesdy);
915 Vmath::Vmul(nquad, &gmat[0][0], 1, dPhysValuesdx.get(), 1,
916 dPhysValuesdx.get(), 1);
917 Vmath::Vvtvp(nquad, &gmat[1][0], 1, dPhysValuesdy.get(), 1,
918 dPhysValuesdx.get(), 1, dPhysValuesdx.get(), 1);
922 Blas::Dscal(nquad, gmat[0][0], dPhysValuesdx.get(), 1);
923 Blas::Daxpy(nquad, gmat[1][0], dPhysValuesdy.get(), 1,
924 dPhysValuesdx.get(), 1);
933 PhysDeriv(physValues, dPhysValuesdx, dPhysValuesdy, dPhysValuesdz);
938 Vmath::Vmul(nquad, &gmat[0][0], 1, dPhysValuesdx.get(), 1,
939 dPhysValuesdx.get(), 1);
940 Vmath::Vvtvp(nquad, &gmat[1][0], 1, dPhysValuesdy.get(), 1,
941 dPhysValuesdx.get(), 1, dPhysValuesdx.get(), 1);
942 Vmath::Vvtvp(nquad, &gmat[2][0], 1, dPhysValuesdz.get(), 1,
943 dPhysValuesdx.get(), 1, dPhysValuesdx.get(), 1);
947 Blas::Dscal(nquad, gmat[0][0], dPhysValuesdx.get(), 1);
948 Blas::Daxpy(nquad, gmat[1][0], dPhysValuesdy.get(), 1,
949 dPhysValuesdx.get(), 1);
950 Blas::Daxpy(nquad, gmat[2][0], dPhysValuesdz.get(), 1,
951 dPhysValuesdx.get(), 1);
956 ASSERTL0(
false,
"Wrong number of dimensions");
967 int nquad =
m_base[0]->GetNumPoints();
982 switch (
m_geom->GetCoordim())
991 Vmath::Vmul(nquad, &gmat[0][0], 1, dPhysValuesdx.get(), 1,
992 dPhysValuesdx.get(), 1);
996 Blas::Dscal(nquad, gmat[0][0], dPhysValuesdx.get(), 1);
1004 PhysDeriv(physValues, dPhysValuesdx, dPhysValuesdy);
1009 Vmath::Vmul(nquad, &gmat[0][0], 1, dPhysValuesdx.get(), 1,
1010 dPhysValuesdx.get(), 1);
1011 Vmath::Vvtvp(nquad, &gmat[1][0], 1, dPhysValuesdy.get(), 1,
1012 dPhysValuesdx.get(), 1, dPhysValuesdx.get(), 1);
1016 Blas::Dscal(nquad, gmat[0][0], dPhysValuesdx.get(), 1);
1017 Blas::Daxpy(nquad, gmat[1][0], dPhysValuesdy.get(), 1,
1018 dPhysValuesdx.get(), 1);
1027 PhysDeriv(physValues, dPhysValuesdx, dPhysValuesdy, dPhysValuesdz);
1032 Vmath::Vmul(nquad, &gmat[0][0], 1, dPhysValuesdx.get(), 1,
1033 dPhysValuesdx.get(), 1);
1034 Vmath::Vvtvp(nquad, &gmat[1][0], 1, dPhysValuesdy.get(), 1,
1035 dPhysValuesdx.get(), 1, dPhysValuesdx.get(), 1);
1036 Vmath::Vvtvp(nquad, &gmat[2][0], 1, dPhysValuesdz.get(), 1,
1037 dPhysValuesdx.get(), 1, dPhysValuesdx.get(), 1);
1041 Blas::Dscal(nquad, gmat[0][0], dPhysValuesdx.get(), 1);
1042 Blas::Daxpy(nquad, gmat[1][0], dPhysValuesdy.get(), 1,
1043 dPhysValuesdx.get(), 1);
1044 Blas::Daxpy(nquad, gmat[2][0], dPhysValuesdz.get(), 1,
1045 dPhysValuesdx.get(), 1);
1050 ASSERTL0(
false,
"Wrong number of dimensions");
1088 return tmp->GetStdMatrix(mkey);
1098 "Geometric information is not set up");
1108 goto UseLocRegionsMatrix;
1113 goto UseStdRegionsMatrix;
1134 goto UseStdRegionsMatrix;
1146 goto UseLocRegionsMatrix;
1158 "Cannot call eWeakDeriv2 in a "
1159 "coordinate system which is not at "
1160 "least two-dimensional");
1165 "Cannot call eWeakDeriv2 in a "
1166 "coordinate system which is not "
1167 "three-dimensional");
1191 goto UseLocRegionsMatrix;
1195 int coordim =
m_geom->GetCoordim();
1197 for (
int i = 0; i < coordim; ++i)
1203 goto UseStdRegionsMatrix;
1216 int rows = LapMat.GetRows();
1217 int cols = LapMat.GetColumns();
1223 (*helm) = LapMat + factor * MassMat;
1264 coords[0] = (vertex == 0) ? -1.0 : 1.0;
1266 m_Ix =
m_base[0]->GetI(coords);
1272 UseLocRegionsMatrix:
1278 UseStdRegionsMatrix:
1307 returnval = StdSegExp::v_GenMatrix(mkey);
1329 ASSERTL1(&inarray[0] != &outarray[0],
1330 "inarray and outarray can not be the same");
1335 outarray[0] = inarray[1];
1336 outarray[1] = inarray[0];
1340 outarray[m] = sgn * inarray[m];
1348 outarray[
m_ncoeffs - 1 - m] = inarray[m];
1352 ASSERTL0(
false,
"This basis is not allowed in this method");
1373 out = (*matsys) * in;
#define ASSERTL0(condition, msg)
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mode...
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
#define ASSERTL2(condition, msg)
Assert Level 2 – Debugging which is used FULLDEBUG compilation mode. This level assert is designed to...
Describes the specification for a Basis.
Defines a specification for a set of points.
DNekMatSharedPtr v_GenMatrix(const StdRegions::StdMatrixKey &mkey) override
std::map< int, NormalVector > m_traceNormals
std::map< int, Array< OneD, NekDouble > > m_elmtBndNormDirElmtLen
the element length in each element boundary(Vertex, edge or face) normal direction calculated based o...
SpatialDomains::GeometrySharedPtr GetGeom() const
SpatialDomains::GeometrySharedPtr m_geom
ExpansionSharedPtr GetLeftAdjacentElementExp() const
void v_GetCoords(Array< OneD, NekDouble > &coords_1, Array< OneD, NekDouble > &coords_2, Array< OneD, NekDouble > &coords_3) override
int GetLeftAdjacentElementTrace() const
SpatialDomains::GeomFactorsSharedPtr m_metricinfo
void v_LaplacianMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey) override
void v_FwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
Forward transform from physical quadrature space stored in inarray and evaluate the expansion coeffic...
void v_DropLocMatrix(const MatrixKey &mkey) override
StdRegions::StdExpansionSharedPtr v_GetLinStdExp(void) const override
void v_GetTracePhysVals(const int edge, const StdRegions::StdExpansionSharedPtr &EdgeExp, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, StdRegions::Orientation orient) override
void v_PhysDeriv_s(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_ds) override
Evaluate the derivative along a line: . The derivative is calculated performing the product .
void v_GetVertexPhysVals(const int vertex, const Array< OneD, const NekDouble > &inarray, NekDouble &outarray) override
NekDouble v_StdPhysEvaluate(const Array< OneD, const NekDouble > &Lcoord, const Array< OneD, const NekDouble > &physvals) override
void ReverseCoeffsAndSign(const Array< OneD, NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Reverse the coefficients in a boundary interior expansion this routine is of use when we need the seg...
SegExp(const LibUtilities::BasisKey &Ba, const SpatialDomains::Geometry1DSharedPtr &geom)
Constructor using BasisKey class for quadrature points and order definition.
void v_NormVectorIProductWRTBase(const Array< OneD, const NekDouble > &Fx, const Array< OneD, const NekDouble > &Fy, Array< OneD, NekDouble > &outarray) override
DNekScalMatSharedPtr CreateMatrix(const MatrixKey &mkey)
StdRegions::StdExpansionSharedPtr v_GetStdExp(void) const override
void v_FwdTransBndConstrained(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
void v_IProductWRTBase(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
Inner product of inarray over region with respect to the expansion basis (this)->_Base[0] and return ...
DNekMatSharedPtr v_GenMatrix(const StdRegions::StdMatrixKey &mkey) override
LibUtilities::NekManager< MatrixKey, DNekScalBlkMat, MatrixKey::opLess > m_staticCondMatrixManager
NekDouble v_Integral(const Array< OneD, const NekDouble > &inarray) override
Integrate the physical point list inarray over region and return the value.
void v_HelmholtzMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey) override
void v_PhysDeriv_n(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_dn) override
Evaluate the derivative normal to a line: . The derivative is calculated performing the product .
void v_ExtractDataToCoeffs(const NekDouble *data, const std::vector< unsigned int > &nummodes, const int mode_offset, NekDouble *coeffs, std::vector< LibUtilities::BasisType > &fromType) override
Unpack data from input file assuming it comes from.
void v_PhysDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1=NullNekDouble1DArray, Array< OneD, NekDouble > &out_d2=NullNekDouble1DArray) override
Evaluate the derivative at the physical quadrature points given by inarray and return in outarray.
void v_GetCoords(Array< OneD, NekDouble > &coords_1, Array< OneD, NekDouble > &coords_2, Array< OneD, NekDouble > &coords_3) override
DNekScalBlkMatSharedPtr v_GetLocStaticCondMatrix(const MatrixKey &mkey) override
void MultiplyByElmtInvMass(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
int v_NumBndryCoeffs() const override
LibUtilities::NekManager< MatrixKey, DNekScalMat, MatrixKey::opLess > m_matrixManager
NekDouble v_PhysEvaluate(const Array< OneD, const NekDouble > &coord, const Array< OneD, const NekDouble > &physvals) override
void v_GetTracePhysMap(const int vertex, Array< OneD, int > &map) override
int v_NumDGBndryCoeffs() const override
DNekMatSharedPtr v_CreateStdMatrix(const StdRegions::StdMatrixKey &mkey) override
void v_SetCoeffsToOrientation(StdRegions::Orientation dir, Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
void v_DropLocStaticCondMatrix(const MatrixKey &mkey) override
const Array< OneD, const NekDouble > & v_GetPhysNormals() override
DNekScalMatSharedPtr v_GetLocMatrix(const MatrixKey &mkey) override
void v_GetCoord(const Array< OneD, const NekDouble > &Lcoords, Array< OneD, NekDouble > &coords) override
void v_ComputeTraceNormal(const int vertex) override
void v_IProductWRTDerivBase(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
void PhysTensorDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Evaluate the derivative at the physical quadrature points given by inarray and return in outarray.
LibUtilities::BasisType GetBasisType(const int dir) const
This function returns the type of basis used in the dir direction.
DNekMatSharedPtr GetStdMatrix(const StdMatrixKey &mkey)
const LibUtilities::PointsKeyVector GetPointsKeys() const
void MassMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
int GetVertexMap(const int localVertexId, bool useCoeffPacking=false)
void NormVectorIProductWRTBase(const Array< OneD, const NekDouble > &Fx, Array< OneD, NekDouble > &outarray)
LibUtilities::ShapeType DetShapeType() const
This function returns the shape of the expansion domain.
void BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
This function performs the Backward transformation from coefficient space to physical space.
DNekMatSharedPtr GenMatrix(const StdMatrixKey &mkey)
LibUtilities::PointsType GetPointsType(const int dir) const
This function returns the type of quadrature points used in the dir direction.
void PhysDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1=NullNekDouble1DArray, Array< OneD, NekDouble > &out_d2=NullNekDouble1DArray)
Array< OneD, LibUtilities::BasisSharedPtr > m_base
LibUtilities::ShapeType GetShapeType() const
const VarCoeffMap & GetVarCoeffs() const
MatrixType GetMatrixType() const
const ConstFactorMap & GetConstFactors() const
NekDouble GetConstFactor(const ConstFactorType &factor) const
static void Dgemv(const char &trans, const int &m, const int &n, const double &alpha, const double *a, const int &lda, const double *x, const int &incx, const double &beta, double *y, const int &incy)
BLAS level 2: Matrix vector multiply y = alpha A x plus beta y where A[m x n].
static void Dscal(const int &n, const double &alpha, double *x, const int &incx)
BLAS level 1: x = alpha x.
static double Ddot(const int &n, const double *x, const int &incx, const double *y, const int &incy)
BLAS level 1: output = .
static void Daxpy(const int &n, const double &alpha, const double *x, const int &incx, const double *y, const int &incy)
BLAS level 1: y = alpha x plus y.
void Interp1D(const BasisKey &fbasis0, const Array< OneD, const NekDouble > &from, const BasisKey &tbasis0, Array< OneD, NekDouble > &to)
this function interpolates a 1D function evaluated at the quadrature points of the basis fbasis0 to ...
std::vector< PointsKey > PointsKeyVector
@ eGaussLobattoLegendre
1D Gauss-Lobatto-Legendre quadrature points
@ ePolyEvenlySpaced
1D Evenly-spaced points using Lagrange polynomial
@ eGaussGaussLegendre
1D Gauss-Gauss-Legendre quadrature points
@ eModified_B
Principle Modified Functions .
@ eGauss_Lagrange
Lagrange Polynomials using the Gauss points.
@ eGLL_Lagrange
Lagrange for SEM basis .
@ eModified_A
Principle Modified Functions .
std::shared_ptr< GeomFactors > GeomFactorsSharedPtr
Pointer to a GeomFactors object.
GeomType
Indicates the type of element geometry.
@ eRegular
Geometry is straight-sided with constant geometric factors.
@ eNoGeomType
No type defined.
@ eMovingRegular
Currently unused.
@ eDeformed
Geometry is curved or has non-constant factors.
std::shared_ptr< Geometry1D > Geometry1DSharedPtr
std::shared_ptr< StdExpansion > StdExpansionSharedPtr
std::map< ConstFactorType, NekDouble > ConstFactorMap
std::shared_ptr< StdSegExp > StdSegExpSharedPtr
StdRegions::ConstFactorMap factors
std::shared_ptr< DNekScalMat > DNekScalMatSharedPtr
static Array< OneD, Array< OneD, NekDouble > > NullNekDoubleArrayOfArray
std::shared_ptr< DNekScalBlkMat > DNekScalBlkMatSharedPtr
static Array< OneD, NekDouble > NullNekDouble1DArray
std::shared_ptr< DNekMat > DNekMatSharedPtr
void Vmul(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x*y.
void Vvtvp(int n, const T *w, const int incw, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
vvtvp (vector times vector plus vector): z = w*x + y
void Vadd(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Add vector z = x+y.
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*x.
void Vdiv(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x/y.
void Zero(int n, T *x, const int incx)
Zero vector.
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
void Vsub(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Subtract vector z = x-y.
scalarT< T > sqrt(scalarT< T > in)