20 "large_kinematics",
false,
"Use large displacement kinematics in the kernel.");
21 params.
addParam<
bool>(
"stabilize_strain",
false,
"Average the volumetric strains");
22 params.
addParam<std::vector<MaterialPropertyName>>(
23 "eigenstrain_names", {},
"List of eigenstrains to account for");
24 params.
addParam<std::vector<MaterialPropertyName>>(
25 "homogenization_gradient_names",
27 "List of homogenization gradients to add to the displacement gradient");
29 params.
addParam<std::string>(
"base_name",
"Material property base name");
40 _ndisp(coupledComponents(
"displacements")),
41 _disp(coupledValues(
"displacements")),
42 _grad_disp(coupledGradients(
"displacements")),
43 _base_name(isParamValid(
"base_name") ? getParam<
std::string>(
"base_name") +
"_" :
""),
44 _large_kinematics(getParam<bool>(
"large_kinematics")),
45 _stabilize_strain(getParam<bool>(
"stabilize_strain")),
46 _eigenstrain_names(getParam<
std::vector<MaterialPropertyName>>(
"eigenstrain_names")),
47 _eigenstrains(_eigenstrain_names.size()),
48 _eigenstrains_old(_eigenstrain_names.size()),
49 _total_strain(declareProperty<
RankTwoTensor>(_base_name +
"total_strain")),
50 _total_strain_old(getMaterialPropertyOld<
RankTwoTensor>(_base_name +
"total_strain")),
51 _mechanical_strain(declareProperty<
RankTwoTensor>(_base_name +
"mechanical_strain")),
52 _mechanical_strain_old(getMaterialPropertyOld<
RankTwoTensor>(_base_name +
"mechanical_strain")),
53 _strain_increment(declareProperty<
RankTwoTensor>(_base_name +
"strain_increment")),
54 _spatial_velocity_increment(
55 declareProperty<
RankTwoTensor>(_base_name +
"spatial_velocity_increment")),
56 _vorticity_increment(declareProperty<
RankTwoTensor>(_base_name +
"vorticity_increment")),
57 _F_ust(declareProperty<
RankTwoTensor>(_base_name +
"unstabilized_deformation_gradient")),
58 _F_avg(declareProperty<
RankTwoTensor>(_base_name +
"average_deformation_gradient")),
59 _F(declareProperty<
RankTwoTensor>(_base_name +
"deformation_gradient")),
60 _F_old(getMaterialPropertyOld<
RankTwoTensor>(_base_name +
"deformation_gradient")),
61 _F_inv(declareProperty<
RankTwoTensor>(_base_name +
"inverse_deformation_gradient")),
62 _f_inv(declareProperty<
RankTwoTensor>(_base_name +
"inverse_incremental_deformation_gradient")),
63 _homogenization_gradient_names(
64 getParam<
std::vector<MaterialPropertyName>>(
"homogenization_gradient_names")),
65 _homogenization_contributions(_homogenization_gradient_names.size()),
66 _rotation_increment(declareProperty<
RankTwoTensor>(_base_name +
"rotation_increment"))
77 mooseError(
"ComputeLagrangianStrainBase cannot accommodate more than one " 78 "homogenization gradient");
90 _total_strain[_qp].zero();
91 _mechanical_strain[_qp].zero();
92 _F[_qp].setToIdentity();
100 computeDeformationGradient();
102 for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
103 computeQpProperties();
111 for (
auto contribution : _homogenization_contributions)
112 _F[_qp] += (*contribution)[_qp];
117 if (_large_kinematics)
119 _F_inv[_qp] = _F[_qp].
inverse();
120 _f_inv[_qp] = _F_old[_qp] * _F_inv[_qp];
128 dL = _F[_qp] - _F_old[_qp];
131 computeQpIncrementalStrains(dL);
139 _strain_increment[_qp] = (dL + dL.
transpose()) / 2.0;
140 _vorticity_increment[_qp] = (dL - dL.
transpose()) / 2.0;
143 _total_strain[_qp] = _total_strain_old[_qp] + _strain_increment[_qp];
148 subtractQpEigenstrainIncrement(_strain_increment[_qp]);
151 _mechanical_strain[_qp] = _mechanical_strain_old[_qp] + _strain_increment[_qp];
154 _spatial_velocity_increment[_qp] = _vorticity_increment[_qp] + _strain_increment[_qp];
164 for (
auto i :
make_range(_eigenstrain_names.size()))
165 strain -= (*_eigenstrains[i])[_qp] - (*_eigenstrains_old[i])[_qp];
172 _F_ust[_qp].setToIdentity();
174 G::addGradOp(_F_ust[_qp],
186 for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
188 computeQpUnstabilizedDeformationGradient();
189 _F[_qp] = _F_ust[_qp];
193 if (_stabilize_strain)
196 [
this](
unsigned int qp) {
return _F_ust[qp]; }, _JxW, _coord);
198 _F_avg.set().setAllValues(F_avg);
201 for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
203 if (_large_kinematics)
204 _F[_qp] *=
std::pow(F_avg.det() / _F[_qp].det(), 1.0 / 3.0);
RankTwoTensorTempl< Real > inverse() const
virtual void computeQpUnstabilizedDeformationGradient()
Calculate the unstabilized deformation gradient at the quadrature point.
static const std::string component
static InputParameters baseParams()
static RankTwoTensorTempl Identity()
std::vector< const MaterialProperty< RankTwoTensor > * > _homogenization_contributions
Actual homogenization contributions.
virtual void computeDeformationGradient()
Calculate the unstabilized and optionally the stabilized deformation gradients.
std::vector< MaterialPropertyName > _homogenization_gradient_names
Names of any extra homogenization gradients.
virtual void computeProperties() override
std::vector< const MaterialProperty< RankTwoTensor > * > _eigenstrains_old
static InputParameters validParams()
std::vector< const MaterialProperty< RankTwoTensor > * > _eigenstrains
std::vector< MaterialPropertyName > _eigenstrain_names
virtual void initQpStatefulProperties() override
virtual void subtractQpEigenstrainIncrement(RankTwoTensor &strain)
Subtract the eigenstrain increment to subtract from the total strain.
RankTwoTensorTempl< Real > transpose() const
IntRange< T > make_range(T beg, T end)
void mooseError(Args &&... args) const
Calculate strains to use the MOOSE materials with the Lagrangian kernels.
auto elementAverage(const Functor &f, const MooseArray< Real > &JxW, const MooseArray< Real > &coord)
virtual void computeQpIncrementalStrains(const RankTwoTensor &dL)
Calculate the strains based on the spatial velocity gradient.
MooseUnits pow(const MooseUnits &, int)
ComputeLagrangianStrainBase(const InputParameters ¶meters)
virtual void computeQpProperties() override