https://mooseframework.inl.gov
Loading...
Searching...
No Matches
GlobalStrainAction.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
10#include "GlobalStrainAction.h"
11
12#include "Conversion.h"
13#include "FEProblem.h"
14#include "MooseMesh.h"
15#include "NonlinearSystemBase.h"
16
17#include "libmesh/string_to_enum.h"
18
19registerMooseAction("SolidMechanicsApp", GlobalStrainAction, "add_user_object");
20
21registerMooseAction("SolidMechanicsApp", GlobalStrainAction, "add_scalar_kernel");
22
23registerMooseAction("SolidMechanicsApp", GlobalStrainAction, "add_material");
24
25registerMooseAction("SolidMechanicsApp", GlobalStrainAction, "add_aux_variable");
26
27registerMooseAction("SolidMechanicsApp", GlobalStrainAction, "add_aux_kernel");
28
31{
33 params.addClassDescription("Set up the GlobalStrainAction environment");
34 params.addRequiredParam<VariableName>("scalar_global_strain",
35 "Scalar variable for global strain");
36 params.addParam<std::vector<VariableName>>("displacements", {}, "The displacement variables");
37 params.addParam<std::vector<AuxVariableName>>(
38 "auxiliary_displacements",
39 "The auxliary displacement variables to be calculated from scalar variables");
40 params.addParam<std::vector<AuxVariableName>>(
41 "global_displacements",
42 "The global displacement variables to be calculated from scalar variables");
43 params.addParam<std::vector<Real>>("applied_stress_tensor",
44 "Vector of values defining the constant applied stress "
45 "to add, in order 11, 22, 33, 23, 13, 12");
46 params.addParam<std::string>("base_name", "Material property base name");
47 params.addParam<std::vector<SubdomainName>>(
48 "block", {}, "The block id where this variable lives");
49
50 return params;
51}
52
54 : Action(params),
55 _disp(getParam<std::vector<VariableName>>("displacements")),
56 _aux_disp(getParam<std::vector<AuxVariableName>>("auxiliary_displacements")),
57 _global_disp(getParam<std::vector<AuxVariableName>>("global_displacements")),
58 _block_names(getParam<std::vector<SubdomainName>>("block")),
59 _block_ids()
60{
61 if (_aux_disp.size() != _disp.size())
62 mooseError("Number of auxiliary displacement variables should be equal to the number of "
63 "nonlinear displacement variables, i.e., ",
64 _disp.size());
65}
66
67void
69{
70 // get subdomain IDs
71 for (auto & name : _block_names)
72 _block_ids.insert(_problem->mesh().getSubdomainID(name));
73
74 // user object name
75 const std::string uo_name = _name + "_GlobalStrainUserObject";
76
77 //
78 // Add user object
79 //
80 if (_current_task == "add_user_object")
81 {
82 std::string uo_type = "GlobalStrainUserObject";
83 InputParameters params = _factory.getValidParams(uo_type);
85 params.set<bool>("use_displaced_mesh") = false;
86 params.set<ExecFlagEnum>("execute_on") = {EXEC_INITIAL, EXEC_LINEAR, EXEC_NONLINEAR};
87
88 _problem->addUserObject(uo_type, uo_name, params);
89 }
90
91 //
92 // Add scalar kernel
93 //
94 else if (_current_task == "add_scalar_kernel")
95 {
96 std::string sk_type = "GlobalStrain";
97 InputParameters params = _factory.getValidParams(sk_type);
99 params.set<bool>("use_displaced_mesh") = false;
100 params.set<NonlinearVariableName>("variable") = getParam<VariableName>("scalar_global_strain");
101 params.set<UserObjectName>("global_strain_uo") = uo_name;
102
103 _problem->addScalarKernel(sk_type, _name + "_GlobalStrain", params);
104 }
105
106 //
107 // Add ComputeGlobalStrain material
108 //
109 else if (_current_task == "add_material")
110 {
111 std::string mat_type = "ComputeGlobalStrain";
112 InputParameters params = _factory.getValidParams(mat_type);
113 params.applyParameters(parameters(), {"scalar_global_strain"});
114 params.set<bool>("use_displaced_mesh") = false;
115 params.set<std::vector<VariableName>>("scalar_global_strain") = {
116 getParam<VariableName>("scalar_global_strain")};
117 params.set<UserObjectName>("global_strain_uo") = uo_name;
118
119 _problem->addMaterial(mat_type, _name + "_global_strain", params);
120 }
121
122 //
123 // Add auxiliary displacement variables
124 //
125 else if (_current_task == "add_aux_variable")
126 {
127 auto params = _factory.getValidParams("MooseVariable");
128 // determine necessary order
129 const bool second = _problem->mesh().hasSecondOrderElements();
130
131 params.set<MooseEnum>("order") = second ? "SECOND" : "FIRST";
132 params.set<MooseEnum>("family") = "LAGRANGE";
133
134 for (unsigned int i = 0; i < _aux_disp.size(); ++i)
135 {
136 std::string aux_var_name = _aux_disp[i];
137
138 _problem->addAuxVariable("MooseVariable", aux_var_name, params);
139 }
140
141 for (unsigned int i = 0; i < _global_disp.size(); ++i)
142 {
143 std::string aux_var_name = _global_disp[i];
144
145 _problem->addAuxVariable("MooseVariable", aux_var_name, params);
146 }
147 }
148
149 //
150 // Add aux kernels for computing global displacements
151 //
152 else if (_current_task == "add_aux_kernel")
153 {
154 for (unsigned int i = 0; i < _aux_disp.size(); ++i)
155 {
156 std::string aux_var_name = _aux_disp[i];
157
158 std::string aux_type = "GlobalDisplacementAux";
159 InputParameters params = _factory.getValidParams(aux_type);
160 params.applyParameters(parameters(), {"scalar_global_strain"});
161 params.set<AuxVariableName>("variable") = aux_var_name;
162 params.set<ExecFlagEnum>("execute_on") = EXEC_TIMESTEP_END;
163 params.set<bool>("use_displaced_mesh") = false;
164 params.set<bool>("output_global_displacement") = false;
165 params.set<std::vector<VariableName>>("scalar_global_strain") = {
166 getParam<VariableName>("scalar_global_strain")};
167 params.set<UserObjectName>("global_strain_uo") = uo_name;
168 params.set<unsigned int>("component") = i;
169
170 _problem->addAuxKernel(aux_type, aux_var_name + '_' + name(), params);
171 }
172
173 for (unsigned int i = 0; i < _global_disp.size(); ++i)
174 {
175 std::string aux_var_name = _global_disp[i];
176
177 std::string aux_type = "GlobalDisplacementAux";
178 InputParameters params = _factory.getValidParams(aux_type);
179 params.applyParameters(parameters(), {"scalar_global_strain"});
180 params.set<AuxVariableName>("variable") = aux_var_name;
181 params.set<ExecFlagEnum>("execute_on") = EXEC_TIMESTEP_END;
182 params.set<bool>("use_displaced_mesh") = false;
183 params.set<bool>("output_global_displacement") = true;
184 params.set<std::vector<VariableName>>("scalar_global_strain") = {
185 getParam<VariableName>("scalar_global_strain")};
186 params.set<UserObjectName>("global_strain_uo") = uo_name;
187 params.set<unsigned int>("component") = i;
188
189 _problem->addAuxKernel(aux_type, aux_var_name + '_' + name(), params);
190 }
191 }
192}
registerMooseAction("SolidMechanicsApp", GlobalStrainAction, "add_user_object")
const ExecFlagType EXEC_TIMESTEP_END
const ExecFlagType EXEC_INITIAL
const ExecFlagType EXEC_LINEAR
const ExecFlagType EXEC_NONLINEAR
static InputParameters validParams()
std::shared_ptr< FEProblemBase > & _problem
const std::string & _current_task
InputParameters getValidParams(const std::string &name) const
std::vector< AuxVariableName > _global_disp
GlobalStrainAction(const InputParameters &params)
std::vector< AuxVariableName > _aux_disp
std::vector< VariableName > _disp
static InputParameters validParams()
std::vector< SubdomainName > _block_names
std::set< SubdomainID > _block_ids
void addRequiredParam(const std::string &name, const std::string &doc_string)
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)
void applyParameters(const InputParameters &common, const std::vector< std::string > &exclude={}, const bool allow_private=false)
const InputParameters & parameters() const
const std::string & name() const
void mooseError(Args &&... args) const
const std::string & _name
Factory & _factory