276 lines
8.3 KiB
Python
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
|
|
|
|
p = re.compile("fort[.][0-9]{4,}")
|
|
|
|
# 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*]
|
|
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))
|