LCOV - code coverage report
Current view: top level - src/userobjects - SolidMechanicsPlasticOrthotropic.C (source / functions) Hit Total Coverage
Test: idaholab/moose solid_mechanics: f45d79 Lines: 92 95 96.8 %
Date: 2025-07-25 05:00:39 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 "SolidMechanicsPlasticOrthotropic.h"
      11             : #include "RankFourTensor.h"
      12             : #include "libmesh/utility.h"
      13             : 
      14             : registerMooseObject("SolidMechanicsApp", SolidMechanicsPlasticOrthotropic);
      15             : registerMooseObjectRenamed("SolidMechanicsApp",
      16             :                            TensorMechanicsPlasticOrthotropic,
      17             :                            "01/01/2025 00:00",
      18             :                            SolidMechanicsPlasticOrthotropic);
      19             : 
      20             : InputParameters
      21          24 : SolidMechanicsPlasticOrthotropic::validParams()
      22             : {
      23          24 :   InputParameters params = SolidMechanicsPlasticIsotropicSD::validParams();
      24          48 :   params.addRequiredParam<std::vector<Real>>("c1", "The six coefficients of L prime");
      25          48 :   params.addRequiredParam<std::vector<Real>>("c2", "The six coefficients of L prime prime");
      26          24 :   params.addClassDescription("Orthotropic plasticity for pressure sensitive materials and also "
      27             :                              "models the strength differential effect");
      28          24 :   return params;
      29           0 : }
      30             : 
      31          12 : SolidMechanicsPlasticOrthotropic::SolidMechanicsPlasticOrthotropic(
      32          12 :     const InputParameters & parameters)
      33             :   : SolidMechanicsPlasticIsotropicSD(parameters),
      34          12 :     _c1(getParam<std::vector<Real>>("c1")),
      35          48 :     _c2(getParam<std::vector<Real>>("c2"))
      36             : {
      37          12 :   _c = 1.0;
      38          12 :   _l1(0, 0, 0, 0) = (_c1[1] + _c1[2]) / 3.0;
      39          12 :   _l1(0, 0, 1, 1) = -_c1[2] / 3.0;
      40          12 :   _l1(0, 0, 2, 2) = -_c1[1] / 3.0;
      41          12 :   _l1(1, 1, 0, 0) = -_c1[2] / 3.0;
      42          12 :   _l1(1, 1, 1, 1) = (_c1[0] + _c1[2]) / 3.0;
      43          12 :   _l1(1, 1, 2, 2) = -_c1[0] / 3.0;
      44          12 :   _l1(2, 2, 0, 0) = -_c1[1] / 3.0;
      45          12 :   _l1(2, 2, 1, 1) = -_c1[0] / 3.0;
      46          12 :   _l1(2, 2, 2, 2) = (_c1[0] + _c1[1]) / 3.0;
      47          12 :   _l1(0, 1, 1, 0) = _c1[5] / 2.0;
      48          12 :   _l1(0, 1, 0, 1) = _c1[5] / 2.0;
      49          12 :   _l1(1, 0, 1, 0) = _c1[5] / 2.0;
      50          12 :   _l1(1, 0, 0, 1) = _c1[5] / 2.0;
      51          12 :   _l1(0, 2, 0, 2) = _c1[4] / 2.0;
      52          12 :   _l1(0, 2, 2, 0) = _c1[4] / 2.0;
      53          12 :   _l1(2, 0, 2, 0) = _c1[4] / 2.0;
      54          12 :   _l1(2, 0, 0, 2) = _c1[4] / 2.0;
      55          12 :   _l1(1, 2, 2, 1) = _c1[3] / 2.0;
      56          12 :   _l1(1, 2, 1, 2) = _c1[3] / 2.0;
      57          12 :   _l1(2, 1, 1, 2) = _c1[3] / 2.0;
      58          12 :   _l1(2, 1, 2, 1) = _c1[3] / 2.0;
      59             : 
      60          12 :   _l2(0, 0, 0, 0) = (_c2[1] + _c2[2]) / 3.0;
      61          12 :   _l2(0, 0, 1, 1) = -_c2[2] / 3.0;
      62          12 :   _l2(0, 0, 2, 2) = -_c2[1] / 3.0;
      63          12 :   _l2(1, 1, 0, 0) = -_c2[2] / 3.0;
      64          12 :   _l2(1, 1, 1, 1) = (_c2[0] + _c2[2]) / 3.0;
      65          12 :   _l2(1, 1, 2, 2) = -_c2[0] / 3.0;
      66          12 :   _l2(2, 2, 0, 0) = -_c2[1] / 3.0;
      67          12 :   _l2(2, 2, 1, 1) = -_c2[0] / 3.0;
      68          12 :   _l2(2, 2, 2, 2) = (_c2[0] + _c2[1]) / 3.0;
      69          12 :   _l2(0, 1, 1, 0) = _c2[5] / 2.0;
      70          12 :   _l2(0, 1, 0, 1) = _c2[5] / 2.0;
      71          12 :   _l2(1, 0, 1, 0) = _c2[5] / 2.0;
      72          12 :   _l2(1, 0, 0, 1) = _c2[5] / 2.0;
      73          12 :   _l2(0, 2, 0, 2) = _c2[4] / 2.0;
      74          12 :   _l2(0, 2, 2, 0) = _c2[4] / 2.0;
      75          12 :   _l2(2, 0, 2, 0) = _c2[4] / 2.0;
      76          12 :   _l2(2, 0, 0, 2) = _c2[4] / 2.0;
      77          12 :   _l2(1, 2, 2, 1) = _c2[3] / 2.0;
      78          12 :   _l2(1, 2, 1, 2) = _c2[3] / 2.0;
      79          12 :   _l2(2, 1, 1, 2) = _c2[3] / 2.0;
      80          12 :   _l2(2, 1, 2, 1) = _c2[3] / 2.0;
      81          12 : }
      82             : 
      83             : Real
      84        8576 : SolidMechanicsPlasticOrthotropic::yieldFunction(const RankTwoTensor & stress, Real intnl) const
      85             : {
      86        8576 :   const RankTwoTensor j2prime = _l1 * stress;
      87        8576 :   const RankTwoTensor j3prime = _l2 * stress;
      88        8576 :   return _b * stress.trace() +
      89        8576 :          std::pow(std::pow(-j2prime.generalSecondInvariant(), 3.0 / 2.0) - j3prime.det(),
      90             :                   1.0 / 3.0) -
      91        8576 :          yieldStrength(intnl);
      92             : }
      93             : 
      94             : RankTwoTensor
      95        6912 : SolidMechanicsPlasticOrthotropic::dyieldFunction_dstress(const RankTwoTensor & stress,
      96             :                                                          Real /*intnl*/) const
      97             : {
      98        6912 :   const RankTwoTensor j2prime = _l1 * stress;
      99        6912 :   const RankTwoTensor j3prime = _l2 * stress;
     100        6912 :   const Real j2 = -j2prime.generalSecondInvariant();
     101        6912 :   const Real j3 = j3prime.det();
     102        6912 :   return _b * dI_sigma() + dphi_dj2(j2, j3) * _l1.innerProductTranspose(dj2_dSkl(j2prime)) +
     103        6912 :          dphi_dj3(j2, j3) * _l2.innerProductTranspose(j3prime.ddet());
     104             : }
     105             : 
     106             : RankFourTensor
     107        1728 : SolidMechanicsPlasticOrthotropic::dflowPotential_dstress(const RankTwoTensor & stress,
     108             :                                                          Real /*intnl*/) const
     109             : {
     110        1728 :   if (_associative)
     111             :   {
     112        1728 :     const RankTwoTensor j2prime = _l1 * stress;
     113        1728 :     const RankTwoTensor j3prime = _l2 * stress;
     114        1728 :     const RankTwoTensor dj2 = dj2_dSkl(j2prime);
     115        1728 :     const RankTwoTensor dj3 = j3prime.ddet();
     116        1728 :     const Real j2 = -j2prime.generalSecondInvariant();
     117        1728 :     const Real j3 = j3prime.det();
     118             :     const RankFourTensor dr =
     119        1728 :         dfj2_dj2(j2, j3) *
     120        1728 :             _l1.innerProductTranspose(dj2).outerProduct(_l1.innerProductTranspose(dj2)) +
     121        1728 :         dfj2_dj3(j2, j3) *
     122        3456 :             _l1.innerProductTranspose(dj2).outerProduct(_l2.innerProductTranspose(dj3)) +
     123        1728 :         dfj3_dj2(j2, j3) *
     124        3456 :             _l2.innerProductTranspose(dj3).outerProduct(_l1.innerProductTranspose(dj2)) +
     125        1728 :         dfj3_dj3(j2, j3) *
     126        3456 :             _l2.innerProductTranspose(dj3).outerProduct(_l2.innerProductTranspose(dj3));
     127        1728 :     const RankTwoTensor r = _b * dI_sigma() +
     128        1728 :                             dphi_dj2(j2, j3) * _l1.innerProductTranspose(dj2_dSkl(j2prime)) +
     129        1728 :                             dphi_dj3(j2, j3) * _l2.innerProductTranspose(j3prime.ddet());
     130        1728 :     const Real norm = r.L2norm();
     131        3456 :     return dr / norm - (r / Utility::pow<3>(norm)).outerProduct(dr.innerProductTranspose(r));
     132             :   }
     133             :   else
     134           0 :     return SolidMechanicsPlasticJ2::dflowPotential_dstress(stress, 0);
     135             : }
     136             : 
     137             : RankTwoTensor
     138        5184 : SolidMechanicsPlasticOrthotropic::flowPotential(const RankTwoTensor & stress, Real intnl) const
     139             : {
     140        5184 :   if (_associative)
     141             :   {
     142        5184 :     const RankTwoTensor a = dyieldFunction_dstress(stress, intnl);
     143        5184 :     return a / a.L2norm();
     144             :   }
     145             :   else
     146           0 :     return SolidMechanicsPlasticJ2::dyieldFunction_dstress(stress, intnl);
     147             : }

Generated by: LCOV version 1.14