!
!
!##################################################################
!##################################################################
!######                                                      ######
!######                SUBROUTINE INITADAS                   ######
!######                                                      ######
!######                     Developed by                     ######
!######     Center for Analysis and Prediction of Storms     ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!


SUBROUTINE initadas 4,107
!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!  Read in analysis variables in namelist format from standard input.
!
!  AUTHOR:
!  Keith Brewster, CAPS, January, 1996
!
!  MODIFICATION HISTORY:
!
!  Added read of variables previously read by calling initpara
!  Added new src and iuse variables.
!  Keith Brewster, CAPS, October, 1997
!
!  Added lines to initialize mgrid and nstgrid which are used
!  by the GRIB writer.
!  Keith Brewster, CAPS, March, 1998
!
!  Keith Brewster, CAPS, April 27,1998
!  Added new parameters to output namelist to match ARPS
!  input file options.
!
!  2000/05/10 (Gene Bassett)
!     Merged the ADAS input file back into the ARPS input file.
!
!  2000-05-18 (Gene Bassett)
!     Moved hydrostatic and wind adjustment parameters to an
!     adjust namelist block.
!
!  2003-09-03 (Steve Leyton, CAPS)
!     Added MPI capabilities
!
!  2004/02/10 (Dan Weber, CAPS)
!     Added code for the root processor to read in the namelists 
!     (following ARPS convention) and send the data to the other 
!     processors via the mpupdate funtion.  Also wrapped each write to 
!     standard out with myproc=0 if statements, thus only the root
!     processor will write to the standard output file.
!
!-----------------------------------------------------------------------
!
!  Variable Declarations:
!
!-----------------------------------------------------------------------
!
  IMPLICIT NONE
!
  INCLUDE 'adas.inc'
  INCLUDE 'adassat.inc'
  INCLUDE 'adjust.inc'
  INCLUDE 'mp.inc'
!
!-----------------------------------------------------------------------
!  Misc local variables
!-----------------------------------------------------------------------
!
  INTEGER :: i,j,isat
  INTEGER :: lenstr
  LOGICAL :: iexist
  CHARACTER (LEN=19) :: initime  ! Real time in form of 'year-mo-dy:hr:mn:ss'

  INTEGER :: err_no
  DATA err_no /0/
!
!-----------------------------------------------------------------------
!
!  ADAS namelists
!
!-----------------------------------------------------------------------
!
  NAMELIST /adas_const/ npass,sprdist,wlim,zwlim,thwlim,                &
                 ccatopt,spradopt
  NAMELIST /adjust/ hydradj,wndadj,obropt,obrzero
  NAMELIST /adas_radaropt/ raduvobs,radrhobs,refrh,rhradobs,            &
                 radistride,radkstride,                                 &
                 radcldopt,radqvopt,radqcopt,radqropt,radptopt,         &
                 refsat,rhrad,                                          &
                 refcld,cldrad,ceilopt,ceilmin,dzfill,                  &
                 refrain,radsetrat,radreflim,radptgain
  NAMELIST /adas_typ/   ianxtyp
  NAMELIST /adas_range/  sfcqcrng,xyrange
  NAMELIST /adas_kpvar/ kpvar
  NAMELIST /adas_zrange/ zrange
  NAMELIST /adas_thrng/  thrng
  NAMELIST /adas_trnrng/  trnropt,trnrcst,trnrng
  NAMELIST /adas_backerf/ backerrfil
  NAMELIST /adas_sng/ nsngfil,sngfname,sngtmchk,blackfil,               &
                      srcsng,sngerrfil,iusesng
  NAMELIST /adas_ua/ nuafil,uafname,srcua,uaerrfil,iuseua
  NAMELIST /adas_radar/ nradfil,radfname,srcrad,raderrfil,iuserad
  NAMELIST /adas_retrieval/                                             &
                        nretfil,retfname,srcret,reterrfil,iuseret
  NAMELIST /adas_cloud/ cloudopt,clddiag,range_cld,                     &
                        refthr1,refthr2,hgtrefthr,                      &
                        wmhr_cu,wmhr_sc,wc_st,bgqcopt,                  &
                        cldqvopt,cldqcopt,                              &
                        cldqropt,cldwopt,cldptopt,thresh_cvr,           &
                        rh_thr1,cvr2rh_thr1,rh_thr2,cvr2rh_thr2,        &
                        qvslimit_2_qc,qrlimit,frac_qr_2_qc,             &
                        frac_qw_2_pt,frac_qc_2_lh,max_lh_2_pt,          &
                        smth_opt,                                       &
                        nvisfiles,vis_fname,nirfiles,ir_fname,cld_files, &
                        viscalname,ircalname
  NAMELIST /incr_out/ incdmpf,incrdmp,incrhdfcompr,                     &
                      uincdmp,vincdmp,wincdmp,                          &
                      pincdmp,ptincdmp,qvincdmp,                        &
                      qcincdmp,qrincdmp,qiincdmp,qsincdmp,qhincdmp
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!

!-----------------------------------------------------------------------
!  Assign default values to the ADAS input variables
!-----------------------------------------------------------------------

  npass=4
  sprdist = 15000.
  wlim = 1.e-04
  zwlim = 1.e-03
  thwlim = 1.e-03
  ccatopt = 1
  spradopt = 2

  hydradj = 0
  wndadj = 2
  obropt = 2
  obrzero = 12000.

  raduvobs = 0
  radrhobs = 0
  radistride = 2
  radkstride = 2
  refrh = 20.
  rhrad = 0.90

  radcldopt = 0
  radqvopt = 0
  radqcopt = 0
  radqropt = 0
  radptopt = 0
  refcld = 20.
  cldrad = 1.0E-03
  ceilopt = 1
  ceilmin = 1500.
  dzfill = 3000.
  refrain = 30.
  radsetrat = 0.50
  radreflim = 50.
  radptgain = 1.0

  cloudopt = 0
  clddiag = 1
  range_cld = 100.0E03
  refthr1 = 25.0
  refthr2 = 10.0
  hgtrefthr = 2000.0
  wmhr_cu = 0.0005
  wmhr_sc = 0.00005
  wc_st = 0.05
  bgqcopt  = 1
  cldqvopt = 1
  cldwopt  = 0
  cldqcopt = 1
  cldqropt = 1
  cldptopt = 1

  smth_opt = 1
  thresh_cvr = 0.65
  rh_thr1 = 0.5
  cvr2rh_thr1 = 0.2
  rh_thr2 = 0.95
  cvr2rh_thr2 = 0.65
  frac_qw_2_pt = 1.0
  frac_qc_2_lh = 1.0
  max_lh_2_pt = 4.0
  qvslimit_2_qc = 1.0
  qrlimit = 0.010
  frac_qr_2_qc = 0.5


  DO i=1,mx_nvar_anx
    kpvar(i)=1.0
  END DO
!
  sfcqcrng = 100.e03
  DO i=1,mx_pass
    ianxtyp(i)=21
    xyrange(i)=100.e03
    zrange(i)=500.
    thrng(i)=3.0
    trnropt(i)=1
    trnrcst(i)=500.
    trnrng(i)=1.2
  END DO
!
  backerrfil='ruc3herr.adastab'
!
  blackfil='blacklist.sfc'
  nsngfil=0
  DO i=1,mx_sng_file
    sngfname(i)='NULL'
    sngtmchk(i)='NULL'
  END DO
  DO i=1,nsrc_sng
    srcsng(i)='NULL'
    sngerrfil(i)='NULL'
  END DO
  DO i=0,nsrc_sng
    DO j=1,npass
      iusesng(i,j)=0
    END DO
  END DO
!
  nsngfil=0
  DO i=1,mx_ua_file
    uafname(i)='NULL'
  END DO
  DO i=1,nsrc_ua
    srcua(i)='NULL'
    uaerrfil(i)='NULL'
  END DO
  DO i=0,nsrc_ua
    DO j=1,npass
      iuseua(i,j)=0
    END DO
  END DO
!
  nradfil=0
  DO i=1,mx_rad
    radfname(i)='NULL'
  END DO
  DO i=1,nsrc_rad
    srcrad(i)='NULL'
    raderrfil(i)='NULL'
  END DO
  DO i=0,nsrc_rad
    DO j=1,npass
      iuserad(i,j)=0
    END DO
  END DO
!
  nretfil=0
  DO i=1,mx_ret
    retfname(i)='NULL'
  END DO
  DO i=1,nsrc_ret
    srcret(i)='NULL'
    reterrfil(i)='NULL'
  END DO
  DO i=0,nsrc_ret
    DO j=1,npass
      iuseret(i,j)=0
    END DO
  END DO
!
  cld_files=0
  nirfiles=0
  nvisfiles=0
  DO isat=1,mx_sat
    ir_fname(isat)='NULL'
    vis_fname(isat)='NULL'
    viscalname(isat)='NULL'
    ircalname(isat)='NULL'
  END DO
!
  incdmpf='NULL'
  incrdmp = 0
  incrhdfcompr = 0
  uincdmp = 1
  vincdmp = 1
  wincdmp = 0
  pincdmp = 1
  ptincdmp= 1
  qvincdmp= 1
  qcincdmp= 1
  qrincdmp= 1
  qiincdmp= 1
  qsincdmp= 0
  qhincdmp= 0

!
!-----------------------------------------------------------------------
!  read in ADAS namelists
!-----------------------------------------------------------------------
!
     IF(myproc == 0)                                           &
     READ(5, incr_out,  END=201)
     IF(myproc == 0)                                           &
     WRITE(6,*) 'Namelist block incr_out sucessfully read.'
     201 CONTINUE

     CALL mpupdatei(incrdmp,1)
     CALL mpupdatei(incrhdfcompr,1)
     CALL mpupdatec(incdmpf,256)
     CALL mpupdatei(uincdmp,1)
     CALL mpupdatei(vincdmp,1)
     CALL mpupdatei(wincdmp,1)
     CALL mpupdatei(pincdmp,1)
     CALL mpupdatei(ptincdmp,1)
     CALL mpupdatei(qvincdmp,1)
     CALL mpupdatei(qcincdmp,1)
     CALL mpupdatei(qrincdmp,1)
     CALL mpupdatei(qiincdmp,1)
     CALL mpupdatei(qsincdmp,1)
     CALL mpupdatei(qhincdmp,1)
 
     IF(myproc == 0)                                           &
     READ(5, adas_const,  END=200)
     IF(myproc == 0)                                           &
     WRITE(6,*) 'Namelist block adas_const sucessfully read.'
     200 CONTINUE
   
     CALL mpupdatei(npass,1)
     CALL mpupdater(sprdist,1)
     CALL mpupdater(wlim,1)
     CALL mpupdater(zwlim,1)
     CALL mpupdater(thwlim,1)
     CALL mpupdatei(spradopt,1)
     CALL mpupdatei(ccatopt,1)

     IF(myproc == 0)                                           &
     READ(5, adjust,  END=205)
     IF(myproc == 0)                                           &
     WRITE(6,*) 'Namelist block adjust sucessfully read.'
     205 CONTINUE

     CALL mpupdatei(hydradj,1)
     CALL mpupdatei(wndadj,1)
     CALL mpupdatei(obropt,1)
     CALL mpupdater(obrzero,1)
 
     IF(myproc == 0)                                           &
     READ(5, adas_radaropt,  END=210)
     IF(myproc == 0)                                           &
     WRITE(6,*) 'Namelist block adas_radaropt sucessfully read.'
     210 CONTINUE
   
     CALL mpupdatei(raduvobs,1)
     CALL mpupdatei(radrhobs,1)
     CALL mpupdatei(radistride,1)
     CALL mpupdatei(radkstride,1)
     CALL mpupdater(refrh,1)
     CALL mpupdater(rhradobs,1)
     CALL mpupdatei(radcldopt,1)
     CALL mpupdatei(radqvopt,1)
     CALL mpupdatei(radqcopt,1)
     CALL mpupdatei(radqropt,1)
     CALL mpupdatei(radptopt,1)
     CALL mpupdater(refsat,1)
     CALL mpupdater(rhrad,1)
     CALL mpupdater(refcld,1)
     CALL mpupdater(cldrad,1)
     CALL mpupdater(ceilopt,1)
     CALL mpupdater(ceilmin,1)
     CALL mpupdater(dzfill,1)
     CALL mpupdater(refrain,1)
     CALL mpupdater(radsetrat,1)
     CALL mpupdater(radreflim,1)
     CALL mpupdater(radptgain,1)

     IF(myproc == 0)                                           &
     READ(5, adas_cloud, END=220)
     IF(myproc == 0)                                           &
     WRITE(6,*) 'Namelist block adas_cloud sucessfully read.'
     220 CONTINUE
 
     CALL mpupdatei(cloudopt,1)
     CALL mpupdatei(clddiag,1)
     CALL mpupdatei(cld_files,1)
     CALL mpupdater(range_cld,1)
     CALL mpupdater(refthr1,1)
     CALL mpupdater(refthr2,1)
     CALL mpupdater(hgtrefthr,1)
     CALL mpupdater(thresh_cvr,1)
     CALL mpupdatei(bgqcopt,1)
     CALL mpupdatei(cldqvopt,1)
     CALL mpupdater(rh_thr1,1)
     CALL mpupdater(cvr2rh_thr1,1)
     CALL mpupdater(rh_thr2,1)
     CALL mpupdater(cvr2rh_thr2,1)
     CALL mpupdatei(cldqcopt,1)
     CALL mpupdater(qvslimit_2_qc,1)
     CALL mpupdatei(cldqropt,1)
     CALL mpupdater(qrlimit,1)
     CALL mpupdater(frac_qr_2_qc,1)
     CALL mpupdatei(cldwopt,1)
     CALL mpupdater(wmhr_Cu,1)
     CALL mpupdater(wmhr_Sc,1)
     CALL mpupdater(wc_St,1)
     CALL mpupdatei(cldptopt,1)
     CALL mpupdater(frac_qw_2_pt,1)
     CALL mpupdater(frac_qc_2_lh,1)
     CALL mpupdater(max_lh_2_pt,1)
     CALL mpupdatei(smth_opt,1)
     CALL mpupdatei(nirfiles,1)

     CALL mpupdatec(ir_fname,256*mx_sat)
     CALL mpupdatec(ircalname,256*mx_sat)
     CALL mpupdatei(nvisfiles,1)
     CALL mpupdatec(vis_fname,256*mx_sat)
     CALL mpupdatec(viscalname,256*mx_sat)

     IF(myproc == 0)                                           &
     READ(5, adas_typ,    END=240)
     IF(myproc == 0)                                           &
     WRITE(6,*) 'Namelist block adas_typ sucessfully read.'
     240 CONTINUE
 
     CALL mpupdatei(ianxtyp,mx_pass)

     IF(myproc == 0)                                           &
     READ(5, adas_range,  END=250)
     IF(myproc == 0)                                           &
     WRITE(6,*) 'Namelist block adas_range sucessfully read.'
     250 CONTINUE
 
     CALL mpupdater(sfcqcrng,1)
     CALL mpupdater(xyrange,mx_pass)

     IF(myproc == 0)                                           &
     READ(5, adas_kpvar,  END=255)
     IF(myproc == 0)                                           &
     WRITE(6,*) 'Namelist block adas_kpvar sucessfully read.'
     255 CONTINUE
 
     CALL mpupdater(kpvar,nvar_anx)

     IF(myproc == 0)                                           &
     READ(5, adas_zrange, END=260)
     IF(myproc == 0)                                           &
     WRITE(6,*) 'Namelist block adas_zrange sucessfully read.'
     260 CONTINUE

     CALL mpupdater(zrange,mx_pass)

     IF(myproc == 0)                                           &
     READ(5, adas_thrng,  END=270)
     IF(myproc == 0)                                           &
     WRITE(6,*) 'Namelist block adas_thrng sucessfully read.'
     270 CONTINUE

     CALL mpupdater(thrng,mx_pass)

     IF(myproc == 0)                                           &
     READ(5, adas_trnrng,  END=280)
     IF(myproc == 0)                                           &
     WRITE(6,*) 'Namelist block adas_trnrng sucessfully read.'
     280 CONTINUE

     CALL mpupdatei(trnropt,mx_pass)
     CALL mpupdater(trnrcst,mx_pass)
     CALL mpupdater(trnrng,mx_pass)

 
     IF(myproc == 0)                                           &
     READ(5, adas_backerf,  END=300)
     IF(myproc == 0)                                           &
     WRITE(6,*) 'Namelist block adas_backerf sucessfully read.'
     300 CONTINUE
 
     CALL mpupdatec(backerrfil,256)

     IF(myproc == 0)                                           &
     READ(5, adas_sng,  END=310)
     IF(myproc == 0)                                           &
     WRITE(6,*) 'Namelist block adas_sng sucessfully read.'
     310 CONTINUE

     CALL mpupdatei(srcsng,nsrc_sng)
     CALL mpupdatec(sngerrfil,256*nsrc_sng)
     CALL mpupdatei(iusesng,(nsrc_sng+1)*mx_pass)

     IF(myproc == 0)                                           &
     READ(5, adas_ua,  END=320)
     IF(myproc == 0)                                           &
     WRITE(6,*) 'Namelist block adas_ua sucessfully read.'
     320 CONTINUE

     CALL mpupdatei(srcua,nsrc_sng)
     CALL mpupdatec(uaerrfil,256*mx_ua_file)
     CALL mpupdatei(iuseua,(nsrc_ua+1)*mx_pass)

     IF(myproc == 0)                                           &
     READ(5, adas_radar,  END=330)
     IF(myproc == 0)                                           &
     WRITE(6,*) 'Namelist block adas_radar sucessfully read.'
     330 CONTINUE
 
     CALL mpupdatei(nradfil,1)
     CALL mpupdatec(radfname,256*mx_rad)
     CALL mpupdatei(srcrad,nsrc_rad)
     CALL mpupdatec(raderrfil,256*nsrc_rad)
     CALL mpupdatei(iuserad,(nsrc_rad+1)*mx_pass)

     IF(myproc == 0)                                           &
     READ(5, adas_retrieval,  END=340)
     IF(myproc == 0)                                           &
     WRITE(6,*) 'Namelist block adas_retrieval sucessfully read.'
     340 CONTINUE
 
     CALL mpupdatei(nretfil,1)
     CALL mpupdatec(retfname,256*mx_ret)
     CALL mpupdatei(srcret,nsrc_ret)
     CALL mpupdatec(reterrfil,256*mx_ret)
     CALL mpupdatei(iuseret,(nsrc_ret+1)*mx_pass)

!-----------------------------------------------------------------------
!  Compute squared input variables
!-----------------------------------------------------------------------
 
  DO i=1,mx_nvar_anx
    kpvrsq(i)=kpvar(i)*kpvar(i)
  END DO

  RETURN
END SUBROUTINE initadas

!
!##################################################################
!##################################################################
!######                                                      ######
!######                  SUBROUTINE RADINF                   ######
!######                                                      ######
!######                     Developed by                     ######
!######     Center for Analysis and Prediction of Storms     ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!


SUBROUTINE radinf (rlim) 1

!-----------------------------------------------------------------------
!
!  PURPOSE:
!  For MPI message passing efficiency, we need to know the maximum
!  possible radii of influence that any any grid point will have so we
!  know processors need to communicate.
!
!  For the non-MPI case, this subroutine has no meaning, and isn't used.
!
!  AUTHOR:
!  Steve Leyton, CAPS, August, 2005.
!
!  MODIFICATION HISTORY:
!  10/06/2006   Add cloud information into the computations.
!
!-----------------------------------------------------------------------
!
!  Variable Declarations:
!
!-----------------------------------------------------------------------
!
  IMPLICIT NONE
!
  INCLUDE 'globcst.inc'
  INCLUDE 'grid.inc'          ! Grid parameters
  INCLUDE 'phycst.inc'
  INCLUDE 'mp.inc'            ! Message passing parameters.
! 
  INCLUDE 'adas.inc'
  INCLUDE 'adassat.inc'
  INCLUDE 'adjust.inc'
! 
  REAL :: rlim                        ! 1st pass radius of influence
  REAL :: rpass, rsq, rlimsq
  REAL :: rngsqi
  REAL :: max_xyrange
  INTEGER :: i 
!
! 
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
! 
!  Beginning of executable code...
! 
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!

! Identify the maximum xyrange for all passes, then use to compute
! the maximum radius of influence for the given data type

  max_xyrange=xyrange(1)
  DO i = 2,npass
    IF (xyrange(i) .gt. max_xyrange) THEN
      max_xyrange=xyrange(i)
    END IF
  END DO
  rpass=max_xyrange*max_xyrange
  rlimsq=0.
  DO i=1,nvar_anx
    rsq=(kpvrsq(i)*rpass)
    rngsqi =1./rsq
    rlimsq=AMAX1(rlimsq,rsq)
  END DO
  rlimsq=-rlimsq*ALOG(wlim)
  rlim=SQRT(rlimsq)

  IF (cloudopt > 0) THEN
!
!   "dx" and "dy" should always be the same, but just to be safe, make sure
!   we have the larger of the two.
!
    rsq = dx
    IF (dy > rsq) rsq = dy
    rsq = rsq * i_perimeter

    IF (rsq > rlim) rlim = rsq
  END IF

  IF (myproc == 0)                                                         &
  WRITE(6,'(/a,f10.2,a/)') 'Influence cutoff radius (all data): ',rlim,' m.'

  RETURN

END SUBROUTINE radinf