dune-common 3.0-git
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#ifndef DUNE_MPIHELPER
4#define DUNE_MPIHELPER
5
6#include <cassert>
8#if HAVE_MPI
9#include "mpi.h"
11#endif
12
15
16namespace Dune
17{
68 {
69 public:
70 enum {
75 isFake = true
76 };
77
82
90 {
91 static MPICommunicator comm;
92 return comm;
93 }
94
102 {
103 return getCommunicator();
104 }
105
106
107
113
129 DUNE_EXPORT static FakeMPIHelper& instance(int argc, char** argv)
130 {
131 (void)argc; (void)argv;
132 // create singleton instance
133 static FakeMPIHelper singleton;
134 return singleton;
135 }
136
140 int rank () const { return 0; }
144 int size () const { return 1; }
145
146 private:
147 FakeMPIHelper() {}
148 FakeMPIHelper(const FakeMPIHelper&);
149 FakeMPIHelper& operator=(const FakeMPIHelper);
150 };
151
152#if HAVE_MPI
160 {
161 public:
162 enum {
167 isFake = false
168 };
169
173 typedef MPI_Comm MPICommunicator;
174
182 {
183 return MPI_COMM_WORLD;
184 }
185
193 {
194 return MPI_COMM_SELF;
195 }
196
217 DUNE_EXPORT static MPIHelper& instance(int& argc, char**& argv)
218 {
219 // create singleton instance
220 static MPIHelper singleton (argc, argv);
221 return singleton;
222 }
223
227 int rank () const { return rank_; }
231 int size () const { return size_; }
232
233 private:
234 int rank_;
235 int size_;
236 void prevent_warning(int){}
237
239 MPIHelper(int& argc, char**& argv)
240 {
241 int wasInitialized = -1;
242 MPI_Initialized( &wasInitialized );
243 if(!wasInitialized)
244 {
245 rank_ = -1;
246 size_ = -1;
247 static int is_initialized = MPI_Init(&argc, &argv);
248 prevent_warning(is_initialized);
249 }
250
251 MPI_Comm_rank(MPI_COMM_WORLD,&rank_);
252 MPI_Comm_size(MPI_COMM_WORLD,&size_);
253
254 assert( rank_ >= 0 );
255 assert( size_ >= 1 );
256
257 dverb << "Called MPI_Init on p=" << rank_ << "!" << std::endl;
258 }
260 ~MPIHelper()
261 {
262 int wasFinalized = -1;
263 MPI_Finalized( &wasFinalized );
264 if(!wasFinalized) {
265 MPI_Finalize();
266 dverb << "Called MPI_Finalize on p=" << rank_ << "!" <<std::endl;
267 }
268
269 }
270 MPIHelper(const MPIHelper&);
271 MPIHelper& operator=(const MPIHelper);
272 };
273#else
274 // We do not have MPI therefore FakeMPIHelper
275 // is the MPIHelper
280 typedef FakeMPIHelper MPIHelper;
281
282#endif
283
284} // end namespace Dune
285#endif
Implements an utility class that provides MPI's collective communication methods.
Implements an utility class that provides collective communication methods for sequential programs.
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:18
Standard Dune debug streams.
DVerbType dverb(std::cout)
Singleton of verbose debug stream.
Definition stdstreams.hh:114
Dune namespace.
Definition alignment.hh:11
Definition collectivecommunication.hh:42
Collective communication interface and sequential default implementation.
Definition collectivecommunication.hh:79
A fake mpi helper.
Definition mpihelper.hh:68
static DUNE_EXPORT MPICommunicator getCommunicator()
get the default communicator
Definition mpihelper.hh:89
int size() const
return rank of process, i.e. one
Definition mpihelper.hh:144
@ isFake
Are we fake (i.e. pretend to have MPI support but are compiled without.)
Definition mpihelper.hh:75
static MPICommunicator getLocalCommunicator()
get a local communicator
Definition mpihelper.hh:101
No_Comm MPICommunicator
The type of the mpi communicator.
Definition mpihelper.hh:81
static DUNE_EXPORT FakeMPIHelper & instance(int argc, char **argv)
Get the singleton instance of the helper.
Definition mpihelper.hh:129
static CollectiveCommunication< MPICommunicator > getCollectiveCommunication()
Definition mpihelper.hh:109
int rank() const
return rank of process, i.e. zero
Definition mpihelper.hh:140
A real mpi helper.
Definition mpihelper.hh:160
int size() const
return number of processes
Definition mpihelper.hh:231
@ isFake
Are we fake (i. e. pretend to have MPI support but are compiled without.
Definition mpihelper.hh:167
static DUNE_EXPORT MPIHelper & instance(int &argc, char **&argv)
Get the singleton instance of the helper.
Definition mpihelper.hh:217
static CollectiveCommunication< MPICommunicator > getCollectiveCommunication()
Definition mpihelper.hh:198
int rank() const
return rank of process
Definition mpihelper.hh:227
MPI_Comm MPICommunicator
The type of the mpi communicator.
Definition mpihelper.hh:173
static MPICommunicator getCommunicator()
get the default communicator
Definition mpihelper.hh:181
static MPICommunicator getLocalCommunicator()
get a local communicator
Definition mpihelper.hh:192