ESyS-Particle
4.0.1
|
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 }