Changeset 2232 in lmdz_wrf for trunk/tools


Ignore:
Timestamp:
Nov 16, 2018, 4:41:41 PM (6 years ago)
Author:
lfita
Message:

Working version of script!

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tools/read_grib.py

    r2231 r2232  
    33import pupygrib
    44import os
     5from netCDF4 import Dataset as NetCDFFile
     6import generic_tools as gen
     7import nc_var_tools as ncvar
    58
    69errormsg = 'ERROR -- error -- ERROR -- error'
     
    1316    """ Function to provide CF name from a ECMWF GRIB table 128 variable ID
    1417    >>> grib128_ncname(130)
    15 
     18    ['T', 'Temperature', 'K', 'air_temperature', 'air temperature']
    1619    """
    1720    fname = 'grib128_ncname'
    1821
    1922    folder = os.path.dirname(os.path.realpath(__file__))
    20     folder = '/home/lluis/PyNCplot'
    2123
    2224    infile = folder + '/transform_128ECMWF.html'
     
    3335    for line in of:
    3436        if len(line) > 28:
    35             print line[0:27], ':', idS, line[0:27] == '<td align="center">' + idS + '</td>'
     37            #print line[0:27], ':', idS, line[0:27] == '<td align="center">' + idS + '</td>'
    3638            if line[0:27] == '<td align="center">' + idS + '</td>':
    3739                linevals = line.replace('\n','').split('</td>')
    38                 varn = linevals[0].replace('<td align="center">','')
    39                 Lvarn = linevals[1].replace('<td align="center">','')
    40                 units = linevals[2].replace('<td align="left">','')
    41 
    42                 print varn, Lvarn, units
     40                varn = linevals[1].replace('<td align="center">','')
     41                Lvarn = linevals[2].replace('<td align="left">','')
     42                units = linevals[3].replace('<td align="left">','')
     43                units = units.replace('<sup>','').replace('</sup>','')
     44                units = units.replace('<sub>','').replace('</sub>','')
     45                units = units.replace('<nobr>','').replace('</nobr>','')
     46
     47                #print varn, Lvarn, units
     48
     49                cfvalues = gen.variables_values(varn)
    4350
    4451                break
    4552
    46     return cfname
    47 
    48 grib128_ncname(130)
    49 quit()
     53    return [varn,Lvarn,units,cfvalues[0], cfvalues[1], cfvalues[4].replace('|', ' ')]
     54
     55timeu = 'minutes since 1949-12-01 00:00:00'
     56
     57#######    #######
     58## MAIN
     59    #######
    5060
    5161with open(ifile, 'rb') as stream:
    5262    for i, msg in enumerate(pupygrib.read(stream), 1):
    53         if i == 0:
     63        if i == 1:
    5464            lons, lats = msg.get_coordinates()
    55             newnc = NetCDFFile(ofile, 'w')
     65            onewnc = NetCDFFile(ofile, 'w')
     66
     67            # Create dimension
     68            dimx = lons.shape[1]
     69            dimy = lons.shape[0]
     70
     71            newdim = onewnc.createDimension('lon',dimx)
     72            newdim = onewnc.createDimension('lat',dimy)
     73            newdim = onewnc.createDimension('time',None)
     74            newdim = onewnc.createDimension('Lstring',64)
     75           
     76            dlon = msg[2].longitudeOfLastGridPoint - msg[2].longitudeOfFirstGridPoint
     77            dlat = msg[2].latitudeOfLastGridPoint - msg[2].latitudeOfFirstGridPoint
     78            print dlon, dlat
     79
     80            if dlat < 0.:
     81                lons[:,:] = lons[::-1,:]
     82                lats[:,:] = lats[::-1,:]
     83
     84            # Create dimension-varibale
     85            newvar = onewnc.createVariable('lon', 'f8', ('lat', 'lon'))
     86            newvar[:] = lons[:]
     87            ncvar.basicvardef(newvar, 'lon', 'Longitude', 'degrees_east')
     88            newvar.setncattr('axis', 'X')
     89            newvar.setncattr('_CoordinateAxisType', 'Lon')
     90
     91            newvar = onewnc.createVariable('lat', 'f8', ('lat', 'lon'))
     92            newvar[:] = lats[:]
     93            ncvar.basicvardef(newvar, 'lat', 'Latitude', 'degrees_north')
     94            newvar.setncattr('axis', 'Y')
     95            newvar.setncattr('_CoordinateAxisType', 'Lat')
     96           
     97            newvartime = onewnc.createVariable('time', 'f8', ('time'))
     98            ncvar.basicvardef(newvartime, 'time', 'time', timeu)
     99            newvar.setncattr('axis', 'T')
     100            newvar.setncattr('_CoordinateAxisType', 'Time')
     101           
     102            newvartimeS = onewnc.createVariable('timeS', 'c', ('time', 'Lstring'))
     103            ncvar.basicvardef(newvartimeS, 'time', 'time', 'YmdHMS')
     104            newvar.setncattr('axis', 'T')
     105            newvar.setncattr('_CoordinateAxisType', 'Time')
     106
    56107        values = msg.get_values()
    57         print "Message :", i, values.mean(), values.shape, ':', msg[1].centuryOfReferenceTimeOfData, \
    58           msg[1].yearOfCentury, msg[1].month, msg[1].day, msg[1].hour, msg[1].minute, \
    59           msg[1].indicatorOfTypeOfLevel, msg[1].level, msg[1].localDefinitionNumber, msg[1].indicatorOfParameter, \
    60           msg[1].offset, msg[1].decimalScaleFactor, msg[1].timeRangeIndicator
    61         print 'msg:', dir(msg)
    62         for i in range(6):
    63             print 'msg ' + str(i) + ':', dir(msg[i])
    64         quit(-1)
    65 
    66 
     108        century = msg[1].centuryOfReferenceTimeOfData
     109        year = msg[1].yearOfCentury
     110        month = msg[1].month
     111        day = msg[1].day
     112        hour = msg[1].hour
     113        minute = msg[1].minute
     114        levtype = msg[1].indicatorOfTypeOfLevel
     115        level = msg[1].level
     116        varid = msg[1].indicatorOfParameter
     117        offset = msg[1].offset
     118        scalefactor = msg[1].decimalScaleFactor
     119        timerange = msg[1].timeRangeIndicator
     120
     121        if levtype == 100:
     122            if not onewnc.variables.has_key('press'):
     123                print '  we got a variable with a pressure value !!'
     124                pressv = []
     125                newdim = onewnc.createDimension('press', None)
     126                newvarpress = onewnc.createVariable('press', 'f8', ('press'))
     127                newvarpress[0] = level*100.
     128                ncvar.basicvardef(newvarpress, 'air_pressure', 'air pressure', 'Pa')
     129                newvarpress.setncattr('axis', 'Z')
     130                newvarpress.setncattr('_CoordinateAxisType', 'Press')
     131            if not gen.searchInlist(pressv, level*100.):
     132                pressv.append(level*100.)
     133                iz = gen.index_vec(pressv, level*100.)
     134                newvarpress[iz] = level*100.
     135            else:
     136                iz = gen.index_vec(pressv, level*100.)
     137        elif levtype == 1:
     138            if not onewnc.variables.has_key('height'):
     139                print '  we got a variable with a height value !!'
     140                heightv = []
     141                newdim = onewnc.createDimension('height', None)
     142                newvarheight = onewnc.createVariable('height', 'f8', ('height'))
     143                newvarheight[0] = level
     144                ncvar.basicvardef(newvarheight, 'height', 'height', 'm')
     145                newvarheight.setncattr('axis', 'Z')
     146                newvarheight.setncattr('_CoordinateAxisType', 'Height')
     147            if not gen.searchInlist(heightv, level):
     148                heightv.append(level)
     149                iz = gen.index_vec(heightv, level)
     150                newvarheight[iz] = level
     151            else:
     152                iz = gen.index_vec(heightv, level)
     153
     154        #print "Message :", i, values.mean(), values.shape, ':', msg[1].centuryOfReferenceTimeOfData, \
     155        #  msg[1].yearOfCentury, msg[1].month, msg[1].day, msg[1].hour, msg[1].minute, \
     156        #  msg[1].indicatorOfTypeOfLevel, msg[1].level, msg[1].localDefinitionNumber, msg[1].indicatorOfParameter, \
     157        #  msg[1].offset, msg[1].decimalScaleFactor, msg[1].timeRangeIndicator
     158        #print 'msg:', dir(msg)
     159        #for i in range(6):
     160        #    print 'msg ' + str(i) + ':', dir(msg[i])
     161
     162        varparams = grib128_ncname(varid)
     163        if i==1: print varparams
     164
     165        timeS=str((century-1)*100 + year) + str(month).zfill(2) + str(day).zfill(2)+\
     166          str(hour).zfill(2) + str(minute).zfill(2) + '00'
     167
     168        if i == 1: timevs = [timeS]
     169
     170        if not gen.searchInlist(timevs, timeS): timevs.append(timeS)
     171        it = gen.index_vec(timevs, timeS)
     172        #print 'timeS:', timeS, 'it:', it, 'lev:', level, 'iz:', iz
     173        cftime = gen.datetimeStr_conversion(timeS,'YmdHMS','cfTime,'+timeu)
     174
     175        newvartimeS[it,0:14] = timeS
     176        newvartime[it] = cftime
     177
     178        if not onewnc.variables.has_key(varparams[3]):
     179            if levtype == 1:
     180                dimns = ['time', 'height', 'lat', 'lon']
     181            elif levtype == 100:
     182                dimns = ['time', 'press', 'lat', 'lon']
     183            else:
     184                dimns = ['time', 'lat', 'lon']
     185
     186            newvar = onewnc.createVariable(varparams[3], 'f', tuple(dimns))
     187            ncvar.basicvardef(newvar, varparams[4], varparams[5], varparams[2])
     188        else:
     189            newvar = onewnc.variables[varparams[3]]
     190
     191        if dlat < 0.:
     192            values[:] = values[::-1,:]
     193
     194        if levtype == 1 or levtype == 100:
     195            newvar[it,iz,:,:] = values[:]
     196        else:
     197            newvar[it,:,:] = values[:]
     198
     199        onewnc.sync()
     200
     201# Global values
     202ncvar.add_global_PyNCplot(onewnc, 'red_grib.py', ' ', '0.1')
     203
     204onewnc.close()
     205print "Successfull writting of '" + ofile + "' !!"
Note: See TracChangeset for help on using the changeset viewer.