https://mooseframework.inl.gov
GhostHigherDLowerDPointNeighbors.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 // App includes
12 #include "Executioner.h"
13 #include "FEProblemBase.h"
14 #include "MooseApp.h"
15 #include "GhostLowerDElems.h"
16 
17 // libMesh includes
18 #include "libmesh/elem.h"
19 #include "libmesh/mesh_base.h"
20 #include "libmesh/boundary_info.h"
21 
23 
24 using namespace libMesh;
25 
28 {
30  params.set<bool>("attach_geometric_early") = false;
31  return params;
32 }
33 
35  : RelationshipManager(params)
36 {
37 }
38 
41  : RelationshipManager(other)
42 {
43 }
44 
45 std::string
47 {
48  std::ostringstream oss;
49  oss << "GhostHigherDLowerDPointNeighbors";
50  return oss.str();
51 }
52 
53 void
54 GhostHigherDLowerDPointNeighbors::operator()(const MeshBase::const_element_iterator & range_begin,
55  const MeshBase::const_element_iterator & range_end,
56  const processor_id_type p,
57  map_type & coupled_elements)
58 {
59  mooseAssert(_moose_mesh,
60  "The MOOSE mesh must be non-null in order for this relationship manager to work.");
61  const auto & node_to_elem_map = _moose_mesh->nodeToElemMap();
62 
63  static const CouplingMatrix * const null_mat = nullptr;
64 
65  for (const Elem * const elem : as_range(range_begin, range_end))
66  {
67  if (elem->dim() != _mesh->mesh_dimension())
68  // not a higher-dimensional element
69  continue;
70 
71  for (const auto & node : elem->node_ref_range())
72  {
73  // We want to ghost the adjoining lower-d elements if the node hasn't been partitioned yet
74  // (e.g. we don't know what processes it will be) or if its processor id matches our
75  // processes's id
76  if (node.processor_id() != p)
77  continue;
78 
79  const auto & elem_node_neighbors = libmesh_map_find(node_to_elem_map, node.id());
80  for (const auto elem_id : elem_node_neighbors)
81  {
82  const Elem * const elem_node_neighbor = _mesh->elem_ptr(elem_id);
83  if (elem_node_neighbor->dim() != _mesh->mesh_dimension() &&
84  elem_node_neighbor->processor_id() != p)
85  coupled_elements.emplace(elem_node_neighbor, null_mat);
86  }
87  }
88  }
89 }
90 
91 bool
93 {
94  return dynamic_cast<const GhostHigherDLowerDPointNeighbors *>(&other) ||
95  dynamic_cast<const GhostLowerDElems *>(&other);
96 }
97 
98 std::unique_ptr<GhostingFunctor>
100 {
101  return _app.getFactory().copyConstruct(*this);
102 }
T & set(const std::string &name, bool quiet_mode=false)
Returns a writable reference to the named parameters.
MooseMesh * _moose_mesh
Pointer to the MooseMesh object.
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
std::map< const Elem *, const CouplingMatrix *, CompareDofObjectsByPIDAndThenID > map_type
The following methods are specializations for using the libMesh::Parallel::packed_range_* routines fo...
Factory & getFactory()
Retrieve a writable reference to the Factory associated with this App.
Definition: MooseApp.h:424
GhostHigherDLowerDPointNeighbors(const InputParameters &)
virtual bool operator>=(const RelationshipManager &other) const override
Whether this relationship manager provides more or the same amount and type of ghosting as the rhs...
uint8_t processor_id_type
SimpleRange< IndexType > as_range(const std::pair< IndexType, IndexType > &p)
std::string getInfo() const override
Method for returning relationship manager information (suitable for console output).
MooseApp & _app
The MOOSE application this is associated with.
Definition: MooseBase.h:84
std::unique_ptr< GhostingFunctor > clone() const override
const MeshBase * _mesh
virtual const Elem * elem_ptr(const dof_id_type i) const=0
RelationshipManagers are used for describing what kinds of non-local resources are needed for an obje...
virtual unsigned short dim() const=0
static InputParameters validParams()
registerMooseObject("MooseApp", GhostHigherDLowerDPointNeighbors)
unsigned int mesh_dimension() const
void operator()(const MeshBase::const_element_iterator &range_begin, const MeshBase::const_element_iterator &range_end, processor_id_type p, map_type &coupled_elements) override
processor_id_type processor_id() const
const std::map< dof_id_type, std::vector< dof_id_type > > & nodeToElemMap()
If not already created, creates a map from every node to all elements to which they are connected...
Definition: MooseMesh.C:1175