Source code for pycif.plugins.models.lagrangian.utils.flexpart_header
""" Class for reading FLEXPART binary headers
"""
import datetime
import struct
import numpy as np
from scipy.io import FortranFile
[docs]
def read_header(self, filename):
"""Reading FLEXPART header file"""
flexpart_header = Flexpartheader()
with FortranFile(filename, "r") as f:
# Deal with difference between FLEXPART 10 and previous versions
if getattr(self, "flexversion", 10) >= 10:
len_ver = 256
else:
len_ver = 13
tmp = f.read_record(f'<i4,<i4,S{len_ver}')[0]
flexpart_header.ibdate = tmp[0]
flexpart_header.ibtime = tmp[1]
loutstep, loutaver, loutsample = f.read_ints('i4')
tmp = f.read_record('<f4', '<f4', '<i4', '<i4', '<f4', '<f4')
flexpart_header.bndx = tmp[0][0]
flexpart_header.bndy = tmp[1][0]
flexpart_header.numx = tmp[2][0]
flexpart_header.numy = tmp[3][0]
flexpart_header.delx = tmp[4][0]
flexpart_header.dely = tmp[5][0]
tmp = f.read_reals('f4')
nzgrid = struct.unpack('i', struct.pack('f', tmp[0]))[0]
flexpart_header.outheight = np.zeros(50)
flexpart_header.outheight[:nzgrid] = tmp[1: nzgrid + 1]
jjjjmmdd, ihmmss = f.read_ints('i4')
nspec, nzgrid = f.read_ints('i4')
nspec /= 3
nspec = int(nspec)
for k in np.arange(nspec):
_ = f.read_ints('<i2')
_ = f.read_ints('<i2')
_ = f.read_ints('<i2')
flexpart_header.numpoint = f.read_ints()[0]
ireleasestart = np.zeros(flexpart_header.numpoint)
ireleaseend = np.zeros(flexpart_header.numpoint)
xpoint = np.zeros(flexpart_header.numpoint)
ypoint = np.zeros(flexpart_header.numpoint)
zpoint1 = np.zeros(flexpart_header.numpoint)
zpoint2 = np.zeros(flexpart_header.numpoint)
npart = np.zeros(flexpart_header.numpoint)
nkind = np.zeros(flexpart_header.numpoint)
xmass = np.zeros((flexpart_header.numpoint, nspec))
compoint = np.empty(flexpart_header.numpoint, dtype="|S45")
for i in np.arange(flexpart_header.numpoint):
line = f.read_record(np.dtype("a10"))
ireleasestart[i] = struct.unpack('i', line[0][:4])[0]
xpoint[i], ypoint[i], xp2, yp2, zpoint1[i], zpoint2[i] = f.read_reals("f4")
npart[i], nkind[i] = f.read_ints("i4")
compoint[i] = f.read_record(np.dtype("a45"))[0]
for j in np.arange(nspec):
_ = f.read_ints()
_ = f.read_ints()
xmass[i, j] = f.read_reals("f4")
imethod = f.read_ints()
tmp = f.read_ints('i4')
nageclass = tmp[0]
lage = tmp[1:1 + nageclass]
flexpart_header.releases = np.zeros(1000)
flexpart_header.releases[:flexpart_header.numpoint] = ireleasestart
flexpart_header.ageclass = lage[0]
flexpart_header.trajdays = flexpart_header.ageclass / 3600. / 24.
flexpart_header.ndgrid = np.abs(24 * 3600 / loutstep)
if flexpart_header.numx * flexpart_header.delx == 360:
flexpart_header.xshift = \
int((flexpart_header.bndx + 180) / flexpart_header.delx)
flexpart_header.bndx = -180
else:
flexpart_header.xshift = 0
return flexpart_header
[docs]
class Flexpartheader(object):
""" Class for reading FLEXPART binary headers
"""
def __init__(self):
"""Initialize a Flexpartheader object
"""
self.numpoint = np.nan
self.ibdate = np.nan
self.ibtime = np.nan
self.releases = np.nan
self.numx = np.nan
self.numy = np.nan
self.bndx = np.nan
self.bndy = np.nan
self.delx = np.nan
self.dely = np.nan
self.xshift = np.nan
self.ageclass = np.nan
self.trajdays = np.nan
self.ndgrid = np.nan
self.outheight = np.nan
self.maxngrid = np.nan