v0.15.0
Loading...
Searching...
No Matches
Poisson2DHomogeneous Struct Reference
Collaboration diagram for Poisson2DHomogeneous:
[legend]

Public Member Functions

 Poisson2DHomogeneous (MoFEM::Interface &m_field)
 
MoFEMErrorCode runProgram ()
 [Check]
 

Private Types

enum  NORMS { NORM = 0 , LAST_NORM }
 

Private Member Functions

MoFEMErrorCode readMesh ()
 [Read mesh]
 
MoFEMErrorCode setupProblem ()
 [Read mesh]
 
MoFEMErrorCode boundaryCondition ()
 [Setup problem]
 
MoFEMErrorCode assembleSystem ()
 [Boundary condition]
 
MoFEMErrorCode setIntegrationRules ()
 [Assemble system]
 
MoFEMErrorCode solveSystem ()
 [Set integration rules]
 
MoFEMErrorCode outputResults ()
 [Solve system]
 
MoFEMErrorCode checkResults ()
 [Output results]
 

Static Private Member Functions

static double sourceTermFunction (const double x, const double y, const double z)
 

Private Attributes

SimplesimpleInterface
 
MoFEM::InterfacemField
 
int oRder
 
SmartPetscObj< Vec > petscVec
 
int atom_test = 0
 

Detailed Description

Examples
poisson_2d_homogeneous.cpp.

Definition at line 27 of file poisson_2d_homogeneous.cpp.

Member Enumeration Documentation

◆ NORMS

Constructor & Destructor Documentation

◆ Poisson2DHomogeneous()

Poisson2DHomogeneous::Poisson2DHomogeneous ( MoFEM::Interface & m_field)
Examples
poisson_2d_homogeneous.cpp.

Definition at line 62 of file poisson_2d_homogeneous.cpp.

63 : mField(m_field) {}

Member Function Documentation

◆ assembleSystem()

MoFEMErrorCode Poisson2DHomogeneous::assembleSystem ( )
private

[Boundary condition]

[Assemble system]

Examples
poisson_2d_homogeneous.cpp.

Definition at line 148 of file poisson_2d_homogeneous.cpp.

148 {
150
151 auto pipeline_mng = mField.getInterface<PipelineManager>();
152
153 { // Push operators to the Pipeline that is responsible for calculating LHS
155 pipeline_mng->getOpDomainLhsPipeline(), {H1});
156 pipeline_mng->getOpDomainLhsPipeline().push_back(
158 }
159
160 { // Push operators to the Pipeline that is responsible for calculating RHS
161
162 auto set_values_to_bc_dofs = [&](auto &fe) {
163 auto get_bc_hook = [&]() {
165 return hook;
166 };
167 fe->preProcessHook = get_bc_hook();
168 };
169
170 // you can skip that if boundary condition is prescribing zero
171 auto calculate_residual_from_set_values_on_bc = [&](auto &pipeline) {
172 using DomainEle =
174 using DomainEleOp = DomainEle::UserDataOperator;
177
178 auto grad_u_vals_ptr = boost::make_shared<MatrixDouble>();
179 pipeline_mng->getOpDomainRhsPipeline().push_back(
181 grad_u_vals_ptr));
182 pipeline_mng->getOpDomainRhsPipeline().push_back(
183 new OpInternal(field_name, grad_u_vals_ptr,
184 [](double, double, double) constexpr { return -1; }));
185 };
186
188 pipeline_mng->getOpDomainRhsPipeline(), {H1});
189 set_values_to_bc_dofs(pipeline_mng->getDomainRhsFE());
190 calculate_residual_from_set_values_on_bc(
191 pipeline_mng->getOpDomainRhsPipeline());
192 pipeline_mng->getOpDomainRhsPipeline().push_back(
194 }
195
197}
ElementsAndOps< SPACE_DIM >::DomainEle DomainEle
[Define dimension]
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpGradGrad< BASE_DIM, FIELD_DIM, SPACE_DIM > OpDomainLhsMatrixK
constexpr auto field_name
constexpr int SPACE_DIM
Add operators pushing bases from local to physical configuration.
Class (Function) to enforce essential constrains.
Definition Essential.hpp:25
Get field gradients at integration pts for scalar field rank 0, i.e. vector field.
PipelineManager interface.
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.
static double sourceTermFunction(const double x, const double y, const double z)

◆ boundaryCondition()

MoFEMErrorCode Poisson2DHomogeneous::boundaryCondition ( )
private

[Setup problem]

[Boundary condition]

Examples
poisson_2d_homogeneous.cpp.

Definition at line 132 of file poisson_2d_homogeneous.cpp.

132 {
134
135 auto bc_mng = mField.getInterface<BcManager>();
136
137 // Remove BCs from blockset name "BOUNDARY_CONDITION" or SETU, note that you
138 // can use regular expression to put list of blocksets;
140 simpleInterface->getProblemName(), "(BOUNDARY_CONDITION|SETU)",
141 std::string(field_name), true);
142
144}
Simple interface for fast problem set-up.
Definition BcManager.hpp:29
MoFEMErrorCode removeBlockDOFsOnEntities(const std::string problem_name, const std::string block_name, const std::string field_name, int lo, int hi, bool get_low_dim_ents=true, bool is_distributed_mesh=true)
Remove DOFs from problem.
Definition BcManager.cpp:72
const std::string getProblemName() const
Get the Problem Name.
Definition Simple.hpp:410

◆ checkResults()

MoFEMErrorCode Poisson2DHomogeneous::checkResults ( )
private

[Output results]

[Check]

Examples
poisson_2d_homogeneous.cpp.

Definition at line 289 of file poisson_2d_homogeneous.cpp.

289 {
291
292 auto check_result_fe_ptr = boost::make_shared<DomainEle>(mField);
293 auto petscVec =
295 (mField.get_comm_rank() == 0) ? LAST_NORM : 0, LAST_NORM);
296
298 check_result_fe_ptr->getOpPtrVector(), {H1})),
299 "Apply transform");
300
301 check_result_fe_ptr->getRuleHook = [](int, int, int p) { return p; };
302 auto analyticalFunction = [&](double x, double y, double z) {
303 return sin(M_PI * x) * sin(M_PI * y);
304 };
305
306 auto u_ptr = boost::make_shared<VectorDouble>();
307
308 check_result_fe_ptr->getOpPtrVector().push_back(
310 auto mValFuncPtr = boost::make_shared<VectorDouble>();
311 check_result_fe_ptr->getOpPtrVector().push_back(
312 new OpGetTensor0fromFunc(mValFuncPtr, analyticalFunction));
313 check_result_fe_ptr->getOpPtrVector().push_back(
314 new OpCalcNormL2Tensor0(u_ptr, petscVec, NORM, mValFuncPtr));
315 CHKERR VecZeroEntries(petscVec);
318 check_result_fe_ptr);
319 CHKERR VecAssemblyBegin(petscVec);
320 CHKERR VecAssemblyEnd(petscVec);
321 MOFEM_LOG_CHANNEL("SELF"); // Clear channel from old tags
322 // print norm in general log
323 if (mField.get_comm_rank() == 0) {
324 const double *norms;
325 CHKERR VecGetArrayRead(petscVec, &norms);
326 MOFEM_TAG_AND_LOG("SELF", Sev::inform, "Errors")
327 << "NORM: " << std::sqrt(norms[NORM]);
328 CHKERR VecRestoreArrayRead(petscVec, &norms);
329 }
330 // compare norm for ctest
331 if (atom_test && !mField.get_comm_rank()) {
332 const double *t_ptr;
333 CHKERR VecGetArrayRead(petscVec, &t_ptr);
334 double ref_norm = 2.2e-04;
335 double cal_norm;
336 switch (atom_test) {
337 case 1: // 2D
338 cal_norm = sqrt(t_ptr[0]);
339 break;
340 default:
341 SETERRQ(PETSC_COMM_SELF, MOFEM_INVALID_DATA,
342 "atom test %d does not exist", atom_test);
343 }
344 if (cal_norm > ref_norm) {
345 SETERRQ(PETSC_COMM_SELF, MOFEM_ATOM_TEST_INVALID,
346 "atom test %d failed! Calculated Norm %3.16e is greater than "
347 "reference Norm %3.16e",
348 atom_test, cal_norm, ref_norm);
349 }
350 CHKERR VecRestoreArrayRead(petscVec, &t_ptr);
351 }
353}
#define MOFEM_TAG_AND_LOG(channel, severity, tag)
Tag and log in channel.
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
@ MOFEM_ATOM_TEST_INVALID
Definition definitions.h:40
@ MOFEM_INVALID_DATA
Definition definitions.h:36
PetscErrorCode DMoFEMLoopFiniteElements(DM dm, const char fe_name[], MoFEM::FEMethod *method, CacheTupleWeakPtr cache_ptr=CacheTupleSharedPtr())
Executes FEMethod for finite elements in DM.
Definition DMMoFEM.cpp:576
#define MOFEM_LOG_CHANNEL(channel)
Set and reset channel.
auto createVectorMPI(MPI_Comm comm, PetscInt n, PetscInt N)
Create MPI Vector.
virtual MPI_Comm & get_comm() const =0
virtual int get_comm_rank() const =0
Get norm of input VectorDouble for Tensor0.
Get value at integration points for scalar field.
Get values from scalar function at integration points and save them to VectorDouble for Tensor0.
MoFEMErrorCode getDM(DM *dm)
Get DM.
Definition Simple.cpp:800
const std::string getDomainFEName() const
Get the Domain FE Name.
Definition Simple.hpp:389
SmartPetscObj< Vec > petscVec

◆ outputResults()

MoFEMErrorCode Poisson2DHomogeneous::outputResults ( )
private

[Solve system]

[Output results]

Examples
poisson_2d_homogeneous.cpp.

Definition at line 243 of file poisson_2d_homogeneous.cpp.

243 {
245
246 auto pipeline_mng = mField.getInterface<PipelineManager>();
247 pipeline_mng->getDomainLhsFE().reset();
248
249 auto post_proc_fe = boost::make_shared<PostProcFaceEle>(mField);
251 post_proc_fe->getOpPtrVector(), {H1});
252
253 auto u_ptr = boost::make_shared<VectorDouble>();
254 auto grad_u_ptr = boost::make_shared<MatrixDouble>();
255 post_proc_fe->getOpPtrVector().push_back(
257
258 post_proc_fe->getOpPtrVector().push_back(
260
262
263 post_proc_fe->getOpPtrVector().push_back(
264
265 new OpPPMap(post_proc_fe->getPostProcMesh(),
266 post_proc_fe->getMapGaussPts(),
267
268 OpPPMap::DataMapVec{{"U", u_ptr}},
269
270 OpPPMap::DataMapMat{{"GRAD_U", grad_u_ptr}},
271
273
275
276 )
277
278 );
279
280 pipeline_mng->getDomainRhsFE() = post_proc_fe;
281 CHKERR pipeline_mng->loopFiniteElements();
282 CHKERR post_proc_fe->writeFile("out_result.h5m");
283
285}
OpPostProcMapInMoab< SPACE_DIM, SPACE_DIM > OpPPMap
Post post-proc data at points from hash maps.
std::map< std::string, boost::shared_ptr< MatrixDouble > > DataMapMat
std::map< std::string, boost::shared_ptr< VectorDouble > > DataMapVec
boost::shared_ptr< FEMethod > & getDomainLhsFE()

◆ readMesh()

MoFEMErrorCode Poisson2DHomogeneous::readMesh ( )
private

[Read mesh]

Examples
poisson_2d_homogeneous.cpp.

Definition at line 66 of file poisson_2d_homogeneous.cpp.

66 {
68
72
74}
MoFEMErrorCode loadFile(const std::string options, const std::string mesh_file_name, LoadFileFunc loadFunc=defaultLoadFileFunc)
Load mesh file.
Definition Simple.cpp:191
MoFEMErrorCode getOptions()
get options
Definition Simple.cpp:180

◆ runProgram()

MoFEMErrorCode Poisson2DHomogeneous::runProgram ( )

[Check]

[Run program]

Examples
poisson_2d_homogeneous.cpp.

Definition at line 357 of file poisson_2d_homogeneous.cpp.

357 {
359
368
370}
MoFEMErrorCode setupProblem()
[Read mesh]
MoFEMErrorCode boundaryCondition()
[Setup problem]
MoFEMErrorCode readMesh()
[Read mesh]
MoFEMErrorCode checkResults()
[Output results]
MoFEMErrorCode outputResults()
[Solve system]
MoFEMErrorCode assembleSystem()
[Boundary condition]
MoFEMErrorCode solveSystem()
[Set integration rules]
MoFEMErrorCode setIntegrationRules()
[Assemble system]

◆ setIntegrationRules()

MoFEMErrorCode Poisson2DHomogeneous::setIntegrationRules ( )
private

[Assemble system]

[Set integration rules]

Examples
poisson_2d_homogeneous.cpp.

Definition at line 201 of file poisson_2d_homogeneous.cpp.

201 {
203
204 auto rule_lhs = [](int, int, int p) -> int { return 2 * (p - 1); };
205 auto rule_rhs = [](int, int, int p) -> int { return p; };
206
207 auto pipeline_mng = mField.getInterface<PipelineManager>();
208 CHKERR pipeline_mng->setDomainLhsIntegrationRule(rule_lhs);
209 CHKERR pipeline_mng->setDomainRhsIntegrationRule(rule_rhs);
210
212}
MoFEMErrorCode setDomainLhsIntegrationRule(RuleHookFun rule)

◆ setupProblem()

MoFEMErrorCode Poisson2DHomogeneous::setupProblem ( )
private

[Read mesh]

[Setup problem]

Examples
poisson_2d_homogeneous.cpp.

Definition at line 78 of file poisson_2d_homogeneous.cpp.

78 {
80 Range domain_ents;
81 CHKERR mField.get_moab().get_entities_by_dimension(0, SPACE_DIM, domain_ents,
82 true);
83 auto get_ents_by_dim = [&](const auto dim) {
84 if (dim == SPACE_DIM) {
85 return domain_ents;
86 } else {
87 Range ents;
88 if (dim == 0)
89 CHKERR mField.get_moab().get_connectivity(domain_ents, ents, true);
90 else
91 CHKERR mField.get_moab().get_entities_by_dimension(0, dim, ents, true);
92 return ents;
93 }
94 };
95
96 // Select base
97 auto get_base = [&]() {
98 auto domain_ents = get_ents_by_dim(SPACE_DIM);
99 if (domain_ents.empty())
100 CHK_THROW_MESSAGE(MOFEM_NOT_FOUND, "Empty mesh");
101 const auto type = type_from_handle(domain_ents[0]);
102 switch (type) {
103 case MBQUAD:
105 case MBHEX:
107 case MBTRI:
109 case MBTET:
111 default:
112 CHK_THROW_MESSAGE(MOFEM_NOT_FOUND, "Element type not handled");
113 }
114 return NOBASE;
115 };
116 auto base = get_base();
118
119 int oRder = 3;
120 CHKERR PetscOptionsGetInt(PETSC_NULLPTR, "", "-order", &oRder, PETSC_NULLPTR);
121 CHKERR PetscOptionsGetInt(PETSC_NULLPTR, "", "-atom_test", &atom_test,
122 PETSC_NULLPTR);
124
126
128}
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base nme:nme847.
Definition definitions.h:60
@ NOBASE
Definition definitions.h:59
@ DEMKOWICZ_JACOBI_BASE
Definition definitions.h:66
@ H1
continuous field
Definition definitions.h:85
@ MOFEM_NOT_FOUND
Definition definitions.h:33
auto type_from_handle(const EntityHandle h)
get type from entity handle
PetscErrorCode PetscOptionsGetInt(PetscOptions *, const char pre[], const char name[], PetscInt *ivalue, PetscBool *set)
virtual moab::Interface & get_moab()=0
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.
Definition Simple.cpp:261
MoFEMErrorCode setFieldOrder(const std::string field_name, const int order, const Range *ents=NULL)
Set field order.
Definition Simple.cpp:575
MoFEMErrorCode setUp(const PetscBool is_partitioned=PETSC_TRUE)
Setup problem.
Definition Simple.cpp:736

◆ solveSystem()

MoFEMErrorCode Poisson2DHomogeneous::solveSystem ( )
private

[Set integration rules]

[Solve system]

Examples
poisson_2d_homogeneous.cpp.

Definition at line 216 of file poisson_2d_homogeneous.cpp.

216 {
218
219 auto pipeline_mng = mField.getInterface<PipelineManager>();
220
221 auto ksp_solver = pipeline_mng->createKSP();
222 CHKERR KSPSetFromOptions(ksp_solver);
223 CHKERR KSPSetUp(ksp_solver);
224
225 // Create RHS and solution vectors
226 auto dm = simpleInterface->getDM();
227 auto F = createDMVector(dm);
228 auto D = vectorDuplicate(F);
229
230 // Solve the system
231 CHKERR KSPSolve(ksp_solver, F, D);
232
233 // Scatter result data on the mesh
234 CHKERR VecGhostUpdateBegin(D, INSERT_VALUES, SCATTER_FORWARD);
235 CHKERR VecGhostUpdateEnd(D, INSERT_VALUES, SCATTER_FORWARD);
236 CHKERR DMoFEMMeshToLocalVector(dm, D, INSERT_VALUES, SCATTER_REVERSE);
237
239}
@ F
PetscErrorCode DMoFEMMeshToLocalVector(DM dm, Vec l, InsertMode mode, ScatterMode scatter_mode)
set local (or ghosted) vector values on mesh for partition only
Definition DMMoFEM.cpp:514
auto createDMVector(DM dm)
Get smart vector from DM.
Definition DMMoFEM.hpp:1102
SmartPetscObj< KSP > createKSP(SmartPetscObj< DM > dm=nullptr)
Create KSP (linear) solver.
double D
SmartPetscObj< Vec > vectorDuplicate(Vec vec)
Create duplicate vector of smart vector.

◆ sourceTermFunction()

static double Poisson2DHomogeneous::sourceTermFunction ( const double x,
const double y,
const double z )
inlinestaticprivate
Examples
poisson_2d_homogeneous.cpp.

Definition at line 52 of file poisson_2d_homogeneous.cpp.

53 {
54 return 2. * M_PI * M_PI * sin(M_PI * x) * sin(M_PI * y);
55 }

Member Data Documentation

◆ atom_test

int Poisson2DHomogeneous::atom_test = 0
private
Examples
poisson_2d_homogeneous.cpp.

Definition at line 58 of file poisson_2d_homogeneous.cpp.

◆ mField

MoFEM::Interface& Poisson2DHomogeneous::mField
private
Examples
poisson_2d_homogeneous.cpp.

Definition at line 48 of file poisson_2d_homogeneous.cpp.

◆ oRder

int Poisson2DHomogeneous::oRder
private
Examples
poisson_2d_homogeneous.cpp.

Definition at line 50 of file poisson_2d_homogeneous.cpp.

◆ petscVec

SmartPetscObj<Vec> Poisson2DHomogeneous::petscVec
private
Examples
poisson_2d_homogeneous.cpp.

Definition at line 57 of file poisson_2d_homogeneous.cpp.

◆ simpleInterface

Simple* Poisson2DHomogeneous::simpleInterface
private
Examples
poisson_2d_homogeneous.cpp.

Definition at line 46 of file poisson_2d_homogeneous.cpp.


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