ESyS-Particle  4.0.1
gettype.hpp
00001 
00002 //                                                         //
00003 // Copyright (c) 2003-2011 by The University of Queensland //
00004 // Earth Systems Science Computational Centre (ESSCC)      //
00005 // http://www.uq.edu.au/esscc                              //
00006 //                                                         //
00007 // Primary Business: Brisbane, Queensland, Australia       //
00008 // Licensed under the Open Software License version 3.0    //
00009 // http://www.opensource.org/licenses/osl-3.0.php          //
00010 //                                                         //
00012 
00013 //=== PAIR ==== 
00014 template<typename T1,typename T2>
00015 MPI_Datatype SGetType::operator()(const pair<T1,T2>& P)
00016 {
00017   if(!tml_pair<T1,T2>::initialized){
00018     MPI_Aint addr_first,addr_second;
00019     MPI_Aint disp[2];
00020     MPI_Datatype type[2];
00021     int blocklen[2]={1,1};
00022 
00023     MPI_Address((void*)&P.first,&addr_first);
00024     MPI_Address((void*)&P.second,&addr_second);
00025     disp[0]=MPI_Aint(0);
00026     disp[1]=addr_second-addr_first;
00027     type[0]=GetType(P.first);
00028     type[1]=GetType(P.second);
00029     MPI_Type_struct(2,blocklen,disp,type,&tml_pair<T1,T2>::type);
00030     MPI_Type_commit(&tml_pair<T1,T2>::type);
00031     tml_pair<T1,T2>::initialized=true;
00032   }
00033   return tml_pair<T1,T2>::type;
00034 }
00035 
00036 // === TRIPLET===
00037 template<typename T1, typename T2, typename T3>
00038 MPI_Datatype SGetType::operator()(const esys::lsm::triplet<T1,T2,T3> &PP)
00039 {
00040   if(!tml_trip<T1,T2,T3>::initialized){
00041     esys::lsm::triplet<T1,T2,T3> P(PP);
00042     MPI_Aint addr[3];
00043     MPI_Aint disp[3];
00044     MPI_Datatype type[3];
00045     int blocklen[3]={1,1,1};
00046 
00047     MPI_Address(static_cast<void *>(&(P.template get<0>())), &(addr[0]));
00048     MPI_Address(static_cast<void *>(&(P.template get<1>())), &(addr[1]));
00049     MPI_Address(static_cast<void *>(&(P.template get<2>())), &(addr[2]));
00050     disp[0]=MPI_Aint(0);
00051     disp[1]=addr[1]-addr[0];
00052     disp[2]=addr[2]-addr[0];
00053     type[0]=GetType(P.template get<0>());
00054     type[1]=GetType(P.template get<1>());
00055     type[2]=GetType(P.template get<2>());
00056     MPI_Type_struct(3,blocklen,disp,type,&tml_trip<T1,T2,T3>::type);
00057     MPI_Type_commit(&tml_trip<T1,T2,T3>::type);
00058     tml_trip<T1,T2,T3>::initialized = true;
00059   }
00060   return tml_trip<T1,T2,T3>::type;
00061 }
00062 
00063 //=== QUAD ===
00064 template<typename T1, typename T2, typename T3, typename T4>
00065 MPI_Datatype SGetType::operator()(const esys::lsm::quadtuple<T1,T2,T3,T4> &PP)
00066 {
00067   if(!tml_quad<T1,T2,T3,T4>::initialized){
00068     esys::lsm::quadtuple<T1,T2,T3,T4> P(PP);
00069     MPI_Aint addr[4];
00070     MPI_Aint disp[4];
00071     MPI_Datatype type[4];
00072     int blocklen[4]={1,1,1,1};
00073 
00074     MPI_Address(static_cast<void *>(&(P.template get<0>())), &(addr[0]));
00075     MPI_Address(static_cast<void *>(&(P.template get<1>())), &(addr[1]));
00076     MPI_Address(static_cast<void *>(&(P.template get<2>())), &(addr[2]));
00077     MPI_Address(static_cast<void *>(&(P.template get<3>())), &(addr[3]));
00078     disp[0]=MPI_Aint(0);
00079     disp[1]=addr[1]-addr[0];
00080     disp[2]=addr[2]-addr[0];
00081     disp[3]=addr[3]-addr[0];
00082     type[0]=GetType(P.template get<0>());
00083     type[1]=GetType(P.template get<1>());
00084     type[2]=GetType(P.template get<2>());
00085     type[3]=GetType(P.template get<3>());
00086     MPI_Type_struct(4,blocklen,disp,type,&tml_quad<T1,T2,T3,T4>::type);
00087     MPI_Type_commit(&tml_quad<T1,T2,T3,T4>::type);
00088     tml_quad<T1,T2,T3,T4>::initialized = true;
00089   }
00090   return tml_quad<T1,T2,T3,T4>::type;
00091 }
00092 
00093 //=== QUINT ===
00094 template<typename T1, typename T2, typename T3, typename T4, typename T5>
00095 MPI_Datatype SGetType::operator()(const esys::lsm::quintuple<T1,T2,T3,T4,T5> &PP)
00096 {
00097   if(!tml_quin<T1,T2,T3,T4,T5>::initialized){
00098     esys::lsm::quintuple<T1,T2,T3,T4,T5> P(PP);
00099     MPI_Aint addr[5];
00100     MPI_Aint disp[5];
00101     MPI_Datatype type[5];
00102     int blocklen[5]={1,1,1,1,1};
00103 
00104     MPI_Address(static_cast<void *>(&(P.template get<0>())), &(addr[0]));
00105     MPI_Address(static_cast<void *>(&(P.template get<1>())), &(addr[1]));
00106     MPI_Address(static_cast<void *>(&(P.template get<2>())), &(addr[2]));
00107     MPI_Address(static_cast<void *>(&(P.template get<3>())), &(addr[3]));
00108     MPI_Address(static_cast<void *>(&(P.template get<4>())), &(addr[4]));
00109     disp[0]=MPI_Aint(0);
00110     disp[1]=addr[1]-addr[0];
00111     disp[2]=addr[2]-addr[0];
00112     disp[3]=addr[3]-addr[0];
00113     disp[4]=addr[4]-addr[0];
00114     type[0]=GetType(P.template get<0>());
00115     type[1]=GetType(P.template get<1>());
00116     type[2]=GetType(P.template get<2>());
00117     type[3]=GetType(P.template get<3>());
00118     type[4]=GetType(P.template get<4>());
00119     MPI_Type_struct(5,blocklen,disp,type,&tml_quin<T1,T2,T3,T4,T5>::type);
00120     MPI_Type_commit(&tml_quin<T1,T2,T3,T4,T5>::type);
00121     tml_quin<T1,T2,T3,T4,T5>::initialized = true;
00122   }
00123   return tml_quin<T1,T2,T3,T4,T5>::type;
00124 }