23 {
24
25 const string default_options = "-ksp_type fgmres \n"
26 "-pc_type lu \n"
27 "-pc_factor_mat_solver_type mumps \n"
28 "-mat_mumps_icntl_20 0 \n"
29 "-ksp_atol 1e-10 \n"
30 "-ksp_rtol 1e-10 \n"
31 "-snes_monitor \n"
32 "-snes_type newtonls \n"
33 "-snes_linesearch_type basic \n"
34 "-snes_max_it 100 \n"
35 "-snes_atol 1e-7 \n"
36 "-snes_rtol 1e-7 \n"
37 "-ts_monitor \n"
38 "-ts_type alpha \n";
39
40 string param_file = "param_file.petsc";
41 if (!static_cast<bool>(ifstream(param_file))) {
42 std::ofstream
file(param_file.c_str(), std::ios::ate);
44 file << default_options;
46 }
47 }
48
50
51
52 try {
53
54 moab::Core mb_instance;
55 moab::Interface &moab = mb_instance;
56
57 ParallelComm *pcomm = ParallelComm::get_pcomm(&moab,
MYPCOMM_INDEX);
58 auto moab_comm_wrap =
59 boost::make_shared<WrapMPIComm>(PETSC_COMM_WORLD, false);
60 if (pcomm == NULL)
61 pcomm = new ParallelComm(&moab, moab_comm_wrap->get_comm());
62
63 PetscBool flg = PETSC_TRUE;
64 char mesh_file_name[255];
66 mesh_file_name, 255, &flg);
67 if (flg != PETSC_TRUE) {
68 SETERRQ(PETSC_COMM_SELF, 1, "*** ERROR -my_file (MESH FILE NEEDED)");
69 }
70
73 &flg);
74 if (flg != PETSC_TRUE) {
76 }
77
78
79
80 PetscBool is_partitioned = PETSC_FALSE;
82 &is_partitioned, &flg);
83
84 if (is_partitioned == PETSC_TRUE) {
85
86 const char *option;
87 option = "PARALLEL=BCAST_DELETE;PARALLEL_RESOLVE_SHARED_ENTS;PARTITION="
88 "PARALLEL_PARTITION;";
89 CHKERR moab.load_file(mesh_file_name, 0, option);
90 } else {
91 const char *option;
92 option = "";
93 CHKERR moab.load_file(mesh_file_name, 0, option);
94 }
95
96
97 Tag th_step_size, th_step;
98 double def_step_size = 1;
99 CHKERR moab.tag_get_handle(
"_STEPSIZE", 1, MB_TYPE_DOUBLE, th_step_size,
100 MB_TAG_CREAT | MB_TAG_MESH, &def_step_size);
101 if (
rval == MB_ALREADY_ALLOCATED)
103
104 int def_step = 1;
105 CHKERR moab.tag_get_handle(
"_STEP", 1, MB_TYPE_INTEGER, th_step,
106 MB_TAG_CREAT | MB_TAG_MESH, &def_step);
107 if (
rval == MB_ALREADY_ALLOCATED)
109
110 const void *tag_data_step_size[1];
111 EntityHandle root = moab.get_root_set();
112 CHKERR moab.tag_get_by_ptr(th_step_size, &root, 1, tag_data_step_size);
113 double &step_size = *(double *)tag_data_step_size[0];
114 const void *tag_data_step[1];
115 CHKERR moab.tag_get_by_ptr(th_step, &root, 1, tag_data_step);
116 int &step = *(int *)tag_data_step[0];
117
118 CHKERR PetscPrintf(PETSC_COMM_WORLD,
119 "Start step %D and step_size = %6.4e\n", step,
120 step_size);
121
124
125
128 std::vector<BitRefLevel> bit_levels;
131
132 if (step == 1) {
133
134 problem_bit_level = bit_levels.back();
135
136
138 3);
141
143
144
147
148
151
152
153
155 "MESH_NODE_POSITIONS");
156
157
159 "SPATIAL_POSITION");
162 "SPATIAL_POSITION");
164 "ELASTIC", "LAMBDA");
166 "SPATIAL_POSITION");
168 "ELASTIC", "MESH_NODE_POSITIONS");
170
171
173 "LAMBDA");
175 "LAMBDA");
176
178 "LAMBDA");
179
180
182
183
185 "ELASTIC");
187 "ARC_LENGTH");
188
190 "SPRING");
191
192
194 problem_bit_level);
195
196
200
201
202 {
203
204 EntityHandle no_field_vertex;
205 {
206 const double coords[] = {0, 0, 0};
208 Range range_no_field_vertex;
209 range_no_field_vertex.insert(no_field_vertex);
214 range_no_field_vertex);
215 }
216
217 EntityHandle meshset_fe_arc_length;
218 {
219 CHKERR moab.create_meshset(MESHSET_SET, meshset_fe_arc_length);
220 CHKERR moab.add_entities(meshset_fe_arc_length, &no_field_vertex, 1);
223 }
224
226 meshset_fe_arc_length, "ARC_LENGTH", false);
227 }
228
229
234
239
244
245
248 "SPATIAL_POSITION");
250 "SPATIAL_POSITION");
252 "SPATIAL_POSITION");
254 "NEUMANN_FE", "MESH_NODE_POSITIONS");
256 "NEUMANN_FE");
260 CHKERR moab.get_entities_by_type(it->meshset, MBTRI, tris,
true);
262 "NEUMANN_FE");
263 }
267 CHKERR moab.get_entities_by_type(it->meshset, MBTRI, tris,
true);
269 "NEUMANN_FE");
270 }
271
274 "FORCE_FE");
275 }
276
277
278
279 boost::shared_ptr<FaceElementForcesAndSourcesCore> fe_spring_lhs_ptr(
281 boost::shared_ptr<FaceElementForcesAndSourcesCore> fe_spring_rhs_ptr(
283
285 m_field, fe_spring_lhs_ptr, fe_spring_rhs_ptr, "SPATIAL_POSITION",
286 "MESH_NODE_POSITIONS");
287
288 PetscBool linear;
290 &linear);
291
294 CHKERR elastic_materials.setBlocks(elastic.setOfBlocks);
295 CHKERR elastic.addElement(
"ELASTIC",
"SPATIAL_POSITION");
297 "MESH_NODE_POSITIONS");
299 "MESH_NODE_POSITIONS");
301 elastic.getLoopFeEnergy().getOpPtrVector(), {H1},
302 "MESH_NODE_POSITIONS");
303 CHKERR elastic.setOperators(
"SPATIAL_POSITION");
304
305
307 m_field);
309 "MESH_NODE_POSITIONS");
310 auto spatial_pos_ptr = boost::make_shared<MatrixDouble>();
311 auto mesh_pos_ptr = boost::make_shared<MatrixDouble>();
312 auto spatial_pos_grad_ptr = boost::make_shared<MatrixDouble>();
313 post_proc.getOpPtrVector().push_back(
315 spatial_pos_ptr));
316 post_proc.getOpPtrVector().push_back(
318 mesh_pos_ptr));
319 post_proc.getOpPtrVector().push_back(
321 spatial_pos_grad_ptr));
322 std::map<int, NonlinearElasticElement::BlockData>::iterator sit =
323 elastic.setOfBlocks.begin();
324 for (; sit != elastic.setOfBlocks.end(); sit++) {
326 post_proc.getPostProcMesh(), post_proc.getMapGaussPts(),
327 post_proc.getPostProcElements(), "SPATIAL_POSITION", sit->second,
328 spatial_pos_ptr, mesh_pos_ptr, spatial_pos_grad_ptr));
329 }
331 post_proc.getOpPtrVector().push_back(
new OpPPMap(
332 post_proc.getPostProcMesh(), post_proc.getMapGaussPts(), {},
333 {{"SPATIAL_POSITION", spatial_pos_ptr},
334 {"MESH_NODE_POSITIONS", mesh_pos_ptr}},
335 {{"SPATIAL_POSITION_GRAD", spatial_pos_grad_ptr}}, {}));
336
337
339 if (step == 1) {
340
342 "MESH_NODE_POSITIONS");
343 CHKERR m_field.
loop_dofs(
"MESH_NODE_POSITIONS", ent_method_material, 0);
345 "SPATIAL_POSITION");
347 "SPATIAL_POSITION");
349 1., "MESH_NODE_POSITIONS", "SPATIAL_POSITION");
351 "SPATIAL_POSITION");
353 "SPATIAL_POSITION");
354 }
355
356
358
359
361
364
365 if (is_partitioned) {
366 SETERRQ(PETSC_COMM_SELF, 1,
367 "Not implemented, problem with arc-length force multiplayer");
368 } else {
372 }
374
375
380
382
383
386 "ELASTIC_MECHANICS",
COL, &
F);
389 Mat Aij;
391 ->createMPIAIJWithArrays<PetscGlobalIdx_mi_tag>("ELASTIC_MECHANICS",
392 &Aij);
393
394 boost::shared_ptr<ArcLengthCtx> arc_ctx = boost::shared_ptr<ArcLengthCtx>(
396
400 CHKERR MatGetLocalSize(Aij, &
m, &
n);
401 boost::scoped_ptr<ArcLengthMatShell> mat_ctx(
403
404 Mat ShellAij;
405 CHKERR MatCreateShell(PETSC_COMM_WORLD,
m,
n,
M,
N, mat_ctx.get(),
406 &ShellAij);
407 CHKERR MatShellSetOperation(ShellAij, MATOP_MULT,
409
410 ArcLengthSnesCtx snes_ctx(m_field, "ELASTIC_MECHANICS", arc_ctx);
411
414 EntityHandle meshset = cit->getMeshset();
416 CHKERR moab.get_entities_by_type(meshset, MBVERTEX, nodes,
true);
418 node_set.merge(nodes);
419 }
420 PetscPrintf(PETSC_COMM_WORLD, "Nb. nodes in load path: %u\n",
421 node_set.size());
422
424
425 double scaled_reference_load = 1;
426 double *scale_lhs = &(arc_ctx->getFieldData());
427 double *scale_rhs = &(scaled_reference_load);
429 m_field, Aij, arc_ctx->F_lambda, scale_lhs, scale_rhs);
431 neumann_forces.getLoopSpatialFe();
432 if (linear) {
435 }
436 fe_neumann.
uSeF =
true;
438 it)) {
440 }
444 }
445
446 boost::shared_ptr<FEMethod> my_dirichlet_bc =
448 m_field,
"SPATIAL_POSITION", Aij,
D,
F));
450 &(my_dirichlet_bc->problemPtr));
452 ->iNitialize();
453
454 struct AssembleRhsVectors :
public FEMethod {
455
456 boost::shared_ptr<ArcLengthCtx> arcPtr;
458
459 AssembleRhsVectors(boost::shared_ptr<ArcLengthCtx> &arc_ptr,
461 : arcPtr(arc_ptr), nodeSet(node_set) {}
462
465
466
467 switch (snes_ctx) {
469 CHKERR VecZeroEntries(snes_f);
470 CHKERR VecGhostUpdateBegin(snes_f, INSERT_VALUES, SCATTER_FORWARD);
471 CHKERR VecGhostUpdateEnd(snes_f, INSERT_VALUES, SCATTER_FORWARD);
472 CHKERR VecZeroEntries(arcPtr->F_lambda);
473 CHKERR VecGhostUpdateBegin(arcPtr->F_lambda, INSERT_VALUES,
474 SCATTER_FORWARD);
475 CHKERR VecGhostUpdateEnd(arcPtr->F_lambda, INSERT_VALUES,
476 SCATTER_FORWARD);
477 } break;
478 default:
479 SETERRQ(PETSC_COMM_SELF, 1, "not implemented");
480 }
481
483 }
484
487 switch (snes_ctx) {
489
490 CHKERR VecGhostUpdateBegin(snes_f, ADD_VALUES, SCATTER_REVERSE);
491 CHKERR VecGhostUpdateEnd(snes_f, ADD_VALUES, SCATTER_REVERSE);
492 CHKERR VecAssemblyBegin(snes_f);
493 CHKERR VecAssemblyEnd(snes_f);
494 } break;
495 default:
496 SETERRQ(PETSC_COMM_SELF, 1, "not implemented");
497 }
499 }
500
503 boost::shared_ptr<NumeredDofEntity_multiIndex> numered_dofs_rows =
504 problemPtr->getNumeredRowDofsPtr();
505 Range::iterator nit = nodeSet.begin();
506 for (; nit != nodeSet.end(); nit++) {
507 NumeredDofEntityByEnt::iterator dit, hi_dit;
508 dit = numered_dofs_rows->get<
Ent_mi_tag>().lower_bound(*nit);
509 hi_dit = numered_dofs_rows->get<
Ent_mi_tag>().upper_bound(*nit);
510 for (; dit != hi_dit; dit++) {
511 PetscPrintf(PETSC_COMM_WORLD, "%s [ %d ] %6.4e -> ", "LAMBDA", 0,
512 arcPtr->getFieldData());
513 PetscPrintf(PETSC_COMM_WORLD, "%s [ %d ] %6.4e\n",
514 dit->get()->getName().c_str(),
515 dit->get()->getDofCoeffIdx(),
516 dit->get()->getFieldData());
517 }
518 }
520 }
521 };
522
523 struct AddLambdaVectorToFInternal :
public FEMethod {
524
525 boost::shared_ptr<ArcLengthCtx> arcPtr;
526 boost::shared_ptr<DirichletSpatialPositionsBc> bC;
527
528 AddLambdaVectorToFInternal(boost::shared_ptr<ArcLengthCtx> &arc_ptr,
529 boost::shared_ptr<FEMethod> &bc)
530 : arcPtr(arc_ptr),
533
537 }
541 }
544 switch (snes_ctx) {
546
547 CHKERR VecGhostUpdateBegin(arcPtr->F_lambda, ADD_VALUES,
548 SCATTER_REVERSE);
549 CHKERR VecGhostUpdateEnd(arcPtr->F_lambda, ADD_VALUES,
550 SCATTER_REVERSE);
551 CHKERR VecAssemblyBegin(arcPtr->F_lambda);
552 CHKERR VecAssemblyEnd(arcPtr->F_lambda);
553 for (std::vector<int>::iterator vit = bC->dofsIndices.begin();
554 vit != bC->dofsIndices.end(); vit++) {
555 CHKERR VecSetValue(arcPtr->F_lambda, *vit, 0, INSERT_VALUES);
556 }
557 CHKERR VecAssemblyBegin(arcPtr->F_lambda);
558 CHKERR VecAssemblyEnd(arcPtr->F_lambda);
559 CHKERR VecDot(arcPtr->F_lambda, arcPtr->F_lambda, &arcPtr->F_lambda2);
560 PetscPrintf(PETSC_COMM_WORLD, "\tFlambda2 = %6.4e\n",
561 arcPtr->F_lambda2);
562
563 CHKERR VecAssemblyBegin(snes_f);
564 CHKERR VecAssemblyEnd(snes_f);
565 CHKERR VecAXPY(snes_f, arcPtr->getFieldData(), arcPtr->F_lambda);
566 PetscPrintf(PETSC_COMM_WORLD, "\tlambda = %6.4e\n",
567 arcPtr->getFieldData());
568 double fnorm;
569 CHKERR VecNorm(snes_f, NORM_2, &fnorm);
570 PetscPrintf(PETSC_COMM_WORLD, "\tfnorm = %6.4e\n", fnorm);
571 } break;
572 default:
573 SETERRQ(PETSC_COMM_SELF, 1, "not implemented");
574 }
576 }
577 };
578
579 AssembleRhsVectors pre_post_method(arc_ctx, node_set);
580 AddLambdaVectorToFInternal assemble_F_lambda(arc_ctx, my_dirichlet_bc);
581
582 SNES snes;
583 CHKERR SNESCreate(PETSC_COMM_WORLD, &snes);
584 CHKERR SNESSetApplicationContext(snes, &snes_ctx);
586 CHKERR SNESSetJacobian(snes, ShellAij, Aij,
SnesMat, &snes_ctx);
587 CHKERR SNESSetFromOptions(snes);
588
590
591 PetscReal my_tol;
593 &flg);
594 if (flg == PETSC_TRUE) {
595 PetscReal atol, rtol, stol;
596 PetscInt maxit, maxf;
597 CHKERR SNESGetTolerances(snes, &atol, &rtol, &stol, &maxit, &maxf);
598 atol = my_tol;
599 rtol = atol * 1e2;
600 CHKERR SNESSetTolerances(snes, atol, rtol, stol, maxit, maxf);
601 }
602
603 KSP ksp;
604 CHKERR SNESGetKSP(snes, &ksp);
605 PC pc;
606 CHKERR KSPGetPC(ksp, &pc);
607 boost::scoped_ptr<PCArcLengthCtx> pc_ctx(
609 CHKERR PCSetType(pc, PCSHELL);
610 CHKERR PCShellSetContext(pc, pc_ctx.get());
613
614 if (flg == PETSC_TRUE) {
615 PetscReal rtol, atol, dtol;
616 PetscInt maxits;
617 CHKERR KSPGetTolerances(ksp, &rtol, &atol, &dtol, &maxits);
618 atol = my_tol * 1e-2;
619 rtol = atol * 1e-2;
620 CHKERR KSPSetTolerances(ksp, rtol, atol, dtol, maxits);
621 }
622
624 snes_ctx.getComputeRhs();
625 snes_ctx.getPreProcComputeRhs().push_back(my_dirichlet_bc);
626 snes_ctx.getPreProcComputeRhs().push_back(&pre_post_method);
627 loops_to_do_Rhs.push_back(
629
630 loops_to_do_Rhs.push_back(
632
633
634 loops_to_do_Rhs.push_back(
636
637
638 boost::ptr_map<std::string, EdgeForce> edge_forces;
639 string fe_name_str = "FORCE_FE";
640 edge_forces.insert(fe_name_str,
new EdgeForce(m_field));
642 it)) {
643 CHKERR edge_forces.at(fe_name_str)
644 .addForce("SPATIAL_POSITION", arc_ctx->F_lambda, it->getMeshsetId());
645 }
646 for (boost::ptr_map<std::string, EdgeForce>::iterator eit =
647 edge_forces.begin();
648 eit != edge_forces.end(); eit++) {
649 loops_to_do_Rhs.push_back(
651 }
652
653
654 boost::ptr_map<std::string, NodalForce> nodal_forces;
655
656 nodal_forces.insert(fe_name_str,
new NodalForce(m_field));
658 it)) {
659 CHKERR nodal_forces.at(fe_name_str)
660 .addForce("SPATIAL_POSITION", arc_ctx->F_lambda, it->getMeshsetId());
661 }
662 for (boost::ptr_map<std::string, NodalForce>::iterator fit =
663 nodal_forces.begin();
664 fit != nodal_forces.end(); fit++) {
665 loops_to_do_Rhs.push_back(
667 }
668
669
670 loops_to_do_Rhs.push_back(
672 loops_to_do_Rhs.push_back(
674 snes_ctx.getPostProcComputeRhs().push_back(&pre_post_method);
675 snes_ctx.getPostProcComputeRhs().push_back(my_dirichlet_bc);
676
678 snes_ctx.getSetOperators();
679 snes_ctx.getPreProcSetOperators().push_back(my_dirichlet_bc);
680 loops_to_do_Mat.push_back(
682
683 loops_to_do_Mat.push_back(
685
686 loops_to_do_Mat.push_back(
688 loops_to_do_Mat.push_back(
690 snes_ctx.getPostProcSetOperators().push_back(my_dirichlet_bc);
691
693 "ELASTIC_MECHANICS",
COL,
D, INSERT_VALUES, SCATTER_FORWARD);
694 CHKERR VecGhostUpdateBegin(
D, INSERT_VALUES, SCATTER_FORWARD);
695 CHKERR VecGhostUpdateEnd(
D, INSERT_VALUES, SCATTER_FORWARD);
696
697 PetscScalar step_size_reduction;
699 &step_size_reduction, &flg);
700 if (flg != PETSC_TRUE) {
701 step_size_reduction = 1.;
702 }
703
704 PetscInt max_steps;
706 &flg);
707 if (flg != PETSC_TRUE) {
708 max_steps = 5;
709 }
710
711 int its_d;
713 &flg);
714 if (flg != PETSC_TRUE) {
715 its_d = 4;
716 }
717 PetscScalar max_reduction = 10, min_reduction = 0.1;
719 &max_reduction, &flg);
721 &min_reduction, &flg);
722
723 double gamma = 0.5, reduction = 1;
724
725 if (step == 1) {
726 step_size = step_size_reduction;
727 } else {
728 reduction = step_size_reduction;
729 step++;
730 }
731 double step_size0 = step_size;
732
733 if (step > 1) {
735 "ELASTIC_MECHANICS",
"SPATIAL_POSITION",
"X0_SPATIAL_POSITION",
COL,
736 arc_ctx->x0, INSERT_VALUES, SCATTER_FORWARD);
737 double x0_nrm;
738 CHKERR VecNorm(arc_ctx->x0, NORM_2, &x0_nrm);
739 CHKERR PetscPrintf(PETSC_COMM_WORLD,
740 "\tRead x0_nrm = %6.4e dlambda = %6.4e\n", x0_nrm,
741 arc_ctx->dLambda);
742 CHKERR arc_ctx->setAlphaBeta(1, 0);
743 } else {
744 CHKERR arc_ctx->setS(step_size);
745 CHKERR arc_ctx->setAlphaBeta(0, 1);
746 }
747
749
752 CHKERR VecDuplicate(arc_ctx->x0, &x00);
753 bool converged_state = false;
754
755 for (int jj = 0; step < max_steps; step++, jj++) {
756
758 CHKERR VecCopy(arc_ctx->x0, x00);
759
760 if (step == 1) {
761
762 CHKERR PetscPrintf(PETSC_COMM_WORLD,
"Load Step %D step_size = %6.4e\n",
763 step, step_size);
764 CHKERR arc_ctx->setS(step_size);
765 CHKERR arc_ctx->setAlphaBeta(0, 1);
766 CHKERR VecCopy(
D, arc_ctx->x0);
767 double dlambda;
768 CHKERR arc_method.calculateInitDlambda(&dlambda);
769 CHKERR arc_method.setDlambdaToX(
D, dlambda);
770
771 } else if (step == 2) {
772
773 CHKERR arc_ctx->setAlphaBeta(1, 0);
774 CHKERR arc_method.calculateDxAndDlambda(
D);
775 step_size = std::sqrt(arc_method.calculateLambdaInt());
776 step_size0 = step_size;
777 CHKERR arc_ctx->setS(step_size);
778 double dlambda = arc_ctx->dLambda;
779 double dx_nrm;
780 CHKERR VecNorm(arc_ctx->dx, NORM_2, &dx_nrm);
781 CHKERR PetscPrintf(PETSC_COMM_WORLD,
782 "Load Step %D step_size = %6.4e dlambda0 = %6.4e "
783 "dx_nrm = %6.4e dx2 = %6.4e\n",
784 step, step_size, dlambda, dx_nrm, arc_ctx->dx2);
785 CHKERR VecCopy(
D, arc_ctx->x0);
786 CHKERR VecAXPY(
D, 1., arc_ctx->dx);
787 CHKERR arc_method.setDlambdaToX(
D, dlambda);
788
789 } else {
790
791 if (jj == 0) {
792 step_size0 = step_size;
793 }
794
795 CHKERR arc_method.calculateDxAndDlambda(
D);
796 step_size *= reduction;
797 if (step_size > max_reduction * step_size0) {
798 step_size = max_reduction * step_size0;
799 } else if (step_size < min_reduction * step_size0) {
800 step_size = min_reduction * step_size0;
801 }
802 CHKERR arc_ctx->setS(step_size);
803 double dlambda = reduction * arc_ctx->dLambda;
804 double dx_nrm;
805 CHKERR VecScale(arc_ctx->dx, reduction);
806 CHKERR VecNorm(arc_ctx->dx, NORM_2, &dx_nrm);
807 CHKERR PetscPrintf(PETSC_COMM_WORLD,
808 "Load Step %D step_size = %6.4e dlambda0 = %6.4e "
809 "dx_nrm = %6.4e dx2 = %6.4e\n",
810 step, step_size, dlambda, dx_nrm, arc_ctx->dx2);
811 CHKERR VecCopy(
D, arc_ctx->x0);
812 CHKERR VecAXPY(
D, 1., arc_ctx->dx);
813 CHKERR arc_method.setDlambdaToX(
D, dlambda);
814 }
815
816 CHKERR SNESSolve(snes, PETSC_NULLPTR,
D);
817 int its;
818 CHKERR SNESGetIterationNumber(snes, &its);
819 CHKERR PetscPrintf(PETSC_COMM_WORLD,
"number of Newton iterations = %D\n",
820 its);
821
822 SNESConvergedReason reason;
823 CHKERR SNESGetConvergedReason(snes, &reason);
824 if (reason < 0) {
825
827 CHKERR VecCopy(x00, arc_ctx->x0);
828
829 double x0_nrm;
830 CHKERR VecNorm(arc_ctx->x0, NORM_2, &x0_nrm);
831 CHKERR PetscPrintf(PETSC_COMM_WORLD,
832 "\tRead x0_nrm = %6.4e dlambda = %6.4e\n", x0_nrm,
833 arc_ctx->dLambda);
834 CHKERR arc_ctx->setAlphaBeta(1, 0);
835
836 reduction = 0.1;
837 converged_state = false;
838
839 continue;
840
841 } else {
842
843 if (step > 1 && converged_state) {
844
845 reduction = pow((double)its_d / (double)(its + 1), gamma);
846 if (step_size >= max_reduction * step_size0 && reduction > 1) {
847 reduction = 1;
848 } else if (step_size <= min_reduction * step_size0 && reduction < 1) {
849 reduction = 1;
850 }
851 CHKERR PetscPrintf(PETSC_COMM_WORLD,
"reduction step_size = %6.4e\n",
852 reduction);
853 }
854
855
857 "ELASTIC_MECHANICS",
COL,
D, INSERT_VALUES, SCATTER_REVERSE);
859 "ELASTIC_MECHANICS",
"SPATIAL_POSITION",
"X0_SPATIAL_POSITION",
COL,
860 arc_ctx->x0, INSERT_VALUES, SCATTER_REVERSE);
861 converged_state = true;
862 }
863
864 if (step % 1 == 0) {
865
866
867
868
869
870
871
872
873
874
876 post_proc);
877 std::ostringstream o1;
878 o1 << "out_" << step << ".h5m";
879 CHKERR post_proc.writeFile(o1.str().c_str());
880 }
881
882 CHKERR pre_post_method.potsProcessLoadPath();
883 }
884
887
888
892 CHKERR MatDestroy(&ShellAij);
893 CHKERR SNESDestroy(&snes);
894 }
896
898
899 return 0;
900}
#define CATCH_ERRORS
Catch errors.
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base .
#define MOAB_THROW(err)
Check error code of MoAB function and throw MoFEM exception.
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
@ NOFIELD
scalar or vector of scalars describe (no true field)
#define MYPCOMM_INDEX
default communicator number PCOMM
#define CHKERR
Inline error check.
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
virtual const Problem * get_problem(const std::string problem_name) const =0
Get the problem object.
virtual MoFEMErrorCode add_finite_element(const std::string &fe_name, enum MoFEMTypes bh=MF_EXCL, int verb=DEFAULT_VERBOSITY)=0
add finite element
virtual MoFEMErrorCode build_finite_elements(int verb=DEFAULT_VERBOSITY)=0
Build finite elements.
virtual MoFEMErrorCode modify_finite_element_add_field_col(const std::string &fe_name, const std::string name_row)=0
set field col which finite element use
virtual MoFEMErrorCode add_ents_to_finite_element_by_MESHSET(const EntityHandle meshset, const std::string &name, const bool recursive=false)=0
add MESHSET element to finite element database given by name
virtual MoFEMErrorCode add_ents_to_finite_element_by_type(const EntityHandle entities, const EntityType type, const std::string name, const bool recursive=true)=0
add entities to finite element
virtual MoFEMErrorCode modify_finite_element_add_field_row(const std::string &fe_name, const std::string name_row)=0
set field row which finite element use
virtual MoFEMErrorCode modify_finite_element_add_field_data(const std::string &fe_name, const std::string name_field)=0
set finite element field data
virtual MoFEMErrorCode build_fields(int verb=DEFAULT_VERBOSITY)=0
virtual MoFEMErrorCode set_field_order(const EntityHandle meshset, const EntityType type, const std::string &name, const ApproximationOrder order, int verb=DEFAULT_VERBOSITY)=0
Set order approximation of the entities in the field.
virtual MoFEMErrorCode add_ents_to_field_by_type(const Range &ents, const EntityType type, const std::string &name, int verb=DEFAULT_VERBOSITY)=0
Add entities to field meshset.
virtual MoFEMErrorCode loop_dofs(const Problem *problem_ptr, const std::string &field_name, RowColData rc, DofMethod &method, int lower_rank, int upper_rank, int verb=DEFAULT_VERBOSITY)=0
Make a loop over dofs.
virtual MoFEMErrorCode loop_finite_elements(const std::string problem_name, const std::string &fe_name, FEMethod &method, boost::shared_ptr< NumeredEntFiniteElement_multiIndex > fe_ptr=nullptr, MoFEMTypes bh=MF_EXIST, CacheTupleWeakPtr cache_ptr=CacheTupleSharedPtr(), int verb=DEFAULT_VERBOSITY)=0
Make a loop over finite elements.
MoFEMErrorCode printForceSet() const
Print meshsets with force boundary conditions.
#define _IT_CUBITMESHSETS_BY_NAME_FOR_LOOP_(MESHSET_MANAGER, NAME, IT)
Iterator that loops over Cubit BlockSet having a particular name.
#define _IT_CUBITMESHSETS_BY_BCDATA_TYPE_FOR_LOOP_(MESHSET_MANAGER, CUBITBCTYPE, IT)
Iterator that loops over a specific Cubit MeshSet in a moFEM field.
MoFEMErrorCode printMaterialsSet() const
Print meshsets with material properties.
MoFEMErrorCode printDisplacementSet() const
Print meshsets with displacement boundary conditions.
MoFEMErrorCode partitionGhostDofs(const std::string name, int verb=VERBOSE)
determine ghost nodes
MoFEMErrorCode buildProblem(const std::string name, const bool square_matrix, int verb=VERBOSE)
build problem data structures
MoFEMErrorCode partitionProblem(const std::string name, int verb=VERBOSE)
partition problem dofs (collective)
MoFEMErrorCode partitionFiniteElements(const std::string name, bool part_from_moab=false, int low_proc=-1, int hi_proc=-1, int verb=VERBOSE)
partition finite elements
virtual MoFEMErrorCode add_problem(const std::string &name, enum MoFEMTypes bh=MF_EXCL, int verb=DEFAULT_VERBOSITY)=0
Add problem.
virtual MoFEMErrorCode modify_problem_ref_level_add_bit(const std::string &name_problem, const BitRefLevel &bit)=0
add ref level to problem
virtual MoFEMErrorCode modify_problem_add_finite_element(const std::string name_problem, const std::string &fe_name)=0
add finite element to problem, this add entities assigned to finite element to a particular problem
const double n
refractive index of diffusive medium
const FTensor::Tensor2< T, Dim, Dim > Vec
static MoFEMErrorCodeGeneric< moab::ErrorCode > rval
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
std::bitset< BITREFLEVEL_SIZE > BitRefLevel
Bit structure attached to each entity identifying to what mesh entity is attached.
PetscErrorCode SnesMat(SNES snes, Vec x, Mat A, Mat B, void *ctx)
This is MoFEM implementation for the left hand side (tangent matrix) evaluation in SNES solver.
PetscErrorCode PetscOptionsGetInt(PetscOptions *, const char pre[], const char name[], PetscInt *ivalue, PetscBool *set)
PetscErrorCode PetscOptionsGetReal(PetscOptions *, const char pre[], const char name[], PetscReal *dval, PetscBool *set)
PetscErrorCode SnesRhs(SNES snes, Vec x, Vec f, void *ctx)
This is MoFEM implementation for the right hand side (residual vector) evaluation in SNES solver.
PetscErrorCode PetscOptionsGetBool(PetscOptions *, const char pre[], const char name[], PetscBool *bval, PetscBool *set)
MoFEMErrorCode SnesMoFEMSetBehavior(SNES snes, MoFEMTypes bh)
Set behavior if finite element in sequence does not exist.
PetscErrorCode PetscOptionsGetString(PetscOptions *, const char pre[], const char name[], char str[], size_t size, PetscBool *set)
OpPostProcMapInMoab< SPACE_DIM, SPACE_DIM > OpPPMap
FTensor::Index< 'm', 3 > m
Store variables for ArcLength analysis.
shell matrix for arc-length method
Set Dirichlet boundary conditions on spatial displacements.
Force on edges and lines.
Manage setting parameters and constitutive equations for nonlinear/linear elastic materials.
Add operators pushing bases from local to physical configuration.
virtual MoFEMErrorCode postProcess()
Post-processing function executed at loop completion.
virtual MoFEMErrorCode operator()()
Main operator function executed for each loop iteration.
virtual MoFEMErrorCode preProcess()
Pre-processing function executed at loop initialization.
virtual moab::Interface & get_moab()=0
virtual EntityHandle get_field_meshset(const std::string name) const =0
get field meshset
virtual MoFEMErrorCode build_adjacencies(const Range &ents, int verb=DEFAULT_VERBOSITY)=0
build adjacencies
virtual MoFEMErrorCode add_field(const std::string name, const FieldSpace space, const FieldApproximationBase base, const FieldCoefficientsNumber nb_of_coefficients, const TagType tag_type=MB_TAG_SPARSE, const enum MoFEMTypes bh=MF_EXCL, int verb=DEFAULT_VERBOSITY)=0
Add field.
static MoFEMErrorCode Initialize(int *argc, char ***args, const char file[], const char help[])
Initializes the MoFEM database PETSc, MOAB and MPI.
static MoFEMErrorCode Finalize()
Checks for options to be called at the conclusion of the program.
Deprecated interface functions.
Structure for user loop methods on finite elements.
Matrix manager is used to build and partition problems.
Interface for managing meshsets containing materials and boundary conditions.
Get field gradients at integration pts for scalar field rank 0, i.e. vector field.
Specialization for MatrixDouble vector field values calculation.
Post post-proc data at points from hash maps.
Problem manager is used to build and partition problems.
Projection of edge entities with one mid-node on hierarchical basis.
MoFEM::FEMethodsSequence FEMethodsSequence
@ CTX_SNESSETFUNCTION
Setting up nonlinear function evaluation.
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.
Vector manager is used to create vectors \mofem_vectors.
MoFEMErrorCode addPressure(int ms_id)
MoFEMErrorCode addForce(int ms_id)
NonLinear surface pressure element (obsolete implementation)
structure grouping operators and data used for calculation of nonlinear elastic element
structure for Arc Length pre-conditioner
Implementation of spherical arc-length method.