16static char help[] =
"...\n\n";
21 ? AssemblyType::BLOCK_MAT
29 IntegrationType::GAUSS;
45 static boost::shared_ptr<SetUpSchur>
56int main(
int argc,
char *argv[]) {
63 DMType dm_name =
"DMMOFEM";
65 DMType dm_name_mg =
"DMMOFEM_MG";
69 moab::Core mb_instance;
70 moab::Interface &moab = mb_instance;
73 auto core_log = logging::core::get();
89 simple->getAddBoundaryFE() =
true;
92 auto add_shared_entities_on_skeleton = [&]() {
94 auto boundary_meshset =
simple->getBoundaryMeshSet();
95 auto skeleton_meshset =
simple->getSkeletonMeshSet();
101 0,
simple->getDim() - 1, skeleton_ents,
true);
102 skeleton_ents = subtract(skeleton_ents, bdy_ents);
104 CHKERR m_field.
get_moab().add_entities(skeleton_meshset, skeleton_ents);
108 CHKERR add_shared_entities_on_skeleton();
118 const char *list_bases[] = {
"ainsworth",
"ainsworth_lobatto",
"demkowicz",
121 PetscInt choice_base_value = AINSWORTH;
123 LASBASETOP, &choice_base_value, &flg);
125 if (flg != PETSC_TRUE)
128 if (choice_base_value == AINSWORTH)
130 if (choice_base_value == AINSWORTH_LOBATTO)
132 else if (choice_base_value == DEMKOWICZ)
134 else if (choice_base_value == BERNSTEIN)
137 enum spaces { hdiv, hcurl, last_space };
138 const char *list_spaces[] = {
"hdiv",
"hcurl"};
139 PetscInt choice_space_value = hdiv;
141 last_space, &choice_space_value, &flg);
142 if (flg != PETSC_TRUE)
145 if (choice_space_value == hdiv)
147 else if (choice_space_value == hcurl)
153 CHKERR simple->addDomainBrokenField(
"BROKEN", space, base, 1);
169 auto assemble_domain_lhs = [&](
auto &pip) {
176 IT>::OpMixDivTimesScalar<SPACE_DIM>;
182 pip.push_back(
new OpHdivHdiv(
"BROKEN",
"BROKEN", beta));
183 auto unity = []()
constexpr {
return 1; };
184 pip.push_back(
new OpHdivU(
"BROKEN",
"U", unity,
true));
192 op_loop_skeleton_side->getOpPtrVector(), {});
196 auto broken_data_ptr =
197 boost::make_shared<std::vector<BrokenBaseSideData>>();
202 op_loop_domain_side->getOpPtrVector(), {HDIV});
203 op_loop_domain_side->getOpPtrVector().push_back(
206 op_loop_skeleton_side->getOpPtrVector().push_back(op_loop_domain_side);
208 IT>::OpBrokenSpaceConstrain<1>;
209 op_loop_skeleton_side->getOpPtrVector().push_back(
210 new OpC(
"HYBRID", broken_data_ptr, 1.,
true,
false));
214 constexpr int partition = 1;
216 op_print->doWorkRhsHook = [&](
DataOperator *base_op_ptr,
int side,
220 if (
auto op_ptr =
dynamic_cast<BdyEleOp *
>(base_op_ptr)) {
221 auto fe_method = op_ptr->getFEMethod();
222 auto num_fe = fe_method->numeredEntFiniteElementPtr;
225 if (num_fe->getPStatus() & PSTATUS_SHARED)
226 MOFEM_LOG(
"SELF", Sev::inform) <<
"Num FE: " << *num_fe;
231 op_loop_skeleton_side->getOpPtrVector().push_back(op_print);
234 pip.push_back(op_loop_skeleton_side);
239 auto assemble_domain_rhs = [&](
auto &pip) {
244 auto source = [&](
const double x,
const double y,
245 const double z)
constexpr {
254 CHKERR assemble_domain_lhs(pip_mng->getOpDomainLhsPipeline());
255 CHKERR assemble_domain_rhs(pip_mng->getOpDomainRhsPipeline());
262 TetPolynomialBase::switchCacheBaseOn<HDIV>(
263 {pip_mng->getDomainLhsFE().get(), pip_mng->getDomainRhsFE().get()});
264 TetPolynomialBase::switchCacheBaseOn<L2>(
265 {pip_mng->getDomainLhsFE().get(), pip_mng->getDomainRhsFE().get()});
269 "pipeline_manager_graph.dot", pip_mng);
275 auto ksp = pip_mng->createKSP();
277 CHKERR KSPSetFromOptions(ksp);
278 BOOST_LOG_SCOPED_THREAD_ATTR(
"Timeline", attrs::timer());
279 MOFEM_LOG(
"TIMER", Sev::inform) <<
"KSPSetUp";
281 MOFEM_LOG(
"TIMER", Sev::inform) <<
"KSPSetUp <= Done";
283 MOFEM_LOG(
"TIMER", Sev::inform) <<
"KSPSolve";
284 CHKERR KSPSolve(ksp, f, x);
285 MOFEM_LOG(
"TIMER", Sev::inform) <<
"KSPSolve <= Done";
287 CHKERR VecGhostUpdateBegin(x, INSERT_VALUES, SCATTER_FORWARD);
288 CHKERR VecGhostUpdateEnd(x, INSERT_VALUES, SCATTER_FORWARD);
294 CHKERR KSPGetDM(ksp, &dm);
300 auto ksp = pip_mng->createKSP();
302 BOOST_LOG_SCOPED_THREAD_ATTR(
"Timeline", attrs::timer());
303 MOFEM_LOG(
"TIMER", Sev::inform) <<
"KSPSetUp";
304 CHKERR schur_ptr->setUp(ksp);
305 MOFEM_LOG(
"TIMER", Sev::inform) <<
"KSPSetUp <= Done";
307 MOFEM_LOG(
"TIMER", Sev::inform) <<
"KSPSolve";
308 CHKERR KSPSolve(ksp, f, x);
309 MOFEM_LOG(
"TIMER", Sev::inform) <<
"KSPSolve <= Done";
311 CHKERR VecGhostUpdateBegin(x, INSERT_VALUES, SCATTER_FORWARD);
312 CHKERR VecGhostUpdateEnd(x, INSERT_VALUES, SCATTER_FORWARD);
318 CHKERR KSPGetDM(ksp, &dm);
325 auto check_residual = [&](
auto x,
auto f) {
331 auto &domain_rhs = pip_mng->getOpDomainRhsPipeline();
337 auto div_flux_ptr = boost::make_shared<VectorDouble>();
339 "BROKEN", div_flux_ptr));
343 domain_rhs.push_back(
new OpUDivFlux(
"U", div_flux_ptr, beta));
344 auto source = [&](
const double x,
const double y,
345 const double z)
constexpr {
return 1; };
351 IT>::OpMixDivTimesU<3, 1, SPACE_DIM>;
354 auto flux_ptr = boost::make_shared<MatrixDouble>();
355 domain_rhs.push_back(
357 boost::shared_ptr<VectorDouble> u_ptr =
358 boost::make_shared<VectorDouble>();
360 domain_rhs.push_back(
new OpHDivH(
"BROKEN", u_ptr, beta));
361 domain_rhs.push_back(
new OpHdivFlux(
"BROKEN", flux_ptr, beta));
369 op_loop_skeleton_side->getOpPtrVector(), {});
373 auto broken_data_ptr =
374 boost::make_shared<std::vector<BrokenBaseSideData>>();
379 op_loop_domain_side->getOpPtrVector(), {HDIV});
380 op_loop_domain_side->getOpPtrVector().push_back(
382 auto flux_mat_ptr = boost::make_shared<MatrixDouble>();
383 op_loop_domain_side->getOpPtrVector().push_back(
385 op_loop_domain_side->getOpPtrVector().push_back(
389 op_loop_skeleton_side->getOpPtrVector().push_back(op_loop_domain_side);
391 IT>::OpBrokenSpaceConstrainDHybrid<1>;
393 IT>::OpBrokenSpaceConstrainDFlux<1>;
394 op_loop_skeleton_side->getOpPtrVector().push_back(
395 new OpC_dHybrid(
"HYBRID", broken_data_ptr, 1.));
396 auto hybrid_ptr = boost::make_shared<MatrixDouble>();
397 op_loop_skeleton_side->getOpPtrVector().push_back(
399 op_loop_skeleton_side->getOpPtrVector().push_back(
400 new OpC_dBroken(broken_data_ptr, hybrid_ptr, 1.));
403 domain_rhs.push_back(op_loop_skeleton_side);
406 CHKERR VecGhostUpdateBegin(f, INSERT_VALUES, SCATTER_FORWARD);
407 CHKERR VecGhostUpdateEnd(f, INSERT_VALUES, SCATTER_FORWARD);
409 pip_mng->getDomainRhsFE()->f = f;
410 pip_mng->getSkeletonRhsFE()->f = f;
411 pip_mng->getDomainRhsFE()->x = x;
412 pip_mng->getSkeletonRhsFE()->x = x;
415 simple->getDomainFEName(),
416 pip_mng->getDomainRhsFE());
418 CHKERR VecGhostUpdateBegin(f, ADD_VALUES, SCATTER_REVERSE);
419 CHKERR VecGhostUpdateEnd(f, ADD_VALUES, SCATTER_REVERSE);
420 CHKERR VecAssemblyBegin(f);
424 CHKERR VecNorm(f, NORM_2, &fnrm);
425 MOFEM_LOG_C(
"AT", Sev::inform,
"Residual %3.4e", fnrm);
427 constexpr double eps = 1e-8;
430 "Residual norm larger than accepted");
433 "domain_rhs_graph.dot",
"OpDomainRhsPipeline",
434 pip_mng->getOpDomainRhsPipeline());
439 auto calculate_error = [&]() {
443 auto &domain_rhs = pip_mng->getOpDomainRhsPipeline();
449 auto u_grad_ptr = boost::make_shared<MatrixDouble>();
450 auto flux_val_ptr = boost::make_shared<MatrixDouble>();
451 auto div_val_ptr = boost::make_shared<VectorDouble>();
452 auto source_ptr = boost::make_shared<VectorDouble>();
454 domain_rhs.push_back(
456 domain_rhs.push_back(
459 "BROKEN", div_val_ptr));
460 auto source = [&](
const double x,
const double y,
461 const double z)
constexpr {
return -1; };
464 enum { DIV, GRAD, LAST };
467 domain_rhs.push_back(
470 u_grad_ptr, mpi_vec, GRAD, flux_val_ptr));
473 simple->getDomainFEName(),
474 pip_mng->getDomainRhsFE());
475 CHKERR VecAssemblyBegin(mpi_vec);
476 CHKERR VecAssemblyEnd(mpi_vec);
479 const double *error_ind;
480 CHKERR VecGetArrayRead(mpi_vec, &error_ind);
482 <<
"Approximation error ||div flux - source||: "
483 << std::sqrt(error_ind[DIV]);
484 MOFEM_LOG(
"AT", Sev::inform) <<
"Approximation error ||grad-flux||: "
485 << std::sqrt(error_ind[GRAD]);
486 CHKERR VecRestoreArrayRead(mpi_vec, &error_ind);
492 auto get_post_proc_fe = [&]() {
495 auto post_proc_fe = boost::make_shared<PostProcEle>(m_field);
501 post_proc_fe->getOpPtrVector().push_back(op_loop_side);
504 op_loop_side->getOpPtrVector(), {HDIV});
505 auto u_vec_ptr = boost::make_shared<VectorDouble>();
506 auto flux_mat_ptr = boost::make_shared<MatrixDouble>();
507 op_loop_side->getOpPtrVector().push_back(
509 op_loop_side->getOpPtrVector().push_back(
511 op_loop_side->getOpPtrVector().push_back(
515 post_proc_fe->getPostProcMesh(),
517 post_proc_fe->getMapGaussPts(),
521 {{
"BROKEN", flux_mat_ptr}},
530 auto post_proc_fe = get_post_proc_fe();
532 simple->getBoundaryFEName(), post_proc_fe);
533 CHKERR post_proc_fe->writeFile(
"out_result.h5m");
536 CHKERR check_residual(x, f);
561 CHKERR KSPSetFromOptions(ksp);
563 CHKERR KSPGetPC(ksp, &pc);
565 PetscBool is_pcfs = PETSC_FALSE;
566 PetscObjectTypeCompare((PetscObject)pc, PCFIELDSPLIT, &is_pcfs);
569 MOFEM_LOG(
"AT", Sev::inform) <<
"Setup Schur pc";
571 auto create_sub_dm = [&]() {
574 auto create_dm = [&](
576 std::string problem_name,
577 std::vector<std::string> fe_names,
578 std::vector<std::string> fields,
584 auto create_dm_imp = [&]() {
588 for (
auto fe : fe_names) {
592 for (
auto field : fields) {
601 "Error in creating schurDM. It is possible that schurDM is "
606 auto schur_dm = create_dm(
610 {
simple->getDomainFEName(),
simple->getSkeletonFEName()},
616 auto block_dm = create_dm(
620 {
simple->getDomainFEName(),
simple->getSkeletonFEName()},
626 return std::make_tuple(schur_dm, block_dm);
629 auto get_nested_mat_data = [&](
auto schur_dm,
auto block_dm) {
637 simple->getDomainFEName(),
641 {
"BROKEN",
"BROKEN"},
652 simple->getSkeletonFEName(),
656 {
"BROKEN",
"HYBRID"}, {
"HYBRID",
"BROKEN"}
668 {schur_dm, block_dm}, block_mat_data,
670 {
"BROKEN",
"U"}, {
nullptr,
nullptr}, true
675 auto set_ops = [&](
auto schur_dm) {
680 boost::shared_ptr<BlockStructure> block_data;
684 pip_mng->getOpDomainLhsPipeline().push_front(
686 pip_mng->getOpDomainLhsPipeline().push_back(
694 auto pre_proc_schur_lhs_ptr = boost::make_shared<FEMethod>();
695 auto post_proc_schur_lhs_ptr = boost::make_shared<FEMethod>();
697 pre_proc_schur_lhs_ptr->preProcessHook = [
this]() {
700 MOFEM_LOG(
"AT", Sev::verbose) <<
"Lhs Assemble Begin";
704 post_proc_schur_lhs_ptr->postProcessHook = [
this, ao_up,
705 post_proc_schur_lhs_ptr]() {
707 MOFEM_LOG(
"AT", Sev::verbose) <<
"Lhs Assemble End";
710 CHKERR MatAssemblyBegin(S, MAT_FINAL_ASSEMBLY);
711 CHKERR MatAssemblyEnd(S, MAT_FINAL_ASSEMBLY);
713 auto S_from_block =
matDuplicate(S, MAT_SHARE_NONZERO_PATTERN);
716 S_from_block, {
"BROKEN",
"U"},
717 {nullptr, nullptr}, ao_up);
718 CHKERR MatAssemblyBegin(S_from_block, MAT_FINAL_ASSEMBLY);
719 CHKERR MatAssemblyEnd(S_from_block, MAT_FINAL_ASSEMBLY);
720 CHKERR MatAYPX(S_from_block, -1, S, DIFFERENT_NONZERO_PATTERN);
722 CHKERR MatNorm(S_from_block, NORM_FROBENIUS, &norm);
723 MOFEM_LOG(
"AT", Sev::inform) <<
"Norm of difference: " << norm;
727 "Norm of difference between Schur and block matrix is larger "
732 {
"BROKEN",
"U"}, {nullptr, nullptr}, ao_up);
733 CHKERR MatAssemblyBegin(S, MAT_FINAL_ASSEMBLY);
734 CHKERR MatAssemblyEnd(S, MAT_FINAL_ASSEMBLY);
737 MOFEM_LOG(
"AT", Sev::verbose) <<
"Lhs Assemble Finish";
742 ksp_ctx_ptr->getPreProcSetOperators().push_front(pre_proc_schur_lhs_ptr);
743 ksp_ctx_ptr->getPostProcSetOperators().push_back(post_proc_schur_lhs_ptr);
748 auto set_pc = [&](
auto pc,
auto block_dm) {
750 auto block_is =
getDMSubData(block_dm)->getSmartRowIs();
751 CHKERR PCFieldSplitSetIS(pc, NULL, block_is);
752 CHKERR PCFieldSplitSetSchurPre(pc, PC_FIELDSPLIT_SCHUR_PRE_USER, S);
758 auto [schur_dm, block_dm] = create_sub_dm();
760 auto nested_mat_data = get_nested_mat_data(schur_dm, block_dm);
764 CHKERR MatSetDM(S, PETSC_NULLPTR);
768 CHKERR MatSetBlockSize(S, bs);
771 CHKERR set_pc(pc, block_dm);
773 CHKERR KSPGetDM(ksp, &solver_dm);
775 CHKERR DMSetMatType(solver_dm, MATSHELL);
777 auto get_pc = [](
auto ksp) {
779 CHKERR KSPGetPC(ksp, &pc_raw);
783 auto set_diagonal_pc = [&](
auto pc) {
789 CHKERR PCSetOperators(pc, A, P);
793 CHKERR PCFieldSplitSchurGetSubKSP(pc, PETSC_NULLPTR, &subksp);
800 auto set_mg_for_schur_complement = [&](
auto pc,
auto schur_dm,
auto S) {
804 CHKERR PCFieldSplitSchurGetSubKSP(pc, PETSC_NULLPTR, &subksp);
805 auto subpc = get_pc(subksp[1]);
807 auto set_pc_p_mg = [](
auto dm,
auto pc,
auto S) {
810 PetscBool same = PETSC_FALSE;
811 PetscObjectTypeCompare((PetscObject)pc, PCMG, &same);
813 MOFEM_LOG(
"TIMER", Sev::inform) <<
"Set up MG";
816 CHKERR PCSetFromOptions(pc);
821 PetscBool same = PETSC_FALSE;
822 PetscObjectTypeCompare((PetscObject)subpc, PCKSP, &same);
824 CHKERR PCSetFromOptions(subpc);
826 CHKERR PCKSPGetKSP(subpc, &inner_ksp);
827 CHKERR KSPSetFromOptions(inner_ksp);
829 CHKERR KSPGetPC(inner_ksp, &inner_pc);
830 CHKERR PCSetFromOptions(inner_pc);
831 CHKERR set_pc_p_mg(schur_dm, inner_pc, S);
840 CHKERR set_diagonal_pc(pc);
841 CHKERR set_mg_for_schur_complement(pc, schur_dm, S);
846 "PC is not set to PCFIELDSPLIT");
851boost::shared_ptr<SetUpSchur>
853 return boost::shared_ptr<SetUpSchur>(
new SetUpSchurImpl(m_field));
#define MOFEM_LOG_C(channel, severity, format,...)
void simple(double P1[], double P2[], double P3[], double c[], const int N)
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpSource< 1, FIELD_DIM > OpDomainSource
ElementsAndOps< SPACE_DIM >::DomainEle DomainEle
ElementsAndOps< SPACE_DIM >::BoundaryEle BoundaryEle
#define CATCH_ERRORS
Catch errors.
FieldApproximationBase
approximation base
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base .
@ AINSWORTH_BERNSTEIN_BEZIER_BASE
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
FieldSpace
approximation spaces
@ L2
field with C-1 continuity
@ HCURL
field with continuous tangents
@ HDIV
field with continuous normal traction
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ MOFEM_ATOM_TEST_INVALID
#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 DMoFEMMeshToLocalVector(DM dm, Vec l, InsertMode mode, ScatterMode scatter_mode)
set local (or ghosted) vector values on mesh for partition only
PetscErrorCode DMMoFEMAddSubFieldRow(DM dm, const char field_name[])
PetscErrorCode DMRegister_MoFEM(const char sname[])
Register MoFEM problem.
MoFEMErrorCode DMRegister_MGViaApproxOrders(const char sname[])
Register DM for Multi-Grid via approximation orders.
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)
Get smart vector from DM.
PetscErrorCode DMMoFEMAddSubFieldCol(DM dm, const char field_name[])
static LoggerType & setLog(const std::string channel)
Set ans resset chanel logger.
#define MOFEM_LOG(channel, severity)
Log.
#define MOFEM_LOG_TAG(channel, tag)
Tag channel.
MoFEMErrorCode removeSideDOFs(const std::string problem_name, const std::string block_name, const std::string field_name, int bridge_dim, int lo, int hi, bool is_distributed_mesh=true)
Remove DOFs on side entities from problem.
#define NBFACETRI_L2(P)
Number of base functions on triangle for L2 space.
#define NBEDGE_L2(P)
Number of base functions on edge from L2 space.
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpMixDivTimesScalar< 2 > OpHdivU
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
implementation of Data Operators for Forces and Sources
OpSchurAssembleBase * createOpSchurAssembleEnd(std::vector< std::string > fields_name, std::vector< boost::shared_ptr< Range > > field_ents, SmartPetscObj< AO > ao, SmartPetscObj< Mat > schur, bool sym_schur, bool symm_op)
Construct a new Op Schur Assemble End object.
PetscErrorCode PetscOptionsGetInt(PetscOptions *, const char pre[], const char name[], PetscInt *ivalue, PetscBool *set)
MoFEMErrorCode DMMoFEMGetBlocMatData(DM dm, boost::shared_ptr< BlockStructure > &)
Get data for block mat.
MoFEMErrorCode setSchurA00MatSolvePC(SmartPetscObj< PC > pc)
Set PC for A00 block.
SmartPetscObj< Vec > vectorDuplicate(Vec vec)
Create duplicate vector of smart vector.
boost::shared_ptr< PCMGSetUpViaApproxOrdersCtx > createPCMGSetUpViaApproxOrdersCtx(DM dm, Mat A, bool use_shell_mat)
createPCMGSetUpViaApproxOrdersCtx
auto createVectorMPI(MPI_Comm comm, PetscInt n, PetscInt N)
Create MPI Vector.
auto getDMKspCtx(DM dm)
Get KSP context data structure used by DM.
auto createDMHybridisedL2Matrix(DM dm)
Get smart hybridised L2 matrix from DM.
auto getDMSubData(DM dm)
Get sub problem data structure.
MoFEMErrorCode PCMGSetUpViaApproxOrders(PC pc, boost::shared_ptr< PCMGSetUpViaApproxOrdersCtx > ctx, int verb)
Function build MG structure.
boost::shared_ptr< BlockStructure > createBlockMatStructure(DM dm, SchurFEOpsFEandFields schur_fe_op_vec)
Create a Mat Diag Blocks object.
boost::shared_ptr< NestSchurData > createSchurNestedMatrixStruture(std::pair< SmartPetscObj< DM >, SmartPetscObj< DM > > dms, boost::shared_ptr< BlockStructure > block_mat_data_ptr, std::vector< std::string > fields_names, std::vector< boost::shared_ptr< Range > > field_ents, bool add_preconditioner_block)
Get the Schur Nest Mat Array object.
auto createAOMappingIS(IS isapp, IS ispetsc)
Creates an application mapping using two index sets.
PetscErrorCode PetscOptionsGetEList(PetscOptions *, const char pre[], const char name[], const char *const *list, PetscInt next, PetscInt *value, PetscBool *set)
SmartPetscObj< Mat > matDuplicate(Mat mat, MatDuplicateOption op)
MoFEMErrorCode DMMoFEMSetNestSchurData(DM dm, boost::shared_ptr< NestSchurData >)
auto createDMNestSchurMat(DM dm)
auto createDM(MPI_Comm comm, const std::string dm_type_name)
Creates smart DM object.
MoFEMErrorCode assembleBlockMatSchur(MoFEM::Interface &m_field, Mat B, Mat S, std::vector< std::string > fields_name, std::vector< boost::shared_ptr< Range > > field_ents, SmartPetscObj< AO > ao)
Assemble Schur matrix.
OpSchurAssembleBase * createOpSchurAssembleBegin()
auto createDMBlockMat(DM dm)
OpPostProcMapInMoab< SPACE_DIM, SPACE_DIM > OpPPMap
PipelineManager::ElementsAndOpsByDim< SPACE_DIM >::FaceSideEle EleOnSide
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpMixDivTimesU< 3, 1, SPACE_DIM > OpHDivH
Integrate Rhs div flux base times temperature (T)
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpBaseTimesVector< 3, 3, 1 > OpHdivFlux
Integrating Rhs flux base (1/k) flux (FLUX)
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpMass< 3, 3 > OpHdivHdiv
Integrate Lhs base of flux (1/k) base of flux (FLUX x FLUX)
Add operators pushing bases from local to physical configuration.
Boundary condition manager for finite element problem setup.
virtual moab::Interface & get_moab()=0
virtual MPI_Comm & get_comm() const =0
virtual int get_comm_rank() const =0
static MoFEMErrorCode Initialize(int *argc, char ***args, const char file[], const char help[])
Initializes the MoFEM database PETSc, MOAB and MPI.
static MoFEMErrorCode Finalize()
Checks for options to be called at the conclusion of the program.
base operator to do operations at Gauss Pt. level
Deprecated interface functions.
Data on single entity (This is passed as argument to DataOperator::doWork)
std::map< EntityHandle, std::vector< boost::weak_ptr< NumeredEntFiniteElement > > > AdjCache
static boost::shared_ptr< SinkType > createSink(boost::shared_ptr< std::ostream > stream_ptr, std::string comm_filter)
Create a sink object.
static boost::shared_ptr< std::ostream > getStrmWorld()
Get the strm world object.
Operator for broken loop side.
Get norm of input VectorDouble for Tensor0.
Get norm of input MatrixDouble for Tensor1.
Calculate tenor field using vectorial base, i.e. Hdiv/Hcurl.
Get vector field for H-div approximation.
Calculate divergence of vector field.
Get field gradients at integration pts for scalar field rank 0, i.e. vector field.
Specialization for double precision scalar field values calculation.
Specialization for double precision vector field values calculation.
Get values from scalar function at integration points and save them to VectorDouble for Tensor0.
Element used to execute operators on side of the element.
Post post-proc data at points from hash maps.
static MoFEMErrorCode writeKSPGraphGraphviz(KspCtx *ksp_ctx, std::string filename)
KSP graph to Graphviz file.
static MoFEMErrorCode writeGraphGraphviz(std::string filename, std::string pip_name, const boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pip)
Pipeline graph to Graphviz file.
static MoFEMErrorCode writePiplineManagerGraphGraphviz(std::string filename, PipelineManager *pip_mng)
Write pipeline manager graph to Graphviz file.
Template struct for dimension-specific finite element types.
PipelineManager interface.
Simple interface for fast problem set-up.
MoFEMErrorCode getOptions()
get options
intrusive_ptr for managing petsc objects
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.
virtual ~SetUpSchurImpl()=default
SetUpSchurImpl(MoFEM::Interface &m_field)
MoFEMErrorCode setUp(SmartPetscObj< KSP >)
MoFEM::Interface & mField
[Push operators to pipeline]
virtual MoFEMErrorCode setUp(SmartPetscObj< KSP >)=0
virtual ~SetUpSchur()=default
static boost::shared_ptr< SetUpSchur > createSetUpSchur(MoFEM::Interface &m_field)
constexpr AssemblyType AT
constexpr IntegrationType IT
constexpr AssemblyType BlockAssemblyType
BoundaryEle::UserDataOperator BdyEleOp
#define EXECUTABLE_DIMENSION