https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
15registerMooseObject("SolidMechanicsApp", InertialForce);
17
18template <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
51template <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
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
112template <bool is_ad>
113std::pair<GenericReal<is_ad>, GenericReal<is_ad>>
115 const Real u_old,
116 const Real vel_old,
117 const Real accel_old,
118 const Real beta,
119 const Real gamma,
120 const Real dt)
121{
122 const auto accel =
123 1.0 / beta * (((u - u_old) / (dt * dt)) - vel_old / dt - accel_old * (0.5 - beta));
124 const auto vel = vel_old + (dt * (1.0 - gamma)) * accel_old + gamma * dt * accel;
125 return {vel, accel};
126}
127
128template <bool is_ad>
131{
132 if (_dt == 0)
133 return 0;
134 else if (_has_beta)
135 {
136 const auto [vel, accel] = computeNewmarkBetaVelAccel(
137 _u[_qp], (*_u_old)[_qp], (*_vel_old)[_qp], (*_accel_old)[_qp], _beta, _gamma, _dt);
138 return _test[_i][_qp] * _density[_qp] *
139 (accel + vel * _eta[_qp] * (1.0 + _alpha) - _alpha * _eta[_qp] * (*_vel_old)[_qp]);
140 }
141
142 // Lumped mass option
143 // Only lumping the masses here
144 // will multiply by corresponding residual multiplier after lumping the matrix
145 // Density scaling is a fictitious added density to increase the time step
146 else if (_time_integrator.isLumped() && _time_integrator.isExplicit() && !is_ad)
147 return _test[_i][_qp] * (_density[_qp] + _density_scaling[_qp]);
148
149 // Consistent mass option
150 // Same for explicit, implicit, and implicit with HHT
151 else
152 return _test[_i][_qp] * _density[_qp] *
153 ((*_u_dotdot_factor)[_qp] + (*_u_dot_factor)[_qp] * _eta[_qp] * (1.0 + _alpha) -
154 _alpha * _eta[_qp] * (*_u_dot_old)[_qp]);
155}
156
157template <>
158void
163
164template <>
165void
167{
168 if (_dt == 0)
169 return;
170
171 // Explicit lumped only
172 if (!_time_integrator.isLumped() || !_time_integrator.isExplicit())
173 return;
174
175 for (unsigned int i = 0; i < _test.size(); ++i)
176 this->_local_re(i) *= (*_u_dotdot_factor_dof)[i] + _eta[0] * (*_u_dot_factor_dof)[i];
177}
178
179template <>
180Real
185
186template <>
187Real
189{
190 if (_dt == 0)
191 return 0;
192 else
193 {
194 if (_has_beta)
195 return _test[_i][_qp] * _density[_qp] / (_beta * _dt * _dt) * _phi[this->_j][_qp] +
196 _eta[_qp] * (1 + _alpha) * _test[_i][_qp] * _density[_qp] * _gamma / _beta / _dt *
197 _phi[this->_j][_qp];
198 else
199 return _test[_i][_qp] * _density[_qp] * (*_du_dotdot_du)[_qp] * _phi[this->_j][_qp] +
200 _eta[_qp] * (1 + _alpha) * _test[_i][_qp] * _density[_qp] * (*_du_dot_du)[_qp] *
201 _phi[this->_j][_qp];
202 }
203}
204
205template class InertialForceTempl<false>;
206template class InertialForceTempl<true>;
registerMooseObject("SolidMechanicsApp", InertialForce)
typename std::conditional< is_ad, ADTimeKernel, TimeKernel >::type InertialForceParent
void mooseError(Args &&... args)
Moose::GenericType< Real, is_ad > GenericReal
const bool _has_gamma
const TimeIntegrator & _time_integrator
The TimeIntegrator.
const VariableValue * _u_dot_old
static InputParameters validParams()
const VariableValue * _u_dot_factor
InertialForceTempl(const InputParameters &parameters)
const VariableValue * _accel_old
virtual Real computeQpJacobian()
const bool _has_velocity
const VariableValue * _u_old
const VariableValue * _du_dot_du
const VariableValue * _u_dotdot_factor
const VariableValue * _vel_old
static std::pair< GenericReal< is_ad >, GenericReal< is_ad > > computeNewmarkBetaVelAccel(const GenericReal< is_ad > &u, const Real u_old, const Real vel_old, const Real accel_old, const Real beta, const Real gamma, const Real dt)
virtual GenericReal< is_ad > computeQpResidual()
const VariableValue * _u_dot_factor_dof
const VariableValue * _u_dotdot_factor_dof
virtual void computeResidualAdditional()
const bool _has_acceleration
const VariableValue * _du_dotdot_du
bool isParamSetByUser(const std::string &name) const
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)
T & set(const std::string &name, bool quiet_mode=false)
void addCoupledVar(const std::string &name, const std::string &doc_string)
TagID uDotDotFactorTag() const
TagID uDotFactorTag() const
virtual const bool & isLumped() const
virtual bool isExplicit() const