Changeset 2312 in lmdz_wrf for trunk/tools
- Timestamp:
- Feb 1, 2019, 10:24:29 PM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/tools/nc_var_tools.py
r2311 r2312 27731 27731 values=[slicevarsinf]@[dimvars]@[sliceremovedim]@[slicebndsdim]@ 27732 27732 [slicebndsvar]@[slicestatsdim] 27733 [slicevarsinf] ';' separated list of [varn1],[minvar1],[maxvar1], 27734 [slcevar1]; ...;[varnN],[minvarN],[maxvarN],[slcevarN] 27733 [slicevarsinf] ';' separated list of [varn1],[slcvar1];...;[varnN],[slcvarN] 27735 27734 varn[i]: name of the variable i 27736 minvar[i]: minimum value to start the slices for variable i 27737 maxvar[i]: maximum value to end the slices for variable i 27738 slcevar[i]: length of slices in variable i 27739 NOTE: slices will be: 27740 [minvar[i]-slicevar[i]/2., minvar[i]+slicevar[i]/2.), ..., 27741 [maxvar[i]-slicevar[i]/2., maxvar[i]+slicevar[i]/2.) 27735 slcvar[i]: characteristics of the slicing of the variable. Two options: 27736 *slcvar[i] = minvar[i], maxvar[i], slcevar[i] equi-distributed 27737 minvar[i]: minimum value to start the slices for variable i 27738 maxvar[i]: maximum value to end the slices for variable i 27739 slcevar[i]: length of slices in variable i 27740 NOTE: slices will be: 27741 [minvar[i]-slicevar[i]/2., minvar[i]+slicevar[i]/2.), ..., 27742 [maxvar[i]-slicevar[i]/2., maxvar[i]+slicevar[i]/2.) 27743 *slcvar[i] = 'fixed',slcevals[i] fixed values 27744 slcevals[i]: ',' separated list of pairs ('|' separated) of values to 27745 determine slices: 27746 slcvals[i] = [begslc1]|[endslc1],...,[begslcM]|[endslcM] 27747 NOTE: slices will be: 27748 [[begslc1], [endslc1]), ..., [begslcM], [endslcM]] 27742 27749 [dimvars]: ':' separated list of [dimn]|[vardimn] dimension name [dimn] and 27743 27750 its associated dimension-variable to get its values to provide values for … … 27815 27822 sliceremovdim = None 27816 27823 27817 varvals = {}27824 Svarvals = {} 27818 27825 slcvarns = [] 27819 27826 for varvls in varvalues: 27820 expectargs = '[varni],[minvari],[maxvari],[slcevari]' 27821 gen.check_arguments(fname, varvls, expectargs, ',') 27822 27823 varni = varvls.split(',')[0] 27824 minvari = np.float(varvls.split(',')[1]) 27825 maxvari = np.float(varvls.split(',')[2]) 27826 slicevari = np.float(varvls.split(',')[3]) 27827 varvals[varni] = [minvari, maxvari, slicevari] 27827 vvv = varvls.split(',') 27828 Nvvv = len(vvv) 27829 27830 varni = vvv[0] 27828 27831 slcvarns.append(varni) 27832 Svarvals[varni] = vvv[1:Nvvv+1] 27829 27833 Nslcvars = len(slcvarns) 27830 27834 … … 27858 27862 27859 27863 # Preparing slices and output file 27864 varvals= {} 27860 27865 for varn in slcvarns: 27861 27866 if not onc.variables.has_key(varn): … … 27872 27877 dimnv = list(ovar.dimensions) 27873 27878 27874 vvls = varvals[varn] 27875 minvar = vvls[0] 27876 maxvar = vvls[1] 27877 slicevar = vvls[2] 27878 27879 dvar = (maxvar-minvar+slicevar)/slicevar 27880 slices = np.arange(minvar, maxvar+slicevar, slicevar) 27881 Nslices = slices.shape[0] 27882 27883 print ' ' + fname + ': slices ____' 27884 print ' var:', varn, ':', Nslices, '(', minvar, ',', maxvar+slicevar, \ 27885 ',', slicevar, ')' 27879 vvls = Svarvals[varn] 27880 if vvls[0] == 'fixed': 27881 Nslices = len(vvls) - 1 27882 slices = np.zeros((Nslices), dtype=np.float) 27883 ivv = 0 27884 print ' ' + fname + ': variable:', varn, ':', Nslices, 'slices ____' 27885 islc = 0 27886 for vv in vvls[1:Nslices+1]: 27887 islc = np.float(vv.split('|')[0]) 27888 eslc = np.float(vv.split('|')[1]) 27889 slices[ivv] = (islc+eslc)/2. 27890 ivv = ivv + 1 27891 print ' ', islc, ':', '[', islc,',', eslc, ')' 27892 islc = islc + 1 27893 27894 else: 27895 minvar = np.float(vvls[0]) 27896 maxvar = np.float(vvls[1]) 27897 slicevar = np.float(vvls[2]) 27898 varvals[varni] = [minvar, maxvar, slicevar] 27899 27900 dvar = (maxvar-minvar+slicevar)/slicevar 27901 slices = np.arange(minvar, maxvar+slicevar, slicevar) 27902 Nslices = slices.shape[0] 27903 27904 print ' ' + fname + ': slices ____' 27905 print ' var:', varn, ':', Nslices, '(', minvar,',', maxvar+slicevar,\ 27906 ',', slicevar, ')' 27886 27907 27887 27908 # Removing undesired dimensions from slicing variable … … 27904 27925 for islc in range(Nslices): 27905 27926 slcvalsc[islc] = slices[islc] 27906 slcvals[islc,0] = slices[islc]-slicevar/2. 27907 slcvals[islc,1] = slices[islc]+slicevar/2. 27927 27928 if vvls[0] == 'fixed': 27929 vv = vvls[islc+1] 27930 slci = np.float(vv.split('|')[0]) 27931 slce = np.float(vv.split('|')[1]) 27932 slcvals[islc,0] = slci 27933 slcvals[islc,1] = slce 27934 else: 27935 slcvals[islc,0] = slices[islc]-slicevar/2. 27936 slcvals[islc,1] = slices[islc]+slicevar/2. 27908 27937 27909 27938 #slcvar[islc,] = ma.masked_inside(varv, slcvals[islc,0], slcvals[islc,1]).mask … … 28028 28057 print infmsg 28029 28058 print ' ' + fname + ": slicing dimension '" + dn + "' ... " 28059 28060 # Checking for the existence of slicing information for the 28061 # bounded variable 28062 if not slicesinf.has_key(dn): 28063 # Equivalent dimension-variable which should already by there 28064 dnn = gen.dictionary_key(slicebndsdim, dn) 28065 slicesinf[dn] = slicesinf[dnn] 28066 28030 28067 varslcv = slicesinf[dn] 28031 28068 Nslices = varslcv[0] … … 28039 28076 # Shapping 2D slices 28040 28077 reflon = np.zeros((1,Nslices), dtype=np.float) 28041 reflon[0,:] = slcvalsc28078 reflon[0,:] = lcvalsc 28042 28079 reflat = np.zeros((1,Nslices), dtype=np.float) 28043 28080 xslice2D = np.zeros((4,1,Nslices), dtype=np.float) … … 28052 28089 yslice2D[3,0,:] = -1. 28053 28090 28054 dd = len(onc.dimensions[ dn])28091 dd = len(onc.dimensions[gen.dictionary_key(slicebndsdim, dn)]) 28055 28092 getlon = np.zeros((1,dd), dtype=np.float) 28056 28093 getlon[0,:] = dv … … 28075 28112 28076 28113 # Values for file 28077 dref = [ dn]28114 dref = [gen.dictionary_key(slicebndsdim, dn)] 28078 28115 sref = [dxref] 28079 dget = [ dn]28116 dget = [gen.dictionary_key(slicebndsdim, dn)] 28080 28117 sget = [dxget] 28081 28118 28082 28119 elif len(dv.shape) == 2: 28083 28120 print " 2D slicing bounded variable: '" + varn + "': ", dv.shape 28084 xdim = rmdims[2] 28085 ydim = rmdims[1] 28121 if len(rmdims) == 3: 28122 xdim = rmdims[2] 28123 ydim = rmdims[1] 28124 else: 28125 rankv = len(ovar.dimensions) 28126 xdim = ovar.dimensions[rankv-1] 28127 ydim = ovar.dimensions[rankv-2] 28086 28128 getdims = dimdbnds[xdim] 28087 28129 28088 28130 # ref values 28089 if slicesinf.has_key(dimvars[ getdims[2]]):28090 varslcv = slicesinf[dimvars[ getdims[2]]]28131 if slicesinf.has_key(dimvars[xdim]): 28132 varslcv = slicesinf[dimvars[xdim]] 28091 28133 dxref = varslcv[0] 28092 28134 reflon1D = varslcv[3] … … 28095 28137 print infmsg 28096 28138 print ' ' + fname + ": 2D slicing varibale '" + varn + \ 28097 "' with x-dimension '" + dimvars[getdims[2]]+ "' without "+\28139 "' with x-dimension '" + dimvars[xdim] + "' without " + \ 28098 28140 "related slicing-variable !!" 28099 oxvar = onc.variables[dimvars[ getdims[2]]]28141 oxvar = onc.variables[dimvars[xdim]] 28100 28142 28101 28143 # Removing undesired dimensions from bounds slicing variable … … 28111 28153 dxref = 1 28112 28154 reflon1D = xvar 28113 refblon1D = np.array([xn, xx]) 28114 print ' using variable extremes instead: ',reflon1D 28115 28116 if slicesinf.has_key(dimvars[getdims[1]]): 28117 varslcv = slicesinf[dimvars[getdims[1]]] 28155 refblon1D = np.zeros((1,4), dtype=np.float) 28156 refblon1D[0,0] = xn 28157 refblon1D[0,1] = xx 28158 refblon1D[0,2] = xx 28159 refblon1D[0,3] = xn 28160 print ' using variable extremes instead: ', xn, xx 28161 28162 if slicesinf.has_key(dimvars[ydim]): 28163 varslcv = slicesinf[dimvars[ydim]] 28118 28164 dyref = varslcv[0] 28119 28165 reflat1D = varslcv[3] … … 28122 28168 print infmsg 28123 28169 print ' ' + fname + ": 2D slicing varibale '" + varn + \ 28124 "' with y-dimension '" + dimvars[getdims[1]]+ "' without " +\28170 "' with y-dimension '" + dimvars[ydim] + "' without " + \ 28125 28171 "related slicing-variable !!" 28126 oyvar = onc.variables[dimvars[ getdims[1]]]28172 oyvar = onc.variables[dimvars[ydim]] 28127 28173 28128 28174 # Removing undesired dimensions from bounds slicing variable … … 28138 28184 dyref = 1 28139 28185 reflat1D = yvar 28140 refblat1D = np.array([yn, yx]) 28141 print ' using variable extremes instead: ',reflat1D 28186 refblat1D = np.zeros((1,4), dtype=np.float) 28187 refblat1D[0,0] = yx 28188 refblat1D[0,1] = yx 28189 refblat1D[0,2] = yn 28190 refblat1D[0,3] = yn 28191 print ' using variable extremes instead: ', yn, yx 28192 28193 # Wrong 3D reflon, reflat!!! lon, lat 1D on 2D var !!! 28194 28142 28195 # Slicing following boundaries, dimensions are 1D thus expand to 28143 28196 # 2D filling as NW, NE, SE, SW … … 28162 28215 28163 28216 # get values 28164 if dimvars.has_key( getdims[2]):28165 ogetlon = onc.variables[dimvars[ getdims[2]]]28217 if dimvars.has_key(xdim): 28218 ogetlon = onc.variables[dimvars[xdim]] 28166 28219 # Removing undesired dimensions from bounds slicing variable 28167 28220 if sliceremovedim is not None: … … 28174 28227 print infmsg 28175 28228 print ' ' + fname + ": 2D bounded varibale '" + varn + \ 28176 "' with x-dimension '" + getdims[2] + "' without related "+\28229 "' with x-dimension '" + xdim + "' without related "+ \ 28177 28230 " dimension-variable !!" 28178 28231 quit(-1) 28179 if dimvars.has_key( getdims[1]):28180 ogetlat = onc.variables[dimvars[ getdims[1]]]28232 if dimvars.has_key(ydim): 28233 ogetlat = onc.variables[dimvars[ydim]] 28181 28234 # Removing undesired dimensions from bounds slicing variable 28182 28235 if sliceremovedim is not None: … … 28189 28242 print infmsg 28190 28243 print ' ' + fname + ": 2D bounded varibale '" + varn + \ 28191 "' with y-dimension '" + getdims[1] + "' without related "+\28244 "' with y-dimension '" + ydim + "' without related "+ \ 28192 28245 " dimension-variable !!" 28193 28246 quit(-1) 28194 28247 28195 28248 getshape = dimsbnds[xdim] 28196 dxget = getshape[2] 28197 dyget = getshape[1] 28198 dvget = getshape[0] 28249 if len(getshape) == 3: 28250 dxget = getshape[2] 28251 dyget = getshape[1] 28252 dvget = getshape[0] 28253 else: 28254 dxget = getshape[0] 28255 getshape = dimsbnds[ydim] 28256 dyget = getshape[0] 28257 dvget = 4 28199 28258 xdimvarbnds2D = dimvbnds[xdim] 28200 28259 ydimvarbnds2D = dimvbnds[ydim] 28201 28260 28261 # Reshaping to2D 28262 if len(getlon.shape) == 1 or len(getlat.shape) == 1: 28263 getlonold = getlon + 0. 28264 getlatold = getlat + 0. 28265 getlon, getlat = gen.lonlat2D(getlonold, getlatold) 28266 ddx = getlon.shape[1] 28267 ddy = getlon.shape[0] 28268 xdimvarbnds2Dold = xdimvarbnds2D + 0. 28269 ydimvarbnds2Dold = ydimvarbnds2D + 0. 28270 xdimvarbnds2D = np.zeros((4,ddy,ddx), dtype=np.float) 28271 ydimvarbnds2D = np.zeros((4,ddy,ddx), dtype=np.float) 28272 for j in range(ddy): 28273 xdimvarbnds2D[0,j,:] = xdimvarbnds2Dold[:,0] 28274 xdimvarbnds2D[1,j,:] = xdimvarbnds2Dold[:,1] 28275 xdimvarbnds2D[2,j,:] = xdimvarbnds2Dold[:,1] 28276 xdimvarbnds2D[3,j,:] = xdimvarbnds2Dold[:,0] 28277 for i in range(ddx): 28278 ydimvarbnds2D[0,:,i] = ydimvarbnds2Dold[:,1] 28279 ydimvarbnds2D[1,:,i] = ydimvarbnds2Dold[:,1] 28280 ydimvarbnds2D[2,:,i] = ydimvarbnds2Dold[:,0] 28281 ydimvarbnds2D[3,:,i] = ydimvarbnds2Dold[:,0] 28282 28202 28283 # Values for file 28203 dref = [dimvars[ getdims[1]], dimvars[getdims[2]]]28284 dref = [dimvars[ydim], dimvars[xdim]] 28204 28285 sref = [dyref, dxref] 28205 dget = [ getdims[1], getdims[2]]28286 dget = [ydim, xdim] 28206 28287 sget = [dyget, dxget] 28207 28288 … … 28223 28304 getvarybndst = ydimvarbnds2D.transpose() 28224 28305 28306 print 'Lluis dxref, dyref, dvref:', dxref, dyref, dvref, 'shapes: reflon', reflon.shape, 'reflat:', reflat.shape, \ 28307 'refvarxbnds:', xslice2D.shape, 'refvarybnds:', yslice2D.shape 28308 print 'Lluis dxget, dyget, dvget:', dxget, dyget, dvget, 'shapes: getlon', getlon.shape, 'getlat:', getlat.shape, \ 28309 'getvarxbnds:', xdimvarbnds2D.shape, 'getvarybnds:', ydimvarbnds2D.shape 28310 28225 28311 Ngridsint, gridsint, areast, percenst = \ 28226 28312 fsci.module_scientific.grid_spacepercen(xcavals=reflont, \ … … 28245 28331 28246 28332 Ngridsinmax = np.max(Ngridsin) 28333 print 'Lluis shapes: Ngridsin', Ngridsin.shape, 'gridsin:', gridsin.shape, \ 28334 'areas:', areas.shape, 'percens:', percens.shape 28247 28335 else: 28248 28336 dn = varn + '' … … 28435 28523 anewvar[:] = areas[:] 28436 28524 28437 aanewvar = onewnc.createVariable(dn+'area','f',tuple(Srgrid), 28525 aanewvar = onewnc.createVariable(dn+'area','f',tuple(Srgrid), \ 28438 28526 fill_value=gen.fillValueF) 28439 28527 basicvardef(aanewvar ,dn+'area', "area of the slice", vu) … … 28447 28535 onewnc.sync() 28448 28536 28537 print 'Lluis dv shape:', dv.shape, 'Ngridsin:', Ngridsin.shape, \ 28538 'gridsin:', gridsin.shape 28449 28539 if len(dv.shape) == 1: 28450 for j in range(1): 28451 for i in range(Nslices): 28452 innewvar[:,0:Ngridsin[j,i],i] = \ 28453 gridsin[:,0:Ngridsin[j,i],j,i] 28454 pnewvar[0:Ngridsin[j,i],i]= percens[0:Ngridsin[j,i],j,i] 28455 slicearea = 0. 28456 for iv in range(Ngridsin[j,i]): 28457 ix = gridsin[1,iv,i] 28458 iy = gridsin[0,iv,i] 28459 slicearea = slicearea + areas[iy,ix]*percens[iv,j,i] 28460 aanewvar[i]= slicearea 28540 j = 0 28541 for i in range(Nslices): 28542 innewvar[:,0:Ngridsin[j,i],i] = gridsin[:,0:Ngridsin[j,i],j,i] 28543 pnewvar[0:Ngridsin[j,i],i]= percens[0:Ngridsin[j,i],j,i] 28544 slicearea = 0. 28545 for iv in range(Ngridsin[j,i]): 28546 ix = gridsin[1,iv,j,i] 28547 iy = gridsin[0,iv,j,i] 28548 slicearea = slicearea + areas[iy,ix]*percens[iv,j,i] 28549 aanewvar[i]= slicearea 28461 28550 elif len(dv.shape) == 2: 28462 28551 for j in range(dyref):
Note: See TracChangeset
for help on using the changeset viewer.