www.mooseframework.org
NodalGravity.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 
10 #include "NodalGravity.h"
11 #include "MooseUtils.h"
12 #include "DelimitedFileReader.h"
13 #include "Function.h"
14 
15 registerMooseObject("TensorMechanicsApp", NodalGravity);
16 
18 
19 InputParameters
21 {
22  InputParameters params = NodalKernel::validParams();
23  params.addClassDescription("Computes the gravitational force for a given nodal mass.");
24  params.addRangeCheckedParam<Real>("alpha",
25  0.0,
26  "alpha >= -0.3333 & alpha <= 0.0",
27  "Alpha parameter for mass dependent numerical damping induced "
28  "by HHT time integration scheme");
29  params.addParam<Real>("mass", "Mass associated with the node");
30  params.addParam<FileName>(
31  "nodal_mass_file",
32  "The file containing the nodal positions and the corresponding nodal masses.");
33  params.addParam<Real>("gravity_value", 0.0, "Acceleration due to gravity.");
34  // A ConstantFunction of "1" is supplied as the default
35  params.addParam<FunctionName>(
36  "function", "1", "A function that describes the gravitational force");
37  return params;
38 }
39 
40 NodalGravity::NodalGravity(const InputParameters & parameters)
41  : NodalKernel(parameters),
42  _has_mass(isParamValid("mass")),
43  _has_nodal_mass_file(isParamValid("nodal_mass_file")),
44  _mass(_has_mass ? getParam<Real>("mass") : 0.0),
45  _alpha(getParam<Real>("alpha")),
46  _gravity_value(getParam<Real>("gravity_value")),
47  _function(getFunction("function"))
48 {
50  mooseError("NodalGravity: Please provide either mass or nodal_mass_file as input.");
51  else if (_has_nodal_mass_file && _has_mass)
52  mooseError("NodalGravity: Please provide either mass or nodal_mass_file as input, not both.");
53 
55  {
56  MooseUtils::DelimitedFileReader nodal_mass_file(getParam<FileName>("nodal_mass_file"));
57  nodal_mass_file.setHeaderFlag(MooseUtils::DelimitedFileReader::HeaderFlag::OFF);
58  nodal_mass_file.read();
59  std::vector<std::vector<Real>> data = nodal_mass_file.getData();
60  if (data.size() != 4)
61  mooseError("NodalGravity: The number of columns in ",
62  getParam<FileName>("nodal_mass_file"),
63  " should be 4.");
64 
65  unsigned int node_found = 0;
66  const std::set<BoundaryID> bnd_ids = BoundaryRestrictable::boundaryIDs();
67  for (auto & bnd_id : bnd_ids)
68  {
69  const std::vector<dof_id_type> & bnd_node_set = _mesh.getNodeList(bnd_id);
70  for (auto & bnd_node : bnd_node_set)
71  {
72  const Node & node = _mesh.nodeRef(bnd_node);
73  _node_id_to_mass[bnd_node] = 0.0;
74 
75  for (unsigned int i = 0; i < data[0].size(); ++i)
76  {
77  if (MooseUtils::absoluteFuzzyEqual(data[0][i], node(0), 1e-6) &&
78  MooseUtils::absoluteFuzzyEqual(data[1][i], node(1), 1e-6) &&
79  MooseUtils::absoluteFuzzyEqual(data[2][i], node(2), 1e-6))
80  {
81  _node_id_to_mass[bnd_node] = data[3][i];
82  node_found += 1;
83  break;
84  }
85  }
86  }
87  }
88  if (node_found != data[0].size())
89  mooseError("NodalGravity: Out of ",
90  data[0].size(),
91  " nodal positions in ",
92  getParam<FileName>("nodal_mass_file"),
93  " only ",
94  node_found,
95  " nodes were found in the boundary.");
96  }
97 }
98 
99 Real
101 {
102  Real mass = 0.0;
103  if (_has_mass)
104  mass = _mass;
105  else
106  {
107  if (_node_id_to_mass.find(_current_node->id()) != _node_id_to_mass.end())
108  mass = _node_id_to_mass[_current_node->id()];
109  else
110  mooseError("NodalGravity: Unable to find an entry for the current node in the "
111  "_node_id_to_mass map.");
112  }
113  Real factor = _gravity_value * _function.value(_t + _alpha * _dt, (*_current_node));
114  return mass * -factor;
115 }
NodalGravity::_has_nodal_mass_file
const bool _has_nodal_mass_file
Definition: NodalGravity.h:35
registerMooseObject
registerMooseObject("TensorMechanicsApp", NodalGravity)
NodalGravity::_has_mass
const bool _has_mass
Booleans for validity of params.
Definition: NodalGravity.h:34
NodalGravity
Calculates the gravitational force proportional to nodal mass.
Definition: NodalGravity.h:23
NodalGravity::_function
const Function & _function
Time and space dependent factor multiplying acceleration due to gravity.
Definition: NodalGravity.h:47
validParams
InputParameters validParams()
NodalGravity.h
NodalGravity::_mass
const Real _mass
Mass associated with the node.
Definition: NodalGravity.h:38
NodalGravity::NodalGravity
NodalGravity(const InputParameters &parameters)
Definition: NodalGravity.C:40
NodalGravity::computeQpResidual
virtual Real computeQpResidual() override
Definition: NodalGravity.C:100
NodalGravity::_node_id_to_mass
std::map< dof_id_type, Real > _node_id_to_mass
Map between boundary nodes and nodal mass.
Definition: NodalGravity.h:50
defineLegacyParams
defineLegacyParams(NodalGravity)
NodalGravity::validParams
static InputParameters validParams()
Definition: NodalGravity.C:20
NodalGravity::_gravity_value
const Real _gravity_value
Acceleration due to gravity.
Definition: NodalGravity.h:44
NodalGravity::_alpha
const Real _alpha
HHT time integration parameter.
Definition: NodalGravity.h:41