15 constexpr double third = boost::math::constants::third<double>();
16 return (t_stress(0, 0) + t_stress(1, 1));
20 return (t_stress(0, 0) + t_stress(1, 1) + t_stress(2, 2));
65 GAUSS>::OpBaseTimesVector<1, SPACE_DIM, 0>;
103template <
int DIM_0,
int DIM_1>
106 boost::shared_ptr<MatrixDouble> def_grad_stab_ptr,
107 boost::shared_ptr<MatrixDouble> def_grad_dot_ptr,
108 double tau_F_ptr,
double xi_F_ptr,
109 boost::shared_ptr<MatrixDouble> grad_x_ptr,
110 boost::shared_ptr<MatrixDouble> grad_vel_ptr)
117 DataForcesAndSourcesCore::EntData &data) {
124 const size_t nb_gauss_pts = getGaussPts().size2();
130 auto t_F = getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(*
defGradPtr);
131 auto t_Fstab = getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(*
defGradStabPtr);
132 auto t_F_dot = getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(*
defGradDotPtr);
137 auto t_gradx = getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(*
gradxPtr);
138 auto t_gradVel = getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(*
gradVelPtr);
140 for (
auto gg = 0; gg != nb_gauss_pts; ++gg) {
142 t_Fstab(
i,
j) = t_F(
i,
j) + tau_F * (t_gradVel(
i,
j) - t_F_dot(
i,
j)) +
143 xi_F * (t_gradx(
i,
j) - t_F(
i,
j));
167template <
int DIM_0,
int DIM_1>
171 boost::shared_ptr<MatrixDouble> first_piola_ptr,
172 boost::shared_ptr<MatrixDouble> def_grad_ptr)
179 DataForcesAndSourcesCore::EntData &data) {
190 const size_t nb_gauss_pts = getGaussPts().size2();
197 auto t_P = getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(*
firstPiolaPtr);
198 auto t_F = getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(*
defGradPtr);
199 const double two_o_three = 2. / 3.;
200 const double trace_t_dk = DIM_0;
201 for (
auto gg = 0; gg != nb_gauss_pts; ++gg) {
205 two_o_three * trace_t_dk *
t_kd(
i,
j)) +
228 boost::shared_ptr<MatrixDouble> reference_pos_ptr,
229 boost::shared_ptr<MatrixDouble> u_ptr)
231 xPtr(spatial_pos_ptr),
XPtr(reference_pos_ptr),
uPtr(u_ptr) {}
234 DataForcesAndSourcesCore::EntData &data) {
240 const size_t nb_gauss_pts = getGaussPts().size2();
242 uPtr->resize(DIM, nb_gauss_pts,
false);
246 auto t_x = getFTensor1FromMat<DIM>(*
xPtr);
247 auto t_X = getFTensor1FromMat<DIM>(*
XPtr);
248 auto t_u = getFTensor1FromMat<DIM>(*
uPtr);
249 for (
auto gg = 0; gg != nb_gauss_pts; ++gg) {
251 t_u(
i) = t_x(
i) - t_X(
i);
261 boost::shared_ptr<MatrixDouble>
xPtr;
262 boost::shared_ptr<MatrixDouble>
XPtr;
263 boost::shared_ptr<MatrixDouble>
uPtr;
266template <
int DIM_0,
int DIM_1>
270 double shear_modulus,
double bulk_modulus,
double m_u,
271 double lambda_lamme, boost::shared_ptr<MatrixDouble> first_piola_ptr,
272 boost::shared_ptr<MatrixDouble> def_grad_ptr,
273 boost::shared_ptr<MatrixDouble> inv_def_grad_ptr,
274 boost::shared_ptr<VectorDouble> det)
281 DataForcesAndSourcesCore::EntData &data) {
293 const size_t nb_gauss_pts = getGaussPts().size2();
300 auto t_P = getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(*
firstPiolaPtr);
301 auto t_F = getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(*
defGradPtr);
302 auto t_inv_F = getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(*
invDefGradPtr);
303 auto t_det = getFTensor0FromVec<1>(*
dEt);
304 const double two_o_three = 2. / 3.;
305 const double one_o_three = 1. / 3.;
308 for (
auto gg = 0; gg != nb_gauss_pts; ++gg) {
312 t_P(
i,
j) = bulk_mod * (t_det - 1.) * t_det * t_inv_F(
j,
i);
315 shear_mod * pow(t_det, two_o_three) *
316 (t_F(
i,
j) - one_o_three * (t_F(
l,
k) * t_F(
l,
k)) * t_inv_F(
j,
i));
335 boost::shared_ptr<VectorDouble>
dEt;
338template <
int DIM_0,
int DIM_1>
342 boost::shared_ptr<MatrixDouble> def_grad_ptr,
343 boost::shared_ptr<MatrixDouble> grad_tensor_ptr)
348 DataForcesAndSourcesCore::EntData &data) {
358 const size_t nb_gauss_pts = getGaussPts().size2();
361 defGradPtr->resize(nb_gauss_pts, DIM_0 * DIM_1,
false);
365 auto t_F = getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(*
defGradPtr);
366 auto t_H = getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(*
gradTensorPtr);
367 for (
auto gg = 0; gg != nb_gauss_pts; ++gg) {
400 PetscInt stageindex, Vec *Y);
439 double getScale(
const double time) {
return 0.001 * sin(0.1 * time); };
444 double getScale(
const double time) {
return 0.001; };
477 enum bases { AINSWORTH, DEMKOWICZ, LASBASETOPT };
478 const char *list_bases[LASBASETOPT] = {
"ainsworth",
"demkowicz"};
479 PetscInt choice_base_value = AINSWORTH;
481 LASBASETOPT, &choice_base_value, PETSC_NULLPTR);
484 switch (choice_base_value) {
488 <<
"Set AINSWORTH_LEGENDRE_BASE for displacements";
493 <<
"Set DEMKOWICZ_JACOBI_BASE for displacements";
520 auto project_ho_geometry = [&]() {
529 CHKERR project_ho_geometry();
542 auto time_scale = boost::make_shared<TimeScale>();
544 PetscBool sin_time_function = PETSC_FALSE;
546 &sin_time_function, PETSC_NULLPTR);
548 if (sin_time_function)
549 time_scale = boost::make_shared<DynamicFirstOrderConsSinusTimeScale>();
551 time_scale = boost::make_shared<DynamicFirstOrderConsConstantTimeScale>();
553 pipeline_mng->getBoundaryExplicitRhsFE().reset();
555 pipeline_mng->getOpBoundaryExplicitRhsPipeline(), {NOSPACE},
"GEOMETRY");
558 pipeline_mng->getOpBoundaryExplicitRhsPipeline(),
mField,
"V",
559 {time_scale},
"FORCE",
"PRESSURE", Sev::inform);
571 auto get_pre_proc_hook = [&]() {
573 mField, pipeline_mng->getDomainExplicitRhsFE(), {time_scale});
575 pipeline_mng->getDomainExplicitRhsFE()->preProcessHook = get_pre_proc_hook();
582 PetscInt stageindex, Vec *Y) {
586 auto &m_field = ptr->fsRawPtr->mField;
588 auto fb = m_field.getInterface<
FieldBlas>();
592 CHKERR TSGetTime(ts, &time);
594 Vec *stage_solutions;
596 CHKERR TSGetStages(ts, &num_stages, &stage_solutions);
597 PetscPrintf(PETSC_COMM_WORLD,
"Check timestep %d time %e dt %e\n",
598 num_stages, time,
dt);
600 const double inv_num_step = (
double)num_stages;
601 CHKERR fb->fieldCopy(1.,
"x_1",
"x_2");
602 CHKERR fb->fieldAxpy(
dt,
"V",
"x_2");
603 CHKERR fb->fieldCopy(1.,
"x_2",
"x_1");
605 CHKERR fb->fieldCopy(-inv_num_step /
dt,
"F_0",
"F_dot");
606 CHKERR fb->fieldAxpy(inv_num_step /
dt,
"F",
"F_dot");
607 CHKERR fb->fieldCopy(1.,
"F",
"F_0");
619 CHKERR TSGetTime(ts, &time);
631 CHKERR TSGetTime(ts, &time);
633 CHKERR TSGetStepNumber(ts, &step_num);
651 auto get_time_scale = [
this](
const double time) {
652 return sin(time *
omega * M_PI);
655 auto apply_rhs = [&](
auto &pip) {
662 auto mat_v_grad_ptr = boost::make_shared<MatrixDouble>();
664 "V", mat_v_grad_ptr));
666 auto gravity_vector_ptr = boost::make_shared<MatrixDouble>();
667 gravity_vector_ptr->resize(1,
SPACE_DIM);
668 auto set_body_force = [&]() {
671 auto t_force = getFTensor1FromMat<SPACE_DIM, 0>(*gravity_vector_ptr);
672 double unit_weight = 0.;
677 t_force(1) = -unit_weight;
679 t_force(2) = unit_weight;
685 pip.push_back(
new OpBodyForce(
"V", gravity_vector_ptr,
686 [](
double,
double,
double) {
return 1.; }));
689 auto mat_H_tensor_ptr = boost::make_shared<MatrixDouble>();
691 "F", mat_H_tensor_ptr));
708 auto mat_dot_F_tensor_ptr = boost::make_shared<MatrixDouble>();
710 "F_dot", mat_dot_F_tensor_ptr));
713 auto mat_x_grad_ptr = boost::make_shared<MatrixDouble>();
715 "x_2", mat_x_grad_ptr));
717 auto mat_F_tensor_ptr = boost::make_shared<MatrixDouble>();
719 mat_F_tensor_ptr, mat_H_tensor_ptr));
721 auto mat_F_stab_ptr = boost::make_shared<MatrixDouble>();
723 mat_F_tensor_ptr, mat_F_stab_ptr, mat_dot_F_tensor_ptr, tau, xi,
724 mat_x_grad_ptr, mat_v_grad_ptr));
726 PetscBool is_linear_elasticity = PETSC_TRUE;
728 &is_linear_elasticity, PETSC_NULLPTR);
730 auto mat_P_stab_ptr = boost::make_shared<MatrixDouble>();
731 if (is_linear_elasticity) {
736 auto inv_F = boost::make_shared<MatrixDouble>();
737 auto det_ptr = boost::make_shared<VectorDouble>();
745 mat_F_stab_ptr, inv_F, det_ptr));
755 CHKERR apply_rhs(pipeline_mng->getOpDomainExplicitRhsPipeline());
776 boost::shared_ptr<PostProcEle> post_proc,
777 boost::shared_ptr<PostProcFaceEle> post_proc_bdry,
778 boost::shared_ptr<MatrixDouble> velocity_field_ptr,
779 boost::shared_ptr<MatrixDouble> x2_field_ptr,
780 boost::shared_ptr<MatrixDouble> geometry_field_ptr,
781 std::array<double, 3> pass_field_eval_coords,
782 boost::shared_ptr<SetPtsData> pass_field_eval_data)
794 ->evalFEAtThePoint<SPACE_DIM>(
801 auto t_x2_field = getFTensor1FromMat<SPACE_DIM>(*
x2FieldPtr);
804 double u_x = t_x2_field(0) - t_geom(0);
805 double u_y = t_x2_field(1) - t_geom(1);
806 double u_z = t_x2_field(2) - t_geom(2);
809 <<
"Velocities x: " << t_vel(0) <<
" y: " << t_vel(1)
810 <<
" z: " << t_vel(2) <<
"\n";
811 MOFEM_LOG(
"SYNC", Sev::inform) <<
"Displacement x: " << u_x
812 <<
" y: " << u_y <<
" z: " << u_z <<
"\n";
816 std::regex((boost::format(
"%s(.*)") %
"Data_Vertex").str()))) {
820 auto print_vets = [](boost::shared_ptr<FieldEntity> ent_ptr) {
822 if (!(ent_ptr->getPStatus() & PSTATUS_NOT_OWNED)) {
824 <<
"Velocities: " << ent_ptr->getEntFieldData()[0] <<
" "
825 << ent_ptr->getEntFieldData()[1] <<
" "
826 << ent_ptr->getEntFieldData()[2] <<
"\n";
831 print_vets,
"V", &ents);
835 PetscBool print_volume = PETSC_FALSE;
839 PetscBool print_skin = PETSC_FALSE;
851 "out_step_" + boost::lexical_cast<std::string>(
ts_step) +
".h5m");
857 "out_boundary_" + boost::lexical_cast<std::string>(
ts_step) +
883 auto calculate_stress_ops = [&](
auto &pip) {
886 auto v_ptr = boost::make_shared<MatrixDouble>();
888 auto X_ptr = boost::make_shared<MatrixDouble>();
892 auto x_ptr = boost::make_shared<MatrixDouble>();
896 auto mat_H_tensor_ptr = boost::make_shared<MatrixDouble>();
898 "F", mat_H_tensor_ptr));
900 auto u_ptr = boost::make_shared<MatrixDouble>();
904 auto mat_F_ptr = boost::make_shared<MatrixDouble>();
906 mat_F_ptr, mat_H_tensor_ptr));
908 PetscBool is_linear_elasticity = PETSC_TRUE;
910 &is_linear_elasticity, PETSC_NULLPTR);
912 auto mat_P_ptr = boost::make_shared<MatrixDouble>();
913 if (is_linear_elasticity) {
918 auto inv_F = boost::make_shared<MatrixDouble>();
919 auto det_ptr = boost::make_shared<VectorDouble>();
925 mat_F_ptr, inv_F, det_ptr));
928 auto mat_v_grad_ptr = boost::make_shared<MatrixDouble>();
930 "V", mat_v_grad_ptr));
932 return boost::make_tuple(v_ptr, X_ptr, x_ptr, mat_P_ptr, mat_F_ptr, u_ptr);
935 auto post_proc_boundary = [&]() {
936 auto boundary_post_proc_fe = boost::make_shared<PostProcFaceEle>(
mField);
939 boundary_post_proc_fe->getOpPtrVector(), {},
"GEOMETRY");
943 auto [boundary_v_ptr, boundary_X_ptr, boundary_x_ptr, boundary_mat_P_ptr,
944 boundary_mat_F_ptr, boundary_u_ptr] =
945 calculate_stress_ops(op_loop_side->getOpPtrVector());
946 boundary_post_proc_fe->getOpPtrVector().push_back(op_loop_side);
950 boundary_post_proc_fe->getOpPtrVector().push_back(
954 boundary_post_proc_fe->getPostProcMesh(),
955 boundary_post_proc_fe->getMapGaussPts(),
960 {
"GEOMETRY", boundary_X_ptr},
961 {
"x", boundary_x_ptr},
962 {
"U", boundary_u_ptr}},
965 {
"F", boundary_mat_F_ptr}},
972 return boundary_post_proc_fe;
986 auto ts_pre_post_proc = boost::make_shared<TSPrePostProc>();
992 boost::shared_ptr<DomainEle> vol_mass_ele(
new DomainEle(mField));
1002 vol_mass_ele->getOpPtrVector().push_back(
new OpMassV(
"V",
"V", get_rho));
1003 vol_mass_ele->getOpPtrVector().push_back(
new OpMassF(
"F",
"F"));
1006 CHKERR MatAssemblyBegin(M, MAT_FINAL_ASSEMBLY);
1007 CHKERR MatAssemblyEnd(M, MAT_FINAL_ASSEMBLY);
1010 CHKERR MatGetRowSum(M, lumpVec);
1012 CHKERR MatZeroEntries(M);
1013 CHKERR MatDiagonalSet(M, lumpVec, INSERT_VALUES);
1018 CHKERR KSPSetOperators(ksp, M, M);
1019 CHKERR KSPSetFromOptions(ksp);
1022 auto solve_boundary_for_g = [&]() {
1024 if (*(pipeline_mng->getBoundaryExplicitRhsFE()->vecAssembleSwitch)) {
1026 CHKERR VecGhostUpdateBegin(pipeline_mng->getBoundaryExplicitRhsFE()->ts_F,
1027 ADD_VALUES, SCATTER_REVERSE);
1028 CHKERR VecGhostUpdateEnd(pipeline_mng->getBoundaryExplicitRhsFE()->ts_F,
1029 ADD_VALUES, SCATTER_REVERSE);
1030 CHKERR VecAssemblyBegin(pipeline_mng->getBoundaryExplicitRhsFE()->ts_F);
1031 CHKERR VecAssemblyEnd(pipeline_mng->getBoundaryExplicitRhsFE()->ts_F);
1032 *(pipeline_mng->getBoundaryExplicitRhsFE()->vecAssembleSwitch) =
false;
1036 CHKERR KSPSolve(ksp, pipeline_mng->getBoundaryExplicitRhsFE()->ts_F,
D);
1037 CHKERR VecGhostUpdateBegin(
D, INSERT_VALUES, SCATTER_FORWARD);
1038 CHKERR VecGhostUpdateEnd(
D, INSERT_VALUES, SCATTER_FORWARD);
1039 CHKERR VecCopy(
D, pipeline_mng->getBoundaryExplicitRhsFE()->ts_F);
1045 pipeline_mng->getBoundaryExplicitRhsFE()->postProcessHook =
1046 solve_boundary_for_g;
1049 ts = pipeline_mng->createTSEX(dm);
1052 PetscBool field_eval_flag = PETSC_TRUE;
1053 boost::shared_ptr<MatrixDouble> velocity_field_ptr;
1054 boost::shared_ptr<MatrixDouble> geometry_field_ptr;
1055 boost::shared_ptr<MatrixDouble> spatial_position_field_ptr;
1056 boost::shared_ptr<SetPtsData> field_eval_data;
1058 std::array<double, 3> field_eval_coords = {0.5, 0.5, 5.};
1061 field_eval_coords.data(), &dim,
1064 if (field_eval_flag) {
1068 field_eval_data,
simple->getDomainFEName());
1070 field_eval_data->setEvalPoints(field_eval_coords.data(), 1);
1072 auto no_rule = [](
int,
int,
int) {
return -1; };
1074 auto fe_ptr = field_eval_data->feMethodPtr;
1075 fe_ptr->getRuleHook = no_rule;
1076 velocity_field_ptr = boost::make_shared<MatrixDouble>();
1077 geometry_field_ptr = boost::make_shared<MatrixDouble>();
1078 spatial_position_field_ptr = boost::make_shared<MatrixDouble>();
1079 fe_ptr->getOpPtrVector().push_back(
1081 fe_ptr->getOpPtrVector().push_back(
1083 geometry_field_ptr));
1084 fe_ptr->getOpPtrVector().push_back(
1086 "x_2", spatial_position_field_ptr));
1089 auto post_proc_domain = [&]() {
1090 auto post_proc_fe_vol = boost::make_shared<PostProcEle>(mField);
1094 auto [boundary_v_ptr, boundary_X_ptr, boundary_x_ptr, boundary_mat_P_ptr,
1095 boundary_mat_F_ptr, boundary_u_ptr] =
1096 calculate_stress_ops(post_proc_fe_vol->getOpPtrVector());
1098 post_proc_fe_vol->getOpPtrVector().push_back(
1102 post_proc_fe_vol->getPostProcMesh(),
1103 post_proc_fe_vol->getMapGaussPts(),
1107 {{
"V", boundary_v_ptr},
1108 {
"GEOMETRY", boundary_X_ptr},
1109 {
"x", boundary_x_ptr},
1110 {
"U", boundary_u_ptr}},
1112 {{
"FIRST_PIOLA", boundary_mat_P_ptr}, {
"F", boundary_mat_F_ptr}},
1119 return post_proc_fe_vol;
1122 boost::shared_ptr<FEMethod> null_fe;
1123 auto monitor_ptr = boost::make_shared<Monitor>(
1125 post_proc_boundary(), velocity_field_ptr, spatial_position_field_ptr,
1126 geometry_field_ptr, field_eval_coords, field_eval_data);
1129 null_fe, monitor_ptr);
1133 CHKERR TSSetExactFinalTime(ts, TS_EXACTFINALTIME_MATCHSTEP);
1138 CHKERR TSSetSolution(ts, T);
1139 CHKERR TSSetFromOptions(ts);
1145 boost::shared_ptr<ForcesAndSourcesCore> null;
1148 ptr->fsRawPtr =
this;
1150 CHKERR TSSolve(ts, NULL);
1151 CHKERR TSGetTime(ts, &ftime);
1161 PetscBool test_flg = PETSC_FALSE;
1169 CHKERR VecNorm(T, NORM_2, &nrm2);
1170 MOFEM_LOG(
"EXAMPLE", Sev::inform) <<
"Regression norm " << nrm2;
1171 constexpr double regression_value = 0.0194561;
1172 if (fabs(nrm2 - regression_value) > 1e-2)
1174 "Regression test failed; wrong norm value.");
1192 const char param_file[] =
"param_file.petsc";
1196 auto core_log = logging::core::get();
1205 DMType dm_name =
"DMMOFEM";
1210 moab::Core mb_instance;
1211 moab::Interface &moab = mb_instance;
#define MOFEM_LOG_SEVERITY_SYNC(comm, severity)
Synchronise "SYNC" on curtain severity level.
void simple(double P1[], double P2[], double P3[], double c[], const int N)
ElementsAndOps< SPACE_DIM >::DomainEle DomainEle
ElementsAndOps< SPACE_DIM >::BoundaryEle BoundaryEle
#define CATCH_ERRORS
Catch errors.
FieldApproximationBase
approximation base
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base .
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ MOFEM_ATOM_TEST_INVALID
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
PostProcEleByDim< SPACE_DIM >::PostProcEleDomain PostProcEleDomain
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpMass< 1, SPACE_DIM > OpMassV
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpMass< 1, SPACE_DIM *SPACE_DIM > OpMassF
static boost::weak_ptr< TSPrePostProc > tsPrePostProc
static char help[]
[Check]
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpBaseTimesVector< 1, SPACE_DIM, SPACE_DIM > OpInertiaForce
constexpr double poisson_ratio
constexpr double omega
Save field DOFS on vertices/tags.
PostProcEleByDim< SPACE_DIM >::PostProcEleBdy PostProcEleBdy
PipelineManager::ElementsAndOpsByDim< SPACE_DIM >::DomainEle DomainEle
double trace(FTensor::Tensor2< T, 2, 2 > &t_stress)
FormsIntegrators< DomainEleOp >::Assembly< AssemblyType::PETSC >::LinearForm< IntegrationType::GAUSS >::OpGradTimesTensor< 1, SPACE_DIM, SPACE_DIM > OpGradTimesPiola
FormsIntegrators< DomainEleOp >::Assembly< AssemblyType::PETSC >::LinearForm< IntegrationType::GAUSS >::OpBaseTimesVector< 1, SPACE_DIM *SPACE_DIM, SPACE_DIM *SPACE_DIM > OpRhsTestPiola
FormsIntegrators< DomainEleOp >::Assembly< AssemblyType::PETSC >::LinearForm< IntegrationType::GAUSS >::OpGradTimesTensor< 1, SPACE_DIM, SPACE_DIM > OpGradTimesTensor2
constexpr double young_modulus
PetscErrorCode DMCreateMatrix_MoFEM(DM dm, Mat *M)
PetscErrorCode DMoFEMMeshToLocalVector(DM dm, Vec l, InsertMode mode, ScatterMode scatter_mode, RowColData rc=RowColData::COL)
set local (or ghosted) vector values on mesh for partition only
PetscErrorCode DMRegister_MoFEM(const char sname[])
Register MoFEM problem.
PetscErrorCode DMoFEMLoopFiniteElements(DM dm, const char fe_name[], MoFEM::FEMethod *method, CacheTupleWeakPtr cache_ptr=CacheTupleSharedPtr())
Executes FEMethod for finite elements in DM.
auto createDMVector(DM dm, RowColData rc=RowColData::COL)
Get smart vector from DM.
static LoggerType & setLog(const std::string channel)
Set ans resset chanel logger.
#define MOFEM_LOG(channel, severity)
Log.
#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.
FTensor::Index< 'i', SPACE_DIM > i
FTensor::Index< 'l', 3 > l
FTensor::Index< 'j', 3 > j
FTensor::Index< 'k', 3 > k
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
implementation of Data Operators for Forces and Sources
auto createKSP(MPI_Comm comm)
PetscErrorCode DMMoFEMTSSetMonitor(DM dm, TS ts, const std::string fe_name, boost::shared_ptr< MoFEM::FEMethod > method, boost::shared_ptr< MoFEM::BasicMethod > pre_only, boost::shared_ptr< MoFEM::BasicMethod > post_only)
Set Monitor To TS 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 PetscOptionsGetBool(PetscOptions *, const char pre[], const char name[], PetscBool *bval, PetscBool *set)
SmartPetscObj< Vec > vectorDuplicate(Vec vec)
Create duplicate vector of smart vector.
PetscErrorCode PetscOptionsGetRealArray(PetscOptions *, const char pre[], const char name[], PetscReal dval[], PetscInt *nmax, PetscBool *set)
PetscErrorCode PetscOptionsGetEList(PetscOptions *, const char pre[], const char name[], const char *const *list, PetscInt next, PetscInt *value, PetscBool *set)
FTensor::Index< 'M', 3 > M
FormsIntegrators< DomainEleOp >::Assembly< A >::LinearForm< I >::OpGradTimesTensor< 1, FIELD_DIM, SPACE_DIM > OpGradTimesTensor
OpPostProcMapInMoab< SPACE_DIM, SPACE_DIM > OpPPMap
static constexpr int approx_order
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpMass< 1, SPACE_DIM > OpMass
[Only used with Hooke equation (linear material model)]
FTensor::Index< 'm', 3 > m
SmartPetscObj< Mat > M
Mass matrix.
SmartPetscObj< KSP > ksp
Linear solver.
double getScale(const double time)
Get scaling at given time.
double getScale(const double time)
Get scaling at given time.
MoFEMErrorCode boundaryCondition()
[Set up problem]
MoFEMErrorCode assembleSystem()
[Push operators to pipeline]
MoFEMErrorCode readMesh()
[Run problem]
FieldApproximationBase base
Choice of finite element basis functions.
MoFEMErrorCode checkResults()
[Postprocess results]
MoFEMErrorCode solveSystem()
[Solve]
Example(MoFEM::Interface &m_field)
MoFEMErrorCode runProblem()
MoFEM::Interface & mField
Reference to MoFEM interface.
MoFEMErrorCode setupProblem()
MoFEMErrorCode outputResults()
[Solve]
double getScale(const double time)
Get scaling at given time.
Add operators pushing bases from local to physical configuration.
boost::weak_ptr< CacheTuple > getCacheWeakPtr() const
Get the cache weak pointer object.
Boundary condition manager for finite element problem setup.
virtual moab::Interface & get_moab()=0
virtual MPI_Comm & get_comm() const =0
virtual int get_comm_rank() const =0
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.
Definition of the displacement bc data structure.
Data on single entity (This is passed as argument to DataOperator::doWork)
Class (Function) to enforce essential constrains.
Structure for user loop methods on finite elements.
Field evaluator interface.
SetIntegrationPtsMethodData SetPtsData
structure to get information from mofem into EntitiesFieldData
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.
Interface for managing meshsets containing materials and boundary conditions.
Get values at integration pts for tensor field rank 2, i.e. matrix field.
Get field gradients at integration pts for scalar field rank 0, i.e. vector field.
Specialization for MatrixDouble vector field values calculation.
Operator for inverting matrices at integration points.
Element used to execute operators on side of the element.
Post post-proc data at points from hash maps.
std::map< std::string, ScalarDataPtr > DataMapVec
std::map< std::string, boost::shared_ptr< MatrixDouble > > DataMapMat
Template struct for dimension-specific finite element types.
PipelineManager interface.
Projection of edge entities with one mid-node on hierarchical basis.
Simple interface for fast problem set-up.
MoFEMErrorCode addDomainField(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_ZERO, int verb=-1)
Add field on domain.
MoFEMErrorCode loadFile(const std::string options, const std::string mesh_file_name, LoadFileFunc loadFunc=defaultLoadFileFunc)
Load mesh file.
MoFEMErrorCode addBoundaryField(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_ZERO, int verb=-1)
Add field on boundary.
MoFEMErrorCode getOptions()
get options
MoFEMErrorCode getDM(DM *dm)
Get DM.
MoFEMErrorCode setFieldOrder(const std::string field_name, const int order, const Range *ents=NULL)
Set field order.
MoFEMErrorCode addDataField(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_ZERO, int verb=-1)
Add data field.
MoFEMErrorCode setUp(const PetscBool is_partitioned=PETSC_TRUE)
Setup problem.
const std::string getProblemName() const
Get the Problem Name.
const std::string getDomainFEName() const
Get the Domain FE Name.
intrusive_ptr for managing petsc objects
PetscInt ts_step
Current time step number.
Force scale operator for reading two columns.
double getScale(const double time)
Get scaling at a given time.
TimeScale(std::string file_name="", bool error_if_file_not_given=false, ScalingFun def_scaling_fun=[](double time) { return time;})
TimeScale constructor.
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.
[Push operators to pipeline]
boost::shared_ptr< PostProcFaceEle > postProcBdy
std::array< double, 3 > fieldEvalCoords
MoFEM::Interface & mField
Monitor(SmartPetscObj< DM > dm, MoFEM::Interface &m_field, boost::shared_ptr< PostProcEle > post_proc, boost::shared_ptr< PostProcFaceEle > post_proc_bdry, boost::shared_ptr< MatrixDouble > velocity_field_ptr, boost::shared_ptr< MatrixDouble > x2_field_ptr, boost::shared_ptr< MatrixDouble > geometry_field_ptr, std::array< double, 3 > pass_field_eval_coords, boost::shared_ptr< SetPtsData > pass_field_eval_data)
boost::shared_ptr< MatrixDouble > geometryFieldPtr
MoFEMErrorCode postProcess()
Post-processing function executed at loop completion.
boost::shared_ptr< MatrixDouble > velocityFieldPtr
boost::shared_ptr< SetPtsData > fieldEvalData
boost::shared_ptr< MatrixDouble > x2FieldPtr
boost::shared_ptr< PostProcEle > postProc
boost::shared_ptr< MatrixDouble > XPtr
boost::shared_ptr< MatrixDouble > uPtr
MoFEMErrorCode doWork(int side, EntityType type, DataForcesAndSourcesCore::EntData &data)
OpCalculateDisplacement(boost::shared_ptr< MatrixDouble > spatial_pos_ptr, boost::shared_ptr< MatrixDouble > reference_pos_ptr, boost::shared_ptr< MatrixDouble > u_ptr)
boost::shared_ptr< MatrixDouble > xPtr
boost::shared_ptr< MatrixDouble > gradxPtr
MoFEMErrorCode doWork(int side, EntityType type, DataForcesAndSourcesCore::EntData &data)
OpCalculateFStab(boost::shared_ptr< MatrixDouble > def_grad_ptr, boost::shared_ptr< MatrixDouble > def_grad_stab_ptr, boost::shared_ptr< MatrixDouble > def_grad_dot_ptr, double tau_F_ptr, double xi_F_ptr, boost::shared_ptr< MatrixDouble > grad_x_ptr, boost::shared_ptr< MatrixDouble > grad_vel_ptr)
boost::shared_ptr< MatrixDouble > defGradStabPtr
boost::shared_ptr< MatrixDouble > gradVelPtr
boost::shared_ptr< MatrixDouble > defGradPtr
boost::shared_ptr< MatrixDouble > defGradDotPtr
OpCalculatePiolaIncompressibleNH(double shear_modulus, double bulk_modulus, double m_u, double lambda_lamme, boost::shared_ptr< MatrixDouble > first_piola_ptr, boost::shared_ptr< MatrixDouble > def_grad_ptr, boost::shared_ptr< MatrixDouble > inv_def_grad_ptr, boost::shared_ptr< VectorDouble > det)
boost::shared_ptr< VectorDouble > dEt
MoFEMErrorCode doWork(int side, EntityType type, DataForcesAndSourcesCore::EntData &data)
boost::shared_ptr< MatrixDouble > invDefGradPtr
boost::shared_ptr< MatrixDouble > defGradPtr
boost::shared_ptr< MatrixDouble > firstPiolaPtr
OpCalculatePiola(double shear_modulus, double bulk_modulus, double m_u, double lambda_lamme, boost::shared_ptr< MatrixDouble > first_piola_ptr, boost::shared_ptr< MatrixDouble > def_grad_ptr)
MoFEMErrorCode doWork(int side, EntityType type, DataForcesAndSourcesCore::EntData &data)
boost::shared_ptr< MatrixDouble > defGradPtr
boost::shared_ptr< MatrixDouble > firstPiolaPtr
PipelineManager::ElementsAndOpsByDim< 2 >::FaceSideEle SideEle
PipelineManager::ElementsAndOpsByDim< 3 >::FaceSideEle SideEle
Set of functions called by PETSc solver used to refine and update mesh.
static MoFEMErrorCode tsPostStep(TS ts)
virtual ~TSPrePostProc()=default
static MoFEMErrorCode tsPreStep(TS ts)
static MoFEMErrorCode tsPostStage(TS ts, PetscReal stagetime, PetscInt stageindex, Vec *Y)
[Boundary condition]
MoFEMErrorCode tsSetUp(TS ts)
Used to setup TS solver.
static boost::weak_ptr< TSPrePostProc > tsPrePostProc
#define EXECUTABLE_DIMENSION
ElementsAndOps< SPACE_DIM >::SideEle SideEle
DomainNaturalBC::OpFlux< NaturalMeshsetType< BLOCKSET >, 1, SPACE_DIM > OpBodyForce