14#include <Eigen/Eigenvalues>
32namespace MPL = MaterialPropertyLib;
34template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
38 HydroMechanicsLocalAssembler(
42 bool const is_axially_symmetric,
49 unsigned const n_integration_points =
52 _ip_data.reserve(n_integration_points);
55 auto const shape_matrices_u =
58 DisplacementDim>(e, is_axially_symmetric,
61 auto const shape_matrices_p =
66 auto const& solid_material =
71 for (
unsigned ip = 0; ip < n_integration_points; ip++)
73 _ip_data.emplace_back(solid_material);
75 auto const& sm_u = shape_matrices_u[ip];
76 ip_data.integration_weight =
78 sm_u.integralMeasure * sm_u.detJ;
81 static const int kelvin_vector_size =
83 ip_data.sigma_eff.setZero(kelvin_vector_size);
84 ip_data.eps.setZero(kelvin_vector_size);
87 ip_data.eps_prev.resize(kelvin_vector_size);
88 ip_data.sigma_eff_prev.resize(kelvin_vector_size);
91 ip_data.dNdx_u = sm_u.dNdx;
93 ip_data.N_p = shape_matrices_p[ip].N;
94 ip_data.dNdx_p = shape_matrices_p[ip].dNdx;
100template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
103 ShapeFunctionPressure, DisplacementDim>::
104 assembleWithJacobian(
double const t,
double const dt,
105 std::vector<double>
const& local_x,
106 std::vector<double>
const& local_x_prev,
107 std::vector<double>& local_rhs_data,
108 std::vector<double>& local_Jac_data)
112 auto p = Eigen::Map<
typename ShapeMatricesTypePressure::template VectorType<
116 Eigen::Map<
typename ShapeMatricesTypeDisplacement::template VectorType<
121 Eigen::Map<
typename ShapeMatricesTypePressure::template VectorType<
125 Eigen::Map<
typename ShapeMatricesTypeDisplacement::template VectorType<
130 typename ShapeMatricesTypeDisplacement::template MatrixType<
137 typename ShapeMatricesTypeDisplacement::template VectorType<
142 ShapeMatricesTypePressure::NodalMatrixType::Zero(
pressure_size,
146 ShapeMatricesTypePressure::NodalMatrixType::Zero(
pressure_size,
150 ShapeMatricesTypePressure::NodalMatrixType::Zero(
pressure_size,
153 typename ShapeMatricesTypeDisplacement::template MatrixType<
155 Kup = ShapeMatricesTypeDisplacement::template MatrixType<
159 typename ShapeMatricesTypeDisplacement::template MatrixType<
161 Kpu = ShapeMatricesTypeDisplacement::template MatrixType<
165 typename ShapeMatricesTypeDisplacement::template MatrixType<
167 Kpu_k = ShapeMatricesTypeDisplacement::template MatrixType<
171 auto const& solid_material =
179 unsigned const n_integration_points =
184 auto const& solid = medium->phase(
"Solid");
185 auto const& fluid = fluidPhase(*medium);
192 .template value<double>(vars, x_position, t, dt);
197 for (
unsigned ip = 0; ip < n_integration_points; ip++)
199 auto const& w =
_ip_data[ip].integration_weight;
202 auto const& dNdx_u =
_ip_data[ip].dNdx_u;
205 auto const& dNdx_p =
_ip_data[ip].dNdx_p;
218 ShapeFunctionDisplacement::NPOINTS,
223 eps.noalias() = B * u;
224 auto const& sigma_eff =
_ip_data[ip].sigma_eff;
226 double const p_int_pt = N_p.dot(p);
228 phase_pressure = p_int_pt;
230 auto const C_el =
_ip_data[ip].computeElasticTangentStiffness(
231 t, x_position, dt, T_ref);
232 auto const K_S = solid_material.getBulkModulus(t, x_position, &C_el);
235 .template value<double>(vars, x_position, t, dt);
239 .template value<double>(vars, x_position, t, dt);
240 auto const porosity =
242 .template value<double>(vars, x_position, t, dt);
244 auto const [rho_fr, mu] =
257 auto const sigma_total =
258 (
_ip_data[ip].sigma_eff - alpha * p_int_pt * identity2).eval();
267 _ip_data[ip].material_state_variables->getEquivalentPlasticStrain();
274 .value(vars, x_position, t, dt));
280 auto const K_over_mu = K / mu;
282 auto C =
_ip_data[ip].updateConstitutiveRelation(vars, t, x_position,
289 .template block<displacement_size, displacement_size>(
291 .noalias() += B.transpose() * C * B * w;
293 double const rho = rho_sr * (1 - porosity) + porosity * rho_fr;
296 (B.transpose() * sigma_eff -
N_u_op(N_u).transpose() * rho * b) * w;
301 Kup.noalias() += B.transpose() * alpha * identity2 * N_p * w;
306 laplace_p.noalias() +=
307 rho_fr * dNdx_p.transpose() * K_over_mu * dNdx_p * w;
309 storage_p.noalias() +=
310 rho_fr * N_p.transpose() * N_p * w *
311 ((alpha - porosity) * (1.0 - alpha) / K_S + porosity * beta_p);
315 add_p_derivative.noalias() += rho_fr * beta_p * dNdx_p.transpose() *
317 (dNdx_p * p - 2.0 * rho_fr * b) * N_p * w;
319 local_rhs.template segment<pressure_size>(
pressure_index).noalias() +=
320 dNdx_p.transpose() * rho_fr * rho_fr * K_over_mu * b * w;
326 rho_fr * alpha * N_p.transpose() * identity2.transpose() * B * w;
331 dNdx_p * p - rho_fr * b) *
332 dkde * B * rho_fr / mu * w;
342 storage_p = storage_p.colwise().sum().eval().asDiagonal();
346 Kpu = Kpu.colwise().sum().eval().asDiagonal();
347 Kpu_k = Kpu_k.colwise().sum().eval().asDiagonal();
355 .noalias() += laplace_p + storage_p / dt + add_p_derivative;
361 .noalias() += Kpu / dt + Kpu_k;
364 local_rhs.template segment<pressure_size>(
pressure_index).noalias() -=
365 laplace_p * p + storage_p * (p - p_prev) / dt + Kpu * (u - u_prev) / dt;
369 .noalias() += Kup * p;
372template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
375 ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim>::
376 getIntPtDarcyVelocity(
378 std::vector<GlobalVector*>
const& x,
379 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& dof_table,
380 std::vector<double>& cache)
const
382 int const hydraulic_process_id =
_process_data.hydraulic_process_id;
385 assert(!indices.empty());
386 auto const local_x = x[hydraulic_process_id]->get(indices);
388 unsigned const n_integration_points =
392 double, DisplacementDim, Eigen::Dynamic, Eigen::RowMajor>>(
393 cache, DisplacementDim, n_integration_points);
395 auto p = Eigen::Map<
typename ShapeMatricesTypePressure::template VectorType<
402 auto const& fluid = fluidPhase(*medium);
409 double const dt = std::numeric_limits<double>::quiet_NaN();
412 .template value<double>(vars, x_position, t, dt);
416 for (
unsigned ip = 0; ip < n_integration_points; ip++)
425 double const p_int_pt =
_ip_data[ip].N_p.dot(p);
427 phase_pressure = p_int_pt;
430 .template value<double>(vars, x_position, t, dt);
434 auto const sigma_total =
435 (
_ip_data[ip].sigma_eff - alpha * p_int_pt * identity2).eval();
442 _ip_data[ip].material_state_variables->getEquivalentPlasticStrain();
449 .value(vars, x_position, t, dt));
451 auto const [rho_fr, mu] =
455 auto const K_over_mu = K / mu;
460 auto const& dNdx_p =
_ip_data[ip].dNdx_p;
461 cache_matrix.col(ip).noalias() =
462 -K_over_mu * dNdx_p * p + K_over_mu * rho_fr * b;
468template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
471 ShapeFunctionPressure, DisplacementDim>::
472 assembleWithJacobianForPressureEquations(
473 const double t,
double const dt, Eigen::VectorXd
const& local_x,
474 Eigen::VectorXd
const& local_x_prev, std::vector<double>& local_b_data,
475 std::vector<double>& local_Jac_data)
479 template VectorType<pressure_size>>(
485 auto const p = local_x.template segment<pressure_size>(
pressure_index);
491 typename ShapeMatricesTypeDisplacement::template MatrixType<
496 ShapeMatricesTypePressure::NodalMatrixType::Zero(
pressure_size,
500 ShapeMatricesTypePressure::NodalMatrixType::Zero(
pressure_size,
504 ShapeMatricesTypePressure::NodalMatrixType::Zero(
pressure_size,
507 auto const& solid_material =
516 auto const& fluid = fluidPhase(*medium);
523 .template value<double>(vars, x_position, t, dt);
528 auto const staggered_scheme =
530 auto const fixed_stress_stabilization_parameter =
531 staggered_scheme.fixed_stress_stabilization_parameter;
532 auto const fixed_stress_over_time_step =
533 staggered_scheme.fixed_stress_over_time_step;
536 for (
int ip = 0; ip < n_integration_points; ip++)
538 auto const& w =
_ip_data[ip].integration_weight;
541 auto const& dNdx_p =
_ip_data[ip].dNdx_p;
550 double const p_int_pt = N_p.dot(p);
552 phase_pressure = p_int_pt;
554 auto const C_el =
_ip_data[ip].computeElasticTangentStiffness(
555 t, x_position, dt, T_ref);
556 auto const K_S = solid_material.getBulkModulus(t, x_position, &C_el);
560 .template value<double>(vars, x_position, t, dt);
564 auto const sigma_total =
565 (
_ip_data[ip].sigma_eff - alpha_b * p_int_pt * identity2).eval();
572 _ip_data[ip].material_state_variables->getEquivalentPlasticStrain();
579 .value(vars, x_position, t, dt));
580 auto const porosity =
582 .template value<double>(vars, x_position, t, dt);
584 auto const [rho_fr, mu] =
594 auto const K_over_mu = K / mu;
597 rho_fr * dNdx_p.transpose() * K_over_mu * dNdx_p * w;
601 fixed_stress_stabilization_parameter * alpha_b * alpha_b / K_S;
603 storage.noalias() += rho_fr * N_p.transpose() * N_p * w *
604 ((alpha_b - porosity) * (1.0 - alpha_b) / K_S +
605 porosity * beta_p + beta_FS);
610 local_rhs.noalias() +=
611 dNdx_p.transpose() * rho_fr * rho_fr * K_over_mu * b * w;
616 add_p_derivative.noalias() += rho_fr * beta_p * dNdx_p.transpose() *
618 (dNdx_p * p - 2.0 * rho_fr * b) * N_p * w;
620 if (!fixed_stress_over_time_step)
623 auto const& eps_prev =
_ip_data[ip].eps_prev;
624 const double eps_v_dot =
628 double const strain_rate_b =
629 alpha_b * eps_v_dot -
630 beta_FS *
_ip_data[ip].strain_rate_variable;
632 local_rhs.noalias() -= strain_rate_b * rho_fr * N_p * w;
637 local_rhs.noalias() -=
638 alpha_b *
_ip_data[ip].strain_rate_variable * rho_fr * N_p * w;
641 local_Jac.noalias() = laplace + storage / dt + add_p_derivative;
643 local_rhs.noalias() -= laplace * p + storage * (p - p_prev) / dt;
646template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
649 ShapeFunctionPressure, DisplacementDim>::
650 assembleWithJacobianForDeformationEquations(
651 const double t,
double const dt, Eigen::VectorXd
const& local_x,
652 std::vector<double>& local_b_data, std::vector<double>& local_Jac_data)
654 auto const p = local_x.template segment<pressure_size>(
pressure_index);
659 typename ShapeMatricesTypeDisplacement::template MatrixType<
665 template VectorType<displacement_size>>(
672 auto const& solid = medium->phase(
"Solid");
673 auto const& fluid = fluidPhase(*medium);
680 .template value<double>(vars, x_position, t, dt);
684 for (
int ip = 0; ip < n_integration_points; ip++)
686 auto const& w =
_ip_data[ip].integration_weight;
689 auto const& dNdx_u =
_ip_data[ip].dNdx_u;
700 auto const x_coord = x_position.getCoordinates().value()[0];
703 ShapeFunctionDisplacement::NPOINTS,
708 auto const& sigma_eff =
_ip_data[ip].sigma_eff;
710 phase_pressure = N_p.dot(p);
713 .template value<double>(vars, x_position, t, dt);
716 .template value<double>(vars, x_position, t, dt);
717 auto const porosity =
719 .template value<double>(vars, x_position, t, dt);
722 t, dt, x_position, fluid, vars);
727 DisplacementDim)>::identity2;
729 eps.noalias() = B * u;
734 auto C =
_ip_data[ip].updateConstitutiveRelation(vars, t, x_position,
737 local_Jac.noalias() += B.transpose() * C * B * w;
742 double const rho = rho_sr * (1 - porosity) + porosity * rho_fr;
743 local_rhs.noalias() -=
744 (B.transpose() * (sigma_eff - alpha * identity2 * p_at_xi) -
745 N_u_op(N_u).transpose() * rho * b) *
750template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
753 ShapeFunctionPressure, DisplacementDim>::
754 assembleWithJacobianForStaggeredScheme(
const double t,
double const dt,
755 Eigen::VectorXd
const& local_x,
756 Eigen::VectorXd
const& local_x_prev,
757 int const process_id,
758 std::vector<double>& local_b_data,
759 std::vector<double>& local_Jac_data)
765 local_b_data, local_Jac_data);
774template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
777 ShapeFunctionPressure, DisplacementDim>::
778 setInitialConditionsConcrete(Eigen::VectorXd
const local_x,
787 auto const p = local_x.template segment<pressure_size>(
pressure_index);
792 const double dt = 0.0;
797 for (
int ip = 0; ip < n_integration_points; ip++)
800 auto const& dNdx_u =
_ip_data[ip].dNdx_u;
812 ShapeFunctionDisplacement::NPOINTS,
817 eps.noalias() = B * u;
827 .template value<double>(vars, x_position, t, dt);
829 auto& sigma_eff =
_ip_data[ip].sigma_eff;
830 sigma_eff.noalias() += alpha_b * N_p.dot(p) * identity2;
831 _ip_data[ip].sigma_eff_prev.noalias() = sigma_eff;
836template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
839 ShapeFunctionPressure, DisplacementDim>::
840 postNonLinearSolverConcrete(Eigen::VectorXd
const& local_x,
841 Eigen::VectorXd
const& local_x_prev,
842 double const t,
double const dt,
843 int const process_id)
851 auto const staggered_scheme_ptr =
854 if (staggered_scheme_ptr &&
857 if (!staggered_scheme_ptr->fixed_stress_over_time_step)
864 for (
int ip = 0; ip < n_integration_points; ip++)
868 auto const& N_p = ip_data.N_p;
870 ip_data.strain_rate_variable = N_p.dot(p - p_prev) / dt;
875 if (!staggered_scheme_ptr ||
895 for (
int ip = 0; ip < n_integration_points; ip++)
898 auto const& dNdx_u =
_ip_data[ip].dNdx_u;
900 x_position = {std::nullopt,
_element.getID(),
902 ShapeFunctionDisplacement,
908 DisplacementDim, ShapeFunctionDisplacement::NPOINTS,
913 eps.noalias() = B * u;
917 _ip_data[ip].updateConstitutiveRelation(vars, t, x_position, dt, u,
923template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
926 ShapeFunctionDisplacement, ShapeFunctionPressure,
928 Eigen::VectorXd
const& local_x_prev,
929 double const t,
double const dt,
930 int const process_id)
932 auto const staggered_scheme_ptr =
935 if (staggered_scheme_ptr &&
938 if (staggered_scheme_ptr->fixed_stress_over_time_step)
940 auto const fixed_stress_stabilization_parameter =
941 staggered_scheme_ptr->fixed_stress_stabilization_parameter;
951 auto const& solid_material =
962 .template value<double>(vars, x_position, t, dt);
965 int const n_integration_points =
967 for (
int ip = 0; ip < n_integration_points; ip++)
971 auto const& N_p = ip_data.N_p;
980 auto const& eps = ip_data.eps;
981 auto const& eps_prev = ip_data.eps_prev;
982 const double eps_v_dot =
985 auto const C_el = ip_data.computeElasticTangentStiffness(
986 t, x_position, dt, T_ref);
988 solid_material.getBulkModulus(t, x_position, &C_el);
992 .template value<double>(vars, x_position, t, dt);
994 ip_data.strain_rate_variable =
995 eps_v_dot - fixed_stress_stabilization_parameter * alpha_b *
996 N_p.dot(p - p_prev) / dt / K_S;
1001 unsigned const n_integration_points =
1004 for (
unsigned ip = 0; ip < n_integration_points; ip++)
1010template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
1011 int DisplacementDim>
1013 ShapeFunctionDisplacement, ShapeFunctionPressure,
1015 double const* values,
1016 int const integration_order)
1018 if (integration_order !=
1022 "Setting integration point initial conditions; The integration "
1023 "order of the local assembler for element {:d} is different from "
1024 "the integration order in the initial condition.",
1028 if (name ==
"sigma")
1033 "Setting initial conditions for stress from integration "
1034 "point data and from a parameter '{:s}' is not possible "
1043 if (name ==
"epsilon")
1049 if (name ==
"strain_rate_variable")
1058template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
1059 int DisplacementDim>
1068template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
1069 int DisplacementDim>
1074 auto const kelvin_vector_size =
1076 unsigned const n_integration_points =
1079 std::vector<double> ip_epsilon_values;
1081 double, Eigen::Dynamic, kelvin_vector_size, Eigen::RowMajor>>(
1082 ip_epsilon_values, n_integration_points, kelvin_vector_size);
1084 for (
unsigned ip = 0; ip < n_integration_points; ++ip)
1086 auto const& eps =
_ip_data[ip].eps;
1091 return ip_epsilon_values;
1094template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
1095 int DisplacementDim>
1100 unsigned const n_integration_points =
1103 std::vector<double> ip_strain_rate_variables(n_integration_points);
1105 for (
unsigned ip = 0; ip < n_integration_points; ++ip)
1107 ip_strain_rate_variables[ip] =
_ip_data[ip].strain_rate_variable;
1110 return ip_strain_rate_variables;
1113template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
1114 int DisplacementDim>
1116 ShapeFunctionPressure, DisplacementDim>::
1117 computeSecondaryVariableConcrete(
double const t,
double const dt,
1118 Eigen::VectorXd
const& local_x,
1119 Eigen::VectorXd
const& )
1121 auto const p = local_x.template segment<pressure_size>(
pressure_index);
1124 ShapeFunctionPressure,
typename ShapeFunctionDisplacement::MeshElement,
1128 int const elem_id =
_element.getID();
1130 unsigned const n_integration_points =
1133 auto const& medium =
_process_data.media_map.getMedium(elem_id);
1140 Eigen::Matrix<double, 3, 3>::Zero());
1144 for (
unsigned ip = 0; ip < n_integration_points; ip++)
1146 auto const& eps =
_ip_data[ip].eps;
1147 sigma_eff_sum +=
_ip_data[ip].sigma_eff;
1157 .template value<double>(vars, x_position, t, dt);
1158 double const p_int_pt =
_ip_data[ip].N_p.dot(p);
1160 phase_pressure = p_int_pt;
1165 auto const sigma_total =
1166 (
_ip_data[ip].sigma_eff - alpha * p_int_pt * identity2).eval();
1174 _ip_data[ip].material_state_variables->getEquivalentPlasticStrain();
1181 .value(vars, x_position, t, dt));
1184 Eigen::Map<Eigen::VectorXd>(
1188 Eigen::Matrix<double, 3, 3, 0, 3, 3>
const sigma_avg =
1190 n_integration_points;
1192 Eigen::SelfAdjointEigenSolver<Eigen::Matrix<double, 3, 3>> e_s(sigma_avg);
1194 Eigen::Map<Eigen::Vector3d>(
1195 &(*
_process_data.principal_stress_values)[elem_id * 3], 3) =
1198 auto eigen_vectors = e_s.eigenvectors();
1200 for (
auto i = 0; i < 3; i++)
1202 Eigen::Map<Eigen::Vector3d>(
1203 &(*
_process_data.principal_stress_vector[i])[elem_id * 3], 3) =
1204 eigen_vectors.col(i);
1208template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
1209 int DisplacementDim>
1211 ShapeFunctionDisplacement, ShapeFunctionPressure,
1217template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
1218 int DisplacementDim>
1220 ShapeFunctionPressure,
1228template <
typename ShapeFunctionDisplacement,
typename ShapeFunctionPressure,
1229 int DisplacementDim>
1231 DisplacementDim>::MaterialStateVariables
const&
1234 getMaterialStateVariablesAt(
unsigned integration_point)
const
1236 return *
_ip_data[integration_point].material_state_variables;
KelvinVector mechanical_strain
KelvinVector total_stress
double gas_phase_pressure
double equivalent_plastic_strain
double liquid_phase_pressure
std::size_t getID() const
Returns the ID of the element.
void setElementID(std::size_t element_id)
std::optional< MathLib::Point3d > const getCoordinates() const
MatrixType< _kelvin_vector_size, _number_of_dof > BMatrixType
static const int displacement_size
bool const _is_axially_symmetric
unsigned getNumberOfIntegrationPoints() const override
NumLib::GenericIntegrationMethod const & _integration_method
Eigen::Matrix< double, KelvinVectorSize, 1 > SymmetricTensor
void postTimestepConcrete(Eigen::VectorXd const &local_x, Eigen::VectorXd const &local_x_prev, double const t, double const dt, int const process_id) override
void assembleWithJacobianForPressureEquations(const double t, double const dt, Eigen::VectorXd const &local_x, Eigen::VectorXd const &local_x_prev, std::vector< double > &local_b_data, std::vector< double > &local_Jac_data)
ShapeMatrixPolicyType< ShapeFunctionDisplacement, DisplacementDim > ShapeMatricesTypeDisplacement
ShapeMatrixPolicyType< ShapeFunctionPressure, DisplacementDim > ShapeMatricesTypePressure
std::vector< double > getSigma() const override
void assembleWithJacobianForDeformationEquations(const double t, double const dt, Eigen::VectorXd const &local_x, std::vector< double > &local_b_data, std::vector< double > &local_Jac_data)
static const int displacement_index
static const int pressure_index
MeshLib::Element const & _element
HydroMechanicsProcessData< DisplacementDim > & _process_data
SecondaryData< typename ShapeMatricesTypeDisplacement::ShapeMatrices::ShapeType > _secondary_data
int getMaterialID() const override
static constexpr auto & N_u_op
std::vector< double > getEpsilon() const override
static int const KelvinVectorSize
std::vector< IpData, Eigen::aligned_allocator< IpData > > _ip_data
static const int pressure_size
std::vector< double > getStrainRateVariable() const override
auto & selectSolidConstitutiveRelation(SolidMaterialsMap const &constitutive_relations, MeshLib::PropertyVector< int > const *const material_ids, std::size_t const element_id)
std::tuple< double, double > getFluidDensityAndViscosity(double const t, double const dt, ParameterLib::SpatialPosition const &pos, MaterialPropertyLib::Phase const &fluid_phase, MaterialPropertyLib::VariableArray &vars)
It computes fluid density and viscosity for single phase flow model.
double getFluidDensity(double const t, double const dt, ParameterLib::SpatialPosition const &pos, Phase const &fluid_phase, VariableArray &vars)
It computes fluid density for single phase flow model.
Eigen::Matrix< double, GlobalDim, GlobalDim > formEigenTensor(MaterialPropertyLib::PropertyDataType const &values)
static const VariableArray EmptyVariableArray
SymmetricTensor< GlobalDim > getSymmetricTensor(MaterialPropertyLib::PropertyDataType const &values)
Eigen::Matrix< double, 4, 1 > kelvinVectorToSymmetricTensor(Eigen::Matrix< double, 4, 1, Eigen::ColMajor, 4, 1 > const &v)
constexpr int kelvin_vector_dimensions(int const displacement_dim)
Kelvin vector dimensions for given displacement dimension.
Eigen::Matrix< double, kelvin_vector_dimensions(DisplacementDim), 1, Eigen::ColMajor > KelvinVectorType
Eigen::Matrix< double, 3, 3 > kelvinVectorToTensor(Eigen::Matrix< double, 4, 1, Eigen::ColMajor, 4, 1 > const &v)
Eigen::Matrix< double, DisplacementDim, kelvin_vector_dimensions(DisplacementDim)> liftVectorToKelvin(Eigen::Matrix< double, DisplacementDim, 1 > const &v)
KelvinVectorType< DisplacementDim > tensorToKelvin(Eigen::Matrix< double, 3, 3 > const &m)
Eigen::Map< Vector > createZeroedVector(std::vector< double > &data, Eigen::VectorXd::Index size)
Eigen::Map< Matrix > createZeroedMatrix(std::vector< double > &data, Eigen::MatrixXd::Index rows, Eigen::MatrixXd::Index cols)
void shapeFunctionInterpolate(const NodalValues &, const ShapeMatrix &)
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)
std::array< double, 3 > interpolateCoordinates(MeshLib::Element const &e, typename ShapeMatricesType::ShapeMatrices::ShapeType const &N)
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.
std::vector< double > const & getIntegrationPointKelvinVectorData(IntegrationPointDataVector const &ip_data_vector, MemberType IpData::*const member, std::vector< double > &cache)
std::size_t setIntegrationPointKelvinVectorData(double const *values, IntegrationPointDataVector &ip_data_vector, MemberType IpData::*const member)
void setIPDataInitialConditions(std::vector< std::unique_ptr< MeshLib::IntegrationPointWriter > > const &_integration_point_writer, MeshLib::Properties const &mesh_properties, LocalAssemblersVector &local_assemblers)
std::size_t setIntegrationPointScalarData(double const *values, IntegrationPointDataVector &ip_data_vector, MemberType IpData::*const member)
MatrixType< ShapeFunction::NPOINTS, ShapeFunction::NPOINTS > NodalMatrixType
static Eigen::Matrix< double, KelvinVectorSize, 1 > const identity2
Kelvin mapping of 2nd order identity tensor.
static double trace(Eigen::Matrix< double, KelvinVectorSize, 1 > const &v)
Trace of the corresponding tensor.
double strain_rate_variable
BMatricesType::KelvinVectorType eps
BMatricesType::KelvinVectorType sigma_eff