https://mooseframework.inl.gov
Loading...
Searching...
No Matches
TorchSmallStrain.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// MOOSE includes
13#include "TorchSmallStrain.h"
14#include "TorchFEMUtils.h"
15
17
20{
23 "This user object calculates the small strain from displacement gradients. "
24 "It requires 1 to 3 displacement variables, which are used to compute the strain tensor.");
25 params.addRequiredParam<std::vector<NonlinearVariableName>>(
26 "displacements", "The displacements to use to calculate the strain.");
27 return params;
28}
29
31{
32 auto disp_vars = getParam<std::vector<NonlinearVariableName>>("displacements");
33 if (disp_vars.size() < 1 || disp_vars.size() > 3)
34 mooseError("TorchSmallStrain requires 1 to 3 displacement variables, got ", disp_vars.size());
35
36 _grad_disp_x = &_fe.getGradient(disp_vars[0]);
37 _grad_disp_y = disp_vars.size() >= 2 ? &_fe.getGradient(disp_vars[1]) : nullptr;
38 _grad_disp_z = disp_vars.size() >= 3 ? &_fe.getGradient(disp_vars[2]) : nullptr;
39}
40
41void
43{
44 // gradient of displacements, each (nelem, nqp, 3)
45 const auto & dux = *_grad_disp_x;
46 auto duy = _grad_disp_y ? *_grad_disp_y : at::zeros_like(dux);
47 auto duz = _grad_disp_z ? *_grad_disp_z : at::zeros_like(dux);
48
49 // displacement gradient du[..., i, j] = d u_i / d x_j, shape (nelem, nqp, 3, 3)
50 auto du = at::stack({dux, duy, duz}, -2);
51
52 // strain = 0.5 * (grad_u + grad_u^T), stored in 6-component Mandel form
53 _output = TorchFEM::fullToMandel(0.5 * (du + du.transpose(-2, -1)));
54}
55
56#endif // NEML2_ENABLED
registerMooseObject("SolidMechanicsApp", TorchSmallStrain)
void addRequiredParam(const std::string &name, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
void mooseError(Args &&... args) const
const at::Tensor & getGradient(const std::string &var_name)
TorchFEInterpolation & _fe
at::Tensor _output
static InputParameters validParams()
TorchSmallStrain(const InputParameters &parameters)
void forward() override
Calculate small strain from displacement gradients.
const at::Tensor * _grad_disp_x
Displacement gradients.
const at::Tensor * _grad_disp_y
static InputParameters validParams()
const at::Tensor * _grad_disp_z
at::Tensor fullToMandel(const at::Tensor &full)