Main Page | Class Hierarchy | Class List | File List | Class Members | File Members

mdp_deprecatedIO.h

Go to the documentation of this file.
00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 template<class T>
00014 void mdp_field<T>::load(char filename[], 
00015                         int processIO, 
00016                         long max_buffer_size, 
00017                         char *header, 
00018                         long header_size,
00019                         long (*sort_x)(mdp_lattice&,long),
00020                         int auto_switch_endianess) {
00021   long idx_gl, nvol_gl=lattice().nvol_gl, k;
00022   double mytime=mpi.time();
00023   int try_switch_endianess=FALSE;
00024   if(ME==processIO) {
00025     long *buffer_size=new long[Nproc];
00026       mdp_array<T,3> large_buffer(Nproc,max_buffer_size,field_components);
00027       T *short_buffer=new T[field_components];
00028       int process;
00029       mdp_request request;
00030 
00031       for(process=0; process<Nproc; process++) buffer_size[process]=0;
00032       printf("Loading file %s from process %i (buffer = %li sites)\n", 
00033              filename, processIO, max_buffer_size); 
00034       fflush(stdout);
00035       FILE *fp=fopen(filename, "rb");
00036       if(fp==0) error("Unable to open file");
00037 
00038       // #ifdef INSERT_HEADER
00039       int i;
00040       if(strcmp(header,"NATIVE")==0) {
00041         error("NATIVE HEADER IN DEPRECATED FUNCTION NOT SUPPORTED ANY MORE");
00042       } else if(header!=0 && strcmp(header, "NOHEADER")!=0) {
00043         if(fread(header, sizeof(char), header_size, fp)!=
00044            header_size) error("Unable to read file header");
00045       }
00046       // #endif
00047       for(idx_gl=0; idx_gl<nvol_gl; idx_gl++) {
00048         process=where_global(idx_gl);
00049         if(process!=NOWHERE) {
00050           if(sort_x!=0)
00051             if(fseek(fp, sort_x(lattice(),idx_gl)*
00052                      Tsize*field_components+header_size, SEEK_SET)<0) 
00053               error("unexpected end of file");
00054           if((fread(short_buffer, Tsize, field_components, fp)-
00055               field_components)!=0)
00056             error("unexpected end of file");
00057         }
00058         if((process!=NOWHERE) && (process!=processIO)) {
00059           for(k=0; k<field_components; k++)
00060             large_buffer(process,buffer_size[process],k)=short_buffer[k];
00061           buffer_size[process]++;
00062           if(buffer_size[process]==max_buffer_size) {
00063             mpi.put(&(large_buffer(process,0,0)), 
00064                     max_buffer_size*field_components, process, request); 
00065             mpi.wait(request);
00066             buffer_size[process]=0;
00067           }
00068           if(idx_gl==nvol_gl-1) 
00069             for(process=0; process<Nproc; process++)
00070               if((process!=ME) && 
00071                  (buffer_size[process]!=max_buffer_size) &&
00072                  (buffer_size[process]>0)) {
00073                 mpi.put(&(large_buffer(process,0,0)), 
00074                         buffer_size[process]*field_components, 
00075                         process, request); 
00076                 mpi.wait(request);
00077               }
00078         }
00079         if(process==processIO) {
00080           for(k=0; k<field_components; k++)
00081             *(m+lattice().lg[idx_gl]*field_components+k)=short_buffer[k];
00082         }
00083       }
00084       delete[] buffer_size;
00085       delete[] short_buffer;
00086       fclose(fp);
00087     } else {
00088       int  process;
00089       long buffer_size=0, idx;
00090       long *local_index=new long[max_buffer_size];
00091       mdp_array<T,2> local_buffer(max_buffer_size,field_components);
00092       for(idx_gl=0; idx_gl<nvol_gl; idx_gl++) {
00093         process=where_global(idx_gl);
00094         if(process==ME) {
00095           local_index[buffer_size]=lattice().lg[idx_gl];
00096           buffer_size++;
00097         }
00098         if((buffer_size==max_buffer_size) || 
00099            ((idx_gl==nvol_gl-1) && (buffer_size>0))) {
00100           mpi.get(&(local_buffer(0,0)), buffer_size*field_components, processIO);
00101           for(idx=0; idx<buffer_size; idx++)
00102             for(k=0; k<field_components; k++)
00103               *(m+local_index[idx]*field_components+k)=local_buffer(idx,k);
00104           buffer_size=0;
00105         }
00106       }
00107       delete[] local_index;
00108     }
00109     update();
00110     if(ME==0 && mdp_shutup==FALSE) {
00111       printf("... Loading time: %f (sec)\n", mpi.time()-mytime);
00112       fflush(stdout);
00113     }
00114     if(try_switch_endianess==TRUE && auto_switch_endianess==TRUE) {
00115       if(ME==0) printf("Trying to switch endianess.");
00116       switch_endianess_4bytes();
00117     }
00118 }
00119 
00120 template<class T>
00121 void mdp_field<T>::save(char filename[], 
00122                         int processIO,
00123                         long max_buffer_size,
00124                         char *header, 
00125                         long header_size,
00126                         long (*sort_x)(mdp_lattice&,long),
00127                         char *mode) {
00128   long idx_gl, nvol_gl=lattice().nvol_gl, k;
00129   double mytime=mpi.time();
00130     if(ME==processIO) {
00131       long *buffer_size=new long[Nproc];
00132       long *buffer_ptr =new long[Nproc];
00133       mdp_array<T,3> large_buffer(Nproc,max_buffer_size,field_components);
00134       T *short_buffer=new T[field_components];
00135       int process;
00136       for(process=0; process<Nproc; process++) buffer_ptr[process]=0;
00137       printf("Saving file %s from process %i (buffer = %li sites)\n", 
00138              filename, processIO, max_buffer_size); 
00139       fflush(stdout);
00140       FILE *fp=fopen(filename, mode);
00141       if(fp==0) error("Unable to open file");      
00142 
00143 
00144       // #ifdef INSERT_HEADER
00145       int i;
00146       if(strcmp(header,"NATIVE")==0) {
00147         error("NATIVE HEADER IN DEPRECATED FUNCTION NOT SUPPORTED ANY MORE");
00148       } else if(header!=0 && strcmp(header, "NOHEADER")!=0) {
00149         if(fwrite(header, sizeof(char), header_size, fp)!=
00150            header_size) error("Unable to write file header");
00151       }
00152       // #endif
00153       for(idx_gl=0; idx_gl<nvol_gl; idx_gl++) {
00154         process=where_global(idx_gl);
00155         if((process!=NOWHERE) && (process!=processIO)) {
00156           if(buffer_ptr[process]==0) {
00157             mpi.get(buffer_size[process], process);
00158             mpi.get(&(large_buffer(process,0,0)), 
00159                     buffer_size[process]*field_components, process);
00160           }
00161           for(k=0; k<field_components; k++)
00162             short_buffer[k]=large_buffer(process,buffer_ptr[process],k);
00163           buffer_ptr[process]++;
00164           if(buffer_ptr[process]==buffer_size[process]) buffer_ptr[process]=0; 
00165         }
00166         if(process==processIO) {
00167           for(k=0; k<field_components; k++)
00168             short_buffer[k]=*(m+lattice().lg[idx_gl]*field_components+k);
00169         }
00170         if(process!=NOWHERE) {
00171           if(sort_x!=0)
00172             if(fseek(fp, sort_x(lattice(),idx_gl)*
00173                      Tsize*field_components+header_size, SEEK_SET)<0) 
00174               error("unexpected end of file");
00175           if((fwrite(short_buffer, Tsize, field_components, fp)-
00176              field_components)!=0)
00177             error("I cannot write on the file. I am confused !?!?");
00178         }
00179       }
00180       if(strcmp(header,"NATIVE")==0) 
00181         fprintf(fp, "\n\n [ MDP Standard File Format ]\n");
00182       delete[] buffer_size;
00183       delete[] buffer_ptr;
00184       delete[] short_buffer;
00185       fclose(fp);
00186     } else {
00187       int  process;
00188       long buffer_size=0, idx, idx_gl;
00189       long *local_index=new long[max_buffer_size];
00190       mdp_array<T,2> local_buffer(max_buffer_size,field_components);
00191       mdp_request request;
00192       for(idx_gl=0; idx_gl<nvol_gl; idx_gl++) {
00193         process=where_global(idx_gl);
00194         if(process==ME) {
00195           local_index[buffer_size]=lattice().lg[idx_gl];
00196           buffer_size++;
00197         }
00198         if((buffer_size==max_buffer_size) || 
00199            ((idx_gl==nvol_gl-1) && (buffer_size>0))) {
00200           for(idx=0; idx<buffer_size; idx++)
00201             for(k=0; k<field_components; k++)
00202               local_buffer(idx,k)=*(m+local_index[idx]*field_components+k);
00203           mpi.put(buffer_size, processIO, request);
00204           mpi.wait(request);
00205           mpi.put(&(local_buffer(0,0)), buffer_size*field_components, 
00206                   processIO, request);
00207           mpi.wait(request);
00208           buffer_size=0;
00209         }
00210       }
00211       delete[] local_index;
00212     }
00213     if(ME==0 && mdp_shutup==FALSE) {
00214       printf("... Saving time: %f (sec)\n", mpi.time()-mytime);
00215       fflush(stdout);
00216     }
00217 }
00218 
00219 

Generated on Sun Feb 27 15:12:20 2005 by  doxygen 1.4.1