LCOV - code coverage report
Current view: top level - src/materials - ADCompute2DFiniteStrain.C (source / functions) Hit Total Coverage
Test: idaholab/moose solid_mechanics: f45d79 Lines: 41 47 87.2 %
Date: 2025-07-25 05:00:39 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         360 : ADCompute2DFiniteStrain::validParams()
      16             : {
      17         360 :   InputParameters params = ADComputeFiniteStrain::validParams();
      18         360 :   params.addClassDescription(
      19             :       "Compute a strain increment and rotation increment for finite strains in 2D geometries.");
      20             : 
      21         720 :   MooseEnum outOfPlaneDirection("x y z", "z");
      22         720 :   params.addParam<MooseEnum>(
      23             :       "out_of_plane_direction", outOfPlaneDirection, "The direction of the out-of-plane strain.");
      24         360 :   return params;
      25         360 : }
      26             : 
      27         270 : ADCompute2DFiniteStrain::ADCompute2DFiniteStrain(const InputParameters & parameters)
      28             :   : ADComputeFiniteStrain(parameters),
      29         540 :     _out_of_plane_direction(getParam<MooseEnum>("out_of_plane_direction"))
      30             : {
      31         270 : }
      32             : 
      33             : void
      34         270 : ADCompute2DFiniteStrain::initialSetup()
      35             : {
      36        1080 :   for (unsigned int i = 0; i < 3; ++i)
      37             :   {
      38         810 :     if (_out_of_plane_direction == i)
      39             :     {
      40         270 :       _disp[i] = &_ad_zero;
      41         270 :       _grad_disp[i] = &_ad_grad_zero;
      42             :     }
      43             :     else
      44             :     {
      45         540 :       _disp[i] = &adCoupledValue("displacements", i);
      46         540 :       _grad_disp[i] = &adCoupledGradient("displacements", i);
      47             :     }
      48             : 
      49         810 :     if (_fe_problem.isTransient() && i != _out_of_plane_direction)
      50         540 :       _grad_disp_old[i] = &coupledGradientOld("displacements", i);
      51             :     else
      52         270 :       _grad_disp_old[i] = &_grad_zero;
      53             :   }
      54         270 : }
      55             : 
      56             : void
      57      554200 : ADCompute2DFiniteStrain::computeProperties()
      58             : {
      59      554200 :   ADRankTwoTensor ave_Fhat;
      60             : 
      61     2862616 :   for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
      62             :   {
      63             :     // Deformation gradient calculation for 2D problems
      64             :     auto A = ADRankTwoTensor::initializeFromRows(
      65     2308416 :         (*_grad_disp[0])[_qp], (*_grad_disp[1])[_qp], (*_grad_disp[2])[_qp]);
      66             : 
      67             :     // Old Deformation gradient
      68             :     auto Fbar = RankTwoTensor::initializeFromRows(
      69     2308416 :         (*_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     2308416 :     A(_out_of_plane_direction, _out_of_plane_direction) = computeOutOfPlaneGradDisp();
      74     2308416 :     Fbar(_out_of_plane_direction, _out_of_plane_direction) = computeOutOfPlaneGradDispOld();
      75             : 
      76     2308416 :     A -= Fbar; // very nearly A = gradU - gradUold
      77             : 
      78     2308416 :     Fbar.addIa(1.0); // Fbar = ( I + gradUold)
      79             : 
      80             :     // Incremental deformation gradient _Fhat = I + A Fbar^-1
      81     2308416 :     _Fhat[_qp] = A * Fbar.inverse();
      82     2308416 :     _Fhat[_qp].addIa(1.0);
      83             : 
      84             :     // Calculate average _Fhat for volumetric locking correction
      85     2308416 :     if (_volumetric_locking_correction)
      86      985952 :       ave_Fhat += _Fhat[_qp] * _JxW[_qp] * _coord[_qp];
      87             :   }
      88             : 
      89      554200 :   if (_volumetric_locking_correction)
      90      246488 :     ave_Fhat /= _current_elem_volume;
      91             : 
      92     2862616 :   for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
      93             :   {
      94             :     // Finalize volumetric locking correction
      95     2308416 :     if (_volumetric_locking_correction)
      96     1971904 :       _Fhat[_qp] *= std::cbrt(ave_Fhat.det() / _Fhat[_qp].det());
      97             : 
      98     2308416 :     computeQpStrain();
      99             :   }
     100      554200 : }
     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