! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE INITIAL ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE initial(mptr,nx,ny,nz,nzsoil,nxndg,nyndg,nzndg,nstyps, & 3,9 exbcbufsz, & u,v,w,wcont,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke, & udteb,udtwb,udtnb,udtsb,vdteb,vdtwb,vdtnb,vdtsb, & wdteb,wdtwb,wdtnb,wdtsb,pdteb,pdtwb,pdtnb,pdtsb, & sdteb,sdtwb,sdtnb,sdtsb, & ubar,vbar,ptbar,pbar,ptbari,pbari, & rhostr,rhostri,qvbar,ppi,csndsq, & x,y,z,zp,zpsoil,hterain,mapfct, & j1,j2,j3,j3soil,aj3x,aj3y,aj3z,j3inv,j3soilinv, & trigs1,trigs2,ifax1,ifax2, & wsave1,wsave2,vwork1,vwork2, & sinlat, kmh,kmv,rprntl, & soiltyp,stypfrct,vegtyp,lai,roufns,veg, & tsoil,qsoil,wetcanp,snowdpth,ptsfc,qvsfc, & ptcumsrc,qcumsrc,w0avg,nca,kfraincv, & cldefi,xland,bmjraincv, & raing,rainc,prcrate,exbcbuf,bcrlx,radfrc,radsw, & rnflx,radswnet,radlwin,usflx,vsflx,ptsflx,qvsflx, & uincr,vincr,wincr,pincr,ptincr,qvincr, & qcincr,qrincr,qiincr,qsincr,qhincr, & tem1soil,tem2soil,tem3soil,tem4soil,tem5soil, & temxy1,tem1,tem2,tem3,tem4,tem5,tem6,tem7, & tem8,tem9,tem10,tem11,tem12,tem13, & tem14,tem15,tem16,tem17,tem18,tem19, & tem20,tem21,tem22,tem23,tem24,tem25,tem26, & tem1_0,tem2_0,tem3_0) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Initialize the model parameters and variables, including base state ! variables, dependent variables and grid structure. ! ! This is the main driver for model initializations. ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! 11/5/92. ! ! MODIFICATION HISTORY: ! ! 5/02/92 (M. Xue) ! Added full documentation. ! ! 5/03/92 (M. Xue) ! Further documentation. ! ! 9/14/1992 (M. Xue) ! Different surface drag coefficients defined for momentum, heat and ! moisture. ! Three options included for the Coriolis force calculations. ! ! 2/12/94 (Yuhe Liu) ! Surface data and variables added for surface energy budget model. ! ! 6/10/94 (M. Xue &AS) ! Added call to initpwr. ! ! 02/07/1995 (Yuhe Liu) ! Added a new 2-D permanent array, veg(nx,ny), to the argument list ! ! 08/30/1995 (Yuhe Liu) ! Moved the initialization of external boundary arrays from the ! main program to this subroutine. ! ! 10/31/95 (D. Weber) ! Added trigs1,trigs2,ifax1,ifax2 for use in the upper w-p ! radiation condition. ! ! 1/22/96 (Donghai Wang & Yuhe Liu) ! Added the map projection factor to ARPS governing equations. ! ! 07/22/97 (D. Weber) ! Added wsave1,wsave2,vwork1,vwork2 for use in the even fft version ! of the upper w-p radiation condition (fftopt=2). ! ! 08/01/97 (Zonghui Huo) ! Added Kain-fritsch cumulus parameterization scheme. ! ! 11/05/97 (D. Weber) ! Added temxy5 array for use in the bottom boundary condition for ! pertrubation pressure (hydrostatic). ! ! 11/06/97 (D. Weber) ! Added three additional levels to the mapfct array. The three ! levels (4,5,6) represent the inverse of the first three in order. ! The inverse map factors are computed to improve efficiency. ! ! 4/15/1998 (Donghai Wang) ! Added the source terms to the right hand terms of the qc,qr,qi,qs ! equations due to the K-F cumulus parameterization. ! ! 4/15/1998 (Donghai Wang) ! Added the running average vertical velocity (array w0avg) ! for the K-F cumulus parameterization scheme. ! ! 9/15/1998 (D. Weber) ! Added ptbari, pbari (inverse) for use in optimizing the code. ! ! 8/31/1998 (K. Brewster) ! Added call to ININUDGE to initialize nudging terms. ! ! 11/18/1998 (K. Brewster) ! Changed pibar to ppi (full pi) and moved initialization. ! ! 12/09/1998 (Donghai Wang) ! Added the snow cover. ! ! 07/10/2001 (K. Brewster) ! Added increment arrays to argument list and to call to ininudge. ! ! 03/13/2002 (Eric Kemp) ! Added arrays for WRF BMJ cumulus scheme. ! ! April 2002 (Fanyou Kong) ! Added WRF new Kain-Fritsch (April 2002 version: KF_ETA) scheme ! initialization (lookup table) ! 05/02/2002 (Dan Weber and Jerry Brotzge) ! Added arrays for the new soil model. ! !----------------------------------------------------------------------- ! ! INPUT: ! ! mptr Grid identifier. ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! nzsoil Number of grid points in the soil model in the -z-direction ! ! nxndg Number of x grid points for nudging (1 or nx) ! nyndg Number of y grid points for nudging (1 or ny) ! nzndg Number of z grid points for nudging (1 or nz) ! ! OUTPUT: ! ! u x-component of velocity at all time levels (m/s). ! v y-component of velocity at all time levels (m/s). ! w z-component of velocity at all time levels (m/s). ! wcont Contravariant vertical velocity (m/s) ! ptprt Perturbation potential temperature at all time levels (K) ! pprt Perturbation pressure at all time levels (Pascal) ! qv Water vapor specific humidity at all time levels (kg/kg) ! qc Cloud water mixing ratio at all time levels (kg/kg) ! qr Rainwater mixing ratio at all time levels (kg/kg) ! qi Cloud ice mixing ratio at all time levels (kg/kg) ! qs Snow mixing ratio at all time levels (kg/kg) ! qh Hail mixing ratio at all time levels (kg/kg) ! tke Turbulent Kinetic Energy ((m/s)**2) ! ! udteb Time tendency of u field at east boundary (m/s**2) ! udtwb Time tendency of u field at west boundary (m/s**2) ! udtnb Time tendency of u field at north boundary (m/s**2) ! udtsb Time tendency of u field at south boundary (m/s**2) ! ! vdteb Time tendency of v field at east boundary (m/s**2) ! vdtwb Time tendency of v field at west boundary (m/s**2) ! vdtnb Time tendency of v field at north boundary (m/s**2) ! vdtsb Time tendency of v field at south boundary (m/s**2) ! ! wdteb Time tendency of w field at east boundary (m/s**2) ! wdtwb Time tendency of w field at west boundary (m/s**2) ! wdtnb Time tendency of w field at north boundary (m/s**2) ! wdtsb Time tendency of w field at south boundary (m/s**2) ! ! pdteb Time tendency of pprt field at east boundary (PASCAL/s) ! pdtwb Time tendency of pprt field at west boundary (PASCAL/s) ! pdtnb Time tendency of pprt field at north boundary (PASCAL/s) ! pdtsb Time tendency of pprt field at south boundary (PASCAL/s) ! ! sdteb Time tendency of a scalar field at east boundary (m/s**2) ! sdtwb Time tendency of a scalar field at west boundary (m/s**2) ! sdtnb Time tendency of a scalar field at north boundary (m/s**2) ! sdtsb Time tendency of a scalar field at south boundary (m/s**2) ! ! ubar Base state x-velocity component (m/s) ! vbar Base state y-velocity component (m/s) ! ptbar Base state potential temperature (K) ! pbar Base state pressure (Pascal) ! ptbari Inverse Base state potential temperature (K) ! pbari Inverse Base state pressure (Pascal) ! rhostr Base state density rhobar times j3 (kg/m**3) ! rhostri Inverse base state density rhobar times j3 (kg/m**3) ! qvbar Base state water vapor specific humidity (kg/kg). ! ppi Exner function ! csndsq Sound wave speed squared. ! ! x x-coordinate of grid points in computational space (m) ! y y-coordinate of grid points in computational 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 grid points in the soil model ! in physical space (m). ! hterain Terrain height (m) ! mapfct Map factors at scalar, u and v points ! ! j1 Coordinate transformation Jacobian -d(zp)/dx ! j2 Coordinate transformation Jacobian -d(zp)/dy ! j3 Coordinate transformation Jacobian d(zp)/dz ! j3soil Soil coordinate transformation Jacobian d(zpsoil)/dz ! aj3x Avgx of the coordinate transformation Jacobian d(zp)/dz ! aj3y Avgy of the coordinate transformation Jacobian d(zp)/dz ! aj3z Avgz of the coordinate transformation Jacobian d(zp)/dz ! j3inv Inverse of the coordinate transformation j3 ! j3soilinv Inverse of the soil coordinate transformation j3soil ! ! trigs1 Array containing pre-computed trig function for fftopt=1. ! trigs2 Array containing pre-computed trig function for fftopt=1. ! ifax1 Array containing the factors of nx for fftopt=1. ! ifax2 Array containing the factors of ny for fftopt=1. ! ! vwork1 2-D work array for fftopt=2 option. ! vwork2 2-D work array for fftopt=2 option. ! wsave1 Work array for fftopt=2 option. ! wsave2 Work array for fftopt=2 option. ! ! sinlat Sin of latitude at each grid point ! ! kmh Horizontal turb. mixing coef. for momentum ( m**2/s ) ! kmv Vertical turb. mixing coef. for momentum ( m**2/s ) ! rprntl Reciprocal of Prandtl number ! ! soiltyp Soil type ! stypfrct Soil type fraction ! vegtyp Vegetation type ! lai Leaf Area Index ! roufns Surface roughness ! veg Vegetation fraction ! ! tsoil Soil temperature (K) ! qsoil Soil moisture (m**3/m**3) ! wetcanp Canopy water amount ! ptsfc Ground surface potential temperature (K) ! qvsfc Effective S.H. at sfc. ! ! ptcumsrc Source term in pt-equation due to cumulus parameterization ! qcumsrc Source term in water equations due to cumulus parameterization ! ! nca Counter for CAPE release in the Kain-Fritsch scheme ! kfraincv K-F convective precipitation rate ! cldefi BMJ cloud efficiency ! xland BMJ land/sea mask ! bmjraincv BMJ convective precipitation amount ! ! radfrc Radiation forcing (K/s) ! radsw Solar radiation reaching the surface ! rnflx Net absorbed radiation by the surface ! radswnet Net shortwave radiation ! radlwin Incoming longwave radiation ! ! raing Grid supersaturation rain ! rainc Cumulus convective rain ! ! usflx Surface flux of u-momentum (kg/(m*s**2)) ! vsflx Surface flux of v-momentum (kg/(m*s**2)) ! ptsflx Surface heat flux (K*kg/(m**2 * s )) ! qvsflx Surface moisture flux of (kg/(m**2 * s)) ! ! temxy1 Temporary work array ! ! tem1soil Soil model temporary work array. ! tem2soil Soil model temporary work array. ! tem3soil Soil model temporary work array. ! tem4soil Soil model temporary work array. ! tem5soil Soil model temporary work array. ! ! tem1 Temporary work array. ! tem2 Temporary work array. ! tem3 Temporary work array. ! tem4 Temporary work array. ! tem5 Temporary work array. ! tem6 Temporary work array. ! tem7 Temporary work array. ! tem8 Temporary work array. ! tem9 Temporary work array. ! tem10 Temporary work array. ! tem11 Temporary work array. ! tem12 Temporary work array. ! tem13 Temporary work array. ! tem14 Temporary work array. ! tem15 Temporary work array. ! tem16 Temporary work array. ! tem17 Temporary work array. ! tem18 Temporary work array. ! tem19 Temporary work array. ! tem20 Temporary work array. ! tem21 Temporary work array. ! tem22 Temporary work array. ! tem23 Temporary work array. ! tem24 Temporary work array. ! tem25 Temporary work array. ! tem26 Temporary work array. ! ! tem1_0 Temporary work array. ! tem2_0 Temporary work array. ! tem3_0 Temporary work array. ! !----------------------------------------------------------------------- ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: mptr ! Grid identifier INCLUDE 'timelvls.inc' INTEGER :: nx,ny,nz ! The number of grid points in 3 directions INTEGER :: nzsoil ! Number of grid points in the -z-direction INTEGER :: nxndg,nyndg,nzndg ! The number of grid points in 3 directions REAL :: u (nx,ny,nz,nt) ! Total u-velocity (m/s). REAL :: v (nx,ny,nz,nt) ! Total v-velocity (m/s). REAL :: w (nx,ny,nz,nt) ! Total w-velocity (m/s). REAL :: wcont (nx,ny,nz) ! Contravariant vertical velocity (m/s) REAL :: ptprt (nx,ny,nz,nt) ! Perturbation potential temperature ! from that of base state atmosphere (Kelvin). REAL :: pprt (nx,ny,nz,nt) ! Perturbation pressure from that ! of base state atmosphere (Pascal). REAL :: qv (nx,ny,nz,nt) ! Water vapor specific humidity (kg/kg). REAL :: qc (nx,ny,nz,nt) ! Cloud water mixing ratio (kg/kg). REAL :: qr (nx,ny,nz,nt) ! Rain water mixing ratio (kg/kg). REAL :: qi (nx,ny,nz,nt) ! Cloud ice mixing ratio (kg/kg). REAL :: qs (nx,ny,nz,nt) ! Snow mixing ratio (kg/kg). REAL :: qh (nx,ny,nz,nt) ! Hail mixing ratio (kg/kg). REAL :: tke (nx,ny,nz,nt) ! Turbulent Kinetic Energy ((m/s)**2) REAL :: udteb (ny,nz) ! T-tendency of u at e-boundary (m/s**2) REAL :: udtwb (ny,nz) ! T-tendency of u at w-boundary (m/s**2) REAL :: udtnb (nx,nz) ! T-tendency of u at n-boundary (m/s**2) REAL :: udtsb (nx,nz) ! T-tendency of u at s-boundary (m/s**2) REAL :: vdteb (ny,nz) ! T-tendency of v at e-boundary (m/s**2) REAL :: vdtwb (ny,nz) ! T-tendency of v at w-boundary (m/s**2) REAL :: vdtnb (nx,nz) ! T-tendency of v at n-boundary (m/s**2) REAL :: vdtsb (nx,nz) ! T-tendency of v at s-boundary (m/s**2) REAL :: wdteb (ny,nz) ! T-tendency of w at e-boundary (m/s**2) REAL :: wdtwb (ny,nz) ! T-tendency of w at w-boundary (m/s**2) REAL :: wdtnb (nx,nz) ! T-tendency of w at n-boundary (m/s**2) REAL :: wdtsb (nx,nz) ! T-tendency of w at s-boundary (m/s**2) REAL :: pdteb (ny,nz) ! T-tendency of pprt at e-boundary (PASCAL/s) REAL :: pdtwb (ny,nz) ! T-tendency of pprt at w-boundary (PASCAL/s) REAL :: pdtnb (nx,nz) ! T-tendency of pprt at n-boundary (PASCAL/s) REAL :: pdtsb (nx,nz) ! T-tendency of pprt at s-boundary (PASCAL/s) REAL :: sdteb (ny,nz) ! T-tendency of w at e-boundary (m/s**2) REAL :: sdtwb (ny,nz) ! T-tendency of w at w-boundary (m/s**2) REAL :: sdtnb (nx,nz) ! T-tendency of w at n-boundary (m/s**2) REAL :: sdtsb (nx,nz) ! T-tendency of w at s-boundary (m/s**2) REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s). REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s). REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K) REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal). REAL :: ptbari(nx,ny,nz) ! Inverse Base state pot. temperature (K) REAL :: pbari (nx,ny,nz) ! Inverse Base state pressure (Pascal). REAL :: rhostr(nx,ny,nz) ! Base state density rhobar times j3. REAL :: rhostri(nx,ny,nz) ! Inverse base state density rhobar times j3. REAL :: qvbar (nx,ny,nz) ! Base state water vapor specific humidity ! (kg/kg). REAL :: ppi (nx,ny,nz) ! Exner function. REAL :: csndsq(nx,ny,nz) ! Sound wave speed squared. REAL :: x (nx) ! The x-coord. of the physical and ! computational grid. Defined at u-point. REAL :: y (ny) ! The y-coord. of the physical and ! computational grid. Defined at v-point. REAL :: z (nz) ! The z-coord. of the computational grid. ! Defined at w-point on the staggered grid. REAL :: zp (nx,ny,nz) ! The physical height coordinate defined at ! w-point on the staggered grid. REAL :: zpsoil(nx,ny,nzsoil) ! The physical height coordinate defined ! at the center of a soil layer(m). REAL :: hterain(nx,ny) ! Terrain height (m). REAL :: mapfct(nx,ny,8) ! Map factors at scalar, u and v points REAL :: j1 (nx,ny,nz) ! Coordinate transformation Jacobian -d(zp)/dx. REAL :: j2 (nx,ny,nz) ! Coordinate transformation Jacobian -d(zp)/dy. REAL :: j3 (nx,ny,nz) ! Coordinate transformation Jacobian d(zp)/dz. REAL :: j3soil(nx,ny,nzsoil) ! Coordinate transformation Jacobian ! defined as d( zpsoil )/d( zsoil ). REAL :: aj3x (nx,ny,nz) ! Coordinate transformation Jacobian defined ! as d( zp )/d( z ) AVERAGED IN THE X-DIR. REAL :: aj3y (nx,ny,nz) ! Coordinate transformation Jacobian defined ! as d( zp )/d( z ) AVERAGED IN THE Y-DIR. REAL :: aj3z (nx,ny,nz) ! Coordinate transformation Jacobian defined ! as d( zp )/d( z ) AVERAGED IN THE Z-DIR. REAL :: j3inv (nx,ny,nz) ! Inverse of J3 REAL :: j3soilinv(nx,ny,nzsoil) ! Inverse of J3soil. REAL :: trigs1(3*(nx-1)/2+1) ! Array containing pre-computed trig ! function for fftopt=1. REAL :: trigs2(3*(ny-1)/2+1) ! Array containing pre-computed trig ! function for fftopt=1. INTEGER :: ifax1(13) ! Array containing the factors of nx for ! fftopt=1. INTEGER :: ifax2(13) ! Array containing the factors of ny for ! fftopt=1. REAL :: vwork1 (nx+1,ny+1) ! 2-D work array for fftopt=2. REAL :: vwork2 (ny,nx+1) ! 2-D work array for fftopt=2. REAL :: wsave1 (3*(ny-1)+15) ! Work array for fftopt=2. REAL :: wsave2 (3*(nx-1)+15) ! Work array for fftopt=2. REAL :: sinlat(nx,ny) ! Sin of latitude at each grid point REAL :: kmh (nx,ny,nz) ! Horizontal turb. mixing coef. for ! momentum. ( m**2/s ) REAL :: kmv (nx,ny,nz) ! Vertical turb. mixing coef. for ! momentum. ( m**2/s ) REAL :: rprntl(nx,ny,nz) ! Reciprocal of Prandtl number INTEGER :: nstyps ! Number of soil type INTEGER :: soiltyp(nx,ny,nstyps) ! Soil types at grids REAL :: stypfrct(nx,ny,nstyps) ! Fraction of soil types INTEGER :: vegtyp (nx,ny) ! Vegetation type REAL :: lai (nx,ny) ! Leaf Area Index REAL :: roufns (nx,ny) ! Surface roughness REAL :: veg (nx,ny) ! Vegetation fraction REAL :: tsoil (nx,ny,nzsoil,0:nstyps) ! Soil layer temperature (K) REAL :: qsoil (nx,ny,nzsoil,0:nstyps) ! Soil layer moisture (m**3/m**3) REAL :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount REAL :: snowdpth(nx,ny) ! Snow depth (m) REAL :: qvsfc (nx,ny,0:nstyps) ! Effective qv at sfc. REAL :: ptsfc (nx,ny) ! Ground surface potential ! temperature (K) REAL :: ptcumsrc(nx,ny,nz) ! Source term in pt-equation due ! to cumulus parameterization REAL :: qcumsrc(nx,ny,nz,5) ! Source term in water equations due ! to cumulus parameterization: ! qcumsrc(1,1,1,1) for qv equation ! qcumsrc(1,1,1,2) for qc equation ! qcumsrc(1,1,1,3) for qr equation ! qcumsrc(1,1,1,4) for qi equation ! qcumsrc(1,1,1,5) for qs equation REAL :: w0avg(nx,ny,nz) ! a closing running average vertical ! velocity in 10min for K-F scheme REAL :: kfraincv(nx,ny) ! K-F convective rainfall (cm) INTEGER :: nca(nx,ny) ! K-F counter for CAPE release !EMK BMJ REAL,INTENT(INOUT) :: cldefi(nx,ny) ! BMJ cloud efficiency REAL,INTENT(INOUT) :: xland(nx,ny) ! BMJ land mask ! (1.0 = land, 2.0 = sea) REAL,INTENT(INOUT) :: bmjraincv(nx,ny) ! BMJ convective rainfall (cm) !EMK END REAL :: radfrc(nx,ny,nz) ! Radiation forcing (K/s) REAL :: radsw(nx,ny) ! Solar radiation reacing the surface REAL :: rnflx(nx,ny) ! Net absorbed radiation by the surface REAL :: radswnet(nx,ny) ! Net shortwave radiation REAL :: radlwin(nx,ny) ! Incoming longwave radiation REAL :: raing(nx,ny) ! Grid supersaturation rain REAL :: rainc(nx,ny) ! Cumulus convective rain REAL :: prcrate(nx,ny,4) ! precipitation rates (kg/(m**2*s)) ! prcrate(1,1,1) = total precipitation rate ! prcrate(1,1,2) = grid scale precip. rate ! prcrate(1,1,3) = cumulus precip. rate ! prcrate(1,1,4) = microphysics precip. rate REAL :: usflx (nx,ny) ! Surface flux of u-momentum (kg/(m*s**2)) REAL :: vsflx (nx,ny) ! Surface flux of v-momentum (kg/(m*s**2)) REAL :: ptsflx(nx,ny) ! Surface heat flux (K*kg/(m*s**2)) REAL :: qvsflx(nx,ny) ! Surface moisture flux (kg/(m**2*s)) INTEGER :: exbcbufsz ! EXBC buffer size REAL :: exbcbuf( exbcbufsz ) ! EXBC buffer array REAL :: bcrlx(nx,ny) ! EXBC relaxation coefficients REAL :: uincr(nxndg,nyndg,nzndg) ! Analysis increment for u REAL :: vincr(nxndg,nyndg,nzndg) ! Analysis increment for v REAL :: wincr(nxndg,nyndg,nzndg) ! Analysis increment for w REAL :: pincr(nxndg,nyndg,nzndg) ! Analysis increment for p REAL :: ptincr(nxndg,nyndg,nzndg) ! Analysis increment for pt REAL :: qvincr(nxndg,nyndg,nzndg) ! Analysis increment for qv REAL :: qcincr(nxndg,nyndg,nzndg) ! Analysis increment for qc REAL :: qrincr(nxndg,nyndg,nzndg) ! Analysis increment for qr REAL :: qiincr(nxndg,nyndg,nzndg) ! Analysis increment for qi REAL :: qsincr(nxndg,nyndg,nzndg) ! Analysis increment for qs REAL :: qhincr(nxndg,nyndg,nzndg) ! Analysis increment for qh REAL :: temxy1(nx,ny) ! Temporary work array REAL :: tem1soil(nx,ny,nzsoil) ! Temporary soil model work array. REAL :: tem2soil(nx,ny,nzsoil) ! Temporary soil model work array. REAL :: tem3soil(nx,ny,nzsoil) ! Temporary soil model work array. REAL :: tem4soil(nx,ny,nzsoil) ! Temporary soil model work array. REAL :: tem5soil(nx,ny,nzsoil) ! Temporary soil model work array. REAL :: tem1 (nx,ny,nz) ! Temporary work array. REAL :: tem2 (nx,ny,nz) ! Temporary work array. REAL :: tem3 (nx,ny,nz) ! Temporary work array. REAL :: tem4 (nx,ny,nz) ! Temporary work array. REAL :: tem5 (nx,ny,nz) ! Temporary work array. REAL :: tem6 (nx,ny,nz) ! Temporary work array. REAL :: tem7 (nx,ny,nz) ! Temporary work array. REAL :: tem8 (nx,ny,nz) ! Temporary work array. REAL :: tem9 (nx,ny,nz) ! Temporary work array. REAL :: tem10 (nx,ny,nz) ! Temporary work array. REAL :: tem11 (nx,ny,nz) ! Temporary work array. REAL :: tem12 (nx,ny,nz) ! Temporary work array. REAL :: tem13 (nx,ny,nz) ! Temporary work array. REAL :: tem14 (nx,ny,nz) ! Temporary work array. REAL :: tem15 (nx,ny,nz) ! Temporary work array. REAL :: tem16 (nx,ny,nz) ! Temporary work array. REAL :: tem17 (nx,ny,nz) ! Temporary work array. REAL :: tem18 (nx,ny,nz) ! Temporary work array. REAL :: tem19 (nx,ny,nz) ! Temporary work array. REAL :: tem20 (nx,ny,nz) ! Temporary work array. REAL :: tem21 (nx,ny,nz) ! Temporary work array. REAL :: tem22 (nx,ny,nz) ! Temporary work array. REAL :: tem23 (nx,ny,nz) ! Temporary work array. REAL :: tem24 (nx,ny,nz) ! Temporary work array. REAL :: tem25 (nx,ny,nz) ! Temporary work array. REAL :: tem26 (nx,ny,nz) ! Temporary work array. REAL :: tem1_0(0:nx,0:ny,0:nz) ! Temporary work array. REAL :: tem2_0(0:nx,0:ny,0:nz) ! Temporary work array. REAL :: tem3_0(0:nx,0:ny,0:nz) ! Temporary work array. ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'bndry.inc' INCLUDE 'indtflg.inc' INCLUDE 'phycst.inc' INCLUDE 'exbc.inc' INCLUDE 'nudging.inc' ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i,j INTEGER :: ireturn REAL :: tem !EMK BMJ LOGICAL :: restart INTEGER,PARAMETER :: vegwaterflag = 14 INTEGER,PARAMETER :: xland_waterflag = 2 INTEGER,PARAMETER :: xland_landflag = 1 !EMK END ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! mgrid = mptr grdin = 0 basin = 0 varin = 0 mstin = 0 rainin= 0 prcin = 0 icein = 0 trbin = 0 sfcin = 0 landin= 0 radin = 0 flxin = 0 !wdt update - init0 no longer necessary (arrays set to 0 after allocation) ! !----------------------------------------------------------------------- ! ! INITialize model array VARiables. ! !----------------------------------------------------------------------- ! !EMK BMJ CALL initgrdvar(nx,ny,nz,nzsoil,nt,nstyps,exbcbufsz, & x,y,z,zp,zpsoil,hterain,mapfct, & j1,j2,j3,j3soil,aj3x,aj3y,aj3z,j3inv,j3soilinv, & u,v,w,wcont,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke, & udteb, udtwb, vdtnb, vdtsb, & pdteb,pdtwb ,pdtnb ,pdtsb, & trigs1,trigs2,ifax1,ifax2, & wsave1,wsave2,vwork1,vwork2, & ubar,vbar,ptbar,pbar,ptbari,pbari, & rhostr,rhostri,qvbar,ppi,csndsq, & soiltyp,stypfrct,vegtyp,lai,roufns,veg, & tsoil,qsoil,wetcanp,snowdpth,qvsfc, & ptcumsrc,qcumsrc,w0avg,nca,kfraincv, & cldefi,xland,bmjraincv, & raing,rainc,prcrate,exbcbuf, & radfrc,radsw,rnflx,radswnet,radlwin, & usflx,vsflx,ptsflx,qvsflx, & tem1soil,tem2soil,tem3soil,tem4soil,tem5soil, & tem1,tem2,tem3,tem4,tem5, & tem6,tem7,tem8,tem9) DO j=1,ny-1 DO i=1,nx-1 tem = 0.5 * ( pprt(i,j,1,2)+pbar(i,j,1) & + pprt(i,j,2,2)+pbar(i,j,2) ) ptsfc(i,j)=tsoil(i,j,1,0)*(p0/tem)**rddcp END DO END DO ! !----------------------------------------------------------------------- ! ! Calculate the sin of the lattitude of each grid point, to be used ! in the calculation of latitude-dependent Coriolis parameters. ! !----------------------------------------------------------------------- ! CALL gtsinlat(nx,ny,x,y, sinlat, tem1,tem2, tem3) ! !----------------------------------------------------------------------- ! ! Initialize arrays that store the lookup table data. ! !----------------------------------------------------------------------- ! CALL initlktb ! !----------------------------------------------------------------------- ! ! Initialize the external boundary data array. ! !----------------------------------------------------------------------- ! IF( lbcopt == 2 .AND. mptr == 1 ) THEN ireturn = 0 ! DBW question why not soil model variables as well???? CALL extbdtini(nx,ny,nz, & u,v,w,ptprt,pprt, & qv,qc,qr,qi,qs,qh,ptbar,pbar, & exbcbuf(nu0exb), exbcbuf(nv0exb), & exbcbuf(nw0exb), exbcbuf(npt0exb), & exbcbuf(npr0exb), exbcbuf(nqv0exb), & exbcbuf(nqc0exb), exbcbuf(nqr0exb), & exbcbuf(nqi0exb), exbcbuf(nqs0exb), & exbcbuf(nqh0exb), exbcbuf(nudtexb), & exbcbuf(nvdtexb), exbcbuf(nwdtexb), & exbcbuf(nptdtexb),exbcbuf(nprdtexb), & exbcbuf(nqvdtexb),exbcbuf(nqcdtexb), & exbcbuf(nqrdtexb),exbcbuf(nqidtexb), & exbcbuf(nqsdtexb),exbcbuf(nqhdtexb), & bcrlx, & tem1,tem2,tem3,tem4,tem5,tem6, & tem7,tem8,tem9,tem10,tem11,ireturn) IF( ireturn == 1 ) THEN WRITE (6,'(a/a)') & 'Can not find the external boundary data. Dump the', & 'history file and restart file and then STOP the model.' CALL arpsstop('arpsstop called from initial with ext boundary file',1) ELSE IF( ireturn == 2 ) THEN WRITE (6,'(a/a)') & 'Can not open the external boundary data. Dump the history', & 'file and restart file and then STOP the model.' CALL arpsstop('arpsstop called from initial with opening ext & & boundary file ',1) ELSE IF( ireturn == 3 ) THEN WRITE (6,'(a/a)') & 'Read errors in the external boundary data file. Dump the', & 'history file and restart file and then STOP the model.' CALL arpsstop('arpsstop called from initial with reading ext & & boundary file ',1) ELSE IF( ireturn /= 0 ) THEN WRITE (6,'(a/a)') & 'Other errors in getting the external boundary data. Dump the', & 'history file and restart file and then STOP the model.' CALL arpsstop('arpsstop called from initial with the ext & & boundary file ',1) END IF END IF ! !----------------------------------------------------------------------- ! ! Initialize nudging assimilation variables ! !----------------------------------------------------------------------- ! IF( nudgopt > 0 ) & CALL ininudge(nxndg,nyndg,nzndg, & uincr,vincr,wincr,pincr,ptincr,qvincr, & qcincr,qrincr,qiincr,qsincr,qhincr,ireturn) !----------------------------------------------------------------------- ! ! Initialize KF_ETA arrays and look-up tables. ! !----------------------------------------------------------------------- !KFY KF_ETA IF (cnvctopt == 5) THEN !...Now initialize KF_ETA look-up tables IF (initopt == 2 .or. initopt == 4) THEN restart = .TRUE. ELSE restart = .FALSE. END IF CALL interface_wrf_kfinit(nx,ny,nz,nca,restart) END IF ! IF (cnvctopt == 5) THEN !KFY KF_ETA END !----------------------------------------------------------------------- ! ! Initialize BMJ arrays and look-up tables. ! !----------------------------------------------------------------------- !EMK BMJ IF (cnvctopt == 4) THEN DO j = 1,ny-1 DO i = 1,nx-1 IF (vegtyp(i,j) == vegwaterflag) THEN xland(i,j) = xland_waterflag ELSE xland(i,j) = xland_landflag END IF END DO ! DO i = 1,nx END DO ! DO j = 1,ny !...Now initialize BMJ look-up tables IF (initopt == 2 .or. initopt == 4) THEN restart = .TRUE. ELSE restart = .FALSE. END IF CALL interface_wrf_bmjinit(nx,ny,nz,cldefi,restart) END IF ! IF (cnvctopt == 4) THEN !EMK END ! !----------------------------------------------------------------------- ! ! End of model initialization. ! !----------------------------------------------------------------------- ! RETURN END SUBROUTINE initial ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE INIGRD ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE inigrd(nx,ny,nz,nzsoil,x,y,z,zp,zpsoil, & 7,18 hterain,mapfct,j1,j2,j3,j3soil, & j3soilinv,zp1d,dzp1d,tem1) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Initialize the model grid variables. ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! 3/17/1991. ! ! MODIFICATION HISTORY: ! ! 5/02/92 (M. Xue) ! Added full documentation. ! ! 5/03/92 (M. Xue) ! Further documentation. ! ! 4/10/93 (M. Xue & Hao Jin) ! Add the terrain. ! ! 9/10/94 (Weygandt & Y. Lu) ! Cleaned up documentation. ! ! 12/22/94 (Yuhe Liu) ! Changed variable tuning, which was hard wired inside this ! subroutine, to strhtune, which is input from namelist input file. ! ! 1/22/96 (Donghai Wang & Yuhe Liu) ! Added the map projection factor to ARPS governing equations. ! ! 11/06/97 (D. Weber) ! Added three additional levels to the mapfct array. The three ! levels (4,5,6) represent the inverse of the first three in order. ! The inverse map factors are computed to improve efficiency. ! ! 2000/04/11 (Gene Bassett) ! Only update the terrain data with a call to BCS2D for ternopt=1. ! ! 05/02/2002 (Dan Weber and Jerry Brotzge) ! Added zpsoil, j3soil, variables for OUSOIL. ! !----------------------------------------------------------------------- ! ! INPUT : ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! nzsoil Number of grid points in the soil model in the -z-direction ! ! OUTPUT: ! ! 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 grid points in the soil model ! in physical space (m). ! hterain Terrain height (m) ! mapfct Map factors at scalar, u and v points ! ! j1 Coordinate transformation Jacobian -d(zp)/dx ! j2 Coordinate transformation Jacobian -d(zp)/dy ! j3 Coordinate transformation Jacobian d(zp)/dz ! j3soil Soil coordinate transformation Jacobian d(zpsoil)/dz ! j3soilinv Inverse of the soil coordinate transformation j3soil ! ! WORK ARRAY: ! ! zp1d Temporary work array. ! dzp1d Temporary work array. ! tem1 Temporary work array. ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! The number of grid points in 3 directions INTEGER :: nzsoil ! Number of grid points in the -z-direction REAL :: x(nx) ! x-coord. of the physical and ! computational grid. Defined at u-point. REAL :: y(ny) ! y-coord. of the physical and ! computational grid. Defined at v-point. REAL :: z(nz) ! z-coord. of the computational grid. ! Defined at w-point on the staggered grid. REAL :: zsoil(nzsoil) ! z-coord. of the soil model computational grid. ! Defined at the center of a soil layer. REAL :: zp(nx,ny,nz) ! Physical height coordinate defined at ! w-point of the staggered grid. REAL :: zpsoil (nx,ny,nzsoil) ! The physical height coordinate defined ! at the center of a soil layer(m). REAL :: j1(nx,ny,nz) ! Coordinate transformation Jacobian ! -d(zp)/dx. REAL :: j2(nx,ny,nz) ! Coordinate transformation Jacobian ! -d(zp)/dy. REAL :: j3(nx,ny,nz) ! Coordinate transformation Jacobian ! d(zp)/dz. REAL :: j3soil (nx,ny,nzsoil) ! Coordinate transformation Jacobian ! defined as d( zpsoil )/d( zsoil ). REAL :: j3soilinv(nx,ny,nzsoil) ! Inverse of J3soil. REAL :: hterain(nx,ny) ! Terrain height. REAL :: mapfct(nx,ny,8) ! Map factors at scalar, u and v points REAL :: zp1d (nz) ! Temporary array REAL :: dzp1d(nz) ! Temporary array REAL :: tem1(nx,ny,nz) ! Temporary array ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k REAL :: xs, ys, zs, radnd, pi2 REAL :: zflat1,z1,z2 REAL :: zpmax ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'grid.inc' ! Grid & map parameters. INCLUDE 'phycst.inc' INCLUDE 'bndry.inc' INCLUDE 'mp.inc' ! Message passing parameters. !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Define a uniform model grid. ! !----------------------------------------------------------------------- ! CALL setgrd ( nx,ny, x,y ) ! !----------------------------------------------------------------------- ! ! Set map factor at scalar, u, and v points ! !----------------------------------------------------------------------- ! IF ( mpfctopt /= 0 ) THEN DO j=1,ny-1 DO i=1,nx-1 xs = 0.5*(x(i)+x(i+1)) ys = 0.5*(y(j)+y(j+1)) CALL xytomf( 1,1,xs,ys,mapfct(i,j,1) ) IF(maptest == 1)THEN ! set up a symmetric field... mapfct(i,j,1) = 1.0 + ABS((xs-0.5*(x(1)+x(nx))) & /(x(nx)-x(1)) & +(ys-0.5*(y(1)+y(ny))) & /(y(ny)-y(1))) END IF mapfct(i,j,4) = 1.0/mapfct(i,j,1) mapfct(i,j,7) = mapfct(i,j,1)*mapfct(i,j,1) mapfct(i,j,8) = 0.25*mapfct(i,j,1) ! for use in sovlwpim ! and wcontra... END DO END DO DO j=1,ny-1 DO i=1,nx ys = 0.5*(y(j)+y(j+1)) CALL xytomf( 1,1,x(i),ys,mapfct(i,j,2) ) IF(maptest == 1)THEN ! set up a symmetric field... mapfct(i,j,2) = 1.0 + ABS((x(i)-0.5*(x(1)+x(nx))) & /(x(nx)-x(1)) & +(ys-0.5*(y(1)+y(ny))) & /(y(ny)-y(1))) END IF mapfct(i,j,5) = 1.0/mapfct(i,j,2) END DO END DO DO j=1,ny DO i=1,nx-1 xs = 0.5*(x(i)+x(i+1)) CALL xytomf( 1,1,xs,y(j),mapfct(i,j,3) ) IF(maptest == 1)THEN ! set up a symmetric field... mapfct(i,j,3) = 1.0 + ABS((xs-0.5*(x(1)+x(nx))) & /(x(nx)-x(1)) & +(y(j)-0.5*(y(1)+y(ny))) & /(y(ny)-y(1))) END IF mapfct(i,j,6) = 1.0/mapfct(i,j,3) END DO END DO ELSE DO k=1,7 DO j=1,ny DO i=1,nx mapfct(i,j,k) = 1.0 mapfct(i,j,8) = 0.25 END DO END DO END DO END IF ! !----------------------------------------------------------------------- ! ! Print map factor at scalar, u, and v points for the purpose of ! debug ! !----------------------------------------------------------------------- ! ! CALL getunit( mpunit ) ! CALL asnctl ('NEWLOCAL', 1, ierr) ! CALL asnfile('mapfactor.data', '-F f77 -N ieee', ierr) ! ! OPEN (mpunit,file='mapfactor.data',form='unformatted') ! ! CALL edgfill(mapfct(1,1,1),1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) ! write(mpunit) ((mapfct(i,j,1),i=1,nx),j=1,ny) ! ! CALL edgfill(mapfct(1,1,2),1,nx,1,nx, 1,ny,1,ny-1, 1,1,1,1) ! write(mpunit) ((mapfct(i,j,2),i=1,nx),j=1,ny) ! ! CALL edgfill(mapfct(1,1,3),1,nx,1,nx-1, 1,ny,1,ny, 1,1,1,1) ! write(mpunit) ((mapfct(i,j,3),i=1,nx),j=1,ny) ! ! CLOSE( mpunit ) ! CALL retunit( mpunit ) ! !----------------------------------------------------------------------- ! ! End of debug print. ! !----------------------------------------------------------------------- ! DO k=1,nz z(k) = zrefsfc + (k-2) * dz END DO ! !----------------------------------------------------------------------- ! ! Specify the terrain ! !----------------------------------------------------------------------- ! IF( ternopt == 0 ) THEN ! No terrain, the ground is flat DO j=1,ny-1 DO i=1,nx-1 hterain(i,j) = zrefsfc END DO END DO ELSE IF( ternopt == 1 ) THEN ! Bell-shaped mountain ! !----------------------------------------------------------------------- ! ! Define the bell-shaped mountain ! !----------------------------------------------------------------------- ! pi2 = 1.5707963267949 DO j=1,ny-1 DO i=1,nx-1 xs = (x(i)+x(i+1))*0.5 ys = (y(j)+y(j+1))*0.5 zs = z(2) IF( mntwidy < 0.0 .OR. runmod == 2 ) THEN ! 2-d terrain in x-z plane. radnd = 1.0+((xs-mntctrx)/mntwidx)**2 ELSE IF( mntwidx < 0.0 .OR. runmod == 3 ) THEN ! 2-d terrain in y-z plane. radnd = 1.0+((ys-mntctry)/mntwidy)**2 ELSE ! 3-d terrain radnd = 1.0+((xs-mntctrx)/mntwidx)**2 & +((ys-mntctry)/mntwidy)**2 END IF hterain(i,j) = zrefsfc + hmount/radnd END DO END DO ! !----------------------------------------------------------------------- ! ! Make sure that the terrain satisfies the specified boundary ! conditions. ! !----------------------------------------------------------------------- ! IF (mp_opt > 0) THEN CALL acct_interrupt(mp_acct) CALL mpsendrecv1dew(hterain,nx,ny,ebc,wbc,0,tem1) CALL mpsendrecv1dns(hterain,nx,ny,nbc,sbc,0,tem1) END IF CALL acct_interrupt(bc_acct) CALL bcs2d(nx,ny,hterain, ebc,wbc,nbc,sbc) CALL acct_stop_inter ELSE IF( ternopt == 2 ) THEN ! Read from terrain data base ! !----------------------------------------------------------------------- ! ! Read in the terrain data. ! !----------------------------------------------------------------------- ! ! blocking inserted for ordering i/o for message passing DO i=0,nprocs-1,readstride IF(myproc >= i.AND.myproc <= i+readstride-1)THEN IF (mp_opt > 0 .AND. readsplit > 0) THEN CALL readsplittrn( nx,ny,dx,dy, terndta, & mapproj,trulat1,trulat2,trulon,sclfct,ctrlat,ctrlon, & hterain ) ELSE CALL readtrn( nx,ny,dx,dy, terndta, & mapproj,trulat1,trulat2,trulon,sclfct,ctrlat,ctrlon, & hterain ) END IF END IF IF (mp_opt > 0) CALL mpbarrier END DO END IF ! !----------------------------------------------------------------------- ! ! Set up a stretched vertical grid. ! ! For strhopt=1, function y = a+b*x**3 is used to specify dz as a ! function of k. ! For strhopt=2, function y = c + a*tanh(b*x) is used to specify dz ! as a function of k. ! !----------------------------------------------------------------------- ! IF ( strhopt == 0 ) THEN DO k=1,nz zp1d(k) = z(k) END DO ELSE IF ( strhopt == 1 .OR.strhopt == 2 ) THEN z1 = zrefsfc + MAX(0.0, MIN(dlayer1, z(nz-2)-zrefsfc )) z2 = z1 + MAX(0.0, MIN(dlayer2, z(nz-1)-z1 )) IF( dlayer1 >= (nz-3)*dzmin ) THEN WRITE(6,'(/1x,a,f13.3,/a,f13.3,a,a)') & 'Can not setup a vertical grid with uniform dz=',dzmin, & ' over the depth of ',dlayer1,' please specify a smaller ', & 'value of dlayer1. Program stopped INIGRD.' CALL arpsstop('arpsstop called from INIGRD with ther vertical grid ' & ,1) END IF CALL strhgrd(nz,strhopt,zrefsfc,z1,z2,z(nz-1), & dzmin,strhtune, zp1d,dzp1d) ELSE WRITE(6,'(1x,a,i3,a/)') & 'Invalid vertical grid stretching option, strhopt was ',strhopt, & '. Program stopped in INIGRD.' CALL arpsstop('arpsstop called from INIGRD with stretching ' ,1) END IF ! !----------------------------------------------------------------------- ! ! Physical height of computational grid defined as ! ! Zp=(z-zrefsfc)*(Zm-hterain)/(Zm-zrefsfc)+hterain for z=<Zm. ! ZP=z for z>Zm ! ! where Zm the height at which the grid levels becomes flat. ! Hm < Zm =< Ztop, hm is the height of mountain and Ztop the height ! of model top. ! !----------------------------------------------------------------------- ! DO k=nz-1,2,-1 IF(zp1d(k) <= zflat) THEN zflat1 = zp1d(k) EXIT END IF END DO zflat1=MAX(MIN(z(nz-1),zflat1),zrefsfc) DO k=2,nz-1 IF(zp1d(k) > zflat1) THEN DO j=1,ny-1 DO i=1,nx-1 zp(i,j,k)=zp1d(k) END DO END DO ELSE DO j=1,ny-1 DO i=1,nx-1 zp(i,j,k)=(zp1d(k)-zrefsfc)*(zflat1-hterain(i,j)) & /(zflat1-zrefsfc)+hterain(i,j) END DO END DO END IF END DO DO j=1,ny-1 DO i=1,nx-1 zp(i,j,2)=hterain(i,j) zp(i,j,1)=2.0*zp(i,j,2)-zp(i,j,3) zp(i,j,nz)=2.0*zp(i,j,nz-1)-zp(i,j,nz-2) END DO END DO ! !----------------------------------------------------------------------- ! ! Calculate transformation Jacobians J1, J2 and J3. ! !----------------------------------------------------------------------- ! CALL jacob(nx,ny,nz,x,y,z,zp,j1,j2,j3,tem1) CALL inisoilgrd(nx,ny,nzsoil,hterain,zpsoil,j3soil,j3soilinv) RETURN END SUBROUTINE inigrd ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE STRHGRD ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE strhgrd(nz,strhopt,z0,z1,z2,ztop,dzmin,strhtune, z,dzk) 3,1 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! To construct a vertically stretched grid. ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! 10/17/94. ! ! MODIFICATION HISTORY: ! ! 05/11/95 (Jinxing Zong and MX) ! ! A bug fix for the case of nonzero zrefsfc, the reference height of ! the surface. Results not affected for zrefsfc=0 (default value). ! !----------------------------------------------------------------------- ! ! ! INPUT: ! ! nz The vertical dimension of ARPS grid. ! ! ! OUTPUT: ! ! z Array containing the height of veritical grid levels. ! dzk Array containing the grid spacing between vertical levels ! !----------------------------------------------------------------------- IMPLICIT NONE INTEGER :: nz INTEGER :: strhopt REAL :: z0 REAL :: z1 REAL :: z2 REAL :: ztop REAL :: dzmin REAL :: strhtune REAL :: z (nz) REAL :: dzk (nz) REAL :: rnzh,dzm REAL :: a,b,c,hnew,zkmid,dzu INTEGER :: nzh,nzl,k REAL :: dz IF( (z1-z0) == (nz-3)*dzmin.AND.(z1-z0) == (ztop-z0) ) THEN dz = (ztop-z0)/(nz-3) DO k=1,nz-1 dzk(k)= dz END DO DO k=1,nz z(k)=z0 + (k-2) * dz END DO WRITE(6,'(/1x,a,f13.3,/a,f13.3)') & 'Layer 1 depth was as deep as the entire domain. i', & 'A uniform vertical grid is assumed with dz=',dz, & ' over the model depth of ',ztop-z0 RETURN END IF IF(z1 < z0) z1 = z0 IF(z2 > ztop) z2 = ztop nzl = (z1-z0)/dzmin IF( (z1-z0) >= (nz-3)*dzmin ) THEN WRITE(6,'(/1x,a,f13.3,/a,f13.3,a,a)') & 'Can not setup a vertical grid with uniform dz=',dzmin, & ' over the depth of ',z1-z0,' please specify a smaller', & ' value of dlayer1 ' CALL arpsstop('arpsstop called from STRHGRD with stretching ' ,1) END IF IF( z2 >= ztop ) THEN dzm = (ztop-z0-nzl*dzmin)/(nz-3-nzl) ! print*, nzl*dzmin + (nz-3-nzl)*dzm nzh = 0 dzu = 2*dzm - dzmin ELSE a = 2*(nz-3-nzl) b = 2*z0-ztop-z2-(nz-3-3*nzl)*dzmin c = dzmin*(z2-z0-nzl*dzmin) dzm = (-b + SQRT(b*b-4*a*c) )/(2*a) rnzh = (ztop-z2)/(2*dzm-dzmin) nzh = INT(rnzh) hnew = nzl*dzmin + nzh*(2*dzm-dzmin) + & (nz-3-nzl-nzh)*dzm + z0 IF( nzh /= 0 ) THEN dzu = (2*dzm-dzmin) + (ztop-hnew)/nzh ELSE IF( nz-3-nzl-nzh /= 0 ) THEN dzm = dzm + (ztop-hnew)/(nz-3-nzl-nzh) dzu = (2*dzm-dzmin) END IF END IF DO k=1,nzl+1 dzk(k)=dzmin END DO IF( strhopt == 1 ) THEN a = (dzm-dzmin) DO k=nzl+2,nz-2-nzh dzk(k)= dzm+a* & ((2.0*FLOAT(k-nzl-2)/FLOAT(nz-4-nzh-nzl)-1.0) )**3 END DO ELSE zkmid=0.5*FLOAT( nz-nzh+nzl) IF( nzl+2-zkmid == 0.0 ) THEN b = 0.0 ELSE b= strhtune* 2.0/(nzl+2-zkmid) END IF a=(dzmin-dzm)/TANH( strhtune* 2.0) DO k=nzl+2,nz-2-nzh dzk(k)=dzm + a*TANH(b*(FLOAT(k)-zkmid)) END DO END IF DO k=nz-2-nzh+1, nz-2 dzk(k)= dzu END DO dzk(nz-1) = dzk(nz-2) dzk(nz ) = dzk(nz-1) z(2) = z0 DO k=3,nz-1 z(k) = z(k-1)+dzk(k-1) END DO z(1) =z(2)-dzk(1) z(nz-1)=ztop z(nz)=z(nz-1)+dzk(nz-1) RETURN END SUBROUTINE strhgrd ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE INISOILGRD ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE inisoilgrd(nx,ny,nzsoil,hterain,zpsoil,j3soil,j3soilinv) 5 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! To construct the soil model grid and all associated variables. ! !----------------------------------------------------------------------- ! ! AUTHOR: Dan Weber ! 05/24/2002. ! ! MODIFICATION HISTORY: ! !----------------------------------------------------------------------- ! ! INPUT: ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nzsoil Number of grid points in the soil ! ! zp Vertical coordinate of grid points in physical space (m) ! ! OUTPUT: ! ! zpsoil Vertical coordinate of grid points in the soil (m) ! j3soil Coordinate transformation Jacobian d(zpsoil)/dz ! j3soilinv Inverse of the coordinate transformation Jacobian d(zpsoil)/dz ! !----------------------------------------------------------------------- IMPLICIT NONE ! ! INPUT ! INTEGER :: nx ! Number of grid points in the x-direction INTEGER :: ny ! Number of grid points in the y-direction INTEGER :: nzsoil ! Number of grid points in the -z-direction REAL :: hterain(nx,ny) ! The terrain height in meters. ! ! OUTPUT ! REAL :: zpsoil (nx,ny,nzsoil) ! The physical height coordinate defined at ! w-point of the soil. REAL :: j3soil(nx,ny,nzsoil) ! Coordinate transformation Jacobian d(zp)/d(z) REAL :: j3soilinv (nx,ny,nzsoil) ! Inverse of Soil coord. trans (1.0/j3soil). ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! include 'grid.inc' ! !----------------------------------------------------------------------- ! ! Miscellaneous local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Calculate the soil model grid variables: ! ! zsoil,zpsoil,j3soil,j3soilinv. ! !----------------------------------------------------------------------- ! ! Following ARPS convention, ! Set zsoil at velocity points or at the top of each soil layer..... ! IF(soilstrhopt == 0)THEN ! set up soil model without a stretched grid.. DO k = 1,nzsoil DO j = 1,ny DO i = 1,nx zpsoil(i,j,k) = hterain(i,j) - (k-1)*dzsoil j3soil(i,j,k) = 1.0 j3soilinv(i,j,k) = 1.0 END DO END DO END DO ELSEIF(soilstrhopt == 1)THEN ! DO k = 2,nzsoil ! zsoil(k) = zrefsfc - (k-1)*dzsoil ! END DO !----------------------------------------------------------------------- ! ! Physical height of soil model computational grid defined as ! ! Zpsoil=(zsoil-zrefsfc)*(Zm-hterain)/(Zm-zrefsfc)+hterain for zsoil=<Zm. ! ZPsoil=zsoil for zsoil>Zm ! ! where Zm the height at which the grid levels becomes flat. ! Hm < Zm =< Ztop, hm is the height of mountain and Ztop the height ! of model top. ! !----------------------------------------------------------------------- ! ! DO k=nzsoil-1,2,-1 ! IF(zp1dsoil(k) <= zflatsoil) THEN ! zflat1soil = zp1dsoil(k) ! EXIT ! END IF ! END DO ! zflat1soil=MAX(MIN(zsoil(nz-1),zflat1soil),zrefsfc) ! DO k=2,nzsoil-1 ! IF(zp1dsoil(k) > zflat1soil) THEN ! DO j=1,ny-1 ! DO i=1,nx-1 ! zpsoil(i,j,k)=zp1dsoil(k) ! END DO ! END DO ! ELSE ! DO j=1,ny-1 ! DO i=1,nx-1 ! zpsoil(i,j,k)=(zp1dsoil(k)-zrefsfc)*(zflat1soil-hterain(i,j)) & ! /(zflat1soil-zrefsfc)+hterain(i,j) ! END DO ! END DO ! END IF ! END DO ! old code.. ! DO k = 2,nzsoil ! zsoil(k) = zrefsfc - (k-2)*dzsoil ! zpsoil(i,j,k) = hterain(i,j) - (k-1)*dzsoil ! END DO ! jerry's code note zpsoil is set to the top of each layer. ! question why are we using positive values? need to use zrefsfc... and ! the existing coordinate system... ! zpsoil (1) = 0.0 ! DO k=2,nzsoil ! set zpsoil !! zpsoil(k) = zpsoil(k-1) - dzsoil * k ! zpsoil(k) = zpsoil(k-1) + dzsoil !(positive values) ! END DO ! done setting zpsoil ! DO k=1,nzsoil ! j3soil(k) = 1.0 ! END DO ! arps code starts here. ! IF( (z1-z0) == (nz-3)*dzmin.AND.(z1-z0) == (ztop-z0) ) THEN !! dz = (ztop-z0)/(nz-3) ! DO k=1,nz-1 ! dzk(k)= dz ! END DO ! DO k=1,nz ! z(k)=z0 + (k-2) * dz ! END DO ! WRITE(6,'(/1x,a,f13.3,/a,f13.3)') & ! 'Layer 1 depth was as deep as the entire domain. i', & ! 'A uniform vertical grid is assumed with dz=',dz, & ! ' over the model depth of ',ztop-z0 ! RETURN ! END IF ! IF(z1 < z0) z1 = z0 ! IF(z2 > ztop) z2 = ztop ! nzl = (z1-z0)/dzmin ! IF( (z1-z0) >= (nz-3)*dzmin ) THEN ! WRITE(6,'(/1x,a,f13.3,/a,f13.3,a,a)') & ! 'Can not setup a vertical grid with uniform dz=',dzmin, & ! ' over the depth of ',z1-z0,' please specify a smaller', & ! ' value of dlayer1 ' ! CALL arpsstop('arpsstop called from STRHGRD with stretching ' ,1) ! END IF ! IF( z2 >= ztop ) THEN ! dzm = (ztop-z0-nzl*dzmin)/(nz-3-nzl) ! print*, nzl*dzmin + (nz-3-nzl)*dzm ! nzh = 0 ! dzu = 2*dzm - dzmin ! ELSE ! a = 2*(nz-3-nzl) ! b = 2*z0-ztop-z2-(nz-3-3*nzl)*dzmin ! c = dzmin*(z2-z0-nzl*dzmin) ! dzm = (-b + SQRT(b*b-4*a*c) )/(2*a) ! rnzh = (ztop-z2)/(2*dzm-dzmin) ! nzh = INT(rnzh) ! hnew = nzl*dzmin + nzh*(2*dzm-dzmin) + & ! (nz-3-nzl-nzh)*dzm + z0 ! IF( nzh /= 0 ) THEN ! dzu = (2*dzm-dzmin) + (ztop-hnew)/nzh ! ELSE IF( nz-3-nzl-nzh /= 0 ) THEN ! dzm = dzm + (ztop-hnew)/(nz-3-nzl-nzh) ! dzu = (2*dzm-dzmin) ! END IF ! END IF ! DO k=1,nzl+1 ! dzk(k)=dzmin ! END DO ! IF( strhopt == 1 ) THEN ! a = (dzm-dzmin) ! DO k=nzl+2,nz-2-nzh ! dzk(k)= dzm+a* & ! ((2.0*FLOAT(k-nzl-2)/FLOAT(nz-4-nzh-nzl)-1.0) )**3 ! END DO ! ELSE ! zkmid=0.5*FLOAT( nz-nzh+nzl) ! IF( nzl+2-zkmid == 0.0 ) THEN ! b = 0.0 ! ELSE ! b= strhtune* 2.0/(nzl+2-zkmid) ! END IF ! a=(dzmin-dzm)/TANH( strhtune* 2.0) ! DO k=nzl+2,nz-2-nzh ! dzk(k)=dzm + a*TANH(b*(FLOAT(k)-zkmid)) ! END DO ! END IF ! DO k=nz-2-nzh+1, nz-2 ! dzk(k)= dzu ! END DO ! dzk(nz-1) = dzk(nz-2) ! dzk(nz ) = dzk(nz-1) ! z(2) = z0 ! DO k=3,nz-1 ! z(k) = z(k-1)+dzk(k-1) ! END DO ! z(1) =z(2)-dzk(1) ! z(nz-1)=ztop ! z(nz)=z(nz-1)+dzk(nz-1) END IF ! end of soilstrhopt if block ! soil grid variables are set. RETURN END SUBROUTINE inisoilgrd ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE JACOB ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE jacob(nx,ny,nz,x,y,z,zp,j1,j2,j3,mp_tem) 7,8 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Calculate transformation Jacobians J1, J2 and J3. ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! 3/17/1991. ! ! MODIFICATION HISTORY: ! ! 4/10/93 (M. Xue & Hao Jin) ! Add the terrain. ! ! 9/2/94 (M. Xue) ! Loop 710 that resets j2 on north and south boundary to ! zero gradient deleted. It shouldn't have been there. ! ! 9/10/94 (Weygandt & Y. Lu) ! Cleaned up documentation. ! !----------------------------------------------------------------------- ! ! INPUT : ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! ! OUTPUT: ! ! 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) ! ! j1 Coordinate transformation Jacobian -d(zp)/dx ! j2 Coordinate transformation Jacobian -d(zp)/dy ! j3 Coordinate transformation Jacobian d(zp)/dz ! ! WORK ARRAY: ! ! mp_tem Used for message passing, NOTE: the shape of this array ! may different from that in real paramenter. ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! The number of grid points in 3 directions REAL :: x(nx) ! x-coord. of the physical and ! computational grid. Defined at u-point. REAL :: y(ny) ! y-coord. of the physical and ! computational grid. Defined at v-point. REAL :: z(nz) ! z-coord. of the computational grid. ! Defined at w-point on the staggered grid. REAL :: zp(nx,ny,nz) ! the physical height coordinate defined at ! w-point of the staggered grid. REAL :: j1(nx,ny,nz) ! Coordinate transformation Jacobian ! -d(zp)/dx. REAL :: j2(nx,ny,nz) ! Coordinate transformation Jacobian ! -d(zp)/dy. REAL :: j3(nx,ny,nz) ! Coordinate transformation Jacobian ! d(zp)/dz. REAL :: mp_tem(nx,ny,nz) ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k INTEGER :: istat ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'bndry.inc' INCLUDE 'globcst.inc' INCLUDE 'mp.inc' ! Message passing parameters. ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! IF (mp_opt > 0) THEN ! ALLOCATE (mp_tem(MAX(nx,ny)*nz),stat=istat) ! IF (istat /= 0) THEN ! CALL arpsstop ("arpsstop called from JACOB: ERROR allocating mp_tem" & ! ,1) ! END IF ! END IF ! !----------------------------------------------------------------------- ! ! Calculate transformation Jacobian J1 defined as -del(zp)/del(x) ! !----------------------------------------------------------------------- ! DO k=1,nz DO j=1,ny-1 DO i=2,nx-1 j1(i,j,k) = -2 * (zp(i,j,k)-zp(i-1,j,k)) / (x(i+1)-x(i-1)) END DO END DO END DO ! !----------------------------------------------------------------------- ! ! X - boundary conditions of j1 ! !----------------------------------------------------------------------- ! IF (mp_opt > 0) THEN CALL acct_interrupt(mp_acct) CALL mpsendrecv2dew(j1,nx,ny,nz,ebc,wbc,1,mp_tem) END IF CALL acct_interrupt(bc_acct) IF(wbc == 1) THEN ! Rigid wall boundary condition DO k=1,nz DO j=1,ny-1 j1( 1,j,k)=j1( 3 ,j,k) END DO END DO ELSE IF(wbc == 2) THEN ! Periodic boundary condition. IF(mp_opt == 0) THEN DO k=1,nz DO j=1,ny-1 j1( 1,j,k)=j1(nx-2,j,k) END DO END DO END IF ELSE IF(wbc /= 0) THEN DO k=1,nz DO j=1,ny-1 j1( 1,j,k)=j1( 2 ,j,k) END DO END DO END IF IF(ebc == 1) THEN ! Rigid wall boundary condition DO k=1,nz DO j=1,ny-1 j1(nx,j,k)=j1(nx-2,j,k) END DO END DO ELSE IF(ebc == 2) THEN ! Periodic boundary condition. IF(mp_opt == 0) THEN DO k=1,nz DO j=1,ny-1 j1(nx,j,k)=j1( 3 ,j,k) END DO END DO END IF ELSE IF(ebc /= 0) THEN DO k=1,nz DO j=1,ny-1 j1(nx,j,k)=j1(nx-1,j,k) END DO END DO END IF DO k=1,nz DO i=1,nx j1(i,ny,k) = j1(i,ny-1,k) END DO END DO CALL acct_stop_inter ! !----------------------------------------------------------------------- ! ! Calculate transformation Jacobian J2 defined as -del(zp)/del(y) ! !----------------------------------------------------------------------- ! DO k=1,nz DO i=1,nx-1 DO j=2,ny-1 j2(i,j,k) = -2 * (zp(i,j,k)-zp(i,j-1,k)) / (y(j+1)-y(j-1)) END DO END DO END DO ! !----------------------------------------------------------------------- ! ! Y - boundary conditions of j2 ! !----------------------------------------------------------------------- ! IF (mp_opt > 0) THEN CALL acct_interrupt(mp_acct) CALL mpsendrecv2dns(j2,nx,ny,nz,nbc,sbc,2,mp_tem) END IF CALL acct_interrupt(bc_acct) IF(sbc == 1) THEN ! Rigid wall boundary condition DO k=1,nz DO i=1,nx-1 j2(i, 1,k)=j2(i, 3 ,k) END DO END DO ELSE IF(sbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO k=1,nz DO i=1,nx-1 j2(i, 1,k)=j2(i,ny-2,k) END DO END DO END IF ELSE IF(sbc /= 0) THEN DO k=1,nz DO i=1,nx-1 j2(i, 1,k)=j2(i, 2 ,k) END DO END DO END IF IF(nbc == 1) THEN ! Rigid wall boundary condition DO k=1,nz DO i=1,nx-1 j2(i,ny,k)=j2(i,ny-2,k) END DO END DO ELSE IF(nbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO k=1,nz DO i=1,nx-1 j2(i,ny,k)=j2(i, 3 ,k) END DO END DO END IF ELSE IF(nbc /= 0) THEN DO k=1,nz DO i=1,nx-1 j2(i,ny,k)=j2(i,ny-1,k) END DO END DO END IF DO k=1,nz DO j=1,ny j2(nx,j,k) = j2(nx-1,j,k) END DO END DO CALL acct_stop_inter ! !----------------------------------------------------------------------- ! ! Calculate transformation Jacobian J3 defined as del(zp)/del(z) ! !----------------------------------------------------------------------- ! DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 j3(i,j,k) = (zp(i,j,k+1)-zp(i,j,k))/(z(k+1)-z(k)) END DO END DO END DO DO k=1,nz-1 DO j=1,ny-1 j3(nx,j,k) = j3(nx-1,j,k) END DO END DO DO k=1,nz-1 DO i=1,nx j3(i,ny,k) = j3(i,ny-1,k) END DO END DO DO j=1,ny DO i=1,nx j3(i,j,nz) = j3(i,j,nz-1) END DO END DO ! IF (mp_opt > 0) THEN ! DEALLOCATE (mp_tem,stat=istat) ! END IF RETURN END SUBROUTINE jacob ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE INITGRDVAR ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE initgrdvar(nx,ny,nz,nzsoil,nts,nstyps,exbcbufsz, & 4,46 x,y,z,zp,zpsoil,hterain,mapfct, & j1,j2,j3,j3soil,aj3x,aj3y,aj3z,j3inv,j3soilinv, & u,v,w,wcont,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke, & udteb, udtwb, vdtnb, vdtsb, & pdteb,pdtwb ,pdtnb ,pdtsb, & trigs1,trigs2,ifax1,ifax2, & wsave1,wsave2,vwork1,vwork2, & ubar,vbar,ptbar,pbar,ptbari,pbari, & rhostr,rhostri,qvbar,ppi,csndsq, & soiltyp,stypfrct,vegtyp,lai,roufns,veg, & tsoil,qsoil,wetcanp,snowdpth,qvsfc, & ptcumsrc,qcumsrc,w0avg,nca,kfraincv, & cldefi,xland,bmjraincv, & raing,rainc,prcrate,exbcbuf, & radfrc,radsw,rnflx,radswnet,radlwin, & usflx,vsflx,ptsflx,qvsflx, & tem1soil,tem2soil,tem3soil,tem4soil,tem5soil, & tem1,tem2,tem3,tem4,tem5, & tem6,tem7,tem8,tem9) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Initialize the model array variables. ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! 3/17/1992. ! ! MODIFICATION HISTORY: ! ! 5/02/92 (M. Xue) ! Added full documentation. ! ! 5/03/92 (M. Xue) ! Further documentation. ! ! 10/7/1992 (M. Xue) ! Added call to subroutine extinit, the option three of ! initialization. ! ! 9/10/94 (Weygandt & Y. Lu) ! Cleaned up documentation. ! ! 02/07/1995 (Yuhe Liu) ! Added a new 2-D permanent array, veg(nx,ny), to the argument list ! ! 10/31/95 (D. Weber) ! Added trigs1,trigs2,ifax1,ifax2 for use in the fft code for the ! upper radiation condition. ! ! 1/22/96 (Donghai Wang & Yuhe Liu) ! Added the map projection factor to ARPS governing equations. ! ! 07/22/97 (D. Weber) ! Added wsave1,wsave2,vwork1,vwork2 for use in the even fft version ! of the upper w-p radiation condition (fftopt=2). ! ! 08/01/97 (Zonghui Huo) ! Added Kain-fritsch cumulus parameterization scheme. ! ! 11/06/97 (D. Weber) ! Added three additional levels to the mapfct array. The three ! levels (4,5,6) represent the inverse of the first three in order. ! The inverse map factors are computed to improve efficiency. ! ! 12/05/97 (K. Brewster) ! Added argument, nt, so that routines that do not require more ! than one time level can be initialized using less memory. ! ! 4/15/1998 (Donghai Wang) ! Added the source terms to the right hand terms of the qc,qr,qi,qs ! equations due to the K-F cumulus parameterization. ! ! 4/15/1998 (Donghai Wang) ! Added the running average vertical velocity (array w0avg) ! for the K-F cumulus parameterization scheme. ! ! 11/18/98 (Keith Brewster) ! Changed pibar to ppi (full pi). ! ! 12/09/1998 (Donghai Wang) ! Added the snow cover. ! ! 11/06/2001 (Yunheng Wang) ! Added mpupdatei calling for ict/icb to solve radiation forcing ! difference for MPI run. ! ! 2002/02/28 (Gene Bassett) ! Replaced mpupdatei for ict/icb to a call to mpmax0. ! ! 13 March 2002 (Eric Kemp) ! Added arrays for WRF BMJ cumulus scheme. ! ! 04/10/2002 (Yunheng Wang) ! Subsituted mpupdatei calls for mpmax0 calls again ! because mpmax0 calls were not correct. ! ! 05/18/2002 (Dan Weber and Jerry Brotzge) ! Added new soil model variables. ! !----------------------------------------------------------------------- ! ! ! INPUT: ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! nts Number of time levels to be initialized. ! ! 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 grid points in the soil model ! in physical space (m). ! hterain The height of terrain (m) ! ! mapfct Map factors at scalar, u and v points ! ! j1 Coordinate transformation Jacobian -d(zp)/dx ! j2 Coordinate transformation Jacobian -d(zp)/dy ! j3 Coordinate transformation Jacobian d(zp)/dz ! j3soil Soil coordinate transformation Jacobian d(zpsoil)/dz ! aj3x Avgx of the coordinate transformation Jacobian d(zp)/dz ! aj3y Avgy of the coordinate transformation Jacobian d(zp)/dz ! aj3z Avgz of the coordinate transformation Jacobian d(zp)/dz ! j3soilinv Inverse of the soil coordinate transformation j3soil ! ! trigs1 Array containing pre-computed trig function for fftopt=1. ! trigs1 Array containing pre-computed trig function for fftopt=1. ! ifax1 Array containing the factors of nx for fftopt=1. ! ifax2 Array containing the factors of ny for fftopt=1. ! ! vwork1 2-D work array for fftopt=2. ! vwork2 2-D work array for fftopt=2. ! wsave1 Work array for fftopt=2. ! wsave2 Work array for fftopt=2. ! ! OUTPUT: ! ! u x component of velocity at all time levels (m/s) ! v y component of velocity at all time levels (m/s) ! w Vertical component of Cartesian velocity ! at all time levels (m/s) ! wcont Contravariant vertical velocity (m/s) ! ptprt Perturbation potential temperature at all time levels ! (K) ! pprt Perturbation pressure at all time levels (Pascal) ! qv Water vapor specific humidity at all time levels ! (kg/kg) ! qc Cloud water mixing ratio at all time levels (kg/kg) ! qr Rainwater mixing ratio at all time levels (kg/kg) ! qi Cloud ice mixing ratio at all time levels (kg/kg) ! qs Snow mixing ratio at all time levels (kg/kg) ! qh Hail mixing ratio at all time levels (kg/kg) ! tke Turbulent Kinetic Energy ((m/s)**2) ! ! udteb Time tendency of u field at east boundary (m/s**2) ! udtwb Time tendency of u field at west boundary (m/s**2) ! ! vdtnb Time tendency of v field at north boundary (m/s**2) ! vdtsb Time tendency of v field at south boundary (m/s**2) ! ! pdteb Time tendency of pprt field at east boundary (PASCAL/s) ! pdtwb Time tendency of pprt field at west boundary (PASCAL/s) ! pdtnb Time tendency of pprt field at north boundary ! (PASCAL/s) ! pdtsb Time tendency of pprt field at south boundary ! (PASCAL/s) ! ! ubar Base state zonal velocity component (m/s) ! vbar Base state meridional velocity component (m/s) ! ptbar Base state potential temperature (K) ! pbar Base state pressure (Pascal) ! ptbari Inverse Base state potential temperature (K) ! pbari Inverse Base state pressure (Pascal) ! rhostr Base state density rhobar times j3 (kg/m**3) ! rhostri Inverse base state density rhobar times j3 (kg/m**3) ! qvbar Base state water vapor specific humidity (kg/kg) ! ppi Exner function. ! csndsq Sound wave speed squared. ! ! soiltyp Soil type ! vegtyp Vegetation type ! lai Leaf Area Index ! roufns Surface roughness ! veg Vegetation fraction ! ! tsoil Soil temperature (K) ! qsoil Soil moisture (m**3/m**3) ! wetcanp Canopy water amount ! snowdpth Snow depth (m) ! qvsfc Effective S.H. at sfc. ! ! ptcumsrc Source term in pt-equation due to cumulus parameterization ! qcumsrc Source term in water equations due to cumulus parameterization ! kfraincv K-F convective rainfall (cm) ! nca K-F counter for CAPE release ! cldefi BMJ cloud efficiency ! xland BMJ land/sea mask ! bmjraincv BMJ convective rainfall (cm) ! ! radfrc Radiation forcing (K) ! radsw Solar radiation reaching the surface ! rnflx Net absorbed radiation by the surface ! radswnet Net shortwave radiation ! radlwin Incoming longwave radiation ! ! raing Grid supersaturation rain ! rainc Cumulus convective rain ! ! WORK ARRAYS: ! ! tem1soil Soil model temporary work array. ! tem2soil Soil model temporary work array. ! tem3soil Soil model temporary work array. ! tem4soil Soil model temporary work array. ! tem5soil Soil model temporary work array. ! ! tem1 Temporary work array. ! tem2 Temporary work array. ! tem3 Temporary work array. ! tem4 Temporary work array. ! tem5 Temporary work array. ! tem6 Temporary work array. ! tem7 Temporary work array. ! tem8 Temporary work array. ! tem9 Temporary work array. ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nts ! Number of time levels to be initialized. INTEGER :: tpast ! Index of time level for the past time. INTEGER :: tpresent ! Index of time level for the present ! time. INTEGER :: tfuture ! Index of time level for the future ! time. INTEGER :: nx,ny,nz ! The number of grid points in 3 ! directions INTEGER :: nzsoil ! Number of grid points in the -z direction REAL :: x (nx) ! x-coord. of the physical and compu- ! tational grid. Defined at u-point. REAL :: y (ny) ! y-coord. of the physical and compu- ! tational grid. Defined at v-point. REAL :: z (nz) ! z-coord. of the computational grid. ! Defined at w-point on the staggered ! grid. REAL :: zp (nx,ny,nz) ! Physical height coordinate defined at ! w-point of the staggered grid. REAL :: zpsoil(nx,ny,nzsoil) ! The physical height coordinate defined ! at the center of a soil layer(m). REAL :: hterain(nx,ny) ! The height of the terrain. REAL :: mapfct(nx,ny,8) ! Map factors at scalar, u and v points REAL :: j1 (nx,ny,nz) ! Coordinate transformation Jacobian ! defined as - d( zp )/d( x ). REAL :: j2 (nx,ny,nz) ! Coordinate transformation Jacobian ! defined as - d( zp )/d( y ). REAL :: j3 (nx,ny,nz) ! Coordinate transformation Jacobian ! defined as d( zp )/d( z ). REAL :: j3soil(nx,ny,nzsoil) ! Coordinate transformation Jacobian ! defined as d( zpsoil )/d( zsoil ). REAL :: aj3x (nx,ny,nz) ! Coordinate transformation Jacobian defined ! as d( zp )/d( z ) AVERAGED IN THE X-DIR. REAL :: aj3y (nx,ny,nz) ! Coordinate transformation Jacobian defined ! as d( zp )/d( z ) AVERAGED IN THE Y-DIR. REAL :: aj3z (nx,ny,nz) ! Coordinate transformation Jacobian defined ! as d( zp )/d( z ) AVERAGED IN THE Z-DIR. REAL :: j3inv (nx,ny,nz) ! Inverse of j3 REAL :: j3soilinv(nx,ny,nzsoil) ! Inverse of J3soil. REAL :: trigs1(3*(nx-1)/2+1) ! Array containing pre-computed trig ! function for fftopt=1. REAL :: trigs2(3*(ny-1)/2+1) ! Array containing pre-computed trig ! function for fftopt=1. INTEGER :: ifax1(13) ! Array containing the factors of nx for ! fftopt=1. INTEGER :: ifax2(13) ! Array containing the factors of ny for ! fftopt=1. REAL :: vwork1 (nx+1,ny+1) ! 2-D work array for fftopt=2. REAL :: vwork2 (ny,nx+1) ! 2-D work array for fftopt=2. REAL :: wsave1 (3*(ny-1)+15) ! Work array for fftopt=2. REAL :: wsave2 (3*(nx-1)+15) ! Work array for fftopt=2. REAL :: u (nx,ny,nz,nts) ! Total u-velocity (m/s) REAL :: v (nx,ny,nz,nts) ! Total v-velocity (m/s) REAL :: w (nx,ny,nz,nts) ! Total w-velocity (m/s) REAL :: wcont (nx,ny,nz) ! Contravariant vertical velocity (m/s) REAL :: ptprt (nx,ny,nz,nts) ! Perturbation potential temperature (K) REAL :: pprt (nx,ny,nz,nts) ! Perturbation pressure (Pascal) REAL :: qv (nx,ny,nz,nts) ! Water vapor specific humidity (kg/kg) REAL :: qc (nx,ny,nz,nts) ! Cloud water mixing ratio (kg/kg) REAL :: qr (nx,ny,nz,nts) ! Rain water mixing ratio (kg/kg) REAL :: qi (nx,ny,nz,nts) ! Cloud ice mixing ratio (kg/kg) REAL :: qs (nx,ny,nz,nts) ! Snow mixing ratio (kg/kg) REAL :: qh (nx,ny,nz,nts) ! Hail mixing ratio (kg/kg) REAL :: tke (nx,ny,nz,nts) ! Turbulent Kinetic Energy ((m/s)**2) REAL :: udteb (ny,nz) ! T-tendency of u at e-boundary (m/s**2) REAL :: udtwb (ny,nz) ! T-tendency of u at w-boundary (m/s**2) REAL :: vdtnb (nx,nz) ! T-tendency of v at n-boundary (m/s**2) REAL :: vdtsb (nx,nz) ! T-tendency of v at s-boundary (m/s**2) REAL :: pdteb (ny,nz) ! T-tendency of pprt at e-boundary ! (PASCAL/s) REAL :: pdtwb (ny,nz) ! T-tendency of pprt at w-boundary ! (PASCAL/s) REAL :: pdtnb (nx,nz) ! T-tendency of pprt at n-boundary ! (PASCAL/s) REAL :: pdtsb (nx,nz) ! T-tendency of pprt at s-boundary ! (PASCAL/s) REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s) REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s) REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K) REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal). REAL :: ptbari(nx,ny,nz) ! Inverse Base state pot. temperature (K) REAL :: pbari (nx,ny,nz) ! Inverse Base state pressure (Pascal). REAL :: rhostr(nx,ny,nz) ! Base state density rhobar times j3. REAL :: rhostri(nx,ny,nz) ! Inv. base state density rhobar times j3. REAL :: qvbar (nx,ny,nz) ! Base state water vapor specific ! humidity(kg/kg) REAL :: ppi (nx,ny,nz) ! Exner function. REAL :: csndsq(nx,ny,nz) ! Sound wave speed squared. INTEGER :: nstyps ! Number of soil types INTEGER :: soiltyp(nx,ny,nstyps) ! Soil types at grid points REAL :: stypfrct(nx,ny,nstyps) ! Fraction of soil types INTEGER :: vegtyp (nx,ny) ! Vegetation type REAL :: lai (nx,ny) ! Leaf Area Index REAL :: roufns (nx,ny) ! Surface roughness REAL :: veg (nx,ny) ! Vegetation fraction REAL :: qvsfc(nx,ny,0:nstyps) ! Effective qv at sfc. REAL :: tsoil(nx,ny,nzsoil,0:nstyps) ! Deep soil temperature (K) ! (in deep 1 m layer) REAL :: qsoil(nx,ny,nzsoil,0:nstyps) ! Surface soil moisture in the top ! 1 cm layer REAL :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount REAL :: snowdpth(nx,ny) ! Snow depth (m) REAL :: ptcumsrc(nx,ny,nz) ! Source term in pt-equation due ! to cumulus parameterization REAL :: qcumsrc(nx,ny,nz,5) ! Source term in water equations due ! to cumulus parameterization: ! qcumsrc(1,1,1,1) for qv equation ! qcumsrc(1,1,1,2) for qc equation ! qcumsrc(1,1,1,3) for qr equation ! qcumsrc(1,1,1,4) for qi equation ! qcumsrc(1,1,1,5) for qs equation REAL :: w0avg(nx,ny,nz) ! a closing running average vertical ! velocity in 10min for K-F scheme REAL :: kfraincv(nx,ny) ! K-F convective rainfall (cm) INTEGER :: nca(nx,ny) ! K-F counter for CAPE release !EMK BMJ REAL,INTENT(INOUT) :: cldefi(nx,ny) ! BMJ cloud efficiency REAL,INTENT(INOUT) :: xland(nx,ny) ! BMJ land mask ! (1.0 = land, 2.0 = sea) REAL,INTENT(INOUT) :: bmjraincv(nx,ny) ! BMJ convective rainfall (cm) !EMK END REAL :: radfrc(nx,ny,nz) ! Radiation forcing (K/s) REAL :: radsw (nx,ny) ! Solar radiation reaching the surface REAL :: rnflx (nx,ny) ! Net radiation flux absorbed by surface REAL :: radswnet(nx,ny) ! Net shortwave radiation REAL :: radlwin(nx,ny) ! Incoming longwave radiation REAL :: usflx (nx,ny) ! Surface flux of u-momentum (kg/(m*s**2)) REAL :: vsflx (nx,ny) ! Surface flux of v-momentum (kg/(m*s**2)) REAL :: ptsflx(nx,ny) ! Surface heat flux (K*kg/(m*s**2)) REAL :: qvsflx(nx,ny) ! Surface moisture flux (kg/(m**2*s)) REAL :: raing(nx,ny) ! Grid supersaturation rain REAL :: rainc(nx,ny) ! Cumulus convective rain REAL :: prcrate(nx,ny,4) ! precipitation rate (kg/(m**2*s)) ! prcrate(1,1,1) = total precipitation rate ! prcrate(1,1,2) = grid scale precip. rate ! prcrate(1,1,3) = cumulus precip. rate ! prcrate(1,1,4) = microphysics precip. rate INTEGER :: exbcbufsz ! EXBC buffer size REAL :: exbcbuf( exbcbufsz ) ! EXBC buffer array REAL :: tem1soil(nx,ny,nzsoil) ! Temporary soil model work array. REAL :: tem2soil(nx,ny,nzsoil) ! Temporary soil model work array. REAL :: tem3soil(nx,ny,nzsoil) ! Temporary soil model work array. REAL :: tem4soil(nx,ny,nzsoil) ! Temporary soil model work array. REAL :: tem5soil(nx,ny,nzsoil) ! Temporary soil model work array. REAL :: tem1 (nx,ny,nz) ! Temporary work array. REAL :: tem2 (nx,ny,nz) ! Temporary work array. REAL :: tem3 (nx,ny,nz) ! Temporary work array. REAL :: tem4 (nx,ny,nz) ! Temporary work array. REAL :: tem5 (nx,ny,nz) ! Temporary work array. REAL :: tem6 (nx,ny,nz) ! Temporary work array. REAL :: tem7 (nx,ny,nz) ! Temporary work array. REAL :: tem8 (nx,ny,nz) ! Temporary work array. REAL :: tem9 (nx,ny,nz) ! Temporary work array. ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k INTEGER :: iskip REAL :: temp REAL :: alatpro(2) REAL :: sclf REAL :: dxscl ! Model x-direction grid spacing ! normalized by the map scale ! dxscl=dx/sclf REAL :: dyscl ! Model y-direction grid spacing ! normalized by the map scale ! dyscl=dy/sclf REAL :: xs,ys, swx,swy, ctrx, ctry REAL zpmax REAL :: rmin,rmax ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'grid.inc' ! Grid & map parameters. INCLUDE 'bndry.inc' INCLUDE 'phycst.inc' INCLUDE 'mp.inc' ! Message passing parameters. ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! If initopt = 1, initialize the model fields using intialization ! routines. Typically from an analytical ! definition of initial perturbations. ! ! If initopt = 2, initialize the model fields from a restart file ! produced by a previous model run. ! ! If initopt = 3, initialize the model fields by reading in an ! external data file. ! ! If initopt = 4, initialize the model fields by reading in restart ! file first then an external data file. ! !----------------------------------------------------------------------- ! IF( nts > 1 ) THEN tpast=1 tpresent=2 tfuture=3 ELSE tpast=1 tpresent=1 tfuture=1 END IF IF( initopt == 1 ) THEN ! !----------------------------------------------------------------------- ! ! Initialization of model GRiD definition arrays. ! !----------------------------------------------------------------------- ! CALL inigrd(nx,ny,nz,nzsoil,x,y,z,zp,zpsoil, & hterain,mapfct,j1,j2,j3,j3soil, & j3soilinv,tem1,tem2,tem3) ! !----------------------------------------------------------------------- ! ! Define the base state atmospheric variables. ! !----------------------------------------------------------------------- ! ! IF ((inibasopt == 1) .AND. (max_fopen < nprocs)) THEN ! CALL wrtcomment("ERROR: for message passing version with "// & ! "inibasopt=1, max_fopen (in arps.input)",1) ! CALL arpsstop ("arpsstop called from initgrdvar due to nproc_x-y & ! & nproc_x*nproc_y (in arps.input).",1) ! END IF IF(inibasopt == 1) THEN iskip = nproc_x * nproc_y ELSE iskip = max_fopen END IF ! blocking inserted for ordering i/o for message passing DO i=0,nprocs-1,iskip IF(myproc >= i.AND.myproc <= i+iskip-1)THEN CALL inibase(nx,ny,nz, ubar,vbar,ptbar,pbar,ptbari,pbari, & rhostr,rhostri,qvbar, & x,y,z,zp,j3, tem1,tem2,tem3,tem4,tem5,tem6) END IF IF (mp_opt > 0) CALL mpbarrier END DO ! !----------------------------------------------------------------------- ! ! Initialize time dependent model variables. ! !----------------------------------------------------------------------- ! CALL initdvr(nx,ny,nz,nts, & ubar,vbar,ptbar,pbar,rhostr,qvbar, & x,y,z,zp,hterain, j1,j2,j3, & u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh, & ptcumsrc,qcumsrc,raing,rainc,prcrate,tem1) ! !----------------------------------------------------------------------- ! ! Set the time tendencies of u, v and pprt on the lateral boundaries ! to zero for the initial time step ! ! These tendencies will be used by lateral boundary condition options ! 4 and 5 only. ! !----------------------------------------------------------------------- ! DO k=1,nz DO j=1,ny udteb(j,k) = 0.0 udtwb(j,k) = 0.0 pdteb(j,k) = 0.0 pdtwb(j,k) = 0.0 END DO END DO DO k=1,nz DO i=1,nx vdtnb(i,k) = 0.0 vdtsb(i,k) = 0.0 pdtnb(i,k) = 0.0 pdtsb(i,k) = 0.0 END DO END DO ELSE IF( initopt == 2 .or. initopt == 4) THEN ! restart run ! !----------------------------------------------------------------------- ! ! Read in restart data from a restart file to initialize fields ! u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh at time tpast and tpresent, ! the base state variables ubar,vbar,ptbar,pbar,rhostr,qvbar, ! and the time tendencies of variables at the lateral boundries. ! ! Fields at tfuture are set to equal to those at tpresent. ! ! This subroutine also sets the value of tstart to the restart ! data time. The value from input file in over-written. ! !----------------------------------------------------------------------- ! IF(mp_opt >0 .AND. readsplit > 0) THEN CALL rstinsplit(nx,ny,nz,nzsoil,nts, nstyps, exbcbufsz, & u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke, & udteb, udtwb, vdtnb, vdtsb, & pdteb, pdtwb, pdtnb, pdtsb, & ubar,vbar,ptbar,pbar,rhostr,qvbar, & x,y,z,zp,zpsoil,hterain,mapfct,j1,j2,j3,j3soil, & soiltyp,stypfrct,vegtyp,lai,roufns,veg, & tsoil,qsoil,wetcanp,snowdpth,qvsfc, & ptcumsrc,qcumsrc,w0avg,nca,kfraincv, & cldefi,xland,bmjraincv, & radfrc,radsw,rnflx,radswnet,radlwin, & raing,rainc,prcrate,exbcbuf,tem1,tem2) ELSE CALL rstin(nx,ny,nz,nzsoil,nts, nstyps, exbcbufsz, & u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke, & udteb, udtwb, vdtnb, vdtsb, & pdteb, pdtwb, pdtnb, pdtsb, & ubar,vbar,ptbar,pbar,rhostr,qvbar, & x,y,z,zp,zpsoil,hterain,mapfct,j1,j2,j3,j3soil, & soiltyp,stypfrct,vegtyp,lai,roufns,veg, & tsoil,qsoil,wetcanp,snowdpth,qvsfc, & ptcumsrc,qcumsrc,w0avg,nca,kfraincv, & cldefi,xland,bmjraincv, & radfrc,radsw,rnflx,radswnet,radlwin, & raing,rainc,prcrate,exbcbuf,tem1,tem2) END IF ! !----------------------------------------------------------------------- ! ! Set map projection parameters which were not stored in restart ! data file. ! !----------------------------------------------------------------------- ! alatpro(1) = trulat1 alatpro(2) = trulat2 IF( sclfct /= 1.0) THEN sclf = 1.0/sclfct dxscl = dx*sclf dyscl = dy*sclf ELSE sclf = 1.0 dxscl = dx dyscl = dy END IF CALL setmapr( mapproj,sclf,alatpro,trulon ) CALL lltoxy( 1,1, ctrlat,ctrlon, ctrx, ctry ) ! swx = ctrx - (float(nx-3)/2.) * dxscl ! swy = ctry - (float(ny-3)/2.) * dyscl swx = ctrx - (FLOAT(nproc_x*(nx-3))/2.) * dxscl swy = ctry - (FLOAT(nproc_y*(ny-3))/2.) * dyscl CALL setorig( 1, swx, swy) ! set up the model origin to the coord. CALL setcornerll(nx,ny, x, y) DO k=1,nz-1 DO j=1,ny DO i=1,nx tem1(i,j,k) = rhostr(i,j,k)/j3(i,j,k) tem2(i,j,k) = (zp(i,j,k)+zp(i,j,k+1))*0.5 END DO END DO END DO CALL writesnd(nx,ny,nz,ubar,vbar,ptbar,pbar,qvbar,zp, tem1, tem2) ENDIF IF( initopt == 3 .or. initopt == 4) THEN ! External data input. ! !----------------------------------------------------------------------- ! ! Read in externally supplied initial fields. These fields include ! u, v, w, ptprt, pprt, qv, qc, qr, qi, qs, and qh at time level ! tpresent, and the base state variables ubar, vbar, ptbar, pbar, ! rhostr,qvbar. ! ! Fields at tpast and tfuture are set to their values at tpresent. ! !----------------------------------------------------------------------- ! CALL extinit(nx,ny,nz,nzsoil,nts,nstyps, & u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke, & ubar,vbar,ptbar,pbar,rhostr,qvbar, & x,y,z,zp,zpsoil,hterain,j1,j2,j3,j3soil, & soiltyp,stypfrct,vegtyp,lai,roufns,veg, & tsoil,qsoil,wetcanp,snowdpth,qvsfc, & ptcumsrc,qcumsrc,raing,rainc,prcrate, & radfrc,radsw,rnflx,radswnet,radlwin, & usflx,vsflx,ptsflx,qvsflx, & tem1,tem2,tem3,tem4,tem5,tem6,tem7,tem8,tem9) ! !----------------------------------------------------------------------- ! ! Set map projection parameters which were not stored in history ! data file. ! !----------------------------------------------------------------------- ! alatpro(1) = trulat1 alatpro(2) = trulat2 IF( sclfct /= 1.0) THEN sclf = 1.0/sclfct dxscl = dx*sclf dyscl = dy*sclf ELSE sclf = 1.0 dxscl = dx dyscl = dy END IF CALL setmapr( mapproj,sclf,alatpro,trulon ) CALL lltoxy( 1,1, ctrlat,ctrlon, ctrx, ctry ) ! swx = ctrx - (float(nx-3)/2.) * dxscl ! swy = ctry - (float(ny-3)/2.) * dyscl swx = ctrx - (FLOAT(nproc_x*(nx-3))/2.) * dxscl swy = ctry - (FLOAT(nproc_y*(ny-3))/2.) * dyscl CALL setorig( 1, swx, swy) ! set up the model origin to the coord. IF ( mpfctopt /= 0 ) THEN DO j=1,ny-1 DO i=1,nx-1 xs = 0.5*(x(i)+x(i+1)) ys = 0.5*(y(j)+y(j+1)) CALL xytomf( 1,1,xs,ys,mapfct(i,j,1) ) mapfct(i,j,4) = 1.0/mapfct(i,j,1) mapfct(i,j,7) = mapfct(i,j,1)*mapfct(i,j,1) mapfct(i,j,8) = 0.25*mapfct(i,j,1) END DO END DO DO j=1,ny-1 DO i=1,nx ys = 0.5*(y(j)+y(j+1)) CALL xytomf( 1,1,x(i),ys,mapfct(i,j,2) ) mapfct(i,j,5) = 1.0/mapfct(i,j,2) END DO END DO DO j=1,ny DO i=1,nx-1 xs = 0.5*(x(i)+x(i+1)) CALL xytomf( 1,1,xs,y(j),mapfct(i,j,3) ) mapfct(i,j,6) = 1.0/mapfct(i,j,3) END DO END DO ELSE DO k=1,7 DO j=1,ny DO i=1,nx mapfct(i,j,k) = 1.0 mapfct(i,j,8) = 0.25 END DO END DO END DO END IF CALL setcornerll(nx,ny, x, y) IF( initopt == 3 ) then ! !----------------------------------------------------------------------- ! ! Set the time tendencies of u, v and pprt on the lateral boundaries ! to zero for the initial time step ! ! These tendencies will be used by lateral boundary condition options ! 4 and 5 only. ! !----------------------------------------------------------------------- ! DO k=1,nz DO j=1,ny udteb(j,k) = 0.0 udtwb(j,k) = 0.0 pdteb(j,k) = 0.0 pdtwb(j,k) = 0.0 END DO END DO DO k=1,nz DO i=1,nx vdtnb(i,k) = 0.0 vdtsb(i,k) = 0.0 pdtnb(i,k) = 0.0 pdtsb(i,k) = 0.0 END DO END DO ENDIF DO k=1,nz-1 DO j=1,ny DO i=1,nx tem1(i,j,k) = rhostr(i,j,k)/j3(i,j,k) tem2(i,j,k) = (zp(i,j,k)+zp(i,j,k+1))*0.5 END DO END DO END DO CALL writesnd(nx,ny,nz,ubar,vbar,ptbar,pbar,qvbar,zp, tem1, tem2) END IF ! !----------------------------------------------------------------------- ! ! Define the reversed vertical indeces of height cldh2m and cldm2l ! which represent the levels that separate high, middle, and low ! clouds in the computation of the solar radiation transfer ! !----------------------------------------------------------------------- ! ict = nz-2 icb = nz-2 DO k=nz-2,2,-1 tem1(1,1,k) = (zp(1,1,k)-zp(1,1,2))*(zflat-zrefsfc) & /(zflat-zp(1,1,2))+zrefsfc END DO DO k=nz-2,2,-1 IF ( tem1(1,1,k) <= cldh2m) THEN ict = k EXIT END IF END DO ! for bit-for-bit MP accuracy: CALL mpupdatei(ict, 1) DO k=nz-2,2,-1 IF ( tem1(1,1,k) <= cldm2l) THEN icb = k EXIT END IF END DO ! for bit-for-bit MP accuracy: CALL mpupdatei(icb, 1) DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 j3inv(i,j,k)=1.0/j3(i,j,k) END DO END DO END DO DO k=1,nzsoil DO j=1,ny-1 DO i=1,nx-1 j3soilinv(i,j,k)=1.0/j3soil(i,j,k) END DO END DO END DO DO k=1,nz-1 DO j=1,ny-1 DO i=2,nx-1 aj3x(i,j,k)=0.5*(j3(i,j,k)+j3(i-1,j,k)) END DO END DO END DO IF (mp_opt > 0) THEN CALL acct_interrupt(mp_acct) CALL mpsendrecv2dew(aj3x,nx,ny,nz,ebc,wbc,1,tem2) !CALL mpsend2dns(aj3x,nx,ny,nz,1,mptag,tem2) !CALL mprecv2dns(aj3x,nx,ny,nz,1,mptag,tem2) END IF CALL acct_interrupt(bc_acct) CALL bcsu(nx,ny,nz,1,ny-1,1,nz-1,ebc,wbc,aj3x) CALL acct_stop_inter DO k=1,nz-1 DO j=2,ny-1 DO i=1,nx-1 aj3y(i,j,k)=0.5*(j3(i,j,k)+j3(i,j-1,k)) END DO END DO END DO IF (mp_opt > 0) THEN CALL acct_interrupt(mp_acct) !CALL mpsend2dew(aj3y,nx,ny,nz,2,mptag,tem2) !CALL mprecv2dew(aj3y,nx,ny,nz,2,mptag,tem2) CALL mpsendrecv2dns(aj3y,nx,ny,nz,nbc,sbc,2,tem2) END IF CALL acct_interrupt(bc_acct) CALL bcsv(nx,ny,nz,1,nx-1,1,nz-1,nbc,sbc,aj3y) CALL acct_stop_inter 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 CALL acct_interrupt(bc_acct) CALL bcsw(nx,ny,nz,1,nx-1,1,ny-1,tbc,bbc,aj3z) CALL acct_stop_inter ! !----------------------------------------------------------------------- ! ! Calculate the trigs1,trigs2,ifax1,ifax2 arrays by calling set99 ! ! OR ! ! calculate wsave1,wsave2 by calling vcosi. ! !----------------------------------------------------------------------- ! DO i=1,13 ifax1(i) = 0 ifax2(i) = 0 END DO DO i=1,3*(nx-1)/2+1 trigs1(i) = 0 END DO DO j=1,3*(ny-1)/2+1 trigs2(j) = 0 END DO DO j=1,ny+1 DO i=1,nx+1 vwork1(i,j) = 0.0 END DO END DO DO i=1,nx+1 DO j=1,ny vwork2(j,i) = 0.0 END DO END DO DO i=1,3*(nx-1)+15 wsave2(i) = 0.0 END DO DO i=1,3*(ny-1)+15 wsave1(i) = 0.0 END DO IF ( tbc == 4 ) THEN ! set up the fft work arrays for use in the ! upper radiation boundary condition. IF ( fftopt == 1 ) THEN ! set up periodic work arrays... IF ( ny == 4 ) THEN ! set up trigs in x direction only CALL set99(trigs1,ifax1,nx-1) ! NOTE: nx must be ODD!!!! ! and of special character... ! see fft99f.f for details.... ELSE IF ( nx == 4 ) THEN ! set up trigs in y direction only CALL set99(trigs2,ifax2,ny-1) ! NOTE: ny must be ODD!!!! ! and of special character... ! see fft99f.f for details.... ELSE ! set up for 2-d transform... CALL set99(trigs1,ifax1,nx-1) ! NOTE: nx must be ODD!!!! ! and of special character... ! see fft99f.f for details.... CALL set99(trigs2,ifax2,ny-1) ! NOTE: ny must be ODD!!!! ! and of special character... ! see fft99f.f for details.... END IF ELSE IF ( fftopt == 2 ) THEN ! set up the cos fft arrays... IF(ny == 4)THEN ! set up function in x direction only... CALL vcosti(nx-1,wsave2) ! nx should be even. ELSE IF(nx == 4)THEN ! set up function in y direction only... CALL vcosti(ny-1,wsave1) ! ny should be even. ELSE ! set up functions for 2-d transform... CALL vcosti(ny-1,wsave1) ! ny should be even. CALL vcosti(nx-1,wsave2) ! nx should be even. END IF ! end of run type if block... END IF ! end of fftopt if block..... END IF ! !----------------------------------------------------------------------- ! ! Find the lowest model layer (index rayklow) that is entirely or ! partially contained in the specified Rayleigh damping (sponge) ! layers. ! ! The Rayleigh damping is then applied only to layers with ! k greater than or equal to rayklow. ! !----------------------------------------------------------------------- ! rayklow = nz-1 DO k=nz-1,2,-1 zpmax = zp(1,1,k) DO j=1,ny-1 DO i=1,nx-1 zpmax = MAX( zp(i,j,k), zpmax ) END DO END DO ! for bit-for-bit accuracy with MP version: rmin = zpmax call mpmax0(zpmax,rmin) IF( zpmax < zbrdmp ) THEN rayklow = MAX(2, k+1) EXIT END IF END DO ! !----------------------------------------------------------------------- ! ! Calculate Exner function and store in ppi ! !----------------------------------------------------------------------- ! CALL setppi(nx,ny,nz,nts,tpresent,pprt,pbar,ppi) ! !----------------------------------------------------------------------- ! ! Calculate and store the sound wave speed squared in csndsq. ! !----------------------------------------------------------------------- ! IF(csopt == 1) THEN ! Original definition of sound speed. DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 csndsq(i,j,k)= cpdcv*pbar(i,j,k)*j3(i,j,k)/rhostr(i,j,k) END DO END DO END DO ELSE IF(csopt == 2) THEN ! Original sound speed multiplied ! by a factor temp = csfactr**2*cpdcv DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 csndsq(i,j,k)= temp * pbar(i,j,k)*j3(i,j,k)/rhostr(i,j,k) END DO END DO END DO ELSE ! Specified constant sound speed. DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 csndsq(i,j,k)= csound * csound END DO END DO END DO END IF ! !----------------------------------------------------------------------- ! ! Fill the edges of base state arrays that are otherwise undefined. ! This is done for safty reason only. ! !----------------------------------------------------------------------- ! DO k=1,nz-1 DO j=1,ny vbar (nx,j,k) = vbar (nx-1,j,k) END DO END DO DO k=1,nz-1 DO i=1,nx ubar (i,ny,k) = ubar (i,ny-1,k) END DO END DO DO i=1,nx DO j=1,ny ubar (i,j,nz) = ubar (i,j,nz-1) vbar (i,j,nz) = vbar (i,j,nz-1) END DO END DO DO k=1,nz-1 DO j=1,ny-1 ptbar (nx,j,k) = ptbar (nx-1,j,k) pbar (nx,j,k) = pbar (nx-1,j,k) ppi (nx,j,k) = ppi (nx-1,j,k) qvbar (nx,j,k) = qvbar (nx-1,j,k) csndsq(nx,j,k) = csndsq(nx-1,j,k) rhostr(nx,j,k) = rhostr(nx-1,j,k) END DO END DO DO k=1,nz-1 DO i=1,nx ptbar (i,ny,k) = ptbar (i,ny-1,k) pbar (i,ny,k) = pbar (i,ny-1,k) ppi (i,ny,k) = ppi (i,ny-1,k) qvbar (i,ny,k) = qvbar (i,ny-1,k) csndsq(i,ny,k) = csndsq(i,ny-1,k) rhostr(i,ny,k) = rhostr(i,ny-1,k) END DO END DO DO i=1,nx DO j=1,ny ptbar (i,j,nz) = ptbar (i,j,nz-1) pbar (i,j,nz) = pbar (i,j,nz-1) ppi (i,j,nz) = ppi (i,j,nz-1) qvbar (i,j,nz) = qvbar (i,j,nz-1) csndsq(i,j,nz) = csndsq(i,j,nz-1) rhostr(i,j,nz) = rhostr(i,j,nz-1) END DO END DO DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 ptbari(i,j,k) = 1.0/ptbar(i,j,k) pbari(i,j,k) = 1.0/pbar(i,j,k) rhostri(i,j,k) = 1.0/rhostr(i,j,k) END DO END DO END DO IF ( sfcphy > 0 ) THEN CALL initsfc(nx,ny,nz,nzsoil,nstyps, & zpsoil, & pbar,pprt(1,1,1,1), & ptbar,ptprt(1,1,1,1), & qvbar,qv(1,1,1,1), & soiltyp,stypfrct, vegtyp, lai,roufns,veg,tem1, & tsoil,qsoil,wetcanp,snowdpth,qvsfc,tem1soil) ! ! 07/05/2002 Zuwen He ! ! The following code is added for version compatibility. ! Please refer to readsoil subroutine for more detail. ! ! Before fmtver500 there is no zpsoil specified. Therefore ! error may occur when read in soilvar file written prior ! to version500. ! ! We have hard-coded zpsoil in "readsoil", so that dzsoil ! is always 1m for all the old soilvar files. However, ! there is no terrain data passed to readsoil, and zpsoil ! is not correctly initialized. ! ! The following code fixes the problem. ! DO k=1, nzsoil DO j=1, ny DO i=1, nx zpsoil(i,j,k)=hterain(i,j)-(zpsoil(i,j,1)-zpsoil(i,j,k)) END DO END DO END DO END IF RETURN END SUBROUTINE initgrdvar ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE INITDVR ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE initdvr(nx,ny,nz,nts, & 1,9 ubar,vbar,ptbar,pbar,rhostr,qvbar, & x,y,z,zp,hterain, j1,j2,j3, & u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh, & ptcumsrc,qcumsrc,raing,rainc,prcrate,tem1) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Initialize the model time dependent variables. ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! 10/10/1991. ! ! MODIFICATION HISTORY: ! ! 5/25/92 (M. Xue) ! Added full documentation. ! ! 5/03/92 (M. Xue) ! Further documentation. ! ! 4/10/93 (M. Xue & Hao Jin) ! Add the terrain. ! ! 9/10/94 (Weygandt & Y. Lu) ! Cleaned up documentation. ! ! 01/28/95 (G. Bassett) ! Added pt0opt=5 (soup can shaped perturbation to ptprt). ! !----------------------------------------------------------------------- ! ! INPUT: ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! nts Number of time levels to be initialized. ! ! ubar Base state x-velocity component (m/s) ! vbar Base state y-velocity component (m/s) ! ptbar Base state potential temperature (K) ! pbar Base state pressure (Pascal) ! rhostr Base state density rhobar times j3 (kg/m**3) ! qvbar Base state water vapor specific humidity (kg/kg). ! ! x x-coordinate of grid points in computational space (m) ! y y-coordinate of grid points in computational space (m) ! z z-coordinate of grid points in computational space (m) ! zp Vertical coordinate of grid points in physical space(m) ! hterain Terrain height (m) ! ! j1 Coordinate transformation Jacobian -d(zp)/dx ! j2 Coordinate transformation Jacobian -d(zp)/dy ! j3 Coordinate transformation Jacobian d(zp)/dz ! ! OUTPUT: ! ! u x-component of velocity at all time levels (m/s). ! v y-component of velocity at all time levels (m/s). ! w z-component of velocity at all time levels (m/s). ! ptprt Perturbation potential temperature at all time levels ! (K) ! pprt Perturbation pressure at all time levels (Pascal) ! qv Water vapor specific humidity at all time levels ! (kg/kg) ! qc Cloud water mixing ratio at all time levels (kg/kg) ! qr Rainwater mixing ratio at all time levels (kg/kg) ! qi Cloud ice mixing ratio at all time levels (kg/kg) ! qs Snow mixing ratio at all time levels (kg/kg) ! qh Hail mixing ratio at all time levels (kg/kg) ! ! ptcumsrc Source term in pt-equation due to cumulus parameterization ! qcumsrc Source term in water equations due to cumulus parameterization ! raing Grid supersaturation rain ! rainc Cumulus convective rain ! prcrate Precipitation ratesrain ! ! WORK ARRAYS: ! ! tem1 Temporary work array. ! ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! The number of grid points in 3 ! directions INTEGER :: nts ! Number of time levels to be initialized. INTEGER :: tpast ! Index of time level for the past time. INTEGER :: tpresent ! Index of time level for the present ! time. INTEGER :: tfuture ! Index of time level for the future ! time. REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s) REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s) REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K) REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal). REAL :: rhostr(nx,ny,nz) ! Base state density rhobar times j3. REAL :: qvbar (nx,ny,nz) ! Base state water vapor specific ! humidity(kg/kg) REAL :: x (nx) ! x-coord. of the physical and compu- ! tational grid. Defined at u-point. REAL :: y (ny) ! y-coord. of the physical and compu- ! tational grid. Defined at v-point. REAL :: z (nz) ! z-coord. of the computational grid. ! Defined at w-point on the staggered ! grid. REAL :: zp (nx,ny,nz) ! Physical height coordinate defined at ! w-point of the staggered grid. REAL :: hterain(nx,ny) ! Terrain height (m). REAL :: j1 (nx,ny,nz) ! Coordinate transformation Jacobian ! -d(zp)/dx. REAL :: j2 (nx,ny,nz) ! Coordinate transformation Jacobian ! -d(zp)/dy. REAL :: j3 (nx,ny,nz) ! Coordinate transformation Jacobian ! d(zp)/dz. REAL :: u (nx,ny,nz,nts) ! Total u-velocity (m/s) REAL :: v (nx,ny,nz,nts) ! Total v-velocity (m/s) REAL :: w (nx,ny,nz,nts) ! Total w-velocity (m/s) REAL :: ptprt (nx,ny,nz,nts) ! Perturbation potential temperature (K) REAL :: pprt (nx,ny,nz,nts) ! Perturbation pressure (Pascal) REAL :: qv (nx,ny,nz,nts) ! Water vapor specific humidity (kg/kg) REAL :: qc (nx,ny,nz,nts) ! Cloud water mixing ratio (kg/kg) REAL :: qr (nx,ny,nz,nts) ! Rain water mixing ratio (kg/kg) REAL :: qi (nx,ny,nz,nts) ! Cloud ice mixing ratio (kg/kg) REAL :: qs (nx,ny,nz,nts) ! Snow mixing ratio (kg/kg) REAL :: qh (nx,ny,nz,nts) ! Hail mixing ratio (kg/kg) REAL :: ptcumsrc(nx,ny,nz) ! Source term in pt-equation due ! to cumulus parameterization REAL :: qcumsrc(nx,ny,nz,5) ! Source term in water equations due ! to cumulus parameterization: ! qcumsrc(1,1,1,1) for qv equation ! qcumsrc(1,1,1,2) for qc equation ! qcumsrc(1,1,1,3) for qr equation ! qcumsrc(1,1,1,4) for qi equation ! qcumsrc(1,1,1,5) for qs equation REAL :: raing (nx,ny) ! Grid supersaturation rain REAL :: rainc (nx,ny) ! Cumulus convective rain REAL :: prcrate(nx,ny,4) ! precipitation rate (kg/(m**2*s)) ! prcrate(1,1,1) = total precip. rate ! prcrate(1,1,2) = grid scale precip. rate ! prcrate(1,1,3) = cumulus precip. rate ! prcrate(1,1,4) = microphysics precip. rate REAL :: tem1(nx,ny,nz) ! Temporary work array ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! REAL :: xs, ys, zs REAL :: us, vs, ws, rhobar REAL :: radnd , pi,pi2,pi4 INTEGER :: i,j,k, n INTEGER :: iseed,ibgn,iend,jbgn,jend,kbgn,kend INTEGER :: ebc1,wbc1,nbc1,sbc1 REAL :: amplitud REAL :: knumx,lnumy,mnumz REAL :: lnthx,lnthy,lnthz REAL :: lambda,lambdah,lambda2 ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'grid.inc' ! Grid & map parameters. INCLUDE 'phycst.inc' INCLUDE 'bndry.inc' INCLUDE 'mp.inc' ! Message passing parameters. INTEGER :: nxlg, nylg REAL :: temlg1((nx-3)*nproc_x+3,(ny-3)*nproc_y+3,nz) REAL :: temlg2((nx-3)*nproc_x+3,(ny-3)*nproc_y+3,nz) ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! IF( nts > 1 ) THEN tpast=1 tpresent=2 tfuture=3 ELSE tpast=1 tpresent=1 tfuture=1 END IF ! !----------------------------------------------------------------------- ! ! Specify the initial potential temperature perturbation. ! !----------------------------------------------------------------------- ! IF( pt0opt == 1 .OR. pt0opt == 6 ) THEN ! Bubble shaped perturbation ! !----------------------------------------------------------------------- ! ! Define a potential temperature perturbation for a bubble-shaped ! disturbance. ! !----------------------------------------------------------------------- ! pi2 = 1.5707963267949 IF( ptpert0 == 0.0) THEN DO k= 1,nz-1 DO j= 1,ny-1 DO i= 1,nx-1 ptprt(i,j,k,1) = 0.0 END DO END DO END DO ELSE DO k= 1,nz-1 DO j= 1,ny-1 DO i= 1,nx-1 xs = (x(i)+x(i+1))*0.5 ys = (y(j)+y(j+1))*0.5 ! xs = (x(i)+x(i+1))*0.5-x(1) ! ys = (y(j)+y(j+1))*0.5-y(1) !wdt multiple bubbles for timing tests zs = (zp(i,j,k)+zp(i,j,k+1))*0.5 IF( pt0rady < 0.0 .OR. runmod == 2 ) THEN ! 2-d bubble in x-z plane. radnd = SQRT( ((xs-pt0ctrx)/pt0radx)**2 & + ((zs-pt0ctrz)/pt0radz)**2 ) ELSE IF( pt0radx < 0.0 .OR. runmod == 3 ) THEN ! 2-d bubble in y-z plane. radnd = SQRT( ((ys-pt0ctry)/pt0rady)**2 & + ((zs-pt0ctrz)/pt0radz)**2 ) ELSE ! 3-d bubble radnd = SQRT( ((xs-pt0ctrx)/pt0radx)**2 + & ((ys-pt0ctry)/pt0rady)**2 + & ((zs-pt0ctrz)/pt0radz)**2 ) END IF IF(radnd >= 1.0) THEN ptprt(i,j,k,1) = 0.0 ELSE ptprt(i,j,k,1) = ptpert0*(COS(pi2*radnd )**2) END IF END DO END DO END DO IF(pt0opt == 6) THEN ! Perturbation speficied in T'. DO k= 1,nz-1 DO j= 1,ny-1 DO i= 1,nx-1 ptprt(i,j,k,1) = ptprt(i,j,k,1)*(p0/pbar(i,j,k))**rddcp END DO END DO END DO END IF END IF ELSE IF( pt0opt == 2 .OR. pt0opt == 3 ) THEN ! Random field ! !----------------------------------------------------------------------- ! ! Define a potential temperature perturbation by a random function. ! This ensures that the horizontal average of the perturbation in a ! specified domain is zero. ! ! Fill an array with zeros. ! !----------------------------------------------------------------------- ! DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 ptprt(i,j,k,1) = 0.0 END DO END DO END DO nxlg = ((nx-3)*nproc_x+3) ! will be nx if nproc_x = 1 ! which is the case for serial run, see initpara nylg = ((ny-3)*nproc_y+3) ! will be ny if nproc_y = 1 ! which is the case for serial run, see initpara ! !----------------------------------------------------------------------- ! ! The following parameters define the portion of domain to be ! initialized with a random potential temperture perturbation. ! Users can modify them to fit their needs. ! ! NOTE: if this is an MPI run, ibgn,iend and jbgn,jend should ! be defined over the entire domain, and not just for one ! processor! ! !----------------------------------------------------------------------- ! ibgn = 1 iend = nxlg - 1 ! will be nx-1 if nproc_x = 1 jbgn = 1 jend = nylg - 1 ! will be ny-1 if nproc_y = 1 kbgn = 1 kend = nz-1 iseed = -100 DO k= kbgn,kend CALL ranary(nx,ny,ibgn,iend,jbgn,jend, & iseed,ptpert0,ptprt(1,1,k,1)) END DO IF( pt0opt == 3 ) THEN ! Symmetric random perturbation ! !----------------------------------------------------------------------- ! ! Create a random perturbation field symmetric about both the x and y ! axes. ! !----------------------------------------------------------------------- CALL mpimerge3d(ptprt(:,:,:,1), nx, ny, nz, temlg1) IF (myproc ==0) THEN DO k=1,nz-1 DO j=1,nylg-1 DO i=1,nxlg/2 temlg1(i,j,k) = temlg1(nxlg-i,j,k) END DO END DO END DO DO k=1,nz-1 DO i=1,nxlg-1 DO j=1,nylg/2 temlg1(i,j,k) = temlg1(i,nylg-j,k) END DO END DO END DO IF( nxlg == nylg ) THEN DO k=1,nz-1 DO j=1,nylg-1 DO i=1,nxlg-1 temlg2(i,j,k) = (temlg1(i,j,k)+temlg1(j,i,k))*0.5 END DO END DO END DO DO k=1,nz-1 DO i=1,nxlg-1 DO j=1,nylg-1 temlg1(i,j,k) = temlg2(i,j,k) END DO END DO END DO END IF END IF ! myproc == 0 CALL mpisplit3d(temlg1,nx,ny,nz,ptprt(:,:,:,1)) END IF ELSE IF( pt0opt == 4 ) THEN ! Bubble given in Skamarock and ! Klemp (1994) pi2 = 1.5707963267949 DO k=1,nz-1 DO i=1,nx-1 DO j=1,ny-1 xs = (x(i)+x(i+1))*0.5 zs = (zp(i,j,k)+zp(i,j,k+1))*0.5 ptprt(i,j,k,1) = ptpert0 & *SIN(pi2*2*zs/((nz-3)*dz))/(1+((xs-pt0ctrx)/pt0radx)**2) END DO END DO END DO ELSE IF( pt0opt == 5 ) THEN ! Soup can shaped perturbation DO k= 1,nz-1 DO j= 1,ny-1 DO i= 1,nx-1 xs = (x(i)+x(i+1))*0.5 ys = (y(j)+y(j+1))*0.5 zs = (zp(i,j,k)+zp(i,j,k+1))*0.5 IF ( ABS(zs-pt0ctrz)/pt0radz < 1 ) THEN IF( pt0rady < 0.0 .OR. runmod == 2 ) THEN ! 2-d bubble in x-z plane. radnd = ABS(xs-pt0ctrx)/pt0radx ELSE IF( pt0radx < 0.0 .OR. runmod == 3 ) THEN ! 2-d bubble in y-z plane. radnd = ABS(ys-pt0ctry)/pt0rady ELSE ! 3-d bubble radnd = SQRT( ((xs-pt0ctrx)/pt0radx)**2 + & ((ys-pt0ctry)/pt0rady)**2 ) END IF IF(radnd >= 1.0) THEN ptprt(i,j,k,1) = 0.0 ELSE ptprt(i,j,k,1) = ptpert0 END IF ELSE ptprt(i,j,k,1) = 0.0 END IF END DO END DO END DO END IF ebc1=0 wbc1=0 sbc1=0 nbc1=0 IF( ebc == 1 .OR.ebc == 2 .OR. ebc == 3 ) ebc1=ebc IF( wbc == 1 .OR.wbc == 2 .OR. wbc == 3 ) wbc1=wbc IF( sbc == 1 .OR.sbc == 2 .OR. sbc == 3 ) sbc1=sbc IF( nbc == 1 .OR.nbc == 2 .OR. nbc == 3 ) nbc1=nbc IF (mp_opt > 0) THEN CALL acct_interrupt(mp_acct) CALL mpsendrecv2dew(ptprt,nx,ny,nz,ebc1,wbc1,0,tem1) CALL mpsendrecv2dns(ptprt,nx,ny,nz,nbc1,sbc1,0,tem1) END IF CALL acct_interrupt(bc_acct) CALL bcsclr(nx,ny,nz,dtbig, & ptprt(1,1,1,1),ptprt(1,1,1,1), & ptprt(1,1,1,1),tem1,tem1,tem1,tem1, & ebc1,wbc1,nbc1,sbc1,tbc,bbc, & ebc_global,wbc_global,nbc_global,sbc_global) CALL acct_stop_inter DO n=1,nts DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 ptprt(i,j,k,n)=ptprt(i,j,k,1) pprt(i,j,k,n)=0.0 END DO END DO END DO END DO DO n=1,nts DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx u(i,j,k,n)=ubar(i,j,k) END DO END DO END DO END DO DO n=1,nts DO k=1,nz-1 DO j=1,ny DO i=1,nx-1 v(i,j,k,n)=vbar(i,j,k) END DO END DO END DO END DO DO n=1,nts DO k=1,nz DO j=1,ny-1 DO i=1,nx-1 w(i,j,k,n)=0.0 END DO END DO END DO END DO DO n=1,nts DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 qv(i,j,k,n)= qvbar(i,j,k) END DO END DO END DO END DO DO n=1,nts DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 qc(i,j,k,n)=0.0 END DO END DO END DO END DO DO n=1,nts DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 qr(i,j,k,n)= 0.0 END DO END DO END DO END DO DO n=1,nts DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 qi(i,j,k,n)= 0.0 END DO END DO END DO END DO DO n=1,nts DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 qs(i,j,k,n)= 0.0 END DO END DO END DO END DO DO n=1,nts DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 qh(i,j,k,n)= 0.0 END DO END DO END DO END DO DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 ptcumsrc(i,j,k)= 0.0 qcumsrc(i,j,k,1)= 0.0 qcumsrc(i,j,k,2)= 0.0 qcumsrc(i,j,k,3)= 0.0 qcumsrc(i,j,k,4)= 0.0 qcumsrc(i,j,k,5)= 0.0 END DO END DO END DO DO j=1,ny-1 DO i=1,nx-1 raing(i,j)= 0.0 rainc(i,j)= 0.0 prcrate(i,j,1)= 0.0 prcrate(i,j,2)= 0.0 prcrate(i,j,3)= 0.0 prcrate(i,j,4)= 0.0 END DO END DO ! !----------------------------------------------------------------------- ! ! The following setup is to overwrite the total u, v, w, pprt, ! ptprt, and qv for Beltrami flow initial conditions. ! !----------------------------------------------------------------------- ! IF ( pt0opt == 7 ) THEN pi = 3.1415926535898 pi2 = 2*pi pi4 = 4*pi amplitud = 2.0 ! amplitude A=2 m/s tmixopt = 1 ! constant viscosity option tmixcst = 1.0 ! viscosity=1 m**2/s tmixvert = 1.0 ! compute all mixing terms wbc = 2 ! reset boundary conditions ebc = 2 ! to periodical condition nbc = 2 sbc = 2 tbc = 2 bbc = 2 lnthx = dx*(nx-3) ! length in x lnthy = dy*(ny-3) ! length in y lnthz = dz*(nz-3) ! length in z knumx = pi4/lnthx ! wave number in x-dir lnumy = pi2/lnthy ! wave number in y-dir mnumz = pi2/lnthz ! wave number in z-dir lambdah = knumx*knumx + lnumy*lnumy lambda2 = lambdah + mnumz*mnumz lambda = SQRT( lambda2 ) ! print *, ' amplitude = ',amplitud PRINT *, ' lnthx = ',lnthx, & ' lnthy = ',lnthy, & ' lnthz = ',lnthz PRINT *, ' knumx = ',knumx, & ' lnumy = ',lnumy, & ' mnumz = ',mnumz PRINT *, ' lambda1 = ',lambdah, & ' lambda2 = ',lambda2, & ' lambda = ',lambda DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx ys = 0.5*(y(j+1)+y(j)) zs = 0.5*(z(k+1)+z(k)) u(i,j,k,1) = -amplitud/lambdah & *(lambda*lnumy & *COS(knumx*x(i))*SIN(lnumy*ys)*SIN(mnumz*zs) & +mnumz*knumx & *SIN(knumx*x(i))*COS(lnumy*ys)*COS(mnumz*zs)) END DO END DO END DO DO k=1,nz-1 DO j=1,ny DO i=1,nx-1 xs = 0.5*(x(i+1)+x(i)) zs = 0.5*(z(k+1)+z(k)) v(i,j,k,1)= amplitud/lambdah & * (lambda*knumx & *SIN(knumx*xs)*COS(lnumy*y(j))*SIN(mnumz*zs) & -mnumz*lnumy & *COS(knumx*xs)*SIN(lnumy*y(j))*COS(mnumz*zs)) END DO END DO END DO DO k=1,nz DO j=1,ny-1 DO i=1,nx-1 xs = 0.5*(x(i+1)+x(i)) ys = 0.5*(y(j+1)+y(j)) w(i,j,k,1)=amplitud & *COS(knumx*xs)*COS(lnumy*ys)*SIN(mnumz*z(k)) END DO END DO END DO DO k=1,nz DO j=1,ny-1 DO i=1,nx-1 zs = 0.5*(z(k+1)+z(k)) us = 0.5*(u(i+1,j,k,1)+u(i,j,k,1)) vs = 0.5*(v(i,j+1,k,1)+v(i,j,k,1)) ws = 0.5*(w(i,j,k+1,1)+w(i,j,k,1)) rhobar = rhostr(i,j,k)/j3(i,j,k) pprt(i,j,k,1) = p0-rhobar*(0.5*(us*us+vs*vs+ws*ws)+g*zs) & - pbar(i,j,k) END DO END DO END DO DO n=1,nts DO k=1,nz DO j=1,ny DO i=1,nx u (i,j,k,n) = u(i,j,k,1) v (i,j,k,n) = v(i,j,k,1) w (i,j,k,n) = w(i,j,k,1) pprt (i,j,k,n) = pprt(i,j,k,1) ptprt(i,j,k,n) = 0.0 qv (i,j,k,n) = 0.0 END DO END DO END DO END DO END IF RETURN END SUBROUTINE initdvr !################################################################## !################################################################## !###### ###### !###### SUBROUTINE EXTINIT ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE extinit(nx,ny,nz,nzsoil,nts, nstyps, & 1,37 u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke, & ubar,vbar,ptbar,pbar,rhostr,qvbar, & x,y,z,zp,zpsoil,hterain,j1,j2,j3,j3soil, & soiltyp,stypfrct,vegtyp,lai,roufns,veg, & tsoil,qsoil,wetcanp,snowdpth,qvsfc, & ptcumsrc,qcumsrc,raing,rainc,prcrate, & radfrc,radsw,rnflx,radswnet,radlwin, & usflx,vsflx,ptsflx,qvsflx, & uprt,vprt,qvprt,kmh,kmv,wbar, & tem6,tem7,tem8) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Read in the initial fields from an externally supplied initial ! data file. ! ! These fields include u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh ! at time level tpresent, and the base state variables ! ubar,vbar,ptbar,pbar,rhostr,qvbar. ! ! Fields at tpast and tfuture are set to their values at tpresent. ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! 10/7/1992 ! ! MODIFICATION HISTORY: ! ! 3/25/94 (G. Bassett, M. Xue) ! Modified to read in regular binary history dumps. ! ! 9/10/94 (Weygandt & Y. Lu) ! Cleaned up documentation. ! ! 01/14/1995 (M. Xue) ! Corrected where jacob was called. It should be called ! before do loop 90. ! ! 03/29/1997 (M. Xue) ! Modification made so that when values of mapproj,trulat1,trulat2, ! trulon,ctrlat,ctrlon in the input data do not match those in ! input file, the values in the data are used instead of those ! in input, as was done before. Warning messages will be printed. ! ! 12/09/1998 (Donghai Wang) ! Added the snow cover. ! ! 03/19/2002 (Keith Brewster) ! Corrected print statement related to mis-match in data and user times. ! 05/18/20020 (Dan Weber) ! Added new soil model variables. ! !----------------------------------------------------------------------- ! ! INPUT : ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! nzsoil Number of grid points in the soil model in the -z-direction ! nts Number of time levels to be initialized. ! ! OUTPUT: ! ! u x component of velocity at times tpast and tpresent ! (m/s) ! v y component of velocity at times tpast and tpresent ! (m/s) ! w Vertical component of Cartesian velocity at times ! tpast and tpresent (m/s) ! ptprt Perturbation potential temperature at times tpast and ! tpresent (K) ! pprt Perturbation pressure at times tpast and tpresent ! (Pascal) ! ! qv Water vapor specific humidity at times tpast and ! tpresent (kg/kg) ! qc Cloud water mixing ratio at times tpast and tpresent ! (kg/kg) ! qr Rainwater mixing ratio at times tpast and tpresent ! (kg/kg) ! qi Cloud ice mixing ratio at times tpast and tpresent ! (kg/kg) ! qs Snow mixing ratio at times tpast and tpresent (kg/kg) ! qh Hail mixing ratio at times tpast and tpresent (kg/kg) ! tke Turbulence kinetic energy (m**2/s) ! ! ubar Base state zonal velocity component (m/s) ! vbar Base state meridional velocity component (m/s) ! ptbar Base state potential temperature (K) ! pbar Base state pressure (Pascal) ! rhostr Base state density rhobar times j3 (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 grid points in the soil model ! in physical space (m). ! hterain The height of terrain (m) ! ! j1 Coordinate transformation Jacobian -d(zp)/dx ! j2 Coordinate transformation Jacobian -d(zp)/dy ! j3 Coordinate transformation Jacobian d(zp)/dz ! j3soil Soil coordinate transformation Jacobian d(zpsoil)/dz ! ! soiltyp Soil type ! vegtyp Vegetation type ! lai Leaf Area Index ! roufns Surface roughness ! veg Vegetation fraction ! ! tsoil Deep soil temperature (K) (in deep 1 m layer) ! qsoil Soil moisture (m**3/m**3) ! wetcanp Canopy water amount ! snowdpth Snow depth (m) ! qvsfc Effective S.H. at sfc. ! ! ptcumsrc Source term in pt-equation due to cumulus parameterization ! qcumsrc Source term in water equations due to cumulus parameterization ! raing Grid supersaturation rain ! rainc Cumulus convective rain ! prcrate Precipitation rates ! ! radfrc Radiation forcing (K/s) ! radsw Solar radiation reaching the surface ! rnflx Net radiation flux absorbed by surface ! radswnet Net shortwave radiation ! radlwin Incoming longwave radiation ! ! usflx Surface flux of u-momentum (kg/(m*s**2)) ! vsflx Surface flux of v-momentum (kg/(m*s**2)) ! ptsflx Surface heat flux (K*kg/(m**2 * s )) ! qvsflx Surface moisture flux of (kg/(m**2 * s)) ! ! tstart The time when the time integration starts, which is set ! to the time of the restart data ! ! WORK ARRAYS: ! ! tem6 Temporary work array. ! tem7 Temporary work array. ! tem8 Temporary work array. ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! Number of grid points in 3 directions INTEGER :: nzsoil ! Number of grid points in the -z-direction INTEGER :: nts ! Number of time levels to be initialized. INTEGER :: tpast ! Index of time level for the past time. INTEGER :: tpresent ! Index of time level for the present ! time. INTEGER :: tfuture ! Index of time level for the future ! time. REAL :: u (nx,ny,nz,nts) ! Total u-velocity (m/s) REAL :: v (nx,ny,nz,nts) ! Total v-velocity (m/s) REAL :: w (nx,ny,nz,nts) ! Total w-velocity (m/s) REAL :: ptprt (nx,ny,nz,nts) ! Perturbation potential temperature (K) REAL :: pprt (nx,ny,nz,nts) ! Perturbation pressure (Pascal) REAL :: qv (nx,ny,nz,nts) ! Water vapor specific humidity (kg/kg) REAL :: qc (nx,ny,nz,nts) ! Cloud water mixing ratio (kg/kg) REAL :: qr (nx,ny,nz,nts) ! Rain water mixing ratio (kg/kg) REAL :: qi (nx,ny,nz,nts) ! Cloud ice mixing ratio (kg/kg) REAL :: qs (nx,ny,nz,nts) ! Snow mixing ratio (kg/kg) REAL :: qh (nx,ny,nz,nts) ! Hail mixing ratio (kg/kg) REAL :: tke (nx,ny,nz,nts) ! Turbulence kinetic energy (m**2/s) REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s) REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s) REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K) REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal) REAL :: rhostr(nx,ny,nz) ! Base state density rhobar times j3. REAL :: qvbar (nx,ny,nz) ! Base state water vapor specific ! humidity(kg/kg) REAL :: x(nx) ! x-coord. of the physical and compu- ! tational grid. Defined at u-point. REAL :: y(ny) ! y-coord. of the physical and compu- ! tational grid. Defined at v-point. REAL :: z(nz) ! z-coord. of the computational grid. ! Defined at w-point on the staggered ! grid. REAL :: zp(nx,ny,nz) ! Physical height coordinate defined at ! w-point of the staggered grid. REAL :: zpsoil(nx,ny,nzsoil) ! The physical height coordinate defined ! at the center of a soil layer(m). REAL :: hterain(nx,ny) ! Terrain height (m). REAL :: j1 (nx,ny,nz) ! Coordinate transformation Jacobian ! -d(zp)/dx. REAL :: j2 (nx,ny,nz) ! Coordinate transformation Jacobian ! -d(zp)/dy. REAL :: j3 (nx,ny,nz) ! Coordinate transformation Jacobian ! d(zp)/dz. REAL :: j3soil(nx,ny,nzsoil) ! Coordinate transformation Jacobian ! defined as d( zpsoil )/d( zsoil ). REAL :: j3soilinv(nx,ny,nzsoil) ! Inverse of J3soil. INTEGER :: nstyps ! Number of soil types INTEGER :: soiltyp(nx,ny,nstyps) ! Soil types at grid points REAL :: stypfrct(nx,ny,nstyps) ! Fraction of soil types INTEGER :: vegtyp (nx,ny) ! Vegetation type REAL :: lai (nx,ny) ! Leaf Area Index REAL :: roufns (nx,ny) ! Surface roughness REAL :: veg (nx,ny) ! Vegetation fraction REAL :: qvsfc (nx,ny,0:nstyps) ! Effective qv at sfc. REAL :: tsoil (nx,ny,nzsoil,0:nstyps) ! Deep soil temperature (K) ! (in deep 1 m layer) REAL :: qsoil (nx,ny,nzsoil,0:nstyps) ! Soil layer moisture(m**3/m**3) REAL :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount REAL :: snowdpth(nx,ny) ! Snow depth (m) REAL :: ptcumsrc(nx,ny,nz) ! Source term in pt-equation due ! to cumulus parameterization REAL :: qcumsrc(nx,ny,nz,5) ! Source term in water equations due ! to cumulus parameterization: ! qcumsrc(1,1,1,1) for qv equation ! qcumsrc(1,1,1,2) for qc equation ! qcumsrc(1,1,1,3) for qr equation ! qcumsrc(1,1,1,4) for qi equation ! qcumsrc(1,1,1,5) for qs equation REAL :: raing(nx,ny) ! Grid supersaturation rain REAL :: rainc(nx,ny) ! Cumulus convective rain REAL :: prcrate(nx,ny,4) ! precipitation rate (kg/(m**2*s)) ! prcrate(1,1,1) = total precip. rate ! prcrate(1,1,2) = grid scale precip. rate ! prcrate(1,1,3) = cumulus precip. rate ! prcrate(1,1,4) = microphysics precip. rate REAL :: radfrc(nx,ny,nz) ! Radiation forcing (K/s) REAL :: radsw (nx,ny) ! Solar radiation reaching the surface REAL :: rnflx (nx,ny) ! Net radiation flux absorbed by surface REAL :: radswnet(nx,ny) ! Net shortwave radiation REAL :: radlwin(nx,ny) ! Incoming longwave radiation REAL :: usflx (nx,ny) ! Surface flux of u-momentum (kg/(m*s**2)) REAL :: vsflx (nx,ny) ! Surface flux of v-momentum (kg/(m*s**2)) REAL :: ptsflx(nx,ny) ! Surface heat flux (K*kg/(m*s**2)) REAL :: qvsflx(nx,ny) ! Surface moisture flux (kg/(m**2*s)) REAL :: uprt (nx,ny,nz) ! Temporary array REAL :: vprt (nx,ny,nz) ! Temporary array REAL :: qvprt(nx,ny,nz) ! Temporary array REAL :: kmh (nx,ny,nz) ! Horizontal turb. mixing coef. for ! momentum. ( m**2/s ) REAL :: kmv (nx,ny,nz) ! Vertical turb. mixing coef. for ! momentum. ( m**2/s ) REAL :: wbar (nx,ny,nz) ! Temporary array REAL :: tem6 (nx,ny,nz) ! Temporary array REAL :: tem7 (nx,ny,nz) ! Temporary array REAL :: tem8 (nx,ny,nz) ! Temporary array ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: lengbf, lenfil INTEGER :: i, j, k, ireturn, tim REAL :: amax,amin CHARACTER (LEN=256) :: runnamesv INTEGER :: nocmnt_old ! Number of comment lines CHARACTER (LEN=80 ) :: cmnt_old(50) ! String of comments on this model run INTEGER :: nchin REAL :: time_tmp REAL :: tstopsv,thisdmpsv,mapprojsv,latitudsv,ctrlatsv,ctrlonsv INTEGER :: monthsv,daysv,yearsv,hoursv,minutesv,secondsv REAL :: trulat1sv,trulat2sv,trulonsv REAL :: dxsv,dysv,strhoptsv,dzsv,dzminsv,zrefsfcsv,dlayer1sv,dlayer2sv, & strhtunesv,zflatsv REAL :: p0inv,eps,tvbar INTEGER :: abstsec0,abstsec1 ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'grid.inc' ! Grid & map parameters. INCLUDE 'phycst.inc' INCLUDE 'mp.inc' ! Message passing parameters. ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! p0inv=1./p0 IF( nts > 1 ) THEN tpast=1 tpresent=2 tfuture=3 ELSE tpast=1 tpresent=1 tfuture=1 END IF ! !----------------------------------------------------------------------- ! ! Read in the initial fields from the input data file. ! !----------------------------------------------------------------------- ! lengbf = 80 CALL strlnth( inigbf, lengbf ) lenfil = 80 CALL strlnth( inifile, lenfil ) IF (mp_opt > 0 .AND. readsplit == 0) THEN runnamesv = inigbf WRITE(inigbf,'(a,a,2i2.2)') & runnamesv(1:lengbf),'_',loc_x,loc_y lengbf = lengbf + 5 runnamesv = inifile WRITE(inifile,'(a,a,2i2.2)') & runnamesv(1:lenfil),'_',loc_x,loc_y lenfil = lenfil + 5 END IF tim = tpresent runnamesv = runname tstopsv = tstop thisdmpsv = thisdmp mapprojsv = mapproj trulat1sv = trulat1 trulat2sv = trulat2 trulonsv = trulon latitudsv = latitud ctrlatsv = ctrlat ctrlonsv = ctrlon monthsv = month daysv = day yearsv = year hoursv = hour minutesv = minute secondsv = second dxsv = dx dysv = dy strhoptsv = strhopt dzsv = dz dzminsv = dzmin zrefsfcsv = zrefsfc dlayer1sv = dlayer1 dlayer2sv = dlayer2 strhtunesv = strhtune zflatsv = zflat nocmnt_old = nocmnt DO i=1,nocmnt_old cmnt_old(i)=cmnt(i) END DO ! blocking inserted for ordering i/o for message passing DO i=0,nprocs-1,readstride IF(myproc >= i.AND.myproc <= i+readstride-1)THEN CALL dtaread(nx,ny,nz,nzsoil,nstyps, inifmt, nchin ,inigbf,lengbf,& inifile,lenfil,time_tmp, & x,y,z,zp,zpsoil,uprt,vprt,w(1,1,1,tim),ptprt(1,1,1,tim),& pprt(1,1,1,tim),qvprt,qc(1,1,1,tim),qr(1,1,1,tim), & qi(1,1,1,tim),qs(1,1,1,tim),qh(1,1,1,tim), & tke(1,1,1,tim),kmh,kmv, & ubar,vbar,wbar,ptbar,pbar,rhostr,qvbar, & soiltyp,stypfrct,vegtyp,lai,roufns,veg, & tsoil,qsoil,wetcanp,snowdpth, & raing,rainc,prcrate, & radfrc,radsw,rnflx,radswnet,radlwin, & usflx,vsflx,ptsflx,qvsflx, & ireturn, tem6,tem7,tem8) END IF IF (mp_opt > 0) CALL mpbarrier END DO ! !----------------------------------------------------------------------- ! ! To restore the original runname and comments, etc. ! from ARPS input file. ! !----------------------------------------------------------------------- eps = 0.0001 IF(mapproj /= mapprojsv .OR.ABS(trulat1sv-trulat1) > eps & .OR.ABS(trulat2sv-trulat2) > eps & .OR.ABS(trulonsv -trulon ) > eps) THEN WRITE(6,'(/2(/5x,a),2(/5x,3(a,f13.3))/)') & 'WARNING: Map projection parameters in the input data do not ', & 'match those specified in input file. Values in data used.', & 'In data, trulat1=',trulat1 ,', trulat2=',trulat2, & ', trulon=',trulon, & 'In input, trulat1=',trulat1sv,', trulat2=',trulat2sv, & ', trulon=',trulonsv END IF IF(ABS(ctrlatsv-ctrlat) > eps .OR. ABS(ctrlonsv-ctrlon) > eps ) THEN WRITE(6,'(/3(/5x,a),2(/5x,2(a,f13.3))/)') & 'WARNING: Central latitude and/or longitude of the grid ', & 'in the input data do not match those specified in input file.', & 'Values in data used.', & 'In data , ctrlat=',ctrlat ,', ctrlon=',ctrlon, & 'In input, ctrlat=',ctrlatsv,', ctrlon=',ctrlonsv END IF CALL ctim2abss(year,month,day,hour,minute,second, abstsec0) CALL ctim2abss(yearsv,monthsv,daysv,hoursv,minutesv,secondsv, & abstsec1) abstsec0 = abstsec0 + nint(time_tmp) abstsec1 = abstsec1 + nint(tstart) IF ( abstsec0 /= abstsec1 ) THEN WRITE(6,'(a,2(/a,1x,i4.4,5(a,i2.2),a,f10.3))') & 'WARNING: Data time is inconsistent with user input time.', & ' Data initime:', year,'-',month,'-',day,'.', & hour,':',minute,':',second, & ' model data time: ', tstart, & ' User initime:', yearsv,'-',monthsv,'-',daysv,'.', & hoursv,':',minutesv,':',secondsv, & ' model starting time: ', time_tmp IF ( timeopt == 1 ) THEN WRITE(6,'(a)') 'Program continues using user specified time' year = yearsv month = monthsv day = daysv hour = hoursv minute = minutesv second = secondsv ELSE IF ( timeopt == 2 ) THEN WRITE(6,'(a)') 'Program continues using data time' tstart = time_tmp ELSE WRITE(6,'(a)') 'Program stopped in subroutine EXTINIT' CALL arpsstop ("arpsstop called from extinit due to timeopt",1) END IF ELSE year = yearsv month = monthsv day = daysv hour = hoursv minute = minutesv second = secondsv IF (myproc == 0) & WRITE(6,'(a,i4.4,5(a,i2.2),3x,a,f10.3,a)') & 'Use specified initial time: ', & year,'-',month,'-',day,'.',hour,':',minute,':',second, & 'and model starting time: ', tstart, 'seconds' END IF runname = runnamesv(1:80) tstop = tstopsv thisdmp = thisdmpsv dx = dxsv dy = dysv strhopt = strhoptsv dz = dzsv dzmin = dzminsv zrefsfc = zrefsfcsv dlayer1 = dlayer1sv dlayer2 = dlayer2sv strhtune = strhtunesv zflat = zflatsv nocmnt = nocmnt_old DO i=1,nocmnt cmnt(i)=cmnt_old(i) END DO IF( ireturn /= 0) THEN WRITE(6,'(3(/1x,a))') & 'Error occured when reading history data ', & inifile(1:lenfil)//' or '//inigbf(1:lengbf), & 'Program stopped in EXTINIT.' CALL arpsstop ("arpsstop called from extinit in reading file",1) END IF ! !----------------------------------------------------------------------- ! ! Calculate rhostr & jacobians, set hterain. ! !----------------------------------------------------------------------- ! CALL jacob(nx,ny,nz,x,y,z,zp,j1,j2,j3,tem6) DO k= 1,nz-1 DO j= 1,ny-1 DO i= 1,nx-1 tvbar=(ptbar(i,j,k)*((pbar(i,j,k)*p0inv)**rddcp))* & ((1.0+rvdrd*qvbar(i,j,k))/(1.0+qvbar(i,j,k))) rhostr(i,j,k)= ABS(j3(i,j,k))*pbar(i,j,k)/(rd*tvbar) !The following is used to define rhostr when initializing the base state !from a sounding while the above defines rhobar as the virtual !density. rhostr is there somewhat different for initopt=3 and 4 which calls !extinit. !For the code to be consistent with the initialization of !rhostr/rhobar in INIBASE, use the following version. ! ! rhostr(i,j,k)= abs(j3(i,j,k))*pbar(i,j,k)/ & ! ( Rd * ptbar(i,j,k)*(pbar(i,j,k)*p0inv)**rddcp ) END DO END DO END DO DO j=1,ny-1 DO i=1,nx-1 rhostr(i,j, 1)=rhostr(i,j,2) rhostr(i,j,nz-1)=rhostr(i,j,nz-2) END DO END DO DO i=1,nx DO j=1,ny hterain(i,j) = zp(i,j,2) END DO END DO ! ! call the soil model grid initialization ! ! call jacobsoil...stopped here...add the code. CALL inisoilgrd(nx,ny,nzsoil,hterain,zpsoil,j3soil,j3soilinv) ! !----------------------------------------------------------------------- ! ! Put the 3-d variables into their 4-d arrays. ! !----------------------------------------------------------------------- ! tim = tpresent DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx u(i,j,k,tim)=uprt(i,j,k)+ubar(i,j,k) END DO END DO END DO DO k=1,nz-1 DO j=1,ny DO i=1,nx-1 v(i,j,k,tim)=vprt(i,j,k)+vbar(i,j,k) END DO END DO END DO DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 qv(i,j,k,tim)=qvprt(i,j,k)+qvbar(i,j,k) END DO END DO END DO ! !----------------------------------------------------------------------- ! ! Set the future values of variables to their current values. ! This is done primarily for safety reasons. ! !----------------------------------------------------------------------- ! IF( initopt < 0 .or. initopt > 4 ) then write(6,'(a,i10)') 'Value of initopt incorrect. It was ', initopt CALL arpsstop ("arpsstop called from EXTINIT ",1) ENDIF IF(initopt == 3) THEN IF(nts > 1 ) THEN DO k=1,nz DO j=1,ny DO i=1,nx u (i,j,k,tfuture) = u (i,j,k,tpresent) v (i,j,k,tfuture) = v (i,j,k,tpresent) w (i,j,k,tfuture) = w (i,j,k,tpresent) ptprt(i,j,k,tfuture) = ptprt(i,j,k,tpresent) pprt (i,j,k,tfuture) = pprt (i,j,k,tpresent) qv (i,j,k,tfuture) = qv (i,j,k,tpresent) qc (i,j,k,tfuture) = qc (i,j,k,tpresent) qr (i,j,k,tfuture) = qr (i,j,k,tpresent) qi (i,j,k,tfuture) = qi (i,j,k,tpresent) qs (i,j,k,tfuture) = qs (i,j,k,tpresent) qh (i,j,k,tfuture) = qh (i,j,k,tpresent) tke (i,j,k,tfuture) = tke (i,j,k,tpresent) u (i,j,k,tpast ) = u (i,j,k,tpresent) v (i,j,k,tpast ) = v (i,j,k,tpresent) w (i,j,k,tpast ) = w (i,j,k,tpresent) ptprt(i,j,k,tpast ) = ptprt(i,j,k,tpresent) pprt (i,j,k,tpast ) = pprt (i,j,k,tpresent) qv (i,j,k,tpast ) = qv (i,j,k,tpresent) qc (i,j,k,tpast ) = qc (i,j,k,tpresent) qr (i,j,k,tpast ) = qr (i,j,k,tpresent) qi (i,j,k,tpast ) = qi (i,j,k,tpresent) qs (i,j,k,tpast ) = qs (i,j,k,tpresent) qh (i,j,k,tpast ) = qh (i,j,k,tpresent) tke (i,j,k,tpast ) = tke (i,j,k,tpresent) END DO END DO END DO END IF ! DO k=1,nz DO j=1,ny DO i=1,nx ptcumsrc(i,j,k)=0.0 qcumsrc(i,j,k,1)=0.0 qcumsrc(i,j,k,2)=0.0 qcumsrc(i,j,k,3)=0.0 qcumsrc(i,j,k,4)=0.0 qcumsrc(i,j,k,5)=0.0 END DO END DO END DO ENDIF !----------------------------------------------------------------------- ! ! Print out the max/min of initial arrays read in. ! !----------------------------------------------------------------------- ! tim = tpresent IF (myproc ==0) & WRITE(6,'(1x,a/)') 'Min. and max. of the data arrays read in:' 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(j3,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))') 'j3min = ', amin,', j3max =',amax CALL a3dmax0(ubar,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))') 'ubarmin = ', amin,', ubarmax =',amax CALL a3dmax0(vbar,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))') 'vbarmin = ', amin,', vbarmax =',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(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(rhostr,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))') 'rhostrmin=', amin,', rhostrmax=',amax CALL a3dmax0(qvbar,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))') 'qvbarmin= ', amin,', qvbarmax=',amax CALL a3dmax0(u(1,1,1,tim),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,1,1,tim),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,1,1,tim),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(ptprt(1,1,1,tim),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(pprt(1,1,1,tim),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,1,1,tim),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 CALL a3dmax0(qc(1,1,1,tim),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))') 'qcmin = ', amin,', qcmax =',amax CALL a3dmax0(qr(1,1,1,tim),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))') 'qrmin = ', amin,', qrmax =',amax CALL a3dmax0(qi(1,1,1,tim),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))') 'qimin = ', amin,', qimax =',amax CALL a3dmax0(qs(1,1,1,tim),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))') 'qsmin = ', amin,', qsmax =',amax CALL a3dmax0(qh(1,1,1,tim),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))') 'qhmin = ', amin,', qhmax =',amax CALL a3dmax0(tke(1,1,1,tim),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))') 'tkemin = ', amin,', tkemax =',amax ! IF ( sfcphy.gt.0 ) THEN ! CALL a3dmax0(tsoil,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1, amax,amin) ! write(6,'(1x,2(a,e13.6))') 'tsoilmin= ',amin,', tsoilmax =',amax ! CALL a3dmax0(qsoil,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1, amax,amin) ! 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) ! write(6,'(1x,2(a,e13.6))') 'wetcmin = ',amin,', wetcmax =',amax ! ENDIF CALL a3dmax0(ptcumsrc,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))') 'ptcummin= ', amin,', ptcummax=',amax CALL a3dmax0(qcumsrc(1,1,1,1),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))') 'qvcummin= ', amin,', qvcummax=',amax CALL a3dmax0(qcumsrc(1,1,1,2),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))') 'qccummin= ', amin,', qccummax=',amax CALL a3dmax0(qcumsrc(1,1,1,3),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))') 'qrcummin= ', amin,', qrcummax=',amax CALL a3dmax0(qcumsrc(1,1,1,4),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))') 'qicummin= ', amin,', qicummax=',amax CALL a3dmax0(qcumsrc(1,1,1,5),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))') 'qscummin= ', amin,', qscummax=',amax RETURN END SUBROUTINE extinit ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE INITSFC ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! ! SUBROUTINE initsfc(nx,ny,nz,nzsoil,nstyps, & 1,51 zpsoil, & pbar,pprt,ptbar,ptprt,qvbar,qv, & soiltyp,stypfrct,vegtyp,lai,roufns,veg, & ndvi, & tsoil,qsoil,wetcanp,snowdpth,qvsfc,tem1soil) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Initialize the surface characteristics data and soil model ! variables according to option parameters sfcdat and soilinit. ! ! The surface and soil data files are sequential binary files. ! ! Their structures should be: ! !----------------------------------------------------------------------- ! ! AUTHOR: Yuhe Liu ! 02/17/94 ! ! MODIFICATION: ! ! 02/07/1995 (Yuhe Liu) ! Added a new 2-D permanent array, veg(nx,ny), to the soil model and ! at the same time delete the table data array veg(14). ! ! 01/29/1995 (V. Wong and X. Song) ! Add a flag wtrexist in "initsfc". ! ! 12/04/1997 (Yuhe Liu) ! Set the soil variables to their default value read in from input ! file if they are not included in soilinit file. ! ! 12/09/1998 (Donghai Wang) ! Added the snow cover. ! ! 2000/01/07 (Gene Bassett) ! Modified the behavior for the case where soil data read in from file ! and also present in history file. If soilinit=2, initopt=3 and ! sfcin=1, for soil variables that are not in soildata file the values ! in the history file are used. ! ! 05/17/2002 (Dan Weber) ! Added new soil model variables. ! ! 15 June 2002 (Eric Kemp) ! Bug fixes. ! !----------------------------------------------------------------------- ! ! INPUT and OUTPUT: ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the z-direction (sfc/top) ! nzsoil Number of grid points in the soil model in the -z-direction ! ! pbar Base state pressure ! pprt Preturbation pressure ! ! ptbar Base state potential temperature ! ptprt Preturbation potential temperature ! ! qvbar Base state water vapor mixing ratio ! qv Water vapor mixing ratio ! ! soiltyp Soil type at the horizontal grid points ! stypfrct Soil type fraction ! vegtyp Vegetation type at the horizontal grid points ! lai Leaf Area Index ! roufns Surface roughness ! veg Vegetation fraction ! ! tsoil Soil temperature (K) ! qsoil Soil moisture (m**3/m**3) ! wetcanp Canopy water amount ! qvsfc Effective S.H. at sfc. ! ! TEMPORARY WORKING ARRAY ! ! tem1soil Soil model temporary work array. ! !----------------------------------------------------------------------- ! ! Variable Declarations. (Local Variables) ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! REAL :: pi PARAMETER ( pi = 3.141592654) INTEGER :: nx, ny, nz INTEGER :: nzsoil ! Number of grid points in the -z-direction REAL :: zpsoil (nx,ny,nzsoil) ! soil model points elevations. (m) REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal) REAL :: pprt (nx,ny,nz) ! Perturbation pressure (Pascal) REAL :: ptbar (nx,ny,nx) ! Base state potential temperature (K) REAL :: ptprt (nx,ny,nz) ! Perturbation potential temperature (K) REAL :: qvbar (nx,ny,nz) ! Base state specific humidity (kg/kg) REAL :: qv (nx,ny,nz) ! Total specific humidity (kg/kg) INTEGER :: nstyps ! Number of soil types INTEGER :: soiltyp(nx,ny,nstyps) ! Soil type at each point REAL :: stypfrct(nx,ny,nstyps) ! Fraction of soil types INTEGER :: vegtyp (nx,ny) ! Vegetation type at each point REAL :: lai (nx,ny) ! Leaf Area Index REAL :: roufns (nx,ny) ! Surface roughness REAL :: veg (nx,ny) ! Vegetation fraction REAL :: ndvi (nx,ny) ! NDVI REAL :: tsoil (nx,ny,nzsoil,0:nstyps) ! Soil layer temperature (K) REAL :: qsoil (nx,ny,nzsoil,0:nstyps) ! Soil layer moisture(m**3/m**3) REAL :: wetcanp(nx,ny,0:nstyps) ! Canopy moisture REAL :: snowdpth(nx,ny) ! Snow depth (m) REAL :: qvsfc (nx,ny,0:nstyps) ! Effective surface specific ! humidity (kg/kg) ! !----------------------------------------------------------------------- ! ! Define local variables ! !----------------------------------------------------------------------- ! REAL :: psfc ! Surface pressure REAL :: rhgs ! The relative humidity at ground surface REAL :: qvsatts ! Saturated specific humidity at surface REAL :: wrmax ! Maximum value for canopy moisture, wetcanp REAL :: pterm ! Temporary variable, real positive term flag REAL :: p0inv ! Inverse of p0 (1000 mb) REAL :: tema ! Temporary variable REAL :: temb ! Temporary variable ! !----------------------------------------------------------------------- ! ! Global constants and parameters, most of them specify the ! model run options. ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'grid.inc' ! Grid & map parameters. INCLUDE 'indtflg.inc' INCLUDE 'phycst.inc' INCLUDE 'soilcst.inc' INCLUDE 'bndry.inc' INCLUDE 'mp.inc' ! Message passing parameters. ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k,is,imid,jmid,ii INTEGER :: zpsoilin INTEGER :: tsoilin INTEGER :: qsoilin INTEGER :: wcanpin INTEGER :: snowdin INTEGER :: astat INTEGER, ALLOCATABLE :: mpitmp(:) REAL, ALLOCATABLE :: mprtmp(:) REAL :: tem1soil(nx,ny,nzsoil) ! Temporary soil model work array. ! !----------------------------------------------------------------------- ! ! 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... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! IF (mp_opt > 0 .AND. (sfcdat == 1 .OR. soilinit == 1)) THEN ALLOCATE(mpitmp(MAX(nx,ny)*2),stat=astat) CALL check_alloc_status(astat, "initsfc:mpitmp") ALLOCATE(mprtmp(MAX(nx,ny)*2),stat=astat) CALL check_alloc_status(astat, "initsfc:mprtmp") END IF p0inv = 1.0/p0 IF ( initopt == 2 ) THEN IF(myproc ==0) WRITE (6, '(a,a/a/a/a/a)') & 'Model initialization option was set to restart. ', & 'All the surface and soil arrays should have been read', & 'in from the restart file. No more initialization is ', & 'done in subroutine INITSFC.' wtrexist=0 DO j = 1, ny DO i = 1, nx DO is = 1,nstyp IF (soiltyp(i,j,is) == 13) THEN wtrexist=1 RETURN END IF END DO END DO END DO RETURN END IF IF ( sfcdat == 1 ) THEN nstyp = 1 DO j=1, ny-1 DO i=1, nx-1 soiltyp(i,j,1) = styp vegtyp (i,j) = vtyp lai (i,j) = lai0 roufns (i,j) = roufns0 veg (i,j) = veg0 END DO END DO ELSE IF (sfcdat == 2 .OR. (sfcdat == 3.AND.landin /= 1) ) THEN ! !----------------------------------------------------------------------- ! ! Read the surface property data from file sfcdtfl (passed ! in globcst.inc). ! !----------------------------------------------------------------------- ! ! blocking inserted for ordering i/o for message passing DO i=0,nprocs-1,readstride IF(myproc >= i.AND.myproc <= i+readstride-1)THEN IF (mp_opt > 0 .AND. readsplit > 0) THEN CALL readsplitsfcdt( nx,ny,nstyps,sfcdtfl,dx,dy, & mapproj,trulat1,trulat2,trulon,sclfct,ctrlat,ctrlon, & soiltyp,stypfrct,vegtyp,lai,roufns,veg,ndvi ) ELSE CALL readsfcdt( nx,ny,nstyps,sfcdtfl,dx,dy, & mapproj,trulat1,trulat2,trulon,sclfct,ctrlat,ctrlon, & soiltyp,stypfrct,vegtyp,lai,roufns,veg,ndvi ) END IF END IF IF (mp_opt > 0) CALL mpbarrier END DO ELSE IF(sfcdat == 3 .AND. landin == 1) THEN WRITE(6,'(1x,a/,a/)') & 'Surface property data in the initialization file was used.', & 'No more initialization performed.' ELSE WRITE(6,'(1x,a,i3,a/)') & 'Invalid surface data input option. sfcdat =',sfcdat, & '. Program stopped in INITSFC.' CALL arpsstop ("arpsstop called from initsfc with sfcdat option",1) END IF ! print *, ' nstyps = ',nstyps ! imid=(nx/2)+1 ! jmid=(ny/2)+1 ! DO is=1,nstyps ! print *, ' Sample soil ( ',imid,jmid,') = ', & ! soiltyp(imid,jmid,is),stypfrct(imid,jmid,is) ! END DO IF ( nstyp == 1 ) THEN DO j=1,ny DO i=1,nx stypfrct(i,j,1) = 1.0 END DO END DO END IF IF ( soilinit == 1 ) THEN ! !----------------------------------------------------------------------- ! ! All surface variables are specified uniformly in horizontal from ! the input namelist. ! !----------------------------------------------------------------------- DO k=1,nzsoil DO j=1, ny-1 DO i=1, nx-1 psfc = .5 * ( (pbar(i,j,1)+pprt(i,j,1)) & + (pbar(i,j,2)+pprt(i,j,2)) ) tsoil (i,j,k,0) = tsoilint(k) qsoil (i,j,k,0) = qsoilint(k) IF( soiltyp(i,j,1) == 13) THEN ! For water tsoil(i,j,1,0) = ptswtr0*(psfc*p0inv)**rddcp ELSE ! For land tsoil(i,j,1,0) = ptslnd0*(psfc*p0inv)**rddcp END IF wetcanp(i,j,0) = wetcanp0 snowdpth(i,j) = snowdpth0 END DO END DO END DO DO is=1,nstyp DO k=1,nzsoil DO j=1,ny-1 DO i=1,nx-1 tsoil (i,j,k,is) = tsoil (i,j,k,0) qsoil (i,j,k,is) = qsoil (i,j,k,0) END DO END DO END DO DO j=1,ny-1 DO i=1,nx-1 wetcanp(i,j,is) = wetcanp(i,j,0) END DO END DO END DO ELSE IF ( (soilinit == 2) .OR. (soilinit == 5) & .OR. (soilinit == 3 .AND. sfcin /= 1) ) THEN ! !----------------------------------------------------------------------- ! ! Read the soil variables from file soilinfl. soilinfl is ! passed in globcst.inc. ! !----------------------------------------------------------------------- ! ! blocking inserted for ordering i/o for message passing DO ii=0,nprocs-1,readstride IF(myproc >= ii.AND.myproc <= ii+readstride-1) THEN IF (mp_opt >0 .AND. readsplit > 0) THEN CALL readsplitsoil(nx,ny,nzsoil,nstyps,soilinfl,dx,dy,zpsoil, & mapproj,trulat1,trulat2,trulon,sclfct,ctrlat,ctrlon, & zpsoilin,tsoilin,qsoilin,wcanpin,snowdin, & tsoil,qsoil,wetcanp,snowdpth,soiltyp) ELSE CALL readsoil(nx,ny,nzsoil,nstyps,soilinfl,dx,dy,zpsoil, & mapproj,trulat1,trulat2,trulon,sclfct,ctrlat,ctrlon, & zpsoilin,tsoilin,qsoilin,wcanpin,snowdin, & tsoil,qsoil,wetcanp,snowdpth,soiltyp) END IF END IF IF(soilinit == 5)THEN DO is=1,nstyp DO k=1,nzsoil DO j=1,ny-1 DO i=1,nx-1 tsoil (i,j,k,is) = tsoil (i,j,k,0) qsoil (i,j,k,is) = qsoil (i,j,k,0) END DO END DO END DO END DO END IF IF (mp_opt > 0) CALL mpbarrier END DO IF (sfcin /= 1) THEN IF ( tsoilin /= 1 ) THEN DO is=1,nstyp DO j=1, ny-1 DO i=1, nx-1 psfc = .5 * ( (pbar(i,j,1)+pprt(i,j,1)) & + (pbar(i,j,2)+pprt(i,j,2)) ) IF( soiltyp(i,j,1) == 13) THEN ! For water tsoil(i,j,1,is) = ptswtr0*(psfc*p0inv)**rddcp ELSE ! For land tsoil(i,j,1,is) = ptslnd0*(psfc*p0inv)**rddcp END IF END DO END DO END DO DO is=1,nstyp DO k=2, nzsoil DO j=1, ny-1 DO i=1, nx-1 tsoil(i,j,k,is) = tsoilint(k) END DO END DO END DO END DO END IF IF ( qsoilin /= 1 ) THEN DO is=1,nstyp DO j=1, ny-1 DO i=1, nx-1 qsoil(i,j,1,is) = qsoilint(1) END DO END DO END DO DO is=1,nstyp DO k=2, nzsoil DO j=1, ny-1 DO i=1, nx-1 qsoil(i,j,k,is) = qsoilint(2) END DO END DO END DO END DO END IF IF ( wcanpin /= 1 ) THEN DO is=1,nstyp DO j=1, ny-1 DO i=1, nx-1 wetcanp(i,j,is) = wetcanp0 END DO END DO END DO END IF IF ( snowdin /= 1 ) THEN DO j=1, ny-1 DO i=1, nx-1 snowdpth(i,j) = snowdpth0 END DO END DO END IF END IF ELSE IF(soilinit == 3 .AND. sfcin == 1) THEN WRITE(6,'(1x,a/,a/)') & 'Surface variable in the initialization file was used.', & 'No more initialization performed.' IF ( nstyp == 1 ) THEN DO k=1,nzsoil DO j=1,ny-1 DO i=1,nx-1 tsoil (i,j,k,1) = tsoil (i,j,k,0) qsoil (i,j,k,1) = qsoil (i,j,k,0) END DO END DO END DO DO j=1,ny-1 DO i=1,nx-1 wetcanp(i,j,1) = wetcanp(i,j,0) END DO END DO END IF ELSE IF(soilinit == 4) THEN p0inv=1./p0 DO j=1,ny-1 DO i=1,nx-1 tema=0.5*((ptbar(i,j,2)+ptprt(i,j,2)) & +(ptbar(i,j,1)+ptprt(i,j,1))) psfc=0.5*((pbar(i,j,2)+pprt(i,j,2)) & +(pbar(i,j,1)+pprt(i,j,1))) temb = tema*(psfc*p0inv)**rddcp tsoil (i,j,1,0) = temb + ttprt tsoil (i,j,nzsoil,0) = temb + tbprt qsoil (i,j,1,0) = 0.0 qsoil (i,j,2,0) = 0.0 wetcanp(i,j,0) = wetcanp0 snowdpth(i,j) = snowdpth0 END DO END DO DO is=1,nstyp DO j=1,ny-1 DO i=1,nx-1 tsoil (i,j,1,is) = tsoil (i,j,1,0) IF (soiltyp(i,j,is) == 13) THEN !Andreas 30-10-03: Make moisture of water 1 qsoil(i,j,1,is) = 1. ELSE qsoil(i,j,1,is) = wgrat*wsat(soiltyp(i,j,is)) ENDIF qsoil(i,j,1,0) = qsoil(i,j,1,0)+stypfrct(i,j,is)*qsoil(i,j,1,is) wetcanp(i,j,is) = wetcanp(i,j,0) END DO END DO DO k=2,nzsoil DO j=1,ny-1 DO i=1,nx-1 tsoil(i,j,k,is) = tsoil(i,j,1,0) - ((k - 1)/(nzsoil - 1))* & (tsoil(i,j,1,0)-tsoil(i,j,nzsoil,0)) IF (soiltyp(i,j,is) == 13) THEN !Andreas 30-10-03: Make moisture of water 1 qsoil(i,j,k,is) = 1. ELSE qsoil(i,j,k,is) = w2rat*wsat(soiltyp(i,j,is)) ENDIF qsoil(i,j,k,0) = qsoil(i,j,k,0)+stypfrct(i,j,is)*qsoil(i,j,k,is) END DO END DO END DO END DO ELSE WRITE(6,'(1x,a,i3,a/)') & 'Invalid surface variable input option. soilinit =',soilinit, & '. Program stopped in INITSFC.' CALL arpsstop ("arpsstop called from initsfc with soilinit option",1) END IF IF ( moist /= 0 ) THEN DO is=1,nstyp DO k = 1, nzsoil DO j = 1, ny-1 DO i = 1, nx-1 qsoil(i,j,k,is) = MAX( qsoil(i,j,k,is), 0.0 ) qsoil(i,j,k,is) = MIN( qsoil(i,j,k,is), wsat(soiltyp(i,j,is)) ) END DO END DO END DO DO j = 1, ny-1 DO i = 1, nx-1 wrmax = 0.2*1.0E-3*veg(i,j)*lai(i,j) wetcanp(i,j,is) = MAX( wetcanp(i,j,is), 0.0 ) wetcanp(i,j,is) = MIN( wetcanp(i,j,is), wrmax ) END DO END DO END DO DO k = 1, nzsoil DO j = 1, ny-1 DO i = 1, nx-1 qsoil (i,j,k,0) = MAX( qsoil(i,j,k,0), 0.0 ) END DO END DO END DO DO j = 1, ny-1 DO i = 1, nx-1 wetcanp(i,j,0) = MAX( wetcanp(i,j,0), 0.0 ) END DO END DO ELSE DO is=0,nstyp DO k = 1, nzsoil DO j = 1, ny-1 DO i = 1, nx-1 qsoil(i,j,k,is) = 0.0 END DO END DO END DO wetcanp(:,:,is) = 0.0 END DO END IF DO is=1,nstyp DO j = 1, ny-1 DO i = 1, nx-1 psfc = .5 * ( (pbar(i,j,1)+pprt(i,j,1)) & + (pbar(i,j,2)+pprt(i,j,2)) ) qvsatts = f_qvsat( psfc, tsoil(i,j,1,is) ) IF ( soiltyp(i,j,is) == 12 .OR. soiltyp(i,j,is) == 13) THEN ! Ice and water rhgs = 1.0 ELSE IF ( soiltyp(i,j,is) > 0 ) THEN pterm = .5+SIGN(.5,qsoil(i,j,1,is)-1.1*wfc(soiltyp(i,j,is))) rhgs = pterm + (1.-pterm) & * 0.25 * ( 1.-COS(qsoil(i,j,1,is)*pi & /(1.1*wfc(soiltyp(i,j,is)))) )**2 ELSE rhgs = 0.0 END IF qvsfc(i,j,is) = rhgs * qvsatts END DO END DO END DO ! !----------------------------------------------------------------------- ! ! Ensure soil values are consistent with each other. ! !----------------------------------------------------------------------- ! tsoil (:,:,:,0) = 0.0 qsoil (:,:,:,0) = 0.0 wetcanp(:,:,0) = 0.0 DO is = 1,nstyp DO k=1,nzsoil DO j=1,ny-1 DO i=1,nx-1 tsoil(i,j,k,0) = tsoil(i,j,k,0) & + tsoil(i,j,k,is) * stypfrct(i,j,is) qsoil(i,j,k,0) = qsoil(i,j,k,0) & + qsoil(i,j,k,is) * stypfrct(i,j,is) END DO END DO END DO DO j=1,ny-1 DO i=1,nx-1 wetcanp(i,j,0) = wetcanp(i,j,0) & + wetcanp(i,j,is) * stypfrct(i,j,is) END DO END DO END DO DO j=1,ny-1 DO i=1,nx-1 IF ((vegtyp(i,j) == 14) .OR. (tsoil(i,j,1,0) > 273.16)) THEN snowdpth(i,j) = 0. ! Make sure that snow cover is consistent END IF ! with vegetation type and soil temperature. END DO END DO DO j = 1, ny-1 DO i = 1, nx-1 qvsfc(i,j,0) = 0.0 END DO END DO DO is=1,nstyp DO j = 1, ny-1 DO i = 1, nx-1 qvsfc(i,j,0) = qvsfc(i,j,0) + qvsfc(i,j,is)*stypfrct(i,j,is) END DO END DO END DO IF ( sfcdat == 1 ) THEN DO is=1,nstyp IF (mp_opt > 0) THEN CALL acct_interrupt(mp_acct) CALL mpsendrecv1diew(soiltyp(1,1,is),nx,ny,ebc,wbc,0,mpitmp) CALL mpsendrecv1dins(soiltyp(1,1,is),nx,ny,nbc,sbc,0,mpitmp) CALL mpsendrecv1dew(stypfrct(1,1,is),nx,ny,ebc,wbc,0,mprtmp) CALL mpsendrecv1dns(stypfrct(1,1,is),nx,ny,nbc,sbc,0,mprtmp) END IF CALL acct_interrupt(bc_acct) CALL bcis2d(nx,ny, soiltyp (1,1,is), ebc,wbc,nbc,sbc) CALL bcs2d (nx,ny, stypfrct(1,1,is), ebc,wbc,nbc,sbc) CALL acct_stop_inter END DO IF (mp_opt > 0) THEN CALL acct_interrupt(mp_acct) CALL mpsendrecv1diew(vegtyp,nx,ny,ebc,wbc,0,mpitmp) CALL mpsendrecv1dins(vegtyp,nx,ny,nbc,sbc,0,mpitmp) CALL mpsendrecv1dew(lai,nx,ny,ebc,wbc,0,mprtmp) CALL mpsendrecv1dns(lai,nx,ny,nbc,sbc,0,mprtmp) CALL mpsendrecv1dew(roufns,nx,ny,ebc,wbc,0,mprtmp) CALL mpsendrecv1dns(roufns,nx,ny,nbc,sbc,0,mprtmp) CALL mpsendrecv1dew(veg,nx,ny,ebc,wbc,0,mprtmp) CALL mpsendrecv1dns(veg,nx,ny,nbc,sbc,0,mprtmp) CALL mpsendrecv1dew(snowdpth,nx,ny,ebc,wbc,0,mprtmp) CALL mpsendrecv1dns(snowdpth,nx,ny,nbc,sbc,0,mprtmp) END IF CALL acct_interrupt(bc_acct) CALL bcis2d(nx,ny, vegtyp, ebc,wbc,nbc,sbc) CALL bcs2d (nx,ny, lai, ebc,wbc,nbc,sbc) CALL bcs2d (nx,ny, roufns, ebc,wbc,nbc,sbc) CALL bcs2d (nx,ny, veg, ebc,wbc,nbc,sbc) CALL bcs2d (nx,ny, snowdpth,ebc,wbc,nbc,sbc) CALL acct_stop_inter END IF IF ( soilinit == 1 ) THEN DO is=0,nstyp IF (mp_opt > 0) THEN CALL acct_interrupt(mp_acct) CALL mpsendrecv2dew(tsoil(1,1,1,is),nx,ny,nzsoil,ebc,wbc,0,tem1soil) CALL mpsendrecv2dns(tsoil(1,1,1,is),nx,ny,nzsoil,nbc,sbc,0,tem1soil) CALL mpsendrecv2dew(qsoil(1,1,1,is),nx,ny,nzsoil,ebc,wbc,0,tem1soil) CALL mpsendrecv2dns(qsoil(1,1,1,is),nx,ny,nzsoil,nbc,sbc,0,tem1soil) CALL mpsendrecv1dew(wetcanp(1,1,is),nx,ny,ebc,wbc,0,mprtmp) CALL mpsendrecv1dns(wetcanp(1,1,is),nx,ny,nbc,sbc,0,mprtmp) CALL mpsendrecv1dew(qvsfc(1,1,is), nx,ny,ebc,wbc,0,mprtmp) CALL mpsendrecv1dns(qvsfc(1,1,is), nx,ny,nbc,sbc,0,mprtmp) END IF CALL acct_interrupt(bc_acct) DO k=1,nzsoil CALL bcs2d (nx,ny, tsoil (1,1,k,is), ebc,wbc,nbc,sbc) CALL bcs2d (nx,ny, qsoil (1,1,k,is), ebc,wbc,nbc,sbc) END DO CALL bcs2d (nx,ny, wetcanp(1,1,is), ebc,wbc,nbc,sbc) CALL bcs2d (nx,ny, qvsfc (1,1,is), ebc,wbc,nbc,sbc) CALL acct_stop_inter END DO END IF IF (mp_opt > 0 .AND. (sfcdat == 1 .OR. soilinit == 1)) THEN DEALLOCATE (mpitmp,stat=astat) DEALLOCATE (mprtmp,stat=astat) END IF wtrexist=0 DO j = 1, ny DO i = 1, nx DO is = 1,nstyp IF (soiltyp(i,j,is) == 13) THEN wtrexist=1 RETURN END IF END DO END DO END DO RETURN WRITE (6,'(/a,i2/a)') & ' Read error in surface data file ' & //soilinfl//' with the I/O unit ',sfcunit, & 'The model will STOP in subroutine INITSFC.' CALL arpsstop ("arpsstop called from initsfc reading sfc data file",1) WRITE (6,'(/a,i2/a)') & ' Read error in surface initial data file ' & //soilinfl//' with the I/O unit ',sfcunit, & 'The model will STOP in subroutine INITSFC.' CALL arpsstop ("arpsstop called from initsfc reading sfc data file-2",1) END SUBROUTINE initsfc ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE FLZERO ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE flzero(a,n) 98 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Fill in an entire array with zeros. ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! 10/10/1991. ! ! MODIFICATION HISTORY: ! ! 5/02/92 (M. Xue) ! Added full documentation. ! ! 5/03/92 (M. Xue) ! Further documentation. ! ! 9/10/94 (Weygandt & Y. Lu) ! Cleaned up documentation. ! !----------------------------------------------------------------------- ! ! INPUT : ! ! n The dimension of 1-D array a. ! ! OUTPUT: ! ! a 1-D array filled with zeros. ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i, n REAL :: a(n) ! 1-D array filled with zeros ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! DO i=1,n a(i)=0.0 END DO RETURN END SUBROUTINE flzero ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE INITLKTB ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE initlktb 2,1 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Initializes arrays used for lookup table functions. ! !----------------------------------------------------------------------- ! ! AUTHOR: Adwait Sathye ! 06/02/94 ! ! MODIFICATION HISTORY: ! ! 2/17/97 (J. Zong) ! Corrected definitions of the power functions in loop 100. ! ! 2/24/97 (Jinxing Zong, Ming Xue and Yuhe Liu) ! Defined five pwr arrays for lookup tables to replace fractional ! power calculations in Tao ice microphysics. ! ! 8 November 2002 (Eric Kemp) ! Added pwr lookup tables for Ferrier fall speed options, and further ! optimized previous tables. ! !----------------------------------------------------------------------- ! ! INPUT: ! ! OUTPUT: ! pwr arrays filled with evenly spaced data points ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! !----------------------------------------------------------------------- ! ! INCLUDE FILES ! !----------------------------------------------------------------------- ! INCLUDE 'phycst.inc' REAL :: tnw,tns,tng,roqr,roqs,roqg COMMON /size/ tnw,tns,tng,roqr,roqs,roqg ! Set in subroutine STCSTICE ! !----------------------------------------------------------------------- ! ! LOCAL VARIABLES ! !----------------------------------------------------------------------- ! INTEGER :: i REAL :: temper REAL :: cpi, rhoqx, lambda ! EMK ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! DO i = 0, 1001 pwr2046(i) = ( 0.05 * i / 1000.0 ) ** 0.2046 pwr525(i) = ( 0.05 * i / 1000.0 ) ** 0.525 pwr875(i) = ( 0.05 * i / 1000.0 ) ** 0.875 pwr1364(i) = ( 0.05 * i / 1000000.0 ) ** 0.1364 END DO !----------------------------------------------------------------------- ! ! Build a look up table for the Latent heat of vaporation, calculated ! in the temperature range of (-100,50) degree Celcius ! according to formula ! ! Lv = lathv * (273.15/tbar)**(0.167+3.67E-4*tbar) ! ! Lv for t(K) is given by ! ! index = max( min(151, NINT(t-172.15)), 1) ! Lv = latheatv(index) ! ! where lathv = 2.500780e6 is set in phycst.inc, and t is the ! !----------------------------------------------------------------------- DO i=-100,50 temper = i+273.15 latheatv(i+101)=lathv * (273.15/temper)**(0.167+3.67E-4*temper) END DO !----------------------------------------------------------------------- ! ! Build lookup tables for T**0.81 and (rhobar/mu/psi**2)**one6th, ! where mu and psi stand for dynamic viscosity of air and diffusivity ! of water vapor in air, respectively. The temerature ranges from ! -100 to 50 degree Celcius, pressure from 0 to 1500 hPa, and air ! density from 0 to 1.5 kg/m**3 in the calculations of the tables. ! With the above ranges of T, p and air density, (rhobar/mu/psi**2) ! is between 0.0 and 3000.0. ! !----------------------------------------------------------------------- DO i = 0, 151 pwr81(i) = ( 173.15 + i ) ** 0.81 END DO DO i = 0, 10001 pwr1666(i) = ( 3000.0 * i / 10000.0 ) ** 0.1666667 END DO !----------------------------------------------------------------------- ! ! Lookup tables for (rhobar*q)**a, where q can be qr, qs or qh. ! rhobar is in g/cm***3. rhobar*q ranges from 0 to 50.e-6. The ! increment of the tables is 50.e-9. ! !----------------------------------------------------------------------- cpi = 4.*ATAN(1.) ! EMK CALL stcstice() ! EMK Initialize Lin-Tao scheme parameters DO i = 0, 10001 ! pwr2 (i) = ( 0.05 * i / 10000000.0 ) ** 0.2 ! pwr0625 (i) = ( 0.05 * i / 10000000.0 ) ** 0.0625 ! pwr15625(i) = ( 0.05 * i / 10000000.0 ) ** 0.15625 ! pwr105(i) = ( 0.05 * i / 10000000.0 ) ** 0.105 ! EMK ! pwr1596(i) = ( 0.05 * i / 10000000.0 ) ** 0.1596 ! EMK ! rhoqx = 0.05 * i / 10000000.0 ! EMK cgs units rhoqx = 0.05 * i * 1.0E-7 ! EMK cgs units pwr2 (i) = ( rhoqx ) ** 0.2 pwr0625 (i) = ( rhoqx ) ** 0.0625 pwr15625(i) = ( rhoqx ) ** 0.15625 pwr105(i) = ( rhoqx ) ** 0.105 ! EMK pwr1596(i) = ( rhoqx ) ** 0.1596 ! EMK ! EMK 18 November 2002 IF(i == 0)THEN pwrlam195ratio(i) = 0.0 ELSE lambda = SQRT(SQRT(cpi*roqr*tnw/rhoqx)) ! EMK cgs units pwrlam195ratio(i) = ( lambda + 1.95 ) ** 5 ! EMK pwrlam195ratio(i) = (lambda**4)/pwrlam195ratio(i) ! pwrlam195ratio(i) = SQRT(SQRT(rhoqx/(cpi*roqr*tnw))) ! EMK cgs units ! pwrlam195ratio(i) = ( 1. + (1.95*pwrlam195ratio(i))) ** 5 ! EMK ! pwrlam195ratio(i) = rhoqx/pwrlam195ratio(i) END IF END DO RETURN END SUBROUTINE initlktb ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE GTSINLAT ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE gtsinlat(nx,ny, x,y, sinlat, xs, ys, temxy) 2,1 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Calculate the sin of the lattitude of each grid point, to be used ! in the calculation of latitude-dependent Coriolis parameters. ! !----------------------------------------------------------------------- ! ! ! AUTHOR: Ming Xue ! 3/21/95. ! ! MODIFICATION HISTORY: ! !----------------------------------------------------------------------- ! ! INPUT: ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! x x-coordinate of grid points in computational space (m) ! y y-coordinate of grid points in computational space (m) ! ! OUTPUT: ! ! sinlat Sin of latitude at each grid point ! ! WORK ARRAYS: ! ! xs x-coordinate at scalar points. ! ys y-coordinate at scalar points. ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny ! Dimensions of model grid. REAL :: x (nx) ! The x-coord. of the u points. REAL :: y (ny) ! The y-coord. of the v points. REAL :: sinlat(nx,ny) ! Sin of latitude at each grid point REAL :: xs (nx) ! x-coord. of scalar points. REAL :: ys (ny) ! y-coord. of scalar points. REAL :: temxy (nx,ny) ! Work array. REAL :: r2d INTEGER :: i,j ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! DO i=1,nx-1 xs(i) = (x(i)+x(i+1))*0.5 END DO xs(nx) = -xs(nx-2)+2.0*xs(nx-1) DO j=1,ny-1 ys(j) = (y(j)+y(j+1))*0.5 END DO ys(ny) = -ys(ny-2)+2.0*ys(ny-1) ! CALL xytoll(nx,ny,xs,ys,sinlat,temxy) r2d = ATAN(1.0)*4.0/180.0 DO j=1,ny DO i=1,nx sinlat(i,j) = SIN( r2d * sinlat(i,j) ) END DO END DO RETURN END SUBROUTINE gtsinlat ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE SETPPI ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE setppi(nx,ny,nz,nt,tlvl,pprt,pbar,ppi) 2 IMPLICIT NONE INTEGER :: nx,ny,nz,nt,tlvl REAL :: pprt(nx,ny,nz,nt) REAL :: pbar(nx,ny,nz) REAL :: ppi (nx,ny,nz) INCLUDE 'phycst.inc' INTEGER :: i,j,k REAL :: p0inv p0inv=1./p0 DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 ppi(i,j,k)=((pprt(i,j,k,tlvl)+pbar(i,j,k))*p0inv)**rddcp END DO END DO END DO RETURN END SUBROUTINE setppi ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE STCSTICE ###### !###### ###### !###### Developed by ###### !###### ###### !###### Goddard Cumulus Ensemble Modeling Group, NASA ###### !###### ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! ! SUBROUTINE stcstice 2 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Set constants used by the ice microphyscs parameterization routine ! ICECVT ! ! Lin et.al. J. Clim. Appl. Meteor. 22, 1065-1092 ! Modified and coded by tao and simpson (JAS, 1989; Tao, 1993) ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! AUTHOR: W.G. Tao, Goddard Cumulus Ensemble Modeling Group, NASA ! 01/01/1990 ! ! Modification history: ! ! 9/8/1994 (M. Xue) ! Defined inline function CVMGP to replace external function CVMGP. ! ! 2/24/1997 (J. Zong, M. Xue and Yuhe Liu) ! Constants rn5, rn6, rn22, rn17a, rn19a, rn20b and rn101 are ! redefined to facilitate use of lookup tables to replace power ! calculations for microphysical conversions and terminal velocity. ! ! 08/27/2002 (D. Weber) ! Added fallopt option to provide a choice of fall velocity ! computations. ! !----------------------------------------------------------------------- ! include "globcst.inc" COMMON/size/ tnw,tns,tng,roqr,roqs,roqg COMMON/cont/ c76,c358,c172,c409,c218,c580,c610,c149,c879,c141 COMMON/b3cs/ ag,bg,as,bs,aww,bww,bgh,bgq,bsh,bsq,bwh,bwq COMMON/bterv/ zrc,zgc,zsc,vrc,vgc,vsc COMMON/bsnw/ alv,alf,als,t0,t00,avc,afc,asc,rn1,bnd1,rn2,bnd2, & rn3,rn4,rn5,rn6,rn7,rn8,rn9,rn10,rn101,rn10a,rn11,rn11a, & rn12,rn12a(31),rn12b(31),rn13(31),rn14,rn15,rn15a,rn16,rn17, & rn17a,rn17b,rn17c,rn18,rn18a,rn19,rn19a,rn19b,rn20,rn20a,rn20b, & bnd3,rn21,rn22,rn23,rn23a,rn23b,rn25,rn25a(31),rn30a,rn30b, & rn30c,rn31,beta,rn32 ! DIMENSION a1(31),a2(31) DATA a1/.7939E-7,.7841E-6,.3369E-5,.4336E-5,.5285E-5,.3728E-5, & .1852E-5,.2991E-6,.4248E-6,.7434E-6,.1812E-5,.4394E-5,.9145E-5, & .1725E-4,.3348E-4,.1725E-4,.9175E-5,.4412E-5,.2252E-5,.9115E-6, & .4876E-6,.3473E-6,.4758E-6,.6306E-6,.8573E-6,.7868E-6,.7192E-6, & .6513E-6,.5956E-6,.5333E-6,.4834E-6/ DATA a2/.4006,.4831,.5320,.5307,.5319,.5249,.4888,.3894,.4047, & .4318,.4771,.5183,.5463,.5651,.5813,.5655,.5478,.5203,.4906, & .4447,.4126,.3960,.4149,.4320,.4506,.4483,.4460,.4433,.4413, & .4382,.4361/ ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Define the density and size distribution of precipitation ! !----------------------------------------------------------------------- ! roqr = 1. tnw = .08 roqs = .1 tns = .03 roqg = .913 tng = .0004 ! cpi = 4.*ATAN(1.) cpi2 = cpi*cpi grvt = 980. tca = 2.43E3 dwv = .226 dva = 1.718E-4 amw = 18.016 ars = 8.314E7 scv = 2.2904487 t0 = 273.16 t00 = 238.16 alv = 2.5E10 alf = 3.336E9 als = 2.8336E10 !%%% cp = 1.003E7 ! Missing in the original Tao's code !%%% avc = alv/cp afc = alf/cp asc = als/cp rw = 4.615E6 cw = 4.187E7 ci = 2.093E7 c76 = 7.66 c358 = 35.86 c172 = 17.26939 c409 = 4098.026 c218 = 21.87456 c580 = 5807.695 c610 = 6.1078E3 c149 = 1.496286E-5 c879 = 8.794142 c141 = 1.4144354E7 ! !----------------------------------------------------------------------- ! ! Define the coefficients used in terminal velocity ! !----------------------------------------------------------------------- ! ag = 1400. bg = .5 as = 152.93 bs = .25 aww= 2115. bww= .8 ! print *,fallopt IF(fallopt.eq.2)THEN ! compute Ferrier version of the fall vel. ! ferrier numbers for rain. aww= 4854. bww= 1.0 ! ferrier numbers for snow. as = 129.6 bs = 0.42 ! ferrier numbers for graupel/hail. ag = 1094.3 bg = 0.6384 END IF bgh = .5*bg bsh = .5*bs bwh = .5*bww bgq = .25*bg bsq = .25*bs bwq = .25*bww ga3 = 2. ga4 = 6. ga5 = 24. ga6 = 120. ga7 = 720. ga8 = 5040. ga9 = 40320. ga3b = 4.6941552 IF(fallopt.eq.2)THEN ! Ferrier formulation... ga4b = 4.0 ELSE ! original Lin configuration ga4b = 17.83779 END IF ga4b = 17.83779 ga6b = 496.6041 ga5bh = 1.827363 ga4g = 11.63177 ga3g = 3.3233625 ga5gh = 1.608355 IF (bg == 0.37) THEN ga4g = 9.730877 ga3g = 2.8875 ga5gh = 1.526425 END IF ga3d = 2.54925 ga4d = 8.285063 ga5dh = 1.456943 IF (bs == 0.57) THEN ga3d = 3.59304 ga4d = 12.82715 ga5dh = 1.655588 END IF IF(bs == 0.11) THEN ga3d = 2.218906 ga4d = 6.900796 ga5dh = 1.382792 END IF ! !----------------------------------------------------------------------- ! ! Lin et al., 1983 ! !----------------------------------------------------------------------- ! ac1 = aww bc1 = bww cc1 = as dc1 = bs cd1 = 6.e-1 cd2 = 4.*grvt/(3.*cd1) zrc = (cpi*roqr*tnw)**0.25 zsc = (cpi*roqs*tns)**0.25 zgc = (cpi*roqg*tng)**0.25 vrc = ac1*ga4b/(6.*zrc**bww) vsc = cc1*ga4d/(6.*zsc**bs) vgc = ga4g*SQRT(cd2*roqg/zgc)/6. ! Added by D. Weber 8/27/02 ! for rain we have a more complicated modification ! vtr = 4854*sqrt(rho0/rho)* [gamma(5)*lambda**(4)/ ! gamma(4)*(lambda+f)**(5) ! gamma (5) = 5-1! = 24, gamma (4) = 4-1! = 4 IF (fallopt == 2) THEN ! ferrier equation for rain partial calc for lambda.... vrc = 19416.0/SQRT(SQRT(cpi*roqr*tnw)) ! EMK 19 November 2002 vsc = 225.12/((cpi*roqs*tns)**0.105) ! ferrier equation for hail vgc = 2577.6419/((cpi*roqg*tng)**.1596) END IF ! print *,ag,ga4d,zgc,bg ! print *,'vrc,vsc,vgc= ',vrc,vsc,vgc rn1 = 1.e-3 bnd1 = 6.e-4 rn2 = 1.e-3 bnd2 = 1.e-3 rn3 = .25*cpi*tns*cc1*ga3d esw = 1. rn4 = .25*cpi*esw*tns*cc1*ga3d eri = 1. rn5 = .25*cpi*eri*tnw*ac1*ga3b / zrc**bww ami = 1./(24.*4.19E-10) rn6 = cpi2*eri*tnw*ac1*roqr*ga6b*ami / zrc**bww esr = 1. rn7 = cpi2*esr*tnw*tns*roqs rn8 = cpi2*esr*tnw*tns*roqr rn9 = cpi2*tns*tng*roqs rn10 = 2.*cpi*tns rn101 = .31*ga5dh*SQRT(cc1) / zsc**0.625 rn10a = als*als/rw rn11 = 2.*cpi*tns/alf rn11a = cw/alf ami50 = 4.8E-7 ami40 = 3.84E-9 eiw = 1. ui50 = 100. ri50 = 5.e-3 cmn = 1.05E-15 rn12 = cpi*eiw*ui50*ri50**2 DO k = 1,31 y1 = 1.-a2(k) rn13(k) = a1(k)*y1/(ami50**y1-ami40**y1) rn12a(k) = rn13(k)/ami50 rn12b(k) = a1(k)*ami50**a2(k) rn25a(k) = a1(k)*cmn**a2(k) END DO egw = 1. rn14 = .25*cpi*egw*tng*ga3g*SQRT(cd2*roqg) egi = .1 rn15 = .25*cpi*egi*tng*ga3g*SQRT(cd2*roqg) egi = 1. rn15a = .25*cpi*egi*tng*ga3g*SQRT(cd2*roqg) egr = 1. !n16 = cpi2*egr*tng*tnw*roqr rn17 = 2.*cpi*tng rn17a = .31*ga5gh*(cd2*roqg)**.25 * zgc**0.25 rn17b = cw-ci rn17c = cw apri = .66 bpri = 1.e-4 rn18 = 20.*cpi2*bpri*tnw*roqr rn18a = apri rn19 = 2.*cpi*tng/alf rn19a = .31*ga5gh*(cd2*roqg)**.25 * zgc**0.25 rn19b = cw/alf rn20 = 2.*cpi*tng rn20a = als*als/rw rn20b = .31*ga5gh*(cd2*roqg)**.25 * zgc**0.25 bnd3 = 2.e-3 rn21 = 1.e3*1.569E-12/0.15 erw = 1. rn22 = .25*cpi*erw*ac1*tnw*ga3b / zrc**bww rn23 = 2.*cpi*tnw rn23a = .31*ga5bh*SQRT(ac1) rn23b = alv*alv/rw ! cn0 = 1.e-8 cn0 = 1.e-5 rn25 = cn0/1000. rn30a = alv*als*amw/(tca*ars) rn30b = alv/tca rn30c = ars/(dwv*amw) rn31 = 1.e-17 beta = -.6 rn32 = 4.*51.545E-4 RETURN END SUBROUTINE stcstice