https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
15registerMooseAction("SolidMechanicsApp", DynamicSolidMechanicsPhysics, "meta_action");
16
17registerMooseAction("SolidMechanicsApp", DynamicSolidMechanicsPhysics, "setup_mesh_complete");
18
19registerMooseAction("SolidMechanicsApp",
21 "validate_coordinate_systems");
22
23registerMooseAction("SolidMechanicsApp", DynamicSolidMechanicsPhysics, "add_variable");
24
25registerMooseAction("SolidMechanicsApp", DynamicSolidMechanicsPhysics, "add_aux_variable");
26
27registerMooseAction("SolidMechanicsApp", DynamicSolidMechanicsPhysics, "add_kernel");
28
29registerMooseAction("SolidMechanicsApp", DynamicSolidMechanicsPhysics, "add_aux_kernel");
30
31registerMooseAction("SolidMechanicsApp", DynamicSolidMechanicsPhysics, "add_material");
32
33registerMooseAction("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
88void
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
180std::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}
registerMooseAction("SolidMechanicsApp", DynamicSolidMechanicsPhysics, "meta_action")
const ExecFlagType EXEC_TIMESTEP_END
std::shared_ptr< FEProblemBase > & _problem
const std::string & _current_task
virtual std::string getKernelType() override
virtual InputParameters getKernelParameters(std::string type) override
std::vector< AuxVariableName > _accelerations
std::vector< AuxVariableName > _velocities
DynamicSolidMechanicsPhysics(const InputParameters &params)
InputParameters getValidParams(const std::string &name) const
bool isParamDefined(const std::string &name) const
void addParamNamesToGroup(const std::string &space_delim_names, const std::string group_name)
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)
const InputParameters & parameters() const
const std::string & type() const
const std::string & name() const
void paramError(const std::string &param, Args... args) const
void mooseError(Args &&... args) const
Factory & _factory
virtual InputParameters getKernelParameters(std::string type)
std::vector< VariableName > _displacements
displacement variables
unsigned int _ndisp
Number of displacement variables.