Compare commits

...

2 Commits

Author SHA1 Message Date
Michael Krayer f92bd36a76 bugfix: filename 2021-02-03 16:22:33 +01:00
Michael Krayer 7687d4f022 unpack files to MPIIO 2021-02-03 16:22:15 +01:00
2 changed files with 68 additions and 2 deletions

View File

@ -8,7 +8,7 @@ import numpy as np
import ucf
import configparser
parser = argparse.ArgumentParser(description='Reads an ucf.tar archive, downsamples it and saves it to a new ucf.tar archive. Can be used as a pipe.')
parser = argparse.ArgumentParser(description='Packs UCF MPIIO data into a tar archive. The single output file is split into multiple files due to file size restrictions.')
parser.add_argument('indir', metavar='dirin', help='input directory')
parser.add_argument('iseq', metavar='iseq', help='sequence number')
parser.add_argument('base', metavar='base', help='filebase to be archived: "uvwp" or "scal"')
@ -52,7 +52,7 @@ if verbose:
ftar = tarfile.open(name=file_out,mode='w',pax_headers=tarfile.USTAR_FORMAT)
def transform_filename(filename,iseq):
return os.path.basename(file_in).replace('_{:04d}'.format(iseq),'')
return os.path.basename(filename).replace('_{:04d}'.format(iseq),'')
# Parse parameters to construct file headers, then add it to tar
file_in = '{}/parameters_{:04d}.asc'.format(dir_in,iseq)

View File

@ -0,0 +1,66 @@
#!/usr/bin/env python3
import sys
import io
import os
import tarfile
import argparse
import numpy as np
import ucf
import configparser
parser = argparse.ArgumentParser(description='Unpacks an UCF tar file as MPIIO input file.')
parser.add_argument('infile', metavar='filein', help='input file')
parser.add_argument('iseq', metavar='iseq', help='sequence number')
#parser.add_argument('base', metavar='base', help='filebase to be archived: "uvwp" or "scal"')
parser.add_argument("-o", "--outdir", metavar='directory',nargs='?', default=None, help="name of the output directory", action="store")
parser.add_argument("-v", "--verbose", help="activate verbose output", action="store_true")
args = parser.parse_args()
file_in = args.infile
iseq = int(args.iseq)
#base = args.base
verbose = args.verbose
if args.outdir is None:
dir_out = './'
else:
dir_out = args.outdir
# Open tar file for input
ftar = tarfile.open(name=file_in,mode='r')
# Extract files
def transform_filename(filename,iseq):
return filename.replace('.','_{:04d}.'.format(iseq))
files_all = ftar.getnames()
#files_aux = ('parameters.asc','proc.bin','grid.bin','particles.bin')
files_aux = [s for s in files_all if not s.startswith('uvwp') or s.startswith('scal')]
for files in files_aux:
print(files)
ucf_bytes = ftar.extractfile(files).read()
file_out = dir_out+transform_filename(files,iseq)
fidw = open(file_out,'wb')
fidw.write(ucf_bytes)
fidw.close()
files_data = [s for s in files_all if s.startswith('uvwp') or s.startswith('scal')]
base = files_data[0].split('.')[0]
iproc = 0
file_out = dir_out+'/'+base+'_{:04d}.bin'.format(iseq)
fidw = open(file_out,'wb')
for files in files_data:
print(files)
sproc = files.split('.')[1]
if iproc!=int(sproc):
raise ValueError('Invalid file order in tar: {}, {}'.format(iproc,files))
ucf_bytes = ftar.extractfile(files).read()
if iproc==0:
fidw.write(ucf_bytes)
else:
fidw.write(ucf_bytes[64:])
iproc += 1
fidw.close()
# Close tar file
ftar.close()