https://mooseframework.inl.gov
ComputeMortarFunctor.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 "ComputeMortarFunctor.h"
11 #include "FEProblemBase.h"
12 #include "SubProblem.h"
13 #include "Assembly.h"
14 #include "ADMortarConstraint.h"
16 #include "MooseMesh.h"
17 #include "Assembly.h"
18 #include "MortarUtils.h"
19 #include "MaterialBase.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 
27 // C++
28 #include <cstring> // for "Jacobian" exception test
29 
31  const std::vector<std::shared_ptr<MortarConstraintBase>> & mortar_constraints,
32  const AutomaticMortarGeneration & amg,
33  SubProblem & subproblem,
34  FEProblemBase & fe_problem,
35  bool displaced,
36  Assembly & assembly)
37  : _amg(amg),
38  _subproblem(subproblem),
39  _fe_problem(fe_problem),
40  _displaced(displaced),
41  _assembly(assembly)
42 {
43  // Construct the mortar constraints we will later loop over
44  for (auto mc : mortar_constraints)
45  _mortar_constraints.push_back(mc.get());
46 
49  _amg,
50  0,
54 }
55 
56 void
58 {
61  _amg,
62  /*thread id*/ 0,
66 }
67 
68 void
70  const std::set<TagID> & vector_tag_ids,
71  const std::set<TagID> & /*matrix_tag_ids*/)
72 {
73  libmesh_parallel_only(_fe_problem.comm());
74 
75  unsigned int num_cached = 0;
76  const auto & vector_tags = _fe_problem.getVectorTags(vector_tag_ids);
77 
78  const auto & secondary_elems_to_mortar_segments = _amg.secondariesToMortarSegments();
79  typedef decltype(secondary_elems_to_mortar_segments.begin()) it_type;
80 
81  std::vector<it_type> iterators;
82  for (auto it = secondary_elems_to_mortar_segments.begin();
83  it != secondary_elems_to_mortar_segments.end();
84  ++it)
85  {
86  auto * const secondary_elem = _subproblem.mesh().getMesh().query_elem_ptr(it->first);
87 
88  if (secondary_elem && secondary_elem->processor_id() == _subproblem.processor_id() &&
89  !it->second.empty())
90  {
91  // This is local and the mortar segment set isn't empty, so include
92  iterators.push_back(it);
93  mooseAssert(secondary_elem->active(),
94  "We loop over active elements when building the mortar segment mesh, so we golly "
95  "well hope this is active.");
96  }
97  }
98 
99  auto act_functor = [this, &num_cached, compute_type, &vector_tags]()
100  {
101  ++num_cached;
102 
103  switch (compute_type)
104  {
106  {
107  for (auto * const mc : _mortar_constraints)
108  {
109  mc->setNormals();
110  mc->computeResidual();
111  }
112 
116 
117  if (num_cached % 20 == 0)
119 
120  break;
121  }
122 
124  {
125  for (auto * const mc : _mortar_constraints)
126  {
127  mc->setNormals();
128  mc->computeJacobian();
129  }
130 
132 
133  if (num_cached % 20 == 0)
135  break;
136  }
137 
139  {
140  for (auto * const mc : _mortar_constraints)
141  {
142  mc->setNormals();
143  mc->computeResidualAndJacobian();
144  }
145 
150 
151  if (num_cached % 20 == 0)
152  {
155  }
156  break;
157  }
158  }
159  };
160 
161  PARALLEL_TRY
162  {
163  try
164  {
166  _assembly,
167  _subproblem,
168  _fe_problem,
169  _amg,
170  _displaced,
172  0,
176  act_functor,
177  /*reinit_mortar_user_objects=*/true);
178  }
179  catch (MooseException & e)
180  {
182  }
183  catch (MetaPhysicL::LogicError & e)
184  {
186  }
187  catch (std::exception & e)
188  {
189  if (!strstr(e.what(), "Jacobian") && !strstr(e.what(), "singular") &&
190  !strstr(e.what(), "det != 0"))
191  throw;
192 
194  "We caught a libMesh degeneracy exception in ComputeMortarFunctor:\n" +
195  std::string(e.what()));
196  }
197  }
198  PARALLEL_CATCH;
199 
200  // Call any post operations for our mortar constraints
201  for (auto * const mc : _mortar_constraints)
202  {
204  mc->incorrectEdgeDroppingPost(_amg.getInactiveLMNodes());
205  else
206  mc->post();
207 
208  mc->zeroInactiveLMDofs(_amg.getInactiveLMNodes(), _amg.getInactiveLMElems());
209  }
210 
211  // Make sure any remaining cached residuals/Jacobians get added
216 }
virtual MooseMesh & mesh()=0
void cacheResidualNeighbor(GlobalDataKey, const std::vector< VectorTag > &tags)
Takes the values that are currently in _sub_Rn of all field variables and appends them to the cached ...
Definition: Assembly.C:3440
std::vector< MortarFilterIter > secondariesToMortarSegments(const Node &node) const
virtual const char * what() const
Get out the error message.
void cacheResidualLower(GlobalDataKey, const std::vector< VectorTag > &tags)
Takes the values that are currently in _sub_Rl and appends them to the cached values.
Definition: Assembly.C:3454
Keeps track of stuff related to assembling.
Definition: Assembly.h:109
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:317
SubProblem & _subproblem
A reference to the SubProblem object for reiniting lower-dimensional element quantities.
const AutomaticMortarGeneration & _amg
Automatic mortar generation (amg) object providing the mortar mesh to loop over.
void translateMetaPhysicLError(const MetaPhysicL::LogicError &)
emit a relatively clear error message when we catch a MetaPhysicL logic error
Definition: MooseError.C:141
virtual void setException(const std::string &message)
Set an exception, which is stored at this point by toggling a member variable in this class...
const Parallel::Communicator & comm() const
const std::unordered_set< const Elem * > & getInactiveLMElems() const
std::map< SubdomainID, std::deque< MaterialBase * > > _secondary_ip_sub_to_mats
Specialization of SubProblem for solving nonlinear equations plus auxiliary equations.
const bool _displaced
Whether the mortar constraints are operating on the displaced mesh.
void addCachedResiduals(GlobalDataKey, const std::vector< VectorTag > &tags)
Pushes all cached residuals to the global residual vectors associated with each tag.
Definition: Assembly.C:3468
This class is a container/interface for the objects involved in automatic generation of mortar spaces...
MeshBase & getMesh()
Accessor for the underlying libMesh Mesh object.
Definition: MooseMesh.C:3528
ComputeMortarFunctor(const std::vector< std::shared_ptr< MortarConstraintBase >> &mortar_constraints, const AutomaticMortarGeneration &amg, SubProblem &subproblem, FEProblemBase &fe_problem, bool displaced, Assembly &assembly)
void cacheResidual(GlobalDataKey, const std::vector< VectorTag > &tags)
Takes the values that are currently in _sub_Re of all field variables and appends them to the cached ...
Definition: Assembly.C:3390
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...
std::vector< VectorTag > getVectorTags(const std::set< TagID > &tag_ids) const
Definition: SubProblem.C:173
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:70
ComputeType
The type of nonlinear computation being performed.
Definition: MooseTypes.h:829
std::vector< MortarConstraintBase * > _mortar_constraints
The mortar constraints to loop over when on each element.
Provides a way for users to bail out of the current solve.
void setupMortarMaterials()
Setup step for materials that needs to be re-done if subdomains change.
Generic class for solving transient nonlinear problems.
Definition: SubProblem.h:78
bool computingResidual() const
Definition: Assembly.h:1949
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...
void operator()(Moose::ComputeType compute_type, const std::set< TagID > &vector_tag_ids, const std::set< TagID > &matrix_tag_ids)
Loops over the mortar segment mesh and computes the residual/Jacobian.
const std::unordered_set< const Node * > & getInactiveLMNodes() const
bool computingJacobian() const
Definition: Assembly.h:1954
void cacheJacobianMortar(GlobalDataKey)
Cache all portions of the Jacobian, e.g.
Definition: Assembly.C:4126
processor_id_type processor_id() const
FEProblemBase & _fe_problem
A reference to the FEProblemBase object for reiniting higher-dimensional element and neighbor element...
void addCachedJacobian(GlobalDataKey)
Adds the values that have been cached by calling cacheJacobian() and or cacheJacobianNeighbor() to th...
Definition: Assembly.C:3791
Assembly & _assembly
A reference to the assembly object.
Key structure for APIs manipulating global vectors/matrices.
Definition: Assembly.h:844