www.inl.gov MOOSE Workshop MOOSE-PF/MARMOT Training Mechanics Part Nashville, February 14th Daniel Schwen
www.inl.gov III. Mechanics
Mechanics Outline 1. Introduction 2. Tensor-based System 1. Compute Elasticity Tensor 2. Compute Strain 3. Compute Stress 3. Linear Elasticity 4. Finite Strain 1. Elasticity 2. J2 Plasticity 3. Crystal Plasticity 5. Eigen Strains 6. Contact
Modeling Mechanical Deformation The mechanical response of materials is a critical factor for all structural materials and many functional materials. Solid mechanics predicts deformation and motion under the action of forces, temperature changes, phase changes, and other external or internal agents. Inputs: material properties, boundary conditions, body forces Outputs: displacements, strains, stresses
Solid Mechanics Without going into any detail, we solve for the displacement vector u with the residual equation (with no acceleration): r + b = 0 in u = g in n = in g Where σ is the Cauchy stress tensor, u is the displacement vector, b is the body force, n is the unit normal to the boundary, g is the prescribed displacement on the boundary and ι is the prescribed traction on the boundary. The weak form of the residual is expressed as R =(, r m ) h, mi (b, m) =0 For a given material behavior, the constitutive model describes the stress response of the material, i.e. The constitutive model could be linear (linear elasticity) or nonlinear for both small and finite strains.
Module provides the tools necessary for solving solid mechanics using tensor forms, with emphasis on developing new models Anisotropic elasticity tensors that can change spatially Linear elasticity Eigen strains Finite strain mechanics J2 plasticity Crystal plasticity
Documentation The tensor mechanics module is documented on the mooseframework.org wiki: http://mooseframework.org/wiki/physicsmodules/tensormechanics/
Tensor Mechanics Objects To make the development of materials models as straight forward as possible, we represent stress, elasticity tensors, etc. as tensors. = C Thus, is written as: stress = elasticity_tensor*strain Rank two tensors are rotated according to stress_rot = R*stress*R.transpose() RankTwoTensor (stress, strain) /tensor_mechanics/src/utils/ranktwotensor.c 3 by 3, with indices accessed as A(i,j) Addition, subtraction, multiplication, transpose, inverse, etc. are all defined. RankFourTensor /tensor_mechanics/src/utils/rankfourtensor.c 3 by 3 by 3 by 3, with indices accessed as C(i,j,k,l) Addition, subtraction with RankFourTensors Muliplication defined with RankFourTensors and RankTwoTensor, as well as rotation. Values set assuming various levels of symmetry ElasticityTensorR4 /tensor_mechanics/src/utils/elasticitytensorr4.c Specialization of RankFourTensor Can be inverted for nonlinear solution RotationTensor /tensor_mechanics/src/utils/rotationtensor.c Defined in terms of three Euler angles
Tensor Mechanics Solution Vector variables do not exist in MOOSE, so three (or two) variables must be created, typically disp_x, disp_y and disp_z. Three kernels would also be necessary, however we have a custom kernel action called TensorMechanics that creates the kernels. [GlobalParams] displacements = disp_x disp_y disp_z [] [Kernels] [./TensorMechanics] [../] [] The kernel is defined in StressDivergenceTensors Weak form of the stress divergence equation is: Real StressDivergenceTensors::computeQpResidual() { return _stress[_qp].row(_component) * _grad_test[_i][_qp]; } //Taken from StressDivegenceTensors in MOOSE-tensor_mechanics (, r i )
Calculating the Stress The stress, used in the mechanics kernel, is calculated using the MOOSE material system. The elasticity tensor, strain, and stress are each calculated in their own block. Thus, three blocks are required in the input file: [Materials] [./elasticity_tensor] type = ComputeElasticityTensor block = 1 fill_method = symmetric_isotropic C_ijkl = '4.2e6 1.9e7' [../] [./strain] type = ComputeSmallStrain block = 1 # displacements in GlobalParams [../] [./stress] type = ComputeLinearElasticStress block = 1 [../] []
ComputeElasticityTensor This material creates the elasticity tensor from an input vector. Various symmetries are possible, defined by the fill_method Antisymmetric_isotropic Takes 1 input Symmetric_isotropic Takes 2 inputs [1 st Lame (bulk), 2 nd Lame (shear)] General_isotropic Takes 3 inputs [1 st Lame, 2 nd Lame, antisymmetric shear] Antisymmetric Takes 6 inputs [B 1212 B 1213 B 1223 B 1313 B 1323 B 2323 ] Symmetric9 Takes 9 inputs [C 1111 C 1122 C 1133 C 2222 C 2233 C 3333 C 2323 C 1313 C 1212 ] Symmetric21 Takes 21 (see.h file for list) General Assigns all 81 components Optionally, you can also pass in three Euler angles to rotate the elasticity tensor (see ComputeRotatedElasticityTensorBase) Users can define their own ways of calculating elasticity tensors by inheriting from ComputeElasticityTensorBase ComputeIsotropicElasticityTensor ComputeConcentrationDependentElasticityTensor CompositeElasticityTensor Provides derivatives!
ComputeIsotropicElasticityTensor Use ComputeIsotropicElasticityTensor For isotropy, there are various ways of defining the elastic constants This material creates an isotropic elasticity tensor from three possible combination of elastic constants. Possible combinations: First lame constant λ and shear modulus µ Young s modulus E and Poisson s ratio ν Bulk modulus K and shear modulus µ [./elasticity_tensor] type = ComputeIsotropicElasticityTensor block = 1 youngs_modulus = 240e9 #GPa poissons_ratio = 0.3 [../]
CompositeElasticityTensor Assemble arbitrary tensors with non-linear variable dependencies Combine a set of base tensors C i with a list of functions f i C = i f i C i The f i are Derivative Function Materials (recall Phase Field) All derivatives are built automatically [./C1_tensor] type = ComputeIsotropicElasticityTensor block = 1 base_name = C1 youngs_modulus = 240e9 poissons_ratio = 0.3 [../] [./f1_function] type = DerivativeParsedMaterial block = 0 args = 'c function = (1-c)^2 [../] [./elasticity_tensor] type = CompositeElasticityTensor block = 0 tensors = 'C1 C2' weights = 'f1 f2' args = 'c' [../]
Compute Strain The strain is calculated from the gradient of the displacement vector for a given strain formulation Users can define strains by inheriting from ComputeStrainBase ComputeSmallStrain (Cartesian coordinates) Assumes small strains Computes the total strain ComputeAxisymmetricRZSmallStrain ComputeFiniteStrain (Cartesian coordinates) Strains can be large Uses incremental form ComputeAxisymmetricRZFiniteStrain [./small_strain] type = ComputeSmallStrain block = 1 # displacements in GlobalParams [../] [./finite_strain] type = ComputeFiniteStrain block = 1 # displacements in GlobalParams [../]
Compute Stress The stress is calculated from the strain or strain increment according to a specific constitutive model Users can create new constitutive laws by inheriting from ComputeStressBase and overriding computeqpstress Linear elasticity directly calculates the stress from the strain Nonlinear models require a nested Newton solve to determine the stress [./stress] type = ComputeLinearElasticStress block = 1 [../]
Linear Elasticity Calculates the stress with and Uses ComputeSmallStrain and ComputeLinearElasticStress void ComputeSmallStrain::computeProperties() { for (_qp = 0; _qp < _qrule->n_points(); ++_qp) { RankTwoTensor grad_tensor(_grad_disp_x[_qp], _grad_disp_y[_qp], _grad_disp_z[_qp]); _total_strain[_qp] = (grad_tensor + grad_tensor.transpose()) / 2.0; } } //Taken from ComputeSmallStrain void ComputeLinearElasticStress::computeQpStress() { // stress = C*e _stress[_qp] = _elasticity_tensor[_qp] * _total_strain[_qp]; } //Taken from ComputeLinearElasticStress
Boundary Conditions MOOSE has all of the usual options for boundary conditions. The main boundary conditions for mechanics are: PresetBC Applies a specific constant displacement on a given boundary or node by setting the value of the displacement (Dirichlet). FunctionPresetBC Applies a displacement defined by a function. May vary spatially or with time. Ramped loading Pressure Applies a set pressure on a given boundary in the units of the simulation. NeumannBC Sets the value of the derivative of the solution on the boundary.
Linear Elasticity Example To demonstrate linear elasticity, we model a bridge with a body force (gravity) and an applied pressure on the top face See moose/tensor_mechanics/examples/bridge/bridge.i Problem Summary Bridge under gravity and a 0.5 MPa load Material properties: Steel Concrete Boundary conditions: Bottom of supports are constrained in all directions Solved using small strains and linear elasticity
Finite Strain Materials For finite strains, the material will deform and also rotate The deformation is defined in terms of the deformation gradient F The deformation gradient is divided into the rotation and the stretch F = RU σ = Rσ R T Stress calculation, σ We use a co-rotational form where the stress is calculated in the intermediate configuration, and then the rotation is applied ComputeFiniteStrain calculates strain_increment rotation_increment strain_rate deformation_gradient
Finite Strain Example Problem To demonstrate finite strain, we model a single element that is compressed and then rotated. There are finite strains, and large displacements. See moose/tensor_mechanics/tests/finite_strain_elastic/ elastic_rotation_test.i Finite strain version of the bridge example
Finite Strain Plastic Materials FiniteStrainPlasticMaterial: Rate independent von Mises plasticity Flow equations integrated using Backward Euler and Newton Raphson. Required input parameter yield stress which specifies hardening behavior and has to be provided as plastic strain-stress pair. yield_stress = 0 445 0.05 610 0.1 680 0.38 810 0.95 920 2 950 Example: /combined/tests/tensor_mechanics_j2plasticity/ tensor_mechanics_j2plasticity.i FiniteStrainRatePlasticMaterial: Rate dependent von Mises plasticity model. Perzyna model used to define the viscoplastic strain rate
Verification with ABAQUS Rate independent von Mises plasticity with large deformation Δu z = 0.01 mm used in both the simulations Equivalent Plastic Strain u z =0 u z =1 mm
Phenomenological vs. Mechanistic Plasticity J2 plasticity is phenomenological and based on empirical observation. A more mechanistic view considers dislocation motion In situ TEM video of deformation experiment Video from http://www.numodis.fr/tridis/tem/index.html
Crystal Plasticity Crystal plasticity mechanistically represents plastic deformation by representing dislocation slip along slip planes Slip contributions are summed across all slip planes Dislocation generation and pile-up accounted for by increasing slip resistance with a hardening law Crystal reorientation obtained from kinematics Plastic deformation due to slip along slip planes L c p = MX s=1 sb s 0 n s 0 Dislocation motion defined by a flow rule s = s ( s, s 0 )
Crystal Plasticity Materials FiniteStrainCrystalPlasticity: Rate dependent plasticity model driven by slip on every slip system Backward Euler time integration using Newton-Raphson. Required parameters: nss number of slip systems; varies for different crystal systems (fcc, bcc, hcp). gprops initial values of slip system resistances. hprops hardening properties flowprops flow properties Presently Euler angle for each element read from an input file Flow rule and hardness evolution can be modified by overriding functions get_slip_incr() and update_gss().
Example We have conducted various investigations with crystal plasticity solved with moose, see Chockalingam et al, Comp. Mech, (2013) 51:617-627 The results compared very well with those from an Abaqus Umat Compression of a polycrystalline cylinder: Stress (MPa) 200 150 100 600 50 Huang Abaqus Umat MOOSE JFNK Routine 0 0 0.001 0.002 0.003 0.004 0.005 0.006 0.007 Strain 500 Stress Von Mises (MPa) 400 300 200 100 Grain 1 Grain 2 Grain 3 Grain 4 Grain 5 Grain 6 Grain 7 Grain 8 0 0 0.05 0.1 0.15 0.2 0.25 0.3 0.35 zz
Stress-Free Strains Local stress-free strains can be added to a model, i.e. = C ( 0 ) [Materials] This can be used to add volumetric strains (such as swelling), or strains due to lattice mismatch, etc. Stress-free strains are created in the material block. The base class is ComputeStressFreeStrainBase Constant Stress-free strains are build using ComputeEigenstrain Stress-free strains that are functions of other variables are built using ComputeVariableEigenstrain [./var_dependence] type = DerivativeParsedMaterial block = 0 function = 0.5*c^2 args = c f_name = var_dep enable_jit = true [../] [./eigen_strain] type = ComputeVariableEigenstrain block = 0 eigen_base = '1 1 1 0 0 0 args = c [../] []
Stress-Free Strain Example Secondary phase inclusion strains surrounding material See moose/modules/combined/tests/eigenstrain/variable.i
Visualizing the Stress and Strain Tensor material properties can not be directly outputted To output components of the stress, strain, or elastic constants, you must create an auxvariable and a corresponding auxkernel. Tensor auxkernels RankTwoAux: Outputs one component of a rank two tensor RankTwoScalarAux: Outputs scalar norms, Von Mises stress, equivalent plastic strain, trace, L2 norm RankFourAux: Outputs one component of a rank four tensor
Contact Module Contact algorithms in a solid mechanics finite element code prevent the penetration of one domain into another or the penetration of a domain into itself. It represents a critical capability to accurately model physical behavior It is also very difficult to accurately model physical contact using finite elements Ω (1) t (1) t (2) Ω (2)
Some Required Capabilities for Contact Search Exterior identification Nearby nodes Capture box Binarysearch,e.g. Contact existence More geometric work Penetration point Enforcement Formulation of contact force Formulation of Jacobian for nonlinear solve Interaction with other capabiities (e.g. kinematic boundary conditions) Development, testing, and application testing of contact require many, many man-months of effort. In fact, it is probably man years. A robust (though improving) contact capability is is available in the Contact Module
Contact Overview Contact is modeled by tracking interaction of a node on a face Nodes (green) may not penetrate faces (defined by orange nodes) No force is applied where the bodies are not in contact The contact forces must increase from zero as the bodies first come into contact
Contact Constraints g 0; the gap (penetration distance) must be non-positive t N 0; the contact force must push bodies apart t N g = 0; the contact force must be zero if the bodies are not in contact t N g = 0; the contact force must be zero when constraints are formed and released The gap in the normal direction for constraint i is (n is the normal, N denotes normal direction, d s is position of the slave node, d c is position of the contact point, and G is a matrix) g g i N = n i (d i (t) g i N = G i N (d(t)) t N d i c(t))
Contact Options Formulation:kinematic or penalty Kinematic is more accurate but also harder to solve. Model:frictionless, glued, or coulomb Frictionless enforces the normal constraint and allows nodes to come out of contact if they are in tension. Glued ties nodes where they come into contact with no release. Coulomb is frictional contact with release. friction coefficient Coulomb friction coefficient. penalty The penalty stiffness to be used in the constraint. Master The surface corresponding to the faces in the constraint. Slave The surface corresponding to the nodes in the constraint. normal smoothing distance Distance from face edge in parametric coordinates over which to smooth the normal. Helps with convergence. Try 0.1. tension release The tension value which will allow nodes to be released. Defaults to zero.
Contact Example Model of a hard spherical diamond indenter in contact with Cu using finite strain plasticity and frictionless contact. J2 plasticity with isotropic elasticity tensor J2 plasticity with anisotropic elasticity tensor Single crystal plasticity
Other Available Mechanics Capability There are users of the mechanics module across the world and they are all adding capability There are various available models Multi-yield surface plasticity Cosserat (Micropolar) Mechanics Mohr-Coulomb plasticity Weak plane tensile and shear behavior (for weakly bonded layers) Other capabilities will come soon Extended Finite Element