https://mooseframework.inl.gov
ComputeLagrangianStrainBase.h
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://mooseframework.inl.gov
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
10 #pragma once
11 
12 #include "Material.h"
13 #include "RankFourTensorForward.h"
14 #include "RankTwoTensorForward.h"
15 #include "StabilizationUtils.h"
16 #include "GradientOperator.h"
17 #include "GuaranteeProvider.h"
18 
42 template <class G>
44 {
45 public:
46  static InputParameters baseParams();
49  virtual void initialSetup() override;
50 
55  {
56  Linear,
57  Quadratic,
60  };
61 
69  enum class FBarMode
70  {
71  Total,
73  };
74 
75 protected:
76  virtual void initQpStatefulProperties() override;
77  virtual void computeProperties() override;
78  virtual void computeQpProperties() override;
81  virtual void computeQpIncrementalStrains(const RankTwoTensor & dL);
85  void setQpIncrementalStrains(const RankTwoTensor & dd, const RankTwoTensor & dw);
93  RankTwoTensor & dd,
94  RankTwoTensor & dw,
95  RankFourTensor & d_dL_d_f_inv,
96  RankFourTensor & d_dw_d_f_inv,
97  bool need_jacobian);
101  void computeQpPolarDecomposition(bool need_jacobian);
103  virtual void subtractQpEigenstrainIncrement(RankTwoTensor & strain);
107  virtual void computeQpActualDeformationGradient();
109  virtual void computeDeformationGradient();
110 
111  // Displacements and displacement gradients
112  const unsigned int _ndisp;
113  std::vector<const VariableValue *> _disp;
114  std::vector<const VariableGradient *> _grad_disp;
116  std::vector<const VariableValue *> _disp_old;
118  std::vector<const VariableGradient *> _grad_disp_old;
119 
121  const std::string _base_name;
122 
124  const bool _large_kinematics;
125 
127  const bool _stabilize_strain;
128 
131 
142 
144  const Real _alpha;
145 
148 
149  // The eigenstrains
150  std::vector<MaterialPropertyName> _eigenstrain_names;
151  std::vector<const MaterialProperty<RankTwoTensor> *> _eigenstrains;
152  std::vector<const MaterialProperty<RankTwoTensor> *> _eigenstrains_old;
153 
154  // The total strains
159 
168 
171 
174 
177 
180 
185 
190 
191  // The average deformation gradient over the element for F-bar stabilization. Note that the
192  // average deformation gradient is undefined if stabilization is not active.
194 
195  // The deformation gradient. If stabilization is active, this will be the stabilized deformation
196  // gradient. Otherwise this will be equal to the unstabilized deformation gradient.
198 
201 
206 
214 
218 
223 
227 
237 
241 
246 
248  std::vector<MaterialPropertyName> _homogenization_gradient_names;
249 
251  std::vector<const MaterialProperty<RankTwoTensor> *> _homogenization_contributions;
252 
255 
256 private:
259  void computeLinearIncrement(const RankTwoTensor & f_inv,
260  RankTwoTensor & dd,
261  RankTwoTensor & dw,
262  RankFourTensor & d_dL_d_f_inv,
263  RankFourTensor & d_dw_d_f_inv,
264  bool need_jacobian) const;
267  void computeQuadraticIncrement(const RankTwoTensor & f_inv,
268  RankTwoTensor & dd,
269  RankTwoTensor & dw,
270  RankFourTensor & d_dL_d_f_inv,
271  RankFourTensor & d_dw_d_f_inv,
272  bool need_jacobian) const;
276  RankTwoTensor & dd,
277  RankTwoTensor & dw,
278  RankFourTensor & d_dL_d_f_inv,
279  RankFourTensor & d_dw_d_f_inv,
280  bool need_jacobian) const;
283  void computeRashidEigenIncrement(const RankTwoTensor & f_inv,
284  RankTwoTensor & dd,
285  RankTwoTensor & dw,
286  RankFourTensor & d_dL_d_f_inv,
287  RankFourTensor & d_dw_d_f_inv,
288  bool need_jacobian) const;
289 
298  const RankTwoTensor & dw) const;
299 };
MaterialProperty< RankTwoTensor > & _F
const MaterialProperty< RankTwoTensor > & _F_ust_old
Old unstabilized deformation gradient.
const MaterialProperty< RankTwoTensor > & _total_strain_old
std::vector< const VariableGradient * > _grad_disp_old
Old displacement gradients for the generalized midpoint rule.
virtual void computeQpUnstabilizedDeformationGradient()
Calculate the unstabilized (alpha-weighted) deformation gradient at the quadrature point...
void computeRashidEigenIncrement(const RankTwoTensor &f_inv, RankTwoTensor &dd, RankTwoTensor &dw, RankFourTensor &d_dL_d_f_inv, RankFourTensor &d_dw_d_f_inv, bool need_jacobian) const
"Exact" via polar decomposition of f^{-1} + matrix logs.
Add-on class that provides the functionality to issue guarantees for declared material properties...
const InputParameters & parameters() const
MaterialProperty< RankTwoTensor > & _F_ust_inv
Inverse and determinant of the unstabilized deformation gradient F_ust.
std::vector< const VariableGradient * > _grad_disp
MaterialProperty< Real > & _F_ust_det
MaterialProperty< RankFourTensor > & _d_rotation_d_F
Derivative of R with respect to F.
const MaterialProperty< RankTwoTensor > & _mechanical_strain_old
std::vector< const MaterialProperty< RankTwoTensor > * > _homogenization_contributions
Actual homogenization contributions.
MaterialProperty< RankTwoTensor > & _F_actual
The literal deformation gradient at n+1 (I + grad u_{n+1}).
static const std::string G
Definition: NS.h:170
virtual void computeDeformationGradient()
Calculate the unstabilized and optionally the stabilized deformation gradients.
std::vector< const VariableValue * > _disp
MaterialProperty< RankTwoTensor > & _mechanical_strain
std::vector< MaterialPropertyName > _homogenization_gradient_names
Names of any extra homogenization gradients.
virtual void computeProperties() override
MaterialProperty< RankTwoTensor > & _F_ust
The unstabilized (alpha-weighted) deformation gradient.
std::vector< const MaterialProperty< RankTwoTensor > * > _eigenstrains_old
void setQpIncrementalStrains(const RankTwoTensor &dd, const RankTwoTensor &dw)
Update strain / vorticity / mechanical-strain bookkeeping from already-split (dd, dw) tensors...
std::vector< const VariableValue * > _disp_old
Old displacement values for the generalized midpoint rule.
virtual void initialSetup() override
std::vector< const MaterialProperty< RankTwoTensor > * > _eigenstrains
MaterialProperty< RankTwoTensor > & _total_strain
const MaterialProperty< RankTwoTensor > & _F_old
Old deformation gradient.
MaterialProperty< RankTwoTensor > & _rotation
Polar decomposition R of the (alpha-weighted, F-bar-stabilized) deformation gradient F at this qp...
MaterialProperty< RankTwoTensor > & _F_avg
std::vector< MaterialPropertyName > _eigenstrain_names
void computeLinearIncrement(const RankTwoTensor &f_inv, RankTwoTensor &dd, RankTwoTensor &dw, RankFourTensor &d_dL_d_f_inv, RankFourTensor &d_dw_d_f_inv, bool need_jacobian) const
Linear approximation: dL = I - f^{-1}.
virtual void initQpStatefulProperties() override
const bool _large_kinematics
If true the equilibrium conditions is calculated with large deformations.
virtual void subtractQpEigenstrainIncrement(RankTwoTensor &strain)
Subtract the eigenstrain increment to subtract from the total strain.
MaterialProperty< RankTwoTensor > & _strain_increment
Strain increment.
void computeQpPolarDecomposition(bool need_jacobian)
Compute and publish the polar decomposition of _F_actual at the current qp.
MaterialProperty< RankFourTensor > & _d_vorticity_increment_d_F
Derivative of the vorticity increment Deltaw with respect to F_{n+1}.
MaterialProperty< RankTwoTensor > & _stretch
Stretch U from the same polar decomposition.
RankTwoTensor computeQpRotationIncrement(const RankTwoTensor &f_inv, const RankTwoTensor &dw) const
Rotation increment matched to the active _kinematic_approximation, suitable for publishing as _rotati...
MaterialProperty< RankTwoTensor > & _F_inv
Inverse deformation gradient.
const bool _stabilize_strain
If true stabilize the strains with F_bar.
MaterialProperty< RankFourTensor > & _d_F_d_grad_u
Derivative of F_{n+1} with respect to the displacement gradient.
const FBarMode _F_bar_mode
Selected F-bar averaging mode (Total vs. Incremental). See FBarMode.
virtual void computeQpActualDeformationGradient()
Calculate the actual deformation gradient at n+1 (no alpha weighting, no F-bar)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const std::string _base_name
Material system base name.
KinematicApproximation
Approximation used to convert the inverse incremental deformation gradient f^{-1} into the increment ...
const Real _alpha
Generalized-midpoint weight for the deformation gradient (1.0 = backward Euler, 0.5 = midpoint)
void computeQuadraticIncrement(const RankTwoTensor &f_inv, RankTwoTensor &dd, RankTwoTensor &dw, RankFourTensor &d_dL_d_f_inv, RankFourTensor &d_dw_d_f_inv, bool need_jacobian) const
Quadratic approximation: dL = (I - f^{-1}) + 0.5 (I - f^{-1})^2.
Calculate strains to use the MOOSE materials with the Lagrangian kernels.
MaterialProperty< RankFourTensor > & _d_F_stab_d_F_ust
Partial derivative of the F-bar-stabilized deformation gradient with respect to the unstabilized (per...
FBarMode
What F gets F-bar volumetric correction applied to.
MaterialProperty< RankTwoTensor > & _vorticity_increment
Vorticity increment.
MaterialProperty< RankFourTensor > & _d_F_stab_d_F_avg
Partial derivative of the F-bar-stabilized deformation gradient with respect to the element-averaged ...
const KinematicApproximation _kinematic_approximation
Selected approximation for the spatial velocity gradient increment.
const bool _publish_rotation_increment
If true, publish _rotation_increment = exp(_vorticity_increment) (Rodrigues) instead of the default i...
void computeRashidApproximateIncrement(const RankTwoTensor &f_inv, RankTwoTensor &dd, RankTwoTensor &dw, RankFourTensor &d_dL_d_f_inv, RankFourTensor &d_dw_d_f_inv, bool need_jacobian) const
Rashid&#39;s approximate symmetric+skew formulas.
virtual void computeQpIncrementalStrains(const RankTwoTensor &dL)
Calculate the strains based on the spatial velocity gradient.
MaterialProperty< RankFourTensor > & _d_deformation_gradient_increment_d_F
Derivative of the spatial velocity gradient increment with respect to F_{n+1}.
MaterialProperty< RankTwoTensor > & _rotation_increment
Rotation increment for "old" materials inheriting from ComputeStressBase.
static InputParameters validParams()
"Exact": polar decomposition + matrix logs
MaterialProperty< RankTwoTensor > & _f_inv
Inverse incremental deformation gradient.
void computeQpLargeKinematicIncrement(const RankTwoTensor &f_inv, RankTwoTensor &dd, RankTwoTensor &dw, RankFourTensor &d_dL_d_f_inv, RankFourTensor &d_dw_d_f_inv, bool need_jacobian)
Dispatcher: compute (Deltad, Deltaw, d(Deltal)/d(f^{-1}), d(Deltaw)/d(f^{-1})) for the active kinemat...
MaterialProperty< RankTwoTensor > & _deformation_gradient_increment
Deformation gradient increment.
ComputeLagrangianStrainBase(const InputParameters &parameters)
virtual void computeQpProperties() override
MaterialProperty< RankTwoTensor > & _rotated_mechanical_strain
Mechanical strain accumulated with the incremental rotation r_hat = exp(Deltaw), matching the convent...
const MaterialProperty< RankTwoTensor > & _rotated_mechanical_strain_old