Changeset 1493 in lmdz_wrf


Ignore:
Timestamp:
Apr 4, 2017, 6:52:22 PM (8 years ago)
Author:
lfita
Message:

Improving and flexibilizing `maskvar'

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tools/nc_var_tools.py

    r1491 r1493  
    39183918
    39193919def maskvar(values, filename, varparameters):
    3920     """ Function to mask a variable using a mask. It is assumed that mask[...,dimM,dimJ,dimK] and
    3921       var[...,dimM,dimJ,dimK] share the last dimensions
    3922     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]
    39233923      [maskfilename]= file with the mask
    3924       [maskvar]= name of the variable with the mask
     3924      [maskvarn]= name of the variable with the mask
    39253925      [dimsmask]= ',' list of [dimn]|[sec] to use for slicing [maskvar]
    39263926        [sec]: section
     
    39343934    varparameters= [varn]|[dimsmask]
    39353935      [varn]: variable name
    3936       [samedimsmask]: ',' list of name of dimensions which fits [maskvar] slice
     3936      [samedimsmask]: ',' list of name of dimensions which fits [maskvarn] slice
    39373937    """
    39383938    fname='maskvar'
     
    39433943        quit()
    39443944
     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
    39453956    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(',')
    39543957
    39553958    ncf = NetCDFFile(filename,'r')
     
    39683971    ncfmask = NetCDFFile(maskfilename,'r')
    39693972
    3970     if not ncfmask.variables.has_key(maskvar):
     3973    if not ncfmask.variables.has_key(maskvarn):
    39713974        print errormsg
    39723975        print '    ' + fname + ": File  '" + maskfilename + "' does not have " +     \
    3973           " variable mask '" + maskvar + "' !!"
     3976          " variable mask '" + maskvarn + "' !!"
    39743977        print errormsg
    39753978        ncf.close()
     
    39773980        quit(-1)
    39783981
    3979     varmaskobj = ncfmask.variables[maskvar]
     3982    varmaskobj = ncfmask.variables[maskvarn]
     3983    varmaskinf = variable_inf(varmaskobj)
     3984
    39803985    maskvalues, maskdims = slice_variable(varmaskobj, dimsmask.replace('|',':').     \
    39813986      replace(',','|'))
     
    39883993    testslicevar = []
    39893994    runshape = []
    3990     for dimn in varobj.dimensions.keys():
     3995    for dimn in varobj.dimensions:
    39913996        Ldim = len(ncf.dimensions[dimn])
    39923997        if gen.searchInlist(samedimsmask,dimn):
     
    40224027    elif varinf.dtype == type(np.float32(1.)) or varinf.dtype == type(np.float64(1.)):
    40234028        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)
    40254035    newvar = ncfnew.createVariable(varn, varinf.dtype, varinf.dimns,                 \
    40264036      fill_value=fillValue)
     
    40304040
    40314041    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[:]
    40334044
    40344045    ncfnew.sync()
     
    40374048    for varns in ncf.variables:
    40384049        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)
    40404058
    40414059    ncfnew = NetCDFFile(ofile,'a')
     
    40434061
    40444062    # 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
    41054073
    41064074    ncfnew.sync()
     
    92679235            dimnslice.append(vardims[idd])
    92689236
    9269     print 'orig shape:',varobj[:].shape,'sliced:',varobj[tuple(varvalsdim)].shape
    92709237    varvalues = np.squeeze(varobj[tuple(varvalsdim)])
    9271     print 'varvalues shape:',varvalues.shape
    92729238
    92739239    return varvalues, dimnslice
Note: See TracChangeset for help on using the changeset viewer.