26 #include "libmesh/transient_system.h" 27 #include "libmesh/string_to_enum.h" 49 params.
addParam<std::vector<UserObjectName>>(
50 "geometric_cut_userobjects",
52 "List of names of GeometricCutUserObjects with cut info and methods");
53 params.
addParam<std::string>(
"qrule",
"volfrac",
"XFEM quadrature rule to use");
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.
addParam<
bool>(
"output_cut_plane",
false,
"Output the XFEM cut plane and volume fraction");
61 params.
addParam<
bool>(
"use_crack_growth_increment",
false,
"Use fixed crack growth increment");
62 params.
addParam<
Real>(
"crack_growth_increment", 0.1,
"Crack growth increment");
63 params.
addParam<
bool>(
"use_crack_tip_enrichment",
false,
"Use crack tip enrichment functions");
64 params.
addParam<UserObjectName>(
"crack_front_definition",
65 "The CrackFrontDefinition user object name (only " 66 "needed if 'use_crack_tip_enrichment=true')");
67 params.
addParam<std::vector<VariableName>>(
"displacements",
68 "Names of displacement variables (only " 69 "needed if 'use_crack_tip_enrichment=true')");
70 params.
addParam<std::vector<VariableName>>(
"enrichment_displacements",
71 "Names of enrichment displacement variables (only " 72 "needed if 'use_crack_tip_enrichment=true')");
73 params.
addParam<std::vector<BoundaryName>>(
"cut_off_boundary",
74 "Boundary that contains all nodes for which " 75 "enrichment DOFs should be fixed away from crack tip " 76 "(only needed if 'use_crack_tip_enrichment=true')");
78 "The cut off radius of crack tip enrichment functions (only needed if " 79 "'use_crack_tip_enrichment=true')");
80 params.
addClassDescription(
"Action to input general parameters and simulation options for use " 87 _geom_cut_userobjects(getParam<
std::vector<UserObjectName>>(
"geometric_cut_userobjects")),
88 _xfem_qrule(getParam<
std::string>(
"qrule")),
89 _xfem_cut_plane(false),
90 _xfem_use_crack_growth_increment(getParam<bool>(
"use_crack_growth_increment")),
91 _xfem_crack_growth_increment(getParam<
Real>(
"crack_growth_increment")),
92 _use_crack_tip_enrichment(getParam<bool>(
"use_crack_tip_enrichment"))
104 mooseError(
"To add crack tip enrichment, crack_front_definition must be provided.");
107 _displacements = getParam<std::vector<VariableName>>(
"displacements");
109 mooseError(
"To add crack tip enrichment, displacements must be provided.");
115 mooseError(
"The number of enrichment displacements should be total 8 for 2D.");
117 mooseError(
"The number of enrichment displacements should be total 12 for 3D.");
120 mooseError(
"To add crack tip enrichment, enrichment_displacements must be provided.");
123 _cut_off_bc = getParam<std::vector<BoundaryName>>(
"cut_off_boundary");
125 mooseError(
"To add crack tip enrichment, cut_off_boundary must be provided.");
130 mooseError(
"To add crack tip enrichment, cut_off_radius must be provided.");
138 std::shared_ptr<XFEMInterface> xfem_interface =
_problem->getXFEM();
139 if (xfem_interface ==
nullptr)
144 std::shared_ptr<XFEM> new_xfem(
new XFEM(
_pars));
146 xfem_interface =
_problem->getXFEM();
149 std::shared_ptr<XFEM> xfem = MooseSharedNamespace::dynamic_pointer_cast<
XFEM>(xfem_interface);
151 mooseError(
"dynamic cast of xfem object failed");
158 xfem->setDebugOutputLevel(getParam<unsigned int>(
"debug_output_level"));
164 var_params.set<
MooseEnum>(
"order") =
"FIRST";
167 _problem->addVariable(
"MooseVariable", enrich_disp, var_params);
175 params.
set<
unsigned int>(
"component") = i / 4;
176 params.
set<
unsigned int>(
"enrichment_component") = i % 4;
202 _problem->addAuxVariable(
"MooseVariableConstMonomial",
"xfem_cut_origin_x", var_params);
203 _problem->addAuxVariable(
"MooseVariableConstMonomial",
"xfem_cut_origin_y", var_params);
204 _problem->addAuxVariable(
"MooseVariableConstMonomial",
"xfem_cut_origin_z", var_params);
205 _problem->addAuxVariable(
"MooseVariableConstMonomial",
"xfem_cut_normal_x", var_params);
206 _problem->addAuxVariable(
"MooseVariableConstMonomial",
"xfem_cut_normal_y", var_params);
207 _problem->addAuxVariable(
"MooseVariableConstMonomial",
"xfem_cut_normal_z", var_params);
208 _problem->addAuxVariable(
"MooseVariableConstMonomial",
"xfem_cut2_origin_x", var_params);
209 _problem->addAuxVariable(
"MooseVariableConstMonomial",
"xfem_cut2_origin_y", var_params);
210 _problem->addAuxVariable(
"MooseVariableConstMonomial",
"xfem_cut2_origin_z", var_params);
211 _problem->addAuxVariable(
"MooseVariableConstMonomial",
"xfem_cut2_normal_x", var_params);
212 _problem->addAuxVariable(
"MooseVariableConstMonomial",
"xfem_cut2_normal_y", var_params);
213 _problem->addAuxVariable(
"MooseVariableConstMonomial",
"xfem_cut2_normal_z", var_params);
214 _problem->addAuxVariable(
"MooseVariableConstMonomial",
"xfem_volfrac", var_params);
220 params.
set<AuxVariableName>(
"variable") =
"xfem_volfrac";
221 _problem->addAuxKernel(
"XFEMVolFracAux",
"xfem_volfrac", params);
227 params.
set<
unsigned int>(
"plane_id") = 0;
229 params.
set<AuxVariableName>(
"variable") =
"xfem_cut_origin_x";
231 _problem->addAuxKernel(
"XFEMCutPlaneAux",
"xfem_cut_origin_x", params);
233 params.
set<AuxVariableName>(
"variable") =
"xfem_cut_origin_y";
235 _problem->addAuxKernel(
"XFEMCutPlaneAux",
"xfem_cut_origin_y", params);
237 params.
set<AuxVariableName>(
"variable") =
"xfem_cut_origin_z";
239 _problem->addAuxKernel(
"XFEMCutPlaneAux",
"xfem_cut_origin_z", params);
241 params.
set<AuxVariableName>(
"variable") =
"xfem_cut_normal_x";
243 _problem->addAuxKernel(
"XFEMCutPlaneAux",
"xfem_cut_normal_x", params);
245 params.
set<AuxVariableName>(
"variable") =
"xfem_cut_normal_y";
247 _problem->addAuxKernel(
"XFEMCutPlaneAux",
"xfem_cut_normal_y", params);
249 params.
set<AuxVariableName>(
"variable") =
"xfem_cut_normal_z";
251 _problem->addAuxKernel(
"XFEMCutPlaneAux",
"xfem_cut_normal_z", params);
254 params.
set<
unsigned int>(
"plane_id") = 1;
256 params.
set<AuxVariableName>(
"variable") =
"xfem_cut2_origin_x";
258 _problem->addAuxKernel(
"XFEMCutPlaneAux",
"xfem_cut2_origin_x", params);
260 params.
set<AuxVariableName>(
"variable") =
"xfem_cut2_origin_y";
262 _problem->addAuxKernel(
"XFEMCutPlaneAux",
"xfem_cut2_origin_y", params);
264 params.
set<AuxVariableName>(
"variable") =
"xfem_cut2_origin_z";
266 _problem->addAuxKernel(
"XFEMCutPlaneAux",
"xfem_cut2_origin_z", params);
268 params.
set<AuxVariableName>(
"variable") =
"xfem_cut2_normal_x";
270 _problem->addAuxKernel(
"XFEMCutPlaneAux",
"xfem_cut2_normal_x", params);
272 params.
set<AuxVariableName>(
"variable") =
"xfem_cut2_normal_y";
274 _problem->addAuxKernel(
"XFEMCutPlaneAux",
"xfem_cut2_normal_y", params);
276 params.
set<AuxVariableName>(
"variable") =
"xfem_cut2_normal_z";
278 _problem->addAuxKernel(
"XFEMCutPlaneAux",
"xfem_cut2_normal_z", params);
UserObjectName _crack_front_definition
bool _xfem_use_crack_growth_increment
InputParameterWarehouse & getInputParameterWarehouse()
InputParameters getValidParams(const std::string &name) const
const ExecFlagType EXEC_TIMESTEP_END
MooseObjectName uniqueActionName() const
bool isParamValid(const std::string &name) const
static InputParameters validParams()
bool _use_crack_tip_enrichment
const ExecFlagType EXEC_TIMESTEP_BEGIN
std::vector< VariableName > _enrich_displacements
registerMooseAction("XFEMApp", XFEMAction, "setup_xfem")
std::vector< VariableName > _displacements
const std::string & _current_task
std::vector< BoundaryName > _cut_off_bc
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Real _xfem_crack_growth_increment
void mooseError(Args &&... args) const
static InputParameters validParams()
const InputParameters & _pars
std::shared_ptr< FEProblemBase > & _problem
XFEMAction(const InputParameters ¶ms)