00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "adio.h"
00010 #include "adio_extern.h"
00011
00012
00013
00014
00015 void ADIOI_Get_byte_offset(ADIO_File fd, ADIO_Offset offset, ADIO_Offset *disp)
00016 {
00017 ADIOI_Flatlist_node *flat_file;
00018 int i, sum, n_etypes_in_filetype, size_in_filetype;
00019 int n_filetypes, etype_in_filetype;
00020 ADIO_Offset abs_off_in_filetype=0;
00021 int filetype_size, etype_size, filetype_is_contig;
00022 MPI_Aint filetype_extent;
00023
00024 ADIOI_Datatype_iscontig(fd->filetype, &filetype_is_contig);
00025 etype_size = fd->etype_size;
00026
00027 if (filetype_is_contig) *disp = fd->disp + etype_size * offset;
00028 else {
00029
00030 flat_file = ADIOI_Flatlist;
00031 while (flat_file->type != fd->filetype) flat_file = flat_file->next;
00032
00033 MPI_Type_size(fd->filetype, &filetype_size);
00034 n_etypes_in_filetype = filetype_size/etype_size;
00035 n_filetypes = (int) (offset / n_etypes_in_filetype);
00036 etype_in_filetype = (int) (offset % n_etypes_in_filetype);
00037 size_in_filetype = etype_in_filetype * etype_size;
00038
00039 sum = 0;
00040 for (i=0; i<flat_file->count; i++) {
00041 sum += flat_file->blocklens[i];
00042 if (sum > size_in_filetype) {
00043 abs_off_in_filetype = flat_file->indices[i] +
00044 size_in_filetype - (sum - flat_file->blocklens[i]);
00045 break;
00046 }
00047 }
00048
00049
00050 MPI_Type_extent(fd->filetype, &filetype_extent);
00051 *disp = fd->disp + (ADIO_Offset) n_filetypes*filetype_extent + abs_off_in_filetype;
00052 }
00053 }