https://mooseframework.inl.gov
MortarUserObjectAux.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 "MortarUserObjectAux.h"
11 
12 // supported user objects
13 #include "WeightedGapUserObject.h"
17 
19 registerMooseObjectRenamed("ContactApp",
20  PenaltyMortarUserObjectAux,
21  "04/01/2026 00:00",
23 
25  "normal_pressure accumulated_slip_one "
26  "tangential_pressure_one tangential_velocity_one accumulated_slip_two "
27  "tangential_pressure_two tangential_velocity_two normal_gap "
28  "normal_lm delta_tangential_lm_one delta_tangential_lm_two active_set");
29 
32 {
34  params.addClassDescription(
35  "Populates an auxiliary variable with a contact quantities from penalty mortar contact.");
37  "contact_quantity",
39  "The desired contact quantity to output as an auxiliary variable.");
40  params.addRequiredParam<UserObjectName>(
41  "user_object",
42  "The penalty mortar user object to get values from. Note that the user object "
43  "must implement the corresponding getter function.");
44  params.set<ExecFlagEnum>("execute_on") = {EXEC_TIMESTEP_END};
45  params.suppressParameter<ExecFlagEnum>("execute_on");
46  return params;
47 }
48 
50  : AuxKernel(parameters),
51  _contact_quantity(getParam<MooseEnum>("contact_quantity").getEnum<ContactQuantityEnum>()),
52  _user_object(getUserObject<UserObject>("user_object")),
53  _wguo(dynamic_cast<const WeightedGapUserObject *>(&_user_object)),
54  _pwguo(dynamic_cast<const PenaltyWeightedGapUserObject *>(&_user_object)),
55  _wvuo(dynamic_cast<const WeightedVelocitiesUserObject *>(&_user_object)),
56  _pfuo(dynamic_cast<const PenaltyFrictionUserObject *>(&_user_object)),
57  _outputs({
59  {"WeightedGapUserObject",
60  _wguo,
61  [&]() { return _wguo->getNormalContactPressure(_current_node); }}},
62 
64  {"WeightedGapUserObject", _wguo, [&]() { return _wguo->getNormalGap(_current_node); }}},
65 
67  {"PenaltyFrictionUserObject",
68  _pfuo,
69  [&]() { return _pfuo->getFrictionalContactPressure(_current_node, 0); }}},
70 
72  {"PenaltyFrictionUserObject",
73  _pfuo,
74  [&]() { return _pfuo->getAccumulatedSlip(_current_node, 0); }}},
75 
77  {"WeightedVelocitiesUserObject",
78  _wvuo,
79  [&]() { return _wvuo->getTangentialVelocity(_current_node, 0); }}},
80 
82  {"PenaltyFrictionUserObject",
83  _pfuo,
84  [&]() { return _pfuo->getFrictionalContactPressure(_current_node, 1); }}},
85 
87  {"PenaltyFrictionUserObject",
88  _pfuo,
89  [&]() { return _pfuo->getAccumulatedSlip(_current_node, 1); }}},
90 
92  {"WeightedVelocitiesUserObject",
93  _wvuo,
94  [&]() { return _wvuo->getTangentialVelocity(_current_node, 1); }}},
95 
97  {"PenaltyWeightedGapUserObject",
98  _pwguo,
99  [&]() { return _pwguo->getNormalLagrangeMultiplier(_current_node); }}},
100 
102  {"PenaltyFrictionUserObject",
103  _wvuo,
105 
107  {"PenaltyFrictionUserObject",
108  _wvuo,
110 
112  {"PenaltyWeightedGapUserObject",
113  _wvuo,
114  [&]() { return _pwguo->getActiveSetState(_current_node) ? 1.0 : 0.0; }}}
115  // end outputs list
116  })
117 {
118  if (!isNodal())
119  mooseError("This auxiliary kernel requires nodal variables to obtain contact pressure values");
120 
121  // error check
122  const auto it = _outputs.find(_contact_quantity);
123  if (it == _outputs.end())
124  mooseError("Internal error: Contact quantity request in MortarUserObjectAux is not "
125  "recognized.");
126  if (!std::get<1>(it->second))
127  paramError("user_object",
128  "The '",
129  _contact_quantities.getNames()[static_cast<int>(it->first)],
130  "' quantity is only provided by a '",
131  std::get<0>(it->second),
132  "' or derived object.");
133 }
134 
135 Real
137 {
138  // execute functional to retrieve selected quantity
139  return std::get<2>(_outputs[_contact_quantity])();
140 }
virtual Real getAccumulatedSlip(const Node *const node, const unsigned int component) const override
virtual Real getNormalLagrangeMultiplier(const Node *const node) const
static InputParameters validParams()
void mooseError(Args &&... args)
const PenaltyFrictionUserObject * _pfuo
const Node *const & _current_node
T & set(const std::string &name, bool quiet_mode=false)
MortarUserObjectAux(const InputParameters &parameters)
Factory constructor, takes parameters so that all derived classes can be built using the constructor...
virtual Real getTangentialVelocity(const Node *const, const unsigned int) const
User object for computing weighted gaps and contact pressure for penalty based mortar constraints...
const ExecFlagType EXEC_TIMESTEP_END
Creates dof object to weighted tangential velocities map.
void addRequiredParam(const std::string &name, const std::string &doc_string)
void suppressParameter(const std::string &name)
User object that computes tangential pressures due to friction using a penalty approach, following J.C.
static const MooseEnum _contact_quantities
available contact quantities
virtual Real getNormalGap(const Node *const) const
std::map< ContactQuantityEnum, std::tuple< std::string, const void *, std::function< Real(void)> > > _outputs
Definition of the output quantities and.
Auxiliary kernel to output mortar penalty contact quantities of interest.
virtual Real getDeltaTangentialLagrangeMultiplier(const Node *const node, const unsigned int component) const override
registerMooseObjectRenamed("ContactApp", PenaltyMortarUserObjectAux, "04/01/2026 00:00", MortarUserObjectAux)
Creates dof object to weighted gap map.
virtual Real getFrictionalContactPressure(const Node *const node, const unsigned int component) const override
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const PenaltyWeightedGapUserObject * _pwguo
virtual bool getActiveSetState(const Node *const node) const
const WeightedVelocitiesUserObject * _wvuo
void addClassDescription(const std::string &doc_string)
static InputParameters validParams()
virtual Real getNormalContactPressure(const Node *const) const =0
virtual Real computeValue() override
const ContactQuantityEnum _contact_quantity
What penalty mortar contact quantity we&#39;d like to output.
const WeightedGapUserObject * _wguo
Cast pointers to specific UOs.
registerMooseObject("ContactApp", MortarUserObjectAux)
ContactQuantityEnum
What type of contact quantity we are querying.