dune-common  2.4
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 
16 namespace Dune
17 {
68  {
69  public:
70  enum {
75  isFake = true
76  };
77 
82 
89  DUNE_EXPORT static MPICommunicator getCommunicator ()
90  {
91  static MPICommunicator comm;
92  return comm;
93  }
94 
101  static MPICommunicator getLocalCommunicator ()
102  {
103  return getCommunicator();
104  }
105 
106 
107 
110  {
112  }
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
153 
159  class MPIHelper
160  {
161  public:
162  enum {
167  isFake = false
168  };
169 
173  typedef MPI_Comm MPICommunicator;
174 
181  static MPICommunicator getCommunicator ()
182  {
183  return MPI_COMM_WORLD;
184  }
185 
192  static MPICommunicator getLocalCommunicator ()
193  {
194  return MPI_COMM_SELF;
195  }
196 
199  {
201  }
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 #if MPI_2
242  int wasInitialized = -1;
243  MPI_Initialized( &wasInitialized );
244  if(!wasInitialized)
245 #endif
246  {
247  rank_ = -1;
248  size_ = -1;
249  static int is_initialized = MPI_Init(&argc, &argv);
250  prevent_warning(is_initialized);
251  }
252 
253  MPI_Comm_rank(MPI_COMM_WORLD,&rank_);
254  MPI_Comm_size(MPI_COMM_WORLD,&size_);
255 
256  assert( rank_ >= 0 );
257  assert( size_ >= 1 );
258 
259  dverb << "Called MPI_Init on p=" << rank_ << "!" << std::endl;
260  }
262  ~MPIHelper()
263  {
264 #ifdef MPI_2
265  int wasFinalized = -1;
266  MPI_Finalized( &wasFinalized );
267  if(!wasFinalized) {
268 #endif
269  MPI_Finalize();
270  dverb << "Called MPI_Finalize on p=" << rank_ << "!" <<std::endl;
271 #ifdef MPI_2
272  }
273 
274 #endif
275  }
276  MPIHelper(const MPIHelper&);
277  MPIHelper& operator=(const MPIHelper);
278  };
279 #else
280  // We do not have MPI therefore FakeMPIHelper
281  // is the MPIHelper
286  typedef FakeMPIHelper MPIHelper;
287 
288 #endif
289 
290 } // end namespace Dune
291 #endif
static MPICommunicator getLocalCommunicator()
get a local communicator
Definition: mpihelper.hh:192
#define DUNE_EXPORT
Export a symbol as part of the public ABI.
Definition: visibility.hh:18
A fake mpi helper.
Definition: mpihelper.hh:67
Implements an utility class that provides MPI's collective communication methods. ...
static DUNE_EXPORT MPIHelper & instance(int &argc, char **&argv)
Get the singleton instance of the helper.
Definition: mpihelper.hh:217
DVerbType dverb(std::cout)
Singleton of verbose debug stream.
Definition: stdstreams.hh:114
static MPICommunicator getCommunicator()
get the default communicator
Definition: mpihelper.hh:181
int rank() const
return rank of process
Definition: mpihelper.hh:227
Implements an utility class that provides collective communication methods for sequential programs...
MPI_Comm MPICommunicator
The type of the mpi communicator.
Definition: mpihelper.hh:173
Definition of macros controlling symbol visibility at the ABI level.
Definition: collectivecommunication.hh:42
static CollectiveCommunication< MPICommunicator > getCollectiveCommunication()
Definition: mpihelper.hh:109
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
Dune namespace.
Definition: alignment.hh:9
Collective communication interface and sequential default implementation.
Definition: collectivecommunication.hh:72
int size() const
return number of processes
Definition: mpihelper.hh:231
Are we fake (i. e. pretend to have MPI support but are compiled without.
Definition: mpihelper.hh:167
int size() const
return rank of process, i.e. one
Definition: mpihelper.hh:144
static DUNE_EXPORT MPICommunicator getCommunicator()
get the default communicator
Definition: mpihelper.hh:89
static CollectiveCommunication< MPICommunicator > getCollectiveCommunication()
Definition: mpihelper.hh:198
Standard Dune debug streams.
A real mpi helper.This helper should be used for parallel programs.
Definition: mpihelper.hh:159
int rank() const
return rank of process, i.e. zero
Definition: mpihelper.hh:140
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