Source code for openmc.ace

from __future__ import division
from struct import pack


[docs]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()