2 #ifndef DUNE_MPITRAITS_HH
3 #define DUNE_MPITRAITS_HH
37 static MPI_Datatype datatype;
38 static MPI_Datatype vectortype;
42 if(datatype==MPI_DATATYPE_NULL){
43 MPI_Type_contiguous(
sizeof(T),MPI_BYTE,&datatype);
44 MPI_Type_commit(&datatype);
51 MPI_Datatype MPITraits<T>::datatype = MPI_DATATYPE_NULL;
57 #define ComposeMPITraits(p,m) \
59 struct MPITraits<p>{ \
60 static inline MPI_Datatype getType(){ \
65 ComposeMPITraits(
char, MPI_CHAR);
66 ComposeMPITraits(
unsigned char,MPI_UNSIGNED_CHAR);
67 ComposeMPITraits(
short,MPI_SHORT);
68 ComposeMPITraits(
unsigned short,MPI_UNSIGNED_SHORT);
69 ComposeMPITraits(
int,MPI_INT);
70 ComposeMPITraits(
unsigned int,MPI_UNSIGNED);
71 ComposeMPITraits(
long,MPI_LONG);
72 ComposeMPITraits(
unsigned long,MPI_UNSIGNED_LONG);
73 ComposeMPITraits(
float,MPI_FLOAT);
74 ComposeMPITraits(
double,MPI_DOUBLE);
75 ComposeMPITraits(
long double,MPI_LONG_DOUBLE);
78 #undef ComposeMPITraits
80 template<
class K,
int n>
class FieldVector;
82 template<
class K,
int n>
83 struct MPITraits<FieldVector<K,n> >
85 static MPI_Datatype datatype;
86 static MPI_Datatype vectortype;
88 static inline MPI_Datatype
getType()
90 if(datatype==MPI_DATATYPE_NULL){
91 MPI_Type_contiguous(n, MPITraits<K>::getType(), &vectortype);
92 MPI_Type_commit(&vectortype);
93 FieldVector<K,n> fvector;
96 MPI_Address(&fvector, &base);
97 MPI_Address(&(fvector[0]), &displ);
101 MPI_Type_struct(1, length, &displ, &vectortype, &datatype);
102 MPI_Type_commit(&datatype);
109 template<
class K,
int n>
110 MPI_Datatype MPITraits<FieldVector<K,n> >::datatype = MPI_DATATYPE_NULL;
111 template<
class K,
int n>
112 MPI_Datatype MPITraits<FieldVector<K,n> >::vectortype = {MPI_DATATYPE_NULL};
116 class bigunsignedint;
119 struct MPITraits<bigunsignedint<k> >
121 static MPI_Datatype datatype;
122 static MPI_Datatype vectortype;
124 static inline MPI_Datatype
getType()
126 if(datatype==MPI_DATATYPE_NULL){
127 MPI_Type_contiguous(bigunsignedint<k>::n, MPITraits<unsigned short>::getType(),
130 bigunsignedint<k> data;
133 MPI_Address(&data, &base);
134 MPI_Address(&(data.digit), &displ);
137 MPI_Type_struct(1, length, &displ, &vectortype, &datatype);
138 MPI_Type_commit(&datatype);
146 template<
typename T1,
typename T2>
struct pair;
152 MPI_Datatype MPITraits<bigunsignedint<k> >::datatype = MPI_DATATYPE_NULL;
154 MPI_Datatype MPITraits<bigunsignedint<k> >::vectortype = MPI_DATATYPE_NULL;
156 template<
typename T1,
typename T2>
157 struct MPITraits<std::pair<T1,T2 > >
160 inline static MPI_Datatype
getType();
162 static MPI_Datatype type;
164 template<
typename T1,
typename T2>
165 MPI_Datatype MPITraits<std::pair<T1,T2> >::getType()
167 if(type==MPI_DATATYPE_NULL){
172 std::pair<T1,T2> rep[2];
173 length[0]=length[1]=length[2]=length[3]=1;
174 MPI_Address(rep, disp);
175 MPI_Address(&(rep[0].first), disp+1);
176 MPI_Address(&(rep[0].second), disp+2);
177 MPI_Address(rep+1, disp+3);
178 for(
int i=3; i >= 0; --i)
180 MPI_Type_struct(4, length, disp, types, &type);
181 MPI_Type_commit(&type);
186 template<
typename T1,
typename T2>
187 MPI_Datatype MPITraits<std::pair<T1,T2> >::type=MPI_DATATYPE_NULL;