24 #include <unordered_map> 27 #include "libmesh/petsc_nonlinear_solver.h" 28 #include "libmesh/string_to_enum.h" 46 params.
addParam<std::vector<BoundaryName>>(
47 "primary",
"The list of boundary IDs referring to primary sidesets");
48 params.
addParam<std::vector<BoundaryName>>(
49 "secondary",
"The list of boundary IDs referring to secondary sidesets");
50 params.
addParam<std::vector<SubdomainName>>(
53 "Optional list of subdomain names on which to create the contact MooseObjects. If omitted, " 54 "MooseObjects will be created on all subdomains");
55 params.
addParam<std::vector<VariableName>>(
57 "The displacements appropriate for the simulation geometry and coordinate system");
58 params.
addParam<
Real>(
"friction_coefficient", 0,
"The friction coefficient");
62 "Tangential distance to extend edges of contact surfaces");
63 params.
addParam<
Real>(
"penalty", 1e8,
"Penalty factor for normal contact.");
64 params.
addClassDescription(
"Sets up all objects needed for mechanical contact enforcement in " 65 "explicit dynamics simulations.");
66 params.
addParam<std::vector<TagName>>(
68 "The tag names for extra vectors that residual data should be saved into");
69 params.
addParam<std::vector<TagName>>(
70 "absolute_value_vector_tags",
71 "The tags for the vectors this residual object should fill with the " 72 "absolute value of the residual contribution");
74 params.
addParam<VariableName>(
"secondary_gap_offset",
75 "Offset to gap distance from secondary side");
76 params.
addParam<VariableName>(
"mapped_primary_gap_offset",
77 "Offset to gap distance mapped from primary side");
78 params.
addParam<
bool>(
"verbose",
false,
"Verbose output. May increase runtime.");
85 _boundary_pairs(getParam<BoundaryName, BoundaryName>(
"primary",
"secondary")),
87 _verbose(getParam<bool>(
"verbose")),
88 _blocks(getParam<
std::vector<SubdomainName>>(
"block"))
96 mooseWarning(
"Verification of explicit dynamics capabilities is an ongoing effort.");
105 if (!
_problem->getDisplacedProblem())
107 "Contact requires updated coordinates. Use the 'displacements = ...' parameter in the " 114 if (!
_problem->isSNESMFReuseBaseSetbyUser())
115 _problem->setSNESMFReuseBase(
false,
false);
122 if (!
_problem->getDisplacedProblem())
123 mooseError(
"Contact requires updated coordinates. Use the 'displacements = ...' line in the " 125 unsigned int pair_number(0);
132 {
"secondary_gap_offset",
"mapped_primary_gap_offset",
"order"});
134 std::vector<VariableName> displacements =
135 getParam<std::vector<VariableName>>(
"displacements");
136 const auto order =
_problem->systemBaseNonlinear(0)
138 .variable_type(displacements[0])
141 params.
set<
MooseEnum>(
"order") = Utility::enum_to_string<Order>(OrderWrapper{order});
143 params.
set<std::vector<BoundaryName>>(
"boundary") = {contact_pair.second};
144 params.
set<BoundaryName>(
"paired_boundary") = contact_pair.first;
145 params.
set<AuxVariableName>(
"variable") =
"penetration";
147 params.
set<std::vector<VariableName>>(
"secondary_gap_offset") = {
148 getParam<VariableName>(
"secondary_gap_offset")};
150 params.
set<std::vector<VariableName>>(
"mapped_primary_gap_offset") = {
151 getParam<VariableName>(
"mapped_primary_gap_offset")};
152 params.
set<
bool>(
"use_displaced_mesh") =
true;
164 std::vector<VariableName> displacements = getParam<std::vector<VariableName>>(
"displacements");
165 const auto order =
_problem->systemBaseNonlinear(0)
167 .variable_type(displacements[0])
174 var_params.set<
MooseEnum>(
"order") = Utility::enum_to_string<Order>(OrderWrapper{order});
175 var_params.set<
MooseEnum>(
"family") =
"LAGRANGE";
176 _problem->addAuxVariable(
"MooseVariable",
"gap_rate", var_params);
184 var_params.set<
MooseEnum>(
"order") = Utility::enum_to_string<Order>(OrderWrapper{order});
185 var_params.set<
MooseEnum>(
"family") =
"LAGRANGE";
186 _problem->addAuxVariable(
"MooseVariable",
"penetration", var_params);
191 var_params.set<
MooseEnum>(
"order") = Utility::enum_to_string<Order>(OrderWrapper{order});
192 var_params.set<
MooseEnum>(
"family") =
"LAGRANGE";
193 _problem->addAuxVariable(
"MooseVariable",
"contact_pressure", var_params);
199 var_params.set<
MooseEnum>(
"order") = Utility::enum_to_string<Order>(OrderWrapper{order});
200 var_params.set<
MooseEnum>(
"family") =
"LAGRANGE";
201 _problem->addAuxVariable(
"MooseVariable",
"nodal_area", var_params);
207 var_params.set<
MooseEnum>(
"order") = Utility::enum_to_string<Order>(OrderWrapper{order});
208 var_params.set<
MooseEnum>(
"family") =
"LAGRANGE";
209 _problem->addAuxVariable(
"MooseVariable",
"nodal_density", var_params);
215 var_params.set<
MooseEnum>(
"order") = Utility::enum_to_string<Order>(OrderWrapper{order});
216 var_params.set<
MooseEnum>(
"family") =
"LAGRANGE";
217 _problem->addAuxVariable(
"MooseVariable",
"nodal_wave_speed", var_params);
231 std::vector<BoundaryName> secondary_boundary_vector;
232 for (
const auto *
const action : actions)
233 for (
const auto j :
index_range(action->_boundary_pairs))
234 secondary_boundary_vector.push_back(action->_boundary_pairs[
j].second);
236 var_params.set<std::vector<BoundaryName>>(
"boundary") = secondary_boundary_vector;
237 var_params.set<std::vector<VariableName>>(
"variable") = {
"nodal_area"};
239 mooseAssert(
_problem,
"Problem pointer is NULL");
241 var_params.set<
bool>(
"use_displaced_mesh") =
true;
255 std::vector<BoundaryName> secondary_boundary_vector;
256 for (
const auto *
const action : actions)
257 for (
const auto j :
index_range(action->_boundary_pairs))
258 secondary_boundary_vector.push_back(action->_boundary_pairs[
j].second);
260 var_params.set<std::vector<BoundaryName>>(
"boundary") = secondary_boundary_vector;
261 var_params.set<std::vector<VariableName>>(
"variable") = {
"nodal_density"};
263 mooseAssert(
_problem,
"Problem pointer is NULL");
265 var_params.set<
bool>(
"use_displaced_mesh") =
true;
278 std::vector<BoundaryName> secondary_boundary_vector;
279 for (
const auto *
const action : actions)
280 for (
const auto j :
index_range(action->_boundary_pairs))
281 secondary_boundary_vector.push_back(action->_boundary_pairs[
j].second);
283 var_params.set<std::vector<BoundaryName>>(
"boundary") = secondary_boundary_vector;
284 var_params.set<std::vector<VariableName>>(
"variable") = {
"nodal_wave_speed"};
286 mooseAssert(
_problem,
"Problem pointer is NULL");
288 var_params.set<
bool>(
"use_displaced_mesh") =
true;
308 std::vector<BoundaryName> boundary_vector;
309 std::vector<BoundaryName> pair_boundary_vector;
311 for (
const auto *
const action : actions)
312 for (
const auto j :
index_range(action->_boundary_pairs))
314 boundary_vector.push_back(action->_boundary_pairs[
j].second);
315 pair_boundary_vector.push_back(action->_boundary_pairs[
j].first);
321 std::vector<VariableName> displacements = getParam<std::vector<VariableName>>(
"displacements");
322 const auto order =
_problem->systemBaseNonlinear(0)
324 .variable_type(displacements[0])
327 params.
set<
MooseEnum>(
"order") = Utility::enum_to_string<Order>(OrderWrapper{order});
328 params.
set<std::vector<BoundaryName>>(
"boundary") = boundary_vector;
329 params.
set<std::vector<BoundaryName>>(
"paired_boundary") = pair_boundary_vector;
330 params.
set<AuxVariableName>(
"variable") =
"contact_pressure";
332 params.
set<std::vector<VariableName>>(
"nodal_area") = {
"nodal_area"};
333 params.
set<
bool>(
"use_displaced_mesh") =
true;
335 std::string
name =
_name +
"_contact_pressure";
337 _problem->addAuxKernel(
"ContactPressureAux",
name, params);
348 std::vector<VariableName> displacements = getParam<std::vector<VariableName>>(
"displacements");
349 const unsigned int ndisp = displacements.size();
351 std::string constraint_type;
353 constraint_type =
"ExplicitDynamicsContactConstraint";
359 "secondary_gap_offset",
360 "mapped_primary_gap_offset",
364 const auto order =
_problem->systemBaseNonlinear(0)
366 .variable_type(displacements[0])
369 params.
set<std::vector<VariableName>>(
"displacements") = displacements;
370 params.
set<
bool>(
"use_displaced_mesh") =
true;
371 params.
set<
Real>(
"penalty") = getParam<Real>(
"penalty");
373 params.
set<
MooseEnum>(
"order") = Utility::enum_to_string<Order>(OrderWrapper{order});
379 params.
set<std::vector<VariableName>>(
"vel_x") = getParam<std::vector<VariableName>>(
"vel_x");
381 params.
set<std::vector<VariableName>>(
"vel_y") = getParam<std::vector<VariableName>>(
"vel_y");
383 params.
set<std::vector<VariableName>>(
"vel_z") = getParam<std::vector<VariableName>>(
"vel_z");
385 params.
set<std::vector<VariableName>>(
"gap_rate") = {
"gap_rate"};
387 params.
set<BoundaryName>(
"boundary") = contact_pair.first;
389 params.
set<std::vector<VariableName>>(
"secondary_gap_offset") = {
390 getParam<VariableName>(
"secondary_gap_offset")};
392 params.
set<std::vector<VariableName>>(
"mapped_primary_gap_offset") = {
393 getParam<VariableName>(
"mapped_primary_gap_offset")};
395 for (
unsigned int i = 0; i < ndisp; ++i)
400 params.
set<
unsigned int>(
"component") = i;
402 params.
set<BoundaryName>(
"primary") = contact_pair.first;
403 params.
set<BoundaryName>(
"secondary") = contact_pair.second;
404 params.
set<NonlinearVariableName>(
"variable") = displacements[i];
405 params.
set<std::vector<VariableName>>(
"primary_variable") = {displacements[i]};
407 {
"extra_vector_tags",
"absolute_value_vector_tags"});
416 return MooseEnum(
"frictionless frictionless_balance",
"frictionless");
const std::string & _name
const InputParameters & parameters() const
InputParameters getValidParams(const std::string &name) const
const ExecFlagType EXEC_TIMESTEP_END
std::string shortName(const std::string &name)
const std::string & name() const
static InputParameters validParams()
const ExecFlagType EXEC_TIMESTEP_BEGIN
const std::string & _current_task
const ExecFlagType EXEC_LINEAR
std::string stringify(const T &t)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void mooseWarning(Args &&... args) const
void mooseError(Args &&... args) const
std::shared_ptr< FEProblemBase > & _problem
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
bool isParamValid(const std::string &name) const
std::vector< const T *> getActions()
auto index_range(const T &sizable)
const ExecFlagType EXEC_INITIAL