https://mooseframework.inl.gov
PenaltyMortarUserObjectAux.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 
11 
12 // supported user objects
13 #include "WeightedGapUserObject.h"
17 
19 
21  "normal_pressure accumulated_slip_one "
22  "tangential_pressure_one tangential_velocity_one accumulated_slip_two "
23  "tangential_pressure_two tangential_velocity_two normal_gap "
24  "normal_lm delta_tangential_lm_one delta_tangential_lm_two active_set");
25 
28 {
30  params.addClassDescription(
31  "Populates an auxiliary variable with a contact quantities from penalty mortar contact.");
33  "contact_quantity",
35  "The desired contact quantity to output as an auxiliary variable.");
36  params.addRequiredParam<UserObjectName>(
37  "user_object",
38  "The penalty mortar user object to get values from. Note that the user object "
39  "must implement the corresponding getter function.");
40  params.set<ExecFlagEnum>("execute_on") = {EXEC_TIMESTEP_END};
41  params.suppressParameter<ExecFlagEnum>("execute_on");
42  return params;
43 }
44 
46  : AuxKernel(parameters),
47  _contact_quantity(getParam<MooseEnum>("contact_quantity").getEnum<ContactQuantityEnum>()),
48  _user_object(getUserObject<UserObject>("user_object")),
49  _wguo(dynamic_cast<const WeightedGapUserObject *>(&_user_object)),
50  _pwguo(dynamic_cast<const PenaltyWeightedGapUserObject *>(&_user_object)),
51  _wvuo(dynamic_cast<const WeightedVelocitiesUserObject *>(&_user_object)),
52  _pfuo(dynamic_cast<const PenaltyFrictionUserObject *>(&_user_object)),
53  _outputs({
55  {"PenaltyWeightedGapUserObject",
56  _pwguo,
57  [&]() { return _pwguo->getNormalContactPressure(_current_node); }}},
58 
60  {"WeightedGapUserObject", _wguo, [&]() { return _wguo->getNormalGap(_current_node); }}},
61 
63  {"PenaltyFrictionUserObject",
64  _pfuo,
65  [&]() { return _pfuo->getFrictionalContactPressure(_current_node, 0); }}},
66 
68  {"PenaltyFrictionUserObject",
69  _pfuo,
70  [&]() { return _pfuo->getAccumulatedSlip(_current_node, 0); }}},
71 
73  {"WeightedVelocitiesUserObject",
74  _wvuo,
75  [&]() { return _wvuo->getTangentialVelocity(_current_node, 0); }}},
76 
78  {"PenaltyFrictionUserObject",
79  _pfuo,
80  [&]() { return _pfuo->getFrictionalContactPressure(_current_node, 1); }}},
81 
83  {"PenaltyFrictionUserObject",
84  _pfuo,
85  [&]() { return _pfuo->getAccumulatedSlip(_current_node, 1); }}},
86 
88  {"WeightedVelocitiesUserObject",
89  _wvuo,
90  [&]() { return _wvuo->getTangentialVelocity(_current_node, 1); }}},
91 
93  {"PenaltyWeightedGapUserObject",
94  _pwguo,
95  [&]() { return _pwguo->getNormalLagrangeMultiplier(_current_node); }}},
96 
98  {"PenaltyFrictionUserObject",
99  _wvuo,
101 
103  {"PenaltyFrictionUserObject",
104  _wvuo,
106 
108  {"PenaltyWeightedGapUserObject",
109  _wvuo,
110  [&]() { return _pwguo->getActiveSetState(_current_node) ? 1.0 : 0.0; }}}
111  // end outputs list
112  })
113 {
114  if (!isNodal())
115  mooseError("This auxiliary kernel requires nodal variables to obtain contact pressure values");
116 
117  // error check
118  const auto it = _outputs.find(_contact_quantity);
119  if (it == _outputs.end())
120  mooseError("Internal error: Contact quantity request in PressureMortarUserObjectAux is not "
121  "recognized.");
122  if (!std::get<1>(it->second))
123  paramError("user_object",
124  "The '",
125  _contact_quantities.getNames()[static_cast<int>(it->first)],
126  "' quantity is only provided by a '",
127  std::get<0>(it->second),
128  "' or derived object.");
129 }
130 
131 Real
133 {
134  // execute functional to retrieve selected quantity
135  return std::get<2>(_outputs[_contact_quantity])();
136 }
virtual Real getAccumulatedSlip(const Node *const node, const unsigned int component) const override
std::map< ContactQuantityEnum, std::tuple< std::string, const void *, std::function< Real(void)> > > _outputs
Definition of the output quantities and.
const WeightedVelocitiesUserObject * _wvuo
const ContactQuantityEnum _contact_quantity
What penalty mortar contact quantity we&#39;d like to output.
virtual Real getNormalLagrangeMultiplier(const Node *const node) const
const PenaltyWeightedGapUserObject * _pwguo
void mooseError(Args &&... args)
const Node *const & _current_node
T & set(const std::string &name, bool quiet_mode=false)
Auxiliary kernel to output mortar penalty contact quantities of interest.
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.
virtual Real getNormalContactPressure(const Node *const node) const override
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 InputParameters validParams()
virtual Real getNormalGap(const Node *const) const
registerMooseObject("ContactApp", PenaltyMortarUserObjectAux)
virtual Real getDeltaTangentialLagrangeMultiplier(const Node *const node, const unsigned int component) const override
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
virtual Real computeValue() override
virtual bool getActiveSetState(const Node *const node) const
PenaltyMortarUserObjectAux(const InputParameters &parameters)
Factory constructor, takes parameters so that all derived classes can be built using the constructor...
ContactQuantityEnum
What type of contact quantity we are querying.
void addClassDescription(const std::string &doc_string)
static InputParameters validParams()
const WeightedGapUserObject * _wguo
Cast pointers to specific UOs.
static const MooseEnum _contact_quantities
available contact quantities
const PenaltyFrictionUserObject * _pfuo