https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
24using namespace libMesh;
25
28{
30 params.set<bool>("attach_geometric_early") = false;
31 return params;
32}
33
38
44
45std::string
47{
48 std::ostringstream oss;
49 oss << "GhostHigherDLowerDPointNeighbors";
50 return oss.str();
51}
52
53void
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 const auto mesh_dim = _mesh->mesh_dimension();
65 std::unordered_set<dof_id_type> visited_nodes;
66
67 for (const Elem * const elem : as_range(range_begin, range_end))
68 {
69 if (elem->dim() != mesh_dim)
70 // not a higher-dimensional element
71 continue;
72
73 for (const auto & node : elem->node_ref_range())
74 {
75 // We want to ghost the adjoining lower-d elements if the node hasn't been partitioned yet
76 // (e.g. we don't know what processes it will be) or if its processor id matches our
77 // processes's id
78 const auto node_pid = node.processor_id();
79 if (node_pid == p || node_pid == DofObject::invalid_processor_id)
80 {
81 const auto [_, inserted] = visited_nodes.insert(node.id());
82 if (!inserted)
83 // We've already considered this node
84 continue;
85
86 const auto & elem_node_neighbors = libmesh_map_find(node_to_elem_map, node.id());
87 for (const auto elem_id : elem_node_neighbors)
88 {
89 const Elem * const elem_node_neighbor = _mesh->elem_ptr(elem_id);
90 if (elem_node_neighbor->dim() != mesh_dim && elem_node_neighbor->processor_id() != p)
91 coupled_elements.emplace(elem_node_neighbor, null_mat);
92 }
93 }
94 }
95 }
96}
97
98bool
100{
101 return dynamic_cast<const GhostHigherDLowerDPointNeighbors *>(&other) ||
102 dynamic_cast<const GhostLowerDElems *>(&other);
103}
104
105std::unique_ptr<GhostingFunctor>
107{
108 return _app.getFactory().copyConstruct(*this);
109}
registerMooseObject("MooseApp", GhostHigherDLowerDPointNeighbors)
Ghosts lower-D point neighbors of higher-D elements.
std::unique_ptr< GhostingFunctor > clone() const override
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.
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
std::string getInfo() const override
Method for returning relationship manager information (suitable for console output).
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system.
T & set(const std::string &name, bool quiet_mode=false)
Returns a writable reference to the named parameters.
Factory & getFactory()
Retrieve a writable reference to the Factory associated with this App.
Definition MooseApp.h:407
const std::unordered_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:1236
MooseApp & _app
The MOOSE application this is associated with.
Definition MooseBase.h:375
RelationshipManagers are used for describing what kinds of non-local resources are needed for an obje...
static InputParameters validParams()
MooseMesh * _moose_mesh
Pointer to the MooseMesh object.
processor_id_type processor_id() const
static constexpr processor_id_type invalid_processor_id
virtual unsigned short dim() const=0
std::map< const Elem *, const CouplingMatrix *, CompareDofObjectsByPIDAndThenID > map_type
const MeshBase * _mesh
unsigned int mesh_dimension() const
virtual const Elem * elem_ptr(const dof_id_type i) const=0
The following methods are specializations for using the libMesh::Parallel::packed_range_* routines fo...
SimpleRange< IndexType > as_range(const std::pair< IndexType, IndexType > &p)
uint8_t processor_id_type