LCOV - code coverage report
Current view: top level - src/materials - StrainEnergyDensity.C (source / functions) Hit Total Coverage
Test: idaholab/moose tensor_mechanics: d6b47a Lines: 42 43 97.7 %
Date: 2024-02-27 11:53:14 Functions: 10 10 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 "StrainEnergyDensity.h"
      11             : #include "RankTwoTensor.h"
      12             : #include "MooseMesh.h"
      13             : 
      14             : registerMooseObject("TensorMechanicsApp", StrainEnergyDensity);
      15             : registerMooseObject("TensorMechanicsApp", ADStrainEnergyDensity);
      16             : 
      17             : template <bool is_ad>
      18             : InputParameters
      19         696 : StrainEnergyDensityTempl<is_ad>::validParams()
      20             : {
      21         696 :   InputParameters params = Material::validParams();
      22         696 :   params.addClassDescription("Computes the strain energy density using a combination of the "
      23             :                              "elastic and inelastic components of the strain increment, which is a "
      24             :                              "valid assumption for monotonic behavior.");
      25        1392 :   params.addParam<std::string>("base_name",
      26             :                                "Optional parameter that allows the user to define "
      27             :                                "multiple mechanics material systems on the same "
      28             :                                "block, i.e. for multiple phases");
      29        1392 :   params.addParam<std::string>("stress_name",
      30             :                                "stress",
      31             :                                "Optional parameter that allows the user to use "
      32             :                                "different stresses on the same material system. "
      33             :                                "For example, when we have a degraded_stress and an intact_stress, "
      34             :                                "we want to compute the degraded strain energy density and "
      35             :                                "the intact strain energy density.");
      36        1392 :   params.addParam<bool>(
      37             :       "incremental",
      38             :       "Optional flag for error checking if an incremental or total model should be used.");
      39         696 :   return params;
      40           0 : }
      41             : 
      42             : template <bool is_ad>
      43         522 : StrainEnergyDensityTempl<is_ad>::StrainEnergyDensityTempl(const InputParameters & parameters)
      44             :   : DerivativeMaterialInterface<Material>(parameters),
      45         522 :     _base_name(isParamValid("base_name") ? getParam<std::string>("base_name") + "_" : ""),
      46        1044 :     _stress_name(getParam<std::string>("stress_name")),
      47         522 :     _strain_energy_density(declareProperty<Real>(_base_name + "strain_energy_density")),
      48        1044 :     _strain_energy_density_old(getMaterialPropertyOld<Real>(_base_name + "strain_energy_density")),
      49         522 :     _stress(getGenericMaterialProperty<RankTwoTensor, is_ad>(_base_name + _stress_name)),
      50        1044 :     _stress_old(getMaterialPropertyOld<RankTwoTensor>(_base_name + _stress_name)),
      51         522 :     _mechanical_strain(
      52         522 :         getGenericMaterialProperty<RankTwoTensor, is_ad>(_base_name + "mechanical_strain")),
      53         522 :     _strain_increment(
      54        1044 :         getGenericOptionalMaterialProperty<RankTwoTensor, is_ad>(_base_name + "strain_increment"))
      55             : {
      56         522 : }
      57             : 
      58             : template <bool is_ad>
      59             : void
      60         515 : StrainEnergyDensityTempl<is_ad>::initialSetup()
      61             : {
      62             :   // optional error checking
      63        1030 :   if (isParamValid("incremental"))
      64             :   {
      65        1030 :     auto incremental = getParam<bool>("incremental");
      66         515 :     if (incremental && !_strain_increment)
      67           1 :       mooseError("StrainEnergyDensity: Specified incremental = true, but material model is "
      68             :                  "not incremental.");
      69         514 :     if (!incremental && _strain_increment)
      70           1 :       mooseError("StrainEnergyDensity: Specified incremental = false, but material model is "
      71             :                  "incremental.");
      72             :   }
      73         513 : }
      74             : template <bool is_ad>
      75             : void
      76      262888 : StrainEnergyDensityTempl<is_ad>::initQpStatefulProperties()
      77             : {
      78      262888 :   _strain_energy_density[_qp] = 0.0;
      79      262888 : }
      80             : 
      81             : template <bool is_ad>
      82             : void
      83     7699792 : StrainEnergyDensityTempl<is_ad>::computeQpProperties()
      84             : {
      85             : 
      86     7699792 :   if (_strain_increment)
      87     7507064 :     _strain_energy_density[_qp] =
      88     7507064 :         _strain_energy_density_old[_qp] +
      89     7507064 :         MetaPhysicL::raw_value(_stress[_qp])
      90    15014128 :                 .doubleContraction(MetaPhysicL::raw_value(_strain_increment[_qp])) /
      91     7507064 :             2.0 +
      92     7507064 :         _stress_old[_qp].doubleContraction(MetaPhysicL::raw_value(_strain_increment[_qp])) / 2.0;
      93             :   else
      94      192728 :     _strain_energy_density[_qp] =
      95      192728 :         MetaPhysicL::raw_value(_stress[_qp])
      96      192728 :             .doubleContraction((MetaPhysicL::raw_value(_mechanical_strain[_qp]))) /
      97             :         2.0;
      98     7699792 : }
      99             : 
     100             : template class StrainEnergyDensityTempl<false>;
     101             : template class StrainEnergyDensityTempl<true>;

Generated by: LCOV version 1.14