v0.16.3
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 = createInterface<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<TestingInterface>();
503 CHKERR regSubInterface<PipelineManager>();
504 CHKERR regSubInterface<PipelineGraph>();
505 CHKERR regSubInterface<ProblemsManager>();
506 CHKERR regSubInterface<MatrixManager>();
507 CHKERR regSubInterface<ISManager>();
508 CHKERR regSubInterface<VecManager>();
509 CHKERR regSubInterface<FieldBlas>();
510 CHKERR regSubInterface<BitRefManager>();
511 CHKERR regSubInterface<Tools>();
512 CHKERR regSubInterface<CommInterface>();
513 CHKERR regSubInterface<MeshsetsManager>();
514 CHKERR regSubInterface<NodeMergerInterface>();
515 CHKERR regSubInterface<PrismsFromSurfaceInterface>();
516 CHKERR regSubInterface<MeshRefinement>();
517 CHKERR regSubInterface<PrismInterface>();
518 CHKERR regSubInterface<CutMeshInterface>();
519 CHKERR regSubInterface<SeriesRecorder>();
520#ifdef WITH_TETGEN
521 CHKERR regSubInterface<TetGenInterface>();
522#endif
523#ifdef WITH_MED
524 CHKERR regSubInterface<MedInterface>();
525#endif
526 CHKERR regSubInterface<FieldEvaluatorInterface>();
527 CHKERR regSubInterface<BcManager>();
528
529 // Register events
530 CHKERR regEvents<SchurEvents>();
531
533};
534
537 // Cleaning databases in interfaces
538 CHKERR getInterface<SeriesRecorder>()->clearMap();
539 CHKERR getInterface<MeshsetsManager>()->clearMap();
540 CHKERR getInterface<CutMeshInterface>()->clearMap();
541 // Cleaning databases
542 refinedEntities.clear();
543 refinedFiniteElements.clear();
544 fIelds.clear();
545 entsFields.clear();
546 dofsField.clear();
547 finiteElements.clear();
548 entsFiniteElements.clear();
549 entFEAdjacencies.clear();
550 pRoblems.clear();
552}
553
554MoFEMErrorCode Core::addPrismToDatabase(const EntityHandle prism, int verb) {
556 if (verb == -1)
557 verb = verbose;
558 std::pair<RefEntity_multiIndex::iterator, bool> p_ent;
559 p_ent = refinedEntities.insert(
560 boost::make_shared<RefEntity>(basicEntityDataPtr, prism));
561 if (p_ent.second) {
562 std::pair<RefElement_multiIndex::iterator, bool> p;
563 p = refinedFiniteElements.insert(
564 boost::shared_ptr<RefElement>(new RefElement_PRISM(*p_ent.first)));
565 int num_nodes;
566 const EntityHandle *conn;
567 CHKERR get_moab().get_connectivity(prism, conn, num_nodes, true);
568 Range face_side3, face_side4;
569 CHKERR get_moab().get_adjacencies(conn, 3, 2, false, face_side3);
570 CHKERR get_moab().get_adjacencies(&conn[3], 3, 2, false, face_side4);
571 if (face_side3.size() != 1)
572 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
573 "prism don't have side face 3");
574 if (face_side4.size() != 1)
575 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
576 "prims don't have side face 4");
577 p.first->get()->getSideNumberPtr(*face_side3.begin());
578 p.first->get()->getSideNumberPtr(*face_side4.begin());
579 }
581}
582
585
586 const EntityHandle root_meshset = get_moab().get_root_set();
587 if (root_meshset) {
588 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
589 "Root meshset should be 0");
590 }
591
592 // Set version
593 {
594 Version version;
595 CHKERR getFileVersion(moab, version);
596 }
597
598 // Global Variables
599 {
600
601 auto check_tag_allocated = [](auto &rval) {
603 if (rval == MB_ALREADY_ALLOCATED)
604 rval = MB_SUCCESS;
605 else
606 CHKERRG(rval);
608 };
609
610 // Safety nets
611 int def_bool = 0;
612 rval = get_moab().tag_get_handle("_MoFEMBuild", 1, MB_TYPE_INTEGER,
613 th_MoFEMBuild, MB_TAG_CREAT | MB_TAG_MESH,
614 &def_bool);
615 CHKERR check_tag_allocated(rval);
616
617 CHKERR get_moab().tag_get_by_ptr(th_MoFEMBuild, &root_meshset, 1,
618 (const void **)&buildMoFEM);
619 }
620
621 // Tags saved in vtk-files
622 {
623 const int def_part = -1;
624 CHKERR get_moab().tag_get_handle("PARTITION", 1, MB_TYPE_INTEGER, th_Part,
625 MB_TAG_CREAT | MB_TAG_SPARSE, &def_part);
626 }
627
628 // Tags Ref
629 {
630
631 // Fix size of bir ref level tags
633
634 const int def_part = -1;
635 CHKERR get_moab().tag_get_handle("_MeshsetPartition", 1, MB_TYPE_INTEGER,
636 th_Part, MB_TAG_CREAT | MB_TAG_SPARSE,
637 &def_part);
638 EntityHandle def_handle = 0;
639 CHKERR get_moab().tag_get_handle("_RefParentHandle", 1, MB_TYPE_HANDLE,
640 th_RefParentHandle,
641 MB_TAG_CREAT | MB_TAG_SPARSE, &def_handle);
642 BitRefLevel def_bit_level = 0;
643 CHKERR get_moab().tag_get_handle(
644 "_RefBitLevel", sizeof(BitRefLevel), MB_TYPE_OPAQUE, th_RefBitLevel,
645 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_bit_level);
646 BitRefLevel def_bit_level_mask = BitRefLevel().set();
647 CHKERR get_moab().tag_get_handle(
648 "_RefBitLevelMask", sizeof(BitRefLevel), MB_TYPE_OPAQUE,
649 th_RefBitLevel_Mask, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
650 &def_bit_level_mask);
651 BitRefEdges def_bit_edge = 0;
652 CHKERR get_moab().tag_get_handle(
653 "_RefBitEdge", sizeof(BitRefEdges), MB_TYPE_OPAQUE, th_RefBitEdge,
654 MB_TAG_CREAT | MB_TAG_SPARSE | MB_TAG_BYTES, &def_bit_edge);
655 }
656
657 // Tags Field
658 {
659 const unsigned long int def_id = 0;
660 CHKERR get_moab().tag_get_handle(
661 "_FieldId", sizeof(BitFieldId), MB_TYPE_OPAQUE, th_FieldId,
662 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
663 FieldSpace def_space = LASTSPACE;
664 CHKERR get_moab().tag_get_handle(
665 "_FieldSpace", sizeof(FieldSpace), MB_TYPE_OPAQUE, th_FieldSpace,
666 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_space);
667 FieldContinuity def_continuity = LASTCONTINUITY;
668 CHKERR get_moab().tag_get_handle(
669 "_FieldContinuity", sizeof(FieldContinuity), MB_TYPE_OPAQUE,
670 th_FieldContinuity, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
671 &def_continuity);
673 CHKERR get_moab().tag_get_handle(
674 "_FieldBase", sizeof(FieldApproximationBase), MB_TYPE_OPAQUE,
675 th_FieldBase, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_base);
676 const int def_val_len = 0;
677 CHKERR get_moab().tag_get_handle(
678 "_FieldName", def_val_len, MB_TYPE_OPAQUE, th_FieldName,
679 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_VARLEN | MB_TAG_SPARSE, NULL);
680 CHKERR get_moab().tag_get_handle(
681 "_FieldName_DataNamePrefix", def_val_len, MB_TYPE_OPAQUE,
682 th_FieldName_DataNamePrefix,
683 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_VARLEN | MB_TAG_SPARSE, NULL);
684 }
685
686 // Tags FE
687 {
688 const unsigned long int def_id = 0;
689 const int def_val_len = 0;
690 CHKERR get_moab().tag_get_handle(
691 "_FEId", sizeof(BitFEId), MB_TYPE_OPAQUE, th_FEId,
692 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
693 CHKERR get_moab().tag_get_handle(
694 "_FEName", def_val_len, MB_TYPE_OPAQUE, th_FEName,
695 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_VARLEN | MB_TAG_SPARSE, NULL);
696 CHKERR get_moab().tag_get_handle(
697 "_FEIdCol", sizeof(BitFieldId), MB_TYPE_OPAQUE, th_FEIdCol,
698 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
699 CHKERR get_moab().tag_get_handle(
700 "_FEIdRow", sizeof(BitFieldId), MB_TYPE_OPAQUE, th_FEIdRow,
701 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
702 CHKERR get_moab().tag_get_handle(
703 "_FEIdData", sizeof(BitFieldId), MB_TYPE_OPAQUE, th_FEIdData,
704 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
705 }
706
707 // Tags Problem
708 {
709 const unsigned long int def_id = 0;
710 const int def_val_len = 0;
711 CHKERR get_moab().tag_get_handle(
712 "_ProblemId", sizeof(BitProblemId), MB_TYPE_OPAQUE, th_ProblemId,
713 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
714 CHKERR get_moab().tag_get_handle(
715 "_ProblemFEId", sizeof(BitFEId), MB_TYPE_OPAQUE, th_ProblemFEId,
716 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
717 CHKERR get_moab().tag_get_handle(
718 "_ProblemName", def_val_len, MB_TYPE_OPAQUE, th_ProblemName,
719 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_VARLEN | MB_TAG_SPARSE, NULL);
720 DofIdx def_nbdofs = 0;
721 CHKERR get_moab().tag_get_handle(
722 "_ProblemNbDofsRow", sizeof(DofIdx), MB_TYPE_OPAQUE,
723 th_ProblemNbDofsRow, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
724 &def_nbdofs);
725 CHKERR get_moab().tag_get_handle(
726 "_ProblemNbDofsCol", sizeof(DofIdx), MB_TYPE_OPAQUE,
727 th_ProblemNbDofsCol, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
728 &def_nbdofs);
729 CHKERR get_moab().tag_get_handle(
730 "_ProblemLocalNbDofsRow", sizeof(DofIdx), MB_TYPE_OPAQUE,
731 th_ProblemLocalNbDofRow, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
732 &def_nbdofs);
733 CHKERR get_moab().tag_get_handle(
734 "_ProblemGhostNbDofsRow", sizeof(DofIdx), MB_TYPE_OPAQUE,
735 th_ProblemGhostNbDofRow, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
736 &def_nbdofs);
737 CHKERR get_moab().tag_get_handle(
738 "_ProblemLocalNbDofsCol", sizeof(DofIdx), MB_TYPE_OPAQUE,
739 th_ProblemLocalNbDofCol, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
740 &def_nbdofs);
741 CHKERR get_moab().tag_get_handle(
742 "_ProblemGhostNbDofsCol", sizeof(DofIdx), MB_TYPE_OPAQUE,
743 th_ProblemGhostNbDofCol, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
744 &def_nbdofs);
745 }
746
747 // Meshsets with boundary conditions and material sets
748 MeshsetsManager *meshsets_manager_ptr;
749 CHKERR getInterface(meshsets_manager_ptr);
750 CHKERR meshsets_manager_ptr->getTags(verb);
751
752 // Series recorder
753 SeriesRecorder *series_recorder_ptr;
754 CHKERR getInterface(series_recorder_ptr);
755 CHKERR series_recorder_ptr->getTags(verb);
756
758}
759
762 if (verb == -1)
763 verb = verbose;
764 CHKERR clearMap();
766}
767
770 if (verb == -1)
771 verb = verbose;
772 CHKERR this->clearMap();
773 CHKERR this->getTags(verb);
774 CHKERR this->initialiseDatabaseFromMesh(verb);
776}
777
778MoFEMErrorCode Core::set_moab_interface(moab::Interface &new_moab, int verb) {
779 return this->setMoabInterface(new_moab, verb);
780};
781
783 int verb) {
784 return this->setMoabInterface(new_moab, verb);
785};
786
789 if (verb == -1)
790 verb = verbose;
791
792 PetscOptionsBegin(mofemComm, optionsPrefix.c_str(), "Mesh cut options",
793 "See MoFEM documentation");
794
795 CHKERR PetscOptionsBool(
796 "-mofem_init_fields", "Initialise fields on construction", "",
797 initaliseAndBuildField, &initaliseAndBuildField, NULL);
798
799 CHKERR PetscOptionsBool(
800 "-mofem_init_fields", "Initialise fields on construction", "",
801 initaliseAndBuildFiniteElements, &initaliseAndBuildFiniteElements, NULL);
802
803 // TODO: Add read verbosity level
804 // TODO: Add option to initalise problems ??? - DO WE REALLY NEED THAT
805
806 PetscOptionsEnd();
807
809}
810
811// cubit meshsets
812
815 *fields_ptr = &fIelds;
817}
818
820Core::get_ref_ents(const RefEntity_multiIndex **refined_entities_ptr) const {
822 *refined_entities_ptr = &refinedEntities;
824}
826 const RefElement_multiIndex **refined_finite_elements_ptr) const {
828 *refined_finite_elements_ptr = &refinedFiniteElements;
830}
831
832MoFEMErrorCode Core::get_problem(const std::string &problem_name,
833 const Problem **problem_ptr) const {
835 typedef Problem_multiIndex::index<Problem_mi_tag>::type ProblemsByName;
836 const ProblemsByName &problems = pRoblems.get<Problem_mi_tag>();
837 ProblemsByName::iterator p_miit = problems.find(problem_name);
838 if (p_miit == problems.end()) {
839 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
840 "problem < %s > not found, (top tip: check spelling)",
841 problem_name.c_str());
842 }
843 *problem_ptr = &*p_miit;
845}
846
848Core::get_problems(const Problem_multiIndex **problems_ptr) const {
850 *problems_ptr = &pRoblems;
852}
853
857 *field_ents = &entsFields;
859}
862 *dofs_ptr = &dofsField;
864}
865
869 *fe_ptr = &finiteElements;
871}
872
874 const EntFiniteElement_multiIndex **fe_ent_ptr) const {
876 *fe_ent_ptr = &entsFiniteElements;
878}
879
881 MeshsetsManager *meshsets_manager_ptr;
882 getInterface(meshsets_manager_ptr);
883 return meshsets_manager_ptr;
884}
885
887 MeshsetsManager *meshsets_manager_ptr;
888 getInterface(meshsets_manager_ptr);
889 return meshsets_manager_ptr;
890}
891
894 *dofs_elements_adjacency) const {
896 *dofs_elements_adjacency = &entFEAdjacencies;
898}
899
902 return &entFEAdjacencies;
903}
904
905const Field_multiIndex *Core::get_fields() const { return &fIelds; }
907 return &refinedEntities;
908}
910 return &refinedFiniteElements;
911}
913 return &finiteElements;
914}
916 return &entsFiniteElements;
917}
919 return &entsFields;
920}
921const DofEntity_multiIndex *Core::get_dofs() const { return &dofsField; }
922const Problem *Core::get_problem(const std::string problem_name) const {
923 const Problem *prb;
924 CHK_THROW_MESSAGE(get_problem(problem_name, &prb),
925 "Problem of given name not found");
926 return prb;
927}
928const Problem_multiIndex *Core::get_problems() const { return &pRoblems; }
929
930template <int V, typename std::enable_if<(V >= 0), int>::type * = nullptr>
931void set_ref_ent_basic_data_ptr_impl(boost::shared_ptr<BasicEntityData> &ptr) {
933};
934
935template <int V, typename std::enable_if<(V < 0), int>::type * = nullptr>
936void set_ref_ent_basic_data_ptr_impl(boost::shared_ptr<BasicEntityData> &ptr) {
937 return;
938};
939
940void Core::setRefEntBasicDataPtr(MoFEM::Interface &m_field,
941 boost::shared_ptr<BasicEntityData> &ptr) {
942
943 switch (m_field.getValue()) {
944 case -1:
945 set_ref_ent_basic_data_ptr_impl<-1>(ptr);
946 break;
947 case 0:
948 set_ref_ent_basic_data_ptr_impl<0>(ptr);
949 break;
950 case 1:
951 set_ref_ent_basic_data_ptr_impl<1>(ptr);
952 break;
953 default:
954 THROW_MESSAGE("Core index can vary from -1 to MAX_CORE_TMP");
955 }
956};
957
958boost::shared_ptr<RefEntityTmp<0>>
959Core::makeSharedRefEntity(MoFEM::Interface &m_field, const EntityHandle ent) {
960
961 boost::shared_ptr<RefEntityTmp<0>> ref_ent_ptr;
962
963 switch (m_field.getValue()) {
964 case -1:
965 ref_ent_ptr = boost::shared_ptr<RefEntityTmp<0>>(
966
967 new RefEntityTmp<-1>(m_field.get_basic_entity_data_ptr(), ent)
968
969 );
970 break;
971 case 0:
972 ref_ent_ptr = boost::shared_ptr<RefEntityTmp<0>>(
973
974 new RefEntityTmp<0>(m_field.get_basic_entity_data_ptr(), ent)
975
976 );
977 break;
978 case 1:
979 ref_ent_ptr = boost::shared_ptr<RefEntityTmp<0>>(
980
981 new RefEntityTmp<1>(m_field.get_basic_entity_data_ptr(), ent)
982
983 );
984 break;
985 default:
986 THROW_MESSAGE("Core index can vary from -1 to MAX_CORE_TMP");
987 }
988
989 return ref_ent_ptr;
990}
991
992boost::shared_ptr<RefEntityTmp<0>>
993Core::make_shared_ref_entity(const EntityHandle ent) {
994 return this->makeSharedRefEntity(*this, ent);
995}
996
997boost::shared_ptr<RefEntityTmp<0>>
998CoreTmp<-1>::make_shared_ref_entity(const EntityHandle ent) {
999 return this->makeSharedRefEntity(*this, ent);
1000}
1001
1002} // 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.
std::string optionsPrefix
MPI_Comm comm
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:931
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:535
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:909
static const std::string & getPetscOptionsFile()
Definition Core.cpp:121
const FieldEntity_multiIndex * get_field_ents() const
Get the field ents object.
Definition Core.cpp:918
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:905
const Problem_multiIndex * get_problems() const
Get the problems object.
Definition Core.cpp:928
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:921
MoFEMErrorCode getOptions(int verb=DEFAULT_VERBOSITY)
Get core options from command line.
Definition Core.cpp:787
const RefEntity_multiIndex * get_ref_ents() const
Get the ref ents object.
Definition Core.cpp:906
const FieldEntityEntFiniteElementAdjacencyMap_multiIndex * get_ents_elements_adjacency() const
Get the dofs elements adjacency object.
Definition Core.cpp:901
const EntFiniteElement_multiIndex * get_ents_finite_elements() const
Get the ents finite elements object.
Definition Core.cpp:915
const FiniteElement_multiIndex * get_finite_elements() const
Get the finite elements object.
Definition Core.cpp:912
MoFEMErrorCode addPrismToDatabase(const EntityHandle prism, int verb=DEFAULT_VERBOSITY)
add prim element
Definition Core.cpp:554
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:778
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:832
MoFEMErrorCode getTags(int verb=DEFAULT_VERBOSITY)
Get tag handles.
Definition Core.cpp:583
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:880
MoFEMErrorCode rebuild_database(int verb=DEFAULT_VERBOSITY)
Clear database and initialize it once again.
Definition Core.cpp:768
MoFEMErrorCode clear_database(int verb=DEFAULT_VERBOSITY)
Clear database.
Definition Core.cpp:760
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