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 184 of file hanging_node_approx.cpp.

184: 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_vector< UserDataOperator > & getOpDomainLhsPipeline()
Get the Op Domain Lhs Pipeline object.
boost::ptr_vector< UserDataOperator > & getOpDomainRhsPipeline()
Get the Op Domain Rhs Pipeline object.
#define MOFEM_LOG(channel, severity)
Log.
Definition: LogManager.hpp:301
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 583 of file hanging_node_approx.cpp.

583 {
586 pipeline_mng->getDomainLhsFE().reset();
587 pipeline_mng->getDomainRhsFE().reset();
588 pipeline_mng->getBoundaryRhsFE().reset();
589
590 auto rule = [](int, int, int p) -> int { return 2 * p + 1; };
591 CHKERR pipeline_mng->setDomainRhsIntegrationRule(rule);
592 CHKERR pipeline_mng->setBoundaryRhsIntegrationRule(rule);
593 pipeline_mng->getDomainRhsFE()->exeTestHook = test_bit_child;
594 pipeline_mng->getBoundaryRhsFE()->exeTestHook = test_bit_child;
595
596 auto common_data_ptr = boost::make_shared<CommonData>();
597 common_data_ptr->resVec = smartCreateDMVector(simpleInterface->getDM());
598 common_data_ptr->L2Vec = createSmartVectorMPI(
599 mField.get_comm(), (!mField.get_comm_rank()) ? 1 : 0, 1);
600 common_data_ptr->approxVals = boost::make_shared<VectorDouble>();
601 common_data_ptr->divApproxVals = boost::make_shared<MatrixDouble>();
602
604 pipeline_mng->getOpDomainRhsPipeline(), {H1});
605 set_parent_dofs<DomainParentEle>(mField, pipeline_mng->getDomainRhsFE(),
606 DomainEleOp::OPSPACE, QUIET, Sev::noisy);
607 set_parent_dofs<DomainParentEle>(mField, pipeline_mng->getDomainRhsFE(),
608 DomainEleOp::OPROW, VERBOSE, Sev::noisy);
609
610 pipeline_mng->getOpDomainRhsPipeline().push_back(
612 FIELD_NAME, common_data_ptr->divApproxVals));
613 pipeline_mng->getOpDomainRhsPipeline().push_back(
615 common_data_ptr->approxVals));
616
617 pipeline_mng->getOpDomainRhsPipeline().push_back(
618 new OpError<FIELD_DIM>(common_data_ptr));
619
620 set_parent_dofs<BoundaryParentEle>(mField, pipeline_mng->getBoundaryRhsFE(),
621 BoundaryEleOp::OPSPACE, QUIET, Sev::noisy);
622 set_parent_dofs<BoundaryParentEle>(mField, pipeline_mng->getBoundaryRhsFE(),
623 BoundaryEleOp::OPROW, VERBOSE, Sev::noisy);
624 pipeline_mng->getOpBoundaryRhsPipeline().push_back(
626 common_data_ptr->approxVals));
627 pipeline_mng->getOpBoundaryRhsPipeline().push_back(
628 new OpErrorSkel<FIELD_DIM>(common_data_ptr));
629
630 CHKERR VecZeroEntries(common_data_ptr->L2Vec);
631 CHKERR VecZeroEntries(common_data_ptr->resVec);
632
633 CHKERR pipeline_mng->loopFiniteElements();
634
635 CHKERR VecAssemblyBegin(common_data_ptr->L2Vec);
636 CHKERR VecAssemblyEnd(common_data_ptr->L2Vec);
637 CHKERR VecAssemblyBegin(common_data_ptr->resVec);
638 CHKERR VecAssemblyEnd(common_data_ptr->resVec);
639 double nrm2;
640 CHKERR VecNorm(common_data_ptr->resVec, NORM_2, &nrm2);
641 const double *array;
642 CHKERR VecGetArrayRead(common_data_ptr->L2Vec, &array);
643 MOFEM_LOG_C("WORLD", Sev::inform, "Error %6.4e Vec norm %6.4e\n",
644 std::sqrt(array[0]), nrm2);
645
646 constexpr double eps = 1e-8;
647 if (nrm2 > eps)
648 SETERRQ1(PETSC_COMM_SELF, MOFEM_ATOM_TEST_INVALID,
649 "Not converged solution err = %6.4e", nrm2);
650 if (std::sqrt(array[0]) > eps)
651 SETERRQ1(PETSC_COMM_SELF, MOFEM_ATOM_TEST_INVALID,
652 "Error in approximation err = %6.4e", std::sqrt(array[0]));
653
654 CHKERR VecRestoreArrayRead(common_data_ptr->L2Vec, &array);
655
657}
#define MOFEM_LOG_C(channel, severity, format,...)
Definition: LogManager.hpp:304
static const double eps
@ QUIET
Definition: definitions.h:208
auto smartCreateDMVector(DM dm)
Get smart vector from DM.
Definition: DMMoFEM.hpp:978
MoFEMErrorCode loopFiniteElements(SmartPetscObj< DM > dm=nullptr)
Iterate finite elements.
boost::ptr_vector< 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 createSmartVectorMPI(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:668

◆ 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 = smartCreateDMVector(simpleInterface->getDM());
537 common_data_ptr->L2Vec = createSmartVectorMPI(
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 660 of file hanging_node_approx.cpp.

660 {
663 pipeline_mng->getDomainLhsFE().reset();
664 pipeline_mng->getDomainRhsFE().reset();
665
666 auto rule = [](int, int, int p) -> int { return -1; };
667 CHKERR pipeline_mng->setDomainRhsIntegrationRule(rule);
668
669 static_cast<ForcesAndSourcesCore *>(pipeline_mng->getDomainRhsFE().get())
670 ->setRuleHook = [](ForcesAndSourcesCore *fe_raw_ptr, int order_row,
671 int order_col, int order_data) -> MoFEMErrorCode {
673 fe_raw_ptr->gaussPts.resize(3, 3);
674 fe_raw_ptr->gaussPts(0, 0) = 0;
675 fe_raw_ptr->gaussPts(1, 0) = 0;
676 fe_raw_ptr->gaussPts(2, 0) = 0;
677 fe_raw_ptr->gaussPts(0, 1) = 1;
678 fe_raw_ptr->gaussPts(1, 1) = 0;
679 fe_raw_ptr->gaussPts(2, 1) = 0;
680 fe_raw_ptr->gaussPts(0, 2) = 0;
681 fe_raw_ptr->gaussPts(1, 2) = 1;
682 fe_raw_ptr->gaussPts(2, 2) = 0;
684 };
685
686 auto field_op_row = new ForcesAndSourcesCore::UserDataOperator(
688
689 auto approx_vals = boost::make_shared<VectorDouble>();
690
691 auto &moab = mField.get_moab();
692 Tag th;
693 double def_val[] = {0};
694 CHKERR moab.tag_get_handle("FIELD", 1, MB_TYPE_DOUBLE, th,
695 MB_TAG_CREAT | MB_TAG_SPARSE, &def_val);
696
697 field_op_row->doWorkRhsHook = [&](DataOperator *base_op_ptr, int side,
701 if (type == MBVERTEX) {
702 auto op_ptr =
703 static_cast<FaceElementForcesAndSourcesCore::UserDataOperator *>(
704 base_op_ptr);
705 auto t_field = getFTensor0FromVec(*approx_vals);
706 auto nb_gauss_pts = op_ptr->getGaussPts().size2();
707 if (nb_gauss_pts != 3)
708 SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
709 "Should be three guass pts.");
710 auto conn = op_ptr->getConn();
711 for (auto gg = 0; gg != nb_gauss_pts; ++gg) {
712 const double v = t_field;
713 CHKERR moab.tag_set_data(th, &conn[gg], 1, &v);
714 ++t_field;
715 }
716 }
718 };
719
720 set_parent_dofs<DomainParentEle>(mField, pipeline_mng->getDomainRhsFE(),
721 DomainEleOp::OPSPACE, VERBOSE, Sev::noisy);
722 set_parent_dofs<DomainParentEle>(mField, pipeline_mng->getDomainRhsFE(),
723 DomainEleOp::OPROW, VERBOSE, Sev::noisy);
724 pipeline_mng->getOpDomainRhsPipeline().push_back(
725 new OpCalculateScalarFieldValues(FIELD_NAME, approx_vals));
726 pipeline_mng->getOpDomainRhsPipeline().push_back(field_op_row);
727 CHKERR pipeline_mng->loopFiniteElements();
728
729 CHKERR mField.getInterface<BitRefManager>()->writeBitLevelByType(
730 bit(nb_ref_levels), BitRefLevel().set(), MBTRI, "out.vtk", "VTK", "");
731
733}
#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:1586
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:313
BitRefLevel & getBitRefLevel()
Get the BitRefLevel.
Definition: Simple.hpp:306

◆ 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:634
const std::string getProblemName() const
Get the Problem Name.
Definition: Simple.hpp:341

◆ 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:476
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 = smartCreateDMVector(dm);
389 auto F = smartVectorDuplicate(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}
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:491
SmartPetscObj< KSP > createKSP(SmartPetscObj< DM > dm=nullptr)
Create KSP (linear) solver.
double D
SmartPetscObj< Vec > smartVectorDuplicate(SmartPetscObj< 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: