Dune Core Modules (unstable)

mpihelper.hh
Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2// vi: set et ts=4 sw=2 sts=2:
3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
5#ifndef DUNE_COMMON_PARALLEL_MPIHELPER_HH
6#define DUNE_COMMON_PARALLEL_MPIHELPER_HH
7
8#include <cassert>
9#include <mutex>
10
11#if HAVE_MPI
12#include <mpi.h>
13#endif
14
19
20#if HAVE_MPI
22#endif
23
24namespace Dune
25{
76 {
77 public:
82 constexpr static bool isFake = true;
83
87 typedef No_Comm MPICommunicator;
88
96 {
97 static MPICommunicator comm;
98 return comm;
99 }
100
108 {
109 return getCommunicator();
110 }
111
112
114 getCommunication()
115 {
117 }
118
134 DUNE_EXPORT static FakeMPIHelper& instance([[maybe_unused]] int argc,
135 [[maybe_unused]] char** argv)
136 {
137 return instance();
138 }
139
140 DUNE_EXPORT static FakeMPIHelper& instance()
141 {
142 static FakeMPIHelper singleton;
143 return singleton;
144 }
145
149 int rank () const { return 0; }
153 int size () const { return 1; }
154
155 private:
156 FakeMPIHelper() {}
157 FakeMPIHelper(const FakeMPIHelper&);
158 FakeMPIHelper& operator=(const FakeMPIHelper);
159 };
160
161#if HAVE_MPI
169 {
170 public:
175 constexpr static bool isFake = false;
176
180 typedef MPI_Comm MPICommunicator;
181
189 {
190 return MPI_COMM_WORLD;
191 }
192
200 {
201 return MPI_COMM_SELF;
202 }
203
205 getCommunication()
206 {
208 }
228 DUNE_EXPORT static MPIHelper& instance(int& argc, char**& argv)
229 {
230 return instance(&argc, &argv);
231 }
232
260 DUNE_EXPORT static MPIHelper& instance(int* argc = nullptr, char*** argv = nullptr)
261 {
262 assert((argc == nullptr) == (argv == nullptr));
263 static MPIHelper instance{argc, argv};
264 return instance;
265 }
266
270 int rank () const { return rank_; }
274 int size () const { return size_; }
275
278 {
279 int wasFinalized = -1;
280 MPI_Finalized( &wasFinalized );
281 if(!wasFinalized && initializedHere_)
282 {
283 MPI_Finalize();
284 dverb << "Called MPI_Finalize on p=" << rank_ << "!" <<std::endl;
285 }
286
287 }
288
289 private:
290 int rank_;
291 int size_;
292 bool initializedHere_;
293 void prevent_warning(int){}
294
296 MPIHelper(int* argc, char*** argv)
297 : initializedHere_(false)
298 {
299 int wasInitialized = -1;
300 MPI_Initialized( &wasInitialized );
301 if(!wasInitialized)
302 {
303 rank_ = -1;
304 size_ = -1;
305 static int is_initialized = MPI_Init(argc, argv);
306 prevent_warning(is_initialized);
307 initializedHere_ = true;
308 }
309
310 MPI_Comm_rank(MPI_COMM_WORLD,&rank_);
311 MPI_Comm_size(MPI_COMM_WORLD,&size_);
312
313 assert( rank_ >= 0 );
314 assert( size_ >= 1 );
315
316 dverb << "Called MPI_Init on p=" << rank_ << "!" << std::endl;
317 }
318
319 MPIHelper(const MPIHelper&);
320 MPIHelper& operator=(const MPIHelper);
321 };
322#else // !HAVE_MPI
323 // We do not have MPI therefore FakeMPIHelper
324 // is the MPIHelper
329 typedef FakeMPIHelper MPIHelper;
330
331#endif // !HAVE_MPI
332
333} // end namespace Dune
334
335#endif // DUNE_COMMON_PARALLEL_MPIHELPER_HH
Collective communication interface and sequential default implementation.
Definition: communication.hh:100
A fake mpi helper.
Definition: mpihelper.hh:76
static DUNE_EXPORT MPICommunicator getCommunicator()
get the default communicator
Definition: mpihelper.hh:95
int size() const
return rank of process, i.e. one
Definition: mpihelper.hh:153
static MPICommunicator getLocalCommunicator()
get a local communicator
Definition: mpihelper.hh:107
No_Comm MPICommunicator
The type of the mpi communicator.
Definition: mpihelper.hh:87
static DUNE_EXPORT FakeMPIHelper & instance(int argc, char **argv)
Get the singleton instance of the helper.
Definition: mpihelper.hh:134
static constexpr bool isFake
Are we fake (i.e. pretend to have MPI support but are compiled without.)
Definition: mpihelper.hh:82
int rank() const
return rank of process, i.e. zero
Definition: mpihelper.hh:149
A real mpi helper.
Definition: mpihelper.hh:169
int size() const
return number of processes
Definition: mpihelper.hh:274
static constexpr bool isFake
Are we fake (i. e. pretend to have MPI support but are compiled without.
Definition: mpihelper.hh:175
static DUNE_EXPORT MPIHelper & instance(int *argc=nullptr, char ***argv=nullptr)
Get the singleton instance of the helper.
Definition: mpihelper.hh:260
static DUNE_EXPORT MPIHelper & instance(int &argc, char **&argv)
Get the singleton instance of the helper.
Definition: mpihelper.hh:228
~MPIHelper()
calls MPI_Finalize
Definition: mpihelper.hh:277
int rank() const
return rank of process
Definition: mpihelper.hh:270
MPI_Comm MPICommunicator
The type of the mpi communicator.
Definition: mpihelper.hh:180
static MPICommunicator getCommunicator()
get the default communicator
Definition: mpihelper.hh:188
static MPICommunicator getLocalCommunicator()
get a local communicator
Definition: mpihelper.hh:199
Implements an utility class that provides collective communication methods for sequential programs.
A few common exception classes.
DVerbType dverb(std::cout)
Singleton of verbose debug stream.
Definition: stdstreams.hh:117
Implements an utility class that provides MPI's collective communication methods.
Dune namespace.
Definition: alignedallocator.hh:13
Standard Dune debug streams.
Definition of macros controlling symbol visibility at the ABI level.
#define DUNE_EXPORT
Export a symbol as part of the public ABI.
Definition: visibility.hh:20
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden & Uni Heidelberg  |  generated with Hugo v0.111.3 (Nov 2, 23:43, 2025)