https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
19
22{
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
43void
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
registerMooseObject("SolidMechanicsApp", NEML2SmallStrain)
void addRequiredParam(const std::string &name, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
void mooseError(Args &&... args) const
const neml2::Tensor & getGradient(const std::string &var_name)
NEML2FEInterpolation & _fe
neml2::Tensor _output
static InputParameters validParams()
const neml2::Tensor * _grad_disp_z
static InputParameters validParams()
void forward() override
Calculate small strain from displacement gradients.
const neml2::Tensor * _grad_disp_x
Displacement gradients.
const neml2::Tensor * _grad_disp_y
NEML2SmallStrain(const InputParameters &parameters)