v0.15.0
Loading...
Searching...
No Matches
MoFEM::CoreTmp< 0 > Struct Reference

Core (interface) class. More...

#include "src/interfaces/Core.hpp"

Inheritance diagram for MoFEM::CoreTmp< 0 >:
[legend]
Collaboration diagram for MoFEM::CoreTmp< 0 >:
[legend]

Public Member Functions

const int getValue () const
 Get the core.
 
RefEntityTmp< 0 > getRefEntity (const EntityHandle ent)
 
virtual boost::shared_ptr< RefEntityTmp< 0 > > make_shared_ref_entity (const EntityHandle ent)
 Get RefEntity.
 
 CoreTmp (moab::Interface &moab, MPI_Comm comm=PETSC_COMM_WORLD, const int verbose=VERBOSE)
 
 ~CoreTmp ()
 
- Public Member Functions inherited from MoFEM::DeprecatedCoreInterface
virtual DEPRECATED MoFEMErrorCode seed_ref_level_2D (const EntityHandle meshset, const BitRefLevel &bit, int verb=-1)
 seed 2D entities (Triangles entities only) in the meshset and their adjacencies (only TRIs adjacencies) in a particular BitRefLevel
 
DEPRECATED MoFEMErrorCode seed_ref_level_3D (const EntityHandle meshset, const BitRefLevel &bit, int verb=-1)
 seed 2D entities in the meshset and their adjacencies (only TETs adjacencies) in a particular BitRefLevel
 
DEPRECATED MoFEMErrorCode seed_ref_level (const Range &ents, const BitRefLevel &bit, const bool only_tets=true, int verb=-1)
 seed entities in the range and their adjacencies in a particular BitRefLevel
 
DEPRECATED MoFEMErrorCode partition_mesh (const Range &ents, const int dim, const int adj_dim, const int n_parts, int verb=-1)
 Set partition tag to each finite element in the problem.
 
DEPRECATED MoFEMErrorCode synchronise_entities (Range &ent, int verb=DEFAULT_VERBOSITY)
 
DEPRECATED MoFEMErrorCode synchronise_field_entities (const std::string &name, int verb=DEFAULT_VERBOSITY)
 
- Public Member Functions inherited from MoFEM::CoreInterface
virtual ~CoreInterface ()=default
 
virtual MoFEMErrorCode add_broken_field (const std::string name, const FieldSpace space, const FieldApproximationBase base, const FieldCoefficientsNumber nb_of_coefficients, const std::vector< std::pair< EntityType, std::function< MoFEMErrorCode(BaseFunction::DofsSideMap &)> > > list_dof_side_map, const TagType tag_type=MB_TAG_SPARSE, const enum MoFEMTypes bh=MF_EXCL, int verb=DEFAULT_VERBOSITY)=0
 Add field.
 
- Public Member Functions inherited from MoFEM::UnknownInterface
template<class IFACE >
MoFEMErrorCode registerInterface (bool error_if_registration_failed=true)
 Register interface.
 
template<class IFACE >
MoFEMErrorCode getInterface (IFACE *&iface) const
 Get interface reference to pointer of interface.
 
template<class IFACE >
MoFEMErrorCode getInterface (IFACE **const iface) const
 Get interface pointer to pointer of interface.
 
template<class IFACE , typename boost::enable_if< boost::is_pointer< IFACE >, int >::type = 0>
IFACE getInterface () const
 Get interface pointer to pointer of interface.
 
template<class IFACE , typename boost::enable_if< boost::is_reference< IFACE >, int >::type = 0>
IFACE getInterface () const
 Get reference to interface.
 
template<class IFACE >
IFACE * getInterface () const
 Function returning pointer to interface.
 
virtual ~UnknownInterface ()=default
 

Static Public Attributes

static constexpr int value = 0
 

Protected Member Functions

template<int V>
 CoreTmp (moab::Interface &moab, MPI_Comm comm, const int verbose, CoreValue< V >)
 
MoFEMErrorCode coreGenericConstructor (moab::Interface &moab, MPI_Comm comm, const int verbose)
 
MoFEMErrorCode addProblem (const BitProblemId id, const std::string &name, int verb=DEFAULT_VERBOSITY)
 add problem
 
MoFEMErrorCode getTags (int verb=DEFAULT_VERBOSITY)
 Get tag handles.
 
MoFEMErrorCode clearMap ()
 Cleaning database.
 
MoFEMErrorCode registerSubInterfaces ()
 Register insterfaces.
 
BitProblemId getProblemShift ()
 Return unique problem Id.
 
MoFEMErrorCode initialiseDatabaseFromMesh (int verb=DEFAULT_VERBOSITY)
 Initialize database getting information on mesh.
 
MoFEMErrorCode getOptions (int verb=DEFAULT_VERBOSITY)
 Get core options from command line.
 
template<class IFACE >
MoFEMErrorCode regSubInterface ()
 Register sub-interfaces in core interface.
 
template<class IFACE >
MoFEMErrorCode regEvents ()
 Register petsc events.
 

Protected Attributes

boost::shared_ptr< WrapMPICommwrapMPIMOABComm
 manage creation and destruction of MOAB communicator
 
int verbose
 Verbosity level.
 
boost::ptr_map< boost::typeindex::type_index, UnknownInterfaceiFaces
 Hash map of pointers to interfaces.
 
int * buildMoFEM
 keeps flags/semaphores for different stages
 
std::string optionsPrefix
 Prefix for options on command line.
 
PetscBool initaliseAndBuildField
 
PetscBool initaliseAndBuildFiniteElements
 

Static Protected Attributes

static bool isGloballyInitialised = false
 Core base globally initialized.
 
static int mpiInitialised
 mpi was initialised by other agent
 
static PetscBool isInitialized
 petsc was initialised by other agent
 

Auxiliary data and functions

enum  SemaphoresBuildMofem {
  BUILD_FIELD = 1 << 0 , BUILD_FE = 1 << 1 , BUILD_ADJ = 1 << 2 , BUILD_PROBLEM = 1 << 3 ,
  PARTITION_PROBLEM = 1 << 4 , PARTITION_FE = 1 << 5 , PARTITION_GHOST_DOFS = 1 << 6 , PARTITION_MESH = 1 << 7
}
 
int & getBuildMoFEM () const
 Get flags/semaphores for different stages.
 
MoFEMErrorCode addPrismToDatabase (const EntityHandle prism, int verb=DEFAULT_VERBOSITY)
 add prim element
 

Tags to data on mesh and entities

Tag th_Part
 Tag for partition number.
 
Tag th_RefParentHandle
 
Tag th_RefBitLevel
 
Tag th_RefBitLevel_Mask
 
Tag th_RefBitEdge
 
Tag th_RefFEMeshset
 
Tag th_FieldId
 
Tag th_FieldName
 
Tag th_FieldName_DataNamePrefix
 
Tag th_FieldSpace
 
Tag th_FieldContinuity
 
Tag th_FieldBase
 
Tag th_FEId
 
Tag th_FEName
 
Tag th_FEIdCol
 
Tag th_FEIdRow
 
Tag th_FEIdData
 
Tag th_ProblemId
 
Tag th_ProblemName
 
Tag th_ProblemFEId
 
Tag th_ProblemNbDofsRow
 
Tag th_ProblemNbDofsCol
 
Tag th_ProblemLocalNbDofRow
 
Tag th_ProblemGhostNbDofRow
 
Tag th_ProblemLocalNbDofCol
 
Tag th_ProblemGhostNbDofCol
 
Tag th_ProblemShift
 
Tag th_ElemType
 Needed for VTK files.
 
Tag th_MoFEMBuild
 
boost::shared_ptr< BasicEntityDatabasicEntityDataPtr
 
boost::shared_ptr< BasicEntityData > & get_basic_entity_data_ptr ()
 Get pointer to basic entity data.
 

Multi-Indices accessing data on the mesh

RefEntity_multiIndex refinedEntities
 refined entities
 
RefElement_multiIndex refinedFiniteElements
 refined elements
 
Field_multiIndex fIelds
 fields
 
FieldEntity_multiIndex entsFields
 entities on fields
 
DofEntity_multiIndex dofsField
 dofs on fields
 
FiniteElement_multiIndex finiteElements
 finite elements
 
EntFiniteElement_multiIndex entsFiniteElements
 finite element entities
 
FieldEntityEntFiniteElementAdjacencyMap_multiIndex entFEAdjacencies
 adjacencies of elements to dofs
 
Problem_multiIndex pRoblems
 problems multi-index
 

Get moab database

std::reference_wrapper< moab::Interface > moab
 moab database
 
moab::Interface & get_moab ()
 
const moab::Interface & get_moab () const
 
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)
 

Log events

PetscLogEvent MOFEM_EVENT_preProcess
 Event for preProcess finite element.
 
PetscLogEvent MOFEM_EVENT_operator
 Event for evaluating operator of finite element.
 
PetscLogEvent MOFEM_EVENT_postProcess
 Event for postProcess finite element.
 
PetscLogEvent MOFEM_EVENT_createMat
 

Communicator

MPI_Comm mofemComm
 MoFEM communicator.
 
ParallelComm * pComm
 MOAB communicator structure.
 
int sIze
 MoFEM communicator size.
 
int rAnk
 MOFEM communicator rank.
 
MPI_Comm & get_comm () const
 
int get_comm_size () const
 
int get_comm_rank () const
 

Assessing interfaces

MoFEMErrorCode query_interface (boost::typeindex::type_index type_index, UnknownInterface **iface) const
 Getting interface of core database.
 

Get tag handles to data on the mesh

Tag get_th_RefParentHandle () const
 
Tag get_th_RefBitLevel () const
 
Tag get_th_RefBitEdge () const
 

Global initialisation and finalisation


static MoFEMErrorCode Initialize (int *argc, char ***args, const char file[], const char help[])
 Initializes the MoFEM database PETSc, MOAB and MPI.
 
static MoFEMErrorCode Finalize ()
 Checks for options to be called at the conclusion of the program.
 

Static functions

static void setRefEntBasicDataPtr (MoFEM::Interface &m_field, boost::shared_ptr< BasicEntityData > &ptr)
 
static boost::shared_ptr< RefEntityTmp< 0 > > makeSharedRefEntity (MoFEM::Interface &m_field, const EntityHandle ent)
 

Check database consistency

MoFEMErrorCode check_number_of_ents_in_ents_field (const std::string &name) const
 check data consistency in entitiesPtr
 
MoFEMErrorCode check_number_of_ents_in_ents_field () const
 check data consistency in entitiesPtr
 
MoFEMErrorCode check_number_of_ents_in_ents_finite_element (const std::string &name) const
 check data consistency in entsFiniteElements
 
MoFEMErrorCode check_number_of_ents_in_ents_finite_element () const
 check data consistency in entsFiniteElements
 

Clear database

MoFEMErrorCode clear_database (int verb=DEFAULT_VERBOSITY)
 Clear database.
 
MoFEMErrorCode rebuild_database (int verb=DEFAULT_VERBOSITY)
 Clear database and initialize it once again.
 

Getting access to meshset manager

MeshsetsManagerget_meshsets_manager_ptr ()
 get MeshsetsManager pointer
 
const MeshsetsManagerget_meshsets_manager_ptr () const
 get MeshsetsManager pointer
 
MeshsetsManagerget_meshsets_manager ()
 get MeshsetsManager pointer
 
const MeshsetsManagerget_meshsets_manager () const
 get MeshsetsManager pointer
 

Remove and delete entities

MoFEMErrorCode remove_parents_by_ents (const Range &ents, int verb=DEFAULT_VERBOSITY)
 Remove parents from entities.
 
MoFEMErrorCode remove_parents_by_bit_ref (const BitRefLevel bit, const BitRefLevel mask, int verb=DEFAULT_VERBOSITY)
 Remove parent from entities on bit level.
 
MoFEMErrorCode remove_parents_by_parents (const Range &ents, int verb=DEFAULT_VERBOSITY)
 Remove paremts from entities having parents in passed range.
 
MoFEMErrorCode remove_ents (const Range ents, int verb=DEFAULT_VERBOSITY)
 remove entities form mofem database
 
MoFEMErrorCode remove_ents_by_bit_ref (const BitRefLevel bit, const BitRefLevel mask, int verb=DEFAULT_VERBOSITY)
 remove entities form mofem database
 
MoFEMErrorCode delete_ents_by_bit_ref (const BitRefLevel bit, const BitRefLevel mask, const bool remove_parent=false, int verb=DEFAULT_VERBOSITY, MoFEMTypes mf=MF_ZERO)
 delete entities form mofem and moab database
 

Fields

virtual MoFEMErrorCode add_broken_field (const std::string name, const FieldSpace space, const FieldApproximationBase base, const FieldCoefficientsNumber nb_coefficients, std::vector< std::pair< EntityType, std::function< MoFEMErrorCode(BaseFunction::DofsSideMap &)> > > list_dof_side_map, const TagType tag_type=MB_TAG_SPARSE, const enum MoFEMTypes bh=MF_EXCL, int verb=DEFAULT_VERBOSITY)
 Add field.
 
virtual MoFEMErrorCode add_field (const std::string name, const FieldSpace space, const FieldApproximationBase base, const FieldCoefficientsNumber nb_coefficients, const TagType tag_type=MB_TAG_SPARSE, const enum MoFEMTypes bh=MF_EXCL, int verb=DEFAULT_VERBOSITY)
 Add field.
 
MoFEMErrorCode delete_field (const std::string name, int verb=DEFAULT_VERBOSITY)
 Delete field.
 
MoFEMErrorCode addField (const std::string &name, const FieldSpace space, const FieldContinuity continuity, const FieldApproximationBase base, const FieldCoefficientsNumber nb_coefficients, const TagType tag_type, const enum MoFEMTypes bh, int verb)
 Template for add_field.
 
MoFEMErrorCode addEntsToFieldByDim (const Range &ents, const int dim, const std::string &name, int verb=DEFAULT_VERBOSITY)
 
MoFEMErrorCode add_ents_to_field_by_dim (const Range &ents, const int dim, const std::string &name, int verb=DEFAULT_VERBOSITY)
 Add entities to field meshset.
 
MoFEMErrorCode add_ents_to_field_by_type (const Range &ents, const EntityType type, const std::string &name, int verb=DEFAULT_VERBOSITY)
 Add entities to field meshset.
 
MoFEMErrorCode add_ents_to_field_by_dim (const EntityHandle meshset, const int dim, const std::string &name, const bool recursive=true, int verb=DEFAULT_VERBOSITY)
 Add entities to field meshset.
 
MoFEMErrorCode add_ents_to_field_by_type (const EntityHandle meshset, const EntityType type, const std::string &name, const bool recursive=true, int verb=DEFAULT_VERBOSITY)
 Add entities to field meshset.
 
MoFEMErrorCode create_vertices_and_add_to_field (const std::string name, const double coords[], int size, int verb=DEFAULT_VERBOSITY)
 Create a vertices and add to field object.
 

Set approximation order

MoFEMErrorCode setFieldOrder (const Range &ents, const BitFieldId id, const ApproximationOrder order, int ver)
 
MoFEMErrorCode setFieldOrderImpl (boost::shared_ptr< Field > field_ptr, const Range &ents, const ApproximationOrder order, int verb)
 
MoFEMErrorCode set_field_order (const Range &ents, const BitFieldId id, const ApproximationOrder order, int verb=DEFAULT_VERBOSITY)
 
MoFEMErrorCode set_field_order (const EntityHandle meshset, const EntityType type, const BitFieldId id, const ApproximationOrder order, int verb=DEFAULT_VERBOSITY)
 
MoFEMErrorCode set_field_order (const Range &ents, const std::string &name, const ApproximationOrder order, int verb=DEFAULT_VERBOSITY)
 Set order approximation of the entities in the field.
 
MoFEMErrorCode set_field_order (const EntityHandle meshset, const EntityType type, const std::string &name, const ApproximationOrder order, int verb=DEFAULT_VERBOSITY)
 Set order approximation of the entities in the field.
 
MoFEMErrorCode set_field_order_by_entity_type_and_bit_ref (const BitRefLevel &bit, const BitRefLevel &mask, const EntityType type, const BitFieldId id, const ApproximationOrder order, int verb=DEFAULT_VERBOSITY)
 
MoFEMErrorCode set_field_order_by_entity_type_and_bit_ref (const BitRefLevel &bit, const BitRefLevel &mask, const EntityType type, const std::string &name, const ApproximationOrder order, int verb=DEFAULT_VERBOSITY)
 Set order approximation of the entities in the field.
 

Build fields

MoFEMErrorCode buildFieldForNoFieldImpl (boost::shared_ptr< Field > field_ptr, std::map< EntityType, int > &dof_counter, int verb)
 
MoFEMErrorCode buildFieldForNoField (const BitFieldId id, std::map< EntityType, int > &dof_counter, int verb=DEFAULT_VERBOSITY)
 
MoFEMErrorCode buildFieldForL2H1HcurlHdiv (const BitFieldId id, std::map< EntityType, int > &dof_counter, std::map< EntityType, int > &inactive_dof_counter, int verb=DEFAULT_VERBOSITY)
 
MoFEMErrorCode buildField (const boost::shared_ptr< Field > &field, int verb=DEFAULT_VERBOSITY)
 
MoFEMErrorCode build_fields (int verb=DEFAULT_VERBOSITY)
 
MoFEMErrorCode build_field (const std::string field_name, int verb=DEFAULT_VERBOSITY)
 build field by name
 

Clear DOFs

MoFEMErrorCode clear_inactive_dofs (int verb=DEFAULT_VERBOSITY)
 
MoFEMErrorCode clear_dofs_fields_by_bit_ref (const BitRefLevel bit, const BitRefLevel mask, int verb=DEFAULT_VERBOSITY)
 
MoFEMErrorCode clear_dofs_fields (const Range ents, int verb=DEFAULT_VERBOSITY)
 
MoFEMErrorCode clear_dofs_fields (const std::string name, const Range ents, int verb=DEFAULT_VERBOSITY)
 

Clear ENTs

MoFEMErrorCode clear_ents_fields_by_bit_ref (const BitRefLevel bit, const BitRefLevel mask, int verb=DEFAULT_VERBOSITY)
 
MoFEMErrorCode clear_ents_fields (const Range ents, int verb=DEFAULT_VERBOSITY)
 
MoFEMErrorCode clear_ents_fields (const std::string name, const Range ents, int verb=DEFAULT_VERBOSITY)
 

Remove field entities

MoFEMErrorCode remove_ents_from_field_by_bit_ref (const BitRefLevel bit, const BitRefLevel mask, int verb=DEFAULT_VERBOSITY)
 remove entities from field
 
MoFEMErrorCode remove_ents_from_field (const std::string name, const EntityHandle meshset, const EntityType type, int verb=DEFAULT_VERBOSITY)
 remove entities from field
 
MoFEMErrorCode remove_ents_from_field (const std::string name, const Range ents, int verb=DEFAULT_VERBOSITY)
 remove entities from field
 
MoFEMErrorCode remove_ents_from_field (const Range ents, int verb=DEFAULT_VERBOSITY)
 remove entities from all fields
 

Other auxiliary functions for fields

MoFEMErrorCode list_dofs_by_field_name (const std::string &name) const
 
MoFEMErrorCode list_fields () const
 list entities in the field
 
BitFieldId get_field_id (const std::string &name) const
 Get field Id.
 
FieldBitNumber get_field_bit_number (const std::string name) const
 get field bit number
 
std::string get_field_name (const BitFieldId id) const
 get field name from id
 
EntityHandle get_field_meshset (const BitFieldId id) const
 
EntityHandle get_field_meshset (const std::string name) const
 get field meshset
 
MoFEMErrorCode get_field_entities_by_dimension (const std::string name, int dim, Range &ents) const
 get entities in the field by dimension
 
MoFEMErrorCode get_field_entities_by_type (const std::string name, EntityType type, Range &ents) const
 get entities in the field by type
 
MoFEMErrorCode get_field_entities_by_handle (const std::string name, Range &ents) const
 get entities in the field by handle
 
bool check_field (const std::string &name) const
 check if field is in database
 
const Fieldget_field_structure (const std::string &name, enum MoFEMTypes bh=MF_EXIST) const
 get field structure
 

Finite elements

const FiniteElementget_finite_element_structure (const std::string &name, enum MoFEMTypes bh=MF_EXCL) const
 get finite element struture
 
bool check_finite_element (const std::string &name) const
 Check if finite element is in database.
 
MoFEMErrorCode add_finite_element (const std::string &fe_name, enum MoFEMTypes bh=MF_EXCL, int verb=DEFAULT_VERBOSITY)
 add finite element
 
MoFEMErrorCode modify_finite_element_adjacency_table (const std::string &fe_name, const EntityType type, ElementAdjacencyFunct function)
 modify finite element table, only for advanced user
 
MoFEMErrorCode modify_finite_element_add_field_data (const std::string &fe_name, const std::string name_filed)
 set finite element field data
 
MoFEMErrorCode modify_finite_element_add_field_row (const std::string &fe_name, const std::string name_row)
 set field row which finite element use
 
MoFEMErrorCode modify_finite_element_add_field_col (const std::string &fe_name, const std::string name_col)
 set field col which finite element use
 
MoFEMErrorCode modify_finite_element_off_field_data (const std::string &fe_name, const std::string name_filed)
 unset finite element field data
 
MoFEMErrorCode modify_finite_element_off_field_row (const std::string &fe_name, const std::string name_row)
 unset field row which finite element use
 
MoFEMErrorCode modify_finite_element_off_field_col (const std::string &fe_name, const std::string name_col)
 unset field col which finite element use
 
MoFEMErrorCode add_ents_to_finite_element_by_type (const EntityHandle meshset, const EntityType type, const std::string name, const bool recursive=true)
 add entities to finite element
 
MoFEMErrorCode add_ents_to_finite_element_by_dim (const EntityHandle meshset, const int dim, const std::string name, const bool recursive=true)
 add entities to finite element
 
MoFEMErrorCode add_ents_to_finite_element_by_type (const Range ents, const EntityType type, const std::string name)
 add entities to finite elements
 
MoFEMErrorCode add_ents_to_finite_element_by_dim (const Range ents, const int dim, const std::string name)
 add entities to finite elements
 
MoFEMErrorCode add_ents_to_finite_element_by_bit_ref (const BitRefLevel bit, const BitRefLevel mask, const std::string name, EntityType type, int verb=DEFAULT_VERBOSITY)
 add TET entities from given refinement level to finite element database given by name
 
MoFEMErrorCode add_ents_to_finite_element_by_MESHSET (const EntityHandle meshset, const std::string &name, const bool recursive=false)
 add MESHSET element to finite element database given by name
 
DEPRECATED MoFEMErrorCode add_ents_to_finite_element_EntType_by_bit_ref (const BitRefLevel &bit, const std::string &name, EntityType type, int verb=DEFAULT_VERBOSITY)
 
DEPRECATED MoFEMErrorCode add_ents_to_finite_element_EntType_by_bit_ref (const BitRefLevel &bit, const BitRefLevel &mask, const std::string &name, EntityType type, int verb=DEFAULT_VERBOSITY)
 
MoFEMErrorCode remove_ents_from_finite_element_by_bit_ref (const BitRefLevel bit, const BitRefLevel mask, int verb=DEFAULT_VERBOSITY)
 remove elements from given refinement level to finite element database
 
MoFEMErrorCode remove_ents_from_finite_element (const std::string name, const EntityHandle meshset, const EntityType type, int verb=DEFAULT_VERBOSITY)
 remove entities from given refinement level to finite element database
 
MoFEMErrorCode remove_ents_from_finite_element (const std::string name, const Range ents, int verb=DEFAULT_VERBOSITY)
 remove entities from finite element database
 
MoFEMErrorCode remove_ents_from_finite_element (const Range ents, int verb=DEFAULT_VERBOSITY)
 remove entities from finite elements in database
 
MoFEMErrorCode delete_finite_element (const std::string name, int verb=DEFAULT_VERBOSITY)
 delete finite element from mofem database
 
BitFEId getBitFEId (const std::string &fe_name) const
 Get field Id.
 
std::string getBitFEIdName (const BitFEId id) const
 Get field name.
 
EntityHandle get_finite_element_meshset (const BitFEId id) const
 
EntityHandle get_finite_element_meshset (const std::string name) const
 
MoFEMErrorCode get_finite_element_entities_by_dimension (const std::string name, int dim, Range &ents) const
 get entities in the finite element by dimension
 
MoFEMErrorCode get_finite_element_entities_by_type (const std::string name, EntityType type, Range &ents) const
 get entities in the finite element by type
 
MoFEMErrorCode get_finite_element_entities_by_handle (const std::string name, Range &ents) const
 get entities in the finite element by handle
 
MoFEMErrorCode list_finite_elements () const
 list finite elements in database
 

Problems

MoFEMErrorCode add_problem (const std::string &name, enum MoFEMTypes bh=MF_EXCL, int verb=DEFAULT_VERBOSITY)
 Add problem.
 
bool check_problem (const std::string name)
 check if problem exist
 
MoFEMErrorCode delete_problem (const std::string name)
 Delete problem.
 
MoFEMErrorCode modify_problem_add_finite_element (const std::string name_problem, const std::string &fe_name)
 add finite element to problem, this add entities assigned to finite element to a particular problem
 
MoFEMErrorCode modify_problem_unset_finite_element (const std::string name_problem, const std::string &fe_name)
 unset finite element from problem, this remove entities assigned to finite element to a particular problem
 
MoFEMErrorCode modify_problem_ref_level_add_bit (const std::string &name_problem, const BitRefLevel &bit)
 add ref level to problem
 
MoFEMErrorCode modify_problem_ref_level_set_bit (const std::string &name_problem, const BitRefLevel &bit)
 set ref level for problem
 
MoFEMErrorCode modify_problem_mask_ref_level_add_bit (const std::string &name_problem, const BitRefLevel &bit)
 set dof mask ref level for problem
 
MoFEMErrorCode modify_problem_mask_ref_level_set_bit (const std::string &name_problem, const BitRefLevel &bit)
 set dof mask ref level for problem
 
BitProblemId getBitProblemId (const std::string &name) const
 
MoFEMErrorCode list_problem () const
 list problems
 
MoFEMErrorCode clear_problem (const std::string name, int verb=DEFAULT_VERBOSITY)
 clear problem
 
MoFEMErrorCode clear_problems (int verb=DEFAULT_VERBOSITY)
 clear problems
 
MoFEMErrorCode build_finite_elements (int verb=DEFAULT_VERBOSITY)
 Build finite elements.
 
MoFEMErrorCode build_finite_elements (const BitRefLevel &bit, int verb=DEFAULT_VERBOSITY)
 
MoFEMErrorCode build_finite_elements (const string fe_name, const Range *const ents_ptr=nullptr, int verb=DEFAULT_VERBOSITY)
 Build finite elements.
 
MoFEMErrorCode buildFiniteElements (const boost::shared_ptr< FiniteElement > &fe, const Range *ents_ptr=NULL, int verb=DEFAULT_VERBOSITY)
 
MoFEMErrorCode clear_finite_elements_by_bit_ref (const BitRefLevel bit, const BitRefLevel mask, int verb=DEFAULT_VERBOSITY)
 
MoFEMErrorCode clear_finite_elements (const Range &ents, int verb=DEFAULT_VERBOSITY)
 
MoFEMErrorCode clear_finite_elements (const std::string &fe_name, const Range &ents, int verb=DEFAULT_VERBOSITY)
 
MoFEMErrorCode get_problem_finite_elements_entities (const std::string name, const std::string &fe_name, const EntityHandle meshset)
 add finite elements to the meshset
 
DEPRECATED MoFEMErrorCode build_problem_on_distributed_mesh (int verb=DEFAULT_VERBOSITY)
 
DEPRECATED MoFEMErrorCode build_problems (int verb=DEFAULT_VERBOSITY)
 

Adjacencies

MoFEMErrorCode build_adjacencies (const Range &ents, int verb=DEFAULT_VERBOSITY)
 build adjacencies
 
MoFEMErrorCode build_adjacencies (const BitRefLevel &bit, int verb=DEFAULT_VERBOSITY)
 build adjacencies
 
MoFEMErrorCode build_adjacencies (const BitRefLevel &bit, const BitRefLevel &mask, int verb=DEFAULT_VERBOSITY)
 build adjacencies
 
MoFEMErrorCode clear_adjacencies_entities (const BitRefLevel bit, const BitRefLevel mask, int verb=DEFAULT_VERBOSITY)
 clear adjacency map for entities on given bit level
 
MoFEMErrorCode clear_adjacencies_entities (const Range ents, int verb=DEFAULT_VERBOSITY)
 clear adjacencies for field entities by entities
 
MoFEMErrorCode clear_adjacencies_entities (const std::string name, const Range ents, int verb=DEFAULT_VERBOSITY)
 clear adjacencies for field entities by entities and field namd
 
MoFEMErrorCode clear_adjacencies_finite_elements (const BitRefLevel bit, const BitRefLevel mask, int verb=DEFAULT_VERBOSITY)
 clear adjacency map for finite elements on given bit level
 
MoFEMErrorCode clear_adjacencies_finite_elements (const Range ents, int verb=DEFAULT_VERBOSITY)
 
MoFEMErrorCode clear_adjacencies_finite_elements (const std::string name, const Range ents, int verb=DEFAULT_VERBOSITY)
 

Methods for preforming operations on elements

MoFEMErrorCode problem_basic_method_preProcess (const Problem *problem_ptr, BasicMethod &method, int verb=DEFAULT_VERBOSITY)
 Set data for BasicMethod.
 
MoFEMErrorCode problem_basic_method_preProcess (const std::string &problem_name, BasicMethod &method, int verb=DEFAULT_VERBOSITY)
 Set data for BasicMethod.
 
MoFEMErrorCode problem_basic_method_postProcess (const Problem *problem_ptr, BasicMethod &method, int verb=DEFAULT_VERBOSITY)
 Set data for BasicMethod.
 
MoFEMErrorCode problem_basic_method_postProcess (const std::string &problem_name, BasicMethod &method, int verb=DEFAULT_VERBOSITY)
 Set data for BasicMethod.
 
MoFEMErrorCode cache_problem_entities (const std::string prb_name, CacheTupleWeakPtr cache_ptr)
 Cache variables.
 
MoFEMErrorCode loop_finite_elements (const Problem *problem_ptr, const std::string &fe_name, FEMethod &method, int lower_rank, int upper_rank, boost::shared_ptr< NumeredEntFiniteElement_multiIndex > fe_ptr=nullptr, MoFEMTypes bh=MF_EXIST, CacheTupleWeakPtr cache_ptr=CacheTupleSharedPtr(), int verb=DEFAULT_VERBOSITY)
 Make a loop over finite elements on partitions from upper to lower rank.
 
MoFEMErrorCode loop_finite_elements (const std::string problem_name, const std::string &fe_name, FEMethod &method, int lower_rank, int upper_rank, boost::shared_ptr< NumeredEntFiniteElement_multiIndex > fe_ptr=nullptr, MoFEMTypes bh=MF_EXIST, CacheTupleWeakPtr cache_ptr=CacheTupleSharedPtr(), int verb=DEFAULT_VERBOSITY)
 Make a loop over finite elements on partitions from upper to lower rank.
 
MoFEMErrorCode loop_finite_elements (const std::string problem_name, const std::string &fe_name, FEMethod &method, boost::shared_ptr< NumeredEntFiniteElement_multiIndex > fe_ptr=nullptr, MoFEMTypes bh=MF_EXIST, CacheTupleWeakPtr cache_ptr=CacheTupleSharedPtr(), int verb=DEFAULT_VERBOSITY)
 Make a loop over finite elements.
 
MoFEMErrorCode loop_dofs (const Problem *problem_ptr, const std::string &field_name, RowColData rc, DofMethod &method, int lower_rank, int upper_rank, int verb=DEFAULT_VERBOSITY)
 Make a loop over dofs.
 
MoFEMErrorCode loop_dofs (const std::string &problem_name, const std::string &field_name, RowColData rc, DofMethod &method, int lower_rank, int upper_rank, int verb=DEFAULT_VERBOSITY)
 Make a loop over dofs.
 
MoFEMErrorCode loop_dofs (const std::string &problem_name, const std::string &field_name, RowColData rc, DofMethod &method, int verb=DEFAULT_VERBOSITY)
 Make a loop over dofs.
 
MoFEMErrorCode loop_dofs (const std::string &field_name, DofMethod &method, int verb=DEFAULT_VERBOSITY)
 Make a loop over dofs.
 
MoFEMErrorCode loop_entities (const Problem *problem_ptr, const std::string field_name, RowColData rc, EntityMethod &method, int lower_rank, int upper_rank, int verb=DEFAULT_VERBOSITY)
 Loop over field entities in the problem.
 
MoFEMErrorCode loop_entities (const std::string problem_name, const std::string field_name, RowColData rc, EntityMethod &method, int lower_rank, int upper_rank, int verb=DEFAULT_VERBOSITY)
 Loop over field entities in the problem.
 
MoFEMErrorCode loop_entities (const std::string problem_name, const std::string field_name, RowColData rc, EntityMethod &method, int verb=DEFAULT_VERBOSITY)
 Loop over field entities in the problem.
 
MoFEMErrorCode loop_entities (const std::string field_name, EntityMethod &method, Range const *const ents=nullptr, int verb=DEFAULT_VERBOSITY)
 Loop over field entities.
 

Accessing multi-indices

MoFEMErrorCode get_fields (const Field_multiIndex **fields_ptr) const
 Get fields multi-index from database.
 
MoFEMErrorCode get_ref_ents (const RefEntity_multiIndex **refined_entities_ptr) const
 Get ref entities multi-index from database.
 
MoFEMErrorCode get_ref_finite_elements (const RefElement_multiIndex **refined_finite_elements_ptr) const
 Get ref finite elements multi-index form database.
 
MoFEMErrorCode get_finite_elements (const FiniteElement_multiIndex **fe_ptr) const
 Get finite elements multi-index.
 
MoFEMErrorCode get_ents_finite_elements (const EntFiniteElement_multiIndex **fe_ent_ptr) const
 Get entities finite elements multi-index.
 
MoFEMErrorCode get_field_ents (const FieldEntity_multiIndex **field_ents) const
 Get field multi index.
 
MoFEMErrorCode get_dofs (const DofEntity_multiIndex **dofs_ptr) const
 Get dofs multi index.
 
MoFEMErrorCode get_problem (const std::string &problem_name, const Problem **problem_ptr) const
 Get problem database (data structure)
 
MoFEMErrorCode get_problems (const Problem_multiIndex **problems_ptr) const
 Get pointer to problems multi-index.
 
MoFEMErrorCode get_ents_elements_adjacency (const FieldEntityEntFiniteElementAdjacencyMap_multiIndex **dofs_elements_adjacency) const
 Get the dofs elements adjacency object.
 
const Field_multiIndexget_fields () const
 Get the fields object.
 
const RefEntity_multiIndexget_ref_ents () const
 Get the ref ents object.
 
const RefElement_multiIndexget_ref_finite_elements () const
 Get the ref finite elements object.
 
const FiniteElement_multiIndexget_finite_elements () const
 Get the finite elements object.
 
const EntFiniteElement_multiIndexget_ents_finite_elements () const
 Get the ents finite elements object.
 
const FieldEntity_multiIndexget_field_ents () const
 Get the field ents object.
 
const DofEntity_multiIndexget_dofs () const
 Get the dofs object.
 
const Problemget_problem (const std::string problem_name) const
 Get the problem object.
 
const Problem_multiIndexget_problems () const
 Get the problems object.
 
const FieldEntityEntFiniteElementAdjacencyMap_multiIndexget_ents_elements_adjacency () const
 Get the dofs elements adjacency object.
 
FieldEntityByUId::iterator get_ent_field_by_name_begin (const std::string &field_name) const
 get begin iterator of field ents of given name (instead you can use IT_GET_ENT_FIELD_BY_NAME_FOR_LOOP(MFIELD,NAME,IT)
 
FieldEntityByUId::iterator get_ent_field_by_name_end (const std::string &field_name) const
 get begin iterator of field dofs of given name (instead you can use IT_GET_ENT_FIELD_BY_NAME_FOR_LOOP(MFIELD,NAME,IT)
 
DofEntityByUId::iterator get_dofs_by_name_begin (const std::string &field_name) const
 get begin iterator of field dofs of given name (instead you can use IT_GET_DOFS_FIELD_BY_NAME_FOR_LOOP(MFIELD,NAME,IT)
 
DofEntityByUId::iterator get_dofs_by_name_end (const std::string &field_name) const
 get begin iterator of field dofs of given name (instead you can use IT_GET_DOFS_FIELD_BY_NAME_FOR_LOOP(MFIELD,NAME,IT)
 
DofEntityByUId::iterator get_dofs_by_name_and_ent_begin (const std::string &field_name, const EntityHandle ent) const
 get begin iterator of field dofs of given name and ent(instead you can use IT_GET_DOFS_FIELD_BY_NAME_FOR_LOOP(MFIELD,NAME,ENT,IT)
 
DofEntityByUId::iterator get_dofs_by_name_and_ent_end (const std::string &field_name, const EntityHandle ent) const
 get begin iterator of field dofs of given name and ent (instead you can use IT_GET_DOFS_FIELD_BY_NAME_FOR_LOOP(MFIELD,NAME,ENT,IT)
 
DofEntityByUId::iterator get_dofs_by_name_and_type_begin (const std::string &field_name, const EntityType type) const
 get begin iterator of field dofs of given name and ent type (instead you can use IT_GET_DOFS_FIELD_BY_NAME_FOR_LOOP(MFIELD,NAME,TYPE,IT)
 
DofEntityByUId::iterator get_dofs_by_name_and_type_end (const std::string &field_name, const EntityType ent) const
 get begin iterator of field dofs of given name end ent type(instead you can use IT_GET_DOFS_FIELD_BY_NAME_FOR_LOOP(MFIELD,NAME,TYPE,IT)
 
EntFiniteElement_multiIndex::index< Unique_mi_tag >::type::iterator get_fe_by_name_begin (const std::string &fe_name) const
 get begin iterator of finite elements of given name (instead you can use IT_GET_FES_BY_NAME_FOR_LOOP(MFIELD,NAME,IT)
 
EntFiniteElement_multiIndex::index< Unique_mi_tag >::type::iterator get_fe_by_name_end (const std::string &fe_name) const
 get end iterator of finite elements of given name (instead you can use IT_GET_FES_BY_NAME_FOR_LOOP(MFIELD,NAME,IT)
 

Additional Inherited Members

- Static Public Member Functions inherited from MoFEM::UnknownInterface
static MoFEMErrorCode getLibVersion (Version &version)
 Get library version.
 
static MoFEMErrorCode getFileVersion (moab::Interface &moab, Version &version)
 Get database major version.
 
static MoFEMErrorCode setFileVersion (moab::Interface &moab, Version version=Version(MoFEM_VERSION_MAJOR, MoFEM_VERSION_MINOR, MoFEM_VERSION_BUILD))
 Get database major version.
 
static MoFEMErrorCode getInterfaceVersion (Version &version)
 Get database major version.
 

Detailed Description

Core (interface) class.

This is the implementation of abstract MoFEM::Interface class. Similarly to the convention used in MoAB, we use small letters to name function of purely abstract classes. This is an exception used only here. For more details about naming functions see Coding practice

This class is not used directly by the user. For internal use only. It is database with basic functions to access data. Abstraction of this is MoFEM Interface structure.

Such deign to hide complexities for users and allow low development without interfering with users modules programmer work.

Todo
Implement static functions for Initialization and Finalization of MoFEM. Those functions should keep all static variables and initialize/finalize other libs like PETSc. Moreover initialization functions should set error handlers, etc.
Examples
add_blockset.cpp, add_cubit_meshsets.cpp, adolc_plasticity.cpp, analytical_nonlinear_poisson.cpp, analytical_poisson.cpp, analytical_poisson_field_split.cpp, approx_sphere.cpp, bernstein_bezier_generate_base.cpp, bone_adaptation.cpp, boundary_marker.cpp, build_large_problem.cpp, build_problems.cpp, child_and_parent.cpp, continuity_check_on_contact_prism_side_ele.cpp, continuity_check_on_skeleton_3d.cpp, continuity_check_on_skeleton_with_simple_2d_for_h1.cpp, continuity_check_on_skeleton_with_simple_2d_for_hcurl.cpp, continuity_check_on_skeleton_with_simple_2d_for_hdiv.cpp, cubit_bc_test.cpp, delete_ho_nodes.cpp, dg_projection.cpp, dm_build_partitioned_mesh.cpp, dm_create_subdm.cpp, dm_partitioned_no_field.cpp, dynamic_first_order_con_law.cpp, edge_and_bubble_shape_functions_on_quad.cpp, eigen_elastic.cpp, elasticity.cpp, elasticity_mixed_formulation.cpp, ep.cpp, field_evaluator.cpp, field_to_vertices.cpp, forces_and_sources_testing_edge_element.cpp, forces_and_sources_testing_flat_prism_element.cpp, forces_and_sources_testing_users_base.cpp, free_surface.cpp, gauss_points_on_outer_product.cpp, hanging_node_approx.cpp, hcurl_check_approx_in_2d.cpp, hcurl_curl_operator.cpp, hcurl_divergence_operator_2d.cpp, hdiv_check_approx_in_3d.cpp, hdiv_divergence_operator.cpp, heat_equation.cpp, heat_method.cpp, hello_world.cpp, helmholtz.cpp, higher_derivatives.cpp, level_set.cpp, log.cpp, loop_entities.cpp, lorentz_force.cpp, magnetostatic.cpp, mesh_cut.cpp, mesh_insert_interface_atom.cpp, mesh_smoothing.cpp, meshset_to_vtk.cpp, minimal_surface_area.cpp, mixed_poisson.cpp, mofem/tutorials/vec-7/adjoint.cpp, navier_stokes.cpp, node_merge.cpp, nonlinear_dynamics.cpp, operators_tests.cpp, partition_mesh.cpp, phase.cpp, photon_diffusion.cpp, plastic.cpp, plate.cpp, plot_base.cpp, poisson_2d_dis_galerkin.cpp, poisson_2d_homogeneous.cpp, prism_elements_from_surface.cpp, prism_polynomial_approximation.cpp, quad_polynomial_approximation.cpp, reaction_diffusion.cpp, remove_entities_from_problem.cpp, remove_entities_from_problem_not_partitioned.cpp, scalar_check_approximation.cpp, schur_test_diag_mat.cpp, seepage.cpp, shallow_wave.cpp, simple_elasticity.cpp, simple_interface.cpp, simple_l2_only.cpp, split_sideset.cpp, tensor_divergence_operator.cpp, test_broken_space.cpp, test_cache_on_entities.cpp, testing_jacobian_of_hook_element.cpp, testing_jacobian_of_hook_scaled_with_density_element.cpp, thermo_elastic.cpp, unsaturated_transport.cpp, and wave_equation.cpp.

Definition at line 82 of file Core.hpp.

Member Enumeration Documentation

◆ SemaphoresBuildMofem

enum MoFEM::CoreTmp< 0 >::SemaphoresBuildMofem

Is used to check consistency. I n future properly this will be removed and replaced by other solution. It is only for internal use.

Enumerator
BUILD_FIELD 
BUILD_FE 
BUILD_ADJ 
BUILD_PROBLEM 
PARTITION_PROBLEM 
PARTITION_FE 
PARTITION_GHOST_DOFS 
PARTITION_MESH 

Definition at line 211 of file Core.hpp.

211 {
212 BUILD_FIELD = 1 << 0,
213 BUILD_FE = 1 << 1,
214 BUILD_ADJ = 1 << 2,
215 BUILD_PROBLEM = 1 << 3,
216 PARTITION_PROBLEM = 1 << 4,
217 PARTITION_FE = 1 << 5,
218 PARTITION_GHOST_DOFS = 1 << 6,
219 PARTITION_MESH = 1 << 7
220 };

Constructor & Destructor Documentation

◆ CoreTmp() [1/2]

MoFEM::Core::CoreTmp ( moab::Interface & moab,
MPI_Comm comm = PETSC_COMM_WORLD,
const int verbose = VERBOSE )

Construct core database

Parameters
moabMoAB interface
commMPI communicator
verboseVerbosity level

Definition at line 241 of file Core.cpp.

246 : CoreTmp(moab, comm, verbose, CoreValue<0>()) {
247
248 // Register sub-interfaces
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);
257
258 this->basicEntityDataPtr = boost::make_shared<BasicEntityData>(moab);
260
261 ierr = this->initialiseDatabaseFromMesh(verbose);
262 CHKERRABORT(comm, ierr);
263}
static MoFEMErrorCodeGeneric< PetscErrorCode > ierr
MoFEMErrorCode clearMap()
Cleaning database.
Definition Core.cpp:525
static void setRefEntBasicDataPtr(MoFEM::Interface &m_field, boost::shared_ptr< BasicEntityData > &ptr)
Definition Core.cpp:930
MoFEMErrorCode initialiseDatabaseFromMesh(int verb=DEFAULT_VERBOSITY)
Initialize database getting information on mesh.
Definition Core.cpp:300
MoFEMErrorCode registerSubInterfaces()
Register insterfaces.
Definition Core.cpp:485
MoFEMErrorCode getOptions(int verb=DEFAULT_VERBOSITY)
Get core options from command line.
Definition Core.cpp:777
int verbose
Verbosity level.
Definition Core.hpp:1039
MoFEMErrorCode getTags(int verb=DEFAULT_VERBOSITY)
Get tag handles.
Definition Core.cpp:573
CoreTmp(moab::Interface &moab, MPI_Comm comm=PETSC_COMM_WORLD, const int verbose=VERBOSE)
Definition Core.cpp:241
boost::shared_ptr< BasicEntityData > basicEntityDataPtr
Definition Core.hpp:281
std::reference_wrapper< moab::Interface > moab
moab database
Definition Core.hpp:321

◆ ~CoreTmp()

MoFEM::Core::~CoreTmp ( )

Definition at line 289 of file Core.cpp.

289 {
290 PetscBool is_finalized;
291 PetscFinalized(&is_finalized);
292 // Destroy interfaces
293 iFaces.clear();
294 // This is deprecated ONE should use MoFEM::Core::Initialize
295 if (isGloballyInitialised && is_finalized) {
296 isGloballyInitialised = false;
297 }
298}
static bool isGloballyInitialised
Core base globally initialized.
Definition Core.hpp:1056
boost::ptr_map< boost::typeindex::type_index, UnknownInterface > iFaces
Hash map of pointers to interfaces.
Definition Core.hpp:1044

◆ CoreTmp() [2/2]

template<int V>
MoFEM::CoreTmp< 0 >::CoreTmp ( moab::Interface & moab,
MPI_Comm comm,
const int verbose,
CoreValue< V >  )
protected

Construct core database

Parameters
moabMoAB interface
commMPI communicator

Definition at line 32 of file CoreTemplates.hpp.

34 : moab(moab), mofemComm(comm), verbose(verbose),
35 initaliseAndBuildField(PETSC_FALSE),
37
39 CHKERRABORT(comm, ierr);
40
41 MOFEM_LOG_CHANNEL("WORLD");
42 if (verbose > QUIET) {
43 MOFEM_LOG_C("WORLD", Sev::verbose, "Core number < %d >", V);
44 }
45}
#define MOFEM_LOG_C(channel, severity, format,...)
@ QUIET
#define MOFEM_LOG_CHANNEL(channel)
Set and reset channel.
PetscBool initaliseAndBuildFiniteElements
Definition Core.hpp:1053
MoFEMErrorCode coreGenericConstructor(moab::Interface &moab, MPI_Comm comm, const int verbose)
Definition Core.cpp:203
PetscBool initaliseAndBuildField
Definition Core.hpp:1050
MPI_Comm mofemComm
MoFEM communicator.
Definition Core.hpp:1012

Member Function Documentation

◆ add_broken_field()

virtual MoFEMErrorCode MoFEM::CoreTmp< 0 >::add_broken_field ( const std::string name,
const FieldSpace space,
const FieldApproximationBase base,
const FieldCoefficientsNumber nb_coefficients,
std::vector< std::pair< EntityType, std::function< MoFEMErrorCode(BaseFunction::DofsSideMap &)> > > list_dof_side_map,
const TagType tag_type = MB_TAG_SPARSE,
const enum MoFEMTypes bh = MF_EXCL,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Add field.

Parameters
nameField name
spaceSpace L2,H1,Hdiv,Hcurl
continuityField continuity (you can set broken space)
baseApproximation base AINSWORTH_LEGENDRE_BASE, AINSWORTH_BERNSTEIN_BEZIER_BASE ...
nb_coefficientsNumber of field coefficients @param type_dof_side_map Map of entity type to function returning DofsSideMap
tag_typeTag type, MB_TAG_DENSE or MB_TAG_SPARSE (default)
bhControl behavior, if MF_EXCL throws error if exist
verbVerbosity level
Returns
Return error code

TODO:

Todo
MB_TAG_DENSE will not work properly in general case. It is need to separate field tags for each entity separately. That will allow for HO orders but homogenous approx. order on each entity. Need some discussion what is optimal solution. MB_TAG_SPARSE gives flexibility, but it not memory efficient. MB_TAG_DENSE uses memory more efficient and in principle allow for better efficiency if properly utilized.

FIXME:

Bug
Need to resolve problem of dense tags at this stage of development will make only problems

◆ add_ents_to_field_by_dim() [1/2]

MoFEMErrorCode MoFEM::Core::add_ents_to_field_by_dim ( const EntityHandle meshset,
const int dim,
const std::string & name,
const bool recursive = true,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Add entities to field meshset.

\not collective

The lower dimension entities are added depending on the space type

Parameters
meshset
dimdimension
namename of field
recursivetake entities recursively from embedded entities
verbverbosity level
Returns
error code

Implements MoFEM::CoreInterface.

Definition at line 440 of file FieldCore.cpp.

443 {
445 Range ents;
446 CHKERR get_moab().get_entities_by_dimension(meshset, dim, ents, recursive);
447 CHKERR addEntsToFieldByDim(ents, dim, name, verb);
450}
#define MOFEM_LOG_SYNCHRONISE(comm)
Synchronise "SYNC" channel.
#define MoFEMFunctionReturnHot(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 ...
MoFEMErrorCode addEntsToFieldByDim(const Range &ents, const int dim, const std::string &name, int verb=DEFAULT_VERBOSITY)
moab::Interface & get_moab()
Definition Core.hpp:322

◆ add_ents_to_field_by_dim() [2/2]

MoFEMErrorCode MoFEM::Core::add_ents_to_field_by_dim ( const Range & ents,
const int dim,
const std::string & name,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Add entities to field meshset.

Note
not collective

The lower dimension entities are added depending on the space type

Parameters
entsrange of entities
dimdimension of entities
namename of field
verbverbosity level
Returns
error code

Implements MoFEM::CoreInterface.

Definition at line 416 of file FieldCore.cpp.

418 {
420 Range ents_dim = ents.subset_by_dimension(dim);
421 CHKERR addEntsToFieldByDim(ents_dim, dim, name, verb);
424}
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()

◆ add_ents_to_field_by_type() [1/2]

MoFEMErrorCode MoFEM::Core::add_ents_to_field_by_type ( const EntityHandle meshset,
const EntityType type,
const std::string & name,
const bool recursive = true,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Add entities to field meshset.

Note
not collective

The lower dimension entities are added depending on the space type

Parameters
meshset
typeof entities
namename of field
recursivetake entities recursively from embedded entities
verbverbosity level
Returns
error code

Implements MoFEM::CoreInterface.

Definition at line 452 of file FieldCore.cpp.

455 {
457 Range ents;
458 CHKERR get_moab().get_entities_by_type(meshset, type, ents, recursive);
459 if (!ents.empty()) {
460 const int dim = get_moab().dimension_from_handle(ents[0]);
461 CHKERR addEntsToFieldByDim(ents, dim, name, verb);
462 }
465}

◆ add_ents_to_field_by_type() [2/2]

MoFEMErrorCode MoFEM::Core::add_ents_to_field_by_type ( const Range & ents,
const EntityType type,
const std::string & name,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Add entities to field meshset.

Note
not collective

The lower dimension entities are added depending on the space type

Parameters
entsrange of entities
typetype of entities
namename of field
verbverbosity level
Returns
error code

Implements MoFEM::CoreInterface.

Definition at line 426 of file FieldCore.cpp.

429 {
431 Range ents_type = ents.subset_by_type(type);
432 if (!ents_type.empty()) {
433 const int dim = get_moab().dimension_from_handle(ents_type[0]);
434 CHKERR addEntsToFieldByDim(ents_type, dim, name, verb);
435 }
438}

◆ add_ents_to_finite_element_by_bit_ref()

MoFEMErrorCode MoFEM::Core::add_ents_to_finite_element_by_bit_ref ( const BitRefLevel bit,
const BitRefLevel mask,
const std::string name,
EntityType type,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

add TET entities from given refinement level to finite element database given by name

Note
not collective
Parameters
BitRefLevelbit
BitRefLevelmask
finiteelement name
finiteelement type
verboselevel

Implements MoFEM::CoreInterface.

Definition at line 405 of file FECore.cpp.

407 {
409
410 if (verb == -1)
411 verb = verbose;
412 *buildMoFEM &= 1 << 0;
413 const BitFEId id = getBitFEId(name);
415
416 auto &ref_MoFEMFiniteElement = refinedFiniteElements.get<Ent_mi_tag>();
417 auto miit = ref_MoFEMFiniteElement.lower_bound(get_id_for_min_type(type));
418 auto hi_miit = ref_MoFEMFiniteElement.upper_bound(get_id_for_max_type(type));
419
420 int nb_add_fes = 0;
421 for (; miit != hi_miit; miit++) {
422 const auto &bit2 = miit->get()->getBitRefLevel();
423 if ((bit2 & mask) != bit2)
424 continue;
425 if ((bit2 & bit).any()) {
426 EntityHandle ent = miit->get()->getEnt();
427 CHKERR get_moab().add_entities(idm, &ent, 1);
428 nb_add_fes++;
429 }
430 }
431
432 MOFEM_LOG("SYNC", Sev::inform)
433 << "Finite element " << name << " added. Nb. of elements added "
434 << nb_add_fes << " out of " << std::distance(miit, hi_miit);
435
437
439}
#define FECoreFunctionBegin
Definition FECore.cpp:7
#define MOFEM_LOG(channel, severity)
Log.
auto bit
set bit
std::bitset< BITFEID_SIZE > BitFEId
Finite element Id.
Definition Types.hpp:43
EntityHandle get_id_for_max_type()
EntityHandle get_id_for_min_type()
EntityHandle get_finite_element_meshset(const BitFEId id) const
Definition FECore.cpp:273
RefElement_multiIndex refinedFiniteElements
refined elements
Definition Core.hpp:301
int * buildMoFEM
keeps flags/semaphores for different stages
Definition Core.hpp:1046
BitFEId getBitFEId(const std::string &fe_name) const
Get field Id.
Definition FECore.cpp:255

◆ add_ents_to_finite_element_by_dim() [1/2]

MoFEMErrorCode MoFEM::Core::add_ents_to_finite_element_by_dim ( const EntityHandle entities,
const int dim,
const std::string name,
const bool recursive = true )
protectedvirtual

add entities to finite element

Note
not collective
Parameters
entitiesmeshset or range form were entities taken
dimdimension
namefinite element name
recursivetake entities from meshsets in meshset
Returns
error code

Implements MoFEM::CoreInterface.

Definition at line 346 of file FECore.cpp.

348 {
350 *buildMoFEM &= 1 << 0;
353 Range ents;
354 CHKERR get_moab().get_entities_by_dimension(meshset, dim, ents, recursive);
355 CHKERR getInterface<BitRefManager>()->setElementsBitRefLevel(ents);
356 CHKERR get_moab().add_entities(idm, ents);
358}
const EntityHandle no_handle
No entity handle is indicated by zero handle, i.e. root meshset.
Definition Common.hpp:12
IFACE getInterface() const
Get interface pointer to pointer of interface.

◆ add_ents_to_finite_element_by_dim() [2/2]

MoFEMErrorCode MoFEM::Core::add_ents_to_finite_element_by_dim ( const Range ents,
const int dim,
const std::string name )
protectedvirtual

add entities to finite elements

Note
not collective
Parameters
entsrange of entities
dimdimension of entities
namename of finite element
Returns
error code

Implements MoFEM::CoreInterface.

Definition at line 373 of file FECore.cpp.

374 {
376 *buildMoFEM &= 1 << 0;
379 CHKERR getInterface<BitRefManager>()->setElementsBitRefLevel(
380 ents.subset_by_dimension(dim));
381 CHKERR get_moab().add_entities(idm, ents.subset_by_dimension(dim));
383}

◆ add_ents_to_finite_element_by_MESHSET()

MoFEMErrorCode MoFEM::Core::add_ents_to_finite_element_by_MESHSET ( const EntityHandle meshset,
const std::string & name,
const bool recursive = false )
protectedvirtual

add MESHSET element to finite element database given by name

Note
not collective
Parameters
meshsetcontains all entities that could be used for finite element
nameFinite Element name

Implements MoFEM::CoreInterface.

Definition at line 441 of file FECore.cpp.

442 {
444 *buildMoFEM &= 1 << 0;
445 const BitFEId id = getBitFEId(name);
447 if (recursive == false) {
448 CHKERR get_moab().add_entities(idm, &meshset, 1);
449 } else {
450 Range meshsets;
451 CHKERR get_moab().get_entities_by_type(meshset, MBENTITYSET, meshsets,
452 false);
453 CHKERR get_moab().add_entities(idm, meshsets);
454 }
456}

◆ add_ents_to_finite_element_by_type() [1/2]

MoFEMErrorCode MoFEM::Core::add_ents_to_finite_element_by_type ( const EntityHandle entities,
const EntityType type,
const std::string name,
const bool recursive = true )
protectedvirtual

add entities to finite element

Note
not collective
Parameters
entitiesmeshset or range form were entities taken
typetype of entity
namefinite element name
recursivetake entities from meshsets in meshset
Returns
error code

Implements MoFEM::CoreInterface.

Definition at line 329 of file FECore.cpp.

331 {
332 *buildMoFEM &= 1 << 0;
335
337 Range ents;
338 CHKERR get_moab().get_entities_by_type(meshset, type, ents, recursive);
339 CHKERR getInterface<BitRefManager>()->setElementsBitRefLevel(ents);
340 CHKERR get_moab().add_entities(idm, ents);
341
343}

◆ add_ents_to_finite_element_by_type() [2/2]

MoFEMErrorCode MoFEM::Core::add_ents_to_finite_element_by_type ( const Range ents,
const EntityType type,
const std::string name )
protectedvirtual

add entities to finite elements

Note
not collective
Parameters
entsrange of entities
typetype of entity (MBVERTEX, MBEDGE, MBTRI, ...)
namename of finite element
Returns
error code

Implements MoFEM::CoreInterface.

Definition at line 360 of file FECore.cpp.

361 {
363 *buildMoFEM &= 1 << 0;
366 CHKERR getInterface<BitRefManager>()->setElementsBitRefLevel(
367 ents.subset_by_type(type));
368 CHKERR get_moab().add_entities(idm, ents.subset_by_type(type));
370} // namespace MoFEM

◆ add_ents_to_finite_element_EntType_by_bit_ref() [1/2]

MoFEMErrorCode MoFEM::Core::add_ents_to_finite_element_EntType_by_bit_ref ( const BitRefLevel & bit,
const BitRefLevel & mask,
const std::string & name,
EntityType type,
int verb = DEFAULT_VERBOSITY )
protected

Definition at line 396 of file FECore.cpp.

398 {
400 CHKERR add_ents_to_finite_element_by_bit_ref(bit, mask, name, type, verb);
401
403}
MoFEMErrorCode add_ents_to_finite_element_by_bit_ref(const BitRefLevel bit, const BitRefLevel mask, const std::string name, EntityType type, int verb=DEFAULT_VERBOSITY)
add TET entities from given refinement level to finite element database given by name
Definition FECore.cpp:405

◆ add_ents_to_finite_element_EntType_by_bit_ref() [2/2]

MoFEMErrorCode MoFEM::Core::add_ents_to_finite_element_EntType_by_bit_ref ( const BitRefLevel & bit,
const std::string & name,
EntityType type,
int verb = DEFAULT_VERBOSITY )
protected

Definition at line 386 of file FECore.cpp.

388 {
391 type, verb);
392
394}
std::bitset< BITREFLEVEL_SIZE > BitRefLevel
Bit structure attached to each entity identifying to what mesh entity is attached.
Definition Types.hpp:40

◆ add_field()

MoFEMErrorCode MoFEM::Core::add_field ( const std::string name,
const FieldSpace space,
const FieldApproximationBase base,
const FieldCoefficientsNumber nb_coefficients,
const TagType tag_type = MB_TAG_SPARSE,
const enum MoFEMTypes bh = MF_EXCL,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Add field.

Parameters
nameField name
spaceSpace L2,H1,Hdiv,Hcurl
continuityField continuity (you can set broken space)
baseApproximation base AINSWORTH_LEGENDRE_BASE, AINSWORTH_BERNSTEIN_BEZIER_BASE ...
nb_coefficientsNumber of field coefficients
tag_typeTag type, MB_TAG_DENSE or MB_TAG_SPARSE (default)
bhControl behavior, if MF_EXCL throws error if exist
verbVerbosity level
Returns
Return error code

TODO:

Todo
MB_TAG_DENSE will not work properly in general case. It is need to separate field tags for each entity separately. That will allow for HO orders but homogenous approx. order on each entity. Need some discussion what is optimal solution. MB_TAG_SPARSE gives flexibility, but it not memory efficient. MB_TAG_DENSE uses memory more efficient and in principle allow for better efficiency if properly utilized.

FIXME:

Bug
Need to resolve problem of dense tags at this stage of development will make only problems

Implements MoFEM::CoreInterface.

Definition at line 315 of file FieldCore.cpp.

319 {
320 return this->addField(name, space, CONTINUOUS, base, nb_of_coefficients,
321 tag_type, bh, verb);
322}
@ CONTINUOUS
Regular field.
MoFEMErrorCode addField(const std::string &name, const FieldSpace space, const FieldContinuity continuity, const FieldApproximationBase base, const FieldCoefficientsNumber nb_coefficients, const TagType tag_type, const enum MoFEMTypes bh, int verb)
Template for add_field.

◆ add_finite_element()

MoFEMErrorCode MoFEM::Core::add_finite_element ( const std::string & fe_name,
enum MoFEMTypes bh = MF_EXCL,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

add finite element

Parameters
namefinite element name
Note
add_file is a collective, should be executed on all processors. Otherwise could lead to deadlock.

Example

CHKERR mField.add_finite_element("ELASTIC");
CHKERR mField.add_finite_element("PLASTIC");

Implements MoFEM::CoreInterface.

Definition at line 43 of file FECore.cpp.

44 {
46 *buildMoFEM &= 1 << 0;
47 if (verb == -1) {
48 verb = verbose;
49 }
50
51 // Add finite element meshset to partition meshset. In case of no elements
52 // on processor part, when mesh file is read, finite element meshset is
53 // prevented from deletion by moab reader.
54 auto add_meshset_to_partition = [&](auto meshset) {
56 const void *tag_vals[] = {&rAnk};
57 ParallelComm *pcomm = ParallelComm::get_pcomm(
58 &get_moab(), get_basic_entity_data_ptr()->pcommID);
59 Tag part_tag = pcomm->part_tag();
60 Range tagged_sets;
61 CHKERR get_moab().get_entities_by_type_and_tag(0, MBENTITYSET, &part_tag,
62 tag_vals, 1, tagged_sets,
63 moab::Interface::UNION);
64 for (auto s : tagged_sets)
65 CHKERR get_moab().add_entities(s, &meshset, 1);
67 };
68
69 auto &finite_element_name_set =
70 finiteElements.get<FiniteElement_name_mi_tag>();
71 auto it_fe = finite_element_name_set.find(fe_name);
72
73 if (bh == MF_EXCL) {
74 if (it_fe != finite_element_name_set.end()) {
75 SETERRQ(mofemComm, MOFEM_NOT_FOUND, "this < %s > is there",
76 fe_name.c_str());
77 }
78
79 } else {
80 if (it_fe != finite_element_name_set.end())
82 }
83 EntityHandle meshset;
84 CHKERR get_moab().create_meshset(MESHSET_SET, meshset);
85 CHKERR add_meshset_to_partition(meshset);
86
87 // id
88 int fe_shift = 0;
89 for (; finiteElements.get<BitFEId_mi_tag>().find(BitFEId().set(fe_shift)) !=
90 finiteElements.get<BitFEId_mi_tag>().end();
91 ++fe_shift) {
92 }
93
94 auto id = BitFEId().set(fe_shift);
95 CHKERR get_moab().tag_set_data(th_FEId, &meshset, 1, &id);
96
97 // id name
98 void const *tag_data[] = {fe_name.c_str()};
99 int tag_sizes[1];
100 tag_sizes[0] = fe_name.size();
101 CHKERR get_moab().tag_set_by_ptr(th_FEName, &meshset, 1, tag_data, tag_sizes);
102
103 // add FiniteElement
104 auto p = finiteElements.insert(
105 boost::shared_ptr<FiniteElement>(new FiniteElement(moab, meshset)));
106 if (!p.second)
108 "FiniteElement not inserted");
109
110 if (verb > QUIET)
111 MOFEM_LOG("WORLD", Sev::inform) << "Add finite element " << fe_name;
112
114}
@ MF_EXCL
@ MOFEM_NOT_FOUND
Definition definitions.h:33
@ MOFEM_OPERATION_UNSUCCESSFUL
Definition definitions.h:34
boost::shared_ptr< BasicEntityData > & get_basic_entity_data_ptr()
Get pointer to basic entity data.
Definition Core.hpp:290
FiniteElement_multiIndex finiteElements
finite elements
Definition Core.hpp:307
int rAnk
MOFEM communicator rank.
Definition Core.hpp:1016

◆ add_problem()

MoFEMErrorCode MoFEM::Core::add_problem ( const std::string & name,
enum MoFEMTypes bh = MF_EXCL,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Add problem.

Note
add_file is a collective, should be executed on all processors. Otherwise could lead to deadlock.

Implements MoFEM::CoreInterface.

Definition at line 84 of file ProblemsCore.cpp.

85 {
87 if (verb == -1)
88 verb = verbose;
89 auto miit = pRoblems.get<Problem_mi_tag>().find(name);
90 if (miit == pRoblems.get<Problem_mi_tag>().end()) {
91
92 int p_shift = 0;
93 for (; pRoblems.get<BitProblemId_mi_tag>().find(BitProblemId().set(
94 p_shift)) != pRoblems.get<BitProblemId_mi_tag>().end();
95 ++p_shift) {
96 }
97
98 auto id = BitProblemId().set(p_shift);
99 CHKERR addProblem(id, name, verb);
100
101 } else if (bh == MF_EXCL) {
102 SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_FOUND, "problem is in database %s",
103 name.c_str());
104 }
106}
std::bitset< BITPROBLEMID_SIZE > BitProblemId
Problem Id.
Definition Types.hpp:44
MoFEMErrorCode addProblem(const BitProblemId id, const std::string &name, int verb=DEFAULT_VERBOSITY)
add problem
Problem_multiIndex pRoblems
problems multi-index
Definition Core.hpp:313

◆ addEntsToFieldByDim()

MoFEMErrorCode MoFEM::Core::addEntsToFieldByDim ( const Range & ents,
const int dim,
const std::string & name,
int verb = DEFAULT_VERBOSITY )
protected

Definition at line 324 of file FieldCore.cpp.

325 {
326
327 *buildMoFEM = 0;
329 if (verb == -1)
330 verb = verbose;
331
332 MOFEM_LOG_CHANNEL("SYNC");
333 MOFEM_LOG_TAG("SYNC", "FieldCore");
335
337 idm = get_field_meshset(name);
338 FieldSpace space;
339 CHKERR get_moab().tag_get_data(th_FieldSpace, &idm, 1, &space);
340 FieldContinuity continuity;
341 CHKERR get_moab().tag_get_data(th_FieldContinuity, &idm, 1, &continuity);
342
343 switch (continuity) {
344 case CONTINUOUS:
345 case DISCONTINUOUS:
346 break;
347 default:
348 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
349 "sorry, unknown continuity added to entity");
350 }
351
352 std::vector<int> nb_ents_on_dim(3, 0);
353 switch (space) {
354 case L2:
355 CHKERR get_moab().add_entities(idm, ents);
356 break;
357 case H1:
358 CHKERR get_moab().add_entities(idm, ents);
359 if (continuity == DISCONTINUOUS)
360 break;
361 for (int dd = 0; dd != dim; ++dd) {
362 Range adj_ents;
363 CHKERR get_moab().get_adjacencies(ents, dd, false, adj_ents,
364 moab::Interface::UNION);
365 if (dd == 0) {
366 Range topo_nodes;
367 CHKERR get_moab().get_connectivity(ents, topo_nodes, true);
368 Range mid_nodes;
369 CHKERR get_moab().get_connectivity(ents, mid_nodes, false);
370 mid_nodes = subtract(mid_nodes, topo_nodes);
371 adj_ents = subtract(adj_ents, mid_nodes);
372 }
373 CHKERR get_moab().add_entities(idm, adj_ents);
374 nb_ents_on_dim[dd] = adj_ents.size();
375 }
376 break;
377 case HCURL:
378 CHKERR get_moab().add_entities(idm, ents);
379 if (continuity == DISCONTINUOUS)
380 break;
381 for (int dd = 1; dd != dim; ++dd) {
382 Range adj_ents;
383 CHKERR get_moab().get_adjacencies(ents, dd, false, adj_ents,
384 moab::Interface::UNION);
385 CHKERR get_moab().add_entities(idm, adj_ents);
386 nb_ents_on_dim[dd] = adj_ents.size();
387 }
388 break;
389 case HDIV:
390 CHKERR get_moab().add_entities(idm, ents);
391 if (continuity == DISCONTINUOUS)
392 break;
393 if (dim > 2) {
394 Range adj_ents;
395 CHKERR get_moab().get_adjacencies(ents, 2, false, adj_ents,
396 moab::Interface::UNION);
397 CHKERR get_moab().add_entities(idm, adj_ents);
398 nb_ents_on_dim[2] = adj_ents.size();
399 }
400 break;
401 default:
402 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
403 "sorry, unknown space added to entity");
404 }
405
406 if (verb >= VERBOSE) {
407 MOFEM_LOG("SYNC", Sev::noisy) << "add entities to field " << name;
408 MOFEM_LOG("SYNC", Sev::noisy) << "\tnb. add ents " << ents.size();
409 MOFEM_LOG("SYNC", Sev::noisy) << "\tnb. add faces " << nb_ents_on_dim[2];
410 MOFEM_LOG("SYNC", Sev::noisy) << "\tnb. add edges " << nb_ents_on_dim[1];
411 MOFEM_LOG("SYNC", Sev::noisy) << "\tnb. add nodes " << nb_ents_on_dim[0];
412 }
414}
@ VERBOSE
FieldSpace
approximation spaces
Definition definitions.h:82
@ L2
field with C-1 continuity
Definition definitions.h:88
@ H1
continuous field
Definition definitions.h:85
@ HCURL
field with continuous tangents
Definition definitions.h:86
@ HDIV
field with continuous normal traction
Definition definitions.h:87
FieldContinuity
Field continuity.
Definition definitions.h:99
@ DISCONTINUOUS
Broken continuity (No effect on L2 space)
@ MOFEM_DATA_INCONSISTENCY
Definition definitions.h:31
#define MOFEM_LOG_TAG(channel, tag)
Tag channel.
#define MOFEM_LOG_FUNCTION()
Set scope.
const Tensor2_symmetric_Expr< const ddTensor0< T, Dim, i, j >, typename promote< T, double >::V, Dim, i, j > dd(const Tensor0< T * > &a, const Index< i, Dim > index1, const Index< j, Dim > index2, const Tensor1< int, Dim > &d_ijk, const Tensor1< double, Dim > &d_xyz)
Definition ddTensor0.hpp:33
EntityHandle get_field_meshset(const BitFieldId id) const
Definition FieldCore.cpp:45

◆ addField()

MoFEMErrorCode MoFEM::Core::addField ( const std::string & name,
const FieldSpace space,
const FieldContinuity continuity,
const FieldApproximationBase base,
const FieldCoefficientsNumber nb_coefficients,
const TagType tag_type,
const enum MoFEMTypes bh,
int verb )
protected

Template for add_field.

Template Parameters
CoreN
Parameters
name
space
continuity
base
nb_coefficients
tag_type
bh
verb
Returns
MoFEMErrorCode

Definition at line 108 of file FieldCore.cpp.

113 {
114 MOFEM_LOG_CHANNEL("WORLD");
115 MOFEM_LOG_TAG("WORLD", "FieldCore");
116 MOFEM_LOG_CHANNEL("SYNC");
117 MOFEM_LOG_TAG("SYNC", "FieldCore");
120
121 // Add field mesh set to partion meshset. In case of no elements
122 // on processor part, when mesh file is read, finite element meshset is
123 // prevented from deletion by moab reader.
124 auto add_meshset_to_partition = [&](auto meshset) {
126 const void *tag_vals[] = {&rAnk};
127 ParallelComm *pcomm = ParallelComm::get_pcomm(
128 &get_moab(), get_basic_entity_data_ptr()->pcommID);
129 Tag part_tag = pcomm->part_tag();
130 Range tagged_sets;
131 CHKERR get_moab().get_entities_by_type_and_tag(0, MBENTITYSET, &part_tag,
132 tag_vals, 1, tagged_sets,
133 moab::Interface::UNION);
134 for (auto s : tagged_sets)
135 CHKERR get_moab().add_entities(s, &meshset, 1);
137 };
138
139 auto create_tags = [&](auto meshset, auto id) {
141 CHKERR get_moab().tag_set_data(th_FieldId, &meshset, 1, &id);
142 // space
143 CHKERR get_moab().tag_set_data(th_FieldSpace, &meshset, 1, &space);
144 // continuity
145 CHKERR get_moab().tag_set_data(th_FieldContinuity, &meshset, 1,
146 &continuity);
147 // base
148 CHKERR get_moab().tag_set_data(th_FieldBase, &meshset, 1, &base);
149
150 // name
151 void const *tag_data[] = {name.c_str()};
152 int tag_sizes[1];
153 tag_sizes[0] = name.size();
154 CHKERR get_moab().tag_set_by_ptr(th_FieldName, &meshset, 1, tag_data,
155 tag_sizes);
156 // rank
157 Tag th_rank;
158 int def_rank = 1;
159 const std::string tag_rank_name = "_Field_Rank_" + name;
160 CHKERR get_moab().tag_get_handle(tag_rank_name.c_str(), 1, MB_TYPE_INTEGER,
161 th_rank, MB_TAG_CREAT | MB_TAG_SPARSE,
162 &def_rank);
163 CHKERR get_moab().tag_set_data(th_rank, &meshset, 1, &nb_of_coefficients);
164
165 Version file_ver;
167 CHK_THROW_MESSAGE(ierr, "Not known file version");
168 if (file_ver.majorVersion >= 0 && file_ver.minorVersion >= 12 &&
169 file_ver.buildVersion >= 1) {
170
171 // Change tag names comparing to older versions
172
173 const std::string name_data_prefix("_App_Data_");
174 void const *tag_prefix_data[] = {name_data_prefix.c_str()};
175 int tag_prefix_sizes[1];
176 tag_prefix_sizes[0] = name_data_prefix.size();
177 CHKERR get_moab().tag_set_by_ptr(th_FieldName_DataNamePrefix, &meshset, 1,
178 tag_prefix_data, tag_prefix_sizes);
179 Tag th_app_order, th_field_data, th_field_data_vert;
180
181 // order
182 ApproximationOrder def_approx_order = -1;
183 const std::string tag_approx_order_name = "_App_Order_" + name;
184 CHKERR get_moab().tag_get_handle(
185 tag_approx_order_name.c_str(), 1, MB_TYPE_INTEGER, th_app_order,
186 MB_TAG_CREAT | MB_TAG_SPARSE, &def_approx_order);
187
188 // data
189 std::string tag_data_name = name_data_prefix + name;
190 const int def_len = 0;
191 CHKERR get_moab().tag_get_handle(
192 tag_data_name.c_str(), def_len, MB_TYPE_DOUBLE, th_field_data,
193 MB_TAG_CREAT | MB_TAG_VARLEN | MB_TAG_SPARSE, NULL);
194 std::string tag_data_name_verts = name_data_prefix + name + "_V";
195 VectorDouble def_vert_data(nb_of_coefficients);
196 def_vert_data.clear();
197 CHKERR get_moab().tag_get_handle(
198 tag_data_name_verts.c_str(), nb_of_coefficients, MB_TYPE_DOUBLE,
199 th_field_data_vert, MB_TAG_CREAT | tag_type, &*def_vert_data.begin());
200 } else {
201 // Deprecated names
202 const std::string name_data_prefix("_App_Data");
203 void const *tag_prefix_data[] = {name_data_prefix.c_str()};
204 int tag_prefix_sizes[1];
205 tag_prefix_sizes[0] = name_data_prefix.size();
206 CHKERR get_moab().tag_set_by_ptr(th_FieldName_DataNamePrefix, &meshset, 1,
207 tag_prefix_data, tag_prefix_sizes);
208 Tag th_app_order, th_field_data, th_field_data_vert;
209
210 // order
211 ApproximationOrder def_approx_order = -1;
212 const std::string tag_approx_order_name = "_App_Order_" + name;
213 CHKERR get_moab().tag_get_handle(
214 tag_approx_order_name.c_str(), 1, MB_TYPE_INTEGER, th_app_order,
215 MB_TAG_CREAT | MB_TAG_SPARSE, &def_approx_order);
216
217 // data
218 std::string tag_data_name = name_data_prefix + name;
219 const int def_len = 0;
220 CHKERR get_moab().tag_get_handle(
221 tag_data_name.c_str(), def_len, MB_TYPE_DOUBLE, th_field_data,
222 MB_TAG_CREAT | MB_TAG_VARLEN | MB_TAG_SPARSE, NULL);
223 std::string tag_data_name_verts = name_data_prefix + name + "V";
224 VectorDouble def_vert_data(nb_of_coefficients);
225 def_vert_data.clear();
226 CHKERR get_moab().tag_get_handle(
227 tag_data_name_verts.c_str(), nb_of_coefficients, MB_TYPE_DOUBLE,
228 th_field_data_vert, MB_TAG_CREAT | tag_type, &*def_vert_data.begin());
229 }
230
232 };
233
234 if (verb == -1)
235 verb = verbose;
236 *buildMoFEM = 0;
237 auto fit = fIelds.get<FieldName_mi_tag>().find(name);
238 if (fit != fIelds.get<FieldName_mi_tag>().end()) {
239 if (bh == MF_EXCL)
240 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
241 "field is <%s> in database", name.c_str());
242
243 } else {
244
245 EntityHandle meshset;
246 CHKERR get_moab().create_meshset(MESHSET_SET, meshset);
247 CHKERR add_meshset_to_partition(meshset);
248
249 // id
250 int field_shift = 0;
251 for (;
252 fIelds.get<BitFieldId_mi_tag>().find(BitFieldId().set(field_shift)) !=
253 fIelds.get<BitFieldId_mi_tag>().end();
254 ++field_shift) {
255 if (field_shift == BITFEID_SIZE)
256 SETERRQ(PETSC_COMM_SELF, MOFEM_IMPOSSIBLE_CASE,
257 "Maximal number of fields exceeded");
258 }
259
260 auto id = BitFieldId().set(field_shift);
261 CHKERR create_tags(meshset, id);
262
263 auto p = fIelds.insert(boost::make_shared<Field>(moab, meshset));
264 if (verb > QUIET) {
265 MOFEM_LOG("WORLD", Sev::inform) << "Add field " << **p.first;
266 MOFEM_LOG("WORLD", Sev::noisy)
267 << "Field " << (*p.first)->getName() << " core value < "
268 << this->getValue() << " > field value ( "
269 << static_cast<int>((*p.first)->getBitNumber()) << " )";
270 }
271
272 if (!p.second)
273 SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_FOUND,
274 "field not inserted %s (top tip, it could be already "
275 "there)",
276 Field(moab, meshset).getName().c_str());
277 }
278
279 MOFEM_LOG_CHANNEL("WORLD");
280 MOFEM_LOG_CHANNEL("SYNC");
282}
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
@ MOFEM_IMPOSSIBLE_CASE
Definition definitions.h:35
#define BITFEID_SIZE
max number of finite elements
int ApproximationOrder
Approximation on the entity.
Definition Types.hpp:26
std::bitset< BITFIELDID_SIZE > BitFieldId
Field Id.
Definition Types.hpp:42
Field_multiIndex fIelds
fields
Definition Core.hpp:303
Tag th_FieldName_DataNamePrefix
Definition Core.hpp:260
const int getValue() const
Get the core.
Definition Core.hpp:85
static MoFEMErrorCode getFileVersion(moab::Interface &moab, Version &version)
Get database major version.

◆ addPrismToDatabase()

MoFEMErrorCode MoFEM::Core::addPrismToDatabase ( const EntityHandle prism,
int verb = DEFAULT_VERBOSITY )

add prim element

FIXME: This is dirt solution, need to be fixed

Parameters
prismprim handle
verbverbosity level
Returns
error code

Definition at line 544 of file Core.cpp.

544 {
546 if (verb == -1)
547 verb = verbose;
548 std::pair<RefEntity_multiIndex::iterator, bool> p_ent;
549 p_ent = refinedEntities.insert(
550 boost::make_shared<RefEntity>(basicEntityDataPtr, prism));
551 if (p_ent.second) {
552 std::pair<RefElement_multiIndex::iterator, bool> p;
553 p = refinedFiniteElements.insert(
554 boost::shared_ptr<RefElement>(new RefElement_PRISM(*p_ent.first)));
555 int num_nodes;
556 const EntityHandle *conn;
557 CHKERR get_moab().get_connectivity(prism, conn, num_nodes, true);
558 Range face_side3, face_side4;
559 CHKERR get_moab().get_adjacencies(conn, 3, 2, false, face_side3);
560 CHKERR get_moab().get_adjacencies(&conn[3], 3, 2, false, face_side4);
561 if (face_side3.size() != 1)
562 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
563 "prism don't have side face 3");
564 if (face_side4.size() != 1)
565 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
566 "prims don't have side face 4");
567 p.first->get()->getSideNumberPtr(*face_side3.begin());
568 p.first->get()->getSideNumberPtr(*face_side4.begin());
569 }
571}
RefEntity_multiIndex refinedEntities
refined entities
Definition Core.hpp:300

◆ addProblem()

MoFEMErrorCode MoFEM::Core::addProblem ( const BitProblemId id,
const std::string & name,
int verb = DEFAULT_VERBOSITY )
protected

add problem

Parameters
idproblem id
nameproblem name
verbverbosity level
Returns
MoFEMErrorCode

Definition at line 27 of file ProblemsCore.cpp.

28 {
30
31 if (verb == -1)
32 verb = verbose;
33 EntityHandle meshset;
34 CHKERR get_moab().create_meshset(MESHSET_SET, meshset);
35 CHKERR get_moab().tag_set_data(th_ProblemId, &meshset, 1, &id);
36
37 // Add problem meshset to partion meshset. In case of no elements
38 // on processor part, when mesh file is read, finite element meshset is
39 // prevented from deletion by moab reader.
40 auto add_meshset_to_partition = [&](auto meshset) {
42 const void *tag_vals[] = {&rAnk};
43 ParallelComm *pcomm = ParallelComm::get_pcomm(
44 &get_moab(), get_basic_entity_data_ptr()->pcommID);
45 Tag part_tag = pcomm->part_tag();
46 Range tagged_sets;
47 CHKERR get_moab().get_entities_by_type_and_tag(0, MBENTITYSET, &part_tag,
48 tag_vals, 1, tagged_sets,
49 moab::Interface::UNION);
50 for (auto s : tagged_sets)
51 CHKERR get_moab().add_entities(s, &meshset, 1);
53 };
54 CHKERR add_meshset_to_partition(meshset);
55
56 void const *tag_data[] = {name.c_str()};
57 int tag_sizes[1];
58 tag_sizes[0] = name.size();
59 CHKERR get_moab().tag_set_by_ptr(th_ProblemName, &meshset, 1, tag_data,
60 tag_sizes);
61 // create entry
62 auto p = pRoblems.insert(Problem(moab, meshset));
63 if (!p.second) {
66 MOFEM_LOG("SELF", Sev::error) << "Following problem can not be added:";
67 MOFEM_LOG("SELF", Sev::error)
68 << "Problem " << name << " id(" << id.to_ulong() << ") " << id
69 << " added meshset " << meshset;
70 MOFEM_LOG("SELF", Sev::error) << "List of problems already in databse:";
71 for (auto &p : pRoblems) {
72 MOFEM_LOG("SELF", Sev::error)
73 << p.getName() << " id(" << p.getId().to_ulong() << ") " << id
74 << " on meshset " << p.meshset;
75 }
76 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY, "Problem not added");
77 }
78
79 MOFEM_LOG("WORLD", Sev::inform) << "Add problem " << name;
80
82}
#define ProblemCoreFunctionBegin
#define MOFEM_LOG_ATTRIBUTES(channel, bit)
Add attributes to channel.

◆ build_adjacencies() [1/3]

MoFEMErrorCode MoFEM::Core::build_adjacencies ( const BitRefLevel & bit,
const BitRefLevel & mask,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

build adjacencies

Parameters
bitadjacencies for refine level
maskmask for bit level

This function will get information of adjacent finite elements and fields of all entities. If this is not executed, partitioning the problem is not possible. Adjacency map is based on degrees of freedom adjacent to elements. This linked to geometric element connectivity.

If new degrees of freedom or new finite elements are added to the database, adjacency map has to be rebuild.

Implements MoFEM::CoreInterface.

Definition at line 815 of file FECore.cpp.

816 {
818 if (verb == -1)
819 verb = verbose;
820 Range ents;
821 CHKERR BitRefManager(*this).getEntitiesByRefLevel(bit, mask, ents);
822
823 CHKERR build_adjacencies(ents, verb);
824
826}
MoFEMErrorCode build_adjacencies(const Range &ents, int verb=DEFAULT_VERBOSITY)
build adjacencies
Definition FECore.cpp:743

◆ build_adjacencies() [2/3]

MoFEMErrorCode MoFEM::Core::build_adjacencies ( const BitRefLevel & bit,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

build adjacencies

Parameters
bitadjacencies for refine level

This function will get information of adjacent finite elements and fields of all entities. If this is not executed, partitioning the problem is not possible. Adjacency map is based on degrees of freedom adjacent to elements. This linked to geometric element connectivity.

If new degrees of freedom or new finite elements are added to the database, adjacency map has to be rebuild.

Implements MoFEM::CoreInterface.

Definition at line 827 of file FECore.cpp.

827 {
829 if (verb == -1)
830 verb = verbose;
831 CHKERR build_adjacencies(bit, BitRefLevel().set(), verb);
832
834}

◆ build_adjacencies() [3/3]

MoFEMErrorCode MoFEM::Core::build_adjacencies ( const Range & ents,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

build adjacencies

Parameters
listof entities

This function will get information of adjacent finite elements and fields of all entities. If this is not executed, partitioning the problem is not possible. Adjacency map is based on degrees of freedom adjacent to elements. This linked to geometric element connectivity.

If new degrees of freedom or new finite elements are added to the database, adjacency map has to be rebuild.

Implements MoFEM::CoreInterface.

Definition at line 743 of file FECore.cpp.

743 {
745 if (verb == DEFAULT_VERBOSITY)
746 verb = verbose;
747
748 if (!((*buildMoFEM) & BUILD_FIELD))
749 SETERRQ(mofemComm, MOFEM_NOT_FOUND, "field not build");
750 if (!((*buildMoFEM) & BUILD_FE))
751 SETERRQ(mofemComm, MOFEM_NOT_FOUND, "fe not build");
752 for (auto peit = ents.pair_begin(); peit != ents.pair_end(); ++peit) {
753 auto fit = entsFiniteElements.get<Ent_mi_tag>().lower_bound(peit->first);
754 auto hi_fit =
755 entsFiniteElements.get<Ent_mi_tag>().upper_bound(peit->second);
756 for (; fit != hi_fit; ++fit) {
757 if ((*fit)->getBitFieldIdRow().none() &&
758 (*fit)->getBitFieldIdCol().none() &&
759 (*fit)->getBitFieldIdData().none())
760 continue;
761 int by = BYROW;
762 if ((*fit)->getBitFieldIdRow() != (*fit)->getBitFieldIdCol())
763 by |= BYCOL;
764 if ((*fit)->getBitFieldIdRow() != (*fit)->getBitFieldIdData())
765 by |= BYDATA;
766 FieldEntityEntFiniteElementAdjacencyMap_change_ByWhat modify_row(by);
767 auto hint = entFEAdjacencies.end();
768 for (auto e : *(*fit)->getRowFieldEntsPtr()) {
769 hint = entFEAdjacencies.emplace_hint(hint, e.lock(), *fit);
770 bool success = entFEAdjacencies.modify(hint, modify_row);
771 if (!success)
772 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
773 "modification unsuccessful");
774 }
775 if ((*fit)->getBitFieldIdRow() != (*fit)->getBitFieldIdCol()) {
776 int by = BYCOL;
777 if ((*fit)->getBitFieldIdCol() != (*fit)->getBitFieldIdData())
778 by |= BYDATA;
779 FieldEntityEntFiniteElementAdjacencyMap_change_ByWhat modify_col(by);
780 auto hint = entFEAdjacencies.end();
781 for (auto e : *(*fit)->getColFieldEntsPtr()) {
782 hint = entFEAdjacencies.emplace_hint(hint, e.lock(), *fit);
783 bool success = entFEAdjacencies.modify(hint, modify_col);
784 if (!success)
785 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
786 "modification unsuccessful");
787 }
788 }
789 if ((*fit)->getBitFieldIdRow() != (*fit)->getBitFieldIdData() ||
790 (*fit)->getBitFieldIdCol() != (*fit)->getBitFieldIdData()) {
791 FieldEntityEntFiniteElementAdjacencyMap_change_ByWhat modify_data(
792 BYDATA);
793 auto hint = entFEAdjacencies.end();
794 for (auto &e : (*fit)->getDataFieldEnts()) {
795 hint = entFEAdjacencies.emplace_hint(hint, e.lock(), *fit);
796 bool success = entFEAdjacencies.modify(hint, modify_data);
797 if (!success)
798 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
799 "modification unsuccessful");
800 }
801 }
802 }
803 }
804
805 if (verb >= VERBOSE) {
806 MOFEM_LOG("WORLD", Sev::inform)
807 << "Number of adjacencies " << entFEAdjacencies.size();
809 }
810
811 *buildMoFEM |= 1 << 2;
813}
@ DEFAULT_VERBOSITY
@ BYCOL
@ BYDATA
@ BYROW
EntFiniteElement_multiIndex entsFiniteElements
finite element entities
Definition Core.hpp:308
FieldEntityEntFiniteElementAdjacencyMap_multiIndex entFEAdjacencies
adjacencies of elements to dofs
Definition Core.hpp:311

◆ build_field()

MoFEMErrorCode MoFEM::Core::build_field ( const std::string field_name,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

build field by name

Parameters
field_name
verbm
Returns
MoFEMErrorCode

Implements MoFEM::CoreInterface.

Definition at line 1305 of file FieldCore.cpp.

1305 {
1307 auto field_it = fIelds.get<FieldName_mi_tag>().find(field_name);
1308 if (field_it == fIelds.get<FieldName_mi_tag>().end())
1309 SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_FOUND, "Field < %s > not found",
1310 field_name.c_str());
1311
1312 CHKERR this->buildField(*field_it, verb);
1313 if (verb > QUIET)
1316}
#define FieldCoreFunctionBegin
Definition FieldCore.cpp:8
Field_multiIndex::index< FieldName_mi_tag >::type::iterator field_it
constexpr auto field_name
MoFEMErrorCode buildField(const boost::shared_ptr< Field > &field, int verb=DEFAULT_VERBOSITY)

◆ build_fields()

MoFEMErrorCode MoFEM::Core::build_fields ( int verb = DEFAULT_VERBOSITY)
protectedvirtual

build fields

Implements MoFEM::CoreInterface.

Definition at line 1318 of file FieldCore.cpp.

1318 {
1320 if (verb == -1)
1321 verb = verbose;
1322
1323 for (auto field : fIelds.get<BitFieldId_mi_tag>())
1324 CHKERR this->buildField(field, verb);
1325
1326 *buildMoFEM = 1 << 0;
1327 if (verb > QUIET) {
1328 MOFEM_LOG("SYNC", Sev::verbose) << "Number of dofs " << dofsField.size();
1330 }
1331
1333}
DofEntity_multiIndex dofsField
dofs on fields
Definition Core.hpp:305

◆ build_finite_elements() [1/3]

MoFEMErrorCode MoFEM::Core::build_finite_elements ( const BitRefLevel & bit,
int verb = DEFAULT_VERBOSITY )
protected

Definition at line 706 of file FECore.cpp.

706 {
708 SETERRQ(mofemComm, MOFEM_NOT_IMPLEMENTED, "Not yet implemented");
710}
@ MOFEM_NOT_IMPLEMENTED
Definition definitions.h:32

◆ build_finite_elements() [2/3]

MoFEMErrorCode MoFEM::Core::build_finite_elements ( const string fe_name,
const Range *const ents_ptr = nullptr,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Build finite elements.

Build finite element data structures. Have to be run before problem and adjacencies are constructed.

Parameters
fe_nameName of finite element
ents_ptrPointer to range of finite elements
verbVerbosity level
Returns
Error code

Implements MoFEM::CoreInterface.

Definition at line 712 of file FECore.cpp.

714 {
716 if (verb == -1)
717 verb = verbose;
718
719 auto fe_miit = finiteElements.get<FiniteElement_name_mi_tag>().find(fe_name);
720 if (fe_miit == finiteElements.get<FiniteElement_name_mi_tag>().end())
721 SETERRQ(mofemComm, MOFEM_NOT_FOUND, "Finite element <%s> not found",
722 fe_name.c_str());
723
724 CHKERR buildFiniteElements(*fe_miit, ents_ptr, verb);
725
726 if (verb >= VERBOSE) {
727 auto &fe_ents = entsFiniteElements.get<Unique_mi_tag>();
728 auto miit = fe_ents.lower_bound(
729 EntFiniteElement::getLocalUniqueIdCalculate(0, (*fe_miit)->getFEUId()));
730 auto hi_miit =
732 get_id_for_max_type<MBENTITYSET>(), (*fe_miit)->getFEUId()));
733 const auto count = std::distance(miit, hi_miit);
734 MOFEM_LOG("SYNC", Sev::inform) << "Finite element " << fe_name
735 << " added. Nb. of elements added " << count;
737 }
738
739 *buildMoFEM |= 1 << 1;
741}
MoFEMErrorCode buildFiniteElements(const boost::shared_ptr< FiniteElement > &fe, const Range *ents_ptr=NULL, int verb=DEFAULT_VERBOSITY)
Definition FECore.cpp:459
UId getLocalUniqueIdCalculate() const
Generate UId for finite element entity.

◆ build_finite_elements() [3/3]

MoFEMErrorCode MoFEM::Core::build_finite_elements ( int verb = DEFAULT_VERBOSITY)
protectedvirtual

Build finite elements.

Build finite element data structures. Have to be run before problem and adjacencies are constructed.

Parameters
verbVerbosity level
Returns
Error code

Implements MoFEM::CoreInterface.

Definition at line 656 of file FECore.cpp.

656 {
658
659 if (verb == DEFAULT_VERBOSITY)
660 verb = verbose;
661
662 // loop Finite Elements
663 for (auto &fe : finiteElements)
664 CHKERR buildFiniteElements(fe, NULL, verb);
665
666 if (verb > QUIET) {
667
668 auto &fe_ents = entsFiniteElements.get<Unique_mi_tag>();
669 for (auto &fe : finiteElements) {
670 auto miit = fe_ents.lower_bound(
672 auto hi_miit =
674 get_id_for_max_type<MBENTITYSET>(), fe->getFEUId()));
675 const auto count = std::distance(miit, hi_miit);
676 MOFEM_LOG("SYNC", Sev::inform)
677 << "Finite element " << fe->getName()
678 << " added. Nb. of elements added " << count;
679 MOFEM_LOG("SYNC", Sev::noisy) << *fe;
680
681 auto slg = MoFEM::LogManager::getLog("SYNC");
682 for (auto &field : fIelds) {
683 auto rec = slg.open_record(keywords::severity = Sev::verbose);
684 if (rec) {
685 logging::record_ostream strm(rec);
686 strm << "Field " << field->getName() << " on finite element: ";
687 if ((field->getId() & fe->getBitFieldIdRow()).any())
688 strm << "row ";
689 if ((field->getId() & fe->getBitFieldIdCol()).any())
690 strm << "columns ";
691 if ((field->getId() & fe->getBitFieldIdData()).any())
692 strm << "data";
693 strm.flush();
694 slg.push_record(boost::move(rec));
695 }
696 }
697 }
698
700 }
701
702 *buildMoFEM |= 1 << 1;
704}
static LoggerType & getLog(const std::string channel)
Get logger by channel.

◆ build_problem_on_distributed_mesh()

MoFEMErrorCode MoFEM::Core::build_problem_on_distributed_mesh ( int verb = DEFAULT_VERBOSITY)
protected

Definition at line 257 of file ProblemsCore.cpp.

257 {
259 if (verb == -1)
260 verb = verbose;
261 Problem_multiIndex::iterator p_miit = pRoblems.begin();
262 for (; p_miit != pRoblems.end(); p_miit++) {
263 CHKERR getInterface<ProblemsManager>()->buildProblemOnDistributedMesh(
264 const_cast<Problem *>(&*p_miit), verb);
265 }
267}

◆ build_problems()

MoFEMErrorCode MoFEM::Core::build_problems ( int verb = DEFAULT_VERBOSITY)
protected

Definition at line 317 of file ProblemsCore.cpp.

317 {
319 if (verb == -1)
320 verb = verbose;
321 if (!((*buildMoFEM) & BUILD_FIELD))
322 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY, "fields not build");
323 if (!((*buildMoFEM) & BUILD_FE))
324 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY, "FEs not build");
325 if (!((*buildMoFEM) & BUILD_ADJ))
326 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY, "adjacencies not build");
327 // iterate problems
328 Problem_multiIndex::iterator p_miit = pRoblems.begin();
329 for (; p_miit != pRoblems.end(); p_miit++) {
330 Problem *problem_ptr = const_cast<Problem *>(&*p_miit);
331 CHKERR getInterface<ProblemsManager>()->buildProblem(problem_ptr, false,
332 verb);
333 }
336}

◆ buildField()

MoFEMErrorCode MoFEM::Core::buildField ( const boost::shared_ptr< Field > & field,
int verb = DEFAULT_VERBOSITY )
protected

Definition at line 1256 of file FieldCore.cpp.

1257 {
1259 if (verb == -1)
1260 verb = verbose;
1261 if (verb > QUIET)
1262 MOFEM_LOG("SYNC", Sev::verbose) << "Build field " << field->getName();
1263
1264 std::map<EntityType, int> dof_counter;
1265 std::map<EntityType, int> inactive_dof_counter;
1266
1267 // Need to rebuild order table since number of dofs on each order when
1268 // field was created.
1269 if (field->getApproxBase() == USER_BASE)
1270 CHKERR field->rebuildDofsOrderMap();
1271
1272 switch (field->getSpace()) {
1273 case NOFIELD:
1274 CHKERR this->buildFieldForNoField(field->getId(), dof_counter, verb);
1275 break;
1276 case L2:
1277 case H1:
1278 case HCURL:
1279 case HDIV:
1280 CHKERR this->buildFieldForL2H1HcurlHdiv(field->getId(), dof_counter,
1281 inactive_dof_counter, verb);
1282 break;
1283 default:
1284 SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_IMPLEMENTED, "not implemented");
1285 }
1286
1287 if (verb > QUIET) {
1288 int nb_added_dofs = 0;
1289 int nb_inactive_added_dofs = 0;
1290 for (auto const &it : dof_counter) {
1291 MOFEM_LOG("SYNC", Sev::verbose)
1292 << "Nb. of dofs (" << moab::CN::EntityTypeName(it.first) << ") "
1293 << it.second << " (inactive " << inactive_dof_counter[it.first]
1294 << ")";
1295 nb_added_dofs += it.second;
1296 nb_inactive_added_dofs += inactive_dof_counter[it.first];
1297 }
1298 MOFEM_LOG("SYNC", Sev::verbose)
1299 << "Nb. added dofs " << nb_added_dofs << " (number of inactive dofs "
1300 << nb_inactive_added_dofs << " )";
1301 }
1303}
@ USER_BASE
user implemented approximation base
Definition definitions.h:68
@ NOFIELD
scalar or vector of scalars describe (no true field)
Definition definitions.h:84
MoFEMErrorCode buildFieldForNoField(const BitFieldId id, std::map< EntityType, int > &dof_counter, int verb=DEFAULT_VERBOSITY)
MoFEMErrorCode buildFieldForL2H1HcurlHdiv(const BitFieldId id, std::map< EntityType, int > &dof_counter, std::map< EntityType, int > &inactive_dof_counter, int verb=DEFAULT_VERBOSITY)

◆ buildFieldForL2H1HcurlHdiv()

MoFEMErrorCode MoFEM::Core::buildFieldForL2H1HcurlHdiv ( const BitFieldId id,
std::map< EntityType, int > & dof_counter,
std::map< EntityType, int > & inactive_dof_counter,
int verb = DEFAULT_VERBOSITY )
protected

Definition at line 1144 of file FieldCore.cpp.

1146 {
1148 if (verb == -1)
1149 verb = verbose;
1150
1151 // Find field
1152 auto &set_id = fIelds.get<BitFieldId_mi_tag>();
1153 auto field_it = set_id.find(id);
1154 if (field_it == set_id.end()) {
1155 SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_FOUND, "Field not found");
1156 }
1157 const int bit_number = field_it->get()->getBitNumber();
1158 const int rank = field_it->get()->getNbOfCoeffs();
1159
1160 // Ents in the field meshset
1161 Range ents_of_id_meshset;
1162 CHKERR get_moab().get_entities_by_handle((*field_it)->meshSet,
1163 ents_of_id_meshset, false);
1164 if (verb > VERY_NOISY) {
1165 MOFEM_LOG_C("SYNC", Sev::noisy, "Ents in field %s meshset %d",
1166 (*field_it)->getName().c_str(), ents_of_id_meshset.size());
1167 }
1168
1169 for (auto p_eit = ents_of_id_meshset.pair_begin();
1170 p_eit != ents_of_id_meshset.pair_end(); ++p_eit) {
1171
1172 const EntityHandle first = p_eit->first;
1173 const EntityHandle second = p_eit->second;
1174 const auto lo_uid =
1175 FieldEntity::getLoLocalEntityBitNumber(bit_number, first);
1176 const auto hi_uid =
1177 FieldEntity::getHiLocalEntityBitNumber(bit_number, second);
1178
1179 auto feit = entsFields.get<Unique_mi_tag>().lower_bound(lo_uid);
1180 if (feit == entsFields.get<Unique_mi_tag>().end())
1181 continue;
1182 auto hi_feit = entsFields.get<Unique_mi_tag>().upper_bound(hi_uid);
1183
1184 // If there are DOFs in that range is more pragmatic to remove them
1185 // rather than to find sub-ranges or make them inactive
1186 auto dit = dofsField.get<Unique_mi_tag>().lower_bound(lo_uid);
1187 auto hi_dit = dofsField.get<Unique_mi_tag>().upper_bound(hi_uid);
1188 dofsField.get<Unique_mi_tag>().erase(dit, hi_dit);
1189
1190 // Add vertices DOFs by bulk
1191 boost::shared_ptr<std::vector<DofEntity>> dofs_array =
1192 boost::make_shared<std::vector<DofEntity>>(std::vector<DofEntity>());
1193 // Add Sequence of DOFs to sequence container as weak_ptr
1194 int nb_dofs_on_ents = 0;
1195 for (auto tmp_feit = feit; tmp_feit != hi_feit; ++tmp_feit) {
1196 nb_dofs_on_ents += rank * tmp_feit->get()->getOrderNbDofs(
1197 tmp_feit->get()->getMaxOrder());
1198 }
1199
1200 // Reserve memory
1201 dofs_array->reserve(nb_dofs_on_ents);
1202
1203 // Create DOFs
1204 for (; feit != hi_feit; ++feit) {
1205 // Create dofs instances and shared pointers
1206 int DD = 0;
1207 // Loop orders (loop until max entity order is set)
1208 for (int oo = 0; oo <= feit->get()->getMaxOrder(); ++oo) {
1209 // Loop nb. dofs at order oo
1210 for (int dd = 0; dd < feit->get()->getOrderNbDofsDiff(oo); ++dd) {
1211 // Loop rank
1212 for (int rr = 0; rr < rank; ++rr, ++DD) {
1213 dofs_array->emplace_back(*feit, oo, rr, DD);
1214 ++dof_counter[feit->get()->getEntType()];
1215 }
1216 }
1217 }
1218 if (DD > feit->get()->getNbDofsOnEnt()) {
1219 std::ostringstream ss;
1220 ss << "rank " << rAnk << " ";
1221 ss << **feit << std::endl;
1222 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
1223 "Expected number of DOFs on entity not equal to number added "
1224 "to database (DD = %d != %d = "
1225 "feit->get()->getNbDofsOnEnt())\n"
1226 "%s",
1227 DD, feit->get()->getNbDofsOnEnt(), ss.str().c_str());
1228 }
1229 }
1230
1231 // Insert into Multi-Index container
1232 int dofs_field_size0 = dofsField.size();
1233 auto hint = dofsField.end();
1234 for (auto &v : *dofs_array)
1235 hint = dofsField.emplace_hint(hint, dofs_array, &v);
1236
1237 // Add Sequence of DOFs to sequence container as weak_ptr
1238 field_it->get()->getDofSequenceContainer().push_back(dofs_array);
1239
1240 // Check data consistency
1241 if (PetscUnlikely(static_cast<int>(dofs_array.use_count()) !=
1242 static_cast<int>(dofs_array->size() + 1))) {
1243 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
1244 "Wrong use count %ld != %ld", dofs_array.use_count(),
1245 dofs_array->size() + 1);
1246 }
1247 if (dofs_field_size0 + dofs_array->size() != dofsField.size()) {
1248 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
1249 "Wrong number of inserted DOFs %ld != %ld", dofs_array->size(),
1250 dofsField.size() - dofs_field_size0);
1251 }
1252 }
1254}
@ VERY_NOISY
const double v
phase velocity of light in medium (cm/ns)
static int getMaxOrder(const ENTMULTIINDEX &multi_index)
FieldEntity_multiIndex entsFields
entities on fields
Definition Core.hpp:304
static UId getLoLocalEntityBitNumber(const char bit_number, const EntityHandle ent)
static UId getHiLocalEntityBitNumber(const char bit_number, const EntityHandle ent)

◆ buildFieldForNoField()

MoFEMErrorCode MoFEM::Core::buildFieldForNoField ( const BitFieldId id,
std::map< EntityType, int > & dof_counter,
int verb = DEFAULT_VERBOSITY )
protected

Definition at line 1121 of file FieldCore.cpp.

1122 {
1124
1125 if (verb == -1)
1126 verb = verbose;
1127
1128 // find fields
1129 auto field_it = fIelds.get<BitFieldId_mi_tag>().find(id);
1130 if (field_it == fIelds.get<BitFieldId_mi_tag>().end())
1131 SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_FOUND, "Field not found");
1132
1133 if (verb > QUIET)
1134 MOFEM_LOG("WORLD", Sev::noisy)
1135 << "Field " << (*field_it)->getName() << " core value < "
1136 << this->getValue() << " > field value () "
1137 << (*field_it)->getBitNumber() << " )";
1138
1139 CHKERR this->buildFieldForNoFieldImpl(*field_it, dof_counter, verb);
1140
1142}
MoFEMErrorCode buildFieldForNoFieldImpl(boost::shared_ptr< Field > field_ptr, std::map< EntityType, int > &dof_counter, int verb)

◆ buildFieldForNoFieldImpl()

MoFEMErrorCode MoFEM::Core::buildFieldForNoFieldImpl ( boost::shared_ptr< Field > field_ptr,
std::map< EntityType, int > & dof_counter,
int verb )
protected

Definition at line 1016 of file FieldCore.cpp.

1018 {
1020
1021 const auto bit_number = field_ptr->getBitNumber();
1022
1023 // ents in the field meshset
1024 Range ents;
1025 CHKERR get_moab().get_entities_by_handle(field_ptr->getMeshset(), ents,
1026 false);
1027 if (verb > VERBOSE)
1028 MOFEM_LOG_C("SYNC", Sev::noisy, "Ents in field %s meshset %d\n",
1029 field_ptr->getName().c_str(), ents.size());
1030
1031 // ent view by field id (in set all MoabEnts has the same FieldId)
1032 auto eiit = entsFields.get<Unique_mi_tag>().lower_bound(
1033 FieldEntity::getLoBitNumberUId(field_ptr->getBitNumber()));
1035 if (eiit != entsFields.get<Unique_mi_tag>().end()) {
1036 auto hi_eiit = entsFields.get<Unique_mi_tag>().upper_bound(
1037 FieldEntity::getHiBitNumberUId(field_ptr->getBitNumber()));
1038 std::copy(eiit, hi_eiit, std::back_inserter(ents_id_view));
1039 }
1040
1041 boost::shared_ptr<const int> zero_order(new const int(0));
1042
1043 for (auto ent : ents) {
1044 // search if field meshset is in database
1045 auto ref_ent_it = refinedEntities.get<Ent_mi_tag>().find(ent);
1046 if (ref_ent_it == refinedEntities.get<Ent_mi_tag>().end())
1047 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
1048 "Entity is not in MoFEM database, entities in field meshset need "
1049 "to be seeded (i.e. bit ref level add to them)");
1050
1051 auto add_dofs = [&](auto field_eit) {
1053 // create dofs on this entity (nb. of dofs is equal to rank)
1054 for (FieldCoefficientsNumber rank = 0; rank < field_ptr->getNbOfCoeffs();
1055 rank++) {
1056 // insert dof
1057 auto p = dofsField.insert(
1058 boost::make_shared<DofEntity>(field_eit, 0, rank, rank));
1059 if (p.second) {
1060 dof_counter[MBENTITYSET]++; // Count entities in the meshset
1061 } else
1062 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
1063 "Dof expected to be created");
1064 }
1066 };
1067
1068 // create database entity
1069 auto field_ent_it = ents_id_view.get<1>().find(ent);
1070 if (field_ent_it == ents_id_view.get<1>().end()) {
1071
1072 auto p = entsFields.insert(
1073
1074 boost::make_shared<FieldEntity>(
1075 field_ptr, *ref_ent_it,
1077 *ref_ent_it),
1078 boost::shared_ptr<const int>(zero_order, zero_order.get()))
1079
1080 );
1081
1082 if ((*p.first)->getFieldRawPtr() != field_ptr.get())
1083 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
1084 "Get field ent poiter and field pointer do not match for "
1085 "field %s",
1086 field_ptr->getName().c_str());
1087
1088 if (!p.second)
1089 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
1090 "Entity should be created");
1091
1092 CHKERR add_dofs(*(p.first));
1093
1094 } else {
1095
1096 // If there are DOFs in that range is more pragmatic to remove them
1097 // rather than to find sub-ranges or make them inactive
1098 auto dit = dofsField.get<Unique_mi_tag>().lower_bound(
1100 auto hi_dit = dofsField.get<Unique_mi_tag>().upper_bound(
1102 dofsField.get<Unique_mi_tag>().erase(dit, hi_dit);
1103 CHKERR add_dofs(*field_ent_it);
1104 }
1105 }
1106
1107 if (verb > VERBOSE) {
1108 auto lo_dof = dofsField.get<Unique_mi_tag>().lower_bound(
1109 FieldEntity::getLoBitNumberUId(field_ptr->getBitNumber()));
1110 auto hi_dof = dofsField.get<Unique_mi_tag>().upper_bound(
1111 FieldEntity::getHiBitNumberUId(field_ptr->getBitNumber()));
1112 for (; lo_dof != hi_dof; lo_dof++)
1113 MOFEM_LOG("SYNC", Sev::noisy) << **lo_dof;
1115 }
1116
1118}
#define MOFEM_LOG_SEVERITY_SYNC(comm, severity)
Synchronise "SYNC" on curtain severity level.
int FieldCoefficientsNumber
Number of field coefficients.
Definition Types.hpp:27
multi_index_container< boost::shared_ptr< FieldEntity >, indexed_by< sequenced<>, ordered_non_unique< tag< Ent_mi_tag >, const_mem_fun< FieldEntity::interface_type_RefEntity, EntityHandle, &FieldEntity::getEnt > > > > FieldEntity_multiIndex_ent_view
static UId getHiBitNumberUId(const FieldBitNumber bit_number)
static boost::shared_ptr< FieldData *const > makeSharedFieldDataAdaptorPtr(const boost::shared_ptr< Field > &field_ptr, const boost::shared_ptr< RefEntity > &ref_ents_ptr)
Return shared pointer to entity field data vector adaptor.
static UId getLoBitNumberUId(const FieldBitNumber bit_number)

◆ buildFiniteElements()

MoFEMErrorCode MoFEM::Core::buildFiniteElements ( const boost::shared_ptr< FiniteElement > & fe,
const Range * ents_ptr = NULL,
int verb = DEFAULT_VERBOSITY )
protected

Definition at line 459 of file FECore.cpp.

460 {
462 if (verb == DEFAULT_VERBOSITY)
463 verb = verbose;
464
465 if (verb > QUIET)
466 MOFEM_LOG("SYNC", Sev::verbose)
467 << "Build Finite Elements " << fe->getName();
468
469 auto &fields_by_id = fIelds.get<BitFieldId_mi_tag>();
470
471 // Get id of mofem fields for row, col and data
472 enum IntLoop { ROW = 0, COL, DATA, LAST };
473 std::array<BitFieldId, LAST> fe_fields = {fe.get()->getBitFieldIdRow(),
474 fe.get()->getBitFieldIdCol(),
475 fe.get()->getBitFieldIdData()};
476
477 // Get finite element meshset
478 EntityHandle meshset = get_finite_element_meshset(fe.get()->getId());
479
480 // Get entities from finite element meshset // if meshset
481 Range fe_ents;
482 CHKERR get_moab().get_entities_by_handle(meshset, fe_ents, false);
483
484 if (ents_ptr)
485 fe_ents = intersect(fe_ents, *ents_ptr);
486
487 // Map entity uid to pointers
488 typedef std::vector<boost::weak_ptr<EntFiniteElement>> VecOfWeakFEPtrs;
489 VecOfWeakFEPtrs processed_fes;
490 processed_fes.reserve(fe_ents.size());
491
492 int last_data_field_ents_view_size = 0;
493 int last_row_field_ents_view_size = 0;
494 int last_col_field_ents_view_size = 0;
495
496 // Entities adjacent to entities
497 std::vector<EntityHandle> adj_ents;
498
499 // Loop meshset finite element ents and add finite elements
500 for (Range::const_pair_iterator peit = fe_ents.const_pair_begin();
501 peit != fe_ents.const_pair_end(); peit++) {
502
503 const auto first = peit->first;
504 const auto second = peit->second;
505
506 // Find range of ref entities that is sequence
507 // note: iterator is a wrapper
508 // check if is in refinedFiniteElements database
509 auto ref_fe_miit =
510 refinedFiniteElements.get<Ent_mi_tag>().lower_bound(first);
511 auto hi_ref_fe_miit =
512 refinedFiniteElements.get<Ent_mi_tag>().upper_bound(second);
513 if (std::distance(ref_fe_miit, hi_ref_fe_miit) != (second - first + 1)) {
514 MOFEM_LOG("SELF", Sev::noisy) << "Finite element " << fe->getName()
515 << " not defined on all entities in "
516 "the meshset, missing entities";
517 MOFEM_LOG("SELF", Sev::noisy)
518 << "Missing entities: " << first << " - " << second;
519 }
520
521 EntFiniteElement_multiIndex::iterator hint_p = entsFiniteElements.end();
522 for (; ref_fe_miit != hi_ref_fe_miit; ref_fe_miit++) {
523
524 // Add finite element to database
525 hint_p = entsFiniteElements.emplace_hint(
526 hint_p, boost::make_shared<EntFiniteElement>(*ref_fe_miit, fe));
527 processed_fes.emplace_back(*hint_p);
528 auto fe_raw_ptr = hint_p->get();
529
530 // Allocate space for entities view
531 bool row_as_data = false, col_as_row = false;
532 if (fe_fields[DATA] == fe_fields[ROW])
533 row_as_data = true;
534 if (fe_fields[ROW] == fe_fields[COL])
535 col_as_row = true;
536
537 fe_raw_ptr->getDataFieldEntsPtr()->reserve(
538 last_data_field_ents_view_size);
539
540 if (row_as_data) {
541 fe_raw_ptr->getRowFieldEntsPtr() = fe_raw_ptr->getDataFieldEntsPtr();
542 } else {
543 // row and col are different
544 if (fe_raw_ptr->getRowFieldEntsPtr() ==
545 fe_raw_ptr->getDataFieldEntsPtr())
546 fe_raw_ptr->getRowFieldEntsPtr() =
547 boost::make_shared<FieldEntity_vector_view>();
548 fe_raw_ptr->getRowFieldEntsPtr()->reserve(
549 last_row_field_ents_view_size);
550 }
551
552 if (row_as_data && col_as_row) {
553 fe_raw_ptr->getColFieldEntsPtr() = fe_raw_ptr->getDataFieldEntsPtr();
554 } else if (col_as_row) {
555 fe_raw_ptr->getColFieldEntsPtr() = fe_raw_ptr->getRowFieldEntsPtr();
556 } else {
557 if (
558
559 fe_raw_ptr->getColFieldEntsPtr() ==
560 fe_raw_ptr->getRowFieldEntsPtr() ||
561 fe_raw_ptr->getColFieldEntsPtr() ==
562 fe_raw_ptr->getDataFieldEntsPtr()
563
564 )
565 fe_raw_ptr->getColFieldEntsPtr() =
566 boost::make_shared<FieldEntity_vector_view>();
567 fe_raw_ptr->getColFieldEntsPtr()->reserve(
568 last_col_field_ents_view_size);
569 }
570
571 // Iterate over all field and check which one is on the element
572 for (unsigned int ii = 0; ii != BitFieldId().size(); ++ii) {
573
574 // Common field id for ROW, COL and DATA
575 BitFieldId id_common = 0;
576 // Check if the field (ii) is added to finite element
577 for (int ss = 0; ss < LAST; ss++) {
578 id_common |= fe_fields[ss] & BitFieldId().set(ii);
579 }
580 if (id_common.none())
581 continue;
582
583 // Find in database data associated with the field (ii)
584 const BitFieldId field_id = BitFieldId().set(ii);
585 auto miit = fields_by_id.find(field_id);
586 if (miit == fields_by_id.end())
587 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY, "Field not found");
588 auto field_bit_number = (*miit)->getBitNumber();
589
590 // Loop over adjacencies of element and find field entities on those
591 // adjacencies, that create hash map map_uid_fe which is used later
592 const std::string field_name = miit->get()->getName();
593 const bool add_to_data = (field_id & fe_fields[DATA]).any();
594 const bool add_to_row = (field_id & fe_fields[ROW]).any();
595 const bool add_to_col = (field_id & fe_fields[COL]).any();
596
597 // Resolve entities on element, those entities are used to build tag
598 // with dof uids on finite element tag
599 adj_ents.clear();
600 CHKERR fe_raw_ptr->getElementAdjacency(*miit, adj_ents);
601
602 for (auto ent : adj_ents) {
603
604 auto dof_it = entsFields.get<Unique_mi_tag>().find(
605 FieldEntity::getLocalUniqueIdCalculate(field_bit_number, ent));
606 if (dof_it != entsFields.get<Unique_mi_tag>().end()) {
607
608 if (add_to_data) {
609 fe_raw_ptr->getDataFieldEntsPtr()->emplace_back(*dof_it);
610 }
611 if (add_to_row && !row_as_data) {
612 fe_raw_ptr->getRowFieldEntsPtr()->emplace_back(*dof_it);
613 }
614 if (add_to_col && !col_as_row) {
615 fe_raw_ptr->getColFieldEntsPtr()->emplace_back(*dof_it);
616 }
617
618 }
619 }
620 }
621
622 // Sort field ents by uid
623 auto uid_comp = [](const auto &a, const auto &b) {
624 return a.lock()->getLocalUniqueId() < b.lock()->getLocalUniqueId();
625 };
626
627 // Sort all views
628
629 // Data
630 sort(fe_raw_ptr->getDataFieldEntsPtr()->begin(),
631 fe_raw_ptr->getDataFieldEntsPtr()->end(), uid_comp);
632 last_data_field_ents_view_size =
633 fe_raw_ptr->getDataFieldEntsPtr()->size();
634
635 // Row
636 if (!row_as_data) {
637 sort(fe_raw_ptr->getRowFieldEntsPtr()->begin(),
638 fe_raw_ptr->getRowFieldEntsPtr()->end(), uid_comp);
639 last_row_field_ents_view_size =
640 fe_raw_ptr->getRowFieldEntsPtr()->size();
641 }
642
643 // Column
644 if (!col_as_row) {
645 sort(fe_raw_ptr->getColFieldEntsPtr()->begin(),
646 fe_raw_ptr->getColFieldEntsPtr()->end(), uid_comp);
647 last_col_field_ents_view_size =
648 fe_raw_ptr->getColFieldEntsPtr()->size();
649 }
650 }
651 }
652
654}
constexpr double a
@ COL
@ DATA
@ ROW
UId getLocalUniqueIdCalculate()
Get the Local Unique Id Calculate object.

◆ cache_problem_entities()

MoFEMErrorCode MoFEM::Core::cache_problem_entities ( const std::string prb_name,
CacheTupleWeakPtr cache_ptr )
protectedvirtual

Cache variables.

Parameters
prb_name
cache_ptr
Returns
MoFEMErrorCode

Implements MoFEM::CoreInterface.

Definition at line 798 of file ProblemsCore.cpp.

799 {
801
802 if (auto cache_ptr = cache_weak_ptr.lock()) {
803 auto p_miit = pRoblems.get<Problem_mi_tag>().find(prb_name);
804 if (p_miit == pRoblems.get<Problem_mi_tag>().end())
805 SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_FOUND, "problem not in database %s",
806 prb_name.c_str());
807
808 const BitRefLevel &prb_bit = p_miit->getBitRefLevel();
809 const BitRefLevel &prb_mask = p_miit->getBitRefLevelMask();
810 const BitFEId &prb_fe_id = p_miit->getBitFEId();
811
812 auto &row_dofs = p_miit->numeredRowDofsPtr;
813 auto &col_dofs = p_miit->numeredColDofsPtr;
814
815 auto &cache_data = std::get<0>(*cache_ptr);
816 auto &cache_row = std::get<1>(*cache_ptr);
817 auto &cache_col = std::get<2>(*cache_ptr);
818
819 cache_row.resize(entsFields.size());
820 if (row_dofs != col_dofs)
821 cache_col.resize(entsFields.size());
822 cache_data.resize(entsFields.size());
823
824 size_t idx = 0;
825 for (auto it = entsFields.begin(); it != entsFields.end(); ++it, ++idx) {
826
827 const auto uid = (*it)->getLocalUniqueId();
828 auto r = entFEAdjacencies.get<Unique_mi_tag>().equal_range(uid);
829 for (auto lo = r.first; lo != r.second; ++lo) {
830
831 if ((lo->getBitFEId() & prb_fe_id).any()) {
832
833 const BitRefLevel &fe_bit = lo->entFePtr->getBitRefLevel();
834
835 // if entity is not problem refinement level
836 if (((fe_bit & prb_mask) != fe_bit) || ((fe_bit & prb_bit).none()))
837 continue;
838
839 auto cache_numered_dofs = [&](auto &numered_dofs, auto &cache_vec,
840 auto &ent_cache) {
841 auto dit = numered_dofs->lower_bound(uid);
842 decltype(dit) hi_dit;
843 if (dit != numered_dofs->end())
844 hi_dit = numered_dofs->upper_bound(
845 uid | static_cast<UId>(MAX_DOFS_ON_ENTITY - 1));
846 else
847 hi_dit = dit;
848
849 ent_cache = boost::shared_ptr<EntityCacheNumeredDofs>(
850 cache_ptr, &(cache_vec[idx]));
851 cache_vec[idx].loHi = {dit, hi_dit};
852 };
853
854 auto cache_dofs = [&](auto &dofs, auto &cache_vec, auto &ent_cache) {
855 auto dit = dofs.lower_bound(uid);
856 decltype(dit) hi_dit;
857 if (dit != dofs.end())
858 hi_dit = dofs.upper_bound(
859 uid | static_cast<UId>(MAX_DOFS_ON_ENTITY - 1));
860 else
861 hi_dit = dit;
862
863 ent_cache = boost::shared_ptr<EntityCacheDofs>(cache_ptr,
864 &(cache_vec[idx]));
865 cache_vec[idx].loHi = {dit, hi_dit};
866 };
867
868 cache_numered_dofs(row_dofs, cache_row, (*it)->entityCacheRowDofs);
869 if (row_dofs != col_dofs) {
870 if (cache_col.size() != entsFields.size())
871 cache_col.resize(entsFields.size());
872 cache_numered_dofs(col_dofs, cache_col, (*it)->entityCacheColDofs);
873 } else {
874 (*it)->entityCacheColDofs = (*it)->entityCacheRowDofs;
875 }
876
877 cache_dofs(dofsField, cache_data, (*it)->entityCacheDataDofs);
878
879 break;
880 }
881 }
882 }
883 } else {
884 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY, "Cache not allocated");
885 }
886
888}
#define MAX_DOFS_ON_ENTITY
Maximal number of DOFs on entity.
uint128_t UId
Unique Id.
Definition Types.hpp:31
int r
Definition sdf.py:8

◆ check_field()

bool MoFEM::Core::check_field ( const std::string & name) const
protectedvirtual

check if field is in database

Parameters
namefield name
Returns
true if field exist

Implements MoFEM::CoreInterface.

Definition at line 57 of file FieldCore.cpp.

57 {
58 auto miit = fIelds.get<FieldName_mi_tag>().find(name);
59 if (miit == fIelds.get<FieldName_mi_tag>().end())
60 return false;
61 else
62 return true;
63}

◆ check_finite_element()

bool MoFEM::Core::check_finite_element ( const std::string & name) const
protectedvirtual

Check if finite element is in database.

Parameters
nameName of finite element
Returns
true if element is declared

Implements MoFEM::CoreInterface.

Definition at line 35 of file FECore.cpp.

35 {
36 auto miit = finiteElements.get<FiniteElement_name_mi_tag>().find(name);
37 if (miit == finiteElements.get<FiniteElement_name_mi_tag>().end())
38 return false;
39 else
40 return true;
41}

◆ check_number_of_ents_in_ents_field() [1/2]

MoFEMErrorCode MoFEM::Core::check_number_of_ents_in_ents_field ( ) const
protectedvirtual

check data consistency in entitiesPtr

Implements MoFEM::CoreInterface.

Definition at line 1437 of file FieldCore.cpp.

1437 {
1439 for (auto &it : fIelds.get<FieldName_mi_tag>()) {
1440 if (it->getSpace() == NOFIELD)
1441 continue; // FIXME: should be treated properly, not test is just
1442 // skipped for this NOFIELD space
1443 EntityHandle meshset = it->getMeshset();
1444 int num_entities;
1445 CHKERR get_moab().get_number_entities_by_handle(meshset, num_entities);
1446
1447 auto count_field_ents = [&]() {
1448 auto bit_number = it->getBitNumber();
1449 auto low_eit = entsFields.get<Unique_mi_tag>().lower_bound(
1450 FieldEntity::getLoBitNumberUId(bit_number));
1451 auto hi_eit = entsFields.get<Unique_mi_tag>().upper_bound(
1452 FieldEntity::getHiBitNumberUId(bit_number));
1453 return std::distance(low_eit, hi_eit);
1454 };
1455
1456 if (count_field_ents() > (unsigned int)num_entities) {
1457 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
1458 "not equal number of entities in meshset and field "
1459 "multiindex < %s >",
1460 it->getName().c_str());
1461 }
1462 }
1464}

◆ check_number_of_ents_in_ents_field() [2/2]

MoFEMErrorCode MoFEM::Core::check_number_of_ents_in_ents_field ( const std::string & name) const
protectedvirtual

check data consistency in entitiesPtr

Implements MoFEM::CoreInterface.

Definition at line 1409 of file FieldCore.cpp.

1409 {
1411 auto it = fIelds.get<FieldName_mi_tag>().find(name);
1412 if (it == fIelds.get<FieldName_mi_tag>().end()) {
1413 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
1414 "field not found < %s >", name.c_str());
1415 }
1416 EntityHandle meshset = (*it)->getMeshset();
1417 int num_entities;
1418 CHKERR get_moab().get_number_entities_by_handle(meshset, num_entities);
1419
1420 auto count_field_ents = [&]() {
1421 auto bit_number = (*it)->getBitNumber();
1422 auto low_eit = entsFields.get<Unique_mi_tag>().lower_bound(
1423 FieldEntity::getLoBitNumberUId(bit_number));
1424 auto hi_eit = entsFields.get<Unique_mi_tag>().upper_bound(
1425 FieldEntity::getHiBitNumberUId(bit_number));
1426 return std::distance(low_eit, hi_eit);
1427 };
1428
1429 if (count_field_ents() > (unsigned int)num_entities) {
1430 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
1431 "not equal number of entities in meshset and field multiindex "
1432 "< %s >",
1433 name.c_str());
1434 }
1436}

◆ check_number_of_ents_in_ents_finite_element() [1/2]

MoFEMErrorCode MoFEM::Core::check_number_of_ents_in_ents_finite_element ( ) const
protectedvirtual

check data consistency in entsFiniteElements

Implements MoFEM::CoreInterface.

Definition at line 886 of file FECore.cpp.

886 {
888 FiniteElement_multiIndex::index<FiniteElement_name_mi_tag>::type::iterator it;
889 it = finiteElements.get<FiniteElement_name_mi_tag>().begin();
890 for (; it != finiteElements.get<FiniteElement_name_mi_tag>().end(); it++) {
891 EntityHandle meshset = (*it)->getMeshset();
892
893 int num_entities;
894 CHKERR get_moab().get_number_entities_by_handle(meshset, num_entities);
895
896 auto counts_fes = [&]() {
897 return std::distance(get_fe_by_name_begin((*it)->getName()),
898 get_fe_by_name_end((*it)->getName()));
899 };
900
901 if (counts_fes() != static_cast<size_t>(num_entities)) {
903 "not equal number of entities in meshset and finite elements "
904 "multiindex < %s >",
905 (*it)->getName().c_str());
906 }
907 }
909}
EntFiniteElement_multiIndex::index< Unique_mi_tag >::type::iterator get_fe_by_name_end(const std::string &fe_name) const
get end iterator of finite elements of given name (instead you can use IT_GET_FES_BY_NAME_FOR_LOOP(MF...
Definition FECore.cpp:848
EntFiniteElement_multiIndex::index< Unique_mi_tag >::type::iterator get_fe_by_name_begin(const std::string &fe_name) const
get begin iterator of finite elements of given name (instead you can use IT_GET_FES_BY_NAME_FOR_LOOP(...
Definition FECore.cpp:837

◆ check_number_of_ents_in_ents_finite_element() [2/2]

MoFEMErrorCode MoFEM::Core::check_number_of_ents_in_ents_finite_element ( const std::string & name) const
protectedvirtual

check data consistency in entsFiniteElements

Implements MoFEM::CoreInterface.

Definition at line 859 of file FECore.cpp.

860 {
862 FiniteElement_multiIndex::index<FiniteElement_name_mi_tag>::type::iterator it;
863 it = finiteElements.get<FiniteElement_name_mi_tag>().find(name);
864 if (it == finiteElements.get<FiniteElement_name_mi_tag>().end()) {
865 SETERRQ(mofemComm, 1, "finite element not found < %s >", name.c_str());
866 }
867 EntityHandle meshset = (*it)->getMeshset();
868
869 int num_entities;
870 CHKERR get_moab().get_number_entities_by_handle(meshset, num_entities);
871
872 auto counts_fes = [&]() {
873 return std::distance(get_fe_by_name_begin((*it)->getName()),
874 get_fe_by_name_end((*it)->getName()));
875 };
876
877 if (counts_fes() != static_cast<size_t>(num_entities)) {
879 "not equal number of entities in meshset and finite elements "
880 "multiindex < %s >",
881 (*it)->getName().c_str());
882 }
884}

◆ check_problem()

bool MoFEM::CoreTmp< 0 >::check_problem ( const std::string name)
protectedvirtual

check if problem exist

Parameters
nameproblem name
Returns
true if problem is in database

Implements MoFEM::CoreInterface.

◆ clear_adjacencies_entities() [1/3]

MoFEMErrorCode MoFEM::Core::clear_adjacencies_entities ( const BitRefLevel bit,
const BitRefLevel mask,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

clear adjacency map for entities on given bit level

Parameters
bit
mask

Implements MoFEM::CoreInterface.

Definition at line 201 of file DeleteCore.cpp.

203 {
205 if (verb == -1)
206 verb = verbose;
207 Range ents;
208 CHKERR BitRefManager(*this).getEntitiesByRefLevel(bit, mask, ents, verb);
211}
MoFEMErrorCode clear_adjacencies_entities(const BitRefLevel bit, const BitRefLevel mask, int verb=DEFAULT_VERBOSITY)
clear adjacency map for entities on given bit level

◆ clear_adjacencies_entities() [2/3]

MoFEMErrorCode MoFEM::Core::clear_adjacencies_entities ( const Range ents,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

clear adjacencies for field entities by entities

Implements MoFEM::CoreInterface.

Definition at line 213 of file DeleteCore.cpp.

213 {
215 if (verb == -1)
216 verb = verbose;
217 for (Range::const_pair_iterator p_eit = ents.pair_begin();
218 p_eit != ents.pair_end(); ++p_eit) {
219 const EntityHandle first = p_eit->first;
220 const EntityHandle second = p_eit->second;
221 FieldEntityEntFiniteElementAdjacencyMap_multiIndex::index<
222 Ent_mi_tag>::type::iterator ait,
223 hi_ait;
224 ait = entFEAdjacencies.get<Ent_mi_tag>().lower_bound(first);
225 hi_ait = entFEAdjacencies.get<Ent_mi_tag>().upper_bound(second);
226 entFEAdjacencies.get<Ent_mi_tag>().erase(ait, hi_ait);
227 }
229}

◆ clear_adjacencies_entities() [3/3]

MoFEMErrorCode MoFEM::Core::clear_adjacencies_entities ( const std::string name,
const Range ents,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

clear adjacencies for field entities by entities and field namd

Implements MoFEM::CoreInterface.

Definition at line 231 of file DeleteCore.cpp.

232 {
234 if (verb == -1)
235 verb = verbose;
236
237 const Field *field_ptr = get_field_structure(name);
238 int field_bit_number = field_ptr->getBitNumber();
239
240 for (Range::const_pair_iterator p_eit = ents.pair_begin();
241 p_eit != ents.pair_end(); p_eit++) {
242
243 // First and last handle
244 const EntityHandle first = p_eit->first;
245 const EntityHandle second = p_eit->second;
246
247 // Get UId
248 UId first_uid =
249 FieldEntity::getLocalUniqueIdCalculate(field_bit_number, first);
250 UId second_uid =
251 FieldEntity::getLocalUniqueIdCalculate(field_bit_number, second);
252
253 // Find adjacencies
254 auto ait = entFEAdjacencies.get<Unique_mi_tag>().lower_bound(first_uid);
255 auto hi_ait = entFEAdjacencies.get<Unique_mi_tag>().upper_bound(second_uid);
256 entFEAdjacencies.get<Unique_mi_tag>().erase(ait, hi_ait);
257 }
259}
const Field * get_field_structure(const std::string &name, enum MoFEMTypes bh=MF_EXIST) const
get field structure
Definition FieldCore.cpp:65

◆ clear_adjacencies_finite_elements() [1/3]

MoFEMErrorCode MoFEM::Core::clear_adjacencies_finite_elements ( const BitRefLevel bit,
const BitRefLevel mask,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

clear adjacency map for finite elements on given bit level

Parameters
bit
mask

Implements MoFEM::CoreInterface.

Definition at line 312 of file DeleteCore.cpp.

314 {
316 Range ents;
317 CHKERR BitRefManager(*this).getEntitiesByRefLevel(bit, mask, ents, verb);
320}
MoFEMErrorCode clear_adjacencies_finite_elements(const BitRefLevel bit, const BitRefLevel mask, int verb=DEFAULT_VERBOSITY)
clear adjacency map for finite elements on given bit level

◆ clear_adjacencies_finite_elements() [2/3]

MoFEMErrorCode MoFEM::Core::clear_adjacencies_finite_elements ( const Range ents,
int verb = DEFAULT_VERBOSITY )
protected

Definition at line 322 of file DeleteCore.cpp.

323 {
325 if (verb == -1)
326 verb = verbose;
327 for (Range::const_pair_iterator p_eit = ents.pair_begin();
328 p_eit != ents.pair_end(); p_eit++) {
329 EntityHandle first = p_eit->first;
330 EntityHandle second = p_eit->second;
331 FieldEntityEntFiniteElementAdjacencyMap_multiIndex::index<
332 FEEnt_mi_tag>::type::iterator ait,
333 hi_ait;
334 ait = entFEAdjacencies.get<FEEnt_mi_tag>().lower_bound(first);
335 hi_ait = entFEAdjacencies.get<FEEnt_mi_tag>().upper_bound(second);
336 entFEAdjacencies.get<FEEnt_mi_tag>().erase(ait, hi_ait);
337 }
339}

◆ clear_adjacencies_finite_elements() [3/3]

MoFEMErrorCode MoFEM::Core::clear_adjacencies_finite_elements ( const std::string name,
const Range ents,
int verb = DEFAULT_VERBOSITY )
protected

Definition at line 341 of file DeleteCore.cpp.

343 {
345 if (verb == -1)
346 verb = verbose;
347
348 FiniteElement_multiIndex::index<FiniteElement_name_mi_tag>::type::iterator
349 it_fe = finiteElements.get<FiniteElement_name_mi_tag>().find(name);
350 if (it_fe != finiteElements.get<FiniteElement_name_mi_tag>().end()) {
351
352 const auto fe_uid = (*it_fe)->getFEUId();
353
354 for (Range::const_pair_iterator p_eit = ents.pair_begin();
355 p_eit != ents.pair_end(); p_eit++) {
356
357 // First and last handle
358 const EntityHandle first = p_eit->first;
359 const EntityHandle second = p_eit->second;
360
361 // Get UId
362 UId first_uid =
364 UId second_uid =
366
367 // Find and remove adjacencies
368 FieldEntityEntFiniteElementAdjacencyMap_multiIndex::index<
369 FE_Unique_mi_tag>::type::iterator ait,
370 hi_ait;
371 ait = entFEAdjacencies.get<FE_Unique_mi_tag>().lower_bound(first_uid);
372 hi_ait = entFEAdjacencies.get<FE_Unique_mi_tag>().upper_bound(second_uid);
373 entFEAdjacencies.get<FE_Unique_mi_tag>().erase(ait, hi_ait);
374 }
375 }
377}

◆ clear_database()

MoFEMErrorCode MoFEM::Core::clear_database ( int verb = DEFAULT_VERBOSITY)
protectedvirtual

Clear database.

Parameters
verbVerbosity level
Returns
Error code

Implements MoFEM::CoreInterface.

Definition at line 750 of file Core.cpp.

750 {
752 if (verb == -1)
753 verb = verbose;
756}

◆ clear_dofs_fields() [1/2]

MoFEMErrorCode MoFEM::Core::clear_dofs_fields ( const Range ents,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Clear dofs by ents

Implements MoFEM::CoreInterface.

Definition at line 57 of file DeleteCore.cpp.

57 {
59 if (verb == -1)
60 verb = verbose;
61
62 for (Range::const_pair_iterator p_eit = ents.pair_begin();
63 p_eit != ents.pair_end(); p_eit++) {
64 EntityHandle first = p_eit->first;
65 EntityHandle second = p_eit->second;
66 // get dofs range
67 DofEntityByEnt::iterator dit, hi_dit;
68 dit = dofsField.get<Ent_mi_tag>().lower_bound(first);
69 if (dit == dofsField.get<Ent_mi_tag>().end())
70 continue;
71 hi_dit = dofsField.get<Ent_mi_tag>().upper_bound(second);
72 // finally clear dofs
73 dofsField.get<Ent_mi_tag>().erase(dit, hi_dit);
74 }
76}

◆ clear_dofs_fields() [2/2]

MoFEMErrorCode MoFEM::Core::clear_dofs_fields ( const std::string name,
const Range ents,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Clear dofs by field name and ents

Implements MoFEM::CoreInterface.

Definition at line 78 of file DeleteCore.cpp.

79 {
81 if (verb == -1)
82 verb = verbose;
83
84 const auto bit_number = get_field_bit_number(name);
85
86 for (Range::const_pair_iterator p_eit = ents.pair_begin();
87 p_eit != ents.pair_end(); p_eit++) {
88 const auto first = p_eit->first;
89 const auto second = p_eit->second;
90 const auto lo_uid = DofEntity::getLoFieldEntityUId(bit_number, first);
91 const auto hi_uid = DofEntity::getHiFieldEntityUId(bit_number, second);
92 auto dit = dofsField.get<Unique_mi_tag>().lower_bound(lo_uid);
93 auto hi_dit = dofsField.get<Unique_mi_tag>().upper_bound(hi_uid);
94 dofsField.get<Unique_mi_tag>().erase(dit, hi_dit);
95 }
97}
FieldBitNumber get_field_bit_number(const std::string name) const
get field bit number
Definition FieldCore.cpp:28
static UId getLoFieldEntityUId(const FieldBitNumber bit, const EntityHandle ent)
static UId getHiFieldEntityUId(const FieldBitNumber bit, const EntityHandle ent)

◆ clear_dofs_fields_by_bit_ref()

MoFEMErrorCode MoFEM::Core::clear_dofs_fields_by_bit_ref ( const BitRefLevel bit,
const BitRefLevel mask,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Clear dofs by bit level

Implements MoFEM::CoreInterface.

Definition at line 45 of file DeleteCore.cpp.

47 {
49 if (verb == -1)
50 verb = verbose;
51 Range ents;
52 CHKERR BitRefManager(*this).getEntitiesByRefLevel(bit, mask, ents, verb);
53 CHKERR clear_dofs_fields(ents, verb);
55}
MoFEMErrorCode clear_dofs_fields(const Range ents, int verb=DEFAULT_VERBOSITY)

◆ clear_ents_fields() [1/2]

MoFEMErrorCode MoFEM::Core::clear_ents_fields ( const Range ents,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Clear entities by field name

Implements MoFEM::CoreInterface.

Definition at line 113 of file DeleteCore.cpp.

113 {
115 if (verb == -1)
116 verb = verbose;
117 CHKERR clear_dofs_fields(ents, verb);
119 for (Range::const_pair_iterator p_eit = ents.pair_begin();
120 p_eit != ents.pair_end(); p_eit++) {
121 EntityHandle first = p_eit->first;
122 EntityHandle second = p_eit->second;
123 FieldEntity_multiIndex::index<Ent_mi_tag>::type::iterator dit, hi_dit;
124 dit = entsFields.get<Ent_mi_tag>().lower_bound(first);
125 hi_dit = entsFields.get<Ent_mi_tag>().upper_bound(second);
126 entsFields.get<Ent_mi_tag>().erase(dit, hi_dit);
127 }
129}

◆ clear_ents_fields() [2/2]

MoFEMErrorCode MoFEM::Core::clear_ents_fields ( const std::string name,
const Range ents,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Clear entities by field name

Implements MoFEM::CoreInterface.

Definition at line 131 of file DeleteCore.cpp.

132 {
134 if (verb == -1)
135 verb = verbose;
136 const auto bit_number = get_field_bit_number(name);
137 CHKERR clear_dofs_fields(name, ents, verb);
138 CHKERR clear_adjacencies_entities(name, ents, verb);
139 for (Range::const_pair_iterator p_eit = ents.pair_begin();
140 p_eit != ents.pair_end(); p_eit++) {
141 const auto first = p_eit->first;
142 const auto second = p_eit->second;
143 auto dit = entsFields.get<Unique_mi_tag>().lower_bound(
144 FieldEntity::getLocalUniqueIdCalculate(bit_number, first));
145 auto hi_dit = entsFields.get<Unique_mi_tag>().upper_bound(
146 FieldEntity::getLocalUniqueIdCalculate(bit_number, second));
147 entsFields.get<Unique_mi_tag>().erase(dit, hi_dit);
148 }
150}

◆ clear_ents_fields_by_bit_ref()

MoFEMErrorCode MoFEM::Core::clear_ents_fields_by_bit_ref ( const BitRefLevel bit,
const BitRefLevel mask,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Clear ents by bit level

Implements MoFEM::CoreInterface.

Definition at line 99 of file DeleteCore.cpp.

101 {
103 if (verb == -1)
104 verb = verbose;
105 Range ents;
106 CHKERR BitRefManager(*this).getEntitiesByRefLevel(bit, mask, ents, verb);
107 CHKERR clear_dofs_fields(ents, verb);
109 CHKERR clear_ents_fields(ents, verb);
111}
MoFEMErrorCode clear_ents_fields(const Range ents, int verb=DEFAULT_VERBOSITY)

◆ clear_finite_elements() [1/2]

MoFEMErrorCode MoFEM::Core::clear_finite_elements ( const Range & ents,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

clear finite elements

Implements MoFEM::CoreInterface.

Definition at line 273 of file DeleteCore.cpp.

273 {
275 if (verb == -1)
276 verb = verbose;
278 for (Range::const_pair_iterator p_eit = ents.pair_begin();
279 p_eit != ents.pair_end(); p_eit++) {
280 EntityHandle first = p_eit->first;
281 EntityHandle second = p_eit->second;
282 EntFiniteElement_multiIndex::index<Ent_mi_tag>::type::iterator fit, hi_fit;
283 fit = entsFiniteElements.get<Ent_mi_tag>().lower_bound(first);
284 hi_fit = entsFiniteElements.get<Ent_mi_tag>().upper_bound(second);
285 entsFiniteElements.get<Ent_mi_tag>().erase(fit, hi_fit);
286 }
288}

◆ clear_finite_elements() [2/2]

MoFEMErrorCode MoFEM::Core::clear_finite_elements ( const std::string & fe_name,
const Range & ents,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

clear finite elements

Implements MoFEM::CoreInterface.

Definition at line 290 of file DeleteCore.cpp.

291 {
293 if (verb == -1)
294 verb = verbose;
295 CHKERR clear_adjacencies_finite_elements(fe_name, ents, verb);
296 auto fe_miit = finiteElements.get<FiniteElement_name_mi_tag>().find(fe_name);
297 if (fe_miit == finiteElements.get<FiniteElement_name_mi_tag>().end()) {
298 for (Range::const_pair_iterator p_eit = ents.pair_begin();
299 p_eit != ents.pair_end(); p_eit++) {
300 auto fit = entsFiniteElements.get<Unique_mi_tag>().lower_bound(
302 (*fe_miit)->getFEUId()));
303 auto hi_fit = entsFiniteElements.get<Unique_mi_tag>().upper_bound(
305 (*fe_miit)->getFEUId()));
306 fit = entsFiniteElements.get<Unique_mi_tag>().erase(fit, hi_fit);
307 }
308 }
310}

◆ clear_finite_elements_by_bit_ref()

MoFEMErrorCode MoFEM::Core::clear_finite_elements_by_bit_ref ( const BitRefLevel bit,
const BitRefLevel mask,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

clear finite elements

Implements MoFEM::CoreInterface.

Definition at line 261 of file DeleteCore.cpp.

263 {
265 if (verb == -1)
266 verb = verbose;
267 Range ents;
268 CHKERR BitRefManager(*this).getEntitiesByRefLevel(bit, mask, ents, verb);
269 CHKERR clear_finite_elements(ents, verb);
271}
MoFEMErrorCode clear_finite_elements(const Range &ents, int verb=DEFAULT_VERBOSITY)

◆ clear_inactive_dofs()

MoFEMErrorCode MoFEM::Core::clear_inactive_dofs ( int verb = DEFAULT_VERBOSITY)
protectedvirtual

Clear inactive dofs

Implements MoFEM::CoreInterface.

Definition at line 29 of file DeleteCore.cpp.

29 {
31 if (verb == -1)
32 verb = verbose;
33 Range ents;
34 for (DofEntity_multiIndex::iterator dit = dofsField.begin();
35 dit != dofsField.end();) {
36 if (!dit->get()->getActive()) {
37 dit = dofsField.erase(dit);
38 } else {
39 ++dit;
40 }
41 }
43}

◆ clear_problem()

MoFEMErrorCode MoFEM::Core::clear_problem ( const std::string name,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

clear problem

Implements MoFEM::CoreInterface.

Definition at line 269 of file ProblemsCore.cpp.

269 {
271 if (verb == -1)
272 verb = verbose;
273 typedef Problem_multiIndex::index<Problem_mi_tag>::type ProblemsByName;
274 ProblemsByName &prob_by_name = pRoblems.get<Problem_mi_tag>();
275 ProblemsByName::iterator p_miit = prob_by_name.find(problem_name);
276 if (p_miit == prob_by_name.end()) {
277 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
278 "problem < %s > not found, (top tip: check spelling)",
279 problem_name.c_str());
280 }
281 // zero rows
282 bool success = prob_by_name.modify(p_miit, ProblemZeroNbRowsChange());
283 if (!success)
284 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
285 "modification unsuccessful");
286 // zero cols
287 success = prob_by_name.modify(p_miit, ProblemZeroNbColsChange());
288 if (!success)
289 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
290 "modification unsuccessful");
291 // clear finite elements
292 success =
293 prob_by_name.modify(p_miit, ProblemClearNumeredFiniteElementsChange());
294 if (!success)
295 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
296 "modification unsuccessful");
297 // clear data structures
298 success = prob_by_name.modify(p_miit, ProblemClearSubProblemData());
299 if (!success)
300 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
301 "modification unsuccessful");
302 success = prob_by_name.modify(p_miit, ProblemClearComposedProblemData());
303 if (!success)
304 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
305 "modification unsuccessful");
306 if (p_miit->getRowDofsSequence())
307 p_miit->getRowDofsSequence()->clear();
308 if (p_miit->getColDofsSequence())
309 p_miit->getColDofsSequence()->clear();
310 if (p_miit->getSubData())
311 p_miit->getSubData().reset();
312 if (p_miit->getComposedProblemsData())
313 p_miit->getComposedProblemsData().reset();
315}

◆ clear_problems()

MoFEMErrorCode MoFEM::Core::clear_problems ( int verb = DEFAULT_VERBOSITY)
protectedvirtual

clear problems

Implements MoFEM::CoreInterface.

Definition at line 338 of file ProblemsCore.cpp.

338 {
340 if (verb == -1)
341 verb = verbose;
342 // iterate problems
343 for (auto p_miit = pRoblems.begin(); p_miit != pRoblems.end(); p_miit++)
344 CHKERR clear_problem(p_miit->getName(), verb);
346}
MoFEMErrorCode clear_problem(const std::string name, int verb=DEFAULT_VERBOSITY)
clear problem

◆ clearMap()

MoFEMErrorCode MoFEM::Core::clearMap ( )
protected

Cleaning database.

Definition at line 525 of file Core.cpp.

525 {
527 // Cleaning databases in interfaces
531 // Cleaning databases
532 refinedEntities.clear();
533 refinedFiniteElements.clear();
534 fIelds.clear();
535 entsFields.clear();
536 dofsField.clear();
537 finiteElements.clear();
538 entsFiniteElements.clear();
539 entFEAdjacencies.clear();
540 pRoblems.clear();
542}

◆ coreGenericConstructor()

MoFEMErrorCode MoFEM::Core::coreGenericConstructor ( moab::Interface & moab,
MPI_Comm comm,
const int verbose )
protected

Definition at line 203 of file Core.cpp.

204 {
206
207 // This is deprecated ONE should use MoFEM::Core::Initialize
209 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
210 "MoFEM globally is not initialised, call MoFEM::Core::Initialize");
211
212 // Create duplicate communicator
213 wrapMPIMOABComm = boost::make_shared<WrapMPIComm>(comm, false);
214
215 MPI_Comm_size(mofemComm, &sIze);
216 MPI_Comm_rank(mofemComm, &rAnk);
217
218 // CHeck if moab has set communicator if not set communicator internally
219 ParallelComm *pComm = ParallelComm::get_pcomm(&moab, MYPCOMM_INDEX);
220 if (pComm == NULL)
221 pComm = new ParallelComm(&moab, wrapMPIMOABComm->get_comm());
222
223 // Register interfaces for this implementation
227
228 // Register MOFEM events in PETSc
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);
233
234 MOFEM_LOG_CHANNEL("WORLD");
235 MOFEM_LOG_CHANNEL("SELF");
236 MOFEM_LOG_CHANNEL("SYNC");
237
239}
#define MYPCOMM_INDEX
default communicator number PCOMM
PetscLogEvent MOFEM_EVENT_createMat
Definition Core.hpp:1004
PetscLogEvent MOFEM_EVENT_preProcess
Event for preProcess finite element.
Definition Core.hpp:999
int sIze
MoFEM communicator size.
Definition Core.hpp:1015
ParallelComm * pComm
MOAB communicator structure.
Definition Core.hpp:1013
PetscLogEvent MOFEM_EVENT_operator
Event for evaluating operator of finite element.
Definition Core.hpp:1001
PetscLogEvent MOFEM_EVENT_postProcess
Event for postProcess finite element.
Definition Core.hpp:1003
boost::shared_ptr< WrapMPIComm > wrapMPIMOABComm
manage creation and destruction of MOAB communicator
Definition Core.hpp:1037
MoFEMErrorCode registerInterface(bool error_if_registration_failed=true)
Register interface.

◆ create_vertices_and_add_to_field()

MoFEMErrorCode MoFEM::Core::create_vertices_and_add_to_field ( const std::string name,
const double coords[],
int size,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Create a vertices and add to field object.

Create vertices and add them to field. Those vertices would be carring DOFs of the field.

Note
This function is typically used when NOFIELD is created, for example load factor in arc-length control.
Parameters
namename of the field
bitbit ref level of the created vertices
coordsof the vertices
sizenumber of vertices
verbverbosity level
Returns
MoFEMErrorCode

Implements MoFEM::CoreInterface.

Definition at line 467 of file FieldCore.cpp.

469 {
471
472 if (verb == DEFAULT_VERBOSITY)
473 verb = verbose;
474
475 Range verts;
476
477 auto create_vertices = [&]() {
479
480 vector<double *> arrays_coord;
481 EntityHandle startv = 0;
482 ReadUtilIface *iface;
483 CHKERR get_moab().query_interface(iface);
484 CHKERR iface->get_node_coords(3, size, 0, startv, arrays_coord);
485 verts.insert(startv, startv + size - 1);
486 for (int n = 0; n != size; ++n)
487 for (auto d : {0, 1, 2})
488 arrays_coord[d][n] = coords[3 * n + d];
489
491 };
492
493 auto add_verts_to_field = [&]() {
495 EntityHandle field_meshset = get_field_meshset(name);
496 CHKERR get_moab().add_entities(field_meshset, verts);
498 };
499
500 CHKERR create_vertices();
501 CHKERR add_verts_to_field();
502
504}
const double n
refractive index of diffusive medium

◆ delete_ents_by_bit_ref()

MoFEMErrorCode MoFEM::Core::delete_ents_by_bit_ref ( const BitRefLevel bit,
const BitRefLevel mask,
const bool remove_parent = false,
int verb = DEFAULT_VERBOSITY,
MoFEMTypes mf = MF_ZERO )
protectedvirtual

delete entities form mofem and moab database

Implements MoFEM::CoreInterface.

Definition at line 535 of file DeleteCore.cpp.

538 {
540 if (verb == -1)
541 verb = verbose;
542
543 Range ents;
544 CHKERR BitRefManager(*this).getEntitiesByRefLevel(bit, mask, ents, verb);
545 Range ents_meshsets = ents.subset_by_type(MBENTITYSET);
546 ents = subtract(ents, ents_meshsets);
547 if(ents.empty()) {
548 if (verb >= VERBOSE)
549 MOFEM_LOG("WORLD", Sev::verbose) << "Nb. of deleted entities 0";
551 }
552
553 if (verb >= VERBOSE)
554 MOFEM_LOG("WORLD", Sev::noisy) << "Deleted ents:\n" << ents;
555
556 CHKERR remove_ents(ents, verb);
557
558 // remove parent
559 if (remove_parent) {
561 }
562
563 Range meshsets;
564 CHKERR get_moab().get_entities_by_type(0, MBENTITYSET, meshsets, true);
565 for (auto m : meshsets) {
566 CHKERR get_moab().remove_entities(m, ents);
567
568 }
569
570 rval = get_moab().delete_entities(ents);
571 if (rval != MB_SUCCESS) {
573 if (verb == QUIET) {
574 MOFEM_LOG("SELF", Sev::noisy) << "Problem deleting:\n" << ents;
575 } else {
576 MOFEM_LOG("SELF", Sev::warning) << "Problem deleting:\n" << ents;
577 }
578 MOFEM_LOG_CHANNEL("WORLD");
579 MOFEM_LOG_TAG("WORLD", "DeleteCore");
580 if (!(mf & MF_NOT_THROW)) {
581 CHK_MOAB_THROW(rval, "Can not delete entities");
582 } else {
583 rval = MB_SUCCESS;
584 }
585 }
586
587 MOFEM_LOG_C("SELF", Sev::noisy, "Nb. of deleted entities %d", ents.size());
588
590}
#define DeleteCoreFunctionBegin
@ MF_NOT_THROW
#define CHK_MOAB_THROW(err, msg)
Check error code of MoAB function and throw MoFEM exception.
static MoFEMErrorCodeGeneric< moab::ErrorCode > rval
FTensor::Index< 'm', 3 > m
MoFEMErrorCode remove_parents_by_parents(const Range &ents, int verb=DEFAULT_VERBOSITY)
Remove paremts from entities having parents in passed range.
MoFEMErrorCode remove_ents(const Range ents, int verb=DEFAULT_VERBOSITY)
remove entities form mofem database

◆ delete_field()

MoFEMErrorCode MoFEM::Core::delete_field ( const std::string name,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Delete field.

Parameters
namefield name
verbverbosity level
Returns
error code

Implements MoFEM::CoreInterface.

Definition at line 609 of file DeleteCore.cpp.

609 {
611 auto &f = fIelds.get<FieldName_mi_tag>();
612 auto mit = f.find(name);
613 if (mit == f.end()) {
614 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
615 "Finite element <%s> not found", name.c_str());
616 }
617 EntityHandle meshset = mit->get()->getMeshset();
618 Range ents;
619 CHKERR get_moab().get_entities_by_handle(meshset, ents, false);
620 CHKERR remove_ents_from_field(name, ents, verb);
621 CHKERR get_moab().tag_delete((*mit)->th_FieldDataVerts);
622 CHKERR get_moab().tag_delete((*mit)->th_FieldData);
623 CHKERR get_moab().tag_delete((*mit)->th_AppOrder);
624 f.erase(mit);
625 CHKERR get_moab().delete_entities(&meshset, 1);
627}
MoFEMErrorCode remove_ents_from_field(const std::string name, const EntityHandle meshset, const EntityType type, int verb=DEFAULT_VERBOSITY)
remove entities from field

◆ delete_finite_element()

MoFEMErrorCode MoFEM::Core::delete_finite_element ( const std::string name,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

delete finite element from mofem database

Implements MoFEM::CoreInterface.

Definition at line 592 of file DeleteCore.cpp.

592 {
594 auto &fe = finiteElements.get<FiniteElement_name_mi_tag>();
595 auto mit = fe.find(name);
596 if (mit == fe.end()) {
597 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
598 "Finite element <%s> not found", name.c_str());
599 }
600 EntityHandle meshset = mit->get()->getMeshset();
601 Range ents;
602 CHKERR get_moab().get_entities_by_handle(meshset, ents, false);
603 CHKERR remove_ents_from_finite_element(name, ents, verb);
604 fe.erase(mit);
605 CHKERR get_moab().delete_entities(&meshset, 1);
607}
MoFEMErrorCode remove_ents_from_finite_element(const std::string name, const EntityHandle meshset, const EntityType type, int verb=DEFAULT_VERBOSITY)
remove entities from given refinement level to finite element database

◆ delete_problem()

MoFEMErrorCode MoFEM::Core::delete_problem ( const std::string name)
protectedvirtual

Delete problem.

Note
add_file is a collective, should be executed on all processors. Otherwise could lead to deadlock.

Implements MoFEM::CoreInterface.

Definition at line 108 of file ProblemsCore.cpp.

108 {
110 auto p_miit = pRoblems.get<Problem_mi_tag>().find(name);
111 if (p_miit == pRoblems.get<Problem_mi_tag>().end()) {
112 SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_FOUND, "no such problem like < %s >",
113 name.c_str());
114 }
115 const EntityHandle meshset = p_miit->meshset;
116 pRoblems.get<Problem_mi_tag>().erase(p_miit);
117 CHKERR get_moab().delete_entities(&meshset, 1);
119}

◆ Finalize()

MoFEMErrorCode MoFEM::Core::Finalize ( )
static

Checks for options to be called at the conclusion of the program.

MPI_Finalize() is called only if the user had not called MPI_Init() before calling Initialize.

Note
This function calls PetscInitialize, for more details see http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Sys/PetscFinalize.html
Returns
MoFEMErrorCode
Examples
add_blockset.cpp, add_cubit_meshsets.cpp, adolc_plasticity.cpp, analytical_nonlinear_poisson.cpp, analytical_poisson.cpp, analytical_poisson_field_split.cpp, approx_sphere.cpp, bernstein_bezier_generate_base.cpp, bone_adaptation.cpp, boundary_marker.cpp, build_large_problem.cpp, build_problems.cpp, child_and_parent.cpp, continuity_check_on_contact_prism_side_ele.cpp, continuity_check_on_skeleton_3d.cpp, continuity_check_on_skeleton_with_simple_2d_for_h1.cpp, continuity_check_on_skeleton_with_simple_2d_for_hcurl.cpp, continuity_check_on_skeleton_with_simple_2d_for_hdiv.cpp, cubit_bc_test.cpp, delete_ho_nodes.cpp, dg_projection.cpp, dm_build_partitioned_mesh.cpp, dm_create_subdm.cpp, dm_partitioned_no_field.cpp, dynamic_first_order_con_law.cpp, edge_and_bubble_shape_functions_on_quad.cpp, eigen_elastic.cpp, elasticity.cpp, elasticity_mixed_formulation.cpp, ep.cpp, field_blas.cpp, field_evaluator.cpp, field_to_vertices.cpp, forces_and_sources_testing_edge_element.cpp, forces_and_sources_testing_flat_prism_element.cpp, forces_and_sources_testing_users_base.cpp, free_surface.cpp, gauss_points_on_outer_product.cpp, hanging_node_approx.cpp, hcurl_check_approx_in_2d.cpp, hcurl_curl_operator.cpp, hcurl_divergence_operator_2d.cpp, hdiv_check_approx_in_3d.cpp, hdiv_divergence_operator.cpp, heat_equation.cpp, heat_method.cpp, hello_world.cpp, helmholtz.cpp, higher_derivatives.cpp, level_set.cpp, log.cpp, loop_entities.cpp, lorentz_force.cpp, magnetostatic.cpp, matrix_function.cpp, mesh_cut.cpp, mesh_insert_interface_atom.cpp, mesh_smoothing.cpp, meshset_to_vtk.cpp, minimal_surface_area.cpp, mixed_poisson.cpp, mofem/tutorials/vec-7/adjoint.cpp, navier_stokes.cpp, node_merge.cpp, nonlinear_dynamics.cpp, operators_tests.cpp, partition_mesh.cpp, petsc_smart_ptr_objects.cpp, phase.cpp, photon_diffusion.cpp, plastic.cpp, plate.cpp, plot_base.cpp, poisson_2d_dis_galerkin.cpp, poisson_2d_homogeneous.cpp, prism_elements_from_surface.cpp, prism_polynomial_approximation.cpp, quad_polynomial_approximation.cpp, reaction_diffusion.cpp, remove_entities_from_problem.cpp, remove_entities_from_problem_not_partitioned.cpp, scalar_check_approximation.cpp, schur_test_diag_mat.cpp, seepage.cpp, shallow_wave.cpp, simple_elasticity.cpp, simple_interface.cpp, simple_l2_only.cpp, split_sideset.cpp, tensor_divergence_operator.cpp, test_broken_space.cpp, test_cache_on_entities.cpp, testing_jacobian_of_hook_element.cpp, testing_jacobian_of_hook_scaled_with_density_element.cpp, thermo_elastic.cpp, unsaturated_transport.cpp, and wave_equation.cpp.

Definition at line 118 of file Core.cpp.

118 {
120 PetscPopErrorHandler();
121 isGloballyInitialised = false;
122
123 if (isInitialized == PETSC_FALSE) {
124 PetscBool is_finalized;
125 PetscFinalized(&is_finalized);
126 if (!is_finalized)
127 PetscFinalize();
128 }
129
130 if (!mpiInitialised) {
131 int mpi_finalized;
132 MPI_Finalized(&mpi_finalized);
133 if (!mpi_finalized)
134 MPI_Finalize();
135 }
136 }
137
138 return 0;
139}
static PetscBool isInitialized
petsc was initialised by other agent
Definition Core.hpp:1058
static int mpiInitialised
mpi was initialised by other agent
Definition Core.hpp:1057

◆ get_basic_entity_data_ptr()

boost::shared_ptr< BasicEntityData > & MoFEM::CoreTmp< 0 >::get_basic_entity_data_ptr ( )
inlineprotectedvirtual

Get pointer to basic entity data.

This structure keeps data like tags handlers and other data used to construct mofem entities, dofs and finite elements.

Implements MoFEM::CoreInterface.

Definition at line 290 of file Core.hpp.

290 {
291 return basicEntityDataPtr;
292 }

◆ get_comm()

MPI_Comm & MoFEM::CoreTmp< 0 >::get_comm ( ) const
inlineprotectedvirtual
Returns
return communicator

Implements MoFEM::CoreInterface.

Definition at line 1021 of file Core.hpp.

1021{ return mofemComm; }

◆ get_comm_rank()

int MoFEM::CoreTmp< 0 >::get_comm_rank ( ) const
inlineprotectedvirtual
Returns
return communicator rank/processor

Implements MoFEM::CoreInterface.

Definition at line 1031 of file Core.hpp.

1031{ return rAnk; }

◆ get_comm_size()

int MoFEM::CoreTmp< 0 >::get_comm_size ( ) const
inlineprotectedvirtual
Returns
return communicator size

Implements MoFEM::CoreInterface.

Definition at line 1026 of file Core.hpp.

1026{ return sIze; }

◆ get_dofs() [1/2]

const DofEntity_multiIndex * MoFEM::Core::get_dofs ( ) const
protectedvirtual

Get the dofs object.

Returns
const DofEntity_multiIndex*

Implements MoFEM::CoreInterface.

Definition at line 911 of file Core.cpp.

911{ return &dofsField; }

◆ get_dofs() [2/2]

MoFEMErrorCode MoFEM::Core::get_dofs ( const DofEntity_multiIndex ** dofs_ptr) const
protectedvirtual

Get dofs multi index.

Implements MoFEM::CoreInterface.

Definition at line 850 of file Core.cpp.

850 {
852 *dofs_ptr = &dofsField;
854}

◆ get_dofs_by_name_and_ent_begin()

DofEntityByUId::iterator MoFEM::Core::get_dofs_by_name_and_ent_begin ( const std::string & field_name,
const EntityHandle ent ) const
protectedvirtual

get begin iterator of field dofs of given name and ent(instead you can use IT_GET_DOFS_FIELD_BY_NAME_FOR_LOOP(MFIELD,NAME,ENT,IT)

for(IT_GET_DOFS_FIELD_BY_NAME_AND_ENT_FOR_LOOP(MFIELD,NAME,ENT,IT)) { ... }

Parameters
field_name

Implements MoFEM::CoreInterface.

Definition at line 1381 of file FieldCore.cpp.

1382 {
1383 return dofsField.get<Unique_mi_tag>().lower_bound(
1385 ent));
1386}

◆ get_dofs_by_name_and_ent_end()

DofEntityByUId::iterator MoFEM::Core::get_dofs_by_name_and_ent_end ( const std::string & field_name,
const EntityHandle ent ) const
protectedvirtual

get begin iterator of field dofs of given name and ent (instead you can use IT_GET_DOFS_FIELD_BY_NAME_FOR_LOOP(MFIELD,NAME,ENT,IT)

for(IT_GET_DOFS_FIELD_BY_NAME_AND_ENT_FOR_LOOP(MFIELD,NAME,ENT,IT)) { ... }

Parameters
field_name

Implements MoFEM::CoreInterface.

Definition at line 1388 of file FieldCore.cpp.

1389 {
1390 return dofsField.get<Unique_mi_tag>().upper_bound(
1392 ent));
1393}

◆ get_dofs_by_name_and_type_begin()

DofEntityByUId::iterator MoFEM::Core::get_dofs_by_name_and_type_begin ( const std::string & field_name,
const EntityType type ) const
protectedvirtual

get begin iterator of field dofs of given name and ent type (instead you can use IT_GET_DOFS_FIELD_BY_NAME_FOR_LOOP(MFIELD,NAME,TYPE,IT)

for(IT_GET_DOFS_FIELD_BY_NAME_AND_TYPE_FOR_LOOP(MFIELD,NAME,TYPE,IT)) { ... }

Parameters
field_name

Implements MoFEM::CoreInterface.

Definition at line 1395 of file FieldCore.cpp.

1396 {
1397 return dofsField.get<Unique_mi_tag>().lower_bound(
1399 get_id_for_min_type(type)));
1400}

◆ get_dofs_by_name_and_type_end()

DofEntityByUId::iterator MoFEM::Core::get_dofs_by_name_and_type_end ( const std::string & field_name,
const EntityType type ) const
protectedvirtual

get begin iterator of field dofs of given name end ent type(instead you can use IT_GET_DOFS_FIELD_BY_NAME_FOR_LOOP(MFIELD,NAME,TYPE,IT)

for(IT_GET_DOFS_FIELD_BY_NAME_AND_TYPE_FOR_LOOP(MFIELD,NAME,TYPE,IT)) { ... }

Parameters
field_name

Implements MoFEM::CoreInterface.

Definition at line 1402 of file FieldCore.cpp.

1403 {
1404 return dofsField.get<Unique_mi_tag>().upper_bound(
1406 get_id_for_max_type(type)));
1407}

◆ get_dofs_by_name_begin()

DofEntityByUId::iterator MoFEM::Core::get_dofs_by_name_begin ( const std::string & field_name) const
protectedvirtual

get begin iterator of field dofs of given name (instead you can use IT_GET_DOFS_FIELD_BY_NAME_FOR_LOOP(MFIELD,NAME,IT)

for(IT_GET_DOFS_FIELD_BY_NAME_FOR_LOOP(MFIELD,NAME,IT)) { ... }

Parameters
field_name

Implements MoFEM::CoreInterface.

Definition at line 1371 of file FieldCore.cpp.

1371 {
1372 return dofsField.get<Unique_mi_tag>().lower_bound(
1374}

◆ get_dofs_by_name_end()

DofEntityByUId::iterator MoFEM::Core::get_dofs_by_name_end ( const std::string & field_name) const
protectedvirtual

get begin iterator of field dofs of given name (instead you can use IT_GET_DOFS_FIELD_BY_NAME_FOR_LOOP(MFIELD,NAME,IT)

for(IT_GET_DOFS_FIELD_BY_NAME_FOR_LOOP(MFIELD,NAME,IT)) { ... }

Parameters
field_name

Implements MoFEM::CoreInterface.

Definition at line 1376 of file FieldCore.cpp.

1376 {
1377 return dofsField.get<Unique_mi_tag>().upper_bound(
1379}

◆ get_ent_field_by_name_begin()

FieldEntityByUId::iterator MoFEM::Core::get_ent_field_by_name_begin ( const std::string & field_name) const
protectedvirtual

get begin iterator of field ents of given name (instead you can use IT_GET_ENT_FIELD_BY_NAME_FOR_LOOP(MFIELD,NAME,IT)

for(IT_GET_ENT_FIELD_BY_NAME_FOR_LOOP(MFIELD,NAME,IT)) { ... }

Parameters
field_name

Implements MoFEM::CoreInterface.

Definition at line 1361 of file FieldCore.cpp.

1361 {
1362 return entsFields.get<Unique_mi_tag>().lower_bound(
1364}

◆ get_ent_field_by_name_end()

FieldEntityByUId::iterator MoFEM::Core::get_ent_field_by_name_end ( const std::string & field_name) const
protectedvirtual

get begin iterator of field dofs of given name (instead you can use IT_GET_ENT_FIELD_BY_NAME_FOR_LOOP(MFIELD,NAME,IT)

for(IT_GET_ENT_FIELD_BY_NAME_FOR_LOOP(MFIELD,NAME,IT)) { ... }

Parameters
field_name

Implements MoFEM::CoreInterface.

Definition at line 1366 of file FieldCore.cpp.

1366 {
1367 return entsFields.get<Unique_mi_tag>().upper_bound(
1369}

◆ get_ents_elements_adjacency() [1/2]

const FieldEntityEntFiniteElementAdjacencyMap_multiIndex * MoFEM::Core::get_ents_elements_adjacency ( ) const
protectedvirtual

Get the dofs elements adjacency object.

Returns
const FieldEntityEntFiniteElementAdjacencyMap_multiIndex*

Implements MoFEM::CoreInterface.

Definition at line 891 of file Core.cpp.

891 {
892 return &entFEAdjacencies;
893}

◆ get_ents_elements_adjacency() [2/2]

MoFEMErrorCode MoFEM::Core::get_ents_elements_adjacency ( const FieldEntityEntFiniteElementAdjacencyMap_multiIndex ** dofs_elements_adjacency) const
protectedvirtual

Get the dofs elements adjacency object.

Parameters
dofs_elements_adjacency
Returns
MoFEMErrorCode

Implements MoFEM::CoreInterface.

Definition at line 882 of file Core.cpp.

884 {
886 *dofs_elements_adjacency = &entFEAdjacencies;
888}

◆ get_ents_finite_elements() [1/2]

const EntFiniteElement_multiIndex * MoFEM::Core::get_ents_finite_elements ( ) const
protectedvirtual

Get the ents finite elements object.

Returns
const EntFiniteElement_multiIndex*

Implements MoFEM::CoreInterface.

Definition at line 905 of file Core.cpp.

905 {
906 return &entsFiniteElements;
907}

◆ get_ents_finite_elements() [2/2]

MoFEMErrorCode MoFEM::Core::get_ents_finite_elements ( const EntFiniteElement_multiIndex ** fe_ent_ptr) const
protectedvirtual

Get entities finite elements multi-index.

Implements MoFEM::CoreInterface.

Definition at line 863 of file Core.cpp.

864 {
866 *fe_ent_ptr = &entsFiniteElements;
868}

◆ get_fe_by_name_begin()

EntFiniteElement_multiIndex::index< Unique_mi_tag >::type::iterator MoFEM::Core::get_fe_by_name_begin ( const std::string & fe_name) const
protectedvirtual

get begin iterator of finite elements of given name (instead you can use IT_GET_FES_BY_NAME_FOR_LOOP(MFIELD,NAME,IT)

for(IT_GET_FES_BY_NAME_FOR_LOOP(MFIELD,NAME,IT)) { ... }

Parameters
fe_name

Implements MoFEM::CoreInterface.

Definition at line 837 of file FECore.cpp.

837 {
838 auto miit = finiteElements.get<FiniteElement_name_mi_tag>().find(fe_name);
839 if (miit != finiteElements.get<FiniteElement_name_mi_tag>().end()) {
840 return entsFiniteElements.get<Unique_mi_tag>().lower_bound(
841 EntFiniteElement::getLocalUniqueIdCalculate(0, (*miit)->getFEUId()));
842 } else {
843 return entsFiniteElements.get<Unique_mi_tag>().end();
844 }
845}

◆ get_fe_by_name_end()

EntFiniteElement_multiIndex::index< Unique_mi_tag >::type::iterator MoFEM::Core::get_fe_by_name_end ( const std::string & fe_name) const
protectedvirtual

get end iterator of finite elements of given name (instead you can use IT_GET_FES_BY_NAME_FOR_LOOP(MFIELD,NAME,IT)

for(IT_GET_FES_BY_NAME_FOR_LOOP(MFIELD,NAME,IT)) { ... }

Parameters
fe_name

Implements MoFEM::CoreInterface.

Definition at line 848 of file FECore.cpp.

848 {
849 auto miit = finiteElements.get<FiniteElement_name_mi_tag>().find(fe_name);
850 if (miit != finiteElements.get<FiniteElement_name_mi_tag>().end()) {
851 return entsFiniteElements.get<Unique_mi_tag>().upper_bound(
853 get_id_for_max_type<MBENTITYSET>(), (*miit)->getFEUId()));
854 } else {
855 return entsFiniteElements.get<Unique_mi_tag>().end();
856 }
857}

◆ get_field_bit_number()

FieldBitNumber MoFEM::Core::get_field_bit_number ( const std::string name) const
protectedvirtual

get field bit number

Parameters
nameof field Example:
auto field_number = mField.get_field_bit_number("DISPLACEMENT");

Implements MoFEM::CoreInterface.

Definition at line 28 of file FieldCore.cpp.

28 {
29 auto &set = fIelds.get<FieldName_mi_tag>();
30 auto miit = set.find(name);
31 if (miit == set.end())
32 THROW_MESSAGE("field < " + name +
33 " > not in database (top tip: check spelling)");
34 return (*miit)->getBitNumber();
35}
#define THROW_MESSAGE(msg)
Throw MoFEM exception.

◆ get_field_entities_by_dimension()

MoFEMErrorCode MoFEM::Core::get_field_entities_by_dimension ( const std::string name,
int dim,
Range & ents ) const
protectedvirtual

get entities in the field by dimension

Parameters
namefield name
dimdim
entsents
Returns
error code

Implements MoFEM::CoreInterface.

Definition at line 81 of file FieldCore.cpp.

83 {
84
86 EntityHandle meshset = get_field_meshset(name);
87 CHKERR get_moab().get_entities_by_dimension(meshset, dim, ents, true);
89}

◆ get_field_entities_by_handle()

MoFEMErrorCode MoFEM::Core::get_field_entities_by_handle ( const std::string name,
Range & ents ) const
protectedvirtual

get entities in the field by handle

Parameters
namefield name
entsents
Returns
error code

Implements MoFEM::CoreInterface.

Definition at line 100 of file FieldCore.cpp.

101 {
103 EntityHandle meshset = get_field_meshset(name);
104 CHKERR get_moab().get_entities_by_handle(meshset, ents, true);
106}

◆ get_field_entities_by_type()

MoFEMErrorCode MoFEM::Core::get_field_entities_by_type ( const std::string name,
EntityType type,
Range & ents ) const
protectedvirtual

get entities in the field by type

Parameters
namefield name
typeentity type
entsents
Returns
error code

Implements MoFEM::CoreInterface.

Definition at line 91 of file FieldCore.cpp.

93 {
95 EntityHandle meshset = get_field_meshset(name);
96 CHKERR get_moab().get_entities_by_type(meshset, type, ents, true);
98}

◆ get_field_ents() [1/2]

const FieldEntity_multiIndex * MoFEM::Core::get_field_ents ( ) const
protectedvirtual

Get the field ents object.

Returns
const FieldEntity_multiIndex*

Implements MoFEM::CoreInterface.

Definition at line 908 of file Core.cpp.

908 {
909 return &entsFields;
910}

◆ get_field_ents() [2/2]

MoFEMErrorCode MoFEM::Core::get_field_ents ( const FieldEntity_multiIndex ** field_ents) const
protectedvirtual

Get field multi index.

Implements MoFEM::CoreInterface.

Definition at line 845 of file Core.cpp.

845 {
847 *field_ents = &entsFields;
849}

◆ get_field_id()

BitFieldId MoFEM::Core::get_field_id ( const std::string & name) const
protectedvirtual

Get field Id.

Parameters
nameof field
Returns
BitFieldId

Implements MoFEM::CoreInterface.

Definition at line 18 of file FieldCore.cpp.

18 {
19 auto &set = fIelds.get<FieldName_mi_tag>();
20 auto miit = set.find(name);
21 if (miit == set.end()) {
22 THROW_MESSAGE("field < " + name +
23 " > not in database (top tip: check spelling)");
24 }
25 return (*miit)->getId();
26}

◆ get_field_meshset() [1/2]

EntityHandle MoFEM::Core::get_field_meshset ( const BitFieldId id) const
protected

Definition at line 45 of file FieldCore.cpp.

45 {
46 auto &set = fIelds.get<BitFieldId_mi_tag>();
47 auto miit = set.find(id);
48 if (miit == set.end())
49 THROW_MESSAGE("field not in database (top tip: check spelling)");
50 return (*miit)->meshSet;
51}

◆ get_field_meshset() [2/2]

EntityHandle MoFEM::Core::get_field_meshset ( const std::string name) const
protectedvirtual

get field meshset

Parameters
nameof Field Example:
EntityHandle disp_files_meshset = mField.get_field_meshset("DISPLACEMENT");

Implements MoFEM::CoreInterface.

Definition at line 53 of file FieldCore.cpp.

53 {
54 return get_field_meshset(get_field_id(name));
55}
BitFieldId get_field_id(const std::string &name) const
Get field Id.
Definition FieldCore.cpp:18

◆ get_field_name()

std::string MoFEM::Core::get_field_name ( const BitFieldId id) const
protectedvirtual

get field name from id

Parameters
id
Returns
std::string

Implements MoFEM::CoreInterface.

Definition at line 37 of file FieldCore.cpp.

37 {
38 auto &set = fIelds.get<BitFieldId_mi_tag>();
39 auto miit = set.find(id);
40 if (miit == set.end())
41 THROW_MESSAGE("field not in database (top tip: check spelling)");
42 return (*miit)->getName();
43}

◆ get_field_structure()

const Field * MoFEM::Core::get_field_structure ( const std::string & name,
enum MoFEMTypes bh = MF_EXIST ) const
protectedvirtual

get field structure

If field is not found throw error if bh == MF_EXIST, or return nullptr if bh == MF_ZERO, i.e. otherwise

Parameters
namefield name
bhcontrols behaviour
Returns
const Field*

Implements MoFEM::CoreInterface.

Definition at line 65 of file FieldCore.cpp.

66 {
67 auto miit = fIelds.get<FieldName_mi_tag>().find(name);
68 if (miit == fIelds.get<FieldName_mi_tag>().end()) {
69 if (bh == MF_EXIST)
70 throw MoFEMException(
72 std::string("field < " + name +
73 " > not in database (top tip: check spelling)")
74 .c_str());
75 else
76 return nullptr;
77 }
78 return miit->get();
79}
@ MF_EXIST

◆ get_fields() [1/2]

const Field_multiIndex * MoFEM::Core::get_fields ( ) const
protectedvirtual

Get the fields object.

Returns
const Field_multiIndex*

Implements MoFEM::CoreInterface.

Definition at line 895 of file Core.cpp.

895{ return &fIelds; }

◆ get_fields() [2/2]

MoFEMErrorCode MoFEM::Core::get_fields ( const Field_multiIndex ** fields_ptr) const
protectedvirtual

Get fields multi-index from database.

Implements MoFEM::CoreInterface.

Definition at line 803 of file Core.cpp.

803 {
805 *fields_ptr = &fIelds;
807}

◆ get_finite_element_entities_by_dimension()

MoFEMErrorCode MoFEM::Core::get_finite_element_entities_by_dimension ( const std::string name,
int dim,
Range & ents ) const
protectedvirtual

get entities in the finite element by dimension

Parameters
namefinite element name
dimdim
entsents
Returns
error code

Implements MoFEM::CoreInterface.

Definition at line 286 of file FECore.cpp.

287 {
288
290
292 CHKERR get_moab().get_entities_by_dimension(meshset, dim, ents, true);
294}

◆ get_finite_element_entities_by_handle()

MoFEMErrorCode MoFEM::Core::get_finite_element_entities_by_handle ( const std::string name,
Range & ents ) const
protectedvirtual

get entities in the finite element by handle

Parameters
namefinite element name
entsents
Returns
error code

Implements MoFEM::CoreInterface.

Definition at line 309 of file FECore.cpp.

310 {
311
313
315 CHKERR get_moab().get_entities_by_handle(meshset, ents, true);
316
318}

◆ get_finite_element_entities_by_type()

MoFEMErrorCode MoFEM::Core::get_finite_element_entities_by_type ( const std::string name,
EntityType type,
Range & ents ) const
protectedvirtual

get entities in the finite element by type

Parameters
namefinite element name
typeentity type
entsents
Returns
error code

Implements MoFEM::CoreInterface.

Definition at line 296 of file FECore.cpp.

298 {
299
301
303 CHKERR get_moab().get_entities_by_type(meshset, type, ents, true);
304
306}

◆ get_finite_element_meshset() [1/2]

EntityHandle MoFEM::Core::get_finite_element_meshset ( const BitFEId id) const
protected

Definition at line 273 of file FECore.cpp.

273 {
274 auto &fe_by_id = finiteElements.get<BitFEId_mi_tag>();
275 auto miit = fe_by_id.find(id);
276 if (miit == fe_by_id.end())
277 THROW_MESSAGE("finite element not found");
278 return (*miit)->meshset;
279}

◆ get_finite_element_meshset() [2/2]

EntityHandle MoFEM::Core::get_finite_element_meshset ( const std::string name) const
protectedvirtual

get finite element meshset

Implements MoFEM::CoreInterface.

Definition at line 281 of file FECore.cpp.

281 {
283}

◆ get_finite_element_structure()

const FiniteElement * MoFEM::Core::get_finite_element_structure ( const std::string & name,
enum MoFEMTypes bh = MF_EXCL ) const
protectedvirtual

get finite element struture

If finite element is not found throw error if bh == MF_EXIST, or return nullptr if bh == MF_ZERO, i.e. otherwise

Parameters
name
bh
Returns
FiniteElement*

Implements MoFEM::CoreInterface.

Definition at line 18 of file FECore.cpp.

19 {
20 auto miit = finiteElements.get<FiniteElement_name_mi_tag>().find(name);
21 if (miit == finiteElements.get<FiniteElement_name_mi_tag>().end()) {
22 if (bh == MF_EXIST) {
23 throw MoFEMException(
25 std::string("finite element < " + name +
26 " > not in database (top tip: check spelling)")
27 .c_str());
28 } else {
29 return nullptr;
30 }
31 }
32 return miit->get();
33}

◆ get_finite_elements() [1/2]

const FiniteElement_multiIndex * MoFEM::Core::get_finite_elements ( ) const
protectedvirtual

Get the finite elements object.

Returns
const FiniteElement_multiIndex*

Implements MoFEM::CoreInterface.

Definition at line 902 of file Core.cpp.

902 {
903 return &finiteElements;
904}

◆ get_finite_elements() [2/2]

MoFEMErrorCode MoFEM::Core::get_finite_elements ( const FiniteElement_multiIndex ** fe_ptr) const
protectedvirtual

Get finite elements multi-index.

Implements MoFEM::CoreInterface.

Definition at line 857 of file Core.cpp.

857 {
859 *fe_ptr = &finiteElements;
861}

◆ get_meshsets_manager() [1/2]

MeshsetsManager & MoFEM::CoreTmp< 0 >::get_meshsets_manager ( )
inlineprotectedvirtual

get MeshsetsManager pointer

Implements MoFEM::CoreInterface.

Definition at line 361 of file Core.hpp.

361 {
362 return *get_meshsets_manager_ptr();
363 }
MeshsetsManager * get_meshsets_manager_ptr()
get MeshsetsManager pointer
Definition Core.cpp:870

◆ get_meshsets_manager() [2/2]

const MeshsetsManager & MoFEM::CoreTmp< 0 >::get_meshsets_manager ( ) const
inlineprotectedvirtual

get MeshsetsManager pointer

Implements MoFEM::CoreInterface.

Definition at line 364 of file Core.hpp.

364 {
365 return *get_meshsets_manager_ptr();
366 }

◆ get_meshsets_manager_ptr() [1/2]

MeshsetsManager * MoFEM::Core::get_meshsets_manager_ptr ( )
protectedvirtual

get MeshsetsManager pointer

Implements MoFEM::CoreInterface.

Definition at line 870 of file Core.cpp.

870 {
871 MeshsetsManager *meshsets_manager_ptr;
872 getInterface(meshsets_manager_ptr);
873 return meshsets_manager_ptr;
874}

◆ get_meshsets_manager_ptr() [2/2]

const MeshsetsManager * MoFEM::Core::get_meshsets_manager_ptr ( ) const
protectedvirtual

get MeshsetsManager pointer

Implements MoFEM::CoreInterface.

Definition at line 876 of file Core.cpp.

876 {
877 MeshsetsManager *meshsets_manager_ptr;
878 getInterface(meshsets_manager_ptr);
879 return meshsets_manager_ptr;
880}

◆ get_moab() [1/2]

moab::Interface & MoFEM::CoreTmp< 0 >::get_moab ( )
inlineprotectedvirtual

get moab instance

Implements MoFEM::CoreInterface.

Definition at line 322 of file Core.hpp.

322{ return moab; }

◆ get_moab() [2/2]

const moab::Interface & MoFEM::CoreTmp< 0 >::get_moab ( ) const
inlineprotectedvirtual

get moab instance interface

Implements MoFEM::CoreInterface.

Definition at line 323 of file Core.hpp.

323{ return moab; }

◆ get_problem() [1/2]

MoFEMErrorCode MoFEM::Core::get_problem ( const std::string & problem_name,
const Problem ** problem_ptr ) const
protectedvirtual

Get problem database (data structure)

Implements MoFEM::CoreInterface.

Definition at line 822 of file Core.cpp.

823 {
825 typedef Problem_multiIndex::index<Problem_mi_tag>::type ProblemsByName;
826 const ProblemsByName &problems = pRoblems.get<Problem_mi_tag>();
827 ProblemsByName::iterator p_miit = problems.find(problem_name);
828 if (p_miit == problems.end()) {
829 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
830 "problem < %s > not found, (top tip: check spelling)",
831 problem_name.c_str());
832 }
833 *problem_ptr = &*p_miit;
835}

◆ get_problem() [2/2]

const Problem * MoFEM::Core::get_problem ( const std::string problem_name) const
protectedvirtual

Get the problem object.

Parameters
problem_name
Returns
const Problem*

Implements MoFEM::CoreInterface.

Definition at line 912 of file Core.cpp.

912 {
913 const Problem *prb;
914 CHK_THROW_MESSAGE(get_problem(problem_name, &prb),
915 "Problem of given name not found");
916 return prb;
917}
MoFEMErrorCode get_problem(const std::string &problem_name, const Problem **problem_ptr) const
Get problem database (data structure)
Definition Core.cpp:822

◆ get_problem_finite_elements_entities()

MoFEMErrorCode MoFEM::Core::get_problem_finite_elements_entities ( const std::string name,
const std::string & fe_name,
const EntityHandle meshset )
protectedvirtual

add finite elements to the meshset

Parameters
nameis problem name
fe_name
meshset

Implements MoFEM::CoreInterface.

Definition at line 912 of file FECore.cpp.

914 {
916 auto &prb = pRoblems.get<Problem_mi_tag>();
917 auto p_miit = prb.find(problem_name);
918 if (p_miit == prb.end())
919 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
920 "No such problem like < %s >", problem_name.c_str());
921
922 auto fe_miit = finiteElements.get<FiniteElement_name_mi_tag>().find(fe_name);
923 if (fe_miit != finiteElements.get<FiniteElement_name_mi_tag>().end()) {
924 auto miit =
925 p_miit->numeredFiniteElementsPtr->get<Unique_mi_tag>().lower_bound(
927 0, (*fe_miit)->getFEUId()));
928 auto hi_miit =
929 p_miit->numeredFiniteElementsPtr->get<Unique_mi_tag>().upper_bound(
931 get_id_for_max_type<MBENTITYSET>(), (*fe_miit)->getFEUId()));
932
933 if (miit != hi_miit) {
934 std::vector<EntityHandle> ents;
935 ents.reserve(std::distance(miit, hi_miit));
936 for (; miit != hi_miit; ++miit)
937 ents.push_back((*miit)->getEnt());
938 int part = (*miit)->getPart();
939 CHKERR get_moab().tag_clear_data(th_Part, &*ents.begin(), ents.size(),
940 &part);
941 CHKERR get_moab().add_entities(meshset, &*ents.begin(), ents.size());
942 }
943 }
944
946}
Tag th_Part
Tag for partition number.
Definition Core.hpp:257

◆ get_problems() [1/2]

const Problem_multiIndex * MoFEM::Core::get_problems ( ) const
protectedvirtual

Get the problems object.

Returns
const Problem_multiIndex*

Implements MoFEM::CoreInterface.

Definition at line 918 of file Core.cpp.

918{ return &pRoblems; }

◆ get_problems() [2/2]

MoFEMErrorCode MoFEM::Core::get_problems ( const Problem_multiIndex ** problems_ptr) const
protectedvirtual

Get pointer to problems multi-index.

Implements MoFEM::CoreInterface.

Definition at line 838 of file Core.cpp.

838 {
840 *problems_ptr = &pRoblems;
842}

◆ get_ref_ents() [1/2]

const RefEntity_multiIndex * MoFEM::Core::get_ref_ents ( ) const
protectedvirtual

Get the ref ents object.

Returns
const RefEntity_multiIndex*

Implements MoFEM::CoreInterface.

Definition at line 896 of file Core.cpp.

896 {
897 return &refinedEntities;
898}

◆ get_ref_ents() [2/2]

MoFEMErrorCode MoFEM::Core::get_ref_ents ( const RefEntity_multiIndex ** refined_ents_ptr) const
protectedvirtual

Get ref entities multi-index from database.

Implements MoFEM::CoreInterface.

Definition at line 810 of file Core.cpp.

810 {
812 *refined_entities_ptr = &refinedEntities;
814}

◆ get_ref_finite_elements() [1/2]

const RefElement_multiIndex * MoFEM::Core::get_ref_finite_elements ( ) const
protectedvirtual

Get the ref finite elements object.

Returns
const RefElement_multiIndex*

Implements MoFEM::CoreInterface.

Definition at line 899 of file Core.cpp.

899 {
900 return &refinedFiniteElements;
901}

◆ get_ref_finite_elements() [2/2]

MoFEMErrorCode MoFEM::Core::get_ref_finite_elements ( const RefElement_multiIndex ** refined_finite_elements_ptr) const
protectedvirtual

Get ref finite elements multi-index form database.

Implements MoFEM::CoreInterface.

Definition at line 815 of file Core.cpp.

816 {
818 *refined_finite_elements_ptr = &refinedFiniteElements;
820}

◆ get_th_RefBitEdge()

Tag MoFEM::CoreTmp< 0 >::get_th_RefBitEdge ( ) const
inline

Definition at line 199 of file Core.hpp.

199{ return th_RefBitEdge; }

◆ get_th_RefBitLevel()

Tag MoFEM::CoreTmp< 0 >::get_th_RefBitLevel ( ) const
inline

Definition at line 198 of file Core.hpp.

198{ return th_RefBitLevel; }

◆ get_th_RefParentHandle()

Tag MoFEM::CoreTmp< 0 >::get_th_RefParentHandle ( ) const
inline

Definition at line 197 of file Core.hpp.

197{ return th_RefParentHandle; }

◆ getBitFEId()

BitFEId MoFEM::Core::getBitFEId ( const std::string & fe_name) const
protected

Get field Id.

Parameters
namefield name
Returns
field id

Definition at line 255 of file FECore.cpp.

255 {
256 auto &fe_by_id = finiteElements.get<FiniteElement_name_mi_tag>();
257 auto miit = fe_by_id.find(fe_name);
258 if (miit == fe_by_id.end())
260 ("finite element < " + fe_name + " > not found (top tip: check spelling)")
261 .c_str());
262 return (*miit)->getId();
263}

◆ getBitFEIdName()

std::string MoFEM::Core::getBitFEIdName ( const BitFEId id) const
protected

Get field name.

Parameters
idfield id
Returns
field name

Definition at line 265 of file FECore.cpp.

265 {
266 auto &fe_by_id = finiteElements.get<BitFEId_mi_tag>();
267 auto miit = fe_by_id.find(id);
268 if (miit == fe_by_id.end())
269 THROW_MESSAGE("finite element not found");
270 return (*miit)->getName();
271}

◆ getBitProblemId()

BitProblemId MoFEM::Core::getBitProblemId ( const std::string & name) const
protected

Definition at line 121 of file ProblemsCore.cpp.

121 {
122 auto p_miit = pRoblems.get<Problem_mi_tag>().find(name);
123 if (p_miit == pRoblems.get<Problem_mi_tag>().end()) {
124 THROW_MESSAGE("no such problem like " + name + " >");
125 }
126 return p_miit->getId();
127}

◆ getBuildMoFEM()

int & MoFEM::CoreTmp< 0 >::getBuildMoFEM ( ) const
inline

Get flags/semaphores for different stages.

Definition at line 225 of file Core.hpp.

225{ return *buildMoFEM; }

◆ getOptions()

MoFEMErrorCode MoFEM::Core::getOptions ( int verb = DEFAULT_VERBOSITY)
protected

Get core options from command line.

Returns
MoFEMErrorCode

Definition at line 777 of file Core.cpp.

777 {
779 if (verb == -1)
780 verb = verbose;
781
782 PetscOptionsBegin(mofemComm, optionsPrefix.c_str(), "Mesh cut options",
783 "See MoFEM documentation");
784
785 CHKERR PetscOptionsBool(
786 "-mofem_init_fields", "Initialise fields on construction", "",
788
789 CHKERR PetscOptionsBool(
790 "-mofem_init_fields", "Initialise fields on construction", "",
792
793 // TODO: Add read verbosity level
794 // TODO: Add option to initalise problems ??? - DO WE REALLY NEED THAT
795
796 PetscOptionsEnd();
797
799}
std::string optionsPrefix
Prefix for options on command line.
Definition Core.hpp:1048

◆ getProblemShift()

BitProblemId MoFEM::CoreTmp< 0 >::getProblemShift ( )
protected

Return unique problem Id.

Each time this function is called, it gives new unit problem Id for bit.

◆ getRefEntity()

RefEntityTmp< 0 > MoFEM::CoreTmp< 0 >::getRefEntity ( const EntityHandle ent)
inline

Definition at line 86 of file Core.hpp.

86 {
87 return RefEntityTmp<0>(this->basicEntityDataPtr, ent);
88 }

◆ getTags()

MoFEMErrorCode MoFEM::Core::getTags ( int verb = DEFAULT_VERBOSITY)
protected

Get tag handles.

Parameters
verbverbosity level
Returns
error code

Definition at line 573 of file Core.cpp.

573 {
575
576 const EntityHandle root_meshset = get_moab().get_root_set();
577 if (root_meshset) {
578 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
579 "Root meshset should be 0");
580 }
581
582 // Set version
583 {
584 Version version;
585 CHKERR getFileVersion(moab, version);
586 }
587
588 // Global Variables
589 {
590
591 auto check_tag_allocated = [](auto &rval) {
593 if (rval == MB_ALREADY_ALLOCATED)
594 rval = MB_SUCCESS;
595 else
596 CHKERRG(rval);
598 };
599
600 // Safety nets
601 int def_bool = 0;
602 rval = get_moab().tag_get_handle("_MoFEMBuild", 1, MB_TYPE_INTEGER,
603 th_MoFEMBuild, MB_TAG_CREAT | MB_TAG_MESH,
604 &def_bool);
605 CHKERR check_tag_allocated(rval);
606
607 CHKERR get_moab().tag_get_by_ptr(th_MoFEMBuild, &root_meshset, 1,
608 (const void **)&buildMoFEM);
609 }
610
611 // Tags saved in vtk-files
612 {
613 const int def_part = -1;
614 CHKERR get_moab().tag_get_handle("PARTITION", 1, MB_TYPE_INTEGER, th_Part,
615 MB_TAG_CREAT | MB_TAG_SPARSE, &def_part);
616 }
617
618 // Tags Ref
619 {
620
621 // Fix size of bir ref level tags
623
624 const int def_part = -1;
625 CHKERR get_moab().tag_get_handle("_MeshsetPartition", 1, MB_TYPE_INTEGER,
626 th_Part, MB_TAG_CREAT | MB_TAG_SPARSE,
627 &def_part);
628 EntityHandle def_handle = 0;
629 CHKERR get_moab().tag_get_handle("_RefParentHandle", 1, MB_TYPE_HANDLE,
631 MB_TAG_CREAT | MB_TAG_SPARSE, &def_handle);
632 BitRefLevel def_bit_level = 0;
633 CHKERR get_moab().tag_get_handle(
634 "_RefBitLevel", sizeof(BitRefLevel), MB_TYPE_OPAQUE, th_RefBitLevel,
635 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_bit_level);
636 BitRefLevel def_bit_level_mask = BitRefLevel().set();
637 CHKERR get_moab().tag_get_handle(
638 "_RefBitLevelMask", sizeof(BitRefLevel), MB_TYPE_OPAQUE,
639 th_RefBitLevel_Mask, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
640 &def_bit_level_mask);
641 BitRefEdges def_bit_edge = 0;
642 CHKERR get_moab().tag_get_handle(
643 "_RefBitEdge", sizeof(BitRefEdges), MB_TYPE_OPAQUE, th_RefBitEdge,
644 MB_TAG_CREAT | MB_TAG_SPARSE | MB_TAG_BYTES, &def_bit_edge);
645 }
646
647 // Tags Field
648 {
649 const unsigned long int def_id = 0;
650 CHKERR get_moab().tag_get_handle(
651 "_FieldId", sizeof(BitFieldId), MB_TYPE_OPAQUE, th_FieldId,
652 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
653 FieldSpace def_space = LASTSPACE;
654 CHKERR get_moab().tag_get_handle(
655 "_FieldSpace", sizeof(FieldSpace), MB_TYPE_OPAQUE, th_FieldSpace,
656 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_space);
657 FieldContinuity def_continuity = LASTCONTINUITY;
658 CHKERR get_moab().tag_get_handle(
659 "_FieldContinuity", sizeof(FieldContinuity), MB_TYPE_OPAQUE,
660 th_FieldContinuity, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
661 &def_continuity);
663 CHKERR get_moab().tag_get_handle(
664 "_FieldBase", sizeof(FieldApproximationBase), MB_TYPE_OPAQUE,
665 th_FieldBase, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_base);
666 const int def_val_len = 0;
667 CHKERR get_moab().tag_get_handle(
668 "_FieldName", def_val_len, MB_TYPE_OPAQUE, th_FieldName,
669 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_VARLEN | MB_TAG_SPARSE, NULL);
670 CHKERR get_moab().tag_get_handle(
671 "_FieldName_DataNamePrefix", def_val_len, MB_TYPE_OPAQUE,
673 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_VARLEN | MB_TAG_SPARSE, NULL);
674 }
675
676 // Tags FE
677 {
678 const unsigned long int def_id = 0;
679 const int def_val_len = 0;
680 CHKERR get_moab().tag_get_handle(
681 "_FEId", sizeof(BitFEId), MB_TYPE_OPAQUE, th_FEId,
682 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
683 CHKERR get_moab().tag_get_handle(
684 "_FEName", def_val_len, MB_TYPE_OPAQUE, th_FEName,
685 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_VARLEN | MB_TAG_SPARSE, NULL);
686 CHKERR get_moab().tag_get_handle(
687 "_FEIdCol", sizeof(BitFieldId), MB_TYPE_OPAQUE, th_FEIdCol,
688 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
689 CHKERR get_moab().tag_get_handle(
690 "_FEIdRow", sizeof(BitFieldId), MB_TYPE_OPAQUE, th_FEIdRow,
691 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
692 CHKERR get_moab().tag_get_handle(
693 "_FEIdData", sizeof(BitFieldId), MB_TYPE_OPAQUE, th_FEIdData,
694 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
695 }
696
697 // Tags Problem
698 {
699 const unsigned long int def_id = 0;
700 const int def_val_len = 0;
701 CHKERR get_moab().tag_get_handle(
702 "_ProblemId", sizeof(BitProblemId), MB_TYPE_OPAQUE, th_ProblemId,
703 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
704 CHKERR get_moab().tag_get_handle(
705 "_ProblemFEId", sizeof(BitFEId), MB_TYPE_OPAQUE, th_ProblemFEId,
706 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE, &def_id);
707 CHKERR get_moab().tag_get_handle(
708 "_ProblemName", def_val_len, MB_TYPE_OPAQUE, th_ProblemName,
709 MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_VARLEN | MB_TAG_SPARSE, NULL);
710 DofIdx def_nbdofs = 0;
711 CHKERR get_moab().tag_get_handle(
712 "_ProblemNbDofsRow", sizeof(DofIdx), MB_TYPE_OPAQUE,
713 th_ProblemNbDofsRow, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
714 &def_nbdofs);
715 CHKERR get_moab().tag_get_handle(
716 "_ProblemNbDofsCol", sizeof(DofIdx), MB_TYPE_OPAQUE,
717 th_ProblemNbDofsCol, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
718 &def_nbdofs);
719 CHKERR get_moab().tag_get_handle(
720 "_ProblemLocalNbDofsRow", sizeof(DofIdx), MB_TYPE_OPAQUE,
721 th_ProblemLocalNbDofRow, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
722 &def_nbdofs);
723 CHKERR get_moab().tag_get_handle(
724 "_ProblemGhostNbDofsRow", sizeof(DofIdx), MB_TYPE_OPAQUE,
725 th_ProblemGhostNbDofRow, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
726 &def_nbdofs);
727 CHKERR get_moab().tag_get_handle(
728 "_ProblemLocalNbDofsCol", sizeof(DofIdx), MB_TYPE_OPAQUE,
729 th_ProblemLocalNbDofCol, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
730 &def_nbdofs);
731 CHKERR get_moab().tag_get_handle(
732 "_ProblemGhostNbDofsCol", sizeof(DofIdx), MB_TYPE_OPAQUE,
733 th_ProblemGhostNbDofCol, MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_SPARSE,
734 &def_nbdofs);
735 }
736
737 // Meshsets with boundary conditions and material sets
738 MeshsetsManager *meshsets_manager_ptr;
739 CHKERR getInterface(meshsets_manager_ptr);
740 CHKERR meshsets_manager_ptr->getTags(verb);
741
742 // Series recorder
743 SeriesRecorder *series_recorder_ptr;
744 CHKERR getInterface(series_recorder_ptr);
745 CHKERR series_recorder_ptr->getTags(verb);
746
748}
FieldApproximationBase
approximation base
Definition definitions.h:58
@ LASTBASE
Definition definitions.h:69
@ LASTSPACE
FieldSpace in [ 0, LASTSPACE )
Definition definitions.h:89
@ LASTCONTINUITY
#define CHKERRG(n)
Check error code of MoFEM/MOAB/PETSc function.
int DofIdx
Index of DOF.
Definition Types.hpp:18
std::bitset< BITREFEDGES_SIZE > BitRefEdges
Definition Types.hpp:34
static MoFEMErrorCode fixTagSize(moab::Interface &moab, bool *changed=nullptr)
Fix tag size when BITREFLEVEL_SIZE of core library is different than file BITREFLEVEL_SIZE.
Tag th_ProblemLocalNbDofCol
Definition Core.hpp:267
Tag th_ProblemLocalNbDofRow
Definition Core.hpp:266
Tag th_ProblemGhostNbDofRow
Definition Core.hpp:266
Tag th_ProblemGhostNbDofCol
Definition Core.hpp:267

◆ getValue()

const int MoFEM::CoreTmp< 0 >::getValue ( ) const
inlinevirtual

Get the core.

Returns
int

Implements MoFEM::CoreInterface.

Reimplemented in MoFEM::CoreTmp<-1 >.

Definition at line 85 of file Core.hpp.

85{ return value; }
static constexpr int value
Definition Core.hpp:84

◆ initialiseDatabaseFromMesh()

MoFEMErrorCode MoFEM::Core::initialiseDatabaseFromMesh ( int verb = DEFAULT_VERBOSITY)
protected

Initialize database getting information on mesh.

Definition at line 300 of file Core.cpp.

300 {
301 BOOST_LOG_SCOPED_THREAD_ATTR("Timeline", attrs::timer());
302 MOFEM_LOG_CHANNEL("WORLD");
303
305 if (verb == -1)
306 verb = verbose;
307
308 Range ref_elems_to_add;
309
310 MOFEM_LOG("WORLD", Sev::verbose) << "Get MoFEM meshsets";
311 // Initialize database
312 Range meshsets;
313 CHKERR get_moab().get_entities_by_type(0, MBENTITYSET, meshsets, false);
314 Range special_meshsets;
315 for (auto mit : meshsets) {
316 BitFieldId field_id;
317 // Get bit id form field tag
318 CHKERR get_moab().tag_get_data(th_FieldId, &mit, 1, &field_id);
319 // Check if meshset if field meshset
320 if (field_id != 0) {
321
322 const void *tag_name;
323 int tag_name_size;
324 CHKERR get_moab().tag_get_by_ptr(
325 th_FieldName, &mit, 1, (const void **)&tag_name, &tag_name_size);
326
327 if (verb > QUIET)
328 MOFEM_LOG("WORLD", Sev::verbose)
329 << "Read field "
330 << boost::string_ref((char *)tag_name, tag_name_size);
331
332 auto p = fIelds.insert(boost::make_shared<Field>(moab, mit));
333
334 if (!p.second) {
335 // Field meshset exists, remove duplicate meshsets from other
336 // processors.
337 Range ents;
338 CHKERR get_moab().get_entities_by_handle(mit, ents, true);
339 CHKERR get_moab().add_entities((*p.first)->getMeshset(), ents);
340 CHKERR get_moab().delete_entities(&mit, 1);
341 } else {
342 special_meshsets.insert(mit);
343 }
344 }
345 // Check for finite elements
346 BitFieldId fe_id;
347 // Get bit id from fe tag
348 CHKERR get_moab().tag_get_data(th_FEId, &mit, 1, &fe_id);
349 // check if meshset is finite element meshset
350 if (fe_id != 0) {
351 std::pair<FiniteElement_multiIndex::iterator, bool> p =
352 finiteElements.insert(
353 boost::shared_ptr<FiniteElement>(new FiniteElement(moab, mit)));
354 if (verb > QUIET)
355 MOFEM_LOG("WORLD", Sev::verbose) << "Read finite element " << **p.first;
356
357 Range ents;
358 CHKERR get_moab().get_entities_by_type(mit, MBENTITYSET, ents, false);
359 CHKERR get_moab().get_entities_by_handle(mit, ents, true);
360 ref_elems_to_add.merge(ents);
361 if (!p.second) {
362 // Finite element mesh set exist, could be created on other processor.
363 // Remove duplicate.
364 CHKERR get_moab().add_entities((*p.first)->getMeshset(), ents);
365 CHKERR get_moab().delete_entities(&mit, 1);
366 } else {
367 special_meshsets.insert(mit);
368 }
369 }
370 BitProblemId problem_id;
371 // get bit id form problem tag
372 CHKERR get_moab().tag_get_data(th_ProblemId, &mit, 1, &problem_id);
373 // check if meshset if problem meshset
374 if (problem_id != 0) {
375 std::pair<Problem_multiIndex::iterator, bool> p =
376 pRoblems.insert(Problem(moab, mit));
377 if (verb > QUIET) {
378 MOFEM_LOG("WORLD", Sev::verbose) << "Read problem " << *p.first;
379 MOFEM_LOG("WORLD", Sev::noisy)
380 << "\tBitRef " << p.first->getBitRefLevel() << " BitMask "
381 << p.first->getBitRefLevelMask();
382 }
383
384 if (!p.second) {
385 // Problem meshset exists, could be created on other processor.
386 // Remove duplicate.
387 Range ents;
388 CHKERR get_moab().get_entities_by_handle(mit, ents, true);
389 CHKERR get_moab().get_entities_by_type(mit, MBENTITYSET, ents, true);
390 CHKERR get_moab().add_entities(p.first->meshset, ents);
391 CHKERR get_moab().delete_entities(&mit, 1);
392 } else {
393 special_meshsets.insert(mit);
394 }
395 }
396 }
397 MOFEM_LOG("WORLD", Sev::verbose) << "Get MoFEM meshsets <- done";
398
399 // Add entities to database
400 MOFEM_LOG("WORLD", Sev::verbose) << "Add entities to database";
401 Range bit_ref_ents;
402 CHKERR get_moab().get_entities_by_handle(0, bit_ref_ents, false);
403 bit_ref_ents = subtract(bit_ref_ents, special_meshsets);
404 CHKERR getInterface<BitRefManager>()->filterEntitiesByRefLevel(
405 BitRefLevel().set(), BitRefLevel().set(), bit_ref_ents);
406 CHKERR getInterface<BitRefManager>()->setEntitiesBitRefLevel(bit_ref_ents);
407 CHKERR getInterface<BitRefManager>()->setElementsBitRefLevel(
408 ref_elems_to_add);
409 MOFEM_LOG("WORLD", Sev::verbose) << "Add entities to database <- done";
410
411 // Build field entities
412 MOFEM_LOG("WORLD", Sev::verbose) << "Add field to database";
413 for (auto field : fIelds) {
414 if (field->getSpace() != NOSPACE) {
415 Range ents_of_id_meshset;
416 CHKERR get_moab().get_entities_by_handle(field->getMeshset(),
417 ents_of_id_meshset, false);
418 CHKERR set_field_order(ents_of_id_meshset, field->getId(), -1, verb);
419 }
420 }
421 MOFEM_LOG("WORLD", Sev::verbose) << "Add field to database <- done";
422
424 MOFEM_LOG("WORLD", Sev::verbose) << "Build fields elements";
425 CHKERR build_fields(verb);
426 MOFEM_LOG("WORLD", Sev::verbose) << "Build fields elements <- done";
428 MOFEM_LOG("WORLD", Sev::verbose) << "Build finite elements";
430 MOFEM_LOG("WORLD", Sev::verbose) << "Build finite elements <- done";
431 }
432 }
433
434 if (verb > VERY_NOISY) {
435 list_fields();
437 list_problem();
438 }
439
440 // Initialize interfaces
441 MOFEM_LOG("WORLD", Sev::verbose) << "Initialise interfaces from mesh";
442
443 MOFEM_LOG("WORLD", Sev::verbose) << "Initialise MeshsetManager";
445 MOFEM_LOG("WORLD", Sev::verbose) << "Initialise MeshsetManager <- done";
446 MOFEM_LOG("WORLD", Sev::verbose) << "Initialise SeriesRecorder";
448 MOFEM_LOG("WORLD", Sev::verbose) << "Initialise SeriesRecorder <- done";
449
450 MOFEM_LOG("WORLD", Sev::verbose) << "Initialise interfaces from mesh <- done";
451
453}
@ NOSPACE
Definition definitions.h:83
MoFEMErrorCode list_problem() const
list problems
MoFEMErrorCode set_field_order(const Range &ents, const BitFieldId id, const ApproximationOrder order, int verb=DEFAULT_VERBOSITY)
MoFEMErrorCode build_finite_elements(int verb=DEFAULT_VERBOSITY)
Build finite elements.
Definition FECore.cpp:656
MoFEMErrorCode build_fields(int verb=DEFAULT_VERBOSITY)
MoFEMErrorCode list_finite_elements() const
list finite elements in database
Definition FECore.cpp:320
MoFEMErrorCode list_fields() const
list entities in the field

◆ Initialize()

MoFEMErrorCode MoFEM::Core::Initialize ( int * argc,
char *** args,
const char file[],
const char help[] )
static

Initializes the MoFEM database PETSc, MOAB and MPI.

Note
This function calls PetscInitialize, for more details see http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Sys/PetscInitialize.html

Example:

int main(int argc, char *argv[]) {
// Initailise MoFEM and Petsc
MoFEM::Core::Initialize(&argc, &argv, (char *)0, help);
try {
moab::Core mb_instance; // MoAB database
moab::Interface &moab = mb_instance;
MoFEM::Core core(moab); // MOFEM database
MoFEM::CoreInterface &m_field = core;
CHKERR foo(); // Call function
}
}
static char help[]
int main()
#define CATCH_ERRORS
Catch errors.
Core (interface) class.
Definition Core.hpp:82
static MoFEMErrorCode Initialize(int *argc, char ***args, const char file[], const char help[])
Initializes the MoFEM database PETSc, MOAB and MPI.
Definition Core.cpp:72
static MoFEMErrorCode Finalize()
Checks for options to be called at the conclusion of the program.
Definition Core.cpp:118
Parameters
argccount of number of command line arguments
argsthe command line arguments
file[optional] PETSc database file, also checks ~username/.petscrc
  • and .petscrc use NULL to not check for code specific file. Use * -skip_petscrc in the code specific file to skip the .petscrc files
help[optional] Help message to print, use NULL for no message
Returns
MoFEMErrorCode
Examples
add_blockset.cpp, add_cubit_meshsets.cpp, adolc_plasticity.cpp, analytical_nonlinear_poisson.cpp, analytical_poisson.cpp, analytical_poisson_field_split.cpp, approx_sphere.cpp, bernstein_bezier_generate_base.cpp, bone_adaptation.cpp, boundary_marker.cpp, build_large_problem.cpp, build_problems.cpp, child_and_parent.cpp, continuity_check_on_contact_prism_side_ele.cpp, continuity_check_on_skeleton_3d.cpp, continuity_check_on_skeleton_with_simple_2d_for_h1.cpp, continuity_check_on_skeleton_with_simple_2d_for_hcurl.cpp, continuity_check_on_skeleton_with_simple_2d_for_hdiv.cpp, cubit_bc_test.cpp, delete_ho_nodes.cpp, dg_projection.cpp, dm_build_partitioned_mesh.cpp, dm_create_subdm.cpp, dm_partitioned_no_field.cpp, dynamic_first_order_con_law.cpp, edge_and_bubble_shape_functions_on_quad.cpp, eigen_elastic.cpp, elasticity.cpp, elasticity_mixed_formulation.cpp, ep.cpp, field_blas.cpp, field_evaluator.cpp, field_to_vertices.cpp, forces_and_sources_testing_edge_element.cpp, forces_and_sources_testing_flat_prism_element.cpp, forces_and_sources_testing_users_base.cpp, free_surface.cpp, gauss_points_on_outer_product.cpp, hanging_node_approx.cpp, hcurl_check_approx_in_2d.cpp, hcurl_curl_operator.cpp, hcurl_divergence_operator_2d.cpp, hdiv_check_approx_in_3d.cpp, hdiv_divergence_operator.cpp, heat_equation.cpp, heat_method.cpp, hello_world.cpp, helmholtz.cpp, higher_derivatives.cpp, level_set.cpp, log.cpp, loop_entities.cpp, lorentz_force.cpp, magnetostatic.cpp, matrix_function.cpp, mesh_cut.cpp, mesh_insert_interface_atom.cpp, mesh_smoothing.cpp, meshset_to_vtk.cpp, minimal_surface_area.cpp, mixed_poisson.cpp, mofem/tutorials/vec-7/adjoint.cpp, navier_stokes.cpp, node_merge.cpp, nonlinear_dynamics.cpp, operators_tests.cpp, partition_mesh.cpp, petsc_smart_ptr_objects.cpp, phase.cpp, photon_diffusion.cpp, plastic.cpp, plate.cpp, plot_base.cpp, poisson_2d_dis_galerkin.cpp, poisson_2d_homogeneous.cpp, prism_elements_from_surface.cpp, prism_polynomial_approximation.cpp, quad_polynomial_approximation.cpp, reaction_diffusion.cpp, remove_entities_from_problem.cpp, remove_entities_from_problem_not_partitioned.cpp, scalar_check_approximation.cpp, schur_test_diag_mat.cpp, seepage.cpp, shallow_wave.cpp, simple_elasticity.cpp, simple_interface.cpp, simple_l2_only.cpp, split_sideset.cpp, tensor_divergence_operator.cpp, test_broken_space.cpp, test_cache_on_entities.cpp, testing_jacobian_of_hook_element.cpp, testing_jacobian_of_hook_scaled_with_density_element.cpp, thermo_elastic.cpp, unsaturated_transport.cpp, and wave_equation.cpp.

Definition at line 72 of file Core.cpp.

73 {
74
75 MPI_Initialized(&mpiInitialised);
76 if (!mpiInitialised)
77 MPI_Init(argc, args);
78
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];
84 break;
85 }
86 }
87 PetscInitialize(argc, args, file, help);
88 PetscPushErrorHandler(mofem_error_handler, PETSC_NULLPTR);
89 }
90
91 LogManager::createDefaultSinks(MPI_COMM_WORLD);
92 PetscVFPrintf = LogManager::logPetscFPrintf;
95
96 MOFEM_LOG_CHANNEL("WORLD");
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);
103
104 auto log_time = [&](const auto perefix, auto time) {
105 MOFEM_LOG("WORLD", Sev::inform)
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();
109 };
110
111 // Get current system time
112 log_time("Local time: ", boost::posix_time::second_clock::local_time());
113 log_time("UTC time: ", boost::posix_time::second_clock::universal_time());
114
115 return MOFEM_SUCCESS;
116}
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)
@ MOFEM_SUCCESS
Definition definitions.h:30
FTensor::Index< 'i', SPACE_DIM > i
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.

◆ list_dofs_by_field_name()

MoFEMErrorCode MoFEM::Core::list_dofs_by_field_name ( const std::string & name) const
protectedvirtual

list dofs

Implements MoFEM::CoreInterface.

Definition at line 1336 of file FieldCore.cpp.

1336 {
1338 auto dit = dofsField.get<Unique_mi_tag>().lower_bound(
1340 auto hi_dit = dofsField.get<Unique_mi_tag>().upper_bound(
1342 MOFEM_LOG("SYNC", Sev::inform) << "List DOFs:";
1343 for (; dit != hi_dit; dit++)
1344 MOFEM_LOG("SYNC", Sev::inform) << *dit;
1345
1348}

◆ list_fields()

MoFEMErrorCode MoFEM::Core::list_fields ( ) const
protectedvirtual

list entities in the field

Implements MoFEM::CoreInterface.

Definition at line 1350 of file FieldCore.cpp.

1350 {
1352 MOFEM_LOG("SYNC", Sev::inform) << "List Fields:";
1353 for (auto &miit : fIelds.get<BitFieldId_mi_tag>())
1354 MOFEM_LOG("SYNC", Sev::inform) << *miit;
1355
1358}

◆ list_finite_elements()

MoFEMErrorCode MoFEM::Core::list_finite_elements ( ) const
protectedvirtual

list finite elements in database

Implements MoFEM::CoreInterface.

Definition at line 320 of file FECore.cpp.

320 {
322 for (auto &fe : finiteElements.get<FiniteElement_name_mi_tag>())
323 MOFEM_LOG("SYNC", Sev::inform) << fe;
324
327}

◆ list_problem()

MoFEMErrorCode MoFEM::Core::list_problem ( ) const
protectedvirtual

list problems

Implements MoFEM::CoreInterface.

Definition at line 129 of file ProblemsCore.cpp.

129 {
131 typedef Problem_multiIndex::index<BitProblemId_mi_tag>::type ProblemById;
132 const ProblemById &set_id = pRoblems.get<BitProblemId_mi_tag>();
133 ProblemById::iterator miit = set_id.begin();
134 for (; miit != set_id.end(); miit++) {
135 std::ostringstream ss;
136 ss << *miit << std::endl;
137 PetscPrintf(mofemComm, "%s", ss.str().c_str());
138 }
140}

◆ loop_dofs() [1/4]

MoFEMErrorCode MoFEM::Core::loop_dofs ( const Problem * problem_ptr,
const std::string & field_name,
RowColData rc,
DofMethod & method,
int lower_rank,
int upper_rank,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Make a loop over dofs.

Implements MoFEM::CoreInterface.

Definition at line 531 of file ProblemsCore.cpp.

534 {
536 SET_BASIC_METHOD(method, &*problem_ptr);
537 typedef NumeredDofEntity_multiIndex::index<Unique_mi_tag>::type
538 NumeredDofsByUId;
539 NumeredDofsByUId *dofs;
540 switch (rc) {
541 case ROW:
542 dofs = &problem_ptr->numeredRowDofsPtr->get<Unique_mi_tag>();
543 break;
544 case COL:
545 dofs = &problem_ptr->numeredColDofsPtr->get<Unique_mi_tag>();
546 break;
547 default:
548 SETERRQ(mofemComm, MOFEM_DATA_INCONSISTENCY, "Not implemented");
549 }
550
551 auto field_it = fIelds.get<FieldName_mi_tag>().find(field_name);
552 if (field_it != fIelds.get<FieldName_mi_tag>().end()) {
553 method.fieldPtr = *field_it;
554 } else {
555 SETERRQ(mofemComm, MOFEM_NOT_FOUND, "Field not found %s",
556 field_name.c_str());
557 }
558
559 auto miit = dofs->lower_bound(
560 FieldEntity::getLoBitNumberUId((*field_it)->getBitNumber()));
561 auto hi_miit = dofs->upper_bound(
562 FieldEntity::getHiBitNumberUId((*field_it)->getBitNumber()));
563
564 method.loopSize = std::distance(miit, hi_miit);
565 method.loHiFERank = std::make_pair(lower_rank, upper_rank);
566
567 CHKERR method.preProcess();
568
569 int nn = 0;
570 for (; miit != hi_miit; miit++, nn++) {
571 if ((*miit)->getPart() >= lower_rank && (*miit)->getPart() <= upper_rank) {
572 method.nInTheLoop = nn; // Index of element in the loop
573 method.dofPtr = miit->get()->getDofEntityPtr();
574 method.dofNumeredPtr = *miit;
575 CHKERR method();
576 }
577 }
578
579 CHKERR method.postProcess();
581}
#define SET_BASIC_METHOD(METHOD, PROBLEM_PTR)

◆ loop_dofs() [2/4]

MoFEMErrorCode MoFEM::Core::loop_dofs ( const std::string & field_name,
DofMethod & method,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Make a loop over dofs.

Implements MoFEM::CoreInterface.

Definition at line 617 of file ProblemsCore.cpp.

618 {
620 if (verb == DEFAULT_VERBOSITY)
621 verb = verbose;
622 SET_BASIC_METHOD(method, nullptr);
623
624 auto field_it = fIelds.get<FieldName_mi_tag>().find(field_name);
625 if (field_it != fIelds.get<FieldName_mi_tag>().end()) {
626 method.fieldPtr = *field_it;
627 } else {
628 SETERRQ(mofemComm, MOFEM_NOT_FOUND, "Field not found %s",
629 field_name.c_str());
630 }
631
632 auto miit = dofsField.get<Unique_mi_tag>().lower_bound(
633 FieldEntity::getLoBitNumberUId((*field_it)->getBitNumber()));
634 auto hi_miit = dofsField.get<Unique_mi_tag>().upper_bound(
635 FieldEntity::getHiBitNumberUId((*field_it)->getBitNumber()));
636
637 method.loopSize = std::distance(miit, hi_miit);
638 method.loHiFERank = std::make_pair(0, get_comm_size());
639
640 CHKERR method.preProcess();
641 for (int nn = 0; miit != hi_miit; miit++, nn++) {
642 method.nInTheLoop = nn;
643 method.dofPtr = *miit;
644 CHKERR method();
645 }
646 CHKERR method.postProcess();
648}
int get_comm_size() const
Definition Core.hpp:1026

◆ loop_dofs() [3/4]

MoFEMErrorCode MoFEM::Core::loop_dofs ( const std::string & problem_name,
const std::string & field_name,
RowColData rc,
DofMethod & method,
int lower_rank,
int upper_rank,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Make a loop over dofs.

Implements MoFEM::CoreInterface.

Definition at line 583 of file ProblemsCore.cpp.

591 {
593 if (verb == DEFAULT_VERBOSITY)
594 verb = verbose;
595 typedef Problem_multiIndex::index<Problem_mi_tag>::type ProblemsByName;
596 // find p_miit
597 ProblemsByName &pRoblems_set = pRoblems.get<Problem_mi_tag>();
598 ProblemsByName::iterator p_miit = pRoblems_set.find(problem_name);
599 if (p_miit == pRoblems_set.end())
600 SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_FOUND, "problem not in database %s",
601 problem_name.c_str());
602 CHKERR loop_dofs(&*p_miit, field_name, rc, method, lower_rank, upper_rank,
603 verb);
605}
MoFEMErrorCode loop_dofs(const Problem *problem_ptr, const std::string &field_name, RowColData rc, DofMethod &method, int lower_rank, int upper_rank, int verb=DEFAULT_VERBOSITY)
Make a loop over dofs.

◆ loop_dofs() [4/4]

MoFEMErrorCode MoFEM::Core::loop_dofs ( const std::string & problem_name,
const std::string & field_name,
RowColData rc,
DofMethod & method,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Make a loop over dofs.

Implements MoFEM::CoreInterface.

Definition at line 607 of file ProblemsCore.cpp.

609 {
611 if (verb == DEFAULT_VERBOSITY)
612 verb = verbose;
613 CHKERR loop_dofs(problem_name, field_name, rc, method, 0, sIze, verb);
615}

◆ loop_entities() [1/4]

MoFEMErrorCode MoFEM::Core::loop_entities ( const Problem * problem_ptr,
const std::string field_name,
RowColData rc,
EntityMethod & method,
int lower_rank,
int upper_rank,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Loop over field entities in the problem.

Parameters
problem_ptr
field_name
rc
method
lower_rank
upper_rank
verb
Returns
MoFEMErrorCode

Implements MoFEM::CoreInterface.

Definition at line 650 of file ProblemsCore.cpp.

653 {
655 if (verb == DEFAULT_VERBOSITY)
656 verb = verbose;
657 decltype(problem_ptr->numeredRowDofsPtr) dofs;
658 switch (rc) {
659 case ROW:
660 dofs = problem_ptr->numeredRowDofsPtr;
661 break;
662 case COL:
663 dofs = problem_ptr->numeredColDofsPtr;
664 break;
665 default:
667 "It works only with rows or columns");
668 }
669
670 auto field_it = fIelds.get<FieldName_mi_tag>().find(field_name);
671 if (field_it != fIelds.get<FieldName_mi_tag>().end()) {
672 method.fieldPtr = *field_it;
673 } else {
674 SETERRQ(mofemComm, MOFEM_NOT_FOUND, "Field not found %s",
675 field_name.c_str());
676 }
677
678 auto miit = dofs->lower_bound(
679 FieldEntity::getLoBitNumberUId((*field_it)->getBitNumber()));
680 auto hi_miit = dofs->upper_bound(
681 FieldEntity::getHiBitNumberUId((*field_it)->getBitNumber()));
682
683 using FieldEntity_view_multiIndex = multi_index_container<
684
685 boost::shared_ptr<FieldEntity>,
686 indexed_by<
687
688 ordered_unique<
689
690 tag<Ent_mi_tag>,
693
694 >>;
695
696 FieldEntity_view_multiIndex ents_view;
697 auto hint = ents_view.begin();
698 for (; miit != hi_miit; ++miit)
699 if ((*miit)->getPart() >= lower_rank && (*miit)->getPart() <= upper_rank)
700 ents_view.emplace_hint(hint, (*miit)->getFieldEntityPtr());
701
702 SET_BASIC_METHOD(method, problem_ptr);
703
704 method.loopSize = ents_view.size();
705 method.loHiFERank = std::make_pair(lower_rank, upper_rank);
706
707 CHKERR method.preProcess();
708 method.nInTheLoop = 0;
709 for (auto &field_ent : ents_view) {
710 method.entPtr = field_ent;
711 CHKERR method();
712 ++method.nInTheLoop;
713 }
714 CHKERR method.postProcess();
716}
interface_RefEntity< RefEntity > interface_type_RefEntity

◆ loop_entities() [2/4]

MoFEMErrorCode MoFEM::Core::loop_entities ( const std::string field_name,
EntityMethod & method,
Range const *const ents = nullptr,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Loop over field entities.

Parameters
field_namefield entities
methoduser method
entsif given loop only on subset of entities in the field
verb
Returns
MoFEMErrorCode

Implements MoFEM::CoreInterface.

Definition at line 742 of file ProblemsCore.cpp.

744 {
746 if (verb == DEFAULT_VERBOSITY)
747 verb = verbose;
748 SET_BASIC_METHOD(method, nullptr);
749
750 auto field_it = fIelds.get<FieldName_mi_tag>().find(field_name);
751 if (field_it != fIelds.get<FieldName_mi_tag>().end()) {
752 method.fieldPtr = *field_it;
753 } else {
754 SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_FOUND, "Field not found %s",
755 field_name.c_str());
756 }
757
758 auto lo_eit = entsFields.get<Unique_mi_tag>().lower_bound(
759 FieldEntity::getLoBitNumberUId((*field_it)->getBitNumber()));
760 auto hi_eit = entsFields.get<Unique_mi_tag>().upper_bound(
761 FieldEntity::getHiBitNumberUId((*field_it)->getBitNumber()));
762
763 typedef multi_index_container<
764 boost::shared_ptr<FieldEntity>,
765 indexed_by<ordered_unique<
766 tag<Ent_mi_tag>, const_mem_fun<FieldEntity::interface_RefEntity,
768 FieldEntity_view_multiIndex;
769
770 FieldEntity_view_multiIndex ents_view;
771 ents_view.insert(lo_eit, hi_eit);
772
773 method.loopSize = ents_view.size();
774 method.loHiFERank = std::make_pair(0, get_comm_size());
775
776 CHKERR method.preProcess();
777 method.nInTheLoop = 0;
778
779 if (ents)
780 for (auto p = ents->const_pair_begin(); p != ents->const_pair_end(); ++p)
781 for (auto feit = ents_view.lower_bound(p->first);
782 feit != ents_view.upper_bound(p->second); ++feit) {
783 method.entPtr = *feit;
784 CHKERR method();
785 ++method.nInTheLoop;
786 }
787 else
788 for (auto &field_ent : ents_view) {
789 method.entPtr = field_ent;
790 CHKERR method();
791 ++method.nInTheLoop;
792 }
793
794 CHKERR method.postProcess();
796}
interface_RefEntity(const boost::shared_ptr< RefEntity > &sptr)

◆ loop_entities() [3/4]

MoFEMErrorCode MoFEM::Core::loop_entities ( const std::string problem_name,
const std::string field_name,
RowColData rc,
EntityMethod & method,
int lower_rank,
int upper_rank,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Loop over field entities in the problem.

Parameters
problem_name
field_name
rc
method
lower_rank
upper_rank
verb
Returns
MoFEMErrorCode

Implements MoFEM::CoreInterface.

Definition at line 718 of file ProblemsCore.cpp.

721 {
723 if (verb == DEFAULT_VERBOSITY)
724 verb = verbose;
725 // find p_miit
726 auto &prb = pRoblems.get<Problem_mi_tag>();
727 auto p_miit = prb.find(problem_name);
728 if (p_miit == prb.end())
729 SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_FOUND, "problem not in database %s",
730 problem_name.c_str());
731 CHKERR loop_entities(&*p_miit, field_name, rc, method, lower_rank, upper_rank,
732 verb);
734}
MoFEMErrorCode loop_entities(const Problem *problem_ptr, const std::string field_name, RowColData rc, EntityMethod &method, int lower_rank, int upper_rank, int verb=DEFAULT_VERBOSITY)
Loop over field entities in the problem.

◆ loop_entities() [4/4]

MoFEMErrorCode MoFEM::Core::loop_entities ( const std::string problem_name,
const std::string field_name,
RowColData rc,
EntityMethod & method,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Loop over field entities in the problem.

Parameters
problem_name
field_name
rc
method
verb
Returns
MoFEMErrorCode

Implements MoFEM::CoreInterface.

Definition at line 736 of file ProblemsCore.cpp.

738 {
739 return loop_entities(problem_name, field_name, rc, method, rAnk, rAnk, verb);
740}

◆ loop_finite_elements() [1/3]

MoFEMErrorCode MoFEM::Core::loop_finite_elements ( const Problem * problem_ptr,
const std::string & fe_name,
FEMethod & method,
int lower_rank,
int upper_rank,
boost::shared_ptr< NumeredEntFiniteElement_multiIndex > fe_ptr = nullptr,
MoFEMTypes bh = MF_EXIST,
CacheTupleWeakPtr cache_ptr = CacheTupleSharedPtr(),
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Make a loop over finite elements on partitions from upper to lower rank.

This function is like swiss knife, is can be used to post-processing or matrix and vectors assembly. It makes loop over given finite element for given problem. The particular methods executed on each element are given by class derived form Interface::FEMethod. At beginning of each loop user defined function (method) preProcess() is called, for each element operator() is executed, at the end loop finalizes with user defined function (method) postProcess().

Note
If fe_ptr is given it is expected that multi-index is supbes of problem multi-index. If this is not the case behavior of the code is undetermined.

For more details please look to examples.

Interface::FEMethod

Parameters
problem_ptrpointer to problem consisting set of elements
fe_namename of element in problem
methodclass derived form Interface::FEMethod
lower_ranklower rank of process owned by finite element
upper_ranklower rank of process owned by finite element
fe_ptrpointer to finite elements multi-index
bhif bH = MF_EXIST, throws error if fe_name does not exist
cache_datacache data vector
cache_rowcache row vector
cache_colcache row vector
verbverbosity level
Returns
error code

Implements MoFEM::CoreInterface.

Definition at line 427 of file ProblemsCore.cpp.

431 {
433 if (verb == DEFAULT_VERBOSITY)
434 verb = verbose;
435
436 CacheTupleSharedPtr tmp_cache_ptr;
437 if (!cache_ptr.use_count()) {
438 tmp_cache_ptr = boost::make_shared<CacheTuple>();
439 CHKERR cache_problem_entities(problem_ptr->getName(), tmp_cache_ptr);
440 method.cacheWeakPtr = tmp_cache_ptr;
441 } else {
442 method.cacheWeakPtr = cache_ptr;
443 }
444
445 if (!fe_ptr)
446 fe_ptr = problem_ptr->numeredFiniteElementsPtr;
447
448 auto miit = fe_ptr->get<Composite_Name_And_Part_mi_tag>().lower_bound(
449 boost::make_tuple(fe_name, lower_rank));
450 auto hi_miit = fe_ptr->get<Composite_Name_And_Part_mi_tag>().upper_bound(
451 boost::make_tuple(fe_name, upper_rank));
452
453 if (miit == hi_miit && (bh & MF_EXIST)) {
454 if (!check_finite_element(fe_name)) {
455 SETERRQ(mofemComm, MOFEM_NOT_FOUND, "finite element < %s > not found",
456 fe_name.c_str());
457 }
458 }
459
460 method.feName = fe_name;
461 method.loopSize =
462 std::distance(miit, hi_miit); // Set numbers of elements in the loop
463 method.loHiFERank = std::make_pair(lower_rank, upper_rank);
464
465 SET_BASIC_METHOD(method, &*problem_ptr)
466
467 PetscLogEventBegin(MOFEM_EVENT_preProcess, 0, 0, 0, 0);
468 CHKERR method.preProcess();
469 PetscLogEventEnd(MOFEM_EVENT_preProcess, 0, 0, 0, 0);
470
471 PetscLogEventBegin(MOFEM_EVENT_operator, 0, 0, 0, 0);
472 for (int nn = 0; miit != hi_miit; miit++, nn++) {
473
474 method.nInTheLoop = nn; // Index of element in the loop
475 method.numeredEntFiniteElementPtr = *miit;
476
477 if (method.exeTestHook) {
478 if (method.exeTestHook(&method)) {
479 CHKERR method();
480 }
481 } else {
482 CHKERR method();
483 }
484
485 }
486 PetscLogEventEnd(MOFEM_EVENT_operator, 0, 0, 0, 0);
487
488 PetscLogEventBegin(MOFEM_EVENT_postProcess, 0, 0, 0, 0);
489 CHKERR method.postProcess();
490 PetscLogEventEnd(MOFEM_EVENT_postProcess, 0, 0, 0, 0);
491
493}
boost::shared_ptr< CacheTuple > CacheTupleSharedPtr
bool check_finite_element(const std::string &name) const
Check if finite element is in database.
Definition FECore.cpp:35
MoFEMErrorCode cache_problem_entities(const std::string prb_name, CacheTupleWeakPtr cache_ptr)
Cache variables.

◆ loop_finite_elements() [2/3]

MoFEMErrorCode MoFEM::Core::loop_finite_elements ( const std::string problem_name,
const std::string & fe_name,
FEMethod & method,
boost::shared_ptr< NumeredEntFiniteElement_multiIndex > fe_ptr = nullptr,
MoFEMTypes bh = MF_EXIST,
CacheTupleWeakPtr cache_ptr = CacheTupleSharedPtr(),
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Make a loop over finite elements.

This function is like swiss knife, is can be used to post-processing or matrix and vectors assembly. It makes loop over given finite element for given problem. The particular methods executed on each element are given by class derived form Interface::FEMethod. At beginning of each loop user defined function (method) preProcess() is called, for each element operator() is executed, at the end loop finalizes with user defined function (method) postProcess().

Methods are executed only for local elements at given processor.

For more details pleas look to examples.

Note
If fe_ptr is given it is expected that multi-index is supbes of problem multi-index. If this is not the case behavior of the code is undetermined.
Parameters
problem_nameproblem consisting set of elements
fe_namename of element in problem
methodclass derived form Interface::FEMethod
fe_ptrpointer to finite elements multi-index
bhif bH = MF_EXIST, throws error if fe_name does not exist
cache_tuple_ptrcache
verbverbosity level
Returns
error code

Implements MoFEM::CoreInterface.

Definition at line 495 of file ProblemsCore.cpp.

499 {
501 if (verb == DEFAULT_VERBOSITY)
502 verb = verbose;
503
504 CHKERR loop_finite_elements(problem_name, fe_name, method, rAnk, rAnk, fe_ptr,
505 bh, cache_ptr, verb);
506
508}
MoFEMErrorCode loop_finite_elements(const Problem *problem_ptr, const std::string &fe_name, FEMethod &method, int lower_rank, int upper_rank, boost::shared_ptr< NumeredEntFiniteElement_multiIndex > fe_ptr=nullptr, MoFEMTypes bh=MF_EXIST, CacheTupleWeakPtr cache_ptr=CacheTupleSharedPtr(), int verb=DEFAULT_VERBOSITY)
Make a loop over finite elements on partitions from upper to lower rank.

◆ loop_finite_elements() [3/3]

MoFEMErrorCode MoFEM::Core::loop_finite_elements ( const std::string problem_name,
const std::string & fe_name,
FEMethod & method,
int lower_rank,
int upper_rank,
boost::shared_ptr< NumeredEntFiniteElement_multiIndex > fe_ptr = nullptr,
MoFEMTypes bh = MF_EXIST,
CacheTupleWeakPtr cache_ptr = CacheTupleSharedPtr(),
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Make a loop over finite elements on partitions from upper to lower rank.

This function is like swiss knife, is can be used to post-processing or matrix and vectors assembly. It makes loop over given finite element for given problem. The particular methods executed on each element are given by class derived form Interface::FEMethod. At beginning of each loop user defined function (method) preProcess() is called, for each element operator() is executed, at the end loop finalizes with user defined function (method) postProcess().

Note
If fe_ptr is given it is expected that multi-index is supbes of problem multi-index. If this is not the case behavior of the code is undetermined.

For more details please look to examples.

Parameters
problem_namepointer to problem consisting set of elements
fe_namename of element in problem
methodclass derived form Interface::FEMethod
lower_ranklower rank of process owned by finite element
upper_ranklower rank of process owned by finite element
fe_ptrpointer to finite elements multi-index
bhif bH = MF_EXIST, throws error if fe_name does not exist
cache_datacache data vector
cache_rowcache row vector
cache_colcache row vector
verbverbosity level
Returns
error code

Implements MoFEM::CoreInterface.

Definition at line 510 of file ProblemsCore.cpp.

514 {
516 if (verb == DEFAULT_VERBOSITY)
517 verb = verbose;
518
519 auto &prb_by_name = pRoblems.get<Problem_mi_tag>();
520 auto p_miit = prb_by_name.find(problem_name);
521 if (p_miit == prb_by_name.end())
522 SETERRQ(mofemComm, MOFEM_INVALID_DATA, "Problem <%s> is not in database",
523 problem_name.c_str());
524
525 CHKERR loop_finite_elements(&*p_miit, fe_name, method, lower_rank, upper_rank,
526 fe_ptr, bh, cache_ptr, verb);
527
529}
@ MOFEM_INVALID_DATA
Definition definitions.h:36

◆ make_shared_ref_entity()

boost::shared_ptr< RefEntityTmp< 0 > > MoFEM::Core::make_shared_ref_entity ( const EntityHandle ent)
virtual

Get RefEntity.

Parameters
ent
Returns
boost::shared_ptr<RefEntityTmp<0>>

Implements MoFEM::CoreInterface.

Reimplemented in MoFEM::CoreTmp<-1 >.

Definition at line 983 of file Core.cpp.

983 {
984 return this->makeSharedRefEntity(*this, ent);
985}
static boost::shared_ptr< RefEntityTmp< 0 > > makeSharedRefEntity(MoFEM::Interface &m_field, const EntityHandle ent)
Definition Core.cpp:949

◆ makeSharedRefEntity()

boost::shared_ptr< RefEntityTmp< 0 > > MoFEM::Core::makeSharedRefEntity ( MoFEM::Interface & m_field,
const EntityHandle ent )
static

Definition at line 949 of file Core.cpp.

949 {
950
951 boost::shared_ptr<RefEntityTmp<0>> ref_ent_ptr;
952
953 switch (m_field.getValue()) {
954 case -1:
955 ref_ent_ptr = boost::shared_ptr<RefEntityTmp<0>>(
956
957 new RefEntityTmp<-1>(m_field.get_basic_entity_data_ptr(), ent)
958
959 );
960 break;
961 case 0:
962 ref_ent_ptr = boost::shared_ptr<RefEntityTmp<0>>(
963
964 new RefEntityTmp<0>(m_field.get_basic_entity_data_ptr(), ent)
965
966 );
967 break;
968 case 1:
969 ref_ent_ptr = boost::shared_ptr<RefEntityTmp<0>>(
970
971 new RefEntityTmp<1>(m_field.get_basic_entity_data_ptr(), ent)
972
973 );
974 break;
975 default:
976 THROW_MESSAGE("Core index can vary from -1 to MAX_CORE_TMP");
977 }
978
979 return ref_ent_ptr;
980}
virtual const int getValue() const =0
Get the core.
virtual boost::shared_ptr< BasicEntityData > & get_basic_entity_data_ptr()=0
Get pointer to basic entity data.

◆ modify_finite_element_add_field_col()

MoFEMErrorCode MoFEM::Core::modify_finite_element_add_field_col ( const std::string & fe_name,
const std::string name_row )
protectedvirtual

set field col which finite element use

Note
add_file is a collective, should be executed on all processors. Otherwise could lead to deadlock.
Parameters
namefinite element name
namefield name

Implements MoFEM::CoreInterface.

Definition at line 182 of file FECore.cpp.

183 {
185 *buildMoFEM &= 1 << 0;
186 auto &finite_element_name_set =
187 finiteElements.get<FiniteElement_name_mi_tag>();
188 auto it_fe = finite_element_name_set.find(fe_name);
189 if (it_fe == finite_element_name_set.end())
191 "this FiniteElement is there");
192 bool success = finite_element_name_set.modify(
193 it_fe, FiniteElement_col_change_bit_add(get_field_id(name_col)));
194 if (!success)
196 "modification unsuccessful");
198}

◆ modify_finite_element_add_field_data()

MoFEMErrorCode MoFEM::Core::modify_finite_element_add_field_data ( const std::string & fe_name,
const std::string name_field )
protectedvirtual

set finite element field data

Note
add_file is a collective, should be executed on all processors. Otherwise could lead to deadlock.
Parameters
namefinite element name
namefield name

This function will set memory in the form of a vector

Implements MoFEM::CoreInterface.

Definition at line 138 of file FECore.cpp.

139 {
141 *buildMoFEM &= 1 << 0;
142 typedef FiniteElement_multiIndex::index<FiniteElement_name_mi_tag>::type
143 FiniteElements_by_name;
144 FiniteElements_by_name &finite_element_name_set =
145 finiteElements.get<FiniteElement_name_mi_tag>();
146 FiniteElements_by_name::iterator it_fe =
147 finite_element_name_set.find(fe_name);
148 if (it_fe == finite_element_name_set.end())
149 SETERRQ(mofemComm, MOFEM_NOT_FOUND,
150 "This finite element is not defined (advise: check spelling)");
151 bool success = finite_element_name_set.modify(
152 it_fe, FiniteElement_change_bit_add(get_field_id(name_data)));
153 if (!success)
155 "modification unsuccessful");
157}

◆ modify_finite_element_add_field_row()

MoFEMErrorCode MoFEM::Core::modify_finite_element_add_field_row ( const std::string & fe_name,
const std::string name_row )
protectedvirtual

set field row which finite element use

Note
add_file is a collective, should be executed on all processors. Otherwise could lead to deadlock.
Parameters
namefinite element name
namefield name

Implements MoFEM::CoreInterface.

Definition at line 160 of file FECore.cpp.

161 {
163 *buildMoFEM &= 1 << 0;
164 typedef FiniteElement_multiIndex::index<FiniteElement_name_mi_tag>::type
165 FiniteElements_by_name;
166 FiniteElements_by_name &finite_element_name_set =
167 finiteElements.get<FiniteElement_name_mi_tag>();
168 FiniteElements_by_name::iterator it_fe =
169 finite_element_name_set.find(fe_name);
170 if (it_fe == finite_element_name_set.end())
171 SETERRQ(mofemComm, MOFEM_NOT_FOUND, "this < %s > is not there",
172 fe_name.c_str());
173 bool success = finite_element_name_set.modify(
174 it_fe, FiniteElement_row_change_bit_add(get_field_id(name_row)));
175 if (!success)
177 "modification unsuccessful");
179}

◆ modify_finite_element_adjacency_table()

MoFEMErrorCode MoFEM::Core::modify_finite_element_adjacency_table ( const std::string & fe_name,
const EntityType type,
ElementAdjacencyFunct function )
protectedvirtual

modify finite element table, only for advanced user

Note
add_file is a collective, should be executed on all processors. Otherwise could lead to deadlock.

Using that functions means that you like to do something not usual.

Implements MoFEM::CoreInterface.

Definition at line 117 of file FECore.cpp.

119 {
121 *buildMoFEM &= 1 << 0;
122 typedef FiniteElement_multiIndex::index<FiniteElement_name_mi_tag>::type
123 FiniteElements_by_name;
124 FiniteElements_by_name &finite_element_name_set =
125 finiteElements.get<FiniteElement_name_mi_tag>();
126 FiniteElements_by_name::iterator it_fe =
127 finite_element_name_set.find(fe_name);
128 if (it_fe == finite_element_name_set.end())
129 SETERRQ(mofemComm, MOFEM_NOT_FOUND,
130 "This finite element is not defined (advise: check spelling)");
131 boost::shared_ptr<FiniteElement> fe;
132 fe = *it_fe;
133 fe->elementAdjacencyTable[type] = function;
135}

◆ modify_finite_element_off_field_col()

MoFEMErrorCode MoFEM::Core::modify_finite_element_off_field_col ( const std::string & fe_name,
const std::string name_row )
protectedvirtual

unset field col which finite element use

Note
add_file is a collective, should be executed on all processors. Otherwise could lead to deadlock.
Parameters
namefinite element name
namefield name

Implements MoFEM::CoreInterface.

Definition at line 238 of file FECore.cpp.

239 {
241 *buildMoFEM &= 1 << 0;
242 auto &finite_element_name_set =
243 finiteElements.get<FiniteElement_name_mi_tag>();
244 auto it_fe = finite_element_name_set.find(fe_name);
245 if (it_fe == finite_element_name_set.end())
246 SETERRQ(mofemComm, MOFEM_NOT_FOUND, "this FiniteElement is there");
247 bool success = finite_element_name_set.modify(
248 it_fe, FiniteElement_col_change_bit_off(get_field_id(name_col)));
249 if (!success)
251 "modification unsuccessful");
253}

◆ modify_finite_element_off_field_data()

MoFEMErrorCode MoFEM::Core::modify_finite_element_off_field_data ( const std::string & fe_name,
const std::string name_field )
protectedvirtual

unset finite element field data

Note
add_file is a collective, should be executed on all processors. Otherwise could lead to deadlock.
Parameters
namefinite element name
namefield name

This function will set memory in the form of a vector

Implements MoFEM::CoreInterface.

Definition at line 201 of file FECore.cpp.

202 {
204 *buildMoFEM &= 1 << 0;
205 auto &finite_element_name_set =
206 finiteElements.get<FiniteElement_name_mi_tag>();
207 auto it_fe = finite_element_name_set.find(fe_name);
208 if (it_fe == finite_element_name_set.end())
209 SETERRQ(mofemComm, MOFEM_NOT_FOUND, "this FiniteElement is there");
210 bool success = finite_element_name_set.modify(
211 it_fe, FiniteElement_change_bit_off(get_field_id(name_data)));
212 if (!success)
214 "modification unsuccessful");
216}

◆ modify_finite_element_off_field_row()

MoFEMErrorCode MoFEM::Core::modify_finite_element_off_field_row ( const std::string & fe_name,
const std::string name_row )
protectedvirtual

unset field row which finite element use

Note
add_file is a collective, should be executed on all processors. Otherwise could lead to deadlock.
Parameters
namefinite element name
namefield name

Implements MoFEM::CoreInterface.

Definition at line 219 of file FECore.cpp.

220 {
222 *buildMoFEM &= 1 << 0;
223 auto &finite_element_name_set =
224 finiteElements.get<FiniteElement_name_mi_tag>();
225 auto it_fe = finite_element_name_set.find(fe_name);
226 if (it_fe == finite_element_name_set.end())
227 SETERRQ(mofemComm, MOFEM_NOT_FOUND, "this < %s > is not there",
228 fe_name.c_str());
229 bool success = finite_element_name_set.modify(
230 it_fe, FiniteElement_row_change_bit_off(get_field_id(name_row)));
231 if (!success)
233 "modification unsuccessful");
235}

◆ modify_problem_add_finite_element()

MoFEMErrorCode MoFEM::Core::modify_problem_add_finite_element ( const std::string name_problem,
const std::string & fe_name )
protectedvirtual

add finite element to problem, this add entities assigned to finite element to a particular problem

Note
add_file is a collective, should be executed on all processors. Otherwise could lead to deadlock.
Parameters
nameProblem name
nameFinite Element name

Implements MoFEM::CoreInterface.

Definition at line 143 of file ProblemsCore.cpp.

144 {
146 typedef Problem_multiIndex::index<Problem_mi_tag>::type ProblemsByName;
147 ProblemsByName &set = pRoblems.get<Problem_mi_tag>();
148 ProblemsByName::iterator miit = set.find(name_problem);
149 if (miit == set.end()) {
150 SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_FOUND, "this problem <%s> is not there",
151 name_problem.c_str());
152 }
153 BitFEId f_id = getBitFEId(fe_name);
154 bool success = set.modify(miit, ProblemFiniteElementChangeBitAdd(f_id));
155 if (!success)
156 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
157 "modification unsuccessful");
159}

◆ modify_problem_mask_ref_level_add_bit()

MoFEMErrorCode MoFEM::Core::modify_problem_mask_ref_level_add_bit ( const std::string & name_problem,
const BitRefLevel & bit )
protectedvirtual

set dof mask ref level for problem

Implements MoFEM::CoreInterface.

Definition at line 218 of file ProblemsCore.cpp.

219 {
221 typedef Problem_multiIndex::index<Problem_mi_tag>::type ProblemsByName;
222 ProblemsByName &set = pRoblems.get<Problem_mi_tag>();
223 ProblemsByName::iterator miit = set.find(name_problem);
224 if (miit == set.end()) {
225 std::ostringstream ss;
226 ss << name_problem;
227 SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_FOUND, "this problem <%s> is there",
228 ss.str().c_str());
229 }
230 bool success = set.modify(miit, ProblemChangeRefLevelBitDofMaskAdd(bit));
231 if (!success)
232 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
233 "modification unsuccessful");
235}

◆ modify_problem_mask_ref_level_set_bit()

MoFEMErrorCode MoFEM::Core::modify_problem_mask_ref_level_set_bit ( const std::string & name_problem,
const BitRefLevel & bit )
protectedvirtual

set dof mask ref level for problem

Note
add_file is a collective, should be executed on all processors. Otherwise could lead to deadlock.

Implements MoFEM::CoreInterface.

Definition at line 238 of file ProblemsCore.cpp.

239 {
240 MoFEMFunctionBegin typedef Problem_multiIndex::index<Problem_mi_tag>::type
241 ProblemsByName;
242 ProblemsByName &set = pRoblems.get<Problem_mi_tag>();
243 ProblemsByName::iterator miit = set.find(name_problem);
244 if (miit == set.end()) {
245 std::ostringstream ss;
246 ss << name_problem;
247 SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_FOUND, "this problem <%s> is there",
248 ss.str().c_str());
249 }
250 bool success = set.modify(miit, ProblemChangeRefLevelBitDofMaskSet(bit));
251 if (!success)
252 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
253 "modification unsuccessful");
255}

◆ modify_problem_ref_level_add_bit()

MoFEMErrorCode MoFEM::Core::modify_problem_ref_level_add_bit ( const std::string & name_problem,
const BitRefLevel & bit )
protectedvirtual

add ref level to problem

Note
add_file is a collective, should be executed on all processors. Otherwise could lead to deadlock.

if same finite element is solved using different level of refinements, than the level of refinement has to be specificied to problem in query

Parameters
nameProblem name
BitRefLevelbitLevel Example:
mField.modify_problem_add_finite_element("BEAM_BENDING_ON_MESH_REF1","ELASTIC");
mField.modify_problem_add_finite_element("BEAM_BENDING_ON_MESH_REF2","ELASTIC");
mField.modify_problem_ref_level_add_bit("BEAM_BENDING_ON_MESH_REF1",bit_level1);
mField.modify_problem_ref_level_add_bit("BEAM_BENDING_ON_MESH_REF2",bit_level2);
Two Problems exist and solved independently, both are elastic, but solved using different mesh refinement

Implements MoFEM::CoreInterface.

Definition at line 181 of file ProblemsCore.cpp.

182 {
184 typedef Problem_multiIndex::index<Problem_mi_tag>::type ProblemsByName;
185 ProblemsByName &set = pRoblems.get<Problem_mi_tag>();
186 ProblemsByName::iterator miit = set.find(name_problem);
187 std::ostringstream ss;
188 ss << name_problem;
189 if (miit == set.end())
190 SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_FOUND, "this problem <%s> is there",
191 ss.str().c_str());
192 bool success = set.modify(miit, ProblemChangeRefLevelBitAdd(bit));
193 if (!success)
194 SETERRQ(PETSC_COMM_SELF, 1, "modification unsuccessful");
196}

◆ modify_problem_ref_level_set_bit()

MoFEMErrorCode MoFEM::Core::modify_problem_ref_level_set_bit ( const std::string & name_problem,
const BitRefLevel & bit )
protectedvirtual

set ref level for problem

Note
add_file is a collective, should be executed on all processors. Otherwise could lead to deadlock.

if same finite element is solved using different level of refinements, than the level of refinement has to be specificied to problem in query

Parameters
nameProblem name
BitRefLevelbitLevel Example:
mField.modify_problem_add_finite_element("BEAM_BENDING_ON_MESH_REF1","ELASTIC");
mField.modify_problem_add_finite_element("BEAM_BENDING_ON_MESH_REF2","ELASTIC");
mField.modify_problem_ref_level_set_bit("BEAM_BENDING_ON_MESH_REF1",bit_level1);
mField.modify_problem_ref_level_set_bit("BEAM_BENDING_ON_MESH_REF2",bit_level2);
Two Problems exist and solved independently, both are elastic, but solved using different mesh refinement

Implements MoFEM::CoreInterface.

Definition at line 199 of file ProblemsCore.cpp.

200 {
202 typedef Problem_multiIndex::index<Problem_mi_tag>::type ProblemsByName;
203 ProblemsByName &set = pRoblems.get<Problem_mi_tag>();
204 ProblemsByName::iterator miit = set.find(name_problem);
205 std::ostringstream ss;
206 ss << name_problem;
207 if (miit == set.end())
208 SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_FOUND, "this problem <%s> is there",
209 ss.str().c_str());
210 bool success = set.modify(miit, ProblemChangeRefLevelBitSet(bit));
211 if (!success)
212 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
213 "modification unsuccessful");
215}

◆ modify_problem_unset_finite_element()

MoFEMErrorCode MoFEM::Core::modify_problem_unset_finite_element ( const std::string name_problem,
const std::string & fe_name )
protectedvirtual

unset finite element from problem, this remove entities assigned to finite element to a particular problem

Note: If problem is build, it need to be cleaned to make this effective

Note
add_file is a collective, should be executed on all processors. Otherwise could lead to deadlock.
Parameters
nameProblem name
nameFinite Element name

Implements MoFEM::CoreInterface.

Definition at line 162 of file ProblemsCore.cpp.

163 {
165 typedef Problem_multiIndex::index<Problem_mi_tag>::type ProblemsByName;
166 ProblemsByName &set = pRoblems.get<Problem_mi_tag>();
167 ProblemsByName::iterator miit = set.find(name_problem);
168 if (miit == set.end()) {
169 SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_FOUND, "this problem <%s> is not there",
170 name_problem.c_str());
171 }
172 BitFEId f_id = getBitFEId(fe_name);
173 bool success = set.modify(miit, ProblemFiniteElementChangeBitUnSet(f_id));
174 if (!success)
175 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
176 "modification unsuccessful");
178}

◆ problem_basic_method_postProcess() [1/2]

MoFEMErrorCode MoFEM::Core::problem_basic_method_postProcess ( const Problem * problem_ptr,
BasicMethod & method,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Set data for BasicMethod.

This function set data about problem, adjacencies and other multi-indices in database. This function can be used a special case when user need to do some pre- and post-processing before matrix or vector is initiated, or to assemble matrix for group of FEMethods. Is used by classes SnesCtx and TsCtx. Look for more details there.

FIXME: Here we need example

Parameters
pointerto problem data structure
methoduser method derived from BasicMethod

Implements MoFEM::CoreInterface.

Definition at line 395 of file ProblemsCore.cpp.

396 {
398 SET_BASIC_METHOD(method, problem_ptr)
399
400 PetscLogEventBegin(MOFEM_EVENT_postProcess, 0, 0, 0, 0);
401 CHKERR method.postProcess();
402 PetscLogEventEnd(MOFEM_EVENT_postProcess, 0, 0, 0, 0);
403
405}

◆ problem_basic_method_postProcess() [2/2]

MoFEMErrorCode MoFEM::Core::problem_basic_method_postProcess ( const std::string & problem_name,
BasicMethod & method,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Set data for BasicMethod.

This function set data about problem, adjacencies and other multi-indices in database. This function can be used a special case when user need to do some pre- and post-processing before matrix or vector is initiated, or to assemble matrix for group of FEMethods. Is used by classes SnesCtx and TsCtx. Look for more details there.

FIXME: Here we need example

Parameters
problem_namename of the problem
methoduser method derived from BasicMethod

Implements MoFEM::CoreInterface.

Definition at line 408 of file ProblemsCore.cpp.

409 {
411 if (verb == -1)
412 verb = verbose;
413 typedef Problem_multiIndex::index<Problem_mi_tag>::type ProblemsByName;
414
415 // find p_miit
416 ProblemsByName &pRoblems_set = pRoblems.get<Problem_mi_tag>();
417 ProblemsByName::iterator p_miit = pRoblems_set.find(problem_name);
418 if (p_miit == pRoblems_set.end())
419 SETERRQ(mofemComm, 1, "problem is not in database %s",
420 problem_name.c_str());
421
422 CHKERR problem_basic_method_postProcess(&*p_miit, method, verb);
423
425}
MoFEMErrorCode problem_basic_method_postProcess(const Problem *problem_ptr, BasicMethod &method, int verb=DEFAULT_VERBOSITY)
Set data for BasicMethod.

◆ problem_basic_method_preProcess() [1/2]

MoFEMErrorCode MoFEM::Core::problem_basic_method_preProcess ( const Problem * problem_ptr,
BasicMethod & method,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Set data for BasicMethod.

This function set data about problem, adjacencies and other multi-indices in database. This function can be used a special case when user need to do some pre- and post-processing before matrix or vector is initiated, or to assemble matrix for group of FEMethods. Is used by classes SnesCtx and TsCtx. Look for more details there.

FIXME: Here we need example

Parameters
pointerto problem data structure
methoduser method derived from BasicMethod

Implements MoFEM::CoreInterface.

Definition at line 363 of file ProblemsCore.cpp.

365 {
367 if (verb == -1)
368 verb = verbose;
369 // finite element
370 SET_BASIC_METHOD(method, problem_ptr)
371 PetscLogEventBegin(MOFEM_EVENT_preProcess, 0, 0, 0, 0);
372 CHKERR method.preProcess();
373 PetscLogEventEnd(MOFEM_EVENT_preProcess, 0, 0, 0, 0);
375}

◆ problem_basic_method_preProcess() [2/2]

MoFEMErrorCode MoFEM::Core::problem_basic_method_preProcess ( const std::string & problem_name,
BasicMethod & method,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Set data for BasicMethod.

This function set data about problem, adjacencies and other multi-indices in database. This function can be used a special case when user need to do some pre- and post-processing before matrix or vector is initiated, or to assemble matrix for group of FEMethods. Is used by classes SnesCtx and TsCtx. Look for more details there.

FIXME: Here we need example

Parameters
problem_namename of the problem
methoduser method derived from BasicMethod

Implements MoFEM::CoreInterface.

Definition at line 378 of file ProblemsCore.cpp.

379 {
381 if (verb == -1)
382 verb = verbose;
383 typedef Problem_multiIndex::index<Problem_mi_tag>::type ProblemsByName;
384 // find p_miit
385 ProblemsByName &pRoblems_set = pRoblems.get<Problem_mi_tag>();
386 ProblemsByName::iterator p_miit = pRoblems_set.find(problem_name);
387 if (p_miit == pRoblems_set.end())
388 SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_FOUND, "problem is not in database %s",
389 problem_name.c_str());
390 CHKERR problem_basic_method_preProcess(&*p_miit, method, verb);
392}
MoFEMErrorCode problem_basic_method_preProcess(const Problem *problem_ptr, BasicMethod &method, int verb=DEFAULT_VERBOSITY)
Set data for BasicMethod.

◆ query_interface()

MoFEMErrorCode MoFEM::Core::query_interface ( boost::typeindex::type_index type_index,
UnknownInterface ** iface ) const
virtual

Getting interface of core database.

Parameters
uuidunique ID of interface
ifacereturned pointer to interface
Returns
error code

Implements MoFEM::UnknownInterface.

Definition at line 43 of file Core.cpp.

44 {
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}

◆ rebuild_database()

MoFEMErrorCode MoFEM::Core::rebuild_database ( int verb = DEFAULT_VERBOSITY)
protectedvirtual

Clear database and initialize it once again.

Parameters
verbVerbosity level
Returns
Error code

Implements MoFEM::CoreInterface.

Definition at line 758 of file Core.cpp.

758 {
760 if (verb == -1)
761 verb = verbose;
762 CHKERR this->clearMap();
763 CHKERR this->getTags(verb);
766}

◆ regEvents()

template<class IFACE >
MoFEMErrorCode MoFEM::Core::regEvents ( )
protected

Register petsc events.

Template Parameters
IFACE
Returns
MoFEMErrorCode

Definition at line 190 of file Core.cpp.

190 {
192 auto ptr = boost::make_shared<IFACE>();
193 // See SFINAE:
194 // https://stackoverflow.com/questions/257288/is-it-possible-to-write-a-template-to-check-for-a-functions-existence
195 // https://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error
196 auto get_event_options = [](auto *const ptr) {
197 return get_event_options_imp(ptr, 0);
198 };
199 CHKERR get_event_options(ptr.get());
201}
static auto get_event_options_imp(T *const ptr, int) -> decltype(ptr->getEventOptions())
Definition Core.cpp:157

◆ registerSubInterfaces()

MoFEMErrorCode MoFEM::Core::registerSubInterfaces ( )
protected

Register insterfaces.

Returns
MoFEMErrorCode

Definition at line 485 of file Core.cpp.

485 {
487
488 iFaces.clear();
489
490 // Register sub interfaces
510#ifdef WITH_TETGEN
512#endif
513#ifdef WITH_MED
515#endif
518
519 // Register events
521
523};
MoFEMErrorCode regSubInterface()
Register sub-interfaces in core interface.
Definition Core.cpp:172
MoFEMErrorCode regEvents()
Register petsc events.
Definition Core.cpp:190

◆ regSubInterface()

template<class IFACE >
MoFEMErrorCode MoFEM::Core::regSubInterface ( )
protected

Register sub-interfaces in core interface.

Template Parameters
IFACE
Returns
MoFEMErrorCode

Definition at line 172 of file Core.cpp.

172 {
175 IFACE *ptr = new IFACE(*this);
176
177 // If sub interface has function getSubInterfaceOptions run
178 // it after construction. getSubInterfaceOptions is used to
179 // get parameters from command line.
180 auto get_sub_iface_options = [](auto *const ptr) {
181 return get_sub_iface_options_imp(ptr, 0);
182 };
183 CHKERR get_sub_iface_options(ptr);
184
185 auto type_idx = boost::typeindex::type_id<IFACE>();
186 iFaces.insert(type_idx, ptr);
188}
static auto get_sub_iface_options_imp(T *const ptr, int) -> decltype(ptr->getSubInterfaceOptions())
Definition Core.cpp:144

◆ remove_ents()

MoFEMErrorCode MoFEM::Core::remove_ents ( const Range ents,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

remove entities form mofem database

Implements MoFEM::CoreInterface.

Definition at line 429 of file DeleteCore.cpp.

429 {
431 if (verb == -1)
432 verb = verbose;
434 CHKERR remove_ents_from_field(ents, verb);
435
436 for (Range::const_pair_iterator p_eit = ents.pair_begin();
437 p_eit != ents.pair_end(); ++p_eit) {
438
439 RefElement_multiIndex::index<Ent_mi_tag>::type::iterator frit, hi_frit;
440 frit = refinedFiniteElements.get<Ent_mi_tag>().lower_bound(p_eit->first);
441 hi_frit =
442 refinedFiniteElements.get<Ent_mi_tag>().upper_bound(p_eit->second);
443 refinedFiniteElements.get<Ent_mi_tag>().erase(frit, hi_frit);
444
445 RefEntity_multiIndex::index<Ent_mi_tag>::type::iterator rit, hi_rit;
446 rit = refinedEntities.get<Ent_mi_tag>().lower_bound(p_eit->first);
447 hi_rit = refinedEntities.get<Ent_mi_tag>().upper_bound(p_eit->second);
448 refinedEntities.get<Ent_mi_tag>().erase(rit, hi_rit);
449 }
450
452}

◆ remove_ents_by_bit_ref()

MoFEMErrorCode MoFEM::Core::remove_ents_by_bit_ref ( const BitRefLevel bit,
const BitRefLevel mask,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

remove entities form mofem database

Implements MoFEM::CoreInterface.

Definition at line 454 of file DeleteCore.cpp.

455 {
457 if (verb == -1)
458 verb = verbose;
459 Range ents;
460 CHKERR BitRefManager(*this).getEntitiesByRefLevel(bit, mask, ents, verb);
461 CHKERR remove_ents(ents, verb);
463}

◆ remove_ents_from_field() [1/3]

MoFEMErrorCode MoFEM::Core::remove_ents_from_field ( const Range ents,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

remove entities from all fields

Note
not collective

Implements MoFEM::CoreInterface.

Definition at line 176 of file DeleteCore.cpp.

176 {
178 if (verb == -1)
179 verb = verbose;
180 CHKERR clear_ents_fields(ents, verb);
181 for (Field_multiIndex::iterator fit = fIelds.begin(); fit != fIelds.end();
182 fit++) {
183 EntityHandle meshset = fit->get()->getMeshset();
184 CHKERR get_moab().remove_entities(meshset, ents);
185 }
187}

◆ remove_ents_from_field() [2/3]

MoFEMErrorCode MoFEM::Core::remove_ents_from_field ( const std::string name,
const EntityHandle meshset,
const EntityType type,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

remove entities from field

Note
not collective

Implements MoFEM::CoreInterface.

Definition at line 152 of file DeleteCore.cpp.

154 {
156 if (verb == -1)
157 verb = verbose;
158 Range ents;
159 CHKERR get_moab().get_entities_by_type(meshset, type, ents);
160 CHKERR remove_ents_from_field(name, ents, verb);
162}

◆ remove_ents_from_field() [3/3]

MoFEMErrorCode MoFEM::Core::remove_ents_from_field ( const std::string name,
const Range ents,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

remove entities from field

Note
not collective

Implements MoFEM::CoreInterface.

Definition at line 164 of file DeleteCore.cpp.

165 {
167 if (verb == -1)
168 verb = verbose;
169 EntityHandle meshset;
170 meshset = get_field_meshset(name);
171 CHKERR clear_ents_fields(name, ents, verb);
172 CHKERR get_moab().remove_entities(meshset, ents);
174}

◆ remove_ents_from_field_by_bit_ref()

MoFEMErrorCode MoFEM::Core::remove_ents_from_field_by_bit_ref ( const BitRefLevel bit,
const BitRefLevel mask,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

remove entities from field

Note
not collective

Implements MoFEM::CoreInterface.

Definition at line 189 of file DeleteCore.cpp.

191 {
193 if (verb == -1)
194 verb = verbose;
195 Range ents;
196 CHKERR BitRefManager(*this).getEntitiesByRefLevel(bit, mask, ents, verb);
197 CHKERR remove_ents_from_field(ents, verb);
199}

◆ remove_ents_from_finite_element() [1/3]

MoFEMErrorCode MoFEM::Core::remove_ents_from_finite_element ( const Range ents,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

remove entities from finite elements in database

Implements MoFEM::CoreInterface.

Definition at line 404 of file DeleteCore.cpp.

405 {
407 if (verb == -1)
408 verb = verbose;
409 CHKERR clear_finite_elements(ents, verb);
410 for (FiniteElement_multiIndex::iterator fe_it = finiteElements.begin();
411 fe_it != finiteElements.end(); fe_it++) {
412 EntityHandle meshset = fe_it->get()->getMeshset();
413 CHKERR get_moab().remove_entities(meshset, ents);
414 }
416}

◆ remove_ents_from_finite_element() [2/3]

MoFEMErrorCode MoFEM::Core::remove_ents_from_finite_element ( const std::string name,
const EntityHandle meshset,
const EntityType type,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

remove entities from given refinement level to finite element database

Implements MoFEM::CoreInterface.

Definition at line 379 of file DeleteCore.cpp.

382 {
384 if (verb == -1)
385 verb = verbose;
386 Range ents;
387 CHKERR get_moab().get_entities_by_type(meshset, type, ents, false);
388 CHKERR remove_ents_from_finite_element(name, ents, verb);
390}

◆ remove_ents_from_finite_element() [3/3]

MoFEMErrorCode MoFEM::Core::remove_ents_from_finite_element ( const std::string name,
const Range ents,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

remove entities from finite element database

Implements MoFEM::CoreInterface.

Definition at line 392 of file DeleteCore.cpp.

394 {
396 if (verb == -1)
397 verb = verbose;
398 CHKERR clear_finite_elements(name, ents, verb);
400 CHKERR get_moab().remove_entities(idm, ents);
402}

◆ remove_ents_from_finite_element_by_bit_ref()

MoFEMErrorCode MoFEM::Core::remove_ents_from_finite_element_by_bit_ref ( const BitRefLevel bit,
const BitRefLevel mask,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

remove elements from given refinement level to finite element database

Parameters
BitRefLevelbit
BitRefLevelmask
verboselevel

Implements MoFEM::CoreInterface.

Definition at line 418 of file DeleteCore.cpp.

419 {
421 if (verb == -1)
422 verb = verbose;
423 Range ents;
424 CHKERR BitRefManager(*this).getEntitiesByRefLevel(bit, mask, ents, verb);
427}

◆ remove_parents_by_bit_ref()

MoFEMErrorCode MoFEM::Core::remove_parents_by_bit_ref ( const BitRefLevel bit,
const BitRefLevel mask,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Remove parent from entities on bit level.

Evert entity created by refinement, split or any other change on the mesh can have parent. This function remove parent from entity,

Note
Functions makeing topological changes on entities should repsect parents child relation. This erase that relation. If you going to split faces and create interface is recommended to call this function before split opeartion.
Parameters
bitlevel
maskof bit level
verbverbosity level
Returns
MoFEMErrorCode

Implements MoFEM::CoreInterface.

Definition at line 465 of file DeleteCore.cpp.

467 {
469 if (verb == -1)
470 verb = verbose;
471 Range ents;
472 CHKERR BitRefManager(*this).getEntitiesByRefLevel(bit, mask, ents, verb);
473 CHKERR remove_parents_by_ents(ents, verb);
475}
MoFEMErrorCode remove_parents_by_ents(const Range &ents, int verb=DEFAULT_VERBOSITY)
Remove parents from entities.

◆ remove_parents_by_ents()

MoFEMErrorCode MoFEM::Core::remove_parents_by_ents ( const Range & ents,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Remove parents from entities.

Implements MoFEM::CoreInterface.

Definition at line 477 of file DeleteCore.cpp.

477 {
479
480 std::vector<EntityHandle> leftovers_ents;
481 leftovers_ents.reserve(ents.size());
482
483 for (auto pit = ents.pair_begin(); pit != ents.pair_end(); ++pit) {
484
485 EntityHandle f = pit->first;
486 const EntityHandle s = pit->second;
487 auto lo = refinedEntities.lower_bound(f);
488 for (; f <= s; ++f) {
489
490 auto check = [this](auto lo, auto f) {
491 if (lo == refinedEntities.end())
492 return false;
493 if ((*lo)->getEnt() == f)
494 return true;
495 return false;
496 };
497
498 if (check(lo, f)) {
499 bool success = refinedEntities.modify(lo, RefEntity_change_parent(0));
500 if (!success)
501 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
502 "Operation of removing parent unsuccessful");
503 ++lo;
504 } else
505 leftovers_ents.emplace_back(f);
506 }
507 }
508
509 if (!leftovers_ents.empty()) {
510 std::vector<EntityHandle> zero_parents(leftovers_ents.size());
511 CHKERR get_moab().tag_set_data(th_RefParentHandle, &leftovers_ents[0],
512 leftovers_ents.size(),
513 &*zero_parents.begin());
514 }
516}

◆ remove_parents_by_parents()

MoFEMErrorCode MoFEM::Core::remove_parents_by_parents ( const Range & ents,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Remove paremts from entities having parents in passed range.

Implements MoFEM::CoreInterface.

Definition at line 518 of file DeleteCore.cpp.

518 {
520 for (Range::iterator eit = ents.begin(); eit != ents.end(); ++eit) {
521 RefEntity_multiIndex::index<Ent_Ent_mi_tag>::type::iterator it;
522 while ((it = refinedEntities.get<Ent_Ent_mi_tag>().find(*eit)) !=
523 refinedEntities.get<Ent_Ent_mi_tag>().end()) {
524 bool success = refinedEntities.get<Ent_Ent_mi_tag>().modify(
525 it, RefEntity_change_parent(0));
526 if (!success) {
527 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
528 "Operation of removing parent unsuccessful");
529 }
530 }
531 }
533}

◆ set_field_order() [1/4]

MoFEMErrorCode MoFEM::Core::set_field_order ( const EntityHandle meshset,
const EntityType type,
const BitFieldId id,
const ApproximationOrder order,
int verb = DEFAULT_VERBOSITY )
protected

Definition at line 955 of file FieldCore.cpp.

957 {
959 if (verb == -1)
960 verb = verbose;
961 *buildMoFEM = 0;
962 Range ents;
963 CHKERR get_moab().get_entities_by_type(meshset, type, ents);
964 CHKERR this->set_field_order(ents, id, order, verb);
966}
constexpr int order

◆ set_field_order() [2/4]

MoFEMErrorCode MoFEM::Core::set_field_order ( const EntityHandle meshset,
const EntityType type,
const std::string & name,
const ApproximationOrder order,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Set order approximation of the entities in the field.

Note
not collective
Parameters
meshsetcontaining set of the entities (use 0 for all the entities in the meshset)
typeselected type of the entities f.e. MBTET, MBTRI, MBEDGE, MBVERTEX, see moab documentation
orderapproximation order

Implements MoFEM::CoreInterface.

Definition at line 967 of file FieldCore.cpp.

970 {
972 if (verb == -1)
973 verb = verbose;
974 *buildMoFEM = 0;
975 CHKERR this->set_field_order(meshset, type, get_field_id(name), order, verb);
977}

◆ set_field_order() [3/4]

MoFEMErrorCode MoFEM::Core::set_field_order ( const Range & ents,
const BitFieldId id,
const ApproximationOrder order,
int verb = DEFAULT_VERBOSITY )
protected

Definition at line 930 of file FieldCore.cpp.

931 {
932 MOFEM_LOG_CHANNEL("WORLD");
933 MOFEM_LOG_TAG("WORLD", "FieldCore");
934 MOFEM_LOG_CHANNEL("SYNC");
935 MOFEM_LOG_TAG("SYNC", "FieldCore");
938
939 // check field & meshset
940 auto field_it = fIelds.get<BitFieldId_mi_tag>().find(id);
941 if (field_it == fIelds.get<BitFieldId_mi_tag>().end())
942 SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_FOUND, "no field found");
943
944 MOFEM_LOG("WORLD", Sev::noisy)
945 << "Field " << (*field_it)->getName() << " core value < "
946 << this->getValue() << " > field value ( "
947 << static_cast<int>((*field_it)->getBitNumber()) << " )"
948 << " nb. of ents " << ents.size();
949
950 CHKERR this->setFieldOrderImpl(*field_it, ents, order, verb);
951
953}
MoFEMErrorCode setFieldOrderImpl(boost::shared_ptr< Field > field_ptr, const Range &ents, const ApproximationOrder order, int verb)

◆ set_field_order() [4/4]

MoFEMErrorCode MoFEM::Core::set_field_order ( const Range & ents,
const std::string & name,
const ApproximationOrder order,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Set order approximation of the entities in the field.

Note
not collective
Parameters
entities
typeselected type of the entities f.e. MBTET, MBTRI, MBEDGE, MBVERTEX, see moab documentation
orderapproximation order

Implements MoFEM::CoreInterface.

Definition at line 978 of file FieldCore.cpp.

979 {
981 if (verb == -1)
982 verb = verbose;
983 *buildMoFEM = 0;
984 CHKERR this->set_field_order(ents, get_field_id(name), order, verb);
986}

◆ set_field_order_by_entity_type_and_bit_ref() [1/2]

MoFEMErrorCode MoFEM::Core::set_field_order_by_entity_type_and_bit_ref ( const BitRefLevel & bit,
const BitRefLevel & mask,
const EntityType type,
const BitFieldId id,
const ApproximationOrder order,
int verb = DEFAULT_VERBOSITY )
protected

Definition at line 987 of file FieldCore.cpp.

989 {
991 if (verb == -1)
992 verb = verbose;
993 *buildMoFEM = 0;
994 Range ents;
995 CHKERR BitRefManager(*this).getEntitiesByTypeAndRefLevel(bit, mask, type,
996 ents, verb);
997 CHKERR this->set_field_order(ents, id, order, verb);
999}

◆ set_field_order_by_entity_type_and_bit_ref() [2/2]

MoFEMErrorCode MoFEM::Core::set_field_order_by_entity_type_and_bit_ref ( const BitRefLevel & bit,
const BitRefLevel & mask,
const EntityType type,
const std::string & name,
const ApproximationOrder order,
int verb = DEFAULT_VERBOSITY )
protectedvirtual

Set order approximation of the entities in the field.

Note
not collective
Parameters
bitrefinement level
maskbit mask
typeselected type of the entities f.e. MBTET, MBTRI, MBEDGE, MBVERTEX, see moab documentation
orderapproximation order

Implements MoFEM::CoreInterface.

Definition at line 1001 of file FieldCore.cpp.

1003 {
1005 if (verb == -1)
1006 verb = verbose;
1007 *buildMoFEM = 0;
1008 Range ents;
1009 CHKERR BitRefManager(*this).getEntitiesByTypeAndRefLevel(bit, mask, type,
1010 ents, verb);
1011 CHKERR this->set_field_order(ents, get_field_id(name), order, verb);
1013}

◆ set_moab_interface()

MoFEMErrorCode MoFEM::Core::set_moab_interface ( moab::Interface & new_moab,
int verb = VERBOSE )
protectedvirtual

Set the moab interface object.

Parameters
new_moab
verb
Returns
MoFEMErrorCode

Implements MoFEM::CoreInterface.

Reimplemented in MoFEM::CoreTmp<-1 >.

Definition at line 768 of file Core.cpp.

768 {
769 return this->setMoabInterface(new_moab, verb);
770};
MoFEMErrorCode setMoabInterface(moab::Interface &new_moab, int verb=VERBOSE)
Definition Core.cpp:455

◆ setFieldOrder()

MoFEMErrorCode MoFEM::CoreTmp< 0 >::setFieldOrder ( const Range & ents,
const BitFieldId id,
const ApproximationOrder order,
int ver )
protected

◆ setFieldOrderImpl()

MoFEMErrorCode MoFEM::Core::setFieldOrderImpl ( boost::shared_ptr< Field > field_ptr,
const Range & ents,
const ApproximationOrder order,
int verb )
protected

Definition at line 506 of file FieldCore.cpp.

509 {
511
512 if (verb == DEFAULT_VERBOSITY)
513 verb = verbose;
514 *buildMoFEM = 0;
515
516 const auto field_meshset = field_ptr->getMeshset();
517 const auto bit_number = field_ptr->getBitNumber();
518
519 // intersection with field meshset
520 Range ents_of_id_meshset;
521 CHKERR get_moab().get_entities_by_handle(field_meshset, ents_of_id_meshset,
522 false);
523 Range field_ents = intersect(ents, ents_of_id_meshset);
524 if (verb > QUIET) {
525 MOFEM_LOG_C("SYNC", Sev::noisy,
526 "change nb. of ents for order in the field <%s> %d",
527 field_ptr->getName().c_str(), field_ents.size(), ents.size());
528 }
529
530 // ent view by field id (in set all MoabEnts has the same FieldId)
531 auto eiit = entsFields.get<Unique_mi_tag>().lower_bound(
532 FieldEntity::getLoBitNumberUId(field_ptr->getBitNumber()));
534 if (eiit != entsFields.get<Unique_mi_tag>().end()) {
535 auto hi_eiit = entsFields.get<Unique_mi_tag>().upper_bound(
536 FieldEntity::getHiBitNumberUId(field_ptr->getBitNumber()));
537 std::copy(eiit, hi_eiit, std::back_inserter(ents_id_view));
538 }
539
540 if (verb > QUIET)
541 MOFEM_LOG_C("SYNC", Sev::noisy,
542 "current nb. of ents in the multi index field <%s> %d",
543 field_ptr->getName().c_str(), ents_id_view.size());
544
545 // loop over ents
546 int nb_ents_set_order_up = 0;
547 int nb_ents_set_order_down = 0;
548 int nb_ents_set_order_new = 0;
549
550 FieldEntity_change_order modify_order_no_size_change(order, false);
551 FieldEntity_change_order modify_order_size_change(order, true);
552
553 for (auto pit = field_ents.const_pair_begin();
554 pit != field_ents.const_pair_end(); pit++) {
555 EntityHandle first = pit->first;
556 EntityHandle second = pit->second;
557
558 const auto type = static_cast<EntityType>(first >> MB_ID_WIDTH);
559
560 // Sanity check
561 switch (field_ptr->getSpace()) {
562 case H1:
563 break;
564 case HCURL:
565 if (type == MBVERTEX)
566 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
567 "Hcurl space on vertices makes no sense");
568
569 break;
570 case HDIV:
571 if (type == MBVERTEX)
572 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
573 "Hdiv space on vertices makes no sense");
574
575 if (type == MBEDGE)
576 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
577 "Hdiv space on edges makes no sense");
578
579 break;
580 default:
581 break;
582 }
583
584 // Entity is in database, change order only if needed
585 Range ents_in_database;
586 auto vit = ents_id_view.get<1>().lower_bound(first);
587 auto hi_vit = ents_id_view.get<1>().upper_bound(second);
588 if (order >= 0) {
589 for (; vit != hi_vit; ++vit) {
590 ents_in_database.insert(vit->get()->getEnt());
591 // entity is in database and order is changed or reset
592 const ApproximationOrder old_approximation_order =
593 (*vit)->getMaxOrder();
594
595 if (old_approximation_order != order) {
596
597 FieldEntity_multiIndex::iterator miit =
598 entsFields.get<Unique_mi_tag>().find((*vit)->getLocalUniqueId());
599
600 if ((*miit)->getMaxOrder() < order)
601 nb_ents_set_order_up++;
602 if ((*miit)->getMaxOrder() > order)
603 nb_ents_set_order_down++;
604
605 // set dofs inactive if order is reduced, and set new order to entity
606 // if order is increased (note that dofs are not build if order is
607 // increased)
608
609 bool can_change_size = true;
610 auto dit = dofsField.get<Unique_mi_tag>().lower_bound(
612 (*miit)->getEnt()));
613 if (dit != dofsField.get<Unique_mi_tag>().end()) {
614 auto hi_dit = dofsField.get<Unique_mi_tag>().upper_bound(
616 (*miit)->getEnt()));
617
618 if (dit != hi_dit)
619 can_change_size = false;
620 for (; dit != hi_dit; dit++) {
621 if ((*dit)->getDofOrder() > order) {
622 bool success = dofsField.modify(dofsField.project<0>(dit),
623 DofEntity_active_change(false));
624 if (!success)
625 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
626 "modification unsuccessful");
627 }
628 }
629 }
630
631 bool success =
632 entsFields.modify(entsFields.project<0>(miit),
633 can_change_size ? modify_order_size_change
634 : modify_order_no_size_change);
635 if (!success)
636 SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
637 "modification unsuccessful");
638 }
639 }
640 }
641
642 Range new_ents = subtract(Range(first, second), ents_in_database);
643 for (Range::const_pair_iterator pit = new_ents.const_pair_begin();
644 pit != new_ents.const_pair_end(); ++pit) {
645 const auto first = pit->first;
646 const auto second = pit->second;
647 const auto ent_type = get_moab().type_from_handle(first);
648
649 if (!field_ptr->getFieldOrderTable()[ent_type])
650 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
651 "Number of degrees of freedom for entity %s for %s space on "
652 "base %s can "
653 "not be deduced",
654 moab::CN::EntityTypeName(ent_type),
655 field_ptr->getSpaceName().c_str(),
656 field_ptr->getApproxBaseName().c_str());
657
658 auto get_nb_dofs_on_order = [&](const int order) {
659 return order >= 0 ? (field_ptr->getFieldOrderTable()[ent_type])(order)
660 : 0;
661 };
662 const int nb_dofs_on_order = get_nb_dofs_on_order(order);
663 if (nb_dofs_on_order || order == -1) {
664
665 const int field_rank = field_ptr->getNbOfCoeffs();
666 const int nb_dofs = nb_dofs_on_order * field_rank;
667
668 // Entity is not in database and order is changed or reset
669 auto miit_ref_ent =
670 refinedEntities.get<Ent_mi_tag>().lower_bound(first);
671
672 auto create_tags_for_max_order = [&](const Range &ents) {
674 if (order >= 0) {
675 std::vector<ApproximationOrder> o_vec(ents.size(), order);
676 CHKERR get_moab().tag_set_data(field_ptr->th_AppOrder, ents,
677 &*o_vec.begin());
678 }
680 };
681
682 auto create_tags_for_data = [&](const Range &ents) {
684 if (order >= 0) {
685
686 if (nb_dofs > 0) {
687 if (ent_type == MBVERTEX) {
688 std::vector<FieldData> d_vec(nb_dofs * ents.size(), 0);
689 CHKERR get_moab().tag_set_data(field_ptr->th_FieldDataVerts,
690 ents, &*d_vec.begin());
691 } else {
692 std::vector<int> tag_size(ents.size(), nb_dofs);
693 std::vector<FieldData> d_vec(nb_dofs, 0);
694 std::vector<void const *> d_vec_ptr(ents.size(),
695 &*d_vec.begin());
696 CHKERR get_moab().tag_set_by_ptr(field_ptr->th_FieldData, ents,
697 &*d_vec_ptr.begin(),
698 &*tag_size.begin());
699 }
700 }
701 }
702
704 };
705
706 auto get_ents_in_ref_ent = [&](auto miit_ref_ent) {
707 auto hi = refinedEntities.get<Ent_mi_tag>().upper_bound(second);
708 Range in;
709 for (; miit_ref_ent != hi; ++miit_ref_ent)
710 in.insert(miit_ref_ent->get()->getEnt());
711 return in;
712 };
713
714 auto get_ents_max_order = [&](const Range &ents) {
715 boost::shared_ptr<std::vector<const void *>> vec(
716 new std::vector<const void *>());
717 vec->resize(ents.size());
718 CHKERR get_moab().tag_get_by_ptr(field_ptr->th_AppOrder, ents,
719 &*vec->begin());
720 return vec;
721 };
722
723 auto get_ents_field_data_vector_adaptor =
724 [&](const Range &ents,
725 boost::shared_ptr<std::vector<const void *>> &ents_max_orders) {
726 // create shared pointer and reserve memory
727 boost::shared_ptr<std::vector<double *>> vec(
728 new std::vector<double *>());
729 vec->reserve(ents.size());
730
731 if (order >= 0 && nb_dofs == 0) {
732 // set empty vector adaptor
733 for (int i = 0; i != ents.size(); ++i)
734 vec->emplace_back(nullptr);
735 } else {
736 moab::ErrorCode rval;
737 std::vector<int> tag_size(ents.size());
738 std::vector<const void *> d_vec_ptr(ents.size());
739
740 // get tags data
741 if (ent_type == MBVERTEX)
742 rval = get_moab().tag_get_by_ptr(field_ptr->th_FieldDataVerts,
743 ents, &*d_vec_ptr.begin(),
744 &*tag_size.begin());
745 else
746 rval = get_moab().tag_get_by_ptr(field_ptr->th_FieldData,
747 ents, &*d_vec_ptr.begin(),
748 &*tag_size.begin());
749
750 auto cast = [](auto p) {
751 return const_cast<FieldData *const>(
752 static_cast<const FieldData *>(p));
753 };
754
755 // some of entities has tag not set or zero dofs on entity
756 if (rval == MB_SUCCESS) {
757 // all is ok, all entities has tag set
758 auto tit = d_vec_ptr.begin();
759 auto oit = ents_max_orders->begin();
760 for (auto sit = tag_size.begin(); sit != tag_size.end();
761 ++sit, ++tit, ++oit)
762 vec->emplace_back(cast(*tit));
763
764 } else {
765 // set empty vector adaptor
766 for (int i = 0; i != ents.size(); ++i)
767 vec->emplace_back(nullptr);
768
769 // check order on all entities, and if for that order non zero
770 // dofs are expected get pointer to tag data and reset vector
771 // adaptor
772 auto oit = ents_max_orders->begin();
773 auto dit = vec->begin();
774 for (auto eit = ents.begin(); eit != ents.end();
775 ++eit, ++oit, ++dit) {
776
777 const int ent_order =
778 *static_cast<const ApproximationOrder *>(*oit);
779 const int ent_nb_dofs = get_nb_dofs_on_order(ent_order);
780
781 if (ent_nb_dofs) {
782 int tag_size;
783 const void *ret_val;
784 if (ent_type == MBVERTEX) {
785 rval = get_moab().tag_get_by_ptr(
786 field_ptr->th_FieldDataVerts, &*eit, 1, &ret_val,
787 &tag_size);
788 } else {
789 rval = get_moab().tag_get_by_ptr(
790 field_ptr->th_FieldData, &*eit, 1, &ret_val,
791 &tag_size);
792 if (rval != MB_SUCCESS) {
793
794 const int set_tag_size[] = {ent_nb_dofs * field_rank};
795 std::array<FieldData, MAX_DOFS_ON_ENTITY> set_d_vec;
796 std::fill(set_d_vec.begin(),
797 &set_d_vec[set_tag_size[0]], 0);
798 const void *set_d_vec_ptr[] = {set_d_vec.data()};
799 CHKERR get_moab().tag_set_by_ptr(
800 field_ptr->th_FieldData, &*eit, 1, set_d_vec_ptr,
801 set_tag_size);
802 rval = get_moab().tag_get_by_ptr(
803 field_ptr->th_FieldData, &*eit, 1, &ret_val,
804 &tag_size);
805
806 if (rval != MB_SUCCESS) {
810 MOFEM_LOG("SELF", Sev::error)
811 << "Error is triggered in MOAB, field tag data "
812 "for same reason can not be for accessed.";
813 MOFEM_LOG("SELF", Sev::error)
814 << "Set order: " << order;
815 MOFEM_LOG("SELF", Sev::error)
816 << "Nb. dofs on entity for given order: "
817 << set_tag_size[0];
818 MOFEM_LOG("SELF", Sev::error)
819 << "Entity type: "
820 << moab::CN::EntityTypeName(ent_type);
821 MOFEM_LOG("SELF", Sev::error)
822 << "Field: " << *field_ptr;
823 CHKERR rval;
824 }
825 }
826 }
827 const_cast<FieldData *&>(*dit) = cast(ret_val);
828 }
829 }
830 }
831 }
832 return vec;
833 };
834
835 auto ents_in_ref_ent = get_ents_in_ref_ent(miit_ref_ent);
836
837 CHKERR create_tags_for_max_order(ents_in_ref_ent);
838 CHKERR create_tags_for_data(ents_in_ref_ent);
839 auto ents_max_order = get_ents_max_order(ents_in_ref_ent);
840 auto ent_field_data =
841 get_ents_field_data_vector_adaptor(ents_in_ref_ent, ents_max_order);
842
843 // reserve memory for field dofs
844 auto ents_array = boost::make_shared<std::vector<FieldEntity>>();
845 // Add sequence to field data structure. Note that entities are
846 // allocated once into vector. This vector is passed into sequence as a
847 // weak_ptr. Vector is destroyed at the point last entity inside that
848 // vector is destroyed.
849 ents_array->reserve(second - first + 1);
850 auto vit_max_order = ents_max_order->begin();
851 auto vit_field_data = ent_field_data->begin();
852 for (int i = 0; i != ents_in_ref_ent.size(); ++i) {
853
854 ents_array->emplace_back(
855 field_ptr, *miit_ref_ent,
856 boost::shared_ptr<double *const>(ent_field_data,
857 &*vit_field_data),
858 boost::shared_ptr<const int>(
859 ents_max_order, static_cast<const int *>(*vit_max_order)));
860 ++vit_max_order;
861 ++vit_field_data;
862 ++miit_ref_ent;
863 }
864 if (!ents_array->empty())
865 if ((*ents_array)[0].getFieldRawPtr() != field_ptr.get())
866 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
867 "Get field ent poiter and field pointer do not match for "
868 "field %s",
869 field_ptr->getName().c_str());
870 nb_ents_set_order_new += ents_array->size();
871
872 // Check if any of entities in the range has bit level but is not added
873 // to database. That generate data inconsistency and error.
874 if (ents_in_ref_ent.size() < (second - first + 1)) {
875 Range ents_not_in_database =
876 subtract(Range(first, second), ents_in_ref_ent);
877 std::vector<const void *> vec_bits(ents_not_in_database.size());
878 CHKERR get_moab().tag_get_by_ptr(
879 get_basic_entity_data_ptr()->th_RefBitLevel, ents_not_in_database,
880 &*vec_bits.begin());
881 auto cast = [](auto p) {
882 return static_cast<const BitRefLevel *>(p);
883 };
884 for (auto v : vec_bits)
885 if (cast(v)->any())
886 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
887 "Try to add entities which are not seeded or added to "
888 "database");
889 }
890
891 // Add entities to database
892 auto hint = entsFields.end();
893 for (auto &v : *ents_array)
894 hint = entsFields.emplace_hint(hint, ents_array, &v);
895 }
896 }
897 }
898
899 if (verb > QUIET) {
900 MOFEM_LOG_C("SYNC", Sev::noisy,
901 "nb. of entities in field <%s> for which order was "
902 "increased %d (order %d)",
903 field_ptr->getName().c_str(), nb_ents_set_order_up, order);
904 MOFEM_LOG_C("SYNC", Sev::noisy,
905 "nb. of entities in field <%s> for which order was "
906 "reduced %d (order %d)",
907 field_ptr->getName().c_str(), nb_ents_set_order_down, order);
909 "SYNC", Sev::noisy,
910 "nb. of entities in field <%s> for which order set %d (order %d)",
911 field_ptr->getName().c_str(), nb_ents_set_order_new, order);
912 }
913
914 if (verb > QUIET) {
915 auto eiit = entsFields.get<Unique_mi_tag>().lower_bound(
916 FieldEntity::getLoBitNumberUId(field_ptr->getBitNumber()));
917 auto hi_eiit = entsFields.get<Unique_mi_tag>().upper_bound(
918 FieldEntity::getHiBitNumberUId(field_ptr->getBitNumber()));
919 MOFEM_LOG_C("SYNC", Sev::noisy,
920 "nb. of ents in the multi index field <%s> %d",
921 field_ptr->getName().c_str(), std::distance(eiit, hi_eiit));
922 }
923
924 if (verb > QUIET)
926
928}
#define MB_ID_WIDTH
double FieldData
Field data type.
Definition Types.hpp:25

◆ setMoabInterface()

MoFEMErrorCode MoFEM::Core::setMoabInterface ( moab::Interface & new_moab,
int verb = VERBOSE )
protected

Definition at line 455 of file Core.cpp.

455 {
457 if (verb == -1)
458 verb = verbose;
459
460 // clear moab database
462
463 // set new reference
464 moab = std::ref(new_moab);
465
466 // check if moab has set communicator if not set communicator internally
467 ParallelComm *pComm = ParallelComm::get_pcomm(&new_moab, MYPCOMM_INDEX);
468 if (pComm == NULL) {
469 pComm = new ParallelComm(&new_moab, wrapMPIMOABComm->get_comm());
470 }
471
472 // create MoFEM tags
473 CHKERR getTags();
474
475 // Create basic entity data struture
476 basicEntityDataPtr = boost::make_shared<BasicEntityData>(moab);
478
479 // Initalise database
481
483};

◆ setRefEntBasicDataPtr()

void MoFEM::Core::setRefEntBasicDataPtr ( MoFEM::Interface & m_field,
boost::shared_ptr< BasicEntityData > & ptr )
static

Definition at line 930 of file Core.cpp.

931 {
932
933 switch (m_field.getValue()) {
934 case -1:
936 break;
937 case 0:
939 break;
940 case 1:
942 break;
943 default:
944 THROW_MESSAGE("Core index can vary from -1 to MAX_CORE_TMP");
945 }
946};
void set_ref_ent_basic_data_ptr_impl(boost::shared_ptr< BasicEntityData > &ptr)
Definition Core.cpp:921

Member Data Documentation

◆ basicEntityDataPtr

boost::shared_ptr<BasicEntityData> MoFEM::CoreTmp< 0 >::basicEntityDataPtr
protected
Returns
pointer to BasicEntityData structure

BasicEntityData is structure which every BasicEntity have. It keeps data about tags to handles on the mesh, in particular tag to BitRefLevel and tag with handle to parent.

Definition at line 281 of file Core.hpp.

◆ buildMoFEM

int* MoFEM::CoreTmp< 0 >::buildMoFEM
mutableprotected

keeps flags/semaphores for different stages

Definition at line 1046 of file Core.hpp.

◆ dofsField

DofEntity_multiIndex MoFEM::CoreTmp< 0 >::dofsField
protected

dofs on fields

Definition at line 305 of file Core.hpp.

◆ entFEAdjacencies

adjacencies of elements to dofs

Definition at line 311 of file Core.hpp.

◆ entsFields

FieldEntity_multiIndex MoFEM::CoreTmp< 0 >::entsFields
protected

entities on fields

Definition at line 304 of file Core.hpp.

◆ entsFiniteElements

EntFiniteElement_multiIndex MoFEM::CoreTmp< 0 >::entsFiniteElements
protected

finite element entities

Definition at line 308 of file Core.hpp.

◆ fIelds

Field_multiIndex MoFEM::CoreTmp< 0 >::fIelds
protected

fields

Definition at line 303 of file Core.hpp.

◆ finiteElements

FiniteElement_multiIndex MoFEM::CoreTmp< 0 >::finiteElements
protected

finite elements

Definition at line 307 of file Core.hpp.

◆ iFaces

boost::ptr_map<boost::typeindex::type_index, UnknownInterface> MoFEM::CoreTmp< 0 >::iFaces
mutableprotected

Hash map of pointers to interfaces.

Definition at line 1044 of file Core.hpp.

◆ initaliseAndBuildField

PetscBool MoFEM::CoreTmp< 0 >::initaliseAndBuildField
protected

If true build field on database initialisation

Definition at line 1050 of file Core.hpp.

◆ initaliseAndBuildFiniteElements

PetscBool MoFEM::CoreTmp< 0 >::initaliseAndBuildFiniteElements
protected

Definition at line 1053 of file Core.hpp.

◆ isGloballyInitialised

bool MoFEM::Core::isGloballyInitialised = false
staticprotected

Core base globally initialized.

Definition at line 1056 of file Core.hpp.

◆ isInitialized

PetscBool MoFEM::Core::isInitialized
staticprotected

petsc was initialised by other agent

Definition at line 1058 of file Core.hpp.

◆ moab

std::reference_wrapper<moab::Interface> MoFEM::CoreTmp< 0 >::moab
protected

moab database

Definition at line 321 of file Core.hpp.

◆ MOFEM_EVENT_createMat

PetscLogEvent MoFEM::CoreTmp< 0 >::MOFEM_EVENT_createMat
protected

Definition at line 1004 of file Core.hpp.

◆ MOFEM_EVENT_operator

PetscLogEvent MoFEM::CoreTmp< 0 >::MOFEM_EVENT_operator
protected

Event for evaluating operator of finite element.

Definition at line 1001 of file Core.hpp.

◆ MOFEM_EVENT_postProcess

PetscLogEvent MoFEM::CoreTmp< 0 >::MOFEM_EVENT_postProcess
protected

Event for postProcess finite element.

Definition at line 1003 of file Core.hpp.

◆ MOFEM_EVENT_preProcess

PetscLogEvent MoFEM::CoreTmp< 0 >::MOFEM_EVENT_preProcess
protected

Event for preProcess finite element.

Definition at line 999 of file Core.hpp.

◆ mofemComm

MPI_Comm MoFEM::CoreTmp< 0 >::mofemComm
mutableprotected

MoFEM communicator.

Definition at line 1012 of file Core.hpp.

◆ mpiInitialised

int MoFEM::Core::mpiInitialised
staticprotected

mpi was initialised by other agent

Definition at line 1057 of file Core.hpp.

◆ optionsPrefix

std::string MoFEM::CoreTmp< 0 >::optionsPrefix
protected

Prefix for options on command line.

Definition at line 1048 of file Core.hpp.

◆ pComm

ParallelComm* MoFEM::CoreTmp< 0 >::pComm
mutableprotected

MOAB communicator structure.

Definition at line 1013 of file Core.hpp.

◆ pRoblems

Problem_multiIndex MoFEM::CoreTmp< 0 >::pRoblems
protected

problems multi-index

Definition at line 313 of file Core.hpp.

◆ rAnk

int MoFEM::CoreTmp< 0 >::rAnk
protected

MOFEM communicator rank.

Definition at line 1016 of file Core.hpp.

◆ refinedEntities

RefEntity_multiIndex MoFEM::CoreTmp< 0 >::refinedEntities
protected

refined entities

Definition at line 300 of file Core.hpp.

◆ refinedFiniteElements

RefElement_multiIndex MoFEM::CoreTmp< 0 >::refinedFiniteElements
protected

refined elements

Definition at line 301 of file Core.hpp.

◆ sIze

int MoFEM::CoreTmp< 0 >::sIze
protected

MoFEM communicator size.

Definition at line 1015 of file Core.hpp.

◆ th_ElemType

Tag MoFEM::CoreTmp< 0 >::th_ElemType
protected

Needed for VTK files.

Definition at line 269 of file Core.hpp.

◆ th_FEId

Tag MoFEM::CoreTmp< 0 >::th_FEId
protected

Definition at line 262 of file Core.hpp.

◆ th_FEIdCol

Tag MoFEM::CoreTmp< 0 >::th_FEIdCol
protected

Definition at line 263 of file Core.hpp.

◆ th_FEIdData

Tag MoFEM::CoreTmp< 0 >::th_FEIdData
protected

Definition at line 263 of file Core.hpp.

◆ th_FEIdRow

Tag MoFEM::CoreTmp< 0 >::th_FEIdRow
protected

Definition at line 263 of file Core.hpp.

◆ th_FEName

Tag MoFEM::CoreTmp< 0 >::th_FEName
protected

Definition at line 262 of file Core.hpp.

◆ th_FieldBase

Tag MoFEM::CoreTmp< 0 >::th_FieldBase
protected

Definition at line 261 of file Core.hpp.

◆ th_FieldContinuity

Tag MoFEM::CoreTmp< 0 >::th_FieldContinuity
protected

Definition at line 261 of file Core.hpp.

◆ th_FieldId

Tag MoFEM::CoreTmp< 0 >::th_FieldId
protected

Definition at line 260 of file Core.hpp.

◆ th_FieldName

Tag MoFEM::CoreTmp< 0 >::th_FieldName
protected

Definition at line 260 of file Core.hpp.

◆ th_FieldName_DataNamePrefix

Tag MoFEM::CoreTmp< 0 >::th_FieldName_DataNamePrefix
protected

Definition at line 260 of file Core.hpp.

◆ th_FieldSpace

Tag MoFEM::CoreTmp< 0 >::th_FieldSpace
protected

Definition at line 260 of file Core.hpp.

◆ th_MoFEMBuild

Tag MoFEM::CoreTmp< 0 >::th_MoFEMBuild
protected

Internal use storing state, used to detect error and inconsistencies

Definition at line 270 of file Core.hpp.

◆ th_Part

Tag MoFEM::CoreTmp< 0 >::th_Part
protected

Tag for partition number.

Definition at line 257 of file Core.hpp.

◆ th_ProblemFEId

Tag MoFEM::CoreTmp< 0 >::th_ProblemFEId
protected

Definition at line 264 of file Core.hpp.

◆ th_ProblemGhostNbDofCol

Tag MoFEM::CoreTmp< 0 >::th_ProblemGhostNbDofCol
protected

Definition at line 267 of file Core.hpp.

◆ th_ProblemGhostNbDofRow

Tag MoFEM::CoreTmp< 0 >::th_ProblemGhostNbDofRow
protected

Definition at line 266 of file Core.hpp.

◆ th_ProblemId

Tag MoFEM::CoreTmp< 0 >::th_ProblemId
protected

Definition at line 264 of file Core.hpp.

◆ th_ProblemLocalNbDofCol

Tag MoFEM::CoreTmp< 0 >::th_ProblemLocalNbDofCol
protected

Definition at line 267 of file Core.hpp.

◆ th_ProblemLocalNbDofRow

Tag MoFEM::CoreTmp< 0 >::th_ProblemLocalNbDofRow
protected

Definition at line 266 of file Core.hpp.

◆ th_ProblemName

Tag MoFEM::CoreTmp< 0 >::th_ProblemName
protected

Definition at line 264 of file Core.hpp.

◆ th_ProblemNbDofsCol

Tag MoFEM::CoreTmp< 0 >::th_ProblemNbDofsCol
protected

Definition at line 265 of file Core.hpp.

◆ th_ProblemNbDofsRow

Tag MoFEM::CoreTmp< 0 >::th_ProblemNbDofsRow
protected

Definition at line 265 of file Core.hpp.

◆ th_ProblemShift

Tag MoFEM::CoreTmp< 0 >::th_ProblemShift
protected

Definition at line 268 of file Core.hpp.

◆ th_RefBitEdge

Tag MoFEM::CoreTmp< 0 >::th_RefBitEdge
protected

Definition at line 258 of file Core.hpp.

◆ th_RefBitLevel

Tag MoFEM::CoreTmp< 0 >::th_RefBitLevel
protected

Definition at line 258 of file Core.hpp.

◆ th_RefBitLevel_Mask

Tag MoFEM::CoreTmp< 0 >::th_RefBitLevel_Mask
protected

Definition at line 258 of file Core.hpp.

◆ th_RefFEMeshset

Tag MoFEM::CoreTmp< 0 >::th_RefFEMeshset
protected

Definition at line 259 of file Core.hpp.

◆ th_RefParentHandle

Tag MoFEM::CoreTmp< 0 >::th_RefParentHandle
protected

Definition at line 258 of file Core.hpp.

◆ value

const int MoFEM::CoreTmp< 0 >::value = 0
staticconstexpr

Definition at line 84 of file Core.hpp.

◆ verbose

int MoFEM::CoreTmp< 0 >::verbose
protected

Verbosity level.

Definition at line 1039 of file Core.hpp.

◆ wrapMPIMOABComm

boost::shared_ptr<WrapMPIComm> MoFEM::CoreTmp< 0 >::wrapMPIMOABComm
protected

manage creation and destruction of MOAB communicator

Definition at line 1037 of file Core.hpp.


The documentation for this struct was generated from the following files: