https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
17
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{
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,
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
135Real
137{
138 // execute functional to retrieve selected quantity
139 return std::get<2>(_outputs[_contact_quantity])();
140}
void mooseError(Args &&... args)
const ExecFlagType EXEC_TIMESTEP_END
registerMooseObjectRenamed("ContactApp", PenaltyMortarUserObjectAux, "04/01/2026 00:00", MortarUserObjectAux)
registerMooseObject("ContactApp", MortarUserObjectAux)
const Node *const & _current_node
static InputParameters validParams()
void suppressParameter(const std::string &name)
void addRequiredParam(const std::string &name, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
T & set(const std::string &name, bool quiet_mode=false)
Auxiliary kernel to output mortar penalty contact quantities of interest.
ContactQuantityEnum
What type of contact quantity we are querying.
const PenaltyWeightedGapUserObject * _pwguo
static const MooseEnum _contact_quantities
available contact quantities
std::map< ContactQuantityEnum, std::tuple< std::string, const void *, std::function< Real(void)> > > _outputs
Definition of the output quantities and.
MortarUserObjectAux(const InputParameters &parameters)
Factory constructor, takes parameters so that all derived classes can be built using the constructor.
static InputParameters validParams()
const PenaltyFrictionUserObject * _pfuo
virtual Real computeValue() override
const ContactQuantityEnum _contact_quantity
What penalty mortar contact quantity we'd like to output.
const WeightedGapUserObject * _wguo
Cast pointers to specific UOs.
const WeightedVelocitiesUserObject * _wvuo
User object that computes tangential pressures due to friction using a penalty approach,...
virtual Real getDeltaTangentialLagrangeMultiplier(const Node *const node, const unsigned int component) const override
virtual Real getFrictionalContactPressure(const Node *const node, const unsigned int component) const override
virtual Real getAccumulatedSlip(const Node *const node, const unsigned int component) const override
User object for computing weighted gaps and contact pressure for penalty based mortar constraints.
virtual bool getActiveSetState(const Node *const node) const
virtual Real getNormalLagrangeMultiplier(const Node *const node) const
Creates dof object to weighted gap map.
virtual Real getTangentialVelocity(const Node *const, const unsigned int) const
virtual Real getNormalGap(const Node *const) const
virtual Real getNormalContactPressure(const Node *const) const =0
Creates dof object to weighted tangential velocities map.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real