LCOV - code coverage report
Current view: top level - include/parallel - parallel_object.h (source / functions) Hit Total Coverage
Test: libMesh/libmesh: #4229 (6a9aeb) with base 727f46 Lines: 18 18 100.0 %
Date: 2025-08-19 19:27:09 Functions: 7 8 87.5 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : // The libMesh Finite Element Library.
       2             : // Copyright (C) 2002-2025 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner
       3             : 
       4             : // This library is free software; you can redistribute it and/or
       5             : // modify it under the terms of the GNU Lesser General Public
       6             : // License as published by the Free Software Foundation; either
       7             : // version 2.1 of the License, or (at your option) any later version.
       8             : 
       9             : // This library is distributed in the hope that it will be useful,
      10             : // but WITHOUT ANY WARRANTY; without even the implied warranty of
      11             : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      12             : // Lesser General Public License for more details.
      13             : 
      14             : // You should have received a copy of the GNU Lesser General Public
      15             : // License along with this library; if not, write to the Free Software
      16             : // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
      17             : 
      18             : 
      19             : 
      20             : #ifndef LIBMESH_PARALLEL_OBJECT_H
      21             : #define LIBMESH_PARALLEL_OBJECT_H
      22             : 
      23             : 
      24             : // libMesh includes
      25             : #include "libmesh/libmesh_common.h" // libmesh_dbg_var
      26             : #include "libmesh/parallel_only.h"
      27             : 
      28             : // TIMPI includes
      29             : #include "timpi/communicator.h"
      30             : 
      31             : 
      32             : // Macro to identify and debug functions which should only be called in
      33             : // parallel on every processor at once
      34             : #undef parallel_object_only
      35             : #undef exceptionless_parallel_object_only
      36             : #ifndef NDEBUG
      37             : #define parallel_object_only() libmesh_parallel_only(this->comm())
      38             : #define exceptionless_parallel_object_only() libmesh_exceptionless_parallel_only(this->comm())
      39             : #else
      40             : #define parallel_object_only()  ((void) 0)
      41             : #define exceptionless_parallel_object_only()  ((void) 0)
      42             : #endif
      43             : 
      44             : 
      45             : namespace libMesh
      46             : {
      47             : /**
      48             :  * \brief An object whose state is distributed along a set of processors.
      49             :  *
      50             :  * This class forms the base class for all other classes
      51             :  * that are expected to be implemented in parallel. Each
      52             :  * \p ParallelObject *requires* a \p Parallel::Communicator object
      53             :  * for construction.
      54             :  *
      55             :  * \author Benjamin S. Kirk
      56             :  * \date 2013
      57             :  */
      58             : class ParallelObject
      59             : {
      60             : public:
      61             : 
      62             :   /**
      63             :    * Constructor. Requires a reference to the communicator
      64             :    * that defines the object's parallel decomposition.
      65             :    */
      66     6220563 :   ParallelObject (const Parallel::Communicator & comm_in) :
      67     4056887 :     _communicator(comm_in)
      68       61586 :   {}
      69             : 
      70             :   /**
      71             :    * Copy Constructor.
      72             :    */
      73      905775 :   ParallelObject (const ParallelObject & other) :
      74      868080 :     _communicator(other._communicator)
      75        8179 :   {}
      76             : 
      77             :   /**
      78             :    * "Assignment" operator.  Simply asserts our references
      79             :    * are identical because this is the only thing that makes
      80             :    * sense
      81             :    */
      82          12 :   ParallelObject & operator= (const ParallelObject & libmesh_dbg_var(other))
      83             :   {
      84          12 :     libmesh_assert_equal_to (&_communicator, &other._communicator);
      85          12 :     return *this;
      86             :   }
      87             : 
      88             :   /**
      89             :    * Destructor.  Virtual because we are a base class.
      90             :    */
      91     3386544 :   virtual ~ParallelObject () = default;
      92             : 
      93             :   /**
      94             :    * \returns A reference to the \p Parallel::Communicator object
      95             :    * used by this mesh.
      96             :    */
      97   186317833 :   const Parallel::Communicator & comm () const
      98   235843122 :   { return _communicator; }
      99             : 
     100             :   /**
     101             :    * \returns The number of processors in the group.
     102             :    */
     103      216158 :   processor_id_type n_processors () const
     104             :   {
     105             :     processor_id_type returnval =
     106    51637729 :       cast_int<processor_id_type>(_communicator.size());
     107      216158 :     libmesh_assert(returnval); // We never have an empty comm
     108      216158 :     return returnval;
     109             :   }
     110             : 
     111             :   /**
     112             :    * \returns The rank of this processor in the group.
     113             :    */
     114    15116672 :   processor_id_type processor_id () const
     115   992108030 :   { return cast_int<processor_id_type>(_communicator.rank()); }
     116             : 
     117             : 
     118             : protected:
     119             : 
     120             :   const Parallel::Communicator & _communicator;
     121             : };
     122             : } // namespace libMesh
     123             : 
     124             : #endif // LIBMESH_PARALLEL_OBJECT_H

Generated by: LCOV version 1.14