www.mooseframework.org
GeneralizedPlaneStrainActionPD.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 
11 #include "NonlinearSystemBase.h"
12 #include "Factory.h"
13 #include "FEProblemBase.h"
14 #include "MooseObjectAction.h"
15 
16 registerMooseAction("PeridynamicsApp", GeneralizedPlaneStrainActionPD, "add_kernel");
17 registerMooseAction("PeridynamicsApp", GeneralizedPlaneStrainActionPD, "add_user_object");
18 registerMooseAction("PeridynamicsApp", GeneralizedPlaneStrainActionPD, "add_scalar_kernel");
19 
20 template <>
21 InputParameters
23 {
24  InputParameters params = validParams<Action>();
25  params.addClassDescription("Class for setting up the Kernel, ScalarKernel, and UserObject for "
26  "peridynamic generalized plane strain model");
27 
28  params.addRequiredParam<std::vector<VariableName>>(
29  "displacements", "Nonlinear variable name for the displacements");
30  params.addRequiredParam<VariableName>("scalar_out_of_plane_strain",
31  "Scalar variable for strain in the out-of-plane direction");
32  params.addParam<VariableName>("temperature", "Nonlinear variable for the temperature");
33  MooseEnum formulation_option("ORDINARY_STATE NONORDINARY_STATE", "NONORDINARY_STATE");
34  params.addParam<MooseEnum>("formulation",
35  formulation_option,
36  "Available peridynamic formulation options: " +
37  formulation_option.getRawNames());
38  MooseEnum strain_type("SMALL FINITE", "SMALL");
39  params.addParam<MooseEnum>("strain", strain_type, "Strain formulation");
40  params.addParam<VariableName>("out_of_plane_stress_variable",
41  "Name of out-of-plane stress auxiliary variable");
42  params.addParam<FunctionName>(
43  "out_of_plane_pressure",
44  "0",
45  "Function used to prescribe pressure in the out-of-plane direction");
46  params.addParam<Real>("factor", 1.0, "Scale factor applied to prescribed out-of-plane pressure");
47  params.addParam<bool>("full_jacobian",
48  false,
49  "Parameter to set whether to use the nonlocal full Jacobian formulation "
50  "for the scalar components");
51  params.addParam<std::vector<SubdomainName>>("block",
52  "List of ids of the blocks (subdomains) that the "
53  "GeneralizedPlaneStrainActionPD will be applied "
54  "to");
55  params.addParam<std::vector<MaterialPropertyName>>(
56  "eigenstrain_names", "List of eigenstrains to be applied in this strain calculation");
57 
58  return params;
59 }
60 
62  : Action(params),
63  _displacements(getParam<std::vector<VariableName>>("displacements")),
64  _ndisp(_displacements.size()),
65  _formulation(getParam<MooseEnum>("formulation")),
66  _scalar_out_of_plane_strain(getParam<VariableName>("scalar_out_of_plane_strain"))
67 {
68  // Generalized plane strain only applies to two dimensional modeling and simulation
69  if (_ndisp != 2)
70  mooseError("GeneralizedPlaneStrainPD only works for two dimensional case!");
71 
72  // Consistency check
73  if (_formulation == "NONORDINARY_STATE" && isParamValid("out_of_plane_stress_variable"))
74  mooseWarning("Variable out_of_plane_stress_variable will not be used in NONORDINARY_STATE "
75  "formulation option!");
76  if (_formulation == "ORDINARY_STATE" && !isParamValid("out_of_plane_stress_variable"))
77  mooseError("Variable out_of_plane_stress_variable must be provided for ORDINARY_STATE "
78  "formulation option!");
79 }
80 
81 void
83 {
84  if (_current_task == "add_kernel")
85  {
86  std::string k_type;
87  if (_formulation == "ORDINARY_STATE")
88  k_type = "GeneralizedPlaneStrainOffDiagOSPD"; // Based on ordinary state-based model
89  else if (_formulation == "NONORDINARY_STATE")
90  k_type = "GeneralizedPlaneStrainOffDiagNOSPD"; // Based on bond-associated non-ordinary
91  // state-based model
92  else
93  paramError(
94  "formulation",
95  "Unsupported peridynamic formulation. Choose from: ORDINARY_STATE or NONORDINARY_STATE");
96 
97  InputParameters params = _factory.getValidParams(k_type);
98 
99  params.applyParameters(parameters(),
100  {"displacements", "temperature", "scalar_out_of_plane_strain"});
101 
102  params.set<std::vector<VariableName>>("displacements") = _displacements;
103  params.set<std::vector<VariableName>>("scalar_out_of_plane_strain") = {
105 
106  // Coupling between scalar out-of-plane strain and in-plane displacements
107  for (unsigned int i = 0; i < _ndisp; ++i)
108  {
109  std::string k_name = name() + "_GeneralizedPlaneStrainPDOffDiag_disp_" + Moose::stringify(i);
110  params.set<NonlinearVariableName>("variable") = _displacements[i];
111 
112  _problem->addKernel(k_type, k_name, params);
113  }
114 
115  // Coupling between scalar out-of-plane strain and temperature (only when temperature is a
116  // nonlinear variable)
117  if (isParamValid("temperature"))
118  {
119  VariableName temp = getParam<VariableName>("temperature");
120  if (_problem->getNonlinearSystemBase().hasVariable(temp))
121  {
122  params.set<std::vector<VariableName>>("temperature") = {temp};
123 
124  std::string k_name = name() + "_GeneralizedPlaneStrainPDOffDiag_temp";
125  params.set<NonlinearVariableName>("variable") = temp;
126 
127  if (_formulation == "NONORDINARY_STATE")
128  params.set<std::vector<MaterialPropertyName>>("eigenstrain_names") =
129  getParam<std::vector<MaterialPropertyName>>("eigenstrain_names");
130 
131  _problem->addKernel(k_type, k_name, params);
132  }
133  }
134  }
135  else if (_current_task == "add_user_object")
136  {
137  std::string uo_type;
138  if (_formulation == "ORDINARY_STATE")
139  uo_type = "GeneralizedPlaneStrainUserObjectOSPD";
140  else if (_formulation == "NONORDINARY_STATE")
141  uo_type = "GeneralizedPlaneStrainUserObjectNOSPD";
142  else
143  paramError(
144  "formulation",
145  "Unsupported peridynamic formulation. Choose from: ORDINARY_STATE or NONORDINARY_STATE");
146 
147  InputParameters params = _factory.getValidParams(uo_type);
148 
149  std::string uo_name = name() + "_GeneralizedPlaneStrainPDUserObject";
150 
151  params.applyParameters(parameters(), {"out_of_plane_stress_variable"});
152 
153  if (_formulation == "ORDINARY_STATE")
154  params.set<std::vector<VariableName>>("out_of_plane_stress_variable") = {
155  getParam<VariableName>("out_of_plane_stress_variable")};
156 
157  _problem->addUserObject(uo_type, uo_name, params);
158  }
159  else if (_current_task == "add_scalar_kernel")
160  {
161  std::string sk_type("GeneralizedPlaneStrainPD");
162  InputParameters params = _factory.getValidParams(sk_type);
163 
164  std::string sk_name = name() + "_GeneralizedPlaneStrainPD";
165 
166  params.set<NonlinearVariableName>("variable") = _scalar_out_of_plane_strain;
167 
168  // set the UserObjectName using added UserObject
169  params.set<UserObjectName>("generalized_plane_strain_uo") =
170  name() + "_GeneralizedPlaneStrainPDUserObject";
171 
172  _problem->addScalarKernel(sk_type, sk_name, params);
173  }
174  else
175  mooseError("Task error in GeneralizedPlaneStrainActionPD");
176 }
GeneralizedPlaneStrainActionPD.h
GeneralizedPlaneStrainActionPD::_scalar_out_of_plane_strain
VariableName _scalar_out_of_plane_strain
Scalar variable for out-of-plane strain variable.
Definition: GeneralizedPlaneStrainActionPD.h:40
GeneralizedPlaneStrainActionPD::_displacements
std::vector< VariableName > _displacements
Displacement variables.
Definition: GeneralizedPlaneStrainActionPD.h:32
GeneralizedPlaneStrainActionPD::act
virtual void act() override
Definition: GeneralizedPlaneStrainActionPD.C:82
validParams< GeneralizedPlaneStrainActionPD >
InputParameters validParams< GeneralizedPlaneStrainActionPD >()
Definition: GeneralizedPlaneStrainActionPD.C:22
registerMooseAction
registerMooseAction("PeridynamicsApp", GeneralizedPlaneStrainActionPD, "add_kernel")
GeneralizedPlaneStrainActionPD::GeneralizedPlaneStrainActionPD
GeneralizedPlaneStrainActionPD(const InputParameters &params)
Definition: GeneralizedPlaneStrainActionPD.C:61
name
const std::string name
Definition: Setup.h:21
GeneralizedPlaneStrainActionPD::_ndisp
const unsigned int _ndisp
Definition: GeneralizedPlaneStrainActionPD.h:33
GeneralizedPlaneStrainActionPD
Action class to setup peridynamic generalized plane strain models.
Definition: GeneralizedPlaneStrainActionPD.h:23
GeneralizedPlaneStrainActionPD::_formulation
const MooseEnum _formulation
Option to choose which peridynamic model to use for generalized plane strain formulation: ordinary st...
Definition: GeneralizedPlaneStrainActionPD.h:37