10 *iface =
const_cast<Simple *
>(
this);
16 static_assert(DIM == 2 || DIM == 3,
"not implemented");
26 boost::make_shared<ParentFiniteElementAdjacencyFunctionSkeleton<1>>(
40 boost::make_shared<ParentFiniteElementAdjacencyFunctionSkeleton<2>>(
59 return setSkeletonAdjacency<2>(fe_name);
61 return setSkeletonAdjacency<3>(fe_name);
68 static_assert(DIM == 2 || DIM == 3,
"not implemented");
77 boost::make_shared<ParentFiniteElementAdjacencyFunction<3>>(
80 boost::make_shared<ParentFiniteElementAdjacencyFunction<2>>(
108 boost::make_shared<ParentFiniteElementAdjacencyFunction<2>>(
111 boost::make_shared<ParentFiniteElementAdjacencyFunction<1>>(
134 return setParentAdjacency<2>();
136 return setParentAdjacency<3>();
153 return setSkeletonAdjacency<2>(fe_name);
155 return setSkeletonAdjacency<3>(fe_name);
164 bitLevelMask(
BitRefLevel().set()), meshSet(0), boundaryMeshset(0),
165 skeletonMeshset(0), nameOfProblem(
"SimpleProblem"), domainFE(
"dFE"),
166 boundaryFE(
"bFE"), skeletonFE(
"sFE"), dIm(-1), addSkeletonFE(false),
167 addBoundaryFE(false), addParentAdjacencies(false),
173 PetscLogEventRegister(
"SimpleBuildFiniteElements", 0,
181 PetscBool flg = PETSC_TRUE;
183 ierr = PetscOptionsBegin(PETSC_COMM_WORLD,
"",
"Simple interface options",
186 ierr = PetscOptionsString(
"-file_name",
"file name",
"",
"mesh.h5m",
189 ierr = PetscOptionsEnd();
213 if (nb_ents_3d > 0) {
219 if (nb_ents_2d > 0) {
241 MOFEM_LOG(
"WORLD", Sev::warning) <<
"BitRefLevel is none and not set";
257 "PARALLEL_RESOLVE_SHARED_ENTS;"
258 "PARTITION=PARALLEL_PARTITION;",
267 const TagType tag_type,
const enum MoFEMTypes bh,
272 CHKERR m_field.
add_field(name, space, base, nb_of_cooficients, tag_type, bh,
285 const TagType tag_type,
const enum MoFEMTypes bh,
289 CHKERR m_field.
add_field(name, space, base, nb_of_cooficients, tag_type, bh,
295 "NOFIELD space for boundary filed not implemented in Simple interface");
303 const TagType tag_type,
const enum MoFEMTypes bh,
308 CHKERR m_field.
add_field(name, space, base, nb_of_cooficients, tag_type, bh,
314 "NOFIELD space for boundary filed not implemented in Simple interface");
323 const TagType tag_type,
const enum MoFEMTypes bh,
328 CHKERR m_field.
add_field(name, space, base, nb_of_cooficients, tag_type, bh,
340 auto remove_field_from_list = [&](
auto &vec) {
341 auto it = std::find(vec.begin(), vec.end(), name);
355 auto remove_field_from_list = [&](
auto &vec) {
356 auto it = std::find(vec.begin(), vec.end(), name);
369 auto remove_field_from_list = [&](
auto &vec) {
370 auto it = std::find(vec.begin(), vec.end(), name);
384 auto clear_rows_and_cols = [&](
auto &fe_name) {
388 ->get<FiniteElement_name_mi_tag>();
389 auto it_fe = fe_by_name.find(fe_name);
390 if (it_fe != fe_by_name.end()) {
394 "modification unsuccessful");
398 "modification unsuccessful");
409 auto add_fields = [&](
auto &fe_name,
auto &fields) {
411 for (
auto &field : fields) {
419 auto add_data_fields = [&](
auto &fe_name,
auto &fields) {
421 for (
auto &field : fields)
478 ents == NULL ?
false :
true);
491 auto add_ents_to_field = [&](
auto meshset,
auto dim,
auto &fields) {
493 for (
auto &field : fields) {
495 CHKERR comm_interface_ptr->synchroniseFieldEntities(field, 0);
500 auto make_no_field_ents = [&](
auto &fields) {
502 for (
auto &field : fields) {
503 std::array<double, 6> coords = {0, 0, 0, 0, 0, 0};
505 CHKERR comm_interface_ptr->makeFieldEntitiesMultishared(field, 0);
516 std::set<std::string> nofield_fields;
518 nofield_fields.insert(f);
520 nofield_fields.insert(f);
522 CHKERR make_no_field_ents(nofield_fields);
528 const auto f = std::get<0>(
t);
529 const auto order = std::get<1>(
t);
532 <<
"Set order to field " << f <<
" order " <<
order;
534 if (std::get<3>(
t)) {
536 <<
"To ents: " << std::endl
537 << std::get<2>(
t) << std::endl;
541 if (std::get<3>(
t)) {
546 auto f_ptr = get_field_ptr(f);
548 if (f_ptr->getSpace() ==
H1) {
556 for (
auto d = 1; d <=
dIm; ++d) {
558 t <= CN::TypeDimensionMap[d].second; ++
t) {
589 for (std::vector<std::string>::iterator fit =
otherFEs.begin();
652 const auto problem_name = problem_ptr->
getName();
703 const std::string col_field)
const {
714 ParallelComm *pcomm =
717 auto get_skin = [&](
auto meshset) {
723 CHKERR pcomm->filter_pstatus(domain_ents,
724 PSTATUS_SHARED | PSTATUS_MULTISHARED,
725 PSTATUS_NOT, -1,
nullptr);
729 CHKERR skin.find_skin(0, domain_ents,
false, domain_skin);
730 CHKERR pcomm->filter_pstatus(domain_skin,
731 PSTATUS_SHARED | PSTATUS_MULTISHARED,
732 PSTATUS_NOT, -1,
nullptr);
736 auto create_boundary_meshset = [&](
auto &&domain_skin) {
744 for (
int dd = 0; dd !=
dIm - 1; dd++) {
746 CHKERR m_field.
get_moab().get_adjacencies(domain_skin, dd,
false, adj,
747 moab::Interface::UNION);
762 ParallelComm *pcomm =
765 auto create_skeleton_meshset = [&](
auto meshset) {
771 Range boundary_ents, skeleton_ents;
773 dIm - 1, boundary_ents);
778 domain_ents,
dIm - 1,
false, skeleton_ents, moab::Interface::UNION);
779 skeleton_ents = subtract(skeleton_ents, boundary_ents);
780 CHKERR pcomm->filter_pstatus(skeleton_ents, PSTATUS_NOT_OWNED, PSTATUS_NOT,
795 MOFEM_LOG(
"WORLD", Sev::verbose) <<
"Exchange ghost cells";
797 ParallelComm *pcomm =
808 for (
auto d =
dIm - 1; d >= 0; --d) {
809 CHKERR m_field.
get_moab().get_adjacencies(shared, d,
false, shared,
810 moab::Interface::UNION);
812 CHKERR pcomm->filter_pstatus(shared, PSTATUS_SHARED | PSTATUS_MULTISHARED,
813 PSTATUS_OR, -1, &shared);
814 Tag part_tag = pcomm->part_tag();
815 CHKERR pcomm->exchange_tags(part_tag, shared);
#define MOFEM_LOG_SEVERITY_SYNC(comm, severity)
Synchronise "SYNC" on curtain severity level.
#define MOFEM_TAG_AND_LOG(channel, severity, tag)
Tag and log in channel.
MoFEMTypes
Those types control how functions respond on arguments, f.e. error handling.
FieldApproximationBase
approximation base
@ AINSWORTH_BERNSTEIN_BEZIER_BASE
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
FieldSpace
approximation spaces
@ NOFIELD
scalar or vector of scalars describe (no true field)
#define MYPCOMM_INDEX
default communicator number PCOMM
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define CHKERRG(n)
Check error code of MoFEM/MOAB/PETSc function.
@ MOFEM_OPERATION_UNSUCCESSFUL
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define THROW_MESSAGE(msg)
Throw MoFEM exception.
PetscErrorCode DMMoFEMSetIsPartitioned(DM dm, PetscBool is_partitioned)
PetscErrorCode DMMoFEMAddElement(DM dm, std::string fe_name)
add element to dm
PetscErrorCode DMMoFEMCreateMoFEM(DM dm, MoFEM::Interface *m_field_ptr, const char problem_name[], const MoFEM::BitRefLevel bit_level, const MoFEM::BitRefLevel bit_mask=MoFEM::BitRefLevel().set())
Must be called by user to set MoFEM data structures.
PetscErrorCode DMMoFEMGetProblemPtr(DM dm, const MoFEM::Problem **problem_ptr)
Get pointer to problem data structure.
PetscErrorCode DMSetUp_MoFEM(DM dm)
multi_index_container< boost::shared_ptr< FiniteElement >, indexed_by< hashed_unique< tag< FiniteElement_Meshset_mi_tag >, member< FiniteElement, EntityHandle, &FiniteElement::meshset > >, hashed_unique< tag< BitFEId_mi_tag >, const_mem_fun< FiniteElement, BitFEId, &FiniteElement::getId >, HashBit< BitFEId >, EqBit< BitFEId > >, ordered_unique< tag< FiniteElement_name_mi_tag >, const_mem_fun< FiniteElement, boost::string_ref, &FiniteElement::getNameRef > > > > FiniteElement_multiIndex
MultiIndex for entities for FiniteElement.
virtual const FiniteElement_multiIndex * get_finite_elements() const =0
Get the finite elements object.
virtual MoFEMErrorCode add_ents_to_finite_element_by_dim(const EntityHandle entities, const int dim, const std::string &name, const bool recursive=true)=0
add entities to finite element
virtual MoFEMErrorCode add_finite_element(const std::string &fe_name, enum MoFEMTypes bh=MF_EXCL, int verb=DEFAULT_VERBOSITY)=0
add finite element
virtual MoFEMErrorCode build_finite_elements(int verb=DEFAULT_VERBOSITY)=0
Build finite elements.
virtual MoFEMErrorCode modify_finite_element_add_field_col(const std::string &fe_name, const std::string name_row)=0
set field col which finite element use
virtual MoFEMErrorCode modify_finite_element_adjacency_table(const std::string &fe_name, const EntityType type, ElementAdjacencyFunct function)=0
modify finite element table, only for advanced user
virtual MoFEMErrorCode modify_finite_element_add_field_data(const std::string &fe_name, const std::string name_filed)=0
set finite element field data
virtual MoFEMErrorCode modify_finite_element_add_field_row(const std::string &fe_name, const std::string name_row)=0
set field row which finite element use
virtual const Field * get_field_structure(const std::string &name, enum MoFEMTypes bh=MF_EXIST) const =0
get field structure
virtual MoFEMErrorCode build_fields(int verb=DEFAULT_VERBOSITY)=0
virtual MoFEMErrorCode add_ents_to_field_by_dim(const Range &ents, const int dim, const std::string &name, int verb=DEFAULT_VERBOSITY)=0
Add entities to field meshset.
virtual MoFEMErrorCode set_field_order(const EntityHandle meshset, const EntityType type, const std::string &name, const ApproximationOrder order, int verb=DEFAULT_VERBOSITY)=0
Set order approximation of the entities in the field.
#define MOFEM_LOG(channel, severity)
Log.
#define MOFEM_LOG_CHANNEL(channel)
Set and reset channel.
virtual MoFEMErrorCode modify_problem_mask_ref_level_set_bit(const std::string &name_problem, const BitRefLevel &bit)=0
set dof mask ref level for problem
virtual MoFEMErrorCode modify_problem_ref_level_set_bit(const std::string &name_problem, const BitRefLevel &bit)=0
set ref level for problem
static MoFEMErrorCodeGeneric< PetscErrorCode > ierr
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
int FieldCoefficientsNumber
Number of field coefficients.
std::bitset< BITREFLEVEL_SIZE > BitRefLevel
Bit structure attached to each entity identifying to what mesh entity is attached.
implementation of Data Operators for Forces and Sources
PetscObject getPetscObject(T obj)
auto createDM(MPI_Comm comm, const std::string dm_type_name)
Creates smart DM object.
constexpr double t
plate stiffness
constexpr auto field_name
virtual int get_comm_size() const =0
virtual moab::Interface & get_moab()=0
virtual bool check_finite_element(const std::string &name) const =0
Check if finite element is in database.
virtual MoFEMErrorCode build_adjacencies(const Range &ents, int verb=DEFAULT_VERBOSITY)=0
build adjacencies
virtual MPI_Comm & get_comm() const =0
virtual MoFEMErrorCode delete_finite_element(const std::string name, int verb=DEFAULT_VERBOSITY)=0
delete finite element from mofem database
virtual MoFEMErrorCode add_field(const std::string &name, const FieldSpace space, const FieldApproximationBase base, const FieldCoefficientsNumber nb_of_coefficients, const TagType tag_type=MB_TAG_SPARSE, const enum MoFEMTypes bh=MF_EXCL, int verb=DEFAULT_VERBOSITY)=0
Add field.
virtual MoFEMErrorCode rebuild_database(int verb=DEFAULT_VERBOSITY)=0
Clear database and initialize it once again.
virtual MoFEMErrorCode create_vertices_and_add_to_field(const std::string name, const double coords[], int size, int verb=DEFAULT_VERBOSITY)=0
Create a vertices and add to field object.
Deprecated interface functions.
keeps basic data about problem
Problem manager is used to build and partition problems.
Simple interface for fast problem set-up.
boost::shared_ptr< ParentFiniteElementAdjacencyFunction< 2 > > parentAdjFunctionDim2
EntityHandle boundaryMeshset
meshset with boundary
MoFEMErrorCode buildProblem()
Build problem.
std::vector< std::string > dataFields
Data fields.
MoFEMErrorCode setParentAdjacency()
std::list< std::tuple< std::string, int, Range, bool > > fieldsOrder
std::vector< std::string > domainFields
domain fields
MoFEMErrorCode removeDomainField(const std::string &name)
Remove field form domain.
MoFEMErrorCode defineFiniteElements()
Define finite elements.
BitRefLevel bitAdjEnt
bit ref level for parent
char meshFileName[255]
mesh file name
EntityHandle meshSet
domain meshset
int getDim() const
Get the problem dimension.
std::vector< std::string > otherFEs
Other finite elements.
MoFEMErrorCode buildFiniteElements()
Build finite elements.
boost::shared_ptr< ParentFiniteElementAdjacencyFunctionSkeleton< 2 > > parentAdjSkeletonFunctionDim2
MoFEMErrorCode addDataField(const std::string &name, const FieldSpace space, const FieldApproximationBase base, const FieldCoefficientsNumber nb_of_coefficients, const TagType tag_type=MB_TAG_SPARSE, const enum MoFEMTypes bh=MF_ZERO, int verb=-1)
Add field on domain.
MoFEMErrorCode exchangeGhostCells()
PetscLogEvent MOFEM_EVENT_SimpleBuildFields
PetscLogEvent MOFEM_EVENT_SimpleLoadMesh
MoFEMErrorCode addDomainField(const std::string &name, const FieldSpace space, const FieldApproximationBase base, const FieldCoefficientsNumber nb_of_coefficients, const TagType tag_type=MB_TAG_SPARSE, const enum MoFEMTypes bh=MF_ZERO, int verb=-1)
Add field on domain.
MoFEMErrorCode reSetUp(bool only_dm=false)
Rebuild internal MoFEM data structures.
std::vector< std::string > noFieldFields
NOFIELD field name.
bool addSkeletonFE
Add skeleton FE.
BitRefLevel bitAdjParent
bit ref level for parent
bool addBoundaryFE
Add boundary FE.
MoFEMErrorCode addFieldToEmptyFieldBlocks(const std::string row_field, const std::string col_field) const
add empty block to problem
std::string skeletonFE
skeleton finite element
std::vector< std::string > noFieldDataFields
NOFIELD field name.
std::string boundaryFE
boundary finite element
std::string nameOfProblem
problem name
boost::shared_ptr< ParentFiniteElementAdjacencyFunction< 3 > > parentAdjFunctionDim3
MoFEMErrorCode getOptions()
get options
std::string domainFE
domain finite element
std::vector< std::string > boundaryFields
boundary fields
boost::shared_ptr< ParentFiniteElementAdjacencyFunctionSkeleton< 1 > > parentAdjSkeletonFunctionDim1
BitRefLevel bitAdjEntMask
bit ref level for parent parent
SmartPetscObj< DM > dM
Discrete manager (interface to PETSc/MoFEM functions)
MoFEMErrorCode buildFields()
Build fields.
SmartPetscObj< DM > getDM()
Return smart DM object.
MoFEMErrorCode loadFile(const std::string options, const std::string mesh_file_name)
Load mesh file.
BitRefLevel bitLevel
BitRefLevel of the problem.
MoFEMErrorCode setFieldOrder(const std::string field_name, const int order, const Range *ents=NULL)
Set field order.
MoFEMErrorCode addBoundaryField(const std::string &name, const FieldSpace space, const FieldApproximationBase base, const FieldCoefficientsNumber nb_of_coefficients, const TagType tag_type=MB_TAG_SPARSE, const enum MoFEMTypes bh=MF_ZERO, int verb=-1)
Add field on boundary.
MoFEMErrorCode defineProblem(const PetscBool is_partitioned=PETSC_TRUE)
define problem
std::vector< std::string > skeletonFields
fields on the skeleton
MoFEMErrorCode addSkeletonField(const std::string &name, const FieldSpace space, const FieldApproximationBase base, const FieldCoefficientsNumber nb_of_coefficients, const TagType tag_type=MB_TAG_SPARSE, const enum MoFEMTypes bh=MF_ZERO, int verb=-1)
Add field on skeleton.
MoFEMErrorCode removeSkeletonField(const std::string &name)
Remove field form skeleton.
MoFEMErrorCode query_interface(boost::typeindex::type_index type_index, UnknownInterface **iface) const
MoFEMErrorCode setUp(const PetscBool is_partitioned=PETSC_TRUE)
Setup problem.
MoFEMErrorCode removeBoundaryField(const std::string &name)
Remove field form boundary.
const std::string getProblemName() const
Get the Problem Name.
int dIm
dimension of problem
MoFEMErrorCode setSkeletonAdjacency(int dim=-1, std::string fe_name="")
Set the skeleton adjacency object.
MoFEMErrorCode deleteDM()
Delete dm.
PetscLogEvent MOFEM_EVENT_SimpleSetUP
PetscLogEvent MOFEM_EVENT_SimpleKSPSolve
MoFEMErrorCode createBoundaryMeshset()
PetscLogEvent MOFEM_EVENT_SimpleBuildFiniteElements
BitRefLevel bitLevelMask
BitRefLevel of the problem.
BitRefLevel bitAdjParentMask
bit ref level for parent parent
PetscLogEvent MOFEM_EVENT_SimpleBuildProblem
boost::shared_ptr< ParentFiniteElementAdjacencyFunction< 1 > > parentAdjFunctionDim1
MoFEMErrorCode deleteFiniteElements()
Delete finite elements.
Simple(const MoFEM::Core &core)
EntityHandle skeletonMeshset
skeleton meshset with boundary
MoFEMErrorCode createSkeletonMeshset()
bool addParentAdjacencies
If set to true parent adjacencies are build.
base class for all interface classes
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface refernce to pointer of interface.