https://mooseframework.inl.gov
Loading...
Searching...
No Matches
QuasiStaticSolidMechanicsPhysicsBase.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
12#include "ActionWarehouse.h"
14#include "ComputeFiniteStrain.h"
15#include "MooseApp.h"
17
18// map tensor name shortcuts to tensor material property names
19std::map<std::string, std::string>
21 {"strain", "total_strain"},
22 {"mechanical_strain", "mechanical_strain"},
23 {"stress", "stress"},
24 {"cauchy_stress", "cauchy_stress"},
25 {"deformation_gradient", "deformation_gradient"},
26 {"pk1_stress", "pk1_stress"},
27 {"pk2_stress", "pk2_stress"},
28 {"small_stress", "small_stress"},
29 {"elastic_strain", "elastic_strain"},
30 {"plastic_strain", "plastic_strain"},
31 {"creep_strain", "creep_strain"},
32 {"creep_stress", "creep_stress"}};
33const std::vector<char> QuasiStaticSolidMechanicsPhysicsBase::_component_table = {'x', 'y', 'z'};
34
35// map aux variable name prefixes to RankTwoInvariant option and list of permitted tensor name
36// shortcuts
37const std::map<std::string, std::pair<std::string, std::vector<std::string>>>
39 {"vonmises", {"VonMisesStress", {"stress", "cauchy_stress", "pk1_stress", "pk2_stress"}}},
40 {"effective", {"EffectiveStrain", {"plastic_strain", "creep_strain"}}},
41 {"hydrostatic",
42 {"Hydrostatic", {"stress", "cauchy_stress", "pk1_stress", "pk2_stress", "small_stress"}}},
43 {"l2norm",
44 {"L2norm",
45 {"mechanical_strain",
46 "stress",
47 "cauchy_stress",
48 "pk1_stress",
49 "strain",
50 "elastic_strain",
51 "plastic_strain",
52 "creep_strain"}}},
53 {"volumetric", {"VolumetricStrain", {"mechanical_strain", "strain"}}},
54 {"firstinv",
55 {"FirstInvariant",
56 {"stress", "cauchy_stress", "pk1_stress", "pk2_stress", "small_stress", "strain"}}},
57 {"secondinv",
58 {"SecondInvariant",
59 {"stress", "cauchy_stress", "pk1_stress", "pk2_stress", "small_stress", "strain"}}},
60 {"thirdinv",
61 {"ThirdInvariant",
62 {"stress", "cauchy_stress", "pk1_stress", "pk2_stress", "small_stress", "strain"}}},
63 {"triaxiality",
64 {"TriaxialityStress",
65 {
66 "stress",
67 "cauchy_stress",
68 "pk1_stress",
69 "pk2_stress",
70 "small_stress",
71 }}},
72 {"maxshear",
73 {"MaxShear",
74 {
75 "stress",
76 "cauchy_stress",
77 "pk1_stress",
78 "pk2_stress",
79 "small_stress",
80 }}},
81 {"intensity",
82 {"StressIntensity",
83 {
84 "stress",
85 "cauchy_stress",
86 "pk1_stress",
87 "pk2_stress",
88 "small_stress",
89 }}},
90 {"max_principal",
91 {"MaxPrincipal",
92 {"mechanical_strain",
93 "stress",
94 "cauchy_stress",
95 "pk1_stress",
96 "pk2_stress",
97 "small_stress",
98 "strain"}}},
99 {"mid_principal",
100 {"MidPrincipal",
101 {"mechanical_strain",
102 "stress",
103 "cauchy_stress",
104 "pk1_stress",
105 "pk2_stress",
106 "small_stress",
107 "strain"}}},
108 {"min_principal",
109 {"MinPrincipal",
110 {"mechanical_strain",
111 "stress",
112 "cauchy_stress",
113 "pk1_stress",
114 "pk2_stress",
115 "small_stress",
116 "strain"}}}};
117
118const std::map<std::string, std::pair<std::string, std::vector<std::string>>>
120 {"directional", {"Direction", {"stress", "strain"}}}};
121
122const std::map<std::string, std::pair<std::string, std::vector<std::string>>>
124 {"axial",
125 {"AxialStress", {"stress", "strain", "plastic_strain", "creep_strain", "elastic_strain"}}},
126 {"hoop",
127 {"HoopStress", {"stress", "strain", "plastic_strain", "creep_strain", "elastic_strain"}}},
128 {"radial", {"RadialStress", {"stress", "strain"}}}};
129
130const std::map<std::string, std::pair<std::string, std::vector<std::string>>>
132 {"spherical_hoop",
133 {"HoopStress", {"stress", "strain", "plastic_strain", "creep_strain", "elastic_strain"}}},
134 {"spherical_radial", {"RadialStress", {"stress", "strain"}}}};
135
138{
140
141 params.addRequiredParam<std::vector<VariableName>>(
142 "displacements", "The nonlinear displacement variables for the problem");
143 params.addParam<std::vector<VariableName>>("temperature", "The temperature");
144
145 MooseEnum strainType("SMALL FINITE", "SMALL");
146 params.addParam<MooseEnum>("strain", strainType, "Strain formulation");
147 params.addParam<bool>("incremental",
148 "Use incremental or total strain (if not explicitly specified this "
149 "defaults to incremental for finite strain and total for small strain)");
150
151 params.addParam<std::string>("base_name", "Material property base name");
152 params.addParam<bool>(
153 "volumetric_locking_correction", false, "Flag to correct volumetric locking");
154 params.addParam<bool>(
155 "use_finite_deform_jacobian", false, "Jacobian for corrotational finite strain");
156 params.addParam<bool>("add_variables", false, "Add the displacement variables");
157 params.addParam<std::vector<MaterialPropertyName>>(
158 "eigenstrain_names", {}, "List of eigenstrains to be applied in this strain calculation");
159 params.addParam<bool>("use_automatic_differentiation",
160 false,
161 "Flag to use automatic differentiation (AD) objects when possible");
162 // Global Strain
163 params.addParam<MaterialPropertyName>(
164 "global_strain",
165 "Name of the global strain material to be applied in this strain calculation. "
166 "The global strain tensor is constant over the whole domain and allows visualization "
167 "of the deformed shape with the periodic BC");
168
169 // Advanced
170 params.addParam<std::vector<AuxVariableName>>("save_in", {}, "The displacement residuals");
171 params.addParam<std::vector<AuxVariableName>>(
172 "diag_save_in", {}, "The displacement diagonal preconditioner terms");
173 params.addParam<MooseEnum>("decomposition_method",
175 "Methods to calculate the finite strain and rotation increments");
176 params.addParamNamesToGroup("save_in diag_save_in", "Advanced");
177
178 // Planar Formulation
179 MooseEnum planarFormulationType("NONE WEAK_PLANE_STRESS PLANE_STRAIN GENERALIZED_PLANE_STRAIN",
180 "NONE");
181 params.addParam<MooseEnum>(
182 "planar_formulation", planarFormulationType, "Out-of-plane stress/strain formulation");
183 params.addParam<VariableName>("scalar_out_of_plane_strain",
184 "Scalar variable for the out-of-plane strain (in y "
185 "direction for 1D Axisymmetric or in z direction for 2D "
186 "Cartesian problems)");
187 params.addParam<VariableName>("out_of_plane_strain",
188 "Variable for the out-of-plane strain for plane stress models");
189 MooseEnum outOfPlaneDirection("x y z", "z");
190 params.addParam<MooseEnum>(
191 "out_of_plane_direction", outOfPlaneDirection, "The direction of the out-of-plane strain.");
192 params.addDeprecatedParam<FunctionName>(
193 "out_of_plane_pressure",
194 "Function used to prescribe pressure (applied toward the body) in the out-of-plane direction "
195 "(y for 1D Axisymmetric or z for 2D Cartesian problems)",
196 "This has been replaced by 'out_of_plane_pressure_function'");
197 params.addParam<FunctionName>(
198 "out_of_plane_pressure_function",
199 "Function used to prescribe pressure (applied toward the body) in the out-of-plane direction "
200 "(y for 1D Axisymmetric or z for 2D Cartesian problems)");
201 params.addParam<Real>(
202 "pressure_factor",
203 "Scale factor applied to prescribed out-of-plane pressure (both material and function)");
204 params.addParam<MaterialPropertyName>("out_of_plane_pressure_material",
205 "0",
206 "Material used to prescribe pressure (applied toward the "
207 "body) in the out-of-plane direction");
208 params.addParamNamesToGroup("planar_formulation scalar_out_of_plane_strain out_of_plane_pressure "
209 "out_of_plane_pressure_material out_of_plane_pressure_function "
210 "pressure_factor out_of_plane_direction out_of_plane_strain",
211 "Out-of-plane stress/strain");
212
213 // Output
214 params.addParam<MultiMooseEnum>("generate_output",
216 "Add scalar quantity output for stress and/or strain");
217
218 params.addParam<MultiMooseEnum>(
219 "material_output_order",
221 "Specifies the order of the FE shape function to use for this variable.");
222
223 params.addParam<MultiMooseEnum>(
224 "material_output_family",
226 "Specifies the family of FE shape functions to use for this variable.");
227 params.addParamNamesToGroup("generate_output material_output_order material_output_family",
228 "Output");
229 params.addParam<bool>("verbose", false, "Display extra information.");
230
231 params.addParam<bool>("new_system",
232 false,
233 "If true use the new "
234 "LagrangianStressDiverence kernels.");
235
236 params.addParam<bool>(
237 "compatibility_mode",
238 false,
239 "If true, configure the Lagrangian kernel system to reproduce the OLD "
240 "(StressDivergenceTensors + ComputeFiniteStrain) results bit-for-bit when wrapping an "
241 "old-style ComputeStressBase material like ComputeMultiPlasticityStress. Implies "
242 "`new_system = true` and `formulation = TOTAL`; auto-adds ComputeLagrangianWrappedStress "
243 "around the user-supplied stress material; sets `kinematic_approximation` from "
244 "`decomposition_method`; sets `F_bar_mode = incremental` when "
245 "`volumetric_locking_correction = true`; redirects `stress` / `mechanical_strain` output "
246 "requests to the equivalent NEW-system properties (`cauchy_stress` / "
247 "`rotated_mechanical_strain`).");
248
249 MooseEnum formulationType("TOTAL UPDATED", "TOTAL");
250 params.addParam<MooseEnum>("formulation",
251 formulationType,
252 "Select between the total Lagrangian (TOTAL) "
253 "and updated Lagrangian (UPDATED) formulations "
254 "for the new kernel system.");
255
256 MooseEnum kinematicApproximation("linear quadratic rashid_approximate rashid_eigen", "linear");
257 params.addParam<MooseEnum>(
258 "kinematic_approximation",
259 kinematicApproximation,
260 "Approximation used by the Lagrangian strain calculator to convert the incremental "
261 "deformation gradient into the strain and vorticity increments (large deformation only).");
262
263 params.addRangeCheckedParam<Real>(
264 "generalized_midpoint_alpha",
265 1.0,
266 "generalized_midpoint_alpha >= 0.5 & generalized_midpoint_alpha <= 1.0",
267 "Generalized midpoint weight for the deformation gradient in the Lagrangian strain "
268 "calculator. 1.0 = backward Euler (default), 0.5 = midpoint rule.");
269
270 MooseEnum volumetricLockingCorrectionMode("total incremental", "total");
271 params.addParam<MooseEnum>(
272 "volumetric_locking_correction_mode",
273 volumetricLockingCorrectionMode,
274 "Volumetric part averaged by the F-bar volumetric locking correction in the Lagrangian "
275 "strain calculator: the total (default) or incremental deformation gradient.");
276
277 params.addParamNamesToGroup("add_variables displacements temperature", "Variables");
278 params.addParamNamesToGroup("strain incremental use_finite_deform_jacobian eigenstrain_names "
279 "volumetric_locking_correction kinematic_approximation "
280 "generalized_midpoint_alpha volumetric_locking_correction_mode",
281 "Strain");
282 params.addParamNamesToGroup("new_system compatibility_mode formulation",
283 "Lagrangian formulation");
284
285 return params;
286}
287
289 const InputParameters & parameters)
290 : Action(parameters), _use_ad(getParam<bool>("use_automatic_differentiation"))
291{
292 const auto & params = _app.getInputParameterWarehouse().getInputParameters();
293 InputParameters & pars(*(params.find(uniqueActionName())->second.get()));
294
295 // check if a container block with common parameters is found
297 if (action.size() == 1)
298 pars.applyParameters(action[0]->parameters());
299
300 // append additional_generate_output
301 if (isParamValid("additional_generate_output"))
302 {
303 MultiMooseEnum generate_output = getParam<MultiMooseEnum>("generate_output");
304 MultiMooseEnum additional_generate_output =
305 getParam<MultiMooseEnum>("additional_generate_output");
306
307 MultiMooseEnum material_output_order = getParam<MultiMooseEnum>("material_output_order");
308 MultiMooseEnum additional_material_output_order =
309 getParam<MultiMooseEnum>("additional_material_output_order");
310
311 MultiMooseEnum material_output_family = getParam<MultiMooseEnum>("material_output_family");
312 MultiMooseEnum additional_material_output_family =
313 getParam<MultiMooseEnum>("additional_material_output_family");
314
315 for (auto & output : additional_generate_output)
316 generate_output.setAdditionalValue(output);
317 for (auto & order : additional_material_output_order)
318 material_output_order.setAdditionalValue(order);
319 for (auto & family : additional_material_output_family)
320 material_output_family.setAdditionalValue(family);
321
322 pars.set<MultiMooseEnum>("generate_output") = generate_output;
323 pars.set<MultiMooseEnum>("material_output_order") = material_output_order;
324 pars.set<MultiMooseEnum>("material_output_family") = material_output_family;
325 }
326}
327
335
341
344{
345 std::string options = "";
346 for (auto & r2tc : _rank_two_cartesian_component_table)
347 for (unsigned int a = 0; a < 3; ++a)
348 for (unsigned int b = 0; b < 3; ++b)
349 options += (options == "" ? "" : " ") + r2tc.first + '_' + _component_table[a] +
351
352 for (auto & r2i : _rank_two_invariant_table)
353 for (auto & t : r2i.second.second)
354 options += " " + r2i.first + "_" + t;
355
356 for (auto & r2sdc : _rank_two_directional_component_table)
357 for (auto & r : r2sdc.second.second)
358 options += " " + r2sdc.first + "_" + r;
359
360 for (auto & r2cc : _rank_two_cylindrical_component_table)
361 for (auto & r : r2cc.second.second)
362 options += " " + r2cc.first + "_" + r;
363
364 for (auto & r2sc : _rank_two_spherical_component_table)
365 for (auto & r : r2sc.second.second)
366 options += " " + r2sc.first + "_" + r;
367
368 return MultiMooseEnum(options, "", true);
369}
370
371void
373 const std::string & prop_name)
374{
375 if (prop_name.empty())
376 // the enum name is the actual tensor material property name
377 _rank_two_cartesian_component_table.emplace(enum_name, enum_name);
378 else
379 // supply a different name for the enum options (this is done for
380 // 'strain' -> 'mechanical_strain' in the TMA)
381 _rank_two_cartesian_component_table.emplace(enum_name, prop_name);
382}
std::vector< const T * > getActions()
MooseObjectName uniqueActionName() const
static InputParameters validParams()
MooseApp & _app
ActionWarehouse & _awh
static MooseEnum getAuxVariableOrders()
Store common tensor mechanics parameters.
static MooseEnum decompositionType()
const std::multimap< MooseObjectName, std::shared_ptr< InputParameters > > & getInputParameters(THREAD_ID tid=0) const
void addParamNamesToGroup(const std::string &space_delim_names, const std::string group_name)
void addRequiredParam(const std::string &name, const std::string &doc_string)
void addDeprecatedParam(const std::string &name, const T &value, const std::string &doc_string, const std::string &deprecation_message)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
T & set(const std::string &name, bool quiet_mode=false)
void addRangeCheckedParam(const std::string &name, const T &value, const std::string &parsed_function, const std::string &doc_string)
void applyParameters(const InputParameters &common, const std::vector< std::string > &exclude={}, const bool allow_private=false)
InputParameterWarehouse & getInputParameterWarehouse()
bool isParamValid(const std::string &name) const
std::string getRawNames() const
void setAdditionalValue(const std::string &names)
static std::map< std::string, std::string > _rank_two_cartesian_component_table
static const std::vector< char > _component_table
table data for output generation
static const std::map< std::string, std::pair< std::string, std::vector< std::string > > > _rank_two_invariant_table
QuasiStaticSolidMechanicsPhysicsBase(const InputParameters &params)
static const std::map< std::string, std::pair< std::string, std::vector< std::string > > > _rank_two_spherical_component_table
static void addCartesianComponentOutput(const std::string &name, const std::string &prop_name="")
static const std::map< std::string, std::pair< std::string, std::vector< std::string > > > _rank_two_directional_component_table
static const std::map< std::string, std::pair< std::string, std::vector< std::string > > > _rank_two_cylindrical_component_table