escript  Revision_4925
Esys_MPI.h
Go to the documentation of this file.
1 
2 /*****************************************************************************
3 *
4 * Copyright (c) 2003-2014 by University of Queensland
5 * http://www.uq.edu.au
6 *
7 * Primary Business: Queensland, Australia
8 * Licensed under the Open Software License version 3.0
9 * http://www.opensource.org/licenses/osl-3.0.php
10 *
11 * Development until 2012 by Earth Systems Science Computational Center (ESSCC)
12 * Development 2012-2013 by School of Earth Sciences
13 * Development from 2014 by Centre for Geoscience Computing (GeoComp)
14 *
15 *****************************************************************************/
16 
17 
18 #ifndef INC_ESYS_MPI
19 #define INC_ESYS_MPI
20 
21 #include "system_dep.h"
22 #include "types.h"
23 
24 #include <sstream>
25 
26 #ifdef ESYS_MPI
27  #include "mpi_C.h"
28 #else
29  typedef int MPI_Comm;
30  typedef int MPI_Request;
31  typedef int MPI_Status;
32  #define MPI_INT 6
33  #define MPI_DOUBLE 11
34  #define MPI_COMM_WORLD 91
35 #endif
36 
37 typedef int Esys_MPI_rank;
38 
39 #define ESYS_MPI_TODO { fprintf( stdout, "\nTODO : %s:%d\n", __FILE__, __LINE__); MPI_Finalize(); exit(1); }
40 
41 // Modding by 7 digit prime to avoid overflow
42 #define ESYS_MPI_INC_COUNTER(V,I) {(V).msg_tag_counter=((V).msg_tag_counter+(I))%1010201;}
43 #define ESYS_MPI_SET_COUNTER(V,I) {(V).msg_tag_counter=(I)%1010201;}
44 
45 /* Datatypes */
46 
48 struct Esys_MPIInfo {
50  int size;
54 };
55 
56 typedef struct Esys_MPIInfo Esys_MPIInfo;
57 
58 /* Function prototypes */
59 
62 
65 
68 
70 int Esys_MPIInfo_initialized( void );
71 
74 
76 dim_t Esys_MPIInfo_setDistribution(Esys_MPIInfo* in ,index_t min_id,index_t max_id,index_t* distribution);
77 
79 void Esys_MPIInfo_Split( Esys_MPIInfo *mpi_info, dim_t n, dim_t* local_N,index_t* offset);
80 
82 bool Esys_MPIInfo_noError( Esys_MPIInfo *mpi_info);
83 
84 namespace esysUtils {
85 
88 inline std::string appendRankToFileName(const std::string &fileName,
89  int mpiSize, int mpiRank)
90 {
91  std::stringstream ss;
92  ss << fileName;
93  if (mpiSize > 1) {
94  ss << '.';
95  ss.fill('0');
96  ss.width(4);
97  ss << mpiRank;
98  }
99  std::string result(ss.str());
100  return result;
101 }
102 
103 /* has the have sub-communicators been created? */
104 bool getSplitWorld();
105 /* record that a sub-communicator has been created or used */
106 void splitWorld();
107 
108 } // namespace esysUtils
109 
110 #endif /* INC_ESYS_MPI */
111 
Esys_MPIInfo * Esys_MPIInfo_alloc(MPI_Comm comm)
Definition: Esys_MPI.cpp:30
void splitWorld()
Definition: Esys_MPI.cpp:158
Esys_MPIInfo * Esys_MPIInfo_getReference(Esys_MPIInfo *in)
Definition: Esys_MPI.cpp:67
bool getSplitWorld()
Definition: Esys_MPI.cpp:151
Struct that holds MPI communicator, rank, size and a tag counter.
Definition: Esys_MPI.h:48
int size
Definition: Esys_MPI.h:50
void Esys_MPIInfo_Split(Esys_MPIInfo *mpi_info, dim_t n, dim_t *local_N, index_t *offset)
Definition: Esys_MPI.cpp:89
int Esys_MPIInfo_initialized(void)
Definition: Esys_MPI.cpp:169
Esys_MPI_rank rank
Definition: Esys_MPI.h:51
int MPI_Comm
Definition: Esys_MPI.h:29
#define ESYSUTILS_DLL_API
Definition: esysUtils/src/system_dep.h:40
MPI_Comm comm
Definition: Esys_MPI.h:52
int MPI_Request
Definition: Esys_MPI.h:30
void Esys_MPIInfo_free(Esys_MPIInfo *)
Definition: Esys_MPI.cpp:60
int msg_tag_counter
Definition: Esys_MPI.h:53
dim_t reference_counter
Definition: Esys_MPI.h:49
int index_t
Definition: types.h:25
int Esys_MPI_rank
Definition: Esys_MPI.h:37
int MPI_Status
Definition: Esys_MPI.h:31
index_t Esys_MPIInfo_mod(index_t n, index_t k)
Definition: Esys_MPI.cpp:75
int dim_t
Definition: types.h:24
std::string appendRankToFileName(const std::string &fileName, int mpiSize, int mpiRank)
Appends MPI rank to a file name if MPI size > 1.
Definition: Esys_MPI.h:88
dim_t Esys_MPIInfo_setDistribution(Esys_MPIInfo *in, index_t min_id, index_t max_id, index_t *distribution)
Definition: Esys_MPI.cpp:105
bool Esys_MPIInfo_noError(Esys_MPIInfo *mpi_info)
Definition: Esys_MPI.cpp:133