21 : AssemblyType::PETSC;
24 IntegrationType::GAUSS;
34 I>::OpGradSymTensorGrad<BASE_DIM, SPACE_DIM, SPACE_DIM, 0>;
36 I>::OpGradTimesSymTensor<BASE_DIM, SPACE_DIM, SPACE_DIM>;
101 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pipeline,
102 std::string
field_name, std::string block_name,
103 boost::shared_ptr<MatrixDouble> mat_D_Ptr,
Sev sev);
107 boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pipeline,
108 std::string
field_name, std::string block_name,
109 boost::shared_ptr<MatrixDouble> mat_D_Ptr,
Sev sev) {
113 OpMatBlocks(std::string
field_name, boost::shared_ptr<MatrixDouble>
m,
116 std::vector<const CubitMeshSets *> meshset_vec_ptr)
120 std::fill(&(doEntities[MBEDGE]), &(doEntities[MBMAXTYPE]),
false);
122 "Can not get data from block");
129 for (
auto &b : blockData) {
131 if (b.blockEnts.find(getFEEntityHandle()) != b.blockEnts.end()) {
132 CHKERR getMatDPtr(matDPtr, b.bulkModulusK, b.shearModulusG);
137 CHKERR getMatDPtr(matDPtr, bulkModulusKDefault, shearModulusGDefault);
142 boost::shared_ptr<MatrixDouble> matDPtr;
146 double shearModulusG;
150 double bulkModulusKDefault;
151 double shearModulusGDefault;
152 std::vector<BlockData> blockData;
156 std::vector<const CubitMeshSets *> meshset_vec_ptr,
160 for (
auto m : meshset_vec_ptr) {
162 std::vector<double> block_data;
163 CHKERR m->getAttributes(block_data);
164 if (block_data.size() < 2) {
166 "Expected that block has two attributes");
168 auto get_block_ents = [&]() {
171 m_field.
get_moab().get_entities_by_handle(
m->meshset, ents,
true);
190 MoFEMErrorCode getMatDPtr(boost::shared_ptr<MatrixDouble> mat_D_ptr,
194 auto set_material_stiffness = [&]() {
205 auto t_D = getFTensor4DdgFromMat<SPACE_DIM, SPACE_DIM, 0>(*mat_D_ptr);
214 set_material_stiffness();
219 pipeline.push_back(
new OpMatBlocks(
225 (boost::format(
"%s(.*)") % block_name).str()
263 enum bases { AINSWORTH, DEMKOWICZ, LASBASETOPT };
264 const char *list_bases[LASBASETOPT] = {
"ainsworth",
"demkowicz"};
265 PetscInt choice_base_value = AINSWORTH;
267 LASBASETOPT, &choice_base_value, PETSC_NULL);
270 switch (choice_base_value) {
274 <<
"Set AINSWORTH_LEGENDRE_BASE for displacements";
279 <<
"Set DEMKOWICZ_JACOBI_BASE for displacements";
298 auto project_ho_geometry = [&]() {
302 CHKERR project_ho_geometry();
326 auto no_rule = [](
int,
int,
int) {
return -1; };
328 field_eval_fe_ptr->getRuleHook = no_rule;
330 field_eval_fe_ptr->getOpPtrVector().push_back(
345 CHKERR bc_mng->removeBlockDOFsOnEntities(
simple->getProblemName(),
"REMOVE_X",
347 CHKERR bc_mng->removeBlockDOFsOnEntities(
simple->getProblemName(),
"REMOVE_Y",
349 CHKERR bc_mng->removeBlockDOFsOnEntities(
simple->getProblemName(),
"REMOVE_Z",
351 CHKERR bc_mng->removeBlockDOFsOnEntities(
simple->getProblemName(),
352 "REMOVE_ALL",
"U", 0, 3);
354 simple->getProblemName(),
"U");
366 CHKERR pip->setBoundaryRhsIntegrationRule(integration_rule_bc);
367 CHKERR pip->setBoundaryLhsIntegrationRule(integration_rule_bc);
381 pip->getOpDomainLhsPipeline(), {H1},
"GEOMETRY");
383 pip->getOpDomainRhsPipeline(), {H1},
"GEOMETRY");
385 pip->getOpBoundaryRhsPipeline(), {NOSPACE},
"GEOMETRY");
387 pip->getOpBoundaryLhsPipeline(), {NOSPACE},
"GEOMETRY");
389 auto mat_D_ptr = boost::make_shared<MatrixDouble>();
393 mat_D_ptr, Sev::verbose);
394 pip->getOpDomainLhsPipeline().push_back(
new OpK(
"U",
"U", mat_D_ptr));
397 auto mat_grad_ptr = boost::make_shared<MatrixDouble>();
398 auto mat_strain_ptr = boost::make_shared<MatrixDouble>();
399 auto mat_stress_ptr = boost::make_shared<MatrixDouble>();
400 pip->getOpDomainRhsPipeline().push_back(
403 pip->getOpDomainRhsPipeline().push_back(
406 mat_D_ptr, Sev::inform);
407 pip->getOpDomainRhsPipeline().push_back(
409 "U", mat_strain_ptr, mat_stress_ptr, mat_D_ptr));
411 pip->getOpDomainRhsPipeline().push_back(
413 [](
double,
double,
double)
constexpr {
return -1; }));
417 pip->getOpDomainRhsPipeline(),
mField,
"U", Sev::inform);
421 pip->getOpBoundaryRhsPipeline(),
mField,
"U", -1, Sev::inform);
424 pip->getOpBoundaryLhsPipeline(),
mField,
"U", Sev::verbose);
432 static boost::shared_ptr<SetUpSchur>
444 auto solver = pip->createKSP();
445 CHKERR KSPSetFromOptions(solver);
447 auto dm =
simple->getDM();
451 auto set_essential_bc = [&]() {
456 auto pre_proc_rhs = boost::make_shared<FEMethod>();
457 auto post_proc_rhs = boost::make_shared<FEMethod>();
458 auto post_proc_lhs = boost::make_shared<FEMethod>();
460 auto get_pre_proc_hook = [&]() {
464 pre_proc_rhs->preProcessHook = get_pre_proc_hook();
466 auto get_post_proc_hook_rhs = [&]() {
470 auto get_post_proc_hook_lhs = [&]() {
474 post_proc_rhs->postProcessHook = get_post_proc_hook_rhs();
475 post_proc_lhs->postProcessHook = get_post_proc_hook_lhs();
477 ksp_ctx_ptr->getPreProcComputeRhs().push_front(pre_proc_rhs);
478 ksp_ctx_ptr->getPostProcComputeRhs().push_back(post_proc_rhs);
479 ksp_ctx_ptr->getPostProcSetOperators().push_back(post_proc_lhs);
483 auto setup_and_solve = [&]() {
485 BOOST_LOG_SCOPED_THREAD_ATTR(
"Timeline", attrs::timer());
486 MOFEM_LOG(
"TIMER", Sev::inform) <<
"KSPSetUp";
488 MOFEM_LOG(
"TIMER", Sev::inform) <<
"KSPSetUp <= Done";
489 MOFEM_LOG(
"TIMER", Sev::inform) <<
"KSPSolve";
491 MOFEM_LOG(
"TIMER", Sev::inform) <<
"KSPSolve <= Done";
498 CHKERR set_essential_bc();
500 if (A == AssemblyType::SCHUR) {
502 CHKERR schur_ptr->setUp(solver);
508 CHKERR VecGhostUpdateBegin(
D, INSERT_VALUES, SCATTER_FORWARD);
509 CHKERR VecGhostUpdateEnd(
D, INSERT_VALUES, SCATTER_FORWARD);
529 <<
"U_X: " << t_disp(0) <<
" U_Y: " << t_disp(1);
532 <<
"U_X: " << t_disp(0) <<
" U_Y: " << t_disp(1)
533 <<
" U_Z: " << t_disp(2);
547 auto det_ptr = boost::make_shared<VectorDouble>();
548 auto jac_ptr = boost::make_shared<MatrixDouble>();
549 auto inv_jac_ptr = boost::make_shared<MatrixDouble>();
550 pip->getDomainRhsFE().reset();
551 pip->getDomainLhsFE().reset();
552 pip->getBoundaryRhsFE().reset();
553 pip->getBoundaryLhsFE().reset();
555 auto post_proc_mesh = boost::make_shared<moab::Core>();
556 auto post_proc_begin = boost::make_shared<PostProcBrokenMeshInMoabBaseBegin>(
558 auto post_proc_end = boost::make_shared<PostProcBrokenMeshInMoabBaseEnd>(
561 auto calculate_stress_ops = [&](
auto &pip) {
563 auto mat_grad_ptr = boost::make_shared<MatrixDouble>();
564 auto mat_strain_ptr = boost::make_shared<MatrixDouble>();
565 auto mat_stress_ptr = boost::make_shared<MatrixDouble>();
571 auto mat_D_ptr = boost::make_shared<MatrixDouble>();
574 "U", mat_strain_ptr, mat_stress_ptr, mat_D_ptr));
575 auto u_ptr = boost::make_shared<MatrixDouble>();
577 auto x_ptr = boost::make_shared<MatrixDouble>();
580 return boost::make_tuple(u_ptr, x_ptr, mat_strain_ptr, mat_stress_ptr);
583 auto post_proc_domain = [&](
auto post_proc_mesh) {
585 boost::make_shared<PostProcEleDomain>(
mField, post_proc_mesh);
588 auto [u_ptr, x_ptr, mat_strain_ptr, mat_stress_ptr] =
589 calculate_stress_ops(post_proc_fe->getOpPtrVector());
591 post_proc_fe->getOpPtrVector().push_back(
595 post_proc_fe->getPostProcMesh(), post_proc_fe->getMapGaussPts(),
599 {{
"U", u_ptr}, {
"GEOMETRY", x_ptr}},
603 {{
"STRAIN", mat_strain_ptr}, {
"STRESS", mat_stress_ptr}}
611 auto post_proc_boundary = [&](
auto post_proc_mesh) {
613 boost::make_shared<PostProcEleBdy>(mField, post_proc_mesh);
615 post_proc_fe->getOpPtrVector(), {},
"GEOMETRY");
619 auto [u_ptr, x_ptr, mat_strain_ptr, mat_stress_ptr] =
620 calculate_stress_ops(op_loop_side->getOpPtrVector());
621 post_proc_fe->getOpPtrVector().push_back(op_loop_side);
622 auto mat_traction_ptr = boost::make_shared<MatrixDouble>();
623 post_proc_fe->getOpPtrVector().push_back(
629 post_proc_fe->getOpPtrVector().push_back(
633 post_proc_fe->getPostProcMesh(), post_proc_fe->getMapGaussPts(),
637 {{
"U", u_ptr}, {
"GEOMETRY", x_ptr}, {
"T", mat_traction_ptr}},
641 {{
"STRAIN", mat_strain_ptr}, {
"STRESS", mat_stress_ptr}}
649 PetscBool post_proc_skin_only = PETSC_FALSE;
651 post_proc_skin_only = PETSC_TRUE;
653 &post_proc_skin_only, PETSC_NULL);
655 if (post_proc_skin_only == PETSC_FALSE) {
656 pip->getDomainRhsFE() = post_proc_domain(post_proc_mesh);
658 pip->getBoundaryRhsFE() = post_proc_boundary(post_proc_mesh);
661 post_proc_begin->getFEMethod());
662 CHKERR pip->loopFiniteElements();
664 post_proc_end->getFEMethod());
666 CHKERR post_proc_end->writeFile(
"out_elastic.h5m");
677 pip->getDomainRhsFE().reset();
678 pip->getDomainLhsFE().reset();
679 pip->getBoundaryRhsFE().reset();
680 pip->getBoundaryLhsFE().reset();
687 pip->getOpDomainRhsPipeline(), {H1},
"GEOMETRY");
689 pip->getOpBoundaryRhsPipeline(), {},
"GEOMETRY");
691 auto mat_grad_ptr = boost::make_shared<MatrixDouble>();
692 auto mat_strain_ptr = boost::make_shared<MatrixDouble>();
693 auto mat_stress_ptr = boost::make_shared<MatrixDouble>();
695 pip->getOpDomainRhsPipeline().push_back(
698 pip->getOpDomainRhsPipeline().push_back(
701 auto mat_D_ptr = boost::make_shared<MatrixDouble>();
703 mat_D_ptr, Sev::verbose);
704 pip->getOpDomainRhsPipeline().push_back(
706 "U", mat_strain_ptr, mat_stress_ptr, mat_D_ptr));
708 pip->getOpDomainRhsPipeline().push_back(
711 pip->getOpBoundaryRhsPipeline().push_back(
713 "U", mat_strain_ptr, mat_stress_ptr, mat_D_ptr));
715 pip->getOpDomainRhsPipeline(),
mField,
"U", Sev::verbose);
717 pip->getOpBoundaryRhsPipeline(),
mField,
"U", 1, Sev::verbose);
719 auto dm =
simple->getDM();
721 pip->getDomainRhsFE()->f = res;
722 pip->getBoundaryRhsFE()->f = res;
724 CHKERR VecZeroEntries(res);
727 CHKERR pip->loopFiniteElements();
730 CHKERR VecGhostUpdateBegin(res, ADD_VALUES, SCATTER_REVERSE);
731 CHKERR VecGhostUpdateEnd(res, ADD_VALUES, SCATTER_REVERSE);
732 CHKERR VecAssemblyBegin(res);
733 CHKERR VecAssemblyEnd(res);
735 auto zero_residual_at_constrains = [&]() {
737 auto fe_post_proc_ptr = boost::make_shared<FEMethod>();
738 auto get_post_proc_hook_rhs = [
this, fe_post_proc_ptr, res]() {
741 mField, fe_post_proc_ptr, res)();
743 mField, fe_post_proc_ptr, 0, res)();
746 fe_post_proc_ptr->postProcessHook = get_post_proc_hook_rhs;
751 CHKERR zero_residual_at_constrains();
754 CHKERR VecNorm(res, NORM_2, &nrm2);
756 MOFEM_LOG_C(
"WORLD", Sev::inform,
"residual = %3.4e\n", nrm2);
758 PetscBool test = PETSC_FALSE;
760 if (test == PETSC_TRUE) {
762 auto post_proc_residual = [&](
auto dm,
auto f_res,
auto out_name) {
765 boost::make_shared<PostProcBrokenMeshInMoab<DomainEle>>(
mField);
767 auto u_vec = boost::make_shared<MatrixDouble>();
768 post_proc_fe->getOpPtrVector().push_back(
770 post_proc_fe->getOpPtrVector().push_back(
774 post_proc_fe->getPostProcMesh(), post_proc_fe->getMapGaussPts(),
786 post_proc_fe->writeFile(out_name);
790 CHKERR post_proc_residual(
simple->getDM(), res,
"res.h5m");
792 constexpr double eps = 1e-8;
795 "Residual is not zero");
804int main(
int argc,
char *argv[]) {
810 auto core_log = logging::core::get();
822 DMType dm_name =
"DMMOFEM";
827 moab::Core mb_instance;
828 moab::Interface &moab = mb_instance;
852 "Is expected that schur matrix is not allocated. This is "
853 "possible only is PC is set up twice");
879 CHKERR KSPGetPC(solver, &pc);
880 PetscBool is_pcfs = PETSC_FALSE;
881 PetscObjectTypeCompare((PetscObject)pc, PCFIELDSPLIT, &is_pcfs);
886 "Is expected that schur matrix is not allocated. This is "
887 "possible only is PC is set up twice");
893 CHKERR MatSetOption(
S, MAT_SYMMETRIC, PETSC_TRUE);
898 pip->getOpBoundaryLhsPipeline().push_back(
901 pip->getOpDomainLhsPipeline().push_back(
925 auto sub_ents_ptr = boost::make_shared<Range>(
subEnts);
941 {
"U"}, {boost::make_shared<Range>(
volEnts)}, {ao_up}, {
S}, {
true}));
945 {
"U"}, {boost::make_shared<Range>(
volEnts)}, {ao_up}, {
S}, {
true}));
947 auto pre_proc_schur_lhs_ptr = boost::make_shared<FEMethod>();
948 auto post_proc_schur_lhs_ptr = boost::make_shared<FEMethod>();
950 pre_proc_schur_lhs_ptr->preProcessHook = [
this]() {
955 MOFEM_LOG(
"TIMER", Sev::inform) <<
"Lhs Assemble Begin";
959 post_proc_schur_lhs_ptr->postProcessHook = [
this, post_proc_schur_lhs_ptr,
962 CHKERR MatAssemblyBegin(
S, MAT_FINAL_ASSEMBLY);
963 CHKERR MatAssemblyEnd(
S, MAT_FINAL_ASSEMBLY);
965 mField, post_proc_schur_lhs_ptr, 1,
S, ao_up)();
966 MOFEM_LOG(
"TIMER", Sev::inform) <<
"Lhs Assemble End";
973 ksp_ctx_ptr->getPreProcSetOperators().push_front(pre_proc_schur_lhs_ptr);
974 ksp_ctx_ptr->getPostProcSetOperators().push_back(post_proc_schur_lhs_ptr);
985 CHKERR PCFieldSplitSetIS(pc, NULL, vol_is);
986 CHKERR PCFieldSplitSetSchurPre(pc, PC_FIELDSPLIT_SCHUR_PRE_USER,
S);
990boost::shared_ptr<SetUpSchur>
992 return boost::shared_ptr<SetUpSchur>(
new SetUpSchurImpl(m_field));
Calculate traction for linear problem.
Implementation of elastic spring bc.
#define MOFEM_LOG_SYNCHRONISE(comm)
Synchronise "SYNC" channel.
#define MOFEM_LOG_C(channel, severity, format,...)
#define MOFEM_TAG_AND_LOG(channel, severity, tag)
Tag and log in channel.
Implementation of natural boundary conditions.
Boundary conditions in domain, i.e. body forces.
void simple(double P1[], double P2[], double P3[], double c[], const int N)
DomainEle::UserDataOperator DomainEleOp
Finire element operator type.
ElementsAndOps< SPACE_DIM >::DomainEle DomainEle
ElementsAndOps< SPACE_DIM >::BoundaryEle BoundaryEle
Kronecker Delta class symmetric.
#define CATCH_ERRORS
Catch errors.
FieldApproximationBase
approximation base
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base .
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#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.
PostProcEleByDim< SPACE_DIM >::PostProcEleDomain PostProcEleDomain
PostProcEleByDim< SPACE_DIM >::SideEle SideEle
PostProcEleByDim< SPACE_DIM >::PostProcEleBdy PostProcEleBdy
static char help[]
[Check]
FormsIntegrators< DomainEleOp >::Assembly< A >::LinearForm< I >::OpGradTimesSymTensor< BASE_DIM, SPACE_DIM, SPACE_DIM > OpInternalForce
constexpr double poisson_ratio
constexpr int BASE_DIM
[Define dimension]
constexpr double shear_modulus_G
constexpr IntegrationType I
constexpr double bulk_modulus_K
PetscBool is_plain_strain
constexpr double young_modulus
FTensor::Index< 'm', SPACE_DIM > m
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 DMoFEMPostProcessFiniteElements(DM dm, MoFEM::FEMethod *method)
execute finite element method for each element in dm (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.
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[])
auto createDMMatrix(DM dm)
Get smart matrix from DM.
PetscErrorCode DMoFEMPreProcessFiniteElements(DM dm, MoFEM::FEMethod *method)
execute finite element method for each element in dm (problem)
static LoggerType & setLog(const std::string channel)
Set ans resset chanel logger.
#define MOFEM_LOG(channel, severity)
Log.
SeverityLevel
Severity levels.
#define MOFEM_LOG_TAG(channel, tag)
Tag channel.
#define MOFEM_LOG_CHANNEL(channel)
Set and reset channel.
virtual MoFEMErrorCode loop_dofs(const Problem *problem_ptr, const std::string &field_name, RowColData rc, DofMethod &method, int lower_rank, int upper_rank, int verb=DEFAULT_VERBOSITY)=0
Make a loop over dofs.
MoFEMErrorCode getCubitMeshsetPtr(const int ms_id, const CubitBCType cubit_bc_type, const CubitMeshSets **cubit_meshset_ptr) const
get cubit meshset
FTensor::Index< 'i', SPACE_DIM > i
FTensor::Index< 'l', 3 > l
FTensor::Index< 'j', 3 > j
FTensor::Index< 'k', 3 > k
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
implementation of Data Operators for Forces and Sources
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)
SmartPetscObj< Vec > vectorDuplicate(Vec vec)
Create duplicate vector of smart vector.
PetscErrorCode PetscOptionsGetRealArray(PetscOptions *, const char pre[], const char name[], PetscReal dval[], PetscInt *nmax, PetscBool *set)
auto getDMKspCtx(DM dm)
Get KSP context data structure used by DM.
auto getDMSubData(DM dm)
Get sub problem data structure.
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)
auto createDM(MPI_Comm comm, const std::string dm_type_name)
Creates smart DM object.
OpPostProcMapInMoab< SPACE_DIM, SPACE_DIM > OpPPMap
double young_modulus
Young modulus.
#define EXECUTABLE_DIMENSION
constexpr auto field_name
static constexpr int approx_order
MoFEMErrorCode boundaryCondition()
MoFEMErrorCode assembleSystem()
MoFEMErrorCode readMesh()
FieldApproximationBase base
MoFEMErrorCode checkResults()
MoFEMErrorCode solveSystem()
Example(MoFEM::Interface &m_field)
MoFEMErrorCode runProblem()
MoFEM::Interface & mField
std::array< double, SPACE_DIM > fieldEvalCoords
MoFEMErrorCode setupProblem()
MoFEMErrorCode outputResults()
MoFEMErrorCode addMatBlockOps(boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pipeline, std::string field_name, std::string block_name, boost::shared_ptr< MatrixDouble > mat_D_Ptr, Sev sev)
boost::shared_ptr< MatrixDouble > vectorFieldPtr
boost::shared_ptr< FieldEvaluatorInterface::SetPtsData > fieldEvalData
Add operators pushing bases from local to physical configuration.
Simple interface for fast problem set-up.
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.
Deprecated interface functions.
Definition of the displacement bc data structure.
Data on single entity (This is passed as argument to DataOperator::doWork)
Class (Function) to enforce essential constrains on the left hand side diagonal.
Class (Function) to enforce essential constrains on the right hand side diagonal.
Class (Function) to enforce essential constrains.
Class (Function) to calculate residual side diagonal.
default operator for TRI element
Field evaluator interface.
@ OPROW
operator doWork function is executed on FE rows
Section manager is used to create indexes and sections.
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.
static boost::shared_ptr< std::ostream > getStrmSync()
Get the strm sync object.
Interface for managing meshsets containing materials and boundary conditions.
Get field gradients at integration pts for scalar filed rank 0, i.e. vector field.
Get values at integration pts for tensor filed rank 1, i.e. vector field.
Element used to execute operators on side of the element.
Post post-proc data at points from hash maps.
Clear Schur complement internal data.
Assemble Schur complement.
PipelineManager interface.
Projection of edge entities with one mid-node on hierarchical basis.
Simple interface for fast problem set-up.
intrusive_ptr for managing petsc objects
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface refernce to pointer of interface.
PipelineManager::ElementsAndOpsByDim< 2 >::FaceSideEle SideEle
PipelineManager::ElementsAndOpsByDim< 3 >::FaceSideEle SideEle
[Push operators to pipeline]
virtual MoFEMErrorCode setUp(SmartPetscObj< KSP > solver)=0
static boost::shared_ptr< SetUpSchur > createSetUpSchur(MoFEM::Interface &m_field, SmartPetscObj< DM > sub_dm, SmartPetscObj< IS > field_split_it, SmartPetscObj< AO > ao_map)
Create data structure for handling Schur complement.
static boost::shared_ptr< SetUpSchur > createSetUpSchur(MoFEM::Interface &m_field)
SmartPetscObj< DM > subDM
field split sub dm
SetUpSchurImpl(MoFEM::Interface &m_field)
MoFEMErrorCode setUp(TS solver)
MoFEMErrorCode setEntities()
virtual ~SetUpSchurImpl()
MoFEMErrorCode setPC(PC pc)
MoFEMErrorCode setUpSubDM()
MoFEMErrorCode setOperator()
MoFEM::Interface & mField