v0.15.0
Loading...
Searching...
No Matches
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 ()
 
- Public Member Functions inherited from SetUpSchur
- Public Member Functions inherited from EshelbianCore::SetUpSchur

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
Examples
plastic.cpp, and test_broken_space.cpp.

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:1144
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:1160
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:1116
auto createDMHybridisedL2Matrix(DM dm)
Get smart hybridised L2 matrix from DM.
Definition DMMoFEM.hpp:1072
SmartPetscObj< Mat > matDuplicate(Mat mat, MatDuplicateOption op)
auto createDMNestSchurMat(DM dm)
Definition DMMoFEM.hpp:1086
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:1079
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:1059
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
constexpr AssemblyType A
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: