157 {
158
159 const string default_options = "-ksp_type fgmres \n"
160 "-pc_type lu \n"
161 "-pc_factor_mat_solver_type mumps\n"
162 "-mat_mumps_icntl_20 0\n"
163 "-ksp_monitor \n"
164 "-ksp_atol 1e-10 \n"
165 "-ksp_rtol 1e-10 \n"
166 "-snes_monitor \n"
167 "-snes_type newtonls \n"
168 "-snes_linesearch_type l2 \n"
169 "-snes_linesearch_monitor \n"
170 "-snes_max_it 16 \n"
171 "-snes_atol 1e-8 \n"
172 "-snes_rtol 1e-8 \n"
173 "-snes_converged_reason \n";
174
175 string param_file = "param_file.petsc";
176 if (!static_cast<bool>(ifstream(param_file))) {
177 std::ofstream file(param_file.c_str(), std::ios::ate);
178 if (file.is_open()) {
179 file << default_options;
180 file.close();
181 }
182 }
184
185 try {
186
187 moab::Core mb_instance;
188 moab::Interface &moab = mb_instance;
189 int rank;
190 MPI_Comm_rank(PETSC_COMM_WORLD, &rank);
191
192
193 PetscBool flg = PETSC_TRUE;
197 if (flg != PETSC_TRUE) {
199 "*** ERROR -my_file (MESH FILE NEEDED)");
200 }
201
202 PetscScalar step_size_reduction;
204 &step_size_reduction, &flg);
205 if (flg != PETSC_TRUE) {
206 step_size_reduction = 1.;
207 }
208
209 PetscInt max_steps;
211 &flg);
212 if (flg != PETSC_TRUE) {
213 max_steps = 5;
214 }
215
216 int its_d;
218 if (flg != PETSC_TRUE) {
219 its_d = 6;
220 }
221
224 &flg);
225 if (flg != PETSC_TRUE) {
227 }
228
229
230
231 if (std::string(
mesh_file_name).find(
"restart") == std::string::npos) {
233 }
234
235
236 const char *option;
237 option = "";
239
240
241 Tag th_step_size, th_step;
242 double def_step_size = 1;
243 rval = moab.tag_get_handle(
"_STEPSIZE", 1, MB_TYPE_DOUBLE, th_step_size,
244 MB_TAG_CREAT | MB_TAG_MESH, &def_step_size);
245 if (
rval == MB_ALREADY_ALLOCATED)
248 int def_step = 1;
249 rval = moab.tag_get_handle(
"_STEP", 1, MB_TYPE_INTEGER, th_step,
250 MB_TAG_CREAT | MB_TAG_MESH, &def_step);
251 if (
rval == MB_ALREADY_ALLOCATED)
254 const void *tag_data_step_size[1];
256 CHKERR moab.tag_get_by_ptr(th_step_size, &root, 1, tag_data_step_size);
257 double &step_size = *(double *)tag_data_step_size[0];
258 const void *tag_data_step[1];
259 CHKERR moab.tag_get_by_ptr(th_step, &root, 1, tag_data_step);
260 int &step = *(int *)tag_data_step[0];
261
262 CHKERR PetscPrintf(PETSC_COMM_WORLD,
263 "Start step %D and step_size = %6.4e\n", step,
264 step_size);
265
266
269
272
276 "_MY_REFINEMENT_LEVEL",
sizeof(
BitRefLevel), MB_TYPE_OPAQUE,
277 th_my_ref_level, MB_TAG_CREAT | MB_TAG_SPARSE | MB_TAG_BYTES,
278 &def_bit_level);
281 CHKERR m_field.
get_moab().tag_get_by_ptr(th_my_ref_level, &root_meshset, 1,
282 (const void **)&ptr_bit_level0);
285
286 if (step == 1) {
287
288
291
292 std::vector<BitRefLevel> bit_levels;
294
295 int ll = 1;
296
299 CHKERR PetscPrintf(PETSC_COMM_WORLD,
"Insert Interface %d\n",
300 cit->getMeshsetId());
302 {
303
305 CHKERR moab.create_meshset(MESHSET_SET, ref_level_meshset);
307 ->getEntitiesByTypeAndRefLevel(bit_levels.back(),
309 ref_level_meshset);
311 ->getEntitiesByTypeAndRefLevel(bit_levels.back(),
313 ref_level_meshset);
314 Range ref_level_tets;
315 CHKERR moab.get_entities_by_handle(ref_level_meshset, ref_level_tets,
316 true);
317
318 CHKERR interface_ptr->
getSides(cubit_meshset, bit_levels.back(),
true,
319 0);
320
322
324 cubit_meshset, true, true, 0);
325
326 CHKERR moab.delete_entities(&ref_level_meshset, 1);
327 }
328
332 ->updateMeshsetByEntitiesChildren(cubit_meshset,
333 bit_levels.back(),
334 cubit_meshset, MBMAXTYPE, true);
335 }
336 }
337
338 bit_level0 = bit_levels.back();
339 problem_bit_level = bit_level0;
340
341
342
343
344
348
350
351
354
355
357
358
360 "DISPLACEMENT");
362 "DISPLACEMENT");
364 "DISPLACEMENT");
366 "ELASTIC", "MESH_NODE_POSITIONS");
369
371
372
375 "DISPLACEMENT");
377 "DISPLACEMENT");
379 "DISPLACEMENT");
381 "INTERFACE", "MESH_NODE_POSITIONS");
382
383
385
386
388 "LAMBDA");
390 "LAMBDA");
391
392
395
396
398
399
401 "ELASTIC");
403 "INTERFACE");
405 "ARC_LENGTH");
406
408 problem_bit_level);
409
410
411
412
413
417
418
420 problem_bit_level,
BitRefLevel().set(),
"ELASTIC", MBTET);
422 problem_bit_level,
BitRefLevel().set(),
"INTERFACE", MBPRISM);
423
424
425 {
426
428 {
429 const double coords[] = {0, 0, 0};
431 Range range_no_field_vertex;
432 range_no_field_vertex.insert(no_field_vertex);
435
438 range_no_field_vertex);
439 }
440
442 {
443 CHKERR moab.create_meshset(MESHSET_SET, meshset_fe_arc_length);
444 CHKERR moab.add_entities(meshset_fe_arc_length, &no_field_vertex, 1);
447 }
448
450 meshset_fe_arc_length, "ARC_LENGTH", false);
451 }
452
453
454
455
460
465
470
471
474
476 "FORCE_FE");
478 "PRESSURE_FE");
482
484 "LAMBDA");
486 "LAMBDA");
488 "LAMBDA");
491 "DISPLACEMENT");
493 "DISPLACEMENT");
495 "DISPLACEMENT");
497 "BODY_FORCE");
498
502 CHKERR m_field.
get_moab().get_entities_by_type(it->meshset, MBTET, tets,
503 true);
505 "BODY_FORCE");
506 }
507 }
508
509
510
511
512
515 "MESH_NODE_POSITIONS");
517
518
520
521
523
524
527
529
533
535
536
541
543
544
545 Vec
F, F_body_force,
D;
547 "ELASTIC_MECHANICS",
COL, &
F);
549 CHKERR VecDuplicate(
F, &F_body_force);
550 Mat Aij;
552 ->createMPIAIJWithArrays<PetscGlobalIdx_mi_tag>("ELASTIC_MECHANICS",
553 &Aij);
554
555
558
559 boost::ptr_vector<CohesiveInterfaceElement::PhysicalEquation>
560 interface_materials;
561
562
563
565 cout << std::endl << *it << std::endl;
566
567
568 string name = it->getName();
569
570 if (name.compare(0, 11, "MAT_ELASTIC") == 0) {
572 CHKERR it->getAttributeDataStructure(mydata);
573 cout << mydata;
576 } else if (name.compare(0, 10, "MAT_INTERF") == 0) {
578 CHKERR it->getAttributeDataStructure(mydata);
579 cout << mydata;
580
581 interface_materials.push_back(
583 interface_materials.back().h = 1;
584 interface_materials.back().youngModulus = mydata.
data.alpha;
585 interface_materials.back().beta = mydata.data.beta;
586 interface_materials.back().ft = mydata.data.ft;
587 interface_materials.back().Gf = mydata.data.Gf;
588
591 rval = moab.get_entities_by_type(meshset, MBTRI, tris,
true);
594 rval = moab.get_adjacencies(tris, 3,
false, ents3d,
595 moab::Interface::UNION);
597 interface_materials.back().pRisms = ents3d.subset_by_type(MBPRISM);
598 }
599 }
600
601 {
602 boost::ptr_vector<CohesiveInterfaceElement::PhysicalEquation>::iterator
603 pit = interface_materials.begin();
604 for (; pit != interface_materials.end(); pit++) {
606 }
607 }
608
609 boost::shared_ptr<ArcLengthCtx> arc_ctx = boost::shared_ptr<ArcLengthCtx>(
611 boost::scoped_ptr<ArcLengthElement> my_arc_method_ptr(
613 ArcLengthSnesCtx snes_ctx(m_field, "ELASTIC_MECHANICS", arc_ctx);
615
618 &my_dirichlet_bc.problemPtr);
619 CHKERR my_dirichlet_bc.iNitialize();
620 boost::shared_ptr<Hooke<adouble>> hooke_adouble_ptr(
new Hooke<adouble>);
621 boost::shared_ptr<Hooke<double>> hooke_double_ptr(
new Hooke<double>);
623 {
624 int id = 0;
625 elastic.setOfBlocks[id].iD = id;
628 elastic.setOfBlocks[id].materialDoublePtr = hooke_double_ptr;
629 elastic.setOfBlocks[id].materialAdoublePtr = hooke_adouble_ptr;
632 elastic.setOfBlocks[id].tEts, true);
634 false, false, false);
636 false, false, false);
638 false, false, false);
639 CHKERR elastic.setOperators(
"DISPLACEMENT",
"MESH_NODE_POSITIONS",
false,
640 true);
641 }
643 CHKERR cohesive_elements.addOps(
"DISPLACEMENT", interface_materials);
644
646 CHKERR MatGetSize(Aij, &M, &
N);
648 MatGetLocalSize(Aij, &
m, &
n);
649 boost::scoped_ptr<ArcLengthMatShell> mat_ctx(
651 Mat ShellAij;
652 CHKERR MatCreateShell(PETSC_COMM_WORLD,
m,
n, M,
N, (
void *)mat_ctx.get(),
653 &ShellAij);
654 CHKERR MatShellSetOperation(ShellAij, MATOP_MULT,
656
657
661 CHKERR body_forces_methods.addBlock(
"DISPLACEMENT", F_body_force,
662 it->getMeshsetId());
663 }
664 CHKERR VecZeroEntries(F_body_force);
665 CHKERR VecGhostUpdateBegin(F_body_force, INSERT_VALUES, SCATTER_FORWARD);
666 CHKERR VecGhostUpdateEnd(F_body_force, INSERT_VALUES, SCATTER_FORWARD);
668 body_forces_methods.getLoopFe());
669 CHKERR VecGhostUpdateBegin(F_body_force, ADD_VALUES, SCATTER_REVERSE);
670 CHKERR VecGhostUpdateEnd(F_body_force, ADD_VALUES, SCATTER_REVERSE);
671 CHKERR VecAssemblyBegin(F_body_force);
672 CHKERR VecAssemblyEnd(F_body_force);
673
674
675 boost::ptr_map<std::string, NeumannForcesSurface> neumann_forces;
676 string fe_name_str = "FORCE_FE";
679 neumann_forces.at(fe_name_str).getLoopFe(), false,
680 false);
682 it)) {
683 CHKERR neumann_forces.at(fe_name_str)
684 .addForce("DISPLACEMENT", arc_ctx->F_lambda, it->getMeshsetId());
685 }
686 fe_name_str = "PRESSURE_FE";
689 neumann_forces.at(fe_name_str).getLoopFe(), false,
690 false);
693 CHKERR neumann_forces.at(fe_name_str)
694 .addPressure("DISPLACEMENT", arc_ctx->F_lambda, it->getMeshsetId());
695 }
696
697 boost::ptr_map<std::string, NodalForce> nodal_forces;
698 fe_name_str = "FORCE_FE";
699 nodal_forces.insert(fe_name_str,
new NodalForce(m_field));
701 it)) {
702 CHKERR nodal_forces.at(fe_name_str)
703 .addForce("DISPLACEMENT", arc_ctx->F_lambda, it->getMeshsetId());
704 }
705
706 SNES snes;
707 CHKERR SNESCreate(PETSC_COMM_WORLD, &snes);
708 CHKERR SNESSetApplicationContext(snes, &snes_ctx);
710 CHKERR SNESSetJacobian(snes, ShellAij, Aij,
SnesMat, &snes_ctx);
711 CHKERR SNESSetFromOptions(snes);
712
713 KSP ksp;
714 CHKERR SNESGetKSP(snes, &ksp);
715 PC pc;
716 CHKERR KSPGetPC(ksp, &pc);
717 boost::scoped_ptr<PCArcLengthCtx> pc_ctx(
719 CHKERR PCSetType(pc, PCSHELL);
720 CHKERR PCShellSetContext(pc, pc_ctx.get());
723
724
725 SnesCtx::FEMethodsSequence &loops_to_do_Rhs =
726 snes_ctx.getComputeRhs();
727 snes_ctx.getPreProcComputeRhs().push_back(&my_dirichlet_bc);
728 snes_ctx.getPreProcComputeRhs().push_back(&pre_post_proc_fe);
729 loops_to_do_Rhs.push_back(SnesCtx::PairNameFEMethodPtr(
730 "INTERFACE", &cohesive_elements.getFeRhs()));
731 loops_to_do_Rhs.push_back(
732 SnesCtx::PairNameFEMethodPtr("ELASTIC", &elastic.getLoopFeRhs()));
733 loops_to_do_Rhs.push_back(
734 SnesCtx::PairNameFEMethodPtr("ARC_LENGTH", my_arc_method_ptr.get()));
735 snes_ctx.getPostProcComputeRhs().push_back(&pre_post_proc_fe);
736 snes_ctx.getPostProcComputeRhs().push_back(&my_dirichlet_bc);
737
738
739 SnesCtx::FEMethodsSequence &loops_to_do_Mat =
740 snes_ctx.getSetOperators();
741 snes_ctx.getPreProcSetOperators().push_back(&my_dirichlet_bc);
742 loops_to_do_Mat.push_back(SnesCtx::PairNameFEMethodPtr(
743 "INTERFACE", &cohesive_elements.getFeLhs()));
744 loops_to_do_Mat.push_back(
745 SnesCtx::PairNameFEMethodPtr("ELASTIC", &elastic.getLoopFeLhs()));
746 loops_to_do_Mat.push_back(
747 SnesCtx::PairNameFEMethodPtr("ARC_LENGTH", my_arc_method_ptr.get()));
748 snes_ctx.getPostProcSetOperators().push_back(&my_dirichlet_bc);
749
750 double gamma = 0.5, reduction = 1;
751
752 if (step == 1) {
753 step_size = step_size_reduction;
754 } else {
755 reduction = step_size_reduction;
756 step++;
757 }
758
759 boost::ptr_map<std::string, NeumannForcesSurface>::iterator mit =
760 neumann_forces.begin();
761 CHKERR VecZeroEntries(arc_ctx->F_lambda);
762 CHKERR VecGhostUpdateBegin(arc_ctx->F_lambda, INSERT_VALUES,
763 SCATTER_FORWARD);
764 CHKERR VecGhostUpdateEnd(arc_ctx->F_lambda, INSERT_VALUES, SCATTER_FORWARD);
765 for (; mit != neumann_forces.end(); mit++) {
767 mit->second->getLoopFe());
768 }
769 CHKERR VecGhostUpdateBegin(arc_ctx->F_lambda, ADD_VALUES, SCATTER_REVERSE);
770 CHKERR VecGhostUpdateEnd(arc_ctx->F_lambda, ADD_VALUES, SCATTER_REVERSE);
771 CHKERR VecAssemblyBegin(arc_ctx->F_lambda);
772 CHKERR VecAssemblyEnd(arc_ctx->F_lambda);
773 for (std::vector<int>::iterator vit = my_dirichlet_bc.dofsIndices.begin();
774 vit != my_dirichlet_bc.dofsIndices.end(); vit++) {
775 CHKERR VecSetValue(arc_ctx->F_lambda, *vit, 0, INSERT_VALUES);
776 }
777 CHKERR VecAssemblyBegin(arc_ctx->F_lambda);
778 CHKERR VecAssemblyEnd(arc_ctx->F_lambda);
779
780 CHKERR VecDot(arc_ctx->F_lambda, arc_ctx->F_lambda, &arc_ctx->F_lambda2);
781 PetscPrintf(PETSC_COMM_WORLD, "\tFlambda2 = %6.4e\n", arc_ctx->F_lambda2);
782
783 if (step > 1) {
785 "ELASTIC_MECHANICS",
COL,
D, INSERT_VALUES, SCATTER_FORWARD);
787 "ELASTIC_MECHANICS",
"DISPLACEMENT",
"X0_DISPLACEMENT",
COL,
788 arc_ctx->x0, INSERT_VALUES, SCATTER_FORWARD);
789 double x0_nrm;
790 CHKERR VecNorm(arc_ctx->x0, NORM_2, &x0_nrm);
791 CHKERR PetscPrintf(PETSC_COMM_WORLD,
792 "\tRead x0_nrm = %6.4e dlambda = %6.4e\n", x0_nrm,
793 arc_ctx->dLambda);
794 CHKERR arc_ctx->setAlphaBeta(1, 0);
795 } else {
797 CHKERR arc_ctx->setAlphaBeta(0, 1);
798 }
800
802 CHKERR post_proc.generateReferenceElementMesh();
803 CHKERR post_proc.addFieldValuesPostProc(
"DISPLACEMENT");
804 CHKERR post_proc.addFieldValuesGradientPostProc(
"DISPLACEMENT");
805
807 m_field, post_proc.postProcMesh, post_proc.mapGaussPts, "DISPLACEMENT",
808 post_proc.commonData));
809
810 bool converged_state = false;
811 for (; step < max_steps; step++) {
812
813 if (step == 1) {
814 CHKERR PetscPrintf(PETSC_COMM_WORLD,
"Load Step %D step_size = %6.4e\n",
815 step, step_size);
816 CHKERR arc_ctx->setS(step_size);
817 CHKERR arc_ctx->setAlphaBeta(0, 1);
818 CHKERR VecCopy(
D, arc_ctx->x0);
819 double dlambda;
820 CHKERR my_arc_method_ptr->calculate_init_dlambda(&dlambda);
821 CHKERR my_arc_method_ptr->set_dlambda_to_x(
D, dlambda);
822 } else if (step == 2) {
823 CHKERR arc_ctx->setAlphaBeta(1, 0);
824 CHKERR my_arc_method_ptr->calculate_dx_and_dlambda(
D);
825 CHKERR my_arc_method_ptr->calculate_lambda_int(step_size);
826 CHKERR arc_ctx->setS(step_size);
827 double dlambda = arc_ctx->dLambda;
828 double dx_nrm;
829 CHKERR VecNorm(arc_ctx->dx, NORM_2, &dx_nrm);
830 CHKERR PetscPrintf(PETSC_COMM_WORLD,
831 "Load Step %D step_size = %6.4e dlambda0 = %6.4e "
832 "dx_nrm = %6.4e dx2 = %6.4e\n",
833 step, step_size, dlambda, dx_nrm, arc_ctx->dx2);
834 CHKERR VecCopy(
D, arc_ctx->x0);
835 CHKERR VecAXPY(
D, 1., arc_ctx->dx);
836 CHKERR my_arc_method_ptr->set_dlambda_to_x(
D, dlambda);
837 } else {
838 CHKERR my_arc_method_ptr->calculate_dx_and_dlambda(
D);
839 CHKERR my_arc_method_ptr->calculate_lambda_int(step_size);
840
841
842 step_size *= reduction;
843 CHKERR arc_ctx->setS(step_size);
844 double dlambda = reduction * arc_ctx->dLambda;
845 CHKERR VecScale(arc_ctx->dx, reduction);
846 double dx_nrm;
847 CHKERR VecNorm(arc_ctx->dx, NORM_2, &dx_nrm);
848 CHKERR PetscPrintf(PETSC_COMM_WORLD,
849 "Load Step %D step_size = %6.4e dlambda0 = %6.4e "
850 "dx_nrm = %6.4e dx2 = %6.4e\n",
851 step, step_size, dlambda, dx_nrm, arc_ctx->dx2);
852 CHKERR VecCopy(
D, arc_ctx->x0);
853 CHKERR VecAXPY(
D, 1., arc_ctx->dx);
854 CHKERR my_arc_method_ptr->set_dlambda_to_x(
D, dlambda);
855 }
856
857 CHKERR SNESSolve(snes, PETSC_NULL,
D);
858
859
861 "ELASTIC_MECHANICS",
COL,
D, INSERT_VALUES, SCATTER_REVERSE);
863 cohesive_elements.getFeHistory(), 0,
865
866 CHKERR my_arc_method_ptr->remove_damaged_prisms_nodes();
867
868 int its;
869 CHKERR SNESGetIterationNumber(snes, &its);
870 CHKERR PetscPrintf(PETSC_COMM_WORLD,
"number of Newton iterations = %D\n",
871 its);
872
873 SNESConvergedReason reason;
874 CHKERR SNESGetConvergedReason(snes, &reason);
875
876 if (reason < 0) {
877 CHKERR arc_ctx->setAlphaBeta(1, 0);
878 reduction = 0.1;
879 converged_state = false;
880 continue;
881 } else {
882 if (step > 1 && converged_state) {
883 reduction = pow((double)its_d / (double)(its + 1), gamma);
884 CHKERR PetscPrintf(PETSC_COMM_WORLD,
"reduction step_size = %6.4e\n",
885 reduction);
886 }
887
888
890 "ELASTIC_MECHANICS",
COL,
D, INSERT_VALUES, SCATTER_REVERSE);
892 "ELASTIC_MECHANICS",
"DISPLACEMENT",
"X0_DISPLACEMENT",
COL,
893 arc_ctx->x0, INSERT_VALUES, SCATTER_REVERSE);
894 converged_state = true;
895 }
896
897 if (reason > 0) {
898 FILE *datafile;
899 PetscFOpen(PETSC_COMM_SELF,
DATAFILENAME,
"a+", &datafile);
900 PetscFPrintf(PETSC_COMM_WORLD, datafile, "%d %d ", reason, its);
901 fclose(datafile);
902 CHKERR my_arc_method_ptr->postProcessLoadPath();
903 }
904
905 if (step % 1 == 0) {
906
908 post_proc);
909 std::ostringstream ss;
910 ss << "out_values_" << step << ".h5m";
911 CHKERR post_proc.writeFile(ss.str().c_str());
912 }
913 }
914
915
917 "ELASTIC_MECHANICS",
COL,
D, INSERT_VALUES, SCATTER_REVERSE);
918
919
922 CHKERR VecDestroy(&F_body_force);
924 CHKERR SNESDestroy(&snes);
925 CHKERR MatDestroy(&ShellAij);
926 }
928
930
931 return 0;
932}
#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 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 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_type(const EntityHandle entities, const EntityType type, const std::string &name, const bool recursive=true)=0
add entities to finite element
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 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.
#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.
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.