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;
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 
49 
54 
59 
63  bool onInterface(BoundaryID primary_boundary_id, BoundaryID secondary_boundary_id) const;
64 
65 protected:
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 
82  bool interpolateNormals() const { return _interpolate_normals; }
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 
146  const libMesh::QBase * const & _qrule_face;
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 
173 private:
177  void setNormals();
178 
179  // Pointer to automatic mortar generation object to give constraints access to mortar geometry
181 
182  friend class ComputeMortarFunctor;
183  friend class FEProblemBase;
184 
185  template <typename>
188 
193  friend void reinitMortarUserObjects(BoundaryID, BoundaryID, bool);
194 };
195 
196 inline const AutomaticMortarGeneration &
198 {
199  mooseAssert(_amg, "this should have been set in the constructor");
200  return *_amg;
201 }
202 
203 template <typename Variables, typename DualNumbers>
204 void
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 
250 inline bool
252  const BoundaryID secondary_boundary_id) const
253 {
254  return (primary_boundary_id == _primary_id) && (secondary_boundary_id == _secondary_id);
255 }
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:109
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...
MooseMesh & _mci_mesh
Mesh to query for boundary and subdomain ID information.
DualNumber< Real, DNDerivativeType, true > ADReal
Definition: ADRealForward.h:42
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:93
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.
const MortarInterfaceWarehouse & _mortar_data
A reference to the mortar data object that holds all the mortar mesh information. ...
Generic class for solving transient nonlinear problems.
Definition: SubProblem.h:78
static InputParameters validParams()
IntRange< T > make_range(T beg, T end)
static InputParameters triangulationParams()
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:237
friend void reinitMortarUserObjects(BoundaryID, BoundaryID, bool)
Calls the reinitialization of mortar user objects.
uint8_t dof_id_type