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