diff --git a/src/utils/convert_binary.py b/src/utils/convert_binary.py new file mode 100755 index 0000000000..f5feb930f6 --- /dev/null +++ b/src/utils/convert_binary.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python + +from __future__ import division + +from struct import pack +import sys + + +def ascii_to_binary(ascii_file, binary_file): + """Convert an ACE file in ASCII format (type 1) to binary format (type 2). + + Parameters + ---------- + ascii_file : str + Filename of ASCII ACE file + binary_file : str + Filename of binary ACE file to be written + + """ + + # Open ASCII and binary files + ascii = open(ascii_file, 'r') + binary = open(binary_file, 'wb') + + # Set default record length + record_length = 4096 + + # Read data from ASCII file + lines = ascii.readlines() + ascii.close() + + idx = 0 + while idx < len(lines): + # Read/write header block + hz = lines[idx][:10].encode('UTF-8') + aw0 = float(lines[idx][10:22]) + tz = float(lines[idx][22:34]) + hd = lines[idx][35:45].encode('UTF-8') + hk = lines[idx + 1][:70].encode('UTF-8') + hm = lines[idx + 1][70:80].encode('UTF-8') + binary.write(pack('=10sdd10s70s10s', hz, aw0, tz, hd, hk, hm)) + + # Read/write IZ/AW pairs + data = ' '.join(lines[idx + 2:idx + 6]).split() + iz = list(map(int, data[::2])) + aw = list(map(float, data[1::2])) + izaw = [item for sublist in zip(iz, aw) for item in sublist] + binary.write(pack('=' + 16*'id', *izaw)) + + # Read/write NXS and JXS arrays. Null bytes are added at the end so + # that XSS will start at the second record + nxs = list(map(int, ' '.join(lines[idx + 6:idx + 8]).split())) + jxs = list(map(int, ' '.join(lines[idx + 8:idx + 12]).split())) + binary.write(pack('=16i32i{0}x'.format(record_length - 500), *(nxs + jxs))) + + # Read/write XSS array. Null bytes are added to form a complete record + # at the end of the file + n_lines = (nxs[0] + 3)//4 + xss = list(map(float, ' '.join(lines[idx + 12:idx + 12 + n_lines]).split())) + extra_bytes = record_length - ((len(xss)*8 - 1) % record_length + 1) + binary.write(pack('={0}d{1}x'.format(nxs[0], extra_bytes), *xss)) + + # Advance to next table in file + idx += 12 + n_lines + + # Close binary file + binary.close() + +if __name__ == '__main__': + # Check for proper number of arguments + if len(sys.argv) < 3: + sys.exit('Usage: {0} ascii_file binary_file'.format(sys.argv[0])) + + # Convert ASCII file + ascii_to_binary(sys.argv[1], sys.argv[2])