LCOV - code coverage report
Current view: top level - src/userobjects - GhostingUserObject.C (source / functions) Hit Total Coverage
Test: idaholab/moose framework: 2bf808 Lines: 48 51 94.1 %
Date: 2025-07-17 01:28:37 Functions: 5 5 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       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             : 
      14             : registerMooseObject("MooseApp", GhostingUserObject);
      15             : 
      16             : namespace
      17             : {
      18             : constexpr unsigned int GEOMETRIC_MAP_IDX = 0;
      19             : constexpr unsigned int ALGEBRAIC_MAP_IDX = 1;
      20             : }
      21             : 
      22             : InputParameters
      23       14463 : GhostingUserObject::validParams()
      24             : {
      25       14463 :   InputParameters params = GeneralUserObject::validParams();
      26             : 
      27       14463 :   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       28926 :   params.set<ExecFlagEnum>("execute_on") = {EXEC_INITIAL};
      31             : 
      32       14463 :   params.addClassDescription("Creates ghosting maps that can be queried by external objects.");
      33       14463 :   return params;
      34       14463 : }
      35             : 
      36          99 : GhostingUserObject::GhostingUserObject(const InputParameters & parameters)
      37             :   : GeneralUserObject(parameters),
      38          99 :     _mesh(_subproblem.mesh()),
      39         198 :     _nl(_fe_problem.getNonlinearSystemBase(_sys.number()))
      40             : {
      41          99 :   _maps.resize(2); // Geometric and Algebraic maps
      42             : 
      43          99 :   if (parameters.isParamValid("pids"))
      44           0 :     _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          99 :     _pids.resize(_app.n_processors());
      49          99 :     std::iota(_pids.begin(), _pids.end(), 0);
      50             :   }
      51          99 : }
      52             : 
      53             : void
      54          99 : GhostingUserObject::initialSetup()
      55             : {
      56          99 :   meshChanged();
      57          99 : }
      58             : 
      59             : void
      60          99 : GhostingUserObject::meshChanged()
      61             : {
      62             :   // Clear the maps before rebuilding
      63         297 :   for (auto & map_ref : _maps)
      64         198 :     for (auto pid_map_pair : map_ref)
      65           0 :       pid_map_pair.second.clear();
      66             : 
      67         492 :   for (auto pid : _pids)
      68             :   {
      69         393 :     auto begin_elem = _mesh.getMesh().active_pid_elements_begin(pid);
      70         393 :     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         393 :     libMesh::GhostingFunctor::map_type geometric_elems;
      75         786 :     for (auto & gf : as_range(_mesh.getMesh().ghosting_functors_begin(),
      76        3665 :                               _mesh.getMesh().ghosting_functors_end()))
      77        2486 :       (*gf)(begin_elem, end_elem, pid, geometric_elems);
      78         393 :     _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         393 :     libMesh::GhostingFunctor::map_type algebraic_elems;
      83         786 :     for (auto & gf : as_range(_nl.dofMap().algebraic_ghosting_functors_begin(),
      84        1837 :                               _nl.dofMap().algebraic_ghosting_functors_end()))
      85         658 :       (*gf)(begin_elem, end_elem, pid, algebraic_elems);
      86         393 :     for (auto & gf :
      87        1563 :          as_range(_nl.dofMap().coupling_functors_begin(), _nl.dofMap().coupling_functors_end()))
      88         777 :       (*gf)(begin_elem, end_elem, pid, algebraic_elems);
      89         393 :     _maps[ALGEBRAIC_MAP_IDX].emplace(pid, algebraic_elems);
      90         393 :   }
      91          99 : }
      92             : 
      93             : Real
      94       25712 : GhostingUserObject::getElementalValue(const Elem * elem,
      95             :                                       Moose::RelationshipManagerType rm_type,
      96             :                                       processor_id_type pid) const
      97             : {
      98       25712 :   unsigned int map_idx = (rm_type == Moose::RelationshipManagerType::GEOMETRIC ? GEOMETRIC_MAP_IDX
      99             :                                                                                : ALGEBRAIC_MAP_IDX);
     100             : 
     101       25712 :   auto map_it = _maps[map_idx].find(pid);
     102       25712 :   if (map_it == _maps[map_idx].end())
     103           0 :     mooseError("No entry in the ghosting map for processor ID: ", pid);
     104             : 
     105       25712 :   auto map_ref = map_it->second;
     106       25712 :   if (map_ref.find(elem) != map_ref.end())
     107        3130 :     return 1.;
     108             :   else
     109       22582 :     return 0.;
     110       25712 : }

Generated by: LCOV version 1.14