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

Generated by: LCOV version 1.14