idaholab/moose: solid_mechanics coverage diff

Base 9fbd27 Head #33416 b10b36
Total Total +/- New
Rate 85.38% 85.63% +0.25% 100.00%
Hits 28951 29259 +308 269
Misses 4957 4911 -46 0
Filename Stmts Miss Cover
modules/solid_mechanics/include/materials/ADComputePlaneFiniteStrain.h 0 -2 +100.00%
modules/solid_mechanics/include/materials/ADComputePlaneIncrementalStrain.h 0 -2 +100.00%
modules/solid_mechanics/include/materials/ADComputePlaneSmallStrain.h 0 -2 +100.00%
modules/solid_mechanics/src/actions/GeneralizedPlaneStrainAction.C +78 +15 -7.03%
modules/solid_mechanics/src/kernels/ADGeneralizedPlaneStrain.C +49 +5 +89.80%
modules/solid_mechanics/src/materials/ADCompute1DFiniteStrain.C 0 -22 +95.65%
modules/solid_mechanics/src/materials/ADCompute1DIncrementalStrain.C 0 -17 +94.44%
modules/solid_mechanics/src/materials/ADCompute1DSmallStrain.C 0 -16 +94.12%
modules/solid_mechanics/src/materials/ADComputeAxisymmetric1DFiniteStrain.C +49 +6 +87.76%
modules/solid_mechanics/src/materials/ADComputeAxisymmetric1DIncrementalStrain.C +49 +6 +87.76%
modules/solid_mechanics/src/materials/ADComputeAxisymmetric1DSmallStrain.C +38 +5 +86.84%
modules/solid_mechanics/src/materials/ADComputePlaneFiniteStrain.C 0 -8 +23.53%
modules/solid_mechanics/src/materials/ADComputePlaneIncrementalStrain.C 0 -8 +23.53%
modules/solid_mechanics/src/materials/ADComputePlaneSmallStrain.C 0 -5 +18.52%
modules/solid_mechanics/src/physics/QuasiStaticSolidMechanicsPhysics.C -1 -1 +0.15%
TOTAL +262 -46 +0.25%
code
coverage unchanged
code
coverage increased
code
coverage decreased
+
line added or modified

modules/solid_mechanics/include/materials/ADComputePlaneFiniteStrain.h

28  
29  
30  
31  
32  
33  
34  
35  
36  
  virtual Real computeOutOfPlaneGradDispOld() override;

  /// gets its subblock index for current element
  unsigned int getCurrentSubblockIndex() const
  {
    return _subblock_id_provider ? _subblock_id_provider->getSubblockIndex(*_current_elem) : 0;
  };

  /// A Userobject that carries the subblock ID for all elements

modules/solid_mechanics/include/materials/ADComputePlaneIncrementalStrain.h

28  
29  
30  
31  
32  
33  
34  
35  
36  
  virtual Real computeOutOfPlaneGradDispOld() override;

  /// gets its subblock index for current element
  unsigned int getCurrentSubblockIndex() const
  {
    return _subblock_id_provider ? _subblock_id_provider->getSubblockIndex(*_current_elem) : 0;
  };

  /// A Userobject that carries the subblock ID for all elements

modules/solid_mechanics/include/materials/ADComputePlaneSmallStrain.h

29  
30  
31  
32  
33  
34  
35  
36  
37  
  virtual ADReal computeOutOfPlaneStrain();

  /// gets its subblock index for current element
  unsigned int getCurrentSubblockIndex() const
  {
    return _subblock_id_provider ? _subblock_id_provider->getSubblockIndex(*_current_elem) : 0;
  };

  /// A Userobject that carries the subblock ID for all elements

modules/solid_mechanics/src/actions/GeneralizedPlaneStrainAction.C

71  
72  
73  
74 +
75 +
76  
77  
78  
  params.addParam<std::vector<TagName>>("absolute_value_vector_tags",
                                        "The tag names for extra vectors that the absolute value "
                                        "of the residual should be accumulated into");
  params.addParam<bool>("use_automatic_differentiation",
                        false,
                        "Use automatic differentiation to assemble the generalized plane strain "
                        "equation and its coupling terms");

83  
84  
85  
86 +
87 +
88  
89 +
90  
91  
92 +
93  
94 +
95 +
96 +
97  
98 +
99  
100  
101  
  : Action(params),
    _displacements(getParam<std::vector<VariableName>>("displacements")),
    _ndisp(_displacements.size()),
    _out_of_plane_direction(getParam<MooseEnum>("out_of_plane_direction")),
    _use_ad(getParam<bool>("use_automatic_differentiation"))
{
}

unsigned int
GeneralizedPlaneStrainAction::inPlaneDisplacementIndex() const
{
  for (unsigned int i = 0; i < _ndisp; ++i)
    if (i != _out_of_plane_direction)
      return i;

  paramError("displacements", "No in-plane displacement is available to anchor the action");
}

void
104  
105  
106  
107 +
108  
109 +
110  
111  
112 +
113 +
114  
115 +
116 +
117 +
118 +
119  
120  
121 +
122 +
123 +
124  
125 +
126 +
127 +
128 +
129  
130  
131  
132 +
133  
134 +
135 +
136  
137  
138  
139 +
140  
141 +
142 +
143 +
144  
145  
146  
147  
148  
149 +
150  
151  
152  
153  
154 +
155 +
156 +
157 +
158 +
159 +
160  
161 +
162 +
163 +
164  
165 +
166 +
167  
168  
169 +
170 +
171 +
172 +
173 +
174 +
175  
176  
177  
178 +
179  
180 +
181 +
182  
183  
184  
185  
186 +
187 +
188 +
189 +
190 +
191 +
192  
193  
194  
195  
196 +
197  
198 +
199 +
200  
201 +
202  
203  
204  
205  
206  
207 +
208 +
209  
210 +
211 +
212 +
213 +
214 +
215 +
216 +
217 +
218 +
219 +
220  
221 +
222 +
223 +
224 +
225 +
226  
227  
228  
229  
230 +
231  
232  
233  
  // user object name
  const std::string uo_name = _name + "_GeneralizedPlaneStrainUserObject";

  if (_current_task == "add_variables_physics")
  {
    if (_use_ad)
    {
      std::set<SubdomainID> block_ids;
      if (isParamValid("block"))
        for (const auto & block : getParam<std::vector<SubdomainName>>("block"))
        {
          const auto id = _mesh->getSubdomainID(block);
          if (id == Moose::INVALID_BLOCK_ID)
            paramError("block", "Subdomain '", block, "' was not found in the mesh");
          block_ids.insert(id);
        }

      const auto & subdomains = block_ids.empty() ? _problem->mesh().meshSubdomains() : block_ids;
      if (subdomains.empty())
        mooseError("No subdomains found for the generalized plane strain action");

      const auto coord_system = _problem->getCoordSystem(*subdomains.begin());
      for (const auto subdomain : subdomains)
        if (_problem->getCoordSystem(subdomain) != coord_system)
          paramError("block",
                     "Generalized plane strain requires all selected subdomains to use the same "
                     "coordinate system");

      if (coord_system == Moose::COORD_RZ)
      {
        if (_ndisp != 1)
          paramError("displacements",
                     "One radial displacement is required for 1D axisymmetric generalized plane "
                     "strain");
      }
      else if (coord_system == Moose::COORD_XYZ)
      {
        const unsigned int required_displacements = _out_of_plane_direction == 2 ? 2 : 3;
        if (_ndisp != required_displacements)
          paramError("displacements",
                     required_displacements,
                     " displacement variables are required when the out-of-plane direction is ",
                     getParam<MooseEnum>("out_of_plane_direction"));
      }
      else
        paramError("out_of_plane_direction",
                   "Generalized plane strain supports only Cartesian and axisymmetric coordinate "
                   "systems");
    }

    const auto anchor_displacement = inPlaneDisplacementIndex();
    const auto & anchor_variable = _problem->getVariable(
        0, _displacements[anchor_displacement], Moose::VarKindType::VAR_SOLVER);
    const auto solver_sys_num = anchor_variable.sys().number();
    if (!_problem->isSolverSystemNonlinear(solver_sys_num))
      paramError("displacements", "The in-plane displacements must be nonlinear variables");

    for (unsigned int i = 0; i < _ndisp; ++i)
      if (i != _out_of_plane_direction &&
          _problem->getVariable(0, _displacements[i], Moose::VarKindType::VAR_SOLVER)
                  .sys()
                  .number() != solver_sys_num)
        paramError("displacements",
                   "All in-plane displacements must belong to the same nonlinear system");

    auto & nonlinear_system = _problem->getNonlinearSystemBase(solver_sys_num);
    const auto & scalar_variable = getParam<VariableName>("scalar_out_of_plane_strain");
    if (nonlinear_system.hasScalarVariable(scalar_variable))
      return;
    if (_problem->hasScalarVariable(scalar_variable))
      paramError("scalar_out_of_plane_strain",
                 "Variable '",
                 scalar_variable,
                 "' already exists but is not a nonlinear scalar variable in system '",
                 nonlinear_system.name(),
                 "'");
    if (_problem->hasVariable(scalar_variable))
      paramError("scalar_out_of_plane_strain",
                 "Variable '",
                 scalar_variable,
                 "' already exists as a field variable; a scalar variable is required");

    InputParameters params = _factory.getValidParams("MooseVariableScalar");
    params.set<MooseEnum>("family") = "SCALAR";
    params.set<MooseEnum>("order") = "FIRST";
    params.set<SolverSystemName>("solver_sys") = nonlinear_system.name();
    _problem->addVariable("MooseVariableScalar", scalar_variable, params);
  }

  //
  // Add off diagonal Jacobian kernels
  //
  else if (_current_task == "add_kernel" && _use_ad)
  {
    const std::string k_type = "ADGeneralizedPlaneStrain";
    InputParameters params = _factory.getValidParams(k_type);

    params.applyParameters(parameters(),
                           {"scalar_out_of_plane_strain",
                            "out_of_plane_pressure",
                            "out_of_plane_pressure_function",
                            "factor",
                            "pressure_factor"});
    params.set<std::vector<VariableName>>("scalar_out_of_plane_strain") = {
        getParam<VariableName>("scalar_out_of_plane_strain")};

    if (parameters().isParamSetByUser("out_of_plane_pressure"))
      params.set<FunctionName>("out_of_plane_pressure") =
          getParam<FunctionName>("out_of_plane_pressure");
    if (parameters().isParamSetByUser("out_of_plane_pressure_function"))
      params.set<FunctionName>("out_of_plane_pressure_function") =
          getParam<FunctionName>("out_of_plane_pressure_function");
    if (parameters().isParamSetByUser("factor"))
      params.set<Real>("factor") = getParam<Real>("factor");
    if (parameters().isParamSetByUser("pressure_factor"))
      params.set<Real>("pressure_factor") = getParam<Real>("pressure_factor");

    const auto anchor_displacement = inPlaneDisplacementIndex();
    params.set<NonlinearVariableName>("variable") = _displacements[anchor_displacement];
    _problem->addKernel(k_type, _name + "_ADGeneralizedPlaneStrain", params);
  }
  else if (_use_ad && (_current_task == "add_user_object" || _current_task == "add_scalar_kernel"))
  {
    // ADKernelScalarBase assembles both the elemental resultant and the scalar equation, so the
    // legacy UserObject and ScalarKernel are intentionally unnecessary in AD mode.
  }
  else if (_current_task == "add_kernel")
  {
    std::string k_type = "GeneralizedPlaneStrainOffDiag";
    InputParameters params = _factory.getValidParams(k_type);

modules/solid_mechanics/src/kernels/ADGeneralizedPlaneStrain.C

14  
15  
16  
17 +
18  
19 +
20 +
21  
22 +
23  
24  
25 +
26 +
27  
28  
29 +
30  
31  
32  
33 +
34  
35  
36  
37 +
38 +
39  
40 +
41  
42  
43  
44 +
45  
46  
47 +
48 +
49 +
50  
51 +
52 +
53  
54 +
55  
56 +
57 +
58 +
59 +
60 +
61 +
62  
63 +
64 +
65 +
66 +
67  
68 +
69  
70 +
71 +
72 +
73  
74  
75 +
76 +
77 +
78  
79  
80 +
81  
82 +
83 +
84 +
85 +
86  
87  
88 +
89  
90  
91 +
92  
93 +
94  
95  
96  
97 +
98  
99  
100 +
101 +
102 +
103 +
104  
105 +
106  
107  
registerMooseObject("SolidMechanicsApp", ADGeneralizedPlaneStrain);

InputParameters
ADGeneralizedPlaneStrain::validParams()
{
  InputParameters params = ADKernelScalarBase::validParams();
  params.addClassDescription(
      "Assembles the generalized plane strain scalar equation using automatic differentiation.");
  params.renameCoupledVar("scalar_variable",
                          "scalar_out_of_plane_strain",
                          "Scalar variable for generalized plane strain");
  params.makeParamRequired<std::vector<VariableName>>("scalar_out_of_plane_strain");
  params.addParam<FunctionName>("out_of_plane_pressure_function",
                                "Function used to prescribe pressure (applied toward the body) in "
                                "the out-of-plane direction");
  params.addDeprecatedParam<FunctionName>(
      "out_of_plane_pressure",
      "Function used to prescribe pressure (applied toward the body) in the out-of-plane direction",
      "This has been replaced by 'out_of_plane_pressure_function'");
  params.addParam<MaterialPropertyName>("out_of_plane_pressure_material",
                                        "0",
                                        "Material used to prescribe pressure (applied toward the "
                                        "body) in the out-of-plane direction");
  MooseEnum out_of_plane_direction("x y z", "z");
  params.addParam<MooseEnum>(
      "out_of_plane_direction", out_of_plane_direction, "The direction of the out-of-plane strain");
  params.addDeprecatedParam<Real>(
      "factor",
      "Scale factor applied to prescribed out-of-plane pressure (both material and function)",
      "This has been replaced by 'pressure_factor'");
  params.addParam<Real>(
      "pressure_factor",
      "Scale factor applied to prescribed out-of-plane pressure (both material and function)");
  params.addParam<std::string>("base_name", "Material property base name");
  params.set<bool>("compute_field_residuals") = false;
  params.suppressParameter<bool>("compute_field_residuals");

  return params;
}

ADGeneralizedPlaneStrain::ADGeneralizedPlaneStrain(const InputParameters & parameters)
  : ADKernelScalarBase(parameters),
    _base_name(isParamValid("base_name") ? getParam<std::string>("base_name") + "_" : ""),
    _stress(getADMaterialProperty<RankTwoTensor>(_base_name + "stress")),
    _out_of_plane_pressure_function(parameters.isParamSetByUser("out_of_plane_pressure_function")
                                        ? &getFunction("out_of_plane_pressure_function")
                                    : parameters.isParamSetByUser("out_of_plane_pressure")
                                        ? &getFunction("out_of_plane_pressure")
                                        : nullptr),
    _out_of_plane_pressure_material(getMaterialProperty<Real>("out_of_plane_pressure_material")),
    _pressure_factor(parameters.isParamSetByUser("pressure_factor")
                         ? getParam<Real>("pressure_factor")
                     : parameters.isParamSetByUser("factor") ? getParam<Real>("factor")
                                                             : 1.0),
    _out_of_plane_direction(getParam<MooseEnum>("out_of_plane_direction"))
{
  if (parameters.isParamSetByUser("out_of_plane_pressure_function") &&
      parameters.isParamSetByUser("out_of_plane_pressure"))
    paramError("out_of_plane_pressure_function",
               "Cannot specify both 'out_of_plane_pressure_function' and "
               "'out_of_plane_pressure'");
  if (parameters.isParamSetByUser("pressure_factor") && parameters.isParamSetByUser("factor"))
    paramError("pressure_factor", "Cannot specify both 'pressure_factor' and 'factor'");
}

void
ADGeneralizedPlaneStrain::initialSetup()
{
  if (getBlockCoordSystem() == Moose::COORD_RZ)
    _out_of_plane_direction = 1;
  else if (getBlockCoordSystem() != Moose::COORD_XYZ)
    paramError("out_of_plane_direction",
               "Generalized plane strain supports only Cartesian and axisymmetric coordinate "
               "systems");
}

ADReal
ADGeneralizedPlaneStrain::computeQpResidual()
{
  return 0;
}

ADReal
ADGeneralizedPlaneStrain::computeScalarQpResidual()
{
  const Real out_of_plane_pressure =
      ((_out_of_plane_pressure_function ? _out_of_plane_pressure_function->value(_t, _q_point[_qp])
                                        : 0.0) +
       _out_of_plane_pressure_material[_qp]) *
      _pressure_factor;

  return _stress[_qp](_out_of_plane_direction, _out_of_plane_direction) + out_of_plane_pressure;
}

modules/solid_mechanics/src/materials/ADCompute1DFiniteStrain.C

12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
40  
41  
42  
43  
44  
45  
46  
47  
48  
49  
50  
51  
52  
53  
54  
55  
56  
57  
58  
59  
#include "libmesh/quadrature.h"

InputParameters
ADCompute1DFiniteStrain::validParams()
{
  InputParameters params = ADComputeFiniteStrain::validParams();
  params.addClassDescription("Compute strain increment for finite strain in 1D problem");
  return params;
}

ADCompute1DFiniteStrain::ADCompute1DFiniteStrain(const InputParameters & parameters)
  : ADComputeFiniteStrain(parameters)
{
}

void
ADCompute1DFiniteStrain::computeProperties()
{
  for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
  {
    // Deformation gradient
    auto A = ADRankTwoTensor::initializeFromRows(
        (*_grad_disp[0])[_qp], (*_grad_disp[1])[_qp], (*_grad_disp[2])[_qp]);

    // Old Deformation gradient
    auto Fbar = RankTwoTensor ::initializeFromRows(
        (*_grad_disp_old[0])[_qp], (*_grad_disp_old[1])[_qp], (*_grad_disp_old[2])[_qp]);

    // Compute the displacement gradient dUy/dy and dUz/dz value for 1D problems
    A(1, 1) = computeGradDispYY();
    A(2, 2) = computeGradDispZZ();

    Fbar(1, 1) = computeGradDispYYOld();
    Fbar(2, 2) = computeGradDispZZOld();

    A -= Fbar; // very nearly A = gradU - gradUold, adapted to cylindrical coords

    Fbar.addIa(1.0); // Fbar = ( I + gradUold)

    // Incremental deformation gradient _Fhat = I + A Fbar^-1
    _Fhat[_qp] = A * Fbar.inverse();
    _Fhat[_qp].addIa(1.0);
  }

  for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
    computeQpStrain();
}

modules/solid_mechanics/src/materials/ADCompute1DIncrementalStrain.C

12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
40  
41  
42  
43  
44  
45  
46  
47  
48  
49  
#include "libmesh/quadrature.h"

InputParameters
ADCompute1DIncrementalStrain::validParams()
{
  InputParameters params = ADComputeIncrementalStrain::validParams();
  params.addClassDescription("Compute strain increment for small strains in 1D problems.");
  return params;
}

ADCompute1DIncrementalStrain::ADCompute1DIncrementalStrain(const InputParameters & parameters)
  : ADComputeIncrementalStrain(parameters)
{
}

void
ADCompute1DIncrementalStrain::computeTotalStrainIncrement(ADRankTwoTensor & total_strain_increment)
{
  // Deformation gradient calculation for 1D problems
  auto A = ADRankTwoTensor::initializeFromRows(
      (*_grad_disp[0])[_qp], (*_grad_disp[1])[_qp], (*_grad_disp[2])[_qp]);

  // Old Deformation gradient
  auto Fbar = RankTwoTensor ::initializeFromRows(
      (*_grad_disp_old[0])[_qp], (*_grad_disp_old[1])[_qp], (*_grad_disp_old[2])[_qp]);

  // Compute the displacement gradient dUy/dy and dUz/dz value for 1D problems
  A(1, 1) = computeGradDispYY();
  A(2, 2) = computeGradDispZZ();

  Fbar(1, 1) = computeGradDispYYOld();
  Fbar(2, 2) = computeGradDispZZOld();

  A -= Fbar; // very nearly A = gradU - gradUold, adapted to cylindrical coords

  total_strain_increment = 0.5 * (A + A.transpose());
}

modules/solid_mechanics/src/materials/ADCompute1DSmallStrain.C

12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
40  
41  
42  
43  
#include "libmesh/quadrature.h"

InputParameters
ADCompute1DSmallStrain::validParams()
{
  InputParameters params = ADComputeSmallStrain::validParams();
  params.addClassDescription("Compute a small strain in 1D problem");
  return params;
}

ADCompute1DSmallStrain::ADCompute1DSmallStrain(const InputParameters & parameters)
  : ADComputeSmallStrain(parameters)
{
}

void
ADCompute1DSmallStrain::computeProperties()
{
  for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
  {
    _total_strain[_qp](0, 0) = (*_grad_disp[0])[_qp](0);
    _total_strain[_qp](1, 1) = computeStrainYY();
    _total_strain[_qp](2, 2) = computeStrainZZ();

    _mechanical_strain[_qp] = _total_strain[_qp];

    // Remove the eigenstrain
    for (const auto es : _eigenstrains)
      _mechanical_strain[_qp] -= (*es)[_qp];
  }
}

modules/solid_mechanics/src/materials/ADComputeAxisymmetric1DFiniteStrain.C

13  
14  
15  
16 +
17  
18 +
19 +
20  
21 +
22  
23 +
24 +
25  
26 +
27 +
28  
29 +
30 +
31  
32 +
33 +
34 +
35  
36 +
37 +
38  
39 +
40  
41 +
42  
43 +
44 +
45  
46 +
47  
48 +
49 +
50 +
51 +
52  
53 +
54 +
55  
56  
57 +
58  
59  
60 +
61  
62 +
63  
64 +
65 +
66 +
67  
68  
69 +
70  
71 +
72  
73  
74  
75 +
76  
77  
78 +
79 +
80  
81 +
82  
83  
84  
85 +
86  
87  
88 +
89 +
90  
91 +
92  
93  
94  
95 +
96  
97 +
98 +
99  
100 +
101  
102  
103  
104 +
105  
106 +
107 +
108  
109  
110  
registerMooseObject("SolidMechanicsApp", ADComputeAxisymmetric1DFiniteStrain);

InputParameters
ADComputeAxisymmetric1DFiniteStrain::validParams()
{
  InputParameters params = ADCompute1DFiniteStrain::validParams();
  params.addClassDescription("Compute a strain increment and rotation increment for finite strains "
                             "in an axisymmetric 1D problem");
  params.addParam<UserObjectName>("subblock_index_provider",
                                  "SubblockIndexProvider user object name");
  params.addCoupledVar("scalar_out_of_plane_strain", "Scalar variable for axisymmetric 1D problem");
  params.addCoupledVar("out_of_plane_strain", "Nonlinear variable for axisymmetric 1D problem");

  return params;
}

ADComputeAxisymmetric1DFiniteStrain::ADComputeAxisymmetric1DFiniteStrain(
    const InputParameters & parameters)
  : ADCompute1DFiniteStrain(parameters),
    _disp_old_0(coupledValueOld("displacements", 0)),
    _subblock_id_provider(isParamValid("subblock_index_provider")
                              ? &getUserObject<SubblockIndexProvider>("subblock_index_provider")
                              : nullptr),
    _has_out_of_plane_strain(isCoupled("out_of_plane_strain")),
    _out_of_plane_strain(_has_out_of_plane_strain ? adCoupledValue("out_of_plane_strain")
                                                  : _ad_zero),
    _out_of_plane_strain_old(_has_out_of_plane_strain ? coupledValueOld("out_of_plane_strain")
                                                      : _zero),
    _has_scalar_out_of_plane_strain(isCoupledScalar("scalar_out_of_plane_strain"))
{
  if (_has_out_of_plane_strain && _has_scalar_out_of_plane_strain)
    mooseError("Must define only one of out_of_plane_strain or scalar_out_of_plane_strain");

  if (_has_scalar_out_of_plane_strain)
  {
    const auto nscalar_strains = coupledScalarComponents("scalar_out_of_plane_strain");
    _scalar_out_of_plane_strain.resize(nscalar_strains);
    _scalar_out_of_plane_strain_old.resize(nscalar_strains);
    for (unsigned int i = 0; i < nscalar_strains; ++i)
    {
      _scalar_out_of_plane_strain[i] = &adCoupledScalarValue("scalar_out_of_plane_strain", i);
      _scalar_out_of_plane_strain_old[i] = &coupledScalarValueOld("scalar_out_of_plane_strain", i);
    }
  }
}

void
ADComputeAxisymmetric1DFiniteStrain::initialSetup()
{
  ADComputeIncrementalStrainBase::initialSetup();

  if (getBlockCoordSystem() != Moose::COORD_RZ)
    mooseError("The coordinate system must be set to RZ for Axisymmetric geometries.");
}

unsigned int
ADComputeAxisymmetric1DFiniteStrain::getCurrentSubblockIndex() const
{
  return _subblock_id_provider ? _subblock_id_provider->getSubblockIndex(*_current_elem) : 0;
}

ADReal
ADComputeAxisymmetric1DFiniteStrain::computeGradDispYY()
{
  using std::exp;
  if (_has_scalar_out_of_plane_strain)
    return exp((*_scalar_out_of_plane_strain[getCurrentSubblockIndex()])[0]) - 1.0;
  else
    return exp(_out_of_plane_strain[_qp]) - 1.0;
}

Real
ADComputeAxisymmetric1DFiniteStrain::computeGradDispYYOld()
{
  using std::exp;
  if (_has_scalar_out_of_plane_strain)
    return exp((*_scalar_out_of_plane_strain_old[getCurrentSubblockIndex()])[0]) - 1.0;
  else
    return exp(_out_of_plane_strain_old[_qp]) - 1.0;
}

ADReal
ADComputeAxisymmetric1DFiniteStrain::computeGradDispZZ()
{
  if (!MooseUtils::absoluteFuzzyEqual(_q_point[_qp](0), 0.0))
    return (*_disp[0])[_qp] / _q_point[_qp](0);
  else
    return 0.0;
}

Real
ADComputeAxisymmetric1DFiniteStrain::computeGradDispZZOld()
{
  if (!MooseUtils::absoluteFuzzyEqual(_q_point[_qp](0), 0.0))
    return _disp_old_0[_qp] / _q_point[_qp](0);
  else
    return 0.0;
}

modules/solid_mechanics/src/materials/ADComputeAxisymmetric1DIncrementalStrain.C

13  
14  
15  
16 +
17  
18 +
19 +
20  
21 +
22  
23 +
24 +
25  
26 +
27 +
28  
29 +
30 +
31  
32 +
33 +
34 +
35  
36 +
37 +
38  
39 +
40  
41 +
42  
43 +
44 +
45  
46 +
47  
48 +
49 +
50 +
51 +
52  
53 +
54 +
55  
56  
57 +
58  
59  
60 +
61  
62 +
63  
64 +
65 +
66 +
67  
68  
69 +
70  
71 +
72  
73  
74  
75 +
76  
77 +
78 +
79  
80 +
81  
82  
83  
84 +
85  
86 +
87 +
88  
89 +
90  
91  
92  
93 +
94  
95 +
96 +
97  
98 +
99  
100  
101  
102 +
103  
104 +
105 +
106  
107  
108  
registerMooseObject("SolidMechanicsApp", ADComputeAxisymmetric1DIncrementalStrain);

InputParameters
ADComputeAxisymmetric1DIncrementalStrain::validParams()
{
  InputParameters params = ADCompute1DIncrementalStrain::validParams();
  params.addClassDescription(
      "Compute strain increment for small strains in an axisymmetric 1D problem");
  params.addParam<UserObjectName>("subblock_index_provider",
                                  "SubblockIndexProvider user object name");
  params.addCoupledVar("scalar_out_of_plane_strain", "Scalar variable for axisymmetric 1D problem");
  params.addCoupledVar("out_of_plane_strain", "Nonlinear variable for axisymmetric 1D problem");

  return params;
}

ADComputeAxisymmetric1DIncrementalStrain::ADComputeAxisymmetric1DIncrementalStrain(
    const InputParameters & parameters)
  : ADCompute1DIncrementalStrain(parameters),
    _disp_old_0(coupledValueOld("displacements", 0)),
    _subblock_id_provider(isParamValid("subblock_index_provider")
                              ? &getUserObject<SubblockIndexProvider>("subblock_index_provider")
                              : nullptr),
    _has_out_of_plane_strain(isCoupled("out_of_plane_strain")),
    _out_of_plane_strain(_has_out_of_plane_strain ? adCoupledValue("out_of_plane_strain")
                                                  : _ad_zero),
    _out_of_plane_strain_old(_has_out_of_plane_strain ? coupledValueOld("out_of_plane_strain")
                                                      : _zero),
    _has_scalar_out_of_plane_strain(isCoupledScalar("scalar_out_of_plane_strain"))
{
  if (_has_out_of_plane_strain && _has_scalar_out_of_plane_strain)
    mooseError("Must define only one of out_of_plane_strain or scalar_out_of_plane_strain");

  if (_has_scalar_out_of_plane_strain)
  {
    const auto nscalar_strains = coupledScalarComponents("scalar_out_of_plane_strain");
    _scalar_out_of_plane_strain.resize(nscalar_strains);
    _scalar_out_of_plane_strain_old.resize(nscalar_strains);
    for (unsigned int i = 0; i < nscalar_strains; ++i)
    {
      _scalar_out_of_plane_strain[i] = &adCoupledScalarValue("scalar_out_of_plane_strain", i);
      _scalar_out_of_plane_strain_old[i] = &coupledScalarValueOld("scalar_out_of_plane_strain", i);
    }
  }
}

void
ADComputeAxisymmetric1DIncrementalStrain::initialSetup()
{
  ADComputeIncrementalStrainBase::initialSetup();

  if (getBlockCoordSystem() != Moose::COORD_RZ)
    mooseError("The coordinate system must be set to RZ for Axisymmetric 1D simulations");
}

unsigned int
ADComputeAxisymmetric1DIncrementalStrain::getCurrentSubblockIndex() const
{
  return _subblock_id_provider ? _subblock_id_provider->getSubblockIndex(*_current_elem) : 0;
}

ADReal
ADComputeAxisymmetric1DIncrementalStrain::computeGradDispYY()
{
  if (_has_scalar_out_of_plane_strain)
    return (*_scalar_out_of_plane_strain[getCurrentSubblockIndex()])[0];
  else
    return _out_of_plane_strain[_qp];
}

Real
ADComputeAxisymmetric1DIncrementalStrain::computeGradDispYYOld()
{
  if (_has_scalar_out_of_plane_strain)
    return (*_scalar_out_of_plane_strain_old[getCurrentSubblockIndex()])[0];
  else
    return _out_of_plane_strain_old[_qp];
}

ADReal
ADComputeAxisymmetric1DIncrementalStrain::computeGradDispZZ()
{
  if (!MooseUtils::absoluteFuzzyEqual(_q_point[_qp](0), 0.0))
    return (*_disp[0])[_qp] / _q_point[_qp](0);
  else
    return 0.0;
}

Real
ADComputeAxisymmetric1DIncrementalStrain::computeGradDispZZOld()
{
  if (!MooseUtils::absoluteFuzzyEqual(_q_point[_qp](0), 0.0))
    return _disp_old_0[_qp] / _q_point[_qp](0);
  else
    return 0.0;
}

modules/solid_mechanics/src/materials/ADComputeAxisymmetric1DSmallStrain.C

13  
14  
15  
16 +
17  
18 +
19 +
20 +
21  
22 +
23 +
24  
25 +
26 +
27  
28 +
29 +
30  
31 +
32 +
33  
34 +
35 +
36  
37 +
38  
39 +
40 +
41  
42 +
43  
44 +
45 +
46 +
47 +
48  
49 +
50  
51  
52 +
53  
54 +
55  
56 +
57 +
58 +
59  
60  
61 +
62  
63 +
64  
65  
66  
67 +
68  
69 +
70 +
71  
72 +
73  
74  
75  
76 +
77  
78 +
79 +
80  
81 +
82  
83  
registerMooseObject("SolidMechanicsApp", ADComputeAxisymmetric1DSmallStrain);

InputParameters
ADComputeAxisymmetric1DSmallStrain::validParams()
{
  InputParameters params = ADCompute1DSmallStrain::validParams();
  params.addClassDescription("Compute a small strain in an Axisymmetric 1D problem");
  params.addParam<UserObjectName>("subblock_index_provider",
                                  "SubblockIndexProvider user object name");
  params.addCoupledVar("scalar_out_of_plane_strain", "Scalar variable for axisymmetric 1D problem");
  params.addCoupledVar("out_of_plane_strain", "Nonlinear variable for axisymmetric 1D problem");

  return params;
}

ADComputeAxisymmetric1DSmallStrain::ADComputeAxisymmetric1DSmallStrain(
    const InputParameters & parameters)
  : ADCompute1DSmallStrain(parameters),
    _subblock_id_provider(isParamValid("subblock_index_provider")
                              ? &getUserObject<SubblockIndexProvider>("subblock_index_provider")
                              : nullptr),
    _has_out_of_plane_strain(isCoupled("out_of_plane_strain")),
    _out_of_plane_strain(_has_out_of_plane_strain ? adCoupledValue("out_of_plane_strain")
                                                  : _ad_zero),
    _has_scalar_out_of_plane_strain(isCoupledScalar("scalar_out_of_plane_strain"))
{
  if (_has_out_of_plane_strain && _has_scalar_out_of_plane_strain)
    mooseError("Must define only one of out_of_plane_strain or scalar_out_of_plane_strain");

  if (_has_scalar_out_of_plane_strain)
  {
    const auto nscalar_strains = coupledScalarComponents("scalar_out_of_plane_strain");
    _scalar_out_of_plane_strain.resize(nscalar_strains);
    for (unsigned int i = 0; i < nscalar_strains; ++i)
      _scalar_out_of_plane_strain[i] = &adCoupledScalarValue("scalar_out_of_plane_strain", i);
  }
}

void
ADComputeAxisymmetric1DSmallStrain::initialSetup()
{
  ADComputeStrainBase::initialSetup();

  if (getBlockCoordSystem() != Moose::COORD_RZ)
    mooseError("The coordinate system must be set to RZ for Axisymmetric geometries.");
}

unsigned int
ADComputeAxisymmetric1DSmallStrain::getCurrentSubblockIndex() const
{
  return _subblock_id_provider ? _subblock_id_provider->getSubblockIndex(*_current_elem) : 0;
}

ADReal
ADComputeAxisymmetric1DSmallStrain::computeStrainYY()
{
  if (_has_scalar_out_of_plane_strain)
    return (*_scalar_out_of_plane_strain[getCurrentSubblockIndex()])[0];
  else
    return _out_of_plane_strain[_qp];
}

ADReal
ADComputeAxisymmetric1DSmallStrain::computeStrainZZ()
{
  if (!MooseUtils::absoluteFuzzyEqual(_q_point[_qp](0), 0.0))
    return (*_disp[0])[_qp] / _q_point[_qp](0);
  else
    return 0.0;
}

modules/solid_mechanics/src/materials/ADComputePlaneFiniteStrain.C

44  
45  
46  
47  
48  
49  
50  
51  
52  
53  
54  
55  
56  

  if (_scalar_out_of_plane_strain_coupled)
  {
    const auto nscalar_strains = coupledScalarComponents("scalar_out_of_plane_strain");
    _scalar_out_of_plane_strain.resize(nscalar_strains);
    _scalar_out_of_plane_strain_old.resize(nscalar_strains);
    for (unsigned int i = 0; i < nscalar_strains; ++i)
    {
      _scalar_out_of_plane_strain[i] = &adCoupledScalarValue("scalar_out_of_plane_strain", i);
      _scalar_out_of_plane_strain_old[i] = &coupledScalarValueOld("scalar_out_of_plane_strain", i);
    }
  }
}
64  
65  
66  
67  
68  
69  
70  
   * D = log(sqrt(Fhat^T * Fhat)) / dt
   */
  if (_scalar_out_of_plane_strain_coupled)
    return exp((*_scalar_out_of_plane_strain[getCurrentSubblockIndex()])[0]) - 1.0;
  else
    return exp(_out_of_plane_strain[_qp]) - 1.0;
}
74  
75  
76  
77  
78  
79  
80  
{
  using std::exp;
  if (_scalar_out_of_plane_strain_coupled)
    return exp((*_scalar_out_of_plane_strain_old[getCurrentSubblockIndex()])[0]) - 1.0;
  else
    return exp(_out_of_plane_strain_old[_qp]) - 1.0;
}

modules/solid_mechanics/src/materials/ADComputePlaneIncrementalStrain.C

44  
45  
46  
47  
48  
49  
50  
51  
52  
53  
54  
55  
56  

  if (_scalar_out_of_plane_strain_coupled)
  {
    const auto nscalar_strains = coupledScalarComponents("scalar_out_of_plane_strain");
    _scalar_out_of_plane_strain.resize(nscalar_strains);
    _scalar_out_of_plane_strain_old.resize(nscalar_strains);
    for (unsigned int i = 0; i < nscalar_strains; ++i)
    {
      _scalar_out_of_plane_strain[i] = &adCoupledScalarValue("scalar_out_of_plane_strain", i);
      _scalar_out_of_plane_strain_old[i] = &coupledScalarValueOld("scalar_out_of_plane_strain", i);
    }
  }
}
59  
60  
61  
62  
63  
64  
65  
ADComputePlaneIncrementalStrain::computeOutOfPlaneGradDisp()
{
  if (_scalar_out_of_plane_strain_coupled)
    return (*_scalar_out_of_plane_strain[getCurrentSubblockIndex()])[0];
  else
    return _out_of_plane_strain[_qp];
}
68  
69  
70  
71  
72  
73  
74  
ADComputePlaneIncrementalStrain::computeOutOfPlaneGradDispOld()
{
  if (_scalar_out_of_plane_strain_coupled)
    return (*_scalar_out_of_plane_strain_old[getCurrentSubblockIndex()])[0];
  else
    return _out_of_plane_strain_old[_qp];
}

modules/solid_mechanics/src/materials/ADComputePlaneSmallStrain.C

42  
43  
44  
45  
46  
47  
48  
49  
50  
51  

  if (_scalar_out_of_plane_strain_coupled)
  {
    const auto nscalar_strains = coupledScalarComponents("scalar_out_of_plane_strain");
    _scalar_out_of_plane_strain.resize(nscalar_strains);
    for (unsigned int i = 0; i < nscalar_strains; ++i)
      _scalar_out_of_plane_strain[i] = &adCoupledScalarValue("scalar_out_of_plane_strain", i);
  }
}

53  
54  
55  
56  
57  
58  
59  
ADComputePlaneSmallStrain::computeOutOfPlaneStrain()
{
  if (_scalar_out_of_plane_strain_coupled)
    return (*_scalar_out_of_plane_strain[getCurrentSubblockIndex()])[0];
  else
    return _out_of_plane_strain[_qp];
}

modules/solid_mechanics/src/physics/QuasiStaticSolidMechanicsPhysics.C

362  
363  
364  
365 +
366  
367  
368  
                                     "factor",
                                     "pressure_factor"});
      action_params.set<bool>("use_displaced_mesh") = _use_displaced_mesh;
      action_params.set<bool>("use_automatic_differentiation") = _use_ad;

      if (parameters().isParamSetByUser("out_of_plane_pressure"))
        action_params.set<FunctionName>("out_of_plane_pressure") =
1021  
1022  
1023  
1024 +
1025 +
1026  
1027  
1028  
           _planar_formulation == PlanarFormulation::PlaneStrain ||
           _planar_formulation == PlanarFormulation::GeneralizedPlaneStrain)
  {
    if (_use_ad && _planar_formulation == PlanarFormulation::PlaneStrain)
      paramError("use_automatic_differentiation", "AD not setup for use with PlaneStrain");

    std::map<std::pair<Moose::CoordinateSystemType, StrainAndIncrement>, std::string> type_map = {
        {{Moose::COORD_XYZ, StrainAndIncrement::SmallTotal}, "ComputePlaneSmallStrain"},