LCOV - code coverage report
Current view: top level - src/kernels - MechanicsFiniteStrainBaseNOSPD.C (source / functions) Hit Total Coverage
Test: idaholab/moose peridynamics: #31405 (292dce) with base fef103 Lines: 101 121 83.5 %
Date: 2025-09-04 07:55:08 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 "MechanicsFiniteStrainBaseNOSPD.h"
      11             : 
      12             : InputParameters
      13          17 : MechanicsFiniteStrainBaseNOSPD::validParams()
      14             : {
      15          17 :   InputParameters params = MechanicsBaseNOSPD::validParams();
      16          17 :   params.addClassDescription("Base class for kernels of the stabilized non-ordinary "
      17             :                              "state-based peridynamic correspondence models");
      18             : 
      19          34 :   params.addParam<std::vector<MaterialPropertyName>>(
      20             :       "eigenstrain_names",
      21             :       {},
      22             :       "List of eigenstrains to be coupled in non-ordinary state-based mechanics kernels");
      23             : 
      24          17 :   return params;
      25           0 : }
      26             : 
      27          12 : MechanicsFiniteStrainBaseNOSPD::MechanicsFiniteStrainBaseNOSPD(const InputParameters & parameters)
      28             :   : MechanicsBaseNOSPD(parameters),
      29          12 :     _dgrad_old(getMaterialPropertyOld<RankTwoTensor>("deformation_gradient")),
      30          24 :     _E_inc(getMaterialProperty<RankTwoTensor>("strain_increment")),
      31          36 :     _R_inc(getMaterialProperty<RankTwoTensor>("rotation_increment"))
      32             : {
      33          12 : }
      34             : 
      35             : RankTwoTensor
      36       36720 : MechanicsFiniteStrainBaseNOSPD::computeDSDU(unsigned int component, unsigned int nd)
      37             : {
      38             :   // compute the derivative of stress w.r.t the solution components for finite strain
      39       36720 :   RankTwoTensor dSdU;
      40             : 
      41             :   // fetch the derivative of stress w.r.t the Fhat
      42       36720 :   RankFourTensor DSDFhat = computeDSDFhat(nd);
      43             : 
      44             :   // third calculate derivative of Fhat w.r.t solution components
      45       36720 :   RankTwoTensor Tp3;
      46       36720 :   if (component == 0)
      47       18360 :     Tp3 = _dgrad_old[nd].inverse() * _ddgraddu[nd];
      48       18360 :   else if (component == 1)
      49       18360 :     Tp3 = _dgrad_old[nd].inverse() * _ddgraddv[nd];
      50           0 :   else if (component == 2)
      51           0 :     Tp3 = _dgrad_old[nd].inverse() * _ddgraddw[nd];
      52             : 
      53             :   // assemble the fetched and calculated quantities to form the derivative of Cauchy stress w.r.t
      54             :   // solution components
      55       36720 :   dSdU = DSDFhat * Tp3;
      56             : 
      57       36720 :   return dSdU;
      58             : }
      59             : 
      60             : RankFourTensor
      61       36720 : MechanicsFiniteStrainBaseNOSPD::computeDSDFhat(unsigned int nd)
      62             : {
      63             :   // compute the derivative of stress w.r.t the Fhat for finite strain
      64       36720 :   RankTwoTensor I(RankTwoTensor::initIdentity);
      65       36720 :   RankFourTensor dSdFhat;
      66       36720 :   dSdFhat.zero();
      67             : 
      68             :   // first calculate the derivative of incremental Cauchy stress w.r.t the inverse of Fhat
      69             :   // Reference: M. M. Rashid (1993), Incremental Kinematics for finite element applications, IJNME
      70       36720 :   RankTwoTensor S_inc = _Jacobian_mult[nd] * _E_inc[nd];
      71       36720 :   RankFourTensor Tp1;
      72       36720 :   Tp1.zero();
      73      146880 :   for (unsigned int i = 0; i < 3; ++i)
      74      440640 :     for (unsigned int j = 0; j < 3; ++j)
      75     1321920 :       for (unsigned int k = 0; k < 3; ++k)
      76     3965760 :         for (unsigned int l = 0; l < 3; ++l)
      77    11897280 :           for (unsigned int m = 0; m < 3; ++m)
      78    35691840 :             for (unsigned int n = 0; n < 3; ++n)
      79   107075520 :               for (unsigned int r = 0; r < 3; ++r)
      80    80306640 :                 Tp1(i, j, k, l) +=
      81    80306640 :                     S_inc(m, n) *
      82    80306640 :                         (_R_inc[nd](j, n) * (0.5 * I(k, m) * I(i, l) - I(m, l) * _R_inc[nd](i, k) +
      83    80306640 :                                              0.5 * _R_inc[nd](i, k) * _R_inc[nd](m, l)) +
      84    80306640 :                          _R_inc[nd](i, m) * (0.5 * I(k, n) * I(j, l) - I(n, l) * _R_inc[nd](j, k) +
      85    80306640 :                                              0.5 * _R_inc[nd](j, k) * _R_inc[nd](n, l))) -
      86    80306640 :                     _R_inc[nd](l, m) * _R_inc[nd](i, n) * _R_inc[nd](j, r) *
      87    80306640 :                         _Jacobian_mult[nd](n, r, m, k);
      88             : 
      89             :   // second calculate derivative of inverse of Fhat w.r.t Fhat
      90             :   // d(inv(Fhat)_kl)/dFhat_mn = - inv(Fhat)_km * inv(Fhat)_nl
      91             :   // the bases are gk, gl, gm, gn, indictates the inverse rather than the inverse transpose
      92             : 
      93       36720 :   RankFourTensor Tp2;
      94       36720 :   Tp2.zero();
      95       36720 :   RankTwoTensor invFhat = (_dgrad[nd] * _dgrad_old[nd].inverse()).inverse();
      96      146880 :   for (unsigned int k = 0; k < 3; ++k)
      97      440640 :     for (unsigned int l = 0; l < 3; ++l)
      98     1321920 :       for (unsigned int m = 0; m < 3; ++m)
      99     3965760 :         for (unsigned int n = 0; n < 3; ++n)
     100     2974320 :           Tp2(k, l, m, n) += -invFhat(k, m) * invFhat(n, l);
     101             : 
     102             :   // assemble two calculated quantities to form the derivative of Cauchy stress w.r.t
     103             :   // Fhat
     104       36720 :   dSdFhat = Tp1 * Tp2;
     105             : 
     106       36720 :   return dSdFhat;
     107             : }
     108             : 
     109             : Real
     110       36720 : MechanicsFiniteStrainBaseNOSPD::computeDJDU(unsigned int component, unsigned int nd)
     111             : {
     112             :   // for finite formulation, compute the derivative of determinant of deformation gradient w.r.t the
     113             :   // solution components
     114             :   // dJ / du = dJ / dF_ij * dF_ij / du = J * inv(F)_ji * dF_ij / du
     115             : 
     116             :   Real dJdU = 0.0;
     117       36720 :   RankTwoTensor invF = _dgrad[nd].inverse();
     118       36720 :   Real detF = _dgrad[nd].det();
     119      146880 :   for (unsigned int i = 0; i < 3; ++i)
     120      440640 :     for (unsigned int j = 0; j < 3; ++j)
     121             :     {
     122      330480 :       if (component == 0)
     123      165240 :         dJdU += detF * invF(j, i) * _ddgraddu[nd](i, j);
     124      165240 :       else if (component == 1)
     125      165240 :         dJdU += detF * invF(j, i) * _ddgraddv[nd](i, j);
     126           0 :       else if (component == 2)
     127           0 :         dJdU += detF * invF(j, i) * _ddgraddw[nd](i, j);
     128             :     }
     129             : 
     130       36720 :   return dJdU;
     131             : }
     132             : 
     133             : RankTwoTensor
     134       36720 : MechanicsFiniteStrainBaseNOSPD::computeDinvFTDU(unsigned int component, unsigned int nd)
     135             : {
     136             :   // for finite formulation, compute the derivative of transpose of inverse of deformation gradient
     137             :   // w.r.t the solution components
     138             :   // d(inv(F)_ji)/du = d(inv(F)_ji)/dF_kl * dF_kl/du = - inv(F)_jk * inv(F)_li * dF_kl/du
     139             :   // the bases are gi, gj, gk, gl, indictates the inverse transpose rather than the inverse
     140             : 
     141       36720 :   RankTwoTensor dinvFTdU;
     142             :   dinvFTdU.zero();
     143       36720 :   RankTwoTensor invF = _dgrad[nd].inverse();
     144       36720 :   if (component == 0)
     145             :   {
     146       18360 :     dinvFTdU(0, 1) =
     147       18360 :         _ddgraddu[nd](0, 2) * _dgrad[nd](2, 1) - _ddgraddu[nd](0, 1) * _dgrad[nd](2, 2);
     148       18360 :     dinvFTdU(0, 2) =
     149       18360 :         _ddgraddu[nd](0, 1) * _dgrad[nd](1, 2) - _ddgraddu[nd](0, 2) * _dgrad[nd](1, 1);
     150       18360 :     dinvFTdU(1, 1) =
     151       18360 :         _ddgraddu[nd](0, 0) * _dgrad[nd](2, 2) - _ddgraddu[nd](0, 2) * _dgrad[nd](2, 0);
     152       18360 :     dinvFTdU(1, 2) =
     153       18360 :         _ddgraddu[nd](0, 2) * _dgrad[nd](1, 0) - _ddgraddu[nd](0, 0) * _dgrad[nd](1, 2);
     154       18360 :     dinvFTdU(2, 1) =
     155       18360 :         _ddgraddu[nd](0, 1) * _dgrad[nd](2, 0) - _ddgraddu[nd](0, 0) * _dgrad[nd](2, 1);
     156       18360 :     dinvFTdU(2, 2) =
     157       18360 :         _ddgraddu[nd](0, 0) * _dgrad[nd](1, 1) - _ddgraddu[nd](0, 1) * _dgrad[nd](1, 0);
     158             :   }
     159       18360 :   else if (component == 1)
     160             :   {
     161       18360 :     dinvFTdU(0, 0) =
     162       18360 :         _ddgraddv[nd](1, 1) * _dgrad[nd](2, 2) - _ddgraddv[nd](1, 2) * _dgrad[nd](2, 1);
     163       18360 :     dinvFTdU(0, 2) =
     164       18360 :         _ddgraddv[nd](1, 2) * _dgrad[nd](0, 1) - _ddgraddv[nd](0, 2) * _dgrad[nd](1, 1);
     165       18360 :     dinvFTdU(1, 0) =
     166       18360 :         _ddgraddv[nd](1, 2) * _dgrad[nd](2, 0) - _ddgraddv[nd](1, 0) * _dgrad[nd](2, 2);
     167       18360 :     dinvFTdU(1, 2) =
     168       18360 :         _ddgraddv[nd](1, 0) * _dgrad[nd](0, 2) - _ddgraddv[nd](1, 2) * _dgrad[nd](0, 0);
     169       18360 :     dinvFTdU(2, 0) =
     170       18360 :         _ddgraddv[nd](1, 0) * _dgrad[nd](2, 1) - _ddgraddv[nd](1, 1) * _dgrad[nd](2, 0);
     171       18360 :     dinvFTdU(2, 2) =
     172       18360 :         _ddgraddv[nd](1, 1) * _dgrad[nd](0, 0) - _ddgraddv[nd](1, 0) * _dgrad[nd](0, 1);
     173             :   }
     174           0 :   else if (component == 2)
     175             :   {
     176           0 :     dinvFTdU(0, 0) =
     177           0 :         _ddgraddw[nd](2, 2) * _dgrad[nd](1, 1) - _ddgraddw[nd](2, 1) * _dgrad[nd](1, 2);
     178           0 :     dinvFTdU(0, 1) =
     179           0 :         _ddgraddw[nd](2, 1) * _dgrad[nd](0, 2) - _ddgraddw[nd](2, 2) * _dgrad[nd](0, 1);
     180           0 :     dinvFTdU(1, 0) =
     181           0 :         _ddgraddw[nd](2, 0) * _dgrad[nd](1, 2) - _ddgraddw[nd](2, 2) * _dgrad[nd](1, 0);
     182           0 :     dinvFTdU(1, 1) =
     183           0 :         _ddgraddw[nd](2, 2) * _dgrad[nd](0, 0) - _ddgraddw[nd](2, 0) * _dgrad[nd](0, 2);
     184           0 :     dinvFTdU(2, 0) =
     185           0 :         _ddgraddw[nd](2, 1) * _dgrad[nd](1, 0) - _ddgraddw[nd](2, 0) * _dgrad[nd](1, 1);
     186           0 :     dinvFTdU(2, 1) =
     187           0 :         _ddgraddw[nd](2, 0) * _dgrad[nd](0, 1) - _ddgraddw[nd](2, 1) * _dgrad[nd](0, 0);
     188             :   }
     189             : 
     190       36720 :   dinvFTdU /= _dgrad[nd].det();
     191      146880 :   for (unsigned int i = 0; i < 3; ++i)
     192      440640 :     for (unsigned int j = 0; j < 3; ++j)
     193     1321920 :       for (unsigned int k = 0; k < 3; ++k)
     194     3965760 :         for (unsigned int l = 0; l < 3; ++l)
     195             :         {
     196     2974320 :           if (component == 0)
     197     1487160 :             dinvFTdU(i, j) -= invF(i, j) * invF(l, k) * _ddgraddu[nd](k, l);
     198     1487160 :           else if (component == 1)
     199     1487160 :             dinvFTdU(i, j) -= invF(i, j) * invF(l, k) * _ddgraddv[nd](k, l);
     200           0 :           else if (component == 2)
     201           0 :             dinvFTdU(i, j) -= invF(i, j) * invF(l, k) * _ddgraddw[nd](k, l);
     202             :         }
     203             : 
     204       36720 :   return dinvFTdU;
     205             : }

Generated by: LCOV version 1.14