www.mooseframework.org
GhostingUserObject.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
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 "GhostingUserObject.h"
11 #include "NonlinearSystemBase.h"
12 #include "MooseMesh.h"
13 
15 
16 namespace
17 {
18 constexpr unsigned int GEOMETRIC_MAP_IDX = 0;
19 constexpr unsigned int ALGEBRAIC_MAP_IDX = 1;
20 }
21 
24 {
26 
27  params.addParam<std::vector<processor_id_type>>("pids", "The PID(s) to see the ghosting for");
28 
29  // No need to set or override this flag, this object is triggered by meshChanged events
30  params.set<ExecFlagEnum>("execute_on") = {EXEC_INITIAL};
31 
32  params.addClassDescription("Creates ghosting maps that can be queried by external objects.");
33  return params;
34 }
35 
37  : GeneralUserObject(parameters),
38  _mesh(_subproblem.mesh()),
39  _nl(_fe_problem.getNonlinearSystemBase(_sys.number()))
40 {
41  _maps.resize(2); // Geometric and Algebraic maps
42 
43  if (parameters.isParamValid("pids"))
44  _pids = getParam<std::vector<processor_id_type>>("pids");
45  else
46  {
47  // If a PIDs vector is not passed, generate patterns for all processors
48  _pids.resize(_app.n_processors());
49  std::iota(_pids.begin(), _pids.end(), 0);
50  }
51 }
52 
53 void
55 {
56  meshChanged();
57 }
58 
59 void
61 {
62  // Clear the maps before rebuilding
63  for (auto & map_ref : _maps)
64  for (auto pid_map_pair : map_ref)
65  pid_map_pair.second.clear();
66 
67  for (auto pid : _pids)
68  {
69  auto begin_elem = _mesh.getMesh().active_pid_elements_begin(pid);
70  const auto end_elem = _mesh.getMesh().active_pid_elements_end(pid);
71 
72  // Loop over all the geometric ghosting functors and build up a map of elements that are ghosted
73  // for each PID
74  libMesh::GhostingFunctor::map_type geometric_elems;
75  for (auto & gf : as_range(_mesh.getMesh().ghosting_functors_begin(),
76  _mesh.getMesh().ghosting_functors_end()))
77  (*gf)(begin_elem, end_elem, pid, geometric_elems);
78  _maps[GEOMETRIC_MAP_IDX].emplace(pid, geometric_elems);
79 
80  // Loop over all the algebraic ghosting functors and build up a map of elements that are ghosted
81  // for each PID
82  libMesh::GhostingFunctor::map_type algebraic_elems;
83  for (auto & gf : as_range(_nl.dofMap().algebraic_ghosting_functors_begin(),
84  _nl.dofMap().algebraic_ghosting_functors_end()))
85  (*gf)(begin_elem, end_elem, pid, algebraic_elems);
86  for (auto & gf :
87  as_range(_nl.dofMap().coupling_functors_begin(), _nl.dofMap().coupling_functors_end()))
88  (*gf)(begin_elem, end_elem, pid, algebraic_elems);
89  _maps[ALGEBRAIC_MAP_IDX].emplace(pid, algebraic_elems);
90  }
91 }
92 
93 Real
96  processor_id_type pid) const
97 {
98  unsigned int map_idx = (rm_type == Moose::RelationshipManagerType::GEOMETRIC ? GEOMETRIC_MAP_IDX
99  : ALGEBRAIC_MAP_IDX);
100 
101  auto map_it = _maps[map_idx].find(pid);
102  if (map_it == _maps[map_idx].end())
103  mooseError("No entry in the ghosting map for processor ID: ", pid);
104 
105  auto map_ref = map_it->second;
106  if (map_ref.find(elem) != map_ref.end())
107  return 1.;
108  else
109  return 0.;
110 }
std::vector< std::unordered_map< processor_id_type, libMesh::GhostingFunctor::map_type > > _maps
Ghost Functor maps Dimension one: Map type (Geometric, Algebraic) Dimension two: Proc ID -> Map Dimen...
A MultiMooseEnum object to hold "execute_on" flags.
Definition: ExecFlagEnum.h:21
std::vector< processor_id_type > _pids
The PID to show the ghosting for.
RelationshipManagerType
Main types of Relationship Managers.
Definition: MooseTypes.h:876
static InputParameters validParams()
T & set(const std::string &name, bool quiet_mode=false)
Returns a writable reference to the named parameters.
MeshBase & mesh
virtual void initialSetup() override
Gets called at the beginning of the simulation before this object is asked to do its job...
Real getElementalValue(const Elem *elem, Moose::RelationshipManagerType rm_type, processor_id_type pid) const
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
std::map< const Elem *, const CouplingMatrix *, CompareDofObjectsByPIDAndThenID > map_type
This object loops over all of the underlying ghosting functors added by libMesh or MOOSE through Rela...
uint8_t processor_id_type
virtual DofMap & dofMap()
Gets writeable reference to the dof map.
Definition: SystemBase.C:1138
processor_id_type n_processors() const
MeshBase & getMesh()
Accessor for the underlying libMesh Mesh object.
Definition: MooseMesh.C:3199
SimpleRange< IndexType > as_range(const std::pair< IndexType, IndexType > &p)
GhostingUserObject(const InputParameters &parameters)
const T & getParam(const std::string &name) const
Retrieve a parameter for the object.
MooseApp & _app
The MOOSE application this is associated with.
Definition: MooseBase.h:84
virtual void meshChanged() override
Called on this object when the mesh changes.
NonlinearSystemBase & _nl
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
static InputParameters validParams()
void mooseError(Args &&... args) const
Emits an error prefixed with object name and type.
void addClassDescription(const std::string &doc_string)
This method adds a description of the class that will be displayed in the input file syntax dump...
const InputParameters & parameters() const
Get the parameters of the object.
void addParam(const std::string &name, const S &value, const std::string &doc_string)
These methods add an option parameter and a documentation string to the InputParameters object...
registerMooseObject("MooseApp", GhostingUserObject)
bool isParamValid(const std::string &name) const
This method returns parameters that have been initialized in one fashion or another, i.e.
const ExecFlagType EXEC_INITIAL
Definition: Moose.C:28