26 namespace HydroMechanics
30 template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
31 typename IntegrationMethod,
int DisplacementDim>
32 HydroMechanicsLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure,
33 IntegrationMethod, DisplacementDim>::
34 HydroMechanicsLocalAssembler(
37 bool const is_axially_symmetric,
38 unsigned const integration_order,
40 : _process_data(process_data),
41 _integration_method(integration_order),
43 _is_axially_symmetric(is_axially_symmetric)
45 unsigned const n_integration_points =
48 _ip_data.reserve(n_integration_points);
51 auto const shape_matrices_u =
54 DisplacementDim>(e, is_axially_symmetric,
57 auto const shape_matrices_p =
62 auto const& solid_material =
67 for (
unsigned ip = 0; ip < n_integration_points; ip++)
69 _ip_data.emplace_back(solid_material);
71 auto const& sm_u = shape_matrices_u[ip];
72 ip_data.integration_weight =
74 sm_u.integralMeasure * sm_u.detJ;
77 static const int kelvin_vector_size =
79 ip_data.sigma_eff.setZero(kelvin_vector_size);
80 ip_data.eps.setZero(kelvin_vector_size);
83 ip_data.eps_prev.resize(kelvin_vector_size);
84 ip_data.sigma_eff_prev.resize(kelvin_vector_size);
86 ip_data.N_u_op = ShapeMatricesTypeDisplacement::template MatrixType<
89 for (
int i = 0; i < DisplacementDim; ++i)
98 ip_data.dNdx_u = sm_u.dNdx;
100 ip_data.N_p = shape_matrices_p[ip].N;
101 ip_data.dNdx_p = shape_matrices_p[ip].dNdx;
107 template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
108 typename IntegrationMethod,
int DisplacementDim>
110 ShapeFunctionPressure, IntegrationMethod,
112 assembleWithJacobian(
double const t,
double const dt,
113 std::vector<double>
const& local_x,
114 std::vector<double>
const& local_xdot,
115 const double ,
const double ,
116 std::vector<double>& ,
117 std::vector<double>& ,
118 std::vector<double>& local_rhs_data,
119 std::vector<double>& local_Jac_data)
121 assert(local_x.size() == pressure_size + displacement_size);
123 auto p = Eigen::Map<
typename ShapeMatricesTypePressure::template VectorType<
124 pressure_size>
const>(local_x.data() + pressure_index, pressure_size);
127 Eigen::Map<
typename ShapeMatricesTypeDisplacement::template VectorType<
128 displacement_size>
const>(local_x.data() + displacement_index,
132 Eigen::Map<
typename ShapeMatricesTypePressure::template VectorType<
133 pressure_size>
const>(local_xdot.data() + pressure_index,
136 Eigen::Map<
typename ShapeMatricesTypeDisplacement::template VectorType<
137 displacement_size>
const>(local_xdot.data() + displacement_index,
141 typename ShapeMatricesTypeDisplacement::template MatrixType<
142 displacement_size + pressure_size,
143 displacement_size + pressure_size>>(
144 local_Jac_data, displacement_size + pressure_size,
145 displacement_size + pressure_size);
148 typename ShapeMatricesTypeDisplacement::template VectorType<
149 displacement_size + pressure_size>>(
150 local_rhs_data, displacement_size + pressure_size);
153 ShapeMatricesTypePressure::NodalMatrixType::Zero(pressure_size,
157 ShapeMatricesTypePressure::NodalMatrixType::Zero(pressure_size,
161 ShapeMatricesTypePressure::NodalMatrixType::Zero(pressure_size,
164 typename ShapeMatricesTypeDisplacement::template MatrixType<
165 displacement_size, pressure_size>
166 Kup = ShapeMatricesTypeDisplacement::template MatrixType<
167 displacement_size, pressure_size>::Zero(displacement_size,
170 typename ShapeMatricesTypeDisplacement::template MatrixType<
171 pressure_size, displacement_size>
172 Kpu = ShapeMatricesTypeDisplacement::template MatrixType<
173 pressure_size, displacement_size>::Zero(pressure_size,
177 *_process_data.solid_materials[0];
182 unsigned const n_integration_points =
183 _integration_method.getNumberOfPoints();
185 auto const& b = _process_data.specific_body_force;
186 auto const& medium = _process_data.media_map->getMedium(_element.getID());
187 auto const& solid = medium->phase(
"Solid");
193 .template value<double>(vars, x_position, t, dt);
196 auto const& identity2 = Invariants::identity2;
198 for (
unsigned ip = 0; ip < n_integration_points; ip++)
201 auto const& w = _ip_data[ip].integration_weight;
203 auto const& N_u_op = _ip_data[ip].N_u_op;
205 auto const& N_u = _ip_data[ip].N_u;
206 auto const& dNdx_u = _ip_data[ip].dNdx_u;
208 auto const& N_p = _ip_data[ip].N_p;
209 auto const& dNdx_p = _ip_data[ip].dNdx_p;
217 ShapeFunctionDisplacement::NPOINTS,
219 dNdx_u, N_u, x_coord, _is_axially_symmetric);
221 auto& eps = _ip_data[ip].eps;
222 eps.noalias() = B * u;
223 auto const& sigma_eff = _ip_data[ip].sigma_eff;
225 double const p_int_pt = N_p.dot(
p);
226 vars[
static_cast<int>(MPL::Variable::phase_pressure)] = p_int_pt;
228 auto const C_el = _ip_data[ip].computeElasticTangentStiffness(
229 t, x_position, dt, T_ref);
230 auto const K_S = solid_material.
getBulkModulus(t, x_position, &C_el);
233 .template value<double>(vars, x_position, t, dt);
237 .template value<double>(vars, x_position, t, dt);
240 .template value<double>(vars, x_position, t, dt);
243 .template value<double>(vars, x_position, t, dt);
254 .template value<double>(vars, x_position, t, dt);
258 .template value<double>(vars, x_position, t, dt);
261 .template dValue<double>(vars, MPL::Variable::phase_pressure,
268 auto const sigma_total =
269 (_ip_data[ip].sigma_eff -
alpha * p_int_pt * identity2).eval();
271 vars[
static_cast<int>(MPL::Variable::total_stress)]
272 .emplace<SymmetricTensor>(
277 vars[
static_cast<int>(MPL::Variable::volumetric_strain)] =
278 Invariants::trace(eps);
279 vars[
static_cast<int>(MPL::Variable::equivalent_plastic_strain)] =
280 _ip_data[ip].material_state_variables->getEquivalentPlasticStrain();
281 vars[
static_cast<int>(MPL::Variable::mechanical_strain)]
285 auto const K = MPL::formEigenTensor<DisplacementDim>(
287 .value(vars, x_position, t, dt));
289 auto const K_over_mu = K / mu;
291 auto C = _ip_data[ip].updateConstitutiveRelation(vars, t, x_position,
298 .template block<displacement_size, displacement_size>(
299 displacement_index, displacement_index)
300 .noalias() += B.transpose() * C * B * w;
303 local_rhs.template segment<displacement_size>(displacement_index)
305 (B.transpose() * sigma_eff - N_u_op.transpose() * rho * b) * w;
310 Kup.noalias() += B.transpose() *
alpha * identity2 * N_p * w;
315 laplace_p.noalias() +=
316 rho_fr * dNdx_p.transpose() * K_over_mu * dNdx_p * w;
318 storage_p.noalias() +=
319 rho_fr * N_p.transpose() * N_p * w *
324 add_p_derivative.noalias() += rho_fr * beta_p * dNdx_p.transpose() *
326 (dNdx_p *
p - 2.0 * rho_fr * b) * N_p * w;
328 local_rhs.template segment<pressure_size>(pressure_index).noalias() +=
329 dNdx_p.transpose() * rho_fr * rho_fr * K_over_mu * b * w;
335 rho_fr *
alpha * N_p.transpose() * identity2.transpose() * B * w;
339 .template block<displacement_size, pressure_size>(displacement_index,
343 if (_process_data.mass_lumping)
345 storage_p = storage_p.colwise().sum().eval().asDiagonal();
347 if constexpr (pressure_size == displacement_size)
349 Kpu = Kpu.colwise().sum().eval().asDiagonal();
355 .template block<pressure_size, pressure_size>(pressure_index,
357 .noalias() = laplace_p + storage_p / dt + add_p_derivative;
361 .template block<pressure_size, displacement_size>(pressure_index,
363 .noalias() = Kpu / dt;
366 local_rhs.template segment<pressure_size>(pressure_index).noalias() -=
367 laplace_p *
p + storage_p * p_dot + Kpu * u_dot;
370 local_rhs.template segment<displacement_size>(displacement_index)
371 .noalias() += Kup *
p;
374 template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
375 typename IntegrationMethod,
int DisplacementDim>
376 std::vector<double>
const&
378 IntegrationMethod, DisplacementDim>::
379 getIntPtDarcyVelocity(
381 std::vector<GlobalVector*>
const& x,
382 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& dof_table,
383 std::vector<double>& cache)
const
385 int const hydraulic_process_id = _process_data.hydraulic_process_id;
388 assert(!indices.empty());
389 auto const local_x = x[hydraulic_process_id]->get(indices);
391 unsigned const n_integration_points =
392 _integration_method.getNumberOfPoints();
395 double, DisplacementDim, Eigen::Dynamic, Eigen::RowMajor>>(
396 cache, DisplacementDim, n_integration_points);
398 auto p = Eigen::Map<
typename ShapeMatricesTypePressure::template VectorType<
399 pressure_size>
const>(local_x.data() + pressure_index, pressure_size);
404 auto const& medium = _process_data.media_map->getMedium(_element.getID());
410 double const dt = std::numeric_limits<double>::quiet_NaN();
413 .template value<double>(vars, x_position, t, dt);
415 auto const& identity2 = Invariants::identity2;
417 for (
unsigned ip = 0; ip < n_integration_points; ip++)
419 x_position.setIntegrationPoint(ip);
421 double const p_int_pt = _ip_data[ip].N_p.dot(
p);
422 vars[
static_cast<int>(MPL::Variable::phase_pressure)] = p_int_pt;
425 .template value<double>(vars, x_position, t, dt);
429 auto const sigma_total =
430 (_ip_data[ip].sigma_eff -
alpha * p_int_pt * identity2).eval();
431 vars[
static_cast<int>(MPL::Variable::total_stress)]
432 .emplace<SymmetricTensor>(
437 vars[
static_cast<int>(MPL::Variable::volumetric_strain)] =
438 Invariants::trace(_ip_data[ip].eps);
439 vars[
static_cast<int>(MPL::Variable::equivalent_plastic_strain)] =
440 _ip_data[ip].material_state_variables->getEquivalentPlasticStrain();
441 vars[
static_cast<int>(MPL::Variable::mechanical_strain)]
445 auto const K = MPL::formEigenTensor<DisplacementDim>(
447 .value(vars, x_position, t, dt));
450 .template value<double>(vars, x_position, t, dt);
460 .template value<double>(vars, x_position, t, dt);
464 .template value<double>(vars, x_position, t, dt);
466 auto const K_over_mu = K / mu;
468 auto const& b = _process_data.specific_body_force;
471 auto const& dNdx_p = _ip_data[ip].dNdx_p;
472 cache_matrix.col(ip).noalias() =
473 -K_over_mu * dNdx_p *
p + K_over_mu * rho_fr * b;
479 template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
480 typename IntegrationMethod,
int DisplacementDim>
482 ShapeFunctionPressure, IntegrationMethod,
484 assembleWithJacobianForPressureEquations(
485 const double t,
double const dt, Eigen::VectorXd
const& local_x,
486 Eigen::VectorXd
const& local_xdot, std::vector<double>& local_b_data,
487 std::vector<double>& local_Jac_data)
491 template VectorType<pressure_size>>(
492 local_b_data, pressure_size);
497 auto const p = local_x.template segment<pressure_size>(pressure_index);
500 local_xdot.template segment<pressure_size>(pressure_index);
503 typename ShapeMatricesTypeDisplacement::template MatrixType<
504 pressure_size, pressure_size>>(local_Jac_data, pressure_size,
508 ShapeMatricesTypePressure::NodalMatrixType::Zero(pressure_size,
512 ShapeMatricesTypePressure::NodalMatrixType::Zero(pressure_size,
516 ShapeMatricesTypePressure::NodalMatrixType::Zero(pressure_size,
520 ShapeMatricesTypePressure::NodalMatrixType::Zero(pressure_size,
524 *_process_data.solid_materials[0];
529 auto const& medium = _process_data.media_map->getMedium(_element.getID());
535 .template value<double>(vars, x_position, t, dt);
538 auto const& identity2 = Invariants::identity2;
540 int const n_integration_points = _integration_method.getNumberOfPoints();
541 for (
int ip = 0; ip < n_integration_points; ip++)
544 auto const& w = _ip_data[ip].integration_weight;
546 auto const& N_p = _ip_data[ip].N_p;
547 auto const& dNdx_p = _ip_data[ip].dNdx_p;
549 double const p_int_pt = N_p.dot(
p);
550 vars[
static_cast<int>(MPL::Variable::phase_pressure)] = p_int_pt;
552 auto const C_el = _ip_data[ip].computeElasticTangentStiffness(
553 t, x_position, dt, T_ref);
554 auto const K_S = solid_material.
getBulkModulus(t, x_position, &C_el);
558 .template value<double>(vars, x_position, t, dt);
562 auto const sigma_total =
563 (_ip_data[ip].sigma_eff - alpha_b * p_int_pt * identity2).eval();
564 vars[
static_cast<int>(MPL::Variable::total_stress)]
565 .emplace<SymmetricTensor>(
570 vars[
static_cast<int>(MPL::Variable::volumetric_strain)] =
571 Invariants::trace(_ip_data[ip].eps);
572 vars[
static_cast<int>(MPL::Variable::equivalent_plastic_strain)] =
573 _ip_data[ip].material_state_variables->getEquivalentPlasticStrain();
574 vars[
static_cast<int>(MPL::Variable::mechanical_strain)]
578 auto const K = MPL::formEigenTensor<DisplacementDim>(
580 .value(vars, x_position, t, dt));
583 .template value<double>(vars, x_position, t, dt);
586 .template value<double>(vars, x_position, t, dt);
596 .template value<double>(vars, x_position, t, dt);
600 .template value<double>(vars, x_position, t, dt);
603 .template dValue<double>(vars, MPL::Variable::phase_pressure,
607 auto const K_over_mu = K / mu;
610 auto const beta_FS = 0.5 * alpha_b * alpha_b / K_S;
613 rho_fr * dNdx_p.transpose() * K_over_mu * dNdx_p * w;
616 rho_fr * N_p.transpose() * N_p * w *
619 auto const& b = _process_data.specific_body_force;
622 local_rhs.noalias() +=
623 dNdx_p.transpose() * rho_fr * rho_fr * K_over_mu * b * w;
628 add_p_derivative.noalias() += rho_fr * beta_p * dNdx_p.transpose() *
630 (dNdx_p *
p - 2.0 * rho_fr * b) * N_p * w;
632 auto& eps = _ip_data[ip].eps;
633 auto& eps_prev = _ip_data[ip].eps_prev;
634 const double eps_v_dot =
635 (Invariants::trace(eps) - Invariants::trace(eps_prev)) / dt;
637 const double p_c = _ip_data[ip].coupling_pressure;
640 coupling.noalias() += rho_fr * N_p.transpose() * N_p * w * beta_FS / dt;
643 local_rhs.noalias() -=
644 (alpha_b * eps_v_dot - beta_FS * p_c / dt) * rho_fr * N_p * w;
646 local_Jac.noalias() = laplace +
storage / dt + add_p_derivative + coupling;
648 local_rhs.noalias() -= laplace *
p +
storage * p_dot + coupling *
p;
651 template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
652 typename IntegrationMethod,
int DisplacementDim>
654 ShapeFunctionPressure, IntegrationMethod,
656 assembleWithJacobianForDeformationEquations(
657 const double t,
double const dt, Eigen::VectorXd
const& local_x,
658 std::vector<double>& local_b_data, std::vector<double>& local_Jac_data)
660 auto const p = local_x.template segment<pressure_size>(pressure_index);
662 local_x.template segment<displacement_size>(displacement_index);
665 typename ShapeMatricesTypeDisplacement::template MatrixType<
666 displacement_size, displacement_size>>(
667 local_Jac_data, displacement_size, displacement_size);
671 template VectorType<displacement_size>>(
672 local_b_data, displacement_size);
677 auto const& medium = _process_data.media_map->getMedium(_element.getID());
678 auto const& solid = medium->phase(
"Solid");
684 .template value<double>(vars, x_position, t, dt);
687 int const n_integration_points = _integration_method.getNumberOfPoints();
688 for (
int ip = 0; ip < n_integration_points; ip++)
690 x_position.setIntegrationPoint(ip);
691 auto const& w = _ip_data[ip].integration_weight;
693 auto const& N_u_op = _ip_data[ip].N_u_op;
695 auto const& N_u = _ip_data[ip].N_u;
696 auto const& dNdx_u = _ip_data[ip].dNdx_u;
698 auto const& N_p = _ip_data[ip].N_p;
706 ShapeFunctionDisplacement::NPOINTS,
708 dNdx_u, N_u, x_coord, _is_axially_symmetric);
710 auto& eps = _ip_data[ip].eps;
711 auto const& sigma_eff = _ip_data[ip].sigma_eff;
713 vars[
static_cast<int>(MPL::Variable::phase_pressure)] = N_p.dot(
p);
716 .template value<double>(vars, x_position, t, dt);
719 .template value<double>(vars, x_position, t, dt);
722 .template value<double>(vars, x_position, t, dt);
733 .template value<double>(vars, x_position, t, dt);
737 .template value<double>(vars, x_position, t, dt);
739 auto const& b = _process_data.specific_body_force;
742 DisplacementDim)>::identity2;
744 eps.noalias() = B * u;
745 vars[
static_cast<int>(MPL::Variable::mechanical_strain)]
749 auto C = _ip_data[ip].updateConstitutiveRelation(vars, t, x_position,
752 local_Jac.noalias() += B.transpose() * C * B * w;
758 local_rhs.noalias() -=
759 (B.transpose() * (sigma_eff -
alpha * identity2 * p_at_xi) -
760 N_u_op.transpose() * rho * b) *
765 template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
766 typename IntegrationMethod,
int DisplacementDim>
768 ShapeFunctionPressure, IntegrationMethod,
770 assembleWithJacobianForStaggeredScheme(
771 const double t,
double const dt, Eigen::VectorXd
const& local_x,
772 Eigen::VectorXd
const& local_xdot,
const double ,
773 const double ,
int const process_id,
774 std::vector<double>& ,
775 std::vector<double>& ,
776 std::vector<double>& local_b_data, std::vector<double>& local_Jac_data)
779 if (process_id == _process_data.hydraulic_process_id)
781 assembleWithJacobianForPressureEquations(t, dt, local_x, local_xdot,
782 local_b_data, local_Jac_data);
787 assembleWithJacobianForDeformationEquations(t, dt, local_x, local_b_data,
791 template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
792 typename IntegrationMethod,
int DisplacementDim>
794 ShapeFunctionPressure, IntegrationMethod,
796 setInitialConditionsConcrete(std::vector<double>
const& local_x,
798 bool const use_monolithic_scheme,
799 int const process_id)
801 int const n_integration_points = _integration_method.getNumberOfPoints();
803 if (use_monolithic_scheme || process_id == 0)
806 Eigen::Map<
typename ShapeMatricesTypePressure::template VectorType<
807 pressure_size>
const>(local_x.data(), pressure_size);
809 for (
int ip = 0; ip < n_integration_points; ip++)
811 auto const& N_p = _ip_data[ip].N_p;
812 _ip_data[ip].coupling_pressure = N_p.dot(
p);
816 if (use_monolithic_scheme || process_id == 1)
821 const int displacement_offset =
822 use_monolithic_scheme ? displacement_index : 0;
824 auto u = Eigen::Map<
typename ShapeMatricesTypeDisplacement::
825 template VectorType<displacement_size>
const>(
826 local_x.data() + displacement_offset, displacement_size);
830 for (
int ip = 0; ip < n_integration_points; ip++)
833 auto const& N_u = _ip_data[ip].N_u;
834 auto const& dNdx_u = _ip_data[ip].dNdx_u;
841 DisplacementDim, ShapeFunctionDisplacement::NPOINTS,
843 _is_axially_symmetric);
845 auto& eps = _ip_data[ip].eps;
846 eps.noalias() = B * u;
847 vars[
static_cast<int>(MPL::Variable::mechanical_strain)]
855 template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
856 typename IntegrationMethod,
int DisplacementDim>
858 ShapeFunctionPressure, IntegrationMethod,
860 postNonLinearSolverConcrete(std::vector<double>
const& local_x,
861 std::vector<double>
const& ,
862 double const t,
double const dt,
863 bool const use_monolithic_scheme,
864 int const process_id)
866 int const n_integration_points = _integration_method.getNumberOfPoints();
868 if (use_monolithic_scheme || process_id == 0)
871 Eigen::Map<
typename ShapeMatricesTypePressure::template VectorType<
872 pressure_size>
const>(local_x.data(), pressure_size);
874 for (
int ip = 0; ip < n_integration_points; ip++)
876 auto const& N_p = _ip_data[ip].N_p;
877 _ip_data[ip].coupling_pressure = N_p.dot(
p);
881 if (use_monolithic_scheme || process_id == 1)
887 _process_data.media_map->getMedium(_element.getID());
894 const int displacement_offset =
895 use_monolithic_scheme ? displacement_index : 0;
897 auto u = Eigen::Map<
typename ShapeMatricesTypeDisplacement::
898 template VectorType<displacement_size>
const>(
899 local_x.data() + displacement_offset, displacement_size);
904 for (
int ip = 0; ip < n_integration_points; ip++)
907 auto const& N_u = _ip_data[ip].N_u;
908 auto const& dNdx_u = _ip_data[ip].dNdx_u;
915 DisplacementDim, ShapeFunctionDisplacement::NPOINTS,
917 _is_axially_symmetric);
919 auto& eps = _ip_data[ip].eps;
920 eps.noalias() = B * u;
921 vars[
static_cast<int>(MPL::Variable::mechanical_strain)]
926 _ip_data[ip].updateConstitutiveRelation(vars, t, x_position, dt, u,
932 template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
933 typename IntegrationMethod,
int DisplacementDim>
935 ShapeFunctionDisplacement, ShapeFunctionPressure, IntegrationMethod,
936 DisplacementDim>::setIPDataInitialConditions(std::string
const&
name,
937 double const* values,
938 int const integration_order)
940 if (integration_order !=
941 static_cast<int>(_integration_method.getIntegrationOrder()))
944 "Setting integration point initial conditions; The integration "
945 "order of the local assembler for element {:d} is different from "
946 "the integration order in the initial condition.",
950 if (
name ==
"sigma_ip")
952 if (_process_data.initial_stress !=
nullptr)
955 "Setting initial conditions for stress from integration "
956 "point data and from a parameter '{:s}' is not possible "
958 _process_data.initial_stress->name);
961 return ProcessLib::setIntegrationPointKelvinVectorData<DisplacementDim>(
962 values, _ip_data, &IpData::sigma_eff);
965 if (
name ==
"epsilon_ip")
967 return ProcessLib::setIntegrationPointKelvinVectorData<DisplacementDim>(
968 values, _ip_data, &IpData::eps);
974 template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
975 typename IntegrationMethod,
int DisplacementDim>
977 ShapeFunctionDisplacement, ShapeFunctionPressure, IntegrationMethod,
978 DisplacementDim>::getSigma()
const
980 return ProcessLib::getIntegrationPointKelvinVectorData<DisplacementDim>(
981 _ip_data, &IpData::sigma_eff);
984 template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
985 typename IntegrationMethod,
int DisplacementDim>
987 ShapeFunctionDisplacement, ShapeFunctionPressure, IntegrationMethod,
988 DisplacementDim>::getEpsilon()
const
990 auto const kelvin_vector_size =
992 unsigned const n_integration_points =
993 _integration_method.getNumberOfPoints();
995 std::vector<double> ip_epsilon_values;
997 double, Eigen::Dynamic, kelvin_vector_size, Eigen::RowMajor>>(
998 ip_epsilon_values, n_integration_points, kelvin_vector_size);
1000 for (
unsigned ip = 0; ip < n_integration_points; ++ip)
1002 auto const& eps = _ip_data[ip].eps;
1007 return ip_epsilon_values;
1010 template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
1011 typename IntegrationMethod,
int DisplacementDim>
1013 ShapeFunctionPressure, IntegrationMethod,
1015 computeSecondaryVariableConcrete(
double const t,
double const dt,
1016 Eigen::VectorXd
const& local_x,
1017 Eigen::VectorXd
const& )
1019 auto const p = local_x.template segment<pressure_size>(pressure_index);
1022 ShapeFunctionPressure,
typename ShapeFunctionDisplacement::MeshElement,
1023 DisplacementDim>(_element, _is_axially_symmetric,
p,
1024 *_process_data.pressure_interpolated);
1026 int const elem_id = _element.getID();
1029 unsigned const n_integration_points =
1030 _integration_method.getNumberOfPoints();
1032 auto const& medium = _process_data.media_map->getMedium(elem_id);
1036 auto sigma_eff_sum = MathLib::KelvinVector::tensorToKelvin<DisplacementDim>(
1037 Eigen::Matrix<double, 3, 3>::Zero());
1039 auto const& identity2 = Invariants::identity2;
1041 for (
unsigned ip = 0; ip < n_integration_points; ip++)
1045 auto const& eps = _ip_data[ip].eps;
1046 sigma_eff_sum += _ip_data[ip].sigma_eff;
1049 .template value<double>(vars, x_position, t, dt);
1050 double const p_int_pt = _ip_data[ip].N_p.dot(
p);
1051 vars[
static_cast<int>(MPL::Variable::phase_pressure)] = p_int_pt;
1056 auto const sigma_total =
1057 (_ip_data[ip].sigma_eff -
alpha * p_int_pt * identity2).eval();
1058 vars[
static_cast<int>(MPL::Variable::total_stress)]
1059 .emplace<SymmetricTensor>(
1064 vars[
static_cast<int>(MPL::Variable::volumetric_strain)] =
1065 Invariants::trace(eps);
1066 vars[
static_cast<int>(MPL::Variable::equivalent_plastic_strain)] =
1067 _ip_data[ip].material_state_variables->getEquivalentPlasticStrain();
1068 vars[
static_cast<int>(MPL::Variable::mechanical_strain)]
1072 k_sum += MPL::getSymmetricTensor<DisplacementDim>(
1074 .value(vars, x_position, t, dt));
1077 Eigen::Map<Eigen::VectorXd>(
1078 &(*_process_data.permeability)[elem_id * KelvinVectorSize],
1079 KelvinVectorSize) = k_sum / n_integration_points;
1081 Eigen::Matrix<double, 3, 3, 0, 3, 3>
const sigma_avg =
1083 n_integration_points;
1085 Eigen::SelfAdjointEigenSolver<Eigen::Matrix<double, 3, 3>> e_s(sigma_avg);
1087 Eigen::Map<Eigen::Vector3d>(
1088 &(*_process_data.principal_stress_values)[elem_id * 3], 3) =
1091 auto eigen_vectors = e_s.eigenvectors();
1093 for (
auto i = 0; i < 3; i++)
1095 Eigen::Map<Eigen::Vector3d>(
1096 &(*_process_data.principal_stress_vector[i])[elem_id * 3], 3) =
1097 eigen_vectors.col(i);
1101 template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
1102 typename IntegrationMethod,
int DisplacementDim>
1104 ShapeFunctionDisplacement, ShapeFunctionPressure, IntegrationMethod,
1105 DisplacementDim>::getNumberOfIntegrationPoints()
const
1107 return _integration_method.getNumberOfPoints();
1110 template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
1111 typename IntegrationMethod,
int DisplacementDim>
1113 DisplacementDim>::MaterialStateVariables
const&
1115 IntegrationMethod, DisplacementDim>::
1116 getMaterialStateVariablesAt(
unsigned integration_point)
const
1118 return *_ip_data[integration_point].material_state_variables;
virtual std::size_t getID() const final
Returns the ID of the element.
void setElementID(std::size_t element_id)
void setIntegrationPoint(unsigned integration_point)
MatrixType< _kelvin_vector_size, _number_of_dof > BMatrixType
HydroMechanicsProcessData< DisplacementDim > & _process_data
std::vector< IpData, Eigen::aligned_allocator< IpData > > _ip_data
ShapeMatrixPolicyType< ShapeFunctionPressure, DisplacementDim > ShapeMatricesTypePressure
Eigen::Matrix< double, KelvinVectorSize, 1 > SymmetricTensor
SecondaryData< typename ShapeMatricesTypeDisplacement::ShapeMatrices::ShapeType > _secondary_data
ShapeMatrixPolicyType< ShapeFunctionDisplacement, DisplacementDim > ShapeMatricesTypeDisplacement
static const int displacement_size
IntegrationMethod _integration_method
MechanicsBase< DisplacementDim > & selectSolidConstitutiveRelation(std::map< int, std::unique_ptr< MechanicsBase< DisplacementDim >>> const &constitutive_relations, MeshLib::PropertyVector< int > const *const material_ids, std::size_t const element_id)
Phase const & fluidPhase(Medium const &medium)
Returns a gas or aqueous liquid phase of the given medium.
std::array< VariableType, static_cast< int >(Variable::number_of_variables)> VariableArray
Eigen::Matrix< double, 4, 1 > kelvinVectorToSymmetricTensor(Eigen::Matrix< double, 4, 1, Eigen::ColMajor, 4, 1 > const &v)
Eigen::Matrix< double, kelvin_vector_dimensions(DisplacementDim), 1, Eigen::ColMajor > KelvinVectorType
constexpr int kelvin_vector_dimensions(int const displacement_dim)
Kelvin vector dimensions for given displacement dimension.
Eigen::Matrix< double, 3, 3 > kelvinVectorToTensor(Eigen::Matrix< double, 4, 1, Eigen::ColMajor, 4, 1 > const &v)
Eigen::Map< Matrix > createZeroedMatrix(std::vector< double > &data, Eigen::MatrixXd::Index rows, Eigen::MatrixXd::Index cols)
Eigen::Map< Vector > createZeroedVector(std::vector< double > &data, Eigen::VectorXd::Index size)
double interpolateXCoordinate(MeshLib::Element const &e, typename ShapeMatricesType::ShapeMatrices::ShapeType const &N)
void shapeFunctionInterpolate(const NodalValues &nodal_values, const ShapeMatrix &shape_matrix_N, double &interpolated_value, ScalarTypes &... interpolated_values)
void interpolateToHigherOrderNodes(MeshLib::Element const &element, bool const is_axially_symmetric, Eigen::MatrixBase< EigenMatrixType > const &node_values, MeshLib::PropertyVector< double > &interpolated_values_global_vector)
std::vector< GlobalIndexType > getIndices(std::size_t const mesh_item_id, NumLib::LocalToGlobalIndexMap const &dof_table)
std::vector< typename ShapeMatricesType::ShapeMatrices, Eigen::aligned_allocator< typename ShapeMatricesType::ShapeMatrices > > initShapeMatrices(MeshLib::Element const &e, bool const is_axially_symmetric, IntegrationMethod const &integration_method)
BMatrixType computeBMatrix(DNDX_Type const &dNdx, N_Type const &N, const double radius, const bool is_axially_symmetric)
Fills a B-matrix based on given shape function dN/dx values.
MatrixType< ShapeFunction::NPOINTS, ShapeFunction::NPOINTS > NodalMatrixType
virtual double getBulkModulus(double const, ParameterLib::SpatialPosition const &, KelvinMatrix const *const =nullptr) const
std::vector< ShapeMatrixType, Eigen::aligned_allocator< ShapeMatrixType > > N_u