11 #include "FEProblemBase.h"
12 #include "Conversion.h"
13 #include "MooseObjectAction.h"
16 #include "libmesh/string_to_enum.h"
29 InputParameters params = validParams<Action>();
30 params.addClassDescription(
"Class for setting up peridynamic kernels");
32 params.addRequiredParam<std::vector<VariableName>>(
33 "displacements",
"Nonlinear variable names for the displacements");
34 MooseEnum formulation_option(
"BOND ORDINARY_STATE NONORDINARY_STATE");
35 params.addRequiredParam<MooseEnum>(
"formulation",
37 "Available peridynamic formulation options: " +
38 formulation_option.getRawNames());
39 MooseEnum stabilization_option(
"FORCE SELF",
"SELF");
40 params.addParam<MooseEnum>(
43 "Available stabilization options for Non-Ordinary State Based Peridynamics: " +
44 stabilization_option.getRawNames());
45 params.addParam<
bool>(
48 "Parameter to set whether to use full jacobian for state based formulation or not");
49 MooseEnum strain_type(
"SMALL FINITE",
"SMALL");
50 params.addParam<MooseEnum>(
"strain", strain_type,
"Strain formulation");
51 params.addParam<VariableName>(
"temperature",
"Nonlinear variable name for the temperature");
52 params.addParam<VariableName>(
"out_of_plane_strain",
53 "Nonlinear variable name for the out_of_plane strain for "
54 "plane stress using SNOSPD formulation");
55 params.addParam<std::vector<SubdomainName>>(
"block",
56 "List of ids of the blocks (subdomains) that the "
57 "peridynamic mechanics kernel will be applied to");
58 params.addParam<std::vector<AuxVariableName>>(
"save_in",
"The displacement residuals");
59 params.addParam<std::vector<AuxVariableName>>(
"diag_save_in",
60 "The displacement diagonal preconditioner terms");
61 params.addParam<std::vector<MaterialPropertyName>>(
63 "List of eigenstrains to be coupled in non-ordinary state-based mechanics kernels");
70 _displacements(getParam<std::vector<VariableName>>(
"displacements")),
71 _ndisp(_displacements.size()),
72 _formulation(getParam<MooseEnum>(
"formulation")),
73 _stabilization(getParam<MooseEnum>(
"stabilization")),
74 _strain(getParam<MooseEnum>(
"strain")),
75 _subdomain_names(getParam<std::vector<SubdomainName>>(
"block")),
77 _save_in(getParam<std::vector<AuxVariableName>>(
"save_in")),
78 _diag_save_in(getParam<std::vector<AuxVariableName>>(
"diag_save_in"))
82 mooseError(
"Number of save_in variables should equal to the number of displacement variables ",
87 "Number of diag_save_in variables should equal to the number of displacement variables ",
94 if (_current_task ==
"setup_mesh_complete")
100 else if (_current_task ==
"create_problem_complete")
104 for (
const auto & action : actions)
107 const auto added_size = action->_subdomain_ids.size();
111 if (size_after != size_before + added_size)
112 mooseError(
"The block restrictions in the Peridynamics/Mechanics/Master actions must be "
115 if (added_size == 0 && actions.size() > 1)
117 "No Peridynamics/Mechanics/Master action can be block unrestricted if more than one "
118 "Peridynamics/Mechanics/Master action is specified.");
121 else if (_current_task ==
"add_aux_variable")
124 const std::string var_type =
"MooseVariableConstMonomial";
125 InputParameters params = _factory.getValidParams(var_type);
126 params.set<MooseEnum>(
"order") =
"CONSTANT";
127 params.set<MooseEnum>(
"family") =
"MONOMIAL";
131 params.set<std::vector<SubdomainName>>(
"block").push_back(Moose::stringify(
id));
133 _problem->addAuxVariable(var_type,
"bond_status", params);
135 else if (_current_task ==
"add_ic")
137 const std::string ic_type =
"ConstantIC";
138 const std::string ic_name =
name() +
"bond_status";
140 InputParameters params = _factory.getValidParams(ic_type);
141 params.set<VariableName>(
"variable") =
"bond_status";
142 params.set<Real>(
"value") = 1.0;
145 if (isParamValid(
"block"))
148 _problem->addInitialCondition(ic_type, ic_name, params);
150 else if (_current_task ==
"add_user_object")
153 const std::string uo_type =
"GhostElemPD";
154 const std::string uo_name =
name() +
"GhostElemPD";
156 InputParameters params = _factory.getValidParams(uo_type);
157 params.set<
bool>(
"use_displaced_mesh") = (
_strain ==
"FINITE");
159 _problem->addUserObject(uo_type, uo_name, params);
161 else if (_current_task ==
"add_kernel")
166 for (
unsigned int i = 0; i <
_ndisp; ++i)
168 const std::string kernel_object_name =
name() +
"Peridynamics_" + Moose::stringify(i);
170 params.set<
unsigned int>(
"component") = i;
171 params.set<NonlinearVariableName>(
"variable") =
_displacements[i];
174 params.set<std::vector<AuxVariableName>>(
"save_in") = {
_save_in[i]};
176 params.set<std::vector<AuxVariableName>>(
"diag_save_in") = {
_diag_save_in[i]};
178 _problem->addKernel(kernel_name, kernel_object_name, params);
182 mooseError(
"Task error in MechanicsActionPD");
191 name =
"MechanicsBPD";
193 name =
"MechanicsOSPD";
197 name =
"ForceStabilizedSmallStrainMechanicsNOSPD";
201 name =
"FiniteStrainMechanicsNOSPD";
203 name =
"SmallStrainMechanicsNOSPD";
206 paramError(
"stabilization",
"Unknown PD stabilization scheme. Choose from: FORCE SELF");
211 "Unsupported peridynamic formulation. Choose from: BOND ORDINARY_STATE NONORDINARY_STATE");
219 InputParameters params = _factory.getValidParams(
name);
221 params.applyParameters(parameters(),
224 "out_of_plane_strain",
226 "use_displaced_mesh",
230 params.set<std::vector<VariableName>>(
"displacements") =
_displacements;
231 if (isParamValid(
"temperature"))
232 params.set<std::vector<VariableName>>(
"temperature") = {getParam<VariableName>(
"temperature")};
233 if (isParamValid(
"out_of_plane_strain"))
234 params.set<std::vector<VariableName>>(
"out_of_plane_strain") = {
235 getParam<VariableName>(
"out_of_plane_strain")};
238 params.set<
bool>(
"use_displaced_mesh") =
false;
240 if (
_formulation ==
"NONORDINARY_STATE" && isParamValid(
"eigenstrain_names"))
242 params.set<std::vector<MaterialPropertyName>>(
"eigenstrain_names") =
243 getParam<std::vector<MaterialPropertyName>>(
"eigenstrain_names");