https://mooseframework.inl.gov
InertialForce.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 "InertialForce.h"
11 #include "SubProblem.h"
12 #include "TimeIntegrator.h"
13 #include "NonlinearSystemBase.h"
14 
15 registerMooseObject("SolidMechanicsApp", InertialForce);
16 registerMooseObject("SolidMechanicsApp", ADInertialForce);
17 
18 template <bool is_ad>
21 {
23  params.addClassDescription("Calculates the residual for the inertial force "
24  "($M \\cdot acceleration$) and the contribution of mass"
25  " dependent Rayleigh damping and HHT time "
26  " integration scheme ($\\eta \\cdot M \\cdot"
27  " ((1+\\alpha)velq2-\\alpha \\cdot vel-old) $)");
28  params.set<bool>("use_displaced_mesh") = true;
29  params.addCoupledVar("velocity", "velocity variable");
30  params.addCoupledVar("acceleration", "acceleration variable");
31  params.addParam<Real>("beta", "beta parameter for Newmark Time integration");
32  params.addParam<Real>("gamma", "gamma parameter for Newmark Time integration");
33  params.addParam<MaterialPropertyName>("eta",
34  0.0,
35  "Name of material property or a constant real "
36  "number defining the eta parameter for the "
37  "Rayleigh damping.");
38  params.addParam<MaterialPropertyName>(
39  "density_scaling",
40  0.0,
41  "Name of material property to add mass scaling in explicit simulations.");
42  params.addParam<Real>("alpha",
43  0,
44  "alpha parameter for mass dependent numerical damping induced "
45  "by HHT time integration scheme");
46  params.addParam<MaterialPropertyName>(
47  "density", "density", "Name of Material Property that provides the density");
48  return params;
49 }
50 
51 template <bool is_ad>
53  : InertialForceParent<is_ad>(parameters),
54  _density(this->template getGenericMaterialProperty<Real, is_ad>("density")),
55  _has_beta(this->isParamValid("beta")),
56  _has_gamma(this->isParamValid("gamma")),
57  _beta(_has_beta ? this->template getParam<Real>("beta") : 0.1),
58  _gamma(_has_gamma ? this->template getParam<Real>("gamma") : 0.1),
59  _has_velocity(this->isParamValid("velocity")),
60  _has_acceleration(this->isParamValid("acceleration")),
61  _eta(this->template getGenericMaterialProperty<Real, is_ad>("eta")),
62  _density_scaling(this->template getMaterialProperty<Real>("density_scaling")),
63  _alpha(this->template getParam<Real>("alpha")),
64  _time_integrator(_sys.getTimeIntegrator(this->_var.number()))
65 {
67  {
68  _vel_old = &this->coupledValueOld("velocity");
69  _accel_old = &this->coupledValueOld("acceleration");
70  _u_old = &this->valueOld();
71  }
73  {
74  _u_dot_old = &(_var.uDotOld());
75  _du_dot_du = &(_var.duDotDu());
76  _du_dotdot_du = &(_var.duDotDotDu());
77 
78  this->addFEVariableCoupleableVectorTag(_time_integrator.uDotFactorTag());
79  this->addFEVariableCoupleableVectorTag(_time_integrator.uDotDotFactorTag());
80 
81  _u_dot_factor = &_var.vectorTagValue(_time_integrator.uDotFactorTag());
82  _u_dotdot_factor = &_var.vectorTagValue(_time_integrator.uDotDotFactorTag());
83 
85  {
86  _u_dot_factor_dof = &_var.vectorTagDofValue(_time_integrator.uDotFactorTag());
87  _u_dotdot_factor_dof = &_var.vectorTagDofValue(_time_integrator.uDotDotFactorTag());
88  }
89  }
90  else
91  mooseError("InertialForce: Either all or none of `beta`, `gamma`, `velocity`and `acceleration` "
92  "should be provided as input.");
93 
94  // Check if HHT and explicit are being used simultaneously
95  if (_alpha != 0 && _time_integrator.isExplicit())
96  mooseError("InertialForce: HHT time integration parameter can only be used with Newmark-Beta "
97  "time integration.");
98 
99  // Check if beta and explicit are being used simultaneously
101  mooseError("InertialForce: Newmark-beta integration parameter, beta, cannot be provided along "
102  "with an explicit time "
103  "integrator.");
104 
106  if (parameters.isParamSetByUser("density_scaling"))
107  this->paramError(
108  "density_scaling",
109  "Density (mass) scaling can only be used in lumped mass, explicit simulations");
110 }
111 
112 template <bool is_ad>
115 {
116  if (_dt == 0)
117  return 0;
118  else if (_has_beta)
119  {
120  auto accel = 1.0 / _beta *
121  (((_u[_qp] - (*_u_old)[_qp]) / (_dt * _dt)) - (*_vel_old)[_qp] / _dt -
122  (*_accel_old)[_qp] * (0.5 - _beta));
123  auto vel =
124  (*_vel_old)[_qp] + (_dt * (1.0 - _gamma)) * (*_accel_old)[_qp] + _gamma * _dt * accel;
125  return _test[_i][_qp] * _density[_qp] *
126  (accel + vel * _eta[_qp] * (1.0 + _alpha) - _alpha * _eta[_qp] * (*_vel_old)[_qp]);
127  }
128 
129  // Lumped mass option
130  // Only lumping the masses here
131  // will multiply by corresponding residual multiplier after lumping the matrix
132  // Density scaling is a fictitious added density to increase the time step
133  else if (_time_integrator.isLumped() && _time_integrator.isExplicit() && !is_ad)
134  return _test[_i][_qp] * (_density[_qp] + _density_scaling[_qp]);
135 
136  // Consistent mass option
137  // Same for explicit, implicit, and implicit with HHT
138  else
139  return _test[_i][_qp] * _density[_qp] *
140  ((*_u_dotdot_factor)[_qp] + (*_u_dot_factor)[_qp] * _eta[_qp] * (1.0 + _alpha) -
141  _alpha * _eta[_qp] * (*_u_dot_old)[_qp]);
142 }
143 
144 template <>
145 void
147 {
148  mooseError("Internal error");
149 }
150 
151 template <>
152 void
154 {
155  if (_dt == 0)
156  return;
157 
158  // Explicit lumped only
159  if (!_time_integrator.isLumped() || !_time_integrator.isExplicit())
160  return;
161 
162  for (unsigned int i = 0; i < _test.size(); ++i)
163  this->_local_re(i) *= (*_u_dotdot_factor_dof)[i] + _eta[0] * (*_u_dot_factor_dof)[i];
164 }
165 
166 template <>
167 Real
169 {
170  mooseError("Internal error");
171 }
172 
173 template <>
174 Real
176 {
177  if (_dt == 0)
178  return 0;
179  else
180  {
181  if (_has_beta)
182  return _test[_i][_qp] * _density[_qp] / (_beta * _dt * _dt) * _phi[this->_j][_qp] +
183  _eta[_qp] * (1 + _alpha) * _test[_i][_qp] * _density[_qp] * _gamma / _beta / _dt *
184  _phi[this->_j][_qp];
185  else
186  return _test[_i][_qp] * _density[_qp] * (*_du_dotdot_du)[_qp] * _phi[this->_j][_qp] +
187  _eta[_qp] * (1 + _alpha) * _test[_i][_qp] * _density[_qp] * (*_du_dot_du)[_qp] *
188  _phi[this->_j][_qp];
189  }
190 }
191 
192 template class InertialForceTempl<false>;
193 template class InertialForceTempl<true>;
Moose::GenericType< Real, is_ad > GenericReal
const bool _has_gamma
Definition: InertialForce.h:44
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void mooseError(Args &&... args)
const VariableValue * _u_dot_factor
Definition: InertialForce.h:56
T & set(const std::string &name, bool quiet_mode=false)
const VariableValue * _u_dot_factor_dof
Definition: InertialForce.h:54
virtual void computeResidualAdditional()
const VariableValue * _u_dotdot_factor_dof
Definition: InertialForce.h:55
const VariableValue * _accel_old
Definition: InertialForce.h:42
const VariableValue * _vel_old
Definition: InertialForce.h:41
typename std::conditional< is_ad, ADTimeKernel, TimeKernel >::type InertialForceParent
Definition: InertialForce.h:21
registerMooseObject("SolidMechanicsApp", InertialForce)
virtual bool isExplicit() const
static InputParameters validParams()
Definition: InertialForce.C:20
const VariableValue * _u_dot_old
Definition: InertialForce.h:58
const VariableValue * _u_old
Definition: InertialForce.h:40
const TimeIntegrator & _time_integrator
The TimeIntegrator.
Definition: InertialForce.h:63
InputParameters validParams()
const VariableValue * _u_dotdot_factor
Definition: InertialForce.h:57
const VariableValue * _du_dot_du
Definition: InertialForce.h:59
TagID uDotDotFactorTag() const
const bool _has_velocity
Definition: InertialForce.h:47
void addCoupledVar(const std::string &name, const std::string &doc_string)
bool isParamSetByUser(const std::string &name) const
virtual GenericReal< is_ad > computeQpResidual()
const bool _has_acceleration
Definition: InertialForce.h:48
TagID uDotFactorTag() const
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const bool _has_beta
Definition: InertialForce.h:43
virtual const bool & isLumped() const
const VariableValue * _du_dotdot_du
Definition: InertialForce.h:60
void addClassDescription(const std::string &doc_string)
InertialForceTempl(const InputParameters &parameters)
Definition: InertialForce.C:52
virtual Real computeQpJacobian()