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>;
79 IntegrationType::GAUSS>::OpBaseTimesVector<1, SPACE_DIM * SPACE_DIM, 1>;
102template <
int DIM_0,
int DIM_1>
105 boost::shared_ptr<MatrixDouble> def_grad_stab_ptr,
106 boost::shared_ptr<MatrixDouble> def_grad_dot_ptr,
107 double tau_F_ptr,
double xi_F_ptr,
108 boost::shared_ptr<MatrixDouble> grad_x_ptr,
109 boost::shared_ptr<MatrixDouble> grad_vel_ptr)
116 DataForcesAndSourcesCore::EntData &data) {
123 const size_t nb_gauss_pts = getGaussPts().size2();
139 for (
auto gg = 0; gg != nb_gauss_pts; ++gg) {
141 t_Fstab(
i,
j) = t_F(
i,
j) + tau_F * (t_gradVel(
i,
j) - t_F_dot(
i,
j)) +
142 xi_F * (t_gradx(
i,
j) - t_F(
i,
j));
166template <
int DIM_0,
int DIM_1>
170 boost::shared_ptr<MatrixDouble> first_piola_ptr,
171 boost::shared_ptr<MatrixDouble> def_grad_ptr)
178 DataForcesAndSourcesCore::EntData &data) {
189 const size_t nb_gauss_pts = getGaussPts().size2();
198 const double two_o_three = 2. / 3.;
199 const double trace_t_dk = DIM_0;
200 for (
auto gg = 0; gg != nb_gauss_pts; ++gg) {
204 two_o_three * trace_t_dk *
t_kd(
i,
j)) +
227 boost::shared_ptr<MatrixDouble> reference_pos_ptr,
228 boost::shared_ptr<MatrixDouble> u_ptr)
230 xPtr(spatial_pos_ptr),
XPtr(reference_pos_ptr),
uPtr(u_ptr) {}
233 DataForcesAndSourcesCore::EntData &data) {
239 const size_t nb_gauss_pts = getGaussPts().size2();
241 uPtr->resize(DIM, nb_gauss_pts,
false);
248 for (
auto gg = 0; gg != nb_gauss_pts; ++gg) {
250 t_u(
i) = t_x(
i) - t_X(
i);
260 boost::shared_ptr<MatrixDouble>
xPtr;
261 boost::shared_ptr<MatrixDouble>
XPtr;
262 boost::shared_ptr<MatrixDouble>
uPtr;
265template <
int DIM_0,
int DIM_1>
267 :
public ForcesAndSourcesCore::UserDataOperator {
269 double shear_modulus,
double bulk_modulus,
double m_u,
270 double lambda_lamme, boost::shared_ptr<MatrixDouble> first_piola_ptr,
271 boost::shared_ptr<MatrixDouble> def_grad_ptr,
272 boost::shared_ptr<MatrixDouble> inv_def_grad_ptr,
273 boost::shared_ptr<VectorDouble> det)
280 DataForcesAndSourcesCore::EntData &data) {
292 const size_t nb_gauss_pts = getGaussPts().size2();
303 const double two_o_three = 2. / 3.;
304 const double one_o_three = 1. / 3.;
307 for (
auto gg = 0; gg != nb_gauss_pts; ++gg) {
311 t_P(
i,
j) = bulk_mod * (t_det - 1.) * t_det * t_inv_F(
j,
i);
314 shear_mod * pow(t_det, two_o_three) *
315 (t_F(
i,
j) - one_o_three * (t_F(
l,
k) * t_F(
l,
k)) * t_inv_F(
j,
i));
334 boost::shared_ptr<VectorDouble>
dEt;
337template <
int DIM_0,
int DIM_1>
339 :
public ForcesAndSourcesCore::UserDataOperator {
341 boost::shared_ptr<MatrixDouble> def_grad_ptr,
342 boost::shared_ptr<MatrixDouble> grad_tensor_ptr)
347 DataForcesAndSourcesCore::EntData &data) {
357 const size_t nb_gauss_pts = getGaussPts().size2();
360 defGradPtr->resize(DIM_0 * DIM_1, nb_gauss_pts,
false);
366 for (
auto gg = 0; gg != nb_gauss_pts; ++gg) {
399 PetscInt stageindex, Vec *Y);
438 double getScale(
const double time) {
return 0.001 * sin(0.1 * time); };
443 double getScale(
const double time) {
return 0.001; };
476 enum bases { AINSWORTH, DEMKOWICZ, LASBASETOPT };
477 const char *list_bases[LASBASETOPT] = {
"ainsworth",
"demkowicz"};
478 PetscInt choice_base_value = AINSWORTH;
480 LASBASETOPT, &choice_base_value, PETSC_NULLPTR);
483 switch (choice_base_value) {
487 <<
"Set AINSWORTH_LEGENDRE_BASE for displacements";
492 <<
"Set DEMKOWICZ_JACOBI_BASE for displacements";
519 auto project_ho_geometry = [&]() {
528 CHKERR project_ho_geometry();
541 auto time_scale = boost::make_shared<TimeScale>();
543 PetscBool sin_time_function = PETSC_FALSE;
545 &sin_time_function, PETSC_NULLPTR);
547 if (sin_time_function)
548 time_scale = boost::make_shared<DynamicFirstOrderConsSinusTimeScale>();
550 time_scale = boost::make_shared<DynamicFirstOrderConsConstantTimeScale>();
552 pipeline_mng->getBoundaryExplicitRhsFE().reset();
554 pipeline_mng->getOpBoundaryExplicitRhsPipeline(), {NOSPACE},
"GEOMETRY");
557 pipeline_mng->getOpBoundaryExplicitRhsPipeline(),
mField,
"V",
558 {time_scale},
"FORCE", Sev::inform);
568 simple->getProblemName(),
"V");
570 auto get_pre_proc_hook = [&]() {
572 mField, pipeline_mng->getDomainExplicitRhsFE(), {time_scale});
574 pipeline_mng->getDomainExplicitRhsFE()->preProcessHook = get_pre_proc_hook();
581 PetscInt stageindex, Vec *Y) {
585 auto &m_field = ptr->fsRawPtr->mField;
587 auto fb = m_field.getInterface<
FieldBlas>();
591 CHKERR TSGetTime(ts, &time);
593 Vec *stage_solutions;
595 CHKERR TSGetStages(ts, &num_stages, &stage_solutions);
596 PetscPrintf(PETSC_COMM_WORLD,
"Check timestep %d time %e dt %e\n",
597 num_stages, time,
dt);
599 const double inv_num_step = (
double)num_stages;
600 CHKERR fb->fieldCopy(1.,
"x_1",
"x_2");
601 CHKERR fb->fieldAxpy(
dt,
"V",
"x_2");
602 CHKERR fb->fieldCopy(1.,
"x_2",
"x_1");
604 CHKERR fb->fieldCopy(-inv_num_step /
dt,
"F_0",
"F_dot");
605 CHKERR fb->fieldAxpy(inv_num_step /
dt,
"F",
"F_dot");
606 CHKERR fb->fieldCopy(1.,
"F",
"F_0");
615 auto &m_field = ptr->fsRawPtr->mField;
619 CHKERR TSGetTime(ts, &time);
628 auto &m_field = ptr->fsRawPtr->mField;
632 CHKERR TSGetTime(ts, &time);
634 CHKERR TSGetStepNumber(ts, &step_num);
652 auto get_time_scale = [
this](
const double time) {
653 return sin(time *
omega * M_PI);
656 auto apply_rhs = [&](
auto &pip) {
663 auto mat_v_grad_ptr = boost::make_shared<MatrixDouble>();
665 "V", mat_v_grad_ptr));
667 auto gravity_vector_ptr = boost::make_shared<MatrixDouble>();
668 gravity_vector_ptr->resize(
SPACE_DIM, 1);
669 auto set_body_force = [&]() {
673 double unit_weight = 0.;
678 t_force(1) = -unit_weight;
680 t_force(2) = unit_weight;
686 pip.push_back(
new OpBodyForce(
"V", gravity_vector_ptr,
687 [](
double,
double,
double) {
return 1.; }));
690 auto mat_H_tensor_ptr = boost::make_shared<MatrixDouble>();
692 "F", mat_H_tensor_ptr));
709 auto mat_dot_F_tensor_ptr = boost::make_shared<MatrixDouble>();
711 "F_dot", mat_dot_F_tensor_ptr));
714 auto mat_x_grad_ptr = boost::make_shared<MatrixDouble>();
716 "x_2", mat_x_grad_ptr));
718 auto mat_F_tensor_ptr = boost::make_shared<MatrixDouble>();
720 mat_F_tensor_ptr, mat_H_tensor_ptr));
722 auto mat_F_stab_ptr = boost::make_shared<MatrixDouble>();
724 mat_F_tensor_ptr, mat_F_stab_ptr, mat_dot_F_tensor_ptr, tau, xi,
725 mat_x_grad_ptr, mat_v_grad_ptr));
727 PetscBool is_linear_elasticity = PETSC_TRUE;
729 &is_linear_elasticity, PETSC_NULLPTR);
731 auto mat_P_stab_ptr = boost::make_shared<MatrixDouble>();
732 if (is_linear_elasticity) {
737 auto inv_F = boost::make_shared<MatrixDouble>();
738 auto det_ptr = boost::make_shared<VectorDouble>();
746 mat_F_stab_ptr, inv_F, det_ptr));
756 CHKERR apply_rhs(pipeline_mng->getOpDomainExplicitRhsPipeline());
777 boost::shared_ptr<PostProcEle> post_proc,
778 boost::shared_ptr<PostProcFaceEle> post_proc_bdry,
779 boost::shared_ptr<MatrixDouble> velocity_field_ptr,
780 boost::shared_ptr<MatrixDouble> x2_field_ptr,
781 boost::shared_ptr<MatrixDouble> geometry_field_ptr,
782 std::array<double, 3> pass_field_eval_coords,
783 boost::shared_ptr<SetPtsData> pass_field_eval_data)
795 ->evalFEAtThePoint<SPACE_DIM>(
805 double u_x = t_x2_field(0) - t_geom(0);
806 double u_y = t_x2_field(1) - t_geom(1);
807 double u_z = t_x2_field(2) - t_geom(2);
810 <<
"Velocities x: " << t_vel(0) <<
" y: " << t_vel(1)
811 <<
" z: " << t_vel(2) <<
"\n";
812 MOFEM_LOG(
"SYNC", Sev::inform) <<
"Displacement x: " << u_x
813 <<
" y: " << u_y <<
" z: " << u_z <<
"\n";
817 std::regex((boost::format(
"%s(.*)") %
"Data_Vertex").str()))) {
821 auto print_vets = [](boost::shared_ptr<FieldEntity> ent_ptr) {
823 if (!(ent_ptr->getPStatus() & PSTATUS_NOT_OWNED)) {
825 <<
"Velocities: " << ent_ptr->getEntFieldData()[0] <<
" "
826 << ent_ptr->getEntFieldData()[1] <<
" "
827 << ent_ptr->getEntFieldData()[2] <<
"\n";
832 print_vets,
"V", &ents);
836 PetscBool print_volume = PETSC_FALSE;
840 PetscBool print_skin = PETSC_FALSE;
852 "out_step_" + boost::lexical_cast<std::string>(
ts_step) +
".h5m");
858 "out_boundary_" + boost::lexical_cast<std::string>(
ts_step) +
882 auto dm =
simple->getDM();
884 auto calculate_stress_ops = [&](
auto &pip) {
887 auto v_ptr = boost::make_shared<MatrixDouble>();
889 auto X_ptr = boost::make_shared<MatrixDouble>();
893 auto x_ptr = boost::make_shared<MatrixDouble>();
897 auto mat_H_tensor_ptr = boost::make_shared<MatrixDouble>();
899 "F", mat_H_tensor_ptr));
901 auto u_ptr = boost::make_shared<MatrixDouble>();
905 auto mat_F_ptr = boost::make_shared<MatrixDouble>();
907 mat_F_ptr, mat_H_tensor_ptr));
909 PetscBool is_linear_elasticity = PETSC_TRUE;
911 &is_linear_elasticity, PETSC_NULLPTR);
913 auto mat_P_ptr = boost::make_shared<MatrixDouble>();
914 if (is_linear_elasticity) {
919 auto inv_F = boost::make_shared<MatrixDouble>();
920 auto det_ptr = boost::make_shared<VectorDouble>();
926 mat_F_ptr, inv_F, det_ptr));
929 auto mat_v_grad_ptr = boost::make_shared<MatrixDouble>();
931 "V", mat_v_grad_ptr));
933 return boost::make_tuple(v_ptr, X_ptr, x_ptr, mat_P_ptr, mat_F_ptr, u_ptr);
936 auto post_proc_boundary = [&]() {
937 auto boundary_post_proc_fe = boost::make_shared<PostProcFaceEle>(
mField);
940 boundary_post_proc_fe->getOpPtrVector(), {},
"GEOMETRY");
944 auto [boundary_v_ptr, boundary_X_ptr, boundary_x_ptr, boundary_mat_P_ptr,
945 boundary_mat_F_ptr, boundary_u_ptr] =
946 calculate_stress_ops(op_loop_side->getOpPtrVector());
947 boundary_post_proc_fe->getOpPtrVector().push_back(op_loop_side);
951 boundary_post_proc_fe->getOpPtrVector().push_back(
955 boundary_post_proc_fe->getPostProcMesh(),
956 boundary_post_proc_fe->getMapGaussPts(),
961 {
"GEOMETRY", boundary_X_ptr},
962 {
"x", boundary_x_ptr},
963 {
"U", boundary_u_ptr}},
966 {
"F", boundary_mat_F_ptr}},
973 return boundary_post_proc_fe;
987 auto ts_pre_post_proc = boost::make_shared<TSPrePostProc>();
993 boost::shared_ptr<DomainEle> vol_mass_ele(
new DomainEle(mField));
1003 vol_mass_ele->getOpPtrVector().push_back(
new OpMassV(
"V",
"V", get_rho));
1004 vol_mass_ele->getOpPtrVector().push_back(
new OpMassF(
"F",
"F"));
1007 CHKERR MatAssemblyBegin(M, MAT_FINAL_ASSEMBLY);
1008 CHKERR MatAssemblyEnd(M, MAT_FINAL_ASSEMBLY);
1011 CHKERR MatGetRowSum(M, lumpVec);
1013 CHKERR MatZeroEntries(M);
1014 CHKERR MatDiagonalSet(M, lumpVec, INSERT_VALUES);
1019 CHKERR KSPSetOperators(ksp, M, M);
1020 CHKERR KSPSetFromOptions(ksp);
1023 auto solve_boundary_for_g = [&]() {
1025 if (*(pipeline_mng->getBoundaryExplicitRhsFE()->vecAssembleSwitch)) {
1027 CHKERR VecGhostUpdateBegin(pipeline_mng->getBoundaryExplicitRhsFE()->ts_F,
1028 ADD_VALUES, SCATTER_REVERSE);
1029 CHKERR VecGhostUpdateEnd(pipeline_mng->getBoundaryExplicitRhsFE()->ts_F,
1030 ADD_VALUES, SCATTER_REVERSE);
1031 CHKERR VecAssemblyBegin(pipeline_mng->getBoundaryExplicitRhsFE()->ts_F);
1032 CHKERR VecAssemblyEnd(pipeline_mng->getBoundaryExplicitRhsFE()->ts_F);
1033 *(pipeline_mng->getBoundaryExplicitRhsFE()->vecAssembleSwitch) =
false;
1037 CHKERR KSPSolve(ksp, pipeline_mng->getBoundaryExplicitRhsFE()->ts_F,
D);
1038 CHKERR VecGhostUpdateBegin(
D, INSERT_VALUES, SCATTER_FORWARD);
1039 CHKERR VecGhostUpdateEnd(
D, INSERT_VALUES, SCATTER_FORWARD);
1040 CHKERR VecCopy(
D, pipeline_mng->getBoundaryExplicitRhsFE()->ts_F);
1046 pipeline_mng->getBoundaryExplicitRhsFE()->postProcessHook =
1047 solve_boundary_for_g;
1050 ts = pipeline_mng->createTSEX(dm);
1053 PetscBool field_eval_flag = PETSC_TRUE;
1054 boost::shared_ptr<MatrixDouble> velocity_field_ptr;
1055 boost::shared_ptr<MatrixDouble> geometry_field_ptr;
1056 boost::shared_ptr<MatrixDouble> spatial_position_field_ptr;
1057 boost::shared_ptr<SetPtsData> field_eval_data;
1059 std::array<double, 3> field_eval_coords = {0.5, 0.5, 5.};
1062 field_eval_coords.data(), &dim,
1065 if (field_eval_flag) {
1069 field_eval_data,
simple->getDomainFEName());
1071 field_eval_data->setEvalPoints(field_eval_coords.data(), 1);
1073 auto no_rule = [](int, int, int) {
return -1; };
1075 auto fe_ptr = field_eval_data->feMethodPtr.lock();
1076 fe_ptr->getRuleHook = no_rule;
1077 velocity_field_ptr = boost::make_shared<MatrixDouble>();
1078 geometry_field_ptr = boost::make_shared<MatrixDouble>();
1079 spatial_position_field_ptr = boost::make_shared<MatrixDouble>();
1080 fe_ptr->getOpPtrVector().push_back(
1082 fe_ptr->getOpPtrVector().push_back(
1084 geometry_field_ptr));
1085 fe_ptr->getOpPtrVector().push_back(
1087 "x_2", spatial_position_field_ptr));
1090 auto post_proc_domain = [&]() {
1091 auto post_proc_fe_vol = boost::make_shared<PostProcEle>(mField);
1095 auto [boundary_v_ptr, boundary_X_ptr, boundary_x_ptr, boundary_mat_P_ptr,
1096 boundary_mat_F_ptr, boundary_u_ptr] =
1097 calculate_stress_ops(post_proc_fe_vol->getOpPtrVector());
1099 post_proc_fe_vol->getOpPtrVector().push_back(
1103 post_proc_fe_vol->getPostProcMesh(),
1104 post_proc_fe_vol->getMapGaussPts(),
1108 {{
"V", boundary_v_ptr},
1109 {
"GEOMETRY", boundary_X_ptr},
1110 {
"x", boundary_x_ptr},
1111 {
"U", boundary_u_ptr}},
1113 {{
"FIRST_PIOLA", boundary_mat_P_ptr}, {
"F", boundary_mat_F_ptr}},
1120 return post_proc_fe_vol;
1123 boost::shared_ptr<FEMethod> null_fe;
1124 auto monitor_ptr = boost::make_shared<Monitor>(
1126 post_proc_boundary(), velocity_field_ptr, spatial_position_field_ptr,
1127 geometry_field_ptr, field_eval_coords, field_eval_data);
1130 null_fe, monitor_ptr);
1134 CHKERR TSSetExactFinalTime(ts, TS_EXACTFINALTIME_MATCHSTEP);
1139 CHKERR TSSetSolution(ts, T);
1140 CHKERR TSSetFromOptions(ts);
1146 boost::shared_ptr<ForcesAndSourcesCore> null;
1149 ptr->fsRawPtr =
this;
1151 CHKERR TSSolve(ts, NULL);
1152 CHKERR TSGetTime(ts, &ftime);
1162 PetscBool test_flg = PETSC_FALSE;
1170 CHKERR VecNorm(T, NORM_2, &nrm2);
1171 MOFEM_LOG(
"EXAMPLE", Sev::inform) <<
"Regression norm " << nrm2;
1172 constexpr double regression_value = 0.0194561;
1173 if (fabs(nrm2 - regression_value) > 1e-2)
1175 "Regression test failed; wrong norm value.");
1193 const char param_file[] =
"param_file.petsc";
1197 auto core_log = logging::core::get();
1206 DMType dm_name =
"DMMOFEM";
1211 moab::Core mb_instance;
1212 moab::Interface &moab = mb_instance;
ForcesAndSourcesCore::UserDataOperator UserDataOperator
#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)
constexpr int SPACE_DIM
[Define dimension]
constexpr double shear_modulus_G
constexpr double bulk_modulus_K
ElementsAndOps< SPACE_DIM >::BoundaryEle BoundaryEle
ElementsAndOps< SPACE_DIM >::DomainEle DomainEle
[Define dimension]
#define CATCH_ERRORS
Catch errors.
FieldApproximationBase
approximation base
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base nme:nme847.
#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
static boost::weak_ptr< TSPrePostProc > tsPrePostProc
static char help[]
[Check]
FormsIntegrators< DomainEleOp >::Assembly< AssemblyType::PETSC >::LinearForm< IntegrationType::GAUSS >::OpBaseTimesVector< 1, SPACE_DIM *SPACE_DIM, 1 > OpRhsTestPiola
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpMass< 1, SPACE_DIM > OpMassV
FormsIntegrators< DomainEleOp >::Assembly< AssemblyType::PETSC >::LinearForm< IntegrationType::GAUSS >::OpGradTimesTensor< 1, SPACE_DIM, SPACE_DIM > OpGradTimesTensor2
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpMass< 1, SPACE_DIM *SPACE_DIM > OpMassF
constexpr double poisson_ratio
constexpr double omega
Save field DOFS on vertices/tags.
PostProcEleByDim< SPACE_DIM >::PostProcEleBdy PostProcEleBdy
PipelineManager::ElementsAndOpsByDim< SPACE_DIM >::DomainEle DomainEle
FormsIntegrators< DomainEleOp >::Assembly< AssemblyType::PETSC >::LinearForm< IntegrationType::GAUSS >::OpGradTimesTensor< 1, SPACE_DIM, SPACE_DIM > OpGradTimesPiola
double trace(FTensor::Tensor2< T, 2, 2 > &t_stress)
constexpr double young_modulus
static boost::weak_ptr< TSPrePostProc > tsPrePostProc
PetscErrorCode DMoFEMMeshToLocalVector(DM dm, Vec l, InsertMode mode, ScatterMode scatter_mode)
set local (or ghosted) vector values on mesh for partition only
PetscErrorCode DMCreateMatrix_MoFEM(DM dm, Mat *M)
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)
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.
MoFEMErrorCode getCubitMeshsetPtr(const int ms_id, const CubitBCType cubit_bc_type, const CubitMeshSets **cubit_meshset_ptr) const
get cubit meshset
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)
DEPRECATED SmartPetscObj< Vec > smartVectorDuplicate(Vec vec)
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)
PetscErrorCode PetscOptionsGetRealArray(PetscOptions *, const char pre[], const char name[], PetscReal dval[], PetscInt *nmax, PetscBool *set)
FTensor::Tensor1< FTensor::PackPtr< T *, S >, Tensor_Dim > getFTensor1FromMat(ublas::matrix< T, L, A > &data)
Get tensor rank 1 (vector) form data matrix.
FTensor::Tensor2< FTensor::PackPtr< double *, 1 >, Tensor_Dim1, Tensor_Dim2 > getFTensor2FromMat(MatrixDouble &data)
Get tensor rank 2 (matrix) form data matrix.
static auto getFTensor0FromVec(ublas::vector< T, A > &data)
Get tensor rank 0 (scalar) form data vector.
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
#define EXECUTABLE_DIMENSION
ElementsAndOps< SPACE_DIM >::SideEle SideEle
static constexpr int approx_order
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
MoFEMErrorCode checkResults()
[Postprocess results]
MoFEMErrorCode solveSystem()
[Solve]
Example(MoFEM::Interface &m_field)
MoFEMErrorCode runProblem()
MoFEM::Interface & mField
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 ptr object.
Simple interface for fast problem set-up.
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.
structure to get information form 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.
Get values at integration pts for tensor field rank 1, i.e. vector field.
Element used to execute operators on side of the element.
Post post-proc data at points from hash maps.
std::map< std::string, boost::shared_ptr< MatrixDouble > > DataMapMat
std::map< std::string, boost::shared_ptr< VectorDouble > > DataMapVec
PipelineManager interface.
Projection of edge entities with one mid-node on hierarchical basis.
Simple interface for fast problem set-up.
MoFEMErrorCode getOptions()
get options
intrusive_ptr for managing petsc objects
PetscInt ts_step
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()
function is run at the end of loop
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.
DomainNaturalBCRhs::OpFlux< NaturalMeshsetType< BLOCKSET >, 1, SPACE_DIM > OpBodyForce