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