16template <
int DisplacementDim>
17std::optional<std::tuple<typename MechanicsBase<DisplacementDim>::KelvinVector,
19 DisplacementDim>::MaterialStateVariables>,
28 auto const& eps_m = std::get<MPL::SymmetricTensor<DisplacementDim>>(
30 auto const& eps_m_prev = std::get<MPL::SymmetricTensor<DisplacementDim>>(
32 auto const& sigma_prev = std::get<MPL::SymmetricTensor<DisplacementDim>>(
33 variable_array_prev.
stress);
38 KelvinVector sigma = sigma_prev + C * (eps_m - eps_m_prev);
40 return {std::make_tuple(
47template <
int DisplacementDim>
54 double const E_i =
E_i_p_(
t, x)[0];
55 double const E_a =
E_a_p_(
t, x)[0];
59 double const nu_ai = nu_ia * (E_a / E_i);
61 double const nu_ia_p_nu_ai = nu_ia * nu_ai;
62 double const nu_i_p2 = nu_i * nu_i;
63 double const E_i_p2 = E_i * E_i;
65 double const one_over_D =
66 (E_i_p2 * E_a) / (1.0 - nu_i_p2 - 2.0 * (1.0 + nu_i) * nu_ia_p_nu_ai);
68 double const fac1 = one_over_D / (E_i * E_a);
69 double const fac2 = one_over_D / E_i_p2;
70 double const a_ii = (1.0 - nu_ia_p_nu_ai) * fac1;
71 double const a_ai = (1.0 - nu_i_p2) * fac2;
72 double const b_ii = (nu_i + nu_ia_p_nu_ai) * fac1;
73 double const b_ai = (nu_ia * (1.0 + nu_i)) * fac2;
78 if (DisplacementDim == 2)
83 C_ortho.template topLeftCorner<3, 3>() << a_ii, b_ai, b_ii, b_ai, a_ai,
84 b_ai, b_ii, b_ai, a_ii;
88 C_ortho.template topLeftCorner<3, 3>() << a_ii, b_ii, b_ai, b_ii, a_ii,
89 b_ai, b_ai, b_ai, a_ai;
102 double const G_a =
G_ia_p_(
t, x)[0];
103 double const c_ai = G_a;
107 C_ortho.template bottomRightCorner<1, 1>().diagonal() << 2 * c_ai;
116 Eigen::Matrix<double, 2, 2> R = Eigen::Matrix<double, 2, 2>::Identity();
117 R.template topLeftCorner<2, 2>().noalias() =
124 return Q * C_ortho * Q.transpose();
135 double const E_i =
E_i_p_(
t, x)[0];
137 double const G_a =
G_ia_p_(
t, x)[0];
139 double const c_ii = E_i / (2.0 * (1 + nu_i));
140 double const c_ai = G_a;
144 C_ortho.template bottomRightCorner<3, 3>().diagonal() << 2.0 * c_ii,
153 Eigen::Matrix3d R = Eigen::Matrix3d::Identity();
154 R.template topLeftCorner<3, 3>().noalias() =
161 return Q * C_ortho * Q.transpose();
Linear transverse isotropic elastic model.
P const & nu_ii_p_
It is the in-plane Poisson’s ratio, .
MathLib::KelvinVector::KelvinMatrixType< DisplacementDim > KelvinMatrix
KelvinMatrix getElasticTensorLeftTopCorner(double const t, ParameterLib::SpatialPosition const &x) const
MathLib::KelvinVector::KelvinVectorType< DisplacementDim > KelvinVector
P const & E_i_p_
It is the in-plane Young’s modulus, .
std::optional< ParameterLib::CoordinateSystem > const & local_coordinate_system_
KelvinMatrix getElasticTensor(double const t, ParameterLib::SpatialPosition const &x, double const T) const
std::optional< std::tuple< typename MechanicsBase< DisplacementDim >::KelvinVector, std::unique_ptr< typename MechanicsBase< DisplacementDim >::MaterialStateVariables >, typename MechanicsBase< DisplacementDim >::KelvinMatrix > > integrateStress(MaterialPropertyLib::VariableArray const &variable_array_prev, MaterialPropertyLib::VariableArray const &variable_array, double const t, ParameterLib::SpatialPosition const &x, double const dt, typename MechanicsBase< DisplacementDim >::MaterialStateVariables const &material_state_variables) const override
KelvinVector mechanical_strain
KelvinMatrixType< DisplacementDim > fourthOrderRotationMatrix(Eigen::Matrix< double, DisplacementDim, DisplacementDim, Eigen::ColMajor, DisplacementDim, DisplacementDim > const &transformation)
Eigen::Matrix< double, kelvin_vector_dimensions(DisplacementDim), kelvin_vector_dimensions(DisplacementDim), Eigen::RowMajor > KelvinMatrixType
MathLib::KelvinVector::KelvinMatrixType< DisplacementDim > KelvinMatrix