LCOV - code coverage report
Current view: top level - src/materials - ADCompute2DFiniteStrain.C (source / functions) Hit Total Coverage
Test: idaholab/moose solid_mechanics: #31405 (292dce) with base fef103 Lines: 41 47 87.2 %
Date: 2025-09-04 07:57:23 Functions: 4 5 80.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 "ADCompute2DFiniteStrain.h"
      11             : 
      12             : #include "libmesh/quadrature.h"
      13             : 
      14             : InputParameters
      15         400 : ADCompute2DFiniteStrain::validParams()
      16             : {
      17         400 :   InputParameters params = ADComputeFiniteStrain::validParams();
      18         400 :   params.addClassDescription(
      19             :       "Compute a strain increment and rotation increment for finite strains in 2D geometries.");
      20             : 
      21         800 :   MooseEnum outOfPlaneDirection("x y z", "z");
      22         800 :   params.addParam<MooseEnum>(
      23             :       "out_of_plane_direction", outOfPlaneDirection, "The direction of the out-of-plane strain.");
      24         400 :   return params;
      25         400 : }
      26             : 
      27         300 : ADCompute2DFiniteStrain::ADCompute2DFiniteStrain(const InputParameters & parameters)
      28             :   : ADComputeFiniteStrain(parameters),
      29         600 :     _out_of_plane_direction(getParam<MooseEnum>("out_of_plane_direction"))
      30             : {
      31         300 : }
      32             : 
      33             : void
      34         300 : ADCompute2DFiniteStrain::initialSetup()
      35             : {
      36        1200 :   for (unsigned int i = 0; i < 3; ++i)
      37             :   {
      38         900 :     if (_out_of_plane_direction == i)
      39             :     {
      40         300 :       _disp[i] = &_ad_zero;
      41         300 :       _grad_disp[i] = &_ad_grad_zero;
      42             :     }
      43             :     else
      44             :     {
      45         600 :       _disp[i] = &adCoupledValue("displacements", i);
      46         600 :       _grad_disp[i] = &adCoupledGradient("displacements", i);
      47             :     }
      48             : 
      49         900 :     if (_fe_problem.isTransient() && i != _out_of_plane_direction)
      50         600 :       _grad_disp_old[i] = &coupledGradientOld("displacements", i);
      51             :     else
      52         300 :       _grad_disp_old[i] = &_grad_zero;
      53             :   }
      54         300 : }
      55             : 
      56             : void
      57      577082 : ADCompute2DFiniteStrain::computeProperties()
      58             : {
      59      577082 :   ADRankTwoTensor ave_Fhat;
      60             : 
      61     3011650 :   for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
      62             :   {
      63             :     // Deformation gradient calculation for 2D problems
      64             :     auto A = ADRankTwoTensor::initializeFromRows(
      65     2434568 :         (*_grad_disp[0])[_qp], (*_grad_disp[1])[_qp], (*_grad_disp[2])[_qp]);
      66             : 
      67             :     // Old Deformation gradient
      68             :     auto Fbar = RankTwoTensor::initializeFromRows(
      69     2434568 :         (*_grad_disp_old[0])[_qp], (*_grad_disp_old[1])[_qp], (*_grad_disp_old[2])[_qp]);
      70             : 
      71             :     // Compute the displacement gradient for the out of plane direction for plane strain,
      72             :     // generalized plane strain, or axisymmetric problems
      73     2434568 :     A(_out_of_plane_direction, _out_of_plane_direction) = computeOutOfPlaneGradDisp();
      74     2434568 :     Fbar(_out_of_plane_direction, _out_of_plane_direction) = computeOutOfPlaneGradDispOld();
      75             : 
      76     2434568 :     A -= Fbar; // very nearly A = gradU - gradUold
      77             : 
      78     2434568 :     Fbar.addIa(1.0); // Fbar = ( I + gradUold)
      79             : 
      80             :     // Incremental deformation gradient _Fhat = I + A Fbar^-1
      81     2434568 :     _Fhat[_qp] = A * Fbar.inverse();
      82     2434568 :     _Fhat[_qp].addIa(1.0);
      83             : 
      84             :     // Calculate average _Fhat for volumetric locking correction
      85     2434568 :     if (_volumetric_locking_correction)
      86      999392 :       ave_Fhat += _Fhat[_qp] * _JxW[_qp] * _coord[_qp];
      87             :   }
      88             : 
      89      577082 :   if (_volumetric_locking_correction)
      90      249848 :     ave_Fhat /= _current_elem_volume;
      91             : 
      92     3011650 :   for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
      93             :   {
      94             :     // Finalize volumetric locking correction
      95     2434568 :     if (_volumetric_locking_correction)
      96     1998784 :       _Fhat[_qp] *= std::cbrt(ave_Fhat.det() / _Fhat[_qp].det());
      97             : 
      98     2434568 :     computeQpStrain();
      99             :   }
     100      577082 : }
     101             : 
     102             : void
     103           0 : ADCompute2DFiniteStrain::displacementIntegrityCheck()
     104             : {
     105           0 :   if (_out_of_plane_direction != 2 && _ndisp != 3)
     106           0 :     mooseError("For 2D simulations where the out-of-plane direction is x or y the number of "
     107             :                "supplied displacements must be three.");
     108           0 :   else if (_out_of_plane_direction == 2 && _ndisp != 2)
     109           0 :     mooseError("For 2D simulations where the out-of-plane direction is z the number of supplied "
     110             :                "displacements must be two.");
     111           0 : }

Generated by: LCOV version 1.14