https://mooseframework.inl.gov
Public Member Functions | Static Public Member Functions | Protected Member Functions | Private Attributes | List of all members
InertialForceTempl< is_ad > Class Template Reference

#include <InertialForce.h>

Inheritance diagram for InertialForceTempl< is_ad >:
[legend]

Public Member Functions

 InertialForceTempl (const InputParameters &parameters)
 

Static Public Member Functions

static InputParameters validParams ()
 
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)
 

Protected Member Functions

virtual GenericReal< is_ad > computeQpResidual ()
 
virtual Real computeQpJacobian ()
 
virtual void computeResidualAdditional ()
 
template<>
void computeResidualAdditional ()
 
template<>
void computeResidualAdditional ()
 
template<>
Real computeQpJacobian ()
 
template<>
Real computeQpJacobian ()
 

Private Attributes

const GenericMaterialProperty< Real, is_ad > & _density
 
const VariableValue_u_old
 
const VariableValue_vel_old
 
const VariableValue_accel_old
 
const bool _has_beta
 
const bool _has_gamma
 
const Real _beta
 
const Real _gamma
 
const bool _has_velocity
 
const bool _has_acceleration
 
const GenericMaterialProperty< Real, is_ad > & _eta
 
const MaterialProperty< Real > & _density_scaling
 
const Real _alpha
 
const VariableValue_u_dot_factor_dof
 
const VariableValue_u_dotdot_factor_dof
 
const VariableValue_u_dot_factor
 
const VariableValue_u_dotdot_factor
 
const VariableValue_u_dot_old
 
const VariableValue_du_dot_du
 
const VariableValue_du_dotdot_du
 
const TimeIntegrator_time_integrator
 The TimeIntegrator. More...
 

Detailed Description

template<bool is_ad>
class InertialForceTempl< is_ad >

Definition at line 24 of file InertialForce.h.

Constructor & Destructor Documentation

◆ InertialForceTempl()

template<bool is_ad>
InertialForceTempl< is_ad >::InertialForceTempl ( const InputParameters parameters)

Definition at line 52 of file InertialForce.C.

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 }
const bool _has_gamma
Definition: InertialForce.h:53
void mooseError(Args &&... args)
const VariableValue * _u_dot_factor
Definition: InertialForce.h:65
const MaterialProperty< Real > & _density_scaling
Definition: InertialForce.h:59
const VariableValue * _u_dot_factor_dof
Definition: InertialForce.h:63
const GenericMaterialProperty< Real, is_ad > & _density
Definition: InertialForce.h:48
const VariableValue * _u_dotdot_factor_dof
Definition: InertialForce.h:64
const VariableValue * _accel_old
Definition: InertialForce.h:51
const VariableValue * _vel_old
Definition: InertialForce.h:50
typename std::conditional< is_ad, ADTimeKernel, TimeKernel >::type InertialForceParent
Definition: InertialForce.h:21
virtual bool isExplicit() const
const VariableValue * _u_dot_old
Definition: InertialForce.h:67
const VariableValue * _u_old
Definition: InertialForce.h:49
const TimeIntegrator & _time_integrator
The TimeIntegrator.
Definition: InertialForce.h:72
const VariableValue * _u_dotdot_factor
Definition: InertialForce.h:66
const VariableValue * _du_dot_du
Definition: InertialForce.h:68
TagID uDotDotFactorTag() const
const bool _has_velocity
Definition: InertialForce.h:56
bool isParamSetByUser(const std::string &name) const
const bool _has_acceleration
Definition: InertialForce.h:57
TagID uDotFactorTag() const
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const bool _has_beta
Definition: InertialForce.h:52
virtual const bool & isLumped() const
const VariableValue * _du_dotdot_du
Definition: InertialForce.h:69
const GenericMaterialProperty< Real, is_ad > & _eta
Definition: InertialForce.h:58

Member Function Documentation

◆ computeNewmarkBetaVelAccel()

template<bool is_ad>
std::pair< GenericReal< is_ad >, GenericReal< is_ad > > InertialForceTempl< 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 
)
static

Definition at line 114 of file InertialForce.C.

Referenced by ADPenaltyVelocityContinuityNewmarkBeta::solidVelocity().

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 }

◆ computeQpJacobian() [1/3]

template<bool is_ad>
virtual Real InertialForceTempl< is_ad >::computeQpJacobian ( )
protectedvirtual

◆ computeQpJacobian() [2/3]

template<>
Real InertialForceTempl< true >::computeQpJacobian ( )
protected

Definition at line 181 of file InertialForce.C.

182 {
183  mooseError("Internal error");
184 }
void mooseError(Args &&... args)

◆ computeQpJacobian() [3/3]

template<>
Real InertialForceTempl< false >::computeQpJacobian ( )
protected

Definition at line 188 of file InertialForce.C.

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 }
const GenericMaterialProperty< Real, is_ad > & _density
Definition: InertialForce.h:48
const VariableValue * _du_dot_du
Definition: InertialForce.h:68
const bool _has_beta
Definition: InertialForce.h:52
const GenericMaterialProperty< Real, is_ad > & _eta
Definition: InertialForce.h:58

◆ computeQpResidual()

template<bool is_ad>
GenericReal< is_ad > InertialForceTempl< is_ad >::computeQpResidual ( )
protectedvirtual

Definition at line 130 of file InertialForce.C.

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 }
const MaterialProperty< Real > & _density_scaling
Definition: InertialForce.h:59
const GenericMaterialProperty< Real, is_ad > & _density
Definition: InertialForce.h:48
const VariableValue * _accel_old
Definition: InertialForce.h:51
const VariableValue * _vel_old
Definition: InertialForce.h:50
virtual bool isExplicit() const
const VariableValue * _u_dot_old
Definition: InertialForce.h:67
const VariableValue * _u_old
Definition: InertialForce.h:49
const TimeIntegrator & _time_integrator
The TimeIntegrator.
Definition: InertialForce.h:72
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)
const bool _has_beta
Definition: InertialForce.h:52
virtual const bool & isLumped() const
const GenericMaterialProperty< Real, is_ad > & _eta
Definition: InertialForce.h:58

◆ computeResidualAdditional() [1/3]

template<bool is_ad>
virtual void InertialForceTempl< is_ad >::computeResidualAdditional ( )
protectedvirtual

◆ computeResidualAdditional() [2/3]

template<>
void InertialForceTempl< true >::computeResidualAdditional ( )
protected

Definition at line 159 of file InertialForce.C.

160 {
161  mooseError("Internal error");
162 }
void mooseError(Args &&... args)

◆ computeResidualAdditional() [3/3]

template<>
void InertialForceTempl< false >::computeResidualAdditional ( )
protected

Definition at line 166 of file InertialForce.C.

167 {
168  if (_dt == 0)
169  return;
170 
171  // Explicit lumped only
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 }
virtual bool isExplicit() const
const TimeIntegrator & _time_integrator
The TimeIntegrator.
Definition: InertialForce.h:72
virtual const bool & isLumped() const
const GenericMaterialProperty< Real, is_ad > & _eta
Definition: InertialForce.h:58

◆ validParams()

template<bool is_ad>
InputParameters InertialForceTempl< is_ad >::validParams ( )
static

Definition at line 20 of file InertialForce.C.

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 }
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
T & set(const std::string &name, bool quiet_mode=false)
InputParameters validParams()
void addCoupledVar(const std::string &name, const std::string &doc_string)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void addClassDescription(const std::string &doc_string)

Member Data Documentation

◆ _accel_old

template<bool is_ad>
const VariableValue* InertialForceTempl< is_ad >::_accel_old
private

Definition at line 51 of file InertialForce.h.

Referenced by InertialForceTempl< is_ad >::InertialForceTempl().

◆ _alpha

template<bool is_ad>
const Real InertialForceTempl< is_ad >::_alpha
private

Definition at line 60 of file InertialForce.h.

Referenced by InertialForceTempl< is_ad >::InertialForceTempl().

◆ _beta

template<bool is_ad>
const Real InertialForceTempl< is_ad >::_beta
private

Definition at line 54 of file InertialForce.h.

◆ _density

template<bool is_ad>
const GenericMaterialProperty<Real, is_ad>& InertialForceTempl< is_ad >::_density
private

Definition at line 48 of file InertialForce.h.

◆ _density_scaling

template<bool is_ad>
const MaterialProperty<Real>& InertialForceTempl< is_ad >::_density_scaling
private

Definition at line 59 of file InertialForce.h.

◆ _du_dot_du

template<bool is_ad>
const VariableValue* InertialForceTempl< is_ad >::_du_dot_du
private

Definition at line 68 of file InertialForce.h.

Referenced by InertialForceTempl< is_ad >::InertialForceTempl().

◆ _du_dotdot_du

template<bool is_ad>
const VariableValue* InertialForceTempl< is_ad >::_du_dotdot_du
private

Definition at line 69 of file InertialForce.h.

Referenced by InertialForceTempl< is_ad >::InertialForceTempl().

◆ _eta

template<bool is_ad>
const GenericMaterialProperty<Real, is_ad>& InertialForceTempl< is_ad >::_eta
private

Definition at line 58 of file InertialForce.h.

◆ _gamma

template<bool is_ad>
const Real InertialForceTempl< is_ad >::_gamma
private

Definition at line 55 of file InertialForce.h.

◆ _has_acceleration

template<bool is_ad>
const bool InertialForceTempl< is_ad >::_has_acceleration
private

Definition at line 57 of file InertialForce.h.

Referenced by InertialForceTempl< is_ad >::InertialForceTempl().

◆ _has_beta

template<bool is_ad>
const bool InertialForceTempl< is_ad >::_has_beta
private

Definition at line 52 of file InertialForce.h.

Referenced by InertialForceTempl< is_ad >::InertialForceTempl().

◆ _has_gamma

template<bool is_ad>
const bool InertialForceTempl< is_ad >::_has_gamma
private

Definition at line 53 of file InertialForce.h.

Referenced by InertialForceTempl< is_ad >::InertialForceTempl().

◆ _has_velocity

template<bool is_ad>
const bool InertialForceTempl< is_ad >::_has_velocity
private

Definition at line 56 of file InertialForce.h.

Referenced by InertialForceTempl< is_ad >::InertialForceTempl().

◆ _time_integrator

template<bool is_ad>
const TimeIntegrator& InertialForceTempl< is_ad >::_time_integrator
private

◆ _u_dot_factor

template<bool is_ad>
const VariableValue* InertialForceTempl< is_ad >::_u_dot_factor
private

Definition at line 65 of file InertialForce.h.

Referenced by InertialForceTempl< is_ad >::InertialForceTempl().

◆ _u_dot_factor_dof

template<bool is_ad>
const VariableValue* InertialForceTempl< is_ad >::_u_dot_factor_dof
private

Definition at line 63 of file InertialForce.h.

Referenced by InertialForceTempl< is_ad >::InertialForceTempl().

◆ _u_dot_old

template<bool is_ad>
const VariableValue* InertialForceTempl< is_ad >::_u_dot_old
private

Definition at line 67 of file InertialForce.h.

Referenced by InertialForceTempl< is_ad >::InertialForceTempl().

◆ _u_dotdot_factor

template<bool is_ad>
const VariableValue* InertialForceTempl< is_ad >::_u_dotdot_factor
private

Definition at line 66 of file InertialForce.h.

Referenced by InertialForceTempl< is_ad >::InertialForceTempl().

◆ _u_dotdot_factor_dof

template<bool is_ad>
const VariableValue* InertialForceTempl< is_ad >::_u_dotdot_factor_dof
private

Definition at line 64 of file InertialForce.h.

Referenced by InertialForceTempl< is_ad >::InertialForceTempl().

◆ _u_old

template<bool is_ad>
const VariableValue* InertialForceTempl< is_ad >::_u_old
private

Definition at line 49 of file InertialForce.h.

Referenced by InertialForceTempl< is_ad >::InertialForceTempl().

◆ _vel_old

template<bool is_ad>
const VariableValue* InertialForceTempl< is_ad >::_vel_old
private

Definition at line 50 of file InertialForce.h.

Referenced by InertialForceTempl< is_ad >::InertialForceTempl().


The documentation for this class was generated from the following files: