- C_ijklStiffness tensor for material
C++ Type:std::vector<double>
Unit:(no unit assumed)
Controllable:No
Description:Stiffness tensor for material
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
- 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)
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)
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