LCOV - code coverage report
Current view: top level - src/materials/crystal_plasticity - FiniteStrainCPSlipRateRes.C (source / functions) Hit Total Coverage
Test: idaholab/moose solid_mechanics: f45d79 Lines: 115 163 70.6 %
Date: 2025-07-25 05:00:39 Functions: 13 15 86.7 %
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 "FiniteStrainCPSlipRateRes.h"
      11             : #include "libmesh/utility.h"
      12             : 
      13             : registerMooseObjectDeprecated("SolidMechanicsApp", FiniteStrainCPSlipRateRes, "11/15/2024 12:00");
      14             : 
      15             : InputParameters
      16          72 : FiniteStrainCPSlipRateRes::validParams()
      17             : {
      18          72 :   InputParameters params = FiniteStrainCrystalPlasticity::validParams();
      19          72 :   params.addClassDescription("Deprecated class: please use CrystalPlasticityKalidindiUpdate and "
      20             :                              "ComputeMultipleCrystalPlasticityStress instead.");
      21          72 :   return params;
      22           0 : }
      23             : 
      24          54 : FiniteStrainCPSlipRateRes::FiniteStrainCPSlipRateRes(const InputParameters & parameters)
      25             :   : FiniteStrainCrystalPlasticity(parameters),
      26          54 :     _resid(_nss),
      27          54 :     _slip_rate(_nss),
      28          54 :     _dsliprate_dgss(_nss),
      29          54 :     _jacob(_nss, _nss),
      30         108 :     _dsliprate_dsliprate(_nss, _nss)
      31             : {
      32          54 : }
      33             : 
      34             : void
      35       83600 : FiniteStrainCPSlipRateRes::solveStatevar()
      36             : {
      37       83600 :   preSolveStress();
      38       83600 :   solveStress();
      39       83600 :   if (_err_tol)
      40             :     return;
      41       64160 :   postSolveStress();
      42             : }
      43             : 
      44             : void
      45       83600 : FiniteStrainCPSlipRateRes::preSolveStress()
      46             : {
      47       83600 :   FiniteStrainCrystalPlasticity::preSolveStress();
      48             :   _slip_rate.zero();
      49       83600 : }
      50             : 
      51             : void
      52       83600 : FiniteStrainCPSlipRateRes::solveStress()
      53             : {
      54             :   Real rnorm, rnorm0, rnorm_prev;
      55             :   unsigned int iter = 0;
      56             : 
      57             : #ifdef DEBUG
      58             :   std::vector<Real> rnormst(_maxiter + 1), slipratest(_maxiter + 1); // Use for Debugging
      59             : #endif
      60             : 
      61       83600 :   calcResidJacobSlipRate();
      62       83600 :   if (_err_tol)
      63             :     return;
      64       64160 :   rnorm = calcResidNorm();
      65             :   rnorm0 = rnorm;
      66             : 
      67             : #ifdef DEBUG
      68             :   rnormst[iter] = rnorm;
      69             :   Real slipratemax = 0.0;
      70             :   for (unsigned int i = 0; i < _nss; ++i)
      71             :     if (std::abs(_slip_rate(i)) > slipratemax)
      72             :       slipratemax = std::abs(_slip_rate(i));
      73             :   slipratest[iter] = slipratemax;
      74             : #endif
      75             : 
      76      612608 :   while (rnorm > _rtol * rnorm0 && rnorm0 > _abs_tol && iter < _maxiter)
      77             :   {
      78      548448 :     calcUpdate();
      79             : 
      80             :     DenseVector<Real> update = _resid;
      81             : 
      82      548448 :     _slip_rate -= update;
      83             : 
      84      548448 :     calcResidualSlipRate();
      85      548448 :     if (_err_tol)
      86             :       return;
      87             :     rnorm_prev = rnorm;
      88      548448 :     rnorm = calcResidNorm();
      89             : 
      90      548448 :     if (_use_line_search && rnorm > rnorm_prev && !lineSearchUpdateSlipRate(rnorm_prev, update))
      91             :     {
      92             : #ifdef DEBUG
      93             :       mooseWarning("FiniteStrainCrystalPLasticity: Failed with line search");
      94             : #endif
      95           0 :       _err_tol = true;
      96           0 :       return;
      97             :     }
      98             : 
      99      548448 :     calcJacobianSlipRate();
     100             : 
     101      548448 :     if (_use_line_search)
     102      274656 :       rnorm = calcResidNorm();
     103      548448 :     iter++;
     104             : 
     105             : #ifdef DEBUG
     106             :     slipratemax = 0.0;
     107             :     for (unsigned int i = 0; i < _nss; ++i)
     108             :       if (std::abs(_slip_rate(i)) > slipratemax)
     109             :         slipratemax = std::abs(_slip_rate(i));
     110             :     rnormst[iter] = rnorm;
     111             :     slipratest[iter] = slipratemax;
     112             : #endif
     113             :   }
     114             : 
     115       64160 :   if (iter == _maxiter)
     116             :   {
     117             : #ifdef DEBUG
     118             :     mooseWarning("FiniteStrainCPSlipRateRes: NR exceeds maximum iteration ", iter, " ", rnorm);
     119             : #endif
     120           0 :     _err_tol = true;
     121           0 :     return;
     122             :   }
     123             : }
     124             : 
     125             : void
     126       83600 : FiniteStrainCPSlipRateRes::calcResidJacobSlipRate()
     127             : {
     128       83600 :   calcResidualSlipRate();
     129       83600 :   if (_err_tol)
     130             :     return;
     131       64160 :   calcJacobianSlipRate();
     132             : }
     133             : 
     134             : void
     135      632048 : FiniteStrainCPSlipRateRes::calcResidualSlipRate()
     136             : {
     137      632048 :   RankTwoTensor eqv_slip_incr, ce, ee;
     138      632048 :   const RankTwoTensor iden(RankTwoTensor::initIdentity);
     139             : 
     140             :   _slip_incr = _slip_rate;
     141      632048 :   _slip_incr *= _dt;
     142             : 
     143     8216624 :   for (unsigned int i = 0; i < _nss; ++i)
     144     7584576 :     eqv_slip_incr += _s0[i] * _slip_incr(i);
     145             : 
     146      632048 :   eqv_slip_incr = iden - eqv_slip_incr;
     147             : 
     148      632048 :   _fp_inv = _fp_old_inv * eqv_slip_incr;
     149      632048 :   _fe = _dfgrd_tmp * _fp_inv;
     150             : 
     151      632048 :   ce = _fe.transpose() * _fe;
     152      632048 :   ee = ce - iden;
     153      632048 :   ee *= 0.5;
     154             : 
     155      632048 :   _pk2_tmp = _elasticity_tensor[_qp] * ee;
     156             : 
     157     8216624 :   for (unsigned int i = 0; i < _nss; ++i)
     158     7584576 :     _tau(i) = _pk2_tmp.doubleContraction(_s0[i]);
     159             : 
     160      632048 :   update_slip_system_resistance();
     161      632048 :   getSlipIncrements();
     162             : 
     163      632048 :   if (_err_tol)
     164             :     return;
     165             : 
     166     7963904 :   for (unsigned int i = 0; i < _nss; ++i)
     167     7351296 :     _resid(i) = _slip_rate(i) - _slip_incr(i) / _dt;
     168             : }
     169             : 
     170             : void
     171      612608 : FiniteStrainCPSlipRateRes::calcJacobianSlipRate()
     172             : {
     173             :   //_dsliprate_dsliprate not reinitialized to zero, hence order is important
     174      612608 :   calcDtauDsliprate();
     175      612608 :   calcDgssDsliprate();
     176             : 
     177     7963904 :   for (unsigned int i = 0; i < _nss; ++i)
     178    95566848 :     for (unsigned int j = 0; j < _nss; ++j)
     179             :     {
     180    88215552 :       _jacob(i, j) = 0.0;
     181    88215552 :       if (i == j)
     182     7351296 :         _jacob(i, j) += 1.0;
     183    88215552 :       _jacob(i, j) -= _dsliprate_dsliprate(i, j);
     184             :     }
     185      612608 : }
     186             : 
     187             : void
     188      612608 : FiniteStrainCPSlipRateRes::calcDtauDsliprate()
     189             : {
     190      612608 :   RankFourTensor dfedfpinv, deedfe, dfpinvdpk2;
     191      612608 :   std::vector<RankTwoTensor> dtaudpk2(_nss), dfpinvdsliprate(_nss);
     192             : 
     193     7963904 :   for (unsigned int i = 0; i < _nss; ++i)
     194             :   {
     195     7351296 :     dtaudpk2[i] = _s0[i];
     196     7351296 :     dfpinvdsliprate[i] = -_fp_old_inv * _s0[i] * _dt;
     197             :   }
     198             : 
     199     2450432 :   for (const auto i : make_range(Moose::dim))
     200     7351296 :     for (const auto j : make_range(Moose::dim))
     201    22053888 :       for (const auto k : make_range(Moose::dim))
     202    16540416 :         dfedfpinv(i, j, k, j) = _dfgrd_tmp(i, k);
     203             : 
     204     2450432 :   for (const auto i : make_range(Moose::dim))
     205     7351296 :     for (const auto j : make_range(Moose::dim))
     206    22053888 :       for (const auto k : make_range(Moose::dim))
     207             :       {
     208    16540416 :         deedfe(i, j, k, i) = deedfe(i, j, k, i) + _fe(k, j) * 0.5;
     209    16540416 :         deedfe(i, j, k, j) = deedfe(i, j, k, j) + _fe(k, i) * 0.5;
     210             :       }
     211             : 
     212      612608 :   RankFourTensor dpk2dfpinv;
     213             : 
     214      612608 :   dpk2dfpinv = _elasticity_tensor[_qp] * deedfe * dfedfpinv;
     215             : 
     216     7963904 :   for (unsigned int i = 0; i < _nss; ++i)
     217    95566848 :     for (unsigned int j = 0; j < _nss; ++j)
     218    88215552 :       _dsliprate_dsliprate(i, j) =
     219    88215552 :           _dslipdtau(i) * dtaudpk2[i].doubleContraction(dpk2dfpinv * dfpinvdsliprate[j]);
     220      612608 : }
     221             : 
     222             : void
     223      612608 : FiniteStrainCPSlipRateRes::calcDgssDsliprate()
     224             : {
     225     7963904 :   for (unsigned int i = 0; i < _nss; ++i)
     226    95566848 :     for (unsigned int j = 0; j < _nss; ++j)
     227    88215552 :       _dsliprate_dsliprate(i, j) += _dsliprate_dgss(i) * _dgss_dsliprate(i, j);
     228      612608 : }
     229             : 
     230             : void
     231      632048 : FiniteStrainCPSlipRateRes::getSlipIncrements()
     232             : {
     233      632048 :   FiniteStrainCrystalPlasticity::getSlipIncrements();
     234             : 
     235      632048 :   if (_err_tol)
     236             :     return;
     237             : 
     238      612608 :   _dslipdtau *= 1.0 / _dt;
     239             : 
     240     7963904 :   for (unsigned int i = 0; i < _nss; ++i)
     241     7351296 :     _dsliprate_dgss(i) = -_a0(i) / _xm(i) *
     242     7351296 :                          std::pow(std::abs(_tau(i) / _gss_tmp[i]), 1.0 / _xm(i) - 1.0) * _tau(i) /
     243     7351296 :                          std::pow(_gss_tmp[i], 2.0);
     244             : }
     245             : 
     246             : void
     247      548448 : FiniteStrainCPSlipRateRes::calcUpdate()
     248             : {
     249      548448 :   DenseMatrix<Real> A = _jacob;
     250      548448 :   DenseVector<Real> r(_nss);
     251      548448 :   DenseVector<Real> x(_nss);
     252             : 
     253             :   r = _resid;
     254             : 
     255      548448 :   A.lu_solve(r, x);
     256             : 
     257             :   _resid = x;
     258      548448 : }
     259             : 
     260             : Real
     261      887264 : FiniteStrainCPSlipRateRes::calcResidNorm()
     262             : {
     263             :   Real rnorm = 0.0;
     264    11534432 :   for (unsigned int i = 0; i < _nss; ++i)
     265    10647168 :     rnorm += Utility::pow<2>(_resid(i));
     266      887264 :   rnorm = std::sqrt(rnorm) / _nss;
     267             : 
     268      887264 :   return rnorm;
     269             : }
     270             : 
     271             : bool
     272           0 : FiniteStrainCPSlipRateRes::lineSearchUpdateSlipRate(const Real rnorm_prev,
     273             :                                                     const DenseVector<Real> & update)
     274             : {
     275           0 :   if (_lsrch_method == "CUT_HALF")
     276             :   {
     277             :     Real rnorm;
     278             :     Real step = 1.0;
     279             :     do
     280             :     {
     281           0 :       for (unsigned int i = 0; i < update.size(); ++i)
     282           0 :         _slip_rate(i) += step * update(i);
     283             : 
     284           0 :       step /= 2.0;
     285             : 
     286           0 :       for (unsigned int i = 0; i < update.size(); ++i)
     287           0 :         _slip_rate(i) -= step * update(i);
     288             : 
     289           0 :       calcResidualSlipRate();
     290           0 :       if (_err_tol)
     291             :         return false;
     292           0 :       rnorm = calcResidNorm();
     293           0 :     } while (rnorm > rnorm_prev && step > _min_lsrch_step);
     294             : 
     295           0 :     if (rnorm > rnorm_prev && step <= _min_lsrch_step)
     296             :       return false;
     297             : 
     298             :     return true;
     299             :   }
     300           0 :   else if (_lsrch_method == "BISECTION")
     301             :   {
     302             :     unsigned int count = 0;
     303             :     Real step_a = 0.0;
     304             :     Real step_b = 1.0;
     305             :     Real step = 1.0;
     306             :     Real s_m = 1000.0;
     307             :     Real rnorm = 1000.0;
     308             : 
     309           0 :     Real s_b = calcResidDotProdUpdate(update);
     310           0 :     Real rnorm1 = calcResidNorm();
     311             : 
     312           0 :     for (unsigned int i = 0; i < update.size(); ++i)
     313           0 :       _slip_rate(i) += update(i);
     314             : 
     315           0 :     calcResidualSlipRate();
     316           0 :     Real s_a = calcResidDotProdUpdate(update);
     317           0 :     Real rnorm0 = calcResidNorm();
     318             : 
     319           0 :     for (unsigned int i = 0; i < update.size(); ++i)
     320           0 :       _slip_rate(i) -= update(i);
     321             : 
     322           0 :     if ((rnorm1 / rnorm0) < _lsrch_tol || s_a * s_b > 0)
     323             :     {
     324           0 :       calcResidualSlipRate();
     325           0 :       return true;
     326             :     }
     327             : 
     328           0 :     while ((rnorm / rnorm0) > _lsrch_tol && count < _lsrch_max_iter)
     329             :     {
     330             : 
     331           0 :       for (unsigned int i = 0; i < update.size(); ++i)
     332           0 :         _slip_rate(i) += step * update(i);
     333             : 
     334           0 :       step = 0.5 * (step_a + step_b);
     335             : 
     336           0 :       for (unsigned int i = 0; i < update.size(); ++i)
     337           0 :         _slip_rate(i) -= step * update(i);
     338             : 
     339           0 :       calcResidualSlipRate();
     340           0 :       s_m = calcResidDotProdUpdate(update);
     341           0 :       rnorm = calcResidNorm();
     342             : 
     343           0 :       if (s_m * s_a < 0.0)
     344             :       {
     345             :         step_b = step;
     346             :         s_b = s_m;
     347             :       }
     348           0 :       if (s_m * s_b < 0.0)
     349             :       {
     350             :         step_a = step;
     351             :         s_a = s_m;
     352             :       }
     353           0 :       count++;
     354             :     }
     355             : 
     356           0 :     if ((rnorm / rnorm0) < _lsrch_tol && count < _lsrch_max_iter)
     357             :       return true;
     358             : 
     359             :     return false;
     360             :   }
     361             :   else
     362             :   {
     363           0 :     mooseError("Line search meothod is not provided.");
     364             :     return false;
     365             :   }
     366             : }
     367             : 
     368             : Real
     369           0 : FiniteStrainCPSlipRateRes::calcResidDotProdUpdate(const DenseVector<Real> & update)
     370             : {
     371             :   Real dotprod = 0.0;
     372           0 :   for (unsigned int i = 0; i < _nss; ++i)
     373           0 :     dotprod += _resid(i) * update(i);
     374           0 :   return dotprod;
     375             : }

Generated by: LCOV version 1.14