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_position(ADIO_File fd, ADIO_Offset *offset)
00016 {
00017 ADIOI_Flatlist_node *flat_file;
00018 int i, n_filetypes, flag, frd_size;
00019 int filetype_size, etype_size, filetype_is_contig;
00020 MPI_Aint filetype_extent;
00021 ADIO_Offset disp, byte_offset, sum, size_in_file;
00022
00023 ADIOI_Datatype_iscontig(fd->filetype, &filetype_is_contig);
00024 etype_size = fd->etype_size;
00025
00026 if (filetype_is_contig){
00027 printf("filetype is contig: fd->filetype=%d, etypesize=%d\n",fd->filetype,fd->etype_size);
00028 *offset = (fd->fp_ind - fd->disp)/etype_size;
00029 } else {
00030
00031 flat_file = ADIOI_Flatlist;
00032 while (flat_file->type != fd->filetype) flat_file = flat_file->next;
00033
00034 MPI_Type_size(fd->filetype, &filetype_size);
00035 MPI_Type_extent(fd->filetype, &filetype_extent);
00036
00037 printf("filetype is not contig: fd->filetype=%d,size=%d,extent=%d,etypesize=%d\n",fd->filetype,filetype_size,filetype_extent,fd->etype_size);
00038
00039 disp = fd->disp;
00040 byte_offset = fd->fp_ind;
00041 n_filetypes = -1;
00042 flag = 0;
00043 while (!flag) {
00044 sum = 0;
00045 n_filetypes++;
00046 for (i=0; i<flat_file->count; i++) {
00047 sum += flat_file->blocklens[i];
00048 if (disp + flat_file->indices[i] +
00049 (ADIO_Offset) n_filetypes*filetype_extent + flat_file->blocklens[i]
00050 >= byte_offset) {
00051 frd_size = (int) (disp + flat_file->indices[i] +
00052 (ADIO_Offset) n_filetypes*filetype_extent
00053 + flat_file->blocklens[i] - byte_offset);
00054 sum -= frd_size;
00055 flag = 1;
00056 break;
00057 }
00058 }
00059 }
00060 size_in_file = (ADIO_Offset) n_filetypes*filetype_size + sum;
00061 *offset = size_in_file/etype_size;
00062 }
00063 }