v0.15.0
Loading...
Searching...
No Matches
arc_length_nonlinear_elasticity.cpp
Go to the documentation of this file.
1/** \file arc_length_nonlinear_elasticity.cpp
2 * \ingroup nonlinear_elastic_elem
3 * \brief nonlinear elasticity (arc-length control)
4 *
5 * Solves nonlinear elastic problem. Using arc length control.
6 */
7
8
9
10static char help[] = "\
11 -my_file mesh file name\n\
12 -my_sr reduction of step size\n\
13 -my_ms maximal number of steps\n\n";
14
16using namespace MoFEM;
17
18#include <ElasticMaterials.hpp>
19#include <NeoHookean.hpp>
20
22
23int main(int argc, char *argv[]) {
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);
43 if (file.is_open()) {
44 file << default_options;
45 file.close();
46 }
47 }
48
49 MoFEM::Core::Initialize(&argc, &argv, param_file.c_str(), help);
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];
65 CHKERR PetscOptionsGetString(PETSC_NULLPTR, PETSC_NULLPTR, "-my_file",
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
71 PetscInt order;
72 CHKERR PetscOptionsGetInt(PETSC_NULLPTR, PETSC_NULLPTR, "-my_order", &order,
73 &flg);
74 if (flg != PETSC_TRUE) {
75 order = 2;
76 }
77
78 // use this if your mesh is partitioned and you run code on parts,
79 // you can solve very big problems
80 PetscBool is_partitioned = PETSC_FALSE;
81 CHKERR PetscOptionsGetBool(PETSC_NULLPTR, PETSC_NULLPTR, "-my_is_partitioned",
82 &is_partitioned, &flg);
83
84 if (is_partitioned == PETSC_TRUE) {
85 // Read mesh to MOAB
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 // data stored on mesh for restart
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)
102 CHKERR MB_SUCCESS;
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)
108 CHKERR MB_SUCCESS;
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 // end of data stored for restart
118 CHKERR PetscPrintf(PETSC_COMM_WORLD,
119 "Start step %D and step_size = %6.4e\n", step,
120 step_size);
121
122 MoFEM::Core core(moab);
123 MoFEM::Interface &m_field = core;
124
125 // ref meshset ref level 0
126 CHKERR m_field.getInterface<BitRefManager>()->setBitRefLevelByDim(
127 0, 3, BitRefLevel().set(0));
128 std::vector<BitRefLevel> bit_levels;
129 bit_levels.push_back(BitRefLevel().set(0));
130 BitRefLevel problem_bit_level;
131
132 if (step == 1) {
133
134 problem_bit_level = bit_levels.back();
135
136 // Fields
137 CHKERR m_field.add_field("SPATIAL_POSITION", H1, AINSWORTH_LEGENDRE_BASE,
138 3);
139 CHKERR m_field.add_field("MESH_NODE_POSITIONS", H1,
141
142 CHKERR m_field.add_field("LAMBDA", NOFIELD, NOBASE, 1);
143
144 // Field for ArcLength
145 CHKERR m_field.add_field("X0_SPATIAL_POSITION", H1,
147
148 // FE
149 CHKERR m_field.add_finite_element("ELASTIC");
150 CHKERR m_field.add_finite_element("ARC_LENGTH");
151
152 // Add spring boundary condition applied on surfaces.
153 // This is only declaration not implementation.
154 CHKERR MetaSpringBC::addSpringElements(m_field, "SPATIAL_POSITION",
155 "MESH_NODE_POSITIONS");
156
157 // Define rows/cols and element data
159 "SPATIAL_POSITION");
160 CHKERR m_field.modify_finite_element_add_field_row("ELASTIC", "LAMBDA");
162 "SPATIAL_POSITION");
164 "ELASTIC", "LAMBDA"); // this is for parmetis
166 "SPATIAL_POSITION");
168 "ELASTIC", "MESH_NODE_POSITIONS");
169 CHKERR m_field.modify_finite_element_add_field_data("ELASTIC", "LAMBDA");
170
171 // Define rows/cols and element data
172 CHKERR m_field.modify_finite_element_add_field_row("ARC_LENGTH",
173 "LAMBDA");
174 CHKERR m_field.modify_finite_element_add_field_col("ARC_LENGTH",
175 "LAMBDA");
176 // elem data
177 CHKERR m_field.modify_finite_element_add_field_data("ARC_LENGTH",
178 "LAMBDA");
179
180 // define problems
181 CHKERR m_field.add_problem("ELASTIC_MECHANICS");
182
183 // set finite elements for problems
184 CHKERR m_field.modify_problem_add_finite_element("ELASTIC_MECHANICS",
185 "ELASTIC");
186 CHKERR m_field.modify_problem_add_finite_element("ELASTIC_MECHANICS",
187 "ARC_LENGTH");
188
189 CHKERR m_field.modify_problem_add_finite_element("ELASTIC_MECHANICS",
190 "SPRING");
191
192 // set refinement level for problem
193 CHKERR m_field.modify_problem_ref_level_add_bit("ELASTIC_MECHANICS",
194 problem_bit_level);
195
196 // add entities (by tets) to the field
197 CHKERR m_field.add_ents_to_field_by_type(0, MBTET, "SPATIAL_POSITION");
198 CHKERR m_field.add_ents_to_field_by_type(0, MBTET, "X0_SPATIAL_POSITION");
199 CHKERR m_field.add_ents_to_field_by_type(0, MBTET, "MESH_NODE_POSITIONS");
200
201 // Setting up LAMBDA field and ARC_LENGTH interface
202 {
203 // Add dummy no-field vertex
204 EntityHandle no_field_vertex;
205 {
206 const double coords[] = {0, 0, 0};
207 CHKERR m_field.get_moab().create_vertex(coords, no_field_vertex);
208 Range range_no_field_vertex;
209 range_no_field_vertex.insert(no_field_vertex);
210 CHKERR m_field.getInterface<BitRefManager>()->setBitRefLevel(
211 range_no_field_vertex, BitRefLevel().set());
212 EntityHandle lambda_meshset = m_field.get_field_meshset("LAMBDA");
213 CHKERR m_field.get_moab().add_entities(lambda_meshset,
214 range_no_field_vertex);
215 }
216 // this entity will carry data for this finite element
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);
221 CHKERR m_field.getInterface<BitRefManager>()->setBitLevelToMeshset(
222 meshset_fe_arc_length, BitRefLevel().set());
223 }
224 // finally add created meshset to the ARC_LENGTH finite element
226 meshset_fe_arc_length, "ARC_LENGTH", false);
227 }
228
229 // set app. order
230 CHKERR m_field.set_field_order(0, MBTET, "SPATIAL_POSITION", order);
231 CHKERR m_field.set_field_order(0, MBTRI, "SPATIAL_POSITION", order);
232 CHKERR m_field.set_field_order(0, MBEDGE, "SPATIAL_POSITION", order);
233 CHKERR m_field.set_field_order(0, MBVERTEX, "SPATIAL_POSITION", 1);
234
235 CHKERR m_field.set_field_order(0, MBTET, "X0_SPATIAL_POSITION", order);
236 CHKERR m_field.set_field_order(0, MBTRI, "X0_SPATIAL_POSITION", order);
237 CHKERR m_field.set_field_order(0, MBEDGE, "X0_SPATIAL_POSITION", order);
238 CHKERR m_field.set_field_order(0, MBVERTEX, "X0_SPATIAL_POSITION", 1);
239
240 CHKERR m_field.set_field_order(0, MBTET, "MESH_NODE_POSITIONS", 2);
241 CHKERR m_field.set_field_order(0, MBTRI, "MESH_NODE_POSITIONS", 2);
242 CHKERR m_field.set_field_order(0, MBEDGE, "MESH_NODE_POSITIONS", 2);
243 CHKERR m_field.set_field_order(0, MBVERTEX, "MESH_NODE_POSITIONS", 1);
244
245 // add Neumman finite elements to add static boundary conditions
246 CHKERR m_field.add_finite_element("NEUMANN_FE");
247 CHKERR m_field.modify_finite_element_add_field_row("NEUMANN_FE",
248 "SPATIAL_POSITION");
249 CHKERR m_field.modify_finite_element_add_field_col("NEUMANN_FE",
250 "SPATIAL_POSITION");
251 CHKERR m_field.modify_finite_element_add_field_data("NEUMANN_FE",
252 "SPATIAL_POSITION");
254 "NEUMANN_FE", "MESH_NODE_POSITIONS");
255 CHKERR m_field.modify_problem_add_finite_element("ELASTIC_MECHANICS",
256 "NEUMANN_FE");
258 NODESET | FORCESET, it)) {
259 Range tris;
260 CHKERR moab.get_entities_by_type(it->meshset, MBTRI, tris, true);
261 CHKERR m_field.add_ents_to_finite_element_by_type(tris, MBTRI,
262 "NEUMANN_FE");
263 }
265 m_field, SIDESET | PRESSURESET, it)) {
266 Range tris;
267 CHKERR moab.get_entities_by_type(it->meshset, MBTRI, tris, true);
268 CHKERR m_field.add_ents_to_finite_element_by_type(tris, MBTRI,
269 "NEUMANN_FE");
270 }
271 // add nodal force element
272 CHKERR MetaNodalForces::addElement(m_field, "SPATIAL_POSITION");
273 CHKERR m_field.modify_problem_add_finite_element("ELASTIC_MECHANICS",
274 "FORCE_FE");
275 }
276
277 // Implementation of spring element
278 // Create new instances of face elements for springs
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;
289 CHKERR PetscOptionsGetBool(PETSC_NULLPTR, PETSC_NULLPTR, "-is_linear", &linear,
290 &linear);
291
292 NonlinearElasticElement elastic(m_field, 2);
293 ElasticMaterials elastic_materials(m_field);
294 CHKERR elastic_materials.setBlocks(elastic.setOfBlocks);
295 CHKERR elastic.addElement("ELASTIC", "SPATIAL_POSITION");
296 CHKERR addHOOpsVol("MESH_NODE_POSITIONS", elastic.getLoopFeRhs(), true, false,
297 false, false);
298 CHKERR addHOOpsVol("MESH_NODE_POSITIONS", elastic.getLoopFeLhs(), true, false,
299 false, false);
300 CHKERR addHOOpsVol("MESH_NODE_POSITIONS", elastic.getLoopFeEnergy(), true,
301 false, false, false);
302 CHKERR elastic.setOperators("SPATIAL_POSITION");
303
304 // post_processing
305 PostProcVolumeOnRefinedMesh post_proc(m_field);
307 CHKERR addHOOpsVol("MESH_NODE_POSITIONS", post_proc, true, false, false,
308 false);
309 CHKERR post_proc.addFieldValuesPostProc("SPATIAL_POSITION");
310 CHKERR post_proc.addFieldValuesPostProc("MESH_NODE_POSITIONS");
311 CHKERR post_proc.addFieldValuesGradientPostProc("SPATIAL_POSITION");
312 std::map<int, NonlinearElasticElement::BlockData>::iterator sit =
313 elastic.setOfBlocks.begin();
314 for (; sit != elastic.setOfBlocks.end(); sit++) {
315 post_proc.getOpPtrVector().push_back(new PostProcStress(
316 post_proc.postProcMesh, post_proc.mapGaussPts, "SPATIAL_POSITION",
317 sit->second, post_proc.commonData));
318 }
319
320 // build field
321 CHKERR m_field.build_fields();
322 if (step == 1) {
323 // 10 node tets
324 Projection10NodeCoordsOnField ent_method_material(m_field,
325 "MESH_NODE_POSITIONS");
326 CHKERR m_field.loop_dofs("MESH_NODE_POSITIONS", ent_method_material, 0);
327 CHKERR m_field.getInterface<FieldBlas>()->setField(0, MBVERTEX,
328 "SPATIAL_POSITION");
329 CHKERR m_field.getInterface<FieldBlas>()->setField(0, MBEDGE,
330 "SPATIAL_POSITION");
331 CHKERR m_field.getInterface<FieldBlas>()->fieldAxpy(
332 1., "MESH_NODE_POSITIONS", "SPATIAL_POSITION");
333 CHKERR m_field.getInterface<FieldBlas>()->setField(0, MBTRI,
334 "SPATIAL_POSITION");
335 CHKERR m_field.getInterface<FieldBlas>()->setField(0, MBTET,
336 "SPATIAL_POSITION");
337 }
338
339 // build finite elements
341
342 // build adjacencies
343 CHKERR m_field.build_adjacencies(problem_bit_level);
344
345 ProblemsManager *prb_mng_ptr;
346 CHKERR m_field.getInterface(prb_mng_ptr);
347 // build database
348 if (is_partitioned) {
349 SETERRQ(PETSC_COMM_SELF, 1,
350 "Not implemented, problem with arc-length force multiplayer");
351 } else {
352 CHKERR prb_mng_ptr->buildProblem("ELASTIC_MECHANICS", true);
353 CHKERR prb_mng_ptr->partitionProblem("ELASTIC_MECHANICS");
354 CHKERR prb_mng_ptr->partitionFiniteElements("ELASTIC_MECHANICS");
355 }
356 CHKERR prb_mng_ptr->partitionGhostDofs("ELASTIC_MECHANICS");
357
358 // print bcs
359 MeshsetsManager *mmanager_ptr;
360 CHKERR m_field.getInterface(mmanager_ptr);
361 CHKERR mmanager_ptr->printDisplacementSet();
362 CHKERR mmanager_ptr->printForceSet();
363 // print block sets with materials
364 CHKERR mmanager_ptr->printMaterialsSet();
365
366 // create matrices
367 Vec F;
368 CHKERR m_field.getInterface<VecManager>()->vecCreateGhost(
369 "ELASTIC_MECHANICS", COL, &F);
370 Vec D;
371 CHKERR VecDuplicate(F, &D);
372 Mat Aij;
374 ->createMPIAIJWithArrays<PetscGlobalIdx_mi_tag>("ELASTIC_MECHANICS",
375 &Aij);
376
377 boost::shared_ptr<ArcLengthCtx> arc_ctx = boost::shared_ptr<ArcLengthCtx>(
378 new ArcLengthCtx(m_field, "ELASTIC_MECHANICS"));
379
380 PetscInt M, N;
381 CHKERR MatGetSize(Aij, &M, &N);
382 PetscInt m, n;
383 CHKERR MatGetLocalSize(Aij, &m, &n);
384 boost::scoped_ptr<ArcLengthMatShell> mat_ctx(
385 new ArcLengthMatShell(Aij, arc_ctx, "ELASTIC_MECHANICS"));
386
387 Mat ShellAij;
388 CHKERR MatCreateShell(PETSC_COMM_WORLD, m, n, M, N, mat_ctx.get(),
389 &ShellAij);
390 CHKERR MatShellSetOperation(ShellAij, MATOP_MULT,
391 (void (*)(void))ArcLengthMatMultShellOp);
392
393 ArcLengthSnesCtx snes_ctx(m_field, "ELASTIC_MECHANICS", arc_ctx);
394 ///< do not very if element of given name exist when do loop over elements
395 snes_ctx.bH = MF_ZERO;
396
397 Range node_set;
398 for (_IT_CUBITMESHSETS_BY_NAME_FOR_LOOP_(m_field, "LoadPath", cit)) {
399 EntityHandle meshset = cit->getMeshset();
400 Range nodes;
401 CHKERR moab.get_entities_by_type(meshset, MBVERTEX, nodes, true);
403 node_set.merge(nodes);
404 }
405 PetscPrintf(PETSC_COMM_WORLD, "Nb. nodes in load path: %u\n",
406 node_set.size());
407
408 SphericalArcLengthControl arc_method(arc_ctx);
409
410 double scaled_reference_load = 1;
411 double *scale_lhs = &(arc_ctx->getFieldData());
412 double *scale_rhs = &(scaled_reference_load);
414 m_field, Aij, arc_ctx->F_lambda, scale_lhs, scale_rhs);
416 neumann_forces.getLoopSpatialFe();
417 if (linear) {
420 }
421 fe_neumann.uSeF = true;
423 it)) {
424 CHKERR fe_neumann.addForce(it->getMeshsetId());
425 }
427 m_field, SIDESET | PRESSURESET, it)) {
428 CHKERR fe_neumann.addPressure(it->getMeshsetId());
429 }
430
431 boost::shared_ptr<FEMethod> my_dirichlet_bc =
432 boost::shared_ptr<FEMethod>(new DirichletSpatialPositionsBc(
433 m_field, "SPATIAL_POSITION", Aij, D, F));
434 CHKERR m_field.get_problem("ELASTIC_MECHANICS",
435 &(my_dirichlet_bc->problemPtr));
436 CHKERR dynamic_cast<DirichletSpatialPositionsBc *>(my_dirichlet_bc.get())
437 ->iNitialize();
438
439 struct AssembleRhsVectors : public FEMethod {
440
441 boost::shared_ptr<ArcLengthCtx> arcPtr;
442 Range &nodeSet;
443
444 AssembleRhsVectors(boost::shared_ptr<ArcLengthCtx> &arc_ptr,
445 Range &node_set)
446 : arcPtr(arc_ptr), nodeSet(node_set) {}
447
450
451 // PetscAttachDebugger();
452 switch (snes_ctx) {
453 case CTX_SNESSETFUNCTION: {
454 CHKERR VecZeroEntries(snes_f);
455 CHKERR VecGhostUpdateBegin(snes_f, INSERT_VALUES, SCATTER_FORWARD);
456 CHKERR VecGhostUpdateEnd(snes_f, INSERT_VALUES, SCATTER_FORWARD);
457 CHKERR VecZeroEntries(arcPtr->F_lambda);
458 CHKERR VecGhostUpdateBegin(arcPtr->F_lambda, INSERT_VALUES,
459 SCATTER_FORWARD);
460 CHKERR VecGhostUpdateEnd(arcPtr->F_lambda, INSERT_VALUES,
461 SCATTER_FORWARD);
462 } break;
463 default:
464 SETERRQ(PETSC_COMM_SELF, 1, "not implemented");
465 }
466
468 }
469
472 switch (snes_ctx) {
473 case CTX_SNESSETFUNCTION: {
474 // snes_f
475 CHKERR VecGhostUpdateBegin(snes_f, ADD_VALUES, SCATTER_REVERSE);
476 CHKERR VecGhostUpdateEnd(snes_f, ADD_VALUES, SCATTER_REVERSE);
477 CHKERR VecAssemblyBegin(snes_f);
478 CHKERR VecAssemblyEnd(snes_f);
479 } break;
480 default:
481 SETERRQ(PETSC_COMM_SELF, 1, "not implemented");
482 }
484 }
485
486 MoFEMErrorCode potsProcessLoadPath() {
488 boost::shared_ptr<NumeredDofEntity_multiIndex> numered_dofs_rows =
489 problemPtr->getNumeredRowDofsPtr();
490 Range::iterator nit = nodeSet.begin();
491 for (; nit != nodeSet.end(); nit++) {
492 NumeredDofEntityByEnt::iterator dit, hi_dit;
493 dit = numered_dofs_rows->get<Ent_mi_tag>().lower_bound(*nit);
494 hi_dit = numered_dofs_rows->get<Ent_mi_tag>().upper_bound(*nit);
495 for (; dit != hi_dit; dit++) {
496 PetscPrintf(PETSC_COMM_WORLD, "%s [ %d ] %6.4e -> ", "LAMBDA", 0,
497 arcPtr->getFieldData());
498 PetscPrintf(PETSC_COMM_WORLD, "%s [ %d ] %6.4e\n",
499 dit->get()->getName().c_str(),
500 dit->get()->getDofCoeffIdx(),
501 dit->get()->getFieldData());
502 }
503 }
505 }
506 };
507
508 struct AddLambdaVectorToFInternal : public FEMethod {
509
510 boost::shared_ptr<ArcLengthCtx> arcPtr;
511 boost::shared_ptr<DirichletSpatialPositionsBc> bC;
512
513 AddLambdaVectorToFInternal(boost::shared_ptr<ArcLengthCtx> &arc_ptr,
514 boost::shared_ptr<FEMethod> &bc)
515 : arcPtr(arc_ptr),
516 bC(boost::shared_ptr<DirichletSpatialPositionsBc>(
517 bc, dynamic_cast<DirichletSpatialPositionsBc *>(bc.get()))) {}
518
522 }
526 }
529 switch (snes_ctx) {
530 case CTX_SNESSETFUNCTION: {
531 // F_lambda
532 CHKERR VecGhostUpdateBegin(arcPtr->F_lambda, ADD_VALUES,
533 SCATTER_REVERSE);
534 CHKERR VecGhostUpdateEnd(arcPtr->F_lambda, ADD_VALUES,
535 SCATTER_REVERSE);
536 CHKERR VecAssemblyBegin(arcPtr->F_lambda);
537 CHKERR VecAssemblyEnd(arcPtr->F_lambda);
538 for (std::vector<int>::iterator vit = bC->dofsIndices.begin();
539 vit != bC->dofsIndices.end(); vit++) {
540 CHKERR VecSetValue(arcPtr->F_lambda, *vit, 0, INSERT_VALUES);
541 }
542 CHKERR VecAssemblyBegin(arcPtr->F_lambda);
543 CHKERR VecAssemblyEnd(arcPtr->F_lambda);
544 CHKERR VecDot(arcPtr->F_lambda, arcPtr->F_lambda, &arcPtr->F_lambda2);
545 PetscPrintf(PETSC_COMM_WORLD, "\tFlambda2 = %6.4e\n",
546 arcPtr->F_lambda2);
547 // add F_lambda
548 CHKERR VecAssemblyBegin(snes_f);
549 CHKERR VecAssemblyEnd(snes_f);
550 CHKERR VecAXPY(snes_f, arcPtr->getFieldData(), arcPtr->F_lambda);
551 PetscPrintf(PETSC_COMM_WORLD, "\tlambda = %6.4e\n",
552 arcPtr->getFieldData());
553 double fnorm;
554 CHKERR VecNorm(snes_f, NORM_2, &fnorm);
555 PetscPrintf(PETSC_COMM_WORLD, "\tfnorm = %6.4e\n", fnorm);
556 } break;
557 default:
558 SETERRQ(PETSC_COMM_SELF, 1, "not implemented");
559 }
561 }
562 };
563
564 AssembleRhsVectors pre_post_method(arc_ctx, node_set);
565 AddLambdaVectorToFInternal assemble_F_lambda(arc_ctx, my_dirichlet_bc);
566
567 SNES snes;
568 CHKERR SNESCreate(PETSC_COMM_WORLD, &snes);
569 CHKERR SNESSetApplicationContext(snes, &snes_ctx);
570 CHKERR SNESSetFunction(snes, F, SnesRhs, &snes_ctx);
571 CHKERR SNESSetJacobian(snes, ShellAij, Aij, SnesMat, &snes_ctx);
572 CHKERR SNESSetFromOptions(snes);
573
574 PetscReal my_tol;
575 CHKERR PetscOptionsGetReal(PETSC_NULLPTR, PETSC_NULLPTR, "-my_tol", &my_tol,
576 &flg);
577 if (flg == PETSC_TRUE) {
578 PetscReal atol, rtol, stol;
579 PetscInt maxit, maxf;
580 CHKERR SNESGetTolerances(snes, &atol, &rtol, &stol, &maxit, &maxf);
581 atol = my_tol;
582 rtol = atol * 1e2;
583 CHKERR SNESSetTolerances(snes, atol, rtol, stol, maxit, maxf);
584 }
585
586 KSP ksp;
587 CHKERR SNESGetKSP(snes, &ksp);
588 PC pc;
589 CHKERR KSPGetPC(ksp, &pc);
590 boost::scoped_ptr<PCArcLengthCtx> pc_ctx(
591 new PCArcLengthCtx(ShellAij, Aij, arc_ctx));
592 CHKERR PCSetType(pc, PCSHELL);
593 CHKERR PCShellSetContext(pc, pc_ctx.get());
594 CHKERR PCShellSetApply(pc, PCApplyArcLength);
595 CHKERR PCShellSetSetUp(pc, PCSetupArcLength);
596
597 if (flg == PETSC_TRUE) {
598 PetscReal rtol, atol, dtol;
599 PetscInt maxits;
600 CHKERR KSPGetTolerances(ksp, &rtol, &atol, &dtol, &maxits);
601 atol = my_tol * 1e-2;
602 rtol = atol * 1e-2;
603 CHKERR KSPSetTolerances(ksp, rtol, atol, dtol, maxits);
604 }
605
606 SnesCtx::FEMethodsSequence &loops_to_do_Rhs =
607 snes_ctx.getComputeRhs();
608 snes_ctx.getPreProcComputeRhs().push_back(my_dirichlet_bc);
609 snes_ctx.getPreProcComputeRhs().push_back(&pre_post_method);
610 loops_to_do_Rhs.push_back(
611 SnesCtx::PairNameFEMethodPtr("ELASTIC", &elastic.getLoopFeRhs()));
612
613 loops_to_do_Rhs.push_back(
614 SnesCtx::PairNameFEMethodPtr("SPRING", fe_spring_rhs_ptr.get()));
615
616 // surface forces and pressures
617 loops_to_do_Rhs.push_back(
618 SnesCtx::PairNameFEMethodPtr("NEUMANN_FE", &fe_neumann));
619
620 // edge forces
621 boost::ptr_map<std::string, EdgeForce> edge_forces;
622 string fe_name_str = "FORCE_FE";
623 edge_forces.insert(fe_name_str, new EdgeForce(m_field));
625 it)) {
626 CHKERR edge_forces.at(fe_name_str)
627 .addForce("SPATIAL_POSITION", arc_ctx->F_lambda, it->getMeshsetId());
628 }
629 for (boost::ptr_map<std::string, EdgeForce>::iterator eit =
630 edge_forces.begin();
631 eit != edge_forces.end(); eit++) {
632 loops_to_do_Rhs.push_back(
633 SnesCtx::PairNameFEMethodPtr(eit->first, &eit->second->getLoopFe()));
634 }
635
636 // nodal forces
637 boost::ptr_map<std::string, NodalForce> nodal_forces;
638 // string fe_name_str ="FORCE_FE";
639 nodal_forces.insert(fe_name_str, new NodalForce(m_field));
641 it)) {
642 CHKERR nodal_forces.at(fe_name_str)
643 .addForce("SPATIAL_POSITION", arc_ctx->F_lambda, it->getMeshsetId());
644 }
645 for (boost::ptr_map<std::string, NodalForce>::iterator fit =
646 nodal_forces.begin();
647 fit != nodal_forces.end(); fit++) {
648 loops_to_do_Rhs.push_back(
649 SnesCtx::PairNameFEMethodPtr(fit->first, &fit->second->getLoopFe()));
650 }
651
652 // arc length
653 loops_to_do_Rhs.push_back(
654 SnesCtx::PairNameFEMethodPtr("NONE", &assemble_F_lambda));
655 loops_to_do_Rhs.push_back(
656 SnesCtx::PairNameFEMethodPtr("ARC_LENGTH", &arc_method));
657 snes_ctx.getPostProcComputeRhs().push_back(&pre_post_method);
658 snes_ctx.getPostProcComputeRhs().push_back(my_dirichlet_bc);
659
660 SnesCtx::FEMethodsSequence &loops_to_do_Mat =
661 snes_ctx.getSetOperators();
662 snes_ctx.getPreProcSetOperators().push_back(my_dirichlet_bc);
663 loops_to_do_Mat.push_back(
664 SnesCtx::PairNameFEMethodPtr("ELASTIC", &elastic.getLoopFeLhs()));
665
666 loops_to_do_Mat.push_back(
667 SnesCtx::PairNameFEMethodPtr("SPRING", fe_spring_lhs_ptr.get()));
668
669 loops_to_do_Mat.push_back(
670 SnesCtx::PairNameFEMethodPtr("NEUMANN_FE", &fe_neumann));
671 loops_to_do_Mat.push_back(
672 SnesCtx::PairNameFEMethodPtr("ARC_LENGTH", &arc_method));
673 snes_ctx.getPostProcSetOperators().push_back(my_dirichlet_bc);
674
675 CHKERR m_field.getInterface<VecManager>()->setLocalGhostVector(
676 "ELASTIC_MECHANICS", COL, D, INSERT_VALUES, SCATTER_FORWARD);
677 CHKERR VecGhostUpdateBegin(D, INSERT_VALUES, SCATTER_FORWARD);
678 CHKERR VecGhostUpdateEnd(D, INSERT_VALUES, SCATTER_FORWARD);
679
680 PetscScalar step_size_reduction;
681 CHKERR PetscOptionsGetReal(PETSC_NULLPTR, PETSC_NULLPTR, "-my_sr",
682 &step_size_reduction, &flg);
683 if (flg != PETSC_TRUE) {
684 step_size_reduction = 1.;
685 }
686
687 PetscInt max_steps;
688 CHKERR PetscOptionsGetInt(PETSC_NULLPTR, PETSC_NULLPTR, "-my_ms", &max_steps,
689 &flg);
690 if (flg != PETSC_TRUE) {
691 max_steps = 5;
692 }
693
694 int its_d;
695 CHKERR PetscOptionsGetInt(PETSC_NULLPTR, PETSC_NULLPTR, "-my_its_d", &its_d,
696 &flg);
697 if (flg != PETSC_TRUE) {
698 its_d = 4;
699 }
700 PetscScalar max_reduction = 10, min_reduction = 0.1;
701 CHKERR PetscOptionsGetReal(PETSC_NULLPTR, PETSC_NULLPTR, "-my_max_step_reduction",
702 &max_reduction, &flg);
703 CHKERR PetscOptionsGetReal(PETSC_NULLPTR, PETSC_NULLPTR, "-my_min_step_reduction",
704 &min_reduction, &flg);
705
706 double gamma = 0.5, reduction = 1;
707 // step = 1;
708 if (step == 1) {
709 step_size = step_size_reduction;
710 } else {
711 reduction = step_size_reduction;
712 step++;
713 }
714 double step_size0 = step_size;
715
716 if (step > 1) {
717 CHKERR m_field.getInterface<VecManager>()->setOtherGlobalGhostVector(
718 "ELASTIC_MECHANICS", "SPATIAL_POSITION", "X0_SPATIAL_POSITION", COL,
719 arc_ctx->x0, INSERT_VALUES, SCATTER_FORWARD);
720 double x0_nrm;
721 CHKERR VecNorm(arc_ctx->x0, NORM_2, &x0_nrm);
722 CHKERR PetscPrintf(PETSC_COMM_WORLD,
723 "\tRead x0_nrm = %6.4e dlambda = %6.4e\n", x0_nrm,
724 arc_ctx->dLambda);
725 CHKERR arc_ctx->setAlphaBeta(1, 0);
726 } else {
727 CHKERR arc_ctx->setS(step_size);
728 CHKERR arc_ctx->setAlphaBeta(0, 1);
729 }
730
731 CHKERR SnesRhs(snes, D, F, &snes_ctx);
732
733 Vec D0, x00;
734 CHKERR VecDuplicate(D, &D0);
735 CHKERR VecDuplicate(arc_ctx->x0, &x00);
736 bool converged_state = false;
737
738 for (int jj = 0; step < max_steps; step++, jj++) {
739
740 CHKERR VecCopy(D, D0);
741 CHKERR VecCopy(arc_ctx->x0, x00);
742
743 if (step == 1) {
744
745 CHKERR PetscPrintf(PETSC_COMM_WORLD, "Load Step %D step_size = %6.4e\n",
746 step, step_size);
747 CHKERR arc_ctx->setS(step_size);
748 CHKERR arc_ctx->setAlphaBeta(0, 1);
749 CHKERR VecCopy(D, arc_ctx->x0);
750 double dlambda;
751 CHKERR arc_method.calculateInitDlambda(&dlambda);
752 CHKERR arc_method.setDlambdaToX(D, dlambda);
753
754 } else if (step == 2) {
755
756 CHKERR arc_ctx->setAlphaBeta(1, 0);
757 CHKERR arc_method.calculateDxAndDlambda(D);
758 step_size = std::sqrt(arc_method.calculateLambdaInt());
759 step_size0 = step_size;
760 CHKERR arc_ctx->setS(step_size);
761 double dlambda = arc_ctx->dLambda;
762 double dx_nrm;
763 CHKERR VecNorm(arc_ctx->dx, NORM_2, &dx_nrm);
764 CHKERR PetscPrintf(PETSC_COMM_WORLD,
765 "Load Step %D step_size = %6.4e dlambda0 = %6.4e "
766 "dx_nrm = %6.4e dx2 = %6.4e\n",
767 step, step_size, dlambda, dx_nrm, arc_ctx->dx2);
768 CHKERR VecCopy(D, arc_ctx->x0);
769 CHKERR VecAXPY(D, 1., arc_ctx->dx);
770 CHKERR arc_method.setDlambdaToX(D, dlambda);
771
772 } else {
773
774 if (jj == 0) {
775 step_size0 = step_size;
776 }
777
778 CHKERR arc_method.calculateDxAndDlambda(D);
779 step_size *= reduction;
780 if (step_size > max_reduction * step_size0) {
781 step_size = max_reduction * step_size0;
782 } else if (step_size < min_reduction * step_size0) {
783 step_size = min_reduction * step_size0;
784 }
785 CHKERR arc_ctx->setS(step_size);
786 double dlambda = reduction * arc_ctx->dLambda;
787 double dx_nrm;
788 CHKERR VecScale(arc_ctx->dx, reduction);
789 CHKERR VecNorm(arc_ctx->dx, NORM_2, &dx_nrm);
790 CHKERR PetscPrintf(PETSC_COMM_WORLD,
791 "Load Step %D step_size = %6.4e dlambda0 = %6.4e "
792 "dx_nrm = %6.4e dx2 = %6.4e\n",
793 step, step_size, dlambda, dx_nrm, arc_ctx->dx2);
794 CHKERR VecCopy(D, arc_ctx->x0);
795 CHKERR VecAXPY(D, 1., arc_ctx->dx);
796 CHKERR arc_method.setDlambdaToX(D, dlambda);
797 }
798
799 CHKERR SNESSolve(snes, PETSC_NULLPTR, D);
800 int its;
801 CHKERR SNESGetIterationNumber(snes, &its);
802 CHKERR PetscPrintf(PETSC_COMM_WORLD, "number of Newton iterations = %D\n",
803 its);
804
805 SNESConvergedReason reason;
806 CHKERR SNESGetConvergedReason(snes, &reason);
807 if (reason < 0) {
808
809 CHKERR VecCopy(D0, D);
810 CHKERR VecCopy(x00, arc_ctx->x0);
811
812 double x0_nrm;
813 CHKERR VecNorm(arc_ctx->x0, NORM_2, &x0_nrm);
814 CHKERR PetscPrintf(PETSC_COMM_WORLD,
815 "\tRead x0_nrm = %6.4e dlambda = %6.4e\n", x0_nrm,
816 arc_ctx->dLambda);
817 CHKERR arc_ctx->setAlphaBeta(1, 0);
818
819 reduction = 0.1;
820 converged_state = false;
821
822 continue;
823
824 } else {
825
826 if (step > 1 && converged_state) {
827
828 reduction = pow((double)its_d / (double)(its + 1), gamma);
829 if (step_size >= max_reduction * step_size0 && reduction > 1) {
830 reduction = 1;
831 } else if (step_size <= min_reduction * step_size0 && reduction < 1) {
832 reduction = 1;
833 }
834 CHKERR PetscPrintf(PETSC_COMM_WORLD, "reduction step_size = %6.4e\n",
835 reduction);
836 }
837
838 // Save data on mesh
839 CHKERR m_field.getInterface<VecManager>()->setGlobalGhostVector(
840 "ELASTIC_MECHANICS", COL, D, INSERT_VALUES, SCATTER_REVERSE);
841 CHKERR m_field.getInterface<VecManager>()->setOtherGlobalGhostVector(
842 "ELASTIC_MECHANICS", "SPATIAL_POSITION", "X0_SPATIAL_POSITION", COL,
843 arc_ctx->x0, INSERT_VALUES, SCATTER_REVERSE);
844 converged_state = true;
845 }
846
847 if (step % 1 == 0) {
848 // Save restart file
849 // #ifdef MOAB_HDF5_PARALLEL
850 // std::ostringstream sss;
851 // sss << "restart_" << step << ".h5m";
852 // CHKERR
853 // moab.write_file(sss.str().c_str(),"MOAB","PARALLEL=WRITE_PART");
854 // #else
855 // #warning "No parallel HDF5, no writing restart file"
856 // #endif
857 // Save data on mesh
858 CHKERR m_field.loop_finite_elements("ELASTIC_MECHANICS", "ELASTIC",
859 post_proc);
860 std::ostringstream o1;
861 o1 << "out_" << step << ".h5m";
862 CHKERR post_proc.writeFile(o1.str().c_str());
863 }
864
865 CHKERR pre_post_method.potsProcessLoadPath();
866 }
867
868 CHKERR VecDestroy(&D0);
869 CHKERR VecDestroy(&x00);
870
871 // detroy matrices
872 CHKERR VecDestroy(&F);
873 CHKERR VecDestroy(&D);
874 CHKERR MatDestroy(&Aij);
875 CHKERR MatDestroy(&ShellAij);
876 CHKERR SNESDestroy(&snes);
877 }
879
881
882 return 0;
883}
MoFEMErrorCode PCApplyArcLength(PC pc, Vec pc_f, Vec pc_x)
MoFEMErrorCode ArcLengthMatMultShellOp(Mat A, Vec x, Vec f)
MoFEMErrorCode PCSetupArcLength(PC pc)
Elastic materials.
Implementation of Neo-Hookean elastic material.
int main()
static char help[]
@ COL
#define CATCH_ERRORS
Catch errors.
@ MF_ZERO
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base .
Definition definitions.h:60
@ NOBASE
Definition definitions.h:59
#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)
Definition definitions.h:84
@ H1
continuous field
Definition definitions.h:85
#define MYPCOMM_INDEX
default communicator number PCOMM
@ PRESSURESET
@ FORCESET
@ NODESET
@ SIDESET
#define CHKERR
Inline error check.
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
constexpr int order
@ F
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.
MoFEMErrorCode addFieldValuesPostProc(const std::string field_name, Vec v=PETSC_NULLPTR)
Add operator to post-process L2, H1, Hdiv, Hcurl field value.
MoFEMErrorCode addFieldValuesGradientPostProc(const std::string field_name, Vec v=PETSC_NULLPTR)
Add operator to post-process L2 or H1 field gradient.
MoFEMErrorCode writeFile(const std::string file_name, const char *file_type="MOAB", const char *file_options="PARALLEL=WRITE_PART")
wrote results in (MOAB) format, use "file_name.h5m"
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.
#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 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
double D
const double n
refractive index of diffusive medium
char mesh_file_name[255]
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.
Definition Types.hpp:40
implementation of Data Operators for Forces and Sources
Definition Common.hpp:10
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.
Definition SnesCtx.cpp:142
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.
Definition SnesCtx.cpp:27
PetscErrorCode PetscOptionsGetBool(PetscOptions *, const char pre[], const char name[], PetscBool *bval, PetscBool *set)
PetscErrorCode PetscOptionsGetString(PetscOptions *, const char pre[], const char name[], char str[], size_t size, PetscBool *set)
MoFEMErrorCode addHOOpsVol(const std::string field, E &e, bool h1, bool hcurl, bool hdiv, bool l2)
FTensor::Index< 'm', 3 > m
const int N
Definition speed_test.cpp:3
Store variables for ArcLength analysis.
shell matrix for arc-length method
Set Dirichlet boundary conditions on spatial displacements.
Force on edges and lines.
Definition EdgeForce.hpp:13
Manage setting parameters and constitutive equations for nonlinear/linear elastic materials.
static MoFEMErrorCode addElement(MoFEM::Interface &m_field, const std::string field_name, Range *intersect_ptr=NULL)
Add element taking information from NODESET.
static MoFEMErrorCode setSpringOperators(MoFEM::Interface &m_field, boost::shared_ptr< FaceElementForcesAndSourcesCore > fe_spring_lhs_ptr, boost::shared_ptr< FaceElementForcesAndSourcesCore > fe_spring_rhs_ptr, const std::string field_name, const std::string mesh_nodals_positions="MESH_NODE_POSITIONS", double stiffness_scale=1.)
Implementation of spring element. Set operators to calculate LHS and RHS.
static MoFEMErrorCode addSpringElements(MoFEM::Interface &m_field, const std::string field_name, const std::string mesh_nodals_positions="MESH_NODE_POSITIONS")
Declare spring element.
virtual MoFEMErrorCode postProcess()
function is run at the end of loop
virtual MoFEMErrorCode operator()()
function is run for every finite element
virtual MoFEMErrorCode preProcess()
function is run at the beginning of loop
Managing BitRefLevels.
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.
Core (interface) class.
Definition Core.hpp:82
static MoFEMErrorCode Initialize(int *argc, char ***args, const char file[], const char help[])
Initializes the MoFEM database PETSc, MOAB and MPI.
Definition Core.cpp:72
static MoFEMErrorCode Finalize()
Checks for options to be called at the conclusion of the program.
Definition Core.cpp:112
Deprecated interface functions.
structure for User Loop Methods on finite elements
Basic algebra on fields.
Definition FieldBlas.hpp:21
Matrix manager is used to build and partition problems.
Interface for managing meshsets containing materials and boundary conditions.
MoFEMErrorCode printForceSet() const
print meshsets with force boundary conditions data structure
MoFEMErrorCode printMaterialsSet() const
print meshsets with material data structure set on it
MoFEMErrorCode printDisplacementSet() const
print meshsets with displacement boundary conditions data structure
Problem manager is used to build and partition problems.
Projection of edge entities with one mid-node on hierarchical basis.
MoFEM::FEMethodsSequence FEMethodsSequence
Definition SnesCtx.hpp:27
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.
Vector manager is used to create vectors \mofem_vectors.
NonLinear surface pressure element (obsolete implementation)
Force applied to nodes.
structure grouping operators and data used for calculation of nonlinear elastic element
MyVolumeFE & getLoopFeLhs()
get lhs volume element
MoFEMErrorCode addElement(const std::string element_name, const std::string spatial_position_field_name, const std::string material_position_field_name="MESH_NODE_POSITIONS", const bool ale=false)
std::map< int, BlockData > setOfBlocks
maps block set id with appropriate BlockData
MyVolumeFE & getLoopFeRhs()
get rhs volume element
MyVolumeFE & getLoopFeEnergy()
get energy fe
MoFEMErrorCode setOperators(const std::string spatial_position_field_name, const std::string material_position_field_name="MESH_NODE_POSITIONS", const bool ale=false, const bool field_disp=false)
Set operators to calculate left hand tangent matrix and right hand residual.
structure for Arc Length pre-conditioner
std::vector< EntityHandle > mapGaussPts
MoFEMErrorCode generateReferenceElementMesh()
Generate reference mesh on single element.
Implementation of spherical arc-length method.
virtual MoFEMErrorCode calculateDxAndDlambda(Vec x)
virtual double calculateLambdaInt()
Calculate f_lambda(dx,lambda)
virtual MoFEMErrorCode calculateInitDlambda(double *dlambda)
virtual MoFEMErrorCode setDlambdaToX(Vec x, double dlambda)