00001
00002
00003
00004
00005
00006
00007
00008 #include "dataloop.h"
00009
00010 #define PAIRTYPE_CONTENTS(mt1_,ut1_,mt2_,ut2_) \
00011 { \
00012 struct { ut1_ a; ut2_ b; } foo; \
00013 disps[0] = 0; \
00014 disps[1] = (MPI_Aint) ((char *) &foo.b - (char *) &foo.a); \
00015 types[0] = mt1_; \
00016 types[1] = mt2_; \
00017 }
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 int PREPEND_PREFIX(Dataloop_create_pairtype)(MPI_Datatype type,
00040 DLOOP_Dataloop **dlp_p,
00041 int *dlsz_p,
00042 int *dldepth_p,
00043 int flag)
00044 {
00045 int blocks[2] = { 1, 1 };
00046 MPI_Aint disps[2];
00047 MPI_Datatype types[2];
00048
00049 DLOOP_Assert(type == MPI_FLOAT_INT || type == MPI_DOUBLE_INT ||
00050 type == MPI_LONG_INT || type == MPI_SHORT_INT ||
00051 type == MPI_LONG_DOUBLE_INT || type == MPI_2INT);
00052
00053 switch(type) {
00054 case MPI_FLOAT_INT:
00055 PAIRTYPE_CONTENTS(MPI_FLOAT, float, MPI_INT, int);
00056 break;
00057 case MPI_DOUBLE_INT:
00058 PAIRTYPE_CONTENTS(MPI_DOUBLE, double, MPI_INT, int);
00059 break;
00060 case MPI_LONG_INT:
00061 PAIRTYPE_CONTENTS(MPI_LONG, long, MPI_INT, int);
00062 break;
00063 case MPI_SHORT_INT:
00064 PAIRTYPE_CONTENTS(MPI_SHORT, short, MPI_INT, int);
00065 break;
00066 case MPI_LONG_DOUBLE_INT:
00067 PAIRTYPE_CONTENTS(MPI_LONG_DOUBLE, long double, MPI_INT, int);
00068 break;
00069 case MPI_2INT:
00070 PAIRTYPE_CONTENTS(MPI_INT, int, MPI_INT, int);
00071 break;
00072 }
00073
00074 return PREPEND_PREFIX(Dataloop_create_struct)(2,
00075 blocks,
00076 disps,
00077 types,
00078 dlp_p,
00079 dlsz_p,
00080 dldepth_p,
00081 flag);
00082 }