187 auto dm =
simple->getDM();
188 auto ts = pipeline_mng->createTSIM();
190 PetscBool post_proc_vol;
191 PetscBool post_proc_skin;
194 post_proc_vol = PETSC_TRUE;
195 post_proc_skin = PETSC_FALSE;
197 post_proc_vol = PETSC_FALSE;
198 post_proc_skin = PETSC_TRUE;
200 CHKERR PetscOptionsGetBool(PETSC_NULLPTR,
"",
"-post_proc_vol",
201 &post_proc_vol, PETSC_NULLPTR);
202 CHKERR PetscOptionsGetBool(PETSC_NULLPTR,
"",
"-post_proc_skin",
203 &post_proc_skin, PETSC_NULLPTR);
206 auto create_post_proc_fe = [dm,
this,
simple, post_proc_vol,
208 auto post_proc_ele_domain = [dm,
this](
auto &pip_domain) {
211 auto common_ptr = commonDataFactory<SPACE_DIM, GAUSS, DomainEleOp>(
212 mField, pip_domain,
"U",
"MAT_ELASTIC", Sev::inform);
216 auto post_proc_map = [
this](
auto &pip,
auto u_ptr,
auto common_ptr) {
219 using OpPPMap = OpPostProcMapInMoab<SPACE_DIM, SPACE_DIM>;
221 pip->getOpPtrVector().push_back(
223 new OpPPMap(pip->getPostProcMesh(), pip->getMapGaussPts(), {},
225 {{
"GRAD", common_ptr->matGradPtr},
226 {
"FIRST_PIOLA", common_ptr->getMatFirstPiolaStress()}},
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>();
237 auto u_ptr = boost::make_shared<MatrixDouble>();
238 pip_bdy->getOpPtrVector().push_back(
239 new OpCalculateVectorFieldValues<SPACE_DIM>(
"U", u_ptr));
242 auto common_ptr = post_proc_ele_domain(op_loop_side->getOpPtrVector());
243 pip_bdy->getOpPtrVector().push_back(op_loop_side);
245 CHKERR post_proc_map(pip_bdy, u_ptr, common_ptr);
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>();
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());
261 CHKERR post_proc_map(pip_domain, u_ptr, common_ptr);
266 auto post_proc_fe_domain = boost::make_shared<PostProcEleDomain>(
mField);
267 auto post_proc_fe_bdy = boost::make_shared<PostProcEleBdy>(
mField);
269 return std::make_pair(push_post_proc_domain(post_proc_fe_domain),
270 push_post_proc_bdy(post_proc_fe_bdy));
273 auto add_extra_finite_elements_to_solver_pipelines = [&]() {
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>();
280 auto time_scale = boost::make_shared<ExampleTimeScale>();
282 auto get_bc_hook_rhs = [
this, pre_proc_ptr, time_scale]() {
284 CHKERR EssentialPreProc<DisplacementCubitBcData>(mField, pre_proc_ptr,
285 {time_scale},
false)();
289 pre_proc_ptr->preProcessHook = get_bc_hook_rhs;
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.)();
299 auto get_post_proc_hook_lhs = [
this, post_proc_lhs_ptr]() {
301 CHKERR EssentialPostProcLhs<DisplacementCubitBcData>(
302 mField, post_proc_lhs_ptr, 1.)();
305 post_proc_rhs_ptr->postProcessHook = get_post_proc_hook_rhs;
306 post_proc_lhs_ptr->postProcessHook = get_post_proc_hook_lhs;
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);
319 CHKERR add_extra_finite_elements_to_solver_pipelines();
321 auto create_monitor_fe = [dm](
auto &&post_proc_fe,
auto &&reactionFe) {
322 return boost::make_shared<Monitor>(dm, post_proc_fe, reactionFe);
326 boost::shared_ptr<FEMethod> null_fe;
327 auto monitor_ptr = create_monitor_fe(create_post_proc_fe(), reactionFe);
329 null_fe, monitor_ptr);
333 CHKERR TSSetMaxTime(ts, ftime);
334 CHKERR TSSetExactFinalTime(ts, TS_EXACTFINALTIME_MATCHSTEP);
337 CHKERR TSSetI2Jacobian(ts,
B,
B, PETSC_NULLPTR, PETSC_NULLPTR);
340 CHKERR TSSetFromOptions(ts);
343 CHKERR TSGetTime(ts, &ftime);
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 "
354 steps, rejects, snesfails, ftime, nonlinits, linits);
365 auto dm =
simple->getDM();
367 auto T = createDMVector(
simple->getDM());
368 CHKERR DMoFEMMeshToLocalVector(
simple->getDM(), T, INSERT_VALUES,
371 CHKERR VecNorm(T, NORM_2, &nrm2);
372 MOFEM_LOG(
"EXAMPLE", Sev::inform) <<
"Solution norm " << nrm2;
374 auto post_proc_norm_fe = boost::make_shared<DomainEle>(
mField);
376 auto post_proc_norm_rule_hook = [](int, int,
int p) ->
int {
return 2 * p; };
377 post_proc_norm_fe->getRuleHook = post_proc_norm_rule_hook;
380 post_proc_norm_fe->getOpPtrVector(), {H1},
"GEOMETRY");
382 enum NORMS { U_NORM_L2 = 0, PIOLA_NORM, LAST_NORM };
386 CHKERR VecZeroEntries(norms_vec);
388 auto u_ptr = boost::make_shared<MatrixDouble>();
389 post_proc_norm_fe->getOpPtrVector().push_back(
390 new OpCalculateVectorFieldValues<SPACE_DIM>(
"U", u_ptr));
392 post_proc_norm_fe->getOpPtrVector().push_back(
393 new OpCalcNormL2Tensor1<SPACE_DIM>(u_ptr, norms_vec, U_NORM_L2));
395 auto common_ptr = commonDataFactory<SPACE_DIM, GAUSS, DomainEleOp>(
396 mField, post_proc_norm_fe->getOpPtrVector(),
"U",
"MAT_ELASTIC",
399 post_proc_norm_fe->getOpPtrVector().push_back(
400 new OpCalcNormL2Tensor2<SPACE_DIM, SPACE_DIM>(
401 common_ptr->getMatFirstPiolaStress(), norms_vec, PIOLA_NORM));
403 CHKERR DMoFEMLoopFiniteElements(dm,
simple->getDomainFEName(),
406 CHKERR VecAssemblyBegin(norms_vec);
407 CHKERR VecAssemblyEnd(norms_vec);
412 CHKERR VecGetArrayRead(norms_vec, &norms);
414 <<
"norm_u: " << std::scientific << std::sqrt(norms[U_NORM_L2]);
416 <<
"norm_piola: " << std::scientific << std::sqrt(norms[PIOLA_NORM]);
417 CHKERR VecRestoreArrayRead(norms_vec, &norms);