- 积分
- 55960
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2011-6-21
- 最后登录
- 1970-1-1
|
楼主 |
发表于 2024-3-19 10:46:03
|
显示全部楼层
参考这个脚本程序,不过数据文件中只有一个时次。
- # Convert GRIB data to ARL data
- #---- Set data folder
- datadir = 'D:/Temp/grib'
- #---- Set output data file
- outfn = os.path.join(datadir, 'gdas1.fnl0p25.2023010100.f00.arl')
- #if os.path.exists(outfn):
- # os.remove(outfn)
- #---- Read a GRIB data file
- infn = os.path.join(datadir, 'gdas1.fnl0p25.2023010100.f00.grib2')
- print(infn)
- inf = addfile(infn)
- print('GRIB data file has been opened...')
- #---- Set output ARL data file
- arlf = addfile(outfn, 'c', dtype='arl')
- #---- Set variable and level list
- gvar2d = ['Temperature_height_above_ground','Relative_humidity_height_above_ground','u-component_of_wind_height_above_ground',
- 'v-component_of_wind_height_above_ground','Pressure_reduced_to_MSL_msl','Pressure_surface','Precipitation_rate_surface']
- gvar3d = ['u-component_of_wind_isobaric','v-component_of_wind_isobaric','Temperature_isobaric',
- 'Geopotential_height_isobaric','Relative_humidity_isobaric','Vertical_velocity_geometric_isobaric']
- avar2d = ['T02M','RH2M','U10M','V10M','MSLP','PRSS','TPP6']
- avar3d = ['UWND','VWND','TEMP','HGTS','RELH','WWND']
- gv = inf['Geopotential_height_isobaric']
- nx = gv.dimlen(gv.ndim - 1)
- ny = gv.dimlen(gv.ndim - 2)
- levels = gv.dimvalue(gv.ndim - 3)[::-1]
- nz = len(levels)
- arlf.setlevels(levels)
- arlf.set2dvar(avar2d)
- for l in levels:
- arlf.set3dvar(avar3d)
- #---- Write ARL data file
- arlf.setx(gv.dimvalue(gv.ndim - 1))
- arlf.sety(gv.dimvalue(gv.ndim - 2))
- tNum = inf.timenum()
- fhour = 0
- for t in range(0, tNum):
- print('Time index: ' + str(t))
- atime = inf.gettime(t)
- print(atime.strftime('%Y-%m-%d %H:00'))
- dhead = arlf.getdatahead(inf.proj, 'RSMC', 2, fhour)
- #Pre-write index record without checksum - will be over-write latter
- arlf.writeindexrec(atime, dhead)
- #Checksum list
- ksumlist = []
- # Write 2d variables
- ksums = []
- for avname,gvname in zip(avar2d, gvar2d):
- print(avname + ' ' + gvname)
- if avname in ['T02M','RH2M','U10M','V10M']:
- gdata = inf[gvname][t,0,:,:]
- else:
- gdata = inf[gvname][t,:,:]
-
- if avname == 'PRSS' or avname == 'MSLP':
- gdata = gdata * 0.01
-
- ksum = arlf.writedatarec(atime, 0, avname, fhour, 99, gdata)
- ksums.append(ksum)
- ksumlist.append(ksums)
- # Write 3d variables
- for lidx in range(0, nz):
- ksums = []
- llidx = nz - lidx - 1
- print(lidx, llidx)
- for avname,gvname in zip(avar3d, gvar3d):
- print avname + ' ' + gvname
- gdata = inf[gvname][t,llidx,:,:]
- if avname == 'WWND':
- gdata = gdata * 0.01
- elif avname == 'SPHU':
- gdata = gdata * 1000.
- ksum = arlf.writedatarec(atime, lidx + 1, avname, fhour, 99, gdata)
- ksums.append(ksum)
- ksumlist.append(ksums)
- #Re-write index record with checksum
- arlf.writeindexrec(atime, dhead, ksumlist)
- fhour += 1
- arlf.close()
- print('Finished!')
|
|