23 "homogenization constraint Jacobian terms");
25 "scalar_variable",
"macro_var",
"Optional scalar field with the macro gradient");
28 "off_diagonal_jacobian",
true,
"Include the off diagonal parts of the constraint Jacobian");
36 _use_off_diagonal(getParam<bool>(
"off_diagonal_jacobian"))
44 std::set<std::string>
vars = TotalLagrangianStressDivergence::additionalROVariables();
45 vars.insert(_kappa_var_ptr->name());
55 std::vector<Real> scalar_residuals(_k_order);
58 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
60 initScalarQpResidual();
61 const auto dV = _JxW[_qp] * _coord[_qp];
66 for (
const auto & [indices, constraint] :
cmap())
68 const auto [i,
j] = indices;
69 const auto [ctype, ctarget] = constraint;
70 const auto cval = ctarget->value(_t, _q_point[_qp]);
77 val =
_pk1[_qp](i,
j);
79 val =
_F[_qp](i,
j) - (
Real(i ==
j));
81 mooseError(
"Unknown constraint type in the integral!");
86 val =
_pk1[_qp](i,
j);
88 val = 0.5 * (
_F[_qp](i,
j) +
_F[_qp](
j, i)) - (
Real(i ==
j));
90 mooseError(
"Unknown constraint type in the integral!");
93 scalar_residuals[h++] += (val - cval) * dV;
98 _assembly, scalar_residuals, _kappa_var_ptr->dofIndices(), _kappa_var_ptr->scalingFactor());
107 _local_ke.resize(_k_order, _k_order);
110 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
112 initScalarQpJacobian(_kappa_var);
113 const auto dV = _JxW[_qp] * _coord[_qp];
118 for (
const auto & [indices1, constraint1] :
cmap())
120 const auto [i,
j] = indices1;
121 const auto ctype = constraint1.first;
126 for (
const auto & [indices2, constraint2] :
cmap())
128 const auto [
k, l] = indices2;
137 _local_ke(h, m++) += dV * (
Real(i ==
k &&
j == l));
139 _local_ke(h, m++) += dV * (0.5 *
Real(i ==
k &&
j == l) + 0.5 *
Real(i == l &&
j ==
k));
142 mooseError(
"Unknown constraint type in Jacobian calculator!");
148 addJacobian(_assembly,
150 _kappa_var_ptr->dofIndices(),
151 _kappa_var_ptr->dofIndices(),
152 _kappa_var_ptr->scalingFactor());
157 const unsigned int jvar_num)
164 if (jvar_num != _var.number())
167 const auto & jvar = getVariable(jvar_num);
168 const auto jvar_size = jvar.phiSize();
169 _local_ke.resize(_k_order, jvar_size);
177 _fe_problem.prepareShapes(jvar_num, _tid);
182 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
184 const auto dV = _JxW[_qp] * _coord[_qp];
189 for (
const auto & [indices, constraint] :
cmap())
191 std::tie(
_m,
_n) = indices;
192 _ctype = constraint.first;
193 initScalarQpOffDiagJacobian(jvar);
194 for (_j = 0; _j < jvar_size; _j++)
200 addJacobian(_assembly,
202 _kappa_var_ptr->dofIndices(),
204 _kappa_var_ptr->scalingFactor());
209 const unsigned int svar_num)
215 if (svar_num != _kappa_var)
218 _local_ke.resize(_test.size(), _k_order);
220 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
223 const auto dV = _JxW[_qp] * _coord[_qp];
224 for (
const auto & [indices, constraint] :
cmap())
227 std::tie(
_m,
_n) = indices;
228 _ctype = constraint.first;
229 initScalarQpJacobian(svar_num);
230 for (_i = 0; _i < _test.size(); _i++)
237 _assembly, _local_ke, _var.dofIndices(), _kappa_var_ptr->dofIndices(), _var.scalingFactor());
287 return delta_F_stab(
_m,
_n);
289 return 0.5 * (delta_F_stab(
_m,
_n) + delta_F_stab(
_n,
_m));
292 mooseError(
"Unknown constraint type in kernel calculation!");
const unsigned int _alpha
Which component of the vector residual this kernel is responsible for.
const MaterialProperty< RankTwoTensor > & _pk1
The 1st Piola-Kirchhoff stress.
std::vector< std::vector< RankTwoTensor > > _avg_grad_trial
virtual RankTwoTensor gradTrialUnstabilized(unsigned int component)
The unstabilized trial function gradient.
void mooseError(Args &&... args)
static InputParameters validParams()
const bool _stabilize_strain
If true calculate the deformation gradient derivatives for F_bar.
RankTwoTensor deltaPK1NonLocalFBar(const RankTwoTensor &delta_F_avg) const
Non-local F-bar contribution to deltaPK1 at the current _qp, given the perturbation delta_F_avg of th...
const MaterialProperty< RankFourTensor > & _dpk1_bypass_fbar
Variant of _dpk1 (= pk1_jacobian) computed WITHOUT the F-bar chain factor _d_F_stab_d_F_ust in the si...
registerMooseObject("SolidMechanicsApp", HomogenizedTotalLagrangianStressDivergence)
virtual void computeScalarOffDiagJacobian(const unsigned int jvar_num) override
Method for computing an off-diagonal jacobian component d-_kappa-residual / d-jvar.
const MaterialProperty< RankTwoTensor > & _F
The actual (stabilized) deformation gradient.
virtual RankTwoTensor gradTest(unsigned int component) override
Interface for objects that use the homogenization constraint.
virtual Real computeQpOffDiagJacobianScalar(const unsigned int svar_num) override
Method for computing d-_var-residual / d-svar at quadrature points.
virtual void computeOffDiagJacobianScalarLocal(const unsigned int svar_num) override
Method for computing an off-diagonal jacobian component d-_var-residual / d-svar. ...
static InputParameters validParams()
const MaterialProperty< RankFourTensor > & _d_F_d_grad_u
Derivative of F_{n+1} w.r.t. the displacement gradient.
const MaterialProperty< RankFourTensor > & _d_F_stab_d_F_ust
Partials of the F-bar-stabilized deformation gradient.
virtual Real computeScalarQpOffDiagJacobian(const unsigned int jvar_num) override
Method for computing an off-diagonal jacobian component at quadrature points.
Total Lagrangian formulation with all homogenization terms (one disp_xyz field and macro_gradient sca...
const MaterialProperty< RankFourTensor > & _dpk1
The derivative of the PK1 stress with respect to the deformation gradient (F that the stress material...
const MaterialProperty< RankFourTensor > & _d_F_stab_d_F_avg
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
unsigned int _m
Indices for off-diagonal Jacobian components.
Enforce equilibrium with a total Lagrangian formulation.
Homogenization::ConstraintType _ctype
Type of current homogenization constraint.
const bool _use_off_diagonal
Whether to use the off diagonal term.
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
HomogenizedTotalLagrangianStressDivergence(const InputParameters ¶meters)
virtual void computeScalarResidual() override
Method for computing the scalar part of residual for _kappa.
virtual void computeScalarJacobian() override
Method for computing the scalar variable part of Jacobian for d-_kappa-residual / d-_kappa...
virtual RankTwoTensor gradTrial(unsigned int component) override
virtual std::set< std::string > additionalROVariables() override
Inform moose that this kernel covers the constraint scalar variable.
bool _large_kinematics
If true use large deformation kinematics.
virtual void precalculateJacobianDisplacement(unsigned int component) override
Prepare the average shape function gradients for stabilization.
static const std::string k
const Homogenization::ConstraintMap & cmap() const
Get the constraint map.