https://mooseframework.inl.gov
MortarUserObjectThread.C
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 #include "MortarUserObjectThread.h"
11 #include "FEProblemBase.h"
12 #include "SubProblem.h"
13 #include "Assembly.h"
15 #include "MooseMesh.h"
16 #include "Assembly.h"
17 #include "MortarUtils.h"
18 #include "MaterialBase.h"
19 #include "MortarUserObject.h"
20 
21 #include "libmesh/fe_base.h"
22 #include "libmesh/quadrature.h"
23 #include "libmesh/elem.h"
24 #include "libmesh/point.h"
25 #include "libmesh/mesh_base.h"
26 
28  std::vector<MortarUserObject *> & mortar_user_objects,
29  const AutomaticMortarGeneration & amg,
30  SubProblem & subproblem,
31  FEProblemBase & fe_problem,
32  bool displaced,
33  Assembly & assembly)
34  : _mortar_user_objects(mortar_user_objects),
35  _amg(amg),
36  _subproblem(subproblem),
37  _fe_problem(fe_problem),
38  _displaced(displaced),
39  _assembly(assembly)
40 {
43  _amg,
44  0,
48 }
49 
50 void
52 {
53  const auto & secondary_elems_to_mortar_segments = _amg.secondariesToMortarSegments();
54  typedef decltype(secondary_elems_to_mortar_segments.begin()) it_type;
55 
56  std::vector<it_type> iterators;
57  for (auto it = secondary_elems_to_mortar_segments.begin();
58  it != secondary_elems_to_mortar_segments.end();
59  ++it)
60  {
61  auto * const secondary_elem = _subproblem.mesh().getMesh().query_elem_ptr(it->first);
62 
63  if (secondary_elem && secondary_elem->processor_id() == _subproblem.processor_id() &&
64  !it->second.empty())
65  {
66  // This is local and the mortar segment set isn't empty, so include
67  iterators.push_back(it);
68  mooseAssert(secondary_elem->active(),
69  "We loop over active elements when building the mortar segment mesh, so we golly "
70  "well hope this is active.");
71  }
72  }
73 
74  auto act_functor = [this]()
75  {
76  for (auto * const mc : _mortar_user_objects)
77  {
78  mc->setNormals();
79  mc->execute();
80  }
81  };
82 
84  _assembly,
87  _amg,
88  _displaced,
90  0,
94  act_functor,
95  /*reinit_mortar_user_objects=*/false);
96 }
virtual MooseMesh & mesh()=0
std::vector< MortarFilterIter > secondariesToMortarSegments(const Node &node) const
Keeps track of stuff related to assembling.
Definition: Assembly.h:101
void setupMortarMaterials(const Consumers &consumers, FEProblemBase &fe_problem, const AutomaticMortarGeneration &amg, const THREAD_ID tid, std::map< SubdomainID, std::deque< MaterialBase *>> &secondary_ip_sub_to_mats, std::map< SubdomainID, std::deque< MaterialBase *>> &primary_ip_sub_to_mats, std::deque< MaterialBase *> &secondary_boundary_mats)
This function creates containers of materials necessary to execute the mortar method for a supplied s...
Definition: MortarUtils.h:316
void operator()()
Loops over the mortar segment mesh and executes the user objects.
Assembly & _assembly
A reference to the assembly object.
std::map< SubdomainID, std::deque< MaterialBase * > > _secondary_ip_sub_to_mats
Specialization of SubProblem for solving nonlinear equations plus auxiliary equations.
This class is a container/interface for the objects involved in automatic generation of mortar spaces...
SubProblem & _subproblem
A reference to the SubProblem object for reiniting lower-dimensional element quantities.
MeshBase & getMesh()
Accessor for the underlying libMesh Mesh object.
Definition: MooseMesh.C:3443
std::deque< MaterialBase * > _secondary_boundary_mats
A container that holds the boundary materials that will need to be reinit&#39;d on the secondary face...
const bool _displaced
Whether the mortar user objects are operating on the displaced mesh.
void loopOverMortarSegments(const Iterators &secondary_elems_to_mortar_segments, Assembly &assembly, SubProblem &subproblem, FEProblemBase &fe_problem, const AutomaticMortarGeneration &amg, const bool displaced, const Consumers &consumers, const THREAD_ID tid, const std::map< SubdomainID, std::deque< MaterialBase *>> &secondary_ip_sub_to_mats, const std::map< SubdomainID, std::deque< MaterialBase *>> &primary_ip_sub_to_mats, const std::deque< MaterialBase *> &secondary_boundary_mats, const ActionFunctor act, const bool reinit_mortar_user_objects)
This method will loop over pairs of secondary elements and their corresponding mortar segments...
Definition: MortarUtils.h:69
std::vector< MortarUserObject * > & _mortar_user_objects
The mortar user objects to loop over when on each mortar segment element.
Generic class for solving transient nonlinear problems.
Definition: SubProblem.h:78
std::map< SubdomainID, std::deque< MaterialBase * > > _primary_ip_sub_to_mats
A map from primary interior parent subdomain IDs to the block materials that will need to reinit&#39;d on...
processor_id_type processor_id() const
MortarUserObjectThread(std::vector< MortarUserObject *> &mortar_user_objects, const AutomaticMortarGeneration &amg, SubProblem &subproblem, FEProblemBase &fe_problem, bool displaced, Assembly &assembly)
FEProblemBase & _fe_problem
A reference to the FEProblemBase object for reiniting higher-dimensional element and neighbor element...
const AutomaticMortarGeneration & _amg
Automatic mortar generation (amg) object providing the mortar mesh to loop over.