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

Classes

struct  P_MultiGridData
 

Public Member Functions

 SetUpSchurImpl (MoFEM::Interface &m_field)
 
virtual ~SetUpSchurImpl ()=default
 
MoFEMErrorCode setUp (SmartPetscObj< KSP >)
 
 SetUpSchurImpl (MoFEM::Interface &m_field, SmartPetscObj< DM > sub_dm, SmartPetscObj< IS > field_split_is, SmartPetscObj< AO > ao_up)
 
virtual ~SetUpSchurImpl ()
 
MoFEMErrorCode setUp (TS solver)
 
MoFEMErrorCode preProc ()
 
MoFEMErrorCode postProc ()
 
 SetUpSchurImpl (MoFEM::Interface &m_field)
 
virtual ~SetUpSchurImpl ()
 
MoFEMErrorCode setUp (SmartPetscObj< TS > solver)
 
 SetUpSchurImpl (MoFEM::Interface &m_field)
 
virtual ~SetUpSchurImpl ()
 
MoFEMErrorCode setUp (SmartPetscObj< TS > solver)
 
 SetUpSchurImpl (MoFEM::Interface &m_field)
 
virtual ~SetUpSchurImpl ()=default
 
MoFEMErrorCode setUp (SmartPetscObj< KSP > solver)
 
 SetUpSchurImpl (MoFEM::Interface &m_field, EshelbianCore *ep_core_ptr)
 
virtual ~SetUpSchurImpl ()
 
MoFEMErrorCode setUp (TS ts)
 
MoFEMErrorCode preProc ()
 
MoFEMErrorCode postProc ()
 

Private Member Functions

MoFEMErrorCode createSubDM ()
 
MoFEMErrorCode setOperator ()
 
MoFEMErrorCode setPC (PC pc)
 
MoFEMErrorCode setDiagonalPC (PC pc)
 
MoFEMErrorCode setOperator ()
 
MoFEMErrorCode setPC (PC pc)
 
SmartPetscObj< DM > createSubDM ()
 
MoFEMErrorCode setEntities ()
 
MoFEMErrorCode createSubDM ()
 
MoFEMErrorCode setOperator ()
 
MoFEMErrorCode setPC (PC pc)
 
MoFEMErrorCode setDiagonalPC (PC pc)
 
auto getSchurFields ()
 
auto getA00Fields ()
 

Private Attributes

MoFEM::InterfacemField
 
SmartPetscObj< Mat > S
 
SmartPetscObj< DM > subDM
 field split sub dm
 
SmartPetscObj< IS > fieldSplitIS
 IS for split Schur block.
 
SmartPetscObj< AO > aoSchur
 
SmartPetscObj< DM > schurDM
 
SmartPetscObj< DM > blockDM
 
Range volEnts
 
Range subEnts
 
EshelbianCoreepCorePtr
 
SmartPetscObj< AO > aoS
 
boost::shared_ptr< std::vector< boost::weak_ptr< NumeredDofEntity > > > piolaZeroDofsVec
 
boost::shared_ptr< std::vector< unsigned char > > piolaZeroDofsMarker
 
boost::shared_ptr< P_MultiGridDatapMGPtr
 

Additional Inherited Members

- Static Public Member Functions inherited from SetUpSchur
static boost::shared_ptr< SetUpSchurcreateSetUpSchur (MoFEM::Interface &m_field)
 
static boost::shared_ptr< SetUpSchurcreateSetUpSchur (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< SetUpSchurcreateSetUpSchur (MoFEM::Interface &m_field)
 
static boost::shared_ptr< SetUpSchurcreateSetUpSchur (MoFEM::Interface &m_field)
 
static boost::shared_ptr< SetUpSchurcreateSetUpSchur (MoFEM::Interface &m_field)
 
- Static Public Member Functions inherited from EshelbianCore::SetUpSchur
static boost::shared_ptr< SetUpSchurcreateSetUpSchur (MoFEM::Interface &m_field, EshelbianCore *ep_core_ptr)
 
- Protected Member Functions inherited from SetUpSchur
 SetUpSchur ()=default
 
virtual ~SetUpSchur ()=default
 
 SetUpSchur ()=default
 
 SetUpSchur ()=default
 
 SetUpSchur ()=default
 
 SetUpSchur ()=default
 
- Protected Member Functions inherited from EshelbianCore::SetUpSchur
 SetUpSchur ()=default
 

Detailed Description

Examples
plastic.cpp, and test_broken_space.cpp.

Definition at line 519 of file test_broken_space.cpp.

Constructor & Destructor Documentation

◆ SetUpSchurImpl() [1/6]

SetUpSchurImpl::SetUpSchurImpl ( MoFEM::Interface m_field)
inline

Definition at line 521 of file test_broken_space.cpp.

521: SetUpSchur(), mField(m_field) {}
MoFEM::Interface & mField
SetUpSchur()=default

◆ ~SetUpSchurImpl() [1/6]

virtual SetUpSchurImpl::~SetUpSchurImpl ( )
virtualdefault

◆ SetUpSchurImpl() [2/6]

SetUpSchurImpl::SetUpSchurImpl ( MoFEM::Interface m_field,
SmartPetscObj< DM >  sub_dm,
SmartPetscObj< IS >  field_split_is,
SmartPetscObj< AO >  ao_up 
)
inline

Definition at line 1659 of file plastic.cpp.

1661 : SetUpSchur(), mField(m_field), subDM(sub_dm),
1662 fieldSplitIS(field_split_is), aoSchur(ao_up) {
1663 if (S) {
1665 "Is expected that schur matrix is not "
1666 "allocated. This is "
1667 "possible only is PC is set up twice");
1668 }
1669 }
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
@ MOFEM_DATA_INCONSISTENCY
Definition definitions.h:31
SmartPetscObj< DM > subDM
field split sub dm
Definition plastic.cpp:1680
SmartPetscObj< Mat > S
SmartPetscObj< AO > aoSchur
Definition plastic.cpp:1682
SmartPetscObj< IS > fieldSplitIS
IS for split Schur block.
Definition plastic.cpp:1681

◆ ~SetUpSchurImpl() [2/6]

virtual SetUpSchurImpl::~SetUpSchurImpl ( )
inlinevirtual

Definition at line 1670 of file plastic.cpp.

1670{ S.reset(); }

◆ SetUpSchurImpl() [3/6]

SetUpSchurImpl::SetUpSchurImpl ( MoFEM::Interface m_field)
inline

Definition at line 1022 of file contact.cpp.

1022: SetUpSchur(), mField(m_field) {}

◆ ~SetUpSchurImpl() [3/6]

virtual SetUpSchurImpl::~SetUpSchurImpl ( )
inlinevirtual

Definition at line 1024 of file contact.cpp.

1024{}

◆ SetUpSchurImpl() [4/6]

SetUpSchurImpl::SetUpSchurImpl ( MoFEM::Interface m_field)
inline

Definition at line 990 of file incompressible_elasticity.cpp.

990: SetUpSchur(), mField(m_field) {}

◆ ~SetUpSchurImpl() [4/6]

virtual SetUpSchurImpl::~SetUpSchurImpl ( )
inlinevirtual

Definition at line 991 of file incompressible_elasticity.cpp.

991{ S.reset(); }

◆ SetUpSchurImpl() [5/6]

SetUpSchurImpl::SetUpSchurImpl ( MoFEM::Interface m_field)
inline

Definition at line 750 of file elastic.cpp.

750 : SetUpSchur(), mField(m_field) {
751 if (S) {
754 "Is expected that schur matrix is not allocated. This is "
755 "possible only is PC is set up twice");
756 }
757 }

◆ ~SetUpSchurImpl() [5/6]

virtual SetUpSchurImpl::~SetUpSchurImpl ( )
virtualdefault

◆ SetUpSchurImpl() [6/6]

SetUpSchurImpl::SetUpSchurImpl ( MoFEM::Interface m_field,
EshelbianCore ep_core_ptr 
)
inline

Definition at line 11 of file SetUpSchurImpl.cpp.

12 : SetUpSchur(), mField(m_field), epCorePtr(ep_core_ptr) {}
EshelbianCore * epCorePtr

◆ ~SetUpSchurImpl() [6/6]

virtual SetUpSchurImpl::~SetUpSchurImpl ( )
inlinevirtual

Definition at line 13 of file SetUpSchurImpl.cpp.

13{}

Member Function Documentation

◆ createSubDM() [1/3]

MoFEMErrorCode SetUpSchurImpl::createSubDM ( )
private

Definition at line 1116 of file contact.cpp.

1116 {
1118 auto simple = mField.getInterface<Simple>();
1119
1120 auto create_dm = [&](const char *name, const char *field_name, auto dm_type) {
1121 auto dm = createDM(mField.get_comm(), dm_type);
1122 auto create_dm_imp = [&]() {
1124 CHKERR DMMoFEMCreateSubDM(dm, simple->getDM(), name);
1125 CHKERR DMMoFEMSetSquareProblem(dm, PETSC_TRUE);
1126 CHKERR DMMoFEMAddElement(dm, simple->getDomainFEName());
1129 CHKERR DMSetUp(dm);
1131 };
1133 create_dm_imp(),
1134 "Error in creating schurDM. It is possible that schurDM is "
1135 "already created");
1136 return dm;
1137 };
1138
1139 // Note: here we can make block with bubbles of "U" and "SIGMA" fields. See
1140 // vec-0 where bubbles are added.
1141
1142 schurDM = create_dm("SCHUR", "U", "DMMOFEM_MG");
1143 blockDM = create_dm("BLOCK", "SIGMA", "DMMOFEM");
1144
1145 if constexpr (AT == AssemblyType::BLOCK_SCHUR) {
1146
1147 auto get_nested_mat_data = [&](auto schur_dm, auto block_dm) {
1148 auto block_mat_data = createBlockMatStructure(
1149 simple->getDM(),
1150
1151 {{
1152
1153 simple->getDomainFEName(),
1154
1155 {
1156
1157 {"U", "U"}, {"SIGMA", "U"}, {"U", "SIGMA"}, {"SIGMA", "SIGMA"}
1158
1159 }}}
1160
1161 );
1162
1164
1165 {schur_dm, block_dm}, block_mat_data,
1166
1167 {"SIGMA"}, {nullptr}, true
1168
1169 );
1170 };
1171
1172 auto nested_mat_data = get_nested_mat_data(schurDM, blockDM);
1173 CHKERR DMMoFEMSetNestSchurData(simple->getDM(), nested_mat_data);
1174
1175 } else {
1176 SETERRQ(PETSC_COMM_SELF, MOFEM_NOT_IMPLEMENTED,
1177 "Only BLOCK_SCHUR is implemented");
1178 }
1179
1181}
void simple(double P1[], double P2[], double P3[], double c[], const int N)
Definition acoustic.cpp:69
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ MOFEM_NOT_IMPLEMENTED
Definition definitions.h:32
#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.
Definition DMMoFEM.cpp:215
PetscErrorCode DMMoFEMAddElement(DM dm, std::string fe_name)
add element to dm
Definition DMMoFEM.cpp:488
PetscErrorCode DMMoFEMSetSquareProblem(DM dm, PetscBool square_problem)
set squared problem
Definition DMMoFEM.cpp:450
PetscErrorCode DMMoFEMAddSubFieldRow(DM dm, const char field_name[])
Definition DMMoFEM.cpp:238
PetscErrorCode DMMoFEMAddSubFieldCol(DM dm, const char field_name[])
Definition DMMoFEM.cpp:280
boost::shared_ptr< BlockStructure > createBlockMatStructure(DM dm, SchurFEOpsFEandFields schur_fe_op_vec)
Create a Mat Diag Blocks object.
Definition Schur.cpp:1082
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.
Definition Schur.cpp:2343
MoFEMErrorCode DMMoFEMSetNestSchurData(DM dm, boost::shared_ptr< NestSchurData >)
Definition DMMoFEM.cpp:1554
auto createDM(MPI_Comm comm, const std::string dm_type_name)
Creates smart DM object.
constexpr auto field_name
virtual MPI_Comm & get_comm() const =0
Simple interface for fast problem set-up.
Definition Simple.hpp:27
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.
SmartPetscObj< DM > schurDM
Definition contact.cpp:1037
SmartPetscObj< DM > blockDM
Definition contact.cpp:1038
constexpr AssemblyType AT

◆ createSubDM() [2/3]

SmartPetscObj< DM > SetUpSchurImpl::createSubDM ( )
private

◆ createSubDM() [3/3]

MoFEMErrorCode SetUpSchurImpl::createSubDM ( )
private

◆ getA00Fields()

auto SetUpSchurImpl::getA00Fields ( )
inlineprivate

Definition at line 60 of file SetUpSchurImpl.cpp.

60 {
61 std::vector<std::string> a00_field_list{
62
64
66
68
70
72
73 };
74 std::vector<boost::shared_ptr<Range>> range_list_ptr(a00_field_list.size(),
75 nullptr);
76 return std::make_pair(a00_field_list, range_list_ptr);
77 }
const std::string spatialL2Disp
const std::string piolaStress
const std::string bubbleField
const std::string rotAxis
const std::string stretchTensor

◆ getSchurFields()

auto SetUpSchurImpl::getSchurFields ( )
inlineprivate

Definition at line 53 of file SetUpSchurImpl.cpp.

53 {
54 std::vector<std::string> schur_field_list{epCorePtr->hybridSpatialDisp,
56 std::vector<boost::shared_ptr<Range>> dm_range_list{nullptr, nullptr};
57 return std::make_pair(schur_field_list, dm_range_list);
58 };
const std::string contactDisp
const std::string hybridSpatialDisp

◆ postProc() [1/2]

MoFEMErrorCode SetUpSchurImpl::postProc ( )
Examples
plastic.cpp.

◆ postProc() [2/2]

MoFEMErrorCode SetUpSchurImpl::postProc ( )

◆ preProc() [1/2]

MoFEMErrorCode SetUpSchurImpl::preProc ( )
Examples
plastic.cpp.

◆ preProc() [2/2]

MoFEMErrorCode SetUpSchurImpl::preProc ( )

◆ setDiagonalPC() [1/2]

MoFEMErrorCode SetUpSchurImpl::setDiagonalPC ( PC  pc)
private

Definition at line 1266 of file contact.cpp.

1266 {
1268 KSP *subksp;
1269 CHKERR PCFieldSplitSchurGetSubKSP(pc, PETSC_NULLPTR, &subksp);
1270 auto get_pc = [](auto ksp) {
1271 PC pc_raw;
1272 CHKERR KSPGetPC(ksp, &pc_raw);
1273 return SmartPetscObj<PC>(pc_raw, true); // bump reference
1274 };
1275 CHKERR setSchurA00MatSolvePC(get_pc(subksp[0]));
1276
1277 auto set_pc_p_mg = [](auto dm, auto pc, auto S) {
1279 CHKERR PCSetDM(pc, dm);
1280 PetscBool same = PETSC_FALSE;
1281 PetscObjectTypeCompare((PetscObject)pc, PCMG, &same);
1282 if (same) {
1284 pc, createPCMGSetUpViaApproxOrdersCtx(dm, S, true));
1285 CHKERR PCSetFromOptions(pc);
1286 }
1288 };
1289
1290 auto set_pc_ksp = [&](auto dm, auto pc, auto S) {
1292 PetscBool same = PETSC_FALSE;
1293 PetscObjectTypeCompare((PetscObject)pc, PCKSP, &same);
1294 if (same) {
1295 CHKERR PCSetFromOptions(pc);
1296 KSP inner_ksp;
1297 CHKERR PCKSPGetKSP(pc, &inner_ksp);
1298 CHKERR KSPSetFromOptions(inner_ksp);
1299 PC inner_pc;
1300 CHKERR KSPGetPC(inner_ksp, &inner_pc);
1301 CHKERR PCSetFromOptions(inner_pc);
1302 CHKERR set_pc_p_mg(dm, inner_pc, S);
1303 }
1305 };
1306
1307 CHKERR set_pc_ksp(schurDM, get_pc(subksp[1]), S);
1308 CHKERR set_pc_p_mg(schurDM, get_pc(subksp[1]), S);
1309
1310 CHKERR PetscFree(subksp);
1312}
MoFEMErrorCode setSchurA00MatSolvePC(SmartPetscObj< PC > pc)
Set PC for A00 block.
Definition Schur.cpp:2627
boost::shared_ptr< PCMGSetUpViaApproxOrdersCtx > createPCMGSetUpViaApproxOrdersCtx(DM dm, Mat A, bool use_shell_mat)
createPCMGSetUpViaApproxOrdersCtx
MoFEMErrorCode PCMGSetUpViaApproxOrders(PC pc, boost::shared_ptr< PCMGSetUpViaApproxOrdersCtx > ctx, int verb)
Function build MG structure.
intrusive_ptr for managing petsc objects

◆ setDiagonalPC() [2/2]

MoFEMErrorCode SetUpSchurImpl::setDiagonalPC ( PC  pc)
private

◆ setEntities()

MoFEMErrorCode SetUpSchurImpl::setEntities ( )
private

Definition at line 823 of file elastic.cpp.

823 {
826 CHKERR mField.get_moab().get_entities_by_dimension(simple->getMeshset(),
828 CHKERR mField.get_moab().get_entities_by_handle(simple->getMeshset(),
829 subEnts);
830 subEnts = subtract(subEnts, volEnts);
832};
constexpr int SPACE_DIM
virtual moab::Interface & get_moab()=0

◆ setOperator() [1/3]

MoFEMErrorCode SetUpSchurImpl::setOperator ( )
private

Definition at line 1183 of file contact.cpp.

1183 {
1185
1186 double eps_stab = 1e-4;
1187 CHKERR PetscOptionsGetScalar(PETSC_NULLPTR, "", "-eps_stab", &eps_stab,
1188 PETSC_NULLPTR);
1189
1192 using OpMassStab = B::OpMass<3, SPACE_DIM * SPACE_DIM>;
1193
1194 auto simple = mField.getInterface<Simple>();
1195 auto pip = mField.getInterface<PipelineManager>();
1196
1197 auto dm_is = getDMSubData(schurDM)->getSmartRowIs();
1198 auto ao_up = createAOMappingIS(dm_is, PETSC_NULLPTR);
1199
1200 // Boundary
1201 pip->getOpBoundaryLhsPipeline().push_front(createOpSchurAssembleBegin());
1202 pip->getOpBoundaryLhsPipeline().push_back(
1203 new OpMassStab("SIGMA", "SIGMA",
1204 [eps_stab](double, double, double) { return eps_stab; }));
1205 pip->getOpBoundaryLhsPipeline().push_back(
1206
1207 createOpSchurAssembleEnd({"SIGMA"}, {nullptr}, ao_up, S, false, false)
1208
1209 );
1210
1211 // Domain
1212 pip->getOpDomainLhsPipeline().push_front(createOpSchurAssembleBegin());
1213 pip->getOpDomainLhsPipeline().push_back(
1214
1215 createOpSchurAssembleEnd({"SIGMA"}, {nullptr}, ao_up, S, false, false)
1216
1217 );
1218
1219 auto pre_proc_schur_lhs_ptr = boost::make_shared<FEMethod>();
1220 auto post_proc_schur_lhs_ptr = boost::make_shared<FEMethod>();
1221
1222 pre_proc_schur_lhs_ptr->preProcessHook = [this]() {
1224 CHKERR MatZeroEntries(S);
1225 MOFEM_LOG("CONTACT", Sev::verbose) << "Lhs Assemble Begin";
1227 };
1228
1229 post_proc_schur_lhs_ptr->postProcessHook = [this, ao_up,
1230 post_proc_schur_lhs_ptr]() {
1232 MOFEM_LOG("CONTACT", Sev::verbose) << "Lhs Assemble End";
1233 auto print_mat_norm = [this](auto a, std::string prefix) {
1235 double nrm;
1236 CHKERR MatNorm(a, NORM_FROBENIUS, &nrm);
1237 MOFEM_LOG("CONTACT", Sev::noisy) << prefix << " norm = " << nrm;
1239 };
1240 CHKERR MatAssemblyBegin(S, MAT_FINAL_ASSEMBLY);
1241 CHKERR MatAssemblyEnd(S, MAT_FINAL_ASSEMBLY);
1243 mField, post_proc_schur_lhs_ptr, 1, S, ao_up)();
1244#ifndef NDEBUG
1245 CHKERR print_mat_norm(S, "S");
1246#endif // NDEBUG
1247 MOFEM_LOG("CONTACT", Sev::verbose) << "Lhs Assemble Finish";
1249 };
1250
1251 auto ts_ctx_ptr = getDMTsCtx(simple->getDM());
1252 ts_ctx_ptr->getPreProcessIJacobian().push_front(pre_proc_schur_lhs_ptr);
1253 ts_ctx_ptr->getPostProcessIJacobian().push_back(post_proc_schur_lhs_ptr);
1254
1256}
constexpr double a
@ BLOCK_PRECONDITIONER_SCHUR
#define MOFEM_LOG(channel, severity)
Log.
auto getDMTsCtx(DM dm)
Get TS context data structure used by DM.
Definition DMMoFEM.hpp:1161
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.
Definition Schur.cpp:2585
PetscErrorCode PetscOptionsGetScalar(PetscOptions *, const char pre[], const char name[], PetscScalar *dval, PetscBool *set)
auto getDMSubData(DM dm)
Get sub problem data structure.
Definition DMMoFEM.hpp:1177
auto createAOMappingIS(IS isapp, IS ispetsc)
Creates an application mapping using two index sets.
OpSchurAssembleBase * createOpSchurAssembleBegin()
Definition Schur.cpp:2580
Class (Function) to enforce essential constrains on the left hand side diagonal.
Definition Essential.hpp:33
PipelineManager interface.

◆ setOperator() [2/3]

MoFEMErrorCode SetUpSchurImpl::setOperator ( )
private

◆ setOperator() [3/3]

MoFEMErrorCode SetUpSchurImpl::setOperator ( )
private

◆ setPC() [1/3]

MoFEMErrorCode SetUpSchurImpl::setPC ( PC  pc)
private

Definition at line 1258 of file contact.cpp.

1258 {
1260 auto block_is = getDMSubData(blockDM)->getSmartRowIs();
1261 CHKERR PCFieldSplitSetIS(pc, NULL, block_is);
1262 CHKERR PCFieldSplitSetSchurPre(pc, PC_FIELDSPLIT_SCHUR_PRE_USER, S);
1264}

◆ setPC() [2/3]

MoFEMErrorCode SetUpSchurImpl::setPC ( PC  pc)
private

◆ setPC() [3/3]

MoFEMErrorCode SetUpSchurImpl::setPC ( PC  pc)
private

◆ setUp() [1/6]

MoFEMErrorCode SetUpSchurImpl::setUp ( SmartPetscObj< KSP >  solver)
virtual

Implements SetUpSchur.

◆ setUp() [2/6]

MoFEMErrorCode SetUpSchurImpl::setUp ( SmartPetscObj< KSP >  ksp)
virtual

Implements SetUpSchur.

Examples
plastic.cpp, and test_broken_space.cpp.

Definition at line 532 of file test_broken_space.cpp.

532 {
535 auto pip_mng = mField.getInterface<PipelineManager>();
536
537 CHKERR KSPSetFromOptions(ksp);
538 PC pc;
539 CHKERR KSPGetPC(ksp, &pc);
540
541 PetscBool is_pcfs = PETSC_FALSE;
542 PetscObjectTypeCompare((PetscObject)pc, PCFIELDSPLIT, &is_pcfs);
543 if (is_pcfs) {
544
545 MOFEM_LOG("AT", Sev::inform) << "Setup Schur pc";
546
547 auto create_sub_dm = [&]() {
549
550 auto create_dm = [&](
551
552 std::string problem_name,
553 std::vector<std::string> fe_names,
554 std::vector<std::string> fields,
555
556 auto dm_type
557
558 ) {
559 auto dm = createDM(mField.get_comm(), dm_type);
560 auto create_dm_imp = [&]() {
562 CHKERR DMMoFEMCreateSubDM(dm, simple->getDM(), problem_name.c_str());
563 CHKERR DMMoFEMSetSquareProblem(dm, PETSC_TRUE);
564 for (auto fe : fe_names) {
566 }
567 CHKERR DMMoFEMAddElement(dm, simple->getSkeletonFEName());
568 for (auto field : fields) {
569 CHKERR DMMoFEMAddSubFieldRow(dm, field);
570 CHKERR DMMoFEMAddSubFieldCol(dm, field);
571 }
572 CHKERR DMSetUp(dm);
574 };
576 create_dm_imp(),
577 "Error in creating schurDM. It is possible that schurDM is "
578 "already created");
579 return dm;
580 };
581
582 auto schur_dm = create_dm(
583
584 "SCHUR",
585
586 {simple->getDomainFEName(), simple->getSkeletonFEName()},
587
588 {"HYBRID"},
589
590 "DMMOFEM_MG");
591
592 auto block_dm = create_dm(
593
594 "BLOCK",
595
596 {simple->getDomainFEName(), simple->getSkeletonFEName()},
597
598 {"BROKEN", "U"},
599
600 "DMMOFEM");
601
602 return std::make_tuple(schur_dm, block_dm);
603 };
604
605 auto get_nested_mat_data = [&](auto schur_dm, auto block_dm) {
606 auto block_mat_data = createBlockMatStructure(
607 simple->getDM(),
608
609 {
610
611 {
612
613 simple->getDomainFEName(),
614
615 {
616
617 {"BROKEN", "BROKEN"},
618 {"U", "U"},
619 {"BROKEN", "U"},
620 {"U", "BROKEN"}
621
622 }
623
624 },
625
626 {
627
628 simple->getSkeletonFEName(),
629
630 {
631
632 {"BROKEN", "HYBRID"}, {"HYBRID", "BROKEN"}
633
634 }
635
636 }
637
638 }
639
640 );
641
643
644 {schur_dm, block_dm}, block_mat_data,
645
646 {"BROKEN", "U"}, {nullptr, nullptr}, true
647
648 );
649 };
650
651 auto set_ops = [&](auto schur_dm) {
653 auto dm_is = getDMSubData(schur_dm)->getSmartRowIs();
654 auto ao_up = createAOMappingIS(dm_is, PETSC_NULLPTR);
655
656 boost::shared_ptr<BlockStructure> block_data;
657 CHKERR DMMoFEMGetBlocMatData(simple->getDM(), block_data);
658
659 if (AT == BLOCK_SCHUR) {
660 pip_mng->getOpDomainLhsPipeline().push_front(
662 pip_mng->getOpDomainLhsPipeline().push_back(
663
664 createOpSchurAssembleEnd({"BROKEN", "U"}, {nullptr, nullptr}, ao_up,
665 S, true, true)
666
667 );
668 }
669
670 auto pre_proc_schur_lhs_ptr = boost::make_shared<FEMethod>();
671 auto post_proc_schur_lhs_ptr = boost::make_shared<FEMethod>();
672
673 pre_proc_schur_lhs_ptr->preProcessHook = [this]() {
675 CHKERR MatZeroEntries(S);
676 MOFEM_LOG("AT", Sev::verbose) << "Lhs Assemble Begin";
678 };
679
680 post_proc_schur_lhs_ptr->postProcessHook = [this, ao_up,
681 post_proc_schur_lhs_ptr]() {
683 MOFEM_LOG("AT", Sev::verbose) << "Lhs Assemble End";
684
685 if (AT == BLOCK_SCHUR) {
686 CHKERR MatAssemblyBegin(S, MAT_FINAL_ASSEMBLY);
687 CHKERR MatAssemblyEnd(S, MAT_FINAL_ASSEMBLY);
688 if (1) {
689 auto S_from_block = matDuplicate(S, MAT_SHARE_NONZERO_PATTERN);
690 // Create matrix from block mat
691 CHKERR assembleBlockMatSchur(mField, post_proc_schur_lhs_ptr->B,
692 S_from_block, {"BROKEN", "U"},
693 {nullptr, nullptr}, ao_up);
694 CHKERR MatAssemblyBegin(S_from_block, MAT_FINAL_ASSEMBLY);
695 CHKERR MatAssemblyEnd(S_from_block, MAT_FINAL_ASSEMBLY);
696 CHKERR MatAYPX(S_from_block, -1, S, DIFFERENT_NONZERO_PATTERN);
697 double norm;
698 CHKERR MatNorm(S_from_block, NORM_FROBENIUS, &norm);
699 MOFEM_LOG("AT", Sev::inform) << "Norm of difference: " << norm;
700 if (norm > 1e-6)
701 SETERRQ(
702 PETSC_COMM_SELF, MOFEM_ATOM_TEST_INVALID,
703 "Norm of difference between Schur and block matrix is larger "
704 "than accepted");
705 }
706 } else {
707 CHKERR assembleBlockMatSchur(mField, post_proc_schur_lhs_ptr->B, S,
708 {"BROKEN", "U"}, {nullptr, nullptr}, ao_up);
709 CHKERR MatAssemblyBegin(S, MAT_FINAL_ASSEMBLY);
710 CHKERR MatAssemblyEnd(S, MAT_FINAL_ASSEMBLY);
711 }
712
713 MOFEM_LOG("AT", Sev::verbose) << "Lhs Assemble Finish";
715 };
716
717 auto ksp_ctx_ptr = getDMKspCtx(simple->getDM());
718 ksp_ctx_ptr->getPreProcSetOperators().push_front(pre_proc_schur_lhs_ptr);
719 ksp_ctx_ptr->getPostProcSetOperators().push_back(post_proc_schur_lhs_ptr);
720
722 };
723
724 auto set_pc = [&](auto pc, auto block_dm) {
726 auto block_is = getDMSubData(block_dm)->getSmartRowIs();
727 CHKERR PCFieldSplitSetIS(pc, NULL, block_is);
728 CHKERR PCFieldSplitSetSchurPre(pc, PC_FIELDSPLIT_SCHUR_PRE_USER, S);
730 };
731
732
733
734 auto [schur_dm, block_dm] = create_sub_dm();
735 if (AT == BLOCK_SCHUR || AT == BLOCK_MAT) {
736 auto nested_mat_data = get_nested_mat_data(schur_dm, block_dm);
737 CHKERR DMMoFEMSetNestSchurData(simple->getDM(), nested_mat_data);
738 }
739 S = createDMHybridisedL2Matrix(schur_dm);
740 CHKERR MatSetDM(S, PETSC_NULLPTR);
741
742 int bs = (SPACE_DIM == 2) ? NBEDGE_L2(approx_order - 1)
744 CHKERR MatSetBlockSize(S, bs);
745
746 CHKERR set_ops(schur_dm);
747 CHKERR set_pc(pc, block_dm);
748 DM solver_dm;
749 CHKERR KSPGetDM(ksp, &solver_dm);
750 if (AT == BLOCK_SCHUR || AT == BLOCK_MAT)
751 CHKERR DMSetMatType(solver_dm, MATSHELL);
752
753 auto get_pc = [](auto ksp) {
754 PC pc_raw;
755 CHKERR KSPGetPC(ksp, &pc_raw);
756 return pc_raw;
757 };
758
759 auto set_diagonal_pc = [&](auto pc) {
761
762 if (AT == BLOCK_SCHUR || AT == BLOCK_MAT) {
763 auto A = createDMBlockMat(simple->getDM());
764 auto P = createDMNestSchurMat(simple->getDM());
765 CHKERR PCSetOperators(pc, A, P);
766 }
767
768 KSP *subksp;
769 CHKERR PCFieldSplitSchurGetSubKSP(pc, PETSC_NULLPTR, &subksp);
770 CHKERR setSchurA00MatSolvePC(SmartPetscObj<PC>(get_pc(subksp[0]), true));
771
772 CHKERR PetscFree(subksp);
774 };
775
776 auto set_mg_for_schur_complement = [&](auto pc, auto schur_dm, auto S) {
778
779 KSP *subksp;
780 CHKERR PCFieldSplitSchurGetSubKSP(pc, PETSC_NULLPTR, &subksp);
781 auto subpc = get_pc(subksp[1]);
782
783 auto set_pc_p_mg = [](auto dm, auto pc, auto S) {
785 CHKERR PCSetDM(pc, dm);
786 PetscBool same = PETSC_FALSE;
787 PetscObjectTypeCompare((PetscObject)pc, PCMG, &same);
788 if (same) {
789 MOFEM_LOG("TIMER", Sev::inform) << "Set up MG";
791 pc, createPCMGSetUpViaApproxOrdersCtx(dm, S, true));
792 CHKERR PCSetFromOptions(pc);
793 }
795 };
796
797 PetscBool same = PETSC_FALSE;
798 PetscObjectTypeCompare((PetscObject)subpc, PCKSP, &same);
799 if (same) {
800 CHKERR PCSetFromOptions(subpc);
801 KSP inner_ksp;
802 CHKERR PCKSPGetKSP(subpc, &inner_ksp);
803 CHKERR KSPSetFromOptions(inner_ksp);
804 PC inner_pc;
805 CHKERR KSPGetPC(inner_ksp, &inner_pc);
806 CHKERR PCSetFromOptions(inner_pc);
807 CHKERR set_pc_p_mg(schur_dm, inner_pc, S);
808 }
809
810 CHKERR PetscFree(subksp);
812 };
813
814 CHKERR KSPSetUp(ksp);
815 if (AT == BLOCK_SCHUR || AT == BLOCK_MAT) {
816 CHKERR set_diagonal_pc(pc);
817 CHKERR set_mg_for_schur_complement(pc, schur_dm, S);
818 }
819
820 } else {
821 SETERRQ(PETSC_COMM_SELF, MOFEM_ATOM_TEST_INVALID,
822 "PC is not set to PCFIELDSPLIT");
823 }
825}
@ MOFEM_ATOM_TEST_INVALID
Definition definitions.h:40
#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.
MoFEMErrorCode DMMoFEMGetBlocMatData(DM dm, boost::shared_ptr< BlockStructure > &)
Get data for block mat.
Definition DMMoFEM.cpp:1534
auto getDMKspCtx(DM dm)
Get KSP context data structure used by DM.
Definition DMMoFEM.hpp:1133
auto createDMHybridisedL2Matrix(DM dm)
Get smart hybridised L2 matrix from DM.
Definition DMMoFEM.hpp:1089
SmartPetscObj< Mat > matDuplicate(Mat mat, MatDuplicateOption op)
auto createDMNestSchurMat(DM dm)
Definition DMMoFEM.hpp:1103
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.
Definition Schur.cpp:1817
auto createDMBlockMat(DM dm)
Definition DMMoFEM.hpp:1096
constexpr AssemblyType A
static constexpr int approx_order

◆ setUp() [3/6]

MoFEMErrorCode SetUpSchurImpl::setUp ( SmartPetscObj< TS >  solver)
virtual

Implements SetUpSchur.

Definition at line 1041 of file contact.cpp.

1041 {
1043 auto simple = mField.getInterface<Simple>();
1044 auto pip = mField.getInterface<PipelineManager>();
1045
1046 SNES snes;
1047 CHKERR TSGetSNES(solver, &snes);
1048 KSP ksp;
1049 CHKERR SNESGetKSP(snes, &ksp);
1050 CHKERR KSPSetFromOptions(ksp);
1051
1052 PC pc;
1053 CHKERR KSPGetPC(ksp, &pc);
1054
1055 PetscBool is_pcfs = PETSC_FALSE;
1056 PetscObjectTypeCompare((PetscObject)pc, PCFIELDSPLIT, &is_pcfs);
1057 if (is_pcfs) {
1058
1059 MOFEM_LOG("CONTACT", Sev::inform) << "Setup Schur pc";
1060
1061 if (S) {
1064 "It is expected that Schur matrix is not allocated. This is "
1065 "possible only if PC is set up twice");
1066 }
1067
1069
1070 // Add data to DM storage
1072 CHKERR MatSetBlockSize(S, SPACE_DIM);
1073 // CHKERR MatSetOption(S, MAT_SYMMETRIC, PETSC_TRUE);
1074
1075 // Set DM to use shell block matrix
1076 DM solver_dm;
1077 CHKERR TSGetDM(solver, &solver_dm);
1078 CHKERR DMSetMatType(solver_dm, MATSHELL);
1079
1080 auto ts_ctx_ptr = getDMTsCtx(solver_dm);
1081 auto A = createDMBlockMat(simple->getDM());
1082 auto P = createDMNestSchurMat(simple->getDM());
1083
1084 if (is_quasi_static == PETSC_TRUE) {
1085 auto swap_assemble = [](TS ts, PetscReal t, Vec u, Vec u_t, PetscReal a,
1086 Mat A, Mat B, void *ctx) {
1087 return TsSetIJacobian(ts, t, u, u_t, a, B, A, ctx);
1088 };
1089 CHKERR TSSetIJacobian(solver, A, P, swap_assemble, ts_ctx_ptr.get());
1090 } else {
1091 auto swap_assemble = [](TS ts, PetscReal t, Vec u, Vec u_t, Vec utt,
1092 PetscReal a, PetscReal aa, Mat A, Mat B,
1093 void *ctx) {
1094 return TsSetI2Jacobian(ts, t, u, u_t, utt, a, aa, B, A, ctx);
1095 };
1096 CHKERR TSSetI2Jacobian(solver, A, P, swap_assemble, ts_ctx_ptr.get());
1097 }
1098 CHKERR KSPSetOperators(ksp, A, P);
1099
1101 CHKERR setPC(pc);
1102 CHKERR TSSetUp(solver);
1103 CHKERR KSPSetUp(ksp);
1105
1106 } else {
1107 MOFEM_LOG("CONTACT", Sev::inform) << "No Schur PC";
1108 pip->getOpBoundaryLhsPipeline().push_front(createOpSchurAssembleBegin());
1109 pip->getOpBoundaryLhsPipeline().push_back(createOpSchurAssembleEnd({}, {}));
1110 pip->getOpDomainLhsPipeline().push_front(createOpSchurAssembleBegin());
1111 pip->getOpDomainLhsPipeline().push_back(createOpSchurAssembleEnd({}, {}));
1112 }
1114}
auto createDMMatrix(DM dm)
Get smart matrix from DM.
Definition DMMoFEM.hpp:1076
const FTensor::Tensor2< T, Dim, Dim > Vec
PetscErrorCode TsSetIJacobian(TS ts, PetscReal t, Vec u, Vec u_t, PetscReal a, Mat A, Mat B, void *ctx)
Set function evaluating jacobian in TS solver.
Definition TsCtx.cpp:169
PetscErrorCode TsSetI2Jacobian(TS ts, PetscReal t, Vec u, Vec u_t, Vec u_tt, PetscReal a, PetscReal aa, Mat A, Mat B, void *ctx)
Calculation Jacobian for second order PDE in time.
Definition TsCtx.cpp:519
PetscBool is_quasi_static
Definition plastic.cpp:143
constexpr double t
plate stiffness
Definition plate.cpp:58
MoFEMErrorCode createSubDM()
Definition contact.cpp:1116
MoFEMErrorCode setDiagonalPC(PC pc)
Definition contact.cpp:1266
MoFEMErrorCode setPC(PC pc)
Definition contact.cpp:1258
MoFEMErrorCode setOperator()
Definition contact.cpp:1183

◆ setUp() [4/6]

MoFEMErrorCode SetUpSchurImpl::setUp ( SmartPetscObj< TS >  solver)
virtual

Implements SetUpSchur.

◆ setUp() [5/6]

MoFEMErrorCode SetUpSchurImpl::setUp ( TS  solver)
virtual

Implements SetUpSchur.

Definition at line 1685 of file plastic.cpp.

1685 {
1687 auto simple = mField.getInterface<Simple>();
1688 auto pip_mng = mField.getInterface<PipelineManager>();
1689
1690 SNES snes;
1691 CHKERR TSGetSNES(solver, &snes);
1692 KSP ksp;
1693 CHKERR SNESGetKSP(snes, &ksp);
1694 CHKERR KSPSetFromOptions(ksp);
1695
1696 PC pc;
1697 CHKERR KSPGetPC(ksp, &pc);
1698 PetscBool is_pcfs = PETSC_FALSE;
1699 PetscObjectTypeCompare((PetscObject)pc, PCFIELDSPLIT, &is_pcfs);
1700 if (is_pcfs) {
1701 if (S) {
1703 "Is expected that schur matrix is not "
1704 "allocated. This is "
1705 "possible only is PC is set up twice");
1706 }
1707
1709 CHKERR MatSetBlockSize(S, SPACE_DIM);
1710
1711 // Set DM to use shell block matrix
1712 DM solver_dm;
1713 CHKERR TSGetDM(solver, &solver_dm);
1714 CHKERR DMSetMatType(solver_dm, MATSHELL);
1715
1716 auto ts_ctx_ptr = getDMTsCtx(solver_dm);
1717 auto A = createDMBlockMat(simple->getDM());
1718 auto P = createDMNestSchurMat(simple->getDM());
1719
1720 if (is_quasi_static == PETSC_TRUE) {
1721 auto swap_assemble = [](TS ts, PetscReal t, Vec u, Vec u_t, PetscReal a,
1722 Mat A, Mat B, void *ctx) {
1723 return TsSetIJacobian(ts, t, u, u_t, a, B, A, ctx);
1724 };
1725 CHKERR TSSetIJacobian(solver, A, P, swap_assemble, ts_ctx_ptr.get());
1726 } else {
1727 auto swap_assemble = [](TS ts, PetscReal t, Vec u, Vec u_t, Vec utt,
1728 PetscReal a, PetscReal aa, Mat A, Mat B,
1729 void *ctx) {
1730 return TsSetI2Jacobian(ts, t, u, u_t, utt, a, aa, B, A, ctx);
1731 };
1732 CHKERR TSSetI2Jacobian(solver, A, P, swap_assemble, ts_ctx_ptr.get());
1733 }
1734 CHKERR KSPSetOperators(ksp, A, P);
1735
1736 auto set_ops = [&]() {
1738 auto pip_mng = mField.getInterface<PipelineManager>();
1739
1740#ifndef ADD_CONTACT
1741 // Boundary
1742 pip_mng->getOpBoundaryLhsPipeline().push_front(
1744 pip_mng->getOpBoundaryLhsPipeline().push_back(createOpSchurAssembleEnd(
1745
1746 {"EP", "TAU"}, {nullptr, nullptr}, aoSchur, S, false, false
1747
1748 ));
1749 // Domain
1750 pip_mng->getOpDomainLhsPipeline().push_front(
1752 pip_mng->getOpDomainLhsPipeline().push_back(createOpSchurAssembleEnd(
1753
1754 {"EP", "TAU"}, {nullptr, nullptr}, aoSchur, S, false, false
1755
1756 ));
1757#else
1758
1759 double eps_stab = 1e-4;
1760 CHKERR PetscOptionsGetScalar(PETSC_NULLPTR, "", "-eps_stab", &eps_stab,
1761 PETSC_NULLPTR);
1762
1765 using OpMassStab = B::OpMass<3, SPACE_DIM * SPACE_DIM>;
1766
1767 // Boundary
1768 pip_mng->getOpBoundaryLhsPipeline().push_front(
1770 pip_mng->getOpBoundaryLhsPipeline().push_back(
1771 new OpMassStab("SIGMA", "SIGMA", [eps_stab](double, double, double) {
1772 return eps_stab;
1773 }));
1774 pip_mng->getOpBoundaryLhsPipeline().push_back(createOpSchurAssembleEnd(
1775
1776 {"SIGMA", "EP", "TAU"}, {nullptr, nullptr, nullptr}, aoSchur, S,
1777 false, false
1778
1779 ));
1780 // Domain
1781 pip_mng->getOpDomainLhsPipeline().push_front(
1783 pip_mng->getOpDomainLhsPipeline().push_back(createOpSchurAssembleEnd(
1784
1785 {"SIGMA", "EP", "TAU"}, {nullptr, nullptr, nullptr}, aoSchur, S,
1786 false, false
1787
1788 ));
1789#endif // ADD_CONTACT
1791 };
1792
1793 auto set_assemble_elems = [&]() {
1795 auto schur_asmb_pre_proc = boost::make_shared<FEMethod>();
1796 schur_asmb_pre_proc->preProcessHook = [this]() {
1798 CHKERR MatZeroEntries(S);
1799 MOFEM_LOG("TIMER", Sev::verbose) << "Lhs Assemble Begin";
1801 };
1802 auto schur_asmb_post_proc = boost::make_shared<FEMethod>();
1803
1804 schur_asmb_post_proc->postProcessHook = [this, schur_asmb_post_proc]() {
1806 MOFEM_LOG("TIMER", Sev::verbose) << "Lhs Assemble End";
1807
1808 // Apply essential constrains to Schur complement
1809 CHKERR MatAssemblyBegin(S, MAT_FINAL_ASSEMBLY);
1810 CHKERR MatAssemblyEnd(S, MAT_FINAL_ASSEMBLY);
1812 mField, schur_asmb_post_proc, 1, S, aoSchur)();
1813
1815 };
1816 auto ts_ctx_ptr = getDMTsCtx(simple->getDM());
1817 ts_ctx_ptr->getPreProcessIJacobian().push_front(schur_asmb_pre_proc);
1818 ts_ctx_ptr->getPostProcessIJacobian().push_front(schur_asmb_post_proc);
1820 };
1821
1822 auto set_pc = [&]() {
1824 CHKERR PCFieldSplitSetIS(pc, NULL, fieldSplitIS);
1825 CHKERR PCFieldSplitSetSchurPre(pc, PC_FIELDSPLIT_SCHUR_PRE_USER, S);
1827 };
1828
1829 auto set_diagonal_pc = [&]() {
1831 KSP *subksp;
1832 CHKERR PCFieldSplitSchurGetSubKSP(pc, PETSC_NULLPTR, &subksp);
1833 auto get_pc = [](auto ksp) {
1834 PC pc_raw;
1835 CHKERR KSPGetPC(ksp, &pc_raw);
1836 return SmartPetscObj<PC>(pc_raw,
1837 true); // bump reference
1838 };
1839 CHKERR setSchurA00MatSolvePC(get_pc(subksp[0]));
1840 CHKERR PetscFree(subksp);
1842 };
1843
1844 CHKERR set_ops();
1845 CHKERR set_pc();
1846 CHKERR set_assemble_elems();
1847
1848 CHKERR TSSetUp(solver);
1849 CHKERR KSPSetUp(ksp);
1850 CHKERR set_diagonal_pc();
1851
1852 } else {
1853 pip_mng->getOpBoundaryLhsPipeline().push_front(
1855 pip_mng->getOpBoundaryLhsPipeline().push_back(
1856 createOpSchurAssembleEnd({}, {}));
1857 pip_mng->getOpDomainLhsPipeline().push_front(createOpSchurAssembleBegin());
1858 pip_mng->getOpDomainLhsPipeline().push_back(
1859 createOpSchurAssembleEnd({}, {}));
1860 }
1861
1862 // fieldSplitIS.reset();
1863 // aoSchur.reset();
1865}

◆ setUp() [6/6]

MoFEMErrorCode SetUpSchurImpl::setUp ( TS  ts)
virtual

Implements SetUpSchur.

Member Data Documentation

◆ aoS

SmartPetscObj<AO> SetUpSchurImpl::aoS
private

Definition at line 24 of file SetUpSchurImpl.cpp.

◆ aoSchur

SmartPetscObj<AO> SetUpSchurImpl::aoSchur
private
Examples
plastic.cpp.

Definition at line 1682 of file plastic.cpp.

◆ blockDM

SmartPetscObj< DM > SetUpSchurImpl::blockDM
private

Definition at line 1038 of file contact.cpp.

◆ epCorePtr

EshelbianCore* SetUpSchurImpl::epCorePtr
private

Definition at line 21 of file SetUpSchurImpl.cpp.

◆ fieldSplitIS

SmartPetscObj<IS> SetUpSchurImpl::fieldSplitIS
private

IS for split Schur block.

Examples
plastic.cpp.

Definition at line 1681 of file plastic.cpp.

◆ mField

MoFEM::Interface & SetUpSchurImpl::mField
private
Examples
plastic.cpp, and test_broken_space.cpp.

Definition at line 528 of file test_broken_space.cpp.

◆ piolaZeroDofsMarker

boost::shared_ptr<std::vector<unsigned char> > SetUpSchurImpl::piolaZeroDofsMarker
private

Definition at line 29 of file SetUpSchurImpl.cpp.

◆ piolaZeroDofsVec

boost::shared_ptr<std::vector<boost::weak_ptr<NumeredDofEntity> > > SetUpSchurImpl::piolaZeroDofsVec
private

Definition at line 27 of file SetUpSchurImpl.cpp.

◆ pMGPtr

boost::shared_ptr<P_MultiGridData> SetUpSchurImpl::pMGPtr
private

Definition at line 51 of file SetUpSchurImpl.cpp.

◆ S

SmartPetscObj< Mat > SetUpSchurImpl::S
private
Examples
plastic.cpp, and test_broken_space.cpp.

Definition at line 529 of file test_broken_space.cpp.

◆ schurDM

SmartPetscObj< DM > SetUpSchurImpl::schurDM
private

Definition at line 1037 of file contact.cpp.

◆ subDM

SmartPetscObj< DM > SetUpSchurImpl::subDM
private

field split sub dm

Examples
plastic.cpp.

Definition at line 1680 of file plastic.cpp.

◆ subEnts

Range SetUpSchurImpl::subEnts
private

Definition at line 776 of file elastic.cpp.

◆ volEnts

Range SetUpSchurImpl::volEnts
private

Definition at line 775 of file elastic.cpp.


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