https://mooseframework.inl.gov
Loading...
Searching...
No Matches
MortarConsumerInterface.h
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#pragma once
11
12#include "MooseTypes.h"
13
14#include <set>
15
16class InputParameters;
17class MooseObject;
18class MooseMesh;
21class SubProblem;
22class Assembly;
23
24namespace libMesh
25{
26class QBase;
27}
28
36{
37public:
38 MortarConsumerInterface(const MooseObject * moose_object);
39
41
49
54
59
63 bool onInterface(BoundaryID primary_boundary_id, BoundaryID secondary_boundary_id) const;
64
65protected:
66 const std::set<SubdomainID> & getHigherDimSubdomainIDs() const
67 {
69 }
70 const std::set<BoundaryID> & getBoundaryIDs() const { return _boundary_ids; }
71
75 const AutomaticMortarGeneration & amg() const;
76
83
87 static void trimDerivative(dof_id_type remove_derivative_index, ADReal & dual_number);
88
92 template <typename Variables, typename DualNumbers>
93 static void
94 trimInteriorNodeDerivatives(const std::map<unsigned int, unsigned int> & primary_ip_lowerd_map,
95 const Variables & moose_var,
96 DualNumbers & ad_vars,
97 const bool is_secondary);
98
102
105
107
111
114
117
120
123
125 std::set<BoundaryID> _secondary_set;
126
128 std::set<BoundaryID> _boundary_ids;
129
131 std::set<SubdomainID> _higher_dim_subdomain_ids;
132
135
138
141
143 const libMesh::QBase * const & _qrule_msm;
144
147
154 Elem const * const & _lower_secondary_elem;
155
162 Elem const * const & _lower_primary_elem;
163
165 const std::vector<Real> & _JxW_msm;
166
168 const Elem * const & _msm_elem;
169
171 std::vector<Point> _normals;
172
173private:
177 void setNormals();
178
179 // Pointer to automatic mortar generation object to give constraints access to mortar geometry
181
183 friend class FEProblemBase;
184
185 template <typename>
188
194};
195
196inline const AutomaticMortarGeneration &
198{
199 mooseAssert(_amg, "this should have been set in the constructor");
200 return *_amg;
201}
202
203template <typename Variables, typename DualNumbers>
204void
206 const std::map<unsigned int, unsigned int> & domain_ip_lowerd_map,
207 const Variables & moose_vars,
208 DualNumbers & dual_numbers,
209 const bool is_secondary)
210{
211 //
212 // Remove interior node variable's derivatives from AD objects.
213 //
214
215 mooseAssert(moose_vars.size(), "Should have passed at least one variable");
216 const auto num_indices = is_secondary ? moose_vars[0]->dofIndices().size()
217 : moose_vars[0]->dofIndicesNeighbor().size();
218#ifdef DEBUG
219 for (const auto i : make_range(std::size_t(1), moose_vars.size()))
220 if (auto * moose_var = moose_vars[i])
221 mooseAssert(is_secondary ? moose_var->dofIndices().size()
222 : moose_var->dofIndicesNeighbor().size() == num_indices,
223 "These must be the same for all passed in variables");
224#endif
225
226 for (const auto dof_index : make_range(num_indices))
227 if (!domain_ip_lowerd_map.count(dof_index))
228 {
229 for (const auto * const moose_var : moose_vars)
230 {
231 // It's valid for a user to pass a container that represents a LIBMESH_DIM vector of
232 // component variables for which one or two of the variables may be null depending on the
233 // mesh dimension in the simulation
234 if (!moose_var)
235 continue;
236
237 mooseAssert(moose_var->isNodal(),
238 "Trimming of interior node's derivatives is only supported for Lagrange "
239 "elements in mortar objects");
240
241 const auto remove_derivative_index = is_secondary
242 ? moose_var->dofIndices()[dof_index]
243 : moose_var->dofIndicesNeighbor()[dof_index];
244 for (auto & dual_number : dual_numbers)
245 trimDerivative(remove_derivative_index, dual_number);
246 }
247 }
248}
249
250inline bool
252 const BoundaryID secondary_boundary_id) const
253{
254 return (primary_boundary_id == _primary_id) && (secondary_boundary_id == _secondary_id);
255}
DualNumber< Real, DNDerivativeType, true > ADReal
boundary_id_type BoundaryID
unsigned int THREAD_ID
Definition MooseTypes.h:237
Keeps track of stuff related to assembling.
Definition Assembly.h:110
This class is a container/interface for the objects involved in automatic generation of mortar spaces...
Specialization of SubProblem for solving nonlinear equations plus auxiliary equations.
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system.
forward declarations
Definition MooseArray.h:18
MooseMesh wraps a libMesh::Mesh object and enhances its capabilities by caching additional data and s...
Definition MooseMesh.h:95
Every object that can be built by the factory should be derived from this class.
Definition MooseObject.h:31
An interface for accessing mortar mesh data.
SubdomainID primarySubdomain() const
static InputParameters validParams()
const AutomaticMortarGeneration * _amg
std::set< BoundaryID > _boundary_ids
the union of the secondary and primary boundary ids
static InputParameters triangulationParams()
Elem const *const & _lower_secondary_elem
The secondary face lower dimensional element (not the mortar element!).
const bool _interpolate_normals
Whether to interpolate the nodal normals.
const libMesh::QBase *const & _qrule_msm
The quadrature rule on the mortar segment element.
const libMesh::QBase *const & _qrule_face
The arbitrary quadrature rule on the lower dimensional secondary face.
static void trimDerivative(dof_id_type remove_derivative_index, ADReal &dual_number)
Get rid of AD derivative entries by dof index.
void setNormals()
Set the normals vector.
const AutomaticMortarGeneration & amg() const
Retrieve the automatic mortar generation object associated with this constraint.
std::set< BoundaryID > _secondary_set
the secondaryid set
const std::set< SubdomainID > & getHigherDimSubdomainIDs() const
const BoundaryID _primary_id
Boundary ID for the primary surface.
const MortarInterfaceWarehouse & _mortar_data
A reference to the mortar data object that holds all the mortar mesh information.
friend void reinitMortarUserObjects(BoundaryID, BoundaryID, bool)
Calls the reinitialization of mortar user objects.
Elem const *const & _lower_primary_elem
The primary face lower dimensional element (not the mortar element!).
bool onInterface(BoundaryID primary_boundary_id, BoundaryID secondary_boundary_id) const
const MooseArray< Point > & _phys_points_secondary
The locations of the quadrature points on the interior secondary elements.
std::set< SubdomainID > _higher_dim_subdomain_ids
the higher dimensional subdomain ids corresponding to the interior parents
const Elem *const & _msm_elem
The current mortar segment element.
SubdomainID secondarySubdomain() const
const SubdomainID _secondary_subdomain_id
Subdomain ID for the secondary surface.
MooseMesh & _mci_mesh
Mesh to query for boundary and subdomain ID information.
const MooseArray< Point > & _phys_points_primary
The locations of the quadrature points on the interior primary elements.
std::vector< Point > _normals
the normals
static void trimInteriorNodeDerivatives(const std::map< unsigned int, unsigned int > &primary_ip_lowerd_map, const Variables &moose_var, DualNumbers &ad_vars, const bool is_secondary)
Get rid of interior node variable's derivatives.
const BoundaryID _secondary_id
Boundary ID for the secondary surface.
bool interpolateNormals() const
Whether to interpolate the nodal normals (e.g.
const std::vector< Real > & _JxW_msm
The element Jacobian times weights.
const SubdomainID _primary_subdomain_id
Subdomain ID for the primary surface.
const std::set< BoundaryID > & getBoundaryIDs() const
Base class for creating new nodally-based mortar auxiliary kernels.
Generic class for solving transient nonlinear problems.
Definition SubProblem.h:79
The following methods are specializations for using the libMesh::Parallel::packed_range_* routines fo...