104 template <
typename Variables,
typename DualNumbers>
107 const Variables & moose_var,
108 DualNumbers & ad_vars,
109 const bool is_secondary);
211 mooseAssert(
_amg,
"this should have been set in the constructor");
215template <
typename Variables,
typename DualNumbers>
218 const std::map<unsigned int, unsigned int> & domain_ip_lowerd_map,
219 const Variables & moose_vars,
220 DualNumbers & dual_numbers,
221 const bool is_secondary)
227 mooseAssert(moose_vars.size(),
"Should have passed at least one variable");
228 const auto num_indices = is_secondary ? moose_vars[0]->dofIndices().size()
229 : moose_vars[0]->dofIndicesNeighbor().size();
231 for (
const auto i : make_range(std::size_t(1), moose_vars.size()))
232 if (
auto * moose_var = moose_vars[i])
233 mooseAssert(is_secondary ? moose_var->dofIndices().size()
234 : moose_var->dofIndicesNeighbor().size() == num_indices,
235 "These must be the same for all passed in variables");
238 for (
const auto dof_index : make_range(num_indices))
239 if (!domain_ip_lowerd_map.count(dof_index))
241 for (
const auto *
const moose_var : moose_vars)
249 mooseAssert(moose_var->isNodal(),
250 "Trimming of interior node's derivatives is only supported for Lagrange "
251 "elements in mortar objects");
253 const auto remove_derivative_index = is_secondary
254 ? moose_var->dofIndices()[dof_index]
255 : moose_var->dofIndicesNeighbor()[dof_index];
256 for (
auto & dual_number : dual_numbers)
DualNumber< Real, DNDerivativeType, true > ADReal
boundary_id_type BoundaryID
subdomain_id_type SubdomainID
Keeps track of stuff related to assembling.
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.
MooseMesh wraps a libMesh::Mesh object and enhances its capabilities by caching additional data and s...
Every object that can be built by the factory should be derived from this class.
This class provides an interface for common operations on field variables of both FE and FV types wit...
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.
FEProblemBase & _mci_fe_problem
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.
void checkPetrovGalerkinQuadraticFaces(const MooseObject &moose_object, const MooseVariableFieldBase &lm_var) const
Report an error if Petrov-Galerkin weights the gap of a SECOND order dual Lagrange multiplier with th...
const MortarInterfaceWarehouse & _mortar_data
A reference to the mortar data object that holds all the mortar mesh information.
SubProblem & _mci_subproblem
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.
The following methods are specializations for using the libMesh::Parallel::packed_range_* routines fo...