!
!##################################################################
!##################################################################
!###### ######
!###### PROGRAM EXT2ARPS ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
PROGRAM ext2arps,172
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Converts external forecast files coordinates and variables
! to those used in ARPS and writes the information in a
! history dump file.
!
! The actual reading of the external files is done by
! subroutine rdextfil. In many cases, it will only be necessary
! to make changes in extdims.inc and rdextfil to customize the
! processing for the user's specific data source.
!
! This program could become more general in the future, but
! for now we assume incoming data are supplied (or converted to)
! pressure(Pa), height(m), temperature(K), specific humidty (kg/kg),
! and u,v (m/s). Units should be converted from their original
! forms to these in rdextfil.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Keith Brewster
! Sept, 1994 after MAPS2ARPS
!
! MODIFICATION HISTORY:
! Oct, 1994 (KB)
! Changed input times to be more flexible.
!
! 17 Jan, 1995 (KB)
! Modified processing so that mean sounding would be for constant
! pressure surfaces rather than constant ARPS levels.
!
! 23 Jan, 1995 (KB)
! Added temporary array avgzs_ext, replacing the use of tem1 which
! would not work if number of ext levels is greater than ARPS.
!
! 9 August, 1995 (KB)
! Modified creation of mean soundings and storage of external
! pressure arrays to allow for incoming data on other than
! pressure vertical coordinates. Added switch for buoyancy
! balancing of vertical pressure gradient.
!
! 26 April, 1996 (KB)
! Version 2.0, including: Corrects divergence error
! using a function either linear in k-level, physical height or
! potential temperature. Also, moisture is interpolated and
! extrapolated using RHstar [ RHstar=sqrt(1. - RH) ], which should
! be more linear in height, rather than qv. Extrapolation above
! and below available model data are constant-in-height perturbation
! fields for all variables except assigned a standard lapse rate near
! the ground and dT/dz=0 at the top.
!
! 30 April 1996 (KB)
! Final preparation of version 2.0, added O'Brien option and
! order of interpolation option to input namelist.
!
! 8 November 1996 (KB)
! Version 2.1
! Changed the polynomial interpolation scheme for better
! accuracy and eliminated chance for a discontinuity at external
! grid cell boundaries. Linear or quadratic interpolation
! using local polynomial fit are supported (iorder=1 or 2).
!
! 3 March 1996 (KB)
! Pressure is now interpolated with polynomials of pressure
! rather than ln(p).
!
! 10 June 1997 (Fanyou Kong -- CMRP)
! Include surface 2D data analysis from external data sets, a new
! subroutine MKARPS2D is then added in file 'extlib23.f'.
!
! 16 July 1997 (Zonghui Huo)
! Added 'getcoamps.f' to read the COAMPS data on sigma-z levels.
!
! 06/16/1998 (Dennis Moon, SSESCO)
! Added support for RUC 2 on the AWIPS 211 grid. extdopt=7
!
! 06/16/1998 (Dennis Moon, SSESCO)
! Added support for NCEP global re-analysis on T62 Gaussian lat/lon
! grid. This does not work for ARPS grids which cross the 0 degree
! meridian. extdopt=8
!
! 29 Oct 1998 (R. Carpenter, G. Bassett)
! Added RUC-2 GEMPAK & ETA GEMPAK grid #104. Four digit years and
! extdname now used in constructing filenames of GEMPAK files.
!
! 15 Sep 1999 (K. Brewster)
! Added the microphysical variables to the dtadump calls so they
! will be used in those cases when available. Added check for
! positive definiteness to microphysical variables.
!
! 2000/03/23 (Donghai Wang)
! Added NCEP AVN GRIB global data, grid #3.
!
! 2000/07/28 (Ming Xue)
! Converted to F90 free format and implemented dynamic memory
! allocation.
!
! 2000/08/14 (Gene Bassett)
! Added multiple soil types, sfcdata variables and grid staggering
! for use with arps history format of external model data. Added options
! allowing ext2arps to produce results similar to arpsintrp (intropt,
! ext_lbc, ext_vbc).
!
! 2001/05/31 (Gene Bassett)
! Added exttrnopt, an option to use input grid terrain for output grid.
! Also corrected a bug introduced when updating the use of arps as an
! external model (2000/08) which caused only the first external file
! to have u&v rotated to arps map projection.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
!
!-----------------------------------------------------------------------
!
! Input and output grid dimensions
!
!-----------------------------------------------------------------------
INTEGER :: nx ! Number of grid points in the x-dir of output arps grid
INTEGER :: ny ! Number of grid points in the y-dir of output arps grid
INTEGER :: nz ! Number of grid points in the z-dir of output arps grid
!
INTEGER :: nx_ext, ny_ext, nz_ext ! dimensions of external data grid
INTEGER :: nstyps
!
!-----------------------------------------------------------------------
!
! Space for mean sounding
!
!-----------------------------------------------------------------------
!
INTEGER :: lvlprof
REAL :: depthp
PARAMETER( lvlprof=601, depthp = 3.0E4 )
!
!-----------------------------------------------------------------------
!
! lvlprof:
!
! The ARPS interpolates unevenly-spaced data from the external
! data set to evenly-spaced data for use in defining the base
! state atmosphere. In this process, an intermediate sounding is
! generated at evenly-spaced altitudes, with the accuracy of the
! associated interpolation controlled by the parameter lvlprof.
! The larger lvlprof, the more accurate the interpolation
! (we recommend using lvlprof=200 for a model run with about 50
! points in the vertical direction). Using the intermediate
! sounding, the ARPS then generates a base state model sounding
! for the particular vertical grid resolution chosen (i.e.,
! the number of points in the vertical, nz, and the vertical grid
! spacing, dz).
!
! depthp:
!
! The depth of atmosphere over which the interpolated profiles
! will be defined. depthp should be greater than or equal to
! (nz-3)*dz, i.e., larger than the physical depth of the model
! domain. Otherwise, the code will extrapolate for gridpoints
! outside the domain, leading to possible inconsistencies. At all
! costs, any such extrapolation should be avoided.
!
!-----------------------------------------------------------------------
!
REAL :: psnd(lvlprof), &
zsnd(lvlprof), &
tsnd(lvlprof), &
ptsnd(lvlprof), &
rhssnd(lvlprof), &
qvsnd(lvlprof), &
rhosnd(lvlprof), &
usnd(lvlprof), &
vsnd(lvlprof), &
dumsnd(lvlprof), &
plsnd(lvlprof)
!
!-----------------------------------------------------------------------
!
! ARPS grid variables
!
!
! u x component of velocity at a given time level (m/s)
! v y component of velocity at a given time level (m/s)
! w Vertical component of Cartesian velocity at a given
! time level (m/s)
! ptprt Perturbation potential temperature at a given time
! level (K)
! pprt Perturbation pressure at a given time level (Pascal)
! qv Water vapor specific humidity at a given time level (kg/kg)
! qc Cloud water mixing ratio at a given time level (kg/kg)
! qr Rainwater mixing ratio at a given time level (kg/kg)
! qi Cloud ice mixing ratio at a given time level (kg/kg)
! qs Snow mixing ratio at a given time level (kg/kg)
! qh Hail mixing ratio at a given time level (kg/kg)
!
! ubar Base state x-velocity component (m/s)
! vbar Base state y-velocity component (m/s)
! wbar Base state vertical velocity component (m/s)
! ptbar Base state potential temperature (K)
! pbar Base state pressure (Pascal)
! rhobar Base state density (kg/m**3)
! qvbar Base state water vapor specific humidity (kg/kg)
!
! x x coordinate of grid points in physical/comp. space (m)
! y y coordinate of grid points in physical/comp. space (m)
! z z coordinate of grid points in computational space (m)
! zp Vertical coordinate of grid points in physical space (m)
! hterain Terrain height (m)
!
! j1 Coordinate transformation Jacobian -d(zp)/dx
! j2 Coordinate transformation Jacobian -d(zp)/dy
! j3 Coordinate transformation Jacobian d(zp)/dz
!
! tsfc Temperature at ground (K) (in top 1 cm layer)
! tsoil Deep soil temperature (K) (in deep 1 m layer)
! wetsfc Surface soil moisture in the top 1 cm layer
! wetdp Deep soil moisture in the deep 1 m layer
! wetcanp Canopy water amount
!
!-----------------------------------------------------------------------
!
REAL, allocatable :: x(:) ! The x-coord. of the physical and
! computational grid. Defined at u-point.
REAL, allocatable :: y(:) ! The y-coord. of the physical and
! computational grid. Defined at v-point.
REAL, allocatable :: z(:) ! The z-coord. of the computational grid.
! Defined at w-point on the staggered grid.
REAL, allocatable :: xscl(:) ! The x-coordinate of scalar points.
REAL, allocatable :: yscl(:) ! The y-coordinate of scalar points.
REAL, allocatable :: zp(:,:,:) ! The physical height coordinate defined at
! w-point of the staggered grid.
REAL, allocatable :: zs(:,:,:) ! The physical height of scalar points.
REAL, allocatable :: j1(:,:,:) ! Coordinate transformation Jacobian -d(zp)/dx.
REAL, allocatable :: j2(:,:,:) ! Coordinate transformation Jacobian -d(zp)/dy.
REAL, allocatable :: j3(:,:,:) ! Coordinate transformation Jacobian d(zp)/dz.
REAL, allocatable :: aj3z(:,:,:)! Coordinate transformation Jacobian defined
! as d( zp )/d( z ) AVERAGED IN THE Z-DIR.
REAL, allocatable :: hterain(:,:) ! The height of the terrain. (m)
!wdt update
REAL, allocatable :: htrn_ext(:,:) ! The height of the terrain. (m)
REAL, allocatable :: mapfct(:,:,:)! Map factor at scalar, u, and v points
REAL, allocatable :: u(:,:,:) ! Total u-velocity (m/s)
REAL, allocatable :: v(:,:,:) ! Total v-velocity (m/s)
REAL, allocatable :: w(:,:,:) ! Total w-velocity (m/s)
REAL, allocatable :: pprt(:,:,:) ! Perturbation pressure from that
! of base state atmosphere (Pascal)
REAL, allocatable :: ptprt(:,:,:) ! Perturbation potential temperature
! from that of base state atmosphere (K)
!
REAL, allocatable :: qv(:,:,:) ! Water vapor specific humidity (kg/kg)
REAL, allocatable :: qc(:,:,:) ! Cloud water mixing ratio (kg/kg)
REAL, allocatable :: qr(:,:,:) ! Rain water mixing ratio (kg/kg)
REAL, allocatable :: qi(:,:,:) ! Cloud ice mixing ratio (kg/kg)
REAL, allocatable :: qs(:,:,:) ! Snow mixing ratio (kg/kg)
REAL, allocatable :: qh(:,:,:) ! Hail mixing ratio (kg/kg)
REAL, allocatable :: pbar(:,:,:) ! Base state pressure (Pascal)
REAL, allocatable :: ptbar(:,:,:) ! Base state potential temperature (K)
REAL, allocatable :: qvbar(:,:,:) ! Base state water vapor specific humidity
! (kg/kg)
REAL, allocatable :: ubar(:,:,:) ! Base state u-velocity (m/s)
REAL, allocatable :: vbar(:,:,:) ! Base state v-velocity (m/s)
REAL, allocatable :: wbar(:,:,:) ! Base state w-velocity (m/s)
REAL, allocatable :: rhobar(:,:,:)! Base state density (kg/m3).
REAL, allocatable :: rhostr(:,:,:)! Base state density rhobar times j3.
REAL, allocatable :: wcont(:,:,:) ! Contravariant vertical velocity (m/s)
REAL, allocatable :: csndsq(:,:,:)! Speed of sound squared (m**2/s**2)
REAL, allocatable :: tsfc(:,:,:) ! Ground surface temperature (K)
REAL, allocatable :: tsoil(:,:,:) ! Deep soil temperature (K)
REAL, allocatable :: wetsfc(:,:,:) ! Surface soil moisture
REAL, allocatable :: wetdp(:,:,:) ! Deep soil moisture
REAL, allocatable :: wetcanp(:,:,:)! Water amount on canopy
REAL, allocatable :: snowdpth(:,:) ! Snow depth (m)
INTEGER, allocatable :: soiltyp (:,:,:)! Soil type
REAL, allocatable :: stypfrct(:,:,:)! Soil type fraction
INTEGER, allocatable :: vegtyp (:,:) ! Vegetation type
REAL, allocatable :: lai (:,:) ! Leaf Area Index
REAL, allocatable :: roufns (:,:) ! Surface roughness
REAL, allocatable :: veg (:,:) ! Vegetation fraction
REAL, allocatable :: tem1(:,:,:) ! Temporary work array.
REAL, allocatable :: tem2(:,:,:) ! Temporary work array.
REAL, allocatable :: tem3(:,:,:) ! Temporary work array.
REAL, allocatable :: tem4(:,:,:) ! Temporary work array.
REAL, allocatable :: tem5(:,:,:) ! Temporary work array.
REAL, allocatable :: tem6(:,:,:) ! Temporary work array.
REAL, allocatable :: tem7(:,:,:) ! Temporary work array.
REAL, allocatable :: tem8(:,:,:) ! Temporary work array.
REAL, allocatable :: xs2d(:,:)
REAL, allocatable :: ys2d(:,:)
REAL, allocatable :: xu2d(:,:)
REAL, allocatable :: yu2d(:,:)
REAL, allocatable :: xv2d(:,:)
REAL, allocatable :: yv2d(:,:)
!wdt Copyright (c) 2001 Weather Decision Technologies, Inc.: xw & yw
REAL, allocatable :: xw(:,:)
REAL, allocatable :: yw(:,:)
INTEGER, allocatable :: iscl(:,:) ! i index of scalar point
! in external array.
INTEGER, allocatable :: jscl(:,:) ! j index of scalar point
! in external array.
INTEGER, allocatable :: iu(:,:) ! i index of u-velocity point
! in external array.
INTEGER, allocatable :: ju(:,:) ! j index of u-velocity point
! in external array.
INTEGER, allocatable :: iv(:,:) ! i index of v-velocity point
! in external array.
INTEGER, allocatable :: jv(:,:) ! j index of v-velocity point
! in external array.
INTEGER :: iproj_arps ! ARPS map projection (tem storage)
REAL :: scale_arps ! ARPS map scale (tem storage)
REAL :: trlon_arps ! ARPS true-longitude (tem storage)
REAL :: latnot_arps(2) ! ARPS true-latitude(s) (tem storage)
REAL :: xorig_arps,yorig_arps ! ARPS map projection origin (tem storage)
!
!-----------------------------------------------------------------------
!
! NAMELIST parameter (In arps.input)
!
!-----------------------------------------------------------------------
!
INCLUDE 'ext2arps.inc'
!
!-----------------------------------------------------------------------
!
! External forecast variables
!
!-----------------------------------------------------------------------
!
INTEGER :: iproj_ext ! external data map projection
REAL :: scale_ext ! external data map scale factor
REAL :: trlon_ext ! external data true longitude
REAL :: latnot_ext(2) ! external data true latitude(s)
REAL :: x0_ext,y0_ext ! external data origin
REAL, allocatable :: x_ext(:) ! external data x-coordinate
REAL, allocatable :: y_ext(:) ! external data y-coordinate
REAL, allocatable :: xu_ext(:) ! external data u x-coordinate
REAL, allocatable :: yu_ext(:) ! external data u y-coordinate
REAL, allocatable :: xv_ext(:) ! external data v x-coordinate
REAL, allocatable :: yv_ext(:) ! external data v y-coordinate
REAL, allocatable :: lat_ext(:,:) ! external data latidude
REAL, allocatable :: lon_ext(:,:) ! external data longitude
REAL, allocatable :: latu_ext(:,:) ! external data latidude (x-stag)
REAL, allocatable :: lonu_ext(:,:) ! external data longitude (x-stag)
REAL, allocatable :: latv_ext(:,:) ! external data latidude (y-stag)
REAL, allocatable :: lonv_ext(:,:) ! external data longitude (y-stag)
REAL, allocatable :: zs_ext(:,:,:) ! external data physical height (m)
REAL, allocatable :: p_ext(:,:,:) ! Pressure (Pascals)
REAL, allocatable :: hgt_ext(:,:,:) ! Height (m)
REAL, allocatable :: zp2_ext(:,:,:) ! external w physical height (m)
REAL, allocatable :: zp_ext(:,:,:) ! Height (m) (on arps grid)
REAL, allocatable :: t_ext(:,:,:) ! Temperature (K)
REAL, allocatable :: u_ext(:,:,:) ! Eastward wind component
REAL, allocatable :: v_ext(:,:,:) ! Northward wind component
REAL, allocatable :: w_ext(:,:,:) ! Vertical wind component
REAL, allocatable :: qv_ext(:,:,:) ! Specific humidity (kg/kg)
REAL, allocatable :: qc_ext(:,:,:) ! Cloud H2O mixing ratio (kg/kg)
REAL, allocatable :: qr_ext(:,:,:) ! Rain H2O mixing ratio (kg/kg)
REAL, allocatable :: qi_ext(:,:,:) ! Ice H2O mixing ratio (kg/kg)
REAL, allocatable :: qs_ext(:,:,:) ! Snow H2O mixing ratio (kg/kg)
REAL, allocatable :: qh_ext(:,:,:) ! Hail H2O mixing ratio (kg/kg)
REAL, allocatable :: tsfc_ext (:,:,:) ! Temperature at surface (K)
REAL, allocatable :: tsoil_ext (:,:,:) ! Deep soil temperature (K)
REAL, allocatable :: wetsfc_ext (:,:,:) ! Surface soil moisture
REAL, allocatable :: wetdp_ext (:,:,:) ! Deep soil moisture
REAL, allocatable :: wetcanp_ext(:,:,:) ! Canopy water amount
REAL, allocatable :: snowdpth_ext(:,:) ! Snow depth (m)
INTEGER, allocatable :: soiltyp_ext (:,:,:)! Soil type
REAL, allocatable :: stypfrct_ext(:,:,:)! Soil type fraction
INTEGER, allocatable :: vegtyp_ext (:,:) ! Vegetation type
REAL, allocatable :: lai_ext (:,:) ! Leaf Area Index
REAL, allocatable :: roufns_ext (:,:) ! Surface roughness
REAL, allocatable :: veg_ext (:,:) ! Vegetation fraction
REAL, allocatable :: trn_ext (:,:) ! External terrain (m)
REAL, allocatable :: psfc_ext (:,:) ! Surface pressure (Pa)
REAL, allocatable :: t_2m_ext (:,:)
REAL, allocatable :: rh_2m_ext(:,:)
REAL, allocatable :: u_10m_ext(:,:)
REAL, allocatable :: v_10m_ext(:,:)
REAL, allocatable :: dxfld(:)
REAL, allocatable :: dyfld(:)
REAL, allocatable :: rdxfld(:)
REAL, allocatable :: rdyfld(:)
REAL, allocatable :: dxfldu(:)
REAL, allocatable :: dyfldu(:)
REAL, allocatable :: rdxfldu(:)
REAL, allocatable :: rdyfldu(:)
REAL, allocatable :: dxfldv(:)
REAL, allocatable :: dyfldv(:)
REAL, allocatable :: rdxfldv(:)
REAL, allocatable :: rdyfldv(:)
REAL, allocatable :: tem1_ext(:,:,:) ! Temporary work array
REAL, allocatable :: tem2_ext(:,:,:) ! Temporary work array
REAL, allocatable :: tem3_ext(:,:,:) ! Temporary work array
REAL, allocatable :: tem4_ext(:,:,:) ! Temporary work array
REAL, allocatable :: tem5_ext(:,:,:) ! Temporary work array
REAL, allocatable :: xa_ext(:,:)
REAL, allocatable :: ya_ext(:,:)
REAL, allocatable :: avgzs_ext(:,:,:)
!
!-----------------------------------------------------------------------
!
! include files
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc'
INCLUDE 'phycst.inc'
INCLUDE 'bndry.inc'
INCLUDE 'adjust.inc'
!
!-----------------------------------------------------------------------
!
! Non-dimensional smoothing coefficient
!
!-----------------------------------------------------------------------
!
REAL :: smfct1,smfct2
PARAMETER( smfct1=0.5, smfct2=-0.5 )
!
REAL :: rhmax
PARAMETER ( rhmax = 1.0)
!
!-----------------------------------------------------------------------
!
! Latitude and longitude for some diagnostic printing,
! e.g. to compare to an observed sounding
!
!-----------------------------------------------------------------------
!
REAL :: latdiag,londiag
PARAMETER (latdiag=34.5606,londiag=-103.0820)
!
!-----------------------------------------------------------------------
!
! Misc internal variables
!
!-----------------------------------------------------------------------
!
CHARACTER (LEN=80) :: basdmpfn
CHARACTER (LEN=19) :: extdinit
CHARACTER (LEN=9) :: extdfcst
CHARACTER (LEN=9) :: julfinit
CHARACTER (LEN=9) :: julfname
!
INTEGER :: i,j,k,ksmth,istatus
INTEGER :: iyr,imo,iday,ihr,imin,isec,jldy
INTEGER :: ifhr,ifmin,ifsec,mfhr
INTEGER :: myr,initsec,iabssec,jabssec,kftime
INTEGER :: ifile,iprtopt,iniotfu,lbasdmpf,onvf,grdbas
INTEGER :: iextmn,iextmx,jextmn,jextmx
INTEGER :: idiag,jdiag
REAL :: latnot(2)
REAL :: amin,amax
REAL :: qvmin,qvmax,qvval
REAL :: csconst,pconst
REAL :: deltaz,tv_ext
REAL :: pres,temp,qvsat,rh,tvbar,qvprt,qtot
REAL :: xdiag,ydiag,dd,dmin,latd,lond
REAL :: ppasc,pmb,tc,tdc,theta,smix,e,bige,alge,dir,spd
!wdt update
CHARACTER (LEN=80) :: soiloutfl,temchar,ternfn
CHARACTER (LEN=80) :: timsnd
INTEGER :: lfn, tmstrln, lternfn
INTEGER :: tsfcout,tsoilout,wetsout,wetdout,wetcout,snowdout
INTEGER :: isnow,jsnow,ii,jj
REAL :: xumin,xumax,yvmin,yvmax
INTEGER :: strlen, ireturn
CHARACTER (LEN=3) :: FMT
CHARACTER (LEN=100) :: tmp_ch
INTEGER :: is,nstyp_ext
!wdt-williams 2002-01-17 GMB ntmerge
DOUBLE PRECISION :: ntmergeinv, mfac
INTEGER :: idist
!
!-----------------------------------------------------------------------
!
! Function f_qvsat and inline directive for Cray PVP
!
!-----------------------------------------------------------------------
!
REAL :: f_qvsat
!fpp$ expand (f_qvsat)
!dir$ inline always f_qvsat
!*$* inline routine (f_qvsat)
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
mgrid = 1
nestgrd = 0
nstyps = 4
nstyp_ext = 0
DO k=1,lvlprof
dumsnd(k) = 0.0
END DO
!
!-----------------------------------------------------------------------
!
! Call initpara to read in ARPS parameters of namelists
!
!-----------------------------------------------------------------------
!
CALL initpara
(nx,ny,nz,nstyps)
CALL initadas
! The adjust namelist block is used by ext2arps. Other
! adas parameters are not used by this program,
! but the name list blocks need to be read in sequence on
! Cray machines such as J90.
myr=MOD(year,100)
WRITE(julfinit,'(i2.2,i3.3,i2.2,i2.2)') myr,jday,hour,minute
CALL ctim2abss
(year,month,day,hour,minute,second,initsec)
!
!-----------------------------------------------------------------------
!
! Read in additional namelists for external file specifications.
!
!-----------------------------------------------------------------------
!
extdopt = 0
extdfmt = 10
dir_extd = './'
extdname = 'may20'
nextdfil = 1
extdtime(1) = '1977-05-20.21:00:00+000:00:00'
iorder = 2
intropt = 1
nsmooth = 1
ext_lbc = 1
ext_vbc = 1
exttrnopt = 0
!wdt-williams 2002-01-17 GMB ntmerge
extntmrg = 1
READ (5,extdfile)
WRITE (6, '(/1x,a)') '&extdfile'
strlen = LEN( dir_extd )
CALL strlnth
( dir_extd, strlen)
WRITE (6, '(3x,a,a,a)') &
'dir_extd = ''', dir_extd(1:strlen), ''','
strlen = LEN( extdname )
CALL strlnth
( extdname, strlen)
WRITE (6, '(3x,a,a,a)') &
'extdname = ''', extdname(1:strlen), ''','
WRITE (6, '(3x,a,i4,a)') 'extdopt = ', extdopt, ','
WRITE (6, '(3x,a,i4,a)') 'extdfmt = ', extdfmt, ','
WRITE (6, '(3x,a,i4,a)') 'nextdfil = ', nextdfil, ','
DO i=1,nextdfil
strlen = LEN( extdtime(i) )
CALL strlnth
( extdtime(i), strlen)
WRITE (6, '(3x,a,i2.2,a,a,a)') &
'extdtime(',i,') = ''', extdtime(i), ''','
END DO
WRITE (6, '(3x,a,i4,a)') 'iorder = ', iorder, ','
WRITE (6, '(3x,a,i4,a)') 'intropt = ', intropt, ','
WRITE (6, '(3x,a,i4,a)') 'nsmooth = ', nsmooth, ','
WRITE (6, '(3x,a,i4,a)') 'hydradj = ', hydradj, ','
WRITE (6, '(3x,a,i4,a)') 'wndadj = ', wndadj, ','
WRITE (6, '(3x,a,i4,a)') 'obropt = ', obropt, ','
WRITE (6, '(3x,a,f16.4,a)') 'obrzero = ', obrzero, ','
WRITE (6, '(3x,a,i4,a)') 'ext_lbc = ', ext_lbc, ','
WRITE (6, '(3x,a,i4,a)') 'ext_vbc = ', ext_vbc, ','
WRITE (6, '(3x,a,i4,a)') 'exttrnopt = ', exttrnopt,','
!wdt-williams 2002-01-17 GMB ntmerge
WRITE (6, '(3x,a,i4,a)') 'extntmrg = ', extntmrg, ','
WRITE (6, '(1x,a)') '&END'
! 2 CONTINUE
!-----------------------------------------------------------------------
!
! Allocate and initalize arrays based on dimension parameters
! read in from the input file
!
!-----------------------------------------------------------------------
select case ( extdopt )
case ( 0 ) ! ARPS grid
select case ( extdfmt )
case ( 1 )
FMT = 'bin'
case ( 2 )
FMT = 'asc'
case ( 3 )
FMT = 'hdf'
case ( 4 )
FMT = 'pak'
case ( 6 )
FMT = 'bn2'
case ( 7 )
FMT = 'net'
case ( 8 )
FMT = 'npk'
case ( 10 )
FMT = 'grb'
case default
PRINT*,'Invalid input history data format given by extdfmt.'
STOP
END select
tmp_ch=trim(dir_extd)//trim(extdname)//'.'//FMT//'grdbas'
PRINT*,'tmp_ch =', trim(tmp_ch)
CALL get_dims_from_data
(extdfmt, &
trim(dir_extd)//trim(extdname)//'.'//FMT//'grdbas', &
nx_ext,ny_ext,nz_ext,nstyp_ext, ireturn)
nstyp_ext = min(nstyp_ext,nstyps)
IF( ireturn /= 0 ) THEN
PRINT*, &
'Problem occured when trying to get dimensions from data.'
PRINT*,'Program stopped.'
STOP
END IF
case ( 1 ) ! RUC (Hybrid-B, GRIB #87) from NMC is 81x62x25
nx_ext=81
ny_ext=62
nz_ext=25
case ( 2 ) ! ETA (GRIB #212, 40km) from NMC is 185x129x39
nx_ext = 185
ny_ext = 129
nz_ext = 39
case ( 3 ) ! OLAPS for 95 is 91x73x41
nx_ext=91
ny_ext=73
nz_ext=41
case ( 4 ) ! RUC in GEMPAK format from Rossby (e.g., those of 1995)
nx_ext=81
ny_ext=62
nz_ext=41
case ( 5 ) ! GEMPAK ETA data
PRINT*,'Need to find out the grid size and set in ext2arps.f.'
STOP
! nx_ext = ??
! ny_ext = ??
! nz_ext = ??
case ( 6 ) ! Special COAMPS files
PRINT*,'Please specify the size of COAMPS input data grid '
PRINT*,'by editing file ext2arps.f.'
STOP
! nx_ext = ??
! ny_ext = ??
! nz_ext = ??
case ( 7 ) ! Isobaric RUC2 GRIB file (AWIPS #211) from OSO
nx_ext=93
ny_ext=65
nz_ext=37
case ( 8 ) ! Global Reanalysis on T62 Gaussian grid
nx_ext = 192
ny_ext = 94
nz_ext = 28
case ( 9 ) ! RUC-2 (GEMPAK) from Doplight is 151x113x41
nx_ext=151
ny_ext=113
nz_ext=41
case ( 10 ) ! ETA (GEMPAK #104, 80km) from NMC is 147x110x39
nx_ext=147
ny_ext=110
nz_ext=39
case ( 11 ) ! Native RUC2 GRIB file (Grid #236) from OSO
nx_ext=151
ny_ext=113
nz_ext=40
case ( 12 ) ! Isobaric RUC2 GRIB file (Grid #236) from OSO
nx_ext=151
ny_ext=113
nz_ext=37
case ( 13 ) ! AVN (GRIB #3, 1x1 degree) from NCEP is 360x181x26
nx_ext = 360
ny_ext = 181
nz_ext = 26
case ( 14 ) ! Binary format lat/lon data
nx_ext = 26
ny_ext = 16
nz_ext = 26
case default
WRITE(6,'(/a/)') &
'extdopt option was invalid. Please specify a new option.'
STOP
END select
PRINT*,'nx_ext, ny_ext, nz_ext = ', nx_ext, ny_ext, nz_ext
allocate( allocate( allocate(
allocate(xscl(nx),stat=istatus)
allocate(yscl(ny),stat=istatus)
allocate(zp(nx,ny,nz),stat=istatus)
allocate(zs(nx,ny,nz),stat=istatus)
allocate(j1(nx,ny,nz),stat=istatus)
allocate(j2(nx,ny,nz),stat=istatus)
allocate(j3(nx,ny,nz),stat=istatus)
allocate(aj3z(nx,ny,nz),stat=istatus)
allocate(hterain(nx,ny),stat=istatus)
!wdt update
allocate(htrn_ext(nx,ny),stat=istatus)
allocate(mapfct(nx,ny,8),stat=istatus)
allocate( allocate( allocate( allocate(pprt(nx,ny,nz),stat=istatus)
allocate(ptprt(nx,ny,nz),stat=istatus)
allocate(qv(nx,ny,nz),stat=istatus)
allocate(qc(nx,ny,nz),stat=istatus)
allocate(qr(nx,ny,nz),stat=istatus)
allocate(qi(nx,ny,nz),stat=istatus)
allocate(qs(nx,ny,nz),stat=istatus)
allocate(qh(nx,ny,nz),stat=istatus)
!
allocate(pbar(nx,ny,nz),stat=istatus)
allocate(ptbar(nx,ny,nz),stat=istatus)
allocate(qvbar(nx,ny,nz),stat=istatus)
allocate(ubar(nx,ny,nz),stat=istatus)
allocate(vbar(nx,ny,nz),stat=istatus)
allocate(wbar(nx,ny,nz),stat=istatus)
allocate(rhobar(nx,ny,nz),stat=istatus)
allocate(rhostr(nx,ny,nz),stat=istatus)
allocate(wcont(nx,ny,nz),stat=istatus)
allocate(csndsq(nx,ny,nz),stat=istatus)
allocate(tsfc(nx,ny,0:nstyps),stat=istatus)
allocate(tsoil(nx,ny,0:nstyps),stat=istatus)
allocate(wetsfc(nx,ny,0:nstyps),stat=istatus)
allocate(wetdp(nx,ny,0:nstyps),stat=istatus)
allocate(wetcanp(nx,ny,0:nstyps),stat=istatus)
allocate(snowdpth(nx,ny),stat=istatus)
allocate(soiltyp (nx,ny,nstyps),stat=istatus)
allocate(stypfrct(nx,ny,nstyps),stat=istatus)
allocate(vegtyp (nx,ny),stat=istatus)
allocate(lai (nx,ny),stat=istatus)
allocate(roufns (nx,ny),stat=istatus)
allocate(veg (nx,ny),stat=istatus)
allocate(tem1(nx,ny,nz),stat=istatus)
allocate(tem2(nx,ny,nz),stat=istatus)
allocate(tem3(nx,ny,nz),stat=istatus)
allocate(tem4(nx,ny,nz),stat=istatus)
allocate(tem5(nx,ny,nz),stat=istatus)
allocate(tem6(nx,ny,nz),stat=istatus)
allocate(tem7(nx,ny,nz),stat=istatus)
allocate(tem8(nx,ny,nz),stat=istatus)
allocate(xs2d(nx,ny),stat=istatus)
allocate(ys2d(nx,ny),stat=istatus)
allocate(xu2d(nx,ny),stat=istatus)
allocate(yu2d(nx,ny),stat=istatus)
allocate(xv2d(nx,ny),stat=istatus)
allocate(yv2d(nx,ny),stat=istatus)
!wdt Copyright (c) 2001 Weather Decision Technologies, Inc.: xw & yw
allocate(xw(nx,ny),stat=istatus)
allocate(yw(nx,ny),stat=istatus)
allocate(iscl(nx,ny),stat=istatus)
allocate(jscl(nx,ny),stat=istatus)
allocate(iu(nx,ny),stat=istatus)
allocate(ju(nx,ny),stat=istatus)
allocate(iv(nx,ny),stat=istatus)
allocate(jv(nx,ny),stat=istatus)
x=0.0
y=0.0
z=0.0
xscl=0.0
yscl=0.0
zp=0.0
zs=0.0
j1=0.0
j2=0.0
j3=0.0
aj3z=0.0
hterain=0.0
!wdt update
htrn_ext=0.0
mapfct=0.0
u=0.0
v=0.0
w=0.0
pprt=0.0
ptprt=0.0
qv=0.0
qc=0.0
qr=0.0
qi=0.0
qs=0.0
qh=0.0
!
pbar=0.0
ptbar=0.0
qvbar=0.0
ubar=0.0
vbar=0.0
wbar=0.0
rhobar=0.0
rhostr=0.0
wcont=0.0
csndsq=0.0
tsfc=0.0
tsoil=0.0
wetsfc=0.0
wetdp=0.0
wetcanp=0.0
snowdpth=0.0
soiltyp =0
stypfrct=0.0
stypfrct(:,:,1) =1.0
vegtyp =0
lai =0.0
roufns =0.0
veg =0.0
tem1=0.0
tem2=0.0
tem3=0.0
tem4=0.0
tem5=0.0
tem6=0.0
tem7=0.0
tem8=0.0
xs2d=0.0
ys2d=0.0
xu2d=0.0
yu2d=0.0
xv2d=0.0
yv2d=0.0
iscl=0
jscl=0
iu=0
ju=0
iv=0
jv=0
!
!-----------------------------------------------------------------------
!
! Allocate and initialize external grid variables
!
!-----------------------------------------------------------------------
!
allocate(x_ext(nx_ext),stat=istatus)
allocate(y_ext(ny_ext),stat=istatus)
allocate(xu_ext(nx_ext),stat=istatus)
allocate(yu_ext(ny_ext),stat=istatus)
allocate(xv_ext(nx_ext),stat=istatus)
allocate(yv_ext(ny_ext),stat=istatus)
allocate(lat_ext(nx_ext,ny_ext),stat=istatus)
allocate(lon_ext(nx_ext,ny_ext),stat=istatus)
allocate(latu_ext(nx_ext,ny_ext),stat=istatus)
allocate(lonu_ext(nx_ext,ny_ext),stat=istatus)
allocate(latv_ext(nx_ext,ny_ext),stat=istatus)
allocate(lonv_ext(nx_ext,ny_ext),stat=istatus)
allocate(zs_ext(nx,ny,nz_ext),stat=istatus)
!
allocate(p_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
allocate(hgt_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
allocate(zp2_ext(nx,ny,nz_ext),stat=istatus)
allocate(zp_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
allocate(t_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
allocate(u_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
allocate(v_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
allocate(w_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
allocate(qv_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
allocate(qc_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
allocate(qr_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
allocate(qi_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
allocate(qs_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
allocate(qh_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
allocate(tsfc_ext (nx_ext,ny_ext,0:nstyps),stat=istatus)
allocate(tsoil_ext (nx_ext,ny_ext,0:nstyps),stat=istatus)
allocate(wetsfc_ext (nx_ext,ny_ext,0:nstyps),stat=istatus)
allocate(wetdp_ext (nx_ext,ny_ext,0:nstyps),stat=istatus)
allocate(wetcanp_ext(nx_ext,ny_ext,0:nstyps),stat=istatus)
allocate(snowdpth_ext(nx_ext,ny_ext),stat=istatus)
allocate(soiltyp_ext (nx_ext,ny_ext,nstyps),stat=istatus)
soiltyp_ext = 0
allocate(stypfrct_ext(nx_ext,ny_ext,nstyps),stat=istatus)
allocate(vegtyp_ext (nx_ext,ny_ext),stat=istatus)
allocate(lai_ext (nx_ext,ny_ext),stat=istatus)
allocate(roufns_ext (nx_ext,ny_ext),stat=istatus)
allocate(veg_ext (nx_ext,ny_ext),stat=istatus)
allocate(trn_ext (nx_ext,ny_ext),stat=istatus)
allocate(psfc_ext (nx_ext,ny_ext),stat=istatus)
allocate(t_2m_ext (nx_ext,ny_ext),stat=istatus)
allocate(rh_2m_ext(nx_ext,ny_ext),stat=istatus)
allocate(u_10m_ext(nx_ext,ny_ext),stat=istatus)
allocate(v_10m_ext(nx_ext,ny_ext),stat=istatus)
allocate(dxfld(nx_ext),stat=istatus)
allocate(dyfld(ny_ext),stat=istatus)
allocate(rdxfld(nx_ext),stat=istatus)
allocate(rdyfld(ny_ext),stat=istatus)
allocate(dxfldu(nx_ext),stat=istatus)
allocate(dyfldu(ny_ext),stat=istatus)
allocate(rdxfldu(nx_ext),stat=istatus)
allocate(rdyfldu(ny_ext),stat=istatus)
allocate(dxfldv(nx_ext),stat=istatus)
allocate(dyfldv(ny_ext),stat=istatus)
allocate(rdxfldv(nx_ext),stat=istatus)
allocate(rdyfldv(ny_ext),stat=istatus)
allocate(tem1_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
allocate(tem2_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
allocate(tem3_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
allocate(tem4_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
allocate(tem5_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
allocate(xa_ext(nx_ext,ny_ext),stat=istatus)
allocate(ya_ext(nx_ext,ny_ext),stat=istatus)
allocate(avgzs_ext(nx,ny,nz_ext),stat=istatus)
!
x_ext=0.0
y_ext=0.0
xu_ext=0.0
yu_ext=0.0
xv_ext=0.0
yv_ext=0.0
lat_ext=0.0
lon_ext=0.0
latu_ext=0.0
lonu_ext=0.0
latv_ext=0.0
lonv_ext=0.0
zs_ext=0.0
!
p_ext=0.0
hgt_ext=0.0
zp2_ext=0.0
zp_ext=0.0
t_ext=0.0
u_ext=0.0
v_ext=0.0
w_ext=0.0
qv_ext=0.0
qc_ext=0.0
qr_ext=0.0
qi_ext=0.0
qs_ext=0.0
qh_ext=0.0
tsfc_ext =-999.0
tsoil_ext =-999.0
wetsfc_ext =-999.0
wetdp_ext =-999.0
wetcanp_ext =-999.0
snowdpth_ext=-999.0
soiltyp = -999.0
stypfrct= -999.0
vegtyp = -999
lai = -999.0
roufns = -999.0
veg = -999.0
trn_ext =0.0
psfc_ext =0.0
t_2m_ext =0.0
rh_2m_ext=0.0
u_10m_ext=0.0
v_10m_ext=0.0
dxfld=0.0
dyfld=0.0
rdxfld=0.0
rdyfld=0.0
dxfldu=0.0
dyfldu=0.0
rdxfldu=0.0
rdyfldu=0.0
dxfldv=0.0
dyfldv=0.0
rdxfldv=0.0
rdyfldv=0.0
tem1_ext=0.0
tem2_ext=0.0
tem3_ext=0.0
tem4_ext=0.0
tem5_ext=0.0
xa_ext=0.0
ya_ext=0.0
avgzs_ext=0.0
!
!-----------------------------------------------------------------------
!
! Set up ARPS map projection
!
!-----------------------------------------------------------------------
!
latnot(1)=trulat1
latnot(2)=trulat2
CALL setmapr
(mapproj,sclfct,latnot,trulon)
!
!-----------------------------------------------------------------------
!
! Set up ARPS grid
!
!-----------------------------------------------------------------------
!
IF (exttrnopt == 1) THEN ! don't really do grid here, just set map proj
ternopt = -1
hterain = 0
END IF
CALL inigrd
(nx,ny,nz, &
x,y,z,zp,hterain,mapfct,j1,j2,j3,tem1,tem2,tem3)
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
aj3z(i,j,k)=0.5*(j3(i,j,k)+j3(i,j,k-1))
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Set up the height levels on which to define the base-state.
!
!-----------------------------------------------------------------------
!
deltaz = depthp/(lvlprof-1)
WRITE(6,'(/a,/a,f7.2,a/)') &
' The base state is formed from a mean sounding created', &
' with a ',deltaz,' meter interval.'
DO k=1,lvlprof
zsnd(k) = (k-1)*deltaz
END DO
!
!-----------------------------------------------------------------------
!
! Loop through the data times provided via NAMELIST.
!
!-----------------------------------------------------------------------
!
iniotfu = 21 ! FORTRAN unit number used for data output
DO ifile=1,nextdfil
!
!-----------------------------------------------------------------------
!
! Time conversions.
! Formats: extdtime='1994-05-06.18:00:00+000:00:00'
! julfname='941261800'
!
!-----------------------------------------------------------------------
!
READ(extdtime(ifile),'(a19,1x,a9)') extdinit,extdfcst
IF(extdfcst == ' ') extdfcst='000:00:00'
READ(extdinit, &
'(i4,1x,i2,1x,i2,1x,i2,1x,i2,1x,i2)',ERR=920,END=920) &
iyr,imo,iday,ihr,imin,isec
CALL julday
(iyr,imo,iday,jldy)
myr=MOD(iyr,100)
ifhr=0
ifmin=0
ifsec=0
READ(extdfcst, &
'(i3,1x,i2,1x,i2)',ERR=4,END=4) ifhr,ifmin,ifsec
4 CONTINUE
mfhr=MOD(ifhr,24)
jldy = jldy + ifhr/24
WRITE(julfname, &
'(i2.2,i3.3,i2.2,i2.2)') myr,jldy,ihr,mfhr
CALL ctim2abss
(iyr,imo,iday,ihr,imin,isec,iabssec)
jabssec=(ifhr*3600) + (ifmin*60) + ifsec + iabssec
kftime=jabssec-initsec
curtim=FLOAT(kftime)
WRITE(6,'(a,a9,a,/19x,a,a19,a/a,a/a,i16,a,/,i26,a)') &
' Calling rdextfil, looking for ', &
extdfcst,' hour forecast ', &
'initialized at ',extdinit,' UTC', &
' Julian filename: ',julfname, &
' Which is ',jabssec,' abs seconds or ',kftime, &
' seconds from the ARPS initial time.'
!
!-----------------------------------------------------------------------
!
! Call getextd to reads and converts data to ARPS units
!
!-----------------------------------------------------------------------
!
select case ( extdopt )
case ( 0 ) ! ARPS grid
CALL getarps
(nx_ext,ny_ext,nz_ext, &
dir_extd,extdname,extdopt,extdfmt, &
extdinit,extdfcst,julfname,nstyps, &
iproj_ext,scale_ext, &
trlon_ext,latnot_ext,x0_ext,y0_ext, &
lat_ext,lon_ext,latu_ext,lonu_ext,latv_ext,lonv_ext, &
p_ext,hgt_ext,zp_ext,t_ext,qv_ext, &
u_ext,tem4_ext,v_ext,tem3_ext,w_ext, &
qc_ext,qr_ext,qi_ext,qs_ext,qh_ext, &
soiltyp_ext,stypfrct_ext,vegtyp_ext, &
lai_ext,roufns_ext,veg_ext, &
tsfc_ext,tsoil_ext, &
wetsfc_ext,wetdp_ext,wetcanp_ext, &
tem1_ext,tem2_ext,istatus)
! tem3_ext holds uatv_ext and tem4_ext holds vatu_ext until
! u & v rotated to new map projection below (see calls to uvetomp)
trn_ext(:,:) = zp_ext(:,:,2)
case ( 1 )
!
!-----------------------------------------------------------------------
!
! Get NMC RUC GRIB #87
!
!-----------------------------------------------------------------------
!
CALL getnmcruc87
(nx_ext,ny_ext,nz_ext, &
dir_extd,extdname,extdopt,extdfmt, &
extdinit,extdfcst,julfname, &
iproj_ext,scale_ext, &
trlon_ext,latnot_ext,x0_ext,y0_ext, &
lat_ext,lon_ext, &
p_ext,hgt_ext,t_ext,qv_ext,u_ext,v_ext, &
qc_ext,qr_ext,qi_ext,qs_ext,qh_ext, &
tsfc_ext,tsoil_ext, &
wetsfc_ext,wetdp_ext,wetcanp_ext, &
trn_ext,psfc_ext, &
istatus)
case ( 2 )
!
!-----------------------------------------------------------------------
!
! Get NMC ETA GRIB #212
!
!-----------------------------------------------------------------------
!
!wdt Copyright (c) 2001 Weather Decision Technologies, Inc. soiltyp_ext
CALL getnmceta212
(nx_ext,ny_ext,nz_ext, &
dir_extd,extdname,extdopt,extdfmt, &
extdinit,extdfcst,julfname, &
iproj_ext,scale_ext, &
trlon_ext,latnot_ext,x0_ext,y0_ext, &
lat_ext,lon_ext, &
p_ext,hgt_ext,t_ext,qv_ext,u_ext,v_ext, &
qc_ext,qr_ext,qi_ext,qs_ext,qh_ext, &
tsfc_ext,tsoil_ext, &
wetsfc_ext,wetdp_ext,wetcanp_ext, &
snowdpth_ext,trn_ext,psfc_ext,soiltyp_ext, &
istatus)
nstyp_ext = 1
stypfrct_ext(:,:,1) = 1.
stypfrct_ext(:,:,2:nstyps) = 0.
case ( 3 )
!
!-----------------------------------------------------------------------
!
! Get LAPS data. Need LAPS library (see makearps for ext2arps.laps)
!
!-----------------------------------------------------------------------
!
CALL getlaps
(nx_ext,ny_ext,nz_ext,dir_extd, &
extdinit,extdfcst,julfname,iabssec, &
iproj_ext,scale_ext, &
trlon_ext,latnot_ext,x0_ext,y0_ext, &
lat_ext,lon_ext, &
p_ext,hgt_ext,t_ext,qv_ext,u_ext,v_ext, &
qc_ext,qr_ext,qi_ext,qs_ext,qh_ext, &
istatus)
case ( 4 )
!
!-----------------------------------------------------------------------
!
! Get RUC/MAPS data in GEMPAK format with a special setup for GEMPAK
! path and library (see makearps for ext2arps.gemruc).
!
!-----------------------------------------------------------------------
!
CALL getgemruc
(nx_ext,ny_ext,nz_ext,dir_extd,extdname, &
extdinit,extdfcst,julfname,iabssec, &
iproj_ext,scale_ext, &
trlon_ext,latnot_ext,x0_ext,y0_ext, &
lat_ext,lon_ext, &
p_ext,hgt_ext,t_ext,qv_ext,u_ext,v_ext, &
qc_ext,qr_ext,qi_ext,qs_ext,qh_ext, &
istatus, tem1_ext)
case ( 5 )
CALL getgemeta
(nx_ext,ny_ext,nz_ext,dir_extd,extdname, &
extdinit,extdfcst,julfname,iabssec, &
iproj_ext,scale_ext, &
trlon_ext,latnot_ext,x0_ext,y0_ext, &
lat_ext,lon_ext, &
p_ext,hgt_ext,t_ext,qv_ext,u_ext,v_ext, &
qc_ext,qr_ext,qi_ext,qs_ext,qh_ext, &
istatus, tem1_ext)
case ( 6 )
!
!-----------------------------------------------------------------------
!
! Get COAMPS data
!
!-----------------------------------------------------------------------
!
CALL getcoamps
(nx_ext, ny_ext, nz_ext, dir_extd, &
extdinit,extdfcst, &
iproj_ext,scale_ext, &
trlon_ext,latnot_ext,x0_ext,y0_ext, &
lat_ext,lon_ext, &
p_ext,hgt_ext,t_ext,qv_ext,u_ext,v_ext, &
qc_ext,qr_ext,qi_ext,qs_ext,qh_ext, &
tsfc_ext,tsoil_ext, &
wetsfc_ext,wetdp_ext,wetcanp_ext,istatus)
case ( 7 )
!
!-----------------------------------------------------------------------
!
! Get NMC RUC2 GRIB #211
!
!-----------------------------------------------------------------------
!
CALL getnmcruc211
(nx_ext,ny_ext,nz_ext, &
dir_extd,extdname,extdopt,extdfmt, &
extdinit,extdfcst,julfname, &
iproj_ext,scale_ext, &
trlon_ext,latnot_ext,x0_ext,y0_ext, &
lat_ext,lon_ext, &
p_ext,hgt_ext,t_ext,qv_ext,u_ext,v_ext, &
qc_ext,qr_ext,qi_ext,qs_ext,qh_ext, &
tsfc_ext,tsoil_ext, &
wetsfc_ext,wetdp_ext,wetcanp_ext, &
trn_ext,psfc_ext, t_2m_ext, rh_2m_ext, &
u_10m_ext, v_10m_ext, istatus)
case ( 8 )
!
!-----------------------------------------------------------------------
!
! Get NCEP global re-analysis on T62 Gaussian lat/lon grid
!
!-----------------------------------------------------------------------
!
CALL getreanalt62
(nx_ext,ny_ext,nz_ext, &
dir_extd,extdname,extdopt,extdfmt, &
extdinit,extdfcst,julfname, &
iproj_ext,scale_ext, &
trlon_ext,latnot_ext,x0_ext,y0_ext, &
lat_ext,lon_ext, &
p_ext,hgt_ext,t_ext,qv_ext,u_ext,v_ext, &
qc_ext,qr_ext,qi_ext,qs_ext,qh_ext, &
tsfc_ext,tsoil_ext,wetsfc_ext,wetdp_ext, &
wetcanp_ext, trn_ext,psfc_ext, istatus)
case ( 9 )
!
!-----------------------------------------------------------------------
!
! Get NMC RUC2 GEM
!
!-----------------------------------------------------------------------
!
CALL getgemruc2
(nx_ext,ny_ext,nz_ext,dir_extd,extdname, &
extdinit,extdfcst,julfname,iabssec, &
iproj_ext,scale_ext, &
trlon_ext,latnot_ext,x0_ext,y0_ext, &
lat_ext,lon_ext, &
p_ext,hgt_ext,t_ext,qv_ext,u_ext,v_ext, &
qc_ext,qr_ext,qi_ext,qs_ext,qh_ext, &
istatus, tem1_ext)
case ( 10 )
!
!-----------------------------------------------------------------------
!
! Get NMC ETA GEMPAK #104
!
!-----------------------------------------------------------------------
!
CALL getgemeta2
(nx_ext,ny_ext,nz_ext,dir_extd,extdname, &
extdinit,extdfcst,julfname,iabssec, &
iproj_ext,scale_ext, &
trlon_ext,latnot_ext,x0_ext,y0_ext, &
lat_ext,lon_ext, &
p_ext,hgt_ext,t_ext,qv_ext,u_ext,v_ext, &
qc_ext,qr_ext,qi_ext,qs_ext,qh_ext, &
istatus, tem1_ext)
!
!-----------------------------------------------------------------------
!
! Get NCEP RUC2 Native Coordinate GRIB (#236)
!
!-----------------------------------------------------------------------
!
case ( 11 )
CALL getnmcrucn236
(nx_ext,ny_ext,nz_ext, &
dir_extd,extdname,extdopt,extdfmt, &
extdinit,extdfcst,julfname, &
iproj_ext,scale_ext, &
trlon_ext,latnot_ext,x0_ext,y0_ext, &
lat_ext,lon_ext, &
p_ext,hgt_ext,t_ext,qv_ext,u_ext,v_ext, &
qc_ext,qr_ext,qi_ext,qs_ext,qh_ext, &
tsfc_ext,tsoil_ext, &
wetsfc_ext,wetdp_ext,wetcanp_ext, &
trn_ext,psfc_ext,snowdpth_ext, &
istatus)
!
!-----------------------------------------------------------------------
!
! Get NCEP RUC2 Isobaric Coordinate GRIB (#236)
!
!-----------------------------------------------------------------------
!
case ( 12 )
CALL getnmcrucp236
(nx_ext,ny_ext,nz_ext, &
dir_extd,extdname,extdopt,extdfmt, &
extdinit,extdfcst,julfname, &
iproj_ext,scale_ext, &
trlon_ext,latnot_ext,x0_ext,y0_ext, &
lat_ext,lon_ext, &
p_ext,hgt_ext,t_ext,qv_ext,u_ext,v_ext, &
qc_ext,qr_ext,qi_ext,qs_ext,qh_ext, &
tsfc_ext,tsoil_ext, &
wetsfc_ext,wetdp_ext,wetcanp_ext, &
trn_ext,psfc_ext, t_2m_ext, rh_2m_ext, &
u_10m_ext, v_10m_ext, snowdpth_ext, &
istatus)
case ( 13 )
!
!-----------------------------------------------------------------------
!
! Get NCEP AVN GRIB #3
!
!-----------------------------------------------------------------------
!
CALL getncepavn3
(nx_ext,ny_ext,nz_ext, &
dir_extd,extdname,extdopt,extdfmt, &
extdinit,extdfcst,julfname, &
iproj_ext,scale_ext, &
trlon_ext,latnot_ext,x0_ext,y0_ext, &
lat_ext,lon_ext, &
p_ext,hgt_ext,t_ext,qv_ext,u_ext,v_ext, &
qc_ext,qr_ext,qi_ext,qs_ext,qh_ext, &
tsfc_ext,tsoil_ext, &
wetsfc_ext,wetdp_ext,wetcanp_ext, &
snowdpth_ext,trn_ext,psfc_ext, &
istatus)
case ( 14 ) ! Binary format lat/lon data
CALL get_avn_bin
(nx_ext,ny_ext,nz_ext, &
dir_extd,extdname,extdinit,extdfcst,julfname, &
iproj_ext,scale_ext,trlon_ext,latnot_ext,x0_ext,y0_ext, &
lat_ext,lon_ext,p_ext,hgt_ext,t_ext,qv_ext,u_ext,v_ext, &
qc_ext,qr_ext,qi_ext,qs_ext,qh_ext, &
tsfc_ext,tsoil_ext,wetsfc_ext,wetdp_ext,wetcanp_ext, &
snowdpth_ext,trn_ext,psfc_ext, &
istatus)
case default
WRITE(6,'(/a/)') &
'extdopt option was invalid. Please specify a new option.'
STOP
END select
IF(istatus /= 1) GO TO 999
PRINT*,' '
CALL a3dmax0
(lat_ext,1,nx_ext,1,nx_ext,1,ny_ext,1,ny_ext, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'lat_ext_min= ', amin,', lat_ext_max=',amax
CALL a3dmax0
(lon_ext,1,nx_ext,1,nx_ext,1,ny_ext,1,ny_ext, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'lon_ext_min= ', amin,', lon_ext_max=',amax
!
CALL a3dmax0
(p_ext ,1,nx_ext,1,nx_ext,1,ny_ext,1,ny_ext, &
1,nz_ext,1,nz_ext,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'p_ext_min = ', amin,', p_ext_max =',amax
CALL a3dmax0
(hgt_ext,1,nx_ext,1,nx_ext,1,ny_ext,1,ny_ext, &
1,nz_ext,1,nz_ext,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'hgt_ext_min= ', amin,', hgt_ext_max=',amax
CALL a3dmax0
(t_ext ,1,nx_ext,1,nx_ext,1,ny_ext,1,ny_ext, &
1,nz_ext,1,nz_ext,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
't_ext_min = ', amin,', t_ext_max =',amax
CALL a3dmax0
(u_ext ,1,nx_ext,1,nx_ext,1,ny_ext,1,ny_ext, &
1,nz_ext,1,nz_ext,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'u_ext_min = ', amin,', u_ext_max =',amax
CALL a3dmax0
(v_ext ,1,nx_ext,1,nx_ext,1,ny_ext,1,ny_ext, &
1,nz_ext,1,nz_ext,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'v_ext_min = ', amin,', v_ext_max =',amax
CALL a3dmax0
(w_ext ,1,nx_ext,1,nx_ext,1,ny_ext,1,ny_ext, &
1,nz_ext,1,nz_ext,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'w_ext_min = ', amin,', w_ext_max =',amax
CALL a3dmax0
(qv_ext ,1,nx_ext,1,nx_ext,1,ny_ext,1,ny_ext, &
1,nz_ext,1,nz_ext,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'qv_ext_min = ', amin,', qv_ext_max =',amax
CALL a3dmax0
(qc_ext ,1,nx_ext,1,nx_ext,1,ny_ext,1,ny_ext, &
1,nz_ext,1,nz_ext,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'qc_ext_min = ', amin,', qc_ext_max =',amax
CALL a3dmax0
(qr_ext ,1,nx_ext,1,nx_ext,1,ny_ext,1,ny_ext, &
1,nz_ext,1,nz_ext,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'qr_ext_min = ', amin,', qr_ext_max =',amax
CALL a3dmax0
(qi_ext ,1,nx_ext,1,nx_ext,1,ny_ext,1,ny_ext, &
1,nz_ext,1,nz_ext,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'qi_ext_min = ', amin,', qi_ext_max =',amax
CALL a3dmax0
(qs_ext ,1,nx_ext,1,nx_ext,1,ny_ext,1,ny_ext, &
1,nz_ext,1,nz_ext,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'qs_ext_min = ', amin,', qs_ext_max =',amax
CALL a3dmax0
(qh_ext ,1,nx_ext,1,nx_ext,1,ny_ext,1,ny_ext, &
1,nz_ext,1,nz_ext,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'qh_ext_min = ', amin,', qh_ext_max =',amax
!wdt note: FIXME add soiltype, etc, plus add nstyp
CALL a3dmax0
(tsfc_ext ,1,nx_ext,1,nx_ext,1,ny_ext,1,ny_ext, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'tsfc_ext_min= ', amin,', tsfc_ext_max=',amax
CALL a3dmax0
(tsoil_ext ,1,nx_ext,1,nx_ext,1,ny_ext,1,ny_ext, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'tsoil_ext_min= ', amin,', tsoil_ext_max=',amax
CALL a3dmax0
(wetsfc_ext ,1,nx_ext,1,nx_ext,1,ny_ext,1,ny_ext, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'wetsfc_ext_min= ', amin,', wetsfc_ext_max=',amax
CALL a3dmax0
(wetdp_ext ,1,nx_ext,1,nx_ext,1,ny_ext,1,ny_ext, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'wetdp_ext_min= ', amin,', wetdp_ext_max=',amax
CALL a3dmax0
(wetcanp_ext,1,nx_ext,1,nx_ext,1,ny_ext,1,ny_ext, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'wetcanp_ext_min= ', amin,', wetcanp_ext_max=',amax
CALL a3dmax0
(snowdpth_ext,1,nx_ext,1,nx_ext,1,ny_ext,1,ny_ext, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'snowd_ext_min= ', amin,', snow_ext_max=',amax
CALL a3dmax0
(trn_ext ,1,nx_ext,1,nx_ext,1,ny_ext,1,ny_ext, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'trn_ext_min= ', amin,', trn_ext_max=',amax
CALL a3dmax0
(psfc_ext ,1,nx_ext,1,nx_ext,1,ny_ext,1,ny_ext, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'psfc_ext_min= ', amin,', psfc_ext_max=',amax
CALL a3dmax0
(t_2m_ext ,1,nx_ext,1,nx_ext,1,ny_ext,1,ny_ext, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'T_2m_ext_min= ', amin,', T_2m_ext_max=',amax
CALL a3dmax0
(rh_2m_ext,1,nx_ext,1,nx_ext,1,ny_ext,1,ny_ext, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'RH_2m_ext_min= ', amin,', RH_2m_ext_max=',amax
CALL a3dmax0
(u_10m_ext,1,nx_ext,1,nx_ext,1,ny_ext,1,ny_ext, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'U_10m_ext_min= ', amin,', U_10m_ext_max=',amax
CALL a3dmax0
(v_10m_ext,1,nx_ext,1,nx_ext,1,ny_ext,1,ny_ext, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'V_10m_ext_min= ', amin,', V_10m_ext_max=',amax
PRINT*,' '
!
!-----------------------------------------------------------------------
!
! First time through the time loop, calculate grid
! transformation info.
!
!-----------------------------------------------------------------------
!
IF(ifile == 1) THEN
DO i=1,nx-1
xscl(i)=0.5*(x(i)+x(i+1))
END DO
xscl(nx)=2.*xscl(nx-1) - xscl(nx-2)
DO j=1,ny-1
yscl(j)=0.5*(y(j)+y(j+1))
END DO
yscl(ny)=2.*yscl(ny-1) - yscl(ny-2)
!
!-----------------------------------------------------------------------
!
! Find lat,lon locations of ARPS scalar, u and v grids.
!
!-----------------------------------------------------------------------
!
CALL xytoll
(nx,ny,xscl,yscl,tem1,tem2)
CALL xytoll
(nx,ny, x,yscl,tem3,tem4)
CALL xytoll
(nx,ny,xscl, y,tem5,tem6)
CALL getmapr
(iproj_arps,scale_arps,latnot_arps, &
trlon_arps,xorig_arps,yorig_arps)
!
!-----------------------------------------------------------------------
!
! Find x,y locations of external grid.
!
!-----------------------------------------------------------------------
!
CALL setmapr
(iproj_ext,scale_ext,latnot_ext,trlon_ext)
CALL setorig
(1,x0_ext,y0_ext)
DO j=1,ny_ext
CALL lltoxy
(1,1,lat_ext(1,j),lon_ext(1,j), &
x_ext(1),y_ext(j))
END DO
DO i=1,nx_ext
CALL lltoxy
(1,1,lat_ext(i,1),lon_ext(i,1), &
x_ext(i),y_ext(1))
END DO
IF ( extdopt == 0 ) THEN
DO j=1,ny_ext
CALL lltoxy
(1,1,latu_ext(1,j),lonu_ext(1,j), &
xu_ext(1),yu_ext(j))
END DO
DO i=1,nx_ext
CALL lltoxy
(1,1,latu_ext(i,1),lonu_ext(i,1), &
xu_ext(i),yu_ext(1))
END DO
DO j=1,ny_ext
CALL lltoxy
(1,1,latv_ext(1,j),lonv_ext(1,j), &
xv_ext(1),yv_ext(j))
END DO
DO i=1,nx_ext
CALL lltoxy
(1,1,latv_ext(i,1),lonv_ext(i,1), &
xv_ext(i),yv_ext(1))
END DO
ENDIF
IF ( extdopt == 8 .OR. extdopt == 13 ) THEN
DO i=1,nx_ext
IF(x_ext(i) < 0.0) x_ext(i)=x_ext(i)+360.
END DO
END IF
!
!-----------------------------------------------------------------------
!
! Find x,y locations of ARPS scalar grid in terms of the
! external grid.
!
!-----------------------------------------------------------------------
!
CALL lltoxy
(nx,ny,tem1,tem2,xs2d,ys2d)
IF ( extdopt == 8 .OR. extdopt == 13 ) THEN
DO i=1,nx
DO j=1,ny
IF( xs2d(i,j) < 0. ) xs2d(i,j)= xs2d(i,j) + 360.
END DO
END DO
END IF
CALL setijloc
(nx,ny,nx_ext,ny_ext,xs2d,ys2d, &
x_ext,y_ext,iscl,jscl)
!
!-----------------------------------------------------------------------
!
! Find x,y locations of ARPS u grid in terms of the
! external grid.
!
!-----------------------------------------------------------------------
!
CALL lltoxy
(nx,ny,tem3,tem4,xu2d,yu2d)
IF( extdopt == 8 .OR. extdopt == 13 ) THEN
DO i=1,nx
DO j=1,ny
IF ( xu2d(i,j) < 0. ) xu2d(i,j)= xu2d(i,j) + 360.
END DO
END DO
END IF
IF ( extdopt == 0 ) THEN
CALL setijloc
(nx,ny,nx_ext,ny_ext,xu2d,yu2d, &
xu_ext,yu_ext,iu,ju)
ELSE
CALL setijloc
(nx,ny,nx_ext,ny_ext,xu2d,yu2d, &
x_ext,y_ext,iu,ju)
ENDIF
!
!-----------------------------------------------------------------------
!
! Find x,y locations of ARPS v grid in terms of the
! external grid.
!
!-----------------------------------------------------------------------
!
CALL lltoxy
(nx,ny,tem5,tem6,xv2d,yv2d)
IF ( extdopt == 8 .OR. extdopt == 13 ) THEN
DO i=1,nx
DO j=1,ny
IF ( xv2d(i,j) < 0. ) xv2d(i,j)= xv2d(i,j) + 360.
END DO
END DO
END IF
IF ( extdopt == 0 ) THEN
CALL setijloc
(nx,ny,nx_ext,ny_ext,xv2d,yv2d, &
xv_ext,yv_ext,iv,jv)
ELSE
CALL setijloc
(nx,ny,nx_ext,ny_ext,xv2d,yv2d, &
x_ext,y_ext,iv,jv)
ENDIF
xumin=xu2d(1,1)
xumax=xu2d(1,1)
DO j=1,ny-1
xumin=MIN(xumin,xu2d(1 ,j))
xumax=MAX(xumax,xu2d(nx,j))
END DO
yvmin=yv2d(1,1)
yvmax=yv2d(1,1)
DO i=1,nx-1
yvmin=MIN(yvmin,yv2d(i,1 ))
yvmax=MAX(yvmax,yv2d(i,ny))
END DO
IF(xumin < x_ext(1).OR.xumax > x_ext(nx_ext).OR. &
yvmin < y_ext(1).OR.yvmax > y_ext(ny_ext)) THEN
WRITE(6,'(a/a)') &
' ARPS domain extends outside available external data', &
' domain, ext2arps aborted.'
WRITE (6,*) "xu min & ext:",xumin,x_ext(1)
WRITE (6,*) "xu max & ext:",xumax,x_ext(nx_ext)
WRITE (6,*) "yv min & ext:",yvmin,y_ext(1)
WRITE (6,*) "yv max & ext:",yvmax,y_ext(ny_ext)
STOP
END IF
!
!-----------------------------------------------------------------------
!
! Test code, for diagnostic testing.
! Find x,y of Norman sounding in external grid.
!
!-----------------------------------------------------------------------
!
CALL lltoxy
(1,1,latdiag,londiag,xdiag,ydiag)
IF ( extdopt == 8 .OR. extdopt == 13 ) THEN
IF ( xdiag < 0. ) xdiag= xdiag + 360.
END IF
dmin=((xdiag-x_ext(1))*(xdiag-x_ext(1))+ &
(ydiag-y_ext(1))*(ydiag-y_ext(1)))
idiag=1
jdiag=1
!
DO j=1,ny_ext
DO i=1,nx_ext
dd=((xdiag-x_ext(i))*(xdiag-x_ext(i))+ &
(ydiag-y_ext(j))*(ydiag-y_ext(j)))
IF(dd < dmin) THEN
dmin=dd
idiag=i
jdiag=j
END IF
END DO
END DO
WRITE(6,'(a,f10.4,f10.4,/a,i5,i5,a,f10.4,f10.4)') &
' Nearest ext pt to diagnostic lat,lon: ', &
latdiag,londiag, &
' Diagnostic i,j: ', &
idiag,jdiag,' lat,lon= ', &
lat_ext(idiag,jdiag),lon_ext(idiag,jdiag)
WRITE(6,'(///a,/2x,a)') ' External sounding at idiag,jdiag', &
'k pres hgt temp theta dewp u v dir spd'
!
!-----------------------------------------------------------------------
!
! Convert units of external data and write as a sounding.
!
!-----------------------------------------------------------------------
!
DO k=nz_ext,1,-1
pmb=.01*p_ext(idiag,jdiag,k)
tc=t_ext(idiag,jdiag,k)-273.15
theta=t_ext(idiag,jdiag,k)*(p0/p_ext(idiag,jdiag,k))**rddcp
IF( qv_ext(idiag,jdiag,k) > 0.) THEN
smix=qv_ext(idiag,jdiag,k)/(1.-qv_ext(idiag,jdiag,k))
e=(pmb*smix)/(0.62197 + smix)
bige=e/( 1.001 + ( (pmb - 100.) / 900.) * 0.0034)
alge = ALOG(bige/6.112)
tdc = (alge * 243.5) / (17.67 - alge)
ELSE
tdc = tc-30.
END IF
CALL uvrotdd
(1,1,lon_ext(idiag,jdiag), &
u_ext(idiag,jdiag,k),v_ext(idiag,jdiag,k), &
dir,spd)
WRITE(6,'(i4,f6.0,f9.0,f7.1,f7.1,f7.1,f7.1,f7.1,f7.1,f7.1)') &
k,pmb, &
hgt_ext(idiag,jdiag,k), &
tc,theta,tdc, &
u_ext(idiag,jdiag,k), &
v_ext(idiag,jdiag,k), &
dir,spd
END DO
!
!-----------------------------------------------------------------------
!
! Restore map projection to ARPS grid.
!
!-----------------------------------------------------------------------
!
CALL setmapr
(iproj_arps,scale_arps,latnot_arps, &
trlon_arps)
CALL setorig
(1,xorig_arps,yorig_arps)
!
!-----------------------------------------------------------------------
!
! Find the min and max of the external indices that will be used
! to be sure interpolation is within external dataset.
!
!-----------------------------------------------------------------------
!
iextmn=iscl(1,1)
jextmn=jscl(1,1)
iextmx=iscl(1,1)
jextmx=jscl(1,1)
DO j=1,ny
DO i=1,nx
iextmn=MIN(iextmn,iscl(i,j))
jextmn=MIN(jextmn,jscl(i,j))
iextmx=MAX(iextmx,iscl(i,j))
jextmx=MAX(jextmx,jscl(i,j))
iextmn=MIN(iextmn,iu(i,j))
jextmn=MIN(jextmn,ju(i,j))
iextmx=MAX(iextmx,iu(i,j))
jextmx=MAX(jextmx,ju(i,j))
iextmn=MIN(iextmn,iv(i,j))
jextmn=MIN(jextmn,jv(i,j))
iextmx=MAX(iextmx,iv(i,j))
jextmx=MAX(jextmx,jv(i,j))
END DO
END DO
END IF
!
!-----------------------------------------------------------------------
!
! External data comes in oriented to true north.
! Change that to u,v in the new coordinate system.
! (tem3_ext & tem4_ext from above hold uatv_ext & vatu_ext for use here)
!
!-----------------------------------------------------------------------
!
IF ( extdopt == 0 ) THEN
DO k=1,nz_ext
CALL uvetomp
(nx_ext,ny_ext,u_ext(1,1,k),tem4_ext(1,1,k), &
lonu_ext,tem1_ext(1,1,k),tem2_ext(1,1,k))
END DO
u_ext = tem1_ext
DO k=1,nz_ext
CALL uvetomp
(nx_ext,ny_ext,tem3_ext(1,1,k),v_ext(1,1,k), &
lonv_ext,tem1_ext(1,1,k),tem2_ext(1,1,k))
END DO
v_ext = tem2_ext
ELSE
DO k=1,nz_ext
CALL uvetomp
(nx_ext,ny_ext,u_ext(1,1,k),v_ext(1,1,k), &
lon_ext,tem1_ext(1,1,k),tem2_ext(1,1,k))
END DO
u_ext = tem1_ext
v_ext = tem2_ext
ENDIF
!
!-----------------------------------------------------------------------
!
! Process height data
!
! Interpolate the external heights horizontally to the
! ARPS x,y. This is for scalar pts.
!
!-----------------------------------------------------------------------
!
CALL setdxdy
(nx_ext,ny_ext, &
1,nx_ext,1,ny_ext, &
x_ext,y_ext,dxfld,dyfld,rdxfld,rdyfld)
IF ( extdopt == 0 ) THEN
CALL setdxdy
(nx_ext,ny_ext, &
1,nx_ext,1,ny_ext, &
xu_ext,yu_ext,dxfldu,dyfldu,rdxfldu,rdyfldu)
CALL setdxdy
(nx_ext,ny_ext, &
1,nx_ext,1,ny_ext, &
xv_ext,yv_ext,dxfldv,dyfldv,rdxfldv,rdyfldv)
DO k=1,nz_ext
CALL fldint2d
(nx,ny,nx_ext,ny_ext, &
1,nx,1,ny, &
1,nx_ext,1,ny_ext, &
iorder,xs2d,ys2d,zp_ext(1,1,k), &
x_ext,y_ext,iscl,jscl, &
dxfld,dyfld,rdxfld,rdyfld, &
tem1_ext,tem2_ext,tem3_ext, &
zp2_ext(1,1,k))
END DO
ENDIF
DO k=1,nz_ext
CALL fldint2d
(nx,ny,nx_ext,ny_ext, &
1,nx,1,ny, &
1,nx_ext,1,ny_ext, &
iorder,xs2d,ys2d,hgt_ext(1,1,k), &
x_ext,y_ext,iscl,jscl, &
dxfld,dyfld,rdxfld,rdyfld, &
tem1_ext,tem2_ext,tem3_ext, &
zs_ext(1,1,k))
END DO
!
!-----------------------------------------------------------------------
!
! Calculate x and y coordinates of external grid in ARPS coordinate
! system. Store them in xa_ext and ya_ext.
!
!-----------------------------------------------------------------------
!
CALL lltoxy
(nx_ext,ny_ext,lat_ext,lon_ext, &
xa_ext,ya_ext)
IF(ifile == 1) THEN
!
!-----------------------------------------------------------------------
!
! Interpolate external terrain to arps grid (if exttrnopt=1).
!
!-----------------------------------------------------------------------
!
!wdt update exttrnopt
!wdt-williams 2002-01-17 GMB ntmerge
IF (exttrnopt > 0) THEN ! set arps terrain to match external terrain
CALL mkarps2d
(nx_ext,ny_ext,nx,ny, &
iorder,iscl,jscl,x_ext,y_ext, &
xs2d,ys2d,trn_ext,htrn_ext, &
dxfld,dyfld,rdxfld,rdyfld, &
tem1_ext(1,1,1),tem1_ext(1,1,2), &
tem1_ext(1,1,3),tem1_ext(1,1,4))
IF (exttrnopt == 1) THEN
hterain = htrn_ext
!wdt-williams 2002-01-17 GMB ntmerge
ELSE
ntmergeinv = 1.d0/extntmrg
DO j = 1,ny
DO i = 1,nx
idist = max(0,min(extntmrg,i-2,nx-2-i,j-2,ny-2-j))
mfac = idist*ntmergeinv
hterain(i,j) = (1.d0-mfac)*htrn_ext(i,j) &
+ mfac*hterain(i,j)
END DO
END DO
END IF
ternopt = -1
CALL inigrd
(nx,ny,nz, &
x,y,z,zp,hterain,mapfct,j1,j2,j3,tem1,tem2,tem3)
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
aj3z(i,j,k)=0.5*(j3(i,j,k)+j3(i,j,k-1))
END DO
END DO
END DO
END IF
!wdt update 2002-01-17
!-----------------------------------------------------------------------
!
! Write out terrain data
!
!-----------------------------------------------------------------------
IF (terndmp > 0) THEN
ternfn = runname(1:lfnkey)//".trndata"
lternfn = lfnkey + 8
IF( dirname /= ' ' ) THEN
temchar = ternfn
ternfn = dirname(1:ldirnam)//'/'//temchar
lternfn = lternfn + ldirnam + 1
END IF
CALL fnversn
(ternfn, lternfn )
PRINT *, 'Write terrain data to ',ternfn(1:lternfn)
CALL writtrn
(nx,ny,ternfn(1:lternfn), dx,dy, &
mapproj,trulat1,trulat2,trulon,sclfct, &
ctrlat,ctrlon,hterain)
!FIXME: add grads control file
!IF (terndmp == 1) &
! CALL trncntl(nx,ny,ternfn(1:lternfn), x1_out,y1_out, &
! tem11,tem21)
END IF
!
!-----------------------------------------------------------------------
!
! Set up z grid at scalar vertical levels.
!
!-----------------------------------------------------------------------
!
onvf = 0
CALL avgz
(zp, onvf, nx,ny,nz, 1,nx, 1,ny, 1,nz-1, zs)
!
DO j=1,ny-1
DO i=1,nx-1
zs(i,j,nz)=2.*zs(i,j,nz-1) - zs(i,j,nz-2)
END DO
END DO
CALL edgfill
(zs, 1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz)
CALL edgfill
(zp, 1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz)
END IF
!
!-----------------------------------------------------------------------
!
! Data transformations
! Calculate log of pressure for external grid.
! Change qv to RHstar RHStar=sqrt(1.-relative humidity)
!
!-----------------------------------------------------------------------
!
qvmin=999.
qvmax=-999.
DO k=1,nz_ext
DO j=1,ny_ext
DO i=1,nx_ext
qvmax=AMAX1(qvmax,qv_ext(i,j,k))
qvmin=AMIN1(qvmin,qv_ext(i,j,k))
tem5_ext(i,j,k)=ALOG(p_ext(i,j,k))
qvsat=f_qvsat
( p_ext(i,j,k), t_ext(i,j,k) )
qv_ext(i,j,k)=SQRT(AMAX1(0.,(rhmax-(qv_ext(i,j,k)/qvsat))))
! u_ext(i,j,k)=tem1_ext(i,j,k)
! v_ext(i,j,k)=tem2_ext(i,j,k)
END DO
END DO
END DO
PRINT *, ' qv_ext min = ',qvmin
PRINT *, ' qv_ext max = ',qvmax
!
!-----------------------------------------------------------------------
!
! Calculate base-state sounding (vertical profile)
!
!-----------------------------------------------------------------------
!
CALL extmnsnd
(nx,ny,nx_ext,ny_ext,nz_ext,lvlprof, &
iextmn,iextmx,jextmn,jextmx,1,nz_ext, &
xscl,yscl,xa_ext,ya_ext, &
hgt_ext,tem5_ext,t_ext, &
qv_ext,u_ext,v_ext, &
zsnd,plsnd,psnd,tsnd,ptsnd,rhssnd,qvsnd, &
rhosnd,usnd,vsnd)
!
!-----------------------------------------------------------------------
!
! Process Pressure data
!
!-----------------------------------------------------------------------
!
iprtopt=1
CALL mkarpsvlz
(nx_ext,ny_ext,nz_ext,nx,ny,nz,lvlprof, &
iorder,iprtopt,intropt,iscl,jscl,x_ext,y_ext, &
hgt_ext,zs_ext,xs2d,ys2d,zs,p_ext, &
zsnd,plsnd,pbar,pprt, &
dxfld,dyfld,rdxfld,rdyfld, &
tem1_ext,tem2_ext,tem3_ext, &
tem4_ext)
DO ksmth=1,nsmooth
DO k=1,nz
CALL smooth9p
(pprt(1,1,k), nx,ny, 1,nx,1,ny, tem1)
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Process potential temperature data
!
!-----------------------------------------------------------------------
!
DO k=1,nz_ext
DO j=1,ny_ext
DO i=1,nx_ext
tem5_ext(i,j,k)=t_ext(i,j,k)*((p0/p_ext(i,j,k))**rddcp)
END DO
END DO
END DO
iprtopt=1
CALL mkarpsvar
(nx_ext,ny_ext,nz_ext,nx,ny,nz,lvlprof, &
iorder,iprtopt,intropt,iscl,jscl,x_ext,y_ext, &
hgt_ext,zs_ext,xs2d,ys2d,zs,tem5_ext, &
zsnd,ptsnd,ptbar,ptprt, &
dxfld,dyfld,rdxfld,rdyfld, &
tem1_ext,tem2_ext,tem3_ext, &
tem4_ext)
DO ksmth=1,nsmooth
CALL smooth3d
(nx,ny,nz, 1,nx,1,ny,1,nz, &
smfct1,zs,ptprt,tem1,ptprt)
! CALL smooth3d(nx,ny,nz, 1,nx,1,ny,1,nz,
! : smfct2,zs,ptprt,tem1,ptprt)
END DO
!
!-----------------------------------------------------------------------
!
! Process qv data.
!
!-----------------------------------------------------------------------
!
iprtopt=0
CALL mkarpsvar
(nx_ext,ny_ext,nz_ext,nx,ny,nz,lvlprof, &
iorder,iprtopt,intropt,iscl,jscl,x_ext,y_ext, &
hgt_ext,zs_ext,xs2d,ys2d,zs,qv_ext, &
zsnd,rhssnd,qvbar,qv, &
dxfld,dyfld,rdxfld,rdyfld, &
tem1_ext,tem2_ext,tem3_ext, &
tem4_ext)
DO ksmth=1,nsmooth
CALL smooth3d
(nx,ny,nz, 1,nx,1,ny,1,nz, &
smfct1,zs, qv,tem1, qv)
! CALL smooth3d(nx,ny,nz, 1,nx,1,ny,1,nz,
! : smfct2,zs, qv,tem1, qv)
END DO
!
!-----------------------------------------------------------------------
!
! Convert rhstar back to qv for writing, further calculations
!
!-----------------------------------------------------------------------
!
qvmax=-999.
qvmin=999.
DO k=1,nz_ext
DO j=1,ny_ext
DO i=1,nx_ext
qvsat=f_qvsat
( p_ext(i,j,k), t_ext(i,j,k) )
rh=AMAX1(0.01,rhmax-(qv_ext(i,j,k)*qv_ext(i,j,k)))
qv_ext(i,j,k)=rh*qvsat
qvmax=AMAX1(qvmax,qv_ext(i,j,k))
qvmin=AMIN1(qvmin,qv_ext(i,j,k))
END DO
END DO
END DO
PRINT *, ' qv_ext min = ',qvmin
PRINT *, ' qv_ext max = ',qvmax
!
qvmax=-999.
qvmin=999.
DO k=1,nz
DO j=1,ny
DO i=1,nx
pres = pbar(i,j,k)+pprt(i,j,k)
temp = (ptbar(i,j,k)+ptprt(i,j,k))*((pres/p0)**rddcp)
qvsat=f_qvsat
( pres, temp )
IF(qvsat > 1.) THEN
PRINT *, ' qvsat trouble at: ',i,j,k
PRINT *, ' temp,press,qvsat: ',temp,pres,qvsat
END IF
rh=AMAX1(0.01,rhmax-(qv(i,j,k)*qv(i,j,k)))
rh=AMIN1(rh,rhmax)
qv(i,j,k)=rh*qvsat
IF(qv(i,j,k) > 0.5) THEN
PRINT *, ' qvsat trouble at: ',i,j,k
PRINT *, ' temp,press,qvsat: ',temp,pres,qv(i,j,k)
PRINT *, ' rh= ',rh
END IF
qvmax=AMAX1(qvmax,qv(i,j,k))
qvmin=AMIN1(qvmin,qv(i,j,k))
pres = pbar(i,j,k)
temp = ptbar(i,j,k)*((pres/p0)**rddcp)
qvsat=f_qvsat
( pres, temp )
rh=AMAX1(0.01,rhmax-(qvbar(i,j,k)*qvbar(i,j,k)))
rh=AMIN1(rh,rhmax)
qvbar(i,j,k)=rh*qvsat
END DO
END DO
END DO
PRINT *, ' qv min = ',qvmin
PRINT *, ' qv max = ',qvmax
!
!-----------------------------------------------------------------------
!
! Process qc data.
! If first data point is less than or equal to -1, then
! no qc info is provided...set to zero.
!
!-----------------------------------------------------------------------
!
IF(qc_ext(1,1,1) > -1.0) THEN
iprtopt=0
CALL mkarpsvar
(nx_ext,ny_ext,nz_ext,nx,ny,nz,lvlprof, &
iorder,iprtopt,intropt,iscl,jscl,x_ext,y_ext, &
hgt_ext,zs_ext,xs2d,ys2d,zs,qc_ext, &
zsnd,dumsnd,tem1,qc, &
dxfld,dyfld,rdxfld,rdyfld, &
tem1_ext,tem2_ext,tem3_ext, &
tem4_ext)
DO ksmth=1,nsmooth
CALL smooth3d
(nx,ny,nz, 1,nx,1,ny,1,nz, &
smfct1,zs, qc,tem1, qc)
END DO
ELSE
DO k=1,nz
DO j=1,ny
DO i=1,nx
qc(i,j,k)=0.
END DO
END DO
END DO
END IF
!
!-----------------------------------------------------------------------
!
! Process qr data.
! If first data point is less than or equal to -1, then
! no qr info is provided...set to zero.
!
!-----------------------------------------------------------------------
!
IF(qr_ext(1,1,1) > -1.0) THEN
iprtopt=0
CALL mkarpsvar
(nx_ext,ny_ext,nz_ext,nx,ny,nz,lvlprof, &
iorder,iprtopt,intropt,iscl,jscl,x_ext,y_ext, &
hgt_ext,zs_ext,xs2d,ys2d,zs,qr_ext, &
zsnd,dumsnd,tem1,qr, &
dxfld,dyfld,rdxfld,rdyfld, &
tem1_ext,tem2_ext,tem3_ext, &
tem4_ext)
DO ksmth=1,nsmooth
CALL smooth3d
(nx,ny,nz, 1,nx,1,ny,1,nz, &
smfct1,zs, qr,tem1, qr)
END DO
DO k=1,nz
DO j=1,ny
DO i=1,nx
qr(i,j,k)=MAX(qr(i,j,k),0.)
END DO
END DO
END DO
ELSE
DO k=1,nz
DO j=1,ny
DO i=1,nx
qr(i,j,k)=0.
END DO
END DO
END DO
END IF
!
!-----------------------------------------------------------------------
!
! Process qi data.
! If first data point is less than or equal to -1, then
! no qi info is provided...set to zero.
!
!-----------------------------------------------------------------------
!
iceout=0
IF(qi_ext(1,1,1) > -1.0) THEN
iceout=1
iprtopt=0
CALL mkarpsvar
(nx_ext,ny_ext,nz_ext,nx,ny,nz,lvlprof, &
iorder,iprtopt,intropt,iscl,jscl,x_ext,y_ext, &
hgt_ext,zs_ext,xs2d,ys2d,zs,qi_ext, &
zsnd,dumsnd,tem1,qi, &
dxfld,dyfld,rdxfld,rdyfld, &
tem1_ext,tem2_ext,tem3_ext, &
tem4_ext)
DO ksmth=1,nsmooth
CALL smooth3d
(nx,ny,nz, 1,nx,1,ny,1,nz, &
smfct1,zs, qi,tem1, qi)
END DO
DO k=1,nz
DO j=1,ny
DO i=1,nx
qi(i,j,k)=MAX(qi(i,j,k),0.)
END DO
END DO
END DO
ELSE
DO k=1,nz
DO j=1,ny
DO i=1,nx
qi(i,j,k)=0.
END DO
END DO
END DO
END IF
!
!-----------------------------------------------------------------------
!
! Process qs data.
! If first data point is less than or equal to -1, then
! no qs info is provided...set to zero.
!
!-----------------------------------------------------------------------
!
IF(qs_ext(1,1,1) > -1.0) THEN
iceout=1
iprtopt=0
CALL mkarpsvar
(nx_ext,ny_ext,nz_ext,nx,ny,nz,lvlprof, &
iorder,iprtopt,intropt,iscl,jscl,x_ext,y_ext, &
hgt_ext,zs_ext,xs2d,ys2d,zs,qs_ext, &
zsnd,dumsnd,tem1,qs, &
dxfld,dyfld,rdxfld,rdyfld, &
tem1_ext,tem2_ext,tem3_ext, &
tem4_ext)
DO ksmth=1,nsmooth
CALL smooth3d
(nx,ny,nz, 1,nx,1,ny,1,nz, &
smfct1,zs, qs,tem1, qs)
END DO
DO k=1,nz
DO j=1,ny
DO i=1,nx
qs(i,j,k)=MAX(qs(i,j,k),0.)
END DO
END DO
END DO
ELSE
DO k=1,nz
DO j=1,ny
DO i=1,nx
qs(i,j,k)=0.
END DO
END DO
END DO
END IF
!
!-----------------------------------------------------------------------
!
! Process qh data.
! If first data point is less than or equal to -1, then
! no qh info is provided...set to zero.
!
!-----------------------------------------------------------------------
!
IF(qh_ext(1,1,1) > -1.0) THEN
iceout=1
iprtopt=0
CALL mkarpsvar
(nx_ext,ny_ext,nz_ext,nx,ny,nz,lvlprof, &
iorder,iprtopt,intropt,iscl,jscl,x_ext,y_ext, &
hgt_ext,zs_ext,xs2d,ys2d,zs,qh_ext, &
zsnd,dumsnd,tem1,qh, &
dxfld,dyfld,rdxfld,rdyfld, &
tem1_ext,tem2_ext,tem3_ext, &
tem4_ext)
DO ksmth=1,nsmooth
CALL smooth3d
(nx,ny,nz, 1,nx,1,ny,1,nz, &
smfct1,zs, qh,tem1, qh)
END DO
DO k=1,nz
DO j=1,ny
DO i=1,nx
qh(i,j,k)=MAX(qh(i,j,k),0.)
END DO
END DO
END DO
ELSE
DO k=1,nz
DO j=1,ny
DO i=1,nx
qh(i,j,k)=0.
END DO
END DO
END DO
END IF
!
!-----------------------------------------------------------------------
!
! Process density which has been stuffed into tem2_ext array.
! We really only need rhobar, so set iprtopt=1 and pass
! a temporary array in place of rhoprt.
!
!-----------------------------------------------------------------------
!
DO k=1,nz_ext
DO j=1,ny_ext
DO i=1,nx_ext
tv_ext=t_ext(i,j,k) / &
((1.0+qv_ext(i,j,k))* &
(1.0-(qv_ext(i,j,k)/(rddrv+qv_ext(i,j,k)))))
tem5_ext(i,j,k)=p_ext(i,j,k)/(rd*tv_ext)
END DO
END DO
END DO
!
iprtopt=1
CALL mkarpsvar
(nx_ext,ny_ext,nz_ext,nx,ny,nz,lvlprof, &
iorder,iprtopt,intropt,iscl,jscl,x_ext,y_ext, &
hgt_ext,zs_ext,xs2d,ys2d,zs,tem5_ext, &
zsnd,rhosnd,rhobar,tem1, &
dxfld,dyfld,rdxfld,rdyfld, &
tem1_ext,tem2_ext,tem3_ext, &
tem4_ext)
DO ksmth=1,nsmooth
CALL smooth3d
(nx,ny,nz, 1,nx,1,ny,1,nz, &
smfct1,zs,rhobar,tem1,rhobar)
! CALL smooth3d(nx,ny,nz, 1,nx,1,ny,1,nz,
! : smfct2,zs,rhobar,tem1,rhobar)
END DO
!
!-----------------------------------------------------------------------
!
! Calculate and store the sound wave speed squared in csndsq.
!
!-----------------------------------------------------------------------
!
IF(csopt == 1) THEN ! Original definition of sound speed.
DO k=1,nz
DO j=1,ny
DO i=1,nx
csndsq(i,j,k)= cpdcv*pbar(i,j,k)/rhobar(i,j,k)
END DO
END DO
END DO
ELSE IF(csopt == 2) THEN ! Original sound speed multiplied
! by a factor
csconst = csfactr**2*cpdcv
DO k=1,nz
DO j=1,ny
DO i=1,nx
csndsq(i,j,k)= csconst * pbar(i,j,k)/rhobar(i,j,k)
END DO
END DO
END DO
ELSE ! Specified constant sound speed.
DO k=1,nz
DO j=1,ny
DO i=1,nx
csndsq(i,j,k)= csound * csound
END DO
END DO
END DO
END IF
!
IF(hydradj == 1 .OR. hydradj == 2) THEN
pconst=0.5*g*dz
!
!-----------------------------------------------------------------------
!
! Create thermal buoyancy at each scalar point,
! which is stored in tem2
!
!-----------------------------------------------------------------------
!
DO k=1,nz
DO j=1,ny
DO i=1,nx
qvprt=qv(i,j,k)-qvbar(i,j,k)
qtot=qc(i,j,k)+qr(i,j,k)+qi(i,j,k)+qs(i,j,k)+qh(i,j,k)
tem2(i,j,k)=j3(i,j,k)*rhobar(i,j,k)* &
g*( (ptprt(i,j,k)/ptbar(i,j,k)) + &
(qvprt/(rddrv+qvbar(i,j,k))) - &
((qvprt+qtot)/(1.+qvbar(i,j,k))) )
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Average thermal buoyancy to w points
! which is stored in tem3
!
!-----------------------------------------------------------------------
!
CALL avgsw
(tem2,nx,ny,nz,1,nx,1,ny, tem3)
IF(hydradj == 1) THEN
DO i=1,nx
DO j=1,ny
tem1(i,j,1)=pprt(i,j,1)
DO k=2,nz-2
tem1(i,j,k)= &
( (1. - (pconst*j3(i,j,k-1)/csndsq(i,j,k-1)) )* &
tem1(i,j,k-1) + &
dz*tem3(i,j,k) ) / &
(1. + (pconst*j3(i,j,k)/csndsq(i,j,k)) )
IF(j == 26 .AND. MOD(i,10) == 0) THEN
IF(k == nz-2) PRINT *, ' Point i= ',i, ' j=26'
PRINT *, ' k,pprt,tem1,diff =', &
k,pprt(i,j,k),tem1(i,j,k), &
(tem1(i,j,k)-pprt(i,j,k))
END IF
pprt(i,j,k)=tem1(i,j,k)
END DO
pprt(i,j,nz-1)=pprt(i,j,nz-2)
END DO
END DO
ELSE IF(hydradj == 2) THEN
DO i=1,nx
DO j=1,ny
tem1(i,j,nz-1)=pprt(i,j,nz-1)
DO k=nz-2,2,-1
tem1(i,j,k)= &
( (1.+ (pconst*j3(i,j,k+1)/csndsq(i,j,k+1)) )* &
tem1(i,j,k+1) - &
dz*tem3(i,j,k+1) ) / &
(1.- (pconst*j3(i,j,k )/csndsq(i,j,k )) )
IF(j == 26 .AND. MOD(i,10) == 0) THEN
IF(k == nz-2) PRINT *, ' Point i= ',i, ' j=26'
PRINT *, ' k,pprt,tem1,diff =', &
k,pprt(i,j,k),tem1(i,j,k), &
(tem1(i,j,k)-pprt(i,j,k))
END IF
pprt(i,j,k)=tem1(i,j,k)
END DO
pprt(i,j,1)=pprt(i,j,2)
END DO
END DO
END IF
ELSE IF (hydradj == 3) THEN
!
!-----------------------------------------------------------------------
!
! Calculate total pressure, store in tem1.
! Calculate virtual temperature, store in tem2.
!
!-----------------------------------------------------------------------
!
DO k=1,nz
DO j=1,ny
DO i=1,nx
tem1(i,j,k) = pbar(i,j,k)+pprt(i,j,k)
temp = (ptbar(i,j,k)+ptprt(i,j,k))* &
((tem1(i,j,k)/p0)**rddcp)
tem2(i,j,k) = temp*(1.0+rvdrd*qv(i,j,k))/(1.0+qv(i,j,k))
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Integrate hydrostatic equation, begining at k=2
!
!-----------------------------------------------------------------------
!
pconst=-g/rd
DO k=3,nz-1
DO j=1,ny
DO i=1,nx
tvbar=0.5*(tem2(i,j,k)+tem2(i,j,k-1))
tem1(i,j,k)=tem1(i,j,k-1)* &
EXP(pconst*(zs(i,j,k)-zs(i,j,k-1))/tvbar)
pprt(i,j,k)=tem1(i,j,k)-pbar(i,j,k)
END DO
END DO
END DO
DO j=1,ny
DO i=1,nx
tvbar=0.5*(tem2(i,j,2)+tem2(i,j,1))
tem1(i,j,1)=tem1(i,j,2)* &
EXP(pconst*(zs(i,j,1)-zs(i,j,2))/tvbar)
pprt(i,j,1)=tem1(i,j,1)-pbar(i,j,1)
END DO
END DO
END IF
!
!-----------------------------------------------------------------------
!
! Process wind data
!
!-----------------------------------------------------------------------
!
CALL avgsu
(zs_ext,nx,ny,nz_ext, 1,ny, 1,nz_ext, avgzs_ext, tem3_ext)
CALL avgsu
(zs,nx,ny,nz, 1,ny, 1,nz, tem2, tem3)
DO k=1,nz_ext
DO j=1,ny
avgzs_ext(1,j,k)=zs_ext(1,j,k)
avgzs_ext(nx,j,k)=zs_ext(nx-1,j,k)
END DO
END DO
DO k=1,nz
DO j=1,ny
tem2(1,j,k)=zs(1,j,k)
tem2(nx,j,k)=zs(nx-1,j,k)
END DO
END DO
IF ( extdopt == 0 ) THEN ! u is staggered as in arps
CALL avgsu
(hgt_ext,nx_ext,ny_ext,nz_ext,1,ny_ext,1,nz_ext,tem5_ext, &
tem3_ext)
tem5_ext(1,1:ny_ext,1:nz_ext) = hgt_ext(1,1:ny_ext,1:nz_ext)
tem5_ext(nx,1:ny_ext,1:nz_ext) = hgt_ext(nx-1,1:ny_ext,1:nz_ext)
!
iprtopt=0
CALL mkarpsvar
(nx_ext,ny_ext,nz_ext,nx,ny,nz,lvlprof, &
iorder,iprtopt,intropt,iu,ju,xu_ext,yu_ext, &
tem5_ext,avgzs_ext,xu2d,yu2d,tem2,u_ext, &
zsnd,usnd,ubar,u, &
dxfldu,dyfldu,rdxfldu,rdyfldu, &
tem1_ext,tem2_ext,tem3_ext, &
tem4_ext)
ELSE ! u is on a scalar point
iprtopt=0
CALL mkarpsvar
(nx_ext,ny_ext,nz_ext,nx,ny,nz,lvlprof, &
iorder,iprtopt,intropt,iu,ju,x_ext,y_ext, &
hgt_ext,avgzs_ext,xu2d,yu2d,tem2,u_ext, &
zsnd,usnd,ubar,u, &
dxfld,dyfld,rdxfld,rdyfld, &
tem1_ext,tem2_ext,tem3_ext, &
tem4_ext)
ENDIF
DO ksmth=1,nsmooth
CALL smooth3d
(nx,ny,nz, 1,nx,1,ny,1,nz, &
smfct1,tem2, u,tem1, u)
! call smooth3d(nx,ny,nz, 1,nx,1,ny,1,nz,
! : smfct2,tem2, u,tem1, u)
END DO
CALL a3dmax0
(u,1,nx,1,nx,1,ny,1,ny-1,1,nz,1,nz-1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'umin final= ', amin,', umax final=',amax
!
!-----------------------------------------------------------------------
!
! Process v component
!
!-----------------------------------------------------------------------
!
CALL avgsv
(zs_ext,nx,ny,nz_ext, 1,nx, 1,nz_ext, avgzs_ext, tem3_ext)
CALL avgsv
(zs,nx,ny,nz, 1,nx, 1,nz, tem2, tem3)
DO k=1,nz_ext
DO i=1,nx
avgzs_ext(i,1,k)=zs_ext(i,1,k)
avgzs_ext(i,ny,k)=zs_ext(i,ny-1,k)
END DO
END DO
DO k=1,nz
DO i=1,nx
tem2(i,1,k)=zs(i,1,k)
tem2(i,ny,k)=zs(i,ny-1,k)
END DO
END DO
IF ( extdopt == 0 ) THEN ! v is staggered as in arps
CALL avgsv
(hgt_ext,nx_ext,ny_ext,nz_ext,1,nx_ext,1,nz_ext,tem5_ext, &
tem3_ext)
tem5_ext(1:nx_ext,1,1:nz_ext) = hgt_ext(1:nx_ext,1,1:nz_ext)
tem5_ext(1:nx_ext,ny,1:nz_ext) = hgt_ext(1:nx_ext,ny-1,1:nz_ext)
iprtopt=0
CALL mkarpsvar
(nx_ext,ny_ext,nz_ext,nx,ny,nz,lvlprof, &
iorder,iprtopt,intropt,iv,jv,xv_ext,yv_ext, &
tem5_ext,avgzs_ext,xv2d,yv2d,tem2,v_ext, &
zsnd,vsnd,vbar,v, &
dxfldv,dyfldv,rdxfldv,rdyfldv, &
tem1_ext,tem2_ext,tem3_ext, &
tem4_ext)
ELSE ! v is on a scalar point
iprtopt=0
CALL mkarpsvar
(nx_ext,ny_ext,nz_ext,nx,ny,nz,lvlprof, &
iorder,iprtopt,intropt,iv,jv,x_ext,y_ext, &
hgt_ext,avgzs_ext,xv2d,yv2d,tem2,v_ext, &
zsnd,vsnd,vbar,v, &
dxfld,dyfld,rdxfld,rdyfld, &
tem1_ext,tem2_ext,tem3_ext, &
tem4_ext)
ENDIF
DO ksmth=1,nsmooth
CALL smooth3d
(nx,ny,nz, 1,nx,1,ny,1,nz, &
smfct1,tem2, v,tem1, v)
END DO
CALL a3dmax0
(v,1,nx,1,nx-1,1,ny,1,ny,1,nz,1,nz-1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'vmin final= ', amin,', vmax final=',amax
!
!-----------------------------------------------------------------------
!
! Process 2D surface fields if required (sfcout = 1)
!
!-----------------------------------------------------------------------
!
! determine the number of soil types supplied
IF (nstyp_ext <= 0) THEN
DO is=1,nstyps
IF (tsfc_ext(1,1,is) > 0) nstyp_ext = is
ENDDO
ENDIF
! GMB 2001-03-13 wdt
! This should never be the case (or else ext sfc arrays allocated to small!):
nstyp_ext = min(nstyp_ext,nstyps)
tsfcout = 0
tsoilout = 0
wetsout = 0
wetdout = 0
wetcout = 0
!wdt Copyright (c) 2001 Weather Decision Technologies, Inc. 2000/11/01 GMB soil consistency:
!wdt begin block:
!commented out mkarps2d & smooth9's, add call to intrp_soil
DO is=0,nstyp_ext
CALL a3dmax0
(tsfc_ext(1,1,is),1,nx_ext,1,nx_ext,1,ny_ext,1,ny_ext, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,a,i3,2(a,e13.6))') 'is=',is, &
'tsfc_ext_min= ', amin,', tsfc_ext_max=',amax
IF ( tsfc_ext(1,1,is) > 0.0 ) THEN
tsfcout = 1
! CALL mkarps2d (nx_ext,ny_ext,nx,ny, &
! iorder,iscl,jscl,x_ext,y_ext, &
! xs2d,ys2d,tsfc_ext(1,1,is),tsfc(1,1,is), &
! dxfld,dyfld,rdxfld,rdyfld, &
! tem1_ext(1,1,1),tem1_ext(1,1,2), &
! tem1_ext(1,1,3),tem1_ext(1,1,4))
! DO ksmth=1,nsmooth
! CALL smooth9p(tsfc(1,1,is), nx,ny, 1,nx,1,ny, tem1)
! END DO
END IF
IF ( tsoil_ext(1,1,is) > 0.0 ) THEN
tsoilout = 1
! CALL mkarps2d (nx_ext,ny_ext,nx,ny, &
! iorder,iscl,jscl,x_ext,y_ext, &
! xs2d,ys2d,tsoil_ext(1,1,is),tsoil(1,1,is), &
! dxfld,dyfld,rdxfld,rdyfld, &
! tem1_ext(1,1,1),tem1_ext(1,1,2), &
! tem1_ext(1,1,3),tem1_ext(1,1,4))
! DO ksmth=1,nsmooth
! CALL smooth9p(tsoil(1,1,is), nx,ny, 1,nx,1,ny, tem1)
! END DO
END IF
IF ( wetsfc_ext(1,1,is) >= 0.0 ) THEN
wetsout = 1
! CALL mkarps2d (nx_ext,ny_ext,nx,ny, &
! iorder,iscl,jscl,x_ext,y_ext, &
! xs2d,ys2d,wetsfc_ext(1,1,is),wetsfc(1,1,is), &
! dxfld,dyfld,rdxfld,rdyfld, &
! tem1_ext(1,1,1),tem1_ext(1,1,2), &
! tem1_ext(1,1,3),tem1_ext(1,1,4))
! DO ksmth=1,nsmooth
! CALL smooth9p(wetsfc(1,1,is), nx,ny, 1,nx,1,ny, tem1)
! END DO
END IF
IF ( wetdp_ext(1,1,is) >= 0.0 ) THEN
wetdout = 1
! CALL mkarps2d (nx_ext,ny_ext,nx,ny, &
! iorder,iscl,jscl,x_ext,y_ext, &
! xs2d,ys2d,wetdp_ext(1,1,is),wetdp(1,1,is), &
! dxfld,dyfld,rdxfld,rdyfld, &
! tem1_ext(1,1,1),tem1_ext(1,1,2), &
! tem1_ext(1,1,3),tem1_ext(1,1,4))
! DO ksmth=1,nsmooth
! CALL smooth9p(wetdp(1,1,is), nx,ny, 1,nx,1,ny, tem1)
! END DO
END IF
IF ( wetcanp_ext(1,1,is) >= 0.0 ) THEN
wetcout = 1
! CALL mkarps2d (nx_ext,ny_ext,nx,ny, &
! iorder,iscl,jscl,x_ext,y_ext, &
! xs2d,ys2d,wetcanp_ext(1,1,is),wetcanp(1,1,is), &
! dxfld,dyfld,rdxfld,rdyfld, &
! tem1_ext(1,1,1),tem1_ext(1,1,2), &
! tem1_ext(1,1,3),tem1_ext(1,1,4))
! DO ksmth=1,nsmooth
! CALL smooth9p(wetcanp(1,1,is), nx,ny, 1,nx,1,ny, tem1)
! END DO
END IF
END DO ! is
!wdt end
CALL fix_soil_nstyp
(nx,ny,nstyp_ext,nstyp,tsfc,tsoil, &
wetsfc,wetdp,wetcanp)
IF ( snowdpth_ext(1,1) >= 0 ) THEN
snowdout = 1
!wdt
! CALL mkarps2d (nx_ext,ny_ext,nx,ny, &
! iorder,iscl,jscl,x_ext,y_ext, &
! xs2d,ys2d,snowdpth_ext,snowdpth, &
! dxfld,dyfld,rdxfld,rdyfld, &
! tem1_ext(1,1,1),tem1_ext(1,1,2), &
! tem1_ext(1,1,3),tem1_ext(1,1,4))
DO j=1,ny
DO i=1,nx
dmin=((xs2d(i,j)-x_ext(1))*(xs2d(i,j)-x_ext(1)) + &
(ys2d(i,j)-y_ext(1))*(ys2d(i,j)-y_ext(1)))
isnow=1
jsnow=1
DO jj=jscl(i,j),MAX(jscl(i,j)+1,ny_ext)
DO ii=iscl(i,j),MAX(iscl(i,j)+1,nx_ext)
dd=((xs2d(i,j)-x_ext(ii))*(xs2d(i,j)-x_ext(ii)) + &
(ys2d(i,j)-y_ext(jj))*(ys2d(i,j)-y_ext(jj)))
IF(dd < dmin) THEN
dmin=dd
isnow=ii
jsnow=jj
END IF
END DO
END DO
snowdpth(i,j) = snowdpth_ext(isnow,jsnow)
END DO
END DO
END IF
!wdt Copyright (c) 2001 Weather Decision Technologies, Inc. 2000/11/01 GMB soil consistency:
!wdt begin block:
xw = 0.
yw = 0.
DO j = 1,ny-1
DO i = 1,nx-1
xw(i,j) = &
MAX(0.,MIN(1.,(x_ext(iscl(i,j)+1)-xs2d(i,j)) &
/(x_ext(iscl(i,j)+1)-x_ext(iscl(i,j)))))
yw(i,j) = &
MAX(0.,MIN(1.,(y_ext(jscl(i,j)+1)-ys2d(i,j)) &
/(y_ext(jscl(i,j)+1)-y_ext(jscl(i,j)))))
END DO
END DO
!tmp wdt - for reference
!CALL intrp_soil(nx,ny,nx1,ny1,nstyp,nstyp,xw,yw,ix,jy, &
! tsfc,tsoil,wetsfc,wetdp,wetcanp, &
! soiltyp,stypfrct,vegtyp, &
! tsfc1,tsoil1,wetsfc1,wetdp1,wetcanp1, &
! soiltyp1,stypfrct1,vegtyp1)
CALL intrp_soil
(nx_ext,ny_ext,nx,ny,nstyp_ext,nstyp,xw,yw,iscl,jscl, &
tsfc_ext,tsoil_ext,wetsfc_ext,wetdp_ext,wetcanp_ext, &
soiltyp_ext,stypfrct_ext,vegtyp_ext, &
tsfc,tsoil,wetsfc,wetdp,wetcanp, &
soiltyp,stypfrct,vegtyp)
!wdt FIXME other data types ...; make soiltyp consistant with
! soil temps, etc.; move this section before soil temp/moist section
! INTEGER, allocatable :: soiltyp (:,:,:)! Soil type
! REAL, allocatable :: stypfrct(:,:,:)! Soil type fraction
! INTEGER, allocatable :: vegtyp (:,:) ! Vegetation type
! REAL, allocatable :: lai (:,:) ! Leaf Area Index
! REAL, allocatable :: roufns (:,:) ! Surface roughness
! REAL, allocatable :: veg (:,:) ! Vegetation fraction
!
! CALL fix_stypfrct_nstyp(nx,ny,nstyp_ext,nstyp,stypfrct)
!wdt FIXME
! Add capability to write out sfcdata file here? ...
!wdt end
IF ( tsfcout == 1 .OR. tsoilout == 1 .OR. &
wetsout == 1 .OR. wetdout == 1 .OR. &
wetcout == 1 .OR. snowdout == 1 ) THEN
CALL cvttsnd
( curtim, timsnd, tmstrln )
soiloutfl = runname(1:lfnkey)//".soilvar."//timsnd(1:tmstrln)
lfn = lfnkey + 9 + tmstrln
IF( dirname /= ' ' ) THEN
temchar = soiloutfl
soiloutfl = dirname(1:ldirnam)//'/'//temchar
lfn = lfn + ldirnam + 1
END IF
IF (soildmp > 0) THEN
CALL fnversn
(soiloutfl, lfn)
PRINT *, 'Write soil initial data to ',soiloutfl(1:lfn)
CALL wrtsoil
(nx,ny,nstyp, soiloutfl,dx,dy, &
mapproj,trulat1,trulat2,trulon,sclfct,ctrlat,ctrlon, &
tsfcout,tsoilout,wetsout, &
wetdout,wetcout,snowdout, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth,soiltyp)
IF (soildmp == 1) CALL soilcntl
(nx,ny, soiloutfl, &
tsfcout,tsoilout,wetsout, &
wetdout,wetcout,snowdout, &
x,y)
END IF
END IF
!
!-----------------------------------------------------------------------
!
! Test code, for diagnostic testing.
! Find x,y of diagnostic sounding location in ARPS grid.
!
!-----------------------------------------------------------------------
!
CALL lltoxy
(1,1,latdiag,londiag,xdiag,ydiag)
!
dmin=((xdiag-xscl(1))*(xdiag-xscl(1))+ &
(ydiag-yscl(1))*(ydiag-yscl(1)))
idiag=1
jdiag=1
!
DO j=2,ny-2
DO i=2,nx-2
dd=((xdiag-xscl(i))*(xdiag-xscl(i))+ &
(ydiag-yscl(j))*(ydiag-yscl(j)))
IF(dd < dmin) THEN
dmin=dd
idiag=i
jdiag=j
END IF
END DO
END DO
CALL xytoll
(1,1,xscl(idiag),yscl(jdiag), &
latd,lond)
WRITE(6,'(a,f10.4,f10.4,/a,i5,i5,a,f10.4,f10.4)') &
' Nearest ARPS pt to diagnostic lat,lon: ', &
latdiag,londiag, &
' Diagnostic i,j: ', &
idiag,jdiag,' lat,lon= ',latd,lond
WRITE(6,'(///a,/2x,a)') &
' ARPS extracted sounding at idiag,jdiag', &
'k pres hgt temp theta dewp u v dir spd'
!
!-----------------------------------------------------------------------
!
! Convert units of ARPS data and write as a sounding.
!
!-----------------------------------------------------------------------
!
DO k=nz-2,1,-1
ppasc=pbar(idiag,jdiag,k)+pprt(idiag,jdiag,k)
pmb=.01*(pbar(idiag,jdiag,k)+pprt(idiag,jdiag,k))
theta=ptbar(idiag,jdiag,k)+ptprt(idiag,jdiag,k)
tc=(theta*((ppasc/p0)**rddcp))-273.15
IF( qv(idiag,jdiag,k) > 0.) THEN
smix=qv(idiag,jdiag,k)/(1.-qv(idiag,jdiag,k))
e=(pmb*smix)/(0.62197 + smix)
bige=e/( 1.001 + ( (pmb - 100.) / 900.) * 0.0034)
alge = ALOG(bige/6.112)
tdc = (alge * 243.5) / (17.67 - alge)
ELSE
tdc = tc-30.
END IF
CALL uvrotdd
(1,1,londiag, &
u(idiag,jdiag,k), &
v(idiag,jdiag,k), &
dir,spd)
WRITE(6,'(i4,f6.0,f9.0,f7.1,f7.1,f7.1,f7.1,f7.1,f7.1,f7.1)') &
k,pmb, &
zs(idiag,jdiag,k), &
tc,theta,tdc, &
u(idiag,jdiag,k), &
v(idiag,jdiag,k), &
dir,spd
END DO
!
!-----------------------------------------------------------------------
!
! Find vertical velocity and make any u-v adjustments
! according to wndadj option.
!
!-----------------------------------------------------------------------
!
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
rhostr(i,j,k)=ABS(j3(i,j,k))*rhobar(i,j,k)
END DO
END DO
END DO
IF(wndadj == 0) THEN
IF ( extdopt == 0 ) THEN ! ARPS history data
iprtopt=0
CALL mkarpsvar
(nx_ext,ny_ext,nz_ext,nx,ny,nz,lvlprof, &
iorder,iprtopt,intropt,iscl,jscl,x_ext,y_ext, &
zp_ext,zp2_ext,xs2d,ys2d,zp,w_ext, &
zsnd,dumsnd,wbar,w, &
dxfld,dyfld,rdxfld,rdyfld, &
tem1_ext,tem2_ext,tem3_ext, &
tem4_ext)
DO ksmth=1,nsmooth
CALL smooth3d
(nx,ny,nz, 1,nx,1,ny,1,nz, &
smfct1,zp,w,tem1,w)
END DO
ELSE
w = 0.
ENDIF
ELSE
CALL adjuvw
( nx,ny,nz, u,v,w,wcont,ptprt,ptbar, &
zp,j1,j2,j3,aj3z,mapfct,rhostr,tem1, &
wndadj,obropt,obrzero,0, &
tem1,tem2,tem3,tem4,tem5,tem6,tem7,tem8)
END IF
!
!-----------------------------------------------------------------------
!
! Enforce vertical w boundary conditions
!
!-----------------------------------------------------------------------
!
IF (ext_lbc == 1 .or. ext_vbc == 1) &
CALL rhouvw
(nx,ny,nz,rhostr,tem1,tem2,tem3)
!
IF (ext_vbc == 1) CALL vbcw
(nx,ny,nz,w,wcont,tbc,bbc,u,v, &
rhostr,tem1,tem2,tem3,j1,j2,j3)
!
!
!-----------------------------------------------------------------------
!
! Assign zero-gradient horizontal boundary conditions
! to the horizontal & vertical winds.
!
!-----------------------------------------------------------------------
!
IF (ext_lbc == 1) THEN
CALL lbcw
(nx,ny,nz,1.0, w,wcont,tem1,tem2,tem3,tem4,3,3,3,3)
CALL bcu
(nx,ny,nz,1.0, u, tem1,tem2,tem3,tem4, 3,3,3,3,1,1)
CALL bcv
(nx,ny,nz,1.0, v, tem1,tem2,tem3,tem4, 3,3,3,3,1,1)
ENDIF
!
!-----------------------------------------------------------------------
!
! Zero out uninitialized fields
!
!-----------------------------------------------------------------------
!
tem1=0.
!
!-----------------------------------------------------------------------
!
! Print out the max/min of output variables.
!
!-----------------------------------------------------------------------
!
WRITE(6,'(/1x,a/)') &
'Min and max of External data interpolated to the ARPS grid:'
CALL a3dmax0
(x,1,nx,1,nx,1,1,1,1,1,1,1,1, amax,amin)
WRITE(6,'(/1x,2(a,e13.6))') &
'xmin = ', amin,', xmax =',amax
CALL a3dmax0
(y,1,ny,1,ny,1,1,1,1,1,1,1,1, amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'ymin = ', amin,', ymax =',amax
CALL a3dmax0
(z,1,nz,1,nz,1,1,1,1,1,1,1,1, amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'zmin = ', amin,', zmax =',amax
CALL a3dmax0
(zp,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'zpmin = ', amin,', zpmax =',amax
CALL a3dmax0
(rhobar,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'rhobarmin=', amin,', rhobarmax=',amax
CALL a3dmax0
(u,1,nx,1,nx,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'umin = ', amin,', umax =',amax
CALL a3dmax0
(v,1,nx,1,nx-1,1,ny,1,ny,1,nz,1,nz-1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'vmin = ', amin,', vmax =',amax
CALL a3dmax0
(w,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'wmin = ', amin,', wmax =',amax
CALL a3dmax0
(ptbar,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'ptbarmin= ', amin,', ptbarmax=',amax
CALL a3dmax0
(ptprt,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'ptprtmin= ', amin,', ptprtmax=',amax
CALL a3dmax0
(pbar,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'pbarmin= ', amin,', pbarmax =',amax
CALL a3dmax0
(pprt,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'pprtmin = ', amin,', pprtmax =',amax
CALL a3dmax0
(qv,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'qvmin = ', amin,', qvmax =',amax
IF(sfcout == 1) THEN
CALL a3dmax0
(tsfc,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'tsfcmin = ', amin,', tsfcmax =',amax
CALL a3dmax0
(tsoil,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'tsoilmin= ', amin,', tsoilmax=',amax
CALL a3dmax0
(wetsfc,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'wetsfcmin = ', amin,', wetsfcmax =',amax
CALL a3dmax0
(wetdp,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'wetdpmin= ', amin,', wetdpmax=',amax
CALL a3dmax0
(wetcanp,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') &
'wetcanpmin = ', amin,', wetcanpmax =',amax
END IF
!
!-----------------------------------------------------------------------
!
! Print the mean sounding that was used in setting the
! mean ARPS variables.
!
!-----------------------------------------------------------------------
!
WRITE(6,'(a/a)') &
' Mean sounding for ARPS base state variables', &
' k p(mb) z(m) pt(mb) T(C) qv(kg/kg) ', &
' RH % u(m/s) v(m/s)'
DO k=lvlprof,1,-50
pres = psnd(k)
temp = ptsnd(k)*((pres/p0)**rddcp)
rh=AMAX1(0.01,rhmax-(rhssnd(k)*rhssnd(k)))
qvsat=f_qvsat
( pres, temp )
qvval=rh*qvsat
WRITE(6,'(i4,f9.1,f9.1,f9.1,f9.1,f9.5,f9.1,f9.1,f9.1)') &
k,(0.01*psnd(k)),zsnd(k),ptsnd(k),(temp-273.15), &
qvval,(100.*rh),usnd(k),vsnd(k)
END DO
!
!-----------------------------------------------------------------------
!
! Data dump of the model grid and base state arrays:
!
! First find a unique name basdmpfn(1:lbasdmpf) for the grid and
! base state array dump file
!
!-----------------------------------------------------------------------
!
tem1=0.
ldirnam=LEN(dirname)
CALL strlnth
( dirname, ldirnam)
IF ( hdmpfmt == 5 ) THEN
WRITE (6,'(a/a)') &
'Program ext2arps does not support Savi3D format.', &
'Reset to binary format, hdmpfmt=1.'
hdmpfmt = 1
END IF
IF ( hdmpfmt == 9 ) GO TO 450
CALL gtbasfn
(runname(1:lfnkey),dirname,ldirnam,hdmpfmt, &
mgrid,nestgrd,basdmpfn,lbasdmpf)
PRINT*,'Writing base state history dump ',basdmpfn(1:lbasdmpf)
grdbas =1
mstout =1
rainout=0
prcout =0
trbout =0
IF (nstyp < 2) landout = 0
CALL dtadump
(nx,ny,nz,nstyp, &
hdmpfmt,iniotfu,basdmpfn(1:lbasdmpf),grdbas,filcmprs, &
u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh, &
tem1,tem1,tem1, &
ubar,vbar,wbar,ptbar,pbar,rhobar,qvbar, &
x,y,z,zp,hterain,j1,j2,j3, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
tem1,tem1,tem1, &
tem1,tem1,tem1, &
tem1,tem1,tem1,tem1, &
tem2,tem3,tem4)
450 CONTINUE
PRINT*,'curtim = ', curtim
CALL gtdmpfn
(runname(1:lfnkey),dirname,ldirnam,curtim,hdmpfmt, &
mgrid,nestgrd, hdmpfn, ldmpf)
WRITE(6,'(1x,a,a)') 'History data dump in file ',hdmpfn(1:ldmpf)
grdbas=0
CALL dtadump
(nx,ny,nz,nstyp, &
hdmpfmt,iniotfu,hdmpfn(1:ldmpf),grdbas,filcmprs, &
u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh, &
tem1,tem1,tem1, &
ubar,vbar,tem1,ptbar,pbar,rhobar,qvbar, &
x,y,z,zp,hterain,j1,j2,j3, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
tem1,tem1,tem1, &
tem1,tem1,tem1, &
tem1,tem1,tem1,tem1, &
tem2,tem3,tem4)
END DO
!
!-----------------------------------------------------------------------
!
! Friendly exit message.
!
!-----------------------------------------------------------------------
!
WRITE(6,'(a/a,i4,a)') &
' Normal succesful completion of EXT2ARPS.', &
' Processed',nextdfil,' file(s)'
STOP
!
!-----------------------------------------------------------------------
!
! Problem doing time conversions.
!
!-----------------------------------------------------------------------
!
920 CONTINUE
WRITE(6,'(a,/,a,i4,a,i4/,a,a19)') &
' Aborting, error in time format for external file', &
' File number:',ifile,' of',nextdfil, &
' External file time provided:',extdtime(ifile)
STOP
!
!-----------------------------------------------------------------------
!
! Error status returned from rdextfil
!
!-----------------------------------------------------------------------
!
999 CONTINUE
WRITE(6,'(a,i6)') &
' Aborting, error reading external file. istatus=', &
istatus
STOP
END PROGRAM ext2arps