- Timestamp:
- Apr 26, 2016, 4:52:53 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/tools/nc_var_tools.py
r718 r719 18721 18721 return ilatlon, mindiffLl 18722 18722 18723 def 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 18723 18945 def lonlatFind(ilon, ilat, lonv, latv): 18724 18946 """ Function to search a given value from a lon, lat 2D data … … 19050 19272 print ' ' + fname + ': from:', Ninpts,'re-locating:',Nptsf,'points...' 19051 19273 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 19070 19328 # 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() 19078 19342 ## quit(-1) 19079 ## print ' Lluis; ' + fname + ' iv:', iv, 'lon:', lonvs[iv],'lat:',latvs[iv]19080 ## print ' Lluis; ' + fname + ' mindiffLl:',mindiffLl,'ilatlon:',ilatlon19081 ## 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 errormsg19088 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:', mindiffLl19093 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]] = iv19098 newvarinpt[iv] = 119099 newvarindiff[iv] = mindiffLl19100 # 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:',ilatlon19104 else:19105 print errormsg19106 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)19119 19343 19120 19344 elif kind == 'lonlat':
Note: See TracChangeset
for help on using the changeset viewer.