mirror of
https://github.com/openmc-dev/openmc.git
synced 2026-07-24 20:15:26 -04:00
77 lines
2.4 KiB
Python
Executable file
77 lines
2.4 KiB
Python
Executable file
#!/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 file
|
|
ascii = open(ascii_file, 'r')
|
|
|
|
# Set default record length
|
|
record_length = 4096
|
|
|
|
# Read data from ASCII file
|
|
lines = ascii.readlines()
|
|
ascii.close()
|
|
|
|
# Open binary file
|
|
binary = open(binary_file, 'wb')
|
|
|
|
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])
|