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

Public Member Functions

 Poisson2DiscontGalerkin (MoFEM::Interface &m_field)
 
MoFEMErrorCode runProgram ()
 [Output results]
 

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 checkResults ()
 [Solve system]
 
MoFEMErrorCode outputResults ()
 [Output results]
 

Private Attributes

MoFEM::InterfacemField
 
SimplesimpleInterface
 
std::string domainField
 
int oRder
 

Detailed Description

Examples
poisson_2d_dis_galerkin.cpp.

Definition at line 74 of file poisson_2d_dis_galerkin.cpp.

Constructor & Destructor Documentation

◆ Poisson2DiscontGalerkin()

Poisson2DiscontGalerkin::Poisson2DiscontGalerkin ( MoFEM::Interface & m_field)

Member Function Documentation

◆ assembleSystem()

MoFEMErrorCode Poisson2DiscontGalerkin::assembleSystem ( )
private

[Boundary condition]

[Assemble system]

Examples
poisson_2d_dis_galerkin.cpp.

Definition at line 174 of file poisson_2d_dis_galerkin.cpp.

174 {
176
177 auto pipeline_mng = mField.getInterface<PipelineManager>();
178
179 auto add_base_ops = [&](auto &pipeline) {
180 auto det_ptr = boost::make_shared<VectorDouble>();
181 auto jac_ptr = boost::make_shared<MatrixDouble>();
182 auto inv_jac_ptr = boost::make_shared<MatrixDouble>();
183 pipeline.push_back(new OpCalculateHOJacForFace(jac_ptr));
184 pipeline.push_back(new OpInvertMatrix<2>(jac_ptr, det_ptr, inv_jac_ptr));
185 pipeline.push_back(new OpSetInvJacL2ForFace(inv_jac_ptr));
186 };
187
188 add_base_ops(pipeline_mng->getOpDomainLhsPipeline());
189 pipeline_mng->getOpDomainLhsPipeline().push_back(new OpDomainGradGrad(
191 [](const double, const double, const double) { return 1; }));
192 pipeline_mng->getOpDomainRhsPipeline().push_back(
194
195 // Push operators to the Pipeline for Skeleton
196 auto side_fe_ptr = boost::make_shared<FaceSideEle>(mField);
197 add_base_ops(side_fe_ptr->getOpPtrVector());
198 side_fe_ptr->getOpPtrVector().push_back(
200
201 // Push operators to the Pipeline for Skeleton
202 pipeline_mng->getOpSkeletonLhsPipeline().push_back(
203 new OpL2LhsPenalty(side_fe_ptr));
204
205 // Push operators to the Pipeline for Boundary
206 pipeline_mng->getOpBoundaryLhsPipeline().push_back(
207 new OpL2LhsPenalty(side_fe_ptr));
208 pipeline_mng->getOpBoundaryRhsPipeline().push_back(
209 new OpL2BoundaryRhs(side_fe_ptr, u_exact));
210
212}
#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()
OpCalculateHOJacForFaceImpl< 2 > OpCalculateHOJacForFace
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpGradGrad< BASE_DIM, FIELD_DIM, SPACE_DIM > OpDomainGradGrad
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpSource< BASE_DIM, FIELD_DIM > OpDomainSource
PipelineManager interface.
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.
Operator tp collect data from elements on the side of Edge/Face.
Operator to evaluate Dirichlet boundary conditions using DG.

◆ boundaryCondition()

MoFEMErrorCode Poisson2DiscontGalerkin::boundaryCondition ( )
private

[Setup problem]

[Boundary condition]

Examples
poisson_2d_dis_galerkin.cpp.

Definition at line 166 of file poisson_2d_dis_galerkin.cpp.

166 {
169}

◆ checkResults()

MoFEMErrorCode Poisson2DiscontGalerkin::checkResults ( )
private

[Solve system]

Examples
poisson_2d_dis_galerkin.cpp.

Definition at line 262 of file poisson_2d_dis_galerkin.cpp.

262 {
264
265 auto pipeline_mng = mField.getInterface<PipelineManager>();
266 pipeline_mng->getDomainRhsFE().reset();
267 pipeline_mng->getDomainLhsFE().reset();
268 pipeline_mng->getSkeletonRhsFE().reset();
269 pipeline_mng->getSkeletonLhsFE().reset();
270 pipeline_mng->getBoundaryRhsFE().reset();
271 pipeline_mng->getBoundaryLhsFE().reset();
272
273 auto rule = [](int, int, int p) -> int { return 2 * p; };
274 CHKERR pipeline_mng->setDomainRhsIntegrationRule(rule);
275 auto rule_2 = [this](int, int, int) { return 2 * oRder; };
276 CHKERR pipeline_mng->setSkeletonRhsIntegrationRule(rule_2);
277
278 auto add_base_ops = [&](auto &pipeline) {
279 auto det_ptr = boost::make_shared<VectorDouble>();
280 auto jac_ptr = boost::make_shared<MatrixDouble>();
281 auto inv_jac_ptr = boost::make_shared<MatrixDouble>();
282 pipeline.push_back(new OpCalculateHOJacForFace(jac_ptr));
283 pipeline.push_back(new OpInvertMatrix<2>(jac_ptr, det_ptr, inv_jac_ptr));
284 pipeline.push_back(new OpSetInvJacL2ForFace(inv_jac_ptr));
285 };
286
287 auto u_vals_ptr = boost::make_shared<VectorDouble>();
288 auto u_grad_ptr = boost::make_shared<MatrixDouble>();
289
290 add_base_ops(pipeline_mng->getOpDomainRhsPipeline());
291 pipeline_mng->getOpDomainRhsPipeline().push_back(
293 pipeline_mng->getOpDomainRhsPipeline().push_back(
295
296 enum NORMS { L2 = 0, SEMI_NORM, H1, LAST_NORM };
297 std::array<int, LAST_NORM> error_indices;
298 for (int i = 0; i != LAST_NORM; ++i)
299 error_indices[i] = i;
300 auto l2_vec = createVectorMPI(
301 mField.get_comm(), (!mField.get_comm_rank()) ? LAST_NORM : 0, LAST_NORM);
302
303 auto error_op = new DomainEleOp(domainField, DomainEleOp::OPROW);
304 error_op->doWorkRhsHook = [&](DataOperator *op_ptr, int side, EntityType type,
307 auto o = static_cast<DomainEleOp *>(op_ptr);
308
309 FTensor::Index<'i', 2> i;
310
311 if (const size_t nb_dofs = data.getIndices().size()) {
312
313 const int nb_integration_pts = o->getGaussPts().size2();
314 auto t_w = o->getFTensor0IntegrationWeight();
315 auto t_val = getFTensor0FromVec(*u_vals_ptr);
316 auto t_grad = getFTensor1FromMat<2>(*u_grad_ptr);
317 auto t_coords = o->getFTensor1CoordsAtGaussPts();
318
319 std::array<double, LAST_NORM> error;
320 std::fill(error.begin(), error.end(), 0);
321
322 for (int gg = 0; gg != nb_integration_pts; ++gg) {
323
324 const double alpha = t_w * o->getMeasure();
325 const double diff =
326 t_val - u_exact(t_coords(0), t_coords(1), t_coords(2));
327
328 auto t_exact_grad = u_grad_exact(t_coords(0), t_coords(1), t_coords(2));
329
330 const double diff_grad =
331 (t_grad(i) - t_exact_grad(i)) * (t_grad(i) - t_exact_grad(i));
332
333 error[L2] += alpha * pow(diff, 2);
334 error[SEMI_NORM] += alpha * diff_grad;
335
336 ++t_w;
337 ++t_val;
338 ++t_grad;
339 ++t_coords;
340 }
341
342 error[H1] = error[L2] + error[SEMI_NORM];
343
344 CHKERR VecSetValues(l2_vec, LAST_NORM, error_indices.data(), error.data(),
345 ADD_VALUES);
346 }
347
349 };
350
351 auto side_fe_ptr = boost::make_shared<FaceSideEle>(mField);
352 add_base_ops(side_fe_ptr->getOpPtrVector());
353 side_fe_ptr->getOpPtrVector().push_back(
355 std::array<VectorDouble, 2> side_vals;
356 std::array<double, 2> area_map;
357
358 auto side_vals_op = new DomainEleOp(domainField, DomainEleOp::OPROW);
359 side_vals_op->doWorkRhsHook = [&](DataOperator *op_ptr, int side,
360 EntityType type,
363 auto o = static_cast<FaceSideOp *>(op_ptr);
364
365 const auto nb_in_loop = o->getFEMethod()->nInTheLoop;
366 area_map[nb_in_loop] = o->getMeasure();
367 side_vals[nb_in_loop] = *u_vals_ptr;
368 if (!nb_in_loop) {
369 area_map[1] = 0;
370 side_vals[1].clear();
371 }
372
374 };
375 side_fe_ptr->getOpPtrVector().push_back(side_vals_op);
376
377 auto do_work_rhs_error = [&](DataOperator *op_ptr, int side, EntityType type,
380 auto o = static_cast<BoundaryEleOp *>(op_ptr);
381
382 CHKERR o->loopSideFaces("dFE", *side_fe_ptr);
383 const auto in_the_loop = side_fe_ptr->nInTheLoop;
384
385#ifndef NDEBUG
386 const std::array<std::string, 2> ele_type_name = {"BOUNDARY", "SKELETON"};
387 MOFEM_LOG("SELF", Sev::noisy)
388 << "do_work_rhs_error in_the_loop " << ele_type_name[in_the_loop];
389#endif
390
391 const double s = o->getMeasure() / (area_map[0] + area_map[1]);
392 const double p = penalty * s;
393
394 std::array<double, LAST_NORM> error;
395 std::fill(error.begin(), error.end(), 0);
396
397 const int nb_integration_pts = o->getGaussPts().size2();
398
399 if (!in_the_loop) {
400 side_vals[1].resize(nb_integration_pts, false);
401 auto t_coords = o->getFTensor1CoordsAtGaussPts();
402 auto t_val_m = getFTensor0FromVec(side_vals[1]);
403 for (size_t gg = 0; gg != nb_integration_pts; ++gg) {
404 t_val_m = u_exact(t_coords(0), t_coords(1), t_coords(2));
405 ++t_coords;
406 ++t_val_m;
407 }
408 }
409
410 auto t_val_p = getFTensor0FromVec(side_vals[0]);
411 auto t_val_m = getFTensor0FromVec(side_vals[1]);
412 auto t_w = o->getFTensor0IntegrationWeight();
413
414 for (size_t gg = 0; gg != nb_integration_pts; ++gg) {
415
416 const double alpha = o->getMeasure() * t_w;
417 const auto diff = t_val_p - t_val_m;
418 error[SEMI_NORM] += alpha * p * diff * diff;
419
420 ++t_w;
421 ++t_val_p;
422 ++t_val_m;
423 }
424
425
426 error[H1] = error[SEMI_NORM];
427 CHKERR VecSetValues(l2_vec, LAST_NORM, error_indices.data(), error.data(),
428 ADD_VALUES);
429
431 };
432
433 auto skeleton_error_op = new BoundaryEleOp(NOSPACE, BoundaryEleOp::OPSPACE);
434 skeleton_error_op->doWorkRhsHook = do_work_rhs_error;
435 auto boundary_error_op = new BoundaryEleOp(NOSPACE, BoundaryEleOp::OPSPACE);
436 boundary_error_op->doWorkRhsHook = do_work_rhs_error;
437
438 pipeline_mng->getOpDomainRhsPipeline().push_back(error_op);
439 pipeline_mng->getOpSkeletonLhsPipeline().push_back(skeleton_error_op);
440 pipeline_mng->getOpBoundaryRhsPipeline().push_back(boundary_error_op);
441
442 CHKERR pipeline_mng->loopFiniteElements();
443
444 CHKERR VecAssemblyBegin(l2_vec);
445 CHKERR VecAssemblyEnd(l2_vec);
446
447 if (mField.get_comm_rank() == 0) {
448 const double *array;
449 CHKERR VecGetArrayRead(l2_vec, &array);
450 MOFEM_LOG_C("SELF", Sev::inform, "Error Norm L2 %6.4e",
451 std::sqrt(array[L2]));
452 MOFEM_LOG_C("SELF", Sev::inform, "Error Norm Energetic %6.4e",
453 std::sqrt(array[SEMI_NORM]));
454 MOFEM_LOG_C("SELF", Sev::inform, "Error Norm H1 %6.4e",
455 std::sqrt(array[H1]));
456
457 if(is_test) {
458 constexpr double eps = 1e-12;
459 if (std::sqrt(array[H1]) > eps)
460 SETERRQ(PETSC_COMM_WORLD, MOFEM_ATOM_TEST_INVALID, "Error is too big");
461 }
462
463 CHKERR VecRestoreArrayRead(l2_vec, &array);
464 const MoFEM::Problem *problem_ptr;
466 MOFEM_LOG_C("SELF", Sev::inform, "Nb. DOFs %d",
467 problem_ptr->getNbDofsRow());
468 }
469
470
471
473}
#define MOFEM_LOG_C(channel, severity, format,...)
static const double eps
DomainEle::UserDataOperator DomainEleOp
Finire element operator type.
BoundaryEle::UserDataOperator BoundaryEleOp
@ L2
field with C-1 continuity
Definition definitions.h:88
@ H1
continuous field
Definition definitions.h:85
@ NOSPACE
Definition definitions.h:83
@ MOFEM_ATOM_TEST_INVALID
Definition definitions.h:40
#define CHKERR
Inline error check.
PetscErrorCode DMMoFEMGetProblemPtr(DM dm, const MoFEM::Problem **problem_ptr)
Get pointer to problem data structure.
Definition DMMoFEM.cpp:422
#define MOFEM_LOG(channel, severity)
Log.
auto createVectorMPI(MPI_Comm comm, PetscInt n, PetscInt N)
Create MPI Vector.
FTensor::Tensor1< FTensor::PackPtr< T *, S >, Tensor_Dim > getFTensor1FromMat(ublas::matrix< T, L, A > &data)
Get tensor rank 1 (vector) form data matrix.
static auto getFTensor0FromVec(ublas::vector< T, A > &data)
Get tensor rank 0 (scalar) form data vector.
MoFEMErrorCode VecSetValues(Vec V, const EntitiesFieldData::EntData &data, const double *ptr, InsertMode iora)
Assemble PETSc vector.
auto u_grad_exact
static double penalty
PetscBool is_test
virtual MPI_Comm & get_comm() const =0
virtual int get_comm_rank() const =0
base operator to do operations at Gauss Pt. level
Data on single entity (This is passed as argument to DataOperator::doWork)
Get field gradients at integration pts for scalar field rank 0, i.e. vector field.
Get value at integration points for scalar field.
boost::shared_ptr< FEMethod > & getDomainRhsFE()
keeps basic data about problem
DofIdx getNbDofsRow() const
MoFEMErrorCode getDM(DM *dm)
Get DM.
Definition Simple.cpp:800

◆ outputResults()

MoFEMErrorCode Poisson2DiscontGalerkin::outputResults ( )
private

[Output results]

Examples
poisson_2d_dis_galerkin.cpp.

Definition at line 476 of file poisson_2d_dis_galerkin.cpp.

476 {
478
479 auto pipeline_mng = mField.getInterface<PipelineManager>();
480 pipeline_mng->getDomainLhsFE().reset();
481 pipeline_mng->getSkeletonRhsFE().reset();
482 pipeline_mng->getSkeletonLhsFE().reset();
483 pipeline_mng->getBoundaryRhsFE().reset();
484 pipeline_mng->getBoundaryLhsFE().reset();
485
486 auto post_proc_fe = boost::make_shared<PostProcEle>(mField);
487
488 auto u_ptr = boost::make_shared<VectorDouble>();
489 post_proc_fe->getOpPtrVector().push_back(
491
493
494 post_proc_fe->getOpPtrVector().push_back(
495
496 new OpPPMap(
497
498 post_proc_fe->getPostProcMesh(), post_proc_fe->getMapGaussPts(),
499
500 {{"U", u_ptr}},
501
502 {},
503
504 {},
505
506 {})
507
508 );
509
510 pipeline_mng->getDomainRhsFE() = post_proc_fe;
511 CHKERR pipeline_mng->loopFiniteElements();
512 CHKERR post_proc_fe->writeFile("out_result.h5m");
513
515}
OpPostProcMapInMoab< SPACE_DIM, SPACE_DIM > OpPPMap
Post post-proc data at points from hash maps.
boost::shared_ptr< FEMethod > & getDomainLhsFE()

◆ readMesh()

MoFEMErrorCode Poisson2DiscontGalerkin::readMesh ( )
private

[Read mesh]

Examples
poisson_2d_dis_galerkin.cpp.

Definition at line 105 of file poisson_2d_dis_galerkin.cpp.

105 {
107
110
111 // Only L2 field is set in this example. Two lines bellow forces simple
112 // interface to creat lower dimension (edge) elements, despite that fact that
113 // there is no field spanning on such elements. We need them for DG method.
116
118
120}
bool & getAddBoundaryFE()
Get the addSkeletonFE.
Definition Simple.hpp:504
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
bool & getAddSkeletonFE()
Get the addSkeletonFE.
Definition Simple.hpp:493

◆ runProgram()

MoFEMErrorCode Poisson2DiscontGalerkin::runProgram ( )

[Output results]

[Run program]

Examples
poisson_2d_dis_galerkin.cpp.

Definition at line 519 of file poisson_2d_dis_galerkin.cpp.

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

◆ setIntegrationRules()

MoFEMErrorCode Poisson2DiscontGalerkin::setIntegrationRules ( )
private

[Assemble system]

[Set integration rules]

Examples
poisson_2d_dis_galerkin.cpp.

Definition at line 216 of file poisson_2d_dis_galerkin.cpp.

216 {
218
219 auto rule_lhs = [](int, int, int p) -> int { return 2 * p; };
220 auto rule_rhs = [](int, int, int p) -> int { return 2 * p; };
221 auto rule_2 = [this](int, int, int) { return 2 * oRder; };
222
223 auto pipeline_mng = mField.getInterface<PipelineManager>();
224 CHKERR pipeline_mng->setDomainLhsIntegrationRule(rule_lhs);
225 CHKERR pipeline_mng->setDomainRhsIntegrationRule(rule_rhs);
226
227 CHKERR pipeline_mng->setSkeletonLhsIntegrationRule(rule_2);
228 CHKERR pipeline_mng->setSkeletonRhsIntegrationRule(rule_2);
229 CHKERR pipeline_mng->setBoundaryLhsIntegrationRule(rule_2);
230 CHKERR pipeline_mng->setBoundaryRhsIntegrationRule(rule_2);
231
233}
MoFEMErrorCode setDomainLhsIntegrationRule(RuleHookFun rule)

◆ setupProblem()

MoFEMErrorCode Poisson2DiscontGalerkin::setupProblem ( )
private

[Read mesh]

[Setup problem]

Examples
poisson_2d_dis_galerkin.cpp.

Definition at line 124 of file poisson_2d_dis_galerkin.cpp.

124 {
126
127 CHKERR PetscOptionsGetInt(PETSC_NULLPTR, "", "-order", &oRder, PETSC_NULLPTR);
128 CHKERR PetscOptionsGetScalar(PETSC_NULLPTR, "", "-penalty", &penalty,
129 PETSC_NULLPTR);
130 CHKERR PetscOptionsGetScalar(PETSC_NULLPTR, "", "-phi", &phi, PETSC_NULLPTR);
131 CHKERR PetscOptionsGetScalar(PETSC_NULLPTR, "", "-nitsche", &nitsche,
132 PETSC_NULLPTR);
133 PetscOptionsGetBool(PETSC_NULLPTR, "", "-is_test", &is_test, PETSC_NULLPTR);
134
135 MOFEM_LOG("WORLD", Sev::inform) << "Set order: " << oRder;
136 MOFEM_LOG("WORLD", Sev::inform) << "Set penalty: " << penalty;
137 MOFEM_LOG("WORLD", Sev::inform) << "Set phi: " << phi;
138 MOFEM_LOG("WORLD", Sev::inform) << "Set nitche: " << nitsche;
139 MOFEM_LOG("WORLD", Sev::inform) << "Set test: " << (is_test == PETSC_TRUE);
140
145
146 // This is only for debigging and experimentation, to see boundary and edge
147 // elements.
148 auto save_shared = [&](auto meshset, std::string prefix) {
150 auto file_name =
151 prefix + "_" +
152 boost::lexical_cast<std::string>(mField.get_comm_rank()) + ".vtk";
153 CHKERR mField.get_moab().write_file(file_name.c_str(), "VTK", "", &meshset,
154 1);
156 };
157
158 // CHKERR save_shared(simpleInterface->getBoundaryMeshSet(), "bdy");
159 // CHKERR save_shared(simpleInterface->getSkeletonMeshSet(), "skel");
160
162}
@ AINSWORTH_LOBATTO_BASE
Definition definitions.h:62
PetscErrorCode PetscOptionsGetInt(PetscOptions *, const char pre[], const char name[], PetscInt *ivalue, PetscBool *set)
PetscErrorCode PetscOptionsGetBool(PetscOptions *, const char pre[], const char name[], PetscBool *bval, PetscBool *set)
PetscErrorCode PetscOptionsGetScalar(PetscOptions *, const char pre[], const char name[], PetscScalar *dval, PetscBool *set)
static double nitsche
static double phi
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 Poisson2DiscontGalerkin::solveSystem ( )
private

[Set integration rules]

[Solve system]

Examples
poisson_2d_dis_galerkin.cpp.

Definition at line 237 of file poisson_2d_dis_galerkin.cpp.

237 {
239
240 auto pipeline_mng = mField.getInterface<PipelineManager>();
241
242 auto ksp_solver = pipeline_mng->createKSP();
243 CHKERR KSPSetFromOptions(ksp_solver);
244 CHKERR KSPSetUp(ksp_solver);
245
246 // Create RHS and solution vectors
247 auto dm = simpleInterface->getDM();
248 auto F = createDMVector(dm);
249 auto D = vectorDuplicate(F);
250
251 CHKERR KSPSolve(ksp_solver, F, D);
252
253 // Scatter result data on the mesh
254 CHKERR VecGhostUpdateBegin(D, INSERT_VALUES, SCATTER_FORWARD);
255 CHKERR VecGhostUpdateEnd(D, INSERT_VALUES, SCATTER_FORWARD);
256 CHKERR DMoFEMMeshToLocalVector(dm, D, INSERT_VALUES, SCATTER_REVERSE);
257
259}
@ 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.

Member Data Documentation

◆ domainField

std::string Poisson2DiscontGalerkin::domainField
private
Examples
poisson_2d_dis_galerkin.cpp.

Definition at line 97 of file poisson_2d_dis_galerkin.cpp.

◆ mField

MoFEM::Interface& Poisson2DiscontGalerkin::mField
private
Examples
poisson_2d_dis_galerkin.cpp.

Definition at line 93 of file poisson_2d_dis_galerkin.cpp.

◆ oRder

int Poisson2DiscontGalerkin::oRder
private
Examples
poisson_2d_dis_galerkin.cpp.

Definition at line 98 of file poisson_2d_dis_galerkin.cpp.

◆ simpleInterface

Simple* Poisson2DiscontGalerkin::simpleInterface
private
Examples
poisson_2d_dis_galerkin.cpp.

Definition at line 94 of file poisson_2d_dis_galerkin.cpp.


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