Mark skin entities, i.e. boundary, next check DOFs if are properly marked when accessed form user data operator.
static char help[] =
"...\n\n";
const Range &skinEnts;
const std::vector<bool> &mArker;
OpFace(
const Range &skin_ents,
const std::vector<bool> &marker)
:
FaceEleOp(
"FIELD1", OPROW), skinEnts(skin_ents), mArker(marker) {}
const int nb_dofs = data.getIndices().size();
if (nb_dofs == 0)
auto get_boundary_marker_directly_from_range = [&]() {
std::vector<bool> ents_marker_used_for_testing;
ents_marker_used_for_testing.resize(data.getLocalIndices().size());
case MBVERTEX: {
for (size_t side = 0; side != getNumberOfNodesOnElement(); ++side) {
EntityHandle ent = getSideEntity(side, MBVERTEX);
ents_marker_used_for_testing[side] =
skinEnts.find(ent) != skinEnts.end();
}
break;
}
default: {
EntityHandle ent = getSideEntity(side,
type);
bool is_on_boundary = skinEnts.find(ent) != skinEnts.end();
for (size_t dof = 0; dof != nb_dofs; ++dof)
ents_marker_used_for_testing[dof] = is_on_boundary;
}
};
return ents_marker_used_for_testing;
};
auto test_marker = get_boundary_marker_directly_from_range();
for (
size_t n = 0;
n != nb_dofs; ++
n) {
const size_t local_index = data.getLocalIndices()[
n];
if (test_marker[
n] != mArker[local_index])
"Wrong boundary marker");
}
}
};
int main(
int argc,
char *argv[]) {
try {
ParallelComm *pcomm = ParallelComm::get_pcomm(&moab,
MYPCOMM_INDEX);
if (pcomm == NULL)
pcomm = new ParallelComm(&moab, PETSC_COMM_WORLD);
DMType dm_name = "DMMOFEM";
CHKERR simple_interface->getOptions();
CHKERR simple_interface->loadFile(
"");
CHKERR simple_interface->addDomainField(
"FIELD1",
H1,
CHKERR simple_interface->setFieldOrder(
"FIELD1",
order);
CHKERR simple_interface->setUp();
auto get_ents_on_mesh_skin = [&]() {
Range faces;
Range skin_edges;
CHKERR skin.find_skin(0, faces,
false, skin_edges);
Range skin_verts;
CHKERR moab.get_connectivity(skin_edges, skin_verts,
true);
skin_edges.merge(skin_verts);
return skin_edges;
};
auto mark_boundary_dofs = [&](Range &skin_edges) {
auto problem_manager = m_field.
getInterface<ProblemsManager>();
std::vector<bool> marker;
problem_manager->markDofs(simple_interface->getProblemName(),
ROW,
skin_edges, marker);
return marker;
};
auto skin_ents = get_ents_on_mesh_skin();
auto marker = mark_boundary_dofs(skin_ents);
boost::shared_ptr<FaceEle> fe(
new FaceEle(m_field));
fe->getOpPtrVector().push_back(
new OpFace(skin_ents, marker));
auto dm = simple_interface->getDM();
fe);
}
}
ForcesAndSourcesCore::UserDataOperator UserDataOperator
FaceEle::UserDataOperator FaceEleOp
int main(int argc, char *argv[])
MoFEM::FaceElementForcesAndSourcesCore FaceEle
#define CATCH_ERRORS
Catch errors.
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base .
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define MYPCOMM_INDEX
default communicator number PCOMM
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ MOFEM_ATOM_TEST_INVALID
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
PetscErrorCode DMoFEMLoopFiniteElements(DM dm, const char fe_name[], MoFEM::FEMethod *method)
Executes FEMethod for finite elements in DM.
PetscErrorCode DMRegister_MoFEM(const char sname[])
Register MoFEM problem.
FaceElementForcesAndSourcesCoreSwitch< 0 > FaceElementForcesAndSourcesCore
Face finite element default.
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
implementation of Data Operators for Forces and Sources
PetscErrorCode PetscOptionsGetInt(PetscOptions *, const char pre[], const char name[], PetscInt *ivalue, PetscBool *set)
DeprecatedCoreInterface Interface
DataForcesAndSourcesCore::EntData EntData
virtual moab::Interface & get_moab()=0
static MoFEMErrorCode Initialize(int *argc, char ***args, const char file[], const char help[])
Initializes the MoFEM database PETSc, MOAB and MPI.
static MoFEMErrorCode Finalize()
Checks for options to be called at the conclusion of the program.
Deprecated interface functions.
default operator for TRI element
MoFEMErrorCode getInterface(const MOFEMuuid &uuid, IFACE *&iface) const
Get interface by uuid and return reference to pointer of interface.