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<VariableName>>(
52 "The displacements appropriate for the simulation geometry and coordinate system");
53 params.
addParam<
Real>(
"friction_coefficient", 0,
"The friction coefficient");
57 "Tangential distance to extend edges of contact surfaces");
58 params.
addParam<
Real>(
"penalty", 1e8,
"Penalty factor for normal contact.");
59 params.
addClassDescription(
"Sets up all objects needed for mechanical contact enforcement in " 60 "explicit dynamics simulations.");
61 params.
addParam<std::vector<TagName>>(
63 "The tag names for extra vectors that residual data should be saved into");
64 params.
addParam<std::vector<TagName>>(
65 "absolute_value_vector_tags",
66 "The tags for the vectors this residual object should fill with the " 67 "absolute value of the residual contribution");
69 params.
addParam<VariableName>(
"secondary_gap_offset",
70 "Offset to gap distance from secondary side");
71 params.
addParam<VariableName>(
"mapped_primary_gap_offset",
72 "Offset to gap distance mapped from primary side");
73 params.
addParam<
bool>(
"verbose",
false,
"Verbose output. May increase runtime.");
80 _boundary_pairs(getParam<BoundaryName, BoundaryName>(
"primary",
"secondary")),
82 _verbose(getParam<bool>(
"verbose"))
90 mooseWarning(
"Verification of explicit dynamics capabilities is an ongoing effort.");
99 if (!
_problem->getDisplacedProblem())
101 "Contact requires updated coordinates. Use the 'displacements = ...' parameter in the " 108 if (!
_problem->isSNESMFReuseBaseSetbyUser())
109 _problem->setSNESMFReuseBase(
false,
false);
116 if (!
_problem->getDisplacedProblem())
117 mooseError(
"Contact requires updated coordinates. Use the 'displacements = ...' line in the " 119 unsigned int pair_number(0);
126 {
"secondary_gap_offset",
"mapped_primary_gap_offset",
"order"});
128 std::vector<VariableName> displacements =
129 getParam<std::vector<VariableName>>(
"displacements");
130 const auto order =
_problem->systemBaseNonlinear(0)
132 .variable_type(displacements[0])
135 params.
set<
MooseEnum>(
"order") = Utility::enum_to_string<Order>(OrderWrapper{order});
137 params.
set<std::vector<BoundaryName>>(
"boundary") = {contact_pair.second};
138 params.
set<BoundaryName>(
"paired_boundary") = contact_pair.first;
139 params.
set<AuxVariableName>(
"variable") =
"penetration";
141 params.
set<std::vector<VariableName>>(
"secondary_gap_offset") = {
142 getParam<VariableName>(
"secondary_gap_offset")};
144 params.
set<std::vector<VariableName>>(
"mapped_primary_gap_offset") = {
145 getParam<VariableName>(
"mapped_primary_gap_offset")};
146 params.
set<
bool>(
"use_displaced_mesh") =
true;
158 std::vector<VariableName> displacements = getParam<std::vector<VariableName>>(
"displacements");
159 const auto order =
_problem->systemBaseNonlinear(0)
161 .variable_type(displacements[0])
167 var_params.
set<
MooseEnum>(
"order") = Utility::enum_to_string<Order>(OrderWrapper{order});
168 var_params.set<
MooseEnum>(
"family") =
"LAGRANGE";
169 _problem->addAuxVariable(
"MooseVariable",
"gap_rate", var_params);
176 var_params.
set<
MooseEnum>(
"order") = Utility::enum_to_string<Order>(OrderWrapper{order});
177 var_params.set<
MooseEnum>(
"family") =
"LAGRANGE";
179 _problem->addAuxVariable(
"MooseVariable",
"penetration", var_params);
183 var_params.
set<
MooseEnum>(
"order") = Utility::enum_to_string<Order>(OrderWrapper{order});
184 var_params.set<
MooseEnum>(
"family") =
"LAGRANGE";
186 _problem->addAuxVariable(
"MooseVariable",
"contact_pressure", var_params);
191 var_params.
set<
MooseEnum>(
"order") = Utility::enum_to_string<Order>(OrderWrapper{order});
192 var_params.set<
MooseEnum>(
"family") =
"LAGRANGE";
194 _problem->addAuxVariable(
"MooseVariable",
"nodal_area", var_params);
199 var_params.
set<
MooseEnum>(
"order") = Utility::enum_to_string<Order>(OrderWrapper{order});
200 var_params.set<
MooseEnum>(
"family") =
"LAGRANGE";
202 _problem->addAuxVariable(
"MooseVariable",
"nodal_density", var_params);
207 var_params.
set<
MooseEnum>(
"order") = Utility::enum_to_string<Order>(OrderWrapper{order});
208 var_params.set<
MooseEnum>(
"family") =
"LAGRANGE";
210 _problem->addAuxVariable(
"MooseVariable",
"nodal_wave_speed", var_params);
224 std::vector<BoundaryName> secondary_boundary_vector;
225 for (
const auto *
const action : actions)
226 for (
const auto j :
index_range(action->_boundary_pairs))
227 secondary_boundary_vector.push_back(action->_boundary_pairs[
j].second);
229 var_params.set<std::vector<BoundaryName>>(
"boundary") = secondary_boundary_vector;
230 var_params.set<std::vector<VariableName>>(
"variable") = {
"nodal_area"};
232 mooseAssert(
_problem,
"Problem pointer is NULL");
234 var_params.set<
bool>(
"use_displaced_mesh") =
true;
248 std::vector<BoundaryName> secondary_boundary_vector;
249 for (
const auto *
const action : actions)
250 for (
const auto j :
index_range(action->_boundary_pairs))
251 secondary_boundary_vector.push_back(action->_boundary_pairs[
j].second);
253 var_params.set<std::vector<BoundaryName>>(
"boundary") = secondary_boundary_vector;
254 var_params.set<std::vector<VariableName>>(
"variable") = {
"nodal_density"};
256 mooseAssert(
_problem,
"Problem pointer is NULL");
258 var_params.set<
bool>(
"use_displaced_mesh") =
true;
271 std::vector<BoundaryName> secondary_boundary_vector;
272 for (
const auto *
const action : actions)
273 for (
const auto j :
index_range(action->_boundary_pairs))
274 secondary_boundary_vector.push_back(action->_boundary_pairs[
j].second);
276 var_params.set<std::vector<BoundaryName>>(
"boundary") = secondary_boundary_vector;
277 var_params.set<std::vector<VariableName>>(
"variable") = {
"nodal_wave_speed"};
279 mooseAssert(
_problem,
"Problem pointer is NULL");
281 var_params.set<
bool>(
"use_displaced_mesh") =
true;
301 std::vector<BoundaryName> boundary_vector;
302 std::vector<BoundaryName> pair_boundary_vector;
304 for (
const auto *
const action : actions)
305 for (
const auto j :
index_range(action->_boundary_pairs))
307 boundary_vector.push_back(action->_boundary_pairs[
j].second);
308 pair_boundary_vector.push_back(action->_boundary_pairs[
j].first);
314 std::vector<VariableName> displacements = getParam<std::vector<VariableName>>(
"displacements");
315 const auto order =
_problem->systemBaseNonlinear(0)
317 .variable_type(displacements[0])
320 params.
set<
MooseEnum>(
"order") = Utility::enum_to_string<Order>(OrderWrapper{order});
321 params.
set<std::vector<BoundaryName>>(
"boundary") = boundary_vector;
322 params.
set<std::vector<BoundaryName>>(
"paired_boundary") = pair_boundary_vector;
323 params.
set<AuxVariableName>(
"variable") =
"contact_pressure";
325 params.
set<std::vector<VariableName>>(
"nodal_area") = {
"nodal_area"};
326 params.
set<
bool>(
"use_displaced_mesh") =
true;
328 std::string
name =
_name +
"_contact_pressure";
330 _problem->addAuxKernel(
"ContactPressureAux",
name, params);
341 std::vector<VariableName> displacements = getParam<std::vector<VariableName>>(
"displacements");
342 const unsigned int ndisp = displacements.size();
344 std::string constraint_type;
346 constraint_type =
"ExplicitDynamicsContactConstraint";
352 "secondary_gap_offset",
353 "mapped_primary_gap_offset",
357 const auto order =
_problem->systemBaseNonlinear(0)
359 .variable_type(displacements[0])
362 params.
set<std::vector<VariableName>>(
"displacements") = displacements;
363 params.
set<
bool>(
"use_displaced_mesh") =
true;
364 params.
set<
Real>(
"penalty") = getParam<Real>(
"penalty");
366 params.
set<
MooseEnum>(
"order") = Utility::enum_to_string<Order>(OrderWrapper{order});
372 params.
set<std::vector<VariableName>>(
"vel_x") = getParam<std::vector<VariableName>>(
"vel_x");
374 params.
set<std::vector<VariableName>>(
"vel_y") = getParam<std::vector<VariableName>>(
"vel_y");
376 params.
set<std::vector<VariableName>>(
"vel_z") = getParam<std::vector<VariableName>>(
"vel_z");
378 params.
set<std::vector<VariableName>>(
"gap_rate") = {
"gap_rate"};
380 params.
set<BoundaryName>(
"boundary") = contact_pair.first;
382 params.
set<std::vector<VariableName>>(
"secondary_gap_offset") = {
383 getParam<VariableName>(
"secondary_gap_offset")};
385 params.
set<std::vector<VariableName>>(
"mapped_primary_gap_offset") = {
386 getParam<VariableName>(
"mapped_primary_gap_offset")};
388 for (
unsigned int i = 0; i < ndisp; ++i)
393 params.
set<
unsigned int>(
"component") = i;
395 params.
set<BoundaryName>(
"primary") = contact_pair.first;
396 params.
set<BoundaryName>(
"secondary") = contact_pair.second;
397 params.
set<NonlinearVariableName>(
"variable") = displacements[i];
398 params.
set<std::vector<VariableName>>(
"primary_variable") = {displacements[i]};
400 {
"extra_vector_tags",
"absolute_value_vector_tags"});
409 return MooseEnum(
"frictionless frictionless_balance",
"frictionless");
InputParameters getValidParams(const std::string &name) const
const ExecFlagType EXEC_TIMESTEP_END
virtual const std::string & name() const
void mooseWarning(Args &&... args) const
std::string shortName(const std::string &name)
bool isParamValid(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 mooseError(Args &&... args) const
std::shared_ptr< FEProblemBase > & _problem
const InputParameters & parameters() const
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
std::vector< const T *> getActions()
auto index_range(const T &sizable)
const ExecFlagType EXEC_INITIAL