Changeset 1493 in lmdz_wrf
- Timestamp:
- Apr 4, 2017, 6:52:22 PM (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/tools/nc_var_tools.py
r1491 r1493 3918 3918 3919 3919 def maskvar(values, filename, varparameters): 3920 """ Function to mask a variable using a mask. It is assumed that mask[...,dimM,dimJ,dimK] and3921 var[...,dimM,dimJ,dimK] share the last dimensions3922 values= [maskfilename]:[maskvar ]:[dimsmask]:[timename]3920 """ Function to mask a variable using another variable to mask it. Only need to share 3921 at least 1 dimension with the same size (no need same name) 3922 values= [maskfilename]:[maskvarn]:[dimsmask]:[timename] 3923 3923 [maskfilename]= file with the mask 3924 [maskvar ]= name of the variable with the mask3924 [maskvarn]= name of the variable with the mask 3925 3925 [dimsmask]= ',' list of [dimn]|[sec] to use for slicing [maskvar] 3926 3926 [sec]: section … … 3934 3934 varparameters= [varn]|[dimsmask] 3935 3935 [varn]: variable name 3936 [samedimsmask]: ',' list of name of dimensions which fits [maskvar ] slice3936 [samedimsmask]: ',' list of name of dimensions which fits [maskvarn] slice 3937 3937 """ 3938 3938 fname='maskvar' … … 3943 3943 quit() 3944 3944 3945 expectargs = '[maskfilename]:[maskvarn]:[dimsmask]:[timename]' 3946 gen.check_arguments(fname,values,expectargs,':') 3947 3948 maskfilename = values.split(':')[0] 3949 maskvarn = values.split(':')[1] 3950 dimsmask = values.split(':')[2] 3951 maskvalue = values.split(':')[3] 3952 3953 varn = varparameters.split(':')[0] 3954 samedimsmask = varparameters.split(':')[1].split(',') 3955 3945 3956 ofile = 'mask_' + varn + '.nc' 3946 3947 maskfilename = values.split(':')[0]3948 maskvar = values.split(':')[1]3949 dimsmask = values.split(':')[3]3950 maskvalue = values.split(':')[4]3951 3952 varn = varparameters.splice(':')[0]3953 samedimsmask = varparameters.splice(':')[1].split(',')3954 3957 3955 3958 ncf = NetCDFFile(filename,'r') … … 3968 3971 ncfmask = NetCDFFile(maskfilename,'r') 3969 3972 3970 if not ncfmask.variables.has_key(maskvar ):3973 if not ncfmask.variables.has_key(maskvarn): 3971 3974 print errormsg 3972 3975 print ' ' + fname + ": File '" + maskfilename + "' does not have " + \ 3973 " variable mask '" + maskvar + "' !!"3976 " variable mask '" + maskvarn + "' !!" 3974 3977 print errormsg 3975 3978 ncf.close() … … 3977 3980 quit(-1) 3978 3981 3979 varmaskobj = ncfmask.variables[maskvar] 3982 varmaskobj = ncfmask.variables[maskvarn] 3983 varmaskinf = variable_inf(varmaskobj) 3984 3980 3985 maskvalues, maskdims = slice_variable(varmaskobj, dimsmask.replace('|',':'). \ 3981 3986 replace(',','|')) … … 3988 3993 testslicevar = [] 3989 3994 runshape = [] 3990 for dimn in varobj.dimensions .keys():3995 for dimn in varobj.dimensions: 3991 3996 Ldim = len(ncf.dimensions[dimn]) 3992 3997 if gen.searchInlist(samedimsmask,dimn): … … 4022 4027 elif varinf.dtype == type(np.float32(1.)) or varinf.dtype == type(np.float64(1.)): 4023 4028 fillValue = gen.fillValueF64 4024 4029 else: 4030 print errormsg 4031 print ' ' + fname + ': type of variable:', varinf.dtype, 'not ready!!' 4032 quit(-1) 4033 4034 maskval = gen.retype(maskvalue,varinf.dtype) 4025 4035 newvar = ncfnew.createVariable(varn, varinf.dtype, varinf.dimns, \ 4026 4036 fill_value=fillValue) … … 4030 4040 4031 4041 attr = newvar.setncattr('mask', 'variable masked using ' + values.split(':')[2] +\ 4032 ' of variable ' + maskvar + ' from file ' + maskfilename) 4042 ' of variable ' + maskvarn + ' from file ' + maskfilename) 4043 newvar[:] = varobj[:] 4033 4044 4034 4045 ncfnew.sync() … … 4037 4048 for varns in ncf.variables: 4038 4049 if not varns == varn: 4039 fvaradd(filename + ',' + varns, ofile) 4050 try: 4051 with gen.Capturing() as output: 4052 fvaradd(filename + ',' + varns, ofile) 4053 except: 4054 print errmsg 4055 print 'fvaradd(' + filename + ', ' + varns + ',' + ofilen + ')' 4056 for s1out in output: print s1out 4057 quit(-1) 4040 4058 4041 4059 ncfnew = NetCDFFile(ofile,'a') … … 4043 4061 4044 4062 # Masking following that dimensions which are not coincident with the mask 4045 maskval = gen.retype(maskvalue,varinf.dtype) 4046 if runshape > 1: 4047 idim = 0 4048 runslice = list(runshape) 4049 while idim <= runningsize: 4050 slicevar = [] 4051 inosim = len(runshape) 4052 for dimn in varobj.dimensions.keys(): 4053 Ldim = len(ncf.dimensions[dimn]) 4054 if gen.searchInlist(samedimsmask,dimn): 4055 slicevar.append(slice(0,Ldim,None)) 4056 else: 4057 slicevar.append() 4058 testvar = varobj[tuple(testslicevar)] 4059 4060 4061 else: 4062 maskedvals = ma.masked(varobj[:],maskval) 4063 4064 varobj[:] = maskedvals 4065 4066 4067 4068 4069 4070 4071 Nptmask = 1 4072 for isdim in range(Nsamedims): 4073 Nptmask = Nptmask * samedims[isdim] 4074 4075 Nvarloop = 1 4076 varsecdims = [] 4077 for insdim in range(varinf.Ndims - Nsamedims): 4078 Nvarloop = Nvarloop * varinf.dims[insdim] 4079 varsecdims.append(0) 4080 4081 Nsecdims = len(varsecdims) 4082 4083 for iloop in range(Nvarloop): 4084 varval = load_ncvariable_lastdims(ncf, varn, varsecdims, Nsamedims) 4085 newvarval = np.where(maskvals == 1, varval, fillValue) 4086 if np.sum(newvarval == fillValue) == Nptmask: 4087 print errormsg 4088 print ' ' + fname + ': all values got masked!!!' 4089 print erromsg 4090 quit(-1) 4091 4092 fill_ncvariable_lastdims(ncfnew,varn,varsecdims,Nsamedims,newvarval) 4093 4094 varsecdims[Nsecdims -1] = varsecdims[Nsecdims - 1] + 1 4095 if varsecdims[Nsecdims - 1] > varinf.dims[Nsecdims - 1] - 1: 4096 varsecdims[Nsecdims - 1] = 0 4097 for jdim in range(Nsecdims - 1): 4098 varsecdims[Nsecdims - 2 - jdim] = varsecdims[Nsecdims - 2 - jdim] + 1 4099 if varsecdims[Nsecdims - 2 - jdim] <= varinf.dims[Nsecdims - 2 - jdim] - 1: 4100 break 4101 else: 4102 varsecdims[Nsecdims - 2 - jdim] = 0 4103 4104 print 'variable: ', varinf.dims, ' and mask: ', varmaskinf.dims,' share: ', samedims, Nvarloop 4063 4064 slices = gen.provide_slices(varinf.dimns, varinf.dims, list(varmaskinf.dimns)) 4065 4066 maskTOuse = ma.masked_equal(maskvalues, maskval) 4067 4068 for ir in range(runningsize): 4069 islice = slices[ir] 4070 varvals = varobj[tuple(islice)] 4071 maskvarvals = np.where(maskTOuse.mask, fillValue, varvals) 4072 newvar[tuple(islice)] = maskvarvals 4105 4073 4106 4074 ncfnew.sync() … … 9267 9235 dimnslice.append(vardims[idd]) 9268 9236 9269 print 'orig shape:',varobj[:].shape,'sliced:',varobj[tuple(varvalsdim)].shape9270 9237 varvalues = np.squeeze(varobj[tuple(varvalsdim)]) 9271 print 'varvalues shape:',varvalues.shape9272 9238 9273 9239 return varvalues, dimnslice
Note: See TracChangeset
for help on using the changeset viewer.