conditional-analysis-dns/dnstool.py

276 lines
8.3 KiB
Python

class DnsCase:
data_start = (4+8*6+4) + (4+8*3+4) + 3 * (4+8*2+4) + 4
def __init__ (self, case_root, case_name=None):
import os
import re
# Case name
if case_name is None:
self.name = os.path.basename(case_root)
else:
self.name = case_name
# Case root directory path
self.case_root = os.path.abspath(case_root)
# List of data files. fort.xxxx[x*]
# matches fort.? files with more than 4 digits
p = re.compile("fort[.][0-9]{4,}")
self.data_files = (sorted(filter(p.match, os.listdir(case_root))))
# Read meta data from the first data file
# t0, it0, data array shape
info = self.read_info(os.path.join(case_root, self.data_files[0]))
self.t0 = info["time"]
self.it0 = info["itime"]
self.shape = (info["nx"], info["ny"], info["nz"])
# Read meta data from the first data file
info = self.read_info(os.path.join(case_root, self.data_files[-1]))
self.t1 = info["time"]
self.it1 = info["itime"]
self.time = None
self.itime = None
self.st = None
def setup_files (self, dst):
import os, shutil
# Make symbolic links to data files
for datafile in self.data_files:
os.symlink(
os.path.join(self.case_root, datafile),
os.path.join(dst, datafile)
)
# Copy Input Parameterfiles
try:
shutil.copy(
os.path.join(self.case_root, "00_lessmag.in"),
dst
)
except IOError as e:
print(e)
def read_all_info (self):
"""
Loop over all data files to gather all info
"""
import os
if self.time is None:
self.time = []
self.itime = []
self.st = []
for filename in self.data_files:
filepath = os.path.join(self.case_root, filename)
info = self.read_info(filepath)
self.time.append(info["time"])
self.itime.append(info["itime"])
self.st.append(info["u0"])
def read_info (self, fname):
'''
Read Info from a Single DNS Data File
'''
import struct
info_dict = {}
with open(fname, 'rb') as f1 :
f1.seek(0)
raw_info = f1.read(4+8*6+4)[4:-4]
info_dict['time'] = struct.unpack('d', raw_info[ 0: 8])[0] # fdmtime, double
info_dict['nx'] = struct.unpack('q', raw_info[ 8:16])[0] # nx, integer
info_dict['ny'] = struct.unpack('q', raw_info[16:24])[0] # ny, integer
info_dict['nz'] = struct.unpack('q', raw_info[24:32])[0] # nz integer
# oldsumc, double
# time_int, double
raw_info = f1.read(4+8*3+4)[4:-4]
info_dict['itime'] = struct.unpack('q', raw_info[ 0: 8])[0] # fdmcyc, integer
info_dict['dt'] = struct.unpack('d', raw_info[ 8:16])[0] # DT, double
info_dict['u0'] = struct.unpack('d', raw_info[16:24])[0] # dummyu_, double
raw_info = f1.read(4+8*2+4)[4:-4]
# dt_fdmsave, double
# dt_fdm_fullsave, double
raw_info = f1.read(4+8*2+4)[4:-4]
# t_fdmsave, double
# t_fullsave, double
raw_info = f1.read(4+8*2+4)[4:-4]
# in_yr, double
# out_yr, double
return info_dict
def read_data (self, fname):
'''
Read Single DNS Data File
'''
import numpy as np
offset_data = self.data_start
info_dict = self.read_info(fname)
t = info_dict['time']
nx = info_dict['nx']
ny = info_dict['ny']
nz = info_dict['nz']
with open(fname, 'rb') as f1 :
f1.seek(offset_data)
count = nx*ny*nz
V = np.fromfile(f1, dtype=np.double, count=(3*count)).reshape((3,nz,ny,nx))
s = np.fromfile(f1, dtype=np.double, count=(2*count)).reshape((2,nz,ny,nx))
return t, (nx, ny, nz), V, s
def read_single_field (self, fname, ifield):
'''
Read Single DNS Data File
'''
import numpy as np
offset_data = self.data_start
info_dict = self.read_info(fname)
t = info_dict['time']
nx = info_dict['nx']
ny = info_dict['ny']
nz = info_dict['nz']
with open(fname, 'rb') as f1 :
count = nx*ny*nz
f1.seek(offset_data + count * 8 * ifield)
V = np.fromfile(f1, dtype=np.double, count=count).reshape((nz,ny,nx))
return t, V
def case_library ():
'''
Return DNS case object library
'''
import os
cases = '''
IC1 /home1/dhkim/4pi_IC1/4pi_IC1_01_kfmax10_lt58
IC2 /home1/dhkim/Backup_jinyeong/DNS/run/4pi_IC2/4pi_IC2_01_kfmax19_lt60
IC3 /home1/dhkim/Backup_jinyeong/DNS/run/4pi_IC3/4pi_IC3_03_kfmax19_lt61_smallDt
IC4 /home1/dhkim/4pi_IC4/moved/4pi-IC4-additional_new
IC8 /home1/dhkim/Backup_jinyeong/DNS/run/4pi_IC8/4pi-IC8-02
IC10 /home1/dhkim/4pi_IC10/4pi_IC10_06_kfmax_22
IC11 /home1/dhkim/4pi_IC11
IC12 /home1/dhkim/Backup_jinyeong/DNS/run/4pi_IC12
IC13 /home1/dhkim/Backup_jinyeong/DNS/run/4pi_IC13/4pi_IC13_lt60'''.split()
cic_case_dict = dict(zip(cases[0::2], cases[1::2]))
database_root = '/home1/ignis/ignis/'
names = 'VIC1 VIC2 VIC4 VIC10 VIC13 '.split()
cases = 'ic1-5dm ic2-5dm ic4-5dm ic10-5dm ic13-5dm'.split()
for case_name, case_dir in zip(names, cases):
case_root = os.path.join(database_root, case_dir)
cic_case_dict[case_name] = case_root
case_dict = dict([ (case_name, DnsCase(cic_case_dict[case_name], case_name=case_name))
for case_name in cic_case_dict
])
return case_dict
if __name__ == "__main__":
import os, sys, argparse
cases = '''
IC1 /home1/dhkim/4pi_IC1/4pi_IC1_01_kfmax10_lt58
IC2 /home1/dhkim/Backup_jinyeong/DNS/run/4pi_IC2/4pi_IC2_01_kfmax19_lt60
IC3 /home1/dhkim/Backup_jinyeong/DNS/run/4pi_IC3/4pi_IC3_03_kfmax19_lt61_smallDt
IC4 /home1/dhkim/4pi_IC4/moved/4pi-IC4-additional_new
IC8 /home1/dhkim/Backup_jinyeong/DNS/run/4pi_IC8/4pi-IC8-02
IC10 /home1/dhkim/4pi_IC10/4pi_IC10_06_kfmax_22
IC11 /home1/dhkim/4pi_IC11
IC12 /home1/dhkim/Backup_jinyeong/DNS/run/4pi_IC12
IC13 /home1/dhkim/Backup_jinyeong/DNS/run/4pi_IC13/4pi_IC13_lt60'''.split()
cic_case_dict = dict(zip(cases[0::2], cases[1::2]))
database_root = '/home1/ignis/ignis/'
names = 'VIC1 VIC2 VIC4 VIC10 VIC13 '.split()
cases = 'ic1-5dm ic2-5dm ic4-5dm ic10-5dm ic13-5dm'.split()
for case_name, case_dir in zip(names, cases):
case_root = os.path.join(database_root, case_dir)
cic_case_dict[case_name] = case_root
# Commandline argument parser
parser = argparse.ArgumentParser()
parser.add_argument("-l", "--list", help="list all cases", action='store_true')
parser.add_argument("-c", "--create", help="create a case or all cases")
args = parser.parse_args()
params = vars(args)
# List all cases
if params["list"]:
for case_name in sorted(cic_case_dict):
print(case_name, cic_case_dict[case_name])
sys.exit(0)
# Create case directories
create_case = params["create"]
if create_case:
if create_case == "all":
print ("Creating All DNS Cases for Post-processing")
for case_name in sorted(cic_case_dict):
print ("Creating DNS Case {} for Post-processing".format(case_name))
os.mkdir(case_name)
# Create DNS Case Object
case_obj = DnsCase(cic_case_dict[case_name], case_name=case_name)
case_obj.setup_files(case_name)
else:
if create_case in cic_case_dict:
print ("Creating DNS Case {} for Post-processing".format(create_case))
os.mkdir(create_case)
# Create DNS Case Object
case_obj = DnsCase(cic_case_dict[create_case], case_name=create_case)
case_obj.setup_files(create_case)
else:
print ("Can't find DNS Case {}".format(create_case))