https://mooseframework.inl.gov
Loading...
Searching...
No Matches
StrainEnergyDensity.C
Go to the documentation of this file.
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 "StrainEnergyDensity.h"
11#include "RankTwoTensor.h"
12#include "MooseMesh.h"
13
16
17template <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
42template <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
58template <bool is_ad>
59void
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}
74template <bool is_ad>
75void
77{
78 _strain_energy_density[_qp] = 0.0;
79}
80
81template <bool is_ad>
82void
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
101template class StrainEnergyDensityTempl<true>;
void mooseError(Args &&... args)
registerMooseObject("SolidMechanicsApp", StrainEnergyDensity)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
static InputParameters validParams()
StrainEnergyDensity calculates the strain energy density.
virtual void initQpStatefulProperties() override
StrainEnergyDensityTempl(const InputParameters &parameters)
virtual void computeQpProperties() override
static InputParameters validParams()
virtual void initialSetup() override
auto raw_value(const Eigen::Map< T > &in)