Changeset 308 in lmdz_wrf for trunk


Ignore:
Timestamp:
Feb 26, 2015, 11:12:54 AM (10 years ago)
Author:
lfita
Message:

Fixing issue on 'slice_variable' slice range character '@'
Removing quit from 'cls_time_information' when no 'units', now warning

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tools/nc_var_tools.py

    r307 r308  
    26472647            self.attributes = attvar
    26482648            if not searchInlist(attvar, 'units'):
    2649                 print errormsg
    2650                 print '    cls_time_information: time variable "', tname, '" does not have attribute: "units"'
    2651                 quit(-1)
     2649                print warnmsg
     2650                print '    cls_time_information: time variable "', tname,            \
     2651                  '" does not have attribute: "units"'
     2652                units = None
    26522653            else:
    26532654                units = times.getncattr('units')
    26542655
    2655             self.unitsval = units
    2656 
    2657             if not searchInlist(attvar, 'calendar'):
    2658                 print warnmsg
    2659                 print '    cls_time_information: time variable "', tname, '" does not have attribute: "calendar"'
    2660                 self.calendar = '-'
    2661             else:
    2662                 self.calendar = times.getncattr('calendar')
     2656                self.unitsval = units
     2657
     2658                if not searchInlist(attvar, 'calendar'):
     2659                    print warnmsg
     2660                    print '    cls_time_information: time variable "', tname,            \
     2661                      '" does not have attribute: "calendar"'
     2662                    self.calendar = '-'
     2663                else:
     2664                    self.calendar = times.getncattr('calendar')
    26632665 
    2664             txtunits = units.split(' ')
    2665             self.units = txtunits[0]
    2666             Srefdate = txtunits[len(txtunits) - 1]
     2666                txtunits = units.split(' ')
     2667                self.units = txtunits[0]
     2668                Srefdate = txtunits[len(txtunits) - 1]
    26672669# Does reference date contain a time value [YYYY]-[MM]-[DD] [HH]:[MI]:[SS]
    26682670##
    2669             timeval = Srefdate.find(':')
    2670 
    2671             if not timeval == -1:
     2671                timeval = Srefdate.find(':')
     2672
     2673                if not timeval == -1:
    26722674#        print '  refdate with time!'
    2673                 self.refdate = datetimeStr_datetime(txtunits[len(txtunits) - 2] + '_' + Srefdate)
    2674                 self.Urefdate = txtunits[len(txtunits) - 2] + ' ' + Srefdate
    2675             else:
    2676                 self.refdate = datetimeStr_datetime(Srefdate + '_00:00:00')
    2677                 self.Urefdate = Srefdate
    2678 
    2679             self.Srefdate = self.refdate.strftime("%Y%m%d%H%M%S")
    2680             timev = times[:]
    2681 
    2682             self.dimt = times.shape[0]
    2683             self.dt = timev[1]-timev[0]
    2684             self.firstTu = timev[0]
    2685             self.firstTt = timeref_datetime(self.refdate, self.firstTu, self.units)
    2686             self.firstTS = self.firstTt.strftime("%Y%m%d%H%M%S")
    2687             self.firstTm = timeref_datetime_mat(self.refdate, self.firstTu, self.units)
    2688             self.lastTu = timev[self.dimt-1]
    2689             self.lastTt = timeref_datetime(self.refdate, self.lastTu, self.units)
    2690             self.lastTS = self.lastTt.strftime("%Y%m%d%H%M%S")
    2691             self.lastTm = timeref_datetime_mat(self.refdate, self.lastTu, self.units)
     2675                    self.refdate = datetimeStr_datetime(txtunits[len(txtunits) - 2]+\
     2676                      '_' + Srefdate)
     2677                    self.Urefdate = txtunits[len(txtunits) - 2] + ' ' + Srefdate
     2678                else:
     2679                    self.refdate = datetimeStr_datetime(Srefdate + '_00:00:00')
     2680                    self.Urefdate = Srefdate
     2681
     2682                self.Srefdate = self.refdate.strftime("%Y%m%d%H%M%S")
     2683                timev = times[:]
     2684
     2685                self.dimt = times.shape[0]
     2686                self.dt = timev[1]-timev[0]
     2687                self.firstTu = timev[0]
     2688                self.firstTt = timeref_datetime(self.refdate, self.firstTu,self.units)
     2689                self.firstTS = self.firstTt.strftime("%Y%m%d%H%M%S")
     2690                self.firstTm = timeref_datetime_mat(self.refdate, self.firstTu,      \
     2691                  self.units)
     2692                self.lastTu = timev[self.dimt-1]
     2693                self.lastTt = timeref_datetime(self.refdate, self.lastTu, self.units)
     2694                self.lastTS = self.lastTt.strftime("%Y%m%d%H%M%S")
     2695                self.lastTm = timeref_datetime_mat(self.refdate, self.lastTu,        \
     2696                  self.units)
     2697
     2698        return
    26922699
    26932700def time_information(ncfu, tname):
     
    1173911746    """ Function to return a slice of a given variable according to values to its
    1174011747      dimensions
    11741     slice_variable(varobj, dims)
     11748    slice_variable(varobj, dimslice)
    1174211749      varobj= object wit the variable
    1174311750      dimslice= [[dimname1]:[value1]|[[dimname2]:[value2], ...] pairs of dimension
     
    1174611753          * -1: all along the dimension
    1174711754          * -9: last value of the dimension
    11748           * [beg]:[end] slice from [beg] to [end]
     11755          * [beg]@[end] slice from [beg] to [end]
    1174911756    """
    1175011757    fname = 'slice_variable'
     
    1176911776            dimcutv = dimsl[idc].split(':')[1]
    1177011777            if vardims[idd] == dimcutn:
    11771                 posfrac = dimcutv.find(':')
     11778                posfrac = dimcutv.find('@')
    1177211779                if posfrac != -1:
    11773                     inifrac = int(dimcutv.split(':')[0])
    11774                     endfrac = int(dimcutv.split(':')[1])
     11780                    inifrac = int(dimcutv.split('@')[0])
     11781                    endfrac = int(dimcutv.split('@')[1])
    1177511782                    varvalsdim.append(slice(inifrac,endfrac))
    1177611783                    dimnslice.append(vardims[idd])
     
    1341613423
    1341713424    return
     13425
     13426def ncstediffp(values, ncfile, varn):
     13427    """ Function to compute differencies between time-steps (deacumulate) a netCDF file
     13428      new variables labelled [varn] + 'de'will be added to the file
     13429      values= [tdimn],[tvarn]
     13430        tdimn: name of the dimension time
     13431        tvarn: name of the variable time
     13432      ncfile= netCDF file to replace something
     13433      varn= ',' list of variables to deaccumulate ('all' for all)
     13434      ncstediffp('Time,Times', '/home/lluis/PY/wrfout_d01_2001-11-11_00:00:00.tests', 'Q2')
     13435    """
     13436    fname = 'ncstediffp'
     13437
     13438    if values == 'h':
     13439        print fname + '_____________________________________________________________'
     13440        print ncstediffp.__doc__
     13441        quit()
     13442
     13443    expectargs = '[tdimn],[tvarn]'
     13444 
     13445    check_arguments(fname,len(expectargs.split(',')),values,',',expectargs)
     13446
     13447    tdimn = values.split(',')[0]
     13448    tvarn = values.split(',')[1]
     13449
     13450    onc = NetCDFFile(ncfile, 'a')
     13451
     13452    if varn.find(',') != -1:
     13453        if varn != 'all':
     13454            varns = varn.slipt(',')
     13455        else:
     13456            varns = onc.variables
     13457    else:
     13458        varns = [varn]
     13459
     13460    otdim = onc.dimensions[tdimn]
     13461    otvar = onc.variables[tvarn]
     13462    timeinf = cls_time_information(onc, tvarn)
     13463   
     13464    dimt = len(otdim)
     13465
     13466    print '  ' + fname + ': deaccumulating _______'
     13467    for vn in varns:
     13468        print "    '" + vn + "'"
     13469        ovar = onc.variables[vn]
     13470        varinf = variable_inf(ovar)
     13471
     13472        if not searchInlist(varinf.dimns, tdimn):
     13473            print warnmsg
     13474            print '  ' + fname  + ": variable '" + vn + "' has not time dimension '"+\
     13475              tdimn + "' !!"
     13476            print '    skipping it'
     13477        else:
     13478            slicefwd, dfwd = slice_variable(ovar, tdimn + ':1@'+str(dimt))
     13479            slicebck, dbck = slice_variable(ovar, tdimn + ':0@'+str(dimt-1))
     13480
     13481            print slicefwd[:,15,15] - slicebck[:,15,15]
     13482
     13483            deaccum = np.zeros((varinf.dims), dtype=varinf.dtype)
     13484            ddeaccum = []
     13485            for idv in range(varinf.Ndims):
     13486                if varinf.dimns[idv] == tdimn:
     13487                    ddeaccum.append(slice(1,varinf.dims[idv]))
     13488                else:
     13489                    ddeaccum.append(slice(0,varinf.dims[idv]))
     13490
     13491            deaccum[tuple(ddeaccum)] = slicefwd - slicebck
     13492
     13493            if not searchInlist(onc.variables, vn + 'de'):
     13494                if varinf.FillValue is not None:
     13495                    newvar = onc.createVariable(vn + 'de', varinf.dtype,             \
     13496                      tuple(varinf.dimns), fill_value = varinf.FillValue)
     13497                else:
     13498                    newvar = onc.createVariable(vn + 'de', varinf.dtype,             \
     13499                      tuple(varinf.dimns))
     13500                newvar[:] = deaccum
     13501            else:
     13502                devar = onc.variables[vn + 'de']
     13503                devar = deaccum
     13504
     13505            newattr = set_attribute(newvar, 'deaccumulated', 'True')
     13506            if timeinf.dt is not None:
     13507                newattr = set_attributek(newvar, 'time_step_diff', timeinf.dt,       \
     13508                  'npfloat')
     13509
     13510            for attrn in varinf.attributes:
     13511                attrv = ovar.getncattr(attrn)
     13512                newattr = set_attribute(newvar, attrn, attrv)
     13513
     13514        onc.sync()
     13515
     13516    onc.close()
     13517
     13518    return
     13519ncstediffp('Time,Times', '/home/lluis/PY/wrfout_d01_2001-11-11_00:00:00.tests', 'Q2')
     13520quit()
    1341813521
    1341913522#quit()
Note: See TracChangeset for help on using the changeset viewer.