23 int FiniteElementSpace::GetOrder(
int i)
const
25 int GeomType = mesh->GetElementBaseGeometry(i);
26 return fec->FiniteElementForGeometry(GeomType)->GetOrder();
29 void FiniteElementSpace::DofsToVDofs (
Array<int> &dofs)
const
33 if (vdim == 1)
return;
40 case Ordering::byNODES:
41 for (i = 1; i < vdim; i++)
42 for (j = 0; j < size; j++)
44 dofs[size * i + j] = -1 - ( ndofs * i + (-1-dofs[j]) );
46 dofs[size * i + j] = ndofs * i + dofs[j];
49 case Ordering::byVDIM:
50 for (i = vdim-1; i >= 0; i--)
51 for (j = 0; j < size; j++)
53 dofs[size * i + j] = -1 - ( (-1-dofs[j]) * vdim + i );
55 dofs[size * i + j] = dofs[j] * vdim + i;
60 void FiniteElementSpace::DofsToVDofs(
int vd,
Array<int> &dofs)
const
64 if (ordering == Ordering::byNODES)
66 for (
int i = 0; i < dofs.
Size(); i++)
70 dofs[i] = -1 - ((-1-dof) + vd * ndofs);
72 dofs[i] = dof + vd * ndofs;
77 for (
int i = 0; i < dofs.
Size(); i++)
81 dofs[i] = -1 - ((-1-dof) * vdim + vd);
83 dofs[i] = dof * vdim + vd;
88 int FiniteElementSpace::DofToVDof (
int dof,
int vd)
const
92 if (ordering == Ordering::byNODES)
95 return -1 - ((-1-dof) + vd * ndofs);
97 return dof + vd * ndofs;
100 return -1 - ((-1-dof) * vdim + vd);
102 return dof * vdim + vd;
108 int n = vdofs.
Size(), *vdof = vdofs;
109 for (
int i = 0; i < n; i++)
117 void FiniteElementSpace::GetElementVDofs(
int iE,
Array<int> &dofs)
const
119 GetElementDofs(iE, dofs);
123 void FiniteElementSpace::GetBdrElementVDofs (
int iE,
Array<int> &dofs)
const
125 GetBdrElementDofs(iE, dofs);
129 void FiniteElementSpace::GetFaceVDofs (
int iF,
Array<int> &dofs)
const
131 GetFaceDofs (iF, dofs);
135 void FiniteElementSpace::GetEdgeVDofs (
int iE,
Array<int> &dofs)
const
137 GetEdgeDofs (iE, dofs);
141 void FiniteElementSpace::GetElementInteriorVDofs (
int i,
Array<int> &vdofs)
144 GetElementInteriorDofs (i, vdofs);
148 void FiniteElementSpace::GetEdgeInteriorVDofs (
int i,
Array<int> &vdofs)
151 GetEdgeInteriorDofs (i, vdofs);
155 void FiniteElementSpace::BuildElementToDofTable()
162 el_dof -> MakeI (mesh -> GetNE());
163 for (
int i = 0; i < mesh -> GetNE(); i++)
165 GetElementDofs (i, dofs);
166 el_dof -> AddColumnsInRow (i, dofs.
Size());
169 for (
int i = 0; i < mesh -> GetNE(); i++)
171 GetElementDofs (i, dofs);
172 el_dof -> AddConnections (i, (
int *)dofs, dofs.
Size());
174 el_dof -> ShiftUpI();
178 void FiniteElementSpace::BuildDofToArrays()
180 if (dof_elem_array.Size())
182 BuildElementToDofTable();
184 dof_elem_array.SetSize (ndofs);
185 dof_ldof_array.SetSize (ndofs);
187 for (
int i = 0; i < mesh -> GetNE(); i++)
189 const int *dofs = elem_dof -> GetRow(i);
190 const int n = elem_dof -> RowSize(i);
191 for (
int j = 0; j < n; j++)
192 if (dof_elem_array[dofs[j]] < 0)
194 dof_elem_array[dofs[j]] = i;
195 dof_ldof_array[dofs[j]] = j;
200 DenseMatrix * FiniteElementSpace::LocalInterpolation
206 for (i = 0; i < RefData.Size(); i++)
207 if (RefData[i] -> type == type)
211 { ConstructRefinementData (k,num_c_dofs,type); l = i; }
215 int num_fine_elems = RefData[l] -> num_fine_elems;
216 rows.
SetSize(RefData[l] -> num_fine_dofs);
218 for (i = 0; i < num_fine_elems; i++) {
219 GetElementDofs(mesh->GetFineElem(k,i),g_dofs);
220 RefData[l] -> fl_to_fc -> GetRow (i, l_dofs);
221 for (j = 0; j < l_dofs.
Size(); j++)
222 rows[l_dofs[j]] = g_dofs[j];
225 return RefData[l] -> I;
240 for (
int d = 0; d < vdim; d++)
242 Array<int> rows_sub(rows.
GetData() + d*nr, nr);
243 Array<int> cols_sub(cols.
GetData() + d*nc, nc);
249 SparseMatrix * FiniteElementSpace::GlobalRestrictionMatrix
258 one_vdim = (ordering == Ordering::byNODES) ? 1 : 0;
262 MFEM_VERIFY(vdim == 1 || one_vdim == 0,
263 "parameter 'one_vdim' must be 0 for nonconforming mesh.");
264 return NC_GlobalRestrictionMatrix(cfes, mesh->ncmesh);
267 mesh->SetState(Mesh::TWO_LEVEL_COARSE);
268 int vdim_or_1 = (one_vdim ? 1 : vdim);
271 for (k = 0; k < mesh -> GetNE(); k++)
275 mesh->SetState(Mesh::TWO_LEVEL_FINE);
276 r = LocalInterpolation(k, rows.
Size(), mesh->GetRefinementType(k), cols);
283 SetVDofSubMatrixTranspose(*R, rows, cols, *r, vdim_or_1);
285 mesh->SetState(Mesh::TWO_LEVEL_COARSE);
291 SparseMatrix* FiniteElementSpace::NC_GlobalRestrictionMatrix
307 for (
int k = 0; k < mesh->GetNE(); k++)
309 mesh->SetState(Mesh::TWO_LEVEL_COARSE);
312 mesh->SetState(Mesh::TWO_LEVEL_FINE);
313 this->GetElementDofs(k, cols);
315 if (!transforms[k].IsIdentity())
317 int geom = mesh->GetElementBaseGeometry(k);
318 const FiniteElement *fe = fec->FiniteElementForGeometry(geom);
329 for (
int i = 0; i < I.Height(); i++)
339 this->DofsToVDofs(cols);
340 SetVDofSubMatrixTranspose(*R, rows, cols, I, vdim);
344 MFEM_ASSERT(rows.
Size() == cols.
Size(),
"");
345 for (
int i = 0; i < rows.
Size(); i++)
351 for (
int vd = 0; vd < vdim; vd++)
353 this->DofToVDof(cols[i], vd), 1.0);
358 delete [] transforms;
362 void FiniteElementSpace::GetEssentialVDofs(
const Array<int> &bdr_attr_is_ess,
371 for (i = 0; i < GetNBE(); i++)
372 if (bdr_attr_is_ess[GetBdrAttribute(i)-1])
374 GetBdrElementVDofs(i, vdofs);
375 for (j = 0; j < vdofs.
Size(); j++)
376 if ( (k = vdofs[j]) >= 0 )
392 for (
int i = 0; i < D->
Height(); i++)
393 if (row_marker[i] < 0)
396 for (
int j = 0; j < n; j++)
397 col_marker[col[j]] = -1;
402 row_marker.
Copy(col_marker);
406 void FiniteElementSpace::EliminateEssentialBCFromGRM
409 int i, j, k, one_vdim;
412 one_vdim = (cfes -> GetNDofs() == R -> Height()) ? 1 : 0;
414 mesh -> SetState (Mesh::TWO_LEVEL_COARSE);
415 if (bdr_attr_is_ess.
Size() != 0)
416 for (i=0; i < cfes -> GetNBE(); i++)
417 if (bdr_attr_is_ess[cfes -> GetBdrAttribute (i)-1])
420 cfes -> GetBdrElementDofs (i, dofs);
422 cfes -> GetBdrElementVDofs (i, dofs);
423 for (j=0; j < dofs.
Size(); j++)
424 if ( (k = dofs[j]) >= 0 )
425 R -> EliminateRow(k);
427 R -> EliminateRow(-1-k);
432 SparseMatrix * FiniteElementSpace::GlobalRestrictionMatrix
437 R = GlobalRestrictionMatrix (cfes, one_vdim);
438 EliminateEssentialBCFromGRM (cfes, bdr_attr_is_ess, R);
452 for (i = 0; i < mesh -> GetNE(); i++)
454 this -> GetElementVDofs (i, d_vdofs);
455 cfes -> GetElementVDofs (i, c_vdofs);
458 if (d_vdofs.
Size() != c_vdofs.
Size())
459 mfem_error (
"FiniteElementSpace::D2C_GlobalRestrictionMatrix (...)");
462 for (j = 0; j < d_vdofs.
Size(); j++)
463 R -> Set (c_vdofs[j], d_vdofs[j], 1.0);
480 for (i = 0; i < mesh -> GetNE(); i++)
482 this -> GetElementDofs (i, d_dofs);
483 cfes -> GetElementDofs (i, c_dofs);
486 if (c_dofs.
Size() != 1)
488 "D2Const_GlobalRestrictionMatrix (...)");
491 for (j = 0; j < d_dofs.
Size(); j++)
492 R -> Set (c_dofs[0], d_dofs[j], 1.0);
519 h_fe->
Project(*l_fe, T, loc_restr);
521 for (
int i = 0; i < mesh -> GetNE(); i++)
523 this -> GetElementDofs (i, h_dofs);
524 lfes -> GetElementDofs (i, l_dofs);
526 R -> SetSubMatrix (l_dofs, h_dofs, loc_restr, 1);
567 FiniteElementSpace::FiniteElementSpace(
Mesh *m,
582 mfem_error(
"FiniteElementSpace::FiniteElementSpace :\n"
583 " NURBS FE space requires NURBS mesh.");
588 if (mesh->NURBSext->GetOrder() == Order)
590 NURBSext = mesh->NURBSext;
612 if (NURBSext && !own_ext)
613 mfem_error(
"FiniteElementSpace::StealNURBSext");
619 void FiniteElementSpace::UpdateNURBS()
630 ndofs = NURBSext->GetNDof();
632 elem_dof = NURBSext->GetElementDofTable();
634 bdrElem_dof = NURBSext->GetBdrElementDofTable();
637 void FiniteElementSpace::Constructor()
646 if ( mesh->Dimension() > 1 )
647 nedofs = mesh->GetNEdges() * fec->DofForGeometry(Geometry::SEGMENT);
662 if (mesh->Dimension() == 3)
669 int fdof = fec->DofForGeometry(mesh->GetFaceBaseGeometry(0));
672 fdofs =
new int[mesh->GetNFaces()+1];
674 for (i = 0; i < mesh->GetNFaces(); i++)
683 bdofs =
new int[mesh->GetNE()+1];
685 for (i = 0; i < mesh->GetNE(); i++)
687 nbdofs += fec->DofForGeometry(mesh->GetElementBaseGeometry(i));
691 ndofs = nvdofs + nedofs + nfdofs + nbdofs;
693 if (mesh->ncmesh && ndofs > nbdofs)
695 cP = mesh->ncmesh->GetInterpolation(
this, &cR);
702 for (
int i = 0; i < cP->Height(); i++)
704 cP->
GetRow(i, cdofs, srow);
705 for (
int vd = 0; vd < vdim; vd++)
709 DofsToVDofs(vd, vcdofs);
710 ndofs = cP->Height();
711 vec_cP->
SetRow(DofToVDof(i, vd), vcdofs, srow);
720 for (
int i = 0; i < cR->Height(); i++)
722 cR->
GetRow(i, cdofs, srow);
723 for (
int vd = 0; vd < vdim; vd++)
726 DofsToVDofs(vd, vcdofs);
727 ndofs = cR->Height();
728 vec_cR->
SetRow(DofToVDof(i, vd), vcdofs, srow);
739 void FiniteElementSpace::GetElementDofs (
int i,
Array<int> &dofs)
const
743 elem_dof -> GetRow (i, dofs);
748 int k, j, nv, ne, nf, nb, nfd, nd;
751 dim = mesh->Dimension();
752 nv = fec->DofForGeometry(Geometry::POINT);
753 ne = (dim > 1) ? ( fec->DofForGeometry(Geometry::SEGMENT) ) : ( 0 );
754 nb = fec->DofForGeometry(mesh->GetElementBaseGeometry(i));
756 mesh->GetElementVertices(i, V);
758 mesh->GetElementEdges(i, E, Eo);
761 if (fec->HasFaceDofs(mesh->GetElementBaseGeometry(i)))
763 mesh->GetElementFaces(i, F, Fo);
764 for (k = 0; k < F.
Size(); k++)
765 nfd += fec->DofForGeometry(mesh->GetFaceBaseGeometry(F[k]));
767 nd = V.
Size() * nv + E.
Size() * ne + nfd + nb;
771 for (k = 0; k < V.
Size(); k++)
772 for (j = 0; j < nv; j++)
773 dofs[k*nv+j] = V[k]*nv+j;
778 for (k = 0; k < E.
Size(); k++)
780 ind = fec->DofOrderForOrientation(Geometry::SEGMENT, Eo[k]);
781 for (j = 0; j < ne; j++)
783 dofs[nv+k*ne+j] = -1 - ( nvdofs+E[k]*ne+(-1-ind[j]) );
785 dofs[nv+k*ne+j] = nvdofs+E[k]*ne+ind[j];
787 ne = nv + ne * E.
Size();
791 for (k = 0; k < F.
Size(); k++)
793 ind = fec->DofOrderForOrientation(mesh->GetFaceBaseGeometry(F[k]),
795 nf = fec->DofForGeometry(mesh->GetFaceBaseGeometry(F[k]));
796 for (j = 0; j < nf; j++)
799 dofs[ne+j] = -1 - ( nvdofs+nedofs+fdofs[F[k]]+(-1-ind[j]) );
801 dofs[ne+j] = nvdofs+nedofs+fdofs[F[k]]+ind[j];
806 k = nvdofs + nedofs + nfdofs + bdofs[i];
807 for (j = 0; j < nb; j++)
817 fec->FiniteElementForGeometry(mesh->GetElementBaseGeometry(i));
820 NURBSext->LoadFE(i, FE);
825 void FiniteElementSpace::GetBdrElementDofs(
int i,
Array<int> &dofs)
const
829 bdrElem_dof->GetRow(i, dofs);
834 int k, j, nv, ne, nf, nd, iF, oF;
837 dim = mesh->Dimension();
838 nv = fec->DofForGeometry(Geometry::POINT);
840 mesh->GetBdrElementVertices(i, V);
841 ne = (dim > 1) ? ( fec->DofForGeometry(Geometry::SEGMENT) ) : ( 0 );
843 mesh->GetBdrElementEdges(i, E, Eo);
845 nf = (dim == 3) ? (fec->DofForGeometry(
846 mesh->GetBdrElementBaseGeometry(i))) : (0);
850 mesh->GetBdrElementFace(i, &iF, &oF);
855 for (k = 0; k < V.
Size(); k++)
856 for (j = 0; j < nv; j++)
857 dofs[k*nv+j] = V[k]*nv+j;
862 for (k = 0; k < E.
Size(); k++)
864 ind = fec->DofOrderForOrientation(Geometry::SEGMENT, Eo[k]);
865 for (j = 0; j < ne; j++)
867 dofs[nv+k*ne+j] = -1 - ( nvdofs+E[k]*ne+(-1-ind[j]) );
869 dofs[nv+k*ne+j] = nvdofs+E[k]*ne+ind[j];
874 ne = nv + ne * E.
Size();
875 ind = (fec->DofOrderForOrientation(
876 mesh->GetBdrElementBaseGeometry(i), oF));
877 for (j = 0; j < nf; j++)
880 dofs[ne+j] = -1 - ( nvdofs+nedofs+fdofs[iF]+(-1-ind[j]) );
882 dofs[ne+j] = nvdofs+nedofs+fdofs[iF]+ind[j];
888 void FiniteElementSpace::GetFaceDofs(
int i,
Array<int> &dofs)
const
890 int j, k, nv, ne, nf, nd, dim = mesh->Dimension();
895 nv = fec->DofForGeometry(Geometry::POINT);
896 ne = (dim > 1) ? fec->DofForGeometry(Geometry::SEGMENT) : 0;
898 mesh->GetFaceVertices(i, V);
900 mesh->GetFaceEdges(i, E, Eo);
901 nf = (fdofs) ? (fdofs[i+1]-fdofs[i]) : (0);
902 nd = V.
Size() * nv + E.
Size() * ne + nf;
905 for (k = 0; k < V.
Size(); k++)
906 for (j = 0; j < nv; j++)
907 dofs[k*nv+j] = V[k]*nv+j;
910 for (k = 0; k < E.
Size(); k++)
912 ind = fec->DofOrderForOrientation(Geometry::SEGMENT, Eo[k]);
913 for (j = 0; j < ne; j++)
915 dofs[nv+k*ne+j] = -1 - ( nvdofs+E[k]*ne+(-1-ind[j]) );
917 dofs[nv+k*ne+j] = nvdofs+E[k]*ne+ind[j];
919 ne = nv + ne * E.
Size();
921 for (j = nvdofs+nedofs+fdofs[i], k = 0; k < nf; j++, k++)
925 void FiniteElementSpace::GetEdgeDofs(
int i,
Array<int> &dofs)
const
930 nv = fec->DofForGeometry(Geometry::POINT);
932 mesh->GetEdgeVertices(i, V);
933 ne = fec->DofForGeometry(Geometry::SEGMENT);
936 for (k = 0; k < 2; k++)
937 for (j = 0; j < nv; j++)
938 dofs[k*nv+j] = V[k]*nv+j;
940 for (j = 0, k = nvdofs+i*ne; j < ne; j++, k++)
944 void FiniteElementSpace::GetVertexDofs(
int i,
Array<int> &dofs)
const
948 nv = fec->DofForGeometry(Geometry::POINT);
950 for (j = 0; j < nv; j++)
954 void FiniteElementSpace::GetElementInteriorDofs (
int i,
Array<int> &dofs)
const
957 nb = fec -> DofForGeometry (mesh -> GetElementBaseGeometry (i));
959 k = nvdofs + nedofs + nfdofs + bdofs[i];
960 for (j = 0; j < nb; j++)
966 void FiniteElementSpace::GetEdgeInteriorDofs (
int i,
Array<int> &dofs)
const
970 ne = fec -> DofForGeometry (Geometry::SEGMENT);
972 for (j = 0, k = nvdofs+i*ne; j < ne; j++, k++)
980 switch ( mesh->Dimension() )
983 BE = fec->FiniteElementForGeometry(Geometry::POINT);
985 BE = fec->FiniteElementForGeometry(Geometry::SEGMENT);
988 BE = fec->FiniteElementForGeometry(
989 mesh->GetBdrElementBaseGeometry(i));
993 NURBSext->LoadBE(i, BE);
1002 switch (mesh->Dimension())
1005 fe = fec->FiniteElementForGeometry(Geometry::POINT);
1007 fe = fec->FiniteElementForGeometry(Geometry::SEGMENT);
1010 fe = fec->FiniteElementForGeometry(mesh->GetFaceBaseGeometry(i));
1021 return fec->FiniteElementForGeometry(Geometry::SEGMENT);
1025 int i,
int geom_type)
const
1027 return fec->TraceFiniteElementForGeometry(geom_type);
1030 FiniteElementSpace::~FiniteElementSpace()
1034 for (
int i = 0; i < RefData.Size(); i++)
1038 void FiniteElementSpace::Destructor()
1043 dof_elem_array.DeleteAll();
1044 dof_ldof_array.DeleteAll();
1048 if (own_ext)
delete NURBSext;
1080 void FiniteElementSpace::UpdateAndInterpolate(
int num_grid_fns, ...)
1082 if (mesh->GetState() == Mesh::NORMAL)
1084 MFEM_ABORT(
"Mesh must be in two-level state, please call "
1085 "Mesh::UseTwoLevelState before refining.");
1097 va_start(vl, num_grid_fns);
1098 for (
int i = 0; i < num_grid_fns; i++)
1103 MFEM_ABORT(
"Cannot interpolate: grid function is not based "
1114 mesh->SetState(Mesh::TWO_LEVEL_FINE);
1117 void FiniteElementSpace::ConstructRefinementData (
int k,
int num_c_dofs,
1125 data -> type = type;
1126 data -> num_fine_elems = mesh -> GetNumFineElems(k);
1130 data -> fl_to_fc =
new Table(data -> num_fine_elems, num_c_dofs);
1131 for (i = 0; i < data -> num_fine_elems; i++) {
1132 GetElementDofs(mesh -> GetFineElem(k,i), g_dofs);
1133 for (j = 0; j < g_dofs.
Size(); j++)
1134 data -> fl_to_fc -> Push (i,dofs.
Union(g_dofs[j]));
1136 data -> fl_to_fc -> Finalize();
1137 data -> num_fine_dofs = dofs.
Size();
1142 int geomtype = mesh->GetElementBaseGeometry(k);
1143 const FiniteElement *fe = fec -> FiniteElementForGeometry(geomtype);
1145 int nedofs = fe -> GetDof();
1154 data -> I =
new DenseMatrix(data -> num_fine_dofs, nedofs);
1156 for (i=0; i < data -> num_fine_elems; i++) {
1158 trans = mesh -> GetFineElemTrans(k,i);
1160 fe -> GetLocalInterpolation (*trans, I);
1161 data -> fl_to_fc -> GetRow(i,row);
1163 for (j=0; j < nedofs; j++)
1170 for (l=0; l < nedofs; l++)
1171 (*(data->
I))(row[j],l) = I(j,l);
1175 RefData.Append(data);
1178 void FiniteElementSpace::Save(std::ostream &out)
const
1180 out <<
"FiniteElementSpace\n"
1181 <<
"FiniteElementCollection: " << fec->Name() <<
'\n'
1182 <<
"VDim: " << vdim <<
'\n'
1183 <<
"Ordering: " << ordering <<
'\n';
Abstract class for Finite Elements.
Arbitrary order non-uniform rational B-splines (NURBS) finite elements.
int Size() const
Logical size of the array.
int RowSize(const int i) const
Returns the number of elements in row i.
int GetNDofs() const
Returns number of degrees of freedom.
int ndofs
Number of degrees of freedom. Number of unknowns are ndofs*vdim.
Class for grid function - Vector with associated FE space.
FineTransform * GetFineTransforms()
virtual void Project(Coefficient &coeff, ElementTransformation &Trans, Vector &dofs) const
int * GetRowColumns(const int row)
Return a pointer to the column indices in a row.
int Width() const
Get the width (size of input) of the Operator. Synonym with NumCols.
void Copy(Array ©) const
Create a copy of the current array.
T * GetData()
Returns the data.
Piecewise-(bi)linear continuous finite elements.
int vdim
Vector dimension (number of unknowns per degree of freedom).
virtual void GetLocalInterpolation(ElementTransformation &Trans, DenseMatrix &I) const
int RefinementType
Type of refinement (int, a tree, etc.)
const FiniteElementCollection * fec
Array< int > dof_elem_array
int GetNE() const
Returns number of elements in the mesh.
virtual int GetRow(const int row, Array< int > &cols, Vector &srow) const
int Height() const
Get the height (size of output) of the Operator. Synonym with NumRows.
virtual void GetElementDofs(int i, Array< int > &dofs) const
Returns indexes of degrees of freedom in array dofs for i'th element.
Array< int > dof_ldof_array
virtual const FiniteElement * FiniteElementForGeometry(int GeomType) const
A class for non-conforming AMR on higher-order hexahedral, quadrilateral or triangular meshes...
FiniteElementSpace * FESpace()
virtual void Finalize(int skip_zeros=1)
int Union(const T &el)
Append element when it is not yet in the array, return index.
int GetGeomType() const
Returns the geometry type:
void Swap(Array< T > &, Array< T > &)
Data kept for every type of refinement.
Abstract finite element space.
int GetDof() const
Returns the degrees of freedom in the FE space.
void SetSubMatrixTranspose(const Array< int > &rows, const Array< int > &cols, const DenseMatrix &subm, int skip_zeros=1)
void mfem_error(const char *msg)
void SetSize(int nsize)
Change logical size of the array, keep existing entries.
void Set(const int i, const int j, const double a)
void Update(Vector &x, int k, DenseMatrix &h, Vector &s, Array< Vector * > &v)
Mesh * mesh
The mesh that FE space lives on.
void MultTranspose(const Vector &x, Vector &y) const
Multiply a vector with the transposed matrix. y = At * x.
void SetRow(const int row, const Array< int > &cols, const Vector &srow)
int DofToVDof(int dof, int vd) const
void DofsToVDofs(Array< int > &dofs) const
NURBSExtension * NURBSext
virtual int DofForGeometry(int GeomType) const
DenseMatrix * I
Local interpolation matrix.