v0.7.26
Public Member Functions | Private Member Functions | Private Attributes | Static Private Attributes | List of all members
MoFEM::Core Struct Reference

Core (interface) class. More...

#include <src/interfaces/Core.hpp>

Inheritance diagram for MoFEM::Core:
[legend]
Collaboration diagram for MoFEM::Core:
[legend]

Public Member Functions

 Core (moab::Interface &moab, MPI_Comm comm=PETSC_COMM_WORLD, const int verbose=VERBOSE, const bool distributed_mesh=true)
 
 ~Core ()
 
- Public Member Functions inherited from MoFEM::DeprecatedCoreInterface
template<class IFace >
DEPRECATED MoFEMErrorCode query_interface (IFace *&ptr) const
 
template<class IFace >
DEPRECATED IFace * query_interface () const
 
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 More...
 
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 More...
 
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 More...
 
DEPRECATED MoFEMErrorCode seed_ref_level_MESHSET (const EntityHandle meshset, const BitRefLevel &bit, int verb=-1)
 
DEPRECATED MoFEMErrorCode seed_finite_elements (const EntityHandle meshset, int verb=-1)
 
DEPRECATED MoFEMErrorCode seed_finite_elements (const Range &entities, int verb=-1)
 
DEPRECATED MoFEMErrorCode get_entities_by_type_and_ref_level (const BitRefLevel &bit, const BitRefLevel &mask, const EntityType type, const EntityHandle meshset, int verb=-1)
 add all ents from ref level given by bit to meshset More...
 
DEPRECATED MoFEMErrorCode get_entities_by_type_and_ref_level (const BitRefLevel &bit, const BitRefLevel &mask, const EntityType type, Range &ents, int verb=-1)
 add all ents from ref level given by bit to meshset More...
 
DEPRECATED MoFEMErrorCode get_entities_by_ref_level (const BitRefLevel &bit, const BitRefLevel &mask, const EntityHandle meshset)
 add all ents from ref level given by bit to meshset More...
 
DEPRECATED MoFEMErrorCode get_entities_by_ref_level (const BitRefLevel &bit, const BitRefLevel &mask, Range &ents)
 add all ents from ref level given by bit to meshset More...
 
DEPRECATED bool check_msId_meshset (const int msId, const CubitBCType cubit_bc_type)
 check for CUBIT Id and CUBIT type More...
 
DEPRECATED MoFEMErrorCode add_cubit_msId (const CubitBCType cubit_bc_tyep, const int msId, const std::string name="")
 add cubit meshset More...
 
DEPRECATED MoFEMErrorCode set_cubit_msId_attribites (const CubitBCType cubit_bc_type, const int ms_id, const std::vector< double > &attributes, const std::string name="")
 set attributes to cubit meshset More...
 
DEPRECATED MoFEMErrorCode set_cubit_msId_attribites_data_structure (const CubitBCType cubit_bc_type, const int ms_id, const GenericAttributeData &data, const std::string name="")
 set (material) data structure to cubit meshset More...
 
DEPRECATED MoFEMErrorCode set_cubit_msId_bc_data_structure (const CubitBCType cubit_bc_type, const int ms_id, const GenericCubitBcData &data)
 set boundary data structure to meshset More...
 
DEPRECATED MoFEMErrorCode delete_cubit_msId (const CubitBCType cubit_bc_type, const int msId)
 delete cubit meshset More...
 
DEPRECATED MoFEMErrorCode get_cubit_msId (const int msId, const CubitBCType cubit_bc_type, const CubitMeshSets **cubit_meshset_ptr)
 get cubit meshset More...
 
DEPRECATED MoFEMErrorCode get_cubit_msId_entities_by_dimension (const int ms_id, const CubitBCType cubit_bc_type, const int dimension, Range &entities, const bool recursive=false)
 
DEPRECATED MoFEMErrorCode get_cubit_msId_entities_by_dimension (const int ms_id, const CubitBCType cubit_bc_type, Range &entities, const bool recursive=false)
 
DEPRECATED MoFEMErrorCode get_cubit_msId_entities_by_dimension (const int msId, const unsigned int cubit_bc_type, const int dimension, Range &entities, const bool recursive=false)
 get entities from CUBIT/meshset of a particular entity dimension More...
 
DEPRECATED MoFEMErrorCode get_cubit_msId_entities_by_dimension (const int msId, const unsigned int cubit_bc_type, Range &entities, const bool recursive=false)
 get entities related to CUBIT/meshset, More...
 
DEPRECATED MoFEMErrorCode get_cubit_msId_meshset (const int msId, const unsigned int cubit_bc_type, EntityHandle &meshset)
 get meshset from CUBIT Id and CUBIT type More...
 
DEPRECATED MoFEMErrorCode get_cubit_meshsets (const unsigned int cubit_bc_type, Range &meshsets)
 get all CUBIT meshsets by CUBIT type More...
 
DEPRECATED MoFEMErrorCode print_cubit_displacement_set () const
 
DEPRECATED MoFEMErrorCode print_cubit_pressure_set () const
 
DEPRECATED MoFEMErrorCode print_cubit_force_set () const
 
DEPRECATED MoFEMErrorCode print_cubit_materials_set () const
 
DEPRECATED MoFEMErrorCode update_meshset_by_entities_children (const EntityHandle parent, const BitRefLevel &child_bit, const EntityHandle child, EntityType child_type, const bool recursive=false, int verb=-1)
 Get child entities form meshset containing parent entities. More...
 
DEPRECATED MoFEMErrorCode update_field_meshset_by_entities_children (const BitRefLevel &child_bit, int verb=-1)
 update fields meshesets by child entities More...
 
DEPRECATED MoFEMErrorCode update_field_meshset_by_entities_children (const std::string name, const BitRefLevel &child_bit, int verb=-1)
 update field mesheset by child entities More...
 
DEPRECATED MoFEMErrorCode update_finite_element_meshset_by_entities_children (const std::string name, const BitRefLevel &child_bit, const EntityType fe_ent_type, int verb=-1)
 update finite element mesheset by child entities More...
 
DEPRECATED MoFEMErrorCode shift_right_bit_ref (const int shift, int verb=-1)
 right shift bit ref level More...
 
DEPRECATED MoFEMErrorCode build_problem (const std::string &name, const bool square_matrix, int verb=-1)
 build problem data structures More...
 
DEPRECATED MoFEMErrorCode build_problem (Problem *problem_ptr, const bool square_matrix, int verb=-1)
 build problem data structures More...
 
DEPRECATED MoFEMErrorCode build_problem_on_distributed_mesh (const std::string &name, const bool square_matrix=true, int verb=-1)
 build problem data structures, assuming that mesh is distributed (collective) More...
 
DEPRECATED MoFEMErrorCode build_problem_on_distributed_mesh (Problem *problem_ptr, const bool square_matrix=true, int verb=-1)
 build problem data structures, assuming that mesh is distributed (collective) More...
 
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. More...
 
DEPRECATED MoFEMErrorCode partition_simple_problem (const std::string &name, int verb=-1)
 partition problem dofs More...
 
DEPRECATED MoFEMErrorCode partition_problem (const std::string &name, int verb=-1)
 partition problem dofs (collective) More...
 
DEPRECATED MoFEMErrorCode partition_compose_problem (const std::string &name, const std::string &problem_for_rows, const bool copy_rows, const std::string &problem_for_cols, const bool copy_cols, int verb=-1)
 build indexing and partition problem inheriting indexing and partitioning from two other problems More...
 
DEPRECATED MoFEMErrorCode build_sub_problem (const std::string &out_name, const std::vector< std::string > &fields_row, const std::vector< std::string > &fields_col, const std::string &main_problem, const bool square_matrix=true, int verb=-1)
 build sub problem More...
 
DEPRECATED MoFEMErrorCode partition_ghost_dofs (const std::string &name, int verb=-1)
 determine ghost nodes More...
 
DEPRECATED MoFEMErrorCode partition_finite_elements (const std::string &name, bool part_from_moab=false, int low_proc=-1, int hi_proc=-1, int verb=-1)
 partition finite elements More...
 
DEPRECATED MoFEMErrorCode get_problem_elements_layout (const std::string &name, const std::string &fe_name, PetscLayout *layout, int verb=-1)
 Get layout of elements in the problemIn layout is stored information how many elements is on each processor, for more information look int petsc documentation http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/IS/PetscLayoutCreate.html#PetscLayoutCreate More...
 
DEPRECATED MoFEMErrorCode VecCreateSeq (const std::string &name, RowColData rc, Vec *V) const
 create local vector for problem More...
 
DEPRECATED MoFEMErrorCode VecCreateGhost (const std::string &name, RowColData rc, Vec *V) const
 create ghost vector for problem (collective)collective - need to be run on all processors in communicator More...
 
DEPRECATED MoFEMErrorCode ISCreateFromProblemFieldToOtherProblemField (const std::string &x_problem, const std::string &x_field_name, RowColData x_rc, const std::string &y_problem, const std::string &y_field_name, RowColData y_rc, std::vector< int > &idx, std::vector< int > &idy, int verb=-1) const
 create IS for give two problems and field More...
 
DEPRECATED MoFEMErrorCode ISCreateFromProblemFieldToOtherProblemField (const std::string &x_problem, const std::string &x_field_name, RowColData x_rc, const std::string &y_problem, const std::string &y_field_name, RowColData y_rc, IS *ix, IS *iy, int verb=-1) const
 create IS for give two problems and field More...
 
DEPRECATED MoFEMErrorCode ISCreateProblemOrder (const std::string &problem, RowColData rc, int min_order, int max_order, IS *is, int verb=-1) const
 create IS for given order range (collective) More...
 
DEPRECATED MoFEMErrorCode ISCreateProblemFieldAndRank (const std::string &problem, RowColData rc, const std::string &field, int min_coeff_idx, int max_coeff_idx, IS *is, int verb=-1) const
 create IS for given problem, field and rank range (collective) More...
 
DEPRECATED MoFEMErrorCode VecScatterCreate (Vec xin, const std::string &x_problem, const std::string &x_field_name, RowColData x_rc, Vec yin, const std::string &y_problem, const std::string &y_field_name, RowColData y_rc, VecScatter *newctx, int verb=-1) const
 create scatter for vectors form one to another problem (collective)User specify what name of field on one problem is scattered to another. More...
 
DEPRECATED MoFEMErrorCode VecScatterCreate (Vec xin, const std::string &x_problem, RowColData x_rc, Vec yin, const std::string &y_problem, RowColData y_rc, VecScatter *newctx, int verb=-1) const
 create scatter for vectors form one to another problem (collective) More...
 
DEPRECATED MoFEMErrorCode set_local_ghost_vector (const Problem *problem_ptr, RowColData rc, Vec V, InsertMode mode, ScatterMode scatter_mode) const
 set values of vector from/to meshdatabase More...
 
DEPRECATED MoFEMErrorCode set_local_ghost_vector (const std::string &name, RowColData rc, Vec V, InsertMode mode, ScatterMode scatter_mode) const
 set values of vector from/to meshdatabase More...
 
DEPRECATED MoFEMErrorCode set_global_ghost_vector (const Problem *problem_ptr, RowColData rc, Vec V, InsertMode mode, ScatterMode scatter_mode) const
 set values of vector from/to mesh database (collective)collective - need tu be run on all processors in communicator More...
 
DEPRECATED MoFEMErrorCode set_global_ghost_vector (const std::string &name, RowColData rc, Vec V, InsertMode mode, ScatterMode scatter_mode) const
 set values of vector from/to mesh database (collective)collective - need tu be run on all processors in communicator More...
 
DEPRECATED MoFEMErrorCode set_other_local_ghost_vector (const Problem *problem_ptr, const std::string &fiel_name, const std::string &cpy_field_name, RowColData rc, Vec V, InsertMode mode, ScatterMode scatter_mode, int verb=-1)
 Copy vector to field which is not part of the problem. More...
 
DEPRECATED MoFEMErrorCode set_other_local_ghost_vector (const std::string &name, const std::string &field_name, const std::string &cpy_field_name, RowColData rc, Vec V, InsertMode mode, ScatterMode scatter_mode, int verb=-1)
 Copy vector to field which is not part of the problem. More...
 
DEPRECATED MoFEMErrorCode set_other_global_ghost_vector (const Problem *problem_ptr, const std::string &field_name, const std::string &cpy_field_name, RowColData rc, Vec V, InsertMode mode, ScatterMode scatter_mode, int verb=-1)
 Copy vector to field which is not part of the problem (collective)collective - need tu be run on all processors in communicator. More...
 
DEPRECATED MoFEMErrorCode set_other_global_ghost_vector (const std::string &name, const std::string &field_name, const std::string &cpy_field_name, RowColData rc, Vec V, InsertMode mode, ScatterMode scatter_mode, int verb=-1)
 Copy vector to field which is not part of the problem (collective)collective - need tu be run on all processors in communicator. More...
 
DEPRECATED MoFEMErrorCode field_axpy (const double alpha, const std::string &fiel_name_x, const std::string &field_name_y, bool error_if_missing=false, bool creat_if_missing=false)
 axpy fields More...
 
DEPRECATED MoFEMErrorCode field_scale (const double alpha, const std::string &field_name)
 scale field More...
 
DEPRECATED MoFEMErrorCode set_field (const double val, const EntityType type, const std::string &field_name)
 use FieldBlas More...
 
DEPRECATED MoFEMErrorCode set_field (const double val, const EntityType type, const Range &ents, const std::string &field_name)
 set field More...
 
DEPRECATED MoFEMErrorCode get_adjacencies_equality (const EntityHandle from_entiti, const int to_dimension, Range &adj_entities) const
 Get the adjacencies associated with a entity to entities of a specified dimension. \ separate interface, i.e. BitLevelManager. More...
 
DEPRECATED MoFEMErrorCode get_adjacencies_any (const EntityHandle from_entiti, const int to_dimension, Range &adj_entities) const
 Get the adjacencies associated with a entity to entities of a specified dimension.bit ref level of adjacent entities is any of bit ref level of adjacent entities. More...
 
DEPRECATED MoFEMErrorCode get_adjacencies (const Problem *problem_ptr, const EntityHandle *from_entities, const int num_netities, const int to_dimension, Range &adj_entities, const int operation_type=moab::Interface::INTERSECT, const int verb=0) const
 Get the adjacencies associated with a entity to entities of a specified dimension. \ separate interface, i.e. BitLevelManage. More...
 
DEPRECATED MoFEMErrorCode get_adjacencies (const BitRefLevel &bit, const EntityHandle *from_entities, const int num_netities, const int to_dimension, Range &adj_entities, const int operation_type=moab::Interface::INTERSECT, const int verb=0) const
 Get the adjacencies associated with a entity to entities of a specified dimension. \ separate interface, i.e. BitLevelManage. More...
 
DEPRECATED MoFEMErrorCode clear_dofs_fields (const BitRefLevel &bit, const BitRefLevel &mask, int verb=-1)
 
DEPRECATED MoFEMErrorCode clear_ents_fields (const BitRefLevel &bit, const BitRefLevel &mask, int verb=-1)
 
DEPRECATED MoFEMErrorCode clear_finite_elements (const BitRefLevel &bit, const BitRefLevel &mask, int verb=-1)
 
DEPRECATED MoFEMErrorCode add_ents_to_field_by_VERTICEs (const Range &nodes, const std::string &name, int verb=-1)
 set field entities on verticesThe lower dimension entities are added depending on the space type More...
 
DEPRECATED MoFEMErrorCode add_ents_to_field_by_VERTICEs (const EntityHandle meshset, const std::string &name, int verb=-1)
 set field entities on verticesThe lower dimension entities are added depending on the space type More...
 
DEPRECATED MoFEMErrorCode add_ents_to_field_by_EDGEs (const Range &edges, const std::string &name, int verb=-1)
 set field entities form adjacencies of edgesThe lower dimension entities are added depending on the space type More...
 
DEPRECATED MoFEMErrorCode add_ents_to_field_by_EDGEs (const EntityHandle meshset, const std::string &name, int verb=-1)
 set field entities form adjacencies of edgesThe lower dimension entities are added depending on the space type More...
 
DEPRECATED MoFEMErrorCode add_ents_to_field_by_TRIs (const EntityHandle meshset, const std::string &name, int verb=-1)
 set field entities form adjacencies of trianglesThe lower dimension entities are added depending on the space type More...
 
DEPRECATED MoFEMErrorCode add_ents_to_field_by_TRIs (const Range &tris, const std::string &name, int verb=-1)
 set field entities form adjacencies of trianglesThe lower dimension entities are added depending on the space type More...
 
DEPRECATED MoFEMErrorCode add_ents_to_field_by_TETs (const EntityHandle meshset, const std::string &name, int verb=-1)
 set field entities from adjacencies of tetrahedronThe lower dimension entities are added depending on the space type More...
 
DEPRECATED MoFEMErrorCode add_ents_to_field_by_TETs (const Range &tets, const std::string &name, int verb=-1)
 set field entities from adjacencies of tetrahedronThe lower dimension entities are added depending on the space type More...
 
DEPRECATED MoFEMErrorCode add_ents_to_field_by_QUADs (const Range &quads, const std::string &name, int verb=-1)
 set field entities from adjacencies of quadsThe lower dimension entities are added depending on the space type More...
 
DEPRECATED MoFEMErrorCode add_ents_to_field_by_QUADs (EntityHandle meshset, const std::string &name, int verb=-1)
 set field entities from adjacencies of quadsThe lower dimension entities are added depending on the space type More...
 
DEPRECATED MoFEMErrorCode add_ents_to_field_by_PRISMs (const Range &prisms, const std::string &name, int verb=-1)
 set field entities from adjacencies of prismsThe lower dimension entities are added depending on the space type More...
 
DEPRECATED MoFEMErrorCode add_ents_to_field_by_PRISMs (EntityHandle meshset, const std::string &name, int verb=-1)
 set field entities from adjacencies of prismsThe lower dimension entities are added depending on the space type More...
 
- Public Member Functions inherited from MoFEM::CoreInterface
template<typename DIT >
MoFEMErrorCode get_field_dof_data (const std::string &name, const EntityHandle *ent, const int num_ents, DIT dit, int *count=NULL)
 get field data from entity and fieldthis function is not recommended to be used in finite element implementation More...
 
template<typename DIT >
MoFEMErrorCode get_field_dof_data (const std::string &name, const Range &ents, DIT dit, int *count=NULL)
 get field data from entity and fieldthis function is not recommended to be used in finite element implementation More...
 
- Public Member Functions inherited from MoFEM::UnknownInterface
template<class IFACE >
MoFEMErrorCode registerInterface (const MOFEMuuid &uuid, bool error_if_registration_failed=true)
 Register interface. More...
 
template<class IFACE , bool VERIFY = false>
MoFEMErrorCode getInterface (const MOFEMuuid &uuid, IFACE *&iface) const
 Get interface by uuid and return reference to pointer of interface. More...
 
template<class IFACE >
MoFEMErrorCode getInterface (IFACE *&iface) const
 Get interface refernce to pointer of interface. More...
 
template<class IFACE >
MoFEMErrorCode getInterface (IFACE **const iface) const
 Get interface pointer to pointer of interface. More...
 
template<class IFACE , typename boost::enable_if< boost::is_pointer< IFACE >, int >::type = 0>
IFACE getInterface () const
 Get interface pointer to pointer of interface. More...
 
template<class IFACE , typename boost::enable_if< boost::is_reference< IFACE >, int >::type = 0>
IFACE getInterface () const
 Get reference to interface. More...
 
template<class IFACE >
IFACE * getInterface () const
 Function returning pointer to interface. More...
 
virtual ~UnknownInterface ()
 
virtual MoFEMErrorCode getLibVersion (Version &version) const
 Get library version. More...
 
virtual const MoFEMErrorCode getFileVersion (moab::Interface &moab, Version &version) const
 Get database major version. More...
 
virtual MoFEMErrorCode getInterfaceVersion (Version &version) const
 Get database major version. More...
 
template<>
MoFEMErrorCode getInterface (const MOFEMuuid &uuid, UnknownInterface *&iface) const
 

Private Member Functions

MoFEMErrorCode addProblem (const BitProblemId id, const std::string &name, int verb=DEFAULT_VERBOSITY)
 add problem More...
 
MoFEMErrorCode getTags (int verb=DEFAULT_VERBOSITY)
 Get tag handles. More...
 
MoFEMErrorCode clearMap ()
 Cleaning database. More...
 
MoFEMErrorCode registerSubInterfaces ()
 Register insterfaces. More...
 
BitFieldId getFieldShift ()
 Return unique field Id. More...
 
BitFEId getFEShift ()
 Return unique finite element Id. More...
 
BitProblemId getProblemShift ()
 Return unique problem Id. More...
 
MoFEMErrorCode initialiseDatabaseFromMesh (int verb=DEFAULT_VERBOSITY)
 Initialize database getting information on mesh. More...
 
MoFEMErrorCode getOptions (int verb=DEFAULT_VERBOSITY)
 Get core options from command line. More...
 
template<class IFACE >
MoFEMErrorCode regSubInterface (const MOFEMuuid &uid)
 

Private Attributes

int verbose
 Verbosity level. More...
 
intfShift
 Ptr to tag handle storing last set bit in field ID. More...
 
intfeShift
 Ptr to tag handle storing last set bit in finite element ID. More...
 
intpShift
 Ptr to tag handle storing last set bit in problem ID. More...
 
boost::ptr_map< unsigned long, UnknownInterfaceiFaces
 Hash map of pointers to interfaces. More...
 
intbuildMoFEM
 keeps flags/semaphores for different stages More...
 
std::string optionsPrefix
 Prefix for options on command line. More...
 
PetscBool initaliseAndBuildField
 
PetscBool initaliseAndBuildFiniteElements
 

Static Private Attributes

static bool isGloballyInitialised = false
 Core base globally initialized. More...
 

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. More...
 
static MoFEMErrorCode Finalize ()
 Checks for options to be called at the conclusion of the program. More...
 

Assessing interfaces

MoFEMErrorCode query_interface (const MOFEMuuid &uuid, UnknownInterface **iface) const
 Getting interface of core database. More...
 

Get tag handles to data on the mesh

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

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
}
 
intgetBuildMoFEM () const
 Get flags/semaphores for different stages. More...
 
MoFEMErrorCode addPrismToDatabase (const EntityHandle prism, int verb=DEFAULT_VERBOSITY)
 add prim element More...
 

Tags to data on mesh and entities

Tag th_Part
 Tag for partition number. More...
 
Tag th_RefParentHandle
 
Tag th_RefBitLevel
 
Tag th_RefBitLevel_Mask
 
Tag th_RefBitEdge
 
Tag th_RefFEMeshset
 
Tag th_RefType
 
Tag th_FieldId
 
Tag th_FieldName
 
Tag th_FieldName_DataNamePrefix
 
Tag th_FieldSpace
 
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_FieldShift
 
Tag th_FEShift
 
Tag th_ElemType
 Needed for VTK files. More...
 
Tag th_MoFEMBuild
 
boost::shared_ptr< BasicEntityDatabasicEntityDataPtr
 
boost::shared_ptr< BasicEntityData > & get_basic_entity_data_ptr ()
 Get pointer to basic entity data. More...
 

Multi-Indices accessing data on the mesh

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

Get moab database

std::reference_wrapper< moab::Interface > moab
 moab database More...
 
moab::Interface & get_moab ()
 
const moab::Interface & get_moab () const
 
MoFEMErrorCode set_moab_interface (moab::Interface &new_moab, int verb=VERBOSE, const bool distributed_mesh=true)
 Set the moab interface object. More...
 

Check database consistency

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

Clear database

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

Getting access to meshset manager

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

Remove and delete entities

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

Synchronize entities (Following functions in future will be

deprecated)

MoFEMErrorCode synchronise_entities (Range &ent, int verb=DEFAULT_VERBOSITY)
 
MoFEMErrorCode synchronise_field_entities (const BitFieldId id, int verb=DEFAULT_VERBOSITY)
 
MoFEMErrorCode synchronise_field_entities (const std::string &name, int verb=DEFAULT_VERBOSITY)
 

Fields

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 filed. More...
 
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. More...
 
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. More...
 
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 meshsetcollective. More...
 
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. More...
 

Set approximation order

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. More...
 
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. More...
 
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. More...
 

Build fields

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 More...
 

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 More...
 
MoFEMErrorCode remove_ents_from_field (const std::string &name, const EntityHandle meshset, const EntityType type, int verb=DEFAULT_VERBOSITY)
 remove entities from field More...
 
MoFEMErrorCode remove_ents_from_field (const std::string &name, const Range &ents, int verb=DEFAULT_VERBOSITY)
 remove entities from field More...
 
MoFEMErrorCode remove_ents_from_field (const Range &ents, int verb=DEFAULT_VERBOSITY)
 remove entities from all fields More...
 

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 More...
 
BitFieldId getBitFieldId (const std::string &name) const
 
std::string getBitFieldIdName (const BitFieldId id) const
 
EntityHandle get_field_meshset (const BitFieldId id) const
 
EntityHandle get_field_meshset (const std::string &name) const
 get field meshset More...
 
MoFEMErrorCode get_field_entities_by_dimension (const std::string name, int dim, Range &ents) const
 get entities in the field by dimension More...
 
MoFEMErrorCode get_field_entities_by_type (const std::string name, EntityType type, Range &ents) const
 get entities in the field by type More...
 
MoFEMErrorCode get_field_entities_by_handle (const std::string name, Range &ents) const
 get entities in the field by handle More...
 
bool check_field (const std::string &name) const
 check if field is in database More...
 
const Fieldget_field_structure (const std::string &name)
 get field structure More...
 

Finite elements

bool check_finite_element (const std::string &name) const
 Check if finite element is in database. More...
 
MoFEMErrorCode add_finite_element (const std::string &fe_name, enum MoFEMTypes bh=MF_EXCL, int verb=DEFAULT_VERBOSITY)
 add finite element More...
 
MoFEMErrorCode modify_finite_element_adjacency_table (const std::string &fe_name, const EntityType type, ElementAdjacencyFunct function)
 modify finite element table, only for advanced user More...
 
MoFEMErrorCode modify_finite_element_add_field_data (const std::string &fe_name, const std::string &name_filed)
 set finite element field data More...
 
MoFEMErrorCode modify_finite_element_add_field_row (const std::string &fe_name, const std::string &name_row)
 set field row which finite element use More...
 
MoFEMErrorCode modify_finite_element_add_field_col (const std::string &fe_name, const std::string &name_col)
 set field col which finite element use More...
 
MoFEMErrorCode modify_finite_element_off_field_data (const std::string &fe_name, const std::string &name_filed)
 unset finite element field data More...
 
MoFEMErrorCode modify_finite_element_off_field_row (const std::string &fe_name, const std::string &name_row)
 unset field row which finite element use More...
 
MoFEMErrorCode modify_finite_element_off_field_col (const std::string &fe_name, const std::string &name_col)
 unset field col which finite element use More...
 
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 More...
 
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 More...
 
MoFEMErrorCode add_ents_to_finite_element_by_type (const Range &ents, const EntityType type, const std::string &name)
 add entities to finite elements More...
 
MoFEMErrorCode add_ents_to_finite_element_by_dim (const Range &ents, const int dim, const std::string &name)
 add entities to finite elements More...
 
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 More...
 
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 More...
 
DEPRECATED MoFEMErrorCode add_ents_to_finite_element_by_VERTICEs (const Range &vert, const std::string &name)
 add VERTICES entities from range to finite element database given by name More...
 
DEPRECATED MoFEMErrorCode add_ents_to_finite_element_by_EDGEs (const Range &vert, const std::string &name)
 add EDGES entities from range to finite element database given by name More...
 
DEPRECATED MoFEMErrorCode add_ents_to_finite_element_by_EDGEs (const EntityHandle meshset, const std::string &name, const bool recursive=false)
 add EDGES finite elements More...
 
DEPRECATED MoFEMErrorCode add_ents_to_finite_element_by_TRIs (const Range &tris, const std::string &name)
 add TRI entities from range to finite element database given by name More...
 
DEPRECATED MoFEMErrorCode add_ents_to_finite_element_by_TRIs (const EntityHandle meshset, const std::string &name, const bool recursive=false)
 add TRI entities from meshset to finite element database given by name More...
 
DEPRECATED MoFEMErrorCode add_ents_to_finite_element_by_TETs (const Range &tets, const std::string &name)
 add TET entities from range to finite element database given by name More...
 
DEPRECATED MoFEMErrorCode add_ents_to_finite_element_by_TETs (const EntityHandle meshset, const std::string &name, const bool recursive=false)
 add TET entities from meshset to finite element database given by name More...
 
DEPRECATED MoFEMErrorCode add_ents_to_finite_element_by_PRISMs (const Range &prims, const BitFEId id)
 
DEPRECATED MoFEMErrorCode add_ents_to_finite_element_by_PRISMs (const Range &prims, const std::string &name)
 add PRISM entities from meshset to finite element database given by name More...
 
DEPRECATED MoFEMErrorCode add_ents_to_finite_element_by_PRISMs (const EntityHandle meshset, const std::string &name, const bool recursive=false)
 add TET entities from meshset to finite element database given by name More...
 
DEPRECATED MoFEMErrorCode add_ents_to_finite_element_EntType_by_bit_ref (const BitRefLevel &bit, const std::string &name, EntityType type, int verb=DEFAULT_VERBOSITY)
 add TET elements from given refinement level to finite element database given by name More...
 
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)
 add TET entities from given refinement level to finite element database given by name More...
 
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 More...
 
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 More...
 
MoFEMErrorCode remove_ents_from_finite_element (const std::string &name, const Range &ents, int verb=DEFAULT_VERBOSITY)
 remove entities from finite element database More...
 
MoFEMErrorCode remove_ents_from_finite_element (const Range &ents, int verb=DEFAULT_VERBOSITY)
 remove entities from finite elements in database More...
 
MoFEMErrorCode delete_finite_element (const std::string name, int verb=DEFAULT_VERBOSITY)
 delete finite element from mofem database More...
 
BitFEId getBitFEId (const std::string &name) const
 Get field Id. More...
 
std::string getBitFEIdName (const BitFEId id) const
 Get field name. More...
 
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 More...
 
MoFEMErrorCode get_finite_element_entities_by_type (const std::string name, EntityType type, Range &ents) const
 get entities in the finite element by type More...
 
MoFEMErrorCode get_finite_element_entities_by_handle (const std::string name, Range &ents) const
 get entities in the finite element by handle More...
 
MoFEMErrorCode list_finite_elements () const
 list finite elements in database More...
 

Problems

MoFEMErrorCode add_problem (const std::string &name, enum MoFEMTypes bh=MF_EXCL, int verb=DEFAULT_VERBOSITY)
 Add problem. More...
 
bool check_problem (const std::string name)
 check if problem exist More...
 
MoFEMErrorCode delete_problem (const std::string name)
 Delete problem. More...
 
MoFEMErrorCode modify_problem_add_finite_element (const std::string &name_problem, const std::string &MoFEMFiniteElement_name)
 add finite element to problem, this add entities assigned to finite element to a particular problem More...
 
MoFEMErrorCode modify_problem_unset_finite_element (const std::string &name_problem, const std::string &MoFEMFiniteElement_name)
 unset finite element from problem, this remove entities assigned to finite element to a particular problemNote: If problem is build, it need to be cleaned to make this effective More...
 
MoFEMErrorCode modify_problem_ref_level_add_bit (const std::string &name_problem, const BitRefLevel &bit)
 add ref level to problem More...
 
MoFEMErrorCode modify_problem_ref_level_set_bit (const std::string &name_problem, const BitRefLevel &bit)
 set ref level for problem More...
 
MoFEMErrorCode modify_problem_mask_ref_level_add_bit (const std::string &name_problem, const BitRefLevel &bit)
 set dof mask ref level for problem More...
 
MoFEMErrorCode modify_problem_mask_ref_level_set_bit (const std::string &name_problem, const BitRefLevel &bit)
 set dof mask ref level for problem More...
 
BitProblemId getBitProblemId (const std::string &name) const
 
MoFEMErrorCode list_problem () const
 list problems More...
 
MoFEMErrorCode clear_problem (const std::string &name, int verb=DEFAULT_VERBOSITY)
 clear problem More...
 
MoFEMErrorCode clear_problems (int verb=DEFAULT_VERBOSITY)
 clear problems More...
 
MoFEMErrorCode build_finite_elements (int verb=DEFAULT_VERBOSITY)
 Build finite elementsBuild finite element data structures. Have to be run before problem and adjacencies are constructed. More...
 
MoFEMErrorCode build_finite_elements (const BitRefLevel &bit, int verb=DEFAULT_VERBOSITY)
 
MoFEMErrorCode build_finite_elements (const string fe_name, const Range *ents_ptr=NULL, int verb=DEFAULT_VERBOSITY)
 Build finite elementsBuild finite element data structures. Have to be run before problem and adjacencies are constructed. More...
 
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 &name, const Range &ents, int verb=DEFAULT_VERBOSITY)
 
MoFEMErrorCode resolve_shared_ents (const Problem *problem_ptr, const std::string &fe_name, int verb=DEFAULT_VERBOSITY)
 resolve shared entities for finite elements in the problem More...
 
MoFEMErrorCode resolve_shared_ents (const std::string &name, const std::string &fe_name, int verb=DEFAULT_VERBOSITY)
 resolve shared entities for finite elements in the problem More...
 
MoFEMErrorCode get_problem_finite_elements_entities (const std::string &name, const std::string &fe_name, const EntityHandle meshset)
 add finite elements to the meshset More...
 
DEPRECATED MoFEMErrorCode build_problem_on_distributed_mesh (int verb=DEFAULT_VERBOSITY)
 build problem data structures, assuming that mesh is distributed (collective) More...
 
DEPRECATED MoFEMErrorCode build_problems (int verb=DEFAULT_VERBOSITY)
 build problem data structures More...
 
MoFEMErrorCode partition_check_matrix_fill_in (const std::string &problem_name, int row, int col, int verb)
 check if matrix fill in correspond to finite element indices More...
 

Adjacencies

MoFEMErrorCode build_adjacencies (const Range &ents, int verb=DEFAULT_VERBOSITY)
 build adjacencies More...
 
MoFEMErrorCode build_adjacencies (const BitRefLevel &bit, int verb=DEFAULT_VERBOSITY)
 build adjacencies More...
 
MoFEMErrorCode build_adjacencies (const BitRefLevel &bit, const BitRefLevel &mask, int verb=DEFAULT_VERBOSITY)
 build adjacencies More...
 
MoFEMErrorCode clear_adjacencies_entities (const BitRefLevel &bit, const BitRefLevel &mask, int verb=DEFAULT_VERBOSITY)
 clear adjacency map for entities on given bit level More...
 
MoFEMErrorCode clear_adjacencies_entities (const Range &ents, int verb=DEFAULT_VERBOSITY)
 clear adjacencies for field entities by entities More...
 
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 More...
 
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 More...
 
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)
 
MoFEMErrorCode list_adjacencies () const
 list adjacencies More...
 

Create matrices (will be moved to independent interface)

MoFEMErrorCode MatCreateMPIAIJWithArrays (const std::string &name, Mat *Aij, int verb=DEFAULT_VERBOSITY)
 create Mat (MPIAIJ) for problem (collective) More...
 
MoFEMErrorCode MatCreateMPIAdj_with_Idx_mi_tag (const std::string &name, Mat *Adj, int verb=DEFAULT_VERBOSITY)
 Create Adj matrix. More...
 
MoFEMErrorCode MatCreateSeqAIJWithArrays (const std::string &name, Mat *Aij, PetscInt **i, PetscInt **j, PetscScalar **v, int verb=DEFAULT_VERBOSITY)
 create Mat (AIJ) for problem More...
 

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. More...
 
MoFEMErrorCode problem_basic_method_preProcess (const std::string &problem_name, BasicMethod &method, int verb=DEFAULT_VERBOSITY)
 Set data for BasicMethod. More...
 
MoFEMErrorCode problem_basic_method_postProcess (const Problem *problem_ptr, BasicMethod &method, int verb=DEFAULT_VERBOSITY)
 Set data for BasicMethodThis 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. More...
 
MoFEMErrorCode problem_basic_method_postProcess (const std::string &problem_name, BasicMethod &method, int verb=DEFAULT_VERBOSITY)
 Set data for BasicMethodThis 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. More...
 
MoFEMErrorCode loop_finite_elements (const Problem *problem_ptr, const std::string &fe_name, FEMethod &method, int lower_rank, int upper_rank, MoFEMTypes bh=MF_EXIST, int verb=DEFAULT_VERBOSITY)
 Make a loop over finite elements on partitions from upper to lower rank. More...
 
MoFEMErrorCode loop_finite_elements (const std::string &problem_name, const std::string &fe_name, FEMethod &method, int lower_rank, int upper_rank, MoFEMTypes bh=MF_EXIST, int verb=DEFAULT_VERBOSITY)
 Make a loop over finite elements on partitions from upper to lower rank. More...
 
MoFEMErrorCode loop_finite_elements (const std::string &problem_name, const std::string &fe_name, FEMethod &method, MoFEMTypes bh=MF_EXIST, int verb=DEFAULT_VERBOSITY)
 Make a loop over finite elements. More...
 
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. More...
 
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. More...
 
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. More...
 
MoFEMErrorCode loop_dofs (const std::string &field_name, DofMethod &method, int verb=DEFAULT_VERBOSITY)
 Make a loop over dofs. More...
 
MoFEMErrorCode loop_entities (const std::string &field_name, EntityMethod &method, int verb=DEFAULT_VERBOSITY)
 Make a loop over entities. More...
 

Accessing multi-indices

MoFEMErrorCode get_fields (const Field_multiIndex **fields_ptr) const
 Get fields multi-index from database. More...
 
MoFEMErrorCode get_ref_ents (const RefEntity_multiIndex **refined_entities_ptr) const
 Get ref entities multi-index from database. More...
 
MoFEMErrorCode get_ref_finite_elements (const RefElement_multiIndex **refined_finite_elements_ptr) const
 Get ref finite elements multi-index form database. More...
 
MoFEMErrorCode get_finite_elements (const FiniteElement_multiIndex **fe_ptr) const
 Get finite elements multi-index. More...
 
MoFEMErrorCode get_ents_finite_elements (const EntFiniteElement_multiIndex **fe_ent_ptr) const
 Get entities finite elements multi-index. More...
 
MoFEMErrorCode get_field_ents (const FieldEntity_multiIndex **field_ents) const
 Get field multi index. More...
 
MoFEMErrorCode get_dofs (const DofEntity_multiIndex **dofs_ptr) const
 Get dofs multi index. More...
 
MoFEMErrorCode get_problem (const std::string &problem_name, const Problem **problem_ptr) const
 Get problem database (data structure) More...
 
MoFEMErrorCode get_problems (const Problem_multiIndex **problems_ptr) const
 Get pointer to problems multi-index. More...
 
FieldEntityByFieldName::iterator get_ent_field_by_name_begin (const std::string &field_name) const
 get begin iterator of filed ents of given name (instead you can use IT_GET_ENT_FIELD_BY_NAME_FOR_LOOP(MFIELD,NAME,IT) More...
 
FieldEntityByFieldName::iterator get_ent_field_by_name_end (const std::string &field_name) const
 get begin iterator of filed 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)) { ... } More...
 
DofEntityByFieldName::iterator get_dofs_by_name_begin (const std::string &field_name) const
 get begin iterator of filed 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)) { ... } More...
 
DofEntityByFieldName::iterator get_dofs_by_name_end (const std::string &field_name) const
 get begin iterator of filed 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)) { ... } More...
 
DofEntityByNameAndEnt::iterator get_dofs_by_name_and_ent_begin (const std::string &field_name, const EntityHandle ent) const
 get begin iterator of filed dofs of given name and ent(instead you can use IT_GET_DOFS_FIELD_BY_NAME_FOR_LOOP(MFIELD,NAME,ENT,IT) More...
 
DofEntityByNameAndEnt::iterator get_dofs_by_name_and_ent_end (const std::string &field_name, const EntityHandle ent) const
 get begin iterator of filed 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)) { ... } More...
 
DofEntityByNameAndType::iterator get_dofs_by_name_and_type_begin (const std::string &field_name, const EntityType type) const
 get begin iterator of filed dofs of given name and ent type (instead you can use IT_GET_DOFS_FIELD_BY_NAME_FOR_LOOP(MFIELD,NAME,TYPE,IT) More...
 
DofEntityByNameAndType::iterator get_dofs_by_name_and_type_end (const std::string &field_name, const EntityType ent) const
 get begin iterator of filed dofs of given name end ent type(instead you can use IT_GET_DOFS_FIELD_BY_NAME_FOR_LOOP(MFIELD,NAME,TYPE,IT) More...
 
EntFiniteElementByName::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) More...
 
EntFiniteElementByName::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) More...
 

Log events

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

Communicator

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

Additional Inherited Members

- Protected Member Functions inherited from MoFEM::UnknownInterface
boost::typeindex::type_index getClassIdx (const MOFEMuuid &uid) const
 Get type name for interface Id. More...
 
MOFEMuuid getUId (const boost::typeindex::type_index &class_idx) const
 Get interface Id for class name. More...
 

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:
analytical_nonlinear_poisson.cpp, analytical_poisson.cpp, analytical_poisson_field_split.cpp, cell_forces.cpp, cubit_bc_test.cpp, delete_ho_nodes.cpp, elasticity.cpp, field_to_vertices.cpp, forces_and_sources_testing_edge_element.cpp, hello_world.cpp, magnetostatic.cpp, mesh_cut.cpp, mesh_smoothing.cpp, minimal_surface_area.cpp, simple_elasticity.cpp, simple_interface.cpp, split_sideset.cpp, and unsaturated_transport.cpp.

Definition at line 50 of file Core.hpp.

Member Enumeration Documentation

◆ 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 165 of file Core.hpp.

Constructor & Destructor Documentation

◆ Core()

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

Construct core database

Parameters
moabMoAB interface
commMPI communicator
verboseVerbosity level
distributed_meshUId of entities and dofs depends on owing processor, assumed that mesh is distributed. Otherwise is assumed that all processors have the same meshes and same entity handlers.

Definition at line 78 of file Core.cpp.

80  : moab(moab), cOmm(0), verbose(verbose),
81  initaliseAndBuildField(PETSC_FALSE),
82  initaliseAndBuildFiniteElements(PETSC_FALSE) {
83 
84  // This is deprecated ONE should use MoFEM::Core::Initialize
85  if (!isGloballyInitialised) {
86  PetscPushErrorHandler(mofem_error_handler, PETSC_NULL);
87  isGloballyInitialised = true;
88  }
89 
90  // Register interfaces for this implementation
91  ierr = registerInterface<UnknownInterface>(IDD_MOFEMUnknown);
92  CHKERRABORT(comm, ierr);
93  ierr = registerInterface<CoreInterface>(IDD_MOFEMCoreInterface);
94  CHKERRABORT(comm, ierr);
95  ierr = registerInterface<DeprecatedCoreInterface>(
97  CHKERRABORT(comm, ierr);
98 
99  // Register sub-interfaces
101  CHKERRABORT(PETSC_COMM_SELF, ierr);
102 
103  // Register MOFEM events in PETSc
104  PetscLogEventRegister("FE_preProcess", 0, &MOFEM_EVENT_preProcess);
105  PetscLogEventRegister("FE_operator", 0, &MOFEM_EVENT_operator);
106  PetscLogEventRegister("FE_postProcess", 0, &MOFEM_EVENT_postProcess);
107  PetscLogEventRegister("MoFEMCreateMat", 0, &MOFEM_EVENT_createMat);
108 
109  // Duplicate PETSc communicator
110  ierr = PetscCommDuplicate(comm, &cOmm, NULL);
111  CHKERRABORT(comm, ierr);
112  MPI_Comm_size(cOmm, &sIze);
113  MPI_Comm_rank(cOmm, &rAnk);
114  // CHeck if moab has set communicator if not set communicator interbally
115  ParallelComm *pComm = ParallelComm::get_pcomm(&moab, MYPCOMM_INDEX);
116  if (pComm == NULL) {
117  pComm = new ParallelComm(&moab, cOmm);
118  }
119 
120  // Initialize database
121  ierr = getTags();
122  CHKERRABORT(cOmm, ierr);
123  ierr = clearMap();
124  CHKERRABORT(cOmm, ierr);
125 
126  basicEntityDataPtr = boost::make_shared<BasicEntityData>(moab);
127  if (distributed_mesh)
128  basicEntityDataPtr->setDistributedMesh();
129  else
130  basicEntityDataPtr->unSetDistributedMesh();
131 
132  ierr = getOptions(verbose);
133  CHKERRABORT(cOmm, ierr);
134  ierr = initialiseDatabaseFromMesh(verbose);
135  CHKERRABORT(cOmm, ierr);
136 
137  // Print version
138  if (verbose > QUIET) {
139  char petsc_version[255];
140  ierr = PetscGetVersion(petsc_version, 255);
141  CHKERRABORT(cOmm, ierr);
142  ierr = PetscPrintf(cOmm, "MoFEM version %d.%d.%d (%s %s) \n",
143  MoFEM_VERSION_MAJOR, MoFEM_VERSION_MINOR,
144  MoFEM_VERSION_BUILD, MOAB_VERSION_STRING, petsc_version);
145  CHKERRABORT(cOmm, ierr);
146  ierr = PetscPrintf(cOmm, "git commit id %s\n", GIT_SHA1_NAME);
147  CHKERRABORT(cOmm, ierr);
148  }
149 }
MoFEMErrorCode clearMap()
Cleaning database.
Definition: Core.cpp:222
static const MOFEMuuid IDD_MOFEMCoreInterface
Definition: Interface.hpp:24
int sIze
MoFEM communicator size.
Definition: Core.hpp:867
MoFEMErrorCode initialiseDatabaseFromMesh(int verb=DEFAULT_VERBOSITY)
Initialize database getting information on mesh.
Definition: Core.cpp:548
PetscLogEvent MOFEM_EVENT_postProcess
Event for postProcess finite element.
Definition: Core.hpp:855
MPI_Comm cOmm
MoFEM communicator.
Definition: Core.hpp:864
PetscLogEvent MOFEM_EVENT_operator
Event for evaluating operator of finite element.
Definition: Core.hpp:853
static const MOFEMuuid IDD_MOFEMUnknown
PetscLogEvent MOFEM_EVENT_createMat
Definition: Core.hpp:856
MoFEMErrorCode registerSubInterfaces()
Register insterfaces.
Definition: Core.cpp:167
std::reference_wrapper< moab::Interface > moab
moab database
Definition: Core.hpp:265
PetscLogEvent MOFEM_EVENT_preProcess
Event for preProcess finite element.
Definition: Core.hpp:851
PetscBool initaliseAndBuildField
Definition: Core.hpp:904
static MoFEMErrorCodeGeneric< PetscErrorCode > ierr
Definition: Common.hpp:80
int rAnk
MOFEM communicator rank.
Definition: Core.hpp:868
MoFEMErrorCode getOptions(int verb=DEFAULT_VERBOSITY)
Get core options from command line.
Definition: Core.cpp:523
MoFEMErrorCode getTags(int verb=DEFAULT_VERBOSITY)
Get tag handles.
Definition: Core.cpp:271
static bool isGloballyInitialised
Core base globally initialized.
Definition: Core.hpp:900
PetscBool initaliseAndBuildFiniteElements
Definition: Core.hpp:907
boost::shared_ptr< BasicEntityData > basicEntityDataPtr
Definition: Core.hpp:225
#define MYPCOMM_INDEX
default communicator number PCOMM
Definition: definitions.h:324
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)
ParallelComm * pComm
MOAB communicator structure.
Definition: Core.hpp:865
int verbose
Verbosity level.
Definition: Core.hpp:888
static const MOFEMuuid IDD_MOFEMDeprecatedCoreInterface
Definition: Interface.hpp:26

◆ ~Core()

MoFEM::Core::~Core ( )

Definition at line 151 of file Core.cpp.

151  {
152  PetscBool is_finalized;
153  PetscFinalized(&is_finalized);
154  // Destroy interfaces
155  iFaces.clear();
156  // This is deprecated ONE should use MoFEM::Core::Initialize
157  if (isGloballyInitialised && is_finalized) {
158  isGloballyInitialised = false;
159  }
160  // Destroy communicator
161  if (!is_finalized) {
162  ierr = PetscCommDestroy(&cOmm);
163  CHKERRABORT(cOmm, ierr);
164  }
165 }
MPI_Comm cOmm
MoFEM communicator.
Definition: Core.hpp:864
static MoFEMErrorCodeGeneric< PetscErrorCode > ierr
Definition: Common.hpp:80
static bool isGloballyInitialised
Core base globally initialized.
Definition: Core.hpp:900
boost::ptr_map< unsigned long, UnknownInterface > iFaces
Hash map of pointers to interfaces.
Definition: Core.hpp:897

Member Function Documentation

◆ add_ents_to_field_by_dim() [1/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 289 of file FieldCore.cpp.

291  {
292  Range ents_dim = ents.subset_by_dimension(dim);
293  return addEntsToFieldByDim(ents_dim, dim, name, verb);
294 }
MoFEMErrorCode addEntsToFieldByDim(const Range &ents, const int dim, const std::string &name, int verb=DEFAULT_VERBOSITY)
Definition: FieldCore.cpp:210

◆ add_ents_to_field_by_dim() [2/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 meshsetcollective.

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 311 of file FieldCore.cpp.

314  {
316  Range ents;
317  rval = get_moab().get_entities_by_dimension(meshset, dim, ents, recursive);
319  ierr = addEntsToFieldByDim(ents, dim, name, verb);
320  CHKERRG(ierr);
322 }
#define CHKERRQ_MOAB(a)
check error code of MoAB function
Definition: definitions.h:536
moab::Interface & get_moab()
Definition: Core.hpp:266
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:522
#define CHKERRG(n)
Check error code of MoFEM/MOAB/PETSc function.
Definition: definitions.h:565
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:528
static MoFEMErrorCodeGeneric< PetscErrorCode > ierr
Definition: Common.hpp:80
static MoFEMErrorCodeGeneric< moab::ErrorCode > rval
Definition: Common.hpp:78
MoFEMErrorCode addEntsToFieldByDim(const Range &ents, const int dim, const std::string &name, int verb=DEFAULT_VERBOSITY)
Definition: FieldCore.cpp:210

◆ add_ents_to_field_by_type() [1/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 296 of file FieldCore.cpp.

299  {
300 
302  Range ents_type = ents.subset_by_type(type);
303  if (!ents_type.empty()) {
304  const int dim = get_moab().dimension_from_handle(ents_type[0]);
305  ierr = addEntsToFieldByDim(ents_type, dim, name, verb);
306  CHKERRG(ierr);
307  }
309 }
moab::Interface & get_moab()
Definition: Core.hpp:266
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:522
#define CHKERRG(n)
Check error code of MoFEM/MOAB/PETSc function.
Definition: definitions.h:565
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:528
static MoFEMErrorCodeGeneric< PetscErrorCode > ierr
Definition: Common.hpp:80
MoFEMErrorCode addEntsToFieldByDim(const Range &ents, const int dim, const std::string &name, int verb=DEFAULT_VERBOSITY)
Definition: FieldCore.cpp:210

◆ add_ents_to_field_by_type() [2/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 324 of file FieldCore.cpp.

327  {
329  Range ents;
330  rval = get_moab().get_entities_by_type(meshset, type, ents, recursive);
332  if (!ents.empty()) {
333  const int dim = get_moab().dimension_from_handle(ents[0]);
334  ierr = addEntsToFieldByDim(ents, dim, name, verb);
335  CHKERRG(ierr);
336  }
338 }
#define CHKERRQ_MOAB(a)
check error code of MoAB function
Definition: definitions.h:536
moab::Interface & get_moab()
Definition: Core.hpp:266
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:522
#define CHKERRG(n)
Check error code of MoFEM/MOAB/PETSc function.
Definition: definitions.h:565
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:528
static MoFEMErrorCodeGeneric< PetscErrorCode > ierr
Definition: Common.hpp:80
static MoFEMErrorCodeGeneric< moab::ErrorCode > rval
Definition: Common.hpp:78
MoFEMErrorCode addEntsToFieldByDim(const Range &ents, const int dim, const std::string &name, int verb=DEFAULT_VERBOSITY)
Definition: FieldCore.cpp:210

◆ 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 483 of file FECore.cpp.

485  {
487 
488  if (verb == -1)
489  verb = verbose;
490  *buildMoFEM &= 1 << 0;
491  const BitFEId id = getBitFEId(name);
493  typedef RefElement_multiIndex::index<EntType_mi_tag>::type refMoabFE_by_type;
494  refMoabFE_by_type &ref_MoFEMFiniteElement =
495  refinedFiniteElements.get<EntType_mi_tag>();
496  refMoabFE_by_type::iterator miit = ref_MoFEMFiniteElement.lower_bound(type);
497  refMoabFE_by_type::iterator hi_miit =
498  ref_MoFEMFiniteElement.upper_bound(type);
499  if (verb > 1) {
500  PetscSynchronizedPrintf(cOmm, "nb. ref elements in database %d\n",
501  distance(miit, hi_miit));
502  }
503  int nb_add_FEs = 0;
504  for (; miit != hi_miit; miit++) {
505  BitRefLevel bit2 = miit->get()->getBitRefLevel();
506  if ((bit2 & mask) != bit2)
507  continue;
508  if ((bit2 & bit).any()) {
509  EntityHandle ent = miit->get()->getRefEnt();
510  CHKERR get_moab().add_entities(idm, &ent, 1);
511  nb_add_FEs++;
512  }
513  }
514  if (verb > 0) {
515  std::ostringstream ss;
516  ss << "Add Nb. FEs " << nb_add_FEs << " form BitRef " << bit << std::endl;
517  PetscSynchronizedPrintf(cOmm, "%s", ss.str().c_str());
518  PetscSynchronizedFlush(cOmm, PETSC_STDOUT);
519  }
520 
522 }
EntityHandle get_finite_element_meshset(const BitFEId id) const
Definition: FECore.cpp:282
MPI_Comm cOmm
MoFEM communicator.
Definition: Core.hpp:864
moab::Interface & get_moab()
Definition: Core.hpp:266
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
std::bitset< BITFEID_SIZE > BitFEId
Definition: Common.hpp:150
BitFEId getBitFEId(const std::string &name) const
Get field Id.
Definition: FECore.cpp:260
std::bitset< BITREFLEVEL_SIZE > BitRefLevel
Bit structure attached to each entity identifying to what mesh entity is attached.
Definition: Common.hpp:147
int * buildMoFEM
keeps flags/semaphores for different stages
Definition: Core.hpp:899
RefElement_multiIndex refinedFiniteElements
refined elements
Definition: Core.hpp:245
#define CHKERR
Inline error check.
Definition: definitions.h:617
int verbose
Verbosity level.
Definition: Core.hpp:888
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443

◆ 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
namename of field
recursivetake entities from meshsets in meshset
Returns
error code

Implements MoFEM::CoreInterface.

Definition at line 364 of file FECore.cpp.

366  {
367  EntityHandle idm = no_handle;
368  *buildMoFEM &= 1 << 0;
371  Range ents;
372  CHKERR get_moab().get_entities_by_dimension(meshset, dim, ents, recursive);
373  CHKERR getInterface<BitRefManager>()->setElementsBitRefLevel(ents);
374  CHKERR get_moab().add_entities(idm, ents);
376 }
EntityHandle get_finite_element_meshset(const BitFEId id) const
Definition: FECore.cpp:282
moab::Interface & get_moab()
Definition: Core.hpp:266
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
const EntityHandle no_handle
Definition: Common.hpp:133
BitFEId getBitFEId(const std::string &name) const
Get field Id.
Definition: FECore.cpp:260
int * buildMoFEM
keeps flags/semaphores for different stages
Definition: Core.hpp:899
#define CHKERR
Inline error check.
Definition: definitions.h:617
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443

◆ 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 391 of file FECore.cpp.

392  {
393  EntityHandle idm = no_handle;
394  *buildMoFEM &= 1 << 0;
397  CHKERR getInterface<BitRefManager>()->setElementsBitRefLevel(
398  ents.subset_by_dimension(dim));
399  CHKERR get_moab().add_entities(idm, ents.subset_by_dimension(dim));
401 }
EntityHandle get_finite_element_meshset(const BitFEId id) const
Definition: FECore.cpp:282
moab::Interface & get_moab()
Definition: Core.hpp:266
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
const EntityHandle no_handle
Definition: Common.hpp:133
BitFEId getBitFEId(const std::string &name) const
Get field Id.
Definition: FECore.cpp:260
int * buildMoFEM
keeps flags/semaphores for different stages
Definition: Core.hpp:899
#define CHKERR
Inline error check.
Definition: definitions.h:617
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443

◆ add_ents_to_finite_element_by_EDGEs() [1/2]

MoFEMErrorCode MoFEM::Core::add_ents_to_finite_element_by_EDGEs ( const Range &  edge,
const std::string &  name 
)
protectedvirtual

add EDGES entities from range to finite element database given by name

Deprecated:
use add_ents_to_finite_element_by_type
Parameters
rangecontains tetrahedron
nameFinite Element name

Implements MoFEM::DeprecatedCoreInterface.

Definition at line 410 of file FECore.cpp.

411  {
413  CHKERR add_ents_to_finite_element_by_type(edges, MBEDGE, name);
415 }
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
#define CHKERR
Inline error check.
Definition: definitions.h:617
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
Definition: FECore.cpp:347
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443

◆ add_ents_to_finite_element_by_EDGEs() [2/2]

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

add EDGES finite elements

Deprecated:
use add_ents_to_finite_element_by_type
Parameters
meshset
namename of finite element
recursivetake entities from meshsets in meshset
Returns
error code

Implements MoFEM::DeprecatedCoreInterface.

Definition at line 403 of file FECore.cpp.

404  {
406  CHKERR add_ents_to_finite_element_by_type(meshset, MBEDGE, name, recursive);
408 }
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
#define CHKERR
Inline error check.
Definition: definitions.h:617
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
Definition: FECore.cpp:347
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443

◆ 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 524 of file FECore.cpp.

525  {
527  *buildMoFEM &= 1 << 0;
528  const BitFEId id = getBitFEId(name);
530  if (recursive == false) {
531  CHKERR get_moab().add_entities(idm, &meshset, 1);
532  } else {
533  Range meshsets;
534  CHKERR get_moab().get_entities_by_type(meshset, MBENTITYSET, meshsets, false);
535  CHKERR get_moab().add_entities(idm, meshsets);
536  }
538 }
EntityHandle get_finite_element_meshset(const BitFEId id) const
Definition: FECore.cpp:282
moab::Interface & get_moab()
Definition: Core.hpp:266
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
std::bitset< BITFEID_SIZE > BitFEId
Definition: Common.hpp:150
BitFEId getBitFEId(const std::string &name) const
Get field Id.
Definition: FECore.cpp:260
int * buildMoFEM
keeps flags/semaphores for different stages
Definition: Core.hpp:899
#define CHKERR
Inline error check.
Definition: definitions.h:617
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443

◆ add_ents_to_finite_element_by_PRISMs() [1/3]

DEPRECATED MoFEMErrorCode MoFEM::Core::add_ents_to_finite_element_by_PRISMs ( const Range &  prims,
const BitFEId  id 
)
protected

◆ add_ents_to_finite_element_by_PRISMs() [2/3]

MoFEMErrorCode MoFEM::Core::add_ents_to_finite_element_by_PRISMs ( const Range &  prims,
const std::string &  name 
)
protectedvirtual

add PRISM entities from meshset to finite element database given by name

Deprecated:
use add_ents_to_finite_element_by_type
Parameters
rangecontains tetrahedron
nameFinite Element name

Implements MoFEM::DeprecatedCoreInterface.

Definition at line 450 of file FECore.cpp.

451  {
453  CHKERR add_ents_to_finite_element_by_type(prims, MBPRISM, name);
455 }
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
#define CHKERR
Inline error check.
Definition: definitions.h:617
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
Definition: FECore.cpp:347
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443

◆ add_ents_to_finite_element_by_PRISMs() [3/3]

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

add TET entities from meshset to finite element database given by name

Deprecated:
use add_ents_to_finite_element_by_type
Parameters
meshsetcontains tetrahedron
nameFinite Element name
recursiveif true parent meshset is searched recursively

Implements MoFEM::DeprecatedCoreInterface.

Definition at line 456 of file FECore.cpp.

457  {
459  CHKERR add_ents_to_finite_element_by_type(meshset, MBPRISM, name, recursive);
461 }
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
#define CHKERR
Inline error check.
Definition: definitions.h:617
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
Definition: FECore.cpp:347
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443

◆ add_ents_to_finite_element_by_TETs() [1/2]

MoFEMErrorCode MoFEM::Core::add_ents_to_finite_element_by_TETs ( const Range &  tets,
const std::string &  name 
)
protectedvirtual

add TET entities from range to finite element database given by name

Deprecated:
use add_ents_to_finite_element_by_type
Parameters
rangecontains tetrahedron
nameFinite Element name

Implements MoFEM::DeprecatedCoreInterface.

Definition at line 437 of file FECore.cpp.

438  {
440  CHKERR add_ents_to_finite_element_by_type(tets, MBTET, name);
442 }
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
#define CHKERR
Inline error check.
Definition: definitions.h:617
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
Definition: FECore.cpp:347
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443

◆ add_ents_to_finite_element_by_TETs() [2/2]

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

add TET entities from meshset to finite element database given by name

Deprecated:
use add_ents_to_finite_element_by_type
Parameters
meshsetcontains tetrahedron
nameFinite Element name
recursiveif true parent meshset is searched recursively

Implements MoFEM::DeprecatedCoreInterface.

Definition at line 443 of file FECore.cpp.

444  {
446  CHKERR add_ents_to_finite_element_by_type(meshset, MBTET, name, recursive);
448 }
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
#define CHKERR
Inline error check.
Definition: definitions.h:617
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
Definition: FECore.cpp:347
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443

◆ add_ents_to_finite_element_by_TRIs() [1/2]

MoFEMErrorCode MoFEM::Core::add_ents_to_finite_element_by_TRIs ( const Range &  tris,
const std::string &  name 
)
protectedvirtual

add TRI entities from range to finite element database given by name

Deprecated:
use add_ents_to_finite_element_by_type
Parameters
rangecontains tetrahedron
nameFinite Element name

Implements MoFEM::DeprecatedCoreInterface.

Definition at line 424 of file FECore.cpp.

425  {
427  CHKERR add_ents_to_finite_element_by_type(tris, MBTRI, name);
429 }
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
#define CHKERR
Inline error check.
Definition: definitions.h:617
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
Definition: FECore.cpp:347
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443

◆ add_ents_to_finite_element_by_TRIs() [2/2]

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

add TRI entities from meshset to finite element database given by name

Deprecated:
use add_ents_to_finite_element_by_type
Parameters
rangecontains tetrahedron
nameFinite Element name
recursiveif true parent meshset is searched recursively

Implements MoFEM::DeprecatedCoreInterface.

Definition at line 430 of file FECore.cpp.

431  {
433  CHKERR add_ents_to_finite_element_by_type(meshset, MBTRI, name, recursive);
435 }
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
#define CHKERR
Inline error check.
Definition: definitions.h:617
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
Definition: FECore.cpp:347
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443

◆ 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
namename of field
recursivetake entities from meshsets in meshset
Returns
error code

Implements MoFEM::CoreInterface.

Definition at line 347 of file FECore.cpp.

349  {
350  *buildMoFEM &= 1 << 0;
351  EntityHandle idm = no_handle;
353 
355  Range ents;
356  CHKERR get_moab().get_entities_by_type(meshset, type, ents, recursive);
357  CHKERR getInterface<BitRefManager>()->setElementsBitRefLevel(ents);
358  CHKERR get_moab().add_entities(idm, ents);
359 
361 }
EntityHandle get_finite_element_meshset(const BitFEId id) const
Definition: FECore.cpp:282
moab::Interface & get_moab()
Definition: Core.hpp:266
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
const EntityHandle no_handle
Definition: Common.hpp:133
BitFEId getBitFEId(const std::string &name) const
Get field Id.
Definition: FECore.cpp:260
int * buildMoFEM
keeps flags/semaphores for different stages
Definition: Core.hpp:899
#define CHKERR
Inline error check.
Definition: definitions.h:617
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443

◆ 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 378 of file FECore.cpp.

379  {
380  EntityHandle idm = no_handle;
381  *buildMoFEM &= 1 << 0;
384  CHKERR getInterface<BitRefManager>()->setElementsBitRefLevel(
385  ents.subset_by_type(type));
386  CHKERR get_moab().add_entities(idm, ents.subset_by_type(type));
388 } // namespace MoFEM
EntityHandle get_finite_element_meshset(const BitFEId id) const
Definition: FECore.cpp:282
moab::Interface & get_moab()
Definition: Core.hpp:266
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
const EntityHandle no_handle
Definition: Common.hpp:133
BitFEId getBitFEId(const std::string &name) const
Get field Id.
Definition: FECore.cpp:260
int * buildMoFEM
keeps flags/semaphores for different stages
Definition: Core.hpp:899
#define CHKERR
Inline error check.
Definition: definitions.h:617
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443

◆ add_ents_to_finite_element_by_VERTICEs()

MoFEMErrorCode MoFEM::Core::add_ents_to_finite_element_by_VERTICEs ( const Range &  vert,
const std::string &  name 
)
protectedvirtual

add VERTICES entities from range to finite element database given by name

Deprecated:
use add_ents_to_finite_element_by_type
Parameters
rangecontains tetrahedron
nameFinite Element name

Implements MoFEM::DeprecatedCoreInterface.

Definition at line 417 of file FECore.cpp.

418  {
420  CHKERR add_ents_to_finite_element_by_type(vert, MBVERTEX, name);
422 }
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
#define CHKERR
Inline error check.
Definition: definitions.h:617
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
Definition: FECore.cpp:347
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443

◆ 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 std::string &  name,
EntityType  type,
int  verb = DEFAULT_VERBOSITY 
)
protectedvirtual

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

Deprecated:
use add_ents_to_finite_element_by_bit_ref with mask explicitly given
Parameters
BitRefLevelbit
finiteelement name
finiteelenent type
verrboselevel

Implements MoFEM::DeprecatedCoreInterface.

Definition at line 464 of file FECore.cpp.

466  {
469  type, verb);
470 
472 }
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
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:483
std::bitset< BITREFLEVEL_SIZE > BitRefLevel
Bit structure attached to each entity identifying to what mesh entity is attached.
Definition: Common.hpp:147
#define CHKERR
Inline error check.
Definition: definitions.h:617
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443

◆ 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 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

Deprecated:
use add_ents_to_finite_element_by_bit_ref with mask explicitly given
Parameters
BitRefLevelbit
BitRefLevelmask
finiteelement name
finiteelement type
verrboselevel

Implements MoFEM::DeprecatedCoreInterface.

Definition at line 474 of file FECore.cpp.

476  {
478  CHKERR add_ents_to_finite_element_by_bit_ref(bit, mask, name, type, verb);
479 
481 }
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
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:483
#define CHKERR
Inline error check.
Definition: definitions.h:617
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443

◆ 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 filed.

Parameters
nameField name
spaceSpace L2,H1,Hdiv,Hcurl
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 116 of file FieldCore.cpp.

120  {
122  if (verb == -1)
123  verb = verbose;
124  *buildMoFEM = 0;
125  Field_multiIndex::index<FieldName_mi_tag>::type::iterator fit;
126  fit = fIelds.get<FieldName_mi_tag>().find(name);
127  if (fit != fIelds.get<FieldName_mi_tag>().end()) {
128  if (bh == MF_EXCL) {
129  SETERRQ1(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
130  "field is <%s> in database", name.c_str());
131  }
132  } else {
133  EntityHandle meshset;
134  CHKERR get_moab().create_meshset(MESHSET_SET | MESHSET_TRACK_OWNER, meshset);
135  // id
136  BitFieldId id = getFieldShift();
137  CHKERR get_moab().tag_set_data(th_FieldId, &meshset, 1, &id);
138  // space
139  CHKERR get_moab().tag_set_data(th_FieldSpace, &meshset, 1, &space);
140  // base
141  CHKERR get_moab().tag_set_data(th_FieldBase, &meshset, 1, &base);
142  // name
143  void const *tag_data[] = {name.c_str()};
144  int tag_sizes[1];
145  tag_sizes[0] = name.size();
146  CHKERR get_moab().tag_set_by_ptr(th_FieldName, &meshset, 1, tag_data, tag_sizes);
147  // name data prefix
148  std::string name_data_prefix("_App_Data");
149  void const *tag_prefix_data[] = {name_data_prefix.c_str()};
150  int tag_prefix_sizes[1];
151  tag_prefix_sizes[0] = name_data_prefix.size();
152  CHKERR get_moab().tag_set_by_ptr(th_FieldName_DataNamePrefix, &meshset, 1,
153  tag_prefix_data, tag_prefix_sizes);
154  Tag th_AppOrder, th_FieldData, th_Rank;
155  // data
156  std::string Tag_data_name = name_data_prefix + name;
157  const int def_len = 0;
158  CHKERR get_moab().tag_get_handle(
159  Tag_data_name.c_str(), def_len, MB_TYPE_OPAQUE, th_FieldData,
160  MB_TAG_CREAT | MB_TAG_BYTES | MB_TAG_VARLEN | MB_TAG_SPARSE, NULL);
161  // order
162  ApproximationOrder def_ApproximationOrder = -1;
163  std::string Tag_ApproximationOrder_name = "_App_Order_" + name;
164  CHKERR get_moab().tag_get_handle(
165  Tag_ApproximationOrder_name.c_str(), sizeof(ApproximationOrder),
166  MB_TYPE_OPAQUE, th_AppOrder, MB_TAG_CREAT | MB_TAG_BYTES | tag_type,
167  &def_ApproximationOrder);
168  // rank
169  int def_rank = 1;
170  std::string Tag_rank_name = "_Field_Rank_" + name;
171  CHKERR get_moab().tag_get_handle(
172  Tag_rank_name.c_str(), sizeof(FieldCoefficientsNumber), MB_TYPE_OPAQUE,
173  th_Rank, MB_TAG_CREAT | MB_TAG_BYTES | tag_type, &def_rank);
174  CHKERR get_moab().tag_set_data(th_Rank, &meshset, 1, &nb_of_coefficients);
175  // add meshset
176  std::pair<Field_multiIndex::iterator, bool> p;
177  try {
178  CoordSystemsManager *cs_manger_ptr;
179  CHKERR getInterface(cs_manger_ptr);
180  boost::shared_ptr<CoordSys> undefined_cs_ptr;
181  CHKERR cs_manger_ptr->getCoordSysPtr("UNDEFINED", undefined_cs_ptr);
182  int sys_name_size[1];
183  sys_name_size[0] = undefined_cs_ptr->getName().size();
184  void const *sys_name[] = {&*undefined_cs_ptr->getNameRef().begin()};
185  CHKERR get_moab().tag_set_by_ptr(cs_manger_ptr->get_th_CoordSysName(), &meshset,
186  1, sys_name, sys_name_size);
187  EntityHandle coord_sys_id = undefined_cs_ptr->getMeshset();
188  CHKERR get_moab().add_entities(coord_sys_id, &meshset, 1);
189  p = fIelds.insert(
190  boost::make_shared<Field>(moab, meshset, undefined_cs_ptr));
191  if (bh == MF_EXCL) {
192  if (!p.second)
193  SETERRQ1(PETSC_COMM_SELF, MOFEM_NOT_FOUND,
194  "field not inserted %s (top tip, it could be already there)",
195  Field(moab, meshset, undefined_cs_ptr).getName().c_str());
196  }
197  } catch (MoFEMException const &e) {
198  SETERRQ(PETSC_COMM_SELF, e.errorCode, e.errorMessage);
199  }
200  if (verb > 0) {
201  std::ostringstream ss;
202  ss << "add: " << **p.first << std::endl;
203  PetscPrintf(cOmm, ss.str().c_str());
204  }
205  }
206  // unt
208 }
int FieldCoefficientsNumber
Number of field coefficients.
Definition: Common.hpp:132
Tag th_FieldSpace
Definition: Core.hpp:204
Tag th_FieldName_DataNamePrefix
Definition: Core.hpp:204
MPI_Comm cOmm
MoFEM communicator.
Definition: Core.hpp:864
moab::Interface & get_moab()
Definition: Core.hpp:266
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
IFACE getInterface() const
Get interface pointer to pointer of interface.
std::bitset< BITFIELDID_SIZE > BitFieldId
Definition: Common.hpp:149
Tag th_FieldId
Definition: Core.hpp:204
int * buildMoFEM
keeps flags/semaphores for different stages
Definition: Core.hpp:899
Tag th_FieldBase
Definition: Core.hpp:204
Tag th_FieldName
Definition: Core.hpp:204
#define CHKERR
Inline error check.
Definition: definitions.h:617
Field_multiIndex fIelds
fields
Definition: Core.hpp:247
int ApproximationOrder
Approximation on the entity.
Definition: Common.hpp:131
int verbose
Verbosity level.
Definition: Core.hpp:888
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443
BitFieldId getFieldShift()
Return unique field Id.
Definition: Core.cpp:200

◆ 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 45 of file FECore.cpp.

46  {
48  *buildMoFEM &= 1 << 0;
49  if(verb == -1) {
50  verb = verbose;
51  }
52  typedef FiniteElement_multiIndex::index<FiniteElement_name_mi_tag>::type
53  FiniteElements_by_name;
54  FiniteElements_by_name &finite_element_name_set =
55  finiteElements.get<FiniteElement_name_mi_tag>();
56  FiniteElements_by_name::iterator it_fe =
57  finite_element_name_set.find(fe_name);
58  if (bh == MF_EXCL) {
59  if (it_fe != finite_element_name_set.end()) {
60  SETERRQ1(cOmm, MOFEM_NOT_FOUND, "this < %s > is there", fe_name.c_str());
61  }
62  } else {
63  if (it_fe != finite_element_name_set.end())
65  }
66  EntityHandle meshset;
67  CHKERR get_moab().create_meshset(MESHSET_SET | MESHSET_TRACK_OWNER, meshset);
68 
69  // id
70  BitFEId id = getFEShift();
71  CHKERR get_moab().tag_set_data(th_FEId, &meshset, 1, &id);
72 
73  // id name
74  void const *tag_data[] = {fe_name.c_str()};
75  int tag_sizes[1];
76  tag_sizes[0] = fe_name.size();
77  CHKERR get_moab().tag_set_by_ptr(th_FEName, &meshset, 1, tag_data, tag_sizes);
78 
79  // add FiniteElement
80  std::pair<FiniteElement_multiIndex::iterator, bool> p = finiteElements.insert(
81  boost::shared_ptr<FiniteElement>(new FiniteElement(moab, meshset)));
82  if (!p.second)
83  SETERRQ(cOmm, MOFEM_OPERATION_UNSUCCESSFUL, "FiniteElement not inserted");
84  if (verb > 0) {
85  std::ostringstream ss;
86  ss << "add finite element: " << fe_name << std::endl;
87  PetscPrintf(cOmm, ss.str().c_str());
88  // list_finiteElements();
89  }
91 }
MPI_Comm cOmm
MoFEM communicator.
Definition: Core.hpp:864
moab::Interface & get_moab()
Definition: Core.hpp:266
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
std::bitset< BITFEID_SIZE > BitFEId
Definition: Common.hpp:150
Tag th_FEName
Definition: Core.hpp:206
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:528
BitFEId getFEShift()
Return unique finite element Id.
Definition: Core.cpp:212
int * buildMoFEM
keeps flags/semaphores for different stages
Definition: Core.hpp:899
FiniteElement_multiIndex finiteElements
finite elements
Definition: Core.hpp:251
#define CHKERR
Inline error check.
Definition: definitions.h:617
int verbose
Verbosity level.
Definition: Core.hpp:888
Tag th_FEId
Definition: Core.hpp:206
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443

◆ 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 55 of file ProblemsCore.cpp.

56  {
58  if (verb == -1)
59  verb = verbose;
60  auto miit = pRoblems.get<Problem_mi_tag>().find(name);
61  if (miit == pRoblems.get<Problem_mi_tag>().end()) {
63  CHKERR addProblem(id, name, verb);
64  } else if (bh == MF_EXCL) {
65  SETERRQ1(PETSC_COMM_SELF, MOFEM_NOT_FOUND, "problem is in database %s",
66  name.c_str());
67  }
69 }
std::bitset< BITPROBLEMID_SIZE > BitProblemId
Definition: Common.hpp:151
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
BitProblemId getProblemShift()
Return unique problem Id.
Definition: Core.cpp:217
MoFEMErrorCode addProblem(const BitProblemId id, const std::string &name, int verb=DEFAULT_VERBOSITY)
add problem
Problem_multiIndex pRoblems
problems multi-index
Definition: Core.hpp:257
#define CHKERR
Inline error check.
Definition: definitions.h:617
int verbose
Verbosity level.
Definition: Core.hpp:888
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443

◆ addEntsToFieldByDim()

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

Definition at line 210 of file FieldCore.cpp.

211  {
212 
213  *buildMoFEM = 0;
214  EntityHandle idm = no_handle;
215  if (verb == -1)
216  verb = verbose;
218  idm = get_field_meshset(name);
219  FieldSpace space;
220  CHKERR get_moab().tag_get_data(th_FieldSpace, &idm, 1, &space);
221  std::vector<int> nb_ents_on_dim(3, 0);
222  switch (space) {
223  case L2:
224  CHKERR get_moab().add_entities(idm, ents);
225  if (verb >= VERY_VERBOSE) {
226  std::ostringstream ss;
227  ss << "add entities to field " << name;
228  ss << " nb. add ents " << ents.size();
229  ss << std::endl;
230  PetscSynchronizedPrintf(cOmm, ss.str().c_str());
231  }
232  break;
233  case H1:
234  CHKERR get_moab().add_entities(idm, ents);
235  for (int dd = 0; dd != dim; ++dd) {
236  Range adj_ents;
237  CHKERR get_moab().get_adjacencies(ents, dd, false, adj_ents,
238  moab::Interface::UNION);
239  if (dd == 0) {
240  Range topo_nodes;
241  CHKERR get_moab().get_connectivity(ents, topo_nodes, true);
242  Range mid_nodes;
243  CHKERR get_moab().get_connectivity(ents, mid_nodes, false);
244  mid_nodes = subtract(mid_nodes, topo_nodes);
245  adj_ents = subtract(adj_ents, mid_nodes);
246  }
247  CHKERR get_moab().add_entities(idm, adj_ents);
248  nb_ents_on_dim[dd] = adj_ents.size();
249  }
250  break;
251  case HCURL:
252  CHKERR get_moab().add_entities(idm, ents);
253  for (int dd = 1; dd != dim; ++dd) {
254  Range adj_ents;
255  CHKERR get_moab().get_adjacencies(ents, dd, false, adj_ents,
256  moab::Interface::UNION);
257  CHKERR get_moab().add_entities(idm, adj_ents);
258  nb_ents_on_dim[dd] = adj_ents.size();
259  }
260  break;
261  case HDIV:
262  CHKERR get_moab().add_entities(idm, ents);
263  if (dim > 2) {
264  Range adj_ents;
265  CHKERR get_moab().get_adjacencies(ents, 2, false, adj_ents,
266  moab::Interface::UNION);
267  CHKERR get_moab().add_entities(idm, adj_ents);
268  nb_ents_on_dim[2] = adj_ents.size();
269  }
270  break;
271  default:
272  SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
273  "sorry, unknown space added to entity");
274  }
275  if (verb >= VERY_VERBOSE) {
276  std::ostringstream ss;
277  ss << "add entities to field " << name;
278  ss << " nb. add ents " << ents.size();
279  ss << " nb. add faces " << nb_ents_on_dim[2];
280  ss << " nb. add edges " << nb_ents_on_dim[1];
281  ss << " nb. add nodes " << nb_ents_on_dim[0];
282  ss << std::endl;
283  PetscSynchronizedPrintf(cOmm, ss.str().c_str());
284  PetscSynchronizedFlush(cOmm, PETSC_STDOUT);
285  }
287 }
Tag th_FieldSpace
Definition: Core.hpp:204
field with continuous normal traction
Definition: definitions.h:179
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
MPI_Comm cOmm
MoFEM communicator.
Definition: Core.hpp:864
moab::Interface & get_moab()
Definition: Core.hpp:266
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
const EntityHandle no_handle
Definition: Common.hpp:133
int * buildMoFEM
keeps flags/semaphores for different stages
Definition: Core.hpp:899
field with continuous tangents
Definition: definitions.h:178
FieldSpace
approximation spaces
Definition: definitions.h:174
#define CHKERR
Inline error check.
Definition: definitions.h:617
int verbose
Verbosity level.
Definition: Core.hpp:888
EntityHandle get_field_meshset(const BitFieldId id) const
Definition: FieldCore.cpp:37
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443
continuous field
Definition: definitions.h:177
field with C-1 continuity
Definition: definitions.h:180

◆ 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 242 of file Core.cpp.

242  {
244  if (verb == -1)
245  verb = verbose;
246  std::pair<RefEntity_multiIndex::iterator, bool> p_ent;
247  p_ent = refinedEntities.insert(
248  boost::make_shared<RefEntity>(basicEntityDataPtr, prism));
249  if (p_ent.second) {
250  std::pair<RefElement_multiIndex::iterator, bool> p;
251  p = refinedFiniteElements.insert(
252  boost::shared_ptr<RefElement>(new RefElement_PRISM(*p_ent.first)));
253  int num_nodes;
254  const EntityHandle *conn;
255  CHKERR get_moab().get_connectivity(prism, conn, num_nodes, true);
256  Range face_side3, face_side4;
257  CHKERR get_moab().get_adjacencies(conn, 3, 2, false, face_side3);
258  CHKERR get_moab().get_adjacencies(&conn[3], 3, 2, false, face_side4);
259  if (face_side3.size() != 1)
260  SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
261  "prism don't have side face 3");
262  if (face_side4.size() != 1)
263  SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
264  "prims don't have side face 4");
265  p.first->get()->getSideNumberPtr(*face_side3.begin());
266  p.first->get()->getSideNumberPtr(*face_side4.begin());
267  }
269 }
RefEntity_multiIndex refinedEntities
refined entities
Definition: Core.hpp:244
moab::Interface & get_moab()
Definition: Core.hpp:266
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
RefElement_multiIndex refinedFiniteElements
refined elements
Definition: Core.hpp:245
#define CHKERR
Inline error check.
Definition: definitions.h:617
boost::shared_ptr< BasicEntityData > basicEntityDataPtr
Definition: Core.hpp:225
int verbose
Verbosity level.
Definition: Core.hpp:888
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443

◆ addProblem()

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

add problem

Parameters
idproblem id
nameproblem name
verbverbosity level
Returns
MoFEMErrorCode

Definition at line 30 of file ProblemsCore.cpp.

31  {
33  if (verb == -1)
34  verb = verbose;
35  EntityHandle meshset;
36  CHKERR get_moab().create_meshset(MESHSET_SET | MESHSET_TRACK_OWNER, meshset);
37  CHKERR get_moab().tag_set_data(th_ProblemId, &meshset, 1, &id);
38  void const *tag_data[] = {name.c_str()};
39  int tag_sizes[1];
40  tag_sizes[0] = name.size();
41  CHKERR get_moab().tag_set_by_ptr(th_ProblemName, &meshset, 1, tag_data, tag_sizes);
42  // create entry
43  std::pair<Problem_multiIndex::iterator, bool> p =
44  pRoblems.insert(Problem(moab, meshset));
45  NOT_USED(p);
46  assert(p.second);
47  if (verb > 0) {
48  std::ostringstream ss;
49  ss << "add problem: " << name << std::endl;
50  PetscPrintf(cOmm, ss.str().c_str());
51  }
53 }
MPI_Comm cOmm
MoFEM communicator.
Definition: Core.hpp:864
moab::Interface & get_moab()
Definition: Core.hpp:266
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
Tag th_ProblemName
Definition: Core.hpp:208
Tag th_ProblemId
Definition: Core.hpp:208
Problem_multiIndex pRoblems
problems multi-index
Definition: Core.hpp:257
#define CHKERR
Inline error check.
Definition: definitions.h:617
int verbose
Verbosity level.
Definition: Core.hpp:888
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443
#define NOT_USED(x)
Definition: definitions.h:339

◆ build_adjacencies() [1/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 860 of file FECore.cpp.

860  {
862  if (verb == -1)
863  verb = verbose;
864  if (!((*buildMoFEM) & BUILD_FIELD))
865  SETERRQ(cOmm, MOFEM_NOT_FOUND, "field not build");
866  if (!((*buildMoFEM) & BUILD_FE))
867  SETERRQ(cOmm, MOFEM_NOT_FOUND, "fe not build");
868  for (Range::const_pair_iterator peit = ents.pair_begin();
869  peit != ents.pair_end();++peit) {
870  EntFiniteElement_multiIndex::index<Ent_mi_tag>::type::iterator fit, hi_fit;
871  fit = entsFiniteElements.get<Ent_mi_tag>().lower_bound(peit->first);
872  hi_fit = entsFiniteElements.get<Ent_mi_tag>().upper_bound(peit->second);
873  for (; fit != hi_fit; ++fit) {
874  if ((*fit)->getBitFieldIdRow().none() &&
875  (*fit)->getBitFieldIdCol().none() &&
876  (*fit)->getBitFieldIdData().none())
877  continue;
878  int by = BYROW;
879  if ((*fit)->getBitFieldIdRow() != (*fit)->getBitFieldIdCol())
880  by |= BYCOL;
881  if ((*fit)->getBitFieldIdRow() != (*fit)->getBitFieldIdData())
882  by |= BYDATA;
883  FieldEntityEntFiniteElementAdjacencyMap_change_ByWhat modify_row(by);
884  UId ent_uid = UId(0);
885  for (DofEntity_multiIndex_uid_view::iterator rvit =
886  (*fit)->row_dof_view->begin();
887  rvit != (*fit)->row_dof_view->end(); ++rvit) {
888  if (ent_uid == (*rvit)->getFieldEntityPtr()->getGlobalUniqueId())
889  continue;
890  ent_uid = (*rvit)->getFieldEntityPtr()->getGlobalUniqueId();
891  std::pair<FieldEntityEntFiniteElementAdjacencyMap_multiIndex::iterator,
892  bool>
893  p;
894  p = entFEAdjacencies.insert(FieldEntityEntFiniteElementAdjacencyMap(
895  (*rvit)->getFieldEntityPtr(), *fit));
896  bool success = entFEAdjacencies.modify(p.first, modify_row);
897  if (!success)
899  "modification unsuccessful");
900  }
901  if ((*fit)->getBitFieldIdRow() != (*fit)->getBitFieldIdCol()) {
902  int by = BYCOL;
903  if ((*fit)->getBitFieldIdCol() != (*fit)->getBitFieldIdData())
904  by |= BYDATA;
905  FieldEntityEntFiniteElementAdjacencyMap_change_ByWhat modify_col(by);
906  ent_uid = UId(0);
907  for (DofEntity_multiIndex_uid_view::iterator cvit =
908  (*fit)->col_dof_view->begin();
909  cvit != (*fit)->col_dof_view->end(); cvit++) {
910  if (ent_uid == (*cvit)->getFieldEntityPtr()->getGlobalUniqueId())
911  continue;
912  ent_uid = (*cvit)->getFieldEntityPtr()->getGlobalUniqueId();
913  std::pair<
914  FieldEntityEntFiniteElementAdjacencyMap_multiIndex::iterator,
915  bool>
916  p;
917  p = entFEAdjacencies.insert(FieldEntityEntFiniteElementAdjacencyMap(
918  (*cvit)->getFieldEntityPtr(), *fit));
919  bool success = entFEAdjacencies.modify(p.first, modify_col);
920  if (!success)
922  "modification unsuccessful");
923  }
924  }
925  if ((*fit)->getBitFieldIdRow() != (*fit)->getBitFieldIdData() ||
926  (*fit)->getBitFieldIdCol() != (*fit)->getBitFieldIdData()) {
927  FieldEntityEntFiniteElementAdjacencyMap_change_ByWhat modify_data(
928  BYDATA);
929  ent_uid = UId(0);
930  for (FEDofEntity_multiIndex::iterator dvit = (*fit)->data_dofs->begin();
931  dvit != (*fit)->data_dofs->end(); dvit++) {
932  if (ent_uid == (*dvit)->getFieldEntityPtr()->getGlobalUniqueId())
933  continue;
934  ent_uid = (*dvit)->getFieldEntityPtr()->getGlobalUniqueId();
935  std::pair<
936  FieldEntityEntFiniteElementAdjacencyMap_multiIndex::iterator,
937  bool>
938  p;
939  p = entFEAdjacencies.insert(FieldEntityEntFiniteElementAdjacencyMap(
940  (*dvit)->getFieldEntityPtr(), *fit));
941  bool success = entFEAdjacencies.modify(p.first, modify_data);
942  if (!success)
944  "modification unsuccessful");
945  }
946  }
947  }
948  }
949  if (verb >= VERY_NOISY) {
951  }
952  if (verb >= VERBOSE) {
953  PetscSynchronizedPrintf(cOmm, "Nb. entFEAdjacencies %u\n",
954  entFEAdjacencies.size());
955  PetscSynchronizedFlush(cOmm, PETSC_STDOUT);
956  }
957  *buildMoFEM |= 1 << 2;
959 }
MPI_Comm cOmm
MoFEM communicator.
Definition: Core.hpp:864
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:522
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:528
uint128_t UId
Unique Id.
Definition: Common.hpp:136
int * buildMoFEM
keeps flags/semaphores for different stages
Definition: Core.hpp:899
FieldEntityEntFiniteElementAdjacencyMap_multiIndex entFEAdjacencies
adjacencies of elements to dofs
Definition: Core.hpp:255
int verbose
Verbosity level.
Definition: Core.hpp:888
EntFiniteElement_multiIndex entsFiniteElements
finite element entities
Definition: Core.hpp:252
MoFEMErrorCode list_adjacencies() const
list adjacencies
Definition: FieldCore.cpp:1006

◆ 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 973 of file FECore.cpp.

973  {
975  if (verb == -1)
976  verb = verbose;
977  CHKERR build_adjacencies(bit, BitRefLevel().set(), verb);
978 
980 }
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
MoFEMErrorCode build_adjacencies(const Range &ents, int verb=DEFAULT_VERBOSITY)
build adjacencies
Definition: FECore.cpp:860
std::bitset< BITREFLEVEL_SIZE > BitRefLevel
Bit structure attached to each entity identifying to what mesh entity is attached.
Definition: Common.hpp:147
#define CHKERR
Inline error check.
Definition: definitions.h:617
int verbose
Verbosity level.
Definition: Core.hpp:888
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443

◆ build_adjacencies() [3/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 961 of file FECore.cpp.

962  {
964  if (verb == -1)
965  verb = verbose;
966  Range ents;
967  CHKERR BitRefManager(*this).getEntitiesByRefLevel(bit, mask, ents);
968 
969  CHKERR build_adjacencies(ents, verb);
970 
972 }
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
MoFEMErrorCode build_adjacencies(const Range &ents, int verb=DEFAULT_VERBOSITY)
build adjacencies
Definition: FECore.cpp:860
#define CHKERR
Inline error check.
Definition: definitions.h:617
int verbose
Verbosity level.
Definition: Core.hpp:888
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443

◆ 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 948 of file FieldCore.cpp.

948  {
950  auto miit = fIelds.get<FieldName_mi_tag>().find(field_name);
951  if(miit == fIelds.get<FieldName_mi_tag>().end()) {
952  SETERRQ1(PETSC_COMM_SELF, MOFEM_NOT_FOUND, "Field < %s > not found",
953  field_name.c_str());
954  }
955  CHKERR buildField((*miit), verb);
956  PetscSynchronizedFlush(cOmm, PETSC_STDOUT);
958 }
MPI_Comm cOmm
MoFEM communicator.
Definition: Core.hpp:864
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
#define CHKERR
Inline error check.
Definition: definitions.h:617
Field_multiIndex fIelds
fields
Definition: Core.hpp:247
MoFEMErrorCode buildField(const boost::shared_ptr< Field > &field, int verb=DEFAULT_VERBOSITY)
Definition: FieldCore.cpp:866
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443

◆ build_fields()

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

build fields

Implements MoFEM::CoreInterface.

Definition at line 959 of file FieldCore.cpp.

959  {
961  if (verb == -1)
962  verb = verbose;
963  typedef Field_multiIndex::index<BitFieldId_mi_tag>::type FieldSetById;
964  FieldSetById &set_id = fIelds.get<BitFieldId_mi_tag>();
965  FieldSetById::iterator miit = set_id.begin();
966  for (; miit != set_id.end(); miit++) {
967  CHKERR buildField((*miit), verb);
968  }
969  *buildMoFEM = 1 << 0;
970  if (verb > QUIET) {
971  PetscSynchronizedPrintf(cOmm, "Nb. dofs %u\n", dofsField.size());
972  }
973  PetscSynchronizedFlush(cOmm, PETSC_STDOUT);
975  // return 0;
976 }
DofEntity_multiIndex dofsField
dofs on fields
Definition: Core.hpp:249
MPI_Comm cOmm
MoFEM communicator.
Definition: Core.hpp:864
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
int * buildMoFEM
keeps flags/semaphores for different stages
Definition: Core.hpp:899
#define CHKERR
Inline error check.
Definition: definitions.h:617
Field_multiIndex fIelds
fields
Definition: Core.hpp:247
MoFEMErrorCode buildField(const boost::shared_ptr< Field > &field, int verb=DEFAULT_VERBOSITY)
Definition: FieldCore.cpp:866
int verbose
Verbosity level.
Definition: Core.hpp:888
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443

◆ build_finite_elements() [1/3]

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

Build finite elementsBuild 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 777 of file FECore.cpp.

777  {
779  if (verb == -1)
780  verb = verbose;
781 
782  FiniteElement_multiIndex::iterator fe_miit = finiteElements.begin();
783 
784  // loop Finite Elements
785  for (; fe_miit != finiteElements.end(); fe_miit++) {
786  if (verb > 0)
787  PetscPrintf(cOmm, "Build Finite Elements %s\n",
788  (*fe_miit)->getName().c_str());
789  CHKERR buildFiniteElements(*fe_miit, NULL, verb);
790  }
791 
792  if (verb > 0) {
793  PetscSynchronizedPrintf(cOmm, "Nb. FEs %u\n", entsFiniteElements.size());
794  PetscSynchronizedFlush(cOmm, PETSC_STDOUT);
795  typedef EntFiniteElement_multiIndex::index<BitFEId_mi_tag>::type
796  FiniteElementById;
797  FiniteElementById &finite_elements_by_id =
798  entsFiniteElements.get<BitFEId_mi_tag>();
799  FiniteElement_multiIndex::iterator fe_id_it = finiteElements.begin();
800  for (; fe_id_it != finiteElements.end(); fe_id_it++) {
801  FiniteElementById::iterator miit =
802  finite_elements_by_id.lower_bound((*fe_id_it)->getId());
803  FiniteElementById::iterator hi_miit =
804  finite_elements_by_id.upper_bound((*fe_id_it)->getId());
805  int count = distance(miit, hi_miit);
806  std::ostringstream ss;
807  ss << *(*fe_id_it) << " Nb. FEs " << count << std::endl;
808  PetscSynchronizedPrintf(cOmm, ss.str().c_str());
809  PetscSynchronizedFlush(cOmm, PETSC_STDOUT);
810  }
811  }
812 
813  *buildMoFEM |= 1 << 1;
815 }
MPI_Comm cOmm
MoFEM communicator.
Definition: Core.hpp:864
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:522
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:528
int * buildMoFEM
keeps flags/semaphores for different stages
Definition: Core.hpp:899
FiniteElement_multiIndex finiteElements
finite elements
Definition: Core.hpp:251
#define CHKERR
Inline error check.
Definition: definitions.h:617
int verbose
Verbosity level.
Definition: Core.hpp:888
MoFEMErrorCode buildFiniteElements(const boost::shared_ptr< FiniteElement > &fe, const Range *ents_ptr=NULL, int verb=DEFAULT_VERBOSITY)
Definition: FECore.cpp:541
EntFiniteElement_multiIndex entsFiniteElements
finite element entities
Definition: Core.hpp:252

◆ build_finite_elements() [2/3]

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

Definition at line 817 of file FECore.cpp.

817  {
819  SETERRQ(cOmm, MOFEM_NOT_IMPLEMENTED, "Not yet implemented");
821 }
MPI_Comm cOmm
MoFEM communicator.
Definition: Core.hpp:864
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:522
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:528

◆ build_finite_elements() [3/3]

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

Build finite elementsBuild 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 823 of file FECore.cpp.

824  {
826  if (verb == -1)
827  verb = verbose;
828 
829  FiniteElement_multiIndex::index<FiniteElement_name_mi_tag>::type::iterator
830  fe_miit = finiteElements.get<FiniteElement_name_mi_tag>().find(fe_name);
831  if (fe_miit == finiteElements.get<FiniteElement_name_mi_tag>().end()) {
832  SETERRQ1(cOmm, MOFEM_NOT_FOUND, "Finite element <%s> not found",
833  fe_name.c_str());
834  }
835 
836  if (verb >= VERBOSE)
837  PetscPrintf(cOmm, "Build Finite Elements %s\n", fe_name.c_str());
838  CHKERR buildFiniteElements(*fe_miit, ents_ptr, verb);
839 
840  if (verb >= VERBOSE) {
841  typedef EntFiniteElement_multiIndex::index<BitFEId_mi_tag>::type
842  FiniteElementById;
843  FiniteElementById &finite_elements_by_id =
844  entsFiniteElements.get<BitFEId_mi_tag>();
845  FiniteElementById::iterator miit =
846  finite_elements_by_id.lower_bound((*fe_miit)->getId());
847  FiniteElementById::iterator hi_miit =
848  finite_elements_by_id.upper_bound((*fe_miit)->getId());
849  int count = distance(miit, hi_miit);
850  std::ostringstream ss;
851  ss << *(*fe_miit) << " Nb. FEs " << count << std::endl;
852  PetscSynchronizedPrintf(cOmm, ss.str().c_str());
853  PetscSynchronizedFlush(cOmm, PETSC_STDOUT);
854  }
855 
856  *buildMoFEM |= 1 << 1;
858 }
MPI_Comm cOmm
MoFEM communicator.
Definition: Core.hpp:864
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:522
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:528
int * buildMoFEM
keeps flags/semaphores for different stages
Definition: Core.hpp:899
FiniteElement_multiIndex finiteElements
finite elements
Definition: Core.hpp:251
#define CHKERR
Inline error check.
Definition: definitions.h:617
int verbose
Verbosity level.
Definition: Core.hpp:888
MoFEMErrorCode buildFiniteElements(const boost::shared_ptr< FiniteElement > &fe, const Range *ents_ptr=NULL, int verb=DEFAULT_VERBOSITY)
Definition: FECore.cpp:541
EntFiniteElement_multiIndex entsFiniteElements
finite element entities
Definition: Core.hpp:252

◆ build_problem_on_distributed_mesh()

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

build problem data structures, assuming that mesh is distributed (collective)

Deprecated:
Use ProblemsManager to build and partition problems

Mesh is distributed, that means that each processor keeps only own part of the mesh and shared entities.

Collective - need to be run on all processors in communicator, i.e. each function has to call this function.

Implements MoFEM::DeprecatedCoreInterface.

Definition at line 230 of file ProblemsCore.cpp.

230  {
232  if (verb == -1)
233  verb = verbose;
234  DofEntity_multiIndex_active_view dofs_rows, dofs_cols;
235  Problem_multiIndex::iterator p_miit = pRoblems.begin();
236  for (; p_miit != pRoblems.end(); p_miit++) {
237  ierr = getInterface<ProblemsManager>()->buildProblemOnDistributedMesh(
238  const_cast<Problem *>(&*p_miit), verb);
239  CHKERRG(ierr);
240  }
242 }
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:522
#define CHKERRG(n)
Check error code of MoFEM/MOAB/PETSc function.
Definition: definitions.h:565
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:528
static MoFEMErrorCodeGeneric< PetscErrorCode > ierr
Definition: Common.hpp:80
Problem_multiIndex pRoblems
problems multi-index
Definition: Core.hpp:257
int verbose
Verbosity level.
Definition: Core.hpp:888
multi_index_container< boost::shared_ptr< DofEntity >, indexed_by< ordered_unique< const_mem_fun< DofEntity, UId, &DofEntity::getGlobalUniqueId > >, ordered_non_unique< const_mem_fun< DofEntity, char, &DofEntity::getActive > > > > DofEntity_multiIndex_active_view
multi-index view on DofEntity activity

◆ build_problems()

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

build problem data structures

Deprecated:
Use MoFEM::Interface::build_problem(const std::string &name,const bool square_matrix,int verb = -1) instead. This function not allows to Control if problem is structurally symmetric.

Implements MoFEM::DeprecatedCoreInterface.

Definition at line 292 of file ProblemsCore.cpp.

292  {
294  if (verb == -1)
295  verb = verbose;
296  if (!((*buildMoFEM) & BUILD_FIELD))
297  SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY, "fields not build");
298  if (!((*buildMoFEM) & BUILD_FE))
299  SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY, "FEs not build");
300  if (!((*buildMoFEM) & BUILD_ADJ))
301  SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY, "adjacencies not build");
302  // iterate problems
303  Problem_multiIndex::iterator p_miit = pRoblems.begin();
304  for (; p_miit != pRoblems.end(); p_miit++) {
305  Problem *problem_ptr = const_cast<Problem *>(&*p_miit);
306  ierr = build_problem(problem_ptr, false, verb);
307  CHKERRG(ierr);
308  }
311 }
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:522
#define CHKERRG(n)
Check error code of MoFEM/MOAB/PETSc function.
Definition: definitions.h:565
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:528
static MoFEMErrorCodeGeneric< PetscErrorCode > ierr
Definition: Common.hpp:80
int * buildMoFEM
keeps flags/semaphores for different stages
Definition: Core.hpp:899
DEPRECATED MoFEMErrorCode build_problem(const std::string &name, const bool square_matrix, int verb=-1)
build problem data structures
Problem_multiIndex pRoblems
problems multi-index
Definition: Core.hpp:257
int verbose
Verbosity level.
Definition: Core.hpp:888

◆ buildField()

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

Definition at line 866 of file FieldCore.cpp.

867  {
869  if (verb == -1)
870  verb = verbose;
871  if (verb > QUIET) {
872  PetscSynchronizedPrintf(cOmm, "Build Field %s (rank %d)\n",
873  field->getName().c_str(), rAnk);
874  }
875  std::map<EntityType, int> dof_counter;
876  std::map<EntityType, int> inactive_dof_counter;
877 
878  switch (field->getSpace()) {
879  case NOFIELD:
880  CHKERR buildFieldForNoField(field->getId(), dof_counter, verb);
881  break;
882  case L2:
883  case H1:
884  case HCURL:
885  case HDIV:
886  CHKERR buildFieldForL2H1HcurlHdiv(field->getId(), dof_counter,
887  inactive_dof_counter, verb);
888  break;
889  default:
890  SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_IMPLEMENTED, "not implemented");
891  }
892 
893  if (verb > QUIET) {
894  int nb_added_dofs = 0;
895  int nb_inactive_added_dofs = 0;
896  for (std::map<EntityType, int>::iterator it = dof_counter.begin();
897  it != dof_counter.end(); it++) {
898  switch (it->first) {
899  case MBVERTEX:
900  PetscSynchronizedPrintf(cOmm,
901  "nb added dofs (vertices) %d (inactive %d)\n",
902  it->second, inactive_dof_counter[it->first]);
903  break;
904  case MBEDGE:
905  PetscSynchronizedPrintf(cOmm,
906  "nb added dofs (edges) %d (inactive %d)\n",
907  it->second, inactive_dof_counter[it->first]);
908  break;
909  case MBTRI:
910  PetscSynchronizedPrintf(cOmm,
911  "nb added dofs (triangles) %d (inactive %d)\n",
912  it->second, inactive_dof_counter[it->first]);
913  break;
914  case MBQUAD:
915  PetscSynchronizedPrintf(cOmm,
916  "nb added dofs (quads) %d (inactive %d)\n",
917  it->second, inactive_dof_counter[it->first]);
918  break;
919  case MBTET:
920  PetscSynchronizedPrintf(cOmm, "nb added dofs (tets) %d (inactive %d)\n",
921  it->second, inactive_dof_counter[it->first]);
922  break;
923  case MBPRISM:
924  PetscSynchronizedPrintf(cOmm,
925  "nb added dofs (prisms) %d (inactive %d)\n",
926  it->second, inactive_dof_counter[it->first]);
927  break;
928  case MBENTITYSET:
929  PetscSynchronizedPrintf(cOmm,
930  "nb added dofs (meshsets) %d (inactive %d)\n",
931  it->second, inactive_dof_counter[it->first]);
932  break;
933  default:
934  SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_IMPLEMENTED, "not implemented");
935  }
936  nb_added_dofs += it->second;
937  nb_inactive_added_dofs += inactive_dof_counter[it->first];
938  }
939  if (verb > QUIET) {
940  PetscSynchronizedPrintf(cOmm,
941  "nb added dofs %d (number of inactive dofs %d)\n",
942  nb_added_dofs, nb_inactive_added_dofs);
943  }
944  }
946 }
field with continuous normal traction
Definition: definitions.h:179
MPI_Comm cOmm
MoFEM communicator.
Definition: Core.hpp:864
scalar or vector of scalars describe (no true field)
Definition: definitions.h:176
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
int rAnk
MOFEM communicator rank.
Definition: Core.hpp:868
field with continuous tangents
Definition: definitions.h:178
#define CHKERR
Inline error check.
Definition: definitions.h:617
MoFEMErrorCode buildFieldForL2H1HcurlHdiv(const BitFieldId id, std::map< EntityType, int > &dof_counter, std::map< EntityType, int > &inactive_dof_counter, int verb=DEFAULT_VERBOSITY)
Definition: FieldCore.cpp:749
int verbose
Verbosity level.
Definition: Core.hpp:888
MoFEMErrorCode buildFieldForNoField(const BitFieldId id, std::map< EntityType, int > &dof_counter, int verb=DEFAULT_VERBOSITY)
Definition: FieldCore.cpp:654
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443
continuous field
Definition: definitions.h:177
field with C-1 continuity
Definition: definitions.h:180

◆ 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 749 of file FieldCore.cpp.

751  {
753  if (verb == -1)
754  verb = verbose;
755 
756  // Field by ID
757  typedef Field_multiIndex::index<BitFieldId_mi_tag>::type FieldSetById;
758 
759  // Find field
760  const FieldSetById &set_id = fIelds.get<BitFieldId_mi_tag>();
761  FieldSetById::iterator field_it = set_id.find(id);
762  if (field_it == set_id.end()) {
763  SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_FOUND, "Field not found");
764  }
765  const int rank = field_it->get()->getNbOfCoeffs();
766  const boost::string_ref &field_name = field_it->get()->getNameRef();
767 
768  // Ents in the field meshset
769  Range ents_of_id_meshset;
770  CHKERR get_moab().get_entities_by_handle((*field_it)->meshSet, ents_of_id_meshset,
771  false);
772  if (verb > VERY_NOISY) {
773  PetscSynchronizedPrintf(PETSC_COMM_SELF, "Ents in field %s meshset %d\n",
774  (*field_it)->getName().c_str(),
775  ents_of_id_meshset.size());
776  }
777 
778  for (Range::pair_iterator p_eit = ents_of_id_meshset.pair_begin();
779  p_eit != ents_of_id_meshset.pair_end(); ++p_eit) {
780 
781  const EntityHandle first = p_eit->first;
782  const EntityHandle second = p_eit->second;
783 
784  typedef FieldEntity_multiIndex::index<Composite_Name_And_Ent_mi_tag>::type
785  FieldEntByNameAndEnt;
786  FieldEntByNameAndEnt::iterator feit, hi_feit;
787  feit = entsFields.get<Composite_Name_And_Ent_mi_tag>().lower_bound(
788  boost::make_tuple(field_name, first));
789  if (feit == entsFields.get<Composite_Name_And_Ent_mi_tag>().end())
790  continue;
791  hi_feit = entsFields.get<Composite_Name_And_Ent_mi_tag>().upper_bound(
792  boost::make_tuple(field_name, second));
793 
794  // If there are DOFs in that range is more pragmatic to remove them rather
795  // than to find sub-ranges or make them inactive
796  typedef DofEntity_multiIndex::index<Composite_Name_And_Ent_mi_tag>::type
797  DofByNameEnt;
798  DofByNameEnt::iterator dit, hi_dit;
799  dit = dofsField.get<Composite_Name_And_Ent_mi_tag>().lower_bound(
800  boost::make_tuple(field_name, first));
801  hi_dit = dofsField.get<Composite_Name_And_Ent_mi_tag>().upper_bound(
802  boost::make_tuple(field_name, second));
803  dofsField.get<Composite_Name_And_Ent_mi_tag>().erase(dit,hi_dit);
804 
805  // Add vertices DOFs by bulk
806  boost::shared_ptr<std::vector<DofEntity> > dofs_array =
807  boost::make_shared<std::vector<DofEntity> >(std::vector<DofEntity>());
808  // Add Sequence of DOFs to sequence container as weak_ptr
809  std::vector<boost::shared_ptr<DofEntity> > dofs_shared_array;
810  int nb_dofs_on_ents = 0;
811  for (FieldEntByNameAndEnt::iterator tmp_feit = feit; tmp_feit != hi_feit;
812  ++tmp_feit) {
813  nb_dofs_on_ents += rank * tmp_feit->get()->getOrderNbDofs(
814  tmp_feit->get()->getMaxOrder());
815  }
816  // Add Sequence of DOFs to sequence container as weak_ptr
817  dofs_array->reserve(nb_dofs_on_ents);
818  dofs_shared_array.reserve(dofs_array->size());
819  for (; feit != hi_feit; ++feit) {
820  // Create dofs instances and shared pointers
821  int DD = 0;
822  // Loop orders (loop until max entity order is set)
823  for (int oo = 0; oo <= feit->get()->getMaxOrder(); ++oo) {
824  // Loop nb. dofs at order oo
825  for (int dd = 0; dd < feit->get()->getOrderNbDofsDiff(oo); ++dd) {
826  // Loop rank
827  for (int rr = 0; rr < rank; ++rr, ++DD) {
828  dofs_array->emplace_back(*feit, oo, rr, DD, true);
829  dofs_shared_array.push_back(
830  boost::shared_ptr<DofEntity>(dofs_array, &dofs_array->back()));
831  ++dof_counter[feit->get()->getEntType()];
832  }
833  }
834  }
835  if (DD > feit->get()->getNbDofsOnEnt()) {
836  std::ostringstream ss;
837  ss << "rank " << rAnk << " ";
838  ss << **feit << std::endl;
839  SETERRQ3(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
840  "Expected number of DOFs on entity not equal to number added "
841  "to database (DD = %d != %d = "
842  "feit->get()->getNbDofsOnEnt())\n"
843  "%s",
844  DD, feit->get()->getNbDofsOnEnt(), ss.str().c_str());
845  }
846  }
847  // Insert into Multi-Index container
848  int dofs_field_size0 = dofsField.size();
849  dofsField.insert(dofs_shared_array.begin(), dofs_shared_array.end());
850  field_it->get()->getDofSequenceContainer()->push_back(dofs_array);
851  if (static_cast<int>(dofs_array.use_count()) != static_cast<int>(2 * dofs_shared_array.size() + 1)) {
852  SETERRQ2(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
853  "Wrong use count %d != %d", dofs_array.use_count(),
854  2 * dofs_shared_array.size() + 1);
855  }
856  if (dofs_field_size0 + dofs_shared_array.size() != dofsField.size()) {
857  SETERRQ2(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
858  "Wrong number of inserted DOFs %d != %d",
859  dofs_shared_array.size(), dofsField.size() - dofs_field_size0);
860  }
861 
862  }
864 }
DofEntity_multiIndex dofsField
dofs on fields
Definition: Core.hpp:249
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
FieldEntity_multiIndex entsFields
entities on fields
Definition: Core.hpp:248
moab::Interface & get_moab()
Definition: Core.hpp:266
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
int rAnk
MOFEM communicator rank.
Definition: Core.hpp:868
#define CHKERR
Inline error check.
Definition: definitions.h:617
Field_multiIndex fIelds
fields
Definition: Core.hpp:247
int verbose
Verbosity level.
Definition: Core.hpp:888
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443

◆ buildFieldForNoField()

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

Definition at line 654 of file FieldCore.cpp.

655  {
657  if (verb == -1)
658  verb = verbose;
659  // field it
660  typedef Field_multiIndex::index<BitFieldId_mi_tag>::type FieldSetById;
661  const FieldSetById &set_id = fIelds.get<BitFieldId_mi_tag>();
662  // find fiels
663  FieldSetById::iterator miit = set_id.find(id);
664  if (miit == set_id.end()) {
665  SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_FOUND, "field not found");
666  }
667 
668  // ents in the field meshset
669  Range ents_of_id_meshset;
670  rval =
671  get_moab().get_entities_by_handle((*miit)->meshSet, ents_of_id_meshset, false);
673  if (verb > 5) {
674  PetscSynchronizedPrintf(cOmm, "ents in field %s meshset %d\n",
675  (*miit)->getName().c_str(),
676  ents_of_id_meshset.size());
677  }
678  for (Range::iterator eit = ents_of_id_meshset.begin();
679  eit != ents_of_id_meshset.end(); eit++) {
680  // serch if field meshset is in database
681  RefEntity_multiIndex::index<Ent_mi_tag>::type::iterator miit_ref_ent;
682  miit_ref_ent = refinedEntities.get<Ent_mi_tag>().find(*eit);
683  if (miit_ref_ent == refinedEntities.get<Ent_mi_tag>().end()) {
684  SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
685  "Entity is not in MoFEM database, entities in field meshset need "
686  "to be seeded (i.e. bit ref level add to them)");
687  }
688  std::pair<FieldEntity_multiIndex::iterator, bool> e_miit;
689  try {
690  // create database entity
691  e_miit = entsFields.insert(
692  boost::make_shared<FieldEntity>(*miit, *miit_ref_ent));
693  } catch (MoFEMException const &e) {
694  SETERRQ(PETSC_COMM_SELF, e.errorCode, e.errorMessage);
695  } catch (const std::exception &ex) {
696  std::ostringstream ss;
697  ss << ex.what() << std::endl;
698  SETERRQ(PETSC_COMM_SELF, MOFEM_STD_EXCEPTION_THROW, ss.str().c_str());
699  }
700  // this is nor real field in space (set order to zero)
701  bool success = entsFields.modify(e_miit.first, FieldEntity_change_order(0));
702  if (!success)
703  SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
704  "modification unsuccessful");
705  FieldCoefficientsNumber rank = 0;
706  // create dofs on this entity (nb. of dofs is equal to rank)
707  for (; rank < (*e_miit.first)->getNbOfCoeffs(); rank++) {
708  std::pair<DofEntity_multiIndex::iterator, bool> d_miit;
709  // check if dof is in darabase
710  d_miit.first = dofsField.project<0>(dofsField.get<Unique_mi_tag>().find(
711  DofEntity::getGlobalUniqueIdCalculate(rank, *(e_miit.first))));
712  // if dof is not in database
713  if (d_miit.first == dofsField.end()) {
714  // insert dof
715  d_miit = dofsField.insert(
716  boost::make_shared<DofEntity>(*(e_miit.first), 0, rank, rank));
717  if (d_miit.second) {
718  dof_counter[MBENTITYSET]++; // Count entities in the meshset
719  }
720  bool success =
721  dofsField.modify(d_miit.first, DofEntity_active_change(true));
722  if (!success)
723  SETERRQ(PETSC_COMM_SELF, MOFEM_OPERATION_UNSUCCESSFUL,
724  "modification unsuccessful");
725  }
726  // check consistency
727  assert((*d_miit.first)->getEntType() == (*e_miit.first)->getEntType());
728  assert((*d_miit.first)->getId() == (*e_miit.first)->getId());
729  assert((*d_miit.first)->getMaxOrder() == 0);
730  }
731  }
732  if (verb > 2) {
733  typedef DofEntity_multiIndex::index<FieldName_mi_tag>::type DofsByName;
734  DofsByName &set = dofsField.get<FieldName_mi_tag>();
735  DofsByName::iterator miit2 = set.lower_bound(miit->get()->getNameRef());
736  DofsByName::iterator hi_miit2 = set.upper_bound(miit->get()->getNameRef());
737  assert(miit2 != hi_miit2);
738  for (; miit2 != hi_miit2; miit2++) {
739  std::ostringstream ss;
740  ss << *miit2 << std::endl;
741  ;
742  PetscSynchronizedPrintf(cOmm, ss.str().c_str());
743  }
744  PetscSynchronizedFlush(cOmm, PETSC_STDOUT);
745  }
747 }
#define CHKERRQ_MOAB(a)
check error code of MoAB function
Definition: definitions.h:536
int FieldCoefficientsNumber
Number of field coefficients.
Definition: Common.hpp:132
DofEntity_multiIndex dofsField
dofs on fields
Definition: Core.hpp:249
MPI_Comm cOmm
MoFEM communicator.
Definition: Core.hpp:864
RefEntity_multiIndex refinedEntities
refined entities
Definition: Core.hpp:244
FieldEntity_multiIndex entsFields
entities on fields
Definition: Core.hpp:248
moab::Interface & get_moab()
Definition: Core.hpp:266
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:522
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:528
static MoFEMErrorCodeGeneric< moab::ErrorCode > rval
Definition: Common.hpp:78
Field_multiIndex fIelds
fields
Definition: Core.hpp:247
int verbose
Verbosity level.
Definition: Core.hpp:888
static UId getGlobalUniqueIdCalculate(const DofIdx dof, const boost::shared_ptr< FieldEntity > &ent_ptr)
Calculate UId for DOF.

◆ buildFiniteElements()

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

Definition at line 541 of file FECore.cpp.

542  {
544  if (verb == -1)
545  verb = verbose;
546 
547  typedef RefElement_multiIndex::index<Ent_mi_tag>::type RefFiniteElementByEnt;
548  typedef Field_multiIndex::index<BitFieldId_mi_tag>::type FieldById;
549  FieldById &fields_by_id = fIelds.get<BitFieldId_mi_tag>();
550 
551  // get id of mofem fields for row, col and data
552  enum IntLoop { ROW = 0, COL, DATA, LAST };
553  BitFieldId fe_fields[LAST] = {fe.get()->getBitFieldIdRow(),
554  fe.get()->getBitFieldIdCol(),
555  fe.get()->getBitFieldIdData()};
556 
557  // get finite element meshset
558  EntityHandle meshset = get_finite_element_meshset(fe.get()->getId());
559  // get entities from finite element meshset // if meshset
560  Range fe_ents;
561  CHKERR get_moab().get_entities_by_handle(meshset, fe_ents, false);
562 
563  if (ents_ptr)
564  fe_ents = intersect(fe_ents, *ents_ptr);
565 
566  // map entity uid to pointers
567  typedef std::vector<boost::weak_ptr<EntFiniteElement> > VecOfWeakFEPtrs;
568  typedef std::pair<const UId *, VecOfWeakFEPtrs> EntUIdAndVecOfWeakFEPtrs;
569  typedef multi_index_container<
570  EntUIdAndVecOfWeakFEPtrs,
571  indexed_by<sequenced<>, hashed_non_unique<
572  member<EntUIdAndVecOfWeakFEPtrs, const UId *,
573  &EntUIdAndVecOfWeakFEPtrs::first> > > >
574  EntUIdAndVecOfWeakFEPtrs_multi_index;
575  EntUIdAndVecOfWeakFEPtrs_multi_index entUIdAndFEVec;
576 
577  std::map<EntityHandle, int> data_dofs_size;
578 
579  // loop meshset Ents and add finite elements
580  for (Range::const_pair_iterator peit = fe_ents.const_pair_begin();
581  peit != fe_ents.const_pair_end(); peit++) {
582 
583  EntityHandle first = peit->first;
584  EntityHandle second = peit->second;
585 
586  // note: iterator is a wrapper
587  // check if is in refinedFiniteElements database
588  RefFiniteElementByEnt::iterator ref_fe_miit, hi_ref_fe_miit;
589  ref_fe_miit = refinedFiniteElements.get<Ent_mi_tag>().lower_bound(first);
590  if (ref_fe_miit == refinedFiniteElements.get<Ent_mi_tag>().end()) {
591  std::ostringstream ss;
592  ss << "refinedFiniteElements not in database ent = " << first;
593  ss << " type " << get_moab().type_from_handle(first);
594  ss << " " << *fe;
595  SETERRQ(cOmm, MOFEM_DATA_INCONSISTENCY, ss.str().c_str());
596  }
597  hi_ref_fe_miit =
598  refinedFiniteElements.get<Ent_mi_tag>().upper_bound(second);
599 
600  for (; ref_fe_miit != hi_ref_fe_miit; ref_fe_miit++) {
601 
602  std::pair<EntFiniteElement_multiIndex::iterator, bool> p =
603  entsFiniteElements.insert(boost::make_shared<EntFiniteElement>(
604  *ref_fe_miit, fe));
605 
606  if (fe_fields[ROW] == fe_fields[COL]) {
607  p.first->get()->col_dof_view = p.first->get()->row_dof_view;
608  } else if (p.first->get()->col_dof_view == p.first->get()->row_dof_view) {
609  p.first->get()->col_dof_view =
610  boost::make_shared<DofEntity_multiIndex_uid_view>();
611  }
612 
613  p.first->get()->row_dof_view->clear();
614  p.first->get()->col_dof_view->clear();
615  p.first->get()->data_dofs->clear();
616 
617  for (unsigned int ii = 0; ii < BitFieldId().size(); ii++) {
618 
619  // Common field id for ROW, COL and DATA
620  BitFieldId id_common = 0;
621  // Check if the field (ii) is added to finite element
622  for (int ss = 0; ss < LAST; ss++) {
623  id_common |= fe_fields[ss] & BitFieldId().set(ii);
624  }
625  if (id_common.none())
626  continue;
627 
628  // Find in database data associated with the field (ii)
629  const BitFieldId field_id = BitFieldId().set(ii);
630  FieldById::iterator miit = fields_by_id.find(field_id);
631  if (miit == fields_by_id.end()) {
632  SETERRQ(cOmm, MOFEM_DATA_INCONSISTENCY, "Data inconsistency");
633  }
634 
635  // Entities adjacent to entities
636  Range adj_ents;
637 
638  // Resolve entities on element, those entities are used to build tag
639  // with dof uids on finite element tag
640  CHKERR p.first->get()->getElementAdjacency(*miit, adj_ents);
641 
642  // Loop over adjacencies of element and find field entities on those
643  // adjacencies, that create hash map map_uid_fe which is used later
644  const std::string field_name = miit->get()->getName();
645  const bool add_to_data =
646  (field_id & p.first->get()->getBitFieldIdData()).any();
647  FieldEntity_multiIndex::index<
648  Composite_Name_And_Ent_mi_tag>::type::iterator meit,hi_meit;
649  for (Range::pair_iterator p_eit = adj_ents.pair_begin();
650  p_eit != adj_ents.pair_end(); ++p_eit) {
651  const EntityHandle first = p_eit->first;
652  const EntityHandle second = p_eit->second;
653  meit = entsFields.get<Composite_Name_And_Ent_mi_tag>().lower_bound(
654  boost::make_tuple(field_name, first));
655  if (meit == entsFields.get<Composite_Name_And_Ent_mi_tag>().end()) {
656  continue;
657  }
658  hi_meit = entsFields.get<Composite_Name_And_Ent_mi_tag>().upper_bound(
659  boost::make_tuple(field_name, second));
660  for(;meit!=hi_meit;++meit) {
661  const UId *uid_ptr = &(meit->get()->getGlobalUniqueId());
662  EntUIdAndVecOfWeakFEPtrs_multi_index::nth_index<1>::type::iterator
663  e_uid_vec_fe_it;
664  e_uid_vec_fe_it = entUIdAndFEVec.get<1>().find(uid_ptr);
665  if (e_uid_vec_fe_it == entUIdAndFEVec.get<1>().end()) {
666  entUIdAndFEVec.insert(entUIdAndFEVec.end(),
667  std::pair<const UId *, VecOfWeakFEPtrs>(
668  uid_ptr, VecOfWeakFEPtrs(1, *p.first)));
669  } else {
670  const VecOfWeakFEPtrs &vec_fe_ptrs = e_uid_vec_fe_it->second;
671  const_cast<VecOfWeakFEPtrs &>(vec_fe_ptrs).push_back(*p.first);
672  }
673 
674  if (add_to_data) {
675  data_dofs_size[p.first->get()->getEnt()] +=
676  meit->get()->getNbDofsOnEnt();
677  }
678  }
679  }
680  }
681  }
682  }
683 
684  // Reserve memory
685  std::map<EntityHandle, boost::shared_ptr<std::vector<FEDofEntity> > >
686  data_dofs_array;
687  for (std::map<EntityHandle, int>::iterator mit = data_dofs_size.begin();
688  mit != data_dofs_size.end(); mit++) {
689  if (mit->second > 0) {
690  data_dofs_array[mit->first] =
691  boost::make_shared<std::vector<FEDofEntity> >();
692  data_dofs_array[mit->first]->reserve(mit->second);
693  }
694  }
695 
696  // Vector of (aliased) shared pointers
697  std::vector<boost::shared_ptr<FEDofEntity> > data_dofs_shared_array;
698 
699  typedef DofEntity_multiIndex::index<Unique_Ent_mi_tag>::type DofsByEntUId;
700  DofsByEntUId &dofs_by_ent_uid = dofsField.get<Unique_Ent_mi_tag>();
701 
702  // Loop over hash map, which has all entities on given elemnts
703  boost::shared_ptr<SideNumber> side_number_ptr;
704  for (EntUIdAndVecOfWeakFEPtrs_multi_index::iterator mit = entUIdAndFEVec.begin();
705  mit != entUIdAndFEVec.end(); mit++) {
706  DofsByEntUId::iterator dit, hi_dit;
707  dit = dofs_by_ent_uid.lower_bound(*mit->first);
708  hi_dit = dofs_by_ent_uid.upper_bound(*mit->first);
709  for (; dit != hi_dit; dit++) {
710  // cerr << mit->first << endl;
711  // cerr << **dit << endl;
712  // if(PetscUnlikely(!(*dit))) {
713  // SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
714  // "Null pointer to DOF");
715  // }
716  const BitFieldId field_id = dit->get()->getId();
717  const EntityHandle dof_ent = dit->get()->getEnt();
718  std::vector<boost::weak_ptr<EntFiniteElement> >::const_iterator fe_it,
719  hi_fe_it;
720  fe_it = mit->second.begin();
721  hi_fe_it = mit->second.end();
722  for (; fe_it != hi_fe_it; fe_it++) {
723 
724  // if rows and columns of finite element are the same, then
725  // we exploit that case
726  if ((field_id & fe_it->lock().get()->getBitFieldIdRow()).any()) {
727  fe_it->lock().get()->row_dof_view->insert(
728  fe_it->lock().get()->row_dof_view->end(), *dit);
729  }
730  if (fe_it->lock().get()->col_dof_view !=
731  fe_it->lock().get()->row_dof_view) {
732  if ((field_id & fe_it->lock().get()->getBitFieldIdCol()).any()) {
733  fe_it->lock().get()->col_dof_view->insert(
734  fe_it->lock().get()->col_dof_view->end(), *dit);
735  }
736  }
737 
738  // Add FEDofEntity, first create dofs, one by one, note that memory
739  // is already reserved. Then create shared pointers and finally add
740  // th_FEName to element multi-index
741  const EntityHandle fe_ent = fe_it->lock().get()->getEnt();
742  boost::shared_ptr<std::vector<FEDofEntity> > &data_dofs_array_vec =
743  data_dofs_array[fe_ent];
744  if (data_dofs_size[fe_ent] != 0 &&
745  (field_id & fe_it->lock().get()->getBitFieldIdData()).any()) {
746 
747  // There are data dofs on this element
748  side_number_ptr = fe_it->lock().get()->getSideNumberPtr(dof_ent);
749  data_dofs_array_vec->push_back(FEDofEntity(side_number_ptr, *dit));
750  if (data_dofs_array_vec->size() ==
751  (unsigned int)data_dofs_size[fe_ent]) {
752  // That means that FEDofEntity vector is full, and can be added to
753  // multi-index
754 
755  // Create shared pointers vector
756  data_dofs_shared_array.clear();
757  data_dofs_shared_array.reserve(data_dofs_size[fe_ent]);
758  for (std::vector<FEDofEntity>::iterator vit =
759  data_dofs_array_vec->begin();
760  vit != data_dofs_array_vec->end(); vit++) {
761  // Create aliased shared pointer
762  data_dofs_shared_array.push_back(
763  boost::shared_ptr<FEDofEntity>(data_dofs_array_vec, &(*vit)));
764  }
765  fe_it->lock().get()->data_dofs->insert(
766  data_dofs_shared_array.begin(), data_dofs_shared_array.end());
767  fe_it->lock().get()->getDofsSequence() = data_dofs_array_vec;
768  }
769  }
770  }
771  }
772  }
773 
775 }
DofEntity_multiIndex dofsField
dofs on fields
Definition: Core.hpp:249
EntityHandle get_finite_element_meshset(const BitFEId id) const
Definition: FECore.cpp:282
MPI_Comm cOmm
MoFEM communicator.
Definition: Core.hpp:864
FieldEntity_multiIndex entsFields
entities on fields
Definition: Core.hpp:248
moab::Interface & get_moab()
Definition: Core.hpp:266
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
std::bitset< BITFIELDID_SIZE > BitFieldId
Definition: Common.hpp:149
uint128_t UId
Unique Id.
Definition: Common.hpp:136
RefElement_multiIndex refinedFiniteElements
refined elements
Definition: Core.hpp:245
#define CHKERR
Inline error check.
Definition: definitions.h:617
Field_multiIndex fIelds
fields
Definition: Core.hpp:247
int verbose
Verbosity level.
Definition: Core.hpp:888
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443
EntFiniteElement_multiIndex entsFiniteElements
finite element entities
Definition: Core.hpp:252

◆ 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 49 of file FieldCore.cpp.

49  {
50  typedef Field_multiIndex::index<FieldName_mi_tag>::type FieldSetByName;
51  const FieldSetByName &set = fIelds.get<FieldName_mi_tag>();
52  FieldSetByName::iterator miit = set.find(name);
53  if (miit == set.end())
54  return false;
55  return true;
56 }
Field_multiIndex fIelds
fields
Definition: Core.hpp:247

◆ 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  typedef FiniteElement_multiIndex::index<FiniteElement_name_mi_tag>::type
37  FeSetByName;
38  const FeSetByName &set = finiteElements.get<FiniteElement_name_mi_tag>();
39  FeSetByName::iterator miit = set.find(name);
40  if (miit == set.end())
41  return false;
42  return true;
43 }
FiniteElement_multiIndex finiteElements
finite elements
Definition: Core.hpp:251

◆ check_number_of_ents_in_ents_field() [1/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 1091 of file FieldCore.cpp.

1091  {
1093  Field_multiIndex::index<FieldName_mi_tag>::type::iterator it =
1094  fIelds.get<FieldName_mi_tag>().find(name);
1095  if (it == fIelds.get<FieldName_mi_tag>().end()) {
1096  SETERRQ1(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
1097  "field not found < %s >", name.c_str());
1098  }
1099  EntityHandle meshset = (*it)->getMeshset();
1100 
1101  int num_entities;
1102 
1103  rval = get_moab().get_number_entities_by_handle(meshset, num_entities);
1104  CHKERRQ_MOAB(rval);
1105  if (entsFields.get<FieldName_mi_tag>().count((*it)->getName()) >
1106  (unsigned int)num_entities) {
1107  SETERRQ1(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
1108  "not equal number of entities in meshset and field multiindex "
1109  "< %s >",
1110  name.c_str());
1111  }
1113 }
#define CHKERRQ_MOAB(a)
check error code of MoAB function
Definition: definitions.h:536
FieldEntity_multiIndex entsFields
entities on fields
Definition: Core.hpp:248
moab::Interface & get_moab()
Definition: Core.hpp:266
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:522
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:528
static MoFEMErrorCodeGeneric< moab::ErrorCode > rval
Definition: Common.hpp:78
Field_multiIndex fIelds
fields
Definition: Core.hpp:247

◆ check_number_of_ents_in_ents_field() [2/2]

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

check data consistency in entitiesPtr

Implements MoFEM::CoreInterface.

Definition at line 1114 of file FieldCore.cpp.

1114  {
1116  Field_multiIndex::index<FieldName_mi_tag>::type::iterator it =
1117  fIelds.get<FieldName_mi_tag>().begin();
1118  for (; it != fIelds.get<FieldName_mi_tag>().end(); it++) {
1119  if ((*it)->getSpace() == NOFIELD)
1120  continue; // FIXME: should be treated properly, not test is just
1121  // skipped for this NOFIELD space
1122  EntityHandle meshset = (*it)->getMeshset();
1123 
1124  int num_entities;
1125  rval = get_moab().get_number_entities_by_handle(meshset, num_entities);
1126  CHKERRQ_MOAB(rval);
1127  if (entsFields.get<FieldName_mi_tag>().count((*it)->getName()) >
1128  (unsigned int)num_entities) {
1129  SETERRQ1(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
1130  "not equal number of entities in meshset and field "
1131  "multiindex < %s >",
1132  (*it)->getName().c_str());
1133  }
1134  }
1136 }
#define CHKERRQ_MOAB(a)
check error code of MoAB function
Definition: definitions.h:536
FieldEntity_multiIndex entsFields
entities on fields
Definition: Core.hpp:248
moab::Interface & get_moab()
Definition: Core.hpp:266
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:522
scalar or vector of scalars describe (no true field)
Definition: definitions.h:176
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:528
static MoFEMErrorCodeGeneric< moab::ErrorCode > rval
Definition: Common.hpp:78
Field_multiIndex fIelds
fields
Definition: Core.hpp:247

◆ check_number_of_ents_in_ents_finite_element() [1/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 993 of file FECore.cpp.

994  {
996  FiniteElement_multiIndex::index<FiniteElement_name_mi_tag>::type::iterator it;
997  it = finiteElements.get<FiniteElement_name_mi_tag>().find(name);
998  if (it == finiteElements.get<FiniteElement_name_mi_tag>().end()) {
999  SETERRQ1(cOmm, 1, "finite element not found < %s >", name.c_str());
1000  }
1001  EntityHandle meshset = (*it)->getMeshset();
1002 
1003  int num_entities;
1004  CHKERR get_moab().get_number_entities_by_handle(meshset, num_entities);
1005 
1006  if (entsFiniteElements.get<FiniteElement_name_mi_tag>().count(
1007  (*it)->getName().c_str()) != (unsigned int)num_entities) {
1008  SETERRQ1(cOmm, 1,
1009  "not equal number of entities in meshset and finite elements "
1010  "multiindex < %s >",
1011  (*it)->getName().c_str());
1012  }
1014 }
MPI_Comm cOmm
MoFEM communicator.
Definition: Core.hpp:864
moab::Interface & get_moab()
Definition: Core.hpp:266
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
FiniteElement_multiIndex finiteElements
finite elements
Definition: Core.hpp:251
#define CHKERR
Inline error check.
Definition: definitions.h:617
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443
EntFiniteElement_multiIndex entsFiniteElements
finite element entities
Definition: Core.hpp:252

◆ check_number_of_ents_in_ents_finite_element() [2/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 1016 of file FECore.cpp.

1016  {
1018  FiniteElement_multiIndex::index<FiniteElement_name_mi_tag>::type::iterator it;
1019  it = finiteElements.get<FiniteElement_name_mi_tag>().begin();
1020  for (; it != finiteElements.get<FiniteElement_name_mi_tag>().end(); it++) {
1021  EntityHandle meshset = (*it)->getMeshset();
1022 
1023  int num_entities;
1024  CHKERR get_moab().get_number_entities_by_handle(meshset, num_entities);
1025 
1026  if (entsFiniteElements.get<FiniteElement_name_mi_tag>().count(
1027  (*it)->getName().c_str()) != (unsigned int)num_entities) {
1028  SETERRQ1(cOmm, 1,
1029  "not equal number of entities in meshset and finite elements "
1030  "multiindex < %s >",
1031  (*it)->getName().c_str());
1032  }
1033  }
1035 }
MPI_Comm cOmm
MoFEM communicator.
Definition: Core.hpp:864
moab::Interface & get_moab()
Definition: Core.hpp:266
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
FiniteElement_multiIndex finiteElements
finite elements
Definition: Core.hpp:251
#define CHKERR
Inline error check.
Definition: definitions.h:617
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443
EntFiniteElement_multiIndex entsFiniteElements
finite element entities
Definition: Core.hpp:252

◆ check_problem()

bool MoFEM::Core::check_problem ( const std::string  name)
protectedvirtual

check if problem exist

Parameters
nameproblem name
Returns
true if problem is in database

Implements MoFEM::CoreInterface.

Definition at line 21 of file ProblemsCore.cpp.

21  {
22  Problem_multiIndex::index<Problem_mi_tag>::type::iterator pit;
23  pit = pRoblems.get<Problem_mi_tag>().find(name);
24  if (pit == pRoblems.get<Problem_mi_tag>().end()) {
25  return false;
26  }
27  return true;
28 }
Problem_multiIndex pRoblems
problems multi-index
Definition: Core.hpp:257

◆ 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 381 of file DeleteCore.cpp.

383  {
385  if (verb == -1)
386  verb = verbose;
387  Range ents;
388  CHKERR BitRefManager(*this).getEntitiesByRefLevel(bit, mask, ents, verb);
391 }
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
MoFEMErrorCode clear_adjacencies_entities(const BitRefLevel &bit, const BitRefLevel &mask, int verb=DEFAULT_VERBOSITY)
clear adjacency map for entities on given bit level
Definition: DeleteCore.cpp:381
#define CHKERR
Inline error check.
Definition: definitions.h:617
int verbose
Verbosity level.
Definition: Core.hpp:888
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443

◆ 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 393 of file DeleteCore.cpp.

393  {
395  if (verb == -1)
396  verb = verbose;
397  for (Range::const_pair_iterator p_eit = ents.pair_begin();
398  p_eit != ents.pair_end(); ++p_eit) {
399  const EntityHandle first = p_eit->first;
400  const EntityHandle second = p_eit->second;
401  FieldEntityEntFiniteElementAdjacencyMap_multiIndex::index<
402  Ent_mi_tag>::type::iterator ait,
403  hi_ait;
404  ait = entFEAdjacencies.get<Ent_mi_tag>().lower_bound(first);
405  hi_ait = entFEAdjacencies.get<Ent_mi_tag>().upper_bound(second);
406  entFEAdjacencies.get<Ent_mi_tag>().erase(ait, hi_ait);
407  }
409 }
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:522
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:528
FieldEntityEntFiniteElementAdjacencyMap_multiIndex entFEAdjacencies
adjacencies of elements to dofs
Definition: Core.hpp:255
int verbose
Verbosity level.
Definition: Core.hpp:888

◆ 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 411 of file DeleteCore.cpp.

412  {
414  if (verb == -1)
415  verb = verbose;
416 
417  const Field *field_ptr = get_field_structure(name);
418  int field_bit_number = field_ptr->getBitNumber();
419  bool is_distributed_mesh = basicEntityDataPtr->trueIfDistributedMesh();
420  ParallelComm *pcomm =
421  ParallelComm::get_pcomm(&get_moab(), basicEntityDataPtr->pcommID);
422 
423  for (Range::const_pair_iterator p_eit = ents.pair_begin();
424  p_eit != ents.pair_end(); p_eit++) {
425 
426  // First and last handle
427  const EntityHandle first = p_eit->first;
428  const EntityHandle second = p_eit->second;
429 
430  // Get owner proc and owner handle
431  int f_owner_proc;
432  EntityHandle f_moab_owner_handle;
433  CHKERR pcomm->get_owner_handle(first, f_owner_proc, f_moab_owner_handle);
434  int s_owner_proc;
435  EntityHandle s_moab_owner_handle;
436  CHKERR pcomm->get_owner_handle(second, s_owner_proc, s_moab_owner_handle);
437 
438  // Get UId
440  f_owner_proc, field_bit_number, f_moab_owner_handle,
441  is_distributed_mesh);
443  s_owner_proc, field_bit_number, s_moab_owner_handle,
444  is_distributed_mesh);
445 
446  // Find adjacencies
447  FieldEntityEntFiniteElementAdjacencyMap_multiIndex::index<
448  Unique_mi_tag>::type::iterator ait,
449  hi_ait;
450  ait = entFEAdjacencies.get<Unique_mi_tag>().lower_bound(first_uid);
451  hi_ait = entFEAdjacencies.get<Unique_mi_tag>().upper_bound(second_uid);
452  entFEAdjacencies.get<Unique_mi_tag>().erase(ait, hi_ait);
453  }
455 }
moab::Interface & get_moab()
Definition: Core.hpp:266
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:522
UId getGlobalUniqueIdCalculate() const
Calculate global UId.
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:528
const Field * get_field_structure(const std::string &name)
get field structure
Definition: FieldCore.cpp:58
uint128_t UId
Unique Id.
Definition: Common.hpp:136
FieldEntityEntFiniteElementAdjacencyMap_multiIndex entFEAdjacencies
adjacencies of elements to dofs
Definition: Core.hpp:255
#define CHKERR
Inline error check.
Definition: definitions.h:617
boost::shared_ptr< BasicEntityData > basicEntityDataPtr
Definition: Core.hpp:225
int verbose
Verbosity level.
Definition: Core.hpp:888

◆ 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 510 of file DeleteCore.cpp.

512  {
514  Range ents;
515  CHKERR BitRefManager(*this).getEntitiesByRefLevel(bit, mask, ents, verb);
518 }
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
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
Definition: DeleteCore.cpp:510
#define CHKERR
Inline error check.
Definition: definitions.h:617
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443

◆ clear_adjacencies_finite_elements() [2/3]

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

Definition at line 520 of file DeleteCore.cpp.

521  {
523  if (verb == -1)
524  verb = verbose;
525  for (Range::const_pair_iterator p_eit = ents.pair_begin();
526  p_eit != ents.pair_end(); p_eit++) {
527  EntityHandle first = p_eit->first;
528  EntityHandle second = p_eit->second;
529  FieldEntityEntFiniteElementAdjacencyMap_multiIndex::index<
530  FEEnt_mi_tag>::type::iterator ait,
531  hi_ait;
532  ait = entFEAdjacencies.get<FEEnt_mi_tag>().lower_bound(first);
533  hi_ait = entFEAdjacencies.get<FEEnt_mi_tag>().upper_bound(second);
534  entFEAdjacencies.get<FEEnt_mi_tag>().erase(ait, hi_ait);
535  }
537 }
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:522
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:528
FieldEntityEntFiniteElementAdjacencyMap_multiIndex entFEAdjacencies
adjacencies of elements to dofs
Definition: Core.hpp:255
int verbose
Verbosity level.
Definition: Core.hpp:888

◆ 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 539 of file DeleteCore.cpp.

541  {
543  if (verb == -1)
544  verb = verbose;
545 
546  FiniteElement_multiIndex::index<FiniteElement_name_mi_tag>::type::iterator
547  it_fe = finiteElements.get<FiniteElement_name_mi_tag>().find(name);
548  if (it_fe != finiteElements.get<FiniteElement_name_mi_tag>().end()) {
549 
550  const int fe_bit_number = it_fe->get()->getBitNumber();
551 
552  for (Range::const_pair_iterator p_eit = ents.pair_begin();
553  p_eit != ents.pair_end(); p_eit++) {
554 
555  // First and last handle
556  const EntityHandle first = p_eit->first;
557  const EntityHandle second = p_eit->second;
558 
559  // Get UId
560  UId first_uid =
561  EntFiniteElement::getGlobalUniqueIdCalculate(first, fe_bit_number);
562  UId second_uid =
563  EntFiniteElement::getGlobalUniqueIdCalculate(second, fe_bit_number);
564 
565  // Find and remove adjacencies
566  FieldEntityEntFiniteElementAdjacencyMap_multiIndex::index<
567  FE_Unique_mi_tag>::type::iterator ait,
568  hi_ait;
569  ait = entFEAdjacencies.get<FE_Unique_mi_tag>().lower_bound(first_uid);
570  hi_ait = entFEAdjacencies.get<FE_Unique_mi_tag>().upper_bound(second_uid);
571  entFEAdjacencies.get<FE_Unique_mi_tag>().erase(ait, hi_ait);
572  }
573  }
575 }
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:522
UId getGlobalUniqueIdCalculate() const
Generate UId for finite element entity.
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:528
uint128_t UId
Unique Id.
Definition: Common.hpp:136
FieldEntityEntFiniteElementAdjacencyMap_multiIndex entFEAdjacencies
adjacencies of elements to dofs
Definition: Core.hpp:255
FiniteElement_multiIndex finiteElements
finite elements
Definition: Core.hpp:251
int verbose
Verbosity level.
Definition: Core.hpp:888

◆ 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 471 of file Core.cpp.

471  {
473  if (verb == -1)
474  verb = verbose;
475  CHKERR clearMap();
477 }
MoFEMErrorCode clearMap()
Cleaning database.
Definition: Core.cpp:222
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
#define CHKERR
Inline error check.
Definition: definitions.h:617
int verbose
Verbosity level.
Definition: Core.hpp:888
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443

◆ 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 78 of file DeleteCore.cpp.

78  {
80  if (verb == -1)
81  verb = verbose;
82 
83  for (Range::const_pair_iterator p_eit = ents.pair_begin();
84  p_eit != ents.pair_end(); p_eit++) {
85  EntityHandle first = p_eit->first;
86  EntityHandle second = p_eit->second;
87  // get dofs range
88  DofEntityByEnt::iterator dit, hi_dit;
89  dit = dofsField.get<Ent_mi_tag>().lower_bound(first);
90  if (dit == dofsField.get<Ent_mi_tag>().end())
91  continue;
92  hi_dit = dofsField.get<Ent_mi_tag>().upper_bound(second);
93 
94  // bool last_hi_dit;
95  // if (hi_dit == dofsField.get<Ent_mi_tag>().end()) {
96  // last_hi_dit = true;
97  // } else {
98  // last_hi_dit = false;
99  // }
100  // clear dofs in finite elements
101  // FieldEntityEntFiniteElementAdjacencyMap_multiIndex::index<
102  // Ent_mi_tag>::type::iterator ait,
103  // hi_ait;
104  // ait = entFEAdjacencies.get<Ent_mi_tag>().lower_bound(first);
105  // hi_ait = entFEAdjacencies.get<Ent_mi_tag>().upper_bound(second);
106  // for (; ait != hi_ait; ++ait) {
107  // // Delete data dofs on element
108  // {
109  // FEDofEntity_multiIndex::iterator diit, hi_diit;
110  // diit = ait->entFePtr->data_dofs->lower_bound(
111  // dit->get()->getGlobalUniqueId());
112  // if (last_hi_dit) {
113  // hi_diit = ait->entFePtr->data_dofs->end();
114  // } else {
115  // hi_diit = ait->entFePtr->data_dofs->lower_bound(
116  // hi_dit->get()->getGlobalUniqueId());
117  // }
118  // ait->entFePtr->data_dofs->erase(diit, hi_diit);
119  // }
120  // // Delete dofs view on rows and columns on elements
121  // {
122  // DofEntity_multiIndex_uid_view::iterator diit, hi_diit;
123  // diit = ait->entFePtr->row_dof_view->lower_bound(
124  // dit->get()->getGlobalUniqueId());
125  // if (last_hi_dit) {
126  // hi_diit = ait->entFePtr->row_dof_view->end();
127  // } else {
128  // hi_diit = ait->entFePtr->row_dof_view->lower_bound(
129  // hi_dit->get()->getGlobalUniqueId());
130  // }
131  // ait->entFePtr->row_dof_view->erase(diit, hi_diit);
132  // if (ait->entFePtr->row_dof_view != ait->entFePtr->col_dof_view) {
133  // diit = ait->entFePtr->col_dof_view->lower_bound(
134  // dit->get()->getGlobalUniqueId());
135  // if (last_hi_dit) {
136  // hi_diit = ait->entFePtr->col_dof_view->end();
137  // } else {
138  // hi_diit = ait->entFePtr->col_dof_view->lower_bound(
139  // hi_dit->get()->getGlobalUniqueId());
140  // }
141  // ait->entFePtr->col_dof_view->erase(diit, hi_diit);
142  // }
143  // }
144  // }
145  // finally clear dofs
146  dofsField.get<Ent_mi_tag>().erase(dit,hi_dit);
147  }
149 }
DofEntity_multiIndex dofsField
dofs on fields
Definition: Core.hpp:249
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:522
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:528
int verbose
Verbosity level.
Definition: Core.hpp:888

◆ 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 151 of file DeleteCore.cpp.

152  {
154  if (verb == -1)
155  verb = verbose;
156 
157  // const Field *field_ptr = get_field_structure(name);
158  // int field_bit_number = field_ptr->getBitNumber();
159  // bool is_distributed_mesh = basicEntityDataPtr->trueIfDistributedMesh();
160  // ParallelComm *pcomm =
161  // ParallelComm::get_pcomm(&moab, basicEntityDataPtr->pcommID);
162 
163  for (Range::const_pair_iterator p_eit = ents.pair_begin();
164  p_eit != ents.pair_end(); p_eit++) {
165  EntityHandle first = p_eit->first;
166  EntityHandle second = p_eit->second;
167  DofEntityByNameAndEnt::iterator dit, hi_dit;
168  dit = dofsField.get<Composite_Name_And_Ent_mi_tag>().lower_bound(
169  boost::make_tuple(name, first));
170  hi_dit = dofsField.get<Composite_Name_And_Ent_mi_tag>().upper_bound(
171  boost::make_tuple(name, second));
172  // bool last_hi_dit;
173  // if (hi_dit == dofsField.get<Composite_Name_And_Ent_mi_tag>().end()) {
174  // last_hi_dit = true;
175  // } else {
176  // last_hi_dit = false;
177  // }
178 
179  // // Get owner proc and owner handle
180  // int f_owner_proc;
181  // EntityHandle f_moab_owner_handle;
182  // CHKERR pcomm->get_owner_handle(first, f_owner_proc, f_moab_owner_handle);
183  // int s_owner_proc;
184  // EntityHandle s_moab_owner_handle;
185  // CHKERR pcomm->get_owner_handle(second, s_owner_proc, s_moab_owner_handle);
186 
187  // // Get UId
188  // UId first_uid = FieldEntity::getGlobalUniqueIdCalculate(
189  // f_owner_proc, field_bit_number, f_moab_owner_handle,
190  // is_distributed_mesh);
191  // UId second_uid = FieldEntity::getGlobalUniqueIdCalculate(
192  // s_owner_proc, field_bit_number, s_moab_owner_handle,
193  // is_distributed_mesh);
194 
195  // FieldEntityEntFiniteElementAdjacencyMap_multiIndex::index<
196  // Unique_mi_tag>::type::iterator ait,
197  // hi_ait;
198  // ait = entFEAdjacencies.get<Unique_mi_tag>().lower_bound(
199  // first_uid);
200  // hi_ait = entFEAdjacencies.get<Unique_mi_tag>().upper_bound(
201  // second_uid);
202  // for (; ait != hi_ait; ++ait) {
203  // // Delete data dofs on element
204  // {
205  // FEDofEntity_multiIndex::iterator diit, hi_diit;
206  // diit = ait->entFePtr->data_dofs->lower_bound(
207  // dit->get()->getGlobalUniqueId());
208  // if (last_hi_dit) {
209  // hi_diit = ait->entFePtr->data_dofs->end();
210  // } else {
211  // hi_diit = ait->entFePtr->data_dofs->lower_bound(
212  // hi_dit->get()->getGlobalUniqueId());
213  // }
214  // ait->entFePtr->data_dofs->erase(diit, hi_diit);
215  // }
216  // // Delete dofs view on rows and columns on elements
217  // {
218  // DofEntity_multiIndex_uid_view::iterator diit, hi_diit;
219  // diit = ait->entFePtr->row_dof_view->lower_bound(
220  // dit->get()->getGlobalUniqueId());
221  // if (last_hi_dit) {
222  // hi_diit = ait->entFePtr->row_dof_view->end();
223  // } else {
224  // hi_diit = ait->entFePtr->row_dof_view->lower_bound(
225  // hi_dit->get()->getGlobalUniqueId());
226  // }
227  // ait->entFePtr->row_dof_view->erase(diit, hi_diit);
228  // if (ait->entFePtr->row_dof_view != ait->entFePtr->col_dof_view) {
229  // diit = ait->entFePtr->col_dof_view->lower_bound(
230  // dit->get()->getGlobalUniqueId());
231  // if (last_hi_dit) {
232  // hi_diit = ait->entFePtr->col_dof_view->end();
233  // } else {
234  // hi_diit = ait->entFePtr->col_dof_view->lower_bound(
235  // hi_dit->get()->getGlobalUniqueId());
236  // }
237  // ait->entFePtr->col_dof_view->erase(diit, hi_diit);
238  // }
239  // }
240  // }
241  dofsField.get<Composite_Name_And_Ent_mi_tag>().erase(dit, hi_dit);
242  }
244 }
DofEntity_multiIndex dofsField
dofs on fields
Definition: Core.hpp:249
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:522
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:528
int verbose
Verbosity level.
Definition: Core.hpp:888

◆ 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 67 of file DeleteCore.cpp.

68  {
70  if (verb == -1)
71  verb = verbose;
72  Range ents;
73  CHKERR BitRefManager(*this).getEntitiesByRefLevel(bit, mask, ents, verb);
74  CHKERR clear_dofs_fields(ents, verb);
76 }
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:522
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:528
MoFEMErrorCode clear_dofs_fields(const Range &ents, int verb=DEFAULT_VERBOSITY)
Definition: DeleteCore.cpp:78
#define CHKERR
Inline error check.
Definition: definitions.h:617
int verbose
Verbosity level.
Definition: Core.hpp:888

◆ 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 259 of file DeleteCore.cpp.

259  {
261  if (verb == -1)
262  verb = verbose;
263  CHKERR clear_dofs_fields(ents, verb);
265  for (Range::const_pair_iterator p_eit = ents.pair_begin();
266  p_eit != ents.pair_end(); p_eit++) {
267  EntityHandle first = p_eit->first;
268  EntityHandle second = p_eit->second;
269  FieldEntity_multiIndex::index<Ent_mi_tag>::type::iterator dit, hi_dit;
270  dit = entsFields.get<Ent_mi_tag>().lower_bound(first);
271  hi_dit = entsFields.get<Ent_mi_tag>().upper_bound(second);
272  entsFields.get<Ent_mi_tag>().erase(dit, hi_dit);
273  }
274  // TODO: FIXME: Tag are not deleteted, some additional set of interface functions
275  // need to be implemented for example tag_field_delete(...)
276  // for (Field_multiIndex::iterator fit = fIelds.begin(); fit != fIelds.end();
277  // fit++) {
278  // rval = get_moab().tag_delete_data(fit->get()->th_AppOrder, ents);
279  // if (rval != MB_SUCCESS && rval != MB_TAG_NOT_FOUND) {
280  // CHKERRG(rval);
281  // } else {
282  // rval = MB_SUCCESS;
283  // }
284  // rval = get_moab().tag_delete_data(fit->get()->th_FieldData, ents);
285  // if (rval != MB_SUCCESS && rval != MB_TAG_NOT_FOUND) {
286  // CHKERRG(rval);
287  // } else {
288  // rval = MB_SUCCESS;
289  // }
290  // }
292 }
FieldEntity_multiIndex entsFields
entities on fields
Definition: Core.hpp:248
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
MoFEMErrorCode clear_adjacencies_entities(const BitRefLevel &bit, const BitRefLevel &mask, int verb=DEFAULT_VERBOSITY)
clear adjacency map for entities on given bit level
Definition: DeleteCore.cpp:381
MoFEMErrorCode clear_dofs_fields(const Range &ents, int verb=DEFAULT_VERBOSITY)
Definition: DeleteCore.cpp:78
#define CHKERR
Inline error check.
Definition: definitions.h:617
int verbose
Verbosity level.
Definition: Core.hpp:888
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443

◆ 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 294 of file DeleteCore.cpp.

295  {
297  if (verb == -1)
298  verb = verbose;
299  CHKERR clear_dofs_fields(name, ents, verb);
300  CHKERR clear_adjacencies_entities(name, ents, verb);
301  for (Range::const_pair_iterator p_eit = ents.pair_begin();
302  p_eit != ents.pair_end(); p_eit++) {
303  EntityHandle first = p_eit->first;
304  EntityHandle second = p_eit->second;
305  FieldEntity_multiIndex::index<Composite_Name_And_Ent_mi_tag>::type::iterator
306  dit,
307  hi_dit;
308  dit = entsFields.get<Composite_Name_And_Ent_mi_tag>().lower_bound(
309  boost::make_tuple(name, first));
310  hi_dit = entsFields.get<Composite_Name_And_Ent_mi_tag>().upper_bound(
311  boost::make_tuple(name, second));
312  entsFields.get<Composite_Name_And_Ent_mi_tag>().erase(dit, hi_dit);
313  }
314  // TODO: FIXME: Tag are not deleteted, some additional set of interface functions
315  // need to be implemented for example tag_field_delete(...)
316  // const Field *field_ptr = get_field_structure(name);
317  // rval = get_moab().tag_delete_data(field_ptr->th_AppOrder, ents);
318  // if (rval != MB_SUCCESS && rval != MB_TAG_NOT_FOUND) {
319  // CHKERRG(rval);
320  // } else {
321  // rval = MB_SUCCESS;
322  // }
323  // rval = get_moab().tag_delete_data(field_ptr->th_FieldData, ents);
324  // if (rval != MB_SUCCESS && rval != MB_TAG_NOT_FOUND) {
325  // CHKERRG(rval);
326  // } else {
327  // rval = MB_SUCCESS;
328  // }
330 }
FieldEntity_multiIndex entsFields
entities on fields
Definition: Core.hpp:248
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
MoFEMErrorCode clear_adjacencies_entities(const BitRefLevel &bit, const BitRefLevel &mask, int verb=DEFAULT_VERBOSITY)
clear adjacency map for entities on given bit level
Definition: DeleteCore.cpp:381
MoFEMErrorCode clear_dofs_fields(const Range &ents, int verb=DEFAULT_VERBOSITY)
Definition: DeleteCore.cpp:78
#define CHKERR
Inline error check.
Definition: definitions.h:617
int verbose
Verbosity level.
Definition: Core.hpp:888
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443

◆ 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 246 of file DeleteCore.cpp.

247  {
249  if (verb == -1)
250  verb = verbose;
251  Range ents;
252  CHKERR BitRefManager(*this).getEntitiesByRefLevel(bit, mask, ents, verb);
253  CHKERR clear_dofs_fields(ents, verb);
255  CHKERR clear_ents_fields(ents, verb);
257 }
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
MoFEMErrorCode clear_adjacencies_entities(const BitRefLevel &bit, const BitRefLevel &mask, int verb=DEFAULT_VERBOSITY)
clear adjacency map for entities on given bit level
Definition: DeleteCore.cpp:381
MoFEMErrorCode clear_dofs_fields(const Range &ents, int verb=DEFAULT_VERBOSITY)
Definition: DeleteCore.cpp:78
#define CHKERR
Inline error check.
Definition: definitions.h:617
MoFEMErrorCode clear_ents_fields(const Range &ents, int verb=DEFAULT_VERBOSITY)
Definition: DeleteCore.cpp:259
int verbose
Verbosity level.
Definition: Core.hpp:888
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443

◆ 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 469 of file DeleteCore.cpp.

469  {
471  if (verb == -1)
472  verb = verbose;
474  for (Range::const_pair_iterator p_eit = ents.pair_begin();
475  p_eit != ents.pair_end(); p_eit++) {
476  EntityHandle first = p_eit->first;
477  EntityHandle second = p_eit->second;
478  EntFiniteElement_multiIndex::index<Ent_mi_tag>::type::iterator fit, hi_fit;
479  fit = entsFiniteElements.get<Ent_mi_tag>().lower_bound(first);
480  hi_fit = entsFiniteElements.get<Ent_mi_tag>().upper_bound(second);
481  entsFiniteElements.get<Ent_mi_tag>().erase(fit, hi_fit);
482  }
484 }
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
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
Definition: DeleteCore.cpp:510
#define CHKERR
Inline error check.
Definition: definitions.h:617
int verbose
Verbosity level.
Definition: Core.hpp:888
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443
EntFiniteElement_multiIndex entsFiniteElements
finite element entities
Definition: Core.hpp:252

◆ clear_finite_elements() [2/2]

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

clear finite elements

Implements MoFEM::CoreInterface.

Definition at line 486 of file DeleteCore.cpp.

487  {
489  if (verb == -1)
490  verb = verbose;
491  CHKERR clear_adjacencies_finite_elements(name, ents, verb);
492  for (Range::const_pair_iterator p_eit = ents.pair_begin();
493  p_eit != ents.pair_end(); p_eit++) {
494  EntityHandle first = p_eit->first;
495  EntityHandle second = p_eit->second;
496  EntFiniteElement_multiIndex::index<
497  Composite_Name_And_Ent_mi_tag>::type::iterator fit,
498  hi_fit;
499  fit = entsFiniteElements.get<Composite_Name_And_Ent_mi_tag>().lower_bound(
500  boost::make_tuple(name, first));
501  hi_fit =
502  entsFiniteElements.get<Composite_Name_And_Ent_mi_tag>().upper_bound(
503  boost::make_tuple(name, second));
504  fit = entsFiniteElements.get<Composite_Name_And_Ent_mi_tag>().erase(fit,
505  hi_fit);
506  }
508 }
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return() ...
Definition: definitions.h:498
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
Definition: DeleteCore.cpp:510
#define CHKERR
Inline error check.
Definition: definitions.h:617
int verbose
Verbosity level.
Definition: Core.hpp:888
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:443
EntFiniteElement_multiIndex entsFiniteElements
finite element entities
Definition: Core.hpp:252

◆ 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 457 of file DeleteCore.cpp.

459  {
461  if (verb == -1)
462  verb = verbose;
463  Range ents;
464  CHKERR BitRefManager(*this).getEntitiesByRefLevel(bit, mask, ents, verb);
465  CHKERR clear_finite_elements(ents, verb);