https://mooseframework.inl.gov
PorosityFromStrain.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 "PorosityFromStrain.h"
11 
12 registerMooseObject("SolidMechanicsApp", PorosityFromStrain);
13 registerMooseObject("SolidMechanicsApp", ADPorosityFromStrain);
14 
15 template <bool is_ad>
18 {
20 
21  params.addClassDescription("Porosity calculation from the inelastic strain.");
22 
23  params.addParam<MaterialPropertyName>(
24  "porosity_name", "porosity", "Name of porosity material property");
26  "initial_porosity", "initial_porosity>=0.0 & initial_porosity<1.0", "Initial porosity");
27  params.addRequiredParam<MaterialPropertyName>("inelastic_strain",
28  "Name of the combined inelastic strain");
29  MooseEnum negative_behavior("ZERO INITIAL_CONDITION EXCEPTION", "INITIAL_CONDITION");
30  params.addParam<MooseEnum>(
31  "negative_behavior", negative_behavior, "Enum how to handle negative porosities");
32 
33  return params;
34 }
35 
36 template <bool is_ad>
38  : Material(parameters),
39  _porosity(declareGenericProperty<Real, is_ad>(getParam<MaterialPropertyName>("porosity_name"))),
40  _porosity_old(getMaterialPropertyOld<Real>("porosity_name")),
41  _initial_porosity(getParam<Real>("initial_porosity")),
42  _inelastic_strain(getGenericMaterialProperty<RankTwoTensor, is_ad>("inelastic_strain")),
43  _inelastic_strain_old(getMaterialPropertyOld<RankTwoTensor>("inelastic_strain")),
44  _negative_behavior(this->template getParam<MooseEnum>("negative_behavior")
45  .template getEnum<NegativeBehavior>())
46 {
47 }
48 
49 template <bool is_ad>
50 void
52 {
53  _porosity[_qp] = _initial_porosity;
54 }
55 
56 template <bool is_ad>
57 void
59 {
60  _porosity[_qp] =
61  (1.0 - _porosity_old[_qp]) * (_inelastic_strain[_qp] - _inelastic_strain_old[_qp]).trace() +
62  _porosity_old[_qp];
63 
64  if (_porosity[_qp] < 0.0)
65  {
66  if (_negative_behavior == NegativeBehavior::ZERO)
67  _porosity[_qp] = 0.0;
68  if (_negative_behavior == NegativeBehavior::INITIAL_CONDITION)
69  _porosity[_qp] = _initial_porosity;
70  if (_negative_behavior == NegativeBehavior::EXCEPTION)
71  mooseException("In ", _name, ": porosity is negative.");
72  }
73 
74  if (std::isnan(_porosity[_qp]))
75  mooseException("In ", _name, ": porosity is nan. Cutting timestep.");
76 }
void addRequiredRangeCheckedParam(const std::string &name, const std::string &parsed_function, const std::string &doc_string)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
Porosity calculation from the inelastic strain.
void addRequiredParam(const std::string &name, const std::string &doc_string)
static InputParameters validParams()
static InputParameters validParams()
virtual void computeQpProperties() override
virtual void initQpStatefulProperties() override
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
registerMooseObject("SolidMechanicsApp", PorosityFromStrain)
void addClassDescription(const std::string &doc_string)
PorosityFromStrainTempl(const InputParameters &parameters)