v0.16.0
Loading...
Searching...
No Matches
Public Member Functions | Private Attributes | Friends | List of all members
MoFEM::KspCtx Struct Reference

Interface for linear (KSP) solver. More...

#include "src/petsc/KspCtx.hpp"

Collaboration diagram for MoFEM::KspCtx:
[legend]

Public Member Functions

 KspCtx (MoFEM::Interface &m_field, std::string problem_name)
 
virtual ~KspCtx ()
 
FEMethodsSequencegetSetOperators ()
 
FEMethodsSequencegetComputeRhs ()
 
BasicMethodsSequencegetPreProcComputeRhs ()
 
BasicMethodsSequencegetPostProcComputeRhs ()
 
BasicMethodsSequencegetPreProcSetOperators ()
 
BasicMethodsSequencegetPostProcSetOperators ()
 
MoFEMErrorCode clearLoops ()
 Clear loops.
 

Private Attributes

boost::movelib::unique_ptr< KspCtxImpl > kspCtxImpl
 

Friends

PetscErrorCode KspRhs (KSP ksp, Vec f, void *ctx)
 Run over elements in the lists.
 
PetscErrorCode KspMat (KSP ksp, Mat A, Mat B, void *ctx)
 Run over elements in the list.
 

Detailed Description

Interface for linear (KSP) solver.

Definition at line 14 of file KspCtx.hpp.

Constructor & Destructor Documentation

◆ KspCtx()

MoFEM::KspCtx::KspCtx ( MoFEM::Interface m_field,
std::string  problem_name 
)

Definition at line 96 of file KspCtx.cpp.

97 : kspCtxImpl(boost::movelib::make_unique<KspCtx::KspCtxImpl>(
98 m_field, problem_name)) {}
boost::movelib::unique_ptr< KspCtxImpl > kspCtxImpl
Definition KspCtx.hpp:74

◆ ~KspCtx()

MoFEM::KspCtx::~KspCtx ( )
virtualdefault

Member Function Documentation

◆ clearLoops()

MoFEMErrorCode MoFEM::KspCtx::clearLoops ( )

Clear loops.

Returns
MoFEMErrorCode

Definition at line 126 of file KspCtx.cpp.

126{ return kspCtxImpl->clearLoops(); }

◆ getComputeRhs()

FEMethodsSequence & MoFEM::KspCtx::getComputeRhs ( )
Returns
return vector to vector with FEMethod to vector

Definition at line 106 of file KspCtx.cpp.

106 {
107 return kspCtxImpl->getComputeRhs();
108}

◆ getPostProcComputeRhs()

BasicMethodsSequence & MoFEM::KspCtx::getPostProcComputeRhs ( )

The sequence of BasicMethod is executed after residual is calculated. It can be used to setup data structures, e.g. aggregate data from processors or to apply essential boundary conditions.

Returns
reference to BasicMethod for postprocessing

Definition at line 114 of file KspCtx.cpp.

114 {
115 return kspCtxImpl->getPostProcComputeRhs();
116}

◆ getPostProcSetOperators()

BasicMethodsSequence & MoFEM::KspCtx::getPostProcSetOperators ( )

The sequence of BasicMethod is executed after tangent matrix is calculated. It can be used to setup data structures, e.g. aggregate data from processors or to apply essential boundary conditions.

Returns
reference to BasicMethod for postprocessing

Definition at line 122 of file KspCtx.cpp.

122 {
123 return kspCtxImpl->getPostProcSetOperators();
124}

◆ getPreProcComputeRhs()

BasicMethodsSequence & MoFEM::KspCtx::getPreProcComputeRhs ( )

The sequence of BasicMethod is executed before residual is calculated. It can be used to setup data structures, e.g. zero global variable which is integrated in domain, e.g. for calculation of strain energy.

Returns
reference to BasicMethod for preprocessing

Definition at line 110 of file KspCtx.cpp.

110 {
111 return kspCtxImpl->getPreProcComputeRhs();
112}

◆ getPreProcSetOperators()

BasicMethodsSequence & MoFEM::KspCtx::getPreProcSetOperators ( )
Returns
reference to BasicMethod for preprocessing

Definition at line 118 of file KspCtx.cpp.

118 {
119 return kspCtxImpl->getPreProcSetOperators();
120}

◆ getSetOperators()

FEMethodsSequence & MoFEM::KspCtx::getSetOperators ( )
Returns
return reference to vector with FEMethod to calculate matrix

Definition at line 102 of file KspCtx.cpp.

102 {
103 return kspCtxImpl->getSetOperators();
104}

Friends And Related Symbol Documentation

◆ KspMat

PetscErrorCode KspMat ( KSP  ksp,
Mat  A,
Mat  B,
void *  ctx 
)
friend

Run over elements in the list.

Parameters
kspKSP solver
Amatrix
BPreconditioned matrix
ctxdata context, i.e. KspCtx
Returns
error code

Definition at line 211 of file KspCtx.cpp.

211 {
212 // PetscValidHeaderSpecific(ksp,KSP_CLASSID,1);
214 KspCtx::KspCtxImpl *ksp_ctx = static_cast<KspCtx *>(ctx)->kspCtxImpl.get();
215 PetscLogEventBegin(ksp_ctx->MOFEM_EVENT_KspMat, 0, 0, 0, 0);
216
217 ksp_ctx->matAssembleSwitch = boost::movelib::make_unique<bool>(true);
218 auto cache_ptr = boost::make_shared<CacheTuple>();
219 CHKERR ksp_ctx->mField.cache_problem_entities(ksp_ctx->problemName,
220 cache_ptr);
221
222 auto set = [&](auto &fe) {
223 fe.ksp = ksp;
224 fe.ksp_A = A;
225 fe.ksp_B = B;
226 fe.ksp_ctx = KspMethod::CTX_OPERATORS;
228 fe.cacheWeakPtr = cache_ptr;
229 };
230
231 auto unset = [&](auto &fe) {
232 fe.ksp_ctx = KspMethod::CTX_KSPNONE;
233 fe.data_ctx = PetscData::CtxSetNone;
234 };
235
236 auto ent_data_cache = boost::make_shared<std::vector<EntityCacheDofs>>();
237 auto ent_row_cache =
238 boost::make_shared<std::vector<EntityCacheNumeredDofs>>();
239 auto ent_col_cache =
240 boost::make_shared<std::vector<EntityCacheNumeredDofs>>();
241
242 // pre-procsess
243 for (auto &bit : ksp_ctx->preProcessOperator) {
244 bit->matAssembleSwitch = boost::move(ksp_ctx->matAssembleSwitch);
245 set(*bit);
246 CHKERR ksp_ctx->mField.problem_basic_method_preProcess(ksp_ctx->problemName,
247 *bit);
248 unset(*bit);
249 ksp_ctx->matAssembleSwitch = boost::move(bit->matAssembleSwitch);
250 }
251
252 // operators
253 for (auto &lit : ksp_ctx->loopsOperator) {
254 lit.second->matAssembleSwitch = boost::move(ksp_ctx->matAssembleSwitch);
255 set(*lit.second);
256 CHKERR ksp_ctx->mField.loop_finite_elements(ksp_ctx->problemName, lit.first,
257 *(lit.second), nullptr,
258 ksp_ctx->bH, cache_ptr);
259 unset(*lit.second);
260 ksp_ctx->matAssembleSwitch = boost::move(lit.second->matAssembleSwitch);
261 }
262
263 // post-process
264 for (auto &bit : ksp_ctx->postProcessOperator) {
265 bit->matAssembleSwitch = boost::move(ksp_ctx->matAssembleSwitch);
266 set(*bit);
267 CHKERR ksp_ctx->mField.problem_basic_method_postProcess(
268 ksp_ctx->problemName, *bit);
269 unset(*bit);
270 ksp_ctx->matAssembleSwitch = boost::move(bit->matAssembleSwitch);
271 }
272
273 if (ksp_ctx->matAssembleSwitch) {
274 CHKERR MatAssemblyBegin(B, MAT_FINAL_ASSEMBLY);
275 CHKERR MatAssemblyEnd(B, MAT_FINAL_ASSEMBLY);
276 }
277 PetscLogEventEnd(ksp_ctx->MOFEM_EVENT_KspMat, 0, 0, 0, 0);
279}
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
auto bit
set bit
constexpr AssemblyType A
KspCtx(MoFEM::Interface &m_field, std::string problem_name)
Definition KspCtx.cpp:96
@ CTX_KSPNONE
No specific KSP context.
@ CTX_OPERATORS
Setting up linear operators.
static constexpr Switches CtxSetA
Jacobian matrix switch.
static constexpr Switches CtxSetNone
No data switch.
static constexpr Switches CtxSetB
Preconditioner matrix switch.

◆ KspRhs

PetscErrorCode KspRhs ( KSP  ksp,
Vec  f,
void *  ctx 
)
friend

Run over elements in the lists.

Parameters
kspKSP solver
fthe right hand side vector
ctxdata context, i.e. KspCtx
Returns
error code

Definition at line 147 of file KspCtx.cpp.

147 {
149 KspCtx::KspCtxImpl *ksp_ctx = static_cast<KspCtx *>(ctx)->kspCtxImpl.get();
150 PetscLogEventBegin(ksp_ctx->MOFEM_EVENT_KspRhs, 0, 0, 0, 0);
151
152 ksp_ctx->vecAssembleSwitch = boost::movelib::make_unique<bool>(true);
153
154 auto cache_ptr = boost::make_shared<CacheTuple>();
155 CHKERR ksp_ctx->mField.cache_problem_entities(ksp_ctx->problemName,
156 cache_ptr);
157
158 auto set = [&](auto &fe) {
159 fe.ksp = ksp;
160 fe.ksp_ctx = KspMethod::CTX_SETFUNCTION;
161 fe.data_ctx = PetscData::CtxSetF;
162 fe.ksp_f = f;
163 fe.cacheWeakPtr = cache_ptr;
164 };
165
166 auto unset = [&](auto &fe) {
167 fe.ksp_ctx = KspMethod::CTX_KSPNONE;
168 fe.data_ctx = PetscData::CtxSetNone;
169 };
170
171 // pre-process
172 for (auto &bit : ksp_ctx->preProcessRhs) {
173 bit->vecAssembleSwitch = boost::move(ksp_ctx->vecAssembleSwitch);
174 set(*bit);
175 CHKERR ksp_ctx->mField.problem_basic_method_preProcess(ksp_ctx->problemName,
176 *bit);
177 unset(*bit);
178 ksp_ctx->vecAssembleSwitch = boost::move(bit->vecAssembleSwitch);
179 }
180
181 // operators
182 for (auto &lit : ksp_ctx->loopsRhs) {
183 lit.second->vecAssembleSwitch = boost::move(ksp_ctx->vecAssembleSwitch);
184 set(*lit.second);
185 CHKERR ksp_ctx->mField.loop_finite_elements(ksp_ctx->problemName, lit.first,
186 *(lit.second), nullptr,
187 ksp_ctx->bH, cache_ptr);
188 unset(*lit.second);
189 ksp_ctx->vecAssembleSwitch = boost::move(lit.second->vecAssembleSwitch);
190 }
191
192 // post-process
193 for (auto &bit : ksp_ctx->postProcessRhs) {
194 bit->vecAssembleSwitch = boost::move(ksp_ctx->vecAssembleSwitch);
195 set(*bit);
196 CHKERR ksp_ctx->mField.problem_basic_method_postProcess(
197 ksp_ctx->problemName, *bit);
198 unset(*bit);
199 ksp_ctx->vecAssembleSwitch = boost::move(bit->vecAssembleSwitch);
200 }
201
202 if (*ksp_ctx->vecAssembleSwitch) {
203 CHKERR VecGhostUpdateBegin(f, ADD_VALUES, SCATTER_REVERSE);
204 CHKERR VecGhostUpdateEnd(f, ADD_VALUES, SCATTER_REVERSE);
205 CHKERR VecAssemblyBegin(f);
206 CHKERR VecAssemblyEnd(f);
207 }
208 PetscLogEventEnd(ksp_ctx->MOFEM_EVENT_KspRhs, 0, 0, 0, 0);
210}
@ CTX_SETFUNCTION
Setting up the linear system function.
static constexpr Switches CtxSetF
Residual vector switch.

Member Data Documentation

◆ kspCtxImpl

boost::movelib::unique_ptr<KspCtxImpl> MoFEM::KspCtx::kspCtxImpl
private

Definition at line 74 of file KspCtx.hpp.


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