!
!##################################################################
!##################################################################
!###### ######
!###### PROGRAM EXT2ARPS ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
PROGRAM ext2arps,403
!
!-----------------------------------------------------------------------
!
! 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.
!
! 1 June 2002 Eric Kemp
! Soil variable update.
!
! 6 June 2002 Eric Kemp
! Added new soil variable interpolator for non-ARPS external data.
!
! 7 June 2002 Eric Kemp
! Bug fix to 3d soil variable interpolation procedure.
!
! 15 June 2002 Eric Kemp
! More changes to soil variable interpolation procedure.
!
! 24 June 2002 Eric Kemp
! Bug fix with call to intrp_soil. Added more temporary arrays for
! use with this subroutine.
!
! 4 December 2002 Kevin W. Thomas
! If one external file is bad, the entire run shouldn't abort.
!
! 2003-08-12 (Richard Carpenter)
! Added extdopt=14,15 for GFS and Reanlysis data on grid 2 (2.5 deg lat/lon)
!
! 2003/10/23 Fanyou Kong
! Modified to utilize 2-m temperature and humidity and 10-m wind
! directly read from Eta GRIB (212) data
!
! 2004/01/15 Fanyou Kong
! Modified to utilize 2-m temperature and humidity and 10-m wind
! directly read from Eta AVN GRIB (#3) data
!
!-----------------------------------------------------------------------
!
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 :: nzsoil
INTEGER :: nx_ext, ny_ext, nz_ext ! dimensions of external data grid
INTEGER :: nzsoil_ext
INTEGER :: nstyps
!
!-----------------------------------------------------------------------
!
! New arrays for Eta GRIB # 218 ( 12km Eta model Output)
!
!-----------------------------------------------------------------------
REAL :: latsw,lonsw, latne,lonne, latse,lonse, latnw,lonnw
! ARPS lat/lon at corners
INTEGER :: number_tile(54) ! Total 54 tiles at most
INTEGER :: npr, npc
INTEGER, ALLOCATABLE :: domain_tile(:,:) ! Save tile order info.
REAL, PARAMETER :: lat_min(54) = (/ &
12.19, 14.07, 15.56, 16.64, 17.30, 17.33, 16.70, 15.64, 14.34, &
19.65, 21.68, 23.29, 24.45, 25.16, 25.19, 24.51, 23.37, 21.97, &
27.16, 29.32, 31.03, 32.26, 33.01, 33.04, 32.32, 31.12, 29.63, &
34.58, 36.85, 38.63, 39.92, 40.70, 40.74, 39.99, 38.73, 37.17, &
41.77, 44.12, 45.96, 47.29, 48.09, 48.13, 47.36, 46.06, 44.46, &
48.61, 51.01, 52.89, 54.23, 55.05, 55.08, 54.30, 52.99, 51.35 /)
REAL, PARAMETER :: lat_max(54) = (/ &
21.55, 23.16, 24.33, 25.04, 25.30, 25.30, 25.07, 24.39, 23.25, &
29.19, 30.90, 32.14, 32.89, 33.16, 33.16, 32.93, 32.20, 30.99, &
36.71, 38.51, 39.80, 40.59, 40.87, 40.87, 40.62, 39.87, 38.60, &
43.99, 45.84, 47.17, 47.99, 48.27, 48.27, 48.02, 47.24, 45.94, &
50.89, 52.77, 54.12, 54.95, 55.23, 55.23, 54.98, 54.19, 52.87, &
56.95, 58.84, 60.20, 61.02, 61.31, 61.31, 61.06, 60.27, 58.94 /)
REAL, PARAMETER :: lon_min(54) = (/ &
-135.76,-128.00,-120.01,-111.85,-103.56, -95.20, -87.33, -79.52, -71.82, &
-138.38,-130.17,-121.69,-112.99,-104.14, -95.21, -86.84, -78.53, -70.35, &
-141.35,-132.65,-123.61,-114.31,-104.82, -95.23, -86.28, -77.41, -68.70, &
-144.74,-135.48,-125.82,-115.82,-105.60, -95.25, -85.63, -76.13, -66.80, &
-148.63,-138.76,-128.39,-117.60,-106.51, -95.27, -84.89, -74.64, -64.62, &
-152.88,-142.37,-131.23,-119.57,-107.53, -95.29, -84.01, -72.90, -62.08 /)
REAL, PARAMETER :: lon_max(54) = (/ &
-126.21,-118.66,-110.96,-103.16, -95.30, -86.96, -78.67, -70.49, -63.29, &
-128.14,-120.15,-111.98,-103.68, -95.32, -86.41, -77.56, -68.85, -61.20, &
-130.33,-121.84,-113.14,-104.28, -95.34, -85.78, -76.28, -66.97, -58.81, &
-132.81,-123.77,-114.46,-104.97, -95.37, -85.05, -74.81, -64.80, -56.08, &
-135.66,-125.99,-115.99,-105.76, -95.40, -84.19, -73.09, -62.28, -52.91, &
-138.96,-128.58,-117.78,-106.69, -95.43, -83.23, -71.17, -59.48, -49.42 /)
!-----------------------------------------------------------------------
!
! Space for mean sounding
!
!-----------------------------------------------------------------------
!
INTEGER, PARAMETER :: lvlprof = 601
REAL, PARAMETER :: 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)
! zpsoil Vertical coordinate of soil model
! 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
! j3soil Coordinate transformation Jacobian d(zp)/dz for soil model
! j3soilinv inverse of j3soil
!
! tsoil Soil temperature (K)
! qsoil Soil moisture (m**3/m**3)
!
! 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 :: zpsoil(:,:,:) ! The physical height coordinate defined at
! w-point in the soil.
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 :: j3soil(:,:,:) ! Coordinate transformation Jacobian d(zp)/dz.
REAL, allocatable :: j3soilinv(:,:,:) ! 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)
REAL, allocatable :: htrn_tmp(:,:)! 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 :: tsoil(:,:,:,:) ! Soil temperature (K)
REAL, allocatable :: qsoil(:,:,:,:) ! Soil moisture (m**3/m**3)
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.
INTEGER, ALLOCATABLE :: ksoil3d(:,:,:) ! EMK 6 June 2002
REAL, allocatable :: xs2d(:,:)
REAL, allocatable :: ys2d(:,:)
REAL, allocatable :: xu2d(:,:)
REAL, allocatable :: yu2d(:,:)
REAL, allocatable :: xv2d(:,:)
REAL, allocatable :: yv2d(:,:)
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)
REAL, ALLOCATABLE :: temsoil1(:,:,:)
REAL, ALLOCATABLE :: temsoil2(:,:,:)
REAL, ALLOCATABLE :: temsoil3(:,:,:)
REAL, ALLOCATABLE :: temsoil4(:,:,:)
!
!-----------------------------------------------------------------------
!
! NAMELIST parameter (In arps.input)
!
!-----------------------------------------------------------------------
!
INCLUDE 'ext2arps.inc'
INCLUDE 'mp.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 :: zpsoil_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 :: tsoil_ext (:,:,:,:) ! Soil temperature (K)
REAL, allocatable :: qsoil_ext (:,:,:,:) ! Soil moisture (m3/m3)
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 :: pbar_ext(:,:,:) ! Base state pressure (Pascal)
REAL, allocatable :: ptbar_ext(:,:,:) ! Base state potential temperature (K)
REAL, allocatable :: qvbar_ext(:,:,:) ! Base state water vapor specific
! humidity (kg/kg)
REAL, allocatable :: ubar_ext(:,:,:) ! Base state u-velocity (m/s)
REAL, allocatable :: vbar_ext(:,:,:) ! Base state v-velocity (m/s)
REAL, allocatable :: wbar_ext(:,:,:) ! Base state w-velocity (m/s)
REAL, allocatable :: trn_ext (:,:) ! External terrain (m)
REAL, allocatable :: psfc_ext (:,:) ! Surface pressure (Pa)
REAL, allocatable :: t_2m_ext (:,:) ! 2-m temperature (K)
REAL, allocatable :: qv_2m_ext(:,:) ! 2-m specific humidity (kg/kg)
REAL, allocatable :: u_10m_ext(:,:) ! 10-m u (m/s)
REAL, allocatable :: v_10m_ext(:,:) ! 10-m v (m/s)
REAL, allocatable :: t_2m (:,:) ! in arps domain
REAL, allocatable :: qv_2m(:,:) ! in arps domain
REAL, allocatable :: u_10m(:,:) ! in arps domain
REAL, allocatable :: v_10m(:,:) ! in arps domain
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 :: rdzsoilfld(:,:,:) ! EMK 17 June 2002
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(:,:,:)
REAL, ALLOCATABLE :: temsoil1_ext(:,:,:)
REAL, ALLOCATABLE :: temsoil2_ext(:,:,:)
REAL, ALLOCATABLE :: temsoil3_ext(:,:,:)
REAL, ALLOCATABLE :: temsoil4_ext(:,:,:)
!
!-----------------------------------------------------------------------
!
! include files
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc'
INCLUDE 'phycst.inc'
INCLUDE 'bndry.inc'
INCLUDE 'adjust.inc'
!
!-----------------------------------------------------------------------
!
! Non-dimensional smoothing coefficient
!
!-----------------------------------------------------------------------
!
REAL, PARAMETER :: smfct1 = 0.5, smfct2 = -0.5
REAL, PARAMETER :: rhmax = 1.0
!
!-----------------------------------------------------------------------
!
! Latitude and longitude for some diagnostic printing,
! e.g. to compare to an observed sounding
!
!-----------------------------------------------------------------------
!
REAL, 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 :: first_time
INTEGER :: iextmn,iextmx,jextmn,jextmx
INTEGER :: idiag,jdiag
INTEGER :: hdmpgrdfmt
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
CHARACTER (LEN=80) :: soiloutfl,temchar,ternfn
CHARACTER (LEN=80) :: timsnd
INTEGER :: lfn, tmstrln, lternfn
INTEGER :: wetcout,snowdout
INTEGER :: tsoilout,qsoilout,zpsoilout
INTEGER :: isnow,jsnow,ii,jj
REAL :: xumin,xumax,yvmin,yvmax
REAL :: xsmin,xsmax,ysmin,ysmax
INTEGER :: strlen, ireturn
CHARACTER (LEN=3) :: FMT
CHARACTER (LEN=100) :: tmp_ch
INTEGER :: is,nstyp_ext
DOUBLE PRECISION :: ntmergeinv, mfac
INTEGER :: idist
LOGICAL :: lon_0_360 = .FALSE. ! global lat/lon grids in which lon runs 0:360 not -180:180
INTEGER :: nofixdim = 0
LOGICAL :: median_warn = .FALSE.
!-----------------------------------------------------------------------
!
! 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 = 1
nzsoil_ext = 2
DO k=1,lvlprof
dumsnd(k) = 0.0
END DO
!
!-----------------------------------------------------------------------
!
! Call initpara to read in ARPS parameters of namelists
!
!-----------------------------------------------------------------------
!
CALL initpara
(nx,ny,nz,nzsoil,nstyps)
IF (myproc == 0) &
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.
IF (myproc == 0) THEN
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)
ENDIF
CALL mpupdatei
(initsec,1)
!
!-----------------------------------------------------------------------
!
! 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
extntmrg = 1
extsfcopt = 0
grdbasopt = 0
IF (myproc == 0) THEN
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,','
WRITE (6, '(3x,a,i4,a)') 'extntmrg = ', extntmrg, ','
WRITE (6, '(3x,a,i4,a)') 'extsfcopt = ', extsfcopt, ','
WRITE (6, '(3x,a,i4,a)') 'extsfcopt = ', extsfcopt, ','
WRITE (6, '(3x,a,i4,a)') 'grdbasopt = ', grdbasopt, ','
WRITE (6, '(1x,a)') '&END'
ENDIF
CALL mpupdatei
(extdopt,1)
CALL mpupdatei
(extdfmt,1)
CALL mpupdatei
(iorder,1)
CALL mpupdatei
(intropt,1)
CALL mpupdatei
(nsmooth,1)
CALL mpupdatei
(hydradj,1)
CALL mpupdatei
(wndadj,1)
CALL mpupdatei
(obropt,1)
CALL mpupdater
(obrzero,1)
CALL mpupdatei
(ext_lbc,1)
CALL mpupdatei
(ext_vbc,1)
CALL mpupdatei
(exttrnopt,1)
CALL mpupdatei
(extntmrg,1)
CALL mpupdatei
(extsfcopt,1)
CALL mpupdatei
(grdbasopt,1)
CALL mpupdatei
(nextdfil,1)
CALL mpupdatec
(extdtime,nextdfil*29)
nofixdim = extdopt / 100
extdopt = MOD(extdopt,100)
IF (nofixdim == 1) THEN ! get the first file name
!
!-----------------------------------------------------------------------
!
! Time conversions.
! Formats: extdtime='1994-05-06.18:00:00+000:00:00'
! julfname='941261800'
!
!-----------------------------------------------------------------------
!
READ(extdtime(1),'(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)') ifhr,ifmin,ifsec
mfhr=MOD(ifhr,24)
jldy = jldy + ifhr/24
WRITE(julfname,'(i2.2,i3.3,i2.2,i2.2)') myr,jldy,ihr,mfhr
END IF
!-----------------------------------------------------------------------
!
! ALLOCATE and initalize arrays based on dimension parameters
! read in from the input file
!
!-----------------------------------------------------------------------
ALLOCATE(x(nx),stat=istatus)
ALLOCATE(y(ny),stat=istatus)
ALLOCATE(z(nz),stat=istatus)
ALLOCATE(xscl(nx),stat=istatus)
ALLOCATE(yscl(ny),stat=istatus)
ALLOCATE(zp(nx,ny,nz),stat=istatus)
ALLOCATE(zpsoil(nx,ny,nzsoil),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(j3soil(nx,ny,nzsoil),stat=istatus)
ALLOCATE(j3soilinv(nx,ny,nzsoil),stat=istatus)
ALLOCATE(aj3z(nx,ny,nz),stat=istatus)
ALLOCATE(hterain(nx,ny),stat=istatus)
ALLOCATE(htrn_tmp(nx,ny),stat=istatus)
ALLOCATE(mapfct(nx,ny,8),stat=istatus)
ALLOCATE(u(nx,ny,nz),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:U")
ALLOCATE(v(nx,ny,nz),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:V")
ALLOCATE(w(nx,ny,nz),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:W")
ALLOCATE(pprt(nx,ny,nz),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:PPRT")
ALLOCATE(ptprt(nx,ny,nz),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:PTPRT")
ALLOCATE(qv(nx,ny,nz),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:QV")
ALLOCATE(qc(nx,ny,nz),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:QC")
ALLOCATE(qr(nx,ny,nz),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:QR")
ALLOCATE(qi(nx,ny,nz),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:QI")
ALLOCATE(qs(nx,ny,nz),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:QS")
ALLOCATE(qh(nx,ny,nz),stat=istatus)
ALLOCATE(pbar(nx,ny,nz),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:PBAR")
ALLOCATE(ptbar(nx,ny,nz),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:PTBAR")
ALLOCATE(qvbar(nx,ny,nz),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:QVBAR")
ALLOCATE(ubar(nx,ny,nz),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:UBAR")
ALLOCATE(vbar(nx,ny,nz),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:VBAR")
ALLOCATE(wbar(nx,ny,nz),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:WBAR")
ALLOCATE(rhobar(nx,ny,nz),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:RHOBAR")
ALLOCATE(rhostr(nx,ny,nz),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:RHOSTR")
ALLOCATE(wcont(nx,ny,nz),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:WCONT")
ALLOCATE(csndsq(nx,ny,nz),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:CSNDSQ")
ALLOCATE(wetcanp(nx,ny,0:nstyps),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:WETCANP")
ALLOCATE(snowdpth(nx,ny),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:SNOWDPTH")
ALLOCATE(tsoil(nx,ny,nzsoil,0:nstyps),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:TSOIL")
ALLOCATE(qsoil(nx,ny,nzsoil,0:nstyps),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:QSOIL")
ALLOCATE(soiltyp (nx,ny,nstyps),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:soiltyp")
ALLOCATE(stypfrct(nx,ny,nstyps),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:sypfrct")
ALLOCATE(vegtyp (nx,ny),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:vegtyp")
ALLOCATE(lai (nx,ny),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:lai")
ALLOCATE(roufns (nx,ny),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:roufns")
ALLOCATE(veg (nx,ny),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:veg")
ALLOCATE(t_2m (nx,ny),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:t_2m")
ALLOCATE(qv_2m(nx,ny),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:qv_2m")
ALLOCATE(u_10m(nx,ny),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:u_10m")
ALLOCATE(v_10m(nx,ny),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:v_10m")
ALLOCATE(tem1(nx,ny,nz),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:tem1")
ALLOCATE(tem2(nx,ny,nz),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:tem2")
ALLOCATE(tem3(nx,ny,nz),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:tem3")
ALLOCATE(tem4(nx,ny,nz),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:tem4")
ALLOCATE(tem5(nx,ny,nz),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:tem5")
ALLOCATE(tem6(nx,ny,nz),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:tem6")
ALLOCATE(tem7(nx,ny,nz),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:tem7")
ALLOCATE(tem8(nx,ny,nz),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:tem8")
ALLOCATE(ksoil3d(nx,ny,nzsoil),STAT=istatus)
CALL check_alloc_status
(istatus, "ext2arps:ksoil3d")
ksoil3d(:,:,:) = 0
ALLOCATE(xs2d(nx,ny),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:xs2d")
ALLOCATE(ys2d(nx,ny),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:ys2d")
ALLOCATE(xu2d(nx,ny),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:xu2d")
ALLOCATE(yu2d(nx,ny),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:yu2d")
ALLOCATE(xv2d(nx,ny),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:xv2d")
ALLOCATE(yv2d(nx,ny),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:yv2d")
ALLOCATE(xw(nx,ny),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:xw")
ALLOCATE(yw(nx,ny),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:yw")
ALLOCATE(iscl(nx,ny),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:iscl")
ALLOCATE(jscl(nx,ny),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:jscl")
ALLOCATE(iu(nx,ny),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:iu")
ALLOCATE(ju(nx,ny),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:ju")
ALLOCATE(iv(nx,ny),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:iv")
ALLOCATE(jv(nx,ny),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:jv")
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
htrn_tmp=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
tsoil=0.0
qsoil=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
t_2m =0.0
qv_2m=0.0
u_10m=0.0
v_10m=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
!
!-----------------------------------------------------------------------
!
! 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,nzsoil,x,y,z,zp,zpsoil, &
hterain,mapfct,j1,j2,j3,j3soil,j3soilinv, &
tem2(1,1,:),tem3(1,1,:),tem1)
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
!-----------------------------------------------------------------------
!
! Get lat/lon at ARPS domain corns. They are used for the following data sources
!
! extdopt = 16 (ETA grid #218) - To determine the tiltes to be read
! extdopt = 8, 13, 14, 15 (Global data source)
! - To set median_warn if Greenwich Meridian goes through the
! ARPS domain so that the data arrays should be rearranged.
!
!-----------------------------------------------------------------------
CALL xytoll
(1,1, x(1), y(1),latsw,lonsw)
CALL xytoll
(1,1,x(nx), y(1),latse,lonse)
CALL xytoll
(1,1,x(nx),y(ny),latne,lonne)
CALL xytoll
(1,1, x(1),y(ny),latnw,lonnw)
CALL mpmax0
(latnw,latsw) ! West side latitudes
CALL mpmax0
(latne,latse) ! East side latitudes
CALL mpmax0
(lonse,lonsw) ! South side lons
CALL mpmax0
(lonne,lonnw) ! North side lons
WRITE(6,'(/a,4(a,F7.2),a/,13x,4(a,F7.2),a/)') ' ARPS domain ', &
'NW: (',latnw,',',lonnw, ') NE: (',latne,',',lonne,')', &
'SW: (',latsw,',',lonsw, ') SE: (',latse,',',lonse,').'
IF ( (lonsw < 0 .AND. lonse > 0) .OR. (lonnw < 0 .AND. lonne > 0) ) &
median_warn = .TRUE. ! Greenwich Meridian goes through
!
!-----------------------------------------------------------------------
!
! Set up the height levels on which to define the base-state.
!
!-----------------------------------------------------------------------
!
deltaz = depthp/(lvlprof-1)
IF (myproc == 0) 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
!-----------------------------------------------------------------------
!
! Set external grid size
!
!-----------------------------------------------------------------------
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
CALL arpsstop
('Invalid input history data format given by extdfmt.',1)
END SELECT
! This seems to be dead code.
! tmp_ch=trim(dir_extd)//trim(extdname)//'.'//FMT//'grdbas'
! PRINT*,'tmp_ch =', trim(tmp_ch)
IF (myproc == 0) THEN
CALL get_dims_from_data
(extdfmt, &
trim(dir_extd)//trim(extdname)//'.'//FMT//'grdbas', &
nx_ext,ny_ext,nz_ext,nzsoil_ext,nstyp_ext, ireturn)
nstyp_ext = min(nstyp_ext,nstyps)
IF( ireturn /= 0 ) THEN
call arpsstop
( &
'Problem occurred when trying to get dimensions from data.', 1)
END IF
END IF
CALL mpupdatei
(nx_ext,1)
CALL mpupdatei
(ny_ext,1)
CALL mpupdatei
(nz_ext,1)
CALL mpupdatei
(nzsoil_ext,1)
CALL mpupdatei
(nstyp_ext,1)
CASE ( 1 ) ! RUC (Hybrid-B, GRIB #87) from NMC is 81x62x25
nx_ext=81
ny_ext=62
nz_ext=25
nzsoil_ext = 2 ! FIXME: For now, just use two levels.
CASE ( 2 ) ! ETA (GRIB #212, 40km) from NMC is 185x129x39
nx_ext = 185
ny_ext = 129
nz_ext = 39
nzsoil_ext = 5 ! EMK 15 June 2002
nstyp_ext = 1 ! EMK 20 June 2002
CASE ( 3 ) ! OLAPS for 95 is 91x73x41
nx_ext=91
ny_ext=73
nz_ext=41
nzsoil_ext = 2 ! FIXME: For now, just use two levels.
CASE ( 4 ) ! RUC in GEMPAK format from Rossby (e.g., those of 1995)
nx_ext=81
ny_ext=62
nz_ext=41
nzsoil_ext = 2 ! FIXME: For now, just use two levels.
CASE ( 5 ) ! GEMPAK ETA data
CALL arpsstop
( &
'GEMPAK ETA: Need to find out the grid size and set in ext2arps.f90.',1)
! 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.f90.'
call arpsstop
("Processing COAMPS files",1)
! 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
nzsoil_ext = 2 ! FIXME: For now, just use two levels.
CASE ( 8 ) ! Global Reanalysis on T62 Gaussian grid
nx_ext = 192
ny_ext = 94
nz_ext = 28
nzsoil_ext = 2 ! FIXME: For now, just use two levels.
IF(median_warn) THEN
lon_0_360 = .FALSE.
WRITE(6,'(4(a,/))') &
'The ARPS domain goes through Greenwich Meridian. The data should', &
'be rearranged to handle this situation just as it has been done', &
'for GFS #3 grid. You can do it yourself or submit your request to',&
'arpssupport@lists.ou.edu.'
CALL arpsstop
('Domain accross Greenwich Meridian.',1)
ELSE
lon_0_360 = .TRUE.
END IF
CASE ( 9 ) ! RUC-2 (GEMPAK) from Doplight is 151x113x41
nx_ext=151
ny_ext=113
nz_ext=41
nzsoil_ext = 2 ! FIXME: For now, just use two levels.
CASE ( 10 ) ! ETA (GEMPAK #104, 80km) from NMC is 147x110x39
nx_ext=147
ny_ext=110
nz_ext=39
nzsoil_ext = 2 ! FIXME: For now, just use two levels.
CASE ( 11 ) ! Native RUC2 GRIB file (Grid #236) from OSO
nx_ext=151
ny_ext=113
nz_ext=50
nzsoil_ext = 2 ! FIXME: For now, just use two levels.
CASE ( 12 ) ! Isobaric RUC2 GRIB file (Grid #236) from OSO
nx_ext=151
ny_ext=113
nz_ext=37
nzsoil_ext = 2 ! FIXME: For now, just use two levels.
CASE ( 13 ) ! AVN (GRIB #3, 1x1 degree) from NCEP is 360x181x26
IF (nofixdim == 1) THEN ! get dimension from data file
CALL rdgrbdims
(dir_extd,extdname,extdopt,extdinit,extdfcst, &
nx_ext,ny_ext,istatus)
IF (istatus < 0) THEN
WRITE(6,'(2a,I2,a)') 'Error return from subroutine rdgrbdims,',&
' ireturn = ',istatus,'.'
CALL arpsstop
('ERROR inside rdgrbdims',1)
END IF
WRITE(6,'(a,2(a,I5),a/)') 'Subdomain of GFS global 1x1 data ', &
'nx_ext = ',nx_ext,' ny_ext = ',ny_ext,'.'
ELSE
nx_ext = 360
ny_ext = 181
END IF
nz_ext = 26
IF (soilmodel_option == 1) THEN
nzsoil_ext = 2 ! ARPS: two-layer Force-restore model
ELSE
nzsoil_ext = 3 ! ARPS: multi-layer OUSoil model
END IF
nstyp_ext = 1
IF(.NOT. median_warn .OR. nofixdim == 1) lon_0_360 = .TRUE.
CASE ( 14 ) ! AVN (GRIB #2, 2.5x2.5 degree) from NCEP is 144x73x26
nx_ext = 144
ny_ext = 73
nz_ext = 26
IF(.NOT. median_warn) lon_0_360 = .TRUE.
CASE ( 15 ) ! NCAR/NCEP Reanalysis-2 (GRIB #2, 2.5x2.5 degree) 144x73x16
nx_ext = 144
ny_ext = 73
nz_ext = 17
IF(.NOT. median_warn) lon_0_360 = .TRUE.
CASE ( 16 ) ! ETA (GRIB #218, 12km)
IF (latsw < lat_min(1) .OR. latne > lat_max(50) .OR. &
lonsw < lon_min(46) .OR. lonne > lon_max(54) ) THEN
CALL arpsstop
('ARPS domain is larger than ETA grid #218.',1)
END IF
!
! Locate ARPS south west corner
!
k = 0 ! tile no.
SW_loop: DO j = 1,6 ! 6 rows of tile
DO i = 1,9 ! 9 columns of tile
k = k+1
IF (latsw > lat_min(k) .AND. latsw < lat_max(k) .AND. &
lonsw > lon_min(k) .AND. lonsw < lon_max(k) ) EXIT SW_loop
END DO
END DO SW_loop
idiag = k
!
! Locate ARPS north east corner
!
k = 0 ! tile no.
NE_loop: DO j = 1,6 ! 6 rows of tile
DO i = 1,9 ! 9 columns of tile
k = k+1
IF (latne > lat_min(k) .AND. latne < lat_max(k) .AND. &
lonne > lon_min(k) .AND. lonne < lon_max(k) ) EXIT NE_loop
END DO
END DO NE_loop
jdiag = k
IF (idiag > jdiag) THEN
IF (myproc == 0) &
WRITE(6,*) 'Found ARPS south west corner in tile ',idiag, &
' But ARPS north east corner in tile ',jdiag
CALL arpsstop
("ETA218 problem",1)
END IF
jextmn = (idiag-1)/9
jextmx = (jdiag-1)/9
npc = jextmx - jextmn + 1 ! row number
iextmn = MOD(idiag-1,9)
iextmx = MOD(jdiag-1,9)
IF(iextmx < 8) iextmx=iextmx+1
npr = iextmx - iextmn + 1 ! column number
ALLOCATE(domain_tile(npr,npc), STAT = istatus)
CALL check_alloc_status
(istatus, "ext2arps:domain_tile")
DO j = 1,npc
DO i = 1,npr
domain_tile(i,j) = (j+jextmn-1)*9 + (iextmn+i-1) + 1
END DO
END DO
IF (myproc == 0) WRITE(6,*) 'Grid #218 will read in tiles: ',domain_tile
IF ( MOD(domain_tile(npr,1),9) == 0) THEN
nx_ext = (npr-1)*69 + 62
ELSE
nx_ext = npr*69
END IF
IF (domain_tile(1,npc) > 45) THEN
ny_ext = (npc-1)*72 + 68
ELSE
ny_ext = npc*72
END IF
nz_ext = 39
nzsoil_ext = 5
nstyp_ext = 1
CASE ( 17 ) !TINA, NARR regional reanalysis (GRIB #221, 32km) is 349x277x29
nx_ext = 349
ny_ext = 277
nz_ext = 29
nzsoil_ext = 5
nstyp_ext = 1
CASE ( 18 ) ! Native 20-km RUC2 GRIB file (Grid #252)
nx_ext=301
ny_ext=225
nz_ext=50
nzsoil_ext = 2 ! FIXME: For now, just use two levels.
CASE ( 19 ) ! Isobaric 20-km RUC2 GRIB file (Grid #252) from OSO
nx_ext=301
ny_ext=225
nz_ext=37
nzsoil_ext = 2 ! FIXME: For now, just use two levels.
CASE ( 50 ) ! Binary format lat/lon data
nx_ext = 26
ny_ext = 16
nz_ext = 26
nzsoil_ext = 2 ! FIXME: For now, just use two levels.
CASE ( 51 ) ! GFS (1x1 degree grid, South America)
nx_ext = 118
ny_ext = 91
nz_ext = 26 ! NOTE: RH and CLWMR fields are 21 levels (up to 100 mb)
IF (soilmodel_option == 1) THEN
nzsoil_ext = 2 ! ARPS: two-layer Force-restore model
ELSE
nzsoil_ext = 3 ! ARPS: multi-layer OUSoil model
END IF
nstyp_ext = 1
CASE DEFAULT
CALL arpsstop
( &
'extdopt option was invalid. Please specify a new option.',1)
END SELECT
IF (soilmodel_option == 1) nzsoil_ext = nzsoil
! Using old ARPS Force-Restore Soil Model
IF (myproc == 0) WRITE(6,'(1x,4(a,I5),/)') &
'nx_ext = ',nx_ext,', ny_ext = ',ny_ext,', nz_ext = ',nz_ext, &
', nzsoil_ext = ',nzsoil_ext
!
!-----------------------------------------------------------------------
!
! 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)
CALL check_alloc_status
(istatus, "ext2arps:p_ext")
ALLOCATE(hgt_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:hgt_ext")
ALLOCATE(zp2_ext(nx,ny,nz_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:zp2_ext")
ALLOCATE(zp_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:zp_ext")
ALLOCATE(zpsoil_ext(nx_ext,ny_ext,nzsoil_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:zpsoil_ext")
ALLOCATE(t_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:t_ext")
ALLOCATE(u_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:u_ext")
ALLOCATE(v_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:v_ext")
ALLOCATE(w_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:w_ext")
ALLOCATE(qv_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:qv_ext")
ALLOCATE(qc_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:qc_ext")
ALLOCATE(qr_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:qr_ext")
ALLOCATE(qi_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:qi_ext")
ALLOCATE(qs_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:qs_ext")
ALLOCATE(qh_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:qh_ext")
ALLOCATE(tsoil_ext (nx_ext,ny_ext,nzsoil_ext,0:nstyps),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:tsoil_ext")
ALLOCATE(qsoil_ext (nx_ext,ny_ext,nzsoil_ext,0:nstyps),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:qsoil_ext")
ALLOCATE(wetcanp_ext(nx_ext,ny_ext,0:nstyps),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:wetcanp_ext")
ALLOCATE(snowdpth_ext(nx_ext,ny_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:snowdpth_ext")
ALLOCATE(soiltyp_ext (nx_ext,ny_ext,nstyps),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:soiltyp_ext")
soiltyp_ext = 0
ALLOCATE(stypfrct_ext(nx_ext,ny_ext,nstyps),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:stypfrct_ext")
ALLOCATE(vegtyp_ext (nx_ext,ny_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:vegtyp_ext")
ALLOCATE(lai_ext (nx_ext,ny_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:lai_ext")
ALLOCATE(roufns_ext (nx_ext,ny_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:roufns_ext")
ALLOCATE(veg_ext (nx_ext,ny_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:veg_ext")
ALLOCATE(trn_ext (nx_ext,ny_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:UBAR")
ALLOCATE(psfc_ext (nx_ext,ny_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:UBAR")
ALLOCATE(t_2m_ext (nx_ext,ny_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:t_2m_ext")
ALLOCATE(qv_2m_ext(nx_ext,ny_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:qv_2m_ext")
ALLOCATE(u_10m_ext(nx_ext,ny_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:u_10m_ext")
ALLOCATE(v_10m_ext(nx_ext,ny_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:v_10m_ext")
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(rdzsoilfld(nx_ext,ny_ext,nzsoil_ext),STAT=istatus)
CALL check_alloc_status
(istatus, "ext2arps:rdzsoilfld")
ALLOCATE(tem1_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:tem1_ext")
ALLOCATE(tem2_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:tem2_ext")
ALLOCATE(tem3_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:tem3_ext")
ALLOCATE(tem4_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:tem4_ext")
ALLOCATE(tem5_ext(nx_ext,ny_ext,nz_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:tem5_ext")
ALLOCATE(xa_ext(nx_ext,ny_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:xa_ext")
ALLOCATE(ya_ext(nx_ext,ny_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:ya_ext")
ALLOCATE(avgzs_ext(nx,ny,nz_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:avgzs_ext")
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
tsoil_ext =-999.0
qsoil_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
qv_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
IF (soilmodel_option == 1) THEN
ALLOCATE(temsoil1(nx,ny,0:nstyps), stat = istatus)
CALL check_alloc_status
(istatus, "ext2arps:temsoil1")
ALLOCATE(temsoil2(nx,ny,0:nstyps), stat = istatus)
CALL check_alloc_status
(istatus, "ext2arps:temsoil2")
ALLOCATE(temsoil3(nx,ny,0:nstyps), stat = istatus)
CALL check_alloc_status
(istatus, "ext2arps:temsoil3")
ALLOCATE(temsoil4(nx,ny,0:nstyps), stat = istatus)
CALL check_alloc_status
(istatus, "ext2arps:temsoil4")
temsoil1(:,:,:) = 0.
temsoil2(:,:,:) = 0.
temsoil3(:,:,:) = 0.
temsoil4(:,:,:) = 0.
ALLOCATE(temsoil1_ext(nx_ext,ny_ext,0:nstyp_ext), stat = istatus)
CALL check_alloc_status
(istatus, "ext2arps:temsoil1_ext")
ALLOCATE(temsoil2_ext(nx_ext,ny_ext,0:nstyp_ext), stat = istatus)
CALL check_alloc_status
(istatus, "ext2arps:temsoil2_ext")
ALLOCATE(temsoil3_ext(nx_ext,ny_ext,0:nstyp_ext), stat = istatus)
CALL check_alloc_status
(istatus, "ext2arps:temsoil3_ext")
ALLOCATE(temsoil4_ext(nx_ext,ny_ext,0:nstyp_ext), stat = istatus)
CALL check_alloc_status
(istatus, "ext2arps:temsoil4_ext")
temsoil1_ext(:,:,:) = 0.
temsoil2_ext(:,:,:) = 0.
temsoil3_ext(:,:,:) = 0.
temsoil4_ext(:,:,:) = 0.
END IF
!
!-----------------------------------------------------------------------
!
! Loop through the data times provided via NAMELIST.
!
!-----------------------------------------------------------------------
!
iniotfu = 21 ! FORTRAN unit number used for data output
first_time = 1
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)
IF (myproc == 0) WRITE(6,'(a,a9,a,/15x,a,a19,a/a,a/a,i16,a,/,i26,a)') &
' Calling getxxxx, 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
ALLOCATE(pbar_ext (nx_ext,ny_ext,nz_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:pbar_ext")
ALLOCATE(ptbar_ext (nx_ext,ny_ext,nz_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:ptbar_ext")
ALLOCATE(qvbar_ext (nx_ext,ny_ext,nz_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:qvbar_ext")
ALLOCATE(ubar_ext (nx_ext,ny_ext,nz_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:ubar_ext")
ALLOCATE(vbar_ext (nx_ext,ny_ext,nz_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:vbar_ext")
ALLOCATE(wbar_ext (nx_ext,ny_ext,nz_ext),stat=istatus)
CALL check_alloc_status
(istatus, "ext2arps:wbar_ext")
extsfcopt = 0 ! near surface fields unavailable
CALL getarps
(nx_ext,ny_ext,nz_ext,nzsoil_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,zpsoil_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, &
tsoil_ext,qsoil_ext,wetcanp_ext, &
snowdpth_ext,ubar_ext,vbar_ext,wbar_ext, &
ptbar_ext,pbar_ext,qvbar_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)
!
!-----------------------------------------------------------------------
!
! Get NMC RUC GRIB #87
!
!-----------------------------------------------------------------------
!
case ( 1 )
extsfcopt = 0 ! Do not support near surface field interpolation
! 05/23/2002
!
! ZUWEN getnmcruc only give out the average of tsoil and qsoil
! something should be done to interpolate tsoil and qsoil from
! the RUC model to the arps
!
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, &
tsoil_ext(1,1,1,0),tsoil_ext(1,1,2,0), &
qsoil_ext(1,1,1,0),qsoil_ext(1,1,2,0),wetcanp_ext, &
trn_ext,psfc_ext, &
istatus)
!
!-----------------------------------------------------------------------
!
! Get NMC ETA GRIB #212
!
!-----------------------------------------------------------------------
!
case ( 2 )
! NOTE: zpsoil_ext is defined as soil depth!!!
CALL getnmceta212
(nx_ext,ny_ext,nz_ext,nzsoil_ext,nstyp_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,zpsoil_ext, &
p_ext,hgt_ext,t_ext,qv_ext,u_ext,v_ext, &
qc_ext,qr_ext,qi_ext,qs_ext,qh_ext, &
tsoil_ext,qsoil_ext,wetcanp_ext, &
snowdpth_ext,trn_ext,psfc_ext,soiltyp_ext, &
t_2m_ext,qv_2m_ext,u_10m_ext,v_10m_ext, &
istatus)
nstyp_ext = 1
stypfrct_ext(:,:,1) = 1.
stypfrct_ext(:,:,2:nstyps) = 0.
zpsoil_ext(:,:,:) = -1.*zpsoil_ext(:,:,:) ! EMK 15 June 2002
DO k = 1,nzsoil_ext
CALL a3dmax0
(tsoil_ext(1,1,k,0),1,nx_ext,1,nx_ext,1,ny_ext,1,ny_ext,&
1,1,1,1,amax,amin)
IF (myproc == 0) WRITE(6,'(1x,2(a,e13.6))') &
'tsoil_ext_min= ', amin,', tsoil_ext_max=',amax
END DO
!
!-----------------------------------------------------------------------
!
! Get LAPS data. Need LAPS library (see makearps for ext2arps.laps)
!
!-----------------------------------------------------------------------
!
case ( 3 )
extsfcopt = 0 ! Do not support near surface field interpolation
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)
!
!-----------------------------------------------------------------------
!
! Get RUC/MAPS data in GEMPAK format with a special setup for GEMPAK
! path and library (see makearps for ext2arps.gemruc).
!
!-----------------------------------------------------------------------
!
case ( 4 )
extsfcopt = 0 ! Do not support near surface field interpolation
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 )
extsfcopt = 0 ! Do not support near surface field interpolation
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)
!
!-----------------------------------------------------------------------
!
! Get COAMPS data
!
!-----------------------------------------------------------------------
!
case ( 6 )
extsfcopt = 0 ! Do not support near surface field interpolation
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, &
tsoil_ext(1,1,1,0),tsoil_ext(1,1,2,0), &
qsoil_ext(1,1,1,0),qsoil_ext(1,1,2,0),wetcanp_ext, &
istatus)
!
!-----------------------------------------------------------------------
!
! Get NMC RUC2 GRIB #211
!
!-----------------------------------------------------------------------
!
case ( 7 )
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, &
tsoil_ext(1,1,1,0),tsoil_ext(1,1,2,0), &
qsoil_ext(1,1,1,0),qsoil_ext(1,1,2,0),wetcanp_ext,&
trn_ext,psfc_ext, t_2m_ext, qv_2m_ext, &
u_10m_ext, v_10m_ext, istatus)
!
!-----------------------------------------------------------------------
!
! Get NCEP global re-analysis on T62 Gaussian lat/lon grid
!
!-----------------------------------------------------------------------
!
case ( 8 )
extsfcopt = 0 ! Do not support near surface field interpolation
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, &
tsoil_ext(1,1,1,0),tsoil_ext(1,1,2,0), &
qsoil_ext(1,1,1,0),qsoil_ext(1,1,2,0),wetcanp_ext, &
trn_ext,psfc_ext, istatus)
!
!-----------------------------------------------------------------------
!
! Get NMC RUC2 GEM
!
!-----------------------------------------------------------------------
!
case ( 9 )
extsfcopt = 0 ! Do not support near surface field interpolation
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)
!
!-----------------------------------------------------------------------
!
! Get NMC ETA GEMPAK #104
!
!-----------------------------------------------------------------------
!
case ( 10 )
extsfcopt = 0 ! Do not support near surface field interpolation
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, or #252)
!
! 11 - RUC2 Grid #236
! 18 - 20-km RUC2 Grid #252
!
! Note: if the option number for extdopt changed, should check the
! subroutine getnmcrucn236 inside for "extdopt".
!
!-----------------------------------------------------------------------
!
case ( 11, 18 )
extsfcopt = 0 ! Do not support near surface field interpolation
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, &
tsoil_ext(1,1,1,0),tsoil_ext(1,1,2,0), &
qsoil_ext(1,1,1,0),qsoil_ext(1,1,2,0),wetcanp_ext, &
trn_ext,psfc_ext,snowdpth_ext, &
istatus)
!
!-----------------------------------------------------------------------
!
! Get NCEP RUC2 Isobaric Coordinate GRIB (#236)
!
!-----------------------------------------------------------------------
!
case ( 12, 19 )
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, &
tsoil_ext(1,1,1,0),tsoil_ext(1,1,2,0), &
qsoil_ext(1,1,1,0),qsoil_ext(1,1,2,0),wetcanp_ext,&
trn_ext,psfc_ext, t_2m_ext, qv_2m_ext, &
u_10m_ext, v_10m_ext, snowdpth_ext, &
istatus)
!
!-----------------------------------------------------------------------
!
! Get NCEP AVN GRIB #3
!
!-----------------------------------------------------------------------
!
case ( 13 )
!
! NOTE: zpsoil_ext should be defined as soil depth!!!
!
CALL getncepavn3
(nx_ext,ny_ext,nz_ext,nzsoil_ext, &
dir_extd,extdname,extdopt,nofixdim,lon_0_360, &
extdinit,extdfcst,julfname, &
iproj_ext,scale_ext, &
trlon_ext,latnot_ext,x0_ext,y0_ext, &
lat_ext,lon_ext,zpsoil_ext, &
p_ext,hgt_ext,t_ext,qv_ext,u_ext,v_ext, &
qc_ext,qr_ext,qi_ext,qs_ext,qh_ext, &
tsoil_ext(:,:,:,0), qsoil_ext(:,:,:,0), &
wetcanp_ext(:,:,0), &
snowdpth_ext,trn_ext,psfc_ext,soiltyp_ext(:,:,1), &
t_2m_ext,qv_2m_ext,u_10m_ext,v_10m_ext, &
istatus)
nstyp_ext = 1
stypfrct_ext(:,:,1) = 1.0
IF(nstyps > 1) THEN
stypfrct_ext(:,:,2:nstyps) = 0.0
soiltyp_ext (:,:,2:nstyps) = 0.0
END IF
tsoil_ext(:,:,:,1) = tsoil_ext(:,:,:,0)
qsoil_ext(:,:,:,1) = qsoil_ext(:,:,:,0)
wetcanp_ext(:,:,1) = wetcanp_ext(:,:,0)
!-----------------------------------------------------------------------
!
! Get NCEP AVN GRIB #2
!
!-----------------------------------------------------------------------
!
case ( 14 )
extsfcopt = 0 ! Do not support near surface field interpolation
! NOTE: zpsoil_ext should be defined as soil depth!!!
CALL getncepavn2
(nx_ext,ny_ext,nz_ext,nzsoil_ext, &
dir_extd,extdname,extdopt,extdfmt,lon_0_360, &
extdinit,extdfcst,julfname, &
iproj_ext,scale_ext, &
trlon_ext,latnot_ext,x0_ext,y0_ext, &
lat_ext,lon_ext,zpsoil_ext, &
p_ext,hgt_ext,t_ext,qv_ext,u_ext,v_ext, &
qc_ext,qr_ext,qi_ext,qs_ext,qh_ext, &
tsoil_ext(:,:,:,0), qsoil_ext(:,:,:,0), &
wetcanp_ext(:,:,0), &
snowdpth_ext,trn_ext,psfc_ext,soiltyp_ext(:,:,1), &
istatus)
nstyp_ext = 1
stypfrct_ext(:,:,1) = 1.0
IF(nstyps > 1) THEN
stypfrct_ext(:,:,2:nstyps) = 0.0
soiltyp_ext (:,:,2:nstyps) = 0.0
END IF
tsoil_ext(:,:,:,1) = tsoil_ext(:,:,:,0)
qsoil_ext(:,:,:,1) = qsoil_ext(:,:,:,0)
wetcanp_ext(:,:,1) = wetcanp_ext(:,:,0)
!-----------------------------------------------------------------------
!
! Get NCAR/NCEP Reanalysis-2 GRIB #2
!
!-----------------------------------------------------------------------
!
case ( 15 )
extsfcopt = 0 ! Do not support near surface field interpolation
! NOTE: zpsoil_ext should be defined as soil depth!!!
CALL getncepavn2
(nx_ext,ny_ext,nz_ext,nzsoil_ext, &
dir_extd,extdname,extdopt,extdfmt,lon_0_360, &
extdinit,extdfcst,julfname, &
iproj_ext,scale_ext, &
trlon_ext,latnot_ext,x0_ext,y0_ext, &
lat_ext,lon_ext,zpsoil_ext, &
p_ext,hgt_ext,t_ext,qv_ext,u_ext,v_ext, &
qc_ext,qr_ext,qi_ext,qs_ext,qh_ext, &
tsoil_ext(:,:,:,0), qsoil_ext(:,:,:,0), &
wetcanp_ext(:,:,0), &
snowdpth_ext,trn_ext,psfc_ext,soiltyp_ext(:,:,1), &
istatus)
nstyp_ext = 1
stypfrct_ext(:,:,1) = 1.0
IF(nstyps > 1) THEN
stypfrct_ext(:,:,2:nstyps) = 0.0
soiltyp_ext (:,:,2:nstyps) = 0.0
END IF
tsoil_ext(:,:,:,1) = tsoil_ext(:,:,:,0)
qsoil_ext(:,:,:,1) = qsoil_ext(:,:,:,0)
wetcanp_ext(:,:,1) = wetcanp_ext(:,:,0)
!
!-----------------------------------------------------------------------
!
! Get NMC ETA GRIB #218 (12km Eta model output)
!
!-----------------------------------------------------------------------
!
case ( 16 )
! NOTE: zpsoil_ext is defined as soil depth!!!
CALL getnmceta218
(nx_ext,ny_ext,nz_ext,nzsoil_ext, &
nstyp_ext,dir_extd,extdname,extdinit,extdfcst, &
domain_tile,npr,npc, iproj_ext,scale_ext, &
trlon_ext,latnot_ext,x0_ext,y0_ext, &
lat_ext,lon_ext,zpsoil_ext, &
p_ext,hgt_ext,t_ext,qv_ext,u_ext,v_ext, &
qc_ext,qr_ext,qi_ext,qs_ext,qh_ext, &
tsoil_ext(:,:,:,0),qsoil_ext(:,:,:,0), &
wetcanp_ext(:,:,0), &
snowdpth_ext,trn_ext,psfc_ext,soiltyp_ext, &
t_2m_ext, qv_2m_ext, u_10m_ext, v_10m_ext, &
istatus)
nstyp_ext = 1
stypfrct_ext(:,:,1) = 1.
stypfrct_ext(:,:,2:nstyps) = 0.
zpsoil_ext(:,:,:) = -1.*zpsoil_ext(:,:,:)
! DO k = 1,nzsoil_ext
! CALL a3dmax0(tsoil_ext(1,1,k,0),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
! END DO
!
!-----------------------------------------------------------------------
!TINA
!
! Get NMC GRIB #221 - NARR (North American Regional Reanalysis) data
!
!-----------------------------------------------------------------------
!
case ( 17 )
! NOTE: zpsoil_ext is defined as soil depth!!!
CALL getnarr221
(nx_ext,ny_ext,nz_ext,nzsoil_ext,nstyp_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,zpsoil_ext, &
p_ext,hgt_ext,t_ext,qv_ext,u_ext,v_ext, &
qc_ext,qr_ext,qi_ext,qs_ext,qh_ext, &
tsoil_ext,qsoil_ext,wetcanp_ext, &
snowdpth_ext,trn_ext,psfc_ext,soiltyp_ext, &
t_2m_ext,qv_2m_ext,u_10m_ext,v_10m_ext, &
istatus)
nstyp_ext = 1
stypfrct_ext(:,:,1) = 1.
stypfrct_ext(:,:,2:nstyps) = 0.
zpsoil_ext(:,:,:) = -1.*zpsoil_ext(:,:,:)
! DO k = 1,nzsoil_ext
! CALL a3dmax0(tsoil_ext(1,1,k,0),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
! END DO
!-----------------------------------------------------------------------
!
! Binary lat/lon
!
!-----------------------------------------------------------------------
case ( 50 ) ! Binary format lat/lon data
extsfcopt = 0 ! Do not support near surface field interpolation
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, &
tsoil_ext(1,1,1,0),tsoil_ext(1,1,2,0), &
qsoil_ext(1,1,1,0),qsoil_ext(1,1,2,0),wetcanp_ext, &
snowdpth_ext,trn_ext,psfc_ext, &
istatus)
case ( 51 )
!-----------------------------------------------------------------------
!
! Get NCEP GFS GRIB, 1 x 1 deg, South America
!
!-----------------------------------------------------------------------
!
! NOTE: zpsoil_ext should be defined as soil depth!!!
!
CALL getncepavn3
(nx_ext,ny_ext,nz_ext,nzsoil_ext, &
dir_extd,extdname,extdopt,nofixdim,lon_0_360, &
extdinit,extdfcst,julfname, &
iproj_ext,scale_ext, &
trlon_ext,latnot_ext,x0_ext,y0_ext, &
lat_ext,lon_ext,zpsoil_ext, &
p_ext,hgt_ext,t_ext,qv_ext,u_ext,v_ext, &
qc_ext,qr_ext,qi_ext,qs_ext,qh_ext, &
tsoil_ext(:,:,:,0), qsoil_ext(:,:,:,0), &
wetcanp_ext(:,:,0), &
snowdpth_ext,trn_ext,psfc_ext,soiltyp_ext(:,:,1), &
t_2m_ext,qv_2m_ext,u_10m_ext,v_10m_ext, &
istatus)
nstyp_ext = 1
stypfrct_ext(:,:,1) = 1.0
IF(nstyps > 1) THEN
stypfrct_ext(:,:,2:nstyps) = 0.0
soiltyp_ext (:,:,2:nstyps) = 0.0
END IF
tsoil_ext(:,:,:,1) = tsoil_ext(:,:,:,0)
qsoil_ext(:,:,:,1) = qsoil_ext(:,:,:,0)
wetcanp_ext(:,:,1) = wetcanp_ext(:,:,0)
CASE DEFAULT
CALL arpsstop
( &
'extdopt option was invalid. Please specify a new option.', 1 )
END select
!-----------------------------------------------------------------------
!
! If "istatus" has been set to -888, we had a bad file, but we want to go
! ahead and still process more data.
!
!-----------------------------------------------------------------------
IF(istatus == -888) CYCLE
IF(istatus /= 1) GO TO 999
IF (myproc == 0) PRINT*,' '
CALL a3dmax0
(lat_ext,1,nx_ext,1,nx_ext,1,ny_ext,1,ny_ext, &
1,1,1,1,amax,amin)
IF (myproc == 0) 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)
IF (myproc == 0) 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)
IF (myproc == 0) 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)
IF (myproc == 0) 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)
IF (myproc == 0) 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)
IF (myproc == 0) 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)
IF (myproc == 0) 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)
IF (myproc == 0) 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)
IF (myproc == 0) 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)
IF (myproc == 0) 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)
IF (myproc == 0) 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)
IF (myproc == 0) 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)
IF (myproc == 0) 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)
IF (myproc == 0) 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
(tsoil_ext(1,1,1,0),1,nx_ext,1,nx_ext,1,ny_ext,1,ny_ext, &
1,1,1,1,amax,amin)
IF (myproc == 0) WRITE(6,'(1x,2(a,e13.6))') &
'tsoil_sfc_ext_min= ', amin,', tsoil_sfc_ext_max=',amax
CALL a3dmax0
(tsoil_ext(1,1,2,0),1,nx_ext,1,nx_ext,1,ny_ext,1,ny_ext, &
1,1,1,1,amax,amin)
IF (myproc == 0) WRITE(6,'(1x,2(a,e13.6))') &
'tsoil_deep_ext_min= ', amin,', tsoil_deep_ext_max=',amax
CALL a3dmax0
(qsoil_ext(1,1,1,0),1,nx_ext,1,nx_ext,1,ny_ext,1,ny_ext, &
1,1,1,1,amax,amin)
IF (myproc == 0) WRITE(6,'(1x,2(a,e13.6))') &
'qsoil_sfc_ext_min= ', amin,', qsoil_sfc_ext_max=',amax
CALL a3dmax0
(qsoil_ext(1,1,2,0),1,nx_ext,1,nx_ext,1,ny_ext,1,ny_ext, &
1,1,1,1,amax,amin)
IF (myproc == 0) WRITE(6,'(1x,2(a,e13.6))') &
'qsoil_dp_ext_min= ', amin,', qsoil_dp_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)
IF (myproc == 0) 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)
IF (myproc == 0) 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)
IF (myproc == 0) 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)
IF (myproc == 0) 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)
IF (myproc == 0) WRITE(6,'(1x,2(a,e13.6))') &
'T_2m_ext_min= ', amin,', T_2m_ext_max=',amax
CALL a3dmax0
(qv_2m_ext,1,nx_ext,1,nx_ext,1,ny_ext,1,ny_ext, &
1,1,1,1,amax,amin)
IF (myproc == 0) WRITE(6,'(1x,2(a,e13.6))') &
'qv_2m_ext_min= ', amin,', qv_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)
IF (myproc == 0) 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)
IF (myproc == 0) WRITE(6,'(1x,2(a,e13.6))') &
'V_10m_ext_min= ', amin,', V_10m_ext_max=',amax
IF (myproc == 0) PRINT*,' '
!
!-----------------------------------------------------------------------
!
! First time through the time loop, calculate grid
! transformation info.
!
!-----------------------------------------------------------------------
!
IF(first_time == 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 ( lon_0_360 ) THEN
DO i=1,nx_ext
IF(x_ext(i) < 0.0) x_ext(i) = x_ext(i)+360.
IF(x_ext(i) < x_ext(1)) x_ext(i) = x_ext(i)+360.
! If Greenwich Meridian goes between
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 ( lon_0_360 ) THEN
DO j=1,ny
DO i=1,nx
IF( xs2d(i,j) < 0. ) xs2d(i,j)= xs2d(i,j) + 360.
IF( xs2d(i,j) < xs2d(1,j)) THEN
IF( nofixdim == 1) THEN
xs2d(i,j)= xs2d(i,j) + 360.
! If Greenwich Meridian goes between
ELSE
WRITE(6,'(2(2a,/))') &
'Wrong longitudes for ARPS grid points in terms of the ',&
'external grid.','Interpolation may be wrong later if ', &
'it is ignored.'
CALL arpsstop
('Wrong longitudes.',1)
END IF
END IF
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( lon_0_360 ) THEN
DO j=1,ny
DO i=1,nx
IF( xu2d(i,j) < 0. ) xu2d(i,j)= xu2d(i,j) + 360.
IF( xu2d(i,j) < xu2d(1,j)) THEN
IF (nofixdim == 1) THEN
xu2d(i,j)= xu2d(i,j) + 360. ! extends beyond 360
! If Greenwich Meridian goes between
ELSE
WRITE(6,'(2(2a,/))') &
'Wrong longitudes for ARPS grid points in terms of the ',&
'external grid.','Interpolation may be wrong later if ', &
'it is ignored.'
CALL arpsstop
('Wrong longitudes.',1)
END IF
END IF
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 ( lon_0_360 ) THEN
DO j=1,ny
DO i=1,nx
IF( xv2d(i,j) < 0. ) xv2d(i,j)= xv2d(i,j) + 360.
IF( xv2d(i,j) < xv2d(1,j)) THEN
IF (nofixdim == 1) THEN
xv2d(i,j)= xv2d(i,j) + 360.
! If Greenwich Meridian goes between
ELSE
WRITE(6,'(2(2a,/))') &
'Wrong longitudes for ARPS grid points in terms of the ',&
'external grid.','Interpolation may be wrong later if ', &
'it is ignored.'
CALL arpsstop
('Wrong longitudes.',1)
END IF
END IF
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)
xsmin=xs2d(1,1)
xsmax=xs2d(1,1)
DO j=1,ny-1
xumin=MIN(xumin,xu2d(1 ,j))
xumax=MAX(xumax,xu2d(nx,j))
xsmin=MIN(xsmin,xs2d(1 ,j))
xsmax=MAX(xsmax,xs2d(nx,j))
END DO
ysmin=ys2d(1,1)
ysmax=ys2d(1,1)
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))
ysmin=MIN(ysmin,ys2d(i,1 ))
ysmax=MAX(ysmax,ys2d(i,ny))
END DO
IF (lon_0_360 .AND. nofixdim /= 1) THEN
! x_ext(1) for global grids (e.g., AVN grid 3) should be 0, not 360
x_ext = MOD(x_ext, 360.0)
WHERE (ABS(x_ext) < 1.0E-12) x_ext = 0.0
xumin = MOD(xumin + 360.0, 360.0)
xumax = MOD(xumax + 360.0, 360.0)
END IF
CALL mpmax0
(xumax,xumin)
CALL mpmax0
(yvmax,yvmin)
IF (myproc == 0) THEN
WRITE (6,'(4(a,F15.3))') ' xu ARPS:',xumin,' - ',xumax, &
' yv ARPS:',yvmin,' - ',yvmax
WRITE (6,'(4(a,F15.3))') ' xu EXT: ',x_ext(1),' - ',x_ext(nx_ext), &
' yv EXT: ',y_ext(1),' - ',y_ext(ny_ext)
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/)') 'ext2arps aborting ....'
CALL arpsstop
('ARPS domain extends beyond the available external data.',1)
ENDIF
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 ( lon_0_360 .AND. xdiag < 0. ) xdiag= xdiag + 360.
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
IF (myproc == 0 ) THEN
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'
ENDIF
!
!-----------------------------------------------------------------------
!
! Convert units of external data and write as a sounding.
!
! Note: mpi results likely won't be same as non-mpi, as the mpi run
! doesn't look at all processors. This is harmless.
!-----------------------------------------------------------------------
!
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)
IF (myproc == 0) &
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 ! first_time
!
!-----------------------------------------------------------------------
!
! 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
! F.KONG add
CALL uvetomp
(nx_ext,ny_ext,u_10m_ext,v_10m_ext, &
lon_ext,tem1_ext(1,1,1),tem2_ext(1,1,1))
DO j=1,ny_ext
DO i=1,nx_ext
u_10m_ext(i,j) = tem1_ext(i,j,1)
v_10m_ext(i,j) = tem2_ext(i,j,1)
END DO
END DO
IF (myproc == 0) THEN
print *,'u_10m_ext:',u_10m_ext(idiag,jdiag) ! temporary diag code
print *,'v_10m_ext:',v_10m_ext(idiag,jdiag)
END IF
! end F.KONG mod
END IF
!
!-----------------------------------------------------------------------
!
! 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(first_time == 1) THEN
!
!-----------------------------------------------------------------------
!
! Interpolate external terrain to arps grid (if exttrnopt=1).
!
!-----------------------------------------------------------------------
!
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_tmp, &
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_tmp
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_tmp(i,j) &
+ mfac*hterain(i,j)
END DO
END DO
END IF
ternopt = -1
CALL inigrd
(nx,ny,nz,nzsoil,x,y,z,zp,zpsoil, &
hterain,mapfct,j1,j2,j3,j3soil,j3soilinv, &
tem2(1,1,:),tem3(1,1,:),tem1)
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
!-----------------------------------------------------------------------
!
! 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)
IF (terndmp == 1) &
CALL trncntl
(nx,ny,ternfn(1:lternfn), x,y)
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
!
!-----------------------------------------------------------------------
!
! Convert 2-m temperature and humidity and 10-m wind to arps grid
!
!-----------------------------------------------------------------------
!
! IF ( extdopt == 2 .OR. extdopt == 13 ) THEN
! ! ETA (GRIB #212, 40km) or AVN (#3)
IF (extsfcopt /= 0) THEN
CALL mkarps2d
(nx_ext,ny_ext,nx,ny, &
iorder,iscl,jscl,x_ext,y_ext, &
xs2d,ys2d,t_2m_ext,t_2m, &
dxfld,dyfld,rdxfld,rdyfld, &
tem1_ext(1,1,1),tem1_ext(1,1,2), &
tem1_ext(1,1,3),tem1_ext(1,1,4))
CALL mkarps2d
(nx_ext,ny_ext,nx,ny, &
iorder,iscl,jscl,x_ext,y_ext, &
xs2d,ys2d,qv_2m_ext,qv_2m, &
dxfld,dyfld,rdxfld,rdyfld, &
tem1_ext(1,1,1),tem1_ext(1,1,2), &
tem1_ext(1,1,3),tem1_ext(1,1,4))
CALL mkarps2d
(nx_ext,ny_ext,nx,ny, &
iorder,iscl,jscl,x_ext,y_ext, &
xs2d,ys2d,u_10m_ext,u_10m, &
dxfld,dyfld,rdxfld,rdyfld, &
tem1_ext(1,1,1),tem1_ext(1,1,2), &
tem1_ext(1,1,3),tem1_ext(1,1,4))
CALL mkarps2d
(nx_ext,ny_ext,nx,ny, &
iorder,iscl,jscl,x_ext,y_ext, &
xs2d,ys2d,v_10m_ext,v_10m, &
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 == 0) &
CALL mkarps2d
(nx_ext,ny_ext,nx,ny, &
iorder,iscl,jscl,x_ext,y_ext, &
xs2d,ys2d,trn_ext,htrn_tmp, &
dxfld,dyfld,rdxfld,rdyfld, &
tem1_ext(1,1,1),tem1_ext(1,1,2), &
tem1_ext(1,1,3),tem1_ext(1,1,4))
END IF
htrn_tmp = amax1(htrn_tmp, 0.0)
!
!-----------------------------------------------------------------------
!
! 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
IF (myproc == 0) THEN
PRINT *, ' qv_ext min = ',qvmin
PRINT *, ' qv_ext max = ',qvmax
ENDIF
!
!-----------------------------------------------------------------------
!
! Calculate base-state sounding (vertical profile)
!
!-----------------------------------------------------------------------
!
CALL extmnsnd
(nx,ny,nx_ext,ny_ext,nz_ext,lvlprof,1, &
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)
IF (nsmooth > 0 .AND. mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsendrecv2dew
(pprt,nx,ny,nz,ebc,wbc,0,tem1)
CALL mpsendrecv2dns
(pprt,nx,ny,nz,nbc,sbc,0,tem1)
END IF
DO ksmth=1,nsmooth
DO k=1,nz
CALL smooth9p
(pprt(1,1,k), nx,ny, 1,nx,1,ny, tem1)
END DO
IF (nsmooth > ksmth .AND. mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsendrecv2dew
(pprt,nx,ny,nz,ebc,wbc,0,tem1)
CALL mpsendrecv2dns
(pprt,nx,ny,nz,nbc,sbc,0,tem1)
END IF
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
IF ( extsfcopt /= 0 .AND. t_2m_ext(1,1) > -900. ) THEN
! F.KONG add t_2m ajustment
DO j=1,ny_ext
DO i=1,nx_ext
tem1_ext(i,j,1)=t_2m_ext(i,j)*((p0/psfc_ext(i,j))**rddcp)
END DO
END DO
iprtopt=1
CALL mkarpsvar1
(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, &
trn_ext,tem1_ext(1,1,1),2.0, &
dxfld,dyfld,rdxfld,rdyfld, &
tem1_ext,tem2_ext,tem3_ext, &
tem4_ext)
ELSE
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)
ENDIF
IF (nsmooth > 0 .AND. mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsendrecv2dew
(ptprt,nx,ny,nz,ebc,wbc,0,tem1)
CALL mpsendrecv2dns
(ptprt,nx,ny,nz,nbc,sbc,0,tem1)
END IF
DO ksmth=1,nsmooth
CALL smooth3d
(nx,ny,nz, 1,nx,1,ny,1,nz,0, &
smfct1,zs,ptprt,tem1,ptprt)
END DO
!
!-----------------------------------------------------------------------
!
! Process qv data.
!
!-----------------------------------------------------------------------
!
IF ( extsfcopt /= 0 .AND. &
(t_2m_ext(1,1) > -900. .AND. qv_2m_ext(1,1) > -1.0) ) THEN
! Using 2m surface field interpolation
DO j=1,ny_ext
DO i=1,nx_ext
qvsat=f_qvsat
(psfc_ext(i,j)-25.0, t_2m_ext(i,j))
! -25.0 reflects 2m effect
tem1_ext(i,j,2)=SQRT(AMAX1(0.,(rhmax-(qv_2m_ext(i,j)/qvsat))))
END DO
END DO
iprtopt=0
CALL mkarpsvar1
(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, &
trn_ext,tem1_ext(1,1,2),2.0, &
dxfld,dyfld,rdxfld,rdyfld, &
tem1_ext,tem2_ext,tem3_ext, &
tem4_ext)
ELSE
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)
ENDIF
IF (nsmooth > 0 .AND. mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsendrecv2dew
(qv,nx,ny,nz,ebc,wbc,0,tem1)
CALL mpsendrecv2dns
(qv,nx,ny,nz,nbc,sbc,0,tem1)
END IF
DO ksmth=1,nsmooth
CALL smooth3d
(nx,ny,nz, 1,nx,1,ny,1,nz,0, &
smfct1,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
IF ( myproc == 0 ) THEN
PRINT *, ' qv_ext min = ',qvmin
PRINT *, ' qv_ext max = ',qvmax
ENDIF
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
CALL mpmax0
(qvmax,qvmin)
IF ( myproc == 0 ) THEN
PRINT *, ' qv min = ',qvmin
PRINT *, ' qv max = ',qvmax
ENDIF
!
!-----------------------------------------------------------------------
!
! 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)
IF (nsmooth > 0 .AND. mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsendrecv2dew
(qc,nx,ny,nz,ebc,wbc,0,tem1)
CALL mpsendrecv2dns
(qc,nx,ny,nz,nbc,sbc,0,tem1)
END IF
DO ksmth=1,nsmooth
CALL smooth3d
(nx,ny,nz, 1,nx,1,ny,1,nz,0, &
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)
IF (nsmooth > 0 .AND. mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsendrecv2dew
(qr,nx,ny,nz,ebc,wbc,0,tem1)
CALL mpsendrecv2dns
(qr,nx,ny,nz,nbc,sbc,0,tem1)
END IF
DO ksmth=1,nsmooth
CALL smooth3d
(nx,ny,nz, 1,nx,1,ny,1,nz,0, &
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)
IF (nsmooth > 0 .AND. mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsendrecv2dew
(qi,nx,ny,nz,ebc,wbc,0,tem1)
CALL mpsendrecv2dns
(qi,nx,ny,nz,nbc,sbc,0,tem1)
END IF
DO ksmth=1,nsmooth
CALL smooth3d
(nx,ny,nz, 1,nx,1,ny,1,nz,0, &
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)
IF (nsmooth > 0 .AND. mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsendrecv2dew
(qs,nx,ny,nz,ebc,wbc,0,tem1)
CALL mpsendrecv2dns
(qs,nx,ny,nz,nbc,sbc,0,tem1)
END IF
DO ksmth=1,nsmooth
CALL smooth3d
(nx,ny,nz, 1,nx,1,ny,1,nz,0, &
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)
IF (nsmooth > 0 .AND. mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsendrecv2dew
(qh,nx,ny,nz,ebc,wbc,0,tem1)
CALL mpsendrecv2dns
(qh,nx,ny,nz,nbc,sbc,0,tem1)
END IF
DO ksmth=1,nsmooth
CALL smooth3d
(nx,ny,nz, 1,nx,1,ny,1,nz,0, &
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)
IF (nsmooth > 0 .AND. mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsendrecv2dew
(rhobar,nx,ny,nz,ebc,wbc,0,tem1)
CALL mpsendrecv2dns
(rhobar,nx,ny,nz,nbc,sbc,0,tem1)
END IF
DO ksmth=1,nsmooth
CALL smooth3d
(nx,ny,nz, 1,nx,1,ny,1,nz,0, &
smfct1,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 j=1,ny
DO i=1,nx
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 j=1,ny
DO i=1,nx
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)
IF (loc_x == 1) THEN ! West boundary
DO k=1,nz_ext
DO j=1,ny
avgzs_ext(1,j,k) = zs_ext(1,j,k)
END DO
END DO
DO k=1,nz
DO j=1,ny
tem2(1,j,k) = zs(1,j,k)
END DO
END DO
END IF
IF (loc_x == nproc_x) THEN
DO k=1,nz_ext
DO j=1,ny
avgzs_ext(nx,j,k) = zs_ext(nx-1,j,k)
END DO
END DO
DO k=1,nz
DO j=1,ny
tem2(nx,j,k) = zs(nx-1,j,k)
END DO
END DO
END IF
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_ext,1:ny_ext,1:nz_ext) = hgt_ext(nx_ext-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 IF ( extsfcopt /=0 .AND. (u_10m_ext(1,1) > -900.0) ) THEN
! u is on a scalar point, Using 10m surface interpolation
iprtopt=0
CALL mkarpsvar1
(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, &
trn_ext,u_10m_ext,10.0, &
dxfld,dyfld,rdxfld,rdyfld, &
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
IF (mp_opt > 0) THEN ! note the difference of condition with others
CALL acct_interrupt
(mp_acct)
CALL mpsendrecv2dew
(u,nx,ny,nz,ebc,wbc,1,tem1)
CALL mpsendrecv2dns
(u,nx,ny,nz,nbc,sbc,1,tem1)
END IF
DO ksmth=1,nsmooth
CALL smooth3d
(nx,ny,nz, 1,nx,1,ny,1,nz,1, &
smfct1,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)
IF (myproc == 0) 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)
IF (loc_y == 1) THEN ! south boundary
DO k=1,nz_ext
DO i=1,nx
avgzs_ext(i,1,k)=zs_ext(i,1,k)
END DO
END DO
DO k=1,nz
DO i=1,nx
tem2(i,1,k)=zs(i,1,k)
END DO
END DO
END IF
IF (loc_y == nproc_y) THEN
DO k=1,nz_ext
DO i=1,nx
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,ny,k)=zs(i,ny-1,k)
END DO
END DO
END IF
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_ext,1:nz_ext) = hgt_ext(1:nx_ext,ny_ext-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 IF ( extsfcopt /=0 .AND. (v_10m_ext(1,1) > -900.0) ) THEN
! v is on a scalar point, Using 10m surface itnerpolation
iprtopt=0
CALL mkarpsvar1
(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, &
trn_ext,v_10m_ext,10.0, &
dxfld,dyfld,rdxfld,rdyfld, &
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
IF (mp_opt > 0) THEN ! note the difference of condition with others
CALL acct_interrupt
(mp_acct)
CALL mpsendrecv2dew
(v,nx,ny,nz,ebc,wbc,2,tem1)
CALL mpsendrecv2dns
(v,nx,ny,nz,nbc,sbc,2,tem1)
END IF
DO ksmth=1,nsmooth
CALL smooth3d
(nx,ny,nz, 1,nx,1,ny,1,nz,2, &
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)
IF (myproc == 0) 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 (tsoil_ext(1,1,1,is) > 0) nstyp_ext = is
ENDDO
ENDIF
! This should never be the case (or else ext sfc arrays allocated too small!):
nstyp_ext = min(nstyp_ext,nstyps)
wetcout = 0
tsoilout = 0
qsoilout = 0
snowdout = 0
!EMK NEW 6 June 2002
!TODO: Make sure other external model types are processed correctly.
IF (soilmodel_option == 1) THEN ! Will use old force-restore soil model.
!commented out mkarps2d & smooth9's, add call to intrp_soil
DO is=0,nstyp_ext
IF ( tsoil_ext(1,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,1,is),tsoil(1,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
! DO k=1,nzsoil
! CALL smooth9p(tsoil(1,1,k,is), nx,ny, 1,nx,1,ny, tem1)
! END DO
! END DO
END IF
IF ( qsoil_ext(1,1,1,is) >= 0.0 ) THEN
qsoilout = 1
! CALL mkarps2d (nx_ext,ny_ext,nx,ny, &
! iorder,iscl,jscl,x_ext,y_ext, &
! xs2d,ys2d,qsoil_ext(1,1,1,is),qsoil(1,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
! DO k=1,nzsoil
! CALL smooth9p(qsoil(1,1,k,is), nx,ny, 1,nx,1,ny, tem1)
! END DO
! 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
! DTD: Hmmm, it seems this should come AFTER intrp_soil!
! CALL fix_soil_nstyp(nx,ny,nzsoil,nstyp_ext,nstyp,tsoil, &
! qsoil,wetcanp)
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
DO is = 0,nstyp_ext
DO j = 1,ny_ext-1
DO i = 1,nx_ext-1
temsoil1_ext(i,j,is) = tsoil_ext(i,j,1,is)
temsoil2_ext(i,j,is) = tsoil_ext(i,j,2,is)
temsoil3_ext(i,j,is) = qsoil_ext(i,j,1,is)
temsoil4_ext(i,j,is) = qsoil_ext(i,j,2,is)
END DO
END DO
END DO
CALL intrp_soil
(nx_ext,ny_ext,nx,ny,nstyp_ext,nstyp,xw,yw,iscl,jscl, &
temsoil1_ext,temsoil2_ext, &
temsoil3_ext,temsoil4_ext,wetcanp_ext, &
soiltyp_ext,stypfrct_ext,vegtyp_ext, &
temsoil1,temsoil2, &
temsoil3,temsoil4,wetcanp, &
soiltyp,stypfrct,vegtyp)
DO is = 0,nstyps
DO j = 1,ny-1
DO i = 1,nx-1
tsoil(i,j,1,is) = temsoil1(i,j,is)
tsoil(i,j,2,is) = temsoil2(i,j,is)
qsoil(i,j,1,is) = temsoil3(i,j,is)
qsoil(i,j,2,is) = temsoil4(i,j,is)
END DO
END DO
END DO
! DTD: placed call to fix_soil_nstyp here, after intrp_soil routine
! previously it was called before, before tsoil, qsoil arrays are filled
! using intrp_soil
CALL fix_soil_nstyp
(nx,ny,nzsoil,nstyp_ext,nstyp,tsoil, &
qsoil,wetcanp)
! end DTD
!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
!EMK END 18 June 2002
ELSE ! New OUSoil Model
IF (extdopt /= 0) THEN ! Not processing ARPS data
! First convert zpsoil to soil depth.
DO k = 1,nzsoil
DO j = 1,ny-1
DO i = 1,nx-1
zpsoil(i,j,k) = hterain(i,j) - zpsoil(i,j,k)
END DO
END DO
END DO
DO k = 1,nzsoil_ext-1
DO j =1,ny_ext-1
DO i =1,nx_ext-1
rdzsoilfld(i,j,k) = &
zpsoil_ext(i,j,k+1) - zpsoil_ext(i,j,k)
END DO
END DO
END DO
tsoilout = 1
qsoilout = 1
wetcout = 1
CALL intrpsoil3d_avg
(nx_ext,ny_ext,nzsoil_ext,vegtyp_ext, &
tsoil_ext,qsoil_ext,wetcanp_ext, &
x_ext,y_ext,zpsoil_ext, &
rdxfld,rdyfld,rdzsoilfld, &
nx,ny,nzsoil,nstyps, &
vegtyp,tsoil,qsoil,wetcanp, &
xs2d,ys2d,zpsoil,iscl,jscl,ksoil3d)
! Convert zpsoil back from soil depth to MSL
DO k = 1,nzsoil
DO j = 1,ny-1
DO i = 1,nx-1
zpsoil(i,j,k) = hterain(i,j) - zpsoil(i,j,k)
END DO
END DO
END DO
ELSE ! Processing ARPS data
!EMK 15 June 2002
! Convert to soil depth
DO k = 1,nzsoil_ext
DO j =1,ny_ext
DO i =1,nx_ext
zpsoil_ext(i,j,k) = trn_ext(i,j) - zpsoil_ext(i,j,k)
END DO
END DO
END DO
DO k = 1,nzsoil
DO j =1,ny
DO i =1,nx
zpsoil(i,j,k) = hterain(i,j) - zpsoil(i,j,k)
END DO
END DO
END DO
DO k = 1,nzsoil_ext-1
DO j =1,ny_ext-1
DO i =1,nx_ext-1
rdzsoilfld(i,j,k) = zpsoil_ext(i,j,k+1) - zpsoil_ext(i,j,k)
END DO
END DO
END DO
tsoilout = 1
qsoilout = 1
wetcout = 1
CALL intrpsoil3d_pst
(nx_ext,ny_ext,nzsoil_ext,nstyp_ext, &
soiltyp_ext,stypfrct_ext,vegtyp_ext, &
tsoil_ext,qsoil_ext,wetcanp_ext, &
x_ext,y_ext,zpsoil_ext, &
rdxfld,rdyfld,rdzsoilfld, &
nx,ny,nzsoil,nstyp,soiltyp,stypfrct, &
vegtyp,tsoil,qsoil,wetcanp,xs2d,ys2d, &
zpsoil,iscl,jscl,ksoil3d)
! Convert back to MSL m
DO k = 1,nzsoil_ext
DO j =1,ny_ext
DO i =1,nx_ext
zpsoil_ext(i,j,k) = trn_ext(i,j) - zpsoil_ext(i,j,k)
END DO
END DO
END DO
DO k = 1,nzsoil
DO j =1,ny
DO i =1,nx
zpsoil(i,j,k) = hterain(i,j) - zpsoil(i,j,k)
END DO
END DO
END DO
END IF ! IF (exdtopt /= 0)
END IF ! Force-restore or OUSoil
!EMK END 18 June 2002
!
! Commented out 6 June 2002 by Eric Kemp. I'm not sure if
! we need this or not.
! CALL initsoilext(nx,ny,nzsoil,nzsoil_ext,nstyp,zpsoil, &
! zpsoil_ext,tsoil,tsoil_ext,qsoil,qsoil_ext)
!EMK END 6 June 2002
IF ( snowdpth_ext(1,1) >= 0 ) THEN
snowdout = 1
!
! 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
IF ( wetcout == 1 .OR. snowdout == 1 .OR. &
tsoilout == 1 .OR. qsoilout == 1 ) THEN
zpsoilout = 1
CALL cvttsnd
( curtim, timsnd, tmstrln )
soiloutfl = runname(1:lfnkey)//".soilvar."//timsnd(1:tmstrln)
lfn = lfnkey + 9 + tmstrln
IF (mp_opt > 0 .AND. joindmp <= 0 ) THEN
WRITE(soiloutfl,'(a,a,a,a,2i2.2)') &
runname(1:lfnkey),'.soilvar.',timsnd(1:tmstrln),'_',loc_x,loc_y
lfn = lfn + 5
END IF
IF( dirname /= ' ' ) THEN
temchar = soiloutfl
soiloutfl = dirname(1:ldirnam)//'/'//temchar
lfn = lfn + ldirnam + 1
END IF
IF (soildmp > 0) THEN
CALL fnversn
(soiloutfl, lfn)
IF (myproc == 0) PRINT *, 'Write soil initial data to ',soiloutfl(1:lfn)
! CALL wrtsoil(nx,ny,nzsoil,nstyp, soiloutfl,dx,dy,zpsoil, &
! mapproj,trulat1,trulat2,trulon,sclfct,ctrlat,ctrlon, &
! zpsoilout, tsoilout,qsoilout, wetcout,snowdout, &
! tsoil,qsoil,wetcanp,snowdpth, soiltyp)
! blocking inserted for ordering i/o for message passing
DO i=0,nprocs-1,max_fopen
IF(myproc >= i.AND.myproc <= i+max_fopen-1)THEN
IF(mp_opt > 0 .AND. joindmp > 0) THEN
CALL wrtjoinsoil
(nx,ny,nzsoil,nstyps, soiloutfl(1:lfn),dx,dy,&
zpsoil, mapproj,trulat1,trulat2,trulon,sclfct, &
ctrlat,ctrlon,1,1,1,1,1, &
tsoil,qsoil,wetcanp,snowdpth,soiltyp)
ELSE
CALL wrtsoil
(nx,ny,nzsoil,nstyps, soiloutfl(1:lfn),dx,dy,zpsoil, &
mapproj,trulat1,trulat2,trulon,sclfct,ctrlat,ctrlon, &
1,1,1,1,1, &
tsoil,qsoil,wetcanp,snowdpth,soiltyp)
END IF
END IF
IF (mp_opt > 0) CALL mpbarrier
END DO
IF (soildmp == 1) CALL soilcntl
(nx,ny, nzsoil,zpsoil,soiloutfl, &
zpsoilout,tsoilout,qsoilout, 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)
IF (myproc == 0) 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
IF (myproc == 0) 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)
IF (myproc == 0) &
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 (mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsendrecv2dew
(rhostr,nx,ny,nz,4,4,0,tem1)
CALL mpsendrecv2dns
(rhostr,nx,ny,nz,4,4,0,tem1)
END IF
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)
IF (nsmooth > 0 .AND. mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsendrecv2dew
(w,nx,ny,nz,ebc,wbc,3,tem1)
CALL mpsendrecv2dns
(w,nx,ny,nz,nbc,sbc,3,tem1)
END IF
DO ksmth=1,nsmooth
CALL smooth3d
(nx,ny,nz, 1,nx,1,ny,1,nz,3, &
smfct1,zp,w,tem1,w)
END DO
ELSE
w = 0.
END IF
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, &
3,3,3,3)
CALL bcu
(nx,ny,nz,1.0, u, tem1,tem2,tem3,tem4, 3,3,3,3,1,1, &
3,3,3,3)
CALL bcv
(nx,ny,nz,1.0, v, tem1,tem2,tem3,tem4, 3,3,3,3,1,1, &
3,3,3,3)
ENDIF
!
!-----------------------------------------------------------------------
!
! Zero out uninitialized fields
!
!-----------------------------------------------------------------------
!
tem1=0.
!
!-----------------------------------------------------------------------
!
! Print out the max/min of output variables.
!
!-----------------------------------------------------------------------
!
IF (myproc == 0) 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)
IF (myproc == 0) 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)
IF (myproc == 0) 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)
IF (myproc == 0) 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)
IF (myproc == 0) 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)
IF (myproc == 0) 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)
IF (myproc == 0) 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)
IF (myproc == 0) 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)
IF (myproc == 0) 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)
IF (myproc == 0) 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)
IF (myproc == 0) 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)
IF (myproc == 0) 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)
IF (myproc == 0) 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)
IF (myproc == 0) WRITE(6,'(1x,2(a,e13.6))') &
'qvmin = ', amin,', qvmax =',amax
IF(sfcout == 1) THEN
IF (soilmodel_option == 1) THEN
CALL a3dmax0
(tsoil,1,nx,1,nx-1,1,ny,1,ny-1,1,nzsoil,1,nzsoil, &
amax,amin)
IF (myproc == 0) WRITE(6,'(1x,2(a,e13.6))') &
'tsoilmin = ', amin,', tsoilmax =',amax
CALL a3dmax0
(qsoil,1,nx,1,nx-1,1,ny,1,ny-1,1,nzsoil,1,nzsoil, &
amax,amin)
IF (myproc == 0) WRITE(6,'(1x,2(a,e13.6))') &
'qsoilmin= ', amin,', qsoilmax=',amax
CALL a3dmax0
(wetcanp,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1,amax,amin)
IF (myproc == 0) WRITE(6,'(1x,2(a,e13.6))') &
'wetcanpmin = ', amin,', wetcanpmax =',amax
ELSE IF (soilmodel_option == 2) THEN
CALL a3dmax0
(tsoil,1,nx,1,nx-1,1,ny,1,ny-1,1,nzsoil,1, &
nzsoil,amax,amin)
IF (myproc == 0) WRITE(6,'(1x,2(a,e13.6))') &
'tsoilmin= ', amin,', tsoilmax=',amax
CALL a3dmax0
(qsoil,1,nx,1,nx-1,1,ny,1,ny-1,1,nzsoil,1, &
nzsoil,amax,amin)
IF (myproc == 0) WRITE(6,'(1x,2(a,e13.6))') &
'qsoilmin = ', amin,', qsoilmax =',amax
CALL a3dmax0
(wetcanp,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1,amax,amin)
IF (myproc == 0) WRITE(6,'(1x,2(a,e13.6))') &
'wetcanpmin = ', amin,', wetcanpmax =',amax
END IF
END IF
!
!-----------------------------------------------------------------------
!
! Print the mean sounding that was used in setting the
! mean ARPS variables.
!
!-----------------------------------------------------------------------
!
IF (myproc == 0) 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
IF (myproc == 0) &
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
IF (myproc == 0) 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)
IF (myproc == 0) &
PRINT*,'Writing base state history dump ',basdmpfn(1:lbasdmpf)
grdbas =1
mstout =1
rainout=0
prcout =0
trbout =0
!
! Does the user only want the first file to dump the base state?
!
hdmpgrdfmt = hdmpfmt
IF ( grdbasopt == 0 .AND. ifile > 1 ) hdmpgrdfmt = 0
IF ( grdbasopt == -1 ) hdmpgrdfmt = 0
IF (nstyp_ext < 1) landout = 0
! blocking inserted for ordering i/o for message passing
DO i=0,nprocs-1,max_fopen
IF(myproc >= i.AND.myproc <= i+max_fopen-1)THEN
CALL dtadump
(nx,ny,nz,nzsoil,nstyp, &
! hdmpfmt,iniotfu,basdmpfn(1:lbasdmpf),grdbas,filcmprs, &
hdmpgrdfmt,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,zpsoil, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsoil,qsoil,wetcanp,snowdpth, &
tem1,tem1,tem1, &
tem1,tem1,tem1, &
tem1,tem1, &
tem1,tem1,tem1,tem1, &
tem2,tem3,tem4)
END IF
IF (mp_opt > 0) CALL mpbarrier
END DO
450 CONTINUE
IF (myproc == 0) PRINT*,'curtim = ', curtim
CALL gtdmpfn
(runname(1:lfnkey),dirname,ldirnam,curtim,hdmpfmt, &
mgrid,nestgrd, hdmpfn, ldmpf)
IF (myproc == 0) &
WRITE(6,'(1x,a,a)') 'History data dump in file ',hdmpfn(1:ldmpf)
grdbas=0
! blocking inserted for ordering i/o for message passing
DO i=0,nprocs-1,max_fopen
IF(myproc >= i.AND.myproc <= i+max_fopen-1)THEN
CALL dtadump
(nx,ny,nz,nzsoil,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,zpsoil, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsoil,qsoil,wetcanp,snowdpth, &
tem1,tem1,tem1, &
tem1,tem1,tem1, &
tem1,tem1, &
tem1,tem1,tem1,tem1, &
tem2,tem3,tem4)
END IF
IF (mp_opt > 0) CALL mpbarrier
END DO
first_time = 0
END DO
!
!-----------------------------------------------------------------------
!
! Friendly exit message.
!
!-----------------------------------------------------------------------
!
IF (istatus /= 1) GOTO 999
IF (myproc == 0) WRITE(6,'(a/a,i4,a)') &
' ==== Normal succesful completion of EXT2ARPS. ====', &
' Processed',nextdfil,' file(s)'
IF (mp_opt > 0) CALL mpexit
(0)
STOP
!
!-----------------------------------------------------------------------
!
! Problem doing time conversions.
!
!-----------------------------------------------------------------------
!
920 CONTINUE
IF (myproc == 0) 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)
CALL arpsstop
(' ',1)
!
!-----------------------------------------------------------------------
!
! Error status returned from rdextfil
!
!-----------------------------------------------------------------------
!
999 CONTINUE
IF (myproc == 0) WRITE(6,'(/,a,i6)') &
' Aborting, error reading external file. istatus=', &
istatus
CALL arpsstop
(' ',1)
STOP
END PROGRAM ext2arps