Ejemplo n.º 1
0
def check_rst(date,cf,wait=900):
  '''check rst for forecast, and wait for tdiff'''

  FA='a'
  date0=dateu.next_date(date,-1)
  rst=opt.nameof('out','rst',date=date0,FA=FA,cf=cf)
  # check also if run terminated! The rst may not have the last reccord yet!
  rout=opt.nameof('out','rout',date=date0,FA=FA,cf=cf)

  if os.path.isfile(rst) and is_roms_out_ok(rout): return True
  else:
    now   = dateu.currday()
    tdiff = dateu.date_diff(date,now)
    print "waiting for rst"
    while tdiff.days < 1.5:
      time.sleep(wait)
      sys.stdout.write('.')
      now   = dateu.currday()
      tdiff = dateu.date_diff(date,now)

      cond=os.path.isfile(rst) and is_roms_out_ok(rout)
      print "  rst file ready =  ",cond,' at ',now, tdiff
      if cond: return True

  return os.path.isfile(rst)
Ejemplo n.º 2
0
def gen_clmbry(date,FA='a',nest=0,cf=CONF,quiet=True):
  date=dateu.parse_date(date)
  err=''
  isFatal=False

  fclm=opt.nameof('in','clm',date=date,FA=FA,nest=nest,cf=cf)
  fbry=opt.nameof('in','bry',date=date,FA=FA,nest=nest,cf=cf)
  grd=opt.nameof('in','grd',cf=cf)

  if os.path.isfile(fclm) and os.path.isfile(fbry):
    err='CLMBRY files already exists'
    isFatal=False
  else:
    nforec=opt.n_pred(cf)
    import get_mercator as get_hycom
    # no need to check if data is ready! if not gen_clm_bry will return error!
    # anyway, cannot know if hycom data of today is analtsis or forecast!!

    date1=None
    if FA=='f': date1=dateu.parse_date(dateu.next_date(date,nforec))
    try:
      err=get_hycom.gen_clm_bry(fclm,fbry,grd,date,date1,quiet=quiet)
      if err:
        err='ERROR creating clm bry files : %s' % err
        isFatal=True
    except:
      err='ERROR creating clm bry files'
      isFatal=True


  return err, isFatal, fclm,fbry
Ejemplo n.º 3
0
def gen_atmfrc(date,FA='a',nest=0,cf=CONF,quiet=True):
  date=dateu.parse_date(date)
  err=''
  isFatal=False

  fname=opt.nameof('in','blk',date=date,FA=FA,nest=nest,cf=cf)

  if os.path.isfile(fname):
    err='BLK file already exists'
    isFatal=False
  else:
    grd=opt.nameof('in','grd',cf=cf)
    atmPath = opt.pathof(cf,'external','atm')
    atmData=opt.atm_info(cf)['data']
    nforec=opt.n_pred(cf)

    if atmData=='wrf':
      cycle=366-29+dateu.mndays(date.year,date.month)
      err=bfrc.make_blk_wrf(fname,grd,date,FA,atmPath,quiet=quiet,cycle=cycle)
    elif atmData=='gfs':
      from okean.roms.inputs import surface
      if FA=='a': nforec=0
      model=opt.get_conf(cf,'MODEL','name',type=str)[nest].lower()
      surface.make_blk_gfs(atmPath,grd,fname,date,nforec=nforec,model=model,quiet=quiet)

    try:
      if err:
        err='ERROR creating bulk file ('+err+')'
        isFatal=True
    except OSError, e:
      err='ERROR creating bulk file ('+str(e)+')'
      isFatal=True
    except:
Ejemplo n.º 4
0
def gen_ini(date,FA='a',nest=0,cf=CONF):
  date=dateu.parse_date(date)
  dateRst=dateu.next_date(date,-1)


  rst=opt.nameof('out','rst',date=dateRst,FA=FA,nest=nest,cf=cf)

  ini=opt.nameof('in', 'ini',date=date,FA=FA,nest=nest,cf=cf)
  err=False
  isFatal=False

  if os.path.isfile(ini):
    err='INI file already exists: ....%s' % ini[-30:]
    isFatal=False
  elif not os.path.isfile(rst):
    err='RST file not found: %s' % rst
    isFatal=True
  else:
    y,m,d=date.year,date.month,date.day
    model=opt.get_conf(cf,'MODEL','name',type=str)[nest]
    if model.lower()=='roms-agrif' and (m,d)==(1,1):
      # copy and change time to 0:
      err=opt.restart_ini(rst,ini)
      if err: isFatal=True
    else:
      # do not copy, create link:
      try:
        os.symlink(rst,ini)
      except OSError, e:
        err=e.strerror
        isFatal=True
Ejemplo n.º 5
0
def zip_plots(cf,year,month,clean=False,quiet=False,overwrite=False,output=sys.stdout):
  pltpath=opt.nameof('out','plots',cf=cf)

  p=os.path.join(pltpath,'%s' % year,'%02d_*' % month)
  folders=glob.glob(p)
  folders.sort()

  monthn=dateu.month_names(month).lower()
  zipfile='plots_%s_%d.tar.gz' % (monthn,year)
  zipfile=os.path.join(pltpath,'%s' % year,zipfile)

  if os.path.isfile(zipfile) and not overwrite:
    if not quiet: print >>output,'zip file % s already exist' % zipfile
    return

  # create zip:
  if folders: cb.tar_gz_dir(folders,zipfile)

  if not quiet:
    if folders:
      print >>output,'Created tar.gz %s with contents:' % zipfile
      for i in folders: print >>output,'  %s' % i
    else:
      print >>output,'No tar.gz created for %d %02d' % (year,month)

  # remove original files:
  if clean:
    for i in folders:
      if not quiet: print >>output,'removing %s' % i
      shutil.rmtree(i)
Ejemplo n.º 6
0
  def load(self):
    if not self.logfile:
      self.rout=False
      return False

    f=open(self.logfile)
    L=f.readlines()

    # tend and dt only written at the end of model run, so give some
    # invalid values:
    self.tend = -1
    self.tend_str = 'not ended'
    self.dt   = -1

    for i in range(len(L)-1):
      k=L[i].strip()
      val=L[i+1].strip()
      if k.find('[job/process id]')==0: self.pid      = val
      elif k.find('[queue/local]')==0:  self.job_type = val
#     elif k.find('[date]')==0:         self.date     = val
#     elif k.find('[FA]')==0:           self.FA       = val
      elif k.find('[tstart]')==0:       self.tstart,self.tstart_str  = int(val.split()[0]),sjoin(val.split()[1:])
      elif k.find('[tend]')==0:         self.tend,self.tend_str  = int(val.split()[0]),sjoin(val.split()[1:])
      elif k.find('[dt (min)]')==0:     self.dt=float(val)

    self.rout=opt.nameof('out','rout',date=self.date,FA=self.FA,cf=self.conf)

    return True
Ejemplo n.º 7
0
def clean_nc_files(cf,
                   date1,
                   date2,
                   type,
                   FA,
                   nest=0,
                   mdkeep=0,
                   wkeep=-1,
                   clean=False,
                   quiet=False,
                   output=sys.stdout):
    '''
  mdkeep: day,month to keep
  ex: mdkeep=1     => keep day 1 of every month
  ex: mdkeep=(1,1) => keep day 1 of January (month,day)
  ex: mdkeep=0     => no keep

  wkeep: day of week to keep:
  ex: wkeep=0  => keep first day of week (synday)
  ex: wkeep=-1 => no keep
  '''

    date = date1
    while date <= date2:
        f = opt.nameof('out', type, date, FA, nest, cf)
        if os.path.isfile(f):
            hs = cb.hsize(os.path.getsize(f))

            y, m, d = dateu.parse_date(date)
            dweek = dateu.parse_date(date).weekday()

            if mdkeep == -1:
                MDkeep = dateu.mndays(
                    y, m)  # last day of month, then calc last day:
            else:
                MDkeep = mdkeep

            if MDkeep and MDkeep == d or MDkeep == (m, d):
                if not quiet:
                    print >> output, '*Keeping ', date, ' ', f, ' ', hs[0], hs[
                        1], '**', MDkeep
            elif wkeep != -1 and wkeep == dweek:
                if not quiet:
                    print >> output, '*Keeping ', date, ' ', f, ' ', hs[0], hs[
                        1], '*', wkeep
            else:
                if not quiet:
                    if clean:
                        print >> output, 'Removing ', date, ' ', f, ' ', hs[
                            0], hs[1]
                    else:
                        print >> output, 'Not removing ', date, ' ', f, ' ', hs[
                            0], hs[1]

                if clean: os.remove(f)
        else:
            print >> output, date, ' ', FA, ' no file'

        date = dateu.next_date(date, 1)
Ejemplo n.º 8
0
def op_plt_wind(conf, plconf, date, FA='a', nest=0, **kargs):
    closefig = kargs.get('closefig', True)
    clearfig = kargs.get('clearfig', True)
    save = kargs.get('save', True)

    date = dateu.parse_date(date)

    Figure, err = opt.get_plconf(plconf, 'FIGURE')

    Err = []
    Out = []
    pltpath = opt.nameof('out', 'plots', cf=conf)

    Data, err = opt.get_plconf(plconf, 'WIND')

    ifig = -1
    for tag in Figure['tag']:
        ifig += 1

        args = {}
        args['ifig'] = ifig

        tind = Data['time'][ifig]
        if tind == 'dailyMean':
            if FA == 'a': ndays = 1
            elif FA == 'f': ndays = int(opt.get_conf(conf, 'PRED', 'npred')[0])

        for day in range(ndays):  # loop over time:

            args['day'] = day
            err, fig, info = plt_wind(conf, plconf, date, FA, nest, **args)
            Err += [err]
            if not err:

                # save:
                if save:
                    if tag: Tag = '_' + tag
                    else: Tag = tag
                    savename = 'wind_%s_%s_%d_n%d%s' % (
                        date.strftime('%Y%m%d'), FA, day, nest, Tag)

                    Y, M, D = date.year, date.month, date.day
                    Ydest = os.path.join(pltpath, '%s' % Y)
                    if not os.path.isdir(Ydest): os.mkdir(Ydest)
                    MDdest = os.path.join(Ydest, '%02d_%02d' % (M, D))
                    if not os.path.isdir(MDdest): os.mkdir(MDdest)

                    savename = os.path.join(
                        MDdest, savename + '.' + Figure['extension'][ifig])
                    Out += [savename]

                    pl.savefig(savename, dpi=pl.gcf().dpi)

                if clearfig: fig.clear()
                if closefig: pl.close(fig)

    return Err, Out
Ejemplo n.º 9
0
def op_plt_wind(conf,plconf,date,FA='a',nest=0,**kargs):
  closefig = kargs.get('closefig',True)
  clearfig = kargs.get('clearfig',True)
  save     = kargs.get('save',True)

  date=dateu.parse_date(date)

  Figure,err  = opt.get_plconf(plconf,'FIGURE')

  Err=[]
  Out=[]
  pltpath = opt.nameof('out','plots',cf=conf)

  Data,err = opt.get_plconf(plconf,'WIND')

  ifig=-1
  for tag in Figure['tag']:
    ifig+=1

    args={}
    args['ifig']=ifig

    tind = Data['time'][ifig]
    if tind == 'dailyMean':
      if FA=='a': ndays=1
      elif FA=='f': ndays=int(opt.get_conf(conf,'PRED','npred')[0])

    for day in range(ndays): # loop over time:

      args['day']=day
      err,fig,info=plt_wind(conf,plconf,date,FA,nest,**args)
      Err+=[err]
      if not err:

        # save:
        if save:
          if tag: Tag='_'+tag
          else: Tag=tag
          savename='wind_%s_%s_%d_n%d%s' % (date.strftime('%Y%m%d'),FA,day,nest,Tag)

          Y,M,D=date.year,date.month,date.day
          Ydest  = os.path.join(pltpath,'%s' % Y )
          if not os.path.isdir(Ydest): os.mkdir(Ydest)
          MDdest = os.path.join(Ydest,'%02d_%02d' % (M,D) )
          if not os.path.isdir(MDdest): os.mkdir(MDdest)

          savename=os.path.join(MDdest,savename+'.'+Figure['extension'][ifig])
          Out+=[savename]

          pl.savefig(savename,dpi=pl.gcf().dpi)

        if clearfig: fig.clear()
        if closefig: pl.close(fig)

  return Err,Out
Ejemplo n.º 10
0
def clean_frc(cf,date1,date2,type,FA,nest=0,clean=False,quiet=False,output=sys.stdout):
  date=date1
  while date<=date2:
    f=opt.nameof('in',type,date,FA,nest,cf)
    if os.path.isfile(f):
      if clean:
        if not quiet: print >>output,'Removing ',date,' ', f
        os.remove(f)
    else:
      print >>output,date,' ',FA,' no file',f

    date=dateu.next_date(date,1)
Ejemplo n.º 11
0
def find_last(type='rout',FA='a',nest=0,cf=CONF):
  kargs={'date':'*','FA':FA,'nest':nest,'cf':cf}
  if type=='rout':
    name=opt.nameof('out',type,**kargs)
  elif type=='ini':
    name=opt.nameof('in', type,**kargs)
  elif type=='rst':
    name=opt.nameof('out',type,**kargs)

  fs=glob.glob(name)
  if fs:
    L=name.index('*')
    date=fs[0][L:L+8]
    file=fs[0]
    for i in range(1,len(fs)):
      if fs[i][L:L+8]>date:
        date=fs[i][L:L+8]
        file=fs[i]

    return dateu.parse_date(date), file
  else:
    return '',''
Ejemplo n.º 12
0
def op_plt_wind_rose(conf, plconf, date, FA='a', nest=0, **kargs):
    closefig = kargs.get('closefig', True)
    clearfig = kargs.get('clearfig', True)
    save = kargs.get('save', True)

    date = dateu.parse_date(date)

    Err = []
    Out = []
    pltpath = opt.nameof('out', 'plots', cf=conf)

    Data, err = opt.get_plconf(plconf, 'WINDR')

    ifig = -1
    for tag in Data['tag']:
        ifig += 1

        args = {}
        args['ifig'] = ifig

        err, figs, info = plt_wind_rose(conf, plconf, date, FA, nest, **args)
        if not err:
            # save:
            if save:
                if tag: Tag = '_' + tag
                else: Tag = tag

                tmp = dateu.parse_date(date)
                Y, M, D = tmp.year, tmp.month, tmp.day
                Ydest = os.path.join(pltpath, '%s' % Y)
                if not os.path.isdir(Ydest): os.mkdir(Ydest)
                MDdest = os.path.join(Ydest, '%02d_%02d' % (M, D))
                if not os.path.isdir(MDdest): os.mkdir(MDdest)

                N = -1
                for fig in figs:
                    N += 1
                    place, day = info[N]
                    savename = 'wind_rose_%s_%s_%d_%s_n%d%s' % (
                        date, FA, day, place, nest, Tag)

                    savename = os.path.join(
                        MDdest, savename + '.' + Data['extension'][ifig])
                    Out += [savename]

                    fig.savefig(savename, dpi=fig.dpi)

                    if clearfig: fig.clear()
                    if closefig: pl.close(fig)

    return Err, Out
Ejemplo n.º 13
0
def plt0(cf,pcf):
  title=opt.atts_info(cf)['title']
  '''
  Plot grids
  '''

  pltpath=opt.nameof('out','plots',cf=cf)
  grd = glob(opt.nameof('in','grd',cf=cf))[0]

  if not os.path.isfile(grd):
    print ':: grid file not found'
    return

  # figure tags:
  out, err=opt.get_plconf(pcf,'FIGURE','tag')
  for i in range(len(out)):
    m,fig,ax=plt_grid(pcf,grd,ifig=i)
    savename='plt0'
    if out[i]: savename=savename+'_%s' % (out[i])
    savename=os.path.join(pltpath,savename+'.png')

    pl.savefig(savename,dpi=pl.gcf().dpi)
    print 'saving %s' % savename
Ejemplo n.º 14
0
def plt0(cf, pcf):
    title = opt.atts_info(cf)['title']
    '''
  Plot grids
  '''

    pltpath = opt.nameof('out', 'plots', cf=cf)
    grd = glob(opt.nameof('in', 'grd', cf=cf))[0]

    if not os.path.isfile(grd):
        print ':: grid file not found'
        return

    # figure tags:
    out, err = opt.get_plconf(pcf, 'FIGURE', 'tag')
    for i in range(len(out)):
        m, fig, ax = plt_grid(pcf, grd, ifig=i)
        savename = 'plt0'
        if out[i]: savename = savename + '_%s' % (out[i])
        savename = os.path.join(pltpath, savename + '.png')

        pl.savefig(savename, dpi=pl.gcf().dpi)
        print 'saving %s' % savename
Ejemplo n.º 15
0
def op_plt_wind_rose(conf,plconf,date,FA='a',nest=0,**kargs):
  closefig = kargs.get('closefig',True)
  clearfig = kargs.get('clearfig',True)
  save     = kargs.get('save',True)

  date=dateu.parse_date(date)

  Err=[]
  Out=[]
  pltpath = opt.nameof('out','plots',cf=conf)

  Data,err = opt.get_plconf(plconf,'WINDR')

  ifig=-1
  for tag in Data['tag']:
    ifig+=1

    args={}
    args['ifig']=ifig

    err,figs,info=plt_wind_rose(conf,plconf,date,FA,nest,**args)
    if not err:
      # save:
      if save:
        if tag: Tag='_'+tag
        else: Tag=tag

        tmp=dateu.parse_date(date)
        Y,M,D=tmp.year,tmp.month,tmp.day
        Ydest  = os.path.join(pltpath,'%s' % Y )
        if not os.path.isdir(Ydest): os.mkdir(Ydest)
        MDdest = os.path.join(Ydest,'%02d_%02d' % (M,D) )
        if not os.path.isdir(MDdest): os.mkdir(MDdest)

        N=-1
        for fig in figs:
          N+=1
          place,day=info[N]
          savename='wind_rose_%s_%s_%d_%s_n%d%s' % (date,FA,day,place,nest,Tag)

          savename=os.path.join(MDdest,savename+'.'+Data['extension'][ifig])
          Out+=[savename]

          fig.savefig(savename,dpi=fig.dpi)

          if clearfig: fig.clear()
          if closefig: pl.close(fig)

  return Err,Out
Ejemplo n.º 16
0
def gen_rivfrc(date,FA='a',nest=0,cf=CONF):
  date=dateu.parse_date(date)
  err=''
  isFatal=False

  fname=opt.nameof('in','frc',date=date,FA=FA,nest=nest,cf=cf)
  grd=opt.nameof('in','grd',cf=cf)

  if os.path.isfile(fname):
    err='RIVERS file already exists'
    isFatal=False
  else:
    nforec=opt.n_pred(cf)
    import get_rivers
    date1=None
    if FA=='f': date1=dateu.parse_date(dateu.next_date(date,nforec))
    try:
      err=get_rivers.gen_frc(fname,grd,date,date1)
    except:
      err='ERROR creating rivers file'

    if err: isFatal=True

  return err, isFatal, fname
Ejemplo n.º 17
0
def op_plt_flt(conf, plconf, date, FA='f', nest=0, **kargs):
    closefig = kargs.get('closefig', True)
    clearfig = kargs.get('clearfig', True)
    save = kargs.get('save', True)

    date = dateu.parse_date(date)

    Figure, err = opt.get_plconf(plconf, 'FIGURE')

    Err = []
    Out = []
    pltpath = opt.nameof('out', 'plots', cf=conf)

    ifig = -1
    for tag in Figure['tag']:
        ifig += 1

        args = {}
        args['ifig'] = ifig

        err, fig, info = plt_flt(conf, plconf, date, FA, nest, **args)

        Err += [err]

        if not err:

            # save:
            if save:
                if tag: Tag = '_' + tag
                else: Tag = tag
                savename = 'floats_%s_%s_n%d%s' % (date, FA, nest, Tag)

                Y, M, D = date.year, date.month, date.day,
                Ydest = os.path.join(pltpath, '%s' % Y)
                if not os.path.isdir(Ydest): os.mkdir(Ydest)
                MDdest = os.path.join(Ydest, '%02d_%02d' % (M, D))
                if not os.path.isdir(MDdest): os.mkdir(MDdest)

                savename = os.path.join(
                    MDdest, savename + '.' + Figure['extension'][ifig])
                Out += [savename]

                pl.savefig(savename, dpi=pl.gcf().dpi)

            if clearfig: fig.clear()
            if closefig: pl.close(fig)

    return Err, Out
Ejemplo n.º 18
0
def op_plt_flt(conf,plconf,date,FA='f',nest=0,**kargs):
  closefig = kargs.get('closefig',True)
  clearfig = kargs.get('clearfig',True)
  save     = kargs.get('save',True)

  date=dateu.parse_date(date)

  Figure,err  = opt.get_plconf(plconf,'FIGURE')

  Err=[]
  Out=[]
  pltpath = opt.nameof('out','plots',cf=conf)

  ifig=-1
  for tag in Figure['tag']:
    ifig+=1

    args={}
    args['ifig']=ifig

    err,fig,info=plt_flt(conf,plconf,date,FA,nest,**args)

    Err+=[err]

    if not err:

      # save:
      if save:
        if tag: Tag='_'+tag
        else: Tag=tag
        savename='floats_%s_%s_n%d%s' % (date,FA,nest,Tag)

        Y,M,D=date.year,date.month,date.day,
        Ydest  = os.path.join(pltpath,'%s' % Y )
        if not os.path.isdir(Ydest): os.mkdir(Ydest)
        MDdest = os.path.join(Ydest,'%02d_%02d' % (M,D) )
        if not os.path.isdir(MDdest): os.mkdir(MDdest)

        savename=os.path.join(MDdest,savename+'.'+Figure['extension'][ifig])
        Out+=[savename]

        pl.savefig(savename,dpi=pl.gcf().dpi)

      if clearfig: fig.clear()
      if closefig: pl.close(fig)

  return Err,Out
Ejemplo n.º 19
0
def plt0_wind_rose(conf, plconf):
    figs = []

    Data, err = opt.get_plconf(plconf, 'WINDR')
    Places, err = opt.get_plconf(plconf, 'WINDR_PLACES')
    Tag = Data['tag']
    ifig = -1
    for tag in Tag:
        ifig += 1
        figpos = Data['fig_size'][ifig]
        axpos = Data['ax_pos'][ifig]
        fontsize = Data['fontsize'][ifig]
        linewidth = Data['linewidth'][ifig]
        legType = Data['legtype'][ifig]
        intensities = Data['intensities'][ifig]
        percentages = Data['percentages'][ifig]

        percentages = [100]
        args = {
            'fontsize': fontsize,
            'linewidth': linewidth,
            'figpos': figpos,
            'axpos': axpos,
            'legtype': legType,
            'labels': 0
        }
        D = []
        F = []
        tmp = pl_plots.wind_rose(D, F, di=intensities, ci=percentages, **args)
        figs += [tmp]

    # save:
    pltpath = opt.nameof('out', 'plots', cf=conf)
    n = -1
    names = []
    for f in figs:
        savename = 'plt0_wr'
        n += 1
        if Tag[n]: savename = savename + '_%s' % (Tag[n])
        savename = os.path.join(pltpath, savename + '.' + Data['extension'][n])
        f.savefig(savename, dpi=f.dpi)

        names += [savename]
        pl.close(f)

    return names
Ejemplo n.º 20
0
def list_files(cf, date1, date2, io, type, FA, nest=0, quiet=True):
    files = cb.odict()
    date = date1
    while date <= date2:
        f = opt.nameof(io, type, date, FA, nest, cf)
        if os.path.isfile(f): files[date] = f
        else: files[date] = False

        date = dateu.next_date(date, 1)

    if not quiet:
        for d in files.keys():
            if files[d]:
                f = files[d]
                hs = cb.hsize(os.path.getsize(f))
                print d, ' ', f, ' ', hs[0], hs[1]
            else:
                print d, ' no file'

    return files
Ejemplo n.º 21
0
def list_files(cf,date1,date2,io,type,FA,nest=0,quiet=True):
  files=cb.odict()
  date=date1
  while date<=date2:
    f=opt.nameof(io,type,date,FA,nest,cf)
    if os.path.isfile(f): files[date]=f
    else: files[date]=False

    date=dateu.next_date(date,1)

  if not quiet:
    for d in files.keys():
      if files[d]:
        f=files[d]
        hs=cb.hsize(os.path.getsize(f))
        print d,' ', f, ' ',hs[0],hs[1]
      else:
        print d,' no file'

  return files
Ejemplo n.º 22
0
def clean_frc(cf,
              date1,
              date2,
              type,
              FA,
              nest=0,
              clean=False,
              quiet=False,
              output=sys.stdout):
    date = date1
    while date <= date2:
        f = opt.nameof('in', type, date, FA, nest, cf)
        if os.path.isfile(f):
            if clean:
                if not quiet: print >> output, 'Removing ', date, ' ', f
                os.remove(f)
        else:
            print >> output, date, ' ', FA, ' no file', f

        date = dateu.next_date(date, 1)
Ejemplo n.º 23
0
def clean_nc_files(cf,date1,date2,type,FA,nest=0,mdkeep=0,wkeep=-1,clean=False,quiet=False,output=sys.stdout):
  '''
  mdkeep: day,month to keep
  ex: mdkeep=1     => keep day 1 of every month
  ex: mdkeep=(1,1) => keep day 1 of January (month,day)
  ex: mdkeep=0     => no keep

  wkeep: day of week to keep:
  ex: wkeep=0  => keep first day of week (synday)
  ex: wkeep=-1 => no keep
  '''


  date=date1
  while date<=date2:
    f=opt.nameof('out',type,date,FA,nest,cf)
    if os.path.isfile(f):
      hs=cb.hsize(os.path.getsize(f))

      y,m,d=dateu.parse_date(date)
      dweek=dateu.parse_date(date).weekday()

      if mdkeep==-1: MDkeep=dateu.mndays(y,m) # last day of month, then calc last day:
      else: MDkeep=mdkeep

      if MDkeep and MDkeep==d or MDkeep==(m,d):
        if not quiet: print >>output,'*Keeping ',date,' ', f, ' ',hs[0],hs[1],'**', MDkeep
      elif wkeep!=-1 and wkeep==dweek:
        if not quiet: print >>output,'*Keeping ',date,' ', f, ' ',hs[0],hs[1],'*', wkeep
      else:
        if not quiet:
          if clean: print >>output,'Removing ',date,' ', f, ' ',hs[0],hs[1]
          else:     print >>output,'Not removing ',date,' ', f, ' ',hs[0],hs[1]

        if clean: os.remove(f)
    else:
      print >>output,date,' ',FA,' no file'

    date=dateu.next_date(date,1)
Ejemplo n.º 24
0
def plt0_wind_rose(conf,plconf):
  figs=[]

  Data,err   = opt.get_plconf(plconf,'WINDR')
  Places,err = opt.get_plconf(plconf,'WINDR_PLACES')
  Tag=Data['tag']
  ifig=-1
  for tag in Tag:
    ifig+=1
    figpos      = Data['fig_size'][ifig]
    axpos       = Data['ax_pos'][ifig]
    fontsize    = Data['fontsize'][ifig]
    linewidth   = Data['linewidth'][ifig]
    legType     = Data['legtype'][ifig]
    intensities = Data['intensities'][ifig]
    percentages = Data['percentages'][ifig]

    percentages=[100]
    args={'fontsize':fontsize,'linewidth':linewidth,'figpos':figpos,'axpos':axpos,'legtype':legType,'labels':0}
    D=[]
    F=[]
    tmp=pl_plots.wind_rose(D,F,di=intensities,ci=percentages,**args)
    figs+=[tmp]

  # save:
  pltpath = opt.nameof('out','plots',cf=conf)
  n=-1
  names=[]
  for f in figs:
    savename='plt0_wr'
    n+=1
    if Tag[n]: savename=savename+'_%s' % (Tag[n])
    savename=os.path.join(pltpath,savename+'.'+Data['extension'][n])
    f.savefig(savename,dpi=f.dpi)

    names+=[savename]
    pl.close(f)

  return names
Ejemplo n.º 25
0
def zip_plots(cf,
              year,
              month,
              clean=False,
              quiet=False,
              overwrite=False,
              output=sys.stdout):
    pltpath = opt.nameof('out', 'plots', cf=cf)

    p = os.path.join(pltpath, '%s' % year, '%02d_*' % month)
    folders = glob.glob(p)
    folders.sort()

    monthn = dateu.month_names(month).lower()
    zipfile = 'plots_%s_%d.tar.gz' % (monthn, year)
    zipfile = os.path.join(pltpath, '%s' % year, zipfile)

    if os.path.isfile(zipfile) and not overwrite:
        if not quiet: print >> output, 'zip file % s already exist' % zipfile
        return

    # create zip:
    if folders: cb.tar_gz_dir(folders, zipfile)

    if not quiet:
        if folders:
            print >> output, 'Created tar.gz %s with contents:' % zipfile
            for i in folders:
                print >> output, '  %s' % i
        else:
            print >> output, 'No tar.gz created for %d %02d' % (year, month)

    # remove original files:
    if clean:
        for i in folders:
            if not quiet: print >> output, 'removing %s' % i
            shutil.rmtree(i)
Ejemplo n.º 26
0
def plt_flt(conf,plconf,date,FA='f',nest=0,**kargs):
  err  = ''
  fig  = False
  info = ''

  ifig  = kargs.get('ifig',0)
  quiet = kargs.get('quiet',0)

  date=dateu.parse_date(date)

  # find input files:
  args={'cf':conf,'date':date,'FA':FA,'nest':nest}
  flt = opt.nameof('out','flt',**args)
  grd = opt.nameof('in','grd',**args)
  if not os.path.isfile(flt):
    err='FLT file not found (%s)' % flt
    return err,fig,info
  if not os.path.isfile(grd):
    err='Grid file not found (%s)' % grd
    return err,fig,info

  date=dateu.parse_date(date)

  # plot grid:
  proj,fig = plt_grid(plconf,grd,ifig)

  Data,err = opt.get_plconf(plconf,'FLOATS')
  color  = Data['color'][ifig]
  width  = Data['width'][ifig]
  marker  = Data['marker'][ifig]
  mfcolor = Data['markerFaceColor'.lower()][ifig]
  mecolor = Data['markerEdgeColor'.lower()][ifig]
  mewidth = Data['markerEdgeWidth'.lower()][ifig]
  msize   = Data['markerSize'.lower()][ifig]

  f=roms.Flt(flt,grd)
  ntimes,npos=f.lon.shape
  x,y=f.lon[...],f.lat[...]
  x=np.ma.masked_where(x>1e3,x)
  x,y=proj(x,y)

  # initial locations:
  pl.plot(x[0,:],y[0,:],linewidth=0,marker=marker,mec=mecolor,mfc=mfcolor,ms=msize, mew=mewidth)

  # all trajectories:
  for i in range(npos):
    pl.plot(x[:,i],y[:,i],linewidth=width,color=color)


  # tilte:
  Title=opt.get_plconf(plconf,'AXES','title')
  if Title[ifig]:
    simpleTitle=1

    rdate=date.strftime('%d-%m-%Y')

    Ndays=f.tdays[-1]-f.tdays[0]

    title='drifters %s after %s (%4.2f days)' % (FA,rdate,Ndays)
    if simpleTitle:
      title='drifters after %s (%4.2f days)' % (rdate,Ndays)

    pl.title(title)

  # lims change in some mpl versions !!
  pl.gca().axis([proj.xmin, proj.xmax, proj.ymin, proj.ymax])

  return err,fig,info
Ejemplo n.º 27
0
def plt_wind_rose(conf, plconf, date, FA='a', nest=0, **kargs):
    err = ''
    fig = []
    info = []

    ifig = kargs.get('ifig', 0)
    quiet = kargs.get('quiet', 0)
    place = kargs.get('place', False)
    day = kargs.get('day', 'all')

    date = dateu.parse_date(date)

    # find input files:
    args = {'cf': conf, 'date': date, 'FA': FA, 'nest': nest}
    atm = opt.nameof('in', 'blk', **args)
    grd = opt.nameof('in', 'grd', **args)
    if not os.path.isfile(atm):
        err = 'ATM file not found (%s)' % atm
        return err, fig, info
    if not os.path.isfile(grd):
        err = 'Grid file not found (%s)' % grd
        return err, fig, info

    # get conf data and places:
    Data, err = opt.get_plconf(plconf, 'WINDR')
    Places, err = opt.get_plconf(plconf, 'WINDR_PLACES')
    figpos = Data['fig_size'][ifig]
    axpos = Data['ax_pos'][ifig]
    fontsize = Data['fontsize'][ifig]
    linewidth = Data['linewidth'][ifig]
    legType = Data['legtype'][ifig]
    intensities = Data['intensities'][ifig]
    percentages = Data['percentages'][ifig]
    Title = Data['title'][ifig]
    labels = Data['labels'][ifig]

    places = {}
    for k in Places.keys():
        places[k] = Places[k][ifig]

    # get data from atm file:
    f = roms.Blk(atm, grd)
    for k in places.keys():
        if place and place != k.strip('_'): continue
        lon, lat = places[k][:2]
        Ndays = int(np.ceil(f.tdays[-1] - f.tdays[0]))
        if day == 'all': Days = range(Ndays)
        else: Days = [day]

        for Day in Days:
            time, u, v = f.get('wind_ts', lon=lon, lat=lat, day=Day)

            # calc angle and intensity:
            D = np.arctan2(v, u) * 180 / np.pi
            F = np.sqrt(u**2 + v**2)

            # wind_rose:
            args = {
                'fontsize': fontsize,
                'linewidth': linewidth,
                'figpos': figpos,
                'axpos': axpos,
                'legtype': legType,
                'labels': labels
            }

            # tilte:
            if Title:
                placeStr = places[k][2]  #k.strip('_').replace('_',' ')

                simpleTitle = 1

                rdate = date.strftime('%d-%m-%Y')
                title = '%s %s %s %d' % (placeStr, rdate, FA, Day)

                if simpleTitle:  # simpler version of title:
                    if FA == 'f':  # forecast date:
                        rdate = dateu.next_date(date, Day)
                        rdate = rdate.strftime('%d-%m-%Y')

                    title = '%s %s' % (placeStr, rdate)
                    if FA == 'f':
                        title = title + ' (forec)'

                args['labtitle'] = title
                args['lablegend'] = 'wind m/s'

            tmp = wr.wind_rose(D, F, di=intensities, ci=percentages, **args)
            fig += [tmp]

            info += [(k, Day)]

    return err, fig, info
Ejemplo n.º 28
0
def clean_ini(cf,date1,date2,FA='a',nest=0,clean=False,quiet=False,output=sys.stdout):
  '''Create text file with the current ini links
  If the ini file is a link is can be unlinked; if it is a file it
  is not removed !
  '''
  def read_log(f):
    out=cb.odict()
    if os.path.isfile(f):
      L=open(log).readlines()
      for l in L:
        tmp=l.split(' ',1)
        sdate=tmp[0]
        scontents=tmp[1].rstrip().split(' + ')
        out[tmp[0]]=scontents

    return out

  def gen_log(f,L):
    i=open(f,'w')
    keys=L.keys()
    keys.sort()
    for d in keys:
      scontents=sjoin(L[d],' + ')
      i.write('%s %s\n' % (d,scontents))

    i.close()

  def add2log(f,add):
    L=read_log(f)
    L0=L.copy()
    sdate=add[0]
    contents=add[1].rstrip()
    if L.has_key(sdate) and contents not in L[sdate]:
      L[sdate]+=[contents]
      #if not quiet: print >>output,' +'+sdate+' '+contents
    elif not L.has_key(sdate):
      L[sdate]=[contents]
      #if not quiet: print >>output,'  '+sdate+' '+contents

    if L!=L0:
      gen_log(f,L)
      return True
    else: return False # file has not changed

  files=[]
  date=date1

  log='ini_log_%s_%s.txt' % (date1,date2)
  p=opt.pathof(cf,'inputs','ini')
  log=os.path.join(p,log)

  if not quiet: print >>output,'Creating/updating ini log %s' % log

  HasChanged=False
  while date<=date2:
    f=opt.nameof('in','ini',date,FA,nest,cf)
    if os.path.islink(f):
      src=os.readlink(f)
      add=(date,'%s --> %s' % (f,src))
      hasChanged=add2log(log,add)
      HasChanged=HasChanged or hasChanged
      if clean:
        # remove link:
        if not quiet: print >>output,'removing %s' % f
        os.remove(f)

    elif os.path.isfile(f):
      hs=cb.hsize(os.path.getsize(f))
      ssize='%s %s' % (str(hs[0]),hs[1])
      add=(date,'%s --> %s' % (f,ssize))
      hasChanged=add2log(log,add)
      HasChanged=HasChanged or hasChanged
      if not quiet:  print >>output,date,' keeping ', f, ' ',hs[0],hs[1]
    else:
      print >>output,date,' no file'

    date=dateu.next_date(date,1)

  if not quiet:
    if HasChanged:  print >>output,'  file has changed'
    else:           print >>output,'  file has not changed'
Ejemplo n.º 29
0
def gen_in(date,FA='a',nest=0,cf=CONF):
  err=''
  isFatal=False

  instd=opt.nameof('in','rin0',nest=nest,FA=FA,cf=cf)
  rin  =opt.nameof('in','rin',date,FA,nest,cf=cf)

  if not os.path.isfile(instd):
    err='ERROR: standard roms in not found: %s' % instd
    isFatal=True
  else:
    try:
      s=open(instd,'r').read()

      epath,exc=opt.nameof_run(cf=cf,FA=FA)
      RUN=os.path.join(epath,exc)
      kargs={'date':date,'FA':FA,'nest':nest,'cf':cf}
      inikargs={'date':date,'FA':'a','nest':nest,'cf':cf}
      d={'grd':    relativepath(RUN, opt.nameof('in', 'grd',**kargs)),
         'frc':    relativepath(RUN, opt.nameof('in', 'frc',**kargs)),
         'blk':    relativepath(RUN, opt.nameof('in', 'blk',**kargs)),
         'clm':    relativepath(RUN, opt.nameof('in', 'clm',**kargs)),
         'bry':    relativepath(RUN, opt.nameof('in', 'bry',**kargs)),
         'ini':    relativepath(RUN, opt.nameof('in', 'ini',**inikargs)),
         'rst':    relativepath(RUN, opt.nameof('out','rst',**kargs)),
         'his':    relativepath(RUN, opt.nameof('out','his',**kargs)),
         'avg':    relativepath(RUN, opt.nameof('out','avg',**kargs)),
         'flt_in': relativepath(RUN, opt.nameof('in', 'flt',**kargs)),
         'flt':    relativepath(RUN, opt.nameof('out','flt',**kargs)),
         'sta_in': relativepath(RUN, opt.nameof('in', 'sta',**kargs)),
         'sta':    relativepath(RUN, opt.nameof('out','sta',**kargs)),
         'title':  opt.atts_info(cf)['title'],
         'appcpp': opt.atts_info(cf)['appcpp'],
         'bio_in': relativepath(RUN, opt.nameof('in', 'bio',**kargs)),
         'dia':    relativepath(RUN, opt.nameof('out','dia',**kargs))
         }

      d['dstart']= '%d' % dateu.date_diff(date,'1970-01-01').days  # days since 19700101
      jobinfo=opt.run_sub_info(cf,date=date,FA=FA)
      kk='ntilei','ntilej'
      for k in kk: d[k]=jobinfo[k]

      for k in d.keys(): s=s.replace('#'+k.upper()+'#',d[k])

      fid=open(rin,'w')
      fid.write(s)
      fid.close()
    except:
      err='ERROR creating roms in file'
      isFatal=True

  return err,isFatal, rin
Ejemplo n.º 30
0
def oof(cf,plconf,date=False,last_date=False,FA='a',env=False):
  # start email notifications service:
  emailInfo=opt.email_info(cf=cf)
  sendEmail=emailInfo['send']
  #if sendEmail: sys.stdout=opt.Redirect()

  env_vars(env)
  flags=opt.flags_info(cf)

  if date: date=dateu.parse_date(date)
  if last_date: last_date=dateu.parse_date(last_date)

  if not date:
    # find date-1 for prediction:
    date,file=find_last(type='rst',cf=cf)
    if not date:
      on_error(sendEmail,'ERROR (%s): Cannot find previous file'%FA,emailInfo)
      return
    else:
      print 'Last date = %s from file %s' % (date,file)
      rout=opt.nameof('out','rout',date=date,FA='a',cf=cf)
      if is_roms_out_ok(rout):
        print 'Previous roms out is ok: %s' % rout
      else:
        on_error(sendEmail,'ERROR (%s): Last run is not ok %s : %s' % (FA,date,rout),emailInfo)
        return

  else:
    date=dateu.next_date(date,-1)

  # read dates:
  start_date,end_date=opt.dates_info(cf)
  if last_date: end_date=dateu.next_date(last_date,+1)

  while date >= start_date and date < end_date:

    # read dates again, possible update may occur.
    start_date,end_date=opt.dates_info(cf)
    if last_date: end_date=dateu.next_date(last_date,+1)

    date=dateu.next_date(date)

    # check if already runned for that date:
    # ie, check for rst and check if roms_out is ok:
    rst=opt.nameof('out','rst',date=date,FA=FA,cf=cf)
    rout=opt.nameof('out','rout',date=date,FA=FA,cf=cf)

    if os.path.isfile(rst):
      print 'Found rst file for %s: %s' % (date,rst)
      if os.path.isfile(rout):
        if is_roms_out_ok(rout):
          print '  previous roms out is ok: %s' % rout
        else:
          on_error(sendEmail,'ERROR (%s): Previous roms out is NOT ok: %s' % (FA,rout),emailInfo)
          break
      else:
        print '  roms out for %s not found: NOT CHECKED' % date

    else:

      print '\nModel will start from %s' % date

      # check for atm data for current simulation:
      if flags['atmfrc'] or flags['atmblk']:
        atmStat=check_atm(date,FA,cf=cf)
      else: atmStat=True

      ## wait for rst in case of fa==F:
      ##if FA=='f': rstStat=check_rst(date,cf=cf)
      ##else: rstStat=True
      rstStat=check_rst(date,cf=cf)

      # check for bondary data for current simulation:
      if flags['clmbry']:
        # this step may take forever !! just let us belive parent model is available
        #bcStat=check_bc(date,FA,cf=cf)
        bcStat=True
      else: bcStat=True

      now=time.strftime("%Y-%m-%d %H:%M:%S +0",time.gmtime())
      if (not atmStat is False) and (not rstStat is False) and (not bcStat is False):
        rout,dt,runErr=run(date,FA,cf=cf)
        now=time.strftime("%Y-%m-%d %H:%M:%S +0",time.gmtime())

        # check if run was ok:
        if is_roms_out_ok(rout):
          msg='NO error %s %s'%(date,FA)
          Msg='  Run %s %s finished ok [%s] dt=%6.2f' % (date,FA,now,dt)
          print Msg

          # make plots:
          if flags['plots']:
            err,savenames=op_plot.op_plt(cf,plconf,date,FA)
            if not all(e=='' for e in err):
              msg+=' --> ERROR plotting'
              print '  ERROR plotting : ',
              for e in err: print e

            if not all(e=='' for e in savenames):
              for sv in savenames:
                print '  Saved plot  '+sv

        elif runErr:
          on_error(sendEmail,'ERROR (%s): Run %s returned the error msg: %s' % (FA,date,runErr),emailInfo)
          break
        else:
          on_error(sendEmail,'ERROR (%s): Run %s finished with ERROR [%s] dt=%6.2f' % (FA,date,now,dt),emailInfo)
          break

      elif atmStat is False:
          Msg='ERROR (%s): Run %s cannot run (atm data missing) ERROR [%s]' % (FA,date,FA,now)
          if FA=='a':
            on_error(sendEmail,Msg,emailInfo)
            break
          else:
            msg='ERROR: atm data missing'
            print Msg

      elif rstStat is False:
        msg='ERROR: rst data missing'
        Msg='ERROR (%s): Run %s cannot run (atm data missing) ERROR [%s]' % (FA,date,now)
        print Msg


      print '\n'
      if sendEmail: send_email.send(emailInfo['dest'],Msg,msg)
Ejemplo n.º 31
0
def plt_hslice(conf, plconf, date, FA='a', nest=0, **kargs):
    err = ''
    fig = False
    info = {}

    type = 'avg'
    var = 'temp'
    slice = 'z'
    ind = -10
    time = -1
    currents = False
    dcurr = (3, 3)
    scurr = 3
    lcurr = 0.2
    ifig = 0
    # closefig = True
    clim = False
    quiet = False
    outStoragePath = False
    cmap = None
    norm = None
    useBar = True  # currents are barotropic for 2D vars (like zeta)

    keys = kargs.keys()
    if 'type' in keys: type = kargs['type']
    if 'var' in keys: var = kargs['var']
    if 'slice' in keys: slice = kargs['slice']
    if 'ind' in keys: ind = kargs['ind']
    if 'time' in keys: time = kargs['time']
    if 'currents' in keys: currents = kargs['currents']
    if 'dcurr' in keys: dcurr = kargs['dcurr']
    if 'scurr' in keys: scurr = kargs['scurr']
    if 'lcurr' in keys: lcurr = kargs['lcurr']
    if 'ifig' in keys: ifig = kargs['ifig']
    if 'closefig' in keys: closefig = kargs['closefig']
    if 'clim' in keys: clim = kargs['clim']
    if 'quiet' in keys: quiet = kargs['quiet']
    if 'ostorage' in keys: outStoragePath = kargs['ostorage']
    if 'cmap' in keys: cmap = kargs['cmap']
    if 'usebar' in keys: useBar = kargs['usebar']
    if 'norm' in keys: norm = kargs['norm']

    date = dateu.parse_date(date)

    # find input files:
    args = {
        'cf': conf,
        'date': date,
        'FA': FA,
        'nest': nest,
        'ostorage': outStoragePath
    }
    his = opt.nameof('out', type, **args)
    clm = opt.nameof('in', 'clm', **args)
    grd = opt.nameof('in', 'grd', **args)
    if not os.path.isfile(his):
        err = 'Main file not found (%s)' % his
        return err, fig, info
    if not os.path.isfile(grd):
        err = 'Grid file not found (%s)' % grd
        return err, fig, info
    r = roms.His(his, grd)

    # plot grid:
    proj, fig, ax = plt_grid(plconf, grd, ifig)

    def add_colorbar(handle, **args):
        ax = pl.gca()
        Data, err = opt.get_plconf(plconf, 'AXES')
        cbpos = Data['cbpos'][ifig]
        cbbgpos = Data['cbbgpos'][ifig]
        cbbgc = Data['cbbgcolor'][ifig]
        cbbga = Data['cbbgalpha'][ifig]
        cblab = Data['cblabel'][ifig]

        # colorbar bg axes:
        if cbbgpos:
            rec = pl.axes((cbpos[0] - cbpos[2] * cbbgpos[0],
                           cbpos[1] - cbbgpos[2] * cbpos[3], cbpos[2] *
                           (1 + cbbgpos[0] + cbbgpos[1]), cbpos[3] *
                           (1 + cbbgpos[2] + cbbgpos[3])),
                          axisbg=cbbgc,
                          frameon=1)

            rec.patch.set_alpha(cbbga)
            rec.set_xticks([])
            rec.set_yticks([])
            for k in rec.axes.spines.keys():
                rec.axes.spines[k].set_color(cbbgc)
                rec.axes.spines[k].set_alpha(cbbga)

        # colorbar:
        if cbpos:
            cbax = fig.add_axes(cbpos)
            if cbpos[2] > cbpos[3]: orient = 'horizontal'
            else: orient = 'vertical'
            cb = pl.colorbar(handle,
                             cax=cbax,
                             orientation=orient,
                             drawedges=0,
                             **args)
            pl.axes(ax)

        # colorbar label:
        if cblab:
            Data, err = opt.get_plconf(plconf, 'HSLICES')
            varnames = Data['varnames'][ifig].split(',')
            vnames = Data['vnames'][ifig].split(',')
            lab = ''
            for i in range(len(varnames)):
                if varnames[i].strip() == var:
                    lab = vnames[i].strip()
                    break

            if lab:
                if r.hasz(var):
                    if slice == 'k':
                        if ind == 0: lab = 'Bottom ' + lab
                        elif ind in (-1, 'surface'): lab = 'Surface ' + lab
                    elif slice == 'z':
                        lab = lab + ' ' + str(ind) + 'm'

                cb.set_label(lab)

    def add_currkey(handle):
        Data, err = opt.get_plconf(plconf, 'HSLICES')
        pos = Data['kcurrpos'][ifig]
        if pos:
            pl.quiverkey(handle,
                         pos[0],
                         pos[1],
                         lcurr,
                         '%s m/s' % str(lcurr),
                         labelpos='S',
                         coordinates='axes')

    # hslice:
    if var:
        if slice == 'k': metodo = r.slicek
        elif slice == 'z': metodo = r.slicez

        x, y, z, v = metodo(var, ind, time, plot=False)
        x, y = proj(x, y)

        # cmap:
        if isinstance(cmap, basestring):
            try:
                cmap = pl.cm.cmap_d[cmap]
            except:
                try:
                    from okean import pl_tools
                    cmap = pl_tools.cm.cmap_d[cmap]
                except:
                    cmap = pl.cm.jet

        # original data from clm
        if slice == 'k' and ind in (
                -1, ) and var + '_original' in netcdf.varnames(clm):
            tcurr = r.datetime[time]
            x_o = netcdf.use(clm, 'x_original')
            y_o = netcdf.use(clm, 'y_original')
            x_o, y_o = proj(x_o, y_o)
            v_o = netcdf.use(clm, 'y_original')
            t_o = netcdf.nctime(clm, 'clim_time')

            # average to current time:
            i0, = np.where(t_o <= tcurr)[-1]
            i1, = np.where(t_o > tcurr)[0]
            v_o0 = netcdf.use(clm, var + '_original', time=i0)
            v_o1 = netcdf.use(clm, var + '_original', time=i1)
            # avg:
            a = tcurr - t_o[i0]
            b = t_o[i1] - tcurr

            a = a.days * 86400 + a.seconds
            b = b.days * 86400 + b.seconds

            if a == 0: v_o = v_o0
            elif b == 0: v_o = v_o1
            else: v_o = (v_o0 * b + v_o1 * a) / (a + b)

            pch = pl.pcolormesh(x_o, y_o, v_o, shading='flat', cmap=cmap)
            if clim: pl.clim(clim[0], clim[1])

        if norm == 'log':
            from matplotlib.colors import LogNorm
            Norm = LogNorm(vmin=clim[0], vmax=clim[1])
        else:
            Norm = None

        # change hypoxia colorbar/cmap
        if var == 'dye_01':
            HypoxiaLim = 135
            from okean import pl_tools
            cmap = pl_tools.ucmaps().gen_oxygen(
                v=(0, HypoxiaLim, 300.))  # default is 0,135,300 !!

        pch = pl.pcolormesh(x, y, v, shading='flat', cmap=cmap, norm=Norm)
        if clim: pl.clim(clim[0], clim[1])

        # hypoxia:
        if var == 'dye_01' and ind == 0 and ifig == 0:
            cond = v < 135.
            cond = v < HypoxiaLim
            cond = (v < HypoxiaLim) & (r.grid.h > 5)

            pm = r.grid.use('pm')
            pn = r.grid.use('pn')
            A = (1 / pm[cond] * 1 / pn[cond] / 1e6).sum()

            x_, y_ = proj(-98, 29.5)
            pl.text(x_,
                    y_,
                    'Hypoxia area = %.0f km$^2$' % A,
                    color='r',
                    fontweight='bold',
                    fontname='monospace',
                    bbox=dict(edgecolor='none', facecolor='white', alpha=0.8))
        # hypoxia.

        # colorbar:
        if norm == 'log':
            tks = 10**np.linspace(np.log10(clim[0]), np.log10(clim[1]), 4)
            opts = {'ticks': tks, 'format': '%.2f'}
        else:
            opts = {'ticks': None}
        add_colorbar(pch, **opts)

    if currents:
        if (var and r.hasz(var)) or not useBar: uvind = ind
        else: uvind = 'bar'

        x, y, z, u, v = r.sliceuv(uvind, time)
        xm, ym = proj(x, y)
        mm = np.zeros(x.shape, 'bool')
        mm[::dcurr[0], ::dcurr[1]] = True

        Data, err = opt.get_plconf(plconf, 'HSLICES')
        wcurr = Data['wcurr'][ifig]
        acurr = Data['acurr'][ifig]

        qvopts = {'units': 'x', 'scale': scurr, 'width': wcurr, 'alpha': acurr}
        if var:
            q = pl.quiver(xm[mm], ym[mm], u[mm], v[mm], **qvopts)
        else:
            s = np.sqrt(u**2 + v**2)
            q = pl.quiver(xm[mm], ym[mm], u[mm], v[mm], s[mm], **qvopts)
            if clim: pl.clim(clim[0], clim[1])
            add_colorbar(q)

        add_currkey(q)

    # store some info that may be required later
    info['hasz'] = False
    if var and r.hasz(var): info['hasz'] = True

    # logo:
    if ifig == 0:
        im = os.path.join(os.path.dirname(__file__), 'logo_INOCAR.png')
        i = pl.imread(im)
        h, w = i.shape[:2]
        rx = .12
        W = (proj.xmax - proj.xmin) * rx
        H = W * h / w
        l = proj.xmax
        #pl.fill([proj.xmax-W, proj.xmax, proj.xmax,     proj.xmax-W],
        #           [proj.ymin,   proj.ymin, proj.ymin+2.8*H, proj.ymin+2.8*H],
        #           '#500000',alpha=0.25,ec='none')

        ax.imshow(i,
                  extent=(proj.xmax * .98 - W, proj.xmax * .98,
                          proj.ymin + H * .1, proj.ymin + H * 1.1),
                  zorder=1e3)
        #pl.text(proj.xmax-W/2., proj.ymin+2.2*H,'OOF',
        #           fontdict={'size':14,'family':'serif'},
        #           color='#500000',ha='center',weight='bold')

        pl.text(proj.xmax * .8,
                proj.ymax * (-.1),
                r.datetime[time].strftime("%d %b %Y"),
                fontdict={
                    'size': 11,
                    'family': 'monospace'
                },
                ha='center')

        if FA == 'f':
            s = 'Pronostico desde %s' % r.datetime[0].strftime("%d %b %Y")
            pl.text(
                proj.xmax * .8,
                proj.ymax * (-.15),
                s,
                #pl.text(proj.xmax-W/2., proj.ymin+1.1*H,s,
                fontdict={'fontsize': 10},
                ha='center')
    # logo.

    # lims change in some mpl versions !!
    pl.gca().axis([proj.xmin, proj.xmax, proj.ymin, proj.ymax])

    return err, fig, info
Ejemplo n.º 32
0
def plt_wind(conf,plconf,date,FA='a',nest=0,**kargs):
  err  = ''
  fig  = False
  info = ''

  ifig  = kargs.get('ifig',0)
  day   = kargs.get('day',0)
  quiet = kargs.get('quiet',0)

  time=day
  date=dateu.parse_date(date)

  # find input files:
  args={'cf':conf,'date':date,'FA':FA,'nest':nest}
  atm = opt.nameof('in','blk',**args)
  grd = opt.nameof('in','grd',**args)
  if not os.path.isfile(atm):
    err='ATM file not found (%s)' % atm
    return err,fig,info
  if not os.path.isfile(grd):
    err='Grid file not found (%s)' % grd
    return err,fig,info

  Data,err = opt.get_plconf(plconf,'WIND')
  dcurr=Data['dcurr'][ifig]
  lcurr=Data['lcurr'][ifig]
  scurr=Data['scurr'][ifig]
  clim =Data['clim'][ifig]
  tind = Data['time'][ifig]

  x=netcdf.use(grd,'lon_rho')
  y=netcdf.use(grd,'lat_rho')
  wtime=netcdf.nctime(atm,'time')
  cnd=(wtime>=date+datetime.timedelta(days=day))&(date<date+datetime.timedelta(days=day+1))
  u=netcdf.use(atm,'Uwind',time=cnd)
  v=netcdf.use(atm,'Uwind',time=cnd)
  if tind=='dailyMean':
    u=u.mean(0)
    v=v.mean(0)
    sdate=wtime[cnd][0] # for title... 1st day 00h is expected to be 1st date,
                        # or model should not run!
  else: # tind of some day, ex: tind 0 from forec day 3
    u=u[tind]
    v=v[tind]
    sdate=wtime[cnd][tind]


  if day>len(u)-1:
    err='Invalid day %d (max=%d)' % (day,len(u)-1)
    return err,fig,info

  # plot grid:
  proj,fig,ax= plt_grid(plconf,grd,ifig)


  # no mask on land:
  mask=np.zeros(u.shape,'bool')
  mask[::dcurr[0],::dcurr[1]]=True
  xm, ym = proj(x,y)

  s=np.sqrt(u**2+v**2)
  q=pl.quiver(xm[mask],ym[mask],u[mask],v[mask],s[mask],scale=scurr,zorder=100)

  pl.clim(clim[0],clim[1])


  def add_colorbar(handle,**args):
    ax=pl.gca()
    Data,err = opt.get_plconf(plconf,'AXES')
    cbpos    = Data['cbpos'][ifig]
    cbbgpos  = Data['cbbgpos'][ifig]
    cbbgc    = Data['cbbgcolor'][ifig]
    cbbga    = Data['cbbgalpha'][ifig]
    cblab    = Data['cblabel'][ifig]

    # colorbar bg axes:
    if cbbgpos:
      rec=pl.axes((cbpos[0]-cbpos[2]*cbbgpos[0],cbpos[1]-cbbgpos[2]*cbpos[3],
                      cbpos[2]*(1+cbbgpos[0]+cbbgpos[1]),cbpos[3]*(1+cbbgpos[2]+cbbgpos[3])),
                      axisbg=cbbgc,frameon=1)

      rec.patch.set_alpha(cbbga)
      rec.set_xticks([])
      rec.set_yticks([])
      for k in rec.axes.spines.keys():
        rec.axes.spines[k].set_color(cbbgc)
        rec.axes.spines[k].set_alpha(cbbga)


    # colorbar:
    if cbpos:
      cbax=fig.add_axes(cbpos)
      if cbpos[2]>cbpos[3]: orient='horizontal'
      else: orient='vertical'
      cb=pl.colorbar(handle,cax=cbax,orientation=orient,drawedges=0,**args)
      pl.axes(ax)

      # colorbar label:
      cb.set_label(r'Wind Speed [m s$^{\rm{-1}}$]')

  def add_currkey(handle):
    pos=Data['kcurrpos'][ifig]
    if pos:
      pl.quiverkey(handle, pos[0], pos[1], lcurr, '%s m/s' % str(lcurr),labelpos='S',
                                                coordinates='axes')


  add_colorbar(q)
  add_currkey(q)

  # tilte:
  Title,err=opt.get_plconf(plconf,'AXES','title')
  if Title[ifig]:
    simpleTitle=1

    rdate=date.strftime('%d-%m-%Y')
    title='wind %s %s %d' % (rdate,FA,day)


    if simpleTitle: # simpler version of title:
      if FA=='f': # forecast date:
        rdate=dateu.next_date(date,day);
        rdate=rdate.strftime('%d-%m-%Y')

      title='wind %s' % (rdate)
      if FA=='f':
        title=title+' (forec)'

    pl.title(title)


  # logo:
  if ifig==0:
    im=os.path.join(os.path.dirname(__file__),'logo_INOCAR.png')
    i=pl.imread(im)
    h,w=i.shape[:2]
    rx=.12
    W=(proj.xmax- proj.xmin)*rx
    H=W*h/w
    l=proj.xmax
    #pl.fill([proj.xmax-W, proj.xmax, proj.xmax,     proj.xmax-W],
    #           [proj.ymin,   proj.ymin, proj.ymin+2.8*H, proj.ymin+2.8*H],
    #           '#500000',alpha=0.25,ec='none')

    ax.imshow(i,extent=(proj.xmax*.98-W,proj.xmax*.98, proj.ymin+H*.1, proj.ymin+H*1.1),zorder=1e3)
    #pl.text(proj.xmax-W/2., proj.ymin+2.2*H,'OOF',
    #           fontdict={'size':14,'family':'serif'},
    #           color='#500000',ha='center',weight='bold')

    pl.text(proj.xmax*.8, proj.ymax*(-.1),sdate.strftime("%d %b %Y"),
    #pl.text(proj.xmax*.62, proj.ymax*.93,sdate.strftime("%d %b %Y"),
               fontdict={'size':13,'family':'monospace'},ha='center')
    # change date format if tind is not daily mean, ie, add hour, etc

    if FA=='f':
      s='Pronostico desde %s' % date.strftime("%d %b %Y")
      pl.text(proj.xmax*.8, proj.ymax*(-.15),s, ##this is outside
      #pl.text(proj.xmax-W/2., proj.ymin+1.1*H,s, ##this is in the proj (inside)
                 fontdict={'fontsize':10},ha='center')
  # logo.


  # lims change in some mpl versions !!
  pl.gca().axis([proj.xmin, proj.xmax, proj.ymin, proj.ymax])

  return err,fig,info
Ejemplo n.º 33
0
def op_plt_hslice(conf, plconf, date, FA, nest=0, **kargs):
    closefig = kargs.get('closefig', True)
    clearfig = kargs.get('clearfig', True)
    save = kargs.get('save', True)
    Varname = kargs.get('vname', False)
    Depth = kargs.get('depth', False)

    date = dateu.parse_date(date)

    Err = []
    Out = []
    pltpath = opt.nameof('out', 'plots', cf=conf)

    Figure, err = opt.get_plconf(plconf, 'FIGURE')
    Hslices, err = opt.get_plconf(plconf, 'HSLICES')
    Title, err = opt.get_plconf(plconf, 'AXES', 'title')

    def iterv(v):
        try:
            len(v)
        except:
            v = [v]
        return v

    for i in range(len(Figure.values()[0])):  # loop figures
        Varnames = Hslices['varnames'][i].split(',')
        Varnames = [s.strip() for s in Varnames]

        depths = Hslices['depths'][i]
        addcurr = Hslices['addcurr'][i]
        #    clims    = Hslices['clim'][i]

        depths = iterv(depths)
        addcurr = iterv(addcurr)
        #    clims   = iterv(clims)

        kargs = {}
        kargs['ifig'] = i
        kargs['type'] = Hslices['input'][i]
        #kargs['time']=Inputs['time'][i]
        TIMES = Hslices['time'][i]

        kargs['dcurr'] = Hslices['dcurr'][i]
        kargs['scurr'] = Hslices['scurr'][i]
        kargs['lcurr'] = Hslices['lcurr'][i]

        if Varname: varnames = [Varname]
        else: varnames = Varnames

        for var in varnames:  # loop variables
            var = var.strip()

            nv = Varnames.index(var)
            kargs['cmap'] = Hslices['cmap'][i].split(',')[nv].strip()
            kargs['norm'] = Hslices['norm'][i].split(',')[nv].strip()

            kargs['var'] = var
            vdepths = depths[nv]

            try:
                iter(vdepths)
            except:
                vdepths = [vdepths]

            if Depth: vdepths = [Depth]

            nz = -1
            for z in vdepths:  # loop depths
                nz += 1
                if z in ('s', 'surf', 'surface') or z >= 0:
                    kargs['ind'] = z
                    kargs['slice'] = 'k'
                else:
                    kargs['ind'] = z
                    kargs['slice'] = 'z'

                cl = opt.get_clims(date, var, z, plconf)[i]

                kargs['clim'] = cl

                for addc in addcurr:  # add/no currents
                    kargs['currents'] = addc

                    # loop over time:
                    if TIMES == 'all':
                        if FA == 'a': times = [-1]
                        else:
                            times = range(
                                int(opt.get_conf(conf, 'PRED', 'npred')[0]))
                    else:
                        times = [TIMES]

                    for it in times:
                        kargs['time'] = it

                        e, fig, info = plt_hslice(conf, plconf, date, FA, nest,
                                                  **kargs)
                        Err += [e]

                        if not e:
                            if var: svar = var
                            else: svar = ''

                            if addc: scurr = 'curr'
                            else: scurr = ''

                            if info['hasz']:
                                sslice = kargs['slice'] + '_' + str(
                                    kargs['ind'])
                            else:
                                sslice = ''

                            if date.hour > 0:
                                sdate = date.strftime('%Y%m%d_%H')
                            else:
                                sdate = date.strftime('%Y%m%d')

                            savename = '%s_%s_n%d_%s_%d_%s_%s_%s_%s' % (
                                sdate, FA, nest, kargs['type'], kargs['time'],
                                svar, scurr, sslice, Figure['tag'][i])

                            if Title[i]:
                                simpleTitle = 1

                                rdate = date.strftime('%d-%m-%Y')

                                if sslice: sslice = sslice[2:]
                                title = '%s#%s#n%d#%s#%d#%s#%s#%s' % (
                                    rdate, FA, nest, kargs['type'],
                                    kargs['time'], svar, scurr, sslice)

                                if simpleTitle:  # simpler version of title:
                                    if FA == 'f':  # forecast date:
                                        rdate = dateu.next_date(
                                            date, kargs['time'])
                                        rdate = date.strftime('%d-%m-%Y')

                                    title = '%s#%s#%s#%s' % (rdate, svar,
                                                             scurr, sslice)
                                    if FA == 'f': title = title + ' (forec)'

                                while 1:
                                    if title.find('##') > -1:
                                        title = title.replace('##', '#')
                                    else:
                                        break
                                title = title.replace('#', ' ')
                                pl.title(title)

                            while 1:
                                if savename.find('__') > -1:
                                    savename = savename.replace('__', '_')
                                else:
                                    break

                            savename = savename.strip('_')

                            if save:
                                Y, M, D = date.year, date.month, date.day,
                                Ydest = os.path.join(pltpath, '%s' % Y)
                                if not os.path.isdir(Ydest): os.mkdir(Ydest)
                                MDdest = os.path.join(Ydest,
                                                      '%02d_%02d' % (M, D))
                                if not os.path.isdir(MDdest): os.mkdir(MDdest)

                                savename = os.path.join(
                                    MDdest,
                                    savename + '.' + Figure['extension'][i])
                                Out += [savename]

                                pl.savefig(savename, dpi=pl.gcf().dpi)
                                #pl.savefig(savename,dpi=300)

                            if clearfig: fig.clear()
                            if closefig: pl.close(fig)

    return Err, Out
Ejemplo n.º 34
0
def plt_hslice(conf,plconf,date,FA='a',nest=0,**kargs):
  err=''
  fig=False
  info={}

  type     = 'avg'
  var      = 'temp'
  slice    = 'z'
  ind      = -10
  time     = -1
  currents = False
  dcurr    = (3,3)
  scurr    = 3
  lcurr    = 0.2
  ifig     = 0
# closefig = True
  clim     = False
  quiet    = False
  outStoragePath=False
  cmap     = None
  norm     = None
  useBar   = True # currents are barotropic for 2D vars (like zeta)

  keys=kargs.keys()
  if 'type'     in keys: type     = kargs['type']
  if 'var'      in keys: var      = kargs['var']
  if 'slice'    in keys: slice    = kargs['slice']
  if 'ind'      in keys: ind      = kargs['ind']
  if 'time'     in keys: time     = kargs['time']
  if 'currents' in keys: currents = kargs['currents']
  if 'dcurr'    in keys: dcurr    = kargs['dcurr']
  if 'scurr'    in keys: scurr    = kargs['scurr']
  if 'lcurr'    in keys: lcurr    = kargs['lcurr']
  if 'ifig'     in keys: ifig     = kargs['ifig']
  if 'closefig' in keys: closefig = kargs['closefig']
  if 'clim'     in keys: clim     = kargs['clim']
  if 'quiet'    in keys: quiet    = kargs['quiet']
  if 'ostorage' in keys: outStoragePath = kargs['ostorage']
  if 'cmap'     in keys: cmap     = kargs['cmap']
  if 'usebar'   in keys: useBar   = kargs['usebar']
  if 'norm'     in keys: norm     = kargs['norm']

  date=dateu.parse_date(date)

  # find input files:
  args={'cf':conf,'date':date,'FA':FA,'nest':nest,'ostorage':outStoragePath}
  his = opt.nameof('out',type,**args)
  clm = opt.nameof('in','clm',**args)
  grd = opt.nameof('in','grd',**args)
  if not os.path.isfile(his):
    err='Main file not found (%s)' % his
    return err,fig,info
  if not os.path.isfile(grd):
    err='Grid file not found (%s)' % grd
    return err,fig,info
  r=roms.His(his,grd)

  # plot grid:
  proj,fig, ax = plt_grid(plconf,grd,ifig)

  def add_colorbar(handle,**args):
    ax=pl.gca()
    Data,err = opt.get_plconf(plconf,'AXES')
    cbpos    = Data['cbpos'][ifig]
    cbbgpos  = Data['cbbgpos'][ifig]
    cbbgc    = Data['cbbgcolor'][ifig]
    cbbga    = Data['cbbgalpha'][ifig]
    cblab    = Data['cblabel'][ifig]

    # colorbar bg axes:
    if cbbgpos:
      rec=pl.axes((cbpos[0]-cbpos[2]*cbbgpos[0],cbpos[1]-cbbgpos[2]*cbpos[3],
                      cbpos[2]*(1+cbbgpos[0]+cbbgpos[1]),cbpos[3]*(1+cbbgpos[2]+cbbgpos[3])),
                      axisbg=cbbgc,frameon=1)

      rec.patch.set_alpha(cbbga)
      rec.set_xticks([])
      rec.set_yticks([])
      for k in rec.axes.spines.keys():
        rec.axes.spines[k].set_color(cbbgc)
        rec.axes.spines[k].set_alpha(cbbga)


    # colorbar:
    if cbpos:
      cbax=fig.add_axes(cbpos)
      if cbpos[2]>cbpos[3]: orient='horizontal'
      else: orient='vertical'
      cb=pl.colorbar(handle,cax=cbax,orientation=orient,drawedges=0,**args)
      pl.axes(ax)

    # colorbar label:
    if cblab:
      Data,err = opt.get_plconf(plconf,'HSLICES')
      varnames=Data['varnames'][ifig].split(',')
      vnames=Data['vnames'][ifig].split(',')
      lab=''
      for i in range(len(varnames)):
        if varnames[i].strip()==var:
          lab=vnames[i].strip()
          break

      if lab:
        if r.hasz(var):
          if slice=='k':
            if ind==0: lab = 'Bottom '+lab
            elif ind in (-1,'surface'): lab = 'Surface '+lab
          elif slice=='z':
            lab=lab+' '+str(ind)+'m'

        cb.set_label(lab)


  def add_currkey(handle):
    Data,err = opt.get_plconf(plconf,'HSLICES')
    pos=Data['kcurrpos'][ifig]
    if pos:
      pl.quiverkey(handle, pos[0], pos[1], lcurr, '%s m/s' % str(lcurr),labelpos='S',
                                              coordinates='axes')

  # hslice:
  if var:
    if   slice=='k': metodo=r.slicek
    elif slice=='z': metodo=r.slicez

    x,y,z,v=metodo(var,ind,time,plot=False)
    x,y=proj(x,y)

    # cmap:
    if isinstance(cmap,basestring):
      try:cmap=pl.cm.cmap_d[cmap]
      except:
        try:
          from okean import pl_tools
          cmap=pl_tools.cm.cmap_d[cmap]
        except: cmap=pl.cm.jet

    # original data from clm
    if slice=='k' and ind in (-1,) and var+'_original' in netcdf.varnames(clm):
      tcurr= r.datetime[time]
      x_o=netcdf.use(clm,'x_original')
      y_o=netcdf.use(clm,'y_original')
      x_o,y_o=proj(x_o,y_o)
      v_o=netcdf.use(clm,'y_original')
      t_o=netcdf.nctime(clm,'clim_time')

      # average to current time:
      i0,=np.where(t_o<=tcurr)[-1]
      i1,=np.where(t_o>tcurr)[0]
      v_o0=netcdf.use(clm,var+'_original',time=i0)
      v_o1=netcdf.use(clm,var+'_original',time=i1)
      # avg:
      a=tcurr-t_o[i0]
      b=t_o[i1]-tcurr

      a=a.days*86400+a.seconds
      b=b.days*86400+b.seconds

      if a==0: v_o=v_o0
      elif b==0: v_o=v_o1
      else: v_o=(v_o0*b+v_o1*a)/(a+b)

      pch=pl.pcolormesh(x_o,y_o,v_o,shading='flat',cmap=cmap)
      if clim: pl.clim(clim[0],clim[1])

    if norm=='log':
      from matplotlib.colors import LogNorm
      Norm=LogNorm(vmin=clim[0],vmax=clim[1])
    else: Norm=None

    # change hypoxia colorbar/cmap
    if var=='dye_01':
      HypoxiaLim=135
      from okean import pl_tools
      cmap=pl_tools.ucmaps().gen_oxygen(v=(0,HypoxiaLim,300.)) # default is 0,135,300 !!

    pch=pl.pcolormesh(x,y,v,shading='flat',cmap=cmap, norm=Norm)
    if clim: pl.clim(clim[0],clim[1])

    # hypoxia:
    if var=='dye_01' and ind==0 and ifig==0:
      cond=v<135.
      cond=v<HypoxiaLim
      cond=(v<HypoxiaLim)&(r.grid.h>5)

      pm=r.grid.use('pm')
      pn=r.grid.use('pn')
      A=(1/pm[cond]*1/pn[cond]/1e6).sum()

      x_,y_=proj(-98,29.5)
      pl.text(x_,y_,'Hypoxia area = %.0f km$^2$' % A,color='r',
                       fontweight='bold',fontname='monospace',
                       bbox=dict(edgecolor='none',facecolor='white', alpha=0.8))
    # hypoxia.

    # colorbar:
    if norm=='log':
      tks=10**np.linspace(np.log10(clim[0]),np.log10(clim[1]),4)
      opts={'ticks':tks,'format':'%.2f'}
    else: opts={'ticks':None}
    add_colorbar(pch,**opts)

  if currents:
    if (var and r.hasz(var)) or not useBar:  uvind=ind
    else: uvind='bar'

    x,y,z,u,v=r.sliceuv(uvind,time)
    xm, ym = proj(x,y)
    mm=np.zeros(x.shape,'bool')
    mm[::dcurr[0],::dcurr[1]]=True


    Data,err = opt.get_plconf(plconf,'HSLICES')
    wcurr=Data['wcurr'][ifig]
    acurr=Data['acurr'][ifig]

    qvopts={'units':'x','scale':scurr,'width':wcurr,'alpha':acurr}
    if var:
      q=pl.quiver(xm[mm],ym[mm],u[mm],v[mm],**qvopts)
    else:
      s=np.sqrt(u**2+v**2)
      q=pl.quiver(xm[mm],ym[mm],u[mm],v[mm],s[mm],**qvopts)
      if clim: pl.clim(clim[0],clim[1])
      add_colorbar(q)

    add_currkey(q)

  # store some info that may be required later
  info['hasz']=False
  if var and r.hasz(var): info['hasz']=True


  # logo:
  if ifig==0:
    im=os.path.join(os.path.dirname(__file__),'logo_INOCAR.png')
    i=pl.imread(im)
    h,w=i.shape[:2]
    rx=.12
    W=(proj.xmax- proj.xmin)*rx
    H=W*h/w
    l=proj.xmax
    #pl.fill([proj.xmax-W, proj.xmax, proj.xmax,     proj.xmax-W],
    #           [proj.ymin,   proj.ymin, proj.ymin+2.8*H, proj.ymin+2.8*H],
    #           '#500000',alpha=0.25,ec='none')

    ax.imshow(i,extent=(proj.xmax*.98-W,proj.xmax*.98, proj.ymin+H*.1, proj.ymin+H*1.1),zorder=1e3)
    #pl.text(proj.xmax-W/2., proj.ymin+2.2*H,'OOF',
    #           fontdict={'size':14,'family':'serif'},
    #           color='#500000',ha='center',weight='bold')

    pl.text(proj.xmax*.8, proj.ymax*(-.1),r.datetime[time].strftime("%d %b %Y"),
               fontdict={'size':11,'family':'monospace'},ha='center')

    if FA=='f':
      s='Pronostico desde %s' % r.datetime[0].strftime("%d %b %Y")
      pl.text(proj.xmax*.8, proj.ymax*(-.15),s,
      #pl.text(proj.xmax-W/2., proj.ymin+1.1*H,s,
                 fontdict={'fontsize':10},ha='center')
  # logo.

  # lims change in some mpl versions !!
  pl.gca().axis([proj.xmin, proj.xmax, proj.ymin, proj.ymax])

  return err, fig, info
Ejemplo n.º 35
0
def plt_wind_rose(conf,plconf,date,FA='a',nest=0,**kargs):
  err  = ''
  fig  = []
  info = []

  ifig  = kargs.get('ifig',0)
  quiet = kargs.get('quiet',0)
  place = kargs.get('place',False)
  day   = kargs.get('day','all')

  date=dateu.parse_date(date)

  # find input files:
  args={'cf':conf,'date':date,'FA':FA,'nest':nest}
  atm = opt.nameof('in','blk',**args)
  grd = opt.nameof('in','grd',**args)
  if not os.path.isfile(atm):
    err='ATM file not found (%s)' % atm
    return err,fig,info
  if not os.path.isfile(grd):
    err='Grid file not found (%s)' % grd
    return err,fig,info

  # get conf data and places:
  Data,err   = opt.get_plconf(plconf,'WINDR')
  Places,err = opt.get_plconf(plconf,'WINDR_PLACES')
  figpos      = Data['fig_size'][ifig]
  axpos       = Data['ax_pos'][ifig]
  fontsize    = Data['fontsize'][ifig]
  linewidth   = Data['linewidth'][ifig]
  legType     = Data['legtype'][ifig]
  intensities = Data['intensities'][ifig]
  percentages = Data['percentages'][ifig]
  Title       = Data['title'][ifig]
  labels      = Data['labels'][ifig]

  places={}
  for k in Places.keys(): places[k]=Places[k][ifig]

  # get data from atm file:
  f=roms.Blk(atm,grd)
  for k in places.keys():
    if place and place!=k.strip('_'): continue
    lon,lat=places[k][:2]
    Ndays=int(np.ceil(f.tdays[-1]-f.tdays[0]))
    if day=='all': Days=range(Ndays)
    else: Days=[day]

    for Day in Days:
      time,u,v = f.get('wind_ts',lon=lon,lat=lat,day=Day)

      # calc angle and intensity:
      D=np.arctan2(v,u)*180/np.pi
      F=np.sqrt(u**2+v**2)

      # wind_rose:
      args={'fontsize':fontsize,'linewidth':linewidth,'figpos':figpos,
            'axpos':axpos,'legtype':legType,'labels':labels}

      # tilte:
      if Title:
        placeStr=places[k][2]#k.strip('_').replace('_',' ')

        simpleTitle=1

        rdate=date.strftime('%d-%m-%Y')
        title='%s %s %s %d' % (placeStr,rdate,FA,Day)

        if simpleTitle: # simpler version of title:
          if FA=='f': # forecast date:
            rdate=dateu.next_date(date,Day);
            rdate=rdate.strftime('%d-%m-%Y')

          title='%s %s' % (placeStr,rdate)
          if FA=='f':
            title=title+' (forec)'

        args['labtitle']=title
        args['lablegend']='wind m/s'

      tmp=wr.wind_rose(D,F,di=intensities,ci=percentages,**args)
      fig+=[tmp]

      info+=[(k,Day)]

  return err,fig,info
Ejemplo n.º 36
0
def plt_flt(conf, plconf, date, FA='f', nest=0, **kargs):
    err = ''
    fig = False
    info = ''

    ifig = kargs.get('ifig', 0)
    quiet = kargs.get('quiet', 0)

    date = dateu.parse_date(date)

    # find input files:
    args = {'cf': conf, 'date': date, 'FA': FA, 'nest': nest}
    flt = opt.nameof('out', 'flt', **args)
    grd = opt.nameof('in', 'grd', **args)
    if not os.path.isfile(flt):
        err = 'FLT file not found (%s)' % flt
        return err, fig, info
    if not os.path.isfile(grd):
        err = 'Grid file not found (%s)' % grd
        return err, fig, info

    date = dateu.parse_date(date)

    # plot grid:
    proj, fig = plt_grid(plconf, grd, ifig)

    Data, err = opt.get_plconf(plconf, 'FLOATS')
    color = Data['color'][ifig]
    width = Data['width'][ifig]
    marker = Data['marker'][ifig]
    mfcolor = Data['markerFaceColor'.lower()][ifig]
    mecolor = Data['markerEdgeColor'.lower()][ifig]
    mewidth = Data['markerEdgeWidth'.lower()][ifig]
    msize = Data['markerSize'.lower()][ifig]

    f = roms.Flt(flt, grd)
    ntimes, npos = f.lon.shape
    x, y = f.lon[...], f.lat[...]
    x = np.ma.masked_where(x > 1e3, x)
    x, y = proj(x, y)

    # initial locations:
    pl.plot(x[0, :],
            y[0, :],
            linewidth=0,
            marker=marker,
            mec=mecolor,
            mfc=mfcolor,
            ms=msize,
            mew=mewidth)

    # all trajectories:
    for i in range(npos):
        pl.plot(x[:, i], y[:, i], linewidth=width, color=color)

    # tilte:
    Title = opt.get_plconf(plconf, 'AXES', 'title')
    if Title[ifig]:
        simpleTitle = 1

        rdate = date.strftime('%d-%m-%Y')

        Ndays = f.tdays[-1] - f.tdays[0]

        title = 'drifters %s after %s (%4.2f days)' % (FA, rdate, Ndays)
        if simpleTitle:
            title = 'drifters after %s (%4.2f days)' % (rdate, Ndays)

        pl.title(title)

    # lims change in some mpl versions !!
    pl.gca().axis([proj.xmin, proj.xmax, proj.ymin, proj.ymax])

    return err, fig, info
Ejemplo n.º 37
0
def plt_wind(conf, plconf, date, FA='a', nest=0, **kargs):
    err = ''
    fig = False
    info = ''

    ifig = kargs.get('ifig', 0)
    day = kargs.get('day', 0)
    quiet = kargs.get('quiet', 0)

    time = day
    date = dateu.parse_date(date)

    # find input files:
    args = {'cf': conf, 'date': date, 'FA': FA, 'nest': nest}
    atm = opt.nameof('in', 'blk', **args)
    grd = opt.nameof('in', 'grd', **args)
    if not os.path.isfile(atm):
        err = 'ATM file not found (%s)' % atm
        return err, fig, info
    if not os.path.isfile(grd):
        err = 'Grid file not found (%s)' % grd
        return err, fig, info

    Data, err = opt.get_plconf(plconf, 'WIND')
    dcurr = Data['dcurr'][ifig]
    lcurr = Data['lcurr'][ifig]
    scurr = Data['scurr'][ifig]
    clim = Data['clim'][ifig]
    tind = Data['time'][ifig]

    x = netcdf.use(grd, 'lon_rho')
    y = netcdf.use(grd, 'lat_rho')
    wtime = netcdf.nctime(atm, 'time')
    cnd = (wtime >= date + datetime.timedelta(days=day)) & (
        date < date + datetime.timedelta(days=day + 1))
    u = netcdf.use(atm, 'Uwind', time=cnd)
    v = netcdf.use(atm, 'Uwind', time=cnd)
    if tind == 'dailyMean':
        u = u.mean(0)
        v = v.mean(0)
        sdate = wtime[cnd][
            0]  # for title... 1st day 00h is expected to be 1st date,
        # or model should not run!
    else:  # tind of some day, ex: tind 0 from forec day 3
        u = u[tind]
        v = v[tind]
        sdate = wtime[cnd][tind]

    if day > len(u) - 1:
        err = 'Invalid day %d (max=%d)' % (day, len(u) - 1)
        return err, fig, info

    # plot grid:
    proj, fig, ax = plt_grid(plconf, grd, ifig)

    # no mask on land:
    mask = np.zeros(u.shape, 'bool')
    mask[::dcurr[0], ::dcurr[1]] = True
    xm, ym = proj(x, y)

    s = np.sqrt(u**2 + v**2)
    q = pl.quiver(xm[mask],
                  ym[mask],
                  u[mask],
                  v[mask],
                  s[mask],
                  scale=scurr,
                  zorder=100)

    pl.clim(clim[0], clim[1])

    def add_colorbar(handle, **args):
        ax = pl.gca()
        Data, err = opt.get_plconf(plconf, 'AXES')
        cbpos = Data['cbpos'][ifig]
        cbbgpos = Data['cbbgpos'][ifig]
        cbbgc = Data['cbbgcolor'][ifig]
        cbbga = Data['cbbgalpha'][ifig]
        cblab = Data['cblabel'][ifig]

        # colorbar bg axes:
        if cbbgpos:
            rec = pl.axes((cbpos[0] - cbpos[2] * cbbgpos[0],
                           cbpos[1] - cbbgpos[2] * cbpos[3], cbpos[2] *
                           (1 + cbbgpos[0] + cbbgpos[1]), cbpos[3] *
                           (1 + cbbgpos[2] + cbbgpos[3])),
                          axisbg=cbbgc,
                          frameon=1)

            rec.patch.set_alpha(cbbga)
            rec.set_xticks([])
            rec.set_yticks([])
            for k in rec.axes.spines.keys():
                rec.axes.spines[k].set_color(cbbgc)
                rec.axes.spines[k].set_alpha(cbbga)

        # colorbar:
        if cbpos:
            cbax = fig.add_axes(cbpos)
            if cbpos[2] > cbpos[3]: orient = 'horizontal'
            else: orient = 'vertical'
            cb = pl.colorbar(handle,
                             cax=cbax,
                             orientation=orient,
                             drawedges=0,
                             **args)
            pl.axes(ax)

            # colorbar label:
            cb.set_label(r'Wind Speed [m s$^{\rm{-1}}$]')

    def add_currkey(handle):
        pos = Data['kcurrpos'][ifig]
        if pos:
            pl.quiverkey(handle,
                         pos[0],
                         pos[1],
                         lcurr,
                         '%s m/s' % str(lcurr),
                         labelpos='S',
                         coordinates='axes')

    add_colorbar(q)
    add_currkey(q)

    # tilte:
    Title, err = opt.get_plconf(plconf, 'AXES', 'title')
    if Title[ifig]:
        simpleTitle = 1

        rdate = date.strftime('%d-%m-%Y')
        title = 'wind %s %s %d' % (rdate, FA, day)

        if simpleTitle:  # simpler version of title:
            if FA == 'f':  # forecast date:
                rdate = dateu.next_date(date, day)
                rdate = rdate.strftime('%d-%m-%Y')

            title = 'wind %s' % (rdate)
            if FA == 'f':
                title = title + ' (forec)'

        pl.title(title)

    # logo:
    if ifig == 0:
        im = os.path.join(os.path.dirname(__file__), 'logo_INOCAR.png')
        i = pl.imread(im)
        h, w = i.shape[:2]
        rx = .12
        W = (proj.xmax - proj.xmin) * rx
        H = W * h / w
        l = proj.xmax
        #pl.fill([proj.xmax-W, proj.xmax, proj.xmax,     proj.xmax-W],
        #           [proj.ymin,   proj.ymin, proj.ymin+2.8*H, proj.ymin+2.8*H],
        #           '#500000',alpha=0.25,ec='none')

        ax.imshow(i,
                  extent=(proj.xmax * .98 - W, proj.xmax * .98,
                          proj.ymin + H * .1, proj.ymin + H * 1.1),
                  zorder=1e3)
        #pl.text(proj.xmax-W/2., proj.ymin+2.2*H,'OOF',
        #           fontdict={'size':14,'family':'serif'},
        #           color='#500000',ha='center',weight='bold')

        pl.text(
            proj.xmax * .8,
            proj.ymax * (-.1),
            sdate.strftime("%d %b %Y"),
            #pl.text(proj.xmax*.62, proj.ymax*.93,sdate.strftime("%d %b %Y"),
            fontdict={
                'size': 13,
                'family': 'monospace'
            },
            ha='center')
        # change date format if tind is not daily mean, ie, add hour, etc

        if FA == 'f':
            s = 'Pronostico desde %s' % date.strftime("%d %b %Y")
            pl.text(
                proj.xmax * .8,
                proj.ymax * (-.15),
                s,  ##this is outside
                #pl.text(proj.xmax-W/2., proj.ymin+1.1*H,s, ##this is in the proj (inside)
                fontdict={'fontsize': 10},
                ha='center')
    # logo.

    # lims change in some mpl versions !!
    pl.gca().axis([proj.xmin, proj.xmax, proj.ymin, proj.ymax])

    return err, fig, info
Ejemplo n.º 38
0
def clean_ini(cf,
              date1,
              date2,
              FA='a',
              nest=0,
              clean=False,
              quiet=False,
              output=sys.stdout):
    '''Create text file with the current ini links
  If the ini file is a link is can be unlinked; if it is a file it
  is not removed !
  '''
    def read_log(f):
        out = cb.odict()
        if os.path.isfile(f):
            L = open(log).readlines()
            for l in L:
                tmp = l.split(' ', 1)
                sdate = tmp[0]
                scontents = tmp[1].rstrip().split(' + ')
                out[tmp[0]] = scontents

        return out

    def gen_log(f, L):
        i = open(f, 'w')
        keys = L.keys()
        keys.sort()
        for d in keys:
            scontents = sjoin(L[d], ' + ')
            i.write('%s %s\n' % (d, scontents))

        i.close()

    def add2log(f, add):
        L = read_log(f)
        L0 = L.copy()
        sdate = add[0]
        contents = add[1].rstrip()
        if L.has_key(sdate) and contents not in L[sdate]:
            L[sdate] += [contents]
            #if not quiet: print >>output,' +'+sdate+' '+contents
        elif not L.has_key(sdate):
            L[sdate] = [contents]
            #if not quiet: print >>output,'  '+sdate+' '+contents

        if L != L0:
            gen_log(f, L)
            return True
        else:
            return False  # file has not changed

    files = []
    date = date1

    log = 'ini_log_%s_%s.txt' % (date1, date2)
    p = opt.pathof(cf, 'inputs', 'ini')
    log = os.path.join(p, log)

    if not quiet: print >> output, 'Creating/updating ini log %s' % log

    HasChanged = False
    while date <= date2:
        f = opt.nameof('in', 'ini', date, FA, nest, cf)
        if os.path.islink(f):
            src = os.readlink(f)
            add = (date, '%s --> %s' % (f, src))
            hasChanged = add2log(log, add)
            HasChanged = HasChanged or hasChanged
            if clean:
                # remove link:
                if not quiet: print >> output, 'removing %s' % f
                os.remove(f)

        elif os.path.isfile(f):
            hs = cb.hsize(os.path.getsize(f))
            ssize = '%s %s' % (str(hs[0]), hs[1])
            add = (date, '%s --> %s' % (f, ssize))
            hasChanged = add2log(log, add)
            HasChanged = HasChanged or hasChanged
            if not quiet:
                print >> output, date, ' keeping ', f, ' ', hs[0], hs[1]
        else:
            print >> output, date, ' no file'

        date = dateu.next_date(date, 1)

    if not quiet:
        if HasChanged: print >> output, '  file has changed'
        else: print >> output, '  file has not changed'
Ejemplo n.º 39
0
def op_plt_hslice(conf,plconf,date,FA,nest=0,**kargs):
  closefig = kargs.get('closefig',True)
  clearfig = kargs.get('clearfig',True)
  save     = kargs.get('save',True)
  Varname  = kargs.get('vname',False)
  Depth    = kargs.get('depth',False)

  date=dateu.parse_date(date)

  Err=[]
  Out=[]
  pltpath = opt.nameof('out','plots',cf=conf)

  Figure,err  = opt.get_plconf(plconf,'FIGURE')
  Hslices,err = opt.get_plconf(plconf,'HSLICES')
  Title,err=opt.get_plconf(plconf,'AXES','title')

  def iterv(v):
    try: len(v)
    except: v=[v]
    return v

  for i in range(len(Figure.values()[0])):  # loop figures
    Varnames = Hslices['varnames'][i].split(',')
    Varnames=[s.strip() for s in Varnames]

    depths   = Hslices['depths'][i]
    addcurr  = Hslices['addcurr'][i]
#    clims    = Hslices['clim'][i]

    depths  = iterv(depths)
    addcurr = iterv(addcurr)
#    clims   = iterv(clims)

    kargs={}
    kargs['ifig']=i
    kargs['type']=Hslices['input'][i]
    #kargs['time']=Inputs['time'][i]
    TIMES=Hslices['time'][i]

    kargs['dcurr']=Hslices['dcurr'][i]
    kargs['scurr']=Hslices['scurr'][i]
    kargs['lcurr']=Hslices['lcurr'][i]

    if Varname: varnames=[Varname]
    else: varnames=Varnames

    for var in varnames: # loop variables
      var=var.strip()

      nv=Varnames.index(var)
      kargs['cmap']=Hslices['cmap'][i].split(',')[nv].strip()
      kargs['norm']=Hslices['norm'][i].split(',')[nv].strip()

      kargs['var']=var
      vdepths=depths[nv]

      try: iter(vdepths)
      except: vdepths=[vdepths]

      if Depth: vdepths=[Depth]

      nz=-1
      for z in vdepths: # loop depths
        nz+=1
        if z in ('s','surf','surface') or z>=0:
          kargs['ind']   = z
          kargs['slice'] = 'k'
        else:
          kargs['ind']   = z
          kargs['slice'] = 'z'


        cl=opt.get_clims(date,var,z,plconf)[i]

        kargs['clim']=cl

        for addc in addcurr: # add/no currents
          kargs['currents']   = addc



          # loop over time:
          if TIMES=='all':
            if FA=='a': times=[-1]
            else: times=range(int(opt.get_conf(conf,'PRED','npred')[0]))
          else: times=[TIMES]


          for it in times:
            kargs['time']=it

            e,fig,info=plt_hslice(conf,plconf,date,FA,nest,**kargs)
            Err+=[e]

            if not e:
              if var: svar=var
              else: svar=''

              if addc: scurr='curr'
              else: scurr=''

              if info['hasz']: sslice=kargs['slice']+'_'+str(kargs['ind'])
              else: sslice=''

              if date.hour>0:
                sdate=date.strftime('%Y%m%d_%H')
              else:
                sdate=date.strftime('%Y%m%d')

              savename='%s_%s_n%d_%s_%d_%s_%s_%s_%s' % (sdate,FA,nest,kargs['type'],kargs['time'],svar,scurr,sslice,Figure['tag'][i])

              if Title[i]:
                simpleTitle=1

                rdate=date.strftime('%d-%m-%Y')

                if sslice: sslice=sslice[2:]
                title='%s#%s#n%d#%s#%d#%s#%s#%s' % (rdate,FA,nest,kargs['type'],kargs['time'],svar,scurr,sslice)

                if simpleTitle: # simpler version of title:
                  if FA=='f': # forecast date:
                    rdate=dateu.next_date(date,kargs['time'])
                    rdate=date.strftime('%d-%m-%Y')


                  title = '%s#%s#%s#%s' % (rdate,svar,scurr,sslice)
                  if FA=='f': title=title+' (forec)'
                
                while 1:
                  if title.find('##')>-1: title=title.replace('##','#')
                  else: break
                title=title.replace('#',' ')
                pl.title(title)



              while 1:
                if savename.find('__')>-1: savename=savename.replace('__','_')
                else: break

              savename=savename.strip('_')

              if save:
                Y,M,D=date.year,date.month,date.day,
                Ydest  = os.path.join(pltpath,'%s' % Y )
                if not os.path.isdir(Ydest): os.mkdir(Ydest)
                MDdest = os.path.join(Ydest,'%02d_%02d' % (M,D) )
                if not os.path.isdir(MDdest): os.mkdir(MDdest)

                savename=os.path.join(MDdest,savename+'.'+Figure['extension'][i])
                Out+=[savename]

                pl.savefig(savename,dpi=pl.gcf().dpi)
                #pl.savefig(savename,dpi=300)

              if clearfig: fig.clear()
              if closefig: pl.close(fig)

  return Err,Out