v0.16.0
Loading...
Searching...
No Matches
Core.cpp
Go to the documentation of this file.
1/** \file Core.cpp
2 * \brief Multi-index containers, data structures and other low-level functions
3 */
4
5
6#include <MoFEM.hpp>
7
9
10extern "C" {
12}
13
14namespace MoFEM {
15
16WrapMPIComm::WrapMPIComm(MPI_Comm comm, bool petsc)
17 : comm(comm), isPetscComm(petsc) {
18 if (isPetscComm) {
19 ierr = PetscCommDuplicate(comm, &duplicatedComm, NULL);
20 CHKERRABORT(comm, ierr);
21 } else {
22 int ierr = MPI_Comm_dup(comm, &duplicatedComm);
23 if (ierr) {
24 THROW_MESSAGE("MPI_Comm_dup not working");
25 }
26 }
27}
29 if (isPetscComm) {
30 ierr = PetscCommDestroy(&duplicatedComm);
31 CHKERRABORT(comm, ierr);
32 } else {
33 int ierr = MPI_Comm_free(&duplicatedComm);
34 if (ierr) {
35 CHKERRABORT(comm, MOFEM_DATA_INCONSISTENCY);
36 }
37 }
38}
39
40constexpr const int CoreTmp<0>::value;
41constexpr const int CoreTmp<-1>::value;
42
43MoFEMErrorCode Core::query_interface(boost::typeindex::type_index type_index,
44 UnknownInterface **iface) const {
46 *iface = NULL;
47 if (type_index == boost::typeindex::type_id<CoreInterface>()) {
48 *iface = static_cast<CoreInterface *>(const_cast<Core *>(this));
50 } else if (type_index ==
51 boost::typeindex::type_id<DeprecatedCoreInterface>()) {
52 *iface = static_cast<DeprecatedCoreInterface *>(const_cast<Core *>(this));
54 }
55
56 // Get sub-interface
57 auto it = iFaces.find(type_index);
58 if (it != iFaces.end()) {
59 *iface = it->second;
61 }
62
63 *iface = NULL;
64 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY, "unknown interface");
66}
67
68MoFEMErrorCode Core::Initialize(int *argc, char ***args, const char file[],
69 const char help[]) {
70
71 MPI_Initialized(&mpiInitialised);
72 if (!mpiInitialised)
73 MPI_Init(argc, args);
74
75 PetscInitialized(&isInitialized);
76 if (isInitialized == PETSC_FALSE) {
77 bool has_param_file_arg = false;
78 for (int i = 0; i < *argc - 1; ++i) {
79 if (std::strcmp((*args)[i], "-param_file") == 0) {
80 file = (*args)[i + 1];
81 has_param_file_arg = true;
82 petscOptionsFile = file ? file : "";
83 break;
84 }
85 }
86 if (!has_param_file_arg && file && !std::ifstream(file)) {
87 file = PETSC_NULLPTR;
88 petscOptionsFile.clear();
89 }
90 PetscInitialize(argc, args, file, help);
91 PetscPushErrorHandler(mofem_error_handler, PETSC_NULLPTR);
92 }
93
94 LogManager::createDefaultSinks(MPI_COMM_WORLD);
95 PetscVFPrintf = LogManager::logPetscFPrintf;
97 isGloballyInitialised = true;
98
99 MOFEM_LOG_CHANNEL("WORLD");
100 char petsc_version[255];
101 CHKERR PetscGetVersion(petsc_version, 255);
102 MOFEM_LOG_C("WORLD", Sev::inform, "MoFEM version %d.%d.%d (%s %s)",
103 MoFEM_VERSION_MAJOR, MoFEM_VERSION_MINOR, MoFEM_VERSION_BUILD,
104 MOAB_VERSION_STRING, petsc_version);
105 MOFEM_LOG_C("WORLD", Sev::inform, "git commit id %s", GIT_SHA1_NAME);
106
107 auto log_time = [&](const auto perefix, auto time) {
108 MOFEM_LOG("WORLD", Sev::inform)
109 << perefix << time.date().year() << "-" << time.date().month() << "-"
110 << time.date().day() << " " << time.time_of_day().hours() << ":"
111 << time.time_of_day().minutes() << ":" << time.time_of_day().seconds();
112 };
113
114 // Get current system time
115 log_time("Local time: ", boost::posix_time::second_clock::local_time());
116 log_time("UTC time: ", boost::posix_time::second_clock::universal_time());
117
118 return MOFEM_SUCCESS;
119}
120
121const std::string &Core::getPetscOptionsFile() { return petscOptionsFile; }
122
124 if (isGloballyInitialised) {
125 PetscPopErrorHandler();
126 isGloballyInitialised = false;
127
128 if (isInitialized == PETSC_FALSE) {
129 PetscBool is_finalized;
130 PetscFinalized(&is_finalized);
131 if (!is_finalized)
132 PetscFinalize();
133 }
134
135 if (!mpiInitialised) {
136 int mpi_finalized;
137 MPI_Finalized(&mpi_finalized);
138 if (!mpi_finalized)
139 MPI_Finalize();
140 }
141 }
142
143 return 0;
144}
145
146// Use SFINAE to decide which template should be run,
147// if exist getSubInterfaceOptions run this one.
148template <class T>
149static auto get_sub_iface_options_imp(T *const ptr, int)
150 -> decltype(ptr->getSubInterfaceOptions()) {
151 return ptr->getSubInterfaceOptions();
152};
153
154// Use SFINAE to decide which template should be run,
155// if getSubInterfaceOptions not exist run this one.
156template <class T>
157static auto get_sub_iface_options_imp(T *const ptr, long) -> MoFEMErrorCode {
158 return 0;
159};
160
161template <class T>
162static auto get_event_options_imp(T *const ptr, int)
163 -> decltype(ptr->getEventOptions()) {
164 return ptr->getEventptions();
165};
166
167// Use SFINAE to decide which template should be run,
168// if getSubInterfaceOptions not exist run this one.
169// See SFINAE:
170// https://stackoverflow.com/questions/257288/is-it-possible-to-write-a-template-to-check-for-a-functions-existence
171// https://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error
172template <class T>
173static auto get_event_options_imp(T *const ptr, long) -> MoFEMErrorCode {
174 return 0;
175};
176
177template <class IFACE> MoFEMErrorCode Core::regSubInterface() {
179 CHKERR registerInterface<IFACE>(true);
180 IFACE *ptr = new IFACE(*this);
181
182 // If sub interface has function getSubInterfaceOptions run
183 // it after construction. getSubInterfaceOptions is used to
184 // get parameters from command line.
185 auto get_sub_iface_options = [](auto *const ptr) {
186 return get_sub_iface_options_imp(ptr, 0);
187 };
188 CHKERR get_sub_iface_options(ptr);
189
190 auto type_idx = boost::typeindex::type_id<IFACE>();
191 iFaces.insert(type_idx, ptr);
193}
194
195template <class IFACE> MoFEMErrorCode Core::regEvents() {
197 auto ptr = boost::make_shared<IFACE>();
198 // See SFINAE:
199 // https://stackoverflow.com/questions/257288/is-it-possible-to-write-a-template-to-check-for-a-functions-existence
200 // https://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error
201 auto get_event_options = [](auto *const ptr) {
202 return get_event_options_imp(ptr, 0);
203 };
204 CHKERR get_event_options(ptr.get());
206}
207
209 MPI_Comm comm, const int verbose) {
211
212 // This is deprecated ONE should use MoFEM::Core::Initialize
213 if (!isGloballyInitialised)
214 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
215 "MoFEM globally is not initialised, call MoFEM::Core::Initialize");
216
217 // Create duplicate communicator
218 wrapMPIMOABComm = boost::make_shared<WrapMPIComm>(comm, false);
219
220 MPI_Comm_size(mofemComm, &sIze);
221 MPI_Comm_rank(mofemComm, &rAnk);
222
223 // CHeck if moab has set communicator if not set communicator internally
224 ParallelComm *pComm = ParallelComm::get_pcomm(&moab, MYPCOMM_INDEX);
225 if (pComm == NULL)
226 pComm = new ParallelComm(&moab, wrapMPIMOABComm->get_comm());
227
228 // Register interfaces for this implementation
229 CHKERR registerInterface<UnknownInterface>();
230 CHKERR registerInterface<CoreInterface>();
231 CHKERR registerInterface<DeprecatedCoreInterface>();
232
233 // Register MOFEM events in PETSc
234 PetscLogEventRegister("FE_preProcess", 0, &MOFEM_EVENT_preProcess);
235 PetscLogEventRegister("FE_operator", 0, &MOFEM_EVENT_operator);
236 PetscLogEventRegister("FE_postProcess", 0, &MOFEM_EVENT_postProcess);
237 PetscLogEventRegister("MoFEMCreateMat", 0, &MOFEM_EVENT_createMat);
238
239 MOFEM_LOG_CHANNEL("WORLD");
240 MOFEM_LOG_CHANNEL("SELF");
241 MOFEM_LOG_CHANNEL("SYNC");
242
244}
245
246Core::CoreTmp(moab::Interface &moab, ///< MoAB interface
247 MPI_Comm comm, ///< MPI communicator
248 const int verbose ///< Verbosity level
249
250 )
251 : CoreTmp(moab, comm, verbose, CoreValue<0>()) {
252
253 // Register sub-interfaces
254 ierr = this->registerSubInterfaces();
255 CHKERRABORT(comm, ierr);
256 ierr = this->clearMap();
257 CHKERRABORT(comm, ierr);
258 ierr = this->getTags();
259 CHKERRABORT(comm, ierr);
260 ierr = this->getOptions(verbose);
261 CHKERRABORT(comm, ierr);
262
263 this->basicEntityDataPtr = boost::make_shared<BasicEntityData>(moab);
264 setRefEntBasicDataPtr(*this, this->basicEntityDataPtr);
265
266 ierr = this->initialiseDatabaseFromMesh(verbose);
267 CHKERRABORT(comm, ierr);
268}
269
270CoreTmp<-1>::CoreTmp(moab::Interface &moab, ///< MoAB interface
271 MPI_Comm comm, ///< MPI communicator
272 const int verbose ///< Verbosity level
273
274 )
275 : CoreTmp<0>(moab, comm, verbose, CoreValue<-1>()) {
276
277 // Register sub-interfaces
278 ierr = this->registerSubInterfaces();
279 CHKERRABORT(comm, ierr);
280 ierr = this->clearMap();
281 CHKERRABORT(comm, ierr);
282 ierr = this->getTags();
283 CHKERRABORT(comm, ierr);
284 ierr = this->getOptions(verbose);
285 CHKERRABORT(comm, ierr);
286
287 this->basicEntityDataPtr = boost::make_shared<BasicEntityData>(moab);
288 setRefEntBasicDataPtr(*this, this->basicEntityDataPtr);
289
290 ierr = this->initialiseDatabaseFromMesh(verbose);
291 CHKERRABORT(comm, ierr);
292}
293
295 PetscBool is_finalized = PETSC_FALSE;
296 PetscFinalized(&is_finalized);
297 if (!is_finalized && !iFaces.empty())
298 clearMap();
299 // Destroy interfaces
300 iFaces.clear();
301 // This is deprecated ONE should use MoFEM::Core::Initialize
302 if (isGloballyInitialised && is_finalized) {
303 isGloballyInitialised = false;
304 }
305}
306
308 BOOST_LOG_SCOPED_THREAD_ATTR("Timeline", attrs::timer());
309 MOFEM_LOG_CHANNEL("WORLD");
310
312 if (verb == -1)
313 verb = verbose;
314
315 Range ref_elems_to_add;
316
317 MOFEM_LOG("WORLD", Sev::verbose) << "Get MoFEM meshsets";
318 // Initialize database
319 Range meshsets;
320 CHKERR get_moab().get_entities_by_type(0, MBENTITYSET, meshsets, false);
321 Range special_meshsets;
322 for (auto mit : meshsets) {
323 BitFieldId field_id;
324 // Get bit id form field tag
325 CHKERR get_moab().tag_get_data(th_FieldId, &mit, 1, &field_id);
326 // Check if meshset if field meshset
327 if (field_id != 0) {
328
329 const void *tag_name;
330 int tag_name_size;
331 CHKERR get_moab().tag_get_by_ptr(
332 th_FieldName, &mit, 1, (const void **)&tag_name, &tag_name_size);
333
334 if (verb > QUIET)
335 MOFEM_LOG("WORLD", Sev::verbose)
336 << "Read field "
337 << boost::string_ref((char *)tag_name, tag_name_size);
338
339 auto p = fIelds.insert(boost::make_shared<Field>(moab, mit));
340
341 if (!p.second) {
342 // Field meshset exists, remove duplicate meshsets from other
343 // processors.
344 Range ents;
345 CHKERR get_moab().get_entities_by_handle(mit, ents, true);
346 CHKERR get_moab().add_entities((*p.first)->getMeshset(), ents);
347 CHKERR get_moab().delete_entities(&mit, 1);
348 } else {
349 special_meshsets.insert(mit);
350 }
351 }
352 // Check for finite elements
353 BitFieldId fe_id;
354 // Get bit id from fe tag
355 CHKERR get_moab().tag_get_data(th_FEId, &mit, 1, &fe_id);
356 // check if meshset is finite element meshset
357 if (fe_id != 0) {
358 std::pair<FiniteElement_multiIndex::iterator, bool> p =
359 finiteElements.insert(
360 boost::shared_ptr<FiniteElement>(new FiniteElement(moab, mit)));
361 if (verb > QUIET)
362 MOFEM_LOG("WORLD", Sev::verbose) << "Read finite element " << **p.first;
363
364 Range ents;
365 CHKERR get_moab().get_entities_by_type(mit, MBENTITYSET, ents, false);
366 CHKERR get_moab().get_entities_by_handle(mit, ents, true);
367 ref_elems_to_add.merge(ents);
368 if (!p.second) {
369 // Finite element mesh set exist, could be created on other processor.
370 // Remove duplicate.
371 CHKERR get_moab().add_entities((*p.first)->getMeshset(), ents);
372 CHKERR get_moab().delete_entities(&mit, 1);
373 } else {
374 special_meshsets.insert(mit);
375 }
376 }
377 BitProblemId problem_id;
378 // get bit id form problem tag
379 CHKERR get_moab().tag_get_data(th_ProblemId, &mit, 1, &problem_id);
380 // check if meshset if problem meshset
381 if (problem_id != 0) {
382 std::pair<Problem_multiIndex::iterator, bool> p =
383 pRoblems.insert(Problem(moab, mit));
384 if (verb > QUIET) {
385 MOFEM_LOG("WORLD", Sev::verbose) << "Read problem " << *p.first;
386 MOFEM_LOG("WORLD", Sev::noisy)
387 << "\tBitRef " << p.first->getBitRefLevel() << " BitMask "
388 << p.first->getBitRefLevelMask();
389 }
390
391 if (!p.second) {
392 // Problem meshset exists, could be created on other processor.
393 // Remove duplicate.
394 Range ents;
395 CHKERR get_moab().get_entities_by_handle(mit, ents, true);
396 CHKERR get_moab().get_entities_by_type(mit, MBENTITYSET, ents, true);
397 CHKERR get_moab().add_entities(p.first->meshset, ents);
398 CHKERR get_moab().delete_entities(&mit, 1);
399 } else {
400 special_meshsets.insert(mit);
401 }
402 }
403 }
404 MOFEM_LOG("WORLD", Sev::verbose) << "Get MoFEM meshsets <- done";
405
406 // Add entities to database
407 MOFEM_LOG("WORLD", Sev::verbose) << "Add entities to database";
408 Range bit_ref_ents;
409 CHKERR get_moab().get_entities_by_handle(0, bit_ref_ents, false);
410 bit_ref_ents = subtract(bit_ref_ents, special_meshsets);
411 CHKERR getInterface<BitRefManager>()->filterEntitiesByRefLevel(
412 BitRefLevel().set(), BitRefLevel().set(), bit_ref_ents);
413 CHKERR getInterface<BitRefManager>()->setEntitiesBitRefLevel(bit_ref_ents);
414 CHKERR getInterface<BitRefManager>()->setElementsBitRefLevel(
415 ref_elems_to_add);
416 MOFEM_LOG("WORLD", Sev::verbose) << "Add entities to database <- done";
417
418 // Build field entities
419 MOFEM_LOG("WORLD", Sev::verbose) << "Add field to database";
420 for (auto field : fIelds) {
421 if (field->getSpace() != NOSPACE) {
422 Range ents_of_id_meshset;
423 CHKERR get_moab().get_entities_by_handle(field->getMeshset(),
424 ents_of_id_meshset, false);
425 CHKERR set_field_order(ents_of_id_meshset, field->getId(), -1, verb);
426 }
427 }
428 MOFEM_LOG("WORLD", Sev::verbose) << "Add field to database <- done";
429
430 if (initaliseAndBuildField || initaliseAndBuildFiniteElements) {
431 MOFEM_LOG("WORLD", Sev::verbose) << "Build fields elements";
432 CHKERR build_fields(verb);
433 MOFEM_LOG("WORLD", Sev::verbose) << "Build fields elements <- done";
434 if (initaliseAndBuildFiniteElements) {
435 MOFEM_LOG("WORLD", Sev::verbose) << "Build finite elements";
436 CHKERR build_finite_elements(verb);
437 MOFEM_LOG("WORLD", Sev::verbose) << "Build finite elements <- done";
438 }
439 }
440
441 if (verb > VERY_NOISY) {
442 list_fields();
443 list_finite_elements();
444 list_problem();
445 }
446
447 // Initialize interfaces
448 MOFEM_LOG("WORLD", Sev::verbose) << "Initialise interfaces from mesh";
449
450 MOFEM_LOG("WORLD", Sev::verbose) << "Initialise MeshsetManager";
451 CHKERR getInterface<MeshsetsManager>() -> initialiseDatabaseFromMesh(verb);
452 MOFEM_LOG("WORLD", Sev::verbose) << "Initialise MeshsetManager <- done";
453 MOFEM_LOG("WORLD", Sev::verbose) << "Initialise SeriesRecorder";
454 CHKERR getInterface<SeriesRecorder>() -> initialiseDatabaseFromMesh(verb);
455 MOFEM_LOG("WORLD", Sev::verbose) << "Initialise SeriesRecorder <- done";
456
457 MOFEM_LOG("WORLD", Sev::verbose) << "Initialise interfaces from mesh <- done";
458
460}
461
462MoFEMErrorCode Core::setMoabInterface(moab::Interface &new_moab, int verb) {
464 if (verb == -1)
465 verb = verbose;
466
467 // clear moab database
468 CHKERR clearMap();
469
470 // set new reference
471 moab = std::ref(new_moab);
472
473 // check if moab has set communicator if not set communicator internally
474 ParallelComm *pComm = ParallelComm::get_pcomm(&new_moab, MYPCOMM_INDEX);
475 if (pComm == NULL) {
476 pComm = new ParallelComm(&new_moab, wrapMPIMOABComm->get_comm());
477 }
478
479 // create MoFEM tags
480 CHKERR getTags();
481
482 // Create basic entity data struture
483 basicEntityDataPtr = boost::make_shared<BasicEntityData>(moab);
484 setRefEntBasicDataPtr(*this, this->basicEntityDataPtr);
485
486 // Initalise database
487 CHKERR this->initialiseDatabaseFromMesh(verb);
488
490};
491
494
495 iFaces.clear();
496
497 // Register sub interfaces
498 CHKERR regSubInterface<LogManager>();
499 CHKERR regSubInterface<JsonConfigManager>();
500 CHKERR regSubInterface<Simple>();
501 CHKERR regSubInterface<OperatorsTester>();
502 CHKERR regSubInterface<PipelineManager>();
503 CHKERR regSubInterface<PipelineGraph>();
504 CHKERR regSubInterface<ProblemsManager>();
505 CHKERR regSubInterface<MatrixManager>();
506 CHKERR regSubInterface<ISManager>();
507 CHKERR regSubInterface<VecManager>();
508 CHKERR regSubInterface<FieldBlas>();
509 CHKERR regSubInterface<BitRefManager>();
510 CHKERR regSubInterface<Tools>();
511 CHKERR regSubInterface<CommInterface>();
512 CHKERR regSubInterface<MeshsetsManager>();
513 CHKERR regSubInterface<NodeMergerInterface>();
514 CHKERR regSubInterface<PrismsFromSurfaceInterface>();
515 CHKERR regSubInterface<MeshRefinement>();
516 CHKERR regSubInterface<PrismInterface>();
517 CHKERR regSubInterface<CutMeshInterface>();
518 CHKERR regSubInterface<SeriesRecorder>();
519#ifdef WITH_TETGEN
520 CHKERR regSubInterface<TetGenInterface>();
521#endif
522#ifdef WITH_MED
523 CHKERR regSubInterface<MedInterface>();
524#endif
525 CHKERR regSubInterface<FieldEvaluatorInterface>();
526 CHKERR regSubInterface<BcManager>();
527
528 // Register events
529 CHKERR regEvents<SchurEvents>();
530
532};
533
536 // Cleaning databases in interfaces
537 CHKERR getInterface<SeriesRecorder>()->clearMap();
538 CHKERR getInterface<MeshsetsManager>()->clearMap();
539 CHKERR getInterface<CutMeshInterface>()->clearMap();
540 // Cleaning databases
541 refinedEntities.clear();
542 refinedFiniteElements.clear();
543 fIelds.clear();
544 entsFields.clear();
545 dofsField.clear();
546 finiteElements.clear();
547 entsFiniteElements.clear();
548 entFEAdjacencies.clear();
549 pRoblems.clear();
551}
552
555 if (verb == -1)
556 verb = verbose;
557 std::pair<RefEntity_multiIndex::iterator, bool> p_ent;
558 p_ent = refinedEntities.insert(
559 boost::make_shared<RefEntity>(basicEntityDataPtr, prism));
560 if (p_ent.second) {
561 std::pair<RefElement_multiIndex::iterator, bool> p;
562 p = refinedFiniteElements.insert(
563 boost::shared_ptr<RefElement>(new RefElement_PRISM(*p_ent.first)));
564 int num_nodes;
565 const EntityHandle *conn;
566 CHKERR get_moab().get_connectivity(prism, conn, num_nodes, true);
567 Range face_side3, face_side4;
568 CHKERR get_moab().get_adjacencies(conn, 3, 2, false, face_side3);
569 CHKERR get_moab().get_adjacencies(&conn[3], 3, 2, false, face_side4);
570 if (face_side3.size() != 1)
571 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
572 "prism don't have side face 3");
573 if (face_side4.size() != 1)
574 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
575 "prims don't have side face 4");
576 p.first->get()->getSideNumberPtr(*face_side3.begin());
577 p.first->get()->getSideNumberPtr(*face_side4.begin());
578 }
580}
581
584
585 const EntityHandle root_meshset = get_moab().get_root_set();
586 if (root_meshset) {
587 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
588 "Root meshset should be 0");
589 }
590
591 // Set version
592 {
593 Version version;
594 CHKERR getFileVersion(moab, version);
595 }
596
597 // Global Variables
598 {
599
600 auto check_tag_allocated = [](auto &rval) {
602 if (rval == MB_ALREADY_ALLOCATED)
603 rval = MB_SUCCESS;
604 else
605 CHKERRG(rval);
607 };
608
609 // Safety nets
610 int def_bool = 0;
611 rval = get_moab().tag_get_handle("_MoFEMBuild", 1, MB_TYPE_INTEGER,
612 th_MoFEMBuild, MB_TAG_CREAT | MB_TAG_MESH,
613 &def_bool);
614 CHKERR check_tag_allocated(rval);
615
616 CHKERR get_moab().tag_get_by_ptr(th_MoFEMBuild, &root_meshset, 1,
617 (const void **)&buildMoFEM);
618 }
619
620 // Tags saved in vtk-files
621 {
622 const int def_part = -1;
623 CHKERR get_moab().tag_get_handle("PARTITION", 1, MB_TYPE_INTEGER, th_Part,
624 MB_TAG_CREAT | MB_TAG_SPARSE, &def_part);
625 }
626
627 // Tags Ref
628 {
629
630 // Fix size of bir ref level tags
632
633 const int def_part = -1;
634 CHKERR get_moab().tag_get_handle("_MeshsetPartition", 1, MB_TYPE_INTEGER,
635 th_Part, MB_TAG_CREAT | MB_TAG_SPARSE,
636 &def_part);
637 EntityHandle def_handle = 0;
638 CHKERR get_moab().tag_get_handle("_RefParentHandle", 1, MB_TYPE_HANDLE,
639 th_RefParentHandle,
640 MB_TAG_CREAT | MB_TAG_SPARSE, &def_handle);
641 BitRefLevel def_bit_level = 0;
642 CHKERR get_moab().tag_get_handle(
643 "_RefBitLevel", sizeof(BitRefLevel), MB_TYPE_OPAQUE, th_RefBitLevel,
644 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_bit_level);
645 BitRefLevel def_bit_level_mask = BitRefLevel().set();
646 CHKERR get_moab().tag_get_handle(
647 "_RefBitLevelMask", sizeof(BitRefLevel), MB_TYPE_OPAQUE,
648 th_RefBitLevel_Mask, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
649 &def_bit_level_mask);
650 BitRefEdges def_bit_edge = 0;
651 CHKERR get_moab().tag_get_handle(
652 "_RefBitEdge", sizeof(BitRefEdges), MB_TYPE_OPAQUE, th_RefBitEdge,
653 MB_TAG_CREAT | MB_TAG_SPARSE | MB_TAG_BYTES, &def_bit_edge);
654 }
655
656 // Tags Field
657 {
658 const unsigned long int def_id = 0;
659 CHKERR get_moab().tag_get_handle(
660 "_FieldId", sizeof(BitFieldId), MB_TYPE_OPAQUE, th_FieldId,
661 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
662 FieldSpace def_space = LASTSPACE;
663 CHKERR get_moab().tag_get_handle(
664 "_FieldSpace", sizeof(FieldSpace), MB_TYPE_OPAQUE, th_FieldSpace,
665 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_space);
666 FieldContinuity def_continuity = LASTCONTINUITY;
667 CHKERR get_moab().tag_get_handle(
668 "_FieldContinuity", sizeof(FieldContinuity), MB_TYPE_OPAQUE,
669 th_FieldContinuity, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
670 &def_continuity);
672 CHKERR get_moab().tag_get_handle(
673 "_FieldBase", sizeof(FieldApproximationBase), MB_TYPE_OPAQUE,
674 th_FieldBase, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_base);
675 const int def_val_len = 0;
676 CHKERR get_moab().tag_get_handle(
677 "_FieldName", def_val_len, MB_TYPE_OPAQUE, th_FieldName,
678 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_VARLEN | MB_TAG_SPARSE, NULL);
679 CHKERR get_moab().tag_get_handle(
680 "_FieldName_DataNamePrefix", def_val_len, MB_TYPE_OPAQUE,
681 th_FieldName_DataNamePrefix,
682 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_VARLEN | MB_TAG_SPARSE, NULL);
683 }
684
685 // Tags FE
686 {
687 const unsigned long int def_id = 0;
688 const int def_val_len = 0;
689 CHKERR get_moab().tag_get_handle(
690 "_FEId", sizeof(BitFEId), MB_TYPE_OPAQUE, th_FEId,
691 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
692 CHKERR get_moab().tag_get_handle(
693 "_FEName", def_val_len, MB_TYPE_OPAQUE, th_FEName,
694 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_VARLEN | MB_TAG_SPARSE, NULL);
695 CHKERR get_moab().tag_get_handle(
696 "_FEIdCol", sizeof(BitFieldId), MB_TYPE_OPAQUE, th_FEIdCol,
697 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
698 CHKERR get_moab().tag_get_handle(
699 "_FEIdRow", sizeof(BitFieldId), MB_TYPE_OPAQUE, th_FEIdRow,
700 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
701 CHKERR get_moab().tag_get_handle(
702 "_FEIdData", sizeof(BitFieldId), MB_TYPE_OPAQUE, th_FEIdData,
703 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
704 }
705
706 // Tags Problem
707 {
708 const unsigned long int def_id = 0;
709 const int def_val_len = 0;
710 CHKERR get_moab().tag_get_handle(
711 "_ProblemId", sizeof(BitProblemId), MB_TYPE_OPAQUE, th_ProblemId,
712 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
713 CHKERR get_moab().tag_get_handle(
714 "_ProblemFEId", sizeof(BitFEId), MB_TYPE_OPAQUE, th_ProblemFEId,
715 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
716 CHKERR get_moab().tag_get_handle(
717 "_ProblemName", def_val_len, MB_TYPE_OPAQUE, th_ProblemName,
718 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_VARLEN | MB_TAG_SPARSE, NULL);
719 DofIdx def_nbdofs = 0;
720 CHKERR get_moab().tag_get_handle(
721 "_ProblemNbDofsRow", sizeof(DofIdx), MB_TYPE_OPAQUE,
722 th_ProblemNbDofsRow, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
723 &def_nbdofs);
724 CHKERR get_moab().tag_get_handle(
725 "_ProblemNbDofsCol", sizeof(DofIdx), MB_TYPE_OPAQUE,
726 th_ProblemNbDofsCol, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
727 &def_nbdofs);
728 CHKERR get_moab().tag_get_handle(
729 "_ProblemLocalNbDofsRow", sizeof(DofIdx), MB_TYPE_OPAQUE,
730 th_ProblemLocalNbDofRow, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
731 &def_nbdofs);
732 CHKERR get_moab().tag_get_handle(
733 "_ProblemGhostNbDofsRow", sizeof(DofIdx), MB_TYPE_OPAQUE,
734 th_ProblemGhostNbDofRow, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
735 &def_nbdofs);
736 CHKERR get_moab().tag_get_handle(
737 "_ProblemLocalNbDofsCol", sizeof(DofIdx), MB_TYPE_OPAQUE,
738 th_ProblemLocalNbDofCol, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
739 &def_nbdofs);
740 CHKERR get_moab().tag_get_handle(
741 "_ProblemGhostNbDofsCol", sizeof(DofIdx), MB_TYPE_OPAQUE,
742 th_ProblemGhostNbDofCol, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
743 &def_nbdofs);
744 }
745
746 // Meshsets with boundary conditions and material sets
747 MeshsetsManager *meshsets_manager_ptr;
748 CHKERR getInterface(meshsets_manager_ptr);
749 CHKERR meshsets_manager_ptr->getTags(verb);
750
751 // Series recorder
752 SeriesRecorder *series_recorder_ptr;
753 CHKERR getInterface(series_recorder_ptr);
754 CHKERR series_recorder_ptr->getTags(verb);
755
757}
758
761 if (verb == -1)
762 verb = verbose;
763 CHKERR clearMap();
765}
766
769 if (verb == -1)
770 verb = verbose;
771 CHKERR this->clearMap();
772 CHKERR this->getTags(verb);
773 CHKERR this->initialiseDatabaseFromMesh(verb);
775}
776
777MoFEMErrorCode Core::set_moab_interface(moab::Interface &new_moab, int verb) {
778 return this->setMoabInterface(new_moab, verb);
779};
780
782 int verb) {
783 return this->setMoabInterface(new_moab, verb);
784};
785
788 if (verb == -1)
789 verb = verbose;
790
791 PetscOptionsBegin(mofemComm, optionsPrefix.c_str(), "Mesh cut options",
792 "See MoFEM documentation");
793
794 CHKERR PetscOptionsBool(
795 "-mofem_init_fields", "Initialise fields on construction", "",
796 initaliseAndBuildField, &initaliseAndBuildField, NULL);
797
798 CHKERR PetscOptionsBool(
799 "-mofem_init_fields", "Initialise fields on construction", "",
800 initaliseAndBuildFiniteElements, &initaliseAndBuildFiniteElements, NULL);
801
802 // TODO: Add read verbosity level
803 // TODO: Add option to initalise problems ??? - DO WE REALLY NEED THAT
804
805 PetscOptionsEnd();
806
808}
809
810// cubit meshsets
811
814 *fields_ptr = &fIelds;
816}
817
819Core::get_ref_ents(const RefEntity_multiIndex **refined_entities_ptr) const {
821 *refined_entities_ptr = &refinedEntities;
823}
825 const RefElement_multiIndex **refined_finite_elements_ptr) const {
827 *refined_finite_elements_ptr = &refinedFiniteElements;
829}
830
831MoFEMErrorCode Core::get_problem(const std::string &problem_name,
832 const Problem **problem_ptr) const {
834 typedef Problem_multiIndex::index<Problem_mi_tag>::type ProblemsByName;
835 const ProblemsByName &problems = pRoblems.get<Problem_mi_tag>();
836 ProblemsByName::iterator p_miit = problems.find(problem_name);
837 if (p_miit == problems.end()) {
838 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
839 "problem < %s > not found, (top tip: check spelling)",
840 problem_name.c_str());
841 }
842 *problem_ptr = &*p_miit;
844}
845
847Core::get_problems(const Problem_multiIndex **problems_ptr) const {
849 *problems_ptr = &pRoblems;
851}
852
856 *field_ents = &entsFields;
858}
861 *dofs_ptr = &dofsField;
863}
864
868 *fe_ptr = &finiteElements;
870}
871
873 const EntFiniteElement_multiIndex **fe_ent_ptr) const {
875 *fe_ent_ptr = &entsFiniteElements;
877}
878
880 MeshsetsManager *meshsets_manager_ptr;
881 getInterface(meshsets_manager_ptr);
882 return meshsets_manager_ptr;
883}
884
886 MeshsetsManager *meshsets_manager_ptr;
887 getInterface(meshsets_manager_ptr);
888 return meshsets_manager_ptr;
889}
890
893 *dofs_elements_adjacency) const {
895 *dofs_elements_adjacency = &entFEAdjacencies;
897}
898
901 return &entFEAdjacencies;
902}
903
904const Field_multiIndex *Core::get_fields() const { return &fIelds; }
906 return &refinedEntities;
907}
909 return &refinedFiniteElements;
910}
912 return &finiteElements;
913}
915 return &entsFiniteElements;
916}
918 return &entsFields;
919}
920const DofEntity_multiIndex *Core::get_dofs() const { return &dofsField; }
921const Problem *Core::get_problem(const std::string problem_name) const {
922 const Problem *prb;
923 CHK_THROW_MESSAGE(get_problem(problem_name, &prb),
924 "Problem of given name not found");
925 return prb;
926}
927const Problem_multiIndex *Core::get_problems() const { return &pRoblems; }
928
929template <int V, typename std::enable_if<(V >= 0), int>::type * = nullptr>
930void set_ref_ent_basic_data_ptr_impl(boost::shared_ptr<BasicEntityData> &ptr) {
932};
933
934template <int V, typename std::enable_if<(V < 0), int>::type * = nullptr>
935void set_ref_ent_basic_data_ptr_impl(boost::shared_ptr<BasicEntityData> &ptr) {
936 return;
937};
938
939void Core::setRefEntBasicDataPtr(MoFEM::Interface &m_field,
940 boost::shared_ptr<BasicEntityData> &ptr) {
941
942 switch (m_field.getValue()) {
943 case -1:
944 set_ref_ent_basic_data_ptr_impl<-1>(ptr);
945 break;
946 case 0:
947 set_ref_ent_basic_data_ptr_impl<0>(ptr);
948 break;
949 case 1:
950 set_ref_ent_basic_data_ptr_impl<1>(ptr);
951 break;
952 default:
953 THROW_MESSAGE("Core index can vary from -1 to MAX_CORE_TMP");
954 }
955};
956
957boost::shared_ptr<RefEntityTmp<0>>
958Core::makeSharedRefEntity(MoFEM::Interface &m_field, const EntityHandle ent) {
959
960 boost::shared_ptr<RefEntityTmp<0>> ref_ent_ptr;
961
962 switch (m_field.getValue()) {
963 case -1:
964 ref_ent_ptr = boost::shared_ptr<RefEntityTmp<0>>(
965
966 new RefEntityTmp<-1>(m_field.get_basic_entity_data_ptr(), ent)
967
968 );
969 break;
970 case 0:
971 ref_ent_ptr = boost::shared_ptr<RefEntityTmp<0>>(
972
973 new RefEntityTmp<0>(m_field.get_basic_entity_data_ptr(), ent)
974
975 );
976 break;
977 case 1:
978 ref_ent_ptr = boost::shared_ptr<RefEntityTmp<0>>(
979
980 new RefEntityTmp<1>(m_field.get_basic_entity_data_ptr(), ent)
981
982 );
983 break;
984 default:
985 THROW_MESSAGE("Core index can vary from -1 to MAX_CORE_TMP");
986 }
987
988 return ref_ent_ptr;
989}
990
991boost::shared_ptr<RefEntityTmp<0>>
992Core::make_shared_ref_entity(const EntityHandle ent) {
993 return this->makeSharedRefEntity(*this, ent);
994}
995
996boost::shared_ptr<RefEntityTmp<0>>
998 return this->makeSharedRefEntity(*this, ent);
999}
1000
1001} // namespace MoFEM
multi_index_container< FieldEntityEntFiniteElementAdjacencyMap, indexed_by< ordered_unique< tag< Composite_Unique_mi_tag >, composite_key< FieldEntityEntFiniteElementAdjacencyMap, const_mem_fun< FieldEntityEntFiniteElementAdjacencyMap, UId, &FieldEntityEntFiniteElementAdjacencyMap::getEntUniqueId >, const_mem_fun< FieldEntityEntFiniteElementAdjacencyMap, UId, &FieldEntityEntFiniteElementAdjacencyMap::getFeUniqueId > > >, ordered_non_unique< tag< Unique_mi_tag >, const_mem_fun< FieldEntityEntFiniteElementAdjacencyMap, UId, &FieldEntityEntFiniteElementAdjacencyMap::getEntUniqueId > >, ordered_non_unique< tag< FE_Unique_mi_tag >, const_mem_fun< FieldEntityEntFiniteElementAdjacencyMap, UId, &FieldEntityEntFiniteElementAdjacencyMap::getFeUniqueId > >, ordered_non_unique< tag< FEEnt_mi_tag >, const_mem_fun< FieldEntityEntFiniteElementAdjacencyMap, EntityHandle, &FieldEntityEntFiniteElementAdjacencyMap::getFeHandle > >, ordered_non_unique< tag< Ent_mi_tag >, const_mem_fun< FieldEntityEntFiniteElementAdjacencyMap, EntityHandle, &FieldEntityEntFiniteElementAdjacencyMap::getEntHandle > > > > FieldEntityEntFiniteElementAdjacencyMap_multiIndex
MultiIndex container keeps Adjacencies Element and dof entities adjacencies and vice versa.
void macro_is_deprecated_using_deprecated_function()
Is used to indicate that macro is deprecated Do nothing just triggers error at the compilation.
Definition Core.cpp:11
static PetscErrorCode mofem_error_handler(MPI_Comm comm, int line, const char *fun, const char *file, PetscErrorCode n, PetscErrorType p, const char *mess, void *ctx)
multi_index_container< boost::shared_ptr< Field >, indexed_by< hashed_unique< tag< BitFieldId_mi_tag >, const_mem_fun< Field, const BitFieldId &, &Field::getId >, HashBit< BitFieldId >, EqBit< BitFieldId > >, ordered_unique< tag< Meshset_mi_tag >, member< Field, EntityHandle, &Field::meshSet > >, ordered_unique< tag< FieldName_mi_tag >, const_mem_fun< Field, boost::string_ref, &Field::getNameRef > >, ordered_non_unique< tag< BitFieldId_space_mi_tag >, const_mem_fun< Field, FieldSpace, &Field::getSpace > > > > Field_multiIndex
Multi-index container for field storage and retrieval.
std::string type
#define MOFEM_LOG_C(channel, severity, format,...)
static char help[]
@ QUIET
@ VERY_NOISY
FieldApproximationBase
approximation base
Definition definitions.h:58
@ LASTBASE
Definition definitions.h:69
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
FieldSpace
approximation spaces
Definition definitions.h:82
@ LASTSPACE
FieldSpace in [ 0, LASTSPACE )
Definition definitions.h:89
@ NOSPACE
Definition definitions.h:83
#define MYPCOMM_INDEX
default communicator number PCOMM
FieldContinuity
Field continuity.
Definition definitions.h:99
@ LASTCONTINUITY
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define CHKERRG(n)
Check error code of MoFEM/MOAB/PETSc function.
@ MOFEM_OPERATION_UNSUCCESSFUL
Definition definitions.h:34
@ MOFEM_DATA_INCONSISTENCY
Definition definitions.h:31
@ MOFEM_SUCCESS
Definition definitions.h:30
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define THROW_MESSAGE(msg)
Throw MoFEM exception.
multi_index_container< boost::shared_ptr< DofEntity >, indexed_by< ordered_unique< tag< Unique_mi_tag >, const_mem_fun< DofEntity, UId, &DofEntity::getLocalUniqueId > >, ordered_non_unique< tag< Ent_mi_tag >, const_mem_fun< DofEntity, EntityHandle, &DofEntity::getEnt > > > > DofEntity_multiIndex
MultiIndex container keeps DofEntity.
multi_index_container< boost::shared_ptr< EntFiniteElement >, indexed_by< ordered_unique< tag< Unique_mi_tag >, const_mem_fun< EntFiniteElement, UId, &EntFiniteElement::getLocalUniqueId > >, ordered_non_unique< tag< Ent_mi_tag >, const_mem_fun< EntFiniteElement::interface_type_RefEntity, EntityHandle, &EntFiniteElement::getEnt > > > > EntFiniteElement_multiIndex
MultiIndex container for EntFiniteElement.
multi_index_container< Problem, indexed_by< ordered_unique< tag< Meshset_mi_tag >, member< Problem, EntityHandle, &Problem::meshset > >, hashed_unique< tag< BitProblemId_mi_tag >, const_mem_fun< Problem, BitProblemId, &Problem::getId >, HashBit< BitProblemId >, EqBit< BitProblemId > >, hashed_unique< tag< Problem_mi_tag >, const_mem_fun< Problem, std::string, &Problem::getName > > > > Problem_multiIndex
MultiIndex for entities for Problem.
multi_index_container< boost::shared_ptr< FiniteElement >, indexed_by< hashed_unique< tag< FiniteElement_Meshset_mi_tag >, member< FiniteElement, EntityHandle, &FiniteElement::meshset > >, hashed_unique< tag< BitFEId_mi_tag >, const_mem_fun< FiniteElement, BitFEId, &FiniteElement::getId >, HashBit< BitFEId >, EqBit< BitFEId > >, ordered_unique< tag< FiniteElement_name_mi_tag >, const_mem_fun< FiniteElement, boost::string_ref, &FiniteElement::getNameRef > > > > FiniteElement_multiIndex
MultiIndex for entities for FiniteElement.
#define MOFEM_LOG(channel, severity)
Log.
#define MOFEM_LOG_CHANNEL(channel)
Set and reset channel.
MoFEMErrorCode getTags(int verb=-1)
Get tag handles used on meshsets.
FTensor::Index< 'i', SPACE_DIM > i
static MoFEMErrorCodeGeneric< PetscErrorCode > ierr
static MoFEMErrorCodeGeneric< moab::ErrorCode > rval
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
std::bitset< BITFEID_SIZE > BitFEId
Finite element Id.
Definition Types.hpp:43
int DofIdx
Index of DOF.
Definition Types.hpp:18
std::bitset< BITPROBLEMID_SIZE > BitProblemId
Problem Id.
Definition Types.hpp:44
std::bitset< BITFIELDID_SIZE > BitFieldId
Field Id.
Definition Types.hpp:42
std::bitset< BITREFEDGES_SIZE > BitRefEdges
Definition Types.hpp:34
std::bitset< BITREFLEVEL_SIZE > BitRefLevel
Bit structure attached to each entity identifying to what mesh entity is attached.
Definition Types.hpp:40
implementation of Data Operators for Forces and Sources
Definition Common.hpp:10
multi_index_container< boost::shared_ptr< RefEntity >, indexed_by< ordered_unique< tag< Ent_mi_tag >, const_mem_fun< RefEntity, EntityHandle, &RefEntity::getEnt > >, ordered_non_unique< tag< Ent_Ent_mi_tag >, const_mem_fun< RefEntity, EntityHandle, &RefEntity::getParentEnt > >, ordered_non_unique< tag< Composite_EntType_and_ParentEntType_mi_tag >, composite_key< RefEntity, const_mem_fun< RefEntity, EntityType, &RefEntity::getEntType >, const_mem_fun< RefEntity, EntityType, &RefEntity::getParentEntType > > >, ordered_non_unique< tag< Composite_ParentEnt_And_EntType_mi_tag >, composite_key< RefEntity, const_mem_fun< RefEntity, EntityType, &RefEntity::getEntType >, const_mem_fun< RefEntity, EntityHandle, &RefEntity::getParentEnt > > > > > RefEntity_multiIndex
static auto get_sub_iface_options_imp(T *const ptr, int) -> decltype(ptr->getSubInterfaceOptions())
Definition Core.cpp:149
void set_ref_ent_basic_data_ptr_impl(boost::shared_ptr< BasicEntityData > &ptr)
Definition Core.cpp:930
multi_index_container< boost::shared_ptr< RefElement >, indexed_by< ordered_unique< tag< Ent_mi_tag >, const_mem_fun< RefElement::interface_type_RefEntity, EntityHandle, &RefElement::getEnt > > > > RefElement_multiIndex
static auto get_event_options_imp(T *const ptr, int) -> decltype(ptr->getEventOptions())
Definition Core.cpp:162
multi_index_container< boost::shared_ptr< FieldEntity >, indexed_by< ordered_unique< tag< Unique_mi_tag >, member< FieldEntity, UId, &FieldEntity::localUId > >, ordered_non_unique< tag< Ent_mi_tag >, const_mem_fun< FieldEntity::interface_type_RefEntity, EntityHandle, &FieldEntity::getEnt > > > > FieldEntity_multiIndex
static MoFEMErrorCode fixTagSize(moab::Interface &moab, bool *changed=nullptr)
Fix tag size when BITREFLEVEL_SIZE of core library is different than file BITREFLEVEL_SIZE.
Core (interface) class.
Definition Core.hpp:83
MoFEMErrorCode clearMap()
Cleaning database.
Definition Core.cpp:534
MoFEMErrorCode query_interface(boost::typeindex::type_index type_index, UnknownInterface **iface) const
Getting interface of core database.
Definition Core.cpp:43
static MoFEMErrorCode Initialize(int *argc, char ***args, const char file[], const char help[])
Initializes the MoFEM database PETSc, MOAB and MPI.
Definition Core.cpp:68
MoFEMErrorCode regSubInterface()
Register sub-interfaces in core interface.
Definition Core.cpp:177
const RefElement_multiIndex * get_ref_finite_elements() const
Get the ref finite elements object.
Definition Core.cpp:908
static const std::string & getPetscOptionsFile()
Definition Core.cpp:121
const FieldEntity_multiIndex * get_field_ents() const
Get the field ents object.
Definition Core.cpp:917
MoFEMErrorCode initialiseDatabaseFromMesh(int verb=DEFAULT_VERBOSITY)
Initialize database getting information on mesh.
Definition Core.cpp:307
MoFEMErrorCode registerSubInterfaces()
Register insterfaces.
Definition Core.cpp:492
const Field_multiIndex * get_fields() const
Get the fields object.
Definition Core.cpp:904
const Problem_multiIndex * get_problems() const
Get the problems object.
Definition Core.cpp:927
MoFEMErrorCode coreGenericConstructor(moab::Interface &moab, MPI_Comm comm, const int verbose)
Definition Core.cpp:208
const DofEntity_multiIndex * get_dofs() const
Get the dofs object.
Definition Core.cpp:920
MoFEMErrorCode getOptions(int verb=DEFAULT_VERBOSITY)
Get core options from command line.
Definition Core.cpp:786
const RefEntity_multiIndex * get_ref_ents() const
Get the ref ents object.
Definition Core.cpp:905
const FieldEntityEntFiniteElementAdjacencyMap_multiIndex * get_ents_elements_adjacency() const
Get the dofs elements adjacency object.
Definition Core.cpp:900
const EntFiniteElement_multiIndex * get_ents_finite_elements() const
Get the ents finite elements object.
Definition Core.cpp:914
const FiniteElement_multiIndex * get_finite_elements() const
Get the finite elements object.
Definition Core.cpp:911
MoFEMErrorCode addPrismToDatabase(const EntityHandle prism, int verb=DEFAULT_VERBOSITY)
add prim element
Definition Core.cpp:553
MoFEMErrorCode regEvents()
Register petsc events.
Definition Core.cpp:195
virtual ~CoreTmp()
Definition Core.cpp:294
static MoFEMErrorCode Finalize()
Checks for options to be called at the conclusion of the program.
Definition Core.cpp:123
MoFEMErrorCode set_moab_interface(moab::Interface &new_moab, int verb=VERBOSE)
Set the moab interface object.
Definition Core.cpp:777
MoFEMErrorCode setMoabInterface(moab::Interface &new_moab, int verb=VERBOSE)
Definition Core.cpp:462
MoFEMErrorCode get_problem(const std::string &problem_name, const Problem **problem_ptr) const
Get problem database (data structure)
Definition Core.cpp:831
MoFEMErrorCode getTags(int verb=DEFAULT_VERBOSITY)
Get tag handles.
Definition Core.cpp:582
CoreTmp(moab::Interface &moab, MPI_Comm comm=PETSC_COMM_WORLD, const int verbose=VERBOSE)
Definition Core.cpp:246
MeshsetsManager * get_meshsets_manager_ptr()
get MeshsetsManager pointer
Definition Core.cpp:879
MoFEMErrorCode rebuild_database(int verb=DEFAULT_VERBOSITY)
Clear database and initialize it once again.
Definition Core.cpp:767
MoFEMErrorCode clear_database(int verb=DEFAULT_VERBOSITY)
Clear database.
Definition Core.cpp:759
MoFEMErrorCode set_moab_interface(moab::Interface &new_moab, int verb)
CoreTmp(moab::Interface &moab, MPI_Comm comm=PETSC_COMM_WORLD, const int verbose=VERBOSE)
Deprecated interface functions.
Finite element definition.
static MoFEMErrorCode getOptions()
Get logger option.
static void createDefaultSinks(MPI_Comm comm)
Create default sinks.
static PetscErrorCode logPetscFPrintf(FILE *fd, const char format[], va_list Argp)
Use to handle PETSc output.
Interface for managing meshsets containing materials and boundary conditions.
keeps basic data about problem
keeps data about abstract PRISM finite element
MoFEMErrorCode getTags(int verb=-1)
get tags handlers used on meshsets
base class for all interface classes
MPI_Comm duplicatedComm
Definition Core.hpp:27
WrapMPIComm(MPI_Comm comm, bool petsc)
Definition Core.cpp:16
MPI_Comm comm
Definition Core.hpp:26