22 MFEM_ABORT(
"the assembly level has already been set!");
37 mfem_error(
"Unknown assembly level for this form.");
79 MFEM_ABORT(
"internal MFEM error");
90 MFEM_VERIFY(!
fnfi.Size(),
"Interior faces terms not yet implemented!");
91 MFEM_VERIFY(!
bfnfi.Size(),
"Boundary face terms not yet implemented!");
109 for (
int k = 0; k <
dnfi.Size(); k++)
117 MFEM_ASSERT(marker.
Size() == attr_marker.
Size(),
118 "invalid marker for domain integrator #"
119 << k <<
", counting from zero");
120 for (
int i = 0; i < attr_marker.
Size(); i++)
122 attr_marker[i] |= marker[i];
126 for (
int i = 0; i <
fes->
GetNE(); i++)
129 if (attr_marker[attr-1] == 0) {
continue; }
136 for (
int k = 0; k <
dnfi.Size(); k++)
141 energy +=
dnfi[k]->GetElementEnergy(*fe, *T, el_x);
152 for (
int k = 0; k <
bnfi.Size(); k++)
160 MFEM_ASSERT(bdr_marker.
Size() == bdr_attr_marker.
Size(),
161 "invalid boundary marker for boundary integrator #"
162 << k <<
", counting from zero");
163 for (
int i = 0; i < bdr_attr_marker.
Size(); i++)
165 bdr_attr_marker[i] |= bdr_marker[i];
172 if (bdr_attr_marker[bdr_attr-1] == 0) {
continue; }
179 for (
int k = 0; k <
bnfi.Size(); k++)
184 energy +=
bnfi[k]->GetElementEnergy(*fe, *T, el_x);
192 MFEM_ABORT(
"TODO: add energy contribution from interior face terms");
197 MFEM_ABORT(
"TODO: add energy contribution from boundary face terms");
205 MFEM_VERIFY(x.
Size() ==
Width(),
"invalid input Vector size");
233 mfem::forall(N, [=] MFEM_HOST_DEVICE (
int i) { Y[tdof[i]] = 0.0; });
254 for (
int k = 0; k <
dnfi.Size(); k++)
262 MFEM_ASSERT(marker.
Size() == attr_marker.
Size(),
263 "invalid marker for domain integrator #"
264 << k <<
", counting from zero");
265 for (
int i = 0; i < attr_marker.
Size(); i++)
267 attr_marker[i] |= marker[i];
271 for (
int i = 0; i <
fes->
GetNE(); i++)
274 if (attr_marker[attr-1] == 0) {
continue; }
281 for (
int k = 0; k <
dnfi.Size(); k++)
286 dnfi[k]->AssembleElementVector(*fe, *T, el_x, el_y);
299 for (
int k = 0; k <
bnfi.Size(); k++)
307 MFEM_ASSERT(bdr_marker.
Size() == bdr_attr_marker.
Size(),
308 "invalid boundary marker for boundary integrator #"
309 << k <<
", counting from zero");
310 for (
int i = 0; i < bdr_attr_marker.
Size(); i++)
312 bdr_attr_marker[i] |= bdr_marker[i];
319 if (bdr_attr_marker[bdr_attr-1] == 0) {
continue; }
326 for (
int k = 0; k <
bnfi.Size(); k++)
331 bnfi[k]->AssembleElementVector(*fe, *T, el_x, el_y);
358 for (
int k = 0; k <
fnfi.Size(); k++)
360 fnfi[k]->AssembleFaceVector(*fe1, *fe2, *tr, el_x, el_y);
376 for (
int k = 0; k <
bfnfi.Size(); k++)
384 MFEM_ASSERT(bdr_marker.
Size() == bdr_attr_marker.
Size(),
385 "invalid boundary marker for boundary face integrator #"
386 << k <<
", counting from zero");
387 for (
int i = 0; i < bdr_attr_marker.
Size(); i++)
389 bdr_attr_marker[i] |= bdr_marker[i];
393 for (
int i = 0; i <
fes -> GetNBE(); i++)
396 if (bdr_attr_marker[bdr_attr-1] == 0) {
continue; }
409 for (
int k = 0; k <
bfnfi.Size(); k++)
414 bfnfi[k]->AssembleFaceVector(*fe1, *fe2, *tr, el_x, el_y);
450 const int skip_zeros = 0;
475 for (
int k = 0; k <
dnfi.Size(); k++)
483 MFEM_ASSERT(marker.
Size() == attr_marker.
Size(),
484 "invalid marker for domain integrator #"
485 << k <<
", counting from zero");
486 for (
int i = 0; i < attr_marker.
Size(); i++)
488 attr_marker[i] |= marker[i];
492 for (
int i = 0; i <
fes->
GetNE(); i++)
495 if (attr_marker[attr-1] == 0) {
continue; }
502 for (
int k = 0; k <
dnfi.Size(); k++)
507 dnfi[k]->AssembleElementGrad(*fe, *T, el_x, elmat);
521 for (
int k = 0; k <
bnfi.Size(); k++)
529 MFEM_ASSERT(bdr_marker.
Size() == bdr_attr_marker.
Size(),
530 "invalid boundary marker for boundary integrator #"
531 << k <<
", counting from zero");
532 for (
int i = 0; i < bdr_attr_marker.
Size(); i++)
534 bdr_attr_marker[i] |= bdr_marker[i];
541 if (bdr_attr_marker[bdr_attr-1] == 0) {
continue; }
548 for (
int k = 0; k <
bnfi.Size(); k++)
553 bnfi[k]->AssembleElementGrad(*fe, *T, el_x, elmat);
580 for (
int k = 0; k <
fnfi.Size(); k++)
582 fnfi[k]->AssembleFaceGrad(*fe1, *fe2, *tr, el_x, elmat);
598 for (
int k = 0; k <
bfnfi.Size(); k++)
606 MFEM_ASSERT(bdr_marker.
Size() == bdr_attr_marker.
Size(),
607 "invalid boundary marker for boundary face integrator #"
608 << k <<
", counting from zero");
609 for (
int i = 0; i < bdr_attr_marker.
Size(); i++)
611 bdr_attr_marker[i] |= bdr_marker[i];
615 for (
int i = 0; i <
fes -> GetNBE(); i++)
618 if (bdr_attr_marker[bdr_attr-1] == 0) {
continue; }
631 for (
int k = 0; k <
bfnfi.Size(); k++)
636 bfnfi[k]->AssembleFaceGrad(*fe1, *fe2, *tr, el_x, elmat);
694 for (
int i = 0; i <
dnfi.Size(); i++) {
delete dnfi[i]; }
695 for (
int i = 0; i <
bnfi.Size(); i++) {
delete bnfi[i]; }
696 for (
int i = 0; i <
fnfi.Size(); i++) {
delete fnfi[i]; }
697 for (
int i = 0; i <
bfnfi.Size(); i++) {
delete bfnfi[i]; }
704 fes(0), BlockGrad(NULL)
714 for (
int i=0; i<
Grads.NumRows(); ++i)
716 for (
int j=0; j<
Grads.NumCols(); ++j)
722 for (
int i = 0; i <
ess_tdofs.Size(); ++i)
735 for (
int i=0; i<
fes.Size(); ++i)
753 P.SetSize(
fes.Size());
754 cP.SetSize(
fes.Size());
756 for (
int s = 0; s <
fes.Size(); ++s)
759 P[s] =
fes[s]->GetProlongationMatrix();
781 fes(0), BlockGrad(NULL)
789 for (
int s = 0; s <
fes.Size(); ++s)
793 fes[s]->GetEssentialTrueDofs(*bdr_attr_is_ess[s], *
ess_tdofs[s]);
797 rhs[s]->SetSubVector(*
ess_tdofs[s], 0.0);
810 Mesh *mesh =
fes[0]->GetMesh();
813 for (
int i=0; i<
fes.Size(); ++i)
815 el_x_const[i] = el_x[i] =
new Vector();
825 for (
int k = 0; k <
dnfi.Size(); k++)
833 MFEM_ASSERT(marker.
Size() == attr_marker.
Size(),
834 "invalid marker for domain integrator #"
835 << k <<
", counting from zero");
836 for (
int i = 0; i < attr_marker.
Size(); i++)
838 attr_marker[i] |= marker[i];
842 for (
int i = 0; i <
fes[0]->GetNE(); ++i)
845 if (attr_marker[attr-1] == 0) {
continue; }
847 T =
fes[0]->GetElementTransformation(i);
848 for (
int s=0; s<
fes.Size(); ++s)
850 fe[s] =
fes[s]->GetFE(i);
851 doftrans =
fes[s]->GetElementVDofs(i, *vdofs[s]);
856 for (
int k = 0; k <
dnfi.Size(); ++k)
861 energy +=
dnfi[k]->GetElementEnergy(fe, *T, el_x_const);
872 for (
int k = 0; k <
bnfi.Size(); k++)
880 MFEM_ASSERT(bdr_marker.
Size() == bdr_attr_marker.
Size(),
881 "invalid boundary marker for boundary integrator #"
882 << k <<
", counting from zero");
883 for (
int i = 0; i < bdr_attr_marker.
Size(); i++)
885 bdr_attr_marker[i] |= bdr_marker[i];
889 for (
int i = 0; i < mesh->
GetNBE(); i++)
892 if (bdr_attr_marker[bdr_attr-1] == 0) {
continue; }
894 T =
fes[0]->GetBdrElementTransformation(i);
895 for (
int s = 0; s <
fes.Size(); ++s)
897 fe[s] =
fes[s]->GetBE(i);
898 doftrans =
fes[s]->GetBdrElementVDofs(i, *(vdofs[s]));
903 for (
int k = 0; k <
bnfi.Size(); k++)
908 energy +=
bnfi[k]->GetElementEnergy(fe, *T, el_x_const);
914 for (
int i = 0; i <
fes.Size(); ++i)
922 MFEM_ABORT(
"TODO: add energy contribution from interior face terms");
927 MFEM_ABORT(
"TODO: add energy contribution from boundary face terms");
951 Mesh *mesh =
fes[0]->GetMesh();
956 for (
int s=0; s<
fes.Size(); ++s)
958 el_x_const[s] = el_x[s] =
new Vector();
970 for (
int k = 0; k <
dnfi.Size(); k++)
978 MFEM_ASSERT(marker.
Size() == attr_marker.
Size(),
979 "invalid marker for domain integrator #"
980 << k <<
", counting from zero");
981 for (
int i = 0; i < attr_marker.
Size(); i++)
983 attr_marker[i] |= marker[i];
987 for (
int i = 0; i <
fes[0]->GetNE(); ++i)
990 if (attr_marker[attr-1] == 0) {
continue; }
992 T =
fes[0]->GetElementTransformation(i);
993 for (
int s = 0; s <
fes.Size(); ++s)
995 doftrans[s] =
fes[s]->GetElementVDofs(i, *(vdofs[s]));
996 fe[s] =
fes[s]->GetFE(i);
998 if (doftrans[s]) {doftrans[s]->InvTransformPrimal(*el_x[s]); }
1001 for (
int k = 0; k <
dnfi.Size(); ++k)
1006 dnfi[k]->AssembleElementVector(fe, *T,
1009 for (
int s=0; s<
fes.Size(); ++s)
1011 if (el_y[s]->Size() == 0) {
continue; }
1012 if (doftrans[s]) {doftrans[s]->TransformDual(*el_y[s]); }
1024 bdr_attr_marker = 0;
1025 for (
int k = 0; k <
bnfi.Size(); k++)
1029 bdr_attr_marker = 1;
1033 MFEM_ASSERT(bdr_marker.
Size() == bdr_attr_marker.
Size(),
1034 "invalid boundary marker for boundary integrator #"
1035 << k <<
", counting from zero");
1036 for (
int i = 0; i < bdr_attr_marker.
Size(); i++)
1038 bdr_attr_marker[i] |= bdr_marker[i];
1042 for (
int i = 0; i < mesh->
GetNBE(); i++)
1045 if (bdr_attr_marker[bdr_attr-1] == 0) {
continue; }
1047 T =
fes[0]->GetBdrElementTransformation(i);
1048 for (
int s = 0; s <
fes.Size(); ++s)
1050 doftrans[s] =
fes[s]->GetBdrElementVDofs(i, *(vdofs[s]));
1051 fe[s] =
fes[s]->GetBE(i);
1053 if (doftrans[s]) {doftrans[s]->InvTransformPrimal(*el_x[s]); }
1056 for (
int k = 0; k <
bnfi.Size(); k++)
1061 bnfi[k]->AssembleElementVector(fe, *T, el_x_const, el_y);
1063 for (
int s=0; s<
fes.Size(); ++s)
1065 if (el_y[s]->Size() == 0) {
continue; }
1066 if (doftrans[s]) {doftrans[s]->TransformDual(*el_y[s]); }
1083 for (
int s=0; s<
fes.Size(); ++s)
1085 fe[s] =
fes[s]->GetFE(tr->Elem1No);
1086 fe2[s] =
fes[s]->GetFE(tr->Elem2No);
1088 fes[s]->GetElementVDofs(tr->Elem1No, *(vdofs[s]));
1089 fes[s]->GetElementVDofs(tr->Elem2No, *(vdofs2[s]));
1091 vdofs[s]->
Append(*(vdofs2[s]));
1096 for (
int k = 0; k <
fnfi.Size(); ++k)
1099 fnfi[k]->AssembleFaceVector(fe, fe2, *tr, el_x_const, el_y);
1101 for (
int s=0; s<
fes.Size(); ++s)
1103 if (el_y[s]->Size() == 0) {
continue; }
1118 bdr_attr_marker = 0;
1119 for (
int k = 0; k <
bfnfi.Size(); ++k)
1123 bdr_attr_marker = 1;
1127 MFEM_ASSERT(bdr_marker.
Size() == bdr_attr_marker.
Size(),
1128 "invalid boundary marker for boundary face integrator #"
1129 << k <<
", counting from zero");
1130 for (
int i = 0; i < bdr_attr_marker.
Size(); ++i)
1132 bdr_attr_marker[i] |= bdr_marker[i];
1136 for (
int i = 0; i < mesh->
GetNBE(); ++i)
1139 if (bdr_attr_marker[bdr_attr-1] == 0) {
continue; }
1144 for (
int s=0; s<
fes.Size(); ++s)
1146 fe[s] =
fes[s]->GetFE(tr->Elem1No);
1147 fe2[s] =
fes[s]->GetFE(tr->Elem1No);
1149 fes[s]->GetElementVDofs(tr->Elem1No, *(vdofs[s]));
1153 for (
int k = 0; k <
bfnfi.Size(); ++k)
1158 bfnfi[k]->AssembleFaceVector(fe, fe2, *tr, el_x_const, el_y);
1160 for (
int s=0; s<
fes.Size(); ++s)
1162 if (el_y[s]->Size() == 0) {
continue; }
1170 for (
int s=0; s<
fes.Size(); ++s)
1183 MFEM_VERIFY(bx.
Size() ==
Width(),
"invalid input BlockVector size");
1188 for (
int s = 0; s <
fes.Size(); s++)
1213 for (
int s = 0; s <
fes.Size(); s++)
1225 const int skip_zeros = 0;
1235 Mesh *mesh =
fes[0]->GetMesh();
1237 for (
int i=0; i<
fes.Size(); ++i)
1239 el_x_const[i] = el_x[i] =
new Vector();
1242 for (
int j=0; j<
fes.Size(); ++j)
1248 for (
int i=0; i<
fes.Size(); ++i)
1250 for (
int j=0; j<
fes.Size(); ++j)
1252 if (
Grads(i,j) != NULL)
1259 fes[j]->GetVSize());
1270 for (
int k = 0; k <
dnfi.Size(); k++)
1278 MFEM_ASSERT(marker.
Size() == attr_marker.
Size(),
1279 "invalid marker for domain integrator #"
1280 << k <<
", counting from zero");
1281 for (
int i = 0; i < attr_marker.
Size(); i++)
1283 attr_marker[i] |= marker[i];
1287 for (
int i = 0; i <
fes[0]->GetNE(); ++i)
1290 if (attr_marker[attr-1] == 0) {
continue; }
1292 T =
fes[0]->GetElementTransformation(i);
1293 for (
int s = 0; s <
fes.Size(); ++s)
1295 fe[s] =
fes[s]->GetFE(i);
1296 doftrans[s] =
fes[s]->GetElementVDofs(i, *vdofs[s]);
1298 if (doftrans[s]) {doftrans[s]->InvTransformPrimal(*el_x[s]); }
1301 for (
int k = 0; k <
dnfi.Size(); ++k)
1306 dnfi[k]->AssembleElementGrad(fe, *T, el_x_const, elmats);
1308 for (
int j=0; j<
fes.Size(); ++j)
1310 for (
int l=0; l<
fes.Size(); ++l)
1312 if (elmats(j,l)->
Height() == 0) {
continue; }
1313 if (doftrans[j] || doftrans[l])
1317 Grads(j,l)->AddSubMatrix(*vdofs[j], *vdofs[l],
1318 *elmats(j,l), skip_zeros);
1330 bdr_attr_marker = 0;
1331 for (
int k = 0; k <
bnfi.Size(); k++)
1335 bdr_attr_marker = 1;
1339 MFEM_ASSERT(bdr_marker.
Size() == bdr_attr_marker.
Size(),
1340 "invalid boundary marker for boundary integrator #"
1341 << k <<
", counting from zero");
1342 for (
int i = 0; i < bdr_attr_marker.
Size(); i++)
1344 bdr_attr_marker[i] |= bdr_marker[i];
1348 for (
int i = 0; i < mesh->
GetNBE(); i++)
1351 if (bdr_attr_marker[bdr_attr-1] == 0) {
continue; }
1353 T =
fes[0]->GetBdrElementTransformation(i);
1354 for (
int s = 0; s <
fes.Size(); ++s)
1356 fe[s] =
fes[s]->GetBE(i);
1357 doftrans[s] =
fes[s]->GetBdrElementVDofs(i, *(vdofs[s]));
1359 if (doftrans[s]) {doftrans[s]->InvTransformPrimal(*el_x[s]); }
1362 for (
int k = 0; k <
bnfi.Size(); k++)
1367 bnfi[k]->AssembleElementGrad(fe, *T, el_x_const, elmats);
1369 for (
int j=0; j<
fes.Size(); ++j)
1371 for (
int l=0; l<
fes.Size(); ++l)
1373 if (elmats(j,l)->
Height() == 0) {
continue; }
1374 if (doftrans[j] || doftrans[l])
1378 Grads(j,l)->AddSubMatrix(*vdofs[j], *vdofs[l],
1379 *elmats(j,l), skip_zeros);
1394 for (
int s=0; s <
fes.Size(); ++s)
1396 fe[s] =
fes[s]->GetFE(tr->Elem1No);
1397 fe2[s] =
fes[s]->GetFE(tr->Elem2No);
1399 fes[s]->GetElementVDofs(tr->Elem1No, *vdofs[s]);
1400 fes[s]->GetElementVDofs(tr->Elem2No, *vdofs2[s]);
1401 vdofs[s]->
Append(*(vdofs2[s]));
1406 for (
int k = 0; k <
fnfi.Size(); ++k)
1408 fnfi[k]->AssembleFaceGrad(fe, fe2, *tr, el_x_const, elmats);
1409 for (
int j=0; j<
fes.Size(); ++j)
1411 for (
int l=0; l<
fes.Size(); ++l)
1413 if (elmats(j,l)->
Height() == 0) {
continue; }
1414 Grads(j,l)->AddSubMatrix(*vdofs[j], *vdofs[l],
1415 *elmats(j,l), skip_zeros);
1429 bdr_attr_marker = 0;
1430 for (
int k = 0; k <
bfnfi.Size(); ++k)
1434 bdr_attr_marker = 1;
1438 MFEM_ASSERT(bdr_marker.
Size() == bdr_attr_marker.
Size(),
1439 "invalid boundary marker for boundary face integrator #"
1440 << k <<
", counting from zero");
1441 for (
int i = 0; i < bdr_attr_marker.
Size(); ++i)
1443 bdr_attr_marker[i] |= bdr_marker[i];
1447 for (
int i = 0; i < mesh->
GetNBE(); ++i)
1450 if (bdr_attr_marker[bdr_attr-1] == 0) {
continue; }
1455 for (
int s = 0; s <
fes.Size(); ++s)
1457 fe[s] =
fes[s]->GetFE(tr->Elem1No);
1460 fes[s]->GetElementVDofs(tr->Elem1No, *vdofs[s]);
1464 for (
int k = 0; k <
bfnfi.Size(); ++k)
1468 bfnfi[k]->AssembleFaceGrad(fe, fe2, *tr, el_x_const, elmats);
1469 for (
int l=0; l<
fes.Size(); ++l)
1471 for (
int j=0; j<
fes.Size(); ++j)
1473 if (elmats(j,l)->
Height() == 0) {
continue; }
1474 Grads(j,l)->AddSubMatrix(*vdofs[j], *vdofs[l],
1475 *elmats(j,l), skip_zeros);
1483 if (!
Grads(0,0)->Finalized())
1485 for (
int i=0; i<
fes.Size(); ++i)
1487 for (
int j=0; j<
fes.Size(); ++j)
1489 Grads(i,j)->Finalize(skip_zeros);
1494 for (
int i=0; i<
fes.Size(); ++i)
1496 for (
int j=0; j<
fes.Size(); ++j)
1517 for (
int s1 = 0; s1 <
fes.Size(); ++s1)
1519 for (
int s2 = 0; s2 <
fes.Size(); ++s2)
1523 mGrads(s1, s2) =
cGrads(s1, s2);
1528 for (
int s = 0; s <
fes.Size(); ++s)
1530 for (
int i = 0; i <
ess_tdofs[s]->Size(); ++i)
1532 for (
int j = 0; j <
fes.Size(); ++j)
1536 mGrads(s, s)->EliminateRowCol((*
ess_tdofs[s])[i],
1541 mGrads(s, j)->EliminateRow((*
ess_tdofs[s])[i]);
1542 mGrads(j, s)->EliminateCol((*
ess_tdofs[s])[i]);
1550 for (
int i = 0; i <
fes.Size(); ++i)
1552 for (
int j = 0; j <
fes.Size(); ++j)
1563 for (
int i=0; i<
fes.Size(); ++i)
1565 for (
int j=0; j<
fes.Size(); ++j)
1573 for (
int i = 0; i <
dnfi.Size(); ++i)
1578 for (
int i = 0; i <
bnfi.Size(); ++i)
1583 for (
int i = 0; i <
fnfi.Size(); ++i)
1588 for (
int i = 0; i <
bfnfi.Size(); ++i)
Dynamic 2D array using row-major layout.
T Max() const
Find the maximal element in the array, using the comparison operator < for class T.
const T * HostRead() const
Shortcut for mfem::Read(a.GetMemory(), a.Size(), false).
void SetSize(int nsize)
Change the logical size of the array, keep existing entries.
int Size() const
Return the logical size of the array.
void PartialSum()
Fill the entries of the array with the cumulative sum of the entries.
int Append(const T &el)
Append element 'el' to array, resize if necessary.
void Copy(Array ©) const
Create a copy of the internal array to the provided copy.
const T * Read(bool on_dev=true) const
Shortcut for mfem::Read(a.GetMemory(), a.Size(), on_dev).
A class to handle Block systems in a matrix-free implementation.
void SetBlock(int iRow, int iCol, Operator *op, real_t c=1.0)
Add a block op in the block-entry (iblock, jblock).
A class to handle Vectors in a block fashion.
void Update(real_t *data, const Array< int > &bOffsets)
Update method.
void SyncFromBlocks() const
Synchronize the memory location flags (i.e. the memory validity flags) of the big/monolithic block-ve...
void SyncToBlocks() const
Synchronize the memory location flags (i.e. the memory validity flags) of the big/monolithic block-ve...
Vector & GetBlock(int i)
Get the i-th vector in the block.
Data type dense matrix using column-major storage.
const FiniteElement * GetBE(int i) const
Returns pointer to the FiniteElement in the FiniteElementCollection associated with i'th boundary fac...
virtual int GetTrueVSize() const
Return the number of vector true (conforming) dofs.
ElementTransformation * GetElementTransformation(int i) const
Returns ElementTransformation for the i-th element.
static void ListToMarker(const Array< int > &list, int marker_size, Array< int > &marker, int mark_val=-1)
Convert an array of indices (list) to a Boolean marker array where all indices in the list are marked...
virtual void GetEssentialTrueDofs(const Array< int > &bdr_attr_is_ess, Array< int > &ess_tdof_list, int component=-1) const
Get a list of essential true dofs, ess_tdof_list, corresponding to the boundary attributes marked in ...
int GetNBE() const
Returns number of boundary elements in the mesh.
virtual const Operator * GetProlongationMatrix() const
DofTransformation * GetElementVDofs(int i, Array< int > &vdofs) const
Returns indices of degrees of freedom for the i'th element. The returned indices are offsets into an ...
virtual const FiniteElement * GetFE(int i) const
Returns pointer to the FiniteElement in the FiniteElementCollection associated with i'th element in t...
ElementTransformation * GetBdrElementTransformation(int i) const
Returns ElementTransformation for the i-th boundary element.
int GetNE() const
Returns number of elements in the mesh.
static void MarkerToList(const Array< int > &marker, Array< int > &list)
Convert a Boolean marker array to a list containing all marked indices.
void ConvertToConformingVDofs(const Array< int > &dofs, Array< int > &cdofs)
For a partially conforming FE space, convert a marker array (nonzero entries are true) on the partial...
Mesh * GetMesh() const
Returns the mesh.
int GetVSize() const
Return the number of vector dofs, i.e. GetNDofs() x GetVDim().
DofTransformation * GetBdrElementVDofs(int i, Array< int > &vdofs) const
Returns indices of degrees of freedom for i'th boundary element. The returned indices are offsets int...
Abstract class for all finite elements.
void BooleanMultTranspose(int alpha, const int *x, int beta, int *y)
The "Boolean" analog of y = alpha * A^T * x + beta * y, where elements in the sparsity pattern of the...
Array< int > bdr_attributes
A list of all unique boundary attributes used by the Mesh.
int GetNumFaces() const
Return the number of faces (3D), edges (2D) or vertices (1D).
int GetAttribute(int i) const
Return the attribute of element i.
int GetBdrAttribute(int i) const
Return the attribute of boundary element i.
FaceElementTransformations * GetBdrFaceTransformations(int BdrElemNo)
Builds the transformation defining the given boundary face.
int GetNBE() const
Returns number of boundary elements.
FaceElementTransformations * GetInteriorFaceTransformations(int FaceNo)
See GetFaceElementTransformations().
Array< int > attributes
A list of all unique element attributes used by the Mesh.
void Clear()
Clear the OperatorHandle, deleting the held Operator (if owned), while leaving the type id unchanged.
void Reset(OpType *A, bool own_A=true)
Reset the OperatorHandle to the given OpType pointer, A.
int width
Dimension of the input / number of columns in the matrix.
void FormSystemOperator(const Array< int > &ess_tdof_list, Operator *&A)
Return in A a parallel (on truedofs) version of this square operator.
int Height() const
Get the height (size of output) of the Operator. Synonym with NumRows().
int height
Dimension of the output / number of rows in the matrix.
virtual void Mult(const Vector &x, Vector &y) const =0
Operator application: y=A(x).
@ DIAG_ONE
Set the diagonal value to one.
int Width() const
Get the width (size of input) of the Operator. Synonym with NumCols().
Abstract parallel finite element space.
int GetTrueVSize() const override
Return the number of local vector true dofs.
HypreParMatrix * Dof_TrueDof_Matrix() const
The true dof-to-dof interpolation matrix.
void EliminateRowCol(int rc, const real_t sol, Vector &rhs, DiagonalPolicy dpolicy=DIAG_ONE)
Eliminate row rc and column rc and modify the rhs using sol.
void MultTranspose(const Vector &x, Vector &y) const override
Multiply a vector with the transposed matrix. y = At * x.
bool Finalized() const
Returns whether or not CSR format has been finalized.
void AddSubMatrix(const Array< int > &rows, const Array< int > &cols, const DenseMatrix &subm, int skip_zeros=1)
void Finalize(int skip_zeros=1) override
Finalize the matrix initialization, switching the storage format from LIL to CSR.
virtual real_t * ReadWrite(bool on_dev=true)
Shortcut for mfem::ReadWrite(vec.GetMemory(), vec.Size(), on_dev).
void SetSubVector(const Array< int > &dofs, const real_t value)
Set the entries listed in dofs to the given value.
void AddElementVector(const Array< int > &dofs, const Vector &elemvect)
Add elements of the elemvect Vector to the entries listed in dofs. Negative dof values cause the -dof...
int Size() const
Returns the size of the vector.
virtual void UseDevice(bool use_dev) const
Enable execution of Vector operations using the mfem::Device.
void SetSize(int s)
Resize the vector to size s.
virtual real_t * HostReadWrite()
Shortcut for mfem::ReadWrite(vec.GetMemory(), vec.Size(), false).
void GetSubVector(const Array< int > &dofs, Vector &elemvect) const
Extract entries listed in dofs to the output Vector elemvect.
void mfem_error(const char *msg)
void TransformDual(const DofTransformation *ran_dof_trans, const DofTransformation *dom_dof_trans, DenseMatrix &elmat)
AssemblyLevel
Enumeration defining the assembly level for bilinear and nonlinear form classes derived from Operator...
void RAP(const DenseMatrix &A, const DenseMatrix &P, DenseMatrix &RAP)
std::function< real_t(const Vector &)> f(real_t mass_coeff)
void forall(int N, lambda &&body)