https://mooseframework.inl.gov
Loading...
Searching...
No Matches
XFEMAction.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 "XFEMAction.h"
11
12// MOOSE includes
13#include "FEProblem.h"
14#include "NonlinearSystem.h"
15#include "Executioner.h"
16#include "MooseEnum.h"
17#include "Parser.h"
18#include "Factory.h"
19#include "AddVariableAction.h"
20#include "MooseApp.h"
22
25
26#include "libmesh/transient_system.h"
27#include "libmesh/string_to_enum.h"
28
29// XFEM includes
30#include "XFEM.h"
31
32registerMooseAction("XFEMApp", XFEMAction, "setup_xfem");
33
34registerMooseAction("XFEMApp", XFEMAction, "add_aux_variable");
35
36registerMooseAction("XFEMApp", XFEMAction, "add_aux_kernel");
37
38registerMooseAction("XFEMApp", XFEMAction, "add_variable");
39
40registerMooseAction("XFEMApp", XFEMAction, "add_kernel");
41
42registerMooseAction("XFEMApp", XFEMAction, "add_bc");
43
46{
48
49 params.addParam<std::vector<UserObjectName>>(
50 "geometric_cut_userobjects",
51 {},
52 "List of names of GeometricCutUserObjects with cut info and methods");
53 params.addParam<std::string>("qrule", "volfrac", "XFEM quadrature rule to use");
54 params.addRangeCheckedParam<unsigned int>(
55 "debug_output_level",
56 1,
57 "debug_output_level <= 3",
58 "Controls the amount of debug output from XFEM. 0: None, 1: Summary, 2: Details on "
59 "modifications to mesh, 3: Full dump of element fragment algorithm mesh");
60 params.addRangeCheckedParam<Real>("min_weight_multiplier",
61 1.e-3,
62 "min_weight_multiplier >= 0 & min_weight_multiplier<=1",
63 "Minimum average multiplier applied by XFEM to integration "
64 "point weights for partial elements");
65 params.addParam<bool>("output_cut_plane", false, "Output the XFEM cut plane and volume fraction");
66 params.addParam<bool>("use_crack_growth_increment", false, "Use fixed crack growth increment");
67 params.addParam<Real>("crack_growth_increment", 0.1, "Crack growth increment");
68 params.addParam<bool>("use_crack_tip_enrichment", false, "Use crack tip enrichment functions");
69 params.addParam<UserObjectName>("crack_front_definition",
70 "The CrackFrontDefinition user object name (only "
71 "needed if 'use_crack_tip_enrichment=true')");
72 params.addParam<std::vector<VariableName>>("displacements",
73 "Names of displacement variables (only "
74 "needed if 'use_crack_tip_enrichment=true')");
75 params.addParam<std::vector<VariableName>>("enrichment_displacements",
76 "Names of enrichment displacement variables (only "
77 "needed if 'use_crack_tip_enrichment=true')");
78 params.addParam<std::vector<BoundaryName>>("cut_off_boundary",
79 "Boundary that contains all nodes for which "
80 "enrichment DOFs should be fixed away from crack tip "
81 "(only needed if 'use_crack_tip_enrichment=true')");
82 params.addParam<Real>("cut_off_radius",
83 "The cut off radius of crack tip enrichment functions (only needed if "
84 "'use_crack_tip_enrichment=true')");
85 params.addClassDescription("Action to input general parameters and simulation options for use "
86 "in XFEM.");
87 return params;
88}
89
91 : Action(params),
92 _geom_cut_userobjects(getParam<std::vector<UserObjectName>>("geometric_cut_userobjects")),
93 _xfem_qrule(getParam<std::string>("qrule")),
94 _xfem_cut_plane(false),
95 _xfem_use_crack_growth_increment(getParam<bool>("use_crack_growth_increment")),
96 _xfem_crack_growth_increment(getParam<Real>("crack_growth_increment")),
97 _use_crack_tip_enrichment(getParam<bool>("use_crack_tip_enrichment"))
98{
99 _order = "CONSTANT";
100 _family = "MONOMIAL";
101 if (isParamValid("output_cut_plane"))
102 _xfem_cut_plane = getParam<bool>("output_cut_plane");
103
105 {
106 if (isParamValid("crack_front_definition"))
107 _crack_front_definition = getParam<UserObjectName>("crack_front_definition");
108 else
109 mooseError("To add crack tip enrichment, crack_front_definition must be provided.");
110
111 if (isParamValid("displacements"))
112 _displacements = getParam<std::vector<VariableName>>("displacements");
113 else
114 mooseError("To add crack tip enrichment, displacements must be provided.");
115
116 if (isParamValid("enrichment_displacements"))
117 {
118 _enrich_displacements = getParam<std::vector<VariableName>>("enrichment_displacements");
119 if (_enrich_displacements.size() != 8 && _displacements.size() == 2)
120 mooseError("The number of enrichment displacements should be total 8 for 2D.");
121 else if (_enrich_displacements.size() != 12 && _displacements.size() == 3)
122 mooseError("The number of enrichment displacements should be total 12 for 3D.");
123 }
124 else
125 mooseError("To add crack tip enrichment, enrichment_displacements must be provided.");
126
127 if (isParamValid("cut_off_boundary"))
128 _cut_off_bc = getParam<std::vector<BoundaryName>>("cut_off_boundary");
129 else
130 mooseError("To add crack tip enrichment, cut_off_boundary must be provided.");
131
132 if (isParamValid("cut_off_radius"))
133 _cut_off_radius = getParam<Real>("cut_off_radius");
134 else
135 mooseError("To add crack tip enrichment, cut_off_radius must be provided.");
136 }
137}
138
139void
141{
142
143 std::shared_ptr<XFEMInterface> xfem_interface = _problem->getXFEM();
144 if (xfem_interface == nullptr)
145 {
146 const auto & params = _app.getInputParameterWarehouse().getInputParameters();
147 InputParameters & pars(*(params.find(uniqueActionName())->second.get()));
148 pars.set<FEProblemBase *>("_fe_problem_base") = &*_problem;
149 std::shared_ptr<XFEM> new_xfem(new XFEM(_pars));
150 _problem->initXFEM(new_xfem);
151 xfem_interface = _problem->getXFEM();
152 }
153
154 std::shared_ptr<XFEM> xfem = MooseSharedNamespace::dynamic_pointer_cast<XFEM>(xfem_interface);
155 if (xfem == nullptr)
156 mooseError("dynamic cast of xfem object failed");
157
158 if (_current_task == "setup_xfem")
159 {
160 xfem->setXFEMQRule(_xfem_qrule);
161
163 xfem->setDebugOutputLevel(getParam<unsigned int>("debug_output_level"));
164 xfem->setMinWeightMultiplier(getParam<Real>("min_weight_multiplier"));
165 }
166 else if (_current_task == "add_variable" && _use_crack_tip_enrichment)
167 {
168 auto var_params = _factory.getValidParams("MooseVariable");
169 var_params.set<MooseEnum>("family") = "LAGRANGE";
170 var_params.set<MooseEnum>("order") = "FIRST";
171
172 for (const auto & enrich_disp : _enrich_displacements)
173 _problem->addVariable("MooseVariable", enrich_disp, var_params);
174 }
175 else if (_current_task == "add_kernel" && _use_crack_tip_enrichment)
176 {
177 for (unsigned int i = 0; i < _enrich_displacements.size(); ++i)
178 {
179 InputParameters params = _factory.getValidParams("CrackTipEnrichmentStressDivergenceTensors");
180 params.set<NonlinearVariableName>("variable") = _enrich_displacements[i];
181 params.set<unsigned int>("component") = i / 4;
182 params.set<unsigned int>("enrichment_component") = i % 4;
183 params.set<UserObjectName>("crack_front_definition") = _crack_front_definition;
184 params.set<std::vector<VariableName>>("enrichment_displacements") = _enrich_displacements;
185 params.set<std::vector<VariableName>>("displacements") = _displacements;
186 _problem->addKernel(
187 "CrackTipEnrichmentStressDivergenceTensors", _enrich_displacements[i], params);
188 }
189 }
190 else if (_current_task == "add_bc" && _use_crack_tip_enrichment)
191 {
192 for (unsigned int i = 0; i < _enrich_displacements.size(); ++i)
193 {
194 InputParameters params = _factory.getValidParams("CrackTipEnrichmentCutOffBC");
195 params.set<NonlinearVariableName>("variable") = _enrich_displacements[i];
196 params.set<Real>("value") = 0;
197 params.set<std::vector<BoundaryName>>("boundary") = _cut_off_bc;
198 params.set<Real>("cut_off_radius") = _cut_off_radius;
199 params.set<UserObjectName>("crack_front_definition") = _crack_front_definition;
200 _problem->addBoundaryCondition(
201 "CrackTipEnrichmentCutOffBC", _enrich_displacements[i], params);
202 }
203 }
204 else if (_current_task == "add_aux_variable" && _xfem_cut_plane)
205 {
206 auto var_params = _factory.getValidParams("MooseVariableConstMonomial");
207
208 _problem->addAuxVariable("MooseVariableConstMonomial", "xfem_cut_origin_x", var_params);
209 _problem->addAuxVariable("MooseVariableConstMonomial", "xfem_cut_origin_y", var_params);
210 _problem->addAuxVariable("MooseVariableConstMonomial", "xfem_cut_origin_z", var_params);
211 _problem->addAuxVariable("MooseVariableConstMonomial", "xfem_cut_normal_x", var_params);
212 _problem->addAuxVariable("MooseVariableConstMonomial", "xfem_cut_normal_y", var_params);
213 _problem->addAuxVariable("MooseVariableConstMonomial", "xfem_cut_normal_z", var_params);
214 _problem->addAuxVariable("MooseVariableConstMonomial", "xfem_cut2_origin_x", var_params);
215 _problem->addAuxVariable("MooseVariableConstMonomial", "xfem_cut2_origin_y", var_params);
216 _problem->addAuxVariable("MooseVariableConstMonomial", "xfem_cut2_origin_z", var_params);
217 _problem->addAuxVariable("MooseVariableConstMonomial", "xfem_cut2_normal_x", var_params);
218 _problem->addAuxVariable("MooseVariableConstMonomial", "xfem_cut2_normal_y", var_params);
219 _problem->addAuxVariable("MooseVariableConstMonomial", "xfem_cut2_normal_z", var_params);
220 _problem->addAuxVariable("MooseVariableConstMonomial", "xfem_volfrac", var_params);
221 }
222 else if (_current_task == "add_aux_kernel" && _xfem_cut_plane)
223 {
224 InputParameters params = _factory.getValidParams("XFEMVolFracAux");
225 params.set<ExecFlagEnum>("execute_on") = EXEC_TIMESTEP_BEGIN;
226 params.set<AuxVariableName>("variable") = "xfem_volfrac";
227 _problem->addAuxKernel("XFEMVolFracAux", "xfem_volfrac", params);
228
229 params = _factory.getValidParams("XFEMCutPlaneAux");
230 params.set<ExecFlagEnum>("execute_on") = EXEC_TIMESTEP_END;
231
232 // first cut plane
233 params.set<unsigned int>("plane_id") = 0;
234
235 params.set<AuxVariableName>("variable") = "xfem_cut_origin_x";
236 params.set<MooseEnum>("quantity") = "origin_x";
237 _problem->addAuxKernel("XFEMCutPlaneAux", "xfem_cut_origin_x", params);
238
239 params.set<AuxVariableName>("variable") = "xfem_cut_origin_y";
240 params.set<MooseEnum>("quantity") = "origin_y";
241 _problem->addAuxKernel("XFEMCutPlaneAux", "xfem_cut_origin_y", params);
242
243 params.set<AuxVariableName>("variable") = "xfem_cut_origin_z";
244 params.set<MooseEnum>("quantity") = "origin_z";
245 _problem->addAuxKernel("XFEMCutPlaneAux", "xfem_cut_origin_z", params);
246
247 params.set<AuxVariableName>("variable") = "xfem_cut_normal_x";
248 params.set<MooseEnum>("quantity") = "normal_x";
249 _problem->addAuxKernel("XFEMCutPlaneAux", "xfem_cut_normal_x", params);
250
251 params.set<AuxVariableName>("variable") = "xfem_cut_normal_y";
252 params.set<MooseEnum>("quantity") = "normal_y";
253 _problem->addAuxKernel("XFEMCutPlaneAux", "xfem_cut_normal_y", params);
254
255 params.set<AuxVariableName>("variable") = "xfem_cut_normal_z";
256 params.set<MooseEnum>("quantity") = "normal_z";
257 _problem->addAuxKernel("XFEMCutPlaneAux", "xfem_cut_normal_z", params);
258
259 // second cut plane
260 params.set<unsigned int>("plane_id") = 1;
261
262 params.set<AuxVariableName>("variable") = "xfem_cut2_origin_x";
263 params.set<MooseEnum>("quantity") = "origin_x";
264 _problem->addAuxKernel("XFEMCutPlaneAux", "xfem_cut2_origin_x", params);
265
266 params.set<AuxVariableName>("variable") = "xfem_cut2_origin_y";
267 params.set<MooseEnum>("quantity") = "origin_y";
268 _problem->addAuxKernel("XFEMCutPlaneAux", "xfem_cut2_origin_y", params);
269
270 params.set<AuxVariableName>("variable") = "xfem_cut2_origin_z";
271 params.set<MooseEnum>("quantity") = "origin_z";
272 _problem->addAuxKernel("XFEMCutPlaneAux", "xfem_cut2_origin_z", params);
273
274 params.set<AuxVariableName>("variable") = "xfem_cut2_normal_x";
275 params.set<MooseEnum>("quantity") = "normal_x";
276 _problem->addAuxKernel("XFEMCutPlaneAux", "xfem_cut2_normal_x", params);
277
278 params.set<AuxVariableName>("variable") = "xfem_cut2_normal_y";
279 params.set<MooseEnum>("quantity") = "normal_y";
280 _problem->addAuxKernel("XFEMCutPlaneAux", "xfem_cut2_normal_y", params);
281
282 params.set<AuxVariableName>("variable") = "xfem_cut2_normal_z";
283 params.set<MooseEnum>("quantity") = "normal_z";
284 _problem->addAuxKernel("XFEMCutPlaneAux", "xfem_cut2_normal_z", params);
285 }
286}
const ExecFlagType EXEC_TIMESTEP_END
const ExecFlagType EXEC_TIMESTEP_BEGIN
registerMooseAction("XFEMApp", XFEMAction, "setup_xfem")
MooseObjectName uniqueActionName() const
static InputParameters validParams()
MooseApp & _app
std::shared_ptr< FEProblemBase > & _problem
const std::string & _current_task
InputParameters getValidParams(const std::string &name) const
const std::multimap< MooseObjectName, std::shared_ptr< InputParameters > > & getInputParameters(THREAD_ID tid=0) const
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 addRangeCheckedParam(const std::string &name, const T &value, const std::string &parsed_function, const std::string &doc_string)
InputParameterWarehouse & getInputParameterWarehouse()
void mooseError(Args &&... args) const
const InputParameters & _pars
bool isParamValid(const std::string &name) const
Factory & _factory
bool _use_crack_tip_enrichment
Definition XFEMAction.h:32
static InputParameters validParams()
Definition XFEMAction.C:45
virtual void act()
Definition XFEMAction.C:140
std::string _family
Definition XFEMAction.h:28
XFEMAction(const InputParameters &params)
Definition XFEMAction.C:90
std::vector< VariableName > _displacements
Definition XFEMAction.h:35
std::string _xfem_qrule
Definition XFEMAction.h:26
std::vector< VariableName > _enrich_displacements
Definition XFEMAction.h:34
UserObjectName _crack_front_definition
Definition XFEMAction.h:33
std::vector< BoundaryName > _cut_off_bc
Definition XFEMAction.h:36
std::string _order
Definition XFEMAction.h:27
bool _xfem_cut_plane
Definition XFEMAction.h:29
bool _xfem_use_crack_growth_increment
Definition XFEMAction.h:30
Real _xfem_crack_growth_increment
Definition XFEMAction.h:31
Real _cut_off_radius
Definition XFEMAction.h:37
This is the XFEM class.
Definition XFEM.h:108