17 : comm(comm), isPetscComm(petsc) {
41constexpr const int CoreTmp<-1>::value;
47 if (type_index == boost::typeindex::type_id<CoreInterface>()) {
50 }
else if (type_index ==
51 boost::typeindex::type_id<DeprecatedCoreInterface>()) {
57 auto it = iFaces.find(type_index);
58 if (it != iFaces.end()) {
75 MPI_Initialized(&mpiInitialised);
79 PetscInitialized(&isInitialized);
80 if (isInitialized == PETSC_FALSE) {
81 for (
int i = 0;
i < *argc - 1; ++
i) {
82 if (std::strcmp((*args)[
i],
"-param_file") == 0) {
83 file = (*args)[
i + 1];
87 PetscInitialize(argc, args, file,
help);
94 isGloballyInitialised =
true;
97 char petsc_version[255];
98 CHKERR PetscGetVersion(petsc_version, 255);
99 MOFEM_LOG_C(
"WORLD", Sev::inform,
"MoFEM version %d.%d.%d (%s %s)",
100 MoFEM_VERSION_MAJOR, MoFEM_VERSION_MINOR, MoFEM_VERSION_BUILD,
101 MOAB_VERSION_STRING, petsc_version);
102 MOFEM_LOG_C(
"WORLD", Sev::inform,
"git commit id %s", GIT_SHA1_NAME);
104 auto log_time = [&](
const auto perefix,
auto time) {
106 << perefix << time.date().year() <<
"-" << time.date().month() <<
"-"
107 << time.date().day() <<
" " << time.time_of_day().hours() <<
":"
108 << time.time_of_day().minutes() <<
":" << time.time_of_day().seconds();
112 log_time(
"Local time: ", boost::posix_time::second_clock::local_time());
113 log_time(
"UTC time: ", boost::posix_time::second_clock::universal_time());
119 if (isGloballyInitialised) {
120 PetscPopErrorHandler();
121 isGloballyInitialised =
false;
123 if (isInitialized == PETSC_FALSE) {
124 PetscBool is_finalized;
125 PetscFinalized(&is_finalized);
130 if (!mpiInitialised) {
132 MPI_Finalized(&mpi_finalized);
145 ->
decltype(ptr->getSubInterfaceOptions()) {
146 return ptr->getSubInterfaceOptions();
158 ->
decltype(ptr->getEventOptions()) {
159 return ptr->getEventptions();
174 CHKERR registerInterface<IFACE>(
true);
175 IFACE *ptr =
new IFACE(*
this);
180 auto get_sub_iface_options = [](
auto *
const ptr) {
183 CHKERR get_sub_iface_options(ptr);
185 auto type_idx = boost::typeindex::type_id<IFACE>();
186 iFaces.insert(type_idx, ptr);
192 auto ptr = boost::make_shared<IFACE>();
196 auto get_event_options = [](
auto *
const ptr) {
199 CHKERR get_event_options(ptr.get());
204 MPI_Comm comm,
const int verbose) {
208 if (!isGloballyInitialised)
210 "MoFEM globally is not initialised, call MoFEM::Core::Initialize");
213 wrapMPIMOABComm = boost::make_shared<WrapMPIComm>(comm,
false);
215 MPI_Comm_size(mofemComm, &sIze);
216 MPI_Comm_rank(mofemComm, &rAnk);
219 ParallelComm *pComm = ParallelComm::get_pcomm(&moab,
MYPCOMM_INDEX);
221 pComm =
new ParallelComm(&moab, wrapMPIMOABComm->get_comm());
224 CHKERR registerInterface<UnknownInterface>();
225 CHKERR registerInterface<CoreInterface>();
226 CHKERR registerInterface<DeprecatedCoreInterface>();
229 PetscLogEventRegister(
"FE_preProcess", 0, &MOFEM_EVENT_preProcess);
230 PetscLogEventRegister(
"FE_operator", 0, &MOFEM_EVENT_operator);
231 PetscLogEventRegister(
"FE_postProcess", 0, &MOFEM_EVENT_postProcess);
232 PetscLogEventRegister(
"MoFEMCreateMat", 0, &MOFEM_EVENT_createMat);
249 ierr = this->registerSubInterfaces();
250 CHKERRABORT(comm,
ierr);
251 ierr = this->clearMap();
252 CHKERRABORT(comm,
ierr);
253 ierr = this->getTags();
254 CHKERRABORT(comm,
ierr);
255 ierr = this->getOptions(verbose);
256 CHKERRABORT(comm,
ierr);
258 this->basicEntityDataPtr = boost::make_shared<BasicEntityData>(moab);
259 setRefEntBasicDataPtr(*
this, this->basicEntityDataPtr);
261 ierr = this->initialiseDatabaseFromMesh(verbose);
262 CHKERRABORT(comm,
ierr);
273 ierr = this->registerSubInterfaces();
274 CHKERRABORT(comm,
ierr);
275 ierr = this->clearMap();
276 CHKERRABORT(comm,
ierr);
277 ierr = this->getTags();
278 CHKERRABORT(comm,
ierr);
279 ierr = this->getOptions(verbose);
280 CHKERRABORT(comm,
ierr);
282 this->basicEntityDataPtr = boost::make_shared<BasicEntityData>(moab);
283 setRefEntBasicDataPtr(*
this, this->basicEntityDataPtr);
285 ierr = this->initialiseDatabaseFromMesh(verbose);
286 CHKERRABORT(comm,
ierr);
290 PetscBool is_finalized = PETSC_FALSE;
291 PetscFinalized(&is_finalized);
292 if (!is_finalized && !iFaces.empty())
297 if (isGloballyInitialised && is_finalized) {
298 isGloballyInitialised =
false;
303 BOOST_LOG_SCOPED_THREAD_ATTR(
"Timeline", attrs::timer());
310 Range ref_elems_to_add;
312 MOFEM_LOG(
"WORLD", Sev::verbose) <<
"Get MoFEM meshsets";
315 CHKERR get_moab().get_entities_by_type(0, MBENTITYSET, meshsets,
false);
316 Range special_meshsets;
317 for (
auto mit : meshsets) {
320 CHKERR get_moab().tag_get_data(th_FieldId, &mit, 1, &field_id);
324 const void *tag_name;
326 CHKERR get_moab().tag_get_by_ptr(
327 th_FieldName, &mit, 1, (
const void **)&tag_name, &tag_name_size);
332 << boost::string_ref((
char *)tag_name, tag_name_size);
334 auto p = fIelds.insert(boost::make_shared<Field>(moab, mit));
340 CHKERR get_moab().get_entities_by_handle(mit, ents,
true);
341 CHKERR get_moab().add_entities((*p.first)->getMeshset(), ents);
342 CHKERR get_moab().delete_entities(&mit, 1);
344 special_meshsets.insert(mit);
350 CHKERR get_moab().tag_get_data(th_FEId, &mit, 1, &fe_id);
353 std::pair<FiniteElement_multiIndex::iterator, bool> p =
354 finiteElements.insert(
355 boost::shared_ptr<FiniteElement>(
new FiniteElement(moab, mit)));
357 MOFEM_LOG(
"WORLD", Sev::verbose) <<
"Read finite element " << **p.first;
360 CHKERR get_moab().get_entities_by_type(mit, MBENTITYSET, ents,
false);
361 CHKERR get_moab().get_entities_by_handle(mit, ents,
true);
362 ref_elems_to_add.merge(ents);
366 CHKERR get_moab().add_entities((*p.first)->getMeshset(), ents);
367 CHKERR get_moab().delete_entities(&mit, 1);
369 special_meshsets.insert(mit);
374 CHKERR get_moab().tag_get_data(th_ProblemId, &mit, 1, &problem_id);
376 if (problem_id != 0) {
377 std::pair<Problem_multiIndex::iterator, bool> p =
378 pRoblems.insert(
Problem(moab, mit));
380 MOFEM_LOG(
"WORLD", Sev::verbose) <<
"Read problem " << *p.first;
382 <<
"\tBitRef " << p.first->getBitRefLevel() <<
" BitMask "
383 << p.first->getBitRefLevelMask();
390 CHKERR get_moab().get_entities_by_handle(mit, ents,
true);
391 CHKERR get_moab().get_entities_by_type(mit, MBENTITYSET, ents,
true);
392 CHKERR get_moab().add_entities(p.first->meshset, ents);
393 CHKERR get_moab().delete_entities(&mit, 1);
395 special_meshsets.insert(mit);
399 MOFEM_LOG(
"WORLD", Sev::verbose) <<
"Get MoFEM meshsets <- done";
402 MOFEM_LOG(
"WORLD", Sev::verbose) <<
"Add entities to database";
404 CHKERR get_moab().get_entities_by_handle(0, bit_ref_ents,
false);
405 bit_ref_ents = subtract(bit_ref_ents, special_meshsets);
406 CHKERR getInterface<BitRefManager>()->filterEntitiesByRefLevel(
408 CHKERR getInterface<BitRefManager>()->setEntitiesBitRefLevel(bit_ref_ents);
409 CHKERR getInterface<BitRefManager>()->setElementsBitRefLevel(
411 MOFEM_LOG(
"WORLD", Sev::verbose) <<
"Add entities to database <- done";
414 MOFEM_LOG(
"WORLD", Sev::verbose) <<
"Add field to database";
415 for (
auto field : fIelds) {
416 if (field->getSpace() !=
NOSPACE) {
417 Range ents_of_id_meshset;
418 CHKERR get_moab().get_entities_by_handle(field->getMeshset(),
419 ents_of_id_meshset,
false);
420 CHKERR set_field_order(ents_of_id_meshset, field->getId(), -1, verb);
423 MOFEM_LOG(
"WORLD", Sev::verbose) <<
"Add field to database <- done";
425 if (initaliseAndBuildField || initaliseAndBuildFiniteElements) {
426 MOFEM_LOG(
"WORLD", Sev::verbose) <<
"Build fields elements";
427 CHKERR build_fields(verb);
428 MOFEM_LOG(
"WORLD", Sev::verbose) <<
"Build fields elements <- done";
429 if (initaliseAndBuildFiniteElements) {
430 MOFEM_LOG(
"WORLD", Sev::verbose) <<
"Build finite elements";
431 CHKERR build_finite_elements(verb);
432 MOFEM_LOG(
"WORLD", Sev::verbose) <<
"Build finite elements <- done";
438 list_finite_elements();
443 MOFEM_LOG(
"WORLD", Sev::verbose) <<
"Initialise interfaces from mesh";
445 MOFEM_LOG(
"WORLD", Sev::verbose) <<
"Initialise MeshsetManager";
446 CHKERR getInterface<MeshsetsManager>() -> initialiseDatabaseFromMesh(verb);
447 MOFEM_LOG(
"WORLD", Sev::verbose) <<
"Initialise MeshsetManager <- done";
448 MOFEM_LOG(
"WORLD", Sev::verbose) <<
"Initialise SeriesRecorder";
449 CHKERR getInterface<SeriesRecorder>() -> initialiseDatabaseFromMesh(verb);
450 MOFEM_LOG(
"WORLD", Sev::verbose) <<
"Initialise SeriesRecorder <- done";
452 MOFEM_LOG(
"WORLD", Sev::verbose) <<
"Initialise interfaces from mesh <- done";
466 moab = std::ref(new_moab);
469 ParallelComm *pComm = ParallelComm::get_pcomm(&new_moab,
MYPCOMM_INDEX);
471 pComm =
new ParallelComm(&new_moab, wrapMPIMOABComm->get_comm());
478 basicEntityDataPtr = boost::make_shared<BasicEntityData>(moab);
479 setRefEntBasicDataPtr(*
this, this->basicEntityDataPtr);
482 CHKERR this->initialiseDatabaseFromMesh(verb);
493 CHKERR regSubInterface<LogManager>();
494 CHKERR regSubInterface<Simple>();
495 CHKERR regSubInterface<OperatorsTester>();
496 CHKERR regSubInterface<PipelineManager>();
497 CHKERR regSubInterface<PipelineGraph>();
498 CHKERR regSubInterface<ProblemsManager>();
499 CHKERR regSubInterface<MatrixManager>();
500 CHKERR regSubInterface<ISManager>();
501 CHKERR regSubInterface<VecManager>();
502 CHKERR regSubInterface<FieldBlas>();
503 CHKERR regSubInterface<BitRefManager>();
504 CHKERR regSubInterface<Tools>();
505 CHKERR regSubInterface<CommInterface>();
506 CHKERR regSubInterface<MeshsetsManager>();
507 CHKERR regSubInterface<NodeMergerInterface>();
508 CHKERR regSubInterface<PrismsFromSurfaceInterface>();
509 CHKERR regSubInterface<MeshRefinement>();
510 CHKERR regSubInterface<PrismInterface>();
511 CHKERR regSubInterface<CutMeshInterface>();
512 CHKERR regSubInterface<SeriesRecorder>();
514 CHKERR regSubInterface<TetGenInterface>();
517 CHKERR regSubInterface<MedInterface>();
519 CHKERR regSubInterface<FieldEvaluatorInterface>();
520 CHKERR regSubInterface<BcManager>();
523 CHKERR regEvents<SchurEvents>();
531 CHKERR getInterface<SeriesRecorder>()->clearMap();
532 CHKERR getInterface<MeshsetsManager>()->clearMap();
533 CHKERR getInterface<CutMeshInterface>()->clearMap();
535 refinedEntities.clear();
536 refinedFiniteElements.clear();
540 finiteElements.clear();
541 entsFiniteElements.clear();
542 entFEAdjacencies.clear();
551 std::pair<RefEntity_multiIndex::iterator, bool> p_ent;
552 p_ent = refinedEntities.insert(
553 boost::make_shared<RefEntity>(basicEntityDataPtr, prism));
555 std::pair<RefElement_multiIndex::iterator, bool> p;
556 p = refinedFiniteElements.insert(
560 CHKERR get_moab().get_connectivity(prism, conn, num_nodes,
true);
561 Range face_side3, face_side4;
562 CHKERR get_moab().get_adjacencies(conn, 3, 2,
false, face_side3);
563 CHKERR get_moab().get_adjacencies(&conn[3], 3, 2,
false, face_side4);
564 if (face_side3.size() != 1)
566 "prism don't have side face 3");
567 if (face_side4.size() != 1)
569 "prims don't have side face 4");
570 p.first->get()->getSideNumberPtr(*face_side3.begin());
571 p.first->get()->getSideNumberPtr(*face_side4.begin());
579 const EntityHandle root_meshset = get_moab().get_root_set();
582 "Root meshset should be 0");
588 CHKERR getFileVersion(moab, version);
594 auto check_tag_allocated = [](
auto &
rval) {
596 if (
rval == MB_ALREADY_ALLOCATED)
605 rval = get_moab().tag_get_handle(
"_MoFEMBuild", 1, MB_TYPE_INTEGER,
606 th_MoFEMBuild, MB_TAG_CREAT | MB_TAG_MESH,
610 CHKERR get_moab().tag_get_by_ptr(th_MoFEMBuild, &root_meshset, 1,
611 (
const void **)&buildMoFEM);
616 const int def_part = -1;
617 CHKERR get_moab().tag_get_handle(
"PARTITION", 1, MB_TYPE_INTEGER, th_Part,
618 MB_TAG_CREAT | MB_TAG_SPARSE, &def_part);
627 const int def_part = -1;
628 CHKERR get_moab().tag_get_handle(
"_MeshsetPartition", 1, MB_TYPE_INTEGER,
629 th_Part, MB_TAG_CREAT | MB_TAG_SPARSE,
632 CHKERR get_moab().tag_get_handle(
"_RefParentHandle", 1, MB_TYPE_HANDLE,
634 MB_TAG_CREAT | MB_TAG_SPARSE, &def_handle);
636 CHKERR get_moab().tag_get_handle(
637 "_RefBitLevel",
sizeof(
BitRefLevel), MB_TYPE_OPAQUE, th_RefBitLevel,
638 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_bit_level);
640 CHKERR get_moab().tag_get_handle(
641 "_RefBitLevelMask",
sizeof(
BitRefLevel), MB_TYPE_OPAQUE,
642 th_RefBitLevel_Mask, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
643 &def_bit_level_mask);
645 CHKERR get_moab().tag_get_handle(
646 "_RefBitEdge",
sizeof(
BitRefEdges), MB_TYPE_OPAQUE, th_RefBitEdge,
647 MB_TAG_CREAT | MB_TAG_SPARSE | MB_TAG_BYTES, &def_bit_edge);
652 const unsigned long int def_id = 0;
653 CHKERR get_moab().tag_get_handle(
654 "_FieldId",
sizeof(
BitFieldId), MB_TYPE_OPAQUE, th_FieldId,
655 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
657 CHKERR get_moab().tag_get_handle(
658 "_FieldSpace",
sizeof(
FieldSpace), MB_TYPE_OPAQUE, th_FieldSpace,
659 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_space);
661 CHKERR get_moab().tag_get_handle(
663 th_FieldContinuity, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
666 CHKERR get_moab().tag_get_handle(
668 th_FieldBase, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_base);
669 const int def_val_len = 0;
670 CHKERR get_moab().tag_get_handle(
671 "_FieldName", def_val_len, MB_TYPE_OPAQUE, th_FieldName,
672 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_VARLEN | MB_TAG_SPARSE, NULL);
673 CHKERR get_moab().tag_get_handle(
674 "_FieldName_DataNamePrefix", def_val_len, MB_TYPE_OPAQUE,
675 th_FieldName_DataNamePrefix,
676 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_VARLEN | MB_TAG_SPARSE, NULL);
681 const unsigned long int def_id = 0;
682 const int def_val_len = 0;
683 CHKERR get_moab().tag_get_handle(
684 "_FEId",
sizeof(
BitFEId), MB_TYPE_OPAQUE, th_FEId,
685 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
686 CHKERR get_moab().tag_get_handle(
687 "_FEName", def_val_len, MB_TYPE_OPAQUE, th_FEName,
688 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_VARLEN | MB_TAG_SPARSE, NULL);
689 CHKERR get_moab().tag_get_handle(
690 "_FEIdCol",
sizeof(
BitFieldId), MB_TYPE_OPAQUE, th_FEIdCol,
691 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
692 CHKERR get_moab().tag_get_handle(
693 "_FEIdRow",
sizeof(
BitFieldId), MB_TYPE_OPAQUE, th_FEIdRow,
694 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
695 CHKERR get_moab().tag_get_handle(
696 "_FEIdData",
sizeof(
BitFieldId), MB_TYPE_OPAQUE, th_FEIdData,
697 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
702 const unsigned long int def_id = 0;
703 const int def_val_len = 0;
704 CHKERR get_moab().tag_get_handle(
705 "_ProblemId",
sizeof(
BitProblemId), MB_TYPE_OPAQUE, th_ProblemId,
706 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
707 CHKERR get_moab().tag_get_handle(
708 "_ProblemFEId",
sizeof(
BitFEId), MB_TYPE_OPAQUE, th_ProblemFEId,
709 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
710 CHKERR get_moab().tag_get_handle(
711 "_ProblemName", def_val_len, MB_TYPE_OPAQUE, th_ProblemName,
712 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_VARLEN | MB_TAG_SPARSE, NULL);
714 CHKERR get_moab().tag_get_handle(
715 "_ProblemNbDofsRow",
sizeof(
DofIdx), MB_TYPE_OPAQUE,
716 th_ProblemNbDofsRow, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
718 CHKERR get_moab().tag_get_handle(
719 "_ProblemNbDofsCol",
sizeof(
DofIdx), MB_TYPE_OPAQUE,
720 th_ProblemNbDofsCol, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
722 CHKERR get_moab().tag_get_handle(
723 "_ProblemLocalNbDofsRow",
sizeof(
DofIdx), MB_TYPE_OPAQUE,
724 th_ProblemLocalNbDofRow, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
726 CHKERR get_moab().tag_get_handle(
727 "_ProblemGhostNbDofsRow",
sizeof(
DofIdx), MB_TYPE_OPAQUE,
728 th_ProblemGhostNbDofRow, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
730 CHKERR get_moab().tag_get_handle(
731 "_ProblemLocalNbDofsCol",
sizeof(
DofIdx), MB_TYPE_OPAQUE,
732 th_ProblemLocalNbDofCol, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
734 CHKERR get_moab().tag_get_handle(
735 "_ProblemGhostNbDofsCol",
sizeof(
DofIdx), MB_TYPE_OPAQUE,
736 th_ProblemGhostNbDofCol, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
742 CHKERR getInterface(meshsets_manager_ptr);
747 CHKERR getInterface(series_recorder_ptr);
766 CHKERR this->getTags(verb);
767 CHKERR this->initialiseDatabaseFromMesh(verb);
772 return this->setMoabInterface(new_moab, verb);
777 return this->setMoabInterface(new_moab, verb);
785 PetscOptionsBegin(mofemComm, optionsPrefix.c_str(),
"Mesh cut options",
786 "See MoFEM documentation");
789 "-mofem_init_fields",
"Initialise fields on construction",
"",
790 initaliseAndBuildField, &initaliseAndBuildField, NULL);
793 "-mofem_init_fields",
"Initialise fields on construction",
"",
794 initaliseAndBuildFiniteElements, &initaliseAndBuildFiniteElements, NULL);
808 *fields_ptr = &fIelds;
815 *refined_entities_ptr = &refinedEntities;
821 *refined_finite_elements_ptr = &refinedFiniteElements;
826 const Problem **problem_ptr)
const {
828 typedef Problem_multiIndex::index<Problem_mi_tag>::type ProblemsByName;
830 ProblemsByName::iterator p_miit = problems.find(problem_name);
831 if (p_miit == problems.end()) {
833 "problem < %s > not found, (top tip: check spelling)",
834 problem_name.c_str());
836 *problem_ptr = &*p_miit;
843 *problems_ptr = &pRoblems;
850 *field_ents = &entsFields;
855 *dofs_ptr = &dofsField;
862 *fe_ptr = &finiteElements;
869 *fe_ent_ptr = &entsFiniteElements;
875 getInterface(meshsets_manager_ptr);
876 return meshsets_manager_ptr;
881 getInterface(meshsets_manager_ptr);
882 return meshsets_manager_ptr;
887 *dofs_elements_adjacency)
const {
889 *dofs_elements_adjacency = &entFEAdjacencies;
895 return &entFEAdjacencies;
900 return &refinedEntities;
903 return &refinedFiniteElements;
906 return &finiteElements;
909 return &entsFiniteElements;
918 "Problem of given name not found");
923template <
int V,
typename std::enable_if<(V >= 0),
int>::type * =
nullptr>
928template <
int V,
typename std::enable_if<(V < 0),
int>::type * =
nullptr>
929void set_ref_ent_basic_data_ptr_impl(boost::shared_ptr<BasicEntityData> &ptr) {
933void Core::setRefEntBasicDataPtr(MoFEM::Interface &m_field,
934 boost::shared_ptr<BasicEntityData> &ptr) {
936 switch (m_field.getValue()) {
938 set_ref_ent_basic_data_ptr_impl<-1>(ptr);
941 set_ref_ent_basic_data_ptr_impl<0>(ptr);
944 set_ref_ent_basic_data_ptr_impl<1>(ptr);
947 THROW_MESSAGE("Core index can vary from -1 to MAX_CORE_TMP");
951boost::shared_ptr<RefEntityTmp<0>>
952Core::makeSharedRefEntity(MoFEM::Interface &m_field, const EntityHandle ent) {
954 boost::shared_ptr<RefEntityTmp<0>> ref_ent_ptr;
956 switch (m_field.getValue()) {
958 ref_ent_ptr = boost::shared_ptr<RefEntityTmp<0>>(
960 new RefEntityTmp<-1>(m_field.get_basic_entity_data_ptr(), ent)
965 ref_ent_ptr = boost::shared_ptr<RefEntityTmp<0>>(
967 new RefEntityTmp<0>(m_field.get_basic_entity_data_ptr(), ent)
972 ref_ent_ptr = boost::shared_ptr<RefEntityTmp<0>>(
974 new RefEntityTmp<1>(m_field.get_basic_entity_data_ptr(), ent)
979 THROW_MESSAGE("Core index can vary from -1 to MAX_CORE_TMP");
985boost::shared_ptr<RefEntityTmp<0>>
986Core::make_shared_ref_entity(const EntityHandle ent) {
987 return this->makeSharedRefEntity(*
this, ent);
990boost::shared_ptr<RefEntityTmp<0>>
992 return this->makeSharedRefEntity(*
this, ent);
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.
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.
#define MOFEM_LOG_C(channel, severity, format,...)
FieldApproximationBase
approximation base
#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
@ LASTSPACE
FieldSpace in [ 0, LASTSPACE )
#define MYPCOMM_INDEX
default communicator number PCOMM
FieldContinuity
Field continuity.
#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
@ MOFEM_DATA_INCONSISTENCY
#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.
std::bitset< BITPROBLEMID_SIZE > BitProblemId
Problem Id.
std::bitset< BITFIELDID_SIZE > BitFieldId
Field Id.
std::bitset< BITREFEDGES_SIZE > BitRefEdges
std::bitset< BITREFLEVEL_SIZE > BitRefLevel
Bit structure attached to each entity identifying to what mesh entity is attached.
implementation of Data Operators for Forces and Sources
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())
void set_ref_ent_basic_data_ptr_impl(boost::shared_ptr< BasicEntityData > &ptr)
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())
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.
MoFEMErrorCode clearMap()
Cleaning database.
MoFEMErrorCode query_interface(boost::typeindex::type_index type_index, UnknownInterface **iface) const
Getting interface of core database.
static MoFEMErrorCode Initialize(int *argc, char ***args, const char file[], const char help[])
Initializes the MoFEM database PETSc, MOAB and MPI.
MoFEMErrorCode regSubInterface()
Register sub-interfaces in core interface.
static bool isGloballyInitialised
Core base globally initialized.
const RefElement_multiIndex * get_ref_finite_elements() const
Get the ref finite elements object.
const FieldEntity_multiIndex * get_field_ents() const
Get the field ents object.
MoFEMErrorCode initialiseDatabaseFromMesh(int verb=DEFAULT_VERBOSITY)
Initialize database getting information on mesh.
MoFEMErrorCode registerSubInterfaces()
Register insterfaces.
const Field_multiIndex * get_fields() const
Get the fields object.
const Problem_multiIndex * get_problems() const
Get the problems object.
MoFEMErrorCode coreGenericConstructor(moab::Interface &moab, MPI_Comm comm, const int verbose)
const DofEntity_multiIndex * get_dofs() const
Get the dofs object.
MoFEMErrorCode getOptions(int verb=DEFAULT_VERBOSITY)
Get core options from command line.
static PetscBool isInitialized
petsc was initialised by other agent
const RefEntity_multiIndex * get_ref_ents() const
Get the ref ents object.
const FieldEntityEntFiniteElementAdjacencyMap_multiIndex * get_ents_elements_adjacency() const
Get the dofs elements adjacency object.
const EntFiniteElement_multiIndex * get_ents_finite_elements() const
Get the ents finite elements object.
const FiniteElement_multiIndex * get_finite_elements() const
Get the finite elements object.
MoFEMErrorCode addPrismToDatabase(const EntityHandle prism, int verb=DEFAULT_VERBOSITY)
add prim element
MoFEMErrorCode regEvents()
Register petsc events.
static MoFEMErrorCode Finalize()
Checks for options to be called at the conclusion of the program.
MoFEMErrorCode set_moab_interface(moab::Interface &new_moab, int verb=VERBOSE)
Set the moab interface object.
MoFEMErrorCode setMoabInterface(moab::Interface &new_moab, int verb=VERBOSE)
MoFEMErrorCode get_problem(const std::string &problem_name, const Problem **problem_ptr) const
Get problem database (data structure)
MoFEMErrorCode getTags(int verb=DEFAULT_VERBOSITY)
Get tag handles.
CoreTmp(moab::Interface &moab, MPI_Comm comm=PETSC_COMM_WORLD, const int verbose=VERBOSE)
static int mpiInitialised
mpi was initialised by other agent
MeshsetsManager * get_meshsets_manager_ptr()
get MeshsetsManager pointer
MoFEMErrorCode rebuild_database(int verb=DEFAULT_VERBOSITY)
Clear database and initialize it once again.
MoFEMErrorCode clear_database(int verb=DEFAULT_VERBOSITY)
Clear database.
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
WrapMPIComm(MPI_Comm comm, bool petsc)