17 #define snprintf _snprintf_s
32 mfem_error (
"FiniteElementCollection::HasFaceDofs:"
33 " unknown geometry type.");
40 MFEM_ABORT(
"this method is not implemented in this derived class!");
48 if (!strcmp(name,
"Linear"))
52 else if (!strcmp(name,
"Quadratic"))
56 else if (!strcmp(name,
"QuadraticPos"))
60 else if (!strcmp(name,
"Cubic"))
64 else if (!strcmp(name,
"Const3D"))
68 else if (!strcmp(name,
"Const2D"))
72 else if (!strcmp(name,
"LinearDiscont2D"))
76 else if (!strcmp(name,
"GaussLinearDiscont2D"))
80 else if (!strcmp(name,
"P1OnQuad"))
84 else if (!strcmp(name,
"QuadraticDiscont2D"))
88 else if (!strcmp(name,
"QuadraticPosDiscont2D"))
92 else if (!strcmp(name,
"GaussQuadraticDiscont2D"))
96 else if (!strcmp(name,
"CubicDiscont2D"))
100 else if (!strcmp(name,
"LinearDiscont3D"))
104 else if (!strcmp(name,
"QuadraticDiscont3D"))
108 else if (!strcmp(name,
"LinearNonConf3D"))
112 else if (!strcmp(name,
"CrouzeixRaviart"))
116 else if (!strcmp(name,
"ND1_3D"))
120 else if (!strcmp(name,
"RT0_2D"))
124 else if (!strcmp(name,
"RT1_2D"))
128 else if (!strcmp(name,
"RT2_2D"))
132 else if (!strcmp(name,
"RT0_3D"))
136 else if (!strcmp(name,
"RT1_3D"))
140 else if (!strncmp(name,
"H1_Trace_", 9))
144 else if (!strncmp(name,
"H1_", 3))
148 else if (!strncmp(name,
"H1Pos_Trace_", 12))
152 else if (!strncmp(name,
"H1Pos_", 6))
156 else if (!strncmp(name,
"L2_T", 4))
159 else if (!strncmp(name,
"L2_", 3))
163 else if (!strncmp(name,
"RT_Trace_", 9))
167 else if (!strncmp(name,
"RT_ValTrace_", 12))
172 else if (!strncmp(name,
"DG_Iface_", 9))
176 else if (!strncmp(name,
"DG_IntIface_", 12))
181 else if (!strncmp(name,
"RT_", 3))
185 else if (!strncmp(name,
"ND_Trace_", 9))
189 else if (!strncmp(name,
"ND_", 3))
193 else if (!strncmp(name,
"Local_", 6))
197 else if (!strncmp(name,
"NURBS", 5))
203 "Unknown FiniteElementCollection!");
208 template <Geometry::Type geom>
213 nv = g_consts::NumVert;
214 ne = g_consts::NumEdges;
217 template <Geometry::Type geom,
typename v_t>
219 GetEdge(
int &nv, v_t &v,
int &ne,
int &e,
int &eo,
const int edge_info)
224 nv = e_consts::NumVert;
228 MFEM_ASSERT(0 <= e && e < g_consts::NumEdges,
"");
229 MFEM_ASSERT(0 <= eo && eo < e_consts::NumOrient,
"");
230 v[0] = g_consts::Edges[e][0];
231 v[1] = g_consts::Edges[e][1];
232 v[0] = e_consts::Orient[eo][v[0]];
233 v[1] = e_consts::Orient[eo][v[1]];
237 typename v_t,
typename e_t,
typename eo_t>
239 GetFace(
int &nv, v_t &v,
int &ne, e_t &e, eo_t &eo,
240 int &nf,
int &f,
int &fg,
int &fo,
const int face_info)
245 nv = f_consts::NumVert;
250 MFEM_ASSERT(0 <= f && f < g_consts::NumFaces,
"");
251 MFEM_ASSERT(0 <= fo && fo < f_consts::NumOrient,
"");
252 for (
int i = 0; i < f_consts::NumVert; i++)
254 v[i] = f_consts::Orient[fo][i];
255 v[i] = g_consts::FaceVert[f][v[i]];
257 ne = f_consts::NumEdges;
258 for (
int i = 0; i < f_consts::NumEdges; i++)
260 int v0 = v[f_consts::Edges[i][0]];
261 int v1 = v[f_consts::Edges[i][1]];
263 if (v0 > v1) { swap(v0, v1); eor = 1; }
264 for (
int j = g_consts::VertToVert::I[v0];
true; j++)
266 MFEM_ASSERT(j < g_consts::VertToVert::I[v0+1],
267 "internal error, edge not found");
268 if (v1 == g_consts::VertToVert::J[j][0])
270 int en = g_consts::VertToVert::J[j][1];
289 "invalid Geom = " << Geom);
291 MFEM_ASSERT(0 <= SDim && SDim <= Dim,
"invalid SDim = " << SDim
297 const int off = nvd*(Info/64);
299 for (
int i = 0; i < nvd; i++)
306 int v[4], e[4], eo[4], f[1], fg[1], fo[1];
307 int av = 0, nv = 0, ae = 0, ne = 0, nf = 0;
313 GetNVE<Geometry::SEGMENT>(av, ae);
314 GetEdge<Geometry::SEGMENT>(nv, v, ne, e[0], eo[0], Info);
320 GetNVE<Geometry::TRIANGLE>(av, ae);
324 GetEdge<Geometry::TRIANGLE>(nv, v, ne, e[0], eo[0], Info);
327 GetFace<Geometry::TRIANGLE,Geometry::TRIANGLE>(
328 nv, v, ne, e, eo, nf, f[0], fg[0], fo[0], Info);
338 GetNVE<Geometry::SQUARE>(av, ae);
342 GetEdge<Geometry::SQUARE>(nv, v, ne, e[0], eo[0], Info);
345 GetFace<Geometry::SQUARE,Geometry::SQUARE>(
346 nv, v, ne, e, eo, nf, f[0], fg[0], fo[0], Info);
356 GetNVE<Geometry::TETRAHEDRON>(av, ae);
360 GetEdge<Geometry::TETRAHEDRON>(nv, v, ne, e[0], eo[0], Info);
363 GetFace<Geometry::TETRAHEDRON,Geometry::TRIANGLE>(
364 nv, v, ne, e, eo, nf, f[0], fg[0], fo[0], Info);
374 GetNVE<Geometry::CUBE>(av, ae);
378 GetEdge<Geometry::CUBE>(nv, v, ne, e[0], eo[0], Info);
381 GetFace<Geometry::CUBE,Geometry::SQUARE>(
382 nv, v, ne, e, eo, nf, f[0], fg[0], fo[0], Info);
391 MFEM_ABORT(
"invalid Geom = " << Geom);
398 for (
int i = 0; i < nv; i++)
400 for (
int j = 0; j < nvd; j++)
402 dofs[i*nvd+j] = v[i]*nvd+j;
405 int l_off = nv*nvd, g_off = av*nvd;
410 for (
int i = 0; i < ne; i++)
414 for (
int j = 0; j < ned; j++)
416 dofs[l_off+i*ned+j] =
418 g_off+e[i]*ned+ed[j] :
419 -1-(g_off+e[i]*ned+(-1-ed[j]));
429 const int nfd = DofForGeometry(fg[0]);
431 for (
int i = 0; i < nf; i++)
433 const int *fd = DofOrderForOrientation(fg[i], fo[i]);
434 for (
int j = 0; j < nfd; j++)
436 dofs[l_off+i*nfd+j] =
438 g_off+f[i]*nfd+fd[j] :
439 -1-(g_off+f[i]*nfd+(-1-fd[j]));
450 ", SDim = " << SDim <<
" is not supported");
465 mfem_error (
"LinearFECollection: unknown geometry type.");
481 mfem_error (
"LinearFECollection: unknown geometry type.");
504 mfem_error (
"QuadraticFECollection: unknown geometry type.");
520 mfem_error (
"QuadraticFECollection: unknown geometry type.");
527 static int indexes[] = { 0 };
541 mfem_error (
"QuadraticPosFECollection: unknown geometry type.");
554 mfem_error (
"QuadraticPosFECollection: unknown geometry type.");
562 static int indexes[] = { 0 };
580 mfem_error (
"CubicFECollection: unknown geometry type.");
596 mfem_error (
"CubicFECollection: unknown geometry type.");
605 static int ind_pos[] = { 0, 1 };
606 static int ind_neg[] = { 1, 0 };
616 static int indexes[] = { 0 };
622 static int sq_ind[8][4] = {{0, 1, 2, 3}, {0, 2, 1, 3},
623 {2, 0, 3, 1}, {1, 0, 3, 2},
624 {3, 2, 1, 0}, {3, 1, 2, 0},
625 {1, 3, 0, 2}, {2, 3, 0, 1}
643 mfem_error (
"CrouzeixRaviartFECollection: unknown geometry type.");
657 mfem_error (
"CrouzeixRaviartFECollection: unknown geometry type.");
665 static int indexes[] = { 0 };
680 mfem_error (
"RT0_2DFECollection: unknown geometry type.");
694 mfem_error (
"RT0_2DFECollection: unknown geometry type.");
702 static int ind_pos[] = { 0 };
703 static int ind_neg[] = { -1 };
722 mfem_error (
"RT1_2DFECollection: unknown geometry type.");
736 mfem_error (
"RT1_2DFECollection: unknown geometry type.");
744 static int ind_pos[] = { 0, 1 };
745 static int ind_neg[] = { -2, -1 };
763 mfem_error (
"RT2_2DFECollection: unknown geometry type.");
777 mfem_error (
"RT2_2DFECollection: unknown geometry type.");
785 static int ind_pos[] = { 0, 1, 2 };
786 static int ind_neg[] = { -3, -2, -1 };
804 mfem_error (
"Const2DFECollection: unknown geometry type.");
818 mfem_error (
"Const2DFECollection: unknown geometry type.");
838 mfem_error (
"LinearDiscont2DFECollection: unknown geometry type.");
852 mfem_error (
"LinearDiscont2DFECollection: unknown geometry type.");
872 mfem_error (
"GaussLinearDiscont2DFECollection:"
873 " unknown geometry type.");
887 mfem_error (
"GaussLinearDiscont2DFECollection:"
888 " unknown geometry type.");
894 int GeomType,
int Or)
const
905 mfem_error (
"P1OnQuadFECollection: unknown geometry type.");
918 mfem_error (
"P1OnQuadFECollection: unknown geometry type.");
924 int GeomType,
int Or)
const
938 mfem_error (
"QuadraticDiscont2DFECollection: unknown geometry type.");
952 mfem_error (
"QuadraticDiscont2DFECollection: unknown geometry type.");
958 int GeomType,
int Or)
const
971 mfem_error (
"QuadraticPosDiscont2DFECollection: unknown geometry type.");
984 mfem_error (
"QuadraticPosDiscont2DFECollection: unknown geometry type.");
999 mfem_error (
"GaussQuadraticDiscont2DFECollection:"
1000 " unknown geometry type.");
1014 mfem_error (
"GaussQuadraticDiscont2DFECollection:"
1015 " unknown geometry type.");
1021 int GeomType,
int Or)
const
1035 mfem_error (
"CubicDiscont2DFECollection: unknown geometry type.");
1049 mfem_error (
"CubicDiscont2DFECollection: unknown geometry type.");
1071 mfem_error (
"LinearNonConf3DFECollection: unknown geometry type.");
1087 mfem_error (
"LinearNonConf3DFECollection: unknown geometry type.");
1095 static int indexes[] = { 0 };
1109 mfem_error (
"Const3DFECollection: unknown geometry type.");
1125 mfem_error (
"Const3DFECollection: unknown geometry type.");
1145 mfem_error (
"LinearDiscont3DFECollection: unknown geometry type.");
1161 mfem_error (
"LinearDiscont3DFECollection: unknown geometry type.");
1181 mfem_error (
"QuadraticDiscont3DFECollection: unknown geometry type.");
1197 mfem_error (
"QuadraticDiscont3DFECollection: unknown geometry type.");
1203 int GeomType,
int Or)
const
1220 mfem_error (
"RefinedLinearFECollection: unknown geometry type.");
1236 mfem_error (
"RefinedLinearFECollection: unknown geometry type.");
1244 static int indexes[] = { 0 };
1258 mfem_error (
"ND1_3DFECollection: unknown geometry type.");
1274 mfem_error (
"ND1_3DFECollection: unknown geometry type.");
1282 static int ind_pos[] = { 0 };
1283 static int ind_neg[] = { -1 };
1303 mfem_error (
"RT0_3DFECollection: unknown geometry type.");
1319 mfem_error (
"RT0_3DFECollection: unknown geometry type.");
1327 static int ind_pos[] = { 0 };
1328 static int ind_neg[] = { -1 };
1350 mfem_error (
"RT1_3DFECollection: unknown geometry type.");
1365 mfem_error (
"RT1_3DFECollection: unknown geometry type.");
1375 static int sq_ind[8][4] =
1377 {0, 1, 2, 3}, {-1, -3, -2, -4},
1378 {2, 0, 3, 1}, {-2, -1, -4, -3},
1379 {3, 2, 1, 0}, {-4, -2, -3, -1},
1380 {1, 3, 0, 2}, {-3, -4, -1, -2}
1394 const int pm1 = p - 1, pm2 = pm1 - 1, pm3 = pm2 - 1;
1397 if (type == GaussLobatto)
1399 snprintf(h1_name, 32,
"H1_%dD_P%d", dim, p);
1403 snprintf(h1_name, 32,
"H1Pos_%dD_P%d", dim, p);
1409 H1_Elements[g] = NULL;
1411 for (
int i = 0; i < 2; i++)
1413 SegDofOrd[i] = NULL;
1415 for (
int i = 0; i < 6; i++)
1417 TriDofOrd[i] = NULL;
1419 for (
int i = 0; i < 8; i++)
1421 QuadDofOrd[i] = NULL;
1430 if (type == GaussLobatto)
1439 SegDofOrd[0] =
new int[2*pm1];
1440 SegDofOrd[1] = SegDofOrd[0] + pm1;
1441 for (
int i = 0; i < pm1; i++)
1443 SegDofOrd[0][i] = i;
1444 SegDofOrd[1][i] = pm2 - i;
1452 if (type == GaussLobatto)
1465 TriDofOrd[0] =
new int[6*TriDof];
1466 for (
int i = 1; i < 6; i++)
1468 TriDofOrd[i] = TriDofOrd[i-1] + TriDof;
1471 for (
int j = 0; j < pm2; j++)
1472 for (
int i = 0; i + j < pm2; i++)
1474 int o = TriDof - ((pm1 - j)*(pm2 - j))/2 + i;
1475 int k = pm3 - j - i;
1476 TriDofOrd[0][o] = o;
1477 TriDofOrd[1][o] = TriDof - ((pm1-j)*(pm2-j))/2 + k;
1478 TriDofOrd[2][o] = TriDof - ((pm1-i)*(pm2-i))/2 + k;
1479 TriDofOrd[3][o] = TriDof - ((pm1-k)*(pm2-k))/2 + i;
1480 TriDofOrd[4][o] = TriDof - ((pm1-k)*(pm2-k))/2 + j;
1481 TriDofOrd[5][o] = TriDof - ((pm1-i)*(pm2-i))/2 + j;
1484 QuadDofOrd[0] =
new int[8*QuadDof];
1485 for (
int i = 1; i < 8; i++)
1487 QuadDofOrd[i] = QuadDofOrd[i-1] + QuadDof;
1490 for (
int j = 0; j < pm1; j++)
1491 for (
int i = 0; i < pm1; i++)
1494 QuadDofOrd[0][o] = i + j*pm1;
1495 QuadDofOrd[1][o] = j + i*pm1;
1496 QuadDofOrd[2][o] = j + (pm2 - i)*pm1;
1497 QuadDofOrd[3][o] = (pm2 - i) + j*pm1;
1498 QuadDofOrd[4][o] = (pm2 - i) + (pm2 - j)*pm1;
1499 QuadDofOrd[5][o] = (pm2 - j) + (pm2 - i)*pm1;
1500 QuadDofOrd[6][o] = (pm2 - j) + i*pm1;
1501 QuadDofOrd[7][o] = i + (pm2 - j)*pm1;
1508 if (type == GaussLobatto)
1528 return SegDofOrd[0];
1530 return SegDofOrd[1];
1534 return TriDofOrd[Or%6];
1538 return QuadDofOrd[Or%8];
1546 if (!strncmp(h1_name,
"H1_", 3))
1550 else if (!strncmp(h1_name,
"H1Pos_", 6))
1559 delete [] SegDofOrd[0];
1560 delete [] TriDofOrd[0];
1561 delete [] QuadDofOrd[0];
1564 delete H1_Elements[g];
1575 snprintf(
h1_name, 32,
"H1_Trace_%dD_P%d", dim, p);
1579 snprintf(
h1_name, 32,
"H1Pos_Trace_%dD_P%d", dim, p);
1589 snprintf(d_name, 32,
"L2_%dD_P%d", dim, p);
1593 snprintf(d_name, 32,
"L2_T%d_%dD_P%d", type, dim, p);
1598 L2_Elements[g] = NULL;
1599 Tr_Elements[g] = NULL;
1601 for (
int i = 0; i < 2; i++)
1603 SegDofOrd[i] = NULL;
1605 for (
int i = 0; i < 6; i++)
1607 TriDofOrd[i] = NULL;
1612 if (type == 0 || type == 1)
1623 const int pp1 = p + 1;
1624 SegDofOrd[0] =
new int[2*pp1];
1625 SegDofOrd[1] = SegDofOrd[0] + pp1;
1626 for (
int i = 0; i <= p; i++)
1628 SegDofOrd[0][i] = i;
1629 SegDofOrd[1][i] = p - i;
1634 if (type == 0 || type == 1)
1647 TriDofOrd[0] =
new int[6*TriDof];
1648 for (
int i = 1; i < 6; i++)
1650 TriDofOrd[i] = TriDofOrd[i-1] + TriDof;
1652 const int pp1 = p + 1, pp2 = pp1 + 1;
1653 for (
int j = 0; j <= p; j++)
1654 for (
int i = 0; i + j <= p; i++)
1656 int o = TriDof - ((pp2 - j)*(pp1 - j))/2 + i;
1658 TriDofOrd[0][o] = o;
1659 TriDofOrd[1][o] = TriDof - ((pp2-j)*(pp1-j))/2 + k;
1660 TriDofOrd[2][o] = TriDof - ((pp2-i)*(pp1-i))/2 + k;
1661 TriDofOrd[3][o] = TriDof - ((pp2-k)*(pp1-k))/2 + i;
1662 TriDofOrd[4][o] = TriDof - ((pp2-k)*(pp1-k))/2 + j;
1663 TriDofOrd[5][o] = TriDof - ((pp2-i)*(pp1-i))/2 + j;
1668 if (type == 0 || type == 1)
1684 cerr <<
"L2_FECollection::L2_FECollection : dim = "
1696 return SegDofOrd[0];
1698 return SegDofOrd[1];
1702 return TriDofOrd[Or%6];
1709 delete [] SegDofOrd[0];
1710 delete [] TriDofOrd[0];
1713 delete L2_Elements[i];
1714 delete Tr_Elements[i];
1723 snprintf(
rt_name, 32,
"RT_%dD_P%d", dim, p);
1725 const int pp1 = p + 1;
1744 cerr <<
"RT_FECollection::RT_FECollection : dim = " << dim << endl;
1752 const int pp1 = p + 1, pp2 = p + 2;
1759 for (
int i = 0; i < 2; i++)
1763 for (
int i = 0; i < 6; i++)
1767 for (
int i = 0; i < 8; i++)
1775 l2_seg->SetMapType(map_type);
1781 for (
int i = 0; i <= p; i++)
1784 SegDofOrd[1][i] = signs ? (-1 - (p - i)) : (p - i);
1790 l2_tri->SetMapType(map_type);
1795 l2_quad->SetMapType(map_type);
1801 for (
int i = 1; i < 6; i++)
1807 for (
int j = 0; j <= p; j++)
1808 for (
int i = 0; i + j <= p; i++)
1810 int o = TriDof - ((pp2 - j)*(pp1 - j))/2 + i;
1813 TriDofOrd[1][o] = -1-(TriDof-((pp2-j)*(pp1-j))/2+k);
1814 TriDofOrd[2][o] = TriDof-((pp2-i)*(pp1-i))/2+k;
1815 TriDofOrd[3][o] = -1-(TriDof-((pp2-k)*(pp1-k))/2+i);
1816 TriDofOrd[4][o] = TriDof-((pp2-k)*(pp1-k))/2+j;
1817 TriDofOrd[5][o] = -1-(TriDof-((pp2-i)*(pp1-i))/2+j);
1820 for (
int k = 1; k < 6; k += 2)
1822 TriDofOrd[k][o] = -1 - TriDofOrd[k][o];
1829 for (
int i = 1; i < 8; i++)
1834 for (
int j = 0; j <= p; j++)
1835 for (
int i = 0; i <= p; i++)
1842 QuadDofOrd[4][o] = (p - i) + (p - j)*pp1;
1843 QuadDofOrd[5][o] = -1 - ((p - j) + (p - i)*pp1);
1844 QuadDofOrd[6][o] = (p - j) + i*pp1;
1845 QuadDofOrd[7][o] = -1 - (i + (p - j)*pp1);
1848 for (
int k = 1; k < 8; k += 2)
1850 QuadDofOrd[k][o] = -1 - QuadDofOrd[k][o];
1900 snprintf(
rt_name, 32,
"RT_Trace_%dD_P%d", dim, p);
1904 snprintf(
rt_name, 32,
"RT_ValTrace_%dD_P%d", dim, p);
1907 MFEM_VERIFY(dim == 2 || dim == 3,
"Wrong dimension, dim = " << dim);
1916 snprintf(
rt_name, 32,
"DG_Iface_%dD_P%d", dim, p);
1920 snprintf(
rt_name, 32,
"DG_IntIface_%dD_P%d", dim, p);
1923 MFEM_VERIFY(dim == 2 || dim == 3,
"Wrong dimension, dim = " << dim);
1928 const int pm1 = p - 1, pm2 = p - 2;
1930 snprintf(
nd_name, 32,
"ND_%dD_P%d", dim, p);
1937 for (
int i = 0; i < 2; i++)
1941 for (
int i = 0; i < 6; i++)
1945 for (
int i = 0; i < 8; i++)
1957 for (
int i = 0; i < p; i++)
1974 for (
int i = 1; i < 8; i++)
1979 for (
int j = 0; j < pm1; j++)
1981 for (
int i = 0; i < p; i++)
1984 int d2 = p*pm1 + j + i*pm1;
1994 QuadDofOrd[2][d1] = -1 - (p*pm1 + j + (pm1 - i)*pm1);
1998 QuadDofOrd[3][d2] = p*pm1 + (pm2 - j) + i*pm1;
2000 QuadDofOrd[4][d1] = -1 - ((pm1 - i) + (pm2 - j)*p);
2001 QuadDofOrd[4][d2] = -1 - (p*pm1 + (pm2 - j) + (pm1 - i)*pm1);
2003 QuadDofOrd[5][d1] = -1 - (p*pm1 + (pm2 - j) + (pm1 - i)*pm1);
2004 QuadDofOrd[5][d2] = -1 - ((pm1 - i) + (pm2 - j)*p);
2008 QuadDofOrd[6][d1] = p*pm1 + (pm2 - j) + i*pm1;
2009 QuadDofOrd[6][d2] = -1 - ((pm1 - i) + j*p);
2011 QuadDofOrd[7][d1] = i + (pm2 - j)*p;
2012 QuadDofOrd[7][d2] = -1 - (p*pm1 + j + (pm1 - i)*pm1);
2018 for (
int i = 1; i < 6; i++)
2024 for (
int j = 0; j <= pm2; j++)
2026 for (
int i = 0; i + j <= pm2; i++)
2028 int k1 = p*pm1 - (p - j)*(pm1 - j) + 2*i;
2029 int k2 = p*pm1 - (p - i)*(pm1 - i) + 2*j;
2066 if (Or != 0 && Or != 5)
2068 MFEM_ABORT(
"ND_FECollection::DofOrderForOrientation: "
2069 "triangle face orientation " << Or <<
" is not supported! "
2070 "Use Mesh::ReorientTetMesh to fix it.");
2102 snprintf(
nd_name, 32,
"ND_Trace_%dD_P%d", dim, p);
2108 snprintf(d_name, 32,
"Local_%s", fe_name);
2110 Local_Element = NULL;
2112 if (!strcmp(fe_name,
"BiCubic2DFiniteElement") ||
2113 !strcmp(fe_name,
"Quad_Q3"))
2118 else if (!strcmp(fe_name,
"Nedelec1HexFiniteElement") ||
2119 !strcmp(fe_name,
"Hex_ND1"))
2124 else if (!strncmp(fe_name,
"H1_", 3))
2129 else if (!strncmp(fe_name,
"L2_", 3))
2136 cerr <<
"Local_FECollection::Local_FECollection : fe_name = "
2143 void NURBSFECollection::Allocate(
int Order)
2149 snprintf(name, 16,
"NURBS%i", Order);
2152 void NURBSFECollection::Deallocate()
2154 delete ParallelepipedFE;
2155 delete QuadrilateralFE;
2159 const FiniteElement *
2168 mfem_error (
"NURBSFECollection: unknown geometry type.");
2175 mfem_error(
"NURBSFECollection::DofForGeometry");
2181 mfem_error(
"NURBSFECollection::DofOrderForOrientation");
2187 MFEM_ABORT(
"NURBS finite elements can not be statically condensed!");
Abstract class for Finite Elements.
Arbitrary order non-uniform rational B-splines (NURBS) finite elements.
virtual const FiniteElement * FiniteElementForGeometry(int GeomType) const
int Size() const
Logical size of the array.
Version of QuadraticDiscont2DFECollection with dofs in the Gaussian points.
int RT_dof[Geometry::NumGeom]
FiniteElement * ND_Elements[Geometry::NumGeom]
virtual int * DofOrderForOrientation(int GeomType, int Or) const
virtual FiniteElementCollection * GetTraceCollection() const
H1_Trace_FECollection(const int p, const int dim, const int type=GaussLobatto)
void SubDofOrder(int Geom, int SDim, int Info, Array< int > &dofs) const
Get the local dofs for a given sub-manifold.
virtual int DofForGeometry(int GeomType) const
FiniteElementCollection * GetTraceCollection() const
virtual int * DofOrderForOrientation(int GeomType, int Or) const
virtual const FiniteElement * FiniteElementForGeometry(int GeomType) const
virtual const FiniteElement * FiniteElementForGeometry(int GeomType) const
virtual int * DofOrderForOrientation(int GeomType, int Or) const
virtual ~L2_FECollection()
virtual const FiniteElement * FiniteElementForGeometry(int GeomType) const
virtual int DofForGeometry(int GeomType) const
virtual const FiniteElement * FiniteElementForGeometry(int GeomType) const
virtual int * DofOrderForOrientation(int GeomType, int Or) const
virtual const FiniteElement * FiniteElementForGeometry(int GeomType) const
virtual const FiniteElement * FiniteElementForGeometry(int GeomType) const
Piecewise-(bi)linear continuous finite elements.
virtual int * DofOrderForOrientation(int GeomType, int Or) const
virtual int * DofOrderForOrientation(int GeomType, int Or) const
ND_FECollection(const int p, const int dim)
virtual int * DofOrderForOrientation(int GeomType, int Or) const
virtual const FiniteElement * FiniteElementForGeometry(int GeomType) const
virtual int DofForGeometry(int GeomType) const
FiniteElementCollection * GetTraceCollection() const
virtual int * DofOrderForOrientation(int GeomType, int Or) const
virtual int DofForGeometry(int GeomType) const
virtual int * DofOrderForOrientation(int GeomType, int Or) const
void InitFaces(const int p, const int dim, const int map_type, const bool signs)
FiniteElementCollection * GetTraceCollection() const
virtual int * DofOrderForOrientation(int GeomType, int Or) const
virtual const FiniteElement * FiniteElementForGeometry(int GeomType) const
virtual int DofForGeometry(int GeomType) const
virtual const FiniteElement * FiniteElementForGeometry(int GeomType) const
virtual const FiniteElement * FiniteElementForGeometry(int GeomType) const
virtual int DofForGeometry(int GeomType) const
virtual const FiniteElement * FiniteElementForGeometry(int GeomType) const
virtual const FiniteElement * FiniteElementForGeometry(int GeomType) const
virtual int * DofOrderForOrientation(int GeomType, int Or) const
virtual ~RT_FECollection()
virtual int DofForGeometry(int GeomType) const
virtual int * DofOrderForOrientation(int GeomType, int Or) const
virtual int * DofOrderForOrientation(int GeomType, int Or) const
Piecewise-(bi)cubic continuous finite elements.
virtual int * DofOrderForOrientation(int GeomType, int Or) const
PointFiniteElement PointFE
virtual int DofForGeometry(int GeomType) const
FiniteElement * RT_Elements[Geometry::NumGeom]
static const int Dimension[NumGeom]
static void GetNVE(int &nv, int &ne)
virtual int * DofOrderForOrientation(int GeomType, int Or) const
virtual int DofForGeometry(int GeomType) const
virtual int * DofOrderForOrientation(int GeomType, int Or) const
L2_FECollection(const int p, const int dim, const int type=GaussLegendre)
virtual int DofForGeometry(int GeomType) const
virtual int DofForGeometry(int GeomType) const
ND_Trace_FECollection(const int p, const int dim)
TriLinear3DFiniteElement HexahedronFE
Discontinuous collection defined locally by a given finite element.
virtual const FiniteElement * FiniteElementForGeometry(int GeomType) const
Version of QuadraticDiscont2DFECollection with positive basis functions.
virtual ~ND_FECollection()
virtual int * DofOrderForOrientation(int GeomType, int Or) const
virtual const FiniteElement * FiniteElementForGeometry(int GeomType) const
RT_Trace_FECollection(const int p, const int dim, const int map_type=FiniteElement::INTEGRAL)
virtual int DofForGeometry(int GeomType) const
virtual const FiniteElement * FiniteElementForGeometry(int GeomType) const
Version of QuadraticFECollection with positive basis functions.
virtual const FiniteElement * FiniteElementForGeometry(int GeomType) const
virtual int DofForGeometry(int GeomType) const
virtual ~H1_FECollection()
virtual const FiniteElement * FiniteElementForGeometry(int GeomType) const
virtual const FiniteElement * FiniteElementForGeometry(int GeomType) const
FiniteElementCollection * GetTraceCollection() const
static const char * Name[NumGeom]
Piecewise-linear nonconforming finite elements in 3D.
virtual int * DofOrderForOrientation(int GeomType, int Or) const
DG_Interface_FECollection(const int p, const int dim, const int map_type=FiniteElement::VALUE)
Crouzeix-Raviart nonconforming elements in 2D.
Arbitrary order H(div)-conforming Raviart-Thomas finite elements.
virtual int * DofOrderForOrientation(int GeomType, int Or) const
virtual int DofForGeometry(int GeomType) const
static void GetEdge(int &nv, v_t &v, int &ne, int &e, int &eo, const int edge_info)
virtual int DofForGeometry(int GeomType) const
virtual int DofForGeometry(int GeomType) const
virtual int * DofOrderForOrientation(int GeomType, int Or) const
int GetDof() const
Returns the degrees of freedom in the FE space.
void mfem_error(const char *msg)
void SetSize(int nsize)
Change logical size of the array, keep existing entries.
virtual const FiniteElement * FiniteElementForGeometry(int GeomType) const
virtual int * DofOrderForOrientation(int GeomType, int Or) const
Linear3DFiniteElement TetrahedronFE
virtual int DofForGeometry(int GeomType) const
Linear2DFiniteElement TriangleFE
virtual int DofForGeometry(int GeomType) const
virtual const FiniteElement * FiniteElementForGeometry(int GeomType) const
virtual int DofForGeometry(int GeomType) const
Version of LinearDiscont2DFECollection with dofs in the Gaussian points.
virtual const FiniteElement * FiniteElementForGeometry(int GeomType) const
static FiniteElementCollection * New(const char *name)
virtual int * DofOrderForOrientation(int GeomType, int Or) const
virtual const FiniteElement * FiniteElementForGeometry(int GeomType) const
virtual int DofForGeometry(int GeomType) const
virtual int * DofOrderForOrientation(int GeomType, int Or) const
virtual int * DofOrderForOrientation(int GeomType, int Or) const
virtual int * DofOrderForOrientation(int GeomType, int Or) const
virtual int * DofOrderForOrientation(int GeomType, int Or) const
RT_FECollection(const int p, const int dim, const int map_type, const bool signs)
H1_FECollection(const int p, const int dim=3, const int type=GaussLobatto)
Piecewise-(bi)quadratic continuous finite elements.
int HasFaceDofs(int GeomType) const
Arbitrary order H(curl)-conforming Nedelec finite elements.
static void GetFace(int &nv, v_t &v, int &ne, e_t &e, eo_t &eo, int &nf, int &f, int &fg, int &fo, const int face_info)
virtual int * DofOrderForOrientation(int GeomType, int Or) const
virtual int * DofOrderForOrientation(int GeomType, int Or) const
Arbitrary order H1-conforming (continuous) finite elements.
virtual int DofForGeometry(int GeomType) const
Local_FECollection(const char *fe_name)
BiLinear2DFiniteElement QuadrilateralFE
virtual int DofForGeometry(int GeomType) const
virtual int DofForGeometry(int GeomType) const
Linear (P1) finite elements on quadrilaterals.
virtual int DofForGeometry(int GeomType) const
Linear1DFiniteElement SegmentFE
int ND_dof[Geometry::NumGeom]
virtual int DofForGeometry(int GeomType) const
virtual const FiniteElement * FiniteElementForGeometry(int GeomType) const
Arbitrary order "L2-conforming" discontinuous finite elements.
virtual const FiniteElement * FiniteElementForGeometry(int GeomType) const