2 #ifndef DUNE_MPITRAITS_HH
3 #define DUNE_MPITRAITS_HH
39 static MPI_Datatype datatype;
40 static MPI_Datatype vectortype;
44 if(datatype==MPI_DATATYPE_NULL){
45 MPI_Type_contiguous(
sizeof(T),MPI_BYTE,&datatype);
46 MPI_Type_commit(&datatype);
53 MPI_Datatype MPITraits<T>::datatype = MPI_DATATYPE_NULL;
59 #define ComposeMPITraits(p,m) \
61 struct MPITraits<p>{ \
62 static inline MPI_Datatype getType(){ \
67 ComposeMPITraits(
char, MPI_CHAR);
68 ComposeMPITraits(
unsigned char,MPI_UNSIGNED_CHAR);
69 ComposeMPITraits(
short,MPI_SHORT);
70 ComposeMPITraits(
unsigned short,MPI_UNSIGNED_SHORT);
71 ComposeMPITraits(
int,MPI_INT);
72 ComposeMPITraits(
unsigned int,MPI_UNSIGNED);
73 ComposeMPITraits(
long,MPI_LONG);
74 ComposeMPITraits(
unsigned long,MPI_UNSIGNED_LONG);
75 ComposeMPITraits(
float,MPI_FLOAT);
76 ComposeMPITraits(
double,MPI_DOUBLE);
77 ComposeMPITraits(
long double,MPI_LONG_DOUBLE);
80 #undef ComposeMPITraits
82 template<
class K,
int n>
class FieldVector;
84 template<
class K,
int n>
85 struct MPITraits<FieldVector<K,n> >
87 static MPI_Datatype datatype;
88 static MPI_Datatype vectortype;
90 static inline MPI_Datatype
getType()
92 if(datatype==MPI_DATATYPE_NULL){
93 MPI_Type_contiguous(n, MPITraits<K>::getType(), &vectortype);
94 MPI_Type_commit(&vectortype);
95 FieldVector<K,n> fvector;
98 MPI_Address(&fvector, &base);
99 MPI_Address(&(fvector[0]), &displ);
103 MPI_Type_struct(1, length, &displ, &vectortype, &datatype);
104 MPI_Type_commit(&datatype);
111 template<
class K,
int n>
112 MPI_Datatype MPITraits<FieldVector<K,n> >::datatype = MPI_DATATYPE_NULL;
113 template<
class K,
int n>
114 MPI_Datatype MPITraits<FieldVector<K,n> >::vectortype = {MPI_DATATYPE_NULL};
118 class bigunsignedint;
121 struct MPITraits<bigunsignedint<k> >
123 static MPI_Datatype datatype;
124 static MPI_Datatype vectortype;
126 static inline MPI_Datatype
getType()
128 if(datatype==MPI_DATATYPE_NULL){
129 MPI_Type_contiguous(bigunsignedint<k>::n, MPITraits<unsigned short>::getType(),
132 bigunsignedint<k> data;
135 MPI_Address(&data, &base);
136 MPI_Address(&(data.digit), &displ);
139 MPI_Type_struct(1, length, &displ, &vectortype, &datatype);
140 MPI_Type_commit(&datatype);
150 MPI_Datatype MPITraits<bigunsignedint<k> >::datatype = MPI_DATATYPE_NULL;
152 MPI_Datatype MPITraits<bigunsignedint<k> >::vectortype = MPI_DATATYPE_NULL;
154 template<
typename T1,
typename T2>
155 struct MPITraits<std::pair<T1,T2 > >
158 inline static MPI_Datatype
getType();
160 static MPI_Datatype type;
162 template<
typename T1,
typename T2>
163 MPI_Datatype MPITraits<std::pair<T1,T2> >::getType()
165 if(type==MPI_DATATYPE_NULL){
170 std::pair<T1,T2> rep[2];
171 length[0]=length[1]=length[2]=length[3]=1;
172 MPI_Address(rep, disp);
173 MPI_Address(&(rep[0].first), disp+1);
174 MPI_Address(&(rep[0].second), disp+2);
175 MPI_Address(rep+1, disp+3);
176 for(
int i=3; i >= 0; --i)
178 MPI_Type_struct(4, length, disp, types, &type);
179 MPI_Type_commit(&type);
184 template<
typename T1,
typename T2>
185 MPI_Datatype MPITraits<std::pair<T1,T2> >::type=MPI_DATATYPE_NULL;