www.mooseframework.org
NodalTranslationalInertia.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
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 
11 #include "MooseVariable.h"
12 #include "AuxiliarySystem.h"
13 #include "MooseUtils.h"
14 #include "DelimitedFileReader.h"
15 
16 registerMooseObject("TensorMechanicsApp", NodalTranslationalInertia);
17 
19 
20 InputParameters
22 {
23  InputParameters params = TimeNodalKernel::validParams();
24  params.addClassDescription("Computes the inertial forces and mass proportional damping terms "
25  "corresponding to nodal mass.");
26  params.addCoupledVar("velocity", "velocity variable");
27  params.addCoupledVar("acceleration", "acceleration variable");
28  params.addRangeCheckedParam<Real>(
29  "beta", "beta>0.0", "beta parameter for Newmark Time integration");
30  params.addRangeCheckedParam<Real>(
31  "gamma", "gamma>0.0", "gamma parameter for Newmark Time integration");
32  params.addRangeCheckedParam<Real>("eta",
33  0.0,
34  "eta>=0.0",
35  "Constant real number defining the eta parameter for "
36  "Rayleigh damping.");
37  params.addRangeCheckedParam<Real>("alpha",
38  0.0,
39  "alpha >= -0.3333 & alpha <= 0.0",
40  "Alpha parameter for mass dependent numerical damping induced "
41  "by HHT time integration scheme");
42  params.addParam<Real>("mass", "Mass associated with the node");
43  params.addParam<FileName>(
44  "nodal_mass_file",
45  "The file containing the nodal positions and the corresponding nodal masses.");
46  return params;
47 }
48 
49 NodalTranslationalInertia::NodalTranslationalInertia(const InputParameters & parameters)
50  : TimeNodalKernel(parameters),
51  _has_mass(isParamValid("mass")),
52  _has_beta(isParamValid("beta")),
53  _has_gamma(isParamValid("gamma")),
54  _has_velocity(isParamValid("velocity")),
55  _has_acceleration(isParamValid("acceleration")),
56  _has_nodal_mass_file(isParamValid("nodal_mass_file")),
57  _mass(_has_mass ? getParam<Real>("mass") : 0.0),
58  _beta(_has_beta ? getParam<Real>("beta") : 0.1),
59  _gamma(_has_gamma ? getParam<Real>("gamma") : 0.1),
60  _eta(getParam<Real>("eta")),
61  _alpha(getParam<Real>("alpha"))
62 {
64  {
65  _u_old = &(_var.dofValuesOld());
66  _aux_sys = &(_fe_problem.getAuxiliarySystem());
67 
68  MooseVariable * vel_variable = getVar("velocity", 0);
69  _vel_num = vel_variable->number();
70  MooseVariable * accel_variable = getVar("acceleration", 0);
71  _accel_num = accel_variable->number();
72  }
74  {
75  _vel = &(_var.dofValuesDot());
76  _vel_old = &(_var.dofValuesDotOld());
77  _accel = &(_var.dofValuesDotDot());
78  _du_dot_du = &(_var.duDotDu());
79  _du_dotdot_du = &(_var.duDotDotDu());
80  }
81  else
82  mooseError("NodalTranslationalInertia: Either all or none of `beta`, `gamma`, `velocity` and "
83  "`acceleration` should be provided as input.");
84 
86  mooseError(
87  "NodalTranslationalInertia: Please provide either mass or nodal_mass_file as input.");
88  else if (_has_nodal_mass_file && _has_mass)
89  mooseError("NodalTranslationalInertia: Please provide either mass or nodal_mass_file as input, "
90  "not both.");
91 
93  {
94  MooseUtils::DelimitedFileReader nodal_mass_file(getParam<FileName>("nodal_mass_file"));
95  nodal_mass_file.setHeaderFlag(MooseUtils::DelimitedFileReader::HeaderFlag::OFF);
96  nodal_mass_file.read();
97  std::vector<std::vector<Real>> data = nodal_mass_file.getData();
98  if (data.size() != 4)
99  mooseError("NodalTranslationalInertia: The number of columns in ",
100  getParam<FileName>("nodal_mass_file"),
101  " should be 4.");
102 
103  unsigned int node_found = 0;
104  const std::set<BoundaryID> bnd_ids = BoundaryRestrictable::boundaryIDs();
105  for (auto & bnd_id : bnd_ids)
106  {
107  const std::vector<dof_id_type> & bnd_node_set = _mesh.getNodeList(bnd_id);
108  for (auto & bnd_node : bnd_node_set)
109  {
110  const Node & node = _mesh.nodeRef(bnd_node);
111  _node_id_to_mass[bnd_node] = 0.0;
112 
113  for (unsigned int i = 0; i < data[0].size(); ++i)
114  {
115  if (MooseUtils::absoluteFuzzyEqual(data[0][i], node(0), 1e-6) &&
116  MooseUtils::absoluteFuzzyEqual(data[1][i], node(1), 1e-6) &&
117  MooseUtils::absoluteFuzzyEqual(data[2][i], node(2), 1e-6))
118  {
119  _node_id_to_mass[bnd_node] = data[3][i];
120  node_found += 1;
121  break;
122  }
123  }
124  }
125  }
126  if (node_found != data[0].size())
127  mooseError("NodalTranslationalInertia: Out of ",
128  data[0].size(),
129  " nodal positions in ",
130  getParam<FileName>("nodal_mass_file"),
131  " only ",
132  node_found,
133  " nodes were found in the boundary.");
134  }
135 }
136 
137 Real
139 {
140  if (_dt == 0)
141  return 0;
142  else
143  {
144  Real mass = 0.0;
145  if (_has_mass)
146  mass = _mass;
147  else
148  {
149  if (_node_id_to_mass.find(_current_node->id()) != _node_id_to_mass.end())
150  mass = _node_id_to_mass[_current_node->id()];
151  else
152  mooseError("NodalTranslationalInertia: Unable to find an entry for the current node in the "
153  "_node_id_to_mass map.");
154  }
155 
156  if (_has_beta)
157  {
158  mooseAssert(_beta > 0.0, "NodalTranslationalInertia: Beta parameter should be positive.");
159  const NumericVector<Number> & aux_sol_old = _aux_sys->solutionOld();
160 
161  const Real vel_old = aux_sol_old(_current_node->dof_number(_aux_sys->number(), _vel_num, 0));
162  const Real accel_old =
163  aux_sol_old(_current_node->dof_number(_aux_sys->number(), _accel_num, 0));
164 
165  const Real accel =
166  1. / _beta *
167  (((_u[_qp] - (*_u_old)[_qp]) / (_dt * _dt)) - vel_old / _dt - accel_old * (0.5 - _beta));
168  const Real vel = vel_old + (_dt * (1 - _gamma)) * accel_old + _gamma * _dt * accel;
169  return mass * (accel + vel * _eta * (1 + _alpha) - _alpha * _eta * vel_old);
170  }
171  else
172  return mass * ((*_accel)[_qp] + (*_vel)[_qp] * _eta * (1.0 + _alpha) -
173  _alpha * _eta * (*_vel_old)[_qp]);
174  }
175 }
176 
177 Real
179 {
180  mooseAssert(_beta > 0.0, "NodalTranslationalInertia: Beta parameter should be positive.");
181 
182  if (_dt == 0)
183  return 0;
184  else
185  {
186  Real mass = 0.0;
187  if (_has_mass)
188  mass = _mass;
189  else
190  {
191  if (_node_id_to_mass.find(_current_node->id()) != _node_id_to_mass.end())
192  mass = _node_id_to_mass[_current_node->id()];
193  else
194  mooseError("NodalTranslationalInertia: Unable to find an entry for the current node in the "
195  "_node_id_to_mass map.");
196  }
197 
198  if (_has_beta)
199  return mass / (_beta * _dt * _dt) + _eta * (1 + _alpha) * mass * _gamma / _beta / _dt;
200  else
201  return mass * (*_du_dotdot_du)[_qp] + _eta * (1.0 + _alpha) * mass * (*_du_dot_du)[_qp];
202  }
203 }
NodalTranslationalInertia::_mass
const Real _mass
Mass associated with the node.
Definition: NodalTranslationalInertia.h:44
NodalTranslationalInertia::computeQpResidual
virtual Real computeQpResidual() override
Definition: NodalTranslationalInertia.C:138
NodalTranslationalInertia::_has_gamma
const bool _has_gamma
Definition: NodalTranslationalInertia.h:38
NodalTranslationalInertia::_u_old
const VariableValue * _u_old
Old value of displacement.
Definition: NodalTranslationalInertia.h:47
NodalTranslationalInertia
Calculates the inertial force and mass proportional damping for a nodal mass.
Definition: NodalTranslationalInertia.h:23
NodalTranslationalInertia::_has_nodal_mass_file
const bool _has_nodal_mass_file
Definition: NodalTranslationalInertia.h:41
registerMooseObject
registerMooseObject("TensorMechanicsApp", NodalTranslationalInertia)
NodalTranslationalInertia::_alpha
const Real & _alpha
HHT time integration parameter.
Definition: NodalTranslationalInertia.h:59
NodalTranslationalInertia::_has_velocity
const bool _has_velocity
Definition: NodalTranslationalInertia.h:39
NodalTranslationalInertia::_accel
const MooseArray< Number > * _accel
Acceleration variable value.
Definition: NodalTranslationalInertia.h:80
NodalTranslationalInertia::_du_dot_du
const MooseArray< Number > * _du_dot_du
du_dot_du variable value
Definition: NodalTranslationalInertia.h:83
NodalTranslationalInertia::_vel
const MooseArray< Number > * _vel
Velocity variable value.
Definition: NodalTranslationalInertia.h:74
NodalTranslationalInertia::_eta
const Real & _eta
Mass proportional Rayliegh damping.
Definition: NodalTranslationalInertia.h:56
NodalTranslationalInertia::computeQpJacobian
virtual Real computeQpJacobian() override
Definition: NodalTranslationalInertia.C:178
validParams
InputParameters validParams()
NodalTranslationalInertia::_du_dotdot_du
const MooseArray< Number > * _du_dotdot_du
du_dotdot_du variable value
Definition: NodalTranslationalInertia.h:86
NodalTranslationalInertia::_has_beta
const bool _has_beta
Definition: NodalTranslationalInertia.h:37
NodalTranslationalInertia::NodalTranslationalInertia
NodalTranslationalInertia(const InputParameters &parameters)
Definition: NodalTranslationalInertia.C:49
NodalTranslationalInertia::_gamma
const Real _gamma
Newmark time integration parameter.
Definition: NodalTranslationalInertia.h:53
NodalTranslationalInertia::validParams
static InputParameters validParams()
Definition: NodalTranslationalInertia.C:21
NodalTranslationalInertia::_beta
const Real _beta
Newmark time integration parameter.
Definition: NodalTranslationalInertia.h:50
NodalTranslationalInertia::_node_id_to_mass
std::map< dof_id_type, Real > _node_id_to_mass
Map between boundary nodes and nodal mass.
Definition: NodalTranslationalInertia.h:71
NodalTranslationalInertia.h
defineLegacyParams
defineLegacyParams(NodalTranslationalInertia)
NodalTranslationalInertia::_aux_sys
AuxiliarySystem * _aux_sys
Auxiliary system object.
Definition: NodalTranslationalInertia.h:62
NodalTranslationalInertia::_vel_old
const MooseArray< Number > * _vel_old
Old velocity variable value.
Definition: NodalTranslationalInertia.h:77
NodalTranslationalInertia::_has_acceleration
const bool _has_acceleration
Definition: NodalTranslationalInertia.h:40
NodalTranslationalInertia::_accel_num
unsigned int _accel_num
Variable number corresponding to the acceleration aux variable.
Definition: NodalTranslationalInertia.h:68
NodalTranslationalInertia::_has_mass
const bool _has_mass
Booleans for validity of params.
Definition: NodalTranslationalInertia.h:36
NodalTranslationalInertia::_vel_num
unsigned int _vel_num
Variable number corresponding to the velocity aux variable.
Definition: NodalTranslationalInertia.h:65