OGS
MaterialLib::Solids::LinearElasticTransverseIsotropic< DisplacementDim > Class Template Reference

## Detailed Description

template<int DisplacementDim>
class MaterialLib::Solids::LinearElasticTransverseIsotropic< DisplacementDim >

Linear transverse isotropic elastic model.

The parameters of the linear transverse isotropic elastic model are

• $$E_{i}$$, the Young’s modulus within the plane of isotropy,
• $$E_{a}$$, the Young’s modulus w.r.t. the direction of anisotropy,
• $$\nu_{ii}$$, the Poisson’s ratio within the plane of isotropy,
• $$\nu_{ia}$$, the Poisson ratio perpendicular to the plane of isotropy, due to strain in the plane of isotropy,
• $$G_{ia}$$, the shear modulus between directions of isotropy and anisotropy.

where the subscript $$i$$ means isotropy, and the subscript $$a$$ means anisotropy.

With the given parameter, the in-plane shear modulus, $$G_{ii}$$ is computed as

$G_{ii} = \frac{E_{i}}{2(1+\nu_{ii})},$

while the in-plane Poisson ratio, $$\nu_{ai}$$, which is due to the strain perpendicular to the plane of isotropy, is calculated by the following equation:

$\nu_{ai} = \nu_{ia} \frac{E_{a}}{E_{i}}.$

For 3D problems, assuming the plane of isotropy to be spanned by the basis vectors $$\mathbf{e}_1$$ and $$\mathbf{e}_2$$, respectively, and the direction of anisotropy is defined by the basis vector $$\mathbf{e}_3$$, the following relations hold:

\begin{eqnarray*} E_{i} &=& E_1 & =& E_2, \\ E_{a} &=& E_3, & &\\ \nu_{ii} &=& \nu_{12} & =& \nu_{21}, \\ \nu_{ia} &=& \nu_{13} & =& \nu_{23}, \\ \nu_{ai} &=& \nu_{31} & =& \nu_{32}, \\ G_{ia} &=& G_{13} & =& G_{23},\\ G_{ai} &=& G_{ia}. & & \end{eqnarray*}

Under such assumption, the matrix form of the elastic tensor for strain and stress in the Kelvin vector in the local system is

$\begin{bmatrix} a_{ii} & b_{ii} &b_{ai} & 0 & 0 & 0\\ b_{ii} & a_{ii} &b_{ai} & 0 & 0 & 0\\ b_{ai} & b_{ai} &a_{ai} & 0 & 0 & 0\\ 0 & 0 & 0 & 2 c_{ii} & 0 & 0\\ 0 & 0 & 0 & 0 & 2 c_{ai} & 0\\ 0 & 0 & 0 & 0 & 0 & 2 c_{ai} \end{bmatrix}.$

The matrix elements are:

\begin{eqnarray*} a_{ii} &=& \frac{1-\nu_{ia}\nu_{ai}}{E_{i} E_{a} D}, \\ a_{ai} &=& \frac{1-\nu_{ii}^2}{E_{i}^2 D}, \\ b_{ii} &=& \frac{\nu_{ii}+\nu_{ia}\nu_{ai}}{E_{i} E_{a} D}, \\ b_{ai} &=& \frac{\nu_{ia}(1+\nu_{ii})}{E_{i}^2 D}, \\ c_{ii} &=& \frac{E_{i}}{2(1+\nu_{ii})}, \\ c_{ai} &=& G_{ia}, \end{eqnarray*}

with

$D = \frac{(1+\nu_{ii})(1-\nu_{ii}-2\nu_{ia}\nu_{ai})}{E_{i}^2E_{a}}.$

(also see Chapter 9.1 in [22]).

For plane strain problems, assuming the direction of anisotropy is defined by the basis vector $$\mathbf{e}_1$$, the plane of isotropy to be spanned by the basis vector $$\mathbf{e}_0$$ and the unit off-plane direction $$\mathbf{e}_2$$, the following relations hold:

\begin{eqnarray*} E_{i} &=& E_1 & =& E_3, \\ E_{a} &=& E_2, & &\\ \nu_{ii} &=& \nu_{13} & =& \nu_{31}, \\ \nu_{ia} &=& \nu_{32} & =& \nu_{12}, \\ \nu_{ai} &=& \nu_{23} & =& \nu_{21}, \\ G_{ia} &=& G_{32} & =& G_{12},\\ G_{ai} &=& G_{ia}. & & \end{eqnarray*}

Based on this assumption, the matrix form of the elastic tensor for strain and stress in the Kelvin vector in the local system is

$\begin{bmatrix} a_{ii} & b_{ai} &b_{ii} & 0\\ b_{ai} & a_{ai} &b_{ai} & 0\\ b_{ii} & b_{ai} &a_{ii} & 0\\ 0 & 0 & 0 & 2 c_{ai} \end{bmatrix}$

for plane strain problems.

Note
This model requires the definition of a local coordinate system. A local coordinate system can be defined with explicit or implicit bases. The unit norm to the transverse isotropy plane must be input as the parameter value for the base "basis_vector_1" for a 2D local coordinate system, or for the base "basis_vector_2" for a 3D local coordinate system.
ParameterLib::CoordinateSystem.

Definition at line 124 of file LinearElasticTransverseIsotropic.h.

#include <LinearElasticTransverseIsotropic.h>

Inheritance diagram for MaterialLib::Solids::LinearElasticTransverseIsotropic< DisplacementDim >:
[legend]
Collaboration diagram for MaterialLib::Solids::LinearElasticTransverseIsotropic< DisplacementDim >:
[legend]

## Public Types

using KelvinVector

using KelvinMatrix

using P = ParameterLib::Parameter<double>

Public Types inherited from MaterialLib::Solids::MechanicsBase< DisplacementDim >
using KelvinVector

using KelvinMatrix

## Public Member Functions

LinearElasticTransverseIsotropic (P const &E_i, P const &E_a, P const &nu_ii, P const &nu_ia, P const &G_ia, std::optional< ParameterLib::CoordinateSystem > const &local_coordinate_system)

double computeFreeEnergyDensity (double const, ParameterLib::SpatialPosition const &, double const, KelvinVector const &eps, KelvinVector const &sigma, typename MechanicsBase< DisplacementDim >::MaterialStateVariables const &) const override

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

KelvinMatrix getElasticTensor (double const t, ParameterLib::SpatialPosition const &x, double const T) const

double getBulkModulus (double const t, ParameterLib::SpatialPosition const &x, KelvinMatrix const *const) const override

LinearElasticTransverseIsotropic< 2 >::KelvinMatrix getElasticTensor (double const t, ParameterLib::SpatialPosition const &x, double const) const

LinearElasticTransverseIsotropic< 3 >::KelvinMatrix getElasticTensor (double const t, ParameterLib::SpatialPosition const &x, double const) const

Public Member Functions inherited from MaterialLib::Solids::MechanicsBase< DisplacementDim >
virtual std::unique_ptr< MaterialStateVariablescreateMaterialStateVariables () const

virtual void initializeInternalStateVariables (double const, ParameterLib::SpatialPosition const &, typename MechanicsBase< DisplacementDim >::MaterialStateVariables &) const

virtual std::optional< std::tuple< KelvinVector, std::unique_ptr< MaterialStateVariables >, KelvinMatrix > > integrateStress (MaterialPropertyLib::VariableArray const &variable_array_prev, MaterialPropertyLib::VariableArray const &variable_array, double const t, ParameterLib::SpatialPosition const &x, double const dt, MaterialStateVariables const &material_state_variables) const =0

virtual std::vector< InternalVariablegetInternalVariables () const

virtual ConstitutiveModel getConstitutiveModel () const
Gets the type of constitutive model.

virtual double getTemperatureRelatedCoefficient (double const, double const, ParameterLib::SpatialPosition const &, double const, double const) const

virtual double computeFreeEnergyDensity (double const t, ParameterLib::SpatialPosition const &x, double const dt, KelvinVector const &eps, KelvinVector const &sigma, MaterialStateVariables const &material_state_variables) const =0

virtual ~MechanicsBase ()=default

## Static Public Attributes

static int const KelvinVectorSize

## Protected Attributes

P const & E_i_p_
It is the in-plane Young’s modulus, $$E_{i}$$.

P const & E_a_p_

P const & nu_ii_p_
It is the in-plane Poisson’s ratio, $$\nu_{ii}$$.

P const & nu_ia_p_

P const & G_ia_p_

std::optional< ParameterLib::CoordinateSystem > const & local_coordinate_system_

## Private Member Functions

KelvinMatrix getElasticTensorLeftTopCorner (double const t, ParameterLib::SpatialPosition const &x) const

## ◆ KelvinMatrix

template<int DisplacementDim>
 using MaterialLib::Solids::LinearElasticTransverseIsotropic< DisplacementDim >::KelvinMatrix
Initial value:
Eigen::Matrix< double, kelvin_vector_dimensions(DisplacementDim), kelvin_vector_dimensions(DisplacementDim), Eigen::RowMajor > KelvinMatrixType

Definition at line 131 of file LinearElasticTransverseIsotropic.h.

## ◆ KelvinVector

template<int DisplacementDim>
 using MaterialLib::Solids::LinearElasticTransverseIsotropic< DisplacementDim >::KelvinVector
Initial value:
Eigen::Matrix< double, kelvin_vector_dimensions(DisplacementDim), 1, Eigen::ColMajor > KelvinVectorType

Definition at line 129 of file LinearElasticTransverseIsotropic.h.

## ◆ P

template<int DisplacementDim>
 using MaterialLib::Solids::LinearElasticTransverseIsotropic< DisplacementDim >::P = ParameterLib::Parameter

Definition at line 134 of file LinearElasticTransverseIsotropic.h.

## ◆ LinearElasticTransverseIsotropic()

template<int DisplacementDim>
 MaterialLib::Solids::LinearElasticTransverseIsotropic< DisplacementDim >::LinearElasticTransverseIsotropic ( P const & E_i, P const & E_a, P const & nu_ii, P const & nu_ia, P const & G_ia, std::optional< ParameterLib::CoordinateSystem > const & local_coordinate_system )
inline

## ◆ computeFreeEnergyDensity()

template<int DisplacementDim>
 double MaterialLib::Solids::LinearElasticTransverseIsotropic< DisplacementDim >::computeFreeEnergyDensity ( double const , ParameterLib::SpatialPosition const & , double const , KelvinVector const & eps, KelvinVector const & sigma, typename MechanicsBase< DisplacementDim >::MaterialStateVariables const & ) const
inlineoverride

Definition at line 150 of file LinearElasticTransverseIsotropic.h.

159 {
160 return eps.dot(sigma) / 2;
161 }

## ◆ getBulkModulus()

template<int DisplacementDim>
 double MaterialLib::Solids::LinearElasticTransverseIsotropic< DisplacementDim >::getBulkModulus ( double const t, ParameterLib::SpatialPosition const & x, KelvinMatrix const * const ) const
inlineoverridevirtual

Reimplemented from MaterialLib::Solids::MechanicsBase< DisplacementDim >.

Definition at line 179 of file LinearElasticTransverseIsotropic.h.

182 {
183 const double E_i = E_i_p_(t, x)[0];
184 const double E_a = E_a_p_(t, x)[0];
185 const double nu_i = nu_ii_p_(t, x)[0];
186 const double nu_ia = nu_ia_p_(t, x)[0];
187
188 // Average Young's modulus
189 double const E_av = 2. * E_i / 3. + E_a / 3.;
190
191 // Poisson ratio in the plane of isotropy, due to the strain
192 // perpendicular to the plane of isotropy. nu_ai=nu_ia*E_a/E_i
193 const double nu_ai = nu_ia * E_a / E_i;
194
195 // Average Poisson ratio
196 // 12 13 21 23 31 32
197 // ai ai ia ii ia ii
198 const double nu_av = (nu_ai + nu_ia + nu_i) / 3.0;
199
200 return E_av / 3 / (1 - 2 * nu_av);
201 }

## ◆ getElasticTensor() [1/3]

template<int DisplacementDim>
 KelvinMatrix MaterialLib::Solids::LinearElasticTransverseIsotropic< DisplacementDim >::getElasticTensor ( double const t, ParameterLib::SpatialPosition const & x, double const T ) const

## ◆ getElasticTensor() [2/3]

 LinearElasticTransverseIsotropic< 2 >::KelvinMatrix MaterialLib::Solids::LinearElasticTransverseIsotropic< 2 >::getElasticTensor ( double const t, ParameterLib::SpatialPosition const & x, double const ) const

Definition at line 104 of file LinearElasticTransverseIsotropic.cpp.

107{
108 using namespace MathLib::KelvinVector;
109
110 double const G_a = G_ia_p_(t, x)[0];
111 double const c_ai = G_a;
112
114
115 C_ortho.template bottomRightCorner<1, 1>().diagonal() << 2 * c_ai;
116
117 auto const Q = [this, &x]() -> KelvinMatrixType<2>
118 {
120 {
122 }
123
124 Eigen::Matrix<double, 2, 2> R = Eigen::Matrix<double, 2, 2>::Identity();
125 R.template topLeftCorner<2, 2>().noalias() =
126 local_coordinate_system_->transformation<2>(x);
128 }();
129
130 // Rotate the forth-order tenser in Kelvin mapping with Q*C_ortho*Q^T and
131 // return the top left corner block of size 4x4 for two-dimensional case.
132 return Q * C_ortho * Q.transpose();
133}
KelvinMatrix getElasticTensorLeftTopCorner(double const t, ParameterLib::SpatialPosition const &x) const
KelvinMatrixType< DisplacementDim > fourthOrderRotationMatrix(Eigen::Matrix< double, DisplacementDim, DisplacementDim, Eigen::ColMajor, DisplacementDim, DisplacementDim > const &transformation)

## ◆ getElasticTensor() [3/3]

 LinearElasticTransverseIsotropic< 3 >::KelvinMatrix MaterialLib::Solids::LinearElasticTransverseIsotropic< 3 >::getElasticTensor ( double const t, ParameterLib::SpatialPosition const & x, double const ) const

Definition at line 137 of file LinearElasticTransverseIsotropic.cpp.

140{
141 using namespace MathLib::KelvinVector;
142
143 double const E_i = E_i_p_(t, x)[0];
144 double const nu_i = nu_ii_p_(t, x)[0];
145 double const G_a = G_ia_p_(t, x)[0];
146
147 double const c_ii = E_i / (2.0 * (1 + nu_i));
148 double const c_ai = G_a;
149
151
152 C_ortho.template bottomRightCorner<3, 3>().diagonal() << 2.0 * c_ii,
153 2 * c_ai, 2 * c_ai;
154
155 auto const Q = [this, &x]() -> KelvinMatrixType<3>
156 {
158 {
160 }
161 Eigen::Matrix3d R = Eigen::Matrix3d::Identity();
162 R.template topLeftCorner<3, 3>().noalias() =
163 local_coordinate_system_->transformation<3>(x);
165 }();
166
167 // Rotate the forth-order tenser in Kelvin mapping with Q*C_ortho*Q^T and
168 // return the 6x6 matrix for in the three-dimensional case.
169 return Q * C_ortho * Q.transpose();
170}

## ◆ getElasticTensorLeftTopCorner()

template<int DisplacementDim>
 LinearElasticTransverseIsotropic< DisplacementDim >::KelvinMatrix MaterialLib::Solids::LinearElasticTransverseIsotropic< DisplacementDim >::getElasticTensorLeftTopCorner ( double const t, ParameterLib::SpatialPosition const & x ) const
private

Definition at line 57 of file LinearElasticTransverseIsotropic.cpp.

60{
61 using namespace MathLib::KelvinVector;
62 double const E_i = E_i_p_(t, x)[0];
63 double const E_a = E_a_p_(t, x)[0];
64 double const nu_i = nu_ii_p_(t, x)[0];
65 double const nu_ia = nu_ia_p_(t, x)[0];
66
67 double const nu_ai = nu_ia * (E_a / E_i);
68
69 double const nu_ia_p_nu_ai = nu_ia * nu_ai;
70 double const nu_i_p2 = nu_i * nu_i;
71 double const E_i_p2 = E_i * E_i;
72 // 1/D
73 double const one_over_D =
74 (E_i_p2 * E_a) / (1.0 - nu_i_p2 - 2.0 * (1.0 + nu_i) * nu_ia_p_nu_ai);
75
76 double const fac1 = one_over_D / (E_i * E_a);
77 double const fac2 = one_over_D / E_i_p2;
78 double const a_ii = (1.0 - nu_ia_p_nu_ai) * fac1;
79 double const a_ai = (1.0 - nu_i_p2) * fac2;
80 double const b_ii = (nu_i + nu_ia_p_nu_ai) * fac1;
81 double const b_ai = (nu_ia * (1.0 + nu_i)) * fac2;
82
85
86 if (DisplacementDim == 2)
87 {
88 // The following data are set based on the condition that the direction
89 // of anisotropy is parallel to the second base (base2) of the 2D local
90 // coordinate system.
91 C_ortho.template topLeftCorner<3, 3>() << a_ii, b_ai, b_ii, b_ai, a_ai,
92 b_ai, b_ii, b_ai, a_ii;
93
94 return C_ortho;
95 }
96 C_ortho.template topLeftCorner<3, 3>() << a_ii, b_ii, b_ai, b_ii, a_ii,
97 b_ai, b_ai, b_ai, a_ai;
98
99 return C_ortho;
100}

## ◆ integrateStress()

template<int DisplacementDim>
 std::optional< std::tuple< typename MechanicsBase< DisplacementDim >::KelvinVector, std::unique_ptr< typename MechanicsBase< DisplacementDim >::MaterialStateVariables >, typename MechanicsBase< DisplacementDim >::KelvinMatrix > > MaterialLib::Solids::LinearElasticTransverseIsotropic< DisplacementDim >::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

Definition at line 29 of file LinearElasticTransverseIsotropic.cpp.

35{
36 auto const& eps_m = std::get<MPL::SymmetricTensor<DisplacementDim>>(
37 variable_array.mechanical_strain);
38 auto const& eps_m_prev = std::get<MPL::SymmetricTensor<DisplacementDim>>(
39 variable_array_prev.mechanical_strain);
40 auto const& sigma_prev = std::get<MPL::SymmetricTensor<DisplacementDim>>(
41 variable_array_prev.stress);
42 auto const& T = variable_array_prev.temperature;
43
45
46 KelvinVector sigma = sigma_prev + C * (eps_m - eps_m_prev);
47
48 return {std::make_tuple(
49 sigma,
50 std::make_unique<
51 typename MechanicsBase<DisplacementDim>::MaterialStateVariables>(),
52 C)};
53}
MathLib::KelvinVector::KelvinMatrixType< DisplacementDim > KelvinMatrix
MathLib::KelvinVector::KelvinVectorType< DisplacementDim > KelvinVector
KelvinMatrix getElasticTensor(double const t, ParameterLib::SpatialPosition const &x, double const T) const

## ◆ E_a_p_

template<int DisplacementDim>
 P const& MaterialLib::Solids::LinearElasticTransverseIsotropic< DisplacementDim >::E_a_p_
protected

It is the Young’s modulus w.r.t. the direction of anisotropy, $$E_{a}$$.

Definition at line 208 of file LinearElasticTransverseIsotropic.h.

## ◆ E_i_p_

template<int DisplacementDim>
 P const& MaterialLib::Solids::LinearElasticTransverseIsotropic< DisplacementDim >::E_i_p_
protected

It is the in-plane Young’s modulus, $$E_{i}$$.

Definition at line 205 of file LinearElasticTransverseIsotropic.h.

## ◆ G_ia_p_

template<int DisplacementDim>
 P const& MaterialLib::Solids::LinearElasticTransverseIsotropic< DisplacementDim >::G_ia_p_
protected

It is the shear modulus between directions of isotropy and anisotropy, $$G_{ia}$$.

Definition at line 216 of file LinearElasticTransverseIsotropic.h.

## ◆ KelvinVectorSize

template<int DisplacementDim>
 int const MaterialLib::Solids::LinearElasticTransverseIsotropic< DisplacementDim >::KelvinVectorSize
static
Initial value:
=
constexpr int kelvin_vector_dimensions(int const displacement_dim)
Kelvin vector dimensions for given displacement dimension.

Definition at line 127 of file LinearElasticTransverseIsotropic.h.

## ◆ local_coordinate_system_

template<int DisplacementDim>
 std::optional const& MaterialLib::Solids::LinearElasticTransverseIsotropic< DisplacementDim >::local_coordinate_system_
protected

Definition at line 218 of file LinearElasticTransverseIsotropic.h.

## ◆ nu_ia_p_

template<int DisplacementDim>
 P const& MaterialLib::Solids::LinearElasticTransverseIsotropic< DisplacementDim >::nu_ia_p_
protected

It is the Poisson ratio perpendicular to the plane of isotropy, due to strain in the plane of isotropy, $$\nu_{ia}$$.

Definition at line 213 of file LinearElasticTransverseIsotropic.h.

## ◆ nu_ii_p_

template<int DisplacementDim>
 P const& MaterialLib::Solids::LinearElasticTransverseIsotropic< DisplacementDim >::nu_ii_p_
protected

It is the in-plane Poisson’s ratio, $$\nu_{ii}$$.

Definition at line 210 of file LinearElasticTransverseIsotropic.h.

The documentation for this class was generated from the following files: