In [ ]:
%matplotlib inline
import h5py
import numpy as np
import matplotlib.pyplot as plt
import os
import yt
import logging
logging.getLogger('yt').setLevel(logging.ERROR)

from synchrotron.yt_synchrotron_emissivity import *
from yt.utilities.file_handler import HDF5FileHandler
from yt.funcs import mylog

def setup_part_file(ds):
    filename = os.path.join(ds.directory,ds.basename)
    ds._particle_handle = HDF5FileHandler(filename.replace('plt_cnt', 'part')+'_updated')
    ds.particle_filename = filename.replace('plt_cnt', 'part')+'_updated'
    mylog.info('Changed particle files to:' + ds.particle_filename)
    
dir = '/home/ychen/d9/FLASH4/2015_production_runs/0529_L45_M10_b1_h1/'
fname = dir + '/MHD_Jet_hdf5_plt_cnt_0630'

f = h5py.File(fname, 'r')

ds = yt.load(fname)
setup_part_file(ds)

In [ ]:
def prep_field_data(ds, field):
    #print(field)
    offset = 1
    data = np.zeros([ds.index.num_grids, *ds.index.grid_dimensions[0]], dtype='float32')
    for g in ds.index.grids:
        #print(g)
        if np.nan in g[field].v or np.inf in g[field].v:
            print(g[field].v)
        data[g.id-offset] = np.nan_to_num(g[field].v.transpose())
    #print(data[g.id-offset])
    return data

In [ ]:
os.path.exists
for k, v in f.items():
    print('{0:30s},{2},{1}'.format(k, v.shape, v.dtype))

In [ ]:
for name, value in f.items():
    print('%26s' % name, value)

In [ ]:
field_list = [field.decode() for field in f['unknown names'].value[:,0]]
print(field_list)

In [ ]:
'dens' in field_list

In [ ]:
for name, v in f.items():
    #print(name)
    if name not in field_list:
        print(v)

In [ ]:
from numpy.testing import assert_array_equal

def check_grids():
    for grid in ds.index.grids:
        h5id = grid.id-1
        #print(f['gid']).value[h5id]
        assert_array_equal(f['dens'].value[h5id], grid['dens'].v.transpose())

%timeit check_grids()

In [ ]:
ptype = 'lobe'
proj_axis = [1,0,1]
nu = (150, 'MHz')
#pars = add_synchrotron_emissivity(ds, ptype=ptype, nu=nu)
pars = add_synchrotron_dtau_emissivity(ds, ptype=ptype, nu=nu, proj_axis=proj_axis)
fields = []
for pol in ['i', 'q', 'u']:
    field = ('deposit', ('nn_emissivity_%s_%s_%%.1f%%s' % (pol, ptype)) % nu)
    fields.append(field)

In [ ]:
g = ds.index.grids[0]
print(field)
g[field]

In [ ]:
orig_field_list = [field.decode() for field in f['unknown names'].value[:,0]]
print(orig_field_list)

write_fields = np.array([f for ptype, f in fields])
#write_fields = np.array(['density'])
print(write_fields.shape)
print(write_fields)

In [ ]:
if type(proj_axis) is str:
    postfix = ('_synchrotron_%%.1f%%s_%s' % proj_axis) % nu
elif type(proj_axis) is list:
    postfix = ('_synchrotron_%%.1f%%s_%.1f_%.1f_%.1f' % tuple(proj_axis)) % nu

h5fw = h5py.File(f.filename+postfix, 'w')
print('Writing to ', f.filename+postfix)
for name, v in f.items():
    #print(name)
    if name in orig_field_list:
        #print('Skip %s' % name)
        pass
    elif name == 'unknown names':
        bnames = [f.encode('utf8') for f in write_fields]
        h5fw.create_dataset('unknown names', data=bnames)
    else:
        h5fw.create_dataset(v.name, v.shape, v.dtype, v.value)
for field in write_fields:
    data = prep_field_data(ds, field)
    fieldname = field[1] if type(field) is tuple else field
    print('writing field: %s' % fieldname)
    h5fw.create_dataset(fieldname, data.shape, data.dtype, data)
h5fw.close()

In [ ]:
h5fw.close()

In [ ]:
g = ds.index.grids[0]

In [ ]:
h5fr = h5py.File(f.filename+postfix, 'r')
for name, value in h5fr.items():
    print('%26s' % name, value)
h5fr.close()

In [ ]:
ds2 = yt.load(f.filename+postfix)
ds2.field_list

In [ ]:
from numpy.testing import assert_array_equal

assert_array_equal(ds2.all_data()['density'].v, ds.all_data()['dens'].v)

In [ ]:
yt.ProjectionPlot(ds2, 'x', ('flash','nn_emissivity_i_lobe_150.0MHz')).zoom(16)

In [ ]: