! !################################################################## !################################################################## !###### ###### !###### 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