Line data Source code
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 : 20 : InputParameters 21 0 : NEML2SmallStrain::validParams() 22 : { 23 0 : InputParameters params = NEML2PreKernel::validParams(); 24 0 : 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 0 : params.addRequiredParam<std::vector<NonlinearVariableName>>( 28 : "displacements", "The displacements to use to calculate the strain."); 29 0 : return params; 30 0 : } 31 : 32 0 : NEML2SmallStrain::NEML2SmallStrain(const InputParameters & parameters) : NEML2PreKernel(parameters) 33 : { 34 0 : auto disp_vars = getParam<std::vector<NonlinearVariableName>>("displacements"); 35 0 : if (disp_vars.size() < 1 || disp_vars.size() > 3) 36 0 : mooseError("NEML2SmallStrain requires 1 to 3 displacement variables, got ", disp_vars.size()); 37 : 38 0 : _grad_disp_x = &_fe.getGradient(disp_vars[0]); 39 0 : _grad_disp_y = disp_vars.size() >= 2 ? &_fe.getGradient(disp_vars[1]) : nullptr; 40 0 : _grad_disp_z = disp_vars.size() >= 3 ? &_fe.getGradient(disp_vars[2]) : nullptr; 41 0 : } 42 : 43 : void 44 0 : NEML2SmallStrain::forward() 45 : { 46 : // gradient of displacements 47 0 : const auto & dux = *_grad_disp_x; 48 0 : auto duy = _grad_disp_y ? *_grad_disp_y : neml2::Tensor::zeros_like(dux); 49 0 : auto duz = _grad_disp_z ? *_grad_disp_z : neml2::Tensor::zeros_like(dux); 50 0 : 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 0 : _output = neml2::SR2(du); 54 0 : } 55 : 56 : #endif