Changeset 1853 in lmdz_wrf for trunk


Ignore:
Timestamp:
Mar 25, 2018, 4:53:59 PM (7 years ago)
Author:
lfita
Message:

Working version with projection information

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tools/nc_var_tools.py

    r1849 r1853  
    994994    attrvalue = value of the attribute
    995995    atrtrkind = kind of attribute: 'S', string ('!' as spaces); 'U', unicode ('!' as spaces); 'I', integer;
    996       'Inp32', numpy integer 32; 'R', real; ' npfloat', np.float; 'D', np.float64
     996      'Inp32', numpy integer 32; 'R', ot 'F' real; ' npfloat', np.float; 'D', np.float64
    997997    """
    998998    fname = 'set_attributek'
    999999    validk = {'S': 'string', 'U': 'unicode', 'I': 'integer',                         \
    1000       'Inp32': 'integer long (np.int32)', 'R': 'float', 'npfloat': 'np.float',       \
    1001       'D': 'float long (np.float64)'}
     1000      'Inp32': 'integer long (np.int32)', 'F': 'float', 'R': 'float',                \
     1001      'npfloat': 'np.float', 'D': 'float long (np.float64)'}
    10021002
    10031003    if type(attrkind) == type('s'):
     
    10081008        elif attrkind == 'I':
    10091009            attrvalue = np.int(attrval)
    1010         elif attrkind == 'R':
     1010        elif attrkind == 'R' or attrkind == 'F' :
    10111011            attrvalue = float(attrval)
    10121012        elif attrkind == 'npfloat':
     
    2272222722             (...) (specific projection attributes and values)
    2272322723             [name] [value] [kind] ('I': integer, 'R': float, 'D': double float, 'S': string)
     22724             Add three more attributes for the resolution of the projection:
     22725               x_resolution [value] (resolution along x-axis)
     22726               y_resoltuion [value] (resolution along y-axis)
     22727               proj_units [value] (units of the resoltion of the projection)
    2272422728        ncfile= netCDF file to use
    2272522729        variable= ',' list of variables to CF transform ('all' for all variables). A separated file will be created
     
    2278722791
    2278822792    pattr = {}
     22793    ppn = []
    2278922794    opinff = open(projfilen, 'r')
    2279022795    for line in opinff:
     
    2280022805                quit(-1)
    2280122806            pattr[linevals[0]] = [linevals[1].replace('!',' '), linevals[2]]
     22807            ppn.append(linevals[0])
    2280222808    opinff.close()
     22809    print '  ' + fname + ": values for projection '" + gattr['grid'] + "' _______"
     22810    for iatn in ppn:
     22811        pattrv = pattr[iatn]
     22812        print  iatn + ': ', gen.typemod(pattrv[0], pattrv[1])
    2280322813
    2280422814    # Getting variables to process
     
    2291622926            quit(-1)
    2291722927        if CFdimvalues['length'] == -1: CFdimvalues['length'] = None
    22918         CFdimvals[axn] = CFdimvalues
    22919         filedimvals[axn] = axsiv[:]
    22920         CFaxisvardimvals[axn] = CFvardimvalues
    2292122928
    2292222929        # Some extra axis-stuff...
     
    2293122938                tunits = urefvals
    2293222939                tcal = 'standard'
     22940            if gattr['calendar'] == '[unknown]':  gattr['calendar']= tcal
     22941            CFdimvalues['units'] = tunits
     22942           
    2293322943            Sinit = gen.datetimeStr_conversion(str(CFitime), 'cfTime,'+tunits,       \
    2293422944              'Y-m-dTH:M:SZ')
     
    2297022980                Sfreq = gattr['frequency']
    2297122981
     22982        CFdimvals[axn] = CFdimvalues
     22983        filedimvals[axn] = axsiv[:]
     22984        CFaxisvardimvals[axn] = CFvardimvalues
     22985
    2297222986    # Renaming dimensions for 2D lon,lat variable-dimensions
    2297322987    if len(filedimvals['X'].shape) == 2 or len(filedimvals['Y'].shape) == 2:
     
    2297522989        print '    because Xvals have rank 2:', filedimvals['X'].shape,              \
    2297622990          'renaming lon,lat dimensions to x,y'
     22991        addCFdimvals = {}
    2297722992        axv = CFdimvals['X']
    2297822993        axv['dimn'] = 'x'
     22994        axv['vdimn'] = 'lon'
    2297922995        CFdimvals['X'] = axv
     22996        addCFdimvals['x'] = {'dimn': 'x', 'vdimn': 'x',
     22997          'stdn': 'projection_x_coordinate','longname': 'x coordinate of projection',\
     22998          'units': pattr['proj_units'][0], 'maxrank': 1,                             \
     22999          'length': filedimvals['X'].shape[1]}
     23000        Xres = np.float(pattr['x_resolution'][0])
     23001        filedimvals['x'] = np.arange((filedimvals['X'].shape[1]),dtype=np.float)*Xres
    2298023002        axv = CFdimvals['Y']
    2298123003        axv['dimn'] = 'y'
     23004        axv['vdimn'] = 'lat'
    2298223005        CFdimvals['Y'] = axv
     23006        addCFdimvals['y'] = {'dimn': 'y', 'vdimn': 'y',
     23007          'stdn': 'projection_y_coordinate','longname': 'y coordinate of projection',\
     23008          'units': pattr['proj_units'][0], 'maxrank': 1,                             \
     23009          'length': filedimvals['X'].shape[0]}
     23010        Yres = np.float(pattr['y_resolution'][0])
     23011        filedimvals['y'] = np.arange((filedimvals['X'].shape[0]),dtype=np.float)*Yres
    2298323012        #axiv = axisinf['X']
    2298423013        #filecfdimn[axiv[0]] = 'x'
     
    2307623105        for axn in varaxes:
    2307723106            dvals = CFdimvals[axn]
    23078             if not gen.searchInlist(onewnc.variables.keys(), dvals['dimn']):
    23079                 newvar = onewnc.createVariable(dvals['dimn'], 'f8',                  \
    23080                   tuple(CFaxisvardimvals[axn]))
    23081                 basicvardef(newvar, dvals['stdn'], dvals['longname'], dvals['units'])
    23082                 for ivn in dvals.keys():
    23083                     if ivn != 'dimn' and ivn != 'stdn' and ivn != 'longname' and     \
    23084                       ivn != 'units' and ivn != 'maxrank' and ivn != 'length':
    23085                         set_attribute(newvar,ivn,dvals[ivn])
     23107            if dvals['dimn'] == dvals['vdimn']:
     23108                if not gen.searchInlist(onewnc.variables.keys(), dvals['dimn']):
     23109                    newvar = onewnc.createVariable(dvals['dimn'], 'f8',              \
     23110                      tuple(CFaxisvardimvals[axn]))
     23111                    basicvardef(newvar, dvals['stdn'], dvals['longname'],            \
     23112                      dvals['units'])
     23113                    newvar[:] = filedimvals[axn]
     23114                    for ivn in dvals.keys():
     23115                        if ivn != 'dimn' and ivn != 'stdn' and ivn != 'longname' and \
     23116                          ivn != 'units' and ivn != 'maxrank' and ivn != 'length':
     23117                            set_attribute(newvar,ivn,dvals[ivn])
     23118            else:
     23119                # Dimensions with a different name for the variable dimension
     23120                if not gen.searchInlist(onewnc.variables.keys(), dvals['dimn']):
     23121                    ddvals = addCFdimvals[dvals['dimn']]
     23122                    newvar = onewnc.createVariable(dvals['dimn'], 'f8',              \
     23123                      tuple(dvals['dimn']))
     23124                    basicvardef(newvar, ddvals['stdn'], ddvals['longname'],          \
     23125                      ddvals['units'])
     23126                    newvar[:] = filedimvals[dvals['dimn']]
     23127                if not gen.searchInlist(onewnc.variables.keys(), dvals['vdimn']):
     23128                    newvar = onewnc.createVariable(dvals['vdimn'], 'f4',             \
     23129                      tuple(CFaxisvardimvals[axn]))
     23130                    basicvardef(newvar, dvals['stdn'], dvals['longname'],            \
     23131                      dvals['units'])
     23132                    newvar[:] = filedimvals[axn]
     23133                    for ivn in dvals.keys():
     23134                        if ivn != 'dimn' and ivn != 'stdn' and ivn != 'longname' and \
     23135                          ivn != 'units' and ivn != 'maxrank' and ivn != 'length':
     23136                            set_attribute(newvar,ivn,dvals[ivn])
    2308623137
    2308723138        # Variable
     
    2309323144              fill_value=gen.fillValueF)
    2309423145            basicvardef(newvar, stdvarn, longvarn, utsvarn)
    23095             set_attribute(newvar, 'coordinates', ' '.join(CFvardims))
     23146
     23147            # Providing the right coordinates
     23148            coorv = []
     23149            for cdn in CFvardims:
     23150                if cdn == 'x': coorv.append('lon')
     23151                elif cdn == 'y': coorv.append('lat')
     23152                else: coorv.append(cdn)
     23153            set_attribute(newvar, 'coordinates', ' '.join(coorv))
     23154
    2309623155            # Setting values, but taking into account pre-existing masked values
    2309723156            varv = ovar[:]
     
    2310123160 
    2310223161            newvar[:] = varv[:]
    23103         onewnc.sync()
     23162            set_attribute(newvar, 'grid_mapping', gattr['grid'])
     23163            onewnc.sync()
     23164
     23165        # Adding projection variable
     23166        print infmsg
     23167        print '  '+fname+": adding projection information of '" + gattr['grid'] + "'"
     23168        newvar = onewnc.createVariable(gattr['grid'], 'i')
     23169        for attrn in ppn:
     23170            pvattr = pattr[attrn]
     23171            set_attributek(newvar, attrn, pvattr[0], pvattr[1])
     23172            onewnc.sync()
    2310423173
    2310523174        # Global attributes
Note: See TracChangeset for help on using the changeset viewer.