10 from __future__
import print_function
13 from datetime
import datetime
14 from scipy.io
import FortranFile
15 from argparse
import ArgumentParser, ArgumentDefaultsHelpFormatter
16 from pathlib
import Path
18 IODA_CONV_PATH = Path(__file__).parent/
"@SCRIPT_LIB_PATH@"
19 if not IODA_CONV_PATH.is_dir():
20 IODA_CONV_PATH = Path(__file__).parent/
'..'/
'lib-python'
21 sys.path.append(
str(IODA_CONV_PATH.resolve()))
23 import ioda_conv_ncio
as iconv
24 from orddicts
import DefaultOrderedDict
41 Read the surface obs data
42 Based on subroutine rd_ship in ocn_obs.f
46 fh = FortranFile(self.
filenamefilename, mode=
'r', header_dtype=
'>u4')
48 raise IOError(
'%s file not found!' % self.
filenamefilename)
50 raise Exception(
'Unknown error opening %s' % self.
filenamefilename)
55 data[
'n_obs'], data[
'n_lvl'], data[
'n_vrsn'] = fh.read_ints(
'>i4')
57 print(
' number ship obs: %d' % data[
'n_obs'])
58 print(
' max number levels: %d' % data[
'n_lvl'])
59 print(
'file version number: %d' % data[
'n_vrsn'])
61 if data[
'n_obs'] <= 0:
62 print(
'No ship observations to process from %s' % self.
filenamefilename)
65 data[
'ob_wm'] = fh.read_reals(
'>i4')
66 data[
'ob_glb'] = fh.read_reals(
'>f4')
67 data[
'ob_lat'] = fh.read_reals(
'>f4')
68 data[
'ob_lon'] = fh.read_reals(
'>f4')
69 data[
'ob_age'] = fh.read_reals(
'>f4')
70 data[
'ob_clm'] = fh.read_reals(
'>f4')
71 data[
'ob_qc'] = fh.read_reals(
'>f4')
72 data[
'ob_rgn'] = fh.read_reals(
'>f4')
73 data[
'ob_sst'] = fh.read_reals(
'>f4')
74 data[
'ob_typ'] = fh.read_reals(
'>i4')
75 data[
'ob_dtg'] = fh.read_record(
'>S12').astype(
'U12')
76 data[
'ob_rcpt'] = fh.read_record(
'>S12').astype(
'U12')
77 data[
'ob_scr'] = fh.read_record(
'>S1').astype(
'U1')
79 if data[
'n_vrsn'] <= 2:
80 print(
'verify ob_sign for version = %d' % data[
'n_vrsn'])
81 data[
'ob_sign'] = fh.read_record(
'S6').astype(
'U6')
83 data[
'ob_sign'] = fh.read_record(
'>S7').astype(
'U7')
85 if data[
'n_vrsn'] > 1:
86 data[
'ob_csgm'] = fh.read_reals(
'>f4')
87 data[
'ob_gsgm'] = fh.read_reals(
'>f4')
88 data[
'ob_rsgm'] = fh.read_reals(
'>f4')
90 minus999 = np.ones(data[
'n_obs'], dtype=np.float32) * -999.
91 data[
'ob_csgm'] = minus999
92 data[
'ob_gsgm'] = minus999
93 data[
'ob_rsgm'] = minus999
104 def __init__(self, filename, date, varDict, obsList):
106 Initialize IODA writer class,
107 transform to IODA data structure and,
108 write out to IODA file.
116 (
"latitude",
"float"),
117 (
"longitude",
"float"),
118 (
"datetime",
"string")
123 'date_time_string': self.
datedate.strftime(
"%Y-%m-%dT%H:%M:%SZ")
129 for key
in self.
varDictvarDict.keys():
130 value = self.
varDictvarDict[key]
131 self.
keyDictkeyDict[key][
'valKey'] = value, self.
writerwriter.OvalName()
132 self.
keyDictkeyDict[key][
'errKey'] = value, self.
writerwriter.OerrName()
133 self.
keyDictkeyDict[key][
'qcKey'] = value, self.
writerwriter.OqcName()
142 if obs.data[
'n_obs'] <= 0:
143 print(
'No ship observations for IODA!')
146 for n
in range(obs.data[
'n_obs']):
148 lat = obs.data[
'ob_lat'][n]
149 lon = obs.data[
'ob_lon'][n]
150 dtg = datetime.strptime(obs.data[
'ob_dtg'][n],
'%Y%m%d%H%M')
152 locKey = lat, lon, dtg.strftime(
"%Y-%m-%dT%H:%M:%SZ")
154 for key
in self.
varDictvarDict.keys():
156 val = obs.data[key][n]
158 qc = (100*obs.data[
'ob_qc'][n]).astype(
'i4')
160 valKey = self.
keyDictkeyDict[key][
'valKey']
161 errKey = self.
keyDictkeyDict[key][
'errKey']
162 qcKey = self.
keyDictkeyDict[key][
'qcKey']
164 self.
datadata[recKey][locKey][valKey] = val
165 self.
datadata[recKey][locKey][errKey] = err
166 self.
datadata[recKey][locKey][qcKey] = qc
168 (ObsVars, LocMdata, VarMdata) = self.
writerwriter.ExtractObsData(self.
datadata)
169 self.
writerwriter.BuildNetcdf(ObsVars, LocMdata, VarMdata, self.
AttrDataAttrData)
176 desc =
'Convert GODAE binary ship data to IODA netCDF4 format'
177 parser = ArgumentParser(description=desc,
178 formatter_class=ArgumentDefaultsHelpFormatter)
180 '-i',
'--input', help=
'name of the binary GODAE ship file',
181 type=str, nargs=
'+', required=
True)
183 '-o',
'--output', help=
'name of the output netCDF GODAE ship file',
184 type=str, required=
True, default=
None)
186 '-d',
'--date', help=
'file date',
187 type=str, metavar=
'YYYYMMDDHH', required=
True)
189 args = parser.parse_args()
192 foutput = args.output
193 fdate = datetime.strptime(args.date,
'%Y%m%d%H')
197 obsList.append(
ship(fname, fdate))
200 'ob_sst':
'sea_surface_temperature',
203 IODA(foutput, fdate, varDict, obsList)
206 if __name__ ==
'__main__':
def __init__(self, filename, date, varDict, obsList)
def __init__(self, filename, date)