LCOV - code coverage report
Current view: top level - src/kernels/lagrangian - LagrangianStressDivergenceBase.C (source / functions) Hit Total Coverage
Test: idaholab/moose solid_mechanics: #32971 (54bef8) with base c6cf66 Lines: 62 64 96.9 %
Date: 2026-05-29 20:40:07 Functions: 6 6 100.0 %
Legend: Lines: hit not hit

          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             : #include "LagrangianStressDivergenceBase.h"
      11             : 
      12             : InputParameters
      13        3464 : LagrangianStressDivergenceBase::validParams()
      14             : {
      15        3464 :   InputParameters params = KernelScalarBase::validParams();
      16             : 
      17        6928 :   params.addRequiredParam<unsigned int>("component", "Which direction this kernel acts in");
      18        6928 :   params.addRequiredCoupledVar("displacements", "The displacement components");
      19             : 
      20        6928 :   params.addParam<bool>("large_kinematics", false, "Use large displacement kinematics");
      21        6928 :   params.addParam<bool>("stabilize_strain", false, "Average the volumetric strains");
      22             : 
      23        6928 :   params.addParam<std::string>("base_name", "Material property base name");
      24             : 
      25        6928 :   params.addCoupledVar("temperature",
      26             :                        "The name of the temperature variable used in the "
      27             :                        "ComputeThermalExpansionEigenstrain.  (Not required for "
      28             :                        "simulations without temperature coupling.)");
      29             : 
      30        6928 :   params.addParam<std::vector<MaterialPropertyName>>(
      31             :       "eigenstrain_names",
      32             :       {},
      33             :       "List of eigenstrains used in the strain calculation. Used for computing their derivatives "
      34             :       "for off-diagonal Jacobian terms.");
      35             : 
      36        6928 :   params.addCoupledVar("out_of_plane_strain",
      37             :                        "The out-of-plane strain variable for weak plane stress formulation.");
      38             : 
      39        3464 :   return params;
      40           0 : }
      41             : 
      42        1732 : LagrangianStressDivergenceBase::LagrangianStressDivergenceBase(const InputParameters & parameters)
      43             :   : JvarMapKernelInterface<DerivativeMaterialInterface<KernelScalarBase>>(parameters),
      44        1732 :     _large_kinematics(getParam<bool>("large_kinematics")),
      45        3464 :     _stabilize_strain(getParam<bool>("stabilize_strain")),
      46        3512 :     _base_name(isParamValid("base_name") ? getParam<std::string>("base_name") + "_" : ""),
      47        3464 :     _alpha(getParam<unsigned int>("component")),
      48        1732 :     _ndisp(coupledComponents("displacements")),
      49        1732 :     _disp_nums(_ndisp),
      50        1732 :     _avg_grad_trial(_ndisp),
      51        1732 :     _F_ust(
      52        1732 :         getMaterialPropertyByName<RankTwoTensor>(_base_name + "unstabilized_deformation_gradient")),
      53        3464 :     _F_avg(getMaterialPropertyByName<RankTwoTensor>(_base_name + "average_deformation_gradient")),
      54        3464 :     _f_inv(getMaterialPropertyByName<RankTwoTensor>(_base_name +
      55             :                                                     "inverse_incremental_deformation_gradient")),
      56        3464 :     _F_inv(getMaterialPropertyByName<RankTwoTensor>(_base_name + "inverse_deformation_gradient")),
      57        3464 :     _F(getMaterialPropertyByName<RankTwoTensor>(_base_name + "deformation_gradient")),
      58        1842 :     _temperature(isCoupled("temperature") ? getVar("temperature", 0) : nullptr),
      59        1764 :     _out_of_plane_strain(isCoupled("out_of_plane_strain") ? getVar("out_of_plane_strain", 0)
      60        1732 :                                                           : nullptr)
      61             : {
      62             :   // Do the vector coupling of the displacements
      63        6218 :   for (unsigned int i = 0; i < _ndisp; i++)
      64        4486 :     _disp_nums[i] = coupled("displacements", i);
      65             : 
      66             :   // We need to use identical discretizations for all displacement components
      67        1732 :   auto order_x = getVar("displacements", 0)->order();
      68        4486 :   for (unsigned int i = 1; i < _ndisp; i++)
      69             :   {
      70        5508 :     if (getVar("displacements", i)->order() != order_x)
      71           0 :       mooseError("The Lagrangian StressDivergence kernels require equal "
      72             :                  "order interpolation for all displacements.");
      73             :   }
      74             : 
      75             :   // fetch eigenstrain derivatives
      76             :   const auto nvar = _coupled_moose_vars.size();
      77        1732 :   _deigenstrain_dargs.resize(nvar);
      78        6360 :   for (std::size_t i = 0; i < nvar; ++i)
      79        9784 :     for (auto eigenstrain_name : getParam<std::vector<MaterialPropertyName>>("eigenstrain_names"))
      80        1056 :       _deigenstrain_dargs[i].push_back(&getMaterialPropertyDerivative<RankTwoTensor>(
      81         528 :           eigenstrain_name, _coupled_moose_vars[i]->name()));
      82        1732 : }
      83             : 
      84             : void
      85      467409 : LagrangianStressDivergenceBase::precalculateJacobian()
      86             : {
      87             :   // Skip if we are not doing stabilization
      88      467409 :   if (!_stabilize_strain)
      89             :     return;
      90             : 
      91             :   // We need the gradients of shape functions in the reference frame
      92       29965 :   _fe_problem.prepareShapes(_var.number(), _tid);
      93       29965 :   _avg_grad_trial[_alpha].resize(_phi.size());
      94       29965 :   precalculateJacobianDisplacement(_alpha);
      95             : }
      96             : 
      97             : void
      98      828822 : LagrangianStressDivergenceBase::precalculateOffDiagJacobian(unsigned int jvar)
      99             : {
     100             :   // Skip if we are not doing stabilization
     101      828822 :   if (!_stabilize_strain)
     102             :     return;
     103             : 
     104      197924 :   for (auto beta : make_range(_ndisp))
     105      145758 :     if (jvar == _disp_nums[beta])
     106             :     {
     107             :       // We need the gradients of shape functions in the reference frame
     108       50256 :       _fe_problem.prepareShapes(jvar, _tid);
     109       50256 :       _avg_grad_trial[beta].resize(_phi.size());
     110       50256 :       precalculateJacobianDisplacement(beta);
     111             :     }
     112             : }
     113             : 
     114             : Real
     115   201219996 : LagrangianStressDivergenceBase::computeQpJacobian()
     116             : {
     117   201219996 :   return computeQpJacobianDisplacement(_alpha, _alpha);
     118             : }
     119             : 
     120             : Real
     121   392563804 : LagrangianStressDivergenceBase::computeQpOffDiagJacobian(unsigned int jvar)
     122             : {
     123             :   // Bail if jvar not coupled
     124   392563804 :   if (getJvarMap()[jvar] < 0)
     125             :     return 0.0;
     126             : 
     127             :   // Off diagonal terms for other displacements
     128   784401098 :   for (auto beta : make_range(_ndisp))
     129   783614794 :     if (jvar == _disp_nums[beta])
     130   391777500 :       return computeQpJacobianDisplacement(_alpha, beta);
     131             : 
     132             :   // Off diagonal temperature term due to eigenstrain
     133      786304 :   if (_temperature && jvar == _temperature->number())
     134      700416 :     return computeQpJacobianTemperature(mapJvarToCvar(jvar));
     135             : 
     136             :   // Off diagonal term due to weak plane stress
     137       85888 :   if (_out_of_plane_strain && jvar == _out_of_plane_strain->number())
     138       85888 :     return computeQpJacobianOutOfPlaneStrain();
     139             : 
     140             :   return 0;
     141             : }

Generated by: LCOV version 1.14