2388 {
2390
2391
2395
2396 auto lhs_fe = boost::make_shared<DomainEle>(
mField);
2397 auto rhs_fe_prj = boost::make_shared<DomainEle>(
mField);
2398 auto rhs_fe_current = boost::make_shared<DomainEle>(
mField);
2399
2400 lhs_fe->getRuleHook = [](
int,
int,
int o) {
return 3 * o; };
2401 rhs_fe_prj->getRuleHook = [](
int,
int,
int o) {
return 3 * o; };
2402 rhs_fe_current->getRuleHook = [](
int,
int,
int o) {
return 3 * o; };
2403
2411
2415 current_ents);
2417 CHKERR bit_mng->getEntitiesByDimAndRefLevel(
2420 CHKERR bit_mng->updateRangeByParent(prj_ents, prj_ents);
2421 }
2422 current_ents = subtract(
2423 current_ents, prj_ents);
2424
2425 auto test_mesh_bit = [&](
FEMethod *fe_ptr) {
2426 return fe_ptr->numeredEntFiniteElementPtr->getBitRefLevel().test(
2428 };
2429 auto test_prj_bit = [&](
FEMethod *fe_ptr) {
2430 return fe_ptr->numeredEntFiniteElementPtr->getBitRefLevel().test(
2432 };
2433 auto test_current_bit = [&](
FEMethod *fe_ptr) {
2434 return current_ents.find(fe_ptr->getFEEntityHandle()) != current_ents.end();
2435 };
2436
2437 lhs_fe->exeTestHook =
2438 test_mesh_bit;
2439 rhs_fe_prj->exeTestHook =
2440 test_prj_bit;
2441 rhs_fe_current->exeTestHook =
2442 test_current_bit;
2443
2445 remove_mask.flip();
2446 CHKERR prb_mng->removeDofsOnEntities(
2447 "DG_PROJECTION",
"L",
BitRefLevel().set(), remove_mask,
nullptr, 0,
2449 true);
2450
2451
2453 {L2});
2454 lhs_fe->getOpPtrVector().push_back(
2456
2457 auto make_tensor_mat_to_vec_mat_op = [](auto src_mat_ptr, auto dst_mat_ptr) {
2459 op_ptr->doWorkRhsHook = [src_mat_ptr, dst_mat_ptr](
DataOperator *op_ptr,
2463 const auto nb_gauss_pts =
2464 static_cast<DomainEleOp *
>(op_ptr)->getGaussPts().size2();
2465 auto &src_mat = *src_mat_ptr;
2466 auto &dst_mat = *dst_mat_ptr;
2467#ifndef NDEBUG
2468 if (src_mat.size1() != nb_gauss_pts)
2470 "Wrong number of integration pts %zu != %zu", src_mat.size1(),
2471 nb_gauss_pts);
2472 if (src_mat.size2() !=
DIM1 *
DIM2)
2474 "Wrong tensor components layout %zu != %d", src_mat.size2(),
2476#endif
2477 dst_mat.resize(nb_gauss_pts,
DIM1 *
DIM2,
false);
2478 for (size_t gg = 0; gg != nb_gauss_pts; ++gg)
2480 dst_mat(gg, dd) = src_mat(gg, dd);
2482 };
2483 return op_ptr;
2484 };
2485
2486
2487 auto set_prj_from_child = [&](auto rhs_fe_prj) {
2489 rhs_fe_prj->getOpPtrVector(), {L2});
2490
2491
2492 auto l_tensor_mat = boost::make_shared<MatrixDouble>();
2493 auto l_vec_mat = boost::make_shared<MatrixDouble>();
2494 rhs_fe_prj->getOpPtrVector().push_back(
2496 rhs_fe_prj->getOpPtrVector().push_back(
2497 make_tensor_mat_to_vec_mat_op(l_tensor_mat, l_vec_mat));
2498
2499
2500 auto get_parent_this = [&]() {
2501 auto fe_parent_this = boost::make_shared<DomainParentEle>(
mField);
2502 fe_parent_this->getOpPtrVector().push_back(
2504 return fe_parent_this;
2505 };
2506
2507
2508
2509 auto get_parents_fe_ptr = [&](auto this_fe_ptr) {
2510 std::vector<boost::shared_ptr<DomainParentEle>> parents_elems_ptr_vec;
2512 parents_elems_ptr_vec.emplace_back(
2513 boost::make_shared<DomainParentEle>(
mField));
2515 parents_elems_ptr_vec[
l - 1]->getOpPtrVector().push_back(
2520 }
2521 return parents_elems_ptr_vec[0];
2522 };
2523
2524 auto this_fe_ptr = get_parent_this();
2525 auto parent_fe_ptr = get_parents_fe_ptr(this_fe_ptr);
2526 rhs_fe_prj->getOpPtrVector().push_back(
2530 };
2531
2532
2533 auto set_prj_from_parent = [&](auto rhs_fe_current) {
2534
2535
2536 auto l_tensor_mat = boost::make_shared<MatrixDouble>();
2537 auto l_vec_mat = boost::make_shared<MatrixDouble>();
2538
2539
2540 auto get_parent_this = [&]() {
2541 auto fe_parent_this = boost::make_shared<DomainParentEle>(
mField);
2542 fe_parent_this->getOpPtrVector().push_back(
2544 fe_parent_this->getOpPtrVector().push_back(
2545 make_tensor_mat_to_vec_mat_op(l_tensor_mat, l_vec_mat));
2546 return fe_parent_this;
2547 };
2548
2549
2550 auto get_parents_fe_ptr = [&](auto this_fe_ptr) {
2551 std::vector<boost::shared_ptr<DomainParentEle>> parents_elems_ptr_vec;
2553 parents_elems_ptr_vec.emplace_back(
2554 boost::make_shared<DomainParentEle>(
mField));
2556 parents_elems_ptr_vec[
l - 1]->getOpPtrVector().push_back(
2561 }
2562 return parents_elems_ptr_vec[0];
2563 };
2564
2565 auto this_fe_ptr = get_parent_this();
2566 auto parent_fe_ptr = get_parents_fe_ptr(this_fe_ptr);
2567
2569 reset_op_ptr->doWorkRhsHook = [&](
DataOperator *op_ptr,
int, EntityType,
2571 l_vec_mat->resize(
2572 static_cast<DomainEleOp *
>(op_ptr)->getGaussPts().size2(),
2574 l_vec_mat->clear();
2575 return 0;
2576 };
2577 rhs_fe_current->getOpPtrVector().push_back(reset_op_ptr);
2578 rhs_fe_current->getOpPtrVector().push_back(
2582
2583
2584 rhs_fe_current->getOpPtrVector().push_back(
2586 };
2587
2588 set_prj_from_child(rhs_fe_prj);
2589 set_prj_from_parent(rhs_fe_current);
2590
2591 boost::shared_ptr<FEMethod> null_fe;
2594 lhs_fe, null_fe, null_fe);
2596 null_fe, null_fe);
2598 rhs_fe_current, null_fe, null_fe);
2600 CHKERR KSPSetDM(ksp, sub_dm);
2601
2602 CHKERR KSPSetDM(ksp, sub_dm);
2603 CHKERR KSPSetFromOptions(ksp);
2605
2608
2610 CHKERR VecGhostUpdateBegin(
L, INSERT_VALUES, SCATTER_FORWARD);
2611 CHKERR VecGhostUpdateEnd(
L, INSERT_VALUES, SCATTER_FORWARD);
2613
2615 MOFEM_LOG(
"LevelSet", Sev::inform) <<
"Error indicator " << error;
2616
2617 auto post_proc = [&](auto dm, auto out_name, auto th_error) {
2619 auto post_proc_fe =
2620 boost::make_shared<PostProcBrokenMeshInMoab<DomainEle>>(
mField);
2621 post_proc_fe->setTagsToTransfer({th_error});
2622 post_proc_fe->exeTestHook = test_mesh_bit;
2623
2624 if constexpr (
DIM1 == 1 &&
DIM2 == 1) {
2626 auto l_vec = boost::make_shared<VectorDouble>();
2627 auto l_grad_mat = boost::make_shared<MatrixDouble>();
2629 post_proc_fe->getOpPtrVector(), {L2});
2630 post_proc_fe->getOpPtrVector().push_back(
2632 post_proc_fe->getOpPtrVector().push_back(
2634
2635 post_proc_fe->getOpPtrVector().push_back(
2636
2638
2639 post_proc_fe->getPostProcMesh(), post_proc_fe->getMapGaussPts(),
2640
2641 {{"L", l_vec}},
2642
2643 {{"GradL", l_grad_mat}},
2644
2645 {}, {})
2646
2647 );
2648 }
2649
2651 post_proc_fe);
2652 post_proc_fe->writeFile(out_name);
2654 };
2655
2656 if constexpr (
debug)
2657 CHKERR post_proc(sub_dm,
"dg_projection.h5m", th_error);
2658
2660}
void simple(double P1[], double P2[], double P3[], double c[], const int N)
#define MAX_DOFS_ON_ENTITY
Maximal number of DOFs on entity.
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ MOFEM_DATA_INCONSISTENCY
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
PetscErrorCode DMMoFEMCreateSubDM(DM subdm, DM dm, const char problem_name[])
Must be called by user to set Sub DM MoFEM data structures.
PetscErrorCode DMMoFEMAddElement(DM dm, std::string fe_name)
add element to dm
PetscErrorCode DMMoFEMSetSquareProblem(DM dm, PetscBool square_problem)
set squared problem
PetscErrorCode DMMoFEMAddSubFieldRow(DM dm, const char field_name[])
PetscErrorCode DMoFEMMeshToLocalVector(DM dm, Vec l, InsertMode mode, ScatterMode scatter_mode, RowColData rc=RowColData::COL)
set local (or ghosted) vector values on mesh for partition only
PetscErrorCode DMMoFEMKSPSetComputeRHS(DM dm, const char fe_name[], MoFEM::FEMethod *method, MoFEM::BasicMethod *pre_only, MoFEM::BasicMethod *post_only)
set KSP right hand side evaluation function
PetscErrorCode DMoFEMLoopFiniteElements(DM dm, const char fe_name[], MoFEM::FEMethod *method, CacheTupleWeakPtr cache_ptr=CacheTupleSharedPtr())
Executes FEMethod for finite elements in DM.
auto createDMVector(DM dm, RowColData rc=RowColData::COL)
Get smart vector from DM.
PetscErrorCode DMMoFEMKSPSetComputeOperators(DM dm, const char fe_name[], MoFEM::FEMethod *method, MoFEM::BasicMethod *pre_only, MoFEM::BasicMethod *post_only)
Set KSP operators and push mofem finite element methods.
#define MOFEM_LOG(channel, severity)
Log.
constexpr int FE_DIM
[Define dimension]
constexpr int current_bit
dofs bit used to do calculations
DomainEle::UserDataOperator DomainEleOp
constexpr int projection_bit
FTensor::Index< 'l', 3 > l
const Tensor2_symmetric_Expr< const ddTensor0< T, Dim, i, j >, typename promote< T, double >::V, Dim, i, j > dd(const Tensor0< T * > &a, const Index< i, Dim > index1, const Index< j, Dim > index2, const Tensor1< int, Dim > &d_ijk, const Tensor1< double, Dim > &d_xyz)
std::bitset< BITREFLEVEL_SIZE > BitRefLevel
Bit structure attached to each entity identifying to what mesh entity is attached.
auto createKSP(MPI_Comm comm)
PetscErrorCode DMMoFEMSetDestroyProblem(DM dm, PetscBool destroy_problem)
SmartPetscObj< Vec > vectorDuplicate(Vec vec)
Create duplicate vector of smart vector.
auto getDMKspCtx(DM dm)
Get KSP context data structure used by DM.
auto createDM(MPI_Comm comm, const std::string dm_type_name)
Creates smart DM object.
OpPostProcMapInMoab< SPACE_DIM, SPACE_DIM > OpPPMap
FormsIntegrators< DomainEleOp >::Assembly< A >::BiLinearForm< G >::OpMass< 1, DIM1 *DIM2 > OpMassLL
FormsIntegrators< DomainEleOp >::Assembly< A >::LinearForm< G >::OpBaseTimesVector< 1, DIM1 *DIM2, 1 > OpScalarFieldL
std::tuple< double, Tag > evaluateError()
evaluate error
Add operators pushing bases from local to physical configuration.
virtual MPI_Comm & get_comm() const =0
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.
Get field gradients at integration pts for scalar field rank 0, i.e. vector field.
Specialization for double precision scalar field values calculation.
Get values at integration pts for tensor field rank 2, i.e. matrix field.
Post post-proc data at points from hash maps.
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.
Simple interface for fast problem set-up.
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.