30 constexpr
const int CoreTmp<-1>::value;
44 unsigned long int id = uuid.
uUId.to_ulong();
45 boost::ptr_map<unsigned long, UnknownInterface>::iterator it;
47 if (it != iFaces.end()) {
63 MPI_Initialized(&mpiInitialised);
67 PetscInitialized(&isInitialized);
68 if (isInitialized == PETSC_FALSE) {
69 PetscInitialize(argc,
args, file,
help);
76 isGloballyInitialised =
true;
79 char petsc_version[255];
80 CHKERR PetscGetVersion(petsc_version, 255);
81 MOFEM_LOG_C(
"WORLD", Sev::inform,
"MoFEM version %d.%d.%d (%s %s)",
82 MoFEM_VERSION_MAJOR, MoFEM_VERSION_MINOR, MoFEM_VERSION_BUILD,
83 MOAB_VERSION_STRING, petsc_version);
84 MOFEM_LOG_C(
"WORLD", Sev::inform,
"git commit id %s", GIT_SHA1_NAME);
86 auto log_time = [&](
const auto perefix,
auto time) {
88 << perefix << time.date().year() <<
"-" << time.date().month() <<
"-"
89 << time.date().day() <<
" " << time.time_of_day().hours() <<
":"
90 << time.time_of_day().minutes() <<
":" << time.time_of_day().seconds();
94 log_time(
"Local time: ", boost::posix_time::second_clock::local_time());
95 log_time(
"UTC time: ", boost::posix_time::second_clock::universal_time());
101 if (isGloballyInitialised) {
102 PetscPopErrorHandler();
103 isGloballyInitialised =
false;
105 if (isInitialized == PETSC_FALSE) {
106 PetscBool is_finalized;
107 PetscFinalized(&is_finalized);
112 if (!mpiInitialised) {
114 MPI_Finalized(&mpi_finalized);
127 -> decltype(ptr->getSubInterfaceOptions()) {
128 return ptr->getSubInterfaceOptions();
138 template <
class IFACE>
141 CHKERR registerInterface<IFACE>(uid,
false);
142 unsigned long int id = uid.
uUId.to_ulong();
143 IFACE *ptr =
new IFACE(*
this);
151 auto get_sub_iface_options = [](
auto *
const ptr) {
154 CHKERR get_sub_iface_options(ptr);
156 iFaces.insert(
id, ptr);
161 MPI_Comm comm,
const int verbose) {
165 if (!isGloballyInitialised)
167 "MoFEM globally is not initialised, call MoFEM::Core::Initialize");
170 wrapMPIComm = boost::make_shared<WrapMPIComm>(comm, cOmm);
171 MPI_Comm_size(cOmm, &sIze);
172 MPI_Comm_rank(cOmm, &rAnk);
175 ParallelComm *pComm = ParallelComm::get_pcomm(&moab,
MYPCOMM_INDEX);
177 pComm =
new ParallelComm(&moab, cOmm);
182 CHKERR registerInterface<DeprecatedCoreInterface>(
186 PetscLogEventRegister(
"FE_preProcess", 0, &MOFEM_EVENT_preProcess);
187 PetscLogEventRegister(
"FE_operator", 0, &MOFEM_EVENT_operator);
188 PetscLogEventRegister(
"FE_postProcess", 0, &MOFEM_EVENT_postProcess);
189 PetscLogEventRegister(
"MoFEMCreateMat", 0, &MOFEM_EVENT_createMat);
202 ierr = this->registerSubInterfaces();
203 CHKERRABORT(comm,
ierr);
204 ierr = this->clearMap();
205 CHKERRABORT(comm,
ierr);
206 ierr = this->getTags();
207 CHKERRABORT(comm,
ierr);
208 ierr = this->getOptions(verbose);
209 CHKERRABORT(comm,
ierr);
211 this->basicEntityDataPtr = boost::make_shared<BasicEntityData>(moab);
212 setRefEntBasicDataPtr(*
this, this->basicEntityDataPtr);
214 ierr = this->initialiseDatabaseFromMesh(verbose);
215 CHKERRABORT(comm,
ierr);
227 ierr = this->registerSubInterfaces();
228 CHKERRABORT(comm,
ierr);
229 ierr = this->clearMap();
230 CHKERRABORT(comm,
ierr);
231 ierr = this->getTags();
232 CHKERRABORT(comm,
ierr);
233 ierr = this->getOptions(verbose);
234 CHKERRABORT(comm,
ierr);
236 this->basicEntityDataPtr = boost::make_shared<BasicEntityData>(moab);
237 setRefEntBasicDataPtr(*
this, this->basicEntityDataPtr);
239 ierr = this->initialiseDatabaseFromMesh(verbose);
240 CHKERRABORT(comm,
ierr);
244 PetscBool is_finalized;
245 PetscFinalized(&is_finalized);
249 if (isGloballyInitialised && is_finalized) {
250 isGloballyInitialised =
false;
261 CHKERR getInterface(cs_manger_ptr);
266 Range ref_elems_to_add;
268 auto m_moab = &get_moab();
272 CHKERR get_moab().get_entities_by_type(0, MBENTITYSET, meshsets,
false);
273 Range special_meshsets;
274 for (
auto mit : meshsets) {
277 CHKERR get_moab().tag_get_data(th_FieldId, &mit, 1, &field_id);
282 boost::shared_ptr<CoordSys> cs_ptr;
285 1, (
const void **)&cs_name, &cs_name_size);
286 if (
rval == MB_SUCCESS && cs_name_size)
292 auto p = fIelds.insert(boost::make_shared<Field>(moab, mit, cs_ptr));
295 MOFEM_LOG(
"WORLD", Sev::verbose) <<
"Read field " << **
p.first;
301 CHKERR get_moab().get_entities_by_handle(mit, ents,
true);
302 CHKERR get_moab().add_entities((*
p.first)->getMeshset(), ents);
303 CHKERR get_moab().delete_entities(&mit, 1);
305 special_meshsets.insert(mit);
311 CHKERR get_moab().tag_get_data(th_FEId, &mit, 1, &fe_id);
314 std::pair<FiniteElement_multiIndex::iterator, bool>
p =
315 finiteElements.insert(
316 boost::shared_ptr<FiniteElement>(
new FiniteElement(moab, mit)));
318 MOFEM_LOG(
"WORLD", Sev::verbose) <<
"Read finite element " << **
p.first;
321 CHKERR get_moab().get_entities_by_type(mit, MBENTITYSET, ents,
false);
322 CHKERR get_moab().get_entities_by_handle(mit, ents,
true);
323 ref_elems_to_add.merge(ents);
327 CHKERR get_moab().add_entities((*
p.first)->getMeshset(), ents);
328 CHKERR get_moab().delete_entities(&mit, 1);
330 special_meshsets.insert(mit);
335 CHKERR get_moab().tag_get_data(th_ProblemId, &mit, 1, &problem_id);
337 if (problem_id != 0) {
338 std::pair<Problem_multiIndex::iterator, bool>
p =
339 pRoblems.insert(
Problem(moab, mit));
341 MOFEM_LOG(
"WORLD", Sev::verbose) <<
"Read problem " << *
p.first;
343 <<
"\tBitRef " <<
p.first->getBitRefLevel() <<
" BitMask "
344 <<
p.first->getMaskBitRefLevel();
351 CHKERR get_moab().get_entities_by_handle(mit, ents,
true);
352 CHKERR get_moab().get_entities_by_type(mit, MBENTITYSET, ents,
true);
353 CHKERR get_moab().add_entities(
p.first->meshset, ents);
354 CHKERR get_moab().delete_entities(&mit, 1);
356 special_meshsets.insert(mit);
363 CHKERR get_moab().get_entities_by_handle(0, bit_ref_ents,
false);
364 bit_ref_ents = subtract(bit_ref_ents, special_meshsets);
365 CHKERR getInterface<BitRefManager>()->filterEntitiesByRefLevel(
367 CHKERR getInterface<BitRefManager>()->setEntitiesBitRefLevel(bit_ref_ents);
368 CHKERR getInterface<BitRefManager>()->setElementsBitRefLevel(
372 for (
auto field : fIelds) {
373 if (field->getSpace() !=
NOSPACE) {
374 Range ents_of_id_meshset;
375 CHKERR get_moab().get_entities_by_handle(field->getMeshset(),
376 ents_of_id_meshset,
false);
377 CHKERR set_field_order(ents_of_id_meshset, field->getId(), -1, verb);
381 if (initaliseAndBuildField || initaliseAndBuildFiniteElements) {
382 CHKERR build_fields(verb);
383 if (initaliseAndBuildFiniteElements) {
384 CHKERR build_finite_elements(verb);
390 list_finite_elements();
396 CHKERR getInterface(m_manger_ptr);
399 CHKERR getInterface(series_recorder_ptr);
414 moab = std::ref(new_moab);
417 ParallelComm *pComm = ParallelComm::get_pcomm(&new_moab,
MYPCOMM_INDEX);
419 pComm =
new ParallelComm(&new_moab, cOmm);
426 basicEntityDataPtr = boost::make_shared<BasicEntityData>(moab);
427 setRefEntBasicDataPtr(*
this, this->basicEntityDataPtr);
430 CHKERR this->initialiseDatabaseFromMesh(verb);
456 CHKERR regSubInterface<PrismsFromSurfaceInterface>(
479 if (*feShift >=
BitFEId().set().to_ulong())
481 return BitFEId(1 << (((*feShift)++) - 1));
493 CHKERR getInterface<SeriesRecorder>()->clearMap();
494 CHKERR getInterface<MeshsetsManager>()->clearMap();
495 CHKERR getInterface<CoordSystemsManager>()->clearMap();
496 CHKERR getInterface<CutMeshInterface>()->clearMap();
498 refinedEntities.clear();
499 refinedFiniteElements.clear();
503 finiteElements.clear();
504 entsFiniteElements.clear();
505 entFEAdjacencies.clear();
514 std::pair<RefEntity_multiIndex::iterator, bool> p_ent;
515 p_ent = refinedEntities.insert(
516 boost::make_shared<RefEntity>(basicEntityDataPtr, prism));
518 std::pair<RefElement_multiIndex::iterator, bool>
p;
519 p = refinedFiniteElements.insert(
523 CHKERR get_moab().get_connectivity(prism, conn, num_nodes,
true);
524 Range face_side3, face_side4;
525 CHKERR get_moab().get_adjacencies(conn, 3, 2,
false, face_side3);
526 CHKERR get_moab().get_adjacencies(&conn[3], 3, 2,
false, face_side4);
527 if (face_side3.size() != 1)
529 "prism don't have side face 3");
530 if (face_side4.size() != 1)
532 "prims don't have side face 4");
533 p.first->get()->getSideNumberPtr(*face_side3.begin());
534 p.first->get()->getSideNumberPtr(*face_side4.begin());
542 const EntityHandle root_meshset = get_moab().get_root_set();
545 "Root meshset should be 0");
551 CHKERR getFileVersion(moab, version);
557 auto check_tag_allocated = [](
auto &
rval) {
559 if (
rval == MB_ALREADY_ALLOCATED)
568 rval = get_moab().tag_get_handle(
"_FieldShift", 1, MB_TYPE_INTEGER,
569 th_FieldShift, MB_TAG_CREAT | MB_TAG_MESH,
573 const void *tag_data[1];
574 CHKERR get_moab().tag_get_by_ptr(th_FieldShift, &root_meshset, 1, tag_data);
575 fShift = (
int *)tag_data[0];
577 rval = get_moab().tag_get_handle(
"_FEShift", 1, MB_TYPE_INTEGER, th_FEShift,
578 MB_TAG_CREAT | MB_TAG_MESH, &def_shift);
581 CHKERR get_moab().tag_get_by_ptr(th_FEShift, &root_meshset, 1, tag_data);
582 feShift = (
int *)tag_data[0];
584 rval = get_moab().tag_get_handle(
"_ProblemShift", 1, MB_TYPE_INTEGER,
586 MB_TAG_CREAT | MB_TAG_MESH, &def_shift);
589 CHKERR get_moab().tag_get_by_ptr(th_ProblemShift, &root_meshset, 1,
591 pShift = (
int *)tag_data[0];
594 rval = get_moab().tag_get_handle(
"_MoFEMBuild", 1, MB_TYPE_INTEGER,
595 th_MoFEMBuild, MB_TAG_CREAT | MB_TAG_MESH,
599 CHKERR get_moab().tag_get_by_ptr(th_MoFEMBuild, &root_meshset, 1,
600 (
const void **)&buildMoFEM);
605 const int def_part = -1;
606 CHKERR get_moab().tag_get_handle(
"PARTITION", 1, MB_TYPE_INTEGER, th_Part,
607 MB_TAG_CREAT | MB_TAG_SPARSE, &def_part);
612 const int def_part = -1;
613 CHKERR get_moab().tag_get_handle(
"_MeshsetPartition", 1, MB_TYPE_INTEGER,
614 th_Part, MB_TAG_CREAT | MB_TAG_SPARSE,
617 CHKERR get_moab().tag_get_handle(
"_RefParentHandle", 1, MB_TYPE_HANDLE,
619 MB_TAG_CREAT | MB_TAG_SPARSE, &def_handle);
621 CHKERR get_moab().tag_get_handle(
622 "_RefBitLevel",
sizeof(
BitRefLevel), MB_TYPE_OPAQUE, th_RefBitLevel,
623 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_bit_level);
625 CHKERR get_moab().tag_get_handle(
626 "_RefBitLevelMask",
sizeof(
BitRefLevel), MB_TYPE_OPAQUE,
627 th_RefBitLevel_Mask, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
628 &def_bit_level_mask);
630 CHKERR get_moab().tag_get_handle(
631 "_RefBitEdge",
sizeof(
BitRefEdges), MB_TYPE_OPAQUE, th_RefBitEdge,
632 MB_TAG_CREAT | MB_TAG_SPARSE | MB_TAG_BYTES, &def_bit_edge);
633 const int def_type[] = {0, 0};
634 CHKERR get_moab().tag_get_handle(
"_RefType", 2, MB_TYPE_INTEGER, th_RefType,
635 MB_TAG_CREAT | MB_TAG_SPARSE, def_type);
640 const unsigned long int def_id = 0;
641 CHKERR get_moab().tag_get_handle(
642 "_FieldId",
sizeof(
BitFieldId), MB_TYPE_OPAQUE, th_FieldId,
643 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
645 CHKERR get_moab().tag_get_handle(
646 "_FieldSpace",
sizeof(
FieldSpace), MB_TYPE_OPAQUE, th_FieldSpace,
647 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_space);
649 CHKERR get_moab().tag_get_handle(
651 th_FieldBase, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_base);
652 const int def_val_len = 0;
653 CHKERR get_moab().tag_get_handle(
654 "_FieldName", def_val_len, MB_TYPE_OPAQUE, th_FieldName,
655 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_VARLEN | MB_TAG_SPARSE, NULL);
656 CHKERR get_moab().tag_get_handle(
657 "_FieldName_DataNamePrefix", def_val_len, MB_TYPE_OPAQUE,
658 th_FieldName_DataNamePrefix,
659 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_VARLEN | MB_TAG_SPARSE, NULL);
664 const unsigned long int def_id = 0;
665 const int def_val_len = 0;
666 CHKERR get_moab().tag_get_handle(
667 "_FEId",
sizeof(
BitFEId), MB_TYPE_OPAQUE, th_FEId,
668 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
669 CHKERR get_moab().tag_get_handle(
670 "_FEName", def_val_len, MB_TYPE_OPAQUE, th_FEName,
671 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_VARLEN | MB_TAG_SPARSE, NULL);
672 CHKERR get_moab().tag_get_handle(
673 "_FEIdCol",
sizeof(
BitFieldId), MB_TYPE_OPAQUE, th_FEIdCol,
674 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
675 CHKERR get_moab().tag_get_handle(
676 "_FEIdRow",
sizeof(
BitFieldId), MB_TYPE_OPAQUE, th_FEIdRow,
677 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
678 CHKERR get_moab().tag_get_handle(
679 "_FEIdData",
sizeof(
BitFieldId), MB_TYPE_OPAQUE, th_FEIdData,
680 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
685 const unsigned long int def_id = 0;
686 const int def_val_len = 0;
687 CHKERR get_moab().tag_get_handle(
688 "_ProblemId",
sizeof(
BitProblemId), MB_TYPE_OPAQUE, th_ProblemId,
689 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
690 CHKERR get_moab().tag_get_handle(
691 "_ProblemFEId",
sizeof(
BitFEId), MB_TYPE_OPAQUE, th_ProblemFEId,
692 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
693 CHKERR get_moab().tag_get_handle(
694 "_ProblemName", def_val_len, MB_TYPE_OPAQUE, th_ProblemName,
695 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_VARLEN | MB_TAG_SPARSE, NULL);
697 CHKERR get_moab().tag_get_handle(
698 "_ProblemNbDofsRow",
sizeof(
DofIdx), MB_TYPE_OPAQUE,
699 th_ProblemNbDofsRow, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
701 CHKERR get_moab().tag_get_handle(
702 "_ProblemNbDofsCol",
sizeof(
DofIdx), MB_TYPE_OPAQUE,
703 th_ProblemNbDofsCol, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
705 CHKERR get_moab().tag_get_handle(
706 "_ProblemLocalNbDofsRow",
sizeof(
DofIdx), MB_TYPE_OPAQUE,
707 th_ProblemLocalNbDofRow, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
709 CHKERR get_moab().tag_get_handle(
710 "_ProblemGhostNbDofsRow",
sizeof(
DofIdx), MB_TYPE_OPAQUE,
711 th_ProblemGhostNbDofRow, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
713 CHKERR get_moab().tag_get_handle(
714 "_ProblemLocalNbDofsCol",
sizeof(
DofIdx), MB_TYPE_OPAQUE,
715 th_ProblemLocalNbDofCol, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
717 CHKERR get_moab().tag_get_handle(
718 "_ProblemGhostNbDofsCol",
sizeof(
DofIdx), MB_TYPE_OPAQUE,
719 th_ProblemGhostNbDofCol, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
725 CHKERR getInterface(meshsets_manager_ptr);
730 CHKERR getInterface(series_recorder_ptr);
735 CHKERR getInterface(cs_manger_ptr);
754 CHKERR this->getTags(verb);
755 CHKERR this->initialiseDatabaseFromMesh(verb);
760 return this->setMoabInterface(new_moab, verb);
765 return this->setMoabInterface(new_moab, verb);
773 CHKERR PetscOptionsBegin(cOmm, optionsPrefix.c_str(),
"Mesh cut options",
774 "See MoFEM documentation");
777 "-mofem_init_fields",
"Initialise fields on construction",
"",
778 initaliseAndBuildField, &initaliseAndBuildField, NULL);
781 "-mofem_init_fields",
"Initialise fields on construction",
"",
782 initaliseAndBuildFiniteElements, &initaliseAndBuildFiniteElements, NULL);
787 ierr = PetscOptionsEnd();
797 *fields_ptr = &fIelds;
804 *refined_entities_ptr = &refinedEntities;
810 *refined_finite_elements_ptr = &refinedFiniteElements;
815 const Problem **problem_ptr)
const {
819 ProblemsByName::iterator p_miit = problems.find(problem_name);
820 if (p_miit == problems.end()) {
822 "problem < %s > not found, (top tip: check spelling)",
823 problem_name.c_str());
825 *problem_ptr = &*p_miit;
832 *problems_ptr = &pRoblems;
839 *field_ents = &entsFields;
844 *dofs_ptr = &dofsField;
851 *fe_ptr = &finiteElements;
858 *fe_ent_ptr = &entsFiniteElements;
864 getInterface(meshsets_manager_ptr);
865 return meshsets_manager_ptr;
870 getInterface(meshsets_manager_ptr);
871 return meshsets_manager_ptr;
876 *dofs_elements_adjacency)
const {
878 *dofs_elements_adjacency = &entFEAdjacencies;
884 return &entFEAdjacencies;
889 return &refinedEntities;
892 return &refinedFiniteElements;
895 return &finiteElements;
898 return &entsFiniteElements;
906 CHKERR get_problem(problem_name, &prb);
911 template <
int V,
typename std::enable_if<(V >= 0),
int>
::type * =
nullptr>
916 template <
int V,
typename std::enable_if<(V < 0),
int>::type * =
nullptr>
917 void set_ref_ent_basic_data_ptr_impl(boost::shared_ptr<BasicEntityData> &ptr) {
921 void Core::setRefEntBasicDataPtr(MoFEM::Interface &m_field,
922 boost::shared_ptr<BasicEntityData> &ptr) {
924 switch (m_field.getValue()) {
926 set_ref_ent_basic_data_ptr_impl<-1>(ptr);
929 set_ref_ent_basic_data_ptr_impl<0>(ptr);
932 set_ref_ent_basic_data_ptr_impl<1>(ptr);
935 THROW_MESSAGE("Core index can vary from -1 to MAX_CORE_TMP");
940 boost::shared_ptr<RefEntityTmp<0>>
941 Core::makeSharedRefEntity(MoFEM::Interface &m_field, const EntityHandle ent) {
943 boost::shared_ptr<RefEntityTmp<0>> ref_ent_ptr;
945 switch (m_field.getValue()) {
947 ref_ent_ptr = boost::shared_ptr<RefEntityTmp<0>>(
949 new RefEntityTmp<-1>(m_field.get_basic_entity_data_ptr(), ent)
954 ref_ent_ptr = boost::shared_ptr<RefEntityTmp<0>>(
956 new RefEntityTmp<0>(m_field.get_basic_entity_data_ptr(), ent)
961 ref_ent_ptr = boost::shared_ptr<RefEntityTmp<0>>(
963 new RefEntityTmp<1>(m_field.get_basic_entity_data_ptr(), ent)
968 THROW_MESSAGE("Core index can vary from -1 to MAX_CORE_TMP");
974 boost::shared_ptr<RefEntityTmp<0>>
975 Core::make_shared_ref_entity(const EntityHandle ent) {
976 return this->makeSharedRefEntity(*
this, ent);
979 boost::shared_ptr<RefEntityTmp<0>>
981 return this->makeSharedRefEntity(*
this, ent);