LCOV - code coverage report
Current view: top level - src/materials - RankTwoInvariant.C (source / functions) Hit Total Coverage
Test: idaholab/moose solid_mechanics: f45d79 Lines: 35 37 94.6 %
Date: 2025-07-25 05:00:39 Functions: 7 8 87.5 %
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 "RankTwoInvariant.h"
      11             : #include "RankTwoScalarTools.h"
      12             : 
      13             : #include "metaphysicl/raw_type.h"
      14             : 
      15             : registerMooseObject("SolidMechanicsApp", RankTwoInvariant);
      16             : registerMooseObject("SolidMechanicsApp", ADRankTwoInvariant);
      17             : 
      18             : template <bool is_ad>
      19             : InputParameters
      20        6040 : RankTwoInvariantTempl<is_ad>::validParams()
      21             : {
      22        6040 :   InputParameters params = Material::validParams();
      23        6040 :   params.addClassDescription("Compute a invariant property of a RankTwoTensor");
      24       12080 :   params.addRequiredParam<MaterialPropertyName>("rank_two_tensor",
      25             :                                                 "The rank two material tensor name");
      26       12080 :   params.addRequiredParam<MaterialPropertyName>(
      27             :       "property_name", "Name of the material property computed by this model");
      28       12080 :   MooseEnum mixedInvariants(
      29             :       "VonMisesStress EffectiveStrain Hydrostatic L2norm VolumetricStrain FirstInvariant "
      30             :       "SecondInvariant ThirdInvariant TriaxialityStress MaxShear StressIntensity MaxPrincipal "
      31             :       "MidPrincipal MinPrincipal");
      32             : 
      33       12080 :   params.addParam<MooseEnum>("invariant", mixedInvariants, "Type of invariant output");
      34             : 
      35        6040 :   return params;
      36        6040 : }
      37             : 
      38             : template <bool is_ad>
      39        4530 : RankTwoInvariantTempl<is_ad>::RankTwoInvariantTempl(const InputParameters & parameters)
      40             :   : Material(parameters),
      41        4530 :     _invariant(
      42        9060 :         getParam<MooseEnum>("invariant").template getEnum<RankTwoScalarTools::InvariantType>()),
      43        4530 :     _stateful(_invariant == RankTwoScalarTools::InvariantType::EffectiveStrain),
      44        4530 :     _tensor(getGenericMaterialProperty<RankTwoTensor, is_ad>("rank_two_tensor")),
      45        4548 :     _tensor_old(_stateful ? &getMaterialPropertyOld<RankTwoTensor>("rank_two_tensor") : nullptr),
      46        9060 :     _property(declareGenericProperty<Real, is_ad>("property_name")),
      47        9078 :     _property_old(_stateful ? &getMaterialPropertyOld<Real>("property_name") : nullptr)
      48             : {
      49        4530 : }
      50             : 
      51             : template <bool is_ad>
      52             : void
      53          64 : RankTwoInvariantTempl<is_ad>::initQpStatefulProperties()
      54             : {
      55          64 :   _property[_qp] = 0.0;
      56          64 : }
      57             : 
      58             : template <bool is_ad>
      59             : void
      60    35364748 : RankTwoInvariantTempl<is_ad>::computeQpProperties()
      61             : {
      62    35364748 :   switch (_invariant)
      63             :   {
      64             :     case RankTwoScalarTools::InvariantType::MaxPrincipal:
      65             :     case RankTwoScalarTools::InvariantType::MidPrincipal:
      66             :     case RankTwoScalarTools::InvariantType::MinPrincipal:
      67             :     {
      68             :       Point dummy_direction;
      69       86976 :       _property[_qp] = RankTwoScalarTools::getPrincipalComponent(
      70       86976 :           MetaPhysicL::raw_value(_tensor[_qp]), _invariant, dummy_direction);
      71             :       break;
      72             :     }
      73             : 
      74    35277004 :     case RankTwoScalarTools::InvariantType::VonMisesStress:
      75             :     case RankTwoScalarTools::InvariantType::Hydrostatic:
      76             :     case RankTwoScalarTools::InvariantType::L2norm:
      77             :     case RankTwoScalarTools::InvariantType::VolumetricStrain:
      78             :     case RankTwoScalarTools::InvariantType::FirstInvariant:
      79             :     case RankTwoScalarTools::InvariantType::SecondInvariant:
      80             :     case RankTwoScalarTools::InvariantType::ThirdInvariant:
      81             :     case RankTwoScalarTools::InvariantType::TriaxialityStress:
      82             :     case RankTwoScalarTools::InvariantType::MaxShear:
      83             :     case RankTwoScalarTools::InvariantType::StressIntensity:
      84             :     {
      85    35277004 :       _property[_qp] =
      86    35277004 :           RankTwoScalarTools::getInvariant(MetaPhysicL::raw_value(_tensor[_qp]), _invariant);
      87    35277004 :       break;
      88             :     }
      89             : 
      90         768 :     case RankTwoScalarTools::InvariantType::EffectiveStrain:
      91             :     {
      92             :       mooseAssert(_tensor_old, "The selected invariant requires the input material to be stateful");
      93             :       mooseAssert(_property_old,
      94             :                   "The selected invariant requires the output material to be stateful");
      95        1536 :       _property[_qp] = (*_property_old)[_qp] + RankTwoScalarTools::effectiveStrain(
      96         768 :                                                    MetaPhysicL::raw_value(_tensor[_qp]) -
      97         768 :                                                    MetaPhysicL::raw_value((*_tensor_old)[_qp]));
      98         768 :       break;
      99             :     }
     100             : 
     101           0 :     default:
     102           0 :       mooseError("Not a recognized invariant for RankTwoInvariant");
     103             :   }
     104    35364748 : }
     105             : 
     106             : template class RankTwoInvariantTempl<false>;
     107             : template class RankTwoInvariantTempl<true>;

Generated by: LCOV version 1.14