3#ifndef DUNE_MPITRAITS_HH 
    4#define DUNE_MPITRAITS_HH 
   41    static MPI_Datatype datatype;
 
   42    static MPI_Datatype vectortype;
 
   44    static inline MPI_Datatype getType()
 
   46      if(datatype==MPI_DATATYPE_NULL) {
 
   47        MPI_Type_contiguous(
sizeof(T),MPI_BYTE,&datatype);
 
   48        MPI_Type_commit(&datatype);
 
   61#define ComposeMPITraits(p,m) \ 
   63  struct MPITraits<p>{ \ 
   64    static inline MPI_Datatype getType(){ \ 
   69  ComposeMPITraits(
char, MPI_CHAR);
 
   70  ComposeMPITraits(
unsigned char,MPI_UNSIGNED_CHAR);
 
   71  ComposeMPITraits(
short,MPI_SHORT);
 
   72  ComposeMPITraits(
unsigned short,MPI_UNSIGNED_SHORT);
 
   73  ComposeMPITraits(
int,MPI_INT);
 
   74  ComposeMPITraits(
unsigned int,MPI_UNSIGNED);
 
   75  ComposeMPITraits(
long,MPI_LONG);
 
   76  ComposeMPITraits(
unsigned long,MPI_UNSIGNED_LONG);
 
   77  ComposeMPITraits(
float,MPI_FLOAT);
 
   78  ComposeMPITraits(
double,MPI_DOUBLE);
 
   79  ComposeMPITraits(
long double,MPI_LONG_DOUBLE);
 
   82#undef ComposeMPITraits 
   86  template<
class K, 
int n>
 
   89    static MPI_Datatype datatype;
 
   90    static MPI_Datatype vectortype;
 
   92    static inline MPI_Datatype getType()
 
   94      if(datatype==MPI_DATATYPE_NULL) {
 
   96        MPI_Type_commit(&vectortype);
 
  100        MPI_Get_address(&fvector, &base);
 
  101        MPI_Get_address(&(fvector[0]), &displ);
 
  105        MPI_Type_create_struct(1, length, &displ, &vectortype, &datatype);
 
  106        MPI_Type_commit(&datatype);
 
  113  template<
class K, 
int n>
 
  114  MPI_Datatype MPITraits<FieldVector<K,n> >::datatype = MPI_DATATYPE_NULL;
 
  115  template<
class K, 
int n>
 
  116  MPI_Datatype MPITraits<FieldVector<K,n> >::vectortype = {MPI_DATATYPE_NULL};
 
  120  class bigunsignedint;
 
  123  struct MPITraits<bigunsignedint<k> >
 
  125    static MPI_Datatype datatype;
 
  126    static MPI_Datatype vectortype;
 
  128    static inline MPI_Datatype getType()
 
  130      if(datatype==MPI_DATATYPE_NULL) {
 
  131        MPI_Type_contiguous(bigunsignedint<k>::n, MPITraits<std::uint16_t>::getType(),
 
  134        bigunsignedint<k> data;
 
  137        MPI_Get_address(&data, &base);
 
  138        MPI_Get_address(&(data.digit), &displ);
 
  141        MPI_Type_create_struct(1, length, &displ, &vectortype, &datatype);
 
  142        MPI_Type_commit(&datatype);
 
  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) {
 
  170      MPI_Datatype types[4] = {MPI_LB, MPITraits<T1>::getType(),
 
  171                               MPITraits<T2>::getType(), MPI_UB};
 
  172      std::pair<T1,T2> rep[2];
 
  173      length[0]=length[1]=length[2]=length[3]=1;
 
  174      MPI_Get_address(rep, disp); 
 
  175      MPI_Get_address(&(rep[0].first), disp+1);
 
  176      MPI_Get_address(&(rep[0].second), disp+2);
 
  177      MPI_Get_address(rep+1, disp+3); 
 
  178      for(
int i=3; i >= 0; --i)
 
  180      MPI_Type_create_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;
 
vector space out of a tensor product of fields.
Definition: fvector.hh:94
 
Dune namespace.
Definition: alignment.hh:10
 
A traits class describing the mapping of types onto MPI_Datatypes.
Definition: mpitraits.hh:37