Changeset 719 in lmdz_wrf for trunk


Ignore:
Timestamp:
Apr 26, 2016, 4:52:53 PM (9 years ago)
Author:
lfita
Message:

Adding `CoarselonlatFindAll?': Function to search all values from a coarser version of the data

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tools/nc_var_tools.py

    r718 r719  
    1872118721    return ilatlon, mindiffLl
    1872218722
     18723def CoarselonlatFindAll(onc, ilon, ilat, longvs, latvs, per, frac, out):
     18724    """ Function to search all values from a coarser version of the data
     18725      onc= netCDF object from an existing file
     18726      ilon, ilat= original 2D matrices with the longitudes and the latitudes
     18727      lonv, latv= longitude and latitude to find
     18728      per= period (as fraction over 1) of the fractions of the original grid to use to explore
     18729      frac= frequency of points at which syncronize file with calculations
     18730      out= True/False if outcome is required
     18731      >>> npt=100
     18732      >>> lonval0 = np.arange(0.,npt*1.,1.)
     18733      >>> latval0 = np.arange(0.,npt*1.,1.)
     18734      >>> lonval = np.zeros((npt,npt), dtype=np.float)
     18735      >>> latval = np.zeros((npt,npt), dtype=np.float)
     18736      >>> lonvalues = np.arange(0.25,10.,0.25)
     18737      >>> latvalues = np.arange(0.25,10.,0.25)
     18738
     18739      >>> for i in range(npt):
     18740      >>>     lonval[:,i] = lonval0[i]
     18741      >>>     latval[i,:] = latval0[i]
     18742      >>> CoarselonlatFindAll(onewnc, lonval, latval, lovalues, latvalues, .1, 100)
     18743      (array([5, 5]), 0.35355339059327379)
     18744    """
     18745    fname = 'CoarselonlatFindAll'
     18746
     18747    dx = ilon.shape[1]
     18748    dy = ilon.shape[0]
     18749
     18750    nlon = np.min(ilon)
     18751    xlon = np.max(ilon)
     18752    nlat = np.min(ilat)
     18753    xlat = np.max(ilat)
     18754
     18755    Nallpts = len(longvs)
     18756
     18757    fracx = int(dx*per)
     18758    fracy = int(dy*per)
     18759
     18760    fraclon = ilon[::fracy,::fracx]
     18761    fraclat = ilat[::fracy,::fracx]
     18762    fracdx = fraclon.shape[1]
     18763    fracdy = fraclon.shape[0]
     18764
     18765#    print 'fraclon _______'
     18766#    print fraclon
     18767
     18768#    print 'fraclat _______'
     18769#    print fraclat
     18770
     18771    if out:
     18772        ilatlon = np.zeros((2,Nallpts), dtype=int)
     18773        mindiffLl = np.zeros((Nallpts), dtype=np.float)
     18774
     18775    for iv in range(Nallpts):
     18776        lonv = longvs[iv]
     18777        latv = latvs[iv]
     18778
     18779        if lonv < nlon or lonv > xlon:
     18780            print errormsg
     18781            print '  ' + fname + ': longitude outside data range!!'
     18782            print '    given value:', lonv,'outside [',nlon,',',xlon,']'
     18783            quit(-1)
     18784        if latv < nlat or latv > xlat:
     18785            print errormsg
     18786            print '  ' + fname + ': latitude outside data range!!'
     18787            print '    given value:', latv,'outside [',nlat,',',xlat,']'
     18788            quit(-1)
     18789
     18790# Fraction point
     18791        difffraclonlat = np.sqrt((fraclon-lonv)**2. + (fraclat-latv)**2.)
     18792        mindifffracLl = np.min(difffraclonlat)
     18793        ilatlonfrac = index_mat(difffraclonlat, mindifffracLl)
     18794
     18795#    print 'mindifffracLl:', mindifffracLl, 'ilatlonfrac:', ilatlonfrac
     18796#    print 'frac lon, lat:', fraclon[ilatlonfrac[0],ilatlonfrac[1]], ',',             \
     18797#      fraclat[ilatlonfrac[0],ilatlonfrac[1]]
     18798#    print 'values lon, lat:', lonv, latv
     18799     
     18800# Providing fraction range
     18801        if fraclon[ilatlonfrac[0],ilatlonfrac[1]] >= lonv and                        \
     18802          fraclat[ilatlonfrac[0],ilatlonfrac[1]] >= latv:
     18803#            ifracbeg = [ilatlonfrac[0]-1, ilatlonfrac[1]-1]
     18804#            ifracend = [ilatlonfrac[0], ilatlonfrac[1]]
     18805            if ilatlonfrac[0] > 0:
     18806                iybeg = (ilatlonfrac[0]-1)*fracy
     18807                iyend = ilatlonfrac[0]*fracy+1
     18808            else:
     18809                iybeg = 0
     18810                iyend = fracy+1
     18811            if ilatlonfrac[1] > 0:
     18812                ixbeg = (ilatlonfrac[1]-1)*fracx
     18813                ixend = ilatlonfrac[1]*fracx+1
     18814            else:
     18815                ixbeg = 0
     18816                ixend = fracx+1
     18817        elif fraclon[ilatlonfrac[0],ilatlonfrac[1]] < lonv and                       \
     18818          fraclat[ilatlonfrac[0],ilatlonfrac[1]] >= latv:
     18819#            ifracbeg = [ilatlonfrac[0]-1, ilatlonfrac[1]]
     18820#            ifracend = [ilatlonfrac[0], ilatlonfrac[1]+1]
     18821            if ilatlonfrac[0] > 0:
     18822                iybeg = (ilatlonfrac[0]-1)*fracy
     18823                iyend = ilatlonfrac[0]*fracy+1
     18824            else:
     18825                iybeg = 0
     18826                iyend = fracy+1
     18827            if ilatlonfrac[1] < fracdx:
     18828                if ilatlonfrac[1] != 0:
     18829                    ixbeg = (ilatlonfrac[1]-1)*fracx
     18830                    ixend = ilatlonfrac[1]*fracx+1
     18831                else:
     18832                    ixbeg = 0
     18833                    ixend = fracx+1
     18834            else:
     18835                ixbeg = fracdx*fracx
     18836                ixend = dx+1
     18837        elif fraclon[ilatlonfrac[0],ilatlonfrac[1]] < lonv and                       \
     18838          fraclat[ilatlonfrac[0],ilatlonfrac[1]] < latv:
     18839#            ifracbeg = [ilatlonfrac[0], ilatlonfrac[1]]
     18840#            ifracend = [ilatlonfrac[0]+1, ilatlonfrac[1]+1]
     18841            if ilatlonfrac[0] < fracdy:
     18842                if ilatlonfrac[0] != 0:
     18843                    iybeg = (ilatlonfrac[0]-1)*fracy
     18844                    iyend = ilatlonfrac[0]*fracy+1
     18845                else:
     18846                    iybeg = 0
     18847                    iyend = fracy+1
     18848            else:
     18849                iybeg = fracdy*fracy
     18850                iyend = dy+1
     18851            if ilatlonfrac[1] < fracdx:
     18852                if ilatlonfrac[1] != 0:
     18853                    ixbeg = (ilatlonfrac[1]-1)*fracx
     18854                    ixend = ilatlonfrac[1]*fracx+1
     18855                else:
     18856                    ixbeg = 0
     18857                    ixend = fracx+1
     18858            else:
     18859                ixbeg = fracdx*fracx
     18860                ixend = dx+1
     18861        elif fraclon[ilatlonfrac[0],ilatlonfrac[1]] >= lonv and                      \
     18862          fraclat[ilatlonfrac[0],ilatlonfrac[1]] < latv:
     18863#            ifracbeg = [ilatlonfrac[0], ilatlonfrac[1]-1]
     18864#            ifracend = [ilatlonfrac[0]+1, ilatlonfrac[1]]
     18865            if ilatlonfrac[0] < fracdy:
     18866                if ilatlonfrac[0] != 0:
     18867                    iybeg = (ilatlonfrac[0]-1)*fracy
     18868                    iyend = ilatlonfrac[0]*fracy+1
     18869                else:
     18870                    iybeg = 0
     18871                    iyend = fracy+1
     18872            else:
     18873                iybeg = fracdy*fracy
     18874                iyend = dy+1
     18875            if ilatlonfrac[1] > 0:
     18876                ixbeg = (ilatlonfrac[1]-1)*fracx
     18877                ixend = ilatlonfrac[1]*fracx+1
     18878            else:
     18879                ixbeg = 0
     18880                ixend = fracx+1
     18881   
     18882#        ibeg = [iybeg, ixbeg]
     18883#        iend = [iyend, ixend]
     18884#        print 'find window; beginning', ibeg, 'end:', iend
     18885        lon = ilon[iybeg:iyend,ixbeg:ixend]
     18886        lat = ilat[iybeg:iyend,ixbeg:ixend]
     18887   
     18888#        print 'lon _______'
     18889#        print lon
     18890#        print 'lat _______'
     18891#        print lat
     18892   
     18893# Find point
     18894        difflonlat = np.sqrt((lon-lonv)**2. + (lat-latv)**2.)
     18895        if out:
     18896            mindiffLl[iv] = np.min(difflonlat)
     18897            ilatlon[:,iv] = index_mat(difflonlat, mindiffLl)
     18898            ilatlon[0,iv] = ilatlon[0,iv] + iybeg
     18899            ilatlon[1,iv] = ilatlon[1,iv] + ixbeg
     18900        else:
     18901            mindiffLl = np.min(difflonlat)
     18902            ilatlon = index_mat(difflonlat, mindiffLl)
     18903            ilatlon[0] = ilatlon[0] + iybeg
     18904            ilatlon[1] = ilatlon[1] + ixbeg
     18905
     18906#        print 'mindiffLl:', mindiffLl, 'ilatlon:', ilatlon
     18907#        print 'lon, lat:', lon[ilatlon[0],ilatlon[1]], ',', lat[ilatlon[0],ilatlon[1]]
     18908#        quit()
     18909
     18910        if mindiffLl == 0. and type(newvar[ilatlon[0],ilatlon[1]]) == type(amsk):
     18911            percendone(iv,Ninpts,0.5,'done:')
     18912            if mindiffLl > mindiff:
     18913                print errormsg
     18914                print '  ' + fname + ': for point #', iv,'lon,lat in ' +             \
     18915                  'incomplet map:', lonvs[iv], ',', latvs[iv], 'there is ' +         \
     18916                  'not a set of lon,lat in the completed map closer than: ',         \
     18917                  mindiff, '!!'
     18918                print '    minimum difference:', mindiffLl
     18919                quit(-1)
     18920
     18921            if ilatlon[0] >= 0 and ilatlon[1] >= 0:
     18922                newvar[ilatlon[0],ilatlon[1]] = ovar[iv]
     18923                newvarin[ilatlon[0],ilatlon[1]] = iv
     18924                newvarinpt[iv] = 1
     18925                newvarindiff[iv] = mindiffLl
     18926#                print 'Lluis iv:', newvarin[ilatlon[0],ilatlon[1]],                  \
     18927#                  'localized:', newvarinpt[iv], 'values:',                           \
     18928#                  newvar[ilatlon[0],ilatlon[1]], 'invalues:', ovar[iv],              \
     18929#                  'mindist:', newvarindiff[iv], 'point:',ilatlon   
     18930            else:
     18931                print errormsg
     18932                print '  ' + fname + ': point iv:', iv, 'at', lonvs[iv], ',',        \
     18933                  latvs[iv],' not relocated !!'
     18934                print '    mindiffl:', mindiffLl, 'ilon:', ilatlon[1],               \
     18935                  'ilatlon:', ilatlon[1]
     18936                quit(-1)
     18937
     18938            if np.mod(iv,fracs) == 0:
     18939                onc.sync()
     18940    if out:
     18941        return ilatlon, mindiffLl
     18942    else:
     18943        return
     18944
    1872318945def lonlatFind(ilon, ilat, lonv, latv):
    1872418946    """ Function to search a given value from a lon, lat 2D data
     
    1905019272    print '  ' + fname + ': from:', Ninpts,'re-locating:',Nptsf,'points...'
    1905119273    if kind == 'Goode':
    19052         for iv0 in range(Nptsf):
    19053             iv = mapoints[ptsf[iv0]]
    19054             if newvarinpt[iv] == 0:
    19055 
    19056 #                difflonlat = np.sqrt((projlon-lonvs[iv])**2. + (projlat-latvs[iv])**2.)
    19057 #                mindiffLl = np.min(difflonlat)
    19058 #                ilatlon = index_mat(difflonlat, mindiffLl)
    19059                 ilatlon, mindiffLl = CoarselonlatFind(projlon,projlat,lonvs[iv],latvs[iv],fracd)
    19060 
    19061 #                if ilatlon[0] != ilatlon2[0] or ilatlon[1] != ilatlon2[1]:
    19062 #                    print ilatlon, '<', ilatlon2
    19063 #                    print 'diff:', mindiffLl, '<', mindiffLl2
    19064 #                    quit(-1)
    19065 
    19066 #                if mindiffLl != 0. or type(newvar[ilatlon[0],ilatlon[1]]) != type(amsk):
    19067 #                    print errormsg
    19068 #                    if mindiffLl !=0.:
    19069 #                        print '  ' + main + ': no zero', newvarindiff[iv], 'distance!!'
     19274        empty = CoarselonlatFind(newnc,projlon,projlat,lonvs[ptfs],latvs[ptfs],fracd,fracs,False)
     19275
     19276#        for iv0 in range(Nptsf):
     19277#            iv = mapoints[ptsf[iv0]]
     19278#            if newvarinpt[iv] == 0:
     19279
     19280##                difflonlat = np.sqrt((projlon-lonvs[iv])**2. + (projlat-latvs[iv])**2.)
     19281##                mindiffLl = np.min(difflonlat)
     19282##                ilatlon = index_mat(difflonlat, mindiffLl)
     19283#                ilatlon, mindiffLl = CoarselonlatFind(projlon,projlat,lonvs[iv],latvs[iv],fracd)
     19284
     19285##                if ilatlon[0] != ilatlon2[0] or ilatlon[1] != ilatlon2[1]:
     19286##                    print ilatlon, '<', ilatlon2
     19287##                    print 'diff:', mindiffLl, '<', mindiffLl2
     19288##                    quit(-1)
     19289
     19290##                if mindiffLl != 0. or type(newvar[ilatlon[0],ilatlon[1]]) != type(amsk):
     19291##                    print errormsg
     19292##                    if mindiffLl !=0.:
     19293##                        print '  ' + main + ': no zero', newvarindiff[iv], 'distance!!'
     19294##                    else:
     19295##                        print '  ' + main+': point',projlon[ilatlon[0],ilatlon[1]],  \
     19296##                          ',', projlat[ilatlon[0],ilatlon[1]], 'already filled!!'
     19297##                        print '    value:',newvar[ilatlon[0],ilatlon[1]],'distance:',\
     19298##                          newvarindiff[iv]
     19299##
     19300###                    print '   iv:', iv, 'lon:', lonvs[iv],'lat:',latvs[iv]
     19301###                    print '   mindiffLl:',mindiffLl,'ilatlon:',ilatlon
     19302###                    quit(-1)
     19303###            print '  Lluis; ' + fname + ' iv:', iv, 'lon:', lonvs[iv],'lat:',latvs[iv]
     19304###            print '  Lluis; ' + fname + ' mindiffLl:',mindiffLl,'ilatlon:',ilatlon
     19305###            print '  Lluis; ' + fname + ' A found lon:',projlon[ilatlon[0], ilatlon[1]], 'lat:', projlat[ilatlon[0], ilatlon[1]]
     19306###            quit()
     19307##                else:
     19308#                if mindiffLl == 0. and type(newvar[ilatlon[0],ilatlon[1]]) == type(amsk):
     19309#                    percendone(iv,Ninpts,0.5,'done:')
     19310#                    if mindiffLl > mindiff:
     19311#                        print errormsg
     19312#                        print '  ' + fname + ': for point #', iv,'lon,lat in ' +     \
     19313#                          'incomplet map:', lonvs[iv], ',', latvs[iv], 'there is ' + \
     19314#                          'not a set of lon,lat in the completed map closer than: ', \
     19315#                          mindiff, '!!'
     19316#                        print '    minimum difference:', mindiffLl
     19317#                        quit(-1)
     19318
     19319#                    if ilatlon[0] >= 0 and ilatlon[1] >= 0:
     19320#                        newvar[ilatlon[0],ilatlon[1]] = ovar[iv]
     19321#                        newvarin[ilatlon[0],ilatlon[1]] = iv
     19322#                        newvarinpt[iv] = 1
     19323#                        newvarindiff[iv] = mindiffLl
     19324##                        print 'Lluis iv:', newvarin[ilatlon[0],ilatlon[1]],          \
     19325##                          'localized:', newvarinpt[iv], 'values:',                   \
     19326##                          newvar[ilatlon[0],ilatlon[1]], 'invalues:', ovar[iv],      \
     19327##                          'mindist:', newvarindiff[iv], 'point:',ilatlon   
    1907019328#                    else:
    19071 #                        print '  ' + main+': point',projlon[ilatlon[0],ilatlon[1]],  \
    19072 #                          ',', projlat[ilatlon[0],ilatlon[1]], 'already filled!!'
    19073 #                        print '    value:',newvar[ilatlon[0],ilatlon[1]],'distance:',\
    19074 #                          newvarindiff[iv]
    19075 #
    19076 ##                    print '   iv:', iv, 'lon:', lonvs[iv],'lat:',latvs[iv]
    19077 ##                    print '   mindiffLl:',mindiffLl,'ilatlon:',ilatlon
     19329#                        print errormsg
     19330#                        print '  ' + fname + ': point iv:', iv, 'at', lonvs[iv], ',',\
     19331#                          latvs[iv],' not relocated !!'
     19332#                        print '    mindiffl:', mindiffLl, 'ilon:', ilatlon[1],       \
     19333#                          'ilatlon:', ilatlon[1]
     19334#                        quit(-1)
     19335
     19336#                if np.mod(iv,1000) == 0:
     19337#                    newnc.sync()
     19338##                    print '  ' + fname + 'values localized:', newvar[:].compressed()
     19339##                if iv > 10:
     19340##                    newnc.sync()
     19341##                    newnc.close()
    1907819342##                    quit(-1)
    19079 ##            print '  Lluis; ' + fname + ' iv:', iv, 'lon:', lonvs[iv],'lat:',latvs[iv]
    19080 ##            print '  Lluis; ' + fname + ' mindiffLl:',mindiffLl,'ilatlon:',ilatlon
    19081 ##            print '  Lluis; ' + fname + ' A found lon:',projlon[ilatlon[0], ilatlon[1]], 'lat:', projlat[ilatlon[0], ilatlon[1]]
    19082 ##            quit()
    19083 #                else:
    19084                 if mindiffLl == 0. and type(newvar[ilatlon[0],ilatlon[1]]) == type(amsk):
    19085                     percendone(iv,Ninpts,0.5,'done:')
    19086                     if mindiffLl > mindiff:
    19087                         print errormsg
    19088                         print '  ' + fname + ': for point #', iv,'lon,lat in ' +     \
    19089                           'incomplet map:', lonvs[iv], ',', latvs[iv], 'there is ' + \
    19090                           'not a set of lon,lat in the completed map closer than: ', \
    19091                           mindiff, '!!'
    19092                         print '    minimum difference:', mindiffLl
    19093                         quit(-1)
    19094 
    19095                     if ilatlon[0] >= 0 and ilatlon[1] >= 0:
    19096                         newvar[ilatlon[0],ilatlon[1]] = ovar[iv]
    19097                         newvarin[ilatlon[0],ilatlon[1]] = iv
    19098                         newvarinpt[iv] = 1
    19099                         newvarindiff[iv] = mindiffLl
    19100 #                        print 'Lluis iv:', newvarin[ilatlon[0],ilatlon[1]],          \
    19101 #                          'localized:', newvarinpt[iv], 'values:',                   \
    19102 #                          newvar[ilatlon[0],ilatlon[1]], 'invalues:', ovar[iv],      \
    19103 #                          'mindist:', newvarindiff[iv], 'point:',ilatlon   
    19104                     else:
    19105                         print errormsg
    19106                         print '  ' + fname + ': point iv:', iv, 'at', lonvs[iv], ',',\
    19107                           latvs[iv],' not relocated !!'
    19108                         print '    mindiffl:', mindiffLl, 'ilon:', ilatlon[1],       \
    19109                           'ilatlon:', ilatlon[1]
    19110                         quit(-1)
    19111 
    19112                 if np.mod(iv,1000) == 0:
    19113                     newnc.sync()
    19114 #                    print '  ' + fname + 'values localized:', newvar[:].compressed()
    19115 #                if iv > 10:
    19116 #                    newnc.sync()
    19117 #                    newnc.close()
    19118 #                    quit(-1)
    1911919343
    1912019344    elif kind == 'lonlat':
Note: See TracChangeset for help on using the changeset viewer.