00001
00008 template<class _InIt> inline
00009 void binary_read(_InIt _First, _InIt _Last, const string _Filename, const int _Seek)
00010 {
00011 ifstream is(_Filename.c_str(), ios::binary);
00012 is.seekg(_Seek * sizeof(*_First));
00013 is.read((char*)&*_First, streamsize(_Last - _First) * sizeof(*_First));
00014 is.close();
00015 }
00016
00023 template<class _InIt> inline
00024 void binary_write(_InIt _First, _InIt _Last, const string _Filename)
00025 {
00026 ofstream os(_Filename.c_str(), ios::binary);
00027 os.write((char*)&*_First, streamsize(_Last - _First) * sizeof(*_First));
00028 os.close();
00029 }
00030
00036 template<class T>
00037 void read_header(const string &_root, vector<T> &_hdr)
00038 {
00039 _hdr.assign(8, 0);
00040 binary_read(_hdr.begin(), _hdr.end(), _root + "Header.bin", 0);
00041
00042 T magic = _hdr[0];
00043 T version = _hdr[1];
00044 T gnumelem = _hdr[2];
00045 T elemsize = _hdr[3];
00046 T gnumnode = _hdr[4];
00047 T nodesize = _hdr[5];
00048 T gnumdir = _hdr[6];
00049 T dirsize = _hdr[7];
00050
00051 int rank;
00052 network::rank(rank);
00053 if(rank == 0)
00054 {
00055 cout << "Magic: " << magic << " Version: " << version << endl;
00056 cout << "Elements: " << gnumelem << " Size: " << elemsize << endl;
00057 cout << "Nodes: " << gnumnode << " Size: " << nodesize << endl;
00058 cout << "Dirichlet: " << gnumdir << " Size: " << dirsize << endl;
00059 }
00060 }
00061
00068 template<class T>
00069 void read_partition(const string &_root, const vector<T> &_hdr, vector<T> &_par)
00070 {
00071 T gnumelem = _hdr[2];
00072
00073 int size, rank;
00074 network::size(size);
00075 network::rank(rank);
00076 int poselem = (rank * gnumelem)/size;
00077 int numelem = (rank * gnumelem + gnumelem)/size - poselem;
00078
00079 _par.assign(numelem, 0);
00080 stringstream s;
00081 s << _root << "Partition" << size << ".bin";
00082 binary_read(_par.begin(), _par.end(), s.str(), poselem);
00083 }
00084
00092 template<class T>
00093 void read_connection(const string &_root, const vector<T> &_hdr, const vector<T> &_par, vector<T> &_con)
00094 {
00095 T gnumelem = _hdr[2];
00096 T elemsize = _hdr[3];
00097
00098 int size, rank;
00099 network::size(size);
00100 network::rank(rank);
00101 int poselem = (rank * gnumelem)/size;
00102 int numelem = (rank * gnumelem + gnumelem)/size - poselem;
00103 vector<T> con(numelem * elemsize);
00104 binary_read(con.begin(), con.end(), _root + "Connection.bin", poselem * elemsize);
00105
00106 vector<int> slen(size);
00107 vector<int> soff(size);
00108 vector<T> scon(numelem * elemsize);
00109 bucket_sort_count(_par, slen);
00110 bucket_sort_offset(slen, soff);
00111 bucket_sort_copy(_par, con, scon, soff, elemsize);
00112
00113 vector<int> rlen(size);
00114 vector<int> roff(size);
00115 network::alltoall(&slen[0], sizeof(int), &rlen[0], sizeof(int));
00116 bucket_sort_offset(rlen, roff);
00117 int rnumelem = bucket_sort_size(rlen);
00118 _con.assign(rnumelem * elemsize, 0);
00119
00120 for(int i = 0; i < (int)slen.size(); i++) slen[i] *= elemsize * sizeof(T), soff[i] *= elemsize * sizeof(T);
00121 for(int i = 0; i < (int)slen.size(); i++) rlen[i] *= elemsize * sizeof(T), roff[i] *= elemsize * sizeof(T);
00122 network::alltoallv(&scon[0], &slen[0], &soff[0], &_con[0], &rlen[0], &roff[0]);
00123 }
00124
00132 template<class T, class S>
00133 void read_element(const string &_root, const vector<T> &_hdr, const vector<T> &_par, vector<S> &_ele)
00134 {
00135 T gnumelem = _hdr[2];
00136 T elemsize = _hdr[3];
00137
00138 int size, rank;
00139 network::size(size);
00140 network::rank(rank);
00141 int poselem = (rank * gnumelem)/size;
00142 int numelem = (rank * gnumelem + gnumelem)/size - poselem;
00143 vector<S> ele(numelem * elemsize * elemsize);
00144 binary_read(ele.begin(), ele.end(), _root + "Element.bin", poselem * elemsize * elemsize);
00145
00146 vector<int> slen(size);
00147 vector<int> soff(size);
00148 vector<S> sele(numelem * elemsize * elemsize);
00149 bucket_sort_count(_par, slen);
00150 bucket_sort_offset(slen, soff);
00151 bucket_sort_copy(_par, ele, sele, soff, elemsize * elemsize);
00152
00153 vector<int> rlen(size);
00154 vector<int> roff(size);
00155 network::alltoall(&slen[0], sizeof(int), &rlen[0], sizeof(int));
00156 bucket_sort_offset(rlen, roff);
00157 int rnumelem = bucket_sort_size(rlen);
00158 _ele.assign(rnumelem * elemsize * elemsize, 0.0);
00159
00160 for(int i = 0; i < (int)slen.size(); i++) slen[i] *= elemsize * elemsize * sizeof(S), soff[i] *= elemsize * elemsize * sizeof(S);
00161 for(int i = 0; i < (int)slen.size(); i++) rlen[i] *= elemsize * elemsize * sizeof(S), roff[i] *= elemsize * elemsize * sizeof(S);
00162 network::alltoallv(&sele[0], &slen[0], &soff[0], &_ele[0], &rlen[0], &roff[0]);
00163 }