13 #include "FEProblem.h"
14 #include "NonlinearSystem.h"
15 #include "Executioner.h"
16 #include "MooseEnum.h"
19 #include "AddVariableAction.h"
24 #include "libmesh/transient_system.h"
25 #include "libmesh/string_to_enum.h"
46 InputParameters params = validParams<Action>();
48 params.addParam<std::vector<UserObjectName>>(
49 "geometric_cut_userobjects",
50 "List of names of GeometricCutUserObjects with cut info and methods");
51 params.addParam<std::string>(
"qrule",
"volfrac",
"XFEM quadrature rule to use");
52 params.addRangeCheckedParam<
unsigned int>(
55 "debug_output_level <= 3",
56 "Controls the amount of debug output from XFEM. 0: None, 1: Summary, 2: Details on "
57 "modifications to mesh, 3: Full dump of element fragment algorithm mesh");
58 params.addParam<
bool>(
"output_cut_plane",
false,
"Output the XFEM cut plane and volume fraction");
59 params.addParam<
bool>(
"use_crack_growth_increment",
false,
"Use fixed crack growth increment");
60 params.addParam<Real>(
"crack_growth_increment", 0.1,
"Crack growth increment");
61 params.addParam<
bool>(
"use_crack_tip_enrichment",
false,
"Use crack tip enrichment functions");
62 params.addParam<UserObjectName>(
"crack_front_definition",
63 "The CrackFrontDefinition user object name (only "
64 "needed if 'use_crack_tip_enrichment=true')");
65 params.addParam<std::vector<VariableName>>(
"displacements",
66 "Names of displacement variables (only "
67 "needed if 'use_crack_tip_enrichment=true')");
68 params.addParam<std::vector<VariableName>>(
"enrichment_displacements",
69 "Names of enrichment displacement variables (only "
70 "needed if 'use_crack_tip_enrichment=true')");
71 params.addParam<std::vector<BoundaryName>>(
"cut_off_boundary",
72 "Boundary that contains all nodes for which "
73 "enrichment DOFs should be fixed away from crack tip "
74 "(only needed if 'use_crack_tip_enrichment=true')");
75 params.addParam<Real>(
"cut_off_radius",
76 "The cut off radius of crack tip enrichment functions (only needed if "
77 "'use_crack_tip_enrichment=true')");
83 _geom_cut_userobjects(getParam<std::vector<UserObjectName>>(
"geometric_cut_userobjects")),
84 _xfem_qrule(getParam<std::string>(
"qrule")),
85 _xfem_cut_plane(false),
86 _xfem_use_crack_growth_increment(getParam<bool>(
"use_crack_growth_increment")),
87 _xfem_crack_growth_increment(getParam<Real>(
"crack_growth_increment")),
88 _use_crack_tip_enrichment(getParam<bool>(
"use_crack_tip_enrichment"))
92 if (isParamValid(
"output_cut_plane"))
97 if (isParamValid(
"crack_front_definition"))
100 mooseError(
"To add crack tip enrichment, crack_front_definition must be provided.");
102 if (isParamValid(
"displacements"))
103 _displacements = getParam<std::vector<VariableName>>(
"displacements");
105 mooseError(
"To add crack tip enrichment, displacements must be provided.");
107 if (isParamValid(
"enrichment_displacements"))
111 mooseError(
"The number of enrichment displacements should be total 8 for 2D.");
113 mooseError(
"The number of enrichment displacements should be total 12 for 3D.");
116 mooseError(
"To add crack tip enrichment, enrichment_displacements must be provided.");
118 if (isParamValid(
"cut_off_boundary"))
119 _cut_off_bc = getParam<std::vector<BoundaryName>>(
"cut_off_boundary");
121 mooseError(
"To add crack tip enrichment, cut_off_boundary must be provided.");
123 if (isParamValid(
"cut_off_radius"))
126 mooseError(
"To add crack tip enrichment, cut_off_radius must be provided.");
134 std::shared_ptr<XFEMInterface> xfem_interface = _problem->getXFEM();
135 if (xfem_interface == NULL)
137 _pars.set<FEProblemBase *>(
"_fe_problem_base") = &*_problem;
138 std::shared_ptr<XFEM> new_xfem(
new XFEM(_pars));
139 _problem->initXFEM(new_xfem);
140 xfem_interface = _problem->getXFEM();
143 std::shared_ptr<XFEM> xfem = MooseSharedNamespace::dynamic_pointer_cast<XFEM>(xfem_interface);
145 mooseError(
"dynamic cast of xfem object failed");
147 if (_current_task ==
"setup_xfem")
152 xfem->setDebugOutputLevel(getParam<unsigned int>(
"debug_output_level"));
156 auto var_params = _factory.getValidParams(
"MooseVariable");
157 var_params.set<MooseEnum>(
"family") =
"LAGRANGE";
158 var_params.set<MooseEnum>(
"order") =
"FIRST";
161 _problem->addVariable(
"MooseVariable", enrich_disp, var_params);
167 InputParameters params = _factory.getValidParams(
"CrackTipEnrichmentStressDivergenceTensors");
169 params.set<
unsigned int>(
"component") = i / 4;
170 params.set<
unsigned int>(
"enrichment_component") = i % 4;
173 params.set<std::vector<VariableName>>(
"displacements") =
_displacements;
182 InputParameters params = _factory.getValidParams(
"CrackTipEnrichmentCutOffBC");
184 params.set<Real>(
"value") = 0;
185 params.set<std::vector<BoundaryName>>(
"boundary") =
_cut_off_bc;
188 _problem->addBoundaryCondition(
194 auto var_params = _factory.getValidParams(
"MooseVariableConstMonomial");
196 _problem->addAuxVariable(
"MooseVariableConstMonomial",
"xfem_cut_origin_x", var_params);
197 _problem->addAuxVariable(
"MooseVariableConstMonomial",
"xfem_cut_origin_y", var_params);
198 _problem->addAuxVariable(
"MooseVariableConstMonomial",
"xfem_cut_origin_z", var_params);
199 _problem->addAuxVariable(
"MooseVariableConstMonomial",
"xfem_cut_normal_x", var_params);
200 _problem->addAuxVariable(
"MooseVariableConstMonomial",
"xfem_cut_normal_y", var_params);
201 _problem->addAuxVariable(
"MooseVariableConstMonomial",
"xfem_cut_normal_z", var_params);
202 _problem->addAuxVariable(
"MooseVariableConstMonomial",
"xfem_cut2_origin_x", var_params);
203 _problem->addAuxVariable(
"MooseVariableConstMonomial",
"xfem_cut2_origin_y", var_params);
204 _problem->addAuxVariable(
"MooseVariableConstMonomial",
"xfem_cut2_origin_z", var_params);
205 _problem->addAuxVariable(
"MooseVariableConstMonomial",
"xfem_cut2_normal_x", var_params);
206 _problem->addAuxVariable(
"MooseVariableConstMonomial",
"xfem_cut2_normal_y", var_params);
207 _problem->addAuxVariable(
"MooseVariableConstMonomial",
"xfem_cut2_normal_z", var_params);
208 _problem->addAuxVariable(
"MooseVariableConstMonomial",
"xfem_volfrac", var_params);
212 InputParameters params = _factory.getValidParams(
"XFEMVolFracAux");
213 params.set<ExecFlagEnum>(
"execute_on") = EXEC_TIMESTEP_BEGIN;
214 params.set<AuxVariableName>(
"variable") =
"xfem_volfrac";
215 _problem->addAuxKernel(
"XFEMVolFracAux",
"xfem_volfrac", params);
217 params = _factory.getValidParams(
"XFEMCutPlaneAux");
218 params.set<ExecFlagEnum>(
"execute_on") = EXEC_TIMESTEP_END;
221 params.set<
unsigned int>(
"plane_id") = 0;
223 params.set<AuxVariableName>(
"variable") =
"xfem_cut_origin_x";
224 params.set<MooseEnum>(
"quantity") =
"origin_x";
225 _problem->addAuxKernel(
"XFEMCutPlaneAux",
"xfem_cut_origin_x", params);
227 params.set<AuxVariableName>(
"variable") =
"xfem_cut_origin_y";
228 params.set<MooseEnum>(
"quantity") =
"origin_y";
229 _problem->addAuxKernel(
"XFEMCutPlaneAux",
"xfem_cut_origin_y", params);
231 params.set<AuxVariableName>(
"variable") =
"xfem_cut_origin_z";
232 params.set<MooseEnum>(
"quantity") =
"origin_z";
233 _problem->addAuxKernel(
"XFEMCutPlaneAux",
"xfem_cut_origin_z", params);
235 params.set<AuxVariableName>(
"variable") =
"xfem_cut_normal_x";
236 params.set<MooseEnum>(
"quantity") =
"normal_x";
237 _problem->addAuxKernel(
"XFEMCutPlaneAux",
"xfem_cut_normal_x", params);
239 params.set<AuxVariableName>(
"variable") =
"xfem_cut_normal_y";
240 params.set<MooseEnum>(
"quantity") =
"normal_y";
241 _problem->addAuxKernel(
"XFEMCutPlaneAux",
"xfem_cut_normal_y", params);
243 params.set<AuxVariableName>(
"variable") =
"xfem_cut_normal_z";
244 params.set<MooseEnum>(
"quantity") =
"normal_z";
245 _problem->addAuxKernel(
"XFEMCutPlaneAux",
"xfem_cut_normal_z", params);
248 params.set<
unsigned int>(
"plane_id") = 1;
250 params.set<AuxVariableName>(
"variable") =
"xfem_cut2_origin_x";
251 params.set<MooseEnum>(
"quantity") =
"origin_x";
252 _problem->addAuxKernel(
"XFEMCutPlaneAux",
"xfem_cut2_origin_x", params);
254 params.set<AuxVariableName>(
"variable") =
"xfem_cut2_origin_y";
255 params.set<MooseEnum>(
"quantity") =
"origin_y";
256 _problem->addAuxKernel(
"XFEMCutPlaneAux",
"xfem_cut2_origin_y", params);
258 params.set<AuxVariableName>(
"variable") =
"xfem_cut2_origin_z";
259 params.set<MooseEnum>(
"quantity") =
"origin_z";
260 _problem->addAuxKernel(
"XFEMCutPlaneAux",
"xfem_cut2_origin_z", params);
262 params.set<AuxVariableName>(
"variable") =
"xfem_cut2_normal_x";
263 params.set<MooseEnum>(
"quantity") =
"normal_x";
264 _problem->addAuxKernel(
"XFEMCutPlaneAux",
"xfem_cut2_normal_x", params);
266 params.set<AuxVariableName>(
"variable") =
"xfem_cut2_normal_y";
267 params.set<MooseEnum>(
"quantity") =
"normal_y";
268 _problem->addAuxKernel(
"XFEMCutPlaneAux",
"xfem_cut2_normal_y", params);
270 params.set<AuxVariableName>(
"variable") =
"xfem_cut2_normal_z";
271 params.set<MooseEnum>(
"quantity") =
"normal_z";
272 _problem->addAuxKernel(
"XFEMCutPlaneAux",
"xfem_cut2_normal_z", params);