18 #define FILENAME_LENGTH 1024 20 static void usage(
char *name);
22 int main(
int argc,
char **argv)
25 char infilename[FILENAME_LENGTH];
26 char outfilename[FILENAME_LENGTH];
28 int i, rank, blk, startrank, endrank, startblk, endblk;
30 sion_int64 chunksize = 0;
31 sion_int64 left, bread, bsumread, bwrote;
40 int sid, ntasks, nfiles, maxblocks;
42 sion_int64 globalskip;
43 sion_int64 start_of_varheader;
44 sion_int64 *sion_localsizes;
45 sion_int64 *sion_globalranks;
46 sion_int64 *sion_blockcount;
47 sion_int64 *sion_blocksizes;
48 sion_int64 *sioncat_sum_bytes_per_task;
49 sion_int64 sioncat_sum_bytes;
50 sion_int64 sioncat_filesize;
59 if (argv[i][0] ==
'-') {
63 strcpy(outfilename,argv[++i]);
66 tasknum=atoi(argv[++i]);
69 blknum=atoi(argv[++i]);
75 fprintf(stderr,
"SIONlib utility %s (Version %d.%dp%d, fileformat version %d)\n", argv[0],
76 SION_MAIN_VERSION,SION_SUB_VERSION,
77 SION_VERSION_PATCHLEVEL,SION_FILEFORMAT_VERSION);
89 strcpy(infilename, argv[argc - 1]);
91 if(verbose) fprintf(stderr,
"sioncat: filename: %-30s\n", infilename);
92 if(verbose) fprintf(stderr,
"sioncat: outfile: %-30s\n", outfilename);
94 sid =
sion_open(infilename,
"rb,posix", &nfiles, &ntasks, NULL, &fsblksize, NULL, NULL);
96 if(verbose) fprintf(stderr,
"sioncat: sid: %d\n", sid);
97 if(verbose) fprintf(stderr,
"sioncat: filename: %-30s\n", infilename);
98 if(verbose) fprintf(stderr,
"sioncat: number of tasks: %d\n", ntasks);
99 if(verbose) fprintf(stderr,
"sioncat: write data of task: %d\n", tasknum);
100 if(verbose) fprintf(stderr,
"sioncat: write data of block: %d\n", blknum);
101 if(verbose) fprintf(stderr,
"sioncat: current endianness: %s\n", (
sion_get_endianness())?
"big" :
"little");
103 if(verbose) fprintf(stderr,
"sioncat: fsblksize: %lu bytes (%6.2f MB)\n", (
unsigned long) fsblksize, fsblksize / 1024.0 / 1024.0);
105 sion_get_locations(sid, &ntasks, &maxblocks, &globalskip, &start_of_varheader, &sion_localsizes, &sion_globalranks, &sion_blockcount,
108 if(verbose) fprintf(stderr,
"sioncat: max number of chunks: %d\n", maxblocks);
111 sioncat_sum_bytes_per_task = (sion_int64 *) malloc(ntasks *
sizeof(sion_int64));
112 for (rank = 0; rank < ntasks; rank++)
113 sioncat_sum_bytes_per_task[rank] = 0;
114 for (rank = 0; rank < ntasks; rank++) {
115 for (blk = 0; blk < maxblocks; blk++) {
116 sioncat_sum_bytes_per_task[rank] += sion_blocksizes[ntasks * blk + rank];
120 sioncat_sum_bytes = 0;
121 for (rank = 0; rank < ntasks; rank++)
122 sioncat_sum_bytes += sioncat_sum_bytes_per_task[rank];
124 if(verbose) fprintf(stderr,
"sioncat: datasize in file (aggr.): %lld bytes (%6.2f MB)\n", sioncat_sum_bytes, sioncat_sum_bytes / 1024.0 / 1024.0);
126 sioncat_filesize = start_of_varheader + (maxblocks + 1) * rank *
sizeof(sion_int64);
128 if(verbose) fprintf(stderr,
"sioncat: start_of_varheader: %lld bytes (%6.2f MB)\n", start_of_varheader, start_of_varheader / 1024.0 / 1024.0);
129 if(verbose) fprintf(stderr,
"sioncat: size of file: %lld bytes (%6.2f MB)\n", sioncat_filesize, sioncat_filesize / 1024.0 / 1024.0);
131 if (sioncat_filesize > 0) {
132 if(verbose) fprintf(stderr,
"sioncat: file usage: %8.6f%%\n", (
double) sioncat_sum_bytes / (
double) sioncat_filesize * 100.0);
136 for (rank = 0; rank < ntasks; rank++) {
137 if (chunksize<sion_localsizes[rank]) chunksize=sion_localsizes[rank];
138 if (chunksize<sion_blocksizes[rank]) chunksize=sion_blocksizes[rank];
140 if(verbose) fprintf(stderr,
"sioncat: max chunksize: %lld\n", chunksize);
141 localbuffer = (
char *) malloc(chunksize *
sizeof(
char));
142 if (localbuffer == NULL) {
143 fprintf(stderr,
"cannot allocate localbuffer of size %lld , aborting ...\n", chunksize *
sizeof(
char));
151 fprintf(stderr,
"cannot open outfile %s , aborting ...\n", outfilename);
156 if (tasknum>=ntasks) {
157 fprintf(stderr,
"task number %d out of range %d .. %d , aborting ...\n", tasknum,0,ntasks-1);
167 for (rank = startrank; rank <= endrank; rank++) {
169 if(verbose) fprintf(stderr,
"sioncat: processing task: %6d\n", rank);
172 if (blknum>=sion_blockcount[rank]) {
173 fprintf(stderr,
"blk number %d out of range %d .. %d , aborting ...\n", blknum,0,(
int) sion_blockcount[rank]-1);
180 endblk=sion_blockcount[rank]-1;
183 for (blk = startblk; blk <= endblk; blk++) {
187 DPRINTFP((1,
"sioncat", 0,
"after sion_seek sid=%d rank=%d blknum=%d fileposition=%lld\n",
191 left = sion_blocksizes[ntasks * blk + rank];
194 DPRINTFP((8,
"sioncat", 0,
"will read %lld bytes localbuffer+%lld\n", left, bsumread));
195 bread =
sion_fread(localbuffer + bsumread, 1, left, sid);
198 if(verbose) fprintf(stderr,
"sioncat: %lld read left=%lld \n", bread, left);
202 left = sion_blocksizes[ntasks * blk + rank];
206 bwrote = fwrite(localbuffer, 1, left, stdout);
207 if (bwrote != left) {
208 fprintf(stderr,
"problems writing data of size %d on stdout (rc=%d) , aborting ...\n", (
int) left, (
int) bwrote);
222 free(sioncat_sum_bytes_per_task);
229 void usage(
char *name)
231 fprintf(stderr,
"Usage: %s options <sionfn> \n\n", name);
233 fprintf(stderr,
"%s <sionfn> extracts data from SIONlib file <sionfn>. With -t the\n", name);
234 fprintf(stderr,
"output can be restricted to a single task and with -b to a single\n");
235 fprintf(stderr,
"block. %s does not extract any SIONlib meta data.\n\n", name);
237 fprintf(stderr,
"Options:\n");
238 fprintf(stderr,
" [-v] verbose mode \n");
239 fprintf(stderr,
" [-t <tasknum>] write only data of task <tasknum>\n");
240 fprintf(stderr,
" [-b <blknum>] write only data of block <blknum>\n");
241 fprintf(stderr,
" [-o <outfile>] file data will be written to, if not specified stdout\n");
242 fprintf(stderr,
" is used\n");
243 fprintf(stderr,
" [-V] show version of SIONlib\n");
244 fprintf(stderr,
" [-h] show this help\n");
sion_int64 _sion_file_write(const void *data, sion_int64 bytes, _sion_fileptr *sion_fileptr)
Write data to file.
_sion_fileptr * _sion_file_open(const char *fname, unsigned int flags, unsigned int addflags)
Create and open a new file for writing.
int sion_get_endianness(void)
Return endianness.
sion_int64 sion_get_position(int sid)
Function that returns the current file position.
#define SION_FILE_FLAG_WRITE
int sion_get_file_endianness(int sid)
Returns edianness of data in file sid.
int sion_close(int sid)
Close a sion file.
int sion_get_locations(int sid, int *ntasks, int *maxchunks, sion_int64 *globalskip, sion_int64 *start_of_varheader, sion_int64 **sion_chunksizes, sion_int64 **sion_globalranks, sion_int64 **sion_blockcount, sion_int64 **sion_blocksizes)
Returns pointers to internal fields.
#define SION_FILE_FLAG_ANSI
#define SION_FILE_FLAG_CREATE
int sion_seek(int sid, int rank, int currentblocknr, sion_int64 posinblk)
Function to set the file pointer to a new position.
int _sion_file_close(_sion_fileptr *sion_fileptr)
Close file and destroys fileptr structure.
size_t sion_fread(void *data, size_t size, size_t nitems, int sid)
Read data from sion file.
int sion_open(char *fname, const char *file_mode, int *ntasks, int *nfiles, sion_int64 **chunksizes, sion_int32 *fsblksize, int **globalranks, FILE **fileptr)
Open a sion file in serial mode.