www.mooseframework.org
SolidMechanicsAction.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 "SolidMechanicsAction.h"
11 #include "Factory.h"
12 #include "FEProblem.h"
13 #include "Parser.h"
14 #include "MooseMesh.h"
15 
16 registerMooseAction("SolidMechanicsApp", SolidMechanicsAction, "add_kernel");
17 
18 template <>
19 InputParameters
21 {
22  InputParameters params = validParams<Action>();
23  MooseEnum elemType("truss undefined", "undefined");
24  params.addParam<MooseEnum>("type", elemType, "The element type: " + elemType.getRawNames());
25  params.addParam<VariableName>("disp_x", "", "The x displacement");
26  params.addParam<VariableName>("disp_y", "", "The y displacement");
27  params.addParam<VariableName>("disp_z", "", "The z displacement");
28  params.addParam<VariableName>("disp_r", "", "The r displacement");
29  params.addParam<VariableName>("temp", "", "The temperature");
30  params.addParam<Real>("zeta", 0.0, "Stiffness dependent damping parameter for Rayleigh damping");
31  params.addParam<Real>("alpha", 0.0, "alpha parameter for HHT time integration");
32  params.addParam<std::string>(
33  "appended_property_name", "", "Name appended to material properties to make them unique");
34  params.set<bool>("use_displaced_mesh") = true;
35  params.addParam<std::vector<SubdomainName>>(
36  "block", "The list of ids of the blocks (subdomain) that these kernels will be applied to");
37  params.addParam<bool>("volumetric_locking_correction",
38  true,
39  "Set to false to turn off volumetric locking correction");
40 
41  params.addParam<std::vector<AuxVariableName>>(
42  "save_in_disp_x", "Auxiliary variables to save the x displacement residuals.");
43  params.addParam<std::vector<AuxVariableName>>(
44  "save_in_disp_y", "Auxiliary variables to save the y displacement residuals.");
45  params.addParam<std::vector<AuxVariableName>>(
46  "save_in_disp_z", "Auxiliary variables to save the z displacement residuals.");
47  params.addParam<std::vector<AuxVariableName>>(
48  "save_in_disp_r", "Auxiliary variables to save the r displacement residuals.");
49  params.addParam<std::vector<AuxVariableName>>(
50  "diag_save_in_disp_x",
51  "Auxiliary variables to save the x displacement diagonal preconditioner terms.");
52  params.addParam<std::vector<AuxVariableName>>(
53  "diag_save_in_disp_y",
54  "Auxiliary variables to save the y displacement diagonal preconditioner terms.");
55  params.addParam<std::vector<AuxVariableName>>(
56  "diag_save_in_disp_z",
57  "Auxiliary variables to save the z displacement diagonal preconditioner terms.");
58  params.addParam<std::vector<AuxVariableName>>(
59  "diag_save_in_disp_r",
60  "Auxiliary variables to save the r displacement diagonal preconditioner terms.");
61  params.addParam<std::vector<TagName>>(
62  "extra_vector_tags",
63  "The tag names for extra vectors that residual data should be saved into");
64  return params;
65 }
66 
67 SolidMechanicsAction::SolidMechanicsAction(const InputParameters & params)
68  : Action(params),
69  _disp_x(getParam<VariableName>("disp_x")),
70  _disp_y(getParam<VariableName>("disp_y")),
71  _disp_z(getParam<VariableName>("disp_z")),
72  _disp_r(getParam<VariableName>("disp_r")),
73  _temp(getParam<VariableName>("temp")),
74  _zeta(getParam<Real>("zeta")),
75  _alpha(getParam<Real>("alpha"))
76 {
77 }
78 
79 void
81 {
82  // list of subdomains IDs per coordinate system
83  std::map<Moose::CoordinateSystemType, std::vector<SubdomainName>> coord_map;
84  std::set<SubdomainID> subdomains;
85 
86  if (isParamValid("block")) // Should it be restricted to certain blocks?
87  {
88  Moose::out << "Restricting to blocks!" << std::endl;
89  std::vector<SubdomainName> block = getParam<std::vector<SubdomainName>>("block");
90  for (unsigned int i = 0; i < block.size(); i++)
91  subdomains.insert(_problem->mesh().getSubdomainID(block[i]));
92  }
93  else // Put it everywhere
94  subdomains = _problem->mesh().meshSubdomains();
95 
96  for (std::set<SubdomainID>::const_iterator it = subdomains.begin(); it != subdomains.end(); ++it)
97  {
98  SubdomainID sid = *it;
99  Moose::CoordinateSystemType coord_type = _problem->getCoordSystem(sid);
100 
101  // Convert the SubdomainID into SubdomainName since kernel params take SubdomainNames (this is
102  // retarded...)
103  std::stringstream ss;
104  ss << sid;
105  SubdomainName sname = ss.str();
106 
107  coord_map[coord_type].push_back(sname);
108  }
109 
110  for (std::map<Moose::CoordinateSystemType, std::vector<SubdomainName>>::iterator it =
111  coord_map.begin();
112  it != coord_map.end();
113  ++it)
114  {
115  Moose::CoordinateSystemType coord_type = (*it).first;
116  std::vector<SubdomainName> & blocks = (*it).second;
117 
118  // Determine whether RZ or RSPHERICAL
119  bool rz(false);
120  bool rspherical(false);
121  unsigned int dim(1);
122  std::vector<std::string> keys;
123  std::vector<VariableName> vars;
124  std::vector<std::vector<AuxVariableName>> save_in;
125  std::vector<std::vector<AuxVariableName>> diag_save_in;
126  std::string type("StressDivergence");
127  if (getParam<MooseEnum>("type") == 0) // truss
128  {
129  type = "StressDivergenceTruss";
130  }
131  else if (coord_type == Moose::COORD_RZ)
132  {
133  rz = true;
134  type = "StressDivergenceRZ";
135  dim = 2;
136  keys.push_back("disp_r");
137  keys.push_back("disp_z");
138  vars.push_back(_disp_r);
139  vars.push_back(_disp_z);
140  save_in.resize(dim);
141  if (isParamValid("save_in_disp_r"))
142  save_in[0] = getParam<std::vector<AuxVariableName>>("save_in_disp_r");
143 
144  if (isParamValid("save_in_disp_z"))
145  save_in[1] = getParam<std::vector<AuxVariableName>>("save_in_disp_z");
146 
147  diag_save_in.resize(dim);
148  if (isParamValid("diag_save_in_disp_r"))
149  diag_save_in[0] = getParam<std::vector<AuxVariableName>>("diag_save_in_disp_r");
150 
151  if (isParamValid("diag_save_in_disp_z"))
152  diag_save_in[1] = getParam<std::vector<AuxVariableName>>("diag_save_in_disp_z");
153  }
154  else if (coord_type == Moose::COORD_RSPHERICAL)
155  {
156  rspherical = true;
157  type = "StressDivergenceRSpherical";
158  dim = 1;
159  keys.push_back("disp_r");
160  vars.push_back(_disp_r);
161  save_in.resize(dim);
162  if (isParamValid("save_in_disp_r"))
163  save_in[0] = getParam<std::vector<AuxVariableName>>("save_in_disp_r");
164 
165  diag_save_in.resize(dim);
166  if (isParamValid("diag_save_in_disp_r"))
167  diag_save_in[0] = getParam<std::vector<AuxVariableName>>("diag_save_in_disp_r");
168  }
169 
170  if (!rz && !rspherical && _disp_x == "")
171  {
172  mooseError("disp_x must be specified");
173  }
174 
175  if (!rz && !rspherical)
176  {
177  keys.push_back("disp_x");
178  vars.push_back(_disp_x);
179  if (_disp_y != "")
180  {
181  ++dim;
182  keys.push_back("disp_y");
183  vars.push_back(_disp_y);
184  if (_disp_z != "")
185  {
186  ++dim;
187  keys.push_back("disp_z");
188  vars.push_back(_disp_z);
189  }
190  }
191 
192  save_in.resize(dim);
193  if (isParamValid("save_in_disp_x"))
194  save_in[0] = getParam<std::vector<AuxVariableName>>("save_in_disp_x");
195 
196  if (isParamValid("save_in_disp_y"))
197  save_in[1] = getParam<std::vector<AuxVariableName>>("save_in_disp_y");
198 
199  if (isParamValid("save_in_disp_z"))
200  save_in[2] = getParam<std::vector<AuxVariableName>>("save_in_disp_z");
201 
202  diag_save_in.resize(dim);
203  if (isParamValid("diag_save_in_disp_x"))
204  diag_save_in[0] = getParam<std::vector<AuxVariableName>>("diag_save_in_disp_x");
205 
206  if (isParamValid("diag_save_in_disp_y"))
207  diag_save_in[1] = getParam<std::vector<AuxVariableName>>("diag_save_in_disp_y");
208 
209  if (isParamValid("diag_save_in_disp_z"))
210  diag_save_in[2] = getParam<std::vector<AuxVariableName>>("diag_save_in_disp_z");
211  }
212 
213  unsigned int num_coupled(dim);
214  if (_temp != "")
215  {
216  ++num_coupled;
217  keys.push_back("temp");
218  vars.push_back(_temp);
219  }
220 
221  InputParameters params = _factory.getValidParams(type);
222  for (unsigned j(0); j < num_coupled; ++j)
223  {
224  params.addCoupledVar(keys[j], "");
225  params.set<std::vector<VariableName>>(keys[j]) = {vars[j]};
226  }
227 
228  params.set<bool>("use_displaced_mesh") = getParam<bool>("use_displaced_mesh");
229  params.set<std::string>("appended_property_name") =
230  getParam<std::string>("appended_property_name");
231 
232  for (unsigned int i(0); i < dim; ++i)
233  {
234  std::stringstream name;
235  name << _name;
236  name << i;
237 
238  params.set<unsigned int>("component") = i;
239 
240  params.set<NonlinearVariableName>("variable") = vars[i];
241  params.set<std::vector<SubdomainName>>("block") = blocks;
242  params.set<std::vector<AuxVariableName>>("save_in") = save_in[i];
243  params.set<std::vector<AuxVariableName>>("diag_save_in") = diag_save_in[i];
244  params.set<Real>("zeta") = _zeta;
245  params.set<Real>("alpha") = _alpha;
246  params.set<bool>("volumetric_locking_correction") =
247  getParam<bool>("volumetric_locking_correction");
248  if (isParamValid("extra_vector_tags"))
249  params.set<std::vector<TagName>>("extra_vector_tags") =
250  getParam<std::vector<TagName>>("extra_vector_tags");
251  _problem->addKernel(type, name.str(), params);
252  }
253  }
254 }
SolidMechanicsAction.h
SolidMechanicsAction
Definition: SolidMechanicsAction.h:20
SolidMechanicsAction::_disp_r
const VariableName _disp_r
Definition: SolidMechanicsAction.h:31
validParams< SolidMechanicsAction >
InputParameters validParams< SolidMechanicsAction >()
Definition: SolidMechanicsAction.C:20
name
const std::string name
Definition: Setup.h:21
SolidMechanicsAction::act
virtual void act()
Definition: SolidMechanicsAction.C:80
SolidMechanicsAction::_alpha
const Real _alpha
Definition: SolidMechanicsAction.h:34
SolidMechanicsAction::_zeta
const Real _zeta
Definition: SolidMechanicsAction.h:33
SolidMechanicsAction::_disp_x
const VariableName _disp_x
Definition: SolidMechanicsAction.h:28
registerMooseAction
registerMooseAction("SolidMechanicsApp", SolidMechanicsAction, "add_kernel")
SolidMechanicsAction::_temp
const VariableName _temp
Definition: SolidMechanicsAction.h:32
SolidMechanicsAction::_disp_y
const VariableName _disp_y
Definition: SolidMechanicsAction.h:29
SolidMechanicsAction::_disp_z
const VariableName _disp_z
Definition: SolidMechanicsAction.h:30
SolidMechanicsAction::SolidMechanicsAction
SolidMechanicsAction(const InputParameters &params)
Definition: SolidMechanicsAction.C:67