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

Public Member Functions

 NonlinearPoisson (MoFEM::Interface &m_field)
 
MoFEMErrorCode runProgram ()
 

Private Types

enum  NORMS { NORM = 0 , LAST_NORM }
 
enum  EX_NORMS { EX_NORM = 0 , LAST_EX_NORM }
 
using PostProcEle = PostProcBrokenMeshInMoab<DomainEle>
 

Private Member Functions

MoFEMErrorCode readMesh ()
 
MoFEMErrorCode setupProblem ()
 
MoFEMErrorCode setIntegrationRules ()
 
MoFEMErrorCode boundaryCondition ()
 
MoFEMErrorCode assembleSystem ()
 
MoFEMErrorCode solveSystem ()
 
MoFEMErrorCode outputResults ()
 
MoFEMErrorCode checkResults ()
 [Check]
 

Static Private Member Functions

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

Private Attributes

MoFEM::InterfacemField
 
SimplesimpleInterface
 
std::string domainField = "POTENTIAL"
 
int order
 
SmartPetscObj< Vec > errorVec
 
SmartPetscObj< Vec > exactVec
 
int atomTest = 0
 
boost::shared_ptr< std::vector< unsigned char > > boundaryMarker
 
boost::shared_ptr< PostProcElepostProc
 
Range boundaryEntitiesForFieldsplit
 

Detailed Description

Definition at line 15 of file nonlinear_poisson_2d.cpp.

Member Typedef Documentation

◆ PostProcEle

Member Enumeration Documentation

◆ EX_NORMS

Enumerator
EX_NORM 
LAST_EX_NORM 

Definition at line 64 of file nonlinear_poisson_2d.cpp.

◆ NORMS

Enumerator
NORM 
LAST_NORM 

Definition at line 63 of file nonlinear_poisson_2d.cpp.

Constructor & Destructor Documentation

◆ NonlinearPoisson()

NonlinearPoisson::NonlinearPoisson ( MoFEM::Interface & m_field)

Definition at line 78 of file nonlinear_poisson_2d.cpp.

79 : mField(m_field) {}
MoFEM::Interface & mField

Member Function Documentation

◆ assembleSystem()

MoFEMErrorCode NonlinearPoisson::assembleSystem ( )
private

Definition at line 219 of file nonlinear_poisson_2d.cpp.

219 {
221
222 auto pipeline_mng = mField.getInterface<PipelineManager>();
223 CHKERR AddHOOps<2, 2, 2>::add(pipeline_mng->getOpDomainLhsPipeline(), {H1});
224 CHKERR AddHOOps<2, 2, 2>::add(pipeline_mng->getOpDomainRhsPipeline(), {H1});
225
226 auto add_domain_lhs_ops = [&](auto &pipeline) {
227 pipeline.push_back(new OpSetBc(domainField, true, boundaryMarker));
228 auto data_u_at_gauss_pts = boost::make_shared<VectorDouble>();
229 auto grad_u_at_gauss_pts = boost::make_shared<MatrixDouble>();
230 pipeline.push_back(
231 new OpCalculateScalarFieldValues(domainField, data_u_at_gauss_pts));
232 pipeline.push_back(new OpCalculateScalarFieldGradient<2>(
233 domainField, grad_u_at_gauss_pts));
234 pipeline.push_back(new OpDomainLhs(
235 domainField, domainField, data_u_at_gauss_pts, grad_u_at_gauss_pts));
236 pipeline.push_back(new OpUnSetBc(domainField));
237 };
238
239 auto add_domain_rhs_ops = [&](auto &pipeline) {
240 pipeline.push_back(new OpSetBc(domainField, true, boundaryMarker));
241 auto data_u_at_gauss_pts = boost::make_shared<VectorDouble>();
242 auto grad_u_at_gauss_pts = boost::make_shared<MatrixDouble>();
243 pipeline.push_back(
244 new OpCalculateScalarFieldValues(domainField, data_u_at_gauss_pts));
245 pipeline.push_back(new OpCalculateScalarFieldGradient<2>(
246 domainField, grad_u_at_gauss_pts));
247 pipeline.push_back(new OpDomainRhs(domainField, sourceTermFunction,
248 data_u_at_gauss_pts,
249 grad_u_at_gauss_pts));
250 pipeline.push_back(new OpUnSetBc(domainField));
251 };
252
253 auto add_boundary_lhs_ops = [&](auto &pipeline) {
254 pipeline.push_back(new OpSetBc(domainField, false, boundaryMarker));
255 pipeline.push_back(new OpBoundaryLhs(
257 [](const double, const double, const double) { return 1; }));
258 pipeline.push_back(new OpUnSetBc(domainField));
259 };
260
261 auto add_boundary_rhs_ops = [&](auto &pipeline) {
262 pipeline.push_back(new OpSetBc(domainField, false, boundaryMarker));
263 auto u_at_gauss_pts = boost::make_shared<VectorDouble>();
264 pipeline.push_back(
265 new OpCalculateScalarFieldValues(domainField, u_at_gauss_pts));
266 pipeline.push_back(new OpBoundaryRhs(
267 domainField, u_at_gauss_pts,
268 [](const double, const double, const double) { return 1; }));
269 pipeline.push_back(new OpBoundaryRhsSource(domainField, boundaryFunction));
270 pipeline.push_back(new OpUnSetBc(domainField));
271 };
272
273 add_domain_lhs_ops(pipeline_mng->getOpDomainLhsPipeline());
274 add_domain_rhs_ops(pipeline_mng->getOpDomainRhsPipeline());
275
276 add_boundary_lhs_ops(pipeline_mng->getOpBoundaryLhsPipeline());
277 add_boundary_rhs_ops(pipeline_mng->getOpBoundaryRhsPipeline());
278
280}
#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< BoundaryEleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpSource< 1, 1 > OpBoundaryRhsSource
FormsIntegrators< BoundaryEleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpBaseTimesScalar< 1 > OpBoundaryRhs
FormsIntegrators< BoundaryEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpMass< 1, 1 > OpBoundaryLhs
Add operators pushing bases from local to physical configuration.
Get field gradients at integration pts for scalar field rank 0, i.e. vector field.
Get value at integration points for scalar field.
Set indices on entities on finite element.
PipelineManager interface.
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.
static double boundaryFunction(const double x, const double y, const double z)
static double sourceTermFunction(const double x, const double y, const double z)
boost::shared_ptr< std::vector< unsigned char > > boundaryMarker

◆ boundaryCondition()

MoFEMErrorCode NonlinearPoisson::boundaryCondition ( )
private

Definition at line 178 of file nonlinear_poisson_2d.cpp.

178 {
180
181 // Get boundary edges marked in block named "BOUNDARY_CONDITION"
182 auto get_ents_on_mesh_skin = [&]() {
183 Range boundary_entities;
185 std::string entity_name = it->getName();
186 if (entity_name.compare(0, 18, "BOUNDARY_CONDITION") == 0) {
187 CHKERR it->getMeshsetIdEntitiesByDimension(mField.get_moab(), 1,
188 boundary_entities, true);
189 }
190 }
191 // Add vertices to boundary entities
192 Range boundary_vertices;
193 CHKERR mField.get_moab().get_connectivity(boundary_entities,
194 boundary_vertices, true);
195 boundary_entities.merge(boundary_vertices);
196
197 // Store entities for fieldsplit (block) solver
198 boundaryEntitiesForFieldsplit = boundary_entities;
199
200 return boundary_entities;
201 };
202
203 auto mark_boundary_dofs = [&](Range &&skin_edges) {
204 auto problem_manager = mField.getInterface<ProblemsManager>();
205 auto marker_ptr = boost::make_shared<std::vector<unsigned char>>();
206 problem_manager->markDofs(simpleInterface->getProblemName(), ROW,
207 ProblemsManager::OR, skin_edges, *marker_ptr);
208 return marker_ptr;
209 };
210
211 // Get global local vector of marked DOFs. Is global, since is set for all
212 // DOFs on processor. Is local since only DOFs on processor are in the
213 // vector. To access DOFs use local indices.
214 boundaryMarker = mark_boundary_dofs(get_ents_on_mesh_skin());
215
217}
@ ROW
@ BLOCKSET
#define _IT_CUBITMESHSETS_BY_SET_TYPE_FOR_LOOP_(MESHSET_MANAGER, CUBITBCTYPE, IT)
Iterator that loops over a specific Cubit MeshSet having a particular BC meshset in a moFEM field.
virtual moab::Interface & get_moab()=0
Problem manager is used to build and partition problems.
MoFEMErrorCode markDofs(const std::string problem_name, RowColData rc, const enum MarkOP op, const Range ents, std::vector< unsigned char > &marker) const
Create vector with marked indices.
const std::string getProblemName() const
Get the Problem Name.
Definition Simple.hpp:410

◆ boundaryFunction()

static double NonlinearPoisson::boundaryFunction ( const double x,
const double y,
const double z )
inlinestaticprivate

Definition at line 46 of file nonlinear_poisson_2d.cpp.

47 {
48 return -cos(M_PI * x) *
49 cos(M_PI * y); // here should put the negative of the proper formula
50 }

◆ checkResults()

MoFEMErrorCode NonlinearPoisson::checkResults ( )
private

[Check]

Definition at line 371 of file nonlinear_poisson_2d.cpp.

371 {
373 auto check_result_fe_ptr = boost::make_shared<DomainEle>(mField);
374 auto errorVec =
376 (mField.get_comm_rank() == 0) ? LAST_NORM : 0, LAST_NORM);
381 check_result_fe_ptr->getOpPtrVector(), {H1})),
382 "Apply transform");
383 check_result_fe_ptr->getRuleHook = [](int, int, int p) { return p; };
384 auto analyticalFunction = [&](double x, double y, double z) {
385 return cos(M_PI * x) * cos(M_PI * y);
386 };
387 auto u_ptr = boost::make_shared<VectorDouble>();
388 check_result_fe_ptr->getOpPtrVector().push_back(
390 auto mValFuncPtr = boost::make_shared<VectorDouble>();
391 check_result_fe_ptr->getOpPtrVector().push_back(
392 new OpGetTensor0fromFunc(mValFuncPtr, analyticalFunction));
393 check_result_fe_ptr->getOpPtrVector().push_back(
394 new OpCalcNormL2Tensor0(u_ptr, errorVec, NORM, mValFuncPtr));
395 check_result_fe_ptr->getOpPtrVector().push_back(
397 CHKERR VecZeroEntries(errorVec);
398 CHKERR VecZeroEntries(exactVec);
401 check_result_fe_ptr);
402 CHKERR VecAssemblyBegin(errorVec);
403 CHKERR VecAssemblyEnd(errorVec);
404 CHKERR VecAssemblyBegin(exactVec);
405 CHKERR VecAssemblyEnd(exactVec);
406 MOFEM_LOG_CHANNEL("SELF"); // Clear channel from old tags
407 // print norm in general log
408 if (mField.get_comm_rank() == 0) {
409 const double *L2_norms;
410 const double *Ex_norms;
411 CHKERR VecGetArrayRead(errorVec, &L2_norms);
412 CHKERR VecGetArrayRead(exactVec, &Ex_norms);
413 MOFEM_TAG_AND_LOG("SELF", Sev::inform, "Errors")
414 << "L2_NORM: " << std::sqrt(L2_norms[NORM]);
415 MOFEM_TAG_AND_LOG("SELF", Sev::inform, "Errors")
416 << "NORMALISED_ERROR: "
417 << (std::sqrt(L2_norms[NORM]) / std::sqrt(Ex_norms[EX_NORM]));
418 CHKERR VecRestoreArrayRead(errorVec, &L2_norms);
419 CHKERR VecRestoreArrayRead(exactVec, &Ex_norms);
420 }
421 // compare norm for ctest
422 if (atomTest && !mField.get_comm_rank()) {
423 const double *L2_norms;
424 const double *Ex_norms;
425 CHKERR VecGetArrayRead(errorVec, &L2_norms);
426 CHKERR VecGetArrayRead(exactVec, &Ex_norms);
427 double ref_percentage = 4.4e-04;
428 double normalised_error;
429 switch (atomTest) {
430 case 1: // 2D
431 normalised_error = std::sqrt(L2_norms[0]) / std::sqrt(Ex_norms[0]);
432 break;
433 default:
434 SETERRQ(PETSC_COMM_SELF, MOFEM_INVALID_DATA,
435 "atom test %d does not exist", atomTest);
436 }
437 if (normalised_error > ref_percentage) {
438 SETERRQ(PETSC_COMM_SELF, MOFEM_ATOM_TEST_INVALID,
439 "atom test %d failed! Calculated Norm %3.16e is greater than "
440 "reference Norm %3.16e",
441 atomTest, normalised_error, ref_percentage);
442 }
443 CHKERR VecRestoreArrayRead(errorVec, &L2_norms);
444 CHKERR VecRestoreArrayRead(exactVec, &Ex_norms);
445 }
447}
#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 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 > errorVec
SmartPetscObj< Vec > exactVec

◆ outputResults()

MoFEMErrorCode NonlinearPoisson::outputResults ( )
private

Definition at line 338 of file nonlinear_poisson_2d.cpp.

338 {
340
341 auto post_proc = boost::make_shared<PostProcEle>(mField);
342
343 auto u_ptr = boost::make_shared<VectorDouble>();
344 post_proc->getOpPtrVector().push_back(
346
348
349 post_proc->getOpPtrVector().push_back(
350
351 new OpPPMap(post_proc->getPostProcMesh(), post_proc->getMapGaussPts(),
352
353 {{domainField, u_ptr}},
354
355 {}, {}, {}
356
357 )
358
359 );
360
361 auto *simple = mField.getInterface<Simple>();
362 auto dm = simple->getDM();
363 CHKERR DMoFEMLoopFiniteElements(dm, simple->getDomainFEName(), post_proc);
364
365 CHKERR post_proc->writeFile("out_result.h5m");
366
368}
void simple(double P1[], double P2[], double P3[], double c[], const int N)
Definition acoustic.cpp:69
OpPostProcMapInMoab< SPACE_DIM, SPACE_DIM > OpPPMap
Post post-proc data at points from hash maps.
Simple interface for fast problem set-up.
Definition Simple.hpp:27

◆ readMesh()

MoFEMErrorCode NonlinearPoisson::readMesh ( )
private

Definition at line 96 of file nonlinear_poisson_2d.cpp.

96 {
98
102
104}
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 NonlinearPoisson::runProgram ( )

Definition at line 81 of file nonlinear_poisson_2d.cpp.

◆ setIntegrationRules()

MoFEMErrorCode NonlinearPoisson::setIntegrationRules ( )
private

Definition at line 160 of file nonlinear_poisson_2d.cpp.

160 {
162
163 auto domain_rule_lhs = [](int, int, int p) -> int { return 2 * p - 1; };
164 auto domain_rule_rhs = [](int, int, int p) -> int { return 2 * p - 1; };
165
166 auto boundary_rule_lhs = [](int, int, int p) -> int { return 2 * p; };
167 auto boundary_rule_rhs = [](int, int, int p) -> int { return 2 * p; };
168
169 auto pipeline_mng = mField.getInterface<PipelineManager>();
170 CHKERR pipeline_mng->setDomainRhsIntegrationRule(domain_rule_lhs);
171 CHKERR pipeline_mng->setDomainLhsIntegrationRule(domain_rule_rhs);
172 CHKERR pipeline_mng->setBoundaryLhsIntegrationRule(boundary_rule_lhs);
173 CHKERR pipeline_mng->setBoundaryRhsIntegrationRule(boundary_rule_rhs);
174
176}
MoFEMErrorCode setDomainRhsIntegrationRule(RuleHookFun rule)

◆ setupProblem()

MoFEMErrorCode NonlinearPoisson::setupProblem ( )
private

Definition at line 106 of file nonlinear_poisson_2d.cpp.

106 {
108
109 Range domain_ents;
110 CHKERR mField.get_moab().get_entities_by_dimension(0, SPACE_DIM, domain_ents,
111 true);
112 auto get_ents_by_dim = [&](const auto dim) {
113 if (dim == SPACE_DIM) {
114 return domain_ents;
115 } else {
116 Range ents;
117 if (dim == 0)
118 CHKERR mField.get_moab().get_connectivity(domain_ents, ents, true);
119 else
120 CHKERR mField.get_moab().get_entities_by_dimension(0, dim, ents, true);
121 return ents;
122 }
123 };
124 // Select base
125 auto get_base = [&]() {
126 auto domain_ents = get_ents_by_dim(SPACE_DIM);
127 if (domain_ents.empty())
128 CHK_THROW_MESSAGE(MOFEM_NOT_FOUND, "Empty mesh");
129 const auto type = type_from_handle(domain_ents[0]);
130 switch (type) {
131 case MBQUAD:
133 case MBHEX:
135 case MBTRI:
137 case MBTET:
139 default:
140 CHK_THROW_MESSAGE(MOFEM_NOT_FOUND, "Element type not handled");
141 }
142 return NOBASE;
143 };
144 auto base = get_base();
147
148 order = 2;
149
150 CHKERR PetscOptionsGetInt(PETSC_NULLPTR, "", "-order", &order, PETSC_NULLPTR);
151 CHKERR PetscOptionsGetInt(PETSC_NULLPTR, "", "-atom_test", &atomTest,
152 PETSC_NULLPTR);
154
156
158}
@ 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)
constexpr int SPACE_DIM
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 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.
Definition Simple.cpp:355
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 NonlinearPoisson::solveSystem ( )
private

Definition at line 282 of file nonlinear_poisson_2d.cpp.

282 {
284
285 auto *simple = mField.getInterface<Simple>();
286
287 auto set_fieldsplit_preconditioner = [&](auto snes) {
289 KSP ksp;
290 CHKERR SNESGetKSP(snes, &ksp);
291 PC pc;
292 CHKERR KSPGetPC(ksp, &pc);
293 PetscBool is_pcfs = PETSC_FALSE;
294 PetscObjectTypeCompare((PetscObject)pc, PCFIELDSPLIT, &is_pcfs);
295
296 // Set up FIELDSPLIT, only when option used -pc_type fieldsplit
297 if (is_pcfs == PETSC_TRUE) {
298 auto name_prb = simple->getProblemName();
299 SmartPetscObj<IS> is_all_bc;
300 CHKERR mField.getInterface<ISManager>()->isCreateProblemFieldAndRank(
301 name_prb, ROW, domainField, 0, 1, is_all_bc,
303 int is_all_bc_size;
304 CHKERR ISGetSize(is_all_bc, &is_all_bc_size);
305 MOFEM_LOG("EXAMPLE", Sev::inform)
306 << "Field split block size " << is_all_bc_size;
307 CHKERR PCFieldSplitSetIS(pc, PETSC_NULLPTR,
308 is_all_bc); // boundary block
309 }
311 };
312
313 // Create global RHS and solution vectors
314 auto dm = simple->getDM();
315 SmartPetscObj<Vec> global_rhs, global_solution;
316 CHKERR DMCreateGlobalVector_MoFEM(dm, global_rhs);
317 global_solution = vectorDuplicate(global_rhs);
318
319 // Create nonlinear solver (SNES)
320 auto pipeline_mng = mField.getInterface<PipelineManager>();
321 auto solver = pipeline_mng->createSNES();
322 CHKERR SNESSetFromOptions(solver);
323 CHKERR set_fieldsplit_preconditioner(solver);
324 auto B = createDMMatrix(dm);
325 CHKERR SNESSetJacobian(solver, B, B, PETSC_NULLPTR, PETSC_NULLPTR);
326 CHKERR SNESSetUp(solver);
327
328 // Solve the system
329 CHKERR SNESSolve(solver, global_rhs, global_solution);
330
331 // Scatter result data on the mesh
332 CHKERR DMoFEMMeshToGlobalVector(dm, global_solution, INSERT_VALUES,
333 SCATTER_REVERSE);
334
336}
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
auto createDMMatrix(DM dm)
Get smart matrix from DM.
Definition DMMoFEM.hpp:1059
PetscErrorCode DMCreateGlobalVector_MoFEM(DM dm, Vec *g)
DMShellSetCreateGlobalVector.
Definition DMMoFEM.cpp:1157
PetscErrorCode DMoFEMMeshToGlobalVector(DM dm, Vec g, InsertMode mode, ScatterMode scatter_mode)
set ghosted vector values on all existing mesh entities
Definition DMMoFEM.cpp:525
SmartPetscObj< SNES > createSNES(SmartPetscObj< DM > dm=nullptr)
Create SNES (nonlinear) solver.
#define MOFEM_LOG(channel, severity)
Log.
SmartPetscObj< Vec > vectorDuplicate(Vec vec)
Create duplicate vector of smart vector.
Section manager is used to create indexes and sections.
Definition ISManager.hpp:23
intrusive_ptr for managing petsc objects

◆ sourceTermFunction()

static double NonlinearPoisson::sourceTermFunction ( const double x,
const double y,
const double z )
inlinestaticprivate

Definition at line 34 of file nonlinear_poisson_2d.cpp.

35 {
36
37 return 2 * M_PI * M_PI *
38 (cos(M_PI * x) * cos(M_PI * y) +
39 cube(cos(M_PI * x)) * cube(cos(M_PI * y)) -
40 cos(M_PI * x) * cos(M_PI * y) *
41 (sqr(sin(M_PI * x)) * sqr(cos(M_PI * y)) +
42 sqr(sin(M_PI * y)) * sqr(cos(M_PI * x))));
43 }
double sqr(const double x)
double cube(const double x)

Member Data Documentation

◆ atomTest

int NonlinearPoisson::atomTest = 0
private

Definition at line 62 of file nonlinear_poisson_2d.cpp.

◆ boundaryEntitiesForFieldsplit

Range NonlinearPoisson::boundaryEntitiesForFieldsplit
private

Definition at line 75 of file nonlinear_poisson_2d.cpp.

◆ boundaryMarker

boost::shared_ptr<std::vector<unsigned char> > NonlinearPoisson::boundaryMarker
private

Definition at line 67 of file nonlinear_poisson_2d.cpp.

◆ domainField

std::string NonlinearPoisson::domainField = "POTENTIAL"
private

Definition at line 57 of file nonlinear_poisson_2d.cpp.

◆ errorVec

SmartPetscObj<Vec> NonlinearPoisson::errorVec
private

Definition at line 61 of file nonlinear_poisson_2d.cpp.

◆ exactVec

SmartPetscObj<Vec> NonlinearPoisson::exactVec
private

Definition at line 61 of file nonlinear_poisson_2d.cpp.

◆ mField

MoFEM::Interface& NonlinearPoisson::mField
private

Definition at line 53 of file nonlinear_poisson_2d.cpp.

◆ order

int NonlinearPoisson::order
private

Definition at line 58 of file nonlinear_poisson_2d.cpp.

◆ postProc

boost::shared_ptr<PostProcEle> NonlinearPoisson::postProc
private

Definition at line 72 of file nonlinear_poisson_2d.cpp.

◆ simpleInterface

Simple* NonlinearPoisson::simpleInterface
private

Definition at line 54 of file nonlinear_poisson_2d.cpp.


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