https://mooseframework.inl.gov
NEML2SmallStrain.C
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 #ifdef NEML2_ENABLED
11 
12 // NEML2 includes
13 #include "neml2/tensors/functions/stack.h"
14 
15 // MOOSE includes
16 #include "NEML2SmallStrain.h"
17 
18 registerMooseObject("SolidMechanicsApp", NEML2SmallStrain);
19 
22 {
24  params.addClassDescription(
25  "This user object calculates the small strain from displacement gradients. "
26  "It requires 1 to 3 displacement variables, which are used to compute the strain tensor.");
27  params.addRequiredParam<std::vector<NonlinearVariableName>>(
28  "displacements", "The displacements to use to calculate the strain.");
29  return params;
30 }
31 
33 {
34  auto disp_vars = getParam<std::vector<NonlinearVariableName>>("displacements");
35  if (disp_vars.size() < 1 || disp_vars.size() > 3)
36  mooseError("NEML2SmallStrain requires 1 to 3 displacement variables, got ", disp_vars.size());
37 
38  _grad_disp_x = &_fe.getGradient(disp_vars[0]);
39  _grad_disp_y = disp_vars.size() >= 2 ? &_fe.getGradient(disp_vars[1]) : nullptr;
40  _grad_disp_z = disp_vars.size() >= 3 ? &_fe.getGradient(disp_vars[2]) : nullptr;
41 }
42 
43 void
45 {
46  // gradient of displacements
47  const auto & dux = *_grad_disp_x;
48  auto duy = _grad_disp_y ? *_grad_disp_y : neml2::Tensor::zeros_like(dux);
49  auto duz = _grad_disp_z ? *_grad_disp_z : neml2::Tensor::zeros_like(dux);
50  auto du = neml2::R2(neml2::base_stack({dux, duy, duz}, -2));
51 
52  // strain = 0.5 * (grad_u + grad_u^T), neml2::SR2 handles the symmetrization
53  _output = neml2::SR2(du);
54 }
55 
56 #endif
const neml2::Tensor & getGradient(const std::string &var_name)
const neml2::Tensor * _grad_disp_x
Displacement gradients.
static InputParameters validParams()
const neml2::Tensor * _grad_disp_z
const neml2::Tensor * _grad_disp_y
void addRequiredParam(const std::string &name, const std::string &doc_string)
registerMooseObject("SolidMechanicsApp", NEML2SmallStrain)
NEML2FEInterpolation & _fe
NEML2SmallStrain(const InputParameters &parameters)
neml2::Tensor _output
static InputParameters validParams()
void mooseError(Args &&... args) const
void addClassDescription(const std::string &doc_string)
void forward() override
Calculate small strain from displacement gradients.