44 namespace LocalRegions
60 StdExpansion(Ba.GetNumModes(), 1, Ba),
61 StdExpansion1D(Ba.GetNumModes(), Ba),
62 StdRegions::StdSegExp(Ba),
66 boost::bind(&
SegExp::CreateMatrix, this, _1),
67 std::string(
"SegExpMatrix")),
68 m_staticCondMatrixManager(
69 boost::bind(&
SegExp::CreateStaticCondMatrix, this, _1),
70 std::string(
"SegExpStaticCondMatrix"))
82 StdRegions::StdSegExp(S),
85 m_matrixManager(S.m_matrixManager),
86 m_staticCondMatrixManager(S.m_staticCondMatrixManager)
120 int nquad0 =
m_base[0]->GetNumPoints();
136 ival = StdSegExp::v_Integral(tmp);
171 int nquad0 =
m_base[0]->GetNumPoints();
180 if(out_d0.num_elements())
186 if(out_d1.num_elements())
192 if(out_d2.num_elements())
200 if(out_d0.num_elements())
206 if(out_d1.num_elements())
212 if(out_d2.num_elements())
232 int nquad0 =
m_base[0]->GetNumPoints();
233 int coordim =
m_geom->GetCoordim();
272 int nquad0 =
m_base[0]->GetNumPoints();
275 int coordim =
m_geom->GetCoordim();
288 for(
int k=0; k<coordim; ++k)
295 for(
int i=0; i<nquad0; i++)
297 cout<<
"nx= "<<normals[0][i]<<
" ny="<<normals[1][i]<<endl;
300 "normal vectors do not exist: check if a"
301 "boundary region is defined as I ");
303 Vmath::Vmul(nquad0,normals[0],1,inarray_d0,1,out_dn_tmp,1);
304 Vmath::Vadd(nquad0,out_dn_tmp,1,out_dn,1,out_dn,1);
306 Vmath::Vmul(nquad0,normals[1],1,inarray_d1,1,out_dn_tmp,1);
307 Vmath::Vadd(nquad0,out_dn_tmp,1,out_dn,1,out_dn,1);
309 for(
int i=0; i<nquad0; i++)
311 cout<<
"deps/dx ="<<inarray_d0[i]<<
" deps/dy="<<inarray_d1[i]<<endl;
344 ASSERTL1(
false,
"input dir is out of range");
380 if (
m_base[0]->Collocation())
404 if(
m_base[0]->Collocation())
434 ASSERTL0(
false,
"This type of FwdTrans is not defined"
435 "for this expansion type");
438 fill(outarray.get(), outarray.get()+
m_ncoeffs, 0.0 );
445 inarray[
m_base[0]->GetNumPoints()-1];
468 Blas::Dgemv(
'N',nInteriorDofs,nInteriorDofs,
470 &((matsys->GetOwnedMatrix())->GetPtr())[0],
471 nInteriorDofs,tmp1.get()+offset,1,0.0,
472 outarray.get()+offset,1);
544 int nquad0 =
m_base[0]->GetNumPoints();
558 StdSegExp::v_IProductWRTBase(base,tmp,outarray,coll_check);
567 int nquad =
m_base[0]->GetNumPoints();
583 Vmath::Smul(nquad, gmat[0][0], inarray, 1, tmp1, 1);
595 Vmath::Smul(nquad, gmat[1][0], inarray, 1, tmp1, 1);
608 Vmath::Smul(nquad, gmat[2][0], inarray, 1, tmp1, 1);
614 ASSERTL1(
false,
"input dir is out of range");
626 int nq =
m_base[0]->GetNumPoints();
635 Vmath::Vmul (nq, &Fx[0], 1, &normals[0][0], 1, &Fn[0], 1);
636 Vmath::Vvtvp(nq, &Fy[0], 1, &normals[1][0], 1, &Fn[0], 1, &Fn[0], 1);
663 return StdSegExp::v_PhysEvaluate(Lcoord,physvals);
673 m_geom->GetLocCoords(coord,Lcoord);
675 return StdSegExp::v_PhysEvaluate(Lcoord, physvals);
685 ASSERTL1(Lcoords[0] >= -1.0&& Lcoords[0] <= 1.0,
686 "Local coordinates are not in region [-1,1]");
689 for(i = 0; i <
m_geom->GetCoordim(); ++i)
691 coords[i] =
m_geom->GetCoord(i,Lcoords);
709 int nquad =
m_base[0]->GetNumPoints();
716 outarray = inarray[0];
719 outarray = inarray[nquad - 1];
734 outarray =
Blas::Ddot(nquad, mat_gauss->GetOwnedMatrix()
735 ->GetPtr().get(), 1, &inarray[0], 1);
749 outarray[0] = result;
771 if (&inarray[0] != &outarray[0])
785 return m_geom->GetPorient(point);
798 2,
m_base[0]->GetPointsKey());
806 return m_geom->GetCoordim();
852 const std::vector<unsigned int > &nummodes,
853 const int mode_offset,
855 std::vector<LibUtilities::BasisType> &fromType)
861 int fillorder = min((
int) nummodes[mode_offset],
m_ncoeffs);
872 nummodes[mode_offset],
875 p0,data,
m_base[0]->GetPointsKey(), coeffs);
883 nummodes[mode_offset],
886 p0,data,
m_base[0]->GetPointsKey(), coeffs);
891 "basis is either not set up or not hierarchicial");
910 for (i = 0; i < vCoordDim; ++i)
924 for(i = 0; i < vCoordDim; ++i)
930 for(i = 0; i < vCoordDim; ++i)
937 "point is out of range (point < 2)");
942 for (i =0 ; i < vCoordDim; ++i)
944 vert += normal[i][0]*normal[i][0];
946 vert = 1.0/sqrt(vert);
947 for (i = 0; i < vCoordDim; ++i)
949 Vmath::Smul(nqe, vert, normal[i], 1, normal[i], 1);
964 int nquad =
m_base[0]->GetNumPoints();
974 switch (
m_geom->GetCoordim())
984 &gmat[0][0],1,dPhysValuesdx.get(),1,
985 dPhysValuesdx.get(),1);
990 gmat[0][0], dPhysValuesdx.get(), 1);
998 PhysDeriv(physValues,dPhysValuesdx,dPhysValuesdy);
1004 &gmat[0][0],1,dPhysValuesdx.get(),1,
1005 dPhysValuesdx.get(),1);
1007 &gmat[1][0],1,dPhysValuesdy.get(),1,
1008 dPhysValuesdx.get(),1,
1009 dPhysValuesdx.get(),1);
1014 gmat[0][0], dPhysValuesdx.get(), 1);
1016 gmat[1][0], dPhysValuesdy.get(), 1,
1017 dPhysValuesdx.get(), 1);
1027 dPhysValuesdy,dPhysValuesdz);
1033 &gmat[0][0], 1, dPhysValuesdx.get(), 1,
1034 dPhysValuesdx.get(),1);
1036 &gmat[1][0], 1, dPhysValuesdy.get(), 1,
1037 dPhysValuesdx.get(),1,
1038 dPhysValuesdx.get(),1);
1040 &gmat[2][0], 1, dPhysValuesdz.get(), 1,
1041 dPhysValuesdx.get(),1,
1042 dPhysValuesdx.get(),1);
1046 Blas::Dscal(nquad, gmat[0][0], dPhysValuesdx.get(), 1);
1048 gmat[1][0], dPhysValuesdy.get(), 1,
1049 dPhysValuesdx.get(), 1);
1051 gmat[2][0], dPhysValuesdz.get(), 1,
1052 dPhysValuesdx.get(), 1);
1057 ASSERTL0(
false,
"Wrong number of dimensions");
1070 int nquad =
m_base[0]->GetNumPoints();
1086 switch (
m_geom->GetCoordim())
1096 &gmat[0][0],1,dPhysValuesdx.get(),1,
1097 dPhysValuesdx.get(),1);
1101 Blas::Dscal(nquad, gmat[0][0], dPhysValuesdx.get(), 1);
1109 PhysDeriv(physValues, dPhysValuesdx, dPhysValuesdy);
1115 &gmat[0][0], 1, dPhysValuesdx.get(), 1,
1116 dPhysValuesdx.get(), 1);
1118 &gmat[1][0], 1, dPhysValuesdy.get(), 1,
1119 dPhysValuesdx.get(), 1,
1120 dPhysValuesdx.get(), 1);
1124 Blas::Dscal(nquad, gmat[0][0], dPhysValuesdx.get(), 1);
1126 gmat[1][0], dPhysValuesdy.get(), 1,
1127 dPhysValuesdx.get(), 1);
1137 dPhysValuesdy, dPhysValuesdz);
1143 &gmat[0][0], 1, dPhysValuesdx.get(), 1,
1144 dPhysValuesdx.get(), 1);
1146 &gmat[1][0], 1, dPhysValuesdy.get(), 1,
1147 dPhysValuesdx.get(), 1,
1148 dPhysValuesdx.get(), 1);
1150 &gmat[2][0], 1, dPhysValuesdz.get(), 1,
1151 dPhysValuesdx.get(), 1,
1152 dPhysValuesdx.get(), 1);
1156 Blas::Dscal(nquad, gmat[0][0], dPhysValuesdx.get(), 1);
1158 gmat[1][0], dPhysValuesdy.get(), 1,
1159 dPhysValuesdx.get(), 1);
1161 gmat[2][0], dPhysValuesdz.get(),
1162 1, dPhysValuesdx.get(), 1);
1167 ASSERTL0(
false,
"Wrong number of dimensions");
1172 Blas::Daxpy(
m_ncoeffs, lambda, wsp.get(), 1, outarray.get(), 1);
1204 return tmp->GetStdMatrix(mkey);
1216 "Geometric information is not set up");
1226 goto UseLocRegionsMatrix;
1231 goto UseStdRegionsMatrix;
1252 goto UseStdRegionsMatrix;
1264 goto UseLocRegionsMatrix;
1276 "Cannot call eWeakDeriv2 in a "
1277 "coordinate system which is not at "
1278 "least two-dimensional");
1283 "Cannot call eWeakDeriv2 in a "
1284 "coordinate system which is not "
1285 "three-dimensional");
1309 goto UseLocRegionsMatrix;
1313 int coordim =
m_geom->GetCoordim();
1315 for (
int i = 0; i < coordim; ++i)
1321 goto UseStdRegionsMatrix;
1337 int rows = LapMat.GetRows();
1338 int cols = LapMat.GetColumns();
1344 (*helm) = LapMat + factor*MassMat;
1388 coords[0] = (vertex == 0) ? -1.0 : 1.0;
1390 m_Ix =
m_base[0]->GetI(coords);
1396 UseLocRegionsMatrix:
1403 UseStdRegionsMatrix:
1434 returnval = StdSegExp::v_GenMatrix(mkey);
1449 "Geometric information is not set up");
1455 exp_size[0] = nbdry;
1471 goto UseLocRegionsMatrix;
1477 goto UseLocRegionsMatrix;
1482 factor = mat->Scale();
1483 goto UseStdRegionsMatrix;
1486 UseStdRegionsMatrix:
1494 returnval->SetBlock(0,0,Atmp =
1496 factor,Asubmat = mat->GetBlock(0,0)));
1497 returnval->SetBlock(0,1,Atmp =
1499 one,Asubmat = mat->GetBlock(0,1)));
1500 returnval->SetBlock(1,0,Atmp =
1502 factor,Asubmat = mat->GetBlock(1,0)));
1503 returnval->SetBlock(1,1,Atmp =
1505 invfactor,Asubmat = mat->GetBlock(1,1)));
1508 UseLocRegionsMatrix:
1528 for (i = 0; i < nbdry; ++i)
1530 for (j = 0; j < nbdry; ++j)
1532 (*A)(i,j) = mat(bmap[i],bmap[j]);
1535 for (j = 0; j < nint; ++j)
1537 (*B)(i,j) = mat(bmap[i],imap[j]);
1541 for (i = 0; i < nint; ++i)
1543 for (j = 0; j < nbdry; ++j)
1545 (*C)(i,j) = mat(imap[i],bmap[j]);
1548 for (j = 0; j < nint; ++j)
1550 (*D)(i,j) = mat(imap[i],imap[j]);
1559 (*A) = (*A) - (*B)*(*C);
1565 AllocateSharedPtr(factor,A));
1567 AllocateSharedPtr(one,B));
1569 AllocateSharedPtr(factor,C));
1571 AllocateSharedPtr(invfactor,D));
1597 ASSERTL1(&inarray[0] != &outarray[0],
1598 "inarray and outarray can not be the same");
1603 outarray[0] = inarray[1];
1604 outarray[1] = inarray[0];
1608 outarray[m] = sgn*inarray[m];
1616 outarray[m_ncoeffs-1-m] = inarray[m];
1620 ASSERTL0(
false,
"This basis is not allowed in this method");
const LibUtilities::PointsKeyVector GetPointsKeys() const
virtual DNekScalBlkMatSharedPtr v_GetLocStaticCondMatrix(const MatrixKey &mkey)
LibUtilities::ShapeType DetShapeType() const
This function returns the shape of the expansion domain.
NekDouble GetConstFactor(const ConstFactorType &factor) const
DNekMatSharedPtr GenMatrix(const StdMatrixKey &mkey)
#define ASSERTL0(condition, msg)
virtual StdRegions::StdExpansionSharedPtr v_GetLinStdExp(void) const
const NormalVector & GetEdgeNormal(const int edge) const
const LibUtilities::BasisSharedPtr & GetBasis(int dir) const
This function gets the shared point to basis in the dir direction.
const ConstFactorMap & GetConstFactors() const
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mod...
virtual const LibUtilities::BasisSharedPtr & v_GetBasis(int dir) const
virtual void v_GetCoord(const Array< OneD, const NekDouble > &Lcoords, Array< OneD, NekDouble > &coords)
const VarCoeffMap & GetVarCoeffs() const
std::vector< PointsKey > PointsKeyVector
MatrixType GetMatrixType() const
void v_DropLocStaticCondMatrix(const MatrixKey &mkey)
void MassMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
static Array< OneD, NekDouble > NullNekDouble1DArray
static boost::shared_ptr< DataType > AllocateSharedPtr()
Allocate a shared pointer from the memory pool.
LibUtilities::NekManager< MatrixKey, DNekScalBlkMat, MatrixKey::opLess > m_staticCondMatrixManager
virtual DNekMatSharedPtr v_GenMatrix(const StdRegions::StdMatrixKey &mkey)
virtual NekDouble v_StdPhysEvaluate(const Array< OneD, const NekDouble > &Lcoord, const Array< OneD, const NekDouble > &physvals)
std::map< int, NormalVector > m_vertexNormals
virtual void v_HelmholtzMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
General purpose memory allocation routines with the ability to allocate from thread specific memory p...
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
virtual void v_FwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Forward transform from physical quadrature space stored in inarray and evaluate the expansion coeffic...
int GetNumPoints(const int dir) const
This function returns the number of quadrature points in the dir direction.
virtual void v_PhysDeriv_n(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_dn)
Evaluate the derivative normal to a line: . The derivative is calculated performing the product ...
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
Principle Modified Functions .
void NormVectorIProductWRTBase(const Array< OneD, const NekDouble > &Fx, Array< OneD, NekDouble > &outarray)
SpatialDomains::GeomFactorsSharedPtr m_metricinfo
Lagrange Polynomials using the Gauss points .
virtual void v_GetTracePhysVals(const int edge, const StdRegions::StdExpansionSharedPtr &EdgeExp, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, StdRegions::Orientation orient)
virtual void v_ExtractDataToCoeffs(const NekDouble *data, const std::vector< unsigned int > &nummodes, const int mode_offset, NekDouble *coeffs, std::vector< LibUtilities::BasisType > &fromType)
Unpack data from input file assuming it comes from.
LibUtilities::ShapeType GetShapeType() const
std::map< ConstFactorType, NekDouble > ConstFactorMap
virtual int v_GetNcoeffs(void) const
virtual StdRegions::StdExpansionSharedPtr v_GetStdExp(void) const
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.
SpatialDomains::GeometrySharedPtr m_geom
virtual void v_IProductWRTBase(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Inner product of inarray over region with respect to the expansion basis (this)->_Base[0] and return ...
virtual void v_PhysDeriv_s(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_ds)
Evaluate the derivative along a line: . The derivative is calculated performing the product ...
boost::shared_ptr< StdSegExp > StdSegExpSharedPtr
boost::shared_ptr< DNekMat > DNekMatSharedPtr
virtual int v_GetNumPoints(const int dir) const
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)
virtual void v_NormVectorIProductWRTBase(const Array< OneD, const NekDouble > &Fx, const Array< OneD, const NekDouble > &Fy, Array< OneD, NekDouble > &outarray)
DNekMatSharedPtr GetStdMatrix(const StdMatrixKey &mkey)
boost::shared_ptr< DNekScalMat > DNekScalMatSharedPtr
1D Gauss-Gauss-Legendre quadrature points
Expansion2DSharedPtr GetLeftAdjacentElementExp() const
int NumBndryCoeffs(void) const
DNekBlkMatSharedPtr GetStdStaticCondMatrix(const StdMatrixKey &mkey)
int GetVertexMap(const int localVertexId, bool useCoeffPacking=false)
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*y.
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...
virtual SpatialDomains::GeomType v_MetricInfoType()
virtual DNekMatSharedPtr v_GenMatrix(const StdRegions::StdMatrixKey &mkey)
virtual StdRegions::Orientation v_GetPorient(int point)
Principle Modified Functions .
virtual void v_ComputeVertexNormal(const int vertex)
virtual void v_GetCoords(Array< OneD, NekDouble > &coords_1, Array< OneD, NekDouble > &coords_2, Array< OneD, NekDouble > &coords_3)
boost::shared_ptr< DNekScalBlkMat > DNekScalBlkMatSharedPtr
void GetInteriorMap(Array< OneD, unsigned int > &outarray)
Defines a specification for a set of points.
virtual const Array< OneD, const NekDouble > & v_GetPhysNormals(void)
DNekScalBlkMatSharedPtr CreateStaticCondMatrix(const MatrixKey &mkey)
virtual void v_FwdTrans_BndConstrained(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual void v_LaplacianMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
T Ddot(int n, const Array< OneD, const T > &w, const int incw, const Array< OneD, const T > &x, const int incx, const Array< OneD, const int > &y, const int incy)
DNekScalMatSharedPtr CreateMatrix(const MatrixKey &mkey)
LibUtilities::BasisType GetBasisType(const int dir) const
This function returns the type of basis used in the dir direction.
bg::model::point< double, 3, bg::cs::cartesian > point
virtual DNekScalMatSharedPtr v_GetLocMatrix(const MatrixKey &mkey)
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.
virtual void v_GetVertexPhysVals(const int vertex, const Array< OneD, const NekDouble > &inarray, NekDouble &outarray)
boost::shared_ptr< DNekBlkMat > DNekBlkMatSharedPtr
DNekScalMatSharedPtr GetLocMatrix(const LocalRegions::MatrixKey &mkey)
virtual void v_GetCoords(Array< OneD, NekDouble > &coords_1, Array< OneD, NekDouble > &coords_2, Array< OneD, NekDouble > &coords_3)
SpatialDomains::GeometrySharedPtr GetGeom() const
virtual void v_SetCoeffsToOrientation(Array< OneD, NekDouble > &coeffs, StdRegions::Orientation dir)
boost::shared_ptr< GeomFactors > GeomFactorsSharedPtr
Pointer to a GeomFactors object.
virtual int v_NumDGBndryCoeffs() const
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...
void MultiplyByElmtInvMass(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
#define ASSERTL2(condition, msg)
Assert Level 2 – Debugging which is used FULLDEBUG compilation mode. This level assert is designed t...
Geometry is straight-sided with constant geometric factors.
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 ...
virtual 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)
Evaluate the derivative at the physical quadrature points given by inarray and return in outarray...
boost::shared_ptr< Geometry1D > Geometry1DSharedPtr
void BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
This function performs the Backward transformation from coefficient space to physical space...
int GetLeftAdjacentElementEdge() const
virtual int v_GetCoordim()
virtual NekDouble v_Integral(const Array< OneD, const NekDouble > &inarray)
Integrate the physical point list inarray over region and return the value.
virtual DNekMatSharedPtr v_CreateStdMatrix(const StdRegions::StdMatrixKey &mkey)
GeomType
Indicates the type of element geometry.
static Array< OneD, Array< OneD, NekDouble > > NullNekDoubleArrayofArray
boost::shared_ptr< Basis > BasisSharedPtr
void Zero(int n, T *x, const int incx)
Zero vector.
virtual void v_IProductWRTDerivBase(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
boost::shared_ptr< StdExpansion > StdExpansionSharedPtr
LibUtilities::PointsType GetPointsType(const int dir) const
This function returns the type of quadrature points used in the dir direction.
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Array< OneD, LibUtilities::BasisSharedPtr > m_base
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Geometry is curved or has non-constant factors.
void GetBoundaryMap(Array< OneD, unsigned int > &outarray)
Describes the specification for a Basis.
virtual NekDouble v_PhysEvaluate(const Array< OneD, const NekDouble > &coord, const Array< OneD, const NekDouble > &physvals)
virtual int v_NumBndryCoeffs() const
1D Gauss-Lobatto-Legendre quadrature points
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 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.
LibUtilities::NekManager< MatrixKey, DNekScalMat, MatrixKey::opLess > m_matrixManager