Compute Elasticity Tensor

Compute an elasticity tensor.

Description

The material ComputeElasticityTensor builds the elasticity (stiffness) tensor with various user-selected material symmetry options. ComputeElasticityTensor also rotates the elasticity tensor during the initial time step only; this class does not rotate the elasticity tensor during the simulation. The initial rotation is performed if the user provides arguments to the three Euler angle parameters; the Bunge Euler angles provided in this class are used to perform passive (from the sample to the crystal) rotations using the extrinsic convention to build the rotation matrix . Alternatively, the 3x3 rotation matrix can be defined directly in the input file. Rotations to the elasticity tensor are applied as (1) See below for examples of tensor rotations.

For a general stiffness tensor with 21 independent components, the elasticity tensor within the solid mechanics module can be represented with the notation shown in Eq. (2). Nonetheless, the full Rank-4 tensor with all 81 components is created by ComputeElasticityTensor. (2)

There are several different material symmetry options that a user can apply to build the elasticity tensor for a mechanics simulation that are discussed below.

General Symmetry

The fill method symmetric21 is used to create the elasticity tensor for a linear hyperelastic material with 21 independent components: the symmetries shown in Eq. (3) are used to determine the independent components (Slaughter, 2012). (3)

Example Input File Syntax

[./elasticity_tensor]
  type = ComputeElasticityTensor
  fill_method = symmetric21
  C_ijkl = '1111 1122 1133 1123 1113 1112 2222 2233 2223 2213 2212 3333 3323 3313 3312 2323 2313 2312 1313 1312 1212'
[../]
(moose/modules/combined/test/tests/linear_elasticity/tensor.i)

which shows the expected order of the elasticity tensor components in the input argument string.

Orthotropic Symmetry

The fill method symmetric9 is appropriate for materials with three orthotropic planes of symmetry (Malvern, 1969), and is often used for simulations of anisotropic materials such as cubic crystals. The engineering elasticity tensor notation, Eq. (2), for an orthotropic material is given in Eq. (4) (4)

The user can also select the fill method orthotropic, which generates an elasticity tensor based directly on material parameters. That is, the elasticity tensor is computed via moduli of elasticity, Poisson's ratios, and shear stiffnesses, see Eq. (5) (5) where .

Example Input File Syntax

[./elasticity_tensor]
  type = ComputeElasticityTensor
  C_ijkl = '1.684e5 0.176e5 0.176e5 1.684e5 0.176e5 1.684e5 0.754e5 0.754e5 0.754e5'
  fill_method = symmetric9
[../]
(moose/modules/solid_mechanics/test/tests/finite_strain_elastic/finite_strain_elastic_new_test.i)

In the Einstein index notation shown in Eq. (2), the parameter C_ijkl expects the elasticity components in the order C_ijkl = '1111 1122 1133 2222 2233 3333 2323 3131 1212' for the symmetric9 fill method option. Note that, in this case, the method symmetric9 is used to enter an isotropic elasticity tensor.

[Materials]
  [elasticity_tensor]
    type = ComputeElasticityTensor
    fill_method = orthotropic
    C_ijkl = '2.0e3 2.0e5 2.0e3 0.71428571e3 0.71428571e3 0.71428571e3 0.4 0.2 0.004 0.004 0.2 0.4'
  []
[]
(moose/modules/solid_mechanics/test/tests/finite_strain_elastic_anisotropy/3d_bar_orthotropic_full_rotation.i)

For the orthotropic fill method, the material parameters need to be referred to the global frame and introduced in the following order: . For cases where axes of orthotropy do not coincide with global axes, Euler angles can be provided to perform a general rotation of the elasticity tensor at the beginning of the simulation.

Linear Isotropic Symmetry

The two constant isotropic symmetry fill methods symmetric_isotropic and symmetric_isotropic_E_nu are used in the dedicated isotropic elasticity tensor ComputeIsotropicElasticityTensor. These two fill methods use the symmetries shown in Eq. (6) to build the elasticity tensor. (6) Please see the documentation page for ComputeIsotropicElasticityTensor for details and examples of the input file syntax for linear elastic isotropic elasticity tensors.

Antisymmetric Isotropic Symmetry

The fill method antisymmetric_isotropic is used for an antisymmetric isotropic material in a shear case. The elasticity tensor is built using the symmetries shown in Eq. (7) (7) where is the permutation tensor and is the summation index.

Transverse Isotropic (Axisymmetric)

The fill method axisymmetric_rz is used for materials which are isotropic with respect to an axis of symmetry, such as a material composed of fibers which are parallel to the axis of symmetry (Slaughter, 2012). The engineering notation matrix in this case is shown by Eq. (8). (8)

Example Input File Syntax

[./elasticity_tensor]
  #Material constants selected to match isotropic lambda and shear modulus case
  type = ComputeElasticityTensor
  C_ijkl = '1022726 113636 113636 1022726 454545'
  fill_method = axisymmetric_rz
[../]
(moose/modules/solid_mechanics/test/tests/isotropic_elasticity_tensor/2D-axisymmetric_rz_test.i)

In the Einstein index notation shown in Eq. (2), the parameter C_ijkl expects the elasticity components in the order C_ijkl = '1111, 1122, 1133, 3333, 2323' for the axisymmetric_rz fill method option.

Principal Directions for Stress and Strain

The fill method principal is appropriate for the case when the principal directions of strain and stress align. The engineering notation representation of the elasticity tensor is shown in Eq. (9). (9)

In the Einstein index notation shown in Eq. (2), the parameter C_ijkl expects the elasticity components in the order C_ijkl = '1111 1122 1133 2211 2222 2233 3311 3322 3333' for the principal fill method option.

Cosserat Elasticity Specific Fill Methods

The following fill methods are available within ComputeElasticityTensor, but the use cases for these methods fall within the Cosserat applications which do not preserve the equilibrium of angular momentum.

General Isotropic Symmetry

The fill method general_isotropic is used for the case of three independent components of an elasticity tensor, Eq. (10). (10)

This fill method case is used in the child class ComputeCosseratElasticityTensor; please see the documentation for ComputeCosseratElasticityTensor for details and examples of the input file syntax.

General Antisymmetric

The fill method antisymmetric builds an antisymmetric elasticity tensor for a shear-only case. The symmetries shown in Eq. (11) are used to create the complete tensor (11) and the engineering notation representation of the antisymmetric elasticity tensor is given in Eq. (12). (12)

This fill method case is used in the child class ComputeCosseratElasticityTensor; please see the documentation for ComputeCosseratElasticityTensor for details and examples of the input file syntax.

No Symmetry

The general fill method for the Compute Elasticity Tensor class does not make any assumptions about symmetry for the elasticity tensor and requires all 81 components of the stiffness tensor as an input string. This fill method case is used in the child class ComputeCosseratElasticityTensor; please see the documentation for ComputeCosseratElasticityTensor for details and examples of the input file syntax.

Rotation Examples

Since the elasticity tensor is defined with respect to a given crystal orientation which may be different than the simulation coordinate frame, one may wish to apply a rotation to the elasticity tensor. Some example use cases include simulating a specific crystal plane in a 2D simulation or embedding a secondary phase in a matrix phase. The rotation ensures the correct stress is generated when a given strain is applied. Strain is calculated in the "sample" or "simulation" reference frame and so the proper "sample to crystal" rotation must be applied. As shown in Eq. (1), a rotation matrix is needed for this operation, which can be built with Euler angles or entered in the input file directly.

Rotation About An Axis

Suppose we wish to rotate the elasticity tensor about the z-axis by 30 degrees. The rotation matrix for rotating a vector by 30 degrees about the z-axis (an "active" rotation matrix) is (13) Such a rotation can be implemented by directly supplying the rotation matrix in the input file using the rotation_matrix parameter in ComputeElasticityTensor.

Example Input File Syntax

[./elasticity_matrix]
  type = ComputeElasticityTensor
  block = 0
  base_name = 'rotation_matrix'
  fill_method = symmetric9
  C_ijkl = '1111 1122 1133 2222 2233 3333 2323 1313 1212'
  # rotation matrix for rotating a vector 30 degrees about the z-axis
  rotation_matrix = '0.8660254 -0.5       0.
                       0.5        0.8660254 0
                       0          0         1'
[../]
(moose/modules/solid_mechanics/test/tests/elasticitytensor/rotation_matrix_1_rotation.i)

Note that the same rotation can be applied using Euler angles. MOOSE expects the "passive" (Bunge) convention, so the input angle is -30 degrees. Also note that since the convention is used, and only a single rotation is needed, the angle could be entered as either euler_angle_1 or euler_angle_3.

Example Input File Syntax

[./elasticity_euler]
  type = ComputeElasticityTensor
  block = 0
  base_name = 'euler'
  fill_method = symmetric9
  C_ijkl = '1111 1122 1133 2222 2233 3333 2323 1313 1212'
  euler_angle_1 = -30. # same as above but opposite direction because _transpose_ gets built from these angles
  euler_angle_2 = 0.
  euler_angle_3 = 0.
[../]
(moose/modules/solid_mechanics/test/tests/elasticitytensor/rotation_matrix_1_rotation.i)

Orientation Relationship Rotation

Rather than a specific axis-angle rotation, sometimes the elasticity tensor must be rotated to satisfy a particular orientation relationship. In this case, the basis vectors of the rotated coordinate system are known, and the corresponding rotation matrix can be built using the unit basis vectors as rows of the rotation matrix. For example suppose we have the following rotation matrix that can be used in the case where the direction of our rotated or "crystal" system points along the z-axis of our simulation or "sample" system. (14) To verify, we apply this rotation matrix to the direction of our "sample" or simulation frame: , meaning it correctly converts directions from "sample" to "crystal" frame, which is a "passive" rotation.

Example Input File Syntax

[./elasticity_matrix]
  type = ComputeElasticityTensor
  block = 0
  base_name = 'rotation_matrix'
  fill_method = symmetric9
  C_ijkl = '1111 1122 1133 2222 2233 3333 2323 1313 1212'
  # rotation matrix for rotating a vector
  #   1. 45 degrees about z-axis
  #   2. ~54.7 degrees (arccos(1/sqrt(3)) radians) about x-axis
  # then taking the tranpose to give sample-to-crystal rotation,
  # ie. R*([0,0,1]) = [1,1,1], meaning the <001> direction of the sample
  # (or simulation) frame points along the <111> direction of the crystal
  rotation_matrix = '0.70710678  0.40824829  0.57735027
                      -0.70710678  0.40824829  0.57735027
                       0.         -0.81649658  0.57735027'
[../]
(moose/modules/solid_mechanics/test/tests/elasticitytensor/rotation_matrix_2_rotations.i)

The rotation matrix in Eq. (14) can also be built in an "active" sense by doing a 45 degree rotation about the z-axis and then a ~54.7 degree ( radians) rotation about the x-axis, then taking the transpose. Therefore these are the corresponding Euler angles to be used since we rotated the elasticity tensor by the "passive" matrix rather than the "active" matrix in the previous example. However, where more than 1 rotation is needed, the order of rotations matter. Since the Euler angle convention in MOOSE uses "extrinsic" rotations, the order must be reversed.

Example Input File Syntax

[./elasticity_euler]
  type = ComputeElasticityTensor
  block = 0
  base_name = 'euler'
  fill_method = symmetric9
  C_ijkl = '1111 1122 1133 2222 2233 3333 2323 1313 1212'
  # the angles here are the same as used to build the rotation matrix above because
  # we build the _transpose_ from euler angles in MOOSE, but we also transposed
  # the matrix for this example, so it goes back to the original;
  # the reversed order is due to the "extrinsic" convention used by MOOSE
  euler_angle_1 = 0.
  euler_angle_2 = 54.73561032
  euler_angle_3 = 45.
[../]
(moose/modules/solid_mechanics/test/tests/elasticitytensor/rotation_matrix_2_rotations.i)

Input Parameters

  • C_ijklStiffness tensor for material

    C++ Type:std::vector<double>

    Unit:(no unit assumed)

    Controllable:No

    Description:Stiffness tensor for material

Required Parameters

  • base_nameOptional parameter that allows the user to define multiple mechanics material systems on the same block, i.e. for multiple phases

    C++ Type:std::string

    Unit:(no unit assumed)

    Controllable:No

    Description:Optional parameter that allows the user to define multiple mechanics material systems on the same block, i.e. for multiple phases

  • blockThe list of blocks (ids or names) that this object will be applied

    C++ Type:std::vector<SubdomainName>

    Unit:(no unit assumed)

    Controllable:No

    Description:The list of blocks (ids or names) that this object will be applied

  • boundaryThe list of boundaries (ids or names) from the mesh where this object applies

    C++ Type:std::vector<BoundaryName>

    Unit:(no unit assumed)

    Controllable:No

    Description:The list of boundaries (ids or names) from the mesh where this object applies

  • computeTrueWhen false, MOOSE will not call compute methods on this material. The user must call computeProperties() after retrieving the MaterialBase via MaterialBasePropertyInterface::getMaterialBase(). Non-computed MaterialBases are not sorted for dependencies.

    Default:True

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:When false, MOOSE will not call compute methods on this material. The user must call computeProperties() after retrieving the MaterialBase via MaterialBasePropertyInterface::getMaterialBase(). Non-computed MaterialBases are not sorted for dependencies.

  • constant_onNONEWhen ELEMENT, MOOSE will only call computeQpProperties() for the 0th quadrature point, and then copy that value to the other qps.When SUBDOMAIN, MOOSE will only call computeQpProperties() for the 0th quadrature point, and then copy that value to the other qps. Evaluations on element qps will be skipped

    Default:NONE

    C++ Type:MooseEnum

    Unit:(no unit assumed)

    Options:NONE, ELEMENT, SUBDOMAIN

    Controllable:No

    Description:When ELEMENT, MOOSE will only call computeQpProperties() for the 0th quadrature point, and then copy that value to the other qps.When SUBDOMAIN, MOOSE will only call computeQpProperties() for the 0th quadrature point, and then copy that value to the other qps. Evaluations on element qps will be skipped

  • declare_suffixAn optional suffix parameter that can be appended to any declared properties. The suffix will be prepended with a '_' character.

    C++ Type:MaterialPropertyName

    Unit:(no unit assumed)

    Controllable:No

    Description:An optional suffix parameter that can be appended to any declared properties. The suffix will be prepended with a '_' character.

  • elasticity_tensor_prefactorOptional function to use as a scalar prefactor on the elasticity tensor.

    C++ Type:FunctionName

    Unit:(no unit assumed)

    Controllable:No

    Description:Optional function to use as a scalar prefactor on the elasticity tensor.

  • euler_angle_10Euler angle in direction 1

    Default:0

    C++ Type:double

    Unit:(no unit assumed)

    Controllable:No

    Description:Euler angle in direction 1

  • euler_angle_20Euler angle in direction 2

    Default:0

    C++ Type:double

    Unit:(no unit assumed)

    Controllable:No

    Description:Euler angle in direction 2

  • euler_angle_30Euler angle in direction 3

    Default:0

    C++ Type:double

    Unit:(no unit assumed)

    Controllable:No

    Description:Euler angle in direction 3

  • fill_methodsymmetric9The fill method

    Default:symmetric9

    C++ Type:MooseEnum

    Unit:(no unit assumed)

    Options:antisymmetric, symmetric9, symmetric21, general_isotropic, symmetric_isotropic, symmetric_isotropic_E_nu, antisymmetric_isotropic, axisymmetric_rz, general, principal, orthotropic

    Controllable:No

    Description:The fill method

  • prop_getter_suffixAn optional suffix parameter that can be appended to any attempt to retrieve/get material properties. The suffix will be prepended with a '_' character.

    C++ Type:MaterialPropertyName

    Unit:(no unit assumed)

    Controllable:No

    Description:An optional suffix parameter that can be appended to any attempt to retrieve/get material properties. The suffix will be prepended with a '_' character.

  • rotation_matrixRotation matrix to apply to elasticity tensor.

    C++ Type:libMesh::TensorValue<double>

    Unit:(no unit assumed)

    Controllable:No

    Description:Rotation matrix to apply to elasticity tensor.

  • use_interpolated_stateFalseFor the old and older state use projected material properties interpolated at the quadrature points. To set up projection use the ProjectedStatefulMaterialStorageAction.

    Default:False

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:For the old and older state use projected material properties interpolated at the quadrature points. To set up projection use the ProjectedStatefulMaterialStorageAction.

Optional Parameters

  • control_tagsAdds user-defined labels for accessing object parameters via control logic.

    C++ Type:std::vector<std::string>

    Unit:(no unit assumed)

    Controllable:No

    Description:Adds user-defined labels for accessing object parameters via control logic.

  • enableTrueSet the enabled status of the MooseObject.

    Default:True

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:Yes

    Description:Set the enabled status of the MooseObject.

  • implicitTrueDetermines whether this object is calculated using an implicit or explicit form

    Default:True

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:Determines whether this object is calculated using an implicit or explicit form

  • seed0The seed for the master random number generator

    Default:0

    C++ Type:unsigned int

    Unit:(no unit assumed)

    Controllable:No

    Description:The seed for the master random number generator

  • use_displaced_meshFalseWhether or not this object should use the displaced mesh for computation. Note that in the case this is true but no displacements are provided in the Mesh block the undisplaced mesh will still be used.

    Default:False

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:Whether or not this object should use the displaced mesh for computation. Note that in the case this is true but no displacements are provided in the Mesh block the undisplaced mesh will still be used.

Advanced Parameters

  • output_propertiesList of material properties, from this material, to output (outputs must also be defined to an output type)

    C++ Type:std::vector<std::string>

    Unit:(no unit assumed)

    Controllable:No

    Description:List of material properties, from this material, to output (outputs must also be defined to an output type)

  • outputsnone Vector of output names where you would like to restrict the output of variables(s) associated with this object

    Default:none

    C++ Type:std::vector<OutputName>

    Unit:(no unit assumed)

    Controllable:No

    Description:Vector of output names where you would like to restrict the output of variables(s) associated with this object

Outputs Parameters

References

  1. Lawrence E Malvern. Introduction to the Mechanics of a Continuous Medium. Prentice-Hall, 1969.[BibTeX]
  2. William S Slaughter. The Linearized Theory of Elasticity. Springer Science & Business Media, 2012.[BibTeX]