33 {
34
35
37
38 try {
39
40
41 moab::Core moab_core;
42 moab::Interface &moab = moab_core;
43
44
47
48
49 DMType dm_name = "DMMOFEM";
51
52
55 {
56
57
59
61
64
68
69
70
71
72
76 vols);
77
80
81
83
85
86 int count_skeleton_fe;
87 int count_side_fe;
88 int count_meshset_fe;
89 int count_meshset_side_fe;
90
92
93
95 op_side_fe->doWorkRhsHook = [&](
DataOperator *op_ptr,
int side,
98 auto domain_op =
static_cast<DomainEleOp *
>(op_ptr);
100
102 << "Side element name [ " << count_side_fe << " ] "
103 << domain_op->getFEName();
104
105 ++count_side_fe;
106
108 };
109
110
111 auto side_fe = boost::make_shared<DomainEle>(m_field);
112 side_fe->getOpPtrVector().push_back(op_side_fe);
113
114
115
120
122 << "Element name [ " << count_skeleton_fe << " ] "
123 << bdy_op->getFEName();
124
127
128 ++count_skeleton_fe;
129
131 };
132
134 op_bdy_fe->doWorkRhsHook = do_work_rhs;
135
137 op_skeleton_fe->doWorkRhsHook = do_work_rhs;
138
139
141 op_meshset_side_fe->doWorkRhsHook =
144 auto domain_op =
static_cast<DomainEleOp *
>(op_ptr);
146
148 << "Side element name [ " << count_side_fe << " ] "
149 << domain_op->getFEName();
150
151 ++count_meshset_side_fe;
152
154 };
155
156 auto meshset_side_fe = boost::make_shared<DomainEle>(m_field);
157 meshset_side_fe->getOpPtrVector().push_back(op_meshset_side_fe);
158
159 auto op_meshset_fe = new ForcesAndSourcesCore::UserDataOperator(
160 "GLOBAL", ForcesAndSourcesCore::UserDataOperator::OPROW);
161 op_meshset_fe->doWorkRhsHook = [&](
DataOperator *op_ptr,
int side,
166 << "Meshset element name " << data.getIndices();
167
170 boost::make_shared<Range>(vols));
171
172 ++count_meshset_fe;
174 };
175
176
177 count_skeleton_fe = 0;
178 count_side_fe = 0;
179 count_meshset_fe = 0;
180 count_meshset_side_fe = 0;
181
186
188 << "Number of elements " << count_skeleton_fe;
190 << "Number of side elements " << count_side_fe;
192 << "Number of meshset elements " << count_meshset_fe;
194 << "Number of meshset side elements " << count_meshset_side_fe;
195
196 if (count_skeleton_fe != 16)
198 "Wrong numbers of FEs");
199 if (count_side_fe != 24)
201 "Wrong numbers of side FEs");
202 if (count_meshset_fe != 1)
204 "Wrong numbers of side FEs");
205 if (count_meshset_side_fe != 8)
207 "Wrong numbers of side FEs");
208 }
209 }
211
212
214
215 return 0;
216}
DomainEle::UserDataOperator DomainEleOp
Finire element operator type.
BoundaryEle::UserDataOperator BoundaryEleOp
#define CATCH_ERRORS
Catch errors.
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base nme:nme847.
@ L2
field with C-1 continuity
@ NOFIELD
scalar or vector of scalars describe (no true field)
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ MOFEM_ATOM_TEST_INVALID
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
PetscErrorCode DMRegister_MoFEM(const char sname[])
Register MoFEM problem.
MoFEMErrorCode loopFiniteElements(SmartPetscObj< DM > dm=nullptr)
Iterate finite elements.
boost::ptr_deque< UserDataOperator > & getOpBoundaryRhsPipeline()
Get the Op Boundary Rhs Pipeline object.
boost::ptr_deque< UserDataOperator > & getOpSkeletonRhsPipeline()
Get the Op Skeleton Rhs Pipeline object.
#define MOFEM_LOG(channel, severity)
Log.
virtual moab::Interface & get_moab()=0
static MoFEMErrorCode Initialize(int *argc, char ***args, const char file[], const char help[])
Initializes the MoFEM database PETSc, MOAB and MPI.
static MoFEMErrorCode Finalize()
Checks for options to be called at the conclusion of the program.
base operator to do operations at Gauss Pt. level
Deprecated interface functions.
Data on single entity (This is passed as argument to DataOperator::doWork)
PipelineManager interface.
boost::ptr_deque< UserDataOperator > & getOpMeshsetRhsPipeline()
Get the Op Meshset Rhs Pipeline object.
Simple interface for fast problem set-up.
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.
bool & getAddBoundaryFE()
Get the addSkeletonFE.
MoFEMErrorCode loadFile(const std::string options, const std::string mesh_file_name, LoadFileFunc loadFunc=defaultLoadFileFunc)
Load mesh file.
MoFEMErrorCode addMeshsetField(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 meshset field.
MoFEMErrorCode getOptions()
get options
MoFEMErrorCode setFieldOrder(const std::string field_name, const int order, const Range *ents=NULL)
Set field order.
auto & getMeshsetFiniteElementEntities()
Get the Domain Fields.
bool & getAddSkeletonFE()
Get the addSkeletonFE.
MoFEMErrorCode setUp(const PetscBool is_partitioned=PETSC_TRUE)
Setup problem.
const std::string getDomainFEName() const
Get the Domain FE Name.
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.