159 {
160
161 const string default_options = "-ksp_type fgmres \n"
162 "-pc_type lu \n"
163 "-pc_factor_mat_solver_type mumps\n"
164 "-mat_mumps_icntl_20 0\n"
165 "-ksp_monitor \n"
166 "-ksp_atol 1e-10 \n"
167 "-ksp_rtol 1e-10 \n"
168 "-snes_monitor \n"
169 "-snes_type newtonls \n"
170 "-snes_linesearch_type l2 \n"
171 "-snes_linesearch_monitor \n"
172 "-snes_max_it 16 \n"
173 "-snes_atol 1e-8 \n"
174 "-snes_rtol 1e-8 \n"
175 "-snes_converged_reason \n";
176
177 string param_file = "param_file.petsc";
178 if (!static_cast<bool>(ifstream(param_file))) {
179 std::ofstream file(param_file.c_str(), std::ios::ate);
180 if (file.is_open()) {
181 file << default_options;
182 file.close();
183 }
184 }
186
187 try {
188
189 moab::Core mb_instance;
190 moab::Interface &moab = mb_instance;
191 int rank;
192 MPI_Comm_rank(PETSC_COMM_WORLD, &rank);
193
194
195 PetscBool flg = PETSC_TRUE;
199 if (flg != PETSC_TRUE) {
201 "*** ERROR -my_file (MESH FILE NEEDED)");
202 }
203
204 PetscScalar step_size_reduction;
206 &step_size_reduction, &flg);
207 if (flg != PETSC_TRUE) {
208 step_size_reduction = 1.;
209 }
210
211 PetscInt max_steps;
213 &flg);
214 if (flg != PETSC_TRUE) {
215 max_steps = 5;
216 }
217
218 int its_d;
220 if (flg != PETSC_TRUE) {
221 its_d = 6;
222 }
223
226 &flg);
227 if (flg != PETSC_TRUE) {
229 }
230
231
232
233 if (std::string(
mesh_file_name).find(
"restart") == std::string::npos) {
235 }
236
237
238 const char *option;
239 option = "";
241
242
243 Tag th_step_size, th_step;
244 double def_step_size = 1;
245 rval = moab.tag_get_handle(
"_STEPSIZE", 1, MB_TYPE_DOUBLE, th_step_size,
246 MB_TAG_CREAT | MB_TAG_MESH, &def_step_size);
247 if (
rval == MB_ALREADY_ALLOCATED)
250 int def_step = 1;
251 rval = moab.tag_get_handle(
"_STEP", 1, MB_TYPE_INTEGER, th_step,
252 MB_TAG_CREAT | MB_TAG_MESH, &def_step);
253 if (
rval == MB_ALREADY_ALLOCATED)
256 const void *tag_data_step_size[1];
258 CHKERR moab.tag_get_by_ptr(th_step_size, &root, 1, tag_data_step_size);
259 double &step_size = *(double *)tag_data_step_size[0];
260 const void *tag_data_step[1];
261 CHKERR moab.tag_get_by_ptr(th_step, &root, 1, tag_data_step);
262 int &step = *(int *)tag_data_step[0];
263
264 CHKERR PetscPrintf(PETSC_COMM_WORLD,
265 "Start step %D and step_size = %6.4e\n", step,
266 step_size);
267
268
271
274
278 "_MY_REFINEMENT_LEVEL",
sizeof(
BitRefLevel), MB_TYPE_OPAQUE,
279 th_my_ref_level, MB_TAG_CREAT | MB_TAG_SPARSE | MB_TAG_BYTES,
280 &def_bit_level);
283 CHKERR m_field.
get_moab().tag_get_by_ptr(th_my_ref_level, &root_meshset, 1,
284 (const void **)&ptr_bit_level0);
287
288 if (step == 1) {
289
290
293
294 std::vector<BitRefLevel> bit_levels;
296
297 int ll = 1;
298
301 CHKERR PetscPrintf(PETSC_COMM_WORLD,
"Insert Interface %d\n",
302 cit->getMeshsetId());
304 {
305
307 CHKERR moab.create_meshset(MESHSET_SET, ref_level_meshset);
309 ->getEntitiesByTypeAndRefLevel(bit_levels.back(),
311 ref_level_meshset);
313 ->getEntitiesByTypeAndRefLevel(bit_levels.back(),
315 ref_level_meshset);
316 Range ref_level_tets;
317 CHKERR moab.get_entities_by_handle(ref_level_meshset, ref_level_tets,
318 true);
319
320 CHKERR interface_ptr->
getSides(cubit_meshset, bit_levels.back(),
true,
321 0);
322
324
326 cubit_meshset, true, true, 0);
327
328 CHKERR moab.delete_entities(&ref_level_meshset, 1);
329 }
330
334 ->updateMeshsetByEntitiesChildren(cubit_meshset,
335 bit_levels.back(),
336 cubit_meshset, MBMAXTYPE, true);
337 }
338 }
339
340 bit_level0 = bit_levels.back();
341 problem_bit_level = bit_level0;
342
343
344
345
346
350
352
353
356
357
359
360
362 "DISPLACEMENT");
364 "DISPLACEMENT");
366 "DISPLACEMENT");
368 "ELASTIC", "MESH_NODE_POSITIONS");
371
373
374
377 "DISPLACEMENT");
379 "DISPLACEMENT");
381 "DISPLACEMENT");
383 "INTERFACE", "MESH_NODE_POSITIONS");
384
385
387
388
390 "LAMBDA");
392 "LAMBDA");
393
394
397
398
400
401
403 "ELASTIC");
405 "INTERFACE");
407 "ARC_LENGTH");
408
410 problem_bit_level);
411
412
413
414
415
419
420
422 problem_bit_level,
BitRefLevel().set(),
"ELASTIC", MBTET);
424 problem_bit_level,
BitRefLevel().set(),
"INTERFACE", MBPRISM);
425
426
427 {
428
430 {
431 const double coords[] = {0, 0, 0};
433 Range range_no_field_vertex;
434 range_no_field_vertex.insert(no_field_vertex);
437
440 range_no_field_vertex);
441 }
442
444 {
445 CHKERR moab.create_meshset(MESHSET_SET, meshset_fe_arc_length);
446 CHKERR moab.add_entities(meshset_fe_arc_length, &no_field_vertex, 1);
449 }
450
452 meshset_fe_arc_length, "ARC_LENGTH", false);
453 }
454
455
456
457
462
467
472
473
476
478 "FORCE_FE");
480 "PRESSURE_FE");
484
486 "LAMBDA");
488 "LAMBDA");
490 "LAMBDA");
493 "DISPLACEMENT");
495 "DISPLACEMENT");
497 "DISPLACEMENT");
499 "BODY_FORCE");
500
504 CHKERR m_field.
get_moab().get_entities_by_type(it->meshset, MBTET, tets,
505 true);
507 "BODY_FORCE");
508 }
509 }
510
511
512
513
514
517 "MESH_NODE_POSITIONS");
519
520
522
523
525
526
529
531
535
537
538
543
545
546
547 Vec
F, F_body_force,
D;
549 "ELASTIC_MECHANICS",
COL, &
F);
551 CHKERR VecDuplicate(
F, &F_body_force);
552 Mat Aij;
554 ->createMPIAIJWithArrays<PetscGlobalIdx_mi_tag>("ELASTIC_MECHANICS",
555 &Aij);
556
557
560
561 boost::ptr_vector<CohesiveInterfaceElement::PhysicalEquation>
562 interface_materials;
563
564
565
567 cout << std::endl << *it << std::endl;
568
569
570 string name = it->getName();
571
572 if (name.compare(0, 11, "MAT_ELASTIC") == 0) {
574 CHKERR it->getAttributeDataStructure(mydata);
575 cout << mydata;
578 } else if (name.compare(0, 10, "MAT_INTERF") == 0) {
580 CHKERR it->getAttributeDataStructure(mydata);
581 cout << mydata;
582
583 interface_materials.push_back(
585 interface_materials.back().h = 1;
586 interface_materials.back().youngModulus = mydata.
data.alpha;
587 interface_materials.back().beta = mydata.data.beta;
588 interface_materials.back().ft = mydata.data.ft;
589 interface_materials.back().Gf = mydata.data.Gf;
590
593 rval = moab.get_entities_by_type(meshset, MBTRI, tris,
true);
596 rval = moab.get_adjacencies(tris, 3,
false, ents3d,
597 moab::Interface::UNION);
599 interface_materials.back().pRisms = ents3d.subset_by_type(MBPRISM);
600 }
601 }
602
603 {
604 boost::ptr_vector<CohesiveInterfaceElement::PhysicalEquation>::iterator
605 pit = interface_materials.begin();
606 for (; pit != interface_materials.end(); pit++) {
608 }
609 }
610
611 boost::shared_ptr<ArcLengthCtx> arc_ctx = boost::shared_ptr<ArcLengthCtx>(
613 boost::scoped_ptr<ArcLengthElement> my_arc_method_ptr(
615 ArcLengthSnesCtx snes_ctx(m_field, "ELASTIC_MECHANICS", arc_ctx);
617
620 &my_dirichlet_bc.problemPtr);
621 CHKERR my_dirichlet_bc.iNitialize();
622 boost::shared_ptr<Hooke<adouble>> hooke_adouble_ptr(
new Hooke<adouble>);
623 boost::shared_ptr<Hooke<double>> hooke_double_ptr(
new Hooke<double>);
625 {
626 int id = 0;
627 elastic.setOfBlocks[id].iD = id;
630 elastic.setOfBlocks[id].materialDoublePtr = hooke_double_ptr;
631 elastic.setOfBlocks[id].materialAdoublePtr = hooke_adouble_ptr;
634 elastic.setOfBlocks[id].tEts, true);
636 false, false, false);
638 false, false, false);
640 false, false, false);
641 CHKERR elastic.setOperators(
"DISPLACEMENT",
"MESH_NODE_POSITIONS",
false,
642 true);
643 }
645 CHKERR cohesive_elements.addOps(
"DISPLACEMENT", interface_materials);
646
648 CHKERR MatGetSize(Aij, &M, &
N);
650 MatGetLocalSize(Aij, &
m, &
n);
651 boost::scoped_ptr<ArcLengthMatShell> mat_ctx(
653 Mat ShellAij;
654 CHKERR MatCreateShell(PETSC_COMM_WORLD,
m,
n, M,
N, (
void *)mat_ctx.get(),
655 &ShellAij);
656 CHKERR MatShellSetOperation(ShellAij, MATOP_MULT,
658
659
663 CHKERR body_forces_methods.addBlock(
"DISPLACEMENT", F_body_force,
664 it->getMeshsetId());
665 }
666 CHKERR VecZeroEntries(F_body_force);
667 CHKERR VecGhostUpdateBegin(F_body_force, INSERT_VALUES, SCATTER_FORWARD);
668 CHKERR VecGhostUpdateEnd(F_body_force, INSERT_VALUES, SCATTER_FORWARD);
670 body_forces_methods.getLoopFe());
671 CHKERR VecGhostUpdateBegin(F_body_force, ADD_VALUES, SCATTER_REVERSE);
672 CHKERR VecGhostUpdateEnd(F_body_force, ADD_VALUES, SCATTER_REVERSE);
673 CHKERR VecAssemblyBegin(F_body_force);
674 CHKERR VecAssemblyEnd(F_body_force);
675
676
677 boost::ptr_map<std::string, NeumannForcesSurface> neumann_forces;
678 string fe_name_str = "FORCE_FE";
681 neumann_forces.at(fe_name_str).getLoopFe(), false,
682 false);
684 it)) {
685 CHKERR neumann_forces.at(fe_name_str)
686 .addForce("DISPLACEMENT", arc_ctx->F_lambda, it->getMeshsetId());
687 }
688 fe_name_str = "PRESSURE_FE";
691 neumann_forces.at(fe_name_str).getLoopFe(), false,
692 false);
695 CHKERR neumann_forces.at(fe_name_str)
696 .addPressure("DISPLACEMENT", arc_ctx->F_lambda, it->getMeshsetId());
697 }
698
699 boost::ptr_map<std::string, NodalForce> nodal_forces;
700 fe_name_str = "FORCE_FE";
701 nodal_forces.insert(fe_name_str,
new NodalForce(m_field));
703 it)) {
704 CHKERR nodal_forces.at(fe_name_str)
705 .addForce("DISPLACEMENT", arc_ctx->F_lambda, it->getMeshsetId());
706 }
707
708 SNES snes;
709 CHKERR SNESCreate(PETSC_COMM_WORLD, &snes);
710 CHKERR SNESSetApplicationContext(snes, &snes_ctx);
712 CHKERR SNESSetJacobian(snes, ShellAij, Aij,
SnesMat, &snes_ctx);
713 CHKERR SNESSetFromOptions(snes);
714
715 KSP ksp;
716 CHKERR SNESGetKSP(snes, &ksp);
717 PC pc;
718 CHKERR KSPGetPC(ksp, &pc);
719 boost::scoped_ptr<PCArcLengthCtx> pc_ctx(
721 CHKERR PCSetType(pc, PCSHELL);
722 CHKERR PCShellSetContext(pc, pc_ctx.get());
725
726
728 snes_ctx.getComputeRhs();
729 snes_ctx.getPreProcComputeRhs().push_back(&my_dirichlet_bc);
730 snes_ctx.getPreProcComputeRhs().push_back(&pre_post_proc_fe);
732 "INTERFACE", &cohesive_elements.getFeRhs()));
733 loops_to_do_Rhs.push_back(
735 loops_to_do_Rhs.push_back(
737 snes_ctx.getPostProcComputeRhs().push_back(&pre_post_proc_fe);
738 snes_ctx.getPostProcComputeRhs().push_back(&my_dirichlet_bc);
739
740
742 snes_ctx.getSetOperators();
743 snes_ctx.getPreProcSetOperators().push_back(&my_dirichlet_bc);
745 "INTERFACE", &cohesive_elements.getFeLhs()));
746 loops_to_do_Mat.push_back(
748 loops_to_do_Mat.push_back(
750 snes_ctx.getPostProcSetOperators().push_back(&my_dirichlet_bc);
751
752 double gamma = 0.5, reduction = 1;
753
754 if (step == 1) {
755 step_size = step_size_reduction;
756 } else {
757 reduction = step_size_reduction;
758 step++;
759 }
760
761 boost::ptr_map<std::string, NeumannForcesSurface>::iterator mit =
762 neumann_forces.begin();
763 CHKERR VecZeroEntries(arc_ctx->F_lambda);
764 CHKERR VecGhostUpdateBegin(arc_ctx->F_lambda, INSERT_VALUES,
765 SCATTER_FORWARD);
766 CHKERR VecGhostUpdateEnd(arc_ctx->F_lambda, INSERT_VALUES, SCATTER_FORWARD);
767 for (; mit != neumann_forces.end(); mit++) {
769 mit->second->getLoopFe());
770 }
771 CHKERR VecGhostUpdateBegin(arc_ctx->F_lambda, ADD_VALUES, SCATTER_REVERSE);
772 CHKERR VecGhostUpdateEnd(arc_ctx->F_lambda, ADD_VALUES, SCATTER_REVERSE);
773 CHKERR VecAssemblyBegin(arc_ctx->F_lambda);
774 CHKERR VecAssemblyEnd(arc_ctx->F_lambda);
775 for (std::vector<int>::iterator vit = my_dirichlet_bc.dofsIndices.begin();
776 vit != my_dirichlet_bc.dofsIndices.end(); vit++) {
777 CHKERR VecSetValue(arc_ctx->F_lambda, *vit, 0, INSERT_VALUES);
778 }
779 CHKERR VecAssemblyBegin(arc_ctx->F_lambda);
780 CHKERR VecAssemblyEnd(arc_ctx->F_lambda);
781
782 CHKERR VecDot(arc_ctx->F_lambda, arc_ctx->F_lambda, &arc_ctx->F_lambda2);
783 PetscPrintf(PETSC_COMM_WORLD, "\tFlambda2 = %6.4e\n", arc_ctx->F_lambda2);
784
785 if (step > 1) {
787 "ELASTIC_MECHANICS",
COL,
D, INSERT_VALUES, SCATTER_FORWARD);
789 "ELASTIC_MECHANICS",
"DISPLACEMENT",
"X0_DISPLACEMENT",
COL,
790 arc_ctx->x0, INSERT_VALUES, SCATTER_FORWARD);
791 double x0_nrm;
792 CHKERR VecNorm(arc_ctx->x0, NORM_2, &x0_nrm);
793 CHKERR PetscPrintf(PETSC_COMM_WORLD,
794 "\tRead x0_nrm = %6.4e dlambda = %6.4e\n", x0_nrm,
795 arc_ctx->dLambda);
796 CHKERR arc_ctx->setAlphaBeta(1, 0);
797 } else {
799 CHKERR arc_ctx->setAlphaBeta(0, 1);
800 }
802
804 CHKERR post_proc.generateReferenceElementMesh();
805 CHKERR post_proc.addFieldValuesPostProc(
"DISPLACEMENT");
806 CHKERR post_proc.addFieldValuesGradientPostProc(
"DISPLACEMENT");
807
809 m_field, post_proc.postProcMesh, post_proc.mapGaussPts, "DISPLACEMENT",
810 post_proc.commonData));
811
812 bool converged_state = false;
813 for (; step < max_steps; step++) {
814
815 if (step == 1) {
816 CHKERR PetscPrintf(PETSC_COMM_WORLD,
"Load Step %D step_size = %6.4e\n",
817 step, step_size);
818 CHKERR arc_ctx->setS(step_size);
819 CHKERR arc_ctx->setAlphaBeta(0, 1);
820 CHKERR VecCopy(
D, arc_ctx->x0);
821 double dlambda;
822 CHKERR my_arc_method_ptr->calculate_init_dlambda(&dlambda);
823 CHKERR my_arc_method_ptr->set_dlambda_to_x(
D, dlambda);
824 } else if (step == 2) {
825 CHKERR arc_ctx->setAlphaBeta(1, 0);
826 CHKERR my_arc_method_ptr->calculate_dx_and_dlambda(
D);
827 CHKERR my_arc_method_ptr->calculate_lambda_int(step_size);
828 CHKERR arc_ctx->setS(step_size);
829 double dlambda = arc_ctx->dLambda;
830 double dx_nrm;
831 CHKERR VecNorm(arc_ctx->dx, NORM_2, &dx_nrm);
832 CHKERR PetscPrintf(PETSC_COMM_WORLD,
833 "Load Step %D step_size = %6.4e dlambda0 = %6.4e "
834 "dx_nrm = %6.4e dx2 = %6.4e\n",
835 step, step_size, dlambda, dx_nrm, arc_ctx->dx2);
836 CHKERR VecCopy(
D, arc_ctx->x0);
837 CHKERR VecAXPY(
D, 1., arc_ctx->dx);
838 CHKERR my_arc_method_ptr->set_dlambda_to_x(
D, dlambda);
839 } else {
840 CHKERR my_arc_method_ptr->calculate_dx_and_dlambda(
D);
841 CHKERR my_arc_method_ptr->calculate_lambda_int(step_size);
842
843
844 step_size *= reduction;
845 CHKERR arc_ctx->setS(step_size);
846 double dlambda = reduction * arc_ctx->dLambda;
847 CHKERR VecScale(arc_ctx->dx, reduction);
848 double dx_nrm;
849 CHKERR VecNorm(arc_ctx->dx, NORM_2, &dx_nrm);
850 CHKERR PetscPrintf(PETSC_COMM_WORLD,
851 "Load Step %D step_size = %6.4e dlambda0 = %6.4e "
852 "dx_nrm = %6.4e dx2 = %6.4e\n",
853 step, step_size, dlambda, dx_nrm, arc_ctx->dx2);
854 CHKERR VecCopy(
D, arc_ctx->x0);
855 CHKERR VecAXPY(
D, 1., arc_ctx->dx);
856 CHKERR my_arc_method_ptr->set_dlambda_to_x(
D, dlambda);
857 }
858
859 CHKERR SNESSolve(snes, PETSC_NULLPTR,
D);
860
861
863 "ELASTIC_MECHANICS",
COL,
D, INSERT_VALUES, SCATTER_REVERSE);
865 cohesive_elements.getFeHistory(), 0,
867
868 CHKERR my_arc_method_ptr->remove_damaged_prisms_nodes();
869
870 int its;
871 CHKERR SNESGetIterationNumber(snes, &its);
872 CHKERR PetscPrintf(PETSC_COMM_WORLD,
"number of Newton iterations = %D\n",
873 its);
874
875 SNESConvergedReason reason;
876 CHKERR SNESGetConvergedReason(snes, &reason);
877
878 if (reason < 0) {
879 CHKERR arc_ctx->setAlphaBeta(1, 0);
880 reduction = 0.1;
881 converged_state = false;
882 continue;
883 } else {
884 if (step > 1 && converged_state) {
885 reduction = pow((double)its_d / (double)(its + 1), gamma);
886 CHKERR PetscPrintf(PETSC_COMM_WORLD,
"reduction step_size = %6.4e\n",
887 reduction);
888 }
889
890
892 "ELASTIC_MECHANICS",
COL,
D, INSERT_VALUES, SCATTER_REVERSE);
894 "ELASTIC_MECHANICS",
"DISPLACEMENT",
"X0_DISPLACEMENT",
COL,
895 arc_ctx->x0, INSERT_VALUES, SCATTER_REVERSE);
896 converged_state = true;
897 }
898
899 if (reason > 0) {
900 FILE *datafile;
901 PetscFOpen(PETSC_COMM_SELF,
DATAFILENAME,
"a+", &datafile);
902 PetscFPrintf(PETSC_COMM_WORLD, datafile, "%d %d ", reason, its);
903 fclose(datafile);
904 CHKERR my_arc_method_ptr->postProcessLoadPath();
905 }
906
907 if (step % 1 == 0) {
908
910 post_proc);
911 std::ostringstream ss;
912 ss << "out_values_" << step << ".h5m";
913 CHKERR post_proc.writeFile(ss.str().c_str());
914 }
915 }
916
917
919 "ELASTIC_MECHANICS",
COL,
D, INSERT_VALUES, SCATTER_REVERSE);
920
921
924 CHKERR VecDestroy(&F_body_force);
926 CHKERR SNESDestroy(&snes);
927 CHKERR MatDestroy(&ShellAij);
928 }
930
932
933 return 0;
934}
#define CATCH_ERRORS
Catch errors.
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base nme:nme847.
@ NOFIELD
scalar or vector of scalars describe (no true field)
#define CHKERRG(n)
Check error code of MoFEM/MOAB/PETSc function.
@ BODYFORCESSET
block name is "BODY_FORCES"
#define CHKERR
Inline error check.
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 EntityHandle get_finite_element_meshset(const std::string name) const =0
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 add_ents_to_finite_element_by_bit_ref(const BitRefLevel bit, const BitRefLevel mask, const std::string name, EntityType type, int verb=DEFAULT_VERBOSITY)=0
add TET entities from given refinement level to finite element database given by name
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.
#define _IT_CUBITMESHSETS_BY_BCDATA_TYPE_FOR_LOOP_(MESHSET_MANAGER, CUBITBCTYPE, IT)
Iterator that loops over a specific Cubit MeshSet in a moFEM field.
#define _IT_CUBITMESHSETS_FOR_LOOP_(MESHSET_MANAGER, IT)
Iterator that loops over all the Cubit MeshSets in a moFEM field.
#define _IT_CUBITMESHSETS_BY_SET_TYPE_FOR_LOOP_(MESHSET_MANAGER, CUBITBCTYPE, IT)
Iterator that loops over a specific Cubit MeshSet having a particular BC 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
const double n
refractive index of diffusive medium
static MoFEMErrorCodeGeneric< moab::ErrorCode > rval
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.
MoFEMErrorCode addHOOpsFace3D(const std::string field, E &e, bool hcurl, bool hdiv)
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
double young_modulus
Young modulus.
double poisson_ratio
Poisson ratio.
FTensor::Index< 'm', 3 > m
Store variables for ArcLength analysis.
shell matrix for arc-length method
Constitutive (physical) equation for interface.
Cohesive element implementation.
Set Dirichlet boundary conditions on displacements.
virtual int get_comm_size() const =0
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.
Elastic material data structure.
Linear interface data structure.
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
Create interface from given surface and insert flat prisms in-between.
MoFEMErrorCode getSides(const int msId, const CubitBCType cubit_bc_type, const BitRefLevel mesh_bit_level, const bool recursive, int verb=QUIET)
Store tetrahedra from each side of the interface separately in two child meshsets of the parent meshs...
MoFEMErrorCode splitSides(const EntityHandle meshset, const BitRefLevel &bit, const int msId, const CubitBCType cubit_bc_type, const bool add_interface_entities, const bool recursive=false, int verb=QUIET)
Split nodes and other entities of tetrahedra on both sides of the interface and insert flat prisms in...
Problem manager is used to build and partition problems.
Projection of edge entities with one mid-node on hierarchical basis.
MoFEM::FEMethodsSequence FEMethodsSequence
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.
Vector manager is used to create vectors \mofem_vectors.
Finite element and operators to apply force/pressures applied to surfaces.
structure grouping operators and data used for calculation of nonlinear elastic element
structure for Arc Length pre-conditioner
Operator post-procesing stresses for Hook isotropic material.