15 #include "libmesh/string_to_enum.h" 30 rm_params.
set<
bool>(
"use_displaced_mesh") =
31 obj_params.
get<
bool>(
"use_displaced_mesh");
32 rm_params.
set<BoundaryName>(
"secondary_boundary") =
33 obj_params.
get<BoundaryName>(
"secondary_boundary");
34 rm_params.
set<BoundaryName>(
"primary_boundary") =
35 obj_params.
get<BoundaryName>(
"primary_boundary");
36 rm_params.
set<SubdomainName>(
"secondary_subdomain") =
37 obj_params.
get<SubdomainName>(
"secondary_subdomain");
38 rm_params.
set<SubdomainName>(
"primary_subdomain") =
39 obj_params.
get<SubdomainName>(
"primary_subdomain");
40 rm_params.
set<
bool>(
"ghost_higher_d_neighbors") =
41 obj_params.
get<
bool>(
"ghost_higher_d_neighbors");
62 params.
addParam<VariableName>(
"secondary_variable",
"Primal variable on secondary surface.");
65 "Primal variable on primary surface. If this parameter is not provided then the primary " 66 "variable will be initialized to the secondary variable");
70 "The name of the lagrange multiplier variable that this constraint is applied to. This " 71 "parameter may not be supplied in the case of using penalty methods for example");
73 "compute_primal_residuals",
true,
"Whether to compute residuals for the primal variable.");
75 "compute_lm_residuals",
true,
"Whether to compute Lagrange Multiplier residuals");
78 MooseEnum(
"DEFAULT FIRST SECOND THIRD FOURTH",
"DEFAULT"),
79 "Quadrature rule to use on mortar segments. For 2D mortar DEFAULT is recommended. " 80 "For 3D mortar, QUAD meshes are integrated using triangle mortar segments. " 81 "While DEFAULT quadrature order is typically sufficiently accurate, exact integration of " 82 "QUAD mortar faces requires SECOND order quadrature for FIRST variables and FOURTH order " 83 "quadrature for SECOND order variables.");
85 "use_petrov_galerkin",
87 "Whether to use the Petrov-Galerkin approach for the mortar-based constraints. If set to " 88 "true, we use the standard basis as the test function and dual basis as " 89 "the shape function for the interpolation of the Lagrange multiplier variable.");
91 "Auxiliary Lagrange multiplier variable that is utilized together with the " 92 "Petrov-Galerkin approach.");
103 isParamValid(
"variable") ?
"variable" :
"secondary_variable",
106 _fe_problem(*getCheckedPointerParam<
FEProblemBase *>(
"_fe_problem_base")),
107 _var(isParamValid(
"variable")
108 ? &_subproblem.getStandardVariable(_tid, parameters.getMooseType(
"variable"))
111 isParamValid(
"secondary_variable")
112 ? _sys.getActualFieldVariable<
Real>(_tid, parameters.getMooseType(
"secondary_variable"))
113 : _sys.getActualFieldVariable<
Real>(_tid, parameters.getMooseType(
"primary_variable"))),
115 isParamValid(
"primary_variable")
116 ? _sys.getActualFieldVariable<
Real>(_tid, parameters.getMooseType(
"primary_variable"))
119 _compute_primal_residuals(getParam<bool>(
"compute_primal_residuals")),
120 _compute_lm_residuals(!_var ? false : getParam<bool>(
"compute_lm_residuals")),
122 _use_dual(_var ? _var->useDual() : false),
123 _tangents(_assembly.tangents()),
124 _coord(_assembly.mortarCoordTransformation()),
125 _q_point(_assembly.qPointsMortar()),
126 _use_petrov_galerkin(getParam<bool>(
"use_petrov_galerkin")),
127 _aux_lm_var(isCoupled(
"aux_lm") ? getVar(
"aux_lm", 0) : nullptr),
129 ? ((_use_petrov_galerkin && _aux_lm_var) ? _aux_lm_var->phiLower() : _var->phiLower())
131 _test_secondary(_secondary_var.phiFace()),
132 _test_primary(_primary_var.phiFaceNeighbor()),
133 _grad_test_secondary(_secondary_var.gradPhiFace()),
134 _grad_test_primary(_primary_var.gradPhiFaceNeighbor()),
135 _interior_secondary_elem(_assembly.elem()),
136 _interior_primary_elem(_assembly.neighbor()),
137 _displaced(getParam<bool>(
"use_displaced_mesh"))
144 "We need to set `use_dual = true` while using the Petrov-Galerkin approach");
148 "We need to specify an auxiliary variable `aux_lm` while using the Petrov-Galerkin " 153 "Auxiliary LM variable needs to use standard shape function, i.e., set `use_dual = " 157 const MooseEnum p_order = getParam<MooseEnum>(
"quadrature");
159 if (p_order !=
"DEFAULT")
161 Order q_order =
static_cast<Order>(2 * Utility::string_to_enum<Order>(p_order) + 1);
211 const std::unordered_set<const Elem *> & inactive_lm_elems)
223 for (
const auto node : inactive_lm_nodes)
226 if (!node->n_comp(sn, vn))
229 const auto dof_index = node->dof_number(sn, vn, 0);
238 std::array<Real, 1>{{lm_value}},
239 std::array<dof_id_type, 1>{{dof_index}},
247 for (
const auto el : inactive_lm_elems)
249 const auto n_comp = el->n_comp(sn, vn);
253 const auto dof_index = el->dof_number(sn, vn, comp);
262 std::array<Real, 1>{{lm_value}},
263 std::array<dof_id_type, 1>{{dof_index}},
MooseVariableField< Real > & _secondary_var
Reference to the secondary variable.
void setMortarQRule(Order order)
Specifies a custom qrule for integration on mortar segment mesh.
unsigned int number() const
Get variable number coming from libMesh.
void zeroInactiveLMDofs(const std::unordered_set< const Node *> &inactive_lm_nodes, const std::unordered_set< const Elem *> &inactive_lm_elems)
A post routine for zeroing all inactive LM DoFs.
Base class for all Constraint types.
void addResiduals(Assembly &assembly, const Residuals &residuals, const Indices &dof_indices, Real scaling_factor)
Add the provided incoming residuals corresponding to the provided dof indices.
virtual void precalculateResidual()
const bool _compute_primal_residuals
Whether to compute primal residuals.
Specialization of SubProblem for solving nonlinear equations plus auxiliary equations.
MortarConstraintBase(const InputParameters ¶meters)
virtual void computeResidual() override
Method for computing the residual.
An interface for accessing mortar mesh data.
static InputParameters validParams()
OutputData getElementalValue(const Elem *elem, unsigned int idx=0) const
Get the current value of this variable on an element.
bool isParamValid(const std::string &name) const
Test if the supplied parameter is valid.
SystemBase & _sys
Reference to the EquationSystem object.
bool useDual() const
Get dual mortar option.
VarKindType
Framework-wide stuff.
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
std::vector< BoundaryID > getBoundaryIDs(const libMesh::MeshBase &mesh, const std::vector< BoundaryName > &boundary_name, bool generate_unknown, const std::set< BoundaryID > &mesh_boundary_ids)
Gets the boundary IDs with their names.
void paramError(const std::string ¶m, Args... args) const
Emits an error prefixed with the file and line number of the given param (from the input file) along ...
unsigned int number() const
Gets the number of this system.
const bool _use_dual
Whether to use the dual motar approach.
Assembly & _assembly
Reference to this Kernel's assembly object.
OutputData getNodalValue(const Node &node) const
Get the value of this variable at given node.
bool isNodal() const override
Is this variable nodal.
MooseVariable *const _var
Pointer to the lagrange multipler variable. nullptr if none.
void addMooseVariableDependency(MooseVariableFieldBase *var)
Call this function to add the passed in MooseVariableFieldBase as a variable that this object depends...
const bool _use_petrov_galerkin
Whether to use Petrov-Galerkin approach.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const std::set< SubdomainID > EMPTY_BLOCK_IDS
bool computingResidual() const
const MooseVariable *const _aux_lm_var
The auxiliary Lagrange multiplier variable (used together whith the Petrov-Galerkin approach) ...
void activateDual()
Indicates that dual shape functions are used for mortar constraint.
static InputParameters validParams()
static InputParameters validParams()
virtual void computeJacobian() override
Method for computing the Jacobian.
Interface for objects that need to get values of MooseVariables.
IntRange< T > make_range(T beg, T end)
This interface is designed for DGKernel, InternalSideUserObject, InterfaceUserObject, where material properties on a side of both its primary side (face) and its secondary side (neighbor) all required.
MOOSE now contains C++17 code, so give a reasonable error message stating what the user can do to add...
bool computingJacobian() const
void addJacobianElement(Assembly &assembly, Real value, dof_id_type row_index, dof_id_type column_index, Real scaling_factor)
Add into a single Jacobian element.
static InputParameters validParams()
const bool _compute_lm_residuals
Whether to compute lagrange multiplier residuals.
MooseVariableField< Real > & _primary_var
Reference to the primary variable.