182 {
186
187 auto dm =
simple->getDM();
188 auto ts = pipeline_mng->createTSIM();
189
190 PetscBool post_proc_vol;
191 PetscBool post_proc_skin;
192
194 post_proc_vol = PETSC_TRUE;
195 post_proc_skin = PETSC_FALSE;
196 } else {
197 post_proc_vol = PETSC_FALSE;
198 post_proc_skin = PETSC_TRUE;
199 }
201 &post_proc_vol, PETSC_NULLPTR);
203 &post_proc_skin, PETSC_NULLPTR);
204
205
206 auto create_post_proc_fe = [dm,
this,
simple, post_proc_vol,
207 post_proc_skin]() {
208 auto post_proc_ele_domain = [dm, this](auto &pip_domain) {
210 "GEOMETRY");
211 auto common_ptr = commonDataFactory<SPACE_DIM, GAUSS, DomainEleOp>(
212 mField, pip_domain,
"U",
"MAT_ELASTIC", Sev::inform);
213 return common_ptr;
214 };
215
216 auto post_proc_map = [this](auto &pip, auto u_ptr, auto common_ptr) {
218
219 using OpPPMap = OpPostProcMapInMoab<SPACE_DIM, SPACE_DIM>;
220
221 pip->getOpPtrVector().push_back(
222
223 new OpPPMap(pip->getPostProcMesh(), pip->getMapGaussPts(), {},
224 {{"U", u_ptr}},
225 {{"GRAD", common_ptr->matGradPtr},
226 {"FIRST_PIOLA", common_ptr->getMatFirstPiolaStress()}},
227 {}));
229 };
230
231 auto push_post_proc_bdy = [dm,
this,
simple, post_proc_skin,
232 &post_proc_ele_domain,
233 &post_proc_map](auto &pip_bdy) {
234 if (post_proc_skin == PETSC_FALSE)
235 return boost::shared_ptr<PostProcEleBdy>();
236
237 auto u_ptr = boost::make_shared<MatrixDouble>();
238 pip_bdy->getOpPtrVector().push_back(
239 new OpCalculateVectorFieldValues<SPACE_DIM>("U", u_ptr));
240 auto op_loop_side =
242 auto common_ptr = post_proc_ele_domain(op_loop_side->getOpPtrVector());
243 pip_bdy->getOpPtrVector().push_back(op_loop_side);
244
245 CHKERR post_proc_map(pip_bdy, u_ptr, common_ptr);
246
247 return pip_bdy;
248 };
249
250 auto push_post_proc_domain = [dm,
this,
simple, post_proc_vol,
251 &post_proc_ele_domain,
252 &post_proc_map](auto &pip_domain) {
253 if (post_proc_vol == PETSC_FALSE)
254 return boost::shared_ptr<PostProcEleDomain>();
255
256 auto u_ptr = boost::make_shared<MatrixDouble>();
257 pip_domain->getOpPtrVector().push_back(
258 new OpCalculateVectorFieldValues<SPACE_DIM>("U", u_ptr));
259 auto common_ptr = post_proc_ele_domain(pip_domain->getOpPtrVector());
260
261 CHKERR post_proc_map(pip_domain, u_ptr, common_ptr);
262
263 return pip_domain;
264 };
265
266 auto post_proc_fe_domain = boost::make_shared<PostProcEleDomain>(
mField);
267 auto post_proc_fe_bdy = boost::make_shared<PostProcEleBdy>(
mField);
268
269 return std::make_pair(push_post_proc_domain(post_proc_fe_domain),
270 push_post_proc_bdy(post_proc_fe_bdy));
271 };
272
273 auto add_extra_finite_elements_to_solver_pipelines = [&]() {
275
276 auto pre_proc_ptr = boost::make_shared<FEMethod>();
277 auto post_proc_rhs_ptr = boost::make_shared<FEMethod>();
278 auto post_proc_lhs_ptr = boost::make_shared<FEMethod>();
279
280 auto time_scale = boost::make_shared<ExampleTimeScale>();
281
282 auto get_bc_hook_rhs = [this, pre_proc_ptr, time_scale]() {
284 CHKERR EssentialPreProc<DisplacementCubitBcData>(
mField, pre_proc_ptr,
285 {time_scale}, false)();
287 };
288
289 pre_proc_ptr->preProcessHook = get_bc_hook_rhs;
290
291 auto get_post_proc_hook_rhs = [this, post_proc_rhs_ptr]() {
293 CHKERR EssentialPreProcReaction<DisplacementCubitBcData>(
294 mField, post_proc_rhs_ptr,
nullptr, Sev::verbose)();
295 CHKERR EssentialPostProcRhs<DisplacementCubitBcData>(
296 mField, post_proc_rhs_ptr, 1.)();
298 };
299 auto get_post_proc_hook_lhs = [this, post_proc_lhs_ptr]() {
301 CHKERR EssentialPostProcLhs<DisplacementCubitBcData>(
302 mField, post_proc_lhs_ptr, 1.)();
304 };
305 post_proc_rhs_ptr->postProcessHook = get_post_proc_hook_rhs;
306 post_proc_lhs_ptr->postProcessHook = get_post_proc_hook_lhs;
307
308
310 ts_ctx_ptr->getPreProcessIFunction().push_front(pre_proc_ptr);
311 ts_ctx_ptr->getPreProcessIJacobian().push_front(pre_proc_ptr);
312 ts_ctx_ptr->getPostProcessIFunction().push_back(post_proc_rhs_ptr);
313 ts_ctx_ptr->getPostProcessIJacobian().push_back(post_proc_lhs_ptr);
315 };
316
317
318
319 CHKERR add_extra_finite_elements_to_solver_pipelines();
320
321 auto create_monitor_fe = [dm](
auto &&post_proc_fe,
auto &&
reactionFe) {
322 return boost::make_shared<Monitor>(dm, post_proc_fe,
reactionFe);
323 };
324
325
326 boost::shared_ptr<FEMethod> null_fe;
327 auto monitor_ptr = create_monitor_fe(create_post_proc_fe(),
reactionFe);
329 null_fe, monitor_ptr);
330
331
332 double ftime = 1;
333 CHKERR TSSetMaxTime(ts, ftime);
334 CHKERR TSSetExactFinalTime(ts, TS_EXACTFINALTIME_MATCHSTEP);
335
337 CHKERR TSSetI2Jacobian(ts,
B,
B, PETSC_NULLPTR, PETSC_NULLPTR);
340 CHKERR TSSetFromOptions(ts);
341
343 CHKERR TSGetTime(ts, &ftime);
344
345 PetscInt steps, snesfails, rejects, nonlinits, linits;
346 CHKERR TSGetStepNumber(ts, &steps);
347 CHKERR TSGetSNESFailures(ts, &snesfails);
348 CHKERR TSGetStepRejections(ts, &rejects);
349 CHKERR TSGetSNESIterations(ts, &nonlinits);
350 CHKERR TSGetKSPIterations(ts, &linits);
352 "steps %d (%d rejected, %d SNES fails), ftime %g, nonlinits "
353 "%d, linits %d",
354 steps, rejects, snesfails, ftime, nonlinits, linits);
355
357}
#define MOFEM_LOG_C(channel, severity, format,...)
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
auto createDMMatrix(DM dm)
Get smart matrix from DM.
PetscErrorCode DMMoFEMTSSetMonitor(DM dm, TS ts, const std::string fe_name, boost::shared_ptr< MoFEM::FEMethod > method, boost::shared_ptr< MoFEM::BasicMethod > pre_only, boost::shared_ptr< MoFEM::BasicMethod > post_only)
Set Monitor To TS solver.
auto getDMTsCtx(DM dm)
Get TS context data structure used by DM.
PetscErrorCode PetscOptionsGetBool(PetscOptions *, const char pre[], const char name[], PetscBool *bval, PetscBool *set)
OpPostProcMapInMoab< SPACE_DIM, SPACE_DIM > OpPPMap