https://mooseframework.inl.gov
DynamicSolidMechanicsPhysics.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 
11 #include "Factory.h"
12 #include "FEProblem.h"
13 #include "Parser.h"
14 
15 registerMooseAction("SolidMechanicsApp", DynamicSolidMechanicsPhysics, "meta_action");
16 
17 registerMooseAction("SolidMechanicsApp", DynamicSolidMechanicsPhysics, "setup_mesh_complete");
18 
19 registerMooseAction("SolidMechanicsApp",
21  "validate_coordinate_systems");
22 
23 registerMooseAction("SolidMechanicsApp", DynamicSolidMechanicsPhysics, "add_variable");
24 
25 registerMooseAction("SolidMechanicsApp", DynamicSolidMechanicsPhysics, "add_aux_variable");
26 
27 registerMooseAction("SolidMechanicsApp", DynamicSolidMechanicsPhysics, "add_kernel");
28 
29 registerMooseAction("SolidMechanicsApp", DynamicSolidMechanicsPhysics, "add_aux_kernel");
30 
31 registerMooseAction("SolidMechanicsApp", DynamicSolidMechanicsPhysics, "add_material");
32 
33 registerMooseAction("SolidMechanicsApp",
35  "add_master_action_material");
36 
39 {
41  params.addClassDescription("Set up dynamic stress divergence kernels");
42  params.addParam<bool>("static_initialization",
43  false,
44  "Set to true get the system to "
45  "equilibrium under gravity by running a "
46  "quasi-static analysis (by solving Ku = F) "
47  "in the first time step.");
48 
49  params.addParam<std::vector<AuxVariableName>>(
50  "velocities",
51  std::vector<AuxVariableName>({"vel_x", "vel_y", "vel_z"}),
52  "Names of the velocity variables");
53  params.addParam<std::vector<AuxVariableName>>(
54  "accelerations",
55  std::vector<AuxVariableName>({"accel_x", "accel_y", "accel_z"}),
56  "Names of the acceleration variables");
57  params.addParamNamesToGroup("velocities accelerations", "Variables");
58 
59  params.addParam<Real>("hht_alpha",
60  0,
61  "alpha parameter for mass dependent numerical damping induced "
62  "by HHT time integration scheme");
63  params.addParam<Real>("newmark_beta", 0.25, "beta parameter for Newmark Time integration");
64  params.addParam<Real>("newmark_gamma", 0.5, "gamma parameter for Newmark Time integration");
65  params.addParam<MaterialPropertyName>("mass_damping_coefficient",
66  0.0,
67  "Name of material property or a constant real "
68  "number defining mass Rayleigh parameter (eta).");
69  params.addParam<MaterialPropertyName>("stiffness_damping_coefficient",
70  0.0,
71  "Name of material property or a constant real "
72  "number defining stiffness Rayleigh parameter (zeta).");
73  params.addParam<MaterialPropertyName>(
74  "density", "density", "Name of Material Property that provides the density");
75  params.addParamNamesToGroup("hht_alpha newmark_beta newmark_gamma",
76  "Time integration parameters");
77 
78  return params;
79 }
80 
83  _velocities(getParam<std::vector<AuxVariableName>>("velocities")),
84  _accelerations(getParam<std::vector<AuxVariableName>>("accelerations"))
85 {
86 }
87 
88 void
90 {
91  const std::array<std::string, 3> dir{{"x", "y", "z"}};
92 
93  if (_velocities.size() < _ndisp)
94  paramError("velocities", "Supply one velocity variable per displacement direction");
95  if (_accelerations.size() < _ndisp)
96  paramError("accelerations", "Supply one acceleration variable per displacement direction");
97 
98  // Add aux variables for velocities and accelerations
99  if (_current_task == "add_aux_variable" && getParam<bool>("add_variables"))
100  {
101  auto params = _factory.getValidParams("MooseVariable");
102  // determine necessary order
103  const bool second = _problem->mesh().hasSecondOrderElements();
104 
105  params.set<MooseEnum>("order") = second ? "SECOND" : "FIRST";
106  params.set<MooseEnum>("family") = "LAGRANGE";
107 
108  for (unsigned int i = 0; i < _ndisp; ++i)
109  {
110  _problem->addAuxVariable("MooseVariable", _velocities[i], params);
111  _problem->addAuxVariable("MooseVariable", _accelerations[i], params);
112  }
113  }
114 
115  // Add aux kernel for velocities and accelerations
116  if (_current_task == "add_aux_kernel")
117  {
118  //
119  // Note: AuxKernels that are limited to TIMESTEP_END to not get their dependencies
120  // resolved automatically. Thus we _must_ construct the acceleration kernels _first_.
121  // NewmarkAccelAux only uses the old velocity.
122  //
123 
124  // acceleration aux kernels
125  for (unsigned int i = 0; i < _ndisp; ++i)
126  {
127  auto kernel_type = "NewmarkAccelAux";
128  auto params = _factory.getValidParams(kernel_type);
129  params.set<AuxVariableName>("variable") = _accelerations[i];
130  params.set<std::vector<VariableName>>("displacement") = {_displacements[i]};
131  params.set<std::vector<VariableName>>("velocity") = {_velocities[i]};
132  params.set<ExecFlagEnum>("execute_on") = EXEC_TIMESTEP_END;
133  params.set<Real>("beta") = getParam<Real>("newmark_beta");
134  params.applyParameters(parameters());
135  _problem->addAuxKernel(kernel_type, "TM_" + name() + '_' + _accelerations[i], params);
136  }
137 
138  // velocity aux kernels
139  for (unsigned int i = 0; i < _ndisp; ++i)
140  {
141  auto kernel_type = "NewmarkVelAux";
142  auto params = _factory.getValidParams(kernel_type);
143  params.set<AuxVariableName>("variable") = _velocities[i];
144  params.set<std::vector<VariableName>>("acceleration") = {_accelerations[i]};
145  params.set<ExecFlagEnum>("execute_on") = EXEC_TIMESTEP_END;
146  params.set<Real>("gamma") = getParam<Real>("newmark_gamma");
147  params.applyParameters(parameters());
148  _problem->addAuxKernel(kernel_type, "TM_" + name() + '_' + _velocities[i], params);
149  }
150  }
151 
152  // add inertia kernel
153  if (_current_task == "add_kernel")
154  {
155  for (unsigned int i = 0; i < _ndisp; ++i)
156  {
157  auto kernel_type = _use_ad ? "ADInertialForce" : "InertialForce";
158  auto params = _factory.getValidParams(kernel_type);
159 
160  params.set<NonlinearVariableName>("variable") = _displacements[i];
161  params.set<std::vector<VariableName>>("velocity") = {_velocities[i]};
162  params.set<std::vector<VariableName>>("acceleration") = {_accelerations[i]};
163  params.set<bool>("use_displaced_mesh") = false;
164  params.set<Real>("beta") = getParam<Real>("newmark_beta");
165  params.set<Real>("gamma") = getParam<Real>("newmark_gamma");
166  params.set<Real>("alpha") = getParam<Real>("hht_alpha");
167  params.set<MaterialPropertyName>("eta") =
168  getParam<MaterialPropertyName>("mass_damping_coefficient");
169 
170  params.applyParameters(parameters());
171 
172  _problem->addKernel(kernel_type, "TM_" + name() + "_inertia_" + dir[i], params);
173  }
174  }
175 
176  // call parent class method
178 }
179 
180 std::string
182 {
183  // choose kernel type based on coordinate system
185  return "DynamicStressDivergenceTensors";
186  else
187  mooseError("Unsupported coordinate system");
188 }
189 
192 {
194 
195  if (params.isParamDefined("alpha"))
196  params.set<Real>("alpha") = getParam<Real>("hht_alpha");
197  if (params.isParamDefined("zeta"))
198  params.set<MaterialPropertyName>("zeta") =
199  getParam<MaterialPropertyName>("stiffness_damping_coefficient");
200 
201  return params;
202 }
bool isParamDefined(const std::string &name) const
std::vector< AuxVariableName > _velocities
virtual InputParameters getKernelParameters(std::string type)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
DynamicSolidMechanicsPhysics(const InputParameters &params)
unsigned int _ndisp
Number of displacement variables.
T & set(const std::string &name, bool quiet_mode=false)
InputParameters getValidParams(const std::string &name) const
const ExecFlagType EXEC_TIMESTEP_END
std::vector< VariableName > _displacements
displacement variables
virtual const std::string & name() const
virtual std::string getKernelType() override
Factory & _factory
registerMooseAction("SolidMechanicsApp", DynamicSolidMechanicsPhysics, "meta_action")
const std::string & type() const
const std::string & _current_task
void paramError(const std::string &param, Args... args) const
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void mooseError(Args &&... args) const
void addClassDescription(const std::string &doc_string)
std::shared_ptr< FEProblemBase > & _problem
const InputParameters & parameters() const
std::vector< AuxVariableName > _accelerations
virtual InputParameters getKernelParameters(std::string type) override
void addParamNamesToGroup(const std::string &space_delim_names, const std::string group_name)