www.mooseframework.org
StrainEnergyDensity.C
Go to the documentation of this file.
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("SolidMechanicsApp", StrainEnergyDensity);
15 registerMooseObject("SolidMechanicsApp", ADStrainEnergyDensity);
16 
17 template <bool is_ad>
20 {
22  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  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  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  params.addParam<bool>(
37  "incremental",
38  "Optional flag for error checking if an incremental or total model should be used.");
39  return params;
40 }
41 
42 template <bool is_ad>
45  _base_name(isParamValid("base_name") ? getParam<std::string>("base_name") + "_" : ""),
46  _stress_name(getParam<std::string>("stress_name")),
47  _strain_energy_density(declareProperty<Real>(_base_name + "strain_energy_density")),
48  _strain_energy_density_old(getMaterialPropertyOld<Real>(_base_name + "strain_energy_density")),
49  _stress(getGenericMaterialProperty<RankTwoTensor, is_ad>(_base_name + _stress_name)),
50  _stress_old(getMaterialPropertyOld<RankTwoTensor>(_base_name + _stress_name)),
51  _mechanical_strain(
52  getGenericMaterialProperty<RankTwoTensor, is_ad>(_base_name + "mechanical_strain")),
53  _strain_increment(
54  getGenericOptionalMaterialProperty<RankTwoTensor, is_ad>(_base_name + "strain_increment"))
55 {
56 }
57 
58 template <bool is_ad>
59 void
61 {
62  // optional error checking
63  if (isParamValid("incremental"))
64  {
65  auto incremental = getParam<bool>("incremental");
66  if (incremental && !_strain_increment)
67  mooseError("StrainEnergyDensity: Specified incremental = true, but material model is "
68  "not incremental.");
69  if (!incremental && _strain_increment)
70  mooseError("StrainEnergyDensity: Specified incremental = false, but material model is "
71  "incremental.");
72  }
73 }
74 template <bool is_ad>
75 void
77 {
78  _strain_energy_density[_qp] = 0.0;
79 }
80 
81 template <bool is_ad>
82 void
84 {
85 
86  if (_strain_increment)
87  _strain_energy_density[_qp] =
88  _strain_energy_density_old[_qp] +
89  MetaPhysicL::raw_value(_stress[_qp])
90  .doubleContraction(MetaPhysicL::raw_value(_strain_increment[_qp])) /
91  2.0 +
92  _stress_old[_qp].doubleContraction(MetaPhysicL::raw_value(_strain_increment[_qp])) / 2.0;
93  else
94  _strain_energy_density[_qp] =
95  MetaPhysicL::raw_value(_stress[_qp])
96  .doubleContraction((MetaPhysicL::raw_value(_mechanical_strain[_qp]))) /
97  2.0;
98 }
99 
100 template class StrainEnergyDensityTempl<false>;
101 template class StrainEnergyDensityTempl<true>;
virtual void computeQpProperties() override
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void mooseError(Args &&... args)
auto raw_value(const Eigen::Map< T > &in)
virtual void initialSetup() override
StrainEnergyDensity calculates the strain energy density.
static InputParameters validParams()
static InputParameters validParams()
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual void initQpStatefulProperties() override
void addClassDescription(const std::string &doc_string)
StrainEnergyDensityTempl(const InputParameters &parameters)
registerMooseObject("SolidMechanicsApp", StrainEnergyDensity)