Changeset 814 in lmdz_wrf


Ignore:
Timestamp:
Jun 12, 2016, 2:12:37 PM (9 years ago)
Author:
lfita
Message:

Adding:

  • `lonlatvarsFile': Functino to CF-define the longitudes and latitudes variables within a file
  • `subbasins': Function to retrieve the subbasin (all the sub-flows untila a given lon,lat)
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tools/nc_var_tools.py

    r811 r814  
    1485214852#Partialmap_Entiremap('longitude,latitude,std,5000.,lonlat_dxdyFix', '/home/lluis/etudes/DYNAMICO/ORCHIDEE/interpolation/data/carteveg5km.nc', 'vegetation_map')
    1485314853#Partialmap_Entiremap('longitude,latitude,std,5000.,lonlat', '/home/lluis/etudes/DYNAMICO/ORCHIDEE/interpolation/data/carteveg5km.nc', 'vegetation_map')
     14854
     14855def lonlatvarsFile(lonvals,latvals,dnx,dny,oLlnc):
     14856    """ Functino to CF-define the longitudes and latitudes variables within a file
     14857      lonvals= 2D matrix with longitudes
     14858      latvals= 2D matrix with latitudes
     14859      dn[x/y]= names of the x and y dimensions
     14860      oLlnc= netCDF file object where to write the lon,lats
     14861    """
     14862    fname = 'lonlatvarsFile'
     14863
     14864    if len(lonvals.shape) != 2:
     14865        print errormsg
     14866        print '  ' + fname +': wrong shape:',lonvals.shape," of 'lons' variable, " + \
     14867          'must be 2D !!'
     14868        quit(-1)
     14869    if len(latvals.shape) != 2:
     14870        print errormsg
     14871        print '  ' + fname +': wrong shape:',latvals.shape," of 'lats' variable, " + \
     14872          'must be 2D !!'
     14873        quit(-1)
     14874    dx = lonvals.shape[1]
     14875    dy = lonvals.shape[0]
     14876
     14877    if not gen.searchInlist(oLlnc.dimensions, dnx):
     14878        print errormsg
     14879        print '  ' + fname + ': netCDF object does not have x dimension: ', dnx,"' !!"
     14880        quit(-1)
     14881    if not gen.searchInlist(oLlnc.dimensions, dny):
     14882        print errormsg
     14883        print '  ' + fname + ': netCDF object does not have y dimension: ', dny,"' !!"
     14884        quit(-1)
     14885 
     14886# Creation of dimension variables
     14887    newvar = oLlnc.createVariable('lon', 'f8', (dny,dnx))
     14888    basicvardef(newvar, 'longitude', 'Longitude','degrees_East')
     14889    newvar[:] = lonvals
     14890    newvar.setncattr('axis', 'X')
     14891    newvar.setncattr('_CoordinateAxisType', 'Lon')
     14892
     14893    newvar = oLlnc.createVariable('lat', 'f8', (dny,dnx))
     14894    basicvardef(newvar, 'latitude', 'Latitude','degrees_North')
     14895    signlat = latvals[1,0] - latvals[0,0]
     14896    newvar[:] = latvals
     14897
     14898    newvar.setncattr('axis', 'Y')
     14899    newvar.setncattr('_CoordinateAxisType', 'Lat')   
     14900   
     14901    return
     14902
     14903def subbasin(values, ncfile):
     14904    """ Function to retrieve the subbasin (all the sub-flows untila a given lon,lat)
     14905      values=[subname],[sublon],[sublat]
     14906        subname: name for the subbasin ('!' for spaces)
     14907        sub[lon/lat]: longitude and latitude of the subbasin point
     14908    """
     14909    fname = 'subbasin'
     14910   
     14911    if values == 'h':
     14912        print fname + '_____________________________________________________________'
     14913        print subbasin.__doc__
     14914        quit()
     14915
     14916    arguments = '[subnmame],[sublon],[sublat]'
     14917    gen.check_arguments(fname, values, arguments, ',')
     14918
     14919    ofile = 'subbasin.nc'
     14920
     14921    onc = NetCDFFile(ncfile, 'r')
     14922
     14923    subname = values.split(',')[0].replace('!',' ')
     14924    sublon = np.float(values.split(',')[1])
     14925    sublat = np.float(values.split(',')[2])
     14926
     14927    if ncfile == 'routing.nc':
     14928        lonname = 'nav_lon'
     14929        latname = 'nav_lat'
     14930        tripname = 'trip'
     14931    else:
     14932        print errormsg
     14933        print '  ' + fname + ": file '" + ncfile + "' not ready!!"
     14934        quit(-1)
     14935
     14936    olons = onc.variables[lonname]
     14937    olats = onc.variables[latname]
     14938    ooutflows = onc.variables[tripname]
     14939# Flipping the routing file
     14940    lons = olons[:]
     14941    lats = olats[:]
     14942    outflows = ooutflows[:]
     14943
     14944    onc.close()
     14945
     14946    difflonlat = np.sqrt((lons - sublon)**2 + (lats - sublat)**2)
     14947    mindifflonlat = np.min(difflonlat)
     14948    isub = gen.index_mat(difflonlat, mindifflonlat)
     14949    print '    ' + fname + "initial point of subbasin '" + subname + "' in the " +   \
     14950      'matrix:', isub
     14951
     14952    masksubbasin, subflows, subflowspt = gen.subbasin_point(outflows, isub)
     14953
     14954    onewnc = NetCDFFile(ofile, 'w')
     14955
     14956    dx = outflows.shape[1]
     14957    dy = outflows.shape[0]
     14958
     14959# Number of sub-flows within the sub-basin
     14960    Nsubflows = len(subflows.keys())
     14961
     14962# Maximum number of grid points of a sub-flow
     14963    Nmaxgridsubflow = -1
     14964    Ngridpoint = 0
     14965    for subflow in subflows.keys():
     14966        Ngridsubflow = len(subflows[subflow])
     14967        Ngridpoint = Ngridpoint + Ngridsubflow
     14968        if Ngridsubflow > Nmaxgridsubflow: Nmaxgridsubflow = Ngridsubflow
     14969
     14970# Creation of dimensions
     14971    Lstr = 50
     14972    newdim = onewnc.createDimension('x', dx)
     14973    newdim = onewnc.createDimension('y', dy)
     14974    newdim = onewnc.createDimension('Nsubflow', Nsubflows)
     14975    newdim = onewnc.createDimension('Lstring', Lstr)
     14976    newdim = onewnc.createDimension('Ngridsubflow', Nmaxgridsubflow)
     14977   
     14978    if ncfile == 'routing.nc':
     14979        lonlatvarsFile(lons, lats[::-1,:], 'x', 'y', onewnc)
     14980    else:
     14981        lonlatvarsFile(lons, lats, 'x', 'y', onewnc)
     14982
     14983# Creation of variables
     14984    newvar = onewnc.createVariable('subbasin', 'c', ('Lstring'))
     14985    for ic in range(len(subname)):
     14986        newvar[ic] = subname[ic:ic+1]
     14987    newattr = set_attributek(newvar,'Ngridpoint',Ngridpoint,'I')
     14988    newattr = set_attributek(newvar,'Nsubflow',Nsubflows,'I')
     14989    newattr = set_attributek(newvar,'lon',sublon,'R')
     14990    newattr = set_attributek(newvar,'lat',sublat,'R')
     14991    onewnc.sync()
     14992
     14993    newvar = onewnc.createVariable('subbasinmask','i',('y','x'))
     14994    vardef = basicvardef(newvar, 'subbasinmask', 'mask of the subbasin','1')
     14995    if ncfile == 'routing.nc':
     14996        newvar[:] = masksubbasin[::-1,:]
     14997    else:
     14998        newvar[:] = masksubbasin
     14999    newattr = set_attributek(newvar,'coordinates','lon lat','S')
     15000
     15001    onewnc.sync()
     15002
     15003    nsubflows = subflows.keys()
     15004    nsubflows.sort
     15005    newvar = onewnc.createVariable('subflow', 'c', ('Nsubflow', 'Lstring'))
     15006    vardef = basicvardef(newvar, 'subflow', 'reference of the sub-flow','-')
     15007    newvals = writing_str_nc(newvar, nsubflows, Lstr)
     15008    onewnc.sync()
     15009
     15010    newvar = onewnc.createVariable('Nsubflow', 'i', ('Nsubflow'))
     15011    basicvardef(newvar, 'Nsubflow', 'Number of grid points of the sub-flow', '-')
     15012    newvarlon = onewnc.createVariable('lonsubflow', 'f4', ('Nsubflow','Ngridsubflow'))
     15013    vardef = basicvardef(newvarlon, 'lonsubflow', 'Longitude of the grid point of '+ \
     15014      'the sub-flow','degrees_East')
     15015    newvarlat = onewnc.createVariable('latsubflow', 'f4', ('Nsubflow','Ngridsubflow'))
     15016    vardef = basicvardef(newvarlat, 'latsubflow', 'Latitude of the grid point of ' + \
     15017      'the sub-flow','degrees_North')
     15018    isub = 0
     15019    for subf in nsubflows:
     15020        grids = subflows[subf]
     15021        Ngrid = len(grids)
     15022        newvar[isub] = Ngrid
     15023        print '  ' + fname + 'Lluis; isub:', isub,'subf:',subf,'grids:',grids,'Ngrid',Ngrid
     15024        for igrid in range(Ngrid):
     15025            jigrid = subflowspt[grids[igrid]]
     15026            lonv = lons[jigrid[0],jigrid[1]]
     15027            latv = lats[jigrid[0],jigrid[1]]
     15028            newvarlon[igrid,isub] = lonv
     15029            newvarlat[igrid,isub] = latv
     15030        isub = isub + 1
     15031    onewnc.sync()
     15032    onewnc.close()
     15033
     15034    print fname + ": succesfull written of '" + ofile + "' !!"
     15035
     15036    return
     15037
    1485415038#quit()
    1485515039
     
    1487215056       'missing': as a missing value
    1487315057  addvattr, add a new attribute to any given variable: addvattr -S [attrname]|[attrvalue]
    14874   addvattrk, add a new attribute to any given variable: addvattrk -S [attrname]|[attrvalue]|[kind(S (!, white spaces),I,R,D)]
     15058  addvattrk, add a new attribute to any given variable: addvattr
     15059k -S [attrname]|[attrvalue]|[kind(S (!, white spaces),I,R,D)]
    1487515060  checkNaNs, checks for NaN values over all variables in a file
    1487615061  checkAllValues, check for variables with along all their dimensions with the same value in a file
Note: See TracChangeset for help on using the changeset viewer.