226 {
227
228 const string default_options = "-ksp_type fgmres \n"
229 "-pc_type lu \n"
230 "-pc_factor_mat_solver_type mumps \n"
231 "-mat_mumps_icntl_20 0 \n"
232 "-ksp_atol 1e-10 \n"
233 "-ksp_rtol 1e-10 \n"
234 "-snes_monitor \n"
235 "-snes_type newtonls \n"
236 "-snes_linesearch_type basic \n"
237 "-snes_max_it 100 \n"
238 "-snes_atol 1e-7 \n"
239 "-snes_rtol 1e-7 \n"
240 "-ts_monitor \n"
241 "-ts_type alpha \n";
242
243 string param_file = "param_file.petsc";
244 if (!static_cast<bool>(ifstream(param_file))) {
245 std::ofstream file(param_file.c_str(), std::ios::ate);
246 if (file.is_open()) {
247 file << default_options;
248 file.close();
249 }
250 }
251
253
254
255 auto core_log = logging::core::get();
256 core_log->add_sink(
260
261 try {
262
263 moab::Core mb_instance;
264 moab::Interface &moab = mb_instance;
265
266 ParallelComm *pcomm = ParallelComm::get_pcomm(&moab,
MYPCOMM_INDEX);
267 auto moab_comm_wrap =
268 boost::make_shared<WrapMPIComm>(PETSC_COMM_WORLD, false);
269 if (pcomm == NULL)
270 pcomm = new ParallelComm(&moab, moab_comm_wrap->get_comm());
271
274 PetscBool is_partitioned = PETSC_FALSE;
275 PetscBool linear = PETSC_TRUE;
276 PetscInt disp_order = 1;
277 PetscInt vel_order = 1;
278 PetscBool is_solve_at_time_zero = PETSC_FALSE;
279
280 auto read_command_line_parameters = [&]() {
282 PetscBool flg = PETSC_TRUE;
285 if (flg != PETSC_TRUE)
286 SETERRQ(PETSC_COMM_SELF, 1, "Error -my_file (mesh file needed)");
287
288
289
291 &is_partitioned, &flg);
292
294 PETSC_NULL);
295
296 enum bases { LEGENDRE, LOBATTO, BERNSTEIN_BEZIER, LASBASETOP };
297 const char *list_bases[] = {"legendre", "lobatto", "bernstein_bezier"};
298 PetscInt choice_base_value = BERNSTEIN_BEZIER;
300 LASBASETOP, &choice_base_value, PETSC_NULL);
301 if (choice_base_value == LEGENDRE)
303 else if (choice_base_value == LOBATTO)
305 else if (choice_base_value == BERNSTEIN_BEZIER)
307
309 &disp_order, &flg);
310 if (flg != PETSC_TRUE)
311 disp_order = 1;
312
314 &vel_order, &flg);
315 if (flg != PETSC_TRUE)
316 vel_order = disp_order;
317
319 "-my_solve_at_time_zero",
320 &is_solve_at_time_zero, &flg);
321
323 };
324
325 auto read_mesh = [&]() {
327 if (is_partitioned == PETSC_TRUE) {
328
329 const char *option;
330 option = "PARALLEL=BCAST_DELETE;"
331 "PARALLEL_RESOLVE_SHARED_ENTS;"
332 "PARTITION=PARALLEL_PARTITION;";
334 } else {
335 const char *option;
336 option = "";
338 }
340 };
341
342 CHKERR read_command_line_parameters();
344
347
348
350 bit_level0.set(0);
352 CHKERR moab.create_meshset(MESHSET_SET, meshset_level0);
354 0, 3, bit_level0);
357
358
366
367 bool check_if_spatial_field_exist = m_field.
check_field(
"DISPLACEMENT");
370
372
373
379 else
381
382
386
388 fluid_pressure_fe.addNeumannFluidPressureBCElements("DISPLACEMENT");
390 false, false);
391 fluid_pressure_fe.setNeumannFluidPressureFiniteElementOperators(
392 "DISPLACEMENT", PETSC_NULL, false, true);
393
394
397
403 else
405
414 disp_order);
415 else
417
426 else
428
429
432 CHKERR elastic_materials.setBlocks(elastic.setOfBlocks);
433
434
435
436
437
438 CHKERR elastic.addElement(
"ELASTIC",
"DISPLACEMENT");
440 false, false);
442 false, false);
444 false, false, false);
445 CHKERR elastic.setOperators(
"DISPLACEMENT",
"MESH_NODE_POSITIONS",
false,
446 true);
447
448
450
451 CHKERR elastic_materials.setBlocks(inertia.setOfBlocks);
452 CHKERR inertia.addConvectiveMassElement(
"MASS_ELEMENT",
"VELOCITY",
453 "DISPLACEMENT");
454 CHKERR inertia.addVelocityElement(
"VELOCITY_ELEMENT",
"VELOCITY",
455 "DISPLACEMENT");
456
457
458 {
459 string name = "-my_accelerogram";
460 char time_file_name[255];
461 PetscBool flg;
463 time_file_name, 255, &flg);
464 if (flg == PETSC_TRUE) {
466 }
467 }
468
469
471 CHKERR elastic_materials.setBlocks(damper.blockMaterialDataMap);
472 {
478 "DISPLACEMENT");
480 "DISPLACEMENT");
482 "DISPLACEMENT");
483
486 "DAMPER", "MESH_NODE_POSITIONS");
487 }
488 std::map<int, KelvinVoigtDamper::BlockMaterialData>::iterator
bit =
489 damper.blockMaterialDataMap.begin();
490 for (;
bit != damper.blockMaterialDataMap.end();
bit++) {
491 bit->second.lInear = linear;
494 damper.constitutiveEquationMap.insert(
496 material_data));
498 MBTET, "DAMPER");
499 }
500 CHKERR damper.setOperators(3);
501 }
502
504 elastic.getLoopFeEnergy(),
505 inertia.getLoopFeEnergy());
506
507
508
511 "DOT_DISPLACEMENT");
513 "DOT_VELOCITY");
514
515
517
518
519
520 if (!check_if_spatial_field_exist) {
522 "MESH_NODE_POSITIONS");
524 }
525
526
528
530
531
532 {
538 "FLUID_PRESSURE_FE");
540
543 if (is_partitioned) {
546 pcomm->size());
547 } else {
551 }
553 }
554
556
562 "FLUID_PRESSURE_FE");
564 "MASS_ELEMENT");
566 "VELOCITY_ELEMENT");
567
569
572 if (is_partitioned) {
575 pcomm->size());
576 } else {
580 }
582
588
589
590 TS ts;
591 CHKERR TSCreate(PETSC_COMM_WORLD, &ts);
592 CHKERR TSSetType(ts, TSBEULER);
593
594
598 ->createMPIAIJWithArrays<PetscGlobalIdx_mi_tag>("Kuu",
600 CHKERR MatDuplicate(shellAij_ctx->
K, MAT_DO_NOT_COPY_VALUES,
604 D,
"DYNAMICS",
COL, shellAij_ctx->
u,
"Kuu",
COL,
607 D,
"DYNAMICS",
"VELOCITY",
COL, shellAij_ctx->
v,
"Kuu",
"DISPLACEMENT",
609 Mat shell_Aij;
615 problem_ptr->
getNbDofsRow(), (
void *)shellAij_ctx, &shell_Aij);
616 CHKERR MatShellSetOperation(shell_Aij, MATOP_MULT,
618 CHKERR MatShellSetOperation(
619 shell_Aij, MATOP_ZERO_ENTRIES,
621
622 ConvectiveMassElement::ShellMatrixElement shell_matrix_element(m_field);
624 m_field,
"DISPLACEMENT", shellAij_ctx->
barK, PETSC_NULL, PETSC_NULL);
627 shell_matrix_element.problemName = "Kuu";
628 shell_matrix_element.shellMatCtx = shellAij_ctx;
629 shell_matrix_element.DirichletBcPtr = &shell_dirichlet_bc;
630 shell_matrix_element.loopK.push_back(
631 ConvectiveMassElement::ShellMatrixElement::PairNameFEMethodPtr(
632 "ELASTIC", &elastic.getLoopFeLhs()));
633
634 shell_matrix_element.loopK.push_back(
635 ConvectiveMassElement::ShellMatrixElement::PairNameFEMethodPtr(
636 "ELASTIC", &damper.feLhs));
637
638 CHKERR inertia.addHOOpsVol();
639 CHKERR inertia.setShellMatrixMassOperators(
"VELOCITY",
"DISPLACEMENT",
640 "MESH_NODE_POSITIONS", linear);
641
642
643
644 shell_matrix_element.loopM.push_back(
645 ConvectiveMassElement::ShellMatrixElement::PairNameFEMethodPtr(
646 "ELASTIC", &inertia.getLoopFeMassLhs()));
647
648
649 shell_matrix_element.loopAuxM.push_back(
650 ConvectiveMassElement::ShellMatrixElement::PairNameFEMethodPtr(
651 "ELASTIC", &inertia.getLoopFeMassAuxLhs()));
652
653
655 shell_matrix_residual.shellMatCtx = shellAij_ctx;
656
657
658 boost::ptr_map<std::string, NeumannForcesSurface> surface_forces;
659 {
660 string fe_name_str = "FORCE_FE";
663 surface_forces.at(fe_name_str).getLoopFe(), false,
664 false);
667 CHKERR surface_forces.at(fe_name_str)
668 .addForce("DISPLACEMENT", PETSC_NULL, it->getMeshsetId(), true);
669 surface_forces.at(fe_name_str)
671 }
672 }
673
674 boost::ptr_map<std::string, NeumannForcesSurface> surface_pressure;
675 {
676 string fe_name_str = "PRESSURE_FE";
679 surface_pressure.at(fe_name_str).getLoopFe(), false,
680 false);
683 CHKERR surface_pressure.at(fe_name_str)
684 .addPressure("DISPLACEMENT", PETSC_NULL, it->getMeshsetId(), true);
685 surface_pressure.at(fe_name_str)
687 }
688 }
689
690
691 boost::ptr_map<std::string, EdgeForce> edge_forces;
692 {
693 string fe_name_str = "FORCE_FE";
694 edge_forces.insert(fe_name_str,
new EdgeForce(m_field));
697 CHKERR edge_forces.at(fe_name_str)
698 .addForce("DISPLACEMENT", PETSC_NULL, it->getMeshsetId(), true);
699 edge_forces.at(fe_name_str).methodsOp.push_back(
new TimeForceScale());
700 }
701 }
702
703
704 boost::ptr_map<std::string, NodalForce> nodal_forces;
705 {
706 string fe_name_str = "FORCE_FE";
707 nodal_forces.insert(fe_name_str,
new NodalForce(m_field));
710 CHKERR nodal_forces.at(fe_name_str)
711 .addForce(
"DISPLACEMENT",
F, it->getMeshsetId(),
true);
712 nodal_forces.at(fe_name_str).methodsOp.push_back(
new TimeForceScale());
713 }
714 }
715
718 m_field, ts, "VELOCITY", "DISPLACEMENT");
719
720
722
723
724
727
728
730
731 auto add_static_rhs = [&](auto &loops_to_do_Rhs) {
733 loops_to_do_Rhs.push_back(
735 for (auto fit = surface_forces.begin(); fit != surface_forces.end();
736 fit++) {
737 loops_to_do_Rhs.push_back(
739 }
740 for (auto fit = surface_pressure.begin(); fit != surface_pressure.end();
741 fit++) {
742 loops_to_do_Rhs.push_back(
744 }
745 for (auto fit = edge_forces.begin(); fit != edge_forces.end(); fit++) {
746 loops_to_do_Rhs.push_back(
748 }
749 for (auto fit = nodal_forces.begin(); fit != nodal_forces.end(); fit++) {
750 loops_to_do_Rhs.push_back(
752 }
754 "FLUID_PRESSURE_FE", &fluid_pressure_fe.getLoopFe()));
756 };
757
758 CHKERR add_static_rhs(loops_to_do_Rhs);
759
761 loops_to_do_Rhs.push_back(
763
764
765
767
769
770
771
775
778 loopsMonitor.push_back(
780 loopsMonitor.push_back(
782
785
787
788 double ftime = 1;
789 CHKERR TSSetDuration(ts, PETSC_DEFAULT, ftime);
791 CHKERR TSSetFromOptions(ts);
792
793 SNES snes;
794 CHKERR TSGetSNES(ts, &snes);
795
796 KSP ksp;
797 CHKERR SNESGetKSP(snes, &ksp);
798 CHKERR KSPSetFromOptions(ksp);
799 PC pc;
800 CHKERR KSPGetPC(ksp, &pc);
801 CHKERR PCSetType(pc, PCSHELL);
803 CHKERR PCShellSetContext(pc, (
void *)&pc_shell_ctx);
807
809 CHKERR VecGhostUpdateBegin(
D, INSERT_VALUES, SCATTER_FORWARD);
810 CHKERR VecGhostUpdateEnd(
D, INSERT_VALUES, SCATTER_FORWARD);
812 "DYNAMICS",
COL,
D, INSERT_VALUES, SCATTER_REVERSE);
813
814
815 if (is_solve_at_time_zero) {
816
817 Mat Aij = shellAij_ctx->
K;
822
823
825 "Kuu",
COL,
D, INSERT_VALUES, SCATTER_FORWARD);
826 CHKERR VecGhostUpdateBegin(
D, INSERT_VALUES, SCATTER_FORWARD);
827 CHKERR VecGhostUpdateEnd(
D, INSERT_VALUES, SCATTER_FORWARD);
828
829 SnesCtx snes_ctx(m_field,
"Kuu");
830
831 SNES snes;
832 CHKERR SNESCreate(PETSC_COMM_WORLD, &snes);
833 CHKERR SNESSetApplicationContext(snes, &snes_ctx);
836 CHKERR SNESSetFromOptions(snes);
837
840
841 SnesCtx::FEMethodsSequence &loops_to_do_Rhs =
842 snes_ctx.getComputeRhs();
843 snes_ctx.getPreProcComputeRhs().push_back(&my_dirichlet_bc);
844 fluid_pressure_fe.getLoopFe().ts_t = 0;
845 CHKERR add_static_rhs(loops_to_do_Rhs);
846 snes_ctx.getPostProcComputeRhs().push_back(&my_dirichlet_bc);
847
848 SnesCtx::FEMethodsSequence &loops_to_do_Mat =
849 snes_ctx.getSetOperators();
850 snes_ctx.getPreProcSetOperators().push_back(&my_dirichlet_bc);
851 loops_to_do_Mat.push_back(
852 SnesCtx::PairNameFEMethodPtr("ELASTIC", &elastic.getLoopFeLhs()));
853 snes_ctx.getPostProcSetOperators().push_back(&my_dirichlet_bc);
854
857 "DOT_DISPLACEMENT");
859
861 "Kuu",
COL,
D, INSERT_VALUES, SCATTER_FORWARD);
862
863 CHKERR SNESSolve(snes, PETSC_NULL,
D);
864 int its;
865 CHKERR SNESGetIterationNumber(snes, &its);
866 MOFEM_LOG_C(
"DYNAMIC", Sev::inform,
"number of Newton iterations = %d\n",
867 its);
868
869
871 "Kuu",
COL,
D, INSERT_VALUES, SCATTER_REVERSE);
872
875 CHKERR SNESDestroy(&snes);
876 }
877
878 if (is_solve_at_time_zero) {
880 "DYNAMICS",
COL,
D, INSERT_VALUES, SCATTER_FORWARD);
881 CHKERR VecGhostUpdateBegin(
D, INSERT_VALUES, SCATTER_FORWARD);
882 CHKERR VecGhostUpdateEnd(
D, INSERT_VALUES, SCATTER_FORWARD);
884 }
885
886#if PETSC_VERSION_GE(3, 7, 0)
887 CHKERR TSSetExactFinalTime(ts, TS_EXACTFINALTIME_STEPOVER);
888#endif
890 CHKERR TSGetTime(ts, &ftime);
891
892 PetscInt steps, snesfails, rejects, nonlinits, linits;
893 CHKERR TSGetTimeStepNumber(ts, &steps);
894 CHKERR TSGetSNESFailures(ts, &snesfails);
895 CHKERR TSGetStepRejections(ts, &rejects);
896 CHKERR TSGetSNESIterations(ts, &nonlinits);
897 CHKERR TSGetKSPIterations(ts, &linits);
899 "steps %d (%d rejected, %D SNES fails), ftime %g, nonlinits "
900 "%d, linits %D\n",
901 steps, rejects, snesfails, ftime, nonlinits, linits);
903
906 CHKERR MatDestroy(&shellAij_ctx->
K);
907 CHKERR MatDestroy(&shellAij_ctx->
M);
910 CHKERR MatDestroy(&shell_Aij);
911 delete shellAij_ctx;
912 }
914
916
917 return 0;
918}
#define MOFEM_LOG_C(channel, severity, format,...)
#define CATCH_ERRORS
Catch errors.
FieldApproximationBase
approximation base
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base nme:nme847.
@ AINSWORTH_BERNSTEIN_BEZIER_BASE
#define MYPCOMM_INDEX
default communicator number PCOMM
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#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 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 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 bool check_field(const std::string &name) const =0
check if field is in database
static LoggerType & setLog(const std::string channel)
Set ans resset chanel logger.
#define MOFEM_LOG_TAG(channel, tag)
Tag channel.
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.
#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 buildProblemOnDistributedMesh(const std::string name, const bool square_matrix, int verb=VERBOSE)
build problem data structures, assuming that mesh is distributed (collective)
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
std::bitset< BITREFLEVEL_SIZE > BitRefLevel
Bit structure attached to each entity identifying to what mesh entity is attached.
PetscErrorCode TsSetIJacobian(TS ts, PetscReal t, Vec u, Vec u_t, PetscReal a, Mat A, Mat B, void *ctx)
Set function evaluating jacobian in TS solver.
PetscErrorCode TsMonitorSet(TS ts, PetscInt step, PetscReal t, Vec u, void *ctx)
Set monitor for TS solver.
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 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 addHOOpsFace3D(const std::string field, E &e, bool hcurl, bool hdiv)
PetscErrorCode TsSetIFunction(TS ts, PetscReal t, Vec u, Vec u_t, Vec F, void *ctx)
Set IFunction for TS solver.
PetscErrorCode PetscOptionsGetEList(PetscOptions *, const char pre[], const char name[], const char *const *list, PetscInt next, PetscInt *value, 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)
structure grouping operators and data used for calculation of mass (convective) element \ nonlinear_e...
static MoFEMErrorCode MultOpA(Mat A, Vec x, Vec f)
Mult operator for shell matrix.
static MoFEMErrorCode ZeroEntriesOp(Mat A)
static MoFEMErrorCode PCShellDestroy(PC pc)
static MoFEMErrorCode PCShellApplyOp(PC pc, Vec f, Vec x)
apply pre-conditioner for shell matrix
static MoFEMErrorCode PCShellSetUpOp(PC pc)
Set Dirichlet boundary conditions on displacements.
Force on edges and lines.
Manage setting parameters and constitutive equations for nonlinear/linear elastic materials.
Dumper material parameters.
Common data for nonlinear_elastic_elem model.
string spatialPositionNameDot
string spatialPositionName
Constitutive model functions.
Implementation of Kelvin Voigt Damper.
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.
static boost::shared_ptr< SinkType > createSink(boost::shared_ptr< std::ostream > stream_ptr, std::string comm_filter)
Create a sink object.
static boost::shared_ptr< std::ostream > getStrmWorld()
Get the strm world object.
Matrix manager is used to build and partition problems.
keeps basic data about problem
DofIdx getNbLocalDofsRow() const
DofIdx getNbDofsRow() const
DofIdx getNbLocalDofsCol() const
Problem manager is used to build and partition problems.
Projection of edge entities with one mid-node on hierarchical basis.
Interface for nonlinear (SNES) solver.
Interface for Time Stepping (TS) solver.
BasicMethodsSequence & getPostProcessIJacobian()
Get the postProcess to do IJacobian object.
MoFEM::FEMethodsSequence FEMethodsSequence
FEMethodsSequence & getLoopsMonitor()
Get the loops to do Monitor object.
BasicMethodsSequence & getPostProcessIFunction()
Get the postProcess to do IFunction object.
FEMethodsSequence & getLoopsIFunction()
Get the loops to do IFunction object.
BasicMethodsSequence & getPreProcessIFunction()
Get the preProcess to do IFunction object.
BasicMethodsSequence & getPreProcessIJacobian()
Get the preProcess to do IJacobian object.
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
Force scale operator for reading two columns.