Changeset 458 in lmdz_wrf for trunk/tools
- Timestamp:
- Jun 5, 2015, 3:10:26 PM (10 years ago)
- Location:
- trunk/tools
- Files:
-
- 1 added
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/tools/nc_var_tools.py
r447 r458 14864 14864 return tB 14865 14865 14866 def wdismean(pos,val4): 14867 """ Function to compute the mean value weighted to its 4 distances 14868 pos= x,y position within the 'square' 14869 val4= values at the four vertexs (2,2) 14870 >>>position = [0.005,0.005] 14871 >>>val4 = np.zeros((2,2), dtype=np.float) 14872 >>>val4 = np.arange(4).reshape(2,2) 14873 0.035707955234 14874 """ 14875 fname = 'wdismean' 14876 14877 dist = np.zeros((2,2), dtype=np.float) 14878 dist[0,0] = np.sqrt(pos[0]*pos[0]+pos[1]*pos[1]) 14879 dist[0,1] = np.sqrt(pos[0]*pos[0]+(1.-pos[1])*(1.-pos[1])) 14880 dist[1,0] = np.sqrt((1.-pos[0])*(1.-pos[0])+pos[1]*pos[1]) 14881 dist[1,1] = np.sqrt((1.-pos[0])*(1.-pos[0])+(1.-pos[1])*(1.-pos[1])) 14882 14883 if np.min(dist) == 0.: 14884 pos0 = index_mat(dist, 0.) 14885 dist[:,:] = 0. 14886 posmean = val4[pos0[0], pos0[1]] 14887 else: 14888 totdist = np.sum(1./dist) 14889 posmean = np.sum(val4.flatten()/dist.flatten())/totdist 14890 14891 return posmean 14892 14893 def radial_points(angle,dist): 14894 """ Function to provide a number of grid point positions for a given angle 14895 angle= desired angle (rad) 14896 dist= number of grid points 14897 >>> radial_points(0.5*np.pi,5) 14898 [[ 6.12323400e-17 1.00000000e+00] 14899 [ 1.22464680e-16 2.00000000e+00] 14900 [ 1.83697020e-16 3.00000000e+00] 14901 [ 2.44929360e-16 4.00000000e+00] 14902 [ 3.06161700e-16 5.00000000e+00]] 14903 """ 14904 fname = 'radial_points' 14905 radpos = np.zeros((dist,2), dtype=np.float) 14906 14907 for ip in range(dist): 14908 radpos[ip,0] = (ip+1.)*np.cos(angle) 14909 radpos[ip,1] = (ip+1.)*np.sin(angle) 14910 14911 return radpos 14912 14913 def compute_tevolboxtraj_radialsec(values, ncfile, varn): 14914 """ Function to compute tevolboxtraj_radialsec: temporal evolution at a given point along 14915 a number of radii at a given frequency following a trajectory 14916 values= [trajfile]@[Tbeg],[lonname],[latname],[zname],[timename],[timekind],[Nangle],[radii] 14917 [trajfile]: ASCII file with the trajectory ('#' not readed) 14918 [time] [xpoint] [ypoint] 14919 [Tbeg]: equivalent first time-step of the trajectory within the netCDF file 14920 [lonname],[latname],[zname],[timename]: longitude, latitude, z and time variables names 14921 [timekind]: kind of time 14922 'cf': cf-compilant 14923 'wrf': WRF kind 14924 [Nangle]: Number of angles 14925 [radii]: length in grtid points of the angle 14926 ncfile= netCDF file to use 14927 varn= ',' list of variables' name ('all', for all variables) 14928 """ 14929 import numpy.ma as ma 14930 import subprocess as sub 14931 14932 fname='compute_tevolboxtraj_radialsec' 14933 14934 if values == 'h': 14935 print fname + '_____________________________________________________________' 14936 print compute_tevolboxtraj_radialsec.__doc__ 14937 quit() 14938 14939 arguments = '[trajfile]@[Tbeg],[lonname],[latname],[zname],[timename],' + \ 14940 '[timekind],[Nangle],[radii]]' 14941 check_arguments(fname,len(arguments.split(',')),arguments,',',8) 14942 14943 trajfile = values.split(',')[0].split('@')[0] 14944 Tbeg = int(values.split(',')[0].split('@')[1]) 14945 lonn = values.split(',')[1] 14946 latn = values.split(',')[2] 14947 zn = values.split(',')[3] 14948 timn = values.split(',')[4] 14949 timekind = values.split(',')[5] 14950 Nangle = int(values.split(',')[6]) 14951 radii = int(values.split(',')[7]) 14952 14953 if not os.path.isfile(ncfile): 14954 print errormsg 14955 print ' ' + fname + " netCDF file: '" + ncfile + "' does not exist !!" 14956 quit(-1) 14957 14958 if not os.path.isfile(trajfile): 14959 print errormsg 14960 print ' ' + fname + " trajectory file: '" + trajfile + "' does not exist !!" 14961 quit(-1) 14962 14963 objfile = NetCDFFile(ncfile, 'r') 14964 lonobj = objfile.variables[lonn] 14965 latobj = objfile.variables[latn] 14966 timobj = objfile.variables[timn] 14967 14968 if varn.find(',') != -1: 14969 varns = varn.split(',') 14970 else: 14971 if varn == 'all': 14972 varns = objfile.variables 14973 else: 14974 varns = [varn] 14975 14976 lonv, latv = lonlat2D(lonobj[:],latobj[:]) 14977 14978 dimx = lonv.shape[1] 14979 dimy = lonv.shape[0] 14980 14981 timv = timobj[:] 14982 14983 # Selecting accordingly a trajectory 14984 ## 14985 Ttraj = file_nlines(trajfile,'#') 14986 if timekind == 'wrf': 14987 dimt = objfile.variables[timn].shape[0] 14988 else: 14989 dimt = objfile.variables[timn].shape 14990 14991 if Tbeg + Ttraj > dimt: 14992 print errormsg 14993 print ' ' + fname + ': trajectory has ', Ttraj, ' time steps and starts ' + \ 14994 ' at',Tbeg,' and data',varobj.shape[0], '" !!!!!' 14995 quit(-1) 14996 14997 print ' ' + fname + ': Number of time-steps in trajectory file: ',Ttraj 14998 14999 trajobj = open(trajfile,'r') 15000 15001 # Trajectory values/slices 15002 ## 15003 iline = 0 15004 it = 0 15005 15006 xrangeslice = [] 15007 yrangeslice = [] 15008 xrangeslice2D = [] 15009 yrangeslice2D = [] 15010 15011 cslicev = [] 15012 cslice2D = [] 15013 cslicevnoT = [] 15014 15015 gtrajvals = np.zeros((Ttraj,3), dtype=int) 15016 trajvals = np.zeros((Ttraj,3), dtype=np.float) 15017 15018 trajpos = np.zeros(Ttraj,Nangle,raddi) 15019 15020 it = 0 15021 iline = 0 15022 for line in trajobj: 15023 15024 ## Skipping first line 15025 ## if not iline == 0: 15026 ## it = iline - 1 15027 ## it = iline 15028 15029 # Slicing brings to reduce 1 time-step.... ??? 15030 if line[0:1] != '#': 15031 gtrajvals[it,0] = Tbeg + iline 15032 gtrajvals[it,1] = int(line.split(' ')[1]) 15033 gtrajvals[it,2] = int(line.split(' ')[2]) 15034 # print it,'t:',gtrajvals[it,0],'x y:', gtrajvals[it,1], gtrajvals[it,2] 15035 15036 if timekind == 'wrf': 15037 gdate = datetimeStr_conversion(timv[gtrajvals[it,0]],'WRFdatetime', \ 15038 'matYmdHMS') 15039 trajvals[it,0] = realdatetime1_CFcompilant(gdate, '19491201000000', \ 15040 'hours') 15041 tunits = 'hours since 1949-12-01 00:00:00' 15042 elif timekind == 'cf': 15043 trajvals[it,0] = timv[gtrajvals[it,0]] 15044 tunits = timobj.getncattr('units') 15045 else: 15046 print errormsg 15047 print ' ' + fname + ' time kind: "' + timekind + '" not ready !!' 15048 quit(-1) 15049 15050 trajvals[it,1] = lonv[gtrajvals[it,2],gtrajvals[it,1]] 15051 trajvals[it,2] = latv[gtrajvals[it,2],gtrajvals[it,1]] 15052 15053 # print iline, it,'time:',trajvals[it,0],'lon lat:', trajvals[it,1], \ 15054 # trajvals[it,2] 15055 15056 # Assuming time as the first dimension in a fortran like way (t=0 as 1) 15057 # trajcut[0] = tstept - 1 15058 # Assuming time as the first dimension in a C/python like way (t=0) 15059 15060 varvalst = np.ones((Nangle, radii), dtype=np.float)*fillValue 15061 posangle = np.zeros((radii,2), dtype=np.float) 15062 15063 # Angle loop 15064 for ia in range(Nangle): 15065 angle = 2.*np.pi*ia/Nangle 15066 15067 # Points at that given angle 15068 pangle = radial_points(angle,radii) 15069 posangle[:,0] = pangle[:,0] + trajvals[it,1] 15070 posangle[:,1] = pangle[:,1] + trajvals[it,2] 15071 15072 for ip in range(radii): 15073 iipos = int(posangle[ip,0]) 15074 jjpos = int(posangle[ip,1]) 15075 15076 # Creation of a matrix with all the grid points at each time-step 15077 if iipos >= 0 and iipos < dimx and jjpos >= 0 and jjpos < dimy: 15078 print 'Hola' 15079 quit() 15080 # varvalst[ia,ip] = 15081 15082 15083 if gtrajvals[it,2]-radii < 0: 15084 yinit = 0 15085 yinit2D = radii - gtrajvals[it,2] 15086 else: 15087 yinit = gtrajvals[it,2]-radii 15088 yinit2D = 0 15089 15090 if gtrajvals[it,2]+radii + 1 > dimy + 1: 15091 yend = dimy + 1 15092 yend2D = dimy + 1 - gtrajvals[it,2] + radii 15093 else: 15094 yend = gtrajvals[it,2]+radii + 1 15095 yend2D = radi 15096 15097 if gtrajvals[it,1]-box2 < 0: 15098 xinit = 0 15099 xinit2D = box2 - gtrajvals[it,1] 15100 else: 15101 xinit = gtrajvals[it,1]-box2 15102 xinit2D = 0 15103 15104 if gtrajvals[it,1]+box2 + 1 > dimx + 1: 15105 xend = dimx + 1 15106 xend2D = dimx + 1 - gtrajvals[it,1] - box2 15107 else: 15108 xend = gtrajvals[it,1]+box2 + 1 15109 xend2D = boxs 15110 15111 yrangeslice.append([yinit, yend]) 15112 xrangeslice.append([xinit, xend]) 15113 yrangeslice2D.append([yinit2D, yend2D]) 15114 xrangeslice2D.append([xinit2D, xend2D]) 15115 else: 15116 yrangeslice.append([gtrajvals[it,2]-box2, gtrajvals[it,2]+box2 + 1]) 15117 xrangeslice.append([gtrajvals[it,1]-box2, gtrajvals[it,1]+box2 + 1]) 15118 yrangeslice2D.append([gtrajvals[it,2]-box2, gtrajvals[it,2]+box2 + 1]) 15119 xrangeslice2D.append([gtrajvals[it,1]-box2, gtrajvals[it,1]+box2 + 1]) 15120 15121 # circle values 15122 circdist[it,:,:] = radius_dist(dimy,dimx,gtrajvals[it,2],gtrajvals[it,1]) 15123 15124 if gtrajvals[it,2]-Nrad < 0 or gtrajvals[it,2]+Nrad + 1 > dimy + 1 \ 15125 or gtrajvals[it,1]-Nrad < 0 or gtrajvals[it,1]+Nrad + 1 > dimx + 1: 15126 15127 if gtrajvals[it,2]-Nrad < 0: 15128 yinit = 0 15129 yinit2D = Nrad - gtrajvals[it,2] 15130 else: 15131 yinit = gtrajvals[it,2]-Nrad 15132 yinit2D = 0 15133 15134 if gtrajvals[it,2]+Nrad + 1 > dimy + 1: 15135 yend = dimy + 1 15136 yend2D = dimy + 1 - gtrajvals[it,2] + Nrad 15137 else: 15138 yend = gtrajvals[it,2]+Nrad + 1 15139 yend2D = 2*Nrad+1 15140 15141 if gtrajvals[it,1]-Nrad < 0: 15142 xinit = 0 15143 xinit2D = Nrad - gtrajvals[it,1] 15144 else: 15145 xinit = gtrajvals[it,1]-Nrad 15146 xinit2D = 0 15147 15148 if gtrajvals[it,1]+Nrad + 1 > dimx + 1: 15149 xend = dimx + 1 15150 xend2D = dimx + 1 - gtrajvals[it,1] - Nrad 15151 else: 15152 xend = gtrajvals[it,1]+Nrad + 1 15153 xend2D = 2*Nrad+1 15154 15155 cyrangeslice.append([yinit, yend]) 15156 cxrangeslice.append([xinit, xend]) 15157 cyrangeslice2D.append([yinit2D, yend2D]) 15158 cxrangeslice2D.append([xinit2D, xend2D]) 15159 else: 15160 cyrangeslice.append([gtrajvals[it,2]-Nrad, gtrajvals[it,2]+Nrad + 1]) 15161 cxrangeslice.append([gtrajvals[it,1]-Nrad, gtrajvals[it,1]+Nrad + 1]) 15162 cyrangeslice2D.append([gtrajvals[it,2]-Nrad, gtrajvals[it,2]+Nrad+1]) 15163 cxrangeslice2D.append([gtrajvals[it,1]-Nrad, gtrajvals[it,1]+Nrad+1]) 15164 it = it + 1 15165 iline = iline + 1 15166 15167 trajobj.close() 15168 # Creation of the netCDF file 15169 ## 15170 if varn.find(',') != -1: 15171 varnS = 'multi-var' 15172 else: 15173 varnS = varn.replace(',','-') 15174 15175 ofile = 'tevolboxtraj_' + varnS + '.nc' 15176 objofile = NetCDFFile(ofile, 'w') 15177 15178 # Dimensions 15179 newdim = objofile.createDimension('x', boxs) 15180 newdim = objofile.createDimension('y', boxs) 15181 newdim = objofile.createDimension('xr', Nrad*2+1) 15182 newdim = objofile.createDimension('yr', Nrad*2+1) 15183 newdim = objofile.createDimension('time', None) 15184 15185 stsn = ['min', 'max', 'mean', 'mean2', 'stdev', 'ac'] 15186 vstlname = ['minimum value within', 'maximum value within', 'mean value within', \ 15187 'squared mean value within', 'standard deviation value within', \ 15188 'accumulated value within'] 15189 Nsts = len(stsn) 15190 statnames = [] 15191 cstatnames = [] 15192 for i in range(Nsts): 15193 statnames.append(stsn[i] + 'box') 15194 cstatnames.append(stsn[i] + 'circle') 15195 15196 # Getting values 15197 ## 15198 ivar = 0 15199 15200 for vn in varns: 15201 vnst = variables_values(vn)[0] 15202 if not searchInlist(objfile.variables, vn): 15203 print errormsg 15204 print ' ' + fname + ": variable name '" + vn + "' is not in file " + \ 15205 ncfile + '" !!!!!' 15206 quit(-1) 15207 15208 varobj = objfile.variables[vn] 15209 Nvardims = len(varobj.shape) 15210 15211 print ' ' + fname + ": getting '" + vn + "' ... .. ." 15212 15213 slicev = [] 15214 slice2D = [] 15215 slicevnoT = [] 15216 cslicev = [] 15217 cslice2D = [] 15218 cslicevnoT = [] 15219 15220 if Nvardims == 4: 15221 # Too optimistic, but at this stage... 15222 if not objofile.dimensions.has_key('z'): 15223 varzobj = objfile.variables[zn] 15224 if len(varzobj.shape) == 1: 15225 dimz = varzobj.shape 15226 zvals = varzobj[:] 15227 elif len(varzobj.shape) == 2: 15228 dimz = varzobj.shape[1] 15229 zvals = varzobj[0,:] 15230 elif len(varzobj.shape) == 3: 15231 dimz = varzobj.shape[2] 15232 zvals = varzobj[0,0,:] 15233 15234 objofile.createDimension('z', dimz) 15235 newvar = objofile.createVariable(zn, 'f4', ('z'),fill_value=fillValue) 15236 if searchInlist(varzobj.ncattrs(),'standard_name'): 15237 vsname = varzobj.getncattr('standard_name') 15238 else: 15239 vsname = variables_values(zn)[1] 15240 if searchInlist(varzobj.ncattrs(),'long_name'): 15241 vlname = varzobj.getncattr('long_name') 15242 else: 15243 vlname = variables_values(zn)[4].replace('|',' ') 15244 if searchInlist(varzobj.ncattrs(),'units'): 15245 vunits = varzobj.getncattr('units') 15246 else: 15247 vunits = variables_values(zn)[5].replace('|',' ') 15248 15249 newattr = basicvardef(newvar, vsname, vlname, vunits) 15250 newvar[:] = zvals 15251 15252 varvals = np.ones(tuple([Ttraj,dimz,boxs,boxs]), dtype=np.float) 15253 lonvals = np.ones(tuple([Ttraj,dimz,boxs,boxs]), dtype=np.float) 15254 latvals = np.ones(tuple([Ttraj,boxs,boxs]), dtype=np.float) 15255 rvarvals = np.ones(tuple([Ttraj,dimz,Nrad*2+1,Nrad*2+1]), dtype=np.float) 15256 rlonvals = np.ones(tuple([Ttraj,dimz,Nrad*2+1,Nrad*2+1]), dtype=np.float) 15257 rlatvals = np.ones(tuple([Ttraj,dimz,Nrad*2+1,Nrad*2+1]), dtype=np.float) 15258 15259 # One dimension plus for the values at the center of the trajectory 15260 statvarvals = np.ones(tuple([Ttraj,dimz,Nsts+1]), dtype=np.float) 15261 rstatvarvals = np.ones(tuple([Ttraj,dimz,Nsts+1]), dtype=np.float) 15262 15263 for it in range(Ttraj): 15264 it0 = Tbeg + it 15265 15266 slicev = [] 15267 slice2D = [] 15268 slicevnoT = [] 15269 cslicev = [] 15270 cslice2D = [] 15271 cslice2Dhor = [] 15272 cslicevnoT = [] 15273 cslicevnoThor = [] 15274 15275 slicev.append(gtrajvals[it,0]) 15276 if gtrajvals[it,2]-box2 < 0 or gtrajvals[it,2]+box2 + 1 > dimy + 1 \ 15277 or gtrajvals[it,1]-box2 < 0 or gtrajvals[it,1]+box2 + 1 > dimx +1: 15278 # box values 15279 slicev.append(slice(0,dimz)) 15280 slicev.append(slice(yrangeslice[it][0],yrangeslice[it][1])) 15281 slicev.append(slice(xrangeslice[it][0],xrangeslice[it][1])) 15282 15283 slicevnoT.append(slice(0,dimz)) 15284 slicevnoT.append(slice(yrangeslice[it][0],yrangeslice[it][1])) 15285 slicevnoT.append(slice(xrangeslice[it][0],xrangeslice[it][1])) 15286 15287 slice2D.append(slice(0,dimz)) 15288 slice2D.append(slice(0,yrangeslice[it][1]-yrangeslice[it][0])) 15289 slice2D.append(slice(0,xrangeslice[it][1]-xrangeslice[it][0])) 15290 15291 rvarvalst = np.ones((dimz, Nrad*2+1, Nrad*2+1),dtype=np.float)* \ 15292 fillValue 15293 15294 varvalst[tuple(slice2D)] = varobj[tuple(slicev)] 15295 varvals[it,:,:,:] = varvalst 15296 15297 # box stats values 15298 maskedvals = ma.masked_values (varvalst, fillValue) 15299 maskedvals2 = maskedvals*maskedvals 15300 for iz in range(dimz): 15301 statvarvals[it,iz,0] = varvalst[iz,box2,box2] 15302 statvarvals[it,iz,1] = np.min(varvalst[iz,:,:]) 15303 statvarvals[it,iz,2] = np.max(varvalst[iz,:,:]) 15304 statvarvals[it,iz,3] = np.mean(varvalst[iz,:,:]) 15305 statvarvals[it,iz,4] = maskedvals2[iz,:,:].mean() 15306 statvarvals[it,iz,5] = np.sqrt(statvarvals[it,iz,4] - \ 15307 statvarvals[it,iz,3]*statvarvals[it,iz,3]) 15308 statvarvals[it,iz,6] = np.sum(varvalst[iz,:,:]) 15309 15310 else: 15311 slicev.append(slice(0,dimz)) 15312 slicev.append(slice(gtrajvals[it,2]-box2, gtrajvals[it,2]+box2+1)) 15313 slicev.append(slice(gtrajvals[it,1]-box2, gtrajvals[it,1]+box2+1)) 15314 slicevnoT.append(slice(0,dimz)) 15315 slicevnoT.append(slice(gtrajvals[it,2]-box2, gtrajvals[it,2]+ \ 15316 box2+1)) 15317 slicevnoT.append(slice(gtrajvals[it,1]-box2, gtrajvals[it,1]+ \ 15318 box2+1)) 15319 slice2D.append(slice(0,dimz)) 15320 slice2D.append(slice(gtrajvals[it,2]-box2, gtrajvals[it,2] + \ 15321 box2 + 1)) 15322 slice2D.append(slice(gtrajvals[it,1]-box2, gtrajvals[it,1] + \ 15323 box2 + 1)) 15324 15325 varvalst = varobj[tuple(slicev)] 15326 # box values 15327 15328 varvals[it,:,:,:] = varvalst 15329 # print 'values at time t______' 15330 # print varvalst 15331 15332 # box stats values 15333 for iz in range(dimz): 15334 statvarvals[it,:,0] = varvalst[:,box2,box2] 15335 statvarvals[it,iz,1] = np.min(varvalst[iz,:,:]) 15336 statvarvals[it,iz,2] = np.max(varvalst[iz,:,:]) 15337 statvarvals[it,iz,3] = np.mean(varvalst[iz,:,:]) 15338 statvarvals[it,iz,4] = np.mean(varvalst[iz,:,:]* \ 15339 varvalst[iz,:,:]) 15340 statvarvals[it,iz,5] = np.sqrt(statvarvals[it,iz,4] - \ 15341 statvarvals[it,iz,3]*statvarvals[it,iz,3]) 15342 statvarvals[it,iz,6] = np.sum(varvalst[iz,:,:]) 15343 15344 # Circle values 15345 cslicev.append(gtrajvals[it,0]) 15346 if gtrajvals[it,2]-Nrad < 0 or gtrajvals[it,2]+Nrad + 1 >= dimy \ 15347 or gtrajvals[it,1]-Nrad < 0 or gtrajvals[it,1]+Nrad + 1 >= dimx: 15348 15349 maxx = np.min([cxrangeslice[it][1], dimx]) 15350 maxy = np.min([cyrangeslice[it][1], dimy]) 15351 cslicev.append(slice(0,dimz)) 15352 cslicev.append(slice(cyrangeslice[it][0], maxy)) 15353 cslicev.append(slice(cxrangeslice[it][0], maxx)) 15354 15355 cslicevnoT.append(slice(0,dimz)) 15356 cslicevnoT.append(slice(cyrangeslice[it][0], cyrangeslice[it][1])) 15357 cslicevnoT.append(slice(cxrangeslice[it][0], cxrangeslice[it][1])) 15358 15359 cslice2D.append(slice(0,dimz)) 15360 cslice2D.append(slice(0,maxy-cyrangeslice[it][0])) 15361 cslice2D.append(slice(0,maxx-cxrangeslice[it][0])) 15362 cslice2Dhor.append(slice(0, maxy - cyrangeslice[it][0])) 15363 cslice2Dhor.append(slice(0, maxx -cxrangeslice[it][0])) 15364 15365 rvarvalst = np.ones((dimz,Nrad*2+1,Nrad*2+1),dtype=np.float)* \ 15366 fillValue 15367 rvarvalst[tuple(cslice2D)] = varobj[tuple(cslicev)] 15368 for iz in range(dimz): 15369 tslice = [slice(it,it)]+cslice2Dhor 15370 zslice = [slice(iz,iz)]+cslice2Dhor 15371 rvarvalst[tuple(zslice)] = np.where(circdist[tuple(tslice)] > \ 15372 np.float(Nrad), fillValue, rvarvalst[tuple(zslice)]) 15373 15374 rvarvals[it,:,:,:] = rvarvalst 15375 15376 # circle stats values 15377 maskedvals = ma.masked_values (rvarvalst, fillValue) 15378 maskedvals2 = maskedvals*maskedvals 15379 for iz in range(dimz): 15380 rstatvarvals[it,iz,0] = varvalst[iz,box2,box2] 15381 rstatvarvals[it,iz,1] = np.min(varvalst[iz,:,:]) 15382 rstatvarvals[it,iz,2] = np.max(varvalst[iz,:,:]) 15383 rstatvarvals[it,iz,3] = np.mean(varvalst[iz,:,:]) 15384 rstatvarvals[it,iz,4] = maskedvals2[iz,:,:].mean() 15385 rstatvarvals[it,iz,5] = np.sqrt(rstatvarvals[it,iz,4] - \ 15386 rstatvarvals[it,iz,3]*rstatvarvals[it,iz,3]) 15387 rstatvarvals[it,iz,6] = np.sum(varvalst[iz,:,:]) 15388 15389 else: 15390 cslicev.append(slice(0,dimz)) 15391 cslicev.append(slice(gtrajvals[it,2]-Nrad,gtrajvals[it,2]+Nrad+1)) 15392 cslicev.append(slice(gtrajvals[it,1]-Nrad,gtrajvals[it,1]+Nrad+1)) 15393 cslicevnoT.append(slice(0,dimz)) 15394 cslicevnoT.append(slice(gtrajvals[it,2]-Nrad, gtrajvals[it,2]+ \ 15395 Nrad+1)) 15396 cslicevnoT.append(slice(gtrajvals[it,1]-Nrad, gtrajvals[it,1]+ \ 15397 Nrad+1)) 15398 cslicevnoThor.append(slice(gtrajvals[it,2]-Nrad, \ 15399 gtrajvals[it,2] + Nrad+1)) 15400 cslicevnoThor.append(slice(gtrajvals[it,1]-Nrad, \ 15401 gtrajvals[it,1] + Nrad+1)) 15402 cslice2D.append(slice(0,dimz)) 15403 cslice2D.append(slice(gtrajvals[it,2]-Nrad,gtrajvals[it,2] + \ 15404 Nrad+1)) 15405 cslice2D.append(slice(gtrajvals[it,1]-Nrad,gtrajvals[it,1] + \ 15406 Nrad+1)) 15407 15408 rvarvalst = varobj[tuple(cslicev)] 15409 # circle values 15410 for iz in range(dimz): 15411 tslice = [it]+cslicevnoThor 15412 rvarvalst[iz,:,:] = np.where(circdist[tuple(tslice)] > \ 15413 np.float(Nrad), fillValue, rvarvalst[iz,:,:]) 15414 15415 rvarvals[it,:,:,:] = rvarvalst 15416 15417 # circle stats values 15418 maskedvals = ma.masked_values (rvarvalst, fillValue) 15419 maskedvals2 = maskedvals*maskedvals 15420 for iz in range(dimz): 15421 rstatvarvals[it,iz,0] = rvarvalst[iz,Nrad,Nrad] 15422 rstatvarvals[it,iz,1] = maskedvals[iz,:,:].min() 15423 rstatvarvals[it,iz,2] = maskedvals[iz,:,:].max() 15424 rstatvarvals[it,iz,3] = maskedvals[iz,:,:].mean() 15425 rstatvarvals[it,iz,4] = maskedvals2[iz,:,:].mean() 15426 rstatvarvals[it,iz,5] = np.sqrt(rstatvarvals[it,iz,4] - \ 15427 rstatvarvals[it,iz,3]*rstatvarvals[it,iz,3]) 15428 rstatvarvals[it,iz,6] = maskedvals[iz,:,:].sum() 15429 15430 # print 'statistics:',rstatvarvals[it,:] 15431 15432 # variable box values 15433 newvar = objofile.createVariable(vnst + 'box', 'f4', ('time','z','y','x'),\ 15434 fill_value=fillValue) 15435 if searchInlist(varobj.ncattrs(),'standard_name'): 15436 vsname = varobj.getncattr('standard_name') 15437 else: 15438 vsname = variables_values(vn)[1] 15439 if searchInlist(varobj.ncattrs(),'long_name'): 15440 vlname = varobj.getncattr('long_name') 15441 else: 15442 vlname = variables_values(vn)[4].replace('|',' ') 15443 if searchInlist(varobj.ncattrs(),'units'): 15444 vunits = varobj.getncattr('units') 15445 else: 15446 vunits = variables_values(vn)[5].replace('|',' ') 15447 15448 newattr = basicvardef(newvar, vsname, vlname, vunits) 15449 newattr = newvar.setncattr('projection','lon lat') 15450 newvar[:] = varvals 15451 15452 # center of the trajectory 15453 newvar = objofile.createVariable('trj_' + vnst, 'f', ('time','z'), \ 15454 fill_value=fillValue) 15455 newattr = basicvardef(newvar, 'trj_' + vsname, 'value along the ' + \ 15456 'trajectory of '+ vn, vunits) 15457 newvar[:] = statvarvals[:,:,0] 15458 15459 # variable box statistics 15460 ist = 0 15461 for statn in statnames: 15462 newvar = objofile.createVariable(statn + '_' + vnst,'f',('time','z'),\ 15463 fill_value=fillValue) 15464 newattr = basicvardef(newvar, statn + '_' + vsname, vstlname[ist] + \ 15465 ' the box ('+str(boxs)+'x'+str(boxs)+') of ' + vnst, vunits) 15466 newvar[:] = statvarvals[:,:,ist+1] 15467 # newattr = set_attributek(newvar,'_FillValue',fillValue,'npfloat') 15468 ist = ist + 1 15469 15470 # variable circle values 15471 newvar = objofile.createVariable(vnst + 'circle','f4',('time','z','yr', \ 15472 'xr'), fill_value=fillValue) 15473 if searchInlist(varobj.ncattrs(),'standard_name'): 15474 vsname = varobj.getncattr('standard_name') 15475 else: 15476 vsname = variables_values(vn)[1] 15477 if searchInlist(varobj.ncattrs(),'long_name'): 15478 vlname = varobj.getncattr('long_name') 15479 else: 15480 vlname = variables_values(vn)[4].replace('|',' ') 15481 if searchInlist(varobj.ncattrs(),'units'): 15482 vunits = varobj.getncattr('units') 15483 else: 15484 vunits = variables_values(vn)[5].replace('|',' ') 15485 15486 newattr = basicvardef(newvar, vsname, vlname, vunits) 15487 newattr = newvar.setncattr('projection','lon lat') 15488 newvar[:] = rvarvals 15489 15490 # variable circle statistics 15491 ist = 0 15492 for statn in cstatnames: 15493 newvar = objofile.createVariable(statn + '_' + vnst,'f',('time','z'),\ 15494 fill_value=fillValue) 15495 newattr = basicvardef(newvar, statn + '_' + vsname, vstlname[ist] + \ 15496 ' the circle of radius ('+ str(circler)+') of ' + vnst, vunits) 15497 newvar[:] = rstatvarvals[:,:,ist+1] 15498 # newattr = set_attributek(newvar,'_FillValue',fillValue,'npfloat') 15499 ist = ist + 1 15500 15501 elif Nvardims == 3: 15502 # Too optimistic, but at this stage... 15503 dimt = varobj.shape[0] 15504 15505 varvals = np.ones(tuple([Ttraj,boxs,boxs]), dtype=np.float) 15506 lonvals = np.ones(tuple([Ttraj,boxs,boxs]), dtype=np.float) 15507 latvals = np.ones(tuple([Ttraj,boxs,boxs]), dtype=np.float) 15508 rvarvals = np.ones(tuple([Ttraj,Nrad*2+1,Nrad*2+1]), dtype=np.float) 15509 rlonvals = np.ones(tuple([Ttraj,Nrad*2+1,Nrad*2+1]), dtype=np.float) 15510 rlatvals = np.ones(tuple([Ttraj,Nrad*2+1,Nrad*2+1]), dtype=np.float) 15511 15512 # One dimension plus for the values at the center of the trajectory 15513 statvarvals = np.ones(tuple([Ttraj,Nsts+1]), dtype=np.float) 15514 rstatvarvals = np.ones(tuple([Ttraj,Nsts+1]), dtype=np.float) 15515 15516 for it in range(Ttraj): 15517 it0 = Tbeg + it 15518 15519 slicev = [] 15520 slice2D = [] 15521 slicevnoT = [] 15522 cslicev = [] 15523 cslice2D = [] 15524 cslicevnoT = [] 15525 cslicevC = [] 15526 15527 slicev.append(gtrajvals[it,0]) 15528 if gtrajvals[it,2]-box2 < 0 or gtrajvals[it,2]+box2 + 1 > dimy + 1 \ 15529 or gtrajvals[it,1]-box2 < 0 or gtrajvals[it,1]+box2 + 1 > dimx + 1: 15530 # box values 15531 slicev.append(slice(yrangeslice[it][0],yrangeslice[it][1])) 15532 slicev.append(slice(xrangeslice[it][0],xrangeslice[it][1])) 15533 15534 slicevnoT.append(slice(yrangeslice[it][0],yrangeslice[it][1])) 15535 slicevnoT.append(slice(xrangeslice[it][0],xrangeslice[it][1])) 15536 15537 slice2D.append(slice(0,yrangeslice[it][1]-yrangeslice[it][0])) 15538 slice2D.append(slice(0,xrangeslice[it][1]-xrangeslice[it][0])) 15539 15540 rvarvalst = np.ones((Nrad*2+1, Nrad*2+1),dtype=np.float)*fillValue 15541 15542 varvalst[tuple(slice2D)] = varobj[tuple(slicev)] 15543 varvals[it,:,:] = varvalst 15544 15545 # box stats values 15546 maskedvals = ma.masked_values (varvalst, fillValue) 15547 statvarvals[it,0] = varvalst[box2,box2] 15548 statvarvals[it,1] = maskedvals.min() 15549 statvarvals[it,2] = maskedvals.max() 15550 statvarvals[it,3] = maskedvals.mean() 15551 maskedvals2 = maskedvals*maskedvals 15552 statvarvals[it,4] = maskedvals2.mean() 15553 statvarvals[it,5] = np.sqrt(statvarvals[it,4] - \ 15554 statvarvals[it,3]*statvarvals[it,3]) 15555 statvarvals[it,6] = maskedvals.sum() 15556 15557 varvalst[tuple(slice2D)] = lonv[tuple(slicevnoT)] 15558 lonvals[it,:,:] = varvalst 15559 varvalst[tuple(slice2D)] = latv[tuple(slicevnoT)] 15560 latvals[it,:,:] = varvalst 15561 15562 else: 15563 slicev.append(slice(gtrajvals[it,2]-box2, gtrajvals[it,2]+box2+1)) 15564 slicev.append(slice(gtrajvals[it,1]-box2, gtrajvals[it,1]+box2+1)) 15565 slicevnoT.append(slice(gtrajvals[it,2]-box2, gtrajvals[it,2]+ \ 15566 box2+1)) 15567 slicevnoT.append(slice(gtrajvals[it,1]-box2, gtrajvals[it,1]+ \ 15568 box2+1)) 15569 15570 slice2D.append(slice(gtrajvals[it,2]-box2, gtrajvals[it,2]+box2 +\ 15571 1)) 15572 slice2D.append(slice(gtrajvals[it,1]-box2, gtrajvals[it,1]+box2 +\ 15573 1)) 15574 15575 varvalst = varobj[tuple(slicev)] 15576 # box values 15577 15578 varvals[it,:,:] = varvalst 15579 # print 'values at time t______' 15580 # print varvalst 15581 15582 # box stats values 15583 statvarvals[it,0] = varvalst[box2,box2] 15584 statvarvals[it,1] = np.min(varvalst) 15585 statvarvals[it,2] = np.max(varvalst) 15586 statvarvals[it,3] = np.mean(varvalst) 15587 statvarvals[it,4] = np.mean(varvalst*varvalst) 15588 statvarvals[it,5] = np.sqrt(statvarvals[it,4] - \ 15589 statvarvals[it,3]*statvarvals[it,3]) 15590 statvarvals[it,6] = np.sum(varvalst) 15591 15592 varvalst = lonv[tuple(slicevnoT)] 15593 lonvals[it,:,:] = varvalst 15594 varvalst = latv[tuple(slicevnoT)] 15595 latvals[it,:,:] = varvalst 15596 15597 # Circle values 15598 cslicev.append(gtrajvals[it,0]) 15599 if gtrajvals[it,2]-Nrad < 0 or gtrajvals[it,2]+Nrad + 1 >= dimy \ 15600 or gtrajvals[it,1]-Nrad < 0 or gtrajvals[it,1]+Nrad + 1 >= dimx: 15601 maxx = np.min([cxrangeslice[it][1], dimx]) 15602 maxy = np.min([cyrangeslice[it][1], dimy]) 15603 cslicev.append(slice(cyrangeslice[it][0],maxy)) 15604 cslicev.append(slice(cxrangeslice[it][0],maxx)) 15605 15606 cslicevnoT.append(slice(cyrangeslice[it][0],cyrangeslice[it][1])) 15607 cslicevnoT.append(slice(cxrangeslice[it][0],cxrangeslice[it][1])) 15608 15609 cslice2D.append(slice(0,maxy - cyrangeslice[it][0])) 15610 cslice2D.append(slice(0,maxx - cxrangeslice[it][0])) 15611 15612 rvarvalst = np.ones((Nrad*2+1,Nrad*2+1),dtype=np.float)*fillValue 15613 rvarvalst[tuple(cslice2D)] = varobj[tuple(cslicev)] 15614 rvarvalst[tuple(cslice2D)] = np.where(circdist[tuple(cslicev)] >\ 15615 np.float(Nrad), fillValue, rvarvalst[tuple(cslice2D)]) 15616 15617 rvarvals[it,:,:] = rvarvalst 15618 15619 # circle stats values 15620 maskedvals = ma.masked_values (rvarvalst, fillValue) 15621 rstatvarvals[it,0] = rvarvalst[Nrad,Nrad] 15622 rstatvarvals[it,1] = maskedvals.min() 15623 rstatvarvals[it,2] = maskedvals.max() 15624 rstatvarvals[it,3] = maskedvals.mean() 15625 maskedvals2 = maskedvals*maskedvals 15626 rstatvarvals[it,4] = maskedvals2.mean() 15627 rstatvarvals[it,5] = np.sqrt(rstatvarvals[it,4] - \ 15628 rstatvarvals[it,3]*rstatvarvals[it,3]) 15629 rstatvarvals[it,6] = maskedvals2.sum() 15630 15631 else: 15632 cslicev.append(slice(gtrajvals[it,2]-Nrad,gtrajvals[it,2]+Nrad+1)) 15633 cslicev.append(slice(gtrajvals[it,1]-Nrad,gtrajvals[it,1]+Nrad+1)) 15634 cslicevnoT.append(slice(gtrajvals[it,2]-Nrad, gtrajvals[it,2]+ \ 15635 Nrad+1)) 15636 cslicevnoT.append(slice(gtrajvals[it,1]-Nrad, gtrajvals[it,1]+ \ 15637 Nrad+1)) 15638 15639 cslice2D.append(slice(gtrajvals[it,2]-Nrad,gtrajvals[it,2]+Nrad+1)) 15640 cslice2D.append(slice(gtrajvals[it,1]-Nrad,gtrajvals[it,1]+Nrad+1)) 15641 15642 cslicevC.append(it) 15643 cslicevC.append(slice(gtrajvals[it,2]-Nrad,gtrajvals[it,2]+Nrad+1)) 15644 cslicevC.append(slice(gtrajvals[it,1]-Nrad,gtrajvals[it,1]+Nrad+1)) 15645 15646 rvarvalst = varobj[tuple(cslicev)] 15647 cdist = circdist[tuple(cslicevC)] 15648 # circle values 15649 rvarvalst = np.where(cdist > np.float(Nrad),fillValue,rvarvalst) 15650 rvarvals[it,:,:] = rvarvalst 15651 15652 # circle stats values 15653 maskedvals = ma.masked_values (rvarvalst, fillValue) 15654 rstatvarvals[it,0] = rvarvalst[Nrad,Nrad] 15655 rstatvarvals[it,1] = maskedvals.min() 15656 rstatvarvals[it,2] = maskedvals.max() 15657 rstatvarvals[it,3] = maskedvals.mean() 15658 maskedvals2 = maskedvals*maskedvals 15659 rstatvarvals[it,4] = maskedvals2.mean() 15660 rstatvarvals[it,5] = np.sqrt(rstatvarvals[it,4] - \ 15661 rstatvarvals[it,3]*rstatvarvals[it,3]) 15662 rstatvarvals[it,6] = maskedvals.sum() 15663 15664 # print 'statistics:',rstatvarvals[it,:] 15665 15666 # variable box values 15667 newvar = objofile.createVariable(vnst + 'box', 'f4', ('time', 'y', 'x'), \ 15668 fill_value=fillValue) 15669 if searchInlist(varobj.ncattrs(),'standard_name'): 15670 vsname = varobj.getncattr('standard_name') 15671 else: 15672 vsname = variables_values(vn)[1] 15673 if searchInlist(varobj.ncattrs(),'long_name'): 15674 vlname = varobj.getncattr('long_name') 15675 else: 15676 vlname = variables_values(vn)[4].replace('|',' ') 15677 if searchInlist(varobj.ncattrs(),'units'): 15678 vunits = varobj.getncattr('units') 15679 else: 15680 vunits = variables_values(vn)[5].replace('|',' ') 15681 15682 newattr = basicvardef(newvar, vsname, vlname, vunits) 15683 newattr = newvar.setncattr('projection','lon lat') 15684 newvar[:] = varvals 15685 15686 # center of the trajectory 15687 newvar = objofile.createVariable('trj_' + vnst, 'f', ('time'), \ 15688 fill_value=fillValue) 15689 newattr = basicvardef(newvar, 'trj_' + vsname, 'value along the ' + \ 15690 'trajectory of '+ vnst, vunits) 15691 newvar[:] = statvarvals[:,0] 15692 15693 # variable box statistics 15694 ist = 0 15695 for statn in statnames: 15696 newvar = objofile.createVariable(statn + '_' + vnst, 'f', ('time'), \ 15697 fill_value=fillValue) 15698 newattr = basicvardef(newvar, statn + '_' + vsname, vstlname[ist] + \ 15699 ' the box ('+str(boxs)+'x'+str(boxs)+') of ' + vnst, vunits) 15700 newvar[:] = statvarvals[:,ist+1] 15701 # newattr = set_attributek(newvar,'_FillValue',fillValue,'npfloat') 15702 ist = ist + 1 15703 15704 # variable circle values 15705 newvar = objofile.createVariable(vnst + 'circle','f4',('time','yr','xr'),\ 15706 fill_value=fillValue) 15707 if searchInlist(varobj.ncattrs(),'standard_name'): 15708 vsname = varobj.getncattr('standard_name') 15709 else: 15710 vsname = variables_values(vn)[1] 15711 if searchInlist(varobj.ncattrs(),'long_name'): 15712 vlname = varobj.getncattr('long_name') 15713 else: 15714 vlname = variables_values(vn)[4].replace('|',' ') 15715 if searchInlist(varobj.ncattrs(),'units'): 15716 vunits = varobj.getncattr('units') 15717 else: 15718 vunits = variables_values(vn)[5].replace('|',' ') 15719 15720 newattr = basicvardef(newvar, vsname, vlname, vunits) 15721 newattr = newvar.setncattr('projection','lon lat') 15722 newvar[:] = rvarvals 15723 15724 # variable circle statistics 15725 ist = 0 15726 for statn in cstatnames: 15727 newvar = objofile.createVariable(statn + '_' + vnst, 'f', ('time'), \ 15728 fill_value=fillValue) 15729 newattr = basicvardef(newvar, statn + '_' + vsname, vstlname[ist] + \ 15730 ' the circle of radius ('+ str(circler)+') of ' + vnst, vunits) 15731 newvar[:] = rstatvarvals[:,ist+1] 15732 # newattr = set_attributek(newvar,'_FillValue',fillValue,'npfloat') 15733 ist = ist + 1 15734 else: 15735 # Other variables 15736 print warnmsg 15737 print ' ' + fname + ": variable '" + vn + "' shape:",varobj.shape,' not'\ 15738 + ' ready!!' 15739 print ' skipping variable' 15740 if len(varns) == 1: 15741 objofile.close() 15742 sub.call(['rm', ofile]) 15743 print ' uniq variable! removing file and finishing program' 15744 quit() 15745 15746 if not objofile.variables.has_key('trlon') and Nvardims == 3: 15747 # var dimensions 15748 newvar = objofile.createVariable('trlon', 'f8', ('time')) 15749 newattr = basicvardef(newvar,'trlon','trajectory longitude', \ 15750 'degrees west_east') 15751 newvar[:] = trajvals[:,1] 15752 15753 newvar = objofile.createVariable('trlat', 'f8', ('time')) 15754 newattr = basicvardef(newvar,'trlat','trajectory latitude', \ 15755 'degrees north_south') 15756 newvar[:] = trajvals[:,2] 15757 15758 newvar = objofile.createVariable('time', 'f8', ('time')) 15759 newattr = basicvardef(newvar, 'time', 'time', tunits) 15760 newvar[:] = trajvals[:,0] 15761 15762 newvar = objofile.createVariable('lon', 'f8', ('time', 'y', 'x'), \ 15763 fill_value=fillValue) 15764 newattr = basicvardef(newvar, 'longitude', 'longitude', \ 15765 'degrees west_east') 15766 newvar[:] = lonvals 15767 15768 newvar = objofile.createVariable('lat', 'f8', ('time', 'y', 'x'), \ 15769 fill_value=fillValue) 15770 newattr = basicvardef(newvar, 'latitude', 'latitude', \ 15771 'degrees north_south') 15772 newvar[:] = latvals 15773 15774 ivar = ivar + 1 15775 15776 15777 # global attributes 15778 objofile.setncattr('author', 'L. Fita') 15779 objofile.setncattr('institution', 'Laboratire de Meteorologie Dynamique') 15780 objofile.setncattr('university', 'Pierre Marie Curie - Jussieu') 15781 objofile.setncattr('center', 'Centre National de Recherches Scientifiques') 15782 objofile.setncattr('city', 'Paris') 15783 objofile.setncattr('country', 'France') 15784 objofile.setncattr('script', 'nc_var_tools.py') 15785 objofile.setncattr('function', 'compute_tevolboxtraj') 15786 objofile.setncattr('version', '1.0') 15787 objofile.setncattr('data_file',ncfile) 15788 15789 objfile.close() 15790 15791 objofile.sync() 15792 objofile.close() 15793 15794 print ' ' + fname + ': successful creation of file "' + ofile + '" !!!' 15795 15796 return 15797 14866 15798 14867 15799 #quit()
Note: See TracChangeset
for help on using the changeset viewer.