https://mooseframework.inl.gov
Loading...
Searching...
No Matches
GhostingUserObject.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 "GhostingUserObject.h"
11#include "NonlinearSystemBase.h"
12#include "MooseMesh.h"
13
15
16namespace
17{
18constexpr unsigned int GEOMETRIC_MAP_IDX = 0;
19constexpr 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
53void
58
59void
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
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
83 for (auto & gf : as_range(_nl.dofMap().algebraic_ghosting_functors_begin(),
85 (*gf)(begin_elem, end_elem, pid, algebraic_elems);
86 for (auto & gf :
88 (*gf)(begin_elem, end_elem, pid, algebraic_elems);
89 _maps[ALGEBRAIC_MAP_IDX].emplace(pid, algebraic_elems);
90 }
91}
92
93Real
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}
registerMooseObject("MooseApp", GhostingUserObject)
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
Definition MooseError.h:311
const ExecFlagType EXEC_INITIAL
Definition Moose.C:30
A MultiMooseEnum object to hold "execute_on" flags.
static InputParameters validParams()
This object loops over all of the underlying ghosting functors added by libMesh or MOOSE through Rela...
GhostingUserObject(const InputParameters &parameters)
NonlinearSystemBase & _nl
virtual void meshChanged() override
Called on this object when the mesh changes.
std::vector< processor_id_type > _pids
The PID to show the ghosting for.
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
static InputParameters validParams()
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...
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system.
void addParam(const std::string &name, const S &value, const std::string &doc_string)
These methods add an optional parameter and a documentation string to the InputParameters object.
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.
T & set(const std::string &name, bool quiet_mode=false)
Returns a writable reference to the named parameters.
bool isParamValid(const std::string &name) const
This method returns parameters that have been initialized in one fashion or another,...
const InputParameters & parameters() const
Get the parameters of the object.
Definition MooseBase.h:131
MeshBase & getMesh()
Accessor for the underlying libMesh Mesh object.
Definition MooseMesh.C:3549
MooseApp & _app
The MOOSE application this is associated with.
Definition MooseBase.h:375
virtual libMesh::DofMap & dofMap()
Gets writeable reference to the dof map.
GhostingFunctorIterator coupling_functors_begin() const
GhostingFunctorIterator coupling_functors_end() const
GhostingFunctorIterator algebraic_ghosting_functors_end() const
GhostingFunctorIterator algebraic_ghosting_functors_begin() const
std::map< const Elem *, const CouplingMatrix *, CompareDofObjectsByPIDAndThenID > map_type
processor_id_type n_processors() const
MeshBase & mesh
RelationshipManagerType
Main types of Relationship Managers.