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.
See also
ParameterLib::CoordinateSystem.

Definition at line 116 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

Member Typedef Documentation

◆ 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 123 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 121 of file LinearElasticTransverseIsotropic.h.

◆ P

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

Definition at line 126 of file LinearElasticTransverseIsotropic.h.

Constructor & Destructor Documentation

◆ 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

Member Function Documentation

◆ 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 142 of file LinearElasticTransverseIsotropic.h.

151 {
152 return eps.dot(sigma) / 2;
153 }

◆ 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 171 of file LinearElasticTransverseIsotropic.h.

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

References E_a_p_, E_i_p_, nu_ia_p_, and nu_ii_p_.

◆ getElasticTensor() [1/3]

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

Referenced by integrateStress().

◆ getElasticTensor() [2/3]

Definition at line 96 of file LinearElasticTransverseIsotropic.cpp.

99{
100 using namespace MathLib::KelvinVector;
101
102 double const G_a = G_ia_p_(t, x)[0];
103 double const c_ai = G_a;
104
106
107 C_ortho.template bottomRightCorner<1, 1>().diagonal() << 2 * c_ai;
108
109 auto const Q = [this, &x]() -> KelvinMatrixType<2>
110 {
112 {
114 }
115
117 R.template topLeftCorner<2, 2>().noalias() =
118 local_coordinate_system_->transformation<2>(x);
120 }();
121
122 // Rotate the forth-order tenser in Kelvin mapping with Q*C_ortho*Q^T and
123 // return the top left corner block of size 4x4 for two-dimensional case.
124 return Q * C_ortho * Q.transpose();
125}
KelvinMatrix getElasticTensorLeftTopCorner(double const t, ParameterLib::SpatialPosition const &x) const

References MathLib::KelvinVector::fourthOrderRotationMatrix(), G_ia_p_, getElasticTensorLeftTopCorner(), local_coordinate_system_, and MathLib::t.

◆ getElasticTensor() [3/3]

Definition at line 129 of file LinearElasticTransverseIsotropic.cpp.

132{
133 using namespace MathLib::KelvinVector;
134
135 double const E_i = E_i_p_(t, x)[0];
136 double const nu_i = nu_ii_p_(t, x)[0];
137 double const G_a = G_ia_p_(t, x)[0];
138
139 double const c_ii = E_i / (2.0 * (1 + nu_i));
140 double const c_ai = G_a;
141
143
144 C_ortho.template bottomRightCorner<3, 3>().diagonal() << 2.0 * c_ii,
145 2 * c_ai, 2 * c_ai;
146
147 auto const Q = [this, &x]() -> KelvinMatrixType<3>
148 {
150 {
152 }
154 R.template topLeftCorner<3, 3>().noalias() =
155 local_coordinate_system_->transformation<3>(x);
157 }();
158
159 // Rotate the forth-order tenser in Kelvin mapping with Q*C_ortho*Q^T and
160 // return the 6x6 matrix for in the three-dimensional case.
161 return Q * C_ortho * Q.transpose();
162}

References E_i_p_, MathLib::KelvinVector::fourthOrderRotationMatrix(), G_ia_p_, getElasticTensorLeftTopCorner(), local_coordinate_system_, nu_ii_p_, and MathLib::t.

◆ getElasticTensorLeftTopCorner()

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

Definition at line 49 of file LinearElasticTransverseIsotropic.cpp.

52{
53 using namespace MathLib::KelvinVector;
54 double const E_i = E_i_p_(t, x)[0];
55 double const E_a = E_a_p_(t, x)[0];
56 double const nu_i = nu_ii_p_(t, x)[0];
57 double const nu_ia = nu_ia_p_(t, x)[0];
58
59 double const nu_ai = nu_ia * (E_a / E_i);
60
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;
64 // 1/D
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);
67
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;
74
77
78 if (DisplacementDim == 2)
79 {
80 // The following data are set based on the condition that the direction
81 // of anisotropy is parallel to the second base (base2) of the 2D local
82 // coordinate system.
84 b_ai, b_ii, b_ai, a_ii;
85
86 return C_ortho;
87 }
89 b_ai, b_ai, b_ai, a_ai;
90
91 return C_ortho;
92}

References E_a_p_, E_i_p_, nu_ia_p_, nu_ii_p_, and MathLib::t.

Referenced by getElasticTensor().

◆ 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

Member Data Documentation

◆ 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 200 of file LinearElasticTransverseIsotropic.h.

Referenced by LinearElasticTransverseIsotropic(), getBulkModulus(), and getElasticTensorLeftTopCorner().

◆ 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 197 of file LinearElasticTransverseIsotropic.h.

Referenced by LinearElasticTransverseIsotropic(), getBulkModulus(), getElasticTensor(), and getElasticTensorLeftTopCorner().

◆ 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 208 of file LinearElasticTransverseIsotropic.h.

Referenced by LinearElasticTransverseIsotropic(), and getElasticTensor().

◆ 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 119 of file LinearElasticTransverseIsotropic.h.

◆ local_coordinate_system_

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

◆ 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 205 of file LinearElasticTransverseIsotropic.h.

Referenced by LinearElasticTransverseIsotropic(), getBulkModulus(), and getElasticTensorLeftTopCorner().

◆ 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 202 of file LinearElasticTransverseIsotropic.h.

Referenced by LinearElasticTransverseIsotropic(), getBulkModulus(), getElasticTensor(), and getElasticTensorLeftTopCorner().


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