https://mooseframework.inl.gov
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 
16 class InputParameters;
17 class MooseObject;
18 class MooseMesh;
19 class MortarData;
21 class SubProblem;
22 class Assembly;
23 
24 namespace libMesh
25 {
26 class QBase;
27 }
28 
36 {
37 public:
38  MortarConsumerInterface(const MooseObject * moose_object);
39 
41 
46 
51 
55  bool onInterface(BoundaryID primary_boundary_id, BoundaryID secondary_boundary_id) const;
56 
57 protected:
58  const std::set<SubdomainID> & getHigherDimSubdomainIDs() const
59  {
61  }
62  const std::set<BoundaryID> & getBoundaryIDs() const { return _boundary_ids; }
63 
67  const AutomaticMortarGeneration & amg() const;
68 
74  bool interpolateNormals() const { return _interpolate_normals; }
75 
79  static void trimDerivative(dof_id_type remove_derivative_index, ADReal & dual_number);
80 
84  template <typename Variables, typename DualNumbers>
85  static void
86  trimInteriorNodeDerivatives(const std::map<unsigned int, unsigned int> & primary_ip_lowerd_map,
87  const Variables & moose_var,
88  DualNumbers & ad_vars,
89  const bool is_secondary);
90 
94 
97 
99 
103 
106 
109 
112 
115 
117  std::set<BoundaryID> _secondary_set;
118 
120  std::set<BoundaryID> _boundary_ids;
121 
123  std::set<SubdomainID> _higher_dim_subdomain_ids;
124 
127 
130 
133 
135  const libMesh::QBase * const & _qrule_msm;
136 
138  const libMesh::QBase * const & _qrule_face;
139 
146  Elem const * const & _lower_secondary_elem;
147 
154  Elem const * const & _lower_primary_elem;
155 
157  const std::vector<Real> & _JxW_msm;
158 
160  const Elem * const & _msm_elem;
161 
163  std::vector<Point> _normals;
164 
165 private:
169  void setNormals();
170 
171  // Pointer to automatic mortar generation object to give constraints access to mortar geometry
173 
174  friend class ComputeMortarFunctor;
175  friend class FEProblemBase;
176 
177  template <typename>
180 
185  friend void reinitMortarUserObjects(BoundaryID, BoundaryID, bool);
186 };
187 
188 inline const AutomaticMortarGeneration &
190 {
191  mooseAssert(_amg, "this should have been set in the constructor");
192  return *_amg;
193 }
194 
195 template <typename Variables, typename DualNumbers>
196 void
198  const std::map<unsigned int, unsigned int> & domain_ip_lowerd_map,
199  const Variables & moose_vars,
200  DualNumbers & dual_numbers,
201  const bool is_secondary)
202 {
203  //
204  // Remove interior node variable's derivatives from AD objects.
205  //
206 
207  mooseAssert(moose_vars.size(), "Should have passed at least one variable");
208  const auto num_indices = is_secondary ? moose_vars[0]->dofIndices().size()
209  : moose_vars[0]->dofIndicesNeighbor().size();
210 #ifdef DEBUG
211  for (const auto i : make_range(std::size_t(1), moose_vars.size()))
212  if (auto * moose_var = moose_vars[i])
213  mooseAssert(is_secondary ? moose_var->dofIndices().size()
214  : moose_var->dofIndicesNeighbor().size() == num_indices,
215  "These must be the same for all passed in variables");
216 #endif
217 
218  for (const auto dof_index : make_range(num_indices))
219  if (!domain_ip_lowerd_map.count(dof_index))
220  {
221  for (const auto * const moose_var : moose_vars)
222  {
223  // It's valid for a user to pass a container that represents a LIBMESH_DIM vector of
224  // component variables for which one or two of the variables may be null depending on the
225  // mesh dimension in the simulation
226  if (!moose_var)
227  continue;
228 
229  mooseAssert(moose_var->isNodal(),
230  "Trimming of interior node's derivatives is only supported for Lagrange "
231  "elements in mortar objects");
232 
233  const auto remove_derivative_index = is_secondary
234  ? moose_var->dofIndices()[dof_index]
235  : moose_var->dofIndicesNeighbor()[dof_index];
236  for (auto & dual_number : dual_numbers)
237  trimDerivative(remove_derivative_index, dual_number);
238  }
239  }
240 }
241 
242 inline bool
244  const BoundaryID secondary_boundary_id) const
245 {
246  return (primary_boundary_id == _primary_id) && (secondary_boundary_id == _secondary_id);
247 }
const std::set< SubdomainID > & getHigherDimSubdomainIDs() const
SubdomainID primarySubdomain() const
bool onInterface(BoundaryID primary_boundary_id, BoundaryID secondary_boundary_id) const
Keeps track of stuff related to assembling.
Definition: Assembly.h:101
const BoundaryID _secondary_id
Boundary ID for the secondary surface.
MortarConsumerInterface(const MooseObject *moose_object)
const AutomaticMortarGeneration * _amg
const libMesh::QBase *const & _qrule_face
The arbitrary quadrature rule on the lower dimensional secondary face.
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
const MooseArray< Point > & _phys_points_primary
The locations of the quadrature points on the interior primary elements.
std::set< SubdomainID > _higher_dim_subdomain_ids
the higher dimensional subdomain ids corresponding to the interior parents
Elem const *const & _lower_primary_elem
The primary face lower dimensional element (not the mortar element!).
const std::vector< Real > & _JxW_msm
The element Jacobian times weights.
The following methods are specializations for using the libMesh::Parallel::packed_range_* routines fo...
const MortarData & _mortar_data
A reference to the mortar data object that holds all the mortar mesh information. ...
MooseMesh & _mci_mesh
Mesh to query for boundary and subdomain ID information.
DualNumber< Real, DNDerivativeType, true > ADReal
Definition: ADRealForward.h:47
Specialization of SubProblem for solving nonlinear equations plus auxiliary equations.
const libMesh::QBase *const & _qrule_msm
The quadrature rule on the mortar segment element.
An interface for accessing mortar mesh data.
SubdomainID secondarySubdomain() const
This class is a container/interface for the objects involved in automatic generation of mortar spaces...
Elem const *const & _lower_secondary_elem
The secondary face lower dimensional element (not the mortar element!).
const Elem *const & _msm_elem
The current mortar segment element.
const AutomaticMortarGeneration & amg() const
Retrieve the automatic mortar generation object associated with this constraint.
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&#39;s derivatives.
Every object that can be built by the factory should be derived from this class.
Definition: MooseObject.h:28
std::set< BoundaryID > _boundary_ids
the union of the secondary and primary boundary ids
std::vector< Point > _normals
the normals
boundary_id_type BoundaryID
MooseMesh wraps a libMesh::Mesh object and enhances its capabilities by caching additional data and s...
Definition: MooseMesh.h:88
bool interpolateNormals() const
Whether to interpolate the nodal normals (e.g.
const MooseArray< Point > & _phys_points_secondary
The locations of the quadrature points on the interior secondary elements.
static void trimDerivative(dof_id_type remove_derivative_index, ADReal &dual_number)
Get rid of AD derivative entries by dof index.
Base class for creating new nodally-based mortar auxiliary kernels.
void setNormals()
Set the normals vector.
const BoundaryID _primary_id
Boundary ID for the primary surface.
const SubdomainID _primary_subdomain_id
Subdomain ID for the primary surface.
Generic class for solving transient nonlinear problems.
Definition: SubProblem.h:78
static InputParameters validParams()
IntRange< T > make_range(T beg, T end)
std::set< BoundaryID > _secondary_set
the secondaryid set
const SubdomainID _secondary_subdomain_id
Subdomain ID for the secondary surface.
const bool _interpolate_normals
Whether to interpolate the nodal normals.
const std::set< BoundaryID > & getBoundaryIDs() const
unsigned int THREAD_ID
Definition: MooseTypes.h:209
friend void reinitMortarUserObjects(BoundaryID, BoundaryID, bool)
Calls the reinitialization of mortar user objects.
uint8_t dof_id_type