v0.13.2
Loading...
Searching...
No Matches
Classes | Public Member Functions | Private Member Functions | Private Attributes | Static Private Attributes | List of all members
AtomTest Struct Reference
Collaboration diagram for AtomTest:
[legend]

Classes

struct  CommonData
 Collected data use d by operator to evaluate errors for the test. More...
 
struct  OpError
 Operator to evaluate errors. More...
 
struct  OpError< 1 >
 
struct  OpErrorSkel
 
struct  OpErrorSkel< 1 >
 

Public Member Functions

 AtomTest (MoFEM::Interface &m_field)
 
MoFEMErrorCode runProblem ()
 [Run programme] More...
 
 AtomTest (MoFEM::Interface &m_field)
 
MoFEMErrorCode runProblem ()
 
 AtomTest (MoFEM::Interface &m_field)
 
MoFEMErrorCode runProblem ()
 

Private Member Functions

MoFEMErrorCode readMesh ()
 [Run programme] More...
 
MoFEMErrorCode setupProblem ()
 [Read mesh] More...
 
MoFEMErrorCode assembleSystem ()
 [Push operators to pipeline] More...
 
MoFEMErrorCode solveSystem ()
 [Push operators to pipeline] More...
 
MoFEMErrorCode checkResults (boost::function< bool(FEMethod *fe_method_ptr)> test_bit)
 [Postprocess results] More...
 
MoFEMErrorCode refineResults ()
 [Solve] More...
 
MoFEMErrorCode readMesh ()
 red mesh and randomly refine three times More...
 
MoFEMErrorCode setupProblem ()
 add field, and set up problem More...
 
MoFEMErrorCode assembleSystem ()
 
MoFEMErrorCode solveSystem ()
 
MoFEMErrorCode checkResults ()
 [Check results] More...
 
MoFEMErrorCode printResults ()
 [Check results] More...
 
MoFEMErrorCode readMesh ()
 
MoFEMErrorCode setupProblem ()
 
MoFEMErrorCode assembleSystem ()
 
MoFEMErrorCode solveSystem ()
 
MoFEMErrorCode checkResults ()
 

Private Attributes

MoFEM::InterfacemField
 
SimplesimpleInterface
 

Static Private Attributes

static ApproxFieldFunction< FIELD_DIMapproxFunction
 
static ApproxFieldFunctionDerivative< FIELD_DIMdivApproxFunction
 

Detailed Description

Examples
child_and_parent.cpp, hanging_node_approx.cpp, and higher_derivatives.cpp.

Definition at line 57 of file child_and_parent.cpp.

Constructor & Destructor Documentation

◆ AtomTest() [1/3]

AtomTest::AtomTest ( MoFEM::Interface m_field)
inline

Definition at line 59 of file child_and_parent.cpp.

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

◆ AtomTest() [2/3]

AtomTest::AtomTest ( MoFEM::Interface m_field)
inline

Definition at line 180 of file hanging_node_approx.cpp.

180: mField(m_field) {}

◆ AtomTest() [3/3]

AtomTest::AtomTest ( MoFEM::Interface m_field)
inline

Definition at line 78 of file higher_derivatives.cpp.

78: mField(m_field) {}

Member Function Documentation

◆ assembleSystem() [1/3]

MoFEMErrorCode AtomTest::assembleSystem ( )
private

[Push operators to pipeline]

[Set up problem]

[Push operators to pipeline]

Examples
child_and_parent.cpp, hanging_node_approx.cpp, and higher_derivatives.cpp.

Definition at line 290 of file child_and_parent.cpp.

290 {
293
294 auto rule = [](int, int, int p) -> int { return 2 * p; };
295
296 CHKERR pipeline_mng->setDomainLhsIntegrationRule(rule);
297 CHKERR pipeline_mng->setDomainRhsIntegrationRule(rule);
298
299 auto test_bit_parent = [](FEMethod *fe_ptr) {
300 const auto &bit = fe_ptr->numeredEntFiniteElementPtr->getBitRefLevel();
301 MOFEM_LOG("SELF", Sev::noisy) << bit << " " << bit.test(0);
302 return bit.test(0);
303 };
304
305 pipeline_mng->getDomainLhsFE()->exeTestHook = test_bit_parent;
306 pipeline_mng->getDomainRhsFE()->exeTestHook = test_bit_parent;
307
308 auto beta = [](const double, const double, const double) { return 1; };
309
310 // Make aliased shared pointer, and create child element
311 domainChildLhs = boost::make_shared<DomainEle>(mField);
312 domainChildLhs->getRuleHook = rule;
313 domainChildLhs->getOpPtrVector().push_back(
315
316 domainChildRhs = boost::make_shared<DomainEle>(mField);
317 domainChildLhs->getRuleHook = rule;
318 domainChildRhs->getOpPtrVector().push_back(
320
321 auto parent_op_lhs = new DomainEleOp(NOSPACE, DomainEleOp::OPSPACE);
322 parent_op_lhs->doWorkRhsHook = [&](DataOperator *op_ptr, int side,
325 auto domain_op = static_cast<DomainEleOp *>(op_ptr);
327
328 MOFEM_LOG("SELF", Sev::noisy) << "LHS Pipeline FE";
329
330 if (!domainChildLhs)
331 SETERRQ(PETSC_COMM_SELF, MOFEM_ATOM_TEST_INVALID, "FE not allocated");
332
333 auto &bit =
334 domain_op->getFEMethod()->numeredEntFiniteElementPtr->getBitRefLevel();
335 if (bit == BitRefLevel().set(0)) {
336 CHKERR domain_op->loopChildren(domain_op->getFEName(),
337 domainChildLhs.get(), VERBOSE, Sev::noisy);
338 } else {
339 CHKERR domain_op->loopThis(domain_op->getFEName(), domainChildLhs.get(),
340 VERBOSE, Sev::noisy);
341 }
343 };
344
345 auto parent_op_rhs = new DomainEleOp(NOSPACE, DomainEleOp::OPSPACE);
346 parent_op_rhs->doWorkRhsHook = [&](DataOperator *op_ptr, int side,
349 auto domain_op = static_cast<DomainEleOp *>(op_ptr);
351
352 MOFEM_LOG("SELF", Sev::noisy) << "RHS Pipeline FE";
353
354 if (!domainChildRhs)
355 SETERRQ(PETSC_COMM_SELF, MOFEM_ATOM_TEST_INVALID, "FE not allocated");
356
357 auto &bit =
358 domain_op->getFEMethod()->numeredEntFiniteElementPtr->getBitRefLevel();
359 if (bit == BitRefLevel().set(0)) {
360 CHKERR domain_op->loopChildren(domain_op->getFEName(),
361 domainChildRhs.get(), VERBOSE, Sev::noisy);
362 } else if ((bit & BitRefLevel().set(0)).any()) {
363 CHKERR domain_op->loopThis(domain_op->getFEName(), domainChildRhs.get(),
364 VERBOSE, Sev::noisy);
365 }
367 };
368
369 pipeline_mng->getOpDomainLhsPipeline().push_back(parent_op_lhs);
370 pipeline_mng->getOpDomainRhsPipeline().push_back(parent_op_rhs);
371
373}
static Index< 'p', 3 > p
boost::shared_ptr< DomainEle > domainChildRhs
boost::shared_ptr< DomainEle > domainChildLhs
[Set up problem]
@ VERBOSE
Definition: definitions.h:209
@ NOSPACE
Definition: definitions.h:83
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:346
@ MOFEM_ATOM_TEST_INVALID
Definition: definitions.h:40
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:416
#define CHKERR
Inline error check.
Definition: definitions.h:535
boost::ptr_deque< UserDataOperator > & getOpDomainLhsPipeline()
Get the Op Domain Lhs Pipeline object.
boost::ptr_deque< UserDataOperator > & getOpDomainRhsPipeline()
Get the Op Domain Rhs Pipeline object.
#define MOFEM_LOG(channel, severity)
Log.
Definition: LogManager.hpp:308
auto bit
set bit
constexpr char FIELD_NAME[]
DomainEle::UserDataOperator DomainEleOp
Finire element operator type.
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpMass< BASE_DIM, FIELD_DIM > OpDomainMass
OPerator to integrate mass matrix for least square approximation.
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpSource< BASE_DIM, FIELD_DIM > OpDomainSource
Operator to integrate the right hand side matrix for the problem.
std::bitset< BITREFLEVEL_SIZE > BitRefLevel
Bit structure attached to each entity identifying to what mesh entity is attached.
Definition: Types.hpp:40
static ApproxFieldFunction< FIELD_DIM > approxFunction
base operator to do operations at Gauss Pt. level
Data on single entity (This is passed as argument to DataOperator::doWork)
structure for User Loop Methods on finite elements
@ OPSPACE
operator do Work is execute on space data
PipelineManager interface.
boost::shared_ptr< FEMethod > & getDomainRhsFE()
boost::shared_ptr< FEMethod > & getDomainLhsFE()
MoFEMErrorCode setDomainRhsIntegrationRule(RuleHookFun rule)
MoFEMErrorCode setDomainLhsIntegrationRule(RuleHookFun rule)
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface refernce to pointer of interface.

◆ assembleSystem() [2/3]

MoFEMErrorCode AtomTest::assembleSystem ( )
private

◆ assembleSystem() [3/3]

MoFEMErrorCode AtomTest::assembleSystem ( )
private

◆ checkResults() [1/3]

MoFEMErrorCode AtomTest::checkResults ( )
private

[Check results]

Examples
child_and_parent.cpp, hanging_node_approx.cpp, and higher_derivatives.cpp.

Definition at line 578 of file hanging_node_approx.cpp.

578 {
581 pipeline_mng->getDomainLhsFE().reset();
582 pipeline_mng->getDomainRhsFE().reset();
583 pipeline_mng->getBoundaryRhsFE().reset();
584
585 auto rule = [](int, int, int p) -> int { return 2 * p + 1; };
586 CHKERR pipeline_mng->setDomainRhsIntegrationRule(rule);
587 CHKERR pipeline_mng->setBoundaryRhsIntegrationRule(rule);
588 pipeline_mng->getDomainRhsFE()->exeTestHook = test_bit_child;
589 pipeline_mng->getBoundaryRhsFE()->exeTestHook = test_bit_child;
590
591 auto common_data_ptr = boost::make_shared<CommonData>();
592 common_data_ptr->resVec = createDMVector(simpleInterface->getDM());
593 common_data_ptr->L2Vec = createVectorMPI(
594 mField.get_comm(), (!mField.get_comm_rank()) ? 1 : 0, 1);
595 common_data_ptr->approxVals = boost::make_shared<VectorDouble>();
596 common_data_ptr->divApproxVals = boost::make_shared<MatrixDouble>();
597
599 pipeline_mng->getOpDomainRhsPipeline(), {H1});
600 set_parent_dofs<DomainParentEle>(mField, pipeline_mng->getDomainRhsFE(),
601 DomainEleOp::OPSPACE, QUIET, Sev::noisy);
602 set_parent_dofs<DomainParentEle>(mField, pipeline_mng->getDomainRhsFE(),
603 DomainEleOp::OPROW, VERBOSE, Sev::noisy);
604
605 pipeline_mng->getOpDomainRhsPipeline().push_back(
607 FIELD_NAME, common_data_ptr->divApproxVals));
608 pipeline_mng->getOpDomainRhsPipeline().push_back(
610 common_data_ptr->approxVals));
611
612 pipeline_mng->getOpDomainRhsPipeline().push_back(
613 new OpError<FIELD_DIM>(common_data_ptr));
614
615 set_parent_dofs<BoundaryParentEle>(mField, pipeline_mng->getBoundaryRhsFE(),
616 BoundaryEleOp::OPSPACE, QUIET, Sev::noisy);
617 set_parent_dofs<BoundaryParentEle>(mField, pipeline_mng->getBoundaryRhsFE(),
618 BoundaryEleOp::OPROW, VERBOSE, Sev::noisy);
619 pipeline_mng->getOpBoundaryRhsPipeline().push_back(
621 common_data_ptr->approxVals));
622 pipeline_mng->getOpBoundaryRhsPipeline().push_back(
623 new OpErrorSkel<FIELD_DIM>(common_data_ptr));
624
625 CHKERR VecZeroEntries(common_data_ptr->L2Vec);
626 CHKERR VecZeroEntries(common_data_ptr->resVec);
627
628 CHKERR pipeline_mng->loopFiniteElements();
629
630 CHKERR VecAssemblyBegin(common_data_ptr->L2Vec);
631 CHKERR VecAssemblyEnd(common_data_ptr->L2Vec);
632 CHKERR VecAssemblyBegin(common_data_ptr->resVec);
633 CHKERR VecAssemblyEnd(common_data_ptr->resVec);
634 double nrm2;
635 CHKERR VecNorm(common_data_ptr->resVec, NORM_2, &nrm2);
636 const double *array;
637 CHKERR VecGetArrayRead(common_data_ptr->L2Vec, &array);
638 MOFEM_LOG_C("WORLD", Sev::inform, "Error %6.4e Vec norm %6.4e\n",
639 std::sqrt(array[0]), nrm2);
640
641 constexpr double eps = 1e-8;
642 if (nrm2 > eps)
643 SETERRQ1(PETSC_COMM_SELF, MOFEM_ATOM_TEST_INVALID,
644 "Not converged solution err = %6.4e", nrm2);
645 if (std::sqrt(array[0]) > eps)
646 SETERRQ1(PETSC_COMM_SELF, MOFEM_ATOM_TEST_INVALID,
647 "Error in approximation err = %6.4e", std::sqrt(array[0]));
648
649 CHKERR VecRestoreArrayRead(common_data_ptr->L2Vec, &array);
650
652}
#define MOFEM_LOG_C(channel, severity, format,...)
Definition: LogManager.hpp:311
static const double eps
@ QUIET
Definition: definitions.h:208
auto createDMVector(DM dm)
Get smart vector from DM.
Definition: DMMoFEM.hpp:1003
MoFEMErrorCode loopFiniteElements(SmartPetscObj< DM > dm=nullptr)
Iterate finite elements.
boost::ptr_deque< UserDataOperator > & getOpBoundaryRhsPipeline()
Get the Op Boundary Rhs Pipeline object.
auto test_bit_child
lambda function used to select elements on which finite element pipelines are executed.
auto createVectorMPI(MPI_Comm comm, PetscInt n, PetscInt N)
Create MPI Vector.
Simple * simpleInterface
Add operators pushing bases from local to physical configuration.
virtual MPI_Comm & get_comm() const =0
virtual int get_comm_rank() const =0
@ OPROW
operator doWork function is executed on FE rows
Get field gradients at integration pts for scalar filed rank 0, i.e. vector field.
Get value at integration points for scalar field.
MoFEMErrorCode setBoundaryRhsIntegrationRule(RuleHookFun rule)
boost::shared_ptr< FEMethod > & getBoundaryRhsFE()
MoFEMErrorCode getDM(DM *dm)
Get DM.
Definition: Simple.cpp:667

◆ checkResults() [2/3]

MoFEMErrorCode AtomTest::checkResults ( )
private

◆ checkResults() [3/3]

MoFEMErrorCode AtomTest::checkResults ( boost::function< bool(FEMethod *fe_method_ptr)>  test_bit)
private

[Postprocess results]

[Check results]

Definition at line 523 of file child_and_parent.cpp.

524 {
527 pipeline_mng->getDomainLhsFE().reset();
528 pipeline_mng->getDomainRhsFE().reset();
529 pipeline_mng->getBoundaryRhsFE().reset();
530
531 auto rule = [](int, int, int p) -> int { return 2 * p + 1; };
532 CHKERR pipeline_mng->setDomainRhsIntegrationRule(rule);
533 pipeline_mng->getDomainRhsFE()->exeTestHook = test_bit;
534
535 auto common_data_ptr = boost::make_shared<CommonData>();
536 common_data_ptr->resVec = createDMVector(simpleInterface->getDM());
537 common_data_ptr->L2Vec = createVectorMPI(
538 mField.get_comm(), (!mField.get_comm_rank()) ? 1 : 0, 1);
539 common_data_ptr->approxVals = boost::make_shared<VectorDouble>();
540
541 pipeline_mng->getOpDomainRhsPipeline().push_back(
543 common_data_ptr->approxVals));
544 pipeline_mng->getOpDomainRhsPipeline().push_back(
545 new OpError<FIELD_DIM>(common_data_ptr));
546
547 CHKERR VecZeroEntries(common_data_ptr->L2Vec);
548 CHKERR VecZeroEntries(common_data_ptr->resVec);
549
550 CHKERR pipeline_mng->loopFiniteElements();
551
552 CHKERR VecAssemblyBegin(common_data_ptr->L2Vec);
553 CHKERR VecAssemblyEnd(common_data_ptr->L2Vec);
554 CHKERR VecAssemblyBegin(common_data_ptr->resVec);
555 CHKERR VecAssemblyEnd(common_data_ptr->resVec);
556 double nrm2;
557 CHKERR VecNorm(common_data_ptr->resVec, NORM_2, &nrm2);
558 const double *array;
559 CHKERR VecGetArrayRead(common_data_ptr->L2Vec, &array);
560 MOFEM_LOG_C("WORLD", Sev::inform, "Error %6.4e Vec norm %6.4e\n",
561 std::sqrt(array[0]), nrm2);
562 CHKERR VecRestoreArrayRead(common_data_ptr->L2Vec, &array);
563
564 constexpr double eps = 1e-8;
565 if (nrm2 > eps)
566 SETERRQ1(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
567 "Not converged solution err = %6.4e", nrm2);
569}
@ MOFEM_DATA_INCONSISTENCY
Definition: definitions.h:31

◆ printResults()

MoFEMErrorCode AtomTest::printResults ( )
private

[Check results]

Examples
hanging_node_approx.cpp.

Definition at line 655 of file hanging_node_approx.cpp.

655 {
658 pipeline_mng->getDomainLhsFE().reset();
659 pipeline_mng->getDomainRhsFE().reset();
660
661 auto rule = [](int, int, int p) -> int { return -1; };
662 CHKERR pipeline_mng->setDomainRhsIntegrationRule(rule);
663
664 static_cast<ForcesAndSourcesCore *>(pipeline_mng->getDomainRhsFE().get())
665 ->setRuleHook = [](ForcesAndSourcesCore *fe_raw_ptr, int order_row,
666 int order_col, int order_data) -> MoFEMErrorCode {
668 fe_raw_ptr->gaussPts.resize(3, 3);
669 fe_raw_ptr->gaussPts(0, 0) = 0;
670 fe_raw_ptr->gaussPts(1, 0) = 0;
671 fe_raw_ptr->gaussPts(2, 0) = 0;
672 fe_raw_ptr->gaussPts(0, 1) = 1;
673 fe_raw_ptr->gaussPts(1, 1) = 0;
674 fe_raw_ptr->gaussPts(2, 1) = 0;
675 fe_raw_ptr->gaussPts(0, 2) = 0;
676 fe_raw_ptr->gaussPts(1, 2) = 1;
677 fe_raw_ptr->gaussPts(2, 2) = 0;
679 };
680
681 auto field_op_row = new ForcesAndSourcesCore::UserDataOperator(
683
684 auto approx_vals = boost::make_shared<VectorDouble>();
685
686 auto &moab = mField.get_moab();
687 Tag th;
688 double def_val[] = {0};
689 CHKERR moab.tag_get_handle("FIELD", 1, MB_TYPE_DOUBLE, th,
690 MB_TAG_CREAT | MB_TAG_SPARSE, &def_val);
691
692 field_op_row->doWorkRhsHook = [&](DataOperator *base_op_ptr, int side,
696 if (type == MBVERTEX) {
697 auto op_ptr =
698 static_cast<FaceElementForcesAndSourcesCore::UserDataOperator *>(
699 base_op_ptr);
700 auto t_field = getFTensor0FromVec(*approx_vals);
701 auto nb_gauss_pts = op_ptr->getGaussPts().size2();
702 if (nb_gauss_pts != 3)
703 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
704 "Should be three guass pts.");
705 auto conn = op_ptr->getConn();
706 for (auto gg = 0; gg != nb_gauss_pts; ++gg) {
707 const double v = t_field;
708 CHKERR moab.tag_set_data(th, &conn[gg], 1, &v);
709 ++t_field;
710 }
711 }
713 };
714
715 set_parent_dofs<DomainParentEle>(mField, pipeline_mng->getDomainRhsFE(),
716 DomainEleOp::OPSPACE, VERBOSE, Sev::noisy);
717 set_parent_dofs<DomainParentEle>(mField, pipeline_mng->getDomainRhsFE(),
718 DomainEleOp::OPROW, VERBOSE, Sev::noisy);
719 pipeline_mng->getOpDomainRhsPipeline().push_back(
720 new OpCalculateScalarFieldValues(FIELD_NAME, approx_vals));
721 pipeline_mng->getOpDomainRhsPipeline().push_back(field_op_row);
722 CHKERR pipeline_mng->loopFiniteElements();
723
724 CHKERR mField.getInterface<BitRefManager>()->writeBitLevelByType(
725 bit(nb_ref_levels), BitRefLevel().set(), MBTRI, "out.vtk", "VTK", "");
726
728}
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:447
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:440
constexpr int nb_ref_levels
Three levels of refinement.
const double v
phase velocity of light in medium (cm/ns)
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
Definition: Exceptions.hpp:56
static auto getFTensor0FromVec(ublas::vector< T, A > &data)
Get tensor rank 0 (scalar) form data vector.
Definition: Templates.hpp:135
Managing BitRefLevels.
virtual moab::Interface & get_moab()=0
structure to get information form mofem into EntitiesFieldData
MatrixDouble gaussPts
Matrix of integration points.

◆ readMesh() [1/3]

MoFEMErrorCode AtomTest::readMesh ( )
private

[Run programme]

[Read mesh]

Examples
child_and_parent.cpp, hanging_node_approx.cpp, and higher_derivatives.cpp.

Definition at line 208 of file child_and_parent.cpp.

208 {
210
214
215 MOFEM_LOG("WORLD", Sev::verbose) << "Dim " << simpleInterface->getDim();
216
217 auto bit_level0 = simpleInterface->getBitRefLevel();
218
219 auto &moab = mField.get_moab();
220
221 auto refine_mesh = [&](auto bit_level1) {
223
224 auto refine = mField.getInterface<MeshRefinement>();
225
226 auto meshset_level0_ptr = get_temp_meshset_ptr(moab);
227 CHKERR mField.getInterface<BitRefManager>()->getEntitiesByRefLevel(
228 bit_level0, BitRefLevel().set(), *meshset_level0_ptr);
229
230 // random mesh refinement
231 auto meshset_ref_edges_ptr = get_temp_meshset_ptr(moab);
232 Range edges_to_refine;
233 CHKERR moab.get_entities_by_type(*meshset_level0_ptr, MBEDGE,
234 edges_to_refine);
235 int ii = 0;
236 for (Range::iterator eit = edges_to_refine.begin();
237 eit != edges_to_refine.end(); eit++, ii++) {
238 int numb = ii % 2;
239 if (numb == 0) {
240 CHKERR moab.add_entities(*meshset_ref_edges_ptr, &*eit, 1);
241 }
242 }
243 CHKERR refine->addVerticesInTheMiddleOfEdges(*meshset_ref_edges_ptr,
244 bit_level1, false, VERBOSE);
245 if (simpleInterface->getDim() == 3) {
246 CHKERR refine->refineTets(*meshset_level0_ptr, bit_level1, VERBOSE);
247 } else if (simpleInterface->getDim() == 2) {
248 CHKERR refine->refineTris(*meshset_level0_ptr, bit_level1, VERBOSE);
249 } else {
250 SETERRQ(PETSC_COMM_WORLD, MOFEM_ATOM_TEST_INVALID,
251 "Dimension not handled by test");
252 }
253
255 };
256
257 BitRefLevel bit_level1;
258 bit_level1.set(1);
259 CHKERR refine_mesh(bit_level1);
262
264}
auto get_temp_meshset_ptr(moab::Interface &moab)
Create smart pointer to temporary meshset.
Definition: Templates.hpp:1626
Mesh refinement interface.
int getDim() const
Get the problem dimension.
Definition: Simple.hpp:271
MoFEMErrorCode getOptions()
get options
Definition: Simple.cpp:180
MoFEMErrorCode loadFile(const std::string options, const std::string mesh_file_name)
Load mesh file.
Definition: Simple.cpp:194
BitRefLevel & getBitRefLevelMask()
Get the BitRefLevel.
Definition: Simple.hpp:320
BitRefLevel & getBitRefLevel()
Get the BitRefLevel.
Definition: Simple.hpp:313

◆ readMesh() [2/3]

MoFEMErrorCode AtomTest::readMesh ( )
private

red mesh and randomly refine three times

Returns
MoFEMErrorCode

◆ readMesh() [3/3]

MoFEMErrorCode AtomTest::readMesh ( )
private

◆ refineResults()

MoFEMErrorCode AtomTest::refineResults ( )
private

[Solve]

Examples
child_and_parent.cpp.

Definition at line 399 of file child_and_parent.cpp.

399 {
401
402 auto &moab = mField.get_moab();
403
404 auto bit_level0 = BitRefLevel().set(0);
405 auto bit_level1 = BitRefLevel().set(1);
406 auto bit_level2 = BitRefLevel().set(2);
407
408 auto refine_mesh = [&]() {
410
411 auto refine = mField.getInterface<MeshRefinement>();
412
413 auto meshset_level1_ptr = get_temp_meshset_ptr(moab);
414 CHKERR mField.getInterface<BitRefManager>()->getEntitiesByDimAndRefLevel(
415 bit_level1, BitRefLevel().set(), simpleInterface->getDim(),
416 *meshset_level1_ptr);
417
418 // random mesh refinement
419 auto meshset_ref_edges_ptr = get_temp_meshset_ptr(moab);
420 Range edges_to_refine;
421 CHKERR mField.getInterface<BitRefManager>()->getEntitiesByTypeAndRefLevel(
422 bit_level1, BitRefLevel().set(), MBEDGE, edges_to_refine);
423
424 CHKERR refine->addVerticesInTheMiddleOfEdges(edges_to_refine, bit_level2,
425 VERBOSE);
426 if (simpleInterface->getDim() == 3) {
427 CHKERR refine->refineTets(*meshset_level1_ptr, bit_level2, VERBOSE);
428 } else if (simpleInterface->getDim() == 2) {
429 CHKERR refine->refineTris(*meshset_level1_ptr, bit_level2, VERBOSE);
430 } else {
431 SETERRQ(PETSC_COMM_WORLD, MOFEM_ATOM_TEST_INVALID,
432 "Dimension not handled by test");
433 }
434
435 Range meshsets;
436 CHKERR moab.get_entities_by_type(0, MBENTITYSET, meshsets, true);
437 for (auto m : meshsets) {
439 ->updateMeshsetByEntitiesChildren(m, bit_level2, m, MBMAXTYPE, false);
440 }
441
443 };
444
445 CHKERR refine_mesh();
446
447 simpleInterface->getBitRefLevel() = bit_level1 | bit_level2;
449
451
452 CHKERR mField.getInterface<ProblemsManager>()->removeDofsOnEntities(
454 bit_level0 | bit_level1);
455
456 auto project_data = [&]() {
458
460
461 pipeline_mng->getDomainLhsFE().reset();
462 pipeline_mng->getDomainRhsFE().reset();
463 pipeline_mng->getBoundaryRhsFE().reset();
464
465 auto rule = [](int, int, int p) -> int { return 2 * p; };
466
467 CHKERR pipeline_mng->setDomainLhsIntegrationRule(rule);
468 CHKERR pipeline_mng->setDomainRhsIntegrationRule(rule);
469 CHKERR pipeline_mng->setBoundaryRhsIntegrationRule(rule);
470
471 auto test_bit_ref = [](FEMethod *fe_ptr) {
472 const auto &bit = fe_ptr->numeredEntFiniteElementPtr->getBitRefLevel();
473 MOFEM_LOG("SELF", Sev::noisy) << "ref : " << bit << " " << bit.test(2);
474 return bit.test(2);
475 };
476
477 pipeline_mng->getDomainLhsFE()->exeTestHook = test_bit_ref;
478 pipeline_mng->getDomainRhsFE()->exeTestHook = test_bit_ref;
479 pipeline_mng->getBoundaryRhsFE()->exeTestHook = test_bit_ref;
480
481 auto beta = [](const double, const double, const double) { return 1; };
482 auto field_vals_ptr = boost::make_shared<VectorDouble>();
483
484 auto domainParentRhs = boost::make_shared<DomainParentEle>(mField);
485 domainParentRhs->getOpPtrVector().push_back(
486 new OpCalculateScalarFieldValues(FIELD_NAME, field_vals_ptr));
487
488 pipeline_mng->getOpDomainLhsPipeline().push_back(
490 pipeline_mng->getOpDomainRhsPipeline().push_back(
491 new OpRunParent(domainParentRhs, bit_level2, bit_level2,
492 domainParentRhs, bit_level2, BitRefLevel().set()));
493
496 pipeline_mng->getOpDomainRhsPipeline().push_back(
497 new OpDomainTimesScalarField(FIELD_NAME, field_vals_ptr, beta));
498
499 pipeline_mng->getOpDomainRhsPipeline().push_back(
501
502 pipeline_mng->getOpBoundaryRhsPipeline().push_back(
504
506
507 simpleInterface->getBitRefLevel() = bit_level2;
510
511 CHKERR checkResults([](FEMethod *fe_ptr) { return true; });
512
514 };
515
516 CHKERR project_data();
517
519}
FTensor::Index< 'm', SPACE_DIM > m
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpBaseTimesScalar< 1 > OpDomainTimesScalarField
MoFEMErrorCode checkResults()
[Check results]
MoFEMErrorCode solveSystem()
[Push operators to pipeline]
Operator to execute finite element instance on parent element. This operator is typically used to pro...
Problem manager is used to build and partition problems.
MoFEMErrorCode reSetUp(bool only_dm=false)
Rebuild internal MoFEM data structures.
Definition: Simple.cpp:633
const std::string getProblemName() const
Get the Problem Name.
Definition: Simple.hpp:348

◆ runProblem() [1/3]

MoFEMErrorCode AtomTest::runProblem ( )

[Run programme]

Examples
child_and_parent.cpp, hanging_node_approx.cpp, and higher_derivatives.cpp.

Definition at line 188 of file child_and_parent.cpp.

188 {
194
195 auto test_bit_child = [](FEMethod *fe_ptr) {
196 const auto &bit = fe_ptr->numeredEntFiniteElementPtr->getBitRefLevel();
197 MOFEM_LOG("SELF", Sev::noisy) << bit << " " << bit.test(0);
198 return bit.test(1);
199 };
200
204}
MoFEMErrorCode setupProblem()
[Read mesh]
MoFEMErrorCode refineResults()
[Solve]
MoFEMErrorCode readMesh()
[Run programme]
MoFEMErrorCode assembleSystem()
[Push operators to pipeline]

◆ runProblem() [2/3]

MoFEMErrorCode AtomTest::runProblem ( )

◆ runProblem() [3/3]

MoFEMErrorCode AtomTest::runProblem ( )

◆ setupProblem() [1/3]

MoFEMErrorCode AtomTest::setupProblem ( )
private

[Read mesh]

[Set up problem]

Examples
child_and_parent.cpp, hanging_node_approx.cpp, and higher_derivatives.cpp.

Definition at line 268 of file child_and_parent.cpp.

268 {
270 // Add field
275 constexpr int order = 4;
278
279 CHKERR mField.getInterface<ProblemsManager>()->removeDofsOnEntities(
281 BitRefLevel().set(0));
282
284}
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base .
Definition: definitions.h:60
@ H1
continuous field
Definition: definitions.h:85
constexpr int FIELD_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:264
MoFEMErrorCode setFieldOrder(const std::string field_name, const int order, const Range *ents=NULL)
Set field order.
Definition: Simple.cpp:473
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:282
MoFEMErrorCode setUp(const PetscBool is_partitioned=PETSC_TRUE)
Setup problem.
Definition: Simple.cpp:611

◆ setupProblem() [2/3]

MoFEMErrorCode AtomTest::setupProblem ( )
private

add field, and set up problem

Returns
MoFEMErrorCode

◆ setupProblem() [3/3]

MoFEMErrorCode AtomTest::setupProblem ( )
private

◆ solveSystem() [1/3]

MoFEMErrorCode AtomTest::solveSystem ( )
private

[Push operators to pipeline]

[Solve]

Examples
child_and_parent.cpp, hanging_node_approx.cpp, and higher_derivatives.cpp.

Definition at line 377 of file child_and_parent.cpp.

377 {
380
381 MOFEM_LOG("WORLD", Sev::inform) << "Solve problem";
382
383 auto solver = pipeline_mng->createKSP();
384 CHKERR KSPSetFromOptions(solver);
385 CHKERR KSPSetUp(solver);
386
387 auto dm = simpleInterface->getDM();
388 auto D = createDMVector(dm);
389 auto F = vectorDuplicate(D);
390
391 CHKERR KSPSolve(solver, F, D);
392 CHKERR VecGhostUpdateBegin(D, INSERT_VALUES, SCATTER_FORWARD);
393 CHKERR VecGhostUpdateEnd(D, INSERT_VALUES, SCATTER_FORWARD);
394 CHKERR DMoFEMMeshToLocalVector(dm, D, INSERT_VALUES, SCATTER_REVERSE);
396}
@ 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:509
SmartPetscObj< KSP > createKSP(SmartPetscObj< DM > dm=nullptr)
Create KSP (linear) solver.
double D
SmartPetscObj< Vec > vectorDuplicate(Vec vec)
Create duplicate vector of smart vector.

◆ solveSystem() [2/3]

MoFEMErrorCode AtomTest::solveSystem ( )
private

◆ solveSystem() [3/3]

MoFEMErrorCode AtomTest::solveSystem ( )
private

Member Data Documentation

◆ approxFunction

ApproxFieldFunction< FIELD_DIM > AtomTest::approxFunction
staticprivate

◆ divApproxFunction

ApproxFieldFunctionDerivative< FIELD_DIM > AtomTest::divApproxFunction
staticprivate

◆ mField

MoFEM::Interface & AtomTest::mField
private

◆ simpleInterface

Simple * AtomTest::simpleInterface
private

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