167 {
168
169
171
172 try {
173
174
175 moab::Core moab_core;
176 moab::Interface &moab = moab_core;
177
178
181
182
183 DMType dm_name = "DMMOFEM";
185
186
189 {
190
192
194
197
199
201
202
203 auto dm = simple_interface->
getDM();
204
205 auto domain_fe = boost::make_shared<VolEle>(m_field);
206
207 domain_fe->getRuleHook =
VolRule();
208
209 auto get_skin = [&]() {
211 CHKERR m_field.
get_moab().get_entities_by_dimension(0, 3, ents,
true);
214 CHKERR skin.find_skin(0, ents,
false, skin_ents);
215
216 ParallelComm *pcomm =
219 CHKERR pcomm->filter_pstatus(skin_ents,
220 PSTATUS_SHARED | PSTATUS_MULTISHARED,
221 PSTATUS_NOT, -1, &proc_skin);
223 for (auto d : {0, 1, 2})
224 CHKERR m_field.
get_moab().get_adjacencies(proc_skin, d,
false, adj,
225 moab::Interface::UNION);
226
227 return proc_skin;
228 };
229
230 auto get_mark_skin_dofs = [&](
Range &&skin) {
232 auto marker_ptr = boost::make_shared<std::vector<unsigned char>>();
234 *marker_ptr);
235 return marker_ptr;
236 };
237
240 auto mark_dofs = get_mark_skin_dofs(get_skin());
241
242
243 domain_fe->getOpPtrVector().push_back(
new OpVolumeSet(
"FIELD"));
244 domain_fe->getOpPtrVector().push_back(
new OpVolumeTest(
"FIELD"));
245
246 domain_fe->getOpPtrVector().push_back(
247 new OpSetBc(
"FIELD",
true, mark_dofs));
249 domain_fe->getOpPtrVector().push_back(
new OpUnSetBc(
"FIELD"));
250
251
253 domain_fe);
255
259 CHKERR VecGhostUpdateBegin(
v, ADD_VALUES, SCATTER_REVERSE);
260 CHKERR VecGhostUpdateEnd(
v, ADD_VALUES, SCATTER_REVERSE);
261 CHKERR VecGhostUpdateBegin(
v, INSERT_VALUES, SCATTER_FORWARD);
262 CHKERR VecGhostUpdateEnd(
v, INSERT_VALUES, SCATTER_FORWARD);
263
265 INSERT_VALUES, SCATTER_REVERSE);
266
267
268
271
272 double *array;
275 auto loc_idx = dof->getPetscLocalDofIdx();
276
277 if (dof->getFieldData() != array[loc_idx])
279 "Data inconsistency");
280
281 if ((*mark_dofs)[loc_idx]) {
282 if (array[loc_idx] != 0)
284 "Dof assembled, but it should be not");
285 } else {
286 if (array[loc_idx] == 0)
288 "Dof not assembled, but it should be");
289 }
290 }
291
292 CHKERR VecRestoreArray(
v, &array);
293 }
294 }
296
297
299
300 return 0;
301}
#define MOFEM_LOG_SYNCHRONISE(comm)
Synchronise "SYNC" channel.
#define CATCH_ERRORS
Catch errors.
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base .
#define MYPCOMM_INDEX
default communicator number PCOMM
@ MOFEM_ATOM_TEST_INVALID
#define CHKERR
Inline error check.
PetscErrorCode DMoFEMMeshToLocalVector(DM dm, Vec l, InsertMode mode, ScatterMode scatter_mode)
set local (or ghosted) vector values on mesh for partition only
PetscErrorCode DMMoFEMGetProblemPtr(DM dm, const MoFEM::Problem **problem_ptr)
Get pointer to problem data structure.
PetscErrorCode DMRegister_MoFEM(const char sname[])
Register MoFEM problem.
PetscErrorCode DMoFEMLoopFiniteElements(DM dm, const char fe_name[], MoFEM::FEMethod *method, CacheTupleWeakPtr cache_ptr=CacheTupleSharedPtr())
Executes FEMethod for finite elements in DM.
PetscErrorCode DMCreateGlobalVector_MoFEM(DM dm, Vec *g)
DMShellSetCreateGlobalVector.
const double v
phase velocity of light in medium (cm/ns)
virtual moab::Interface & get_moab()=0
virtual MPI_Comm & get_comm() const =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.
Set indices on entities on finite element.
keeps basic data about problem
auto & getNumeredRowDofsPtr() const
get access to numeredRowDofsPtr storing DOFs on rows
Problem manager is used to build and partition problems.
MoFEMErrorCode markDofs(const std::string problem_name, RowColData rc, const enum MarkOP op, const Range ents, std::vector< unsigned char > &marker) const
Create vector with marked indices.
Simple interface for fast problem set-up.
MoFEMErrorCode addDomainField(const std::string &name, const FieldSpace space, const FieldApproximationBase base, const FieldCoefficientsNumber nb_of_coefficients, const TagType tag_type=MB_TAG_SPARSE, const enum MoFEMTypes bh=MF_ZERO, int verb=-1)
Add field on domain.
MoFEMErrorCode getOptions()
get options
MoFEMErrorCode getDM(DM *dm)
Get DM.
MoFEMErrorCode loadFile(const std::string options, const std::string mesh_file_name)
Load mesh file.
MoFEMErrorCode setFieldOrder(const std::string field_name, const int order, const Range *ents=NULL)
Set field order.
MoFEMErrorCode setUp(const PetscBool is_partitioned=PETSC_TRUE)
Setup problem.
const std::string getProblemName() const
Get the Problem Name.
const std::string getDomainFEName() const
Get the Domain FE Name.
intrusive_ptr for managing petsc objects
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface refernce to pointer of interface.
Operator set cache stored data, in this example, global indices, but it can be any structure.
static std::vector< SharedVecInt > entsIndices
This is global static storage.
Test if cached data can be accessed, and check consistency of data.