244 {
245
246 const string default_options = "-ksp_type fgmres \n"
247 "-pc_type lu \n"
248 "-pc_factor_mat_solver_type mumps \n"
249 "-mat_mumps_icntl_20 0 \n"
250 "-ksp_atol 1e-10 \n"
251 "-ksp_rtol 1e-10 \n"
252 "-snes_monitor \n"
253 "-snes_type newtonls \n"
254 "-snes_linesearch_type basic \n"
255 "-snes_max_it 100 \n"
256 "-snes_atol 1e-7 \n"
257 "-snes_rtol 1e-7 \n"
258 "-ts_monitor \n"
259 "-ts_type alpha \n";
260
261 string param_file = "param_file.petsc";
262 if (!static_cast<bool>(ifstream(param_file))) {
263 std::ofstream
file(param_file.c_str(), std::ios::ate);
264 if (
file.is_open()) {
265 file << default_options;
267 }
268 }
269
271
272
273 auto core_log = logging::core::get();
274 core_log->add_sink(
278
279 try {
280
281 moab::Core mb_instance;
282 moab::Interface &moab = mb_instance;
283
284 ParallelComm *pcomm = ParallelComm::get_pcomm(&moab,
MYPCOMM_INDEX);
285 auto moab_comm_wrap =
286 boost::make_shared<WrapMPIComm>(PETSC_COMM_WORLD, false);
287 if (pcomm == NULL)
288 pcomm = new ParallelComm(&moab, moab_comm_wrap->get_comm());
289
291 char mesh_file_name[255];
292 PetscBool is_partitioned = PETSC_FALSE;
293 PetscBool linear = PETSC_TRUE;
294 PetscInt disp_order = 1;
295 PetscInt vel_order = 1;
296 PetscBool is_solve_at_time_zero = PETSC_FALSE;
297
298 auto read_command_line_parameters = [&]() {
300 PetscBool flg = PETSC_TRUE;
302 mesh_file_name, 255, &flg);
303 if (flg != PETSC_TRUE)
304 SETERRQ(PETSC_COMM_SELF, 1, "Error -my_file (mesh file needed)");
305
306
307
309 &is_partitioned, &flg);
310
312 PETSC_NULLPTR);
313
314 enum bases { LEGENDRE, LOBATTO, BERNSTEIN_BEZIER, LASBASETOP };
315 const char *list_bases[] = {"legendre", "lobatto", "bernstein_bezier"};
316 PetscInt choice_base_value = BERNSTEIN_BEZIER;
318 LASBASETOP, &choice_base_value, PETSC_NULLPTR);
319 if (choice_base_value == LEGENDRE)
321 else if (choice_base_value == LOBATTO)
323 else if (choice_base_value == BERNSTEIN_BEZIER)
325
327 &disp_order, &flg);
328 if (flg != PETSC_TRUE)
329 disp_order = 1;
330
332 &vel_order, &flg);
333 if (flg != PETSC_TRUE)
334 vel_order = disp_order;
335
337 "-my_solve_at_time_zero",
338 &is_solve_at_time_zero, &flg);
339
341 };
342
345 if (is_partitioned == PETSC_TRUE) {
346
347 const char *option;
348 option = "PARALLEL=BCAST_DELETE;"
349 "PARALLEL_RESOLVE_SHARED_ENTS;"
350 "PARTITION=PARALLEL_PARTITION;";
351 CHKERR moab.load_file(mesh_file_name, 0, option);
352 } else {
353 const char *option;
354 option = "";
355 CHKERR moab.load_file(mesh_file_name, 0, option);
356 }
358 };
359
360 CHKERR read_command_line_parameters();
362
365
366
368 bit_level0.set(0);
369 EntityHandle meshset_level0;
370 CHKERR moab.create_meshset(MESHSET_SET, meshset_level0);
372 0, 3, bit_level0);
375
376
384
385 bool check_if_spatial_field_exist = m_field.
check_field(
"DISPLACEMENT");
388
390
391
397 else
399
400
404
406 fluid_pressure_fe.addNeumannFluidPressureBCElements("DISPLACEMENT");
408 fluid_pressure_fe.getLoopFe().getOpPtrVector(), {},
409 "MESH_NODE_POSITIONS");
410 fluid_pressure_fe.setNeumannFluidPressureFiniteElementOperators(
411 "DISPLACEMENT", PETSC_NULLPTR, false, true);
412
413
416
422 else
424
433 disp_order);
434 else
436
445 else
447
448
451 CHKERR elastic_materials.setBlocks(elastic.setOfBlocks);
452
453
454
455
456
457 CHKERR elastic.addElement(
"ELASTIC",
"DISPLACEMENT");
459 "MESH_NODE_POSITIONS");
461 "MESH_NODE_POSITIONS");
463 elastic.getLoopFeEnergy().getOpPtrVector(), {H1},
464 "MESH_NODE_POSITIONS");
465 CHKERR elastic.setOperators(
"DISPLACEMENT",
"MESH_NODE_POSITIONS",
false,
466 true);
467
468
470
471 CHKERR elastic_materials.setBlocks(inertia.setOfBlocks);
472 CHKERR inertia.addConvectiveMassElement(
"MASS_ELEMENT",
"VELOCITY",
473 "DISPLACEMENT");
474 CHKERR inertia.addVelocityElement(
"VELOCITY_ELEMENT",
"VELOCITY",
475 "DISPLACEMENT");
476
477
478 {
479 string name = "-my_accelerogram";
480 char time_file_name[255];
481 PetscBool flg;
483 time_file_name, 255, &flg);
484 if (flg == PETSC_TRUE) {
486 }
487 }
488
489
491 CHKERR elastic_materials.setBlocks(damper.blockMaterialDataMap);
492 {
498 "DISPLACEMENT");
500 "DISPLACEMENT");
502 "DISPLACEMENT");
503
506 "DAMPER", "MESH_NODE_POSITIONS");
507 }
508 std::map<int, KelvinVoigtDamper::BlockMaterialData>::iterator
bit =
509 damper.blockMaterialDataMap.begin();
510 for (;
bit != damper.blockMaterialDataMap.end();
bit++) {
511 bit->second.lInear = linear;
514 damper.constitutiveEquationMap.insert(
516 material_data));
518 MBTET, "DAMPER");
519 }
520 CHKERR damper.setOperators(3);
521 }
522
524 elastic.getLoopFeEnergy(),
525 inertia.getLoopFeEnergy());
526
527
528
531 "DOT_DISPLACEMENT");
533 "DOT_VELOCITY");
534
535
537
538
539
540 if (!check_if_spatial_field_exist) {
542 "MESH_NODE_POSITIONS");
544 }
545
546
548
550
551
552 {
558 "FLUID_PRESSURE_FE");
560
563 if (is_partitioned) {
566 pcomm->size());
567 } else {
571 }
573 }
574
576
582 "FLUID_PRESSURE_FE");
584 "MASS_ELEMENT");
586 "VELOCITY_ELEMENT");
587
589
592 if (is_partitioned) {
595 pcomm->size());
596 } else {
600 }
602
608
609
610 TS ts;
611 CHKERR TSCreate(PETSC_COMM_WORLD, &ts);
612 CHKERR TSSetType(ts, TSBEULER);
613
614
618 ->createMPIAIJWithArrays<PetscGlobalIdx_mi_tag>("Kuu",
620 CHKERR MatDuplicate(shellAij_ctx->
K, MAT_DO_NOT_COPY_VALUES,
624 D,
"DYNAMICS",
COL, shellAij_ctx->
u,
"Kuu",
COL,
627 D,
"DYNAMICS",
"VELOCITY",
COL, shellAij_ctx->
v,
"Kuu",
"DISPLACEMENT",
629 Mat shell_Aij;
635 problem_ptr->
getNbDofsRow(), (
void *)shellAij_ctx, &shell_Aij);
636 CHKERR MatShellSetOperation(shell_Aij, MATOP_MULT,
638 CHKERR MatShellSetOperation(
639 shell_Aij, MATOP_ZERO_ENTRIES,
641
642 ConvectiveMassElement::ShellMatrixElement shell_matrix_element(m_field);
644 m_field,
"DISPLACEMENT", shellAij_ctx->
barK, PETSC_NULLPTR, PETSC_NULLPTR);
647 shell_matrix_element.problemName = "Kuu";
648 shell_matrix_element.shellMatCtx = shellAij_ctx;
649 shell_matrix_element.DirichletBcPtr = &shell_dirichlet_bc;
650 shell_matrix_element.loopK.push_back(
651 ConvectiveMassElement::ShellMatrixElement::PairNameFEMethodPtr(
652 "ELASTIC", &elastic.getLoopFeLhs()));
653
654 shell_matrix_element.loopK.push_back(
655 ConvectiveMassElement::ShellMatrixElement::PairNameFEMethodPtr(
656 "ELASTIC", &damper.feLhs));
657
658 CHKERR inertia.addHOOps();
659 CHKERR inertia.setShellMatrixMassOperators(
"VELOCITY",
"DISPLACEMENT",
660 "MESH_NODE_POSITIONS", linear);
661
662
663
664 shell_matrix_element.loopM.push_back(
665 ConvectiveMassElement::ShellMatrixElement::PairNameFEMethodPtr(
666 "ELASTIC", &inertia.getLoopFeMassLhs()));
667
668
669 shell_matrix_element.loopAuxM.push_back(
670 ConvectiveMassElement::ShellMatrixElement::PairNameFEMethodPtr(
671 "ELASTIC", &inertia.getLoopFeMassAuxLhs()));
672
673
675 shell_matrix_residual.shellMatCtx = shellAij_ctx;
676
677
678 boost::ptr_map<std::string, NeumannForcesSurface> surface_forces;
679 {
680 string fe_name_str = "FORCE_FE";
683 surface_forces.at(fe_name_str).getLoopFe().getOpPtrVector(), {},
684 "MESH_NODE_POSITIONS");
687 CHKERR surface_forces.at(fe_name_str)
688 .addForce("DISPLACEMENT", PETSC_NULLPTR, it->getMeshsetId(), true);
689 surface_forces.at(fe_name_str)
691 }
692 }
693
694 boost::ptr_map<std::string, NeumannForcesSurface> surface_pressure;
695 {
696 string fe_name_str = "PRESSURE_FE";
699 surface_pressure.at(fe_name_str).getLoopFe().getOpPtrVector(), {},
700 "MESH_NODE_POSITIONS");
703 CHKERR surface_pressure.at(fe_name_str)
704 .addPressure("DISPLACEMENT", PETSC_NULLPTR, it->getMeshsetId(), true);
705 surface_pressure.at(fe_name_str)
707 }
708 }
709
710
711 boost::ptr_map<std::string, EdgeForce> edge_forces;
712 {
713 string fe_name_str = "FORCE_FE";
714 edge_forces.insert(fe_name_str,
new EdgeForce(m_field));
717 CHKERR edge_forces.at(fe_name_str)
718 .addForce("DISPLACEMENT", PETSC_NULLPTR, it->getMeshsetId(), true);
719 edge_forces.at(fe_name_str).methodsOp.push_back(
new TimeForceScale());
720 }
721 }
722
723
724 boost::ptr_map<std::string, NodalForce> nodal_forces;
725 {
726 string fe_name_str = "FORCE_FE";
727 nodal_forces.insert(fe_name_str,
new NodalForce(m_field));
730 CHKERR nodal_forces.at(fe_name_str)
731 .addForce(
"DISPLACEMENT",
F, it->getMeshsetId(),
true);
732 nodal_forces.at(fe_name_str).methodsOp.push_back(
new TimeForceScale());
733 }
734 }
735
738 m_field, ts, "VELOCITY", "DISPLACEMENT");
739
740
742
743
744
747
748
750
751 auto add_static_rhs = [&](auto &loops_to_do_Rhs) {
753 loops_to_do_Rhs.push_back(
755 for (auto fit = surface_forces.begin(); fit != surface_forces.end();
756 fit++) {
757 loops_to_do_Rhs.push_back(
759 }
760 for (auto fit = surface_pressure.begin(); fit != surface_pressure.end();
761 fit++) {
762 loops_to_do_Rhs.push_back(
764 }
765 for (auto fit = edge_forces.begin(); fit != edge_forces.end(); fit++) {
766 loops_to_do_Rhs.push_back(
768 }
769 for (auto fit = nodal_forces.begin(); fit != nodal_forces.end(); fit++) {
770 loops_to_do_Rhs.push_back(
772 }
774 "FLUID_PRESSURE_FE", &fluid_pressure_fe.getLoopFe()));
776 };
777
778 CHKERR add_static_rhs(loops_to_do_Rhs);
779
781 loops_to_do_Rhs.push_back(
783
784
785
787
789
790
791
795
798 loopsMonitor.push_back(
800 loopsMonitor.push_back(
802
805
807
808 double ftime = 1;
809 CHKERR TSSetDuration(ts, PETSC_DEFAULT, ftime);
811 CHKERR TSSetFromOptions(ts);
812
813 SNES snes;
814 CHKERR TSGetSNES(ts, &snes);
815
816 KSP ksp;
817 CHKERR SNESGetKSP(snes, &ksp);
818 CHKERR KSPSetFromOptions(ksp);
819 PC pc;
820 CHKERR KSPGetPC(ksp, &pc);
821 CHKERR PCSetType(pc, PCSHELL);
823 CHKERR PCShellSetContext(pc, (
void *)&pc_shell_ctx);
827
829 CHKERR VecGhostUpdateBegin(
D, INSERT_VALUES, SCATTER_FORWARD);
830 CHKERR VecGhostUpdateEnd(
D, INSERT_VALUES, SCATTER_FORWARD);
832 "DYNAMICS",
COL,
D, INSERT_VALUES, SCATTER_REVERSE);
833
834
835 if (is_solve_at_time_zero) {
836
837 Mat Aij = shellAij_ctx->
K;
842
843
845 "Kuu",
COL,
D, INSERT_VALUES, SCATTER_FORWARD);
846 CHKERR VecGhostUpdateBegin(
D, INSERT_VALUES, SCATTER_FORWARD);
847 CHKERR VecGhostUpdateEnd(
D, INSERT_VALUES, SCATTER_FORWARD);
848
849 SnesCtx snes_ctx(m_field,
"Kuu");
850
851 SNES snes;
852 CHKERR SNESCreate(PETSC_COMM_WORLD, &snes);
853 CHKERR SNESSetApplicationContext(snes, &snes_ctx);
856 CHKERR SNESSetFromOptions(snes);
857
859 PETSC_NULLPTR,
D,
F);
860
862 snes_ctx.getComputeRhs();
863 snes_ctx.getPreProcComputeRhs().push_back(&my_dirichlet_bc);
864 fluid_pressure_fe.getLoopFe().ts_t = 0;
865 CHKERR add_static_rhs(loops_to_do_Rhs);
866 snes_ctx.getPostProcComputeRhs().push_back(&my_dirichlet_bc);
867
869 snes_ctx.getSetOperators();
870 snes_ctx.getPreProcSetOperators().push_back(&my_dirichlet_bc);
871 loops_to_do_Mat.push_back(
873 snes_ctx.getPostProcSetOperators().push_back(&my_dirichlet_bc);
874
877 "DOT_DISPLACEMENT");
879
881 "Kuu",
COL,
D, INSERT_VALUES, SCATTER_FORWARD);
882
883 CHKERR SNESSolve(snes, PETSC_NULLPTR,
D);
884 int its;
885 CHKERR SNESGetIterationNumber(snes, &its);
886 MOFEM_LOG_C(
"DYNAMIC", Sev::inform,
"number of Newton iterations = %d\n",
887 its);
888
889
891 "Kuu",
COL,
D, INSERT_VALUES, SCATTER_REVERSE);
892
895 CHKERR SNESDestroy(&snes);
896 }
897
898 if (is_solve_at_time_zero) {
900 "DYNAMICS",
COL,
D, INSERT_VALUES, SCATTER_FORWARD);
901 CHKERR VecGhostUpdateBegin(
D, INSERT_VALUES, SCATTER_FORWARD);
902 CHKERR VecGhostUpdateEnd(
D, INSERT_VALUES, SCATTER_FORWARD);
904 }
905
906#if PETSC_VERSION_GE(3, 7, 0)
907 CHKERR TSSetExactFinalTime(ts, TS_EXACTFINALTIME_STEPOVER);
908#endif
910 CHKERR TSGetTime(ts, &ftime);
911
912 PetscInt steps, snesfails, rejects, nonlinits, linits;
913 CHKERR TSGetTimeStepNumber(ts, &steps);
914 CHKERR TSGetSNESFailures(ts, &snesfails);
915 CHKERR TSGetStepRejections(ts, &rejects);
916 CHKERR TSGetSNESIterations(ts, &nonlinits);
917 CHKERR TSGetKSPIterations(ts, &linits);
919 "steps %d (%d rejected, %D SNES fails), ftime %g, nonlinits "
920 "%d, linits %D\n",
921 steps, rejects, snesfails, ftime, nonlinits, linits);
923
926 CHKERR MatDestroy(&shellAij_ctx->
K);
927 CHKERR MatDestroy(&shellAij_ctx->
M);
930 CHKERR MatDestroy(&shell_Aij);
931 delete shellAij_ctx;
932 }
934
936
937 return 0;
938}
#define MOFEM_LOG_C(channel, severity, format,...)
#define CATCH_ERRORS
Catch errors.
FieldApproximationBase
approximation base
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base .
@ 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
const FTensor::Tensor2< T, Dim, Dim > Vec
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)
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)
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.
Add operators pushing bases from local to physical configuration.
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.
MoFEM::FEMethodsSequence FEMethodsSequence
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.