!
!##################################################################
!##################################################################
!###### ######
!###### Advanced Regional Prediction System (ARPS) ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
PROGRAM arps,173
!
!-----------------------------------------------------------------------
!
! CONTACT:
!
! For further information, contact:
!
! Center for Analysis and Prediction of Storms
! University of Oklahoma
! Sarkeys Energy Center,
! 100 East Boyd
! Norman, OK 73019 USA
! Phone: (405) 325-0453
! FAX : (405) 325-7614
! E-mail: kkd@ou.edu or: mxue@ou.edu
!
! User support: arpssupport@ou.edu
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! This program is the driver for the Advanced Regional Prediction
! System (ARPS) model.
!
! The ARPS is a fully three-dimensional, compressible,
! nonhydrostatic model based on the Arakawa C grid. The model
! solves three momentum equations, a thermodynamic energy
! equation, a pressure equation, six moisture equations (water
! vapor, cloud water, rainwater, cloud ice, hail, and snow),
! and also provides for the statistical representation of
! unresolvable processes via a turbulence parameterization scheme
! (user option). The model is written in a terrain-following
! coordinate system, and has provisions for several boundary
! condition options.
!
! For a full description of ARPS, please consult the ARPS 4.0
! User's Guide.
!
!-----------------------------------------------------------------------
!
! MODIFICATION HISTORY:
!
! The modification history can be found in file HISTORY.
!
!-----------------------------------------------------------------------
!
! GRID STRUCTURE AND STENCIL NUMBERING CONVENTION
!
! Each of the three velocity components is located at a physical
! boundary in the model. The numbering convention for the
! staggered grid is shown below for each of the coordinate
! directions, where S denotes a scalar variable.
!
! Arakawa C-grid is used by this model.
!
!
! X-Direction (East.......West):
!
! West boundary East boundary
! | |
! <-------- Physical Domain ------>
! +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
! U S U S U S U S U S U
!
! i= 1 1 2 2 . . . NX-2 NX-2 NX-1 NX-1 NX
!
!
! Y-Direction (North......South):
!
! South boundary North boundary
! | |
! <------- Physical Domain ------->
! +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
! V S V S V S V S V S V
!
! j= 1 1 2 2 . . . NY-2 NY-2 NY-1 NY-1 NY
!
!
! Z-Direction:
!
! NZ + W
! |
! |
! NZ-1 + S
! |
! |
! NZ-1 + W -- Physical Top boundary.
! |
! .
! .
!
! |
! 2 + S
! |
! |
! 2 + W -- Physical Ground Level
! |
! |
! 1 + S
! |
! |
! k= 1 + W
!
!-----------------------------------------------------------------------
!
! Variable Declarations:
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE ! Force explicit declarations
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
INCLUDE 'globcst.inc' ! Global constants that control model
! execution
INCLUDE 'bndry.inc'
INCLUDE 'timelvls.inc'
INCLUDE 'radcst.inc' ! Includes radiation grid size information.
INCLUDE 'mp.inc' ! Message passing parameters.
INCLUDE 'alloc.inc' ! Memory allocation declaration and interfaces
INCLUDE 'nudging.inc' ! Memory allocation declaration and interfaces
!wdt tmp buffer
!INCLUDE "mpif.h"
!
!-----------------------------------------------------------------------
!
! Time dependent variables:
!
!-----------------------------------------------------------------------
REAL, ALLOCATABLE :: u (:,:,:,:) ! Total u-velocity (m/s)
REAL, ALLOCATABLE :: v (:,:,:,:) ! Total v-velocity (m/s)
REAL, ALLOCATABLE :: w (:,:,:,:) ! Total w-velocity (m/s)
REAL, ALLOCATABLE :: wcont (:,:,:) ! Contravariant vertical velocity (m/s)
REAL, ALLOCATABLE :: ptprt (:,:,:,:) ! Perturbation potential temperature
! from that of base state atmosphere (K)
REAL, ALLOCATABLE :: pprt (:,:,:,:) ! Perturbation pressure from that
! of base state atmosphere (Pascal)
REAL, ALLOCATABLE :: qv (:,:,:,:) ! Water vapor specific humidity (kg/kg)
REAL, ALLOCATABLE :: qc (:,:,:,:) ! Cloud water mixing ratio (kg/kg)
REAL, ALLOCATABLE :: qr (:,:,:,:) ! Rain water mixing ratio (kg/kg)
REAL, ALLOCATABLE :: qi (:,:,:,:) ! Cloud ice mixing ratio (kg/kg)
REAL, ALLOCATABLE :: qs (:,:,:,:) ! Snow mixing ratio (kg/kg)
REAL, ALLOCATABLE :: qh (:,:,:,:) ! Hail mixing ratio (kg/kg)
REAL, ALLOCATABLE :: tke (:,:,:,:) ! Turbulent Kinetic Energy ((m/s)**2)
REAL, ALLOCATABLE :: pbldpth(:,:,:) ! Planetary boundary layer depth (m)
REAL, ALLOCATABLE :: kmh (:,:,:) ! Horizontal turb. mixing coef. for
! momentum. ( m**2/s )
REAL, ALLOCATABLE :: kmv (:,:,:) ! Vertical turb. mixing coef. for
! momentum. ( m**2/s )
REAL, ALLOCATABLE :: rprntl(:,:,:) ! Reciprocal of Prandtl number
!
!-----------------------------------------------------------------------
!
! Time tendencies of certain time dependent variables at the lateral
! boundaries, which are used to set the lateral boundary conditions
! for options 4 and 5.
!
!-----------------------------------------------------------------------
!
REAL, ALLOCATABLE :: udteb (:,:) ! Time tendency of u at e-boundary (m/s**2)
REAL, ALLOCATABLE :: udtwb (:,:) ! Time tendency of u at w-boundary (m/s**2)
REAL, ALLOCATABLE :: udtnb (:,:) ! Time tendency of u at n-boundary (m/s**2)
REAL, ALLOCATABLE :: udtsb (:,:) ! Time tendency of u at s-boundary (m/s**2)
REAL, ALLOCATABLE :: vdteb (:,:) ! Time tendency of v at e-boundary (m/s**2)
REAL, ALLOCATABLE :: vdtwb (:,:) ! Time tendency of v at w-boundary (m/s**2)
REAL, ALLOCATABLE :: vdtnb (:,:) ! Time tendency of v at n-boundary (m/s**2)
REAL, ALLOCATABLE :: vdtsb (:,:) ! Time tendency of v at s-boundary (m/s**2)
REAL, ALLOCATABLE :: wdteb (:,:) ! Time tendency of w at e-boundary (m/s**2)
REAL, ALLOCATABLE :: wdtwb (:,:) ! Time tendency of w at w-boundary (m/s**2)
REAL, ALLOCATABLE :: wdtnb (:,:) ! Time tendency of w at n-boundary (m/s**2)
REAL, ALLOCATABLE :: wdtsb (:,:) ! Time tendency of w at s-boundary (m/s**2)
REAL, ALLOCATABLE :: pdteb (:,:) ! Time tendency of pprt at e-boundary (Pascal/s)
REAL, ALLOCATABLE :: pdtwb (:,:) ! Time tendency of pprt at w-boundary (Pascal/s)
REAL, ALLOCATABLE :: pdtnb (:,:) ! Time tendency of pprt at n-boundary (Pascal/s)
REAL, ALLOCATABLE :: pdtsb (:,:) ! Time tendency of pprt at s-boundary (Pascal/s)
REAL, ALLOCATABLE :: sdteb (:,:) ! Time tendency of a scalar at e-boundary (m/s**2)
REAL, ALLOCATABLE :: sdtwb (:,:) ! Time tendency of a scalar at w-boundary (m/s**2)
REAL, ALLOCATABLE :: sdtnb (:,:) ! Time tendency of a scalar at n-boundary (m/s**2)
REAL, ALLOCATABLE :: sdtsb (:,:) ! Time tendency of a scalar at s-boundary (m/s**2)
!
!-----------------------------------------------------------------------
!
! Base state variables:
!
!-----------------------------------------------------------------------
!
REAL, ALLOCATABLE :: ubar (:,:,:) ! Base state u-velocity (m/s)
REAL, ALLOCATABLE :: vbar (:,:,:) ! Base state v-velocity (m/s)
REAL, ALLOCATABLE :: ptbar (:,:,:) ! Base state potential temperature (K)
REAL, ALLOCATABLE :: pbar (:,:,:) ! Base state pressure (Pascal)
REAL, ALLOCATABLE :: ptbari(:,:,:) ! Inverse Base state pot. temperature (K)
REAL, ALLOCATABLE :: pbari (:,:,:) ! Inverse Base state pressure (Pascal)
REAL, ALLOCATABLE :: rhostr(:,:,:) ! Base state density rhobar times j3.
REAL, ALLOCATABLE :: rhostri(:,:,:)! Inv. base state density rhobar times j3.
REAL, ALLOCATABLE :: qvbar (:,:,:) ! Base state water vapor specific humidity (kg/kg)
REAL, ALLOCATABLE :: ppi (:,:,:) ! Exner function.
REAL, ALLOCATABLE :: csndsq(:,:,:) ! Sound wave speed squared.
!
!-----------------------------------------------------------------------
!
! Arrays related to model grid definition:
!
!-----------------------------------------------------------------------
!
REAL, ALLOCATABLE :: x (:) ! The x-coord. of the physical and
! computational grid. Defined at u-point.
REAL, ALLOCATABLE :: y (:) ! The y-coord. of the physical and
! computational grid. Defined at v-point.
REAL, ALLOCATABLE :: z (:) ! The z-coord. of the computational grid.
! Defined at w-point on the staggered grid.
REAL, ALLOCATABLE :: zp (:,:,:) ! The physical height coordinate defined at
! w-point of the staggered grid.
REAL, ALLOCATABLE :: hterain(:,:) ! The height of the terrain.
REAL, ALLOCATABLE :: mapfct(:,:,:) ! Map factors at scalar, u and v points
REAL, ALLOCATABLE :: j1 (:,:,:) ! Coordinate transformation Jacobian defined
! as - d( zp )/d( x ).
REAL, ALLOCATABLE :: j2 (:,:,:) ! Coordinate transformation Jacobian defined
! as - d( zp )/d( y ).
REAL, ALLOCATABLE :: j3 (:,:,:) ! Coordinate transformation Jacobian defined
! as d( zp )/d( z ).
REAL, ALLOCATABLE :: aj3x (:,:,:) ! Coordinate transformation Jacobian defined
! as d( zp )/d( z ) AVERAGED IN THE X-DIR.
REAL, ALLOCATABLE :: aj3y (:,:,:) ! Coordinate transformation Jacobian defined
! as d( zp )/d( z ) AVERAGED IN THE Y-DIR.
REAL, ALLOCATABLE :: aj3z (:,:,:) ! Coordinate transformation Jacobian defined
! as d( zp )/d( z ) AVERAGED IN THE Z-DIR.
REAL, ALLOCATABLE :: j3inv (:,:,:) ! Inverse of J3.
REAL, ALLOCATABLE :: trigs1(:) ! Array containing pre-computed trig
! function for fftopt=1.
REAL, ALLOCATABLE :: trigs2(:) ! Array containing pre-computed trig
! function for fftopt=1.
INTEGER, ALLOCATABLE :: ifax1(:) ! Array containing the factors of nx for
! fftopt=1.
INTEGER, ALLOCATABLE :: ifax2(:) ! Array containing the factors of ny for
! fftopt=1.
REAL, ALLOCATABLE :: vwork1 (:,:) ! 2-D work array for fftopt=2.
REAL, ALLOCATABLE :: vwork2 (:,:) ! 2-D work array for fftopt=2.
REAL, ALLOCATABLE :: wsave1 (:) ! Work array for fftopt =2.
REAL, ALLOCATABLE :: wsave2 (:) ! Work array for fftopt =2.
REAL, ALLOCATABLE :: sinlat(:,:) ! Sin of latitude at each grid point
REAL, ALLOCATABLE :: ptcumsrc(:,:,:) ! Source term in pt-equation due
! to cumulus parameterization
REAL, ALLOCATABLE :: qcumsrc(:,:,:,:)! 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, ALLOCATABLE :: w0avg(:,:,:) ! a closing running average vertical
! velocity in 10min for K-F scheme
!
!-----------------------------------------------------------------------
!
! Arrays for soil model.
!
!-----------------------------------------------------------------------
!
INTEGER, ALLOCATABLE :: soiltyp(:,:,:) ! Soil type at each point
REAL, ALLOCATABLE :: stypfrct(:,:,:) ! Fraction of soil type
INTEGER, ALLOCATABLE :: vegtyp (:,:) ! Vegetation type at each point
REAL, ALLOCATABLE :: lai (:,:) ! Leaf Area Index
REAL, ALLOCATABLE :: roufns (:,:) ! Surface roughness
REAL, ALLOCATABLE :: veg (:,:) ! Vegetation fraction
REAL, ALLOCATABLE :: tsfc (:,:,:) ! Ground temperature at surface (K)
REAL, ALLOCATABLE :: tsoil (:,:,:) ! Deep soil temperature (K)
REAL, ALLOCATABLE :: wetsfc (:,:,:) ! Surface soil moisture
REAL, ALLOCATABLE :: wetdp (:,:,:) ! Deep soil moisture
REAL, ALLOCATABLE :: wetcanp(:,:,:) ! Canopy water amount
REAL, ALLOCATABLE :: snowdpth(:,:) ! Snow depth (m)
REAL, ALLOCATABLE :: qvsfc (:,:,:) ! Effective sfc. qv
REAL, ALLOCATABLE :: ptsfc (:,:) ! Ground surface potential temperature (K)
REAL, ALLOCATABLE :: raing(:,:) ! Grid supersaturation rain
REAL, ALLOCATABLE :: rainc(:,:) ! Cumulus convective rain
REAL, ALLOCATABLE :: prcrate(:,:,:) ! precipitation rates (kg/(m**2*s))
! prcrate(1,1,1) = total precip. rate
! prcrate(1,1,2) = grid scale precip. rate
! prcrate(1,1,3) = cumulative precip. rate
! prcrate(1,1,4) = microphysics precip. rate
REAL, ALLOCATABLE :: kfraincv(:,:) ! K-F convective rainfall (cm)
INTEGER, ALLOCATABLE :: nca(:,:) ! K-F counter for CAPE release
!EMK BMJ
REAL, ALLOCATABLE :: cldefi(:,:) ! BMJ cloud efficiency
REAL, ALLOCATABLE :: xland(:,:) ! BMJ land mask
! (1.0 = land, 2.0 = sea)
REAL, ALLOCATABLE :: bmjraincv(:,:) ! BMJ convective rainfall (cm)
!EMK END
!
!-----------------------------------------------------------------------
!
! Arrays for radiation
!
!-----------------------------------------------------------------------
!
REAL, ALLOCATABLE :: radfrc(:,:,:) ! Radiation forcing (K/s)
REAL, ALLOCATABLE :: radsw (:,:) ! Solar radiation reaching the surface
REAL, ALLOCATABLE :: rnflx (:,:) ! Net radiation flux absorbed by surface
REAL, ALLOCATABLE :: rad2d (:,:,:) ! 2-D arrays for radiation (see radcst.inc)
REAL, ALLOCATABLE :: radbuf(:) ! Buffer to carry working arrays for
! radiation computing (see radcst.inc)
!
!-----------------------------------------------------------------------
!
! Arrays that carry surface fluxes
!
!-----------------------------------------------------------------------
!
REAL, ALLOCATABLE :: usflx (:,:) ! Surface flux of u-momentum (kg/(m*s**2))
REAL, ALLOCATABLE :: vsflx (:,:) ! Surface flux of v-momentum (kg/(m*s**2))
REAL, ALLOCATABLE :: ptsflx(:,:) ! Surface heat flux (K*kg/(m**2*s))
REAL, ALLOCATABLE :: qvsflx(:,:) ! Surface moisture flux (kg/(m**2*s))
!
!-----------------------------------------------------------------------
!
! Buffer arrays that carry external boundary 3-D arrays
!
!-----------------------------------------------------------------------
!
REAL, ALLOCATABLE :: exbcbuf( : ) ! EXBC buffer array
REAL, ALLOCATABLE :: bcrlx(:,:) ! EXBC relaxation function coefficients
!
!-----------------------------------------------------------------------
!
! Arrays for analysis increment updating (a type of nudging) output
!
!-----------------------------------------------------------------------
!
REAL, ALLOCATABLE :: uincr(:,:,:)
REAL, ALLOCATABLE :: vincr(:,:,:)
REAL, ALLOCATABLE :: wincr(:,:,:)
REAL, ALLOCATABLE :: pincr(:,:,:)
REAL, ALLOCATABLE :: ptincr(:,:,:)
REAL, ALLOCATABLE :: qvincr(:,:,:)
REAL, ALLOCATABLE :: qcincr(:,:,:)
REAL, ALLOCATABLE :: qrincr(:,:,:)
REAL, ALLOCATABLE :: qiincr(:,:,:)
REAL, ALLOCATABLE :: qsincr(:,:,:)
REAL, ALLOCATABLE :: qhincr(:,:,:)
!
!-----------------------------------------------------------------------
!
! Work arrays that do not carry physical meaning in the code
!
!-----------------------------------------------------------------------
!
REAL, ALLOCATABLE :: temxy1(:,:) ! Temporary work array, used as phydro
REAL, ALLOCATABLE :: tem1 (:,:,:) ! Temporary work array.
REAL, ALLOCATABLE :: tem2 (:,:,:) ! Temporary work array.
REAL, ALLOCATABLE :: tem3 (:,:,:) ! Temporary work array.
REAL, ALLOCATABLE :: tem4 (:,:,:) ! Temporary work array.
REAL, ALLOCATABLE :: tem5 (:,:,:) ! Temporary work array.
REAL, ALLOCATABLE :: tem6 (:,:,:) ! Temporary work array.
REAL, ALLOCATABLE :: tem7 (:,:,:) ! Temporary work array.
REAL, ALLOCATABLE :: tem8 (:,:,:) ! Temporary work array.
REAL, ALLOCATABLE :: tem9 (:,:,:) ! Temporary work array.
REAL, ALLOCATABLE :: tem10 (:,:,:) ! Temporary work array.
REAL, ALLOCATABLE :: tem11 (:,:,:) ! Temporary work array.
REAL, ALLOCATABLE :: tem12 (:,:,:) ! Temporary work array.
REAL, ALLOCATABLE :: tem13 (:,:,:) ! Temporary work array.
REAL, ALLOCATABLE :: tem14 (:,:,:) ! Temporary work array.
REAL, ALLOCATABLE :: tem15 (:,:,:) ! Temporary work array.
REAL, ALLOCATABLE :: tem16 (:,:,:) ! Temporary work array.
REAL, ALLOCATABLE :: tem17 (:,:,:) ! Temporary work array.
REAL, ALLOCATABLE :: tem18 (:,:,:) ! Temporary work array.
REAL, ALLOCATABLE :: tem19 (:,:,:) ! Temporary work array.
REAL, ALLOCATABLE :: tem20 (:,:,:) ! Temporary work array.
REAL, ALLOCATABLE :: tem21 (:,:,:) ! Temporary work array.
REAL, ALLOCATABLE :: tem22 (:,:,:) ! Temporary work array.
REAL, ALLOCATABLE :: tem23 (:,:,:) ! Temporary work array.
REAL, ALLOCATABLE :: tem24 (:,:,:) ! Temporary work array.
REAL, ALLOCATABLE :: tem25 (:,:,:) ! Temporary work array.
REAL, ALLOCATABLE :: tem26 (:,:,:) ! Temporary work array.
REAL, ALLOCATABLE :: tem1_0(:,:,:) ! Temporary work array.
REAL, ALLOCATABLE :: tem2_0(:,:,:) ! Temporary work array.
REAL, ALLOCATABLE :: tem3_0(:,:,:) ! Temporary work array.
!
!-----------------------------------------------------------------------
!
! ARPS dimensions:
!
! nx, ny, nz: Dimensions of computatioal grid. When run on MPP
! with PVM or MPI, they represent of the size of the
! subdomains. See below.
!
! Given nx, ny and nz, the physical domain size will be
! xl=(nx-3)*dx by yl=(ny-3)*dy by zh=(nz-3)*dz. The
! variables nx, ny, nz, dx, dy and dz are read in from
! the input file by subroutine INITPARA.
!
!-----------------------------------------------------------------------
!
INTEGER :: nx ! Number of grid points in the x-direction
INTEGER :: ny ! Number of grid points in the y-direction
INTEGER :: nz ! Number of grid points in the z-direction
INTEGER :: nxndg ! Number of x grid points for nudging (1 or nx)
INTEGER :: nyndg ! Number of y grid points for nudging (1 or ny)
INTEGER :: nzndg ! Number of z grid points for nudging (1 or nz)
!
!-----------------------------------------------------------------------
!
! Soil types.
!
!-----------------------------------------------------------------------
!
INTEGER :: nstyps ! Number of soil types
!
!-----------------------------------------------------------------------
!
! Radiation buffer size. Set equal to
! n2d_radiat*nx*ny + n3d_radiat*nx*ny*nz
! in subroutine inipara if radopt=2, otherwise set to 1.
!
!-----------------------------------------------------------------------
!
INTEGER :: rbufsz
!
!-----------------------------------------------------------------------
!
! External boundary buffer size. Set equal to
! 22*nx*ny*nz
! in subroutine inipara if lbcopt=2, otherwise set to 1.
!
!-----------------------------------------------------------------------
!
INTEGER :: exbcbufsz
INTEGER :: frstep ! Flag for the initial time step
INTEGER :: mptr ! Grid identifier.
INTEGER :: ierr, i,j,k
REAL :: eps ! Small value to compensate the roundoff
! error in checking of the end of time
! integration.
DATA eps /0.01/
INTEGER istatus, nxy, nxyz
REAL :: twall0, t_walltime
!wdt tmp buffer
!INTEGER :: n_buffer
!REAL, ALLOCATABLE :: mpi_buffer(:)
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
! First, initialize the model parameters. Most of them are
! global parameters passed among subroutines through common blocks.
!
! These parameters are declared in the include files:
! globcst.inc, bndry.inc, exbc.inc, radcst.inc etc.
!
!-----------------------------------------------------------------------
!
CALL acct_init
CALL set_acct
(init_acct)
CALL initpara
(nx,ny,nz,nstyps)
! Set radiation and external boundary work array buffer sizes:
IF (radopt == 2) THEN
rbufsz = n2d_radiat*nx*ny + n3d_radiat*nx*ny*nz
ELSE
rbufsz = 1
END IF
IF (lbcopt == 2) THEN
exbcbufsz = 22*nx*ny*nz
ELSE
exbcbufsz = 1
END IF
IF ( nudgopt > 0 ) THEN
nxndg=nx
nyndg=ny
nzndg=nz
ELSE
nxndg=1
nyndg=1
nzndg=1
END IF
!
!-----------------------------------------------------------------------
!
! Print a log file in namelist format.
!
!-----------------------------------------------------------------------
!
CALL acct_interrupt
(output_acct)
IF (myproc == 0) THEN
IF (mp_opt == 0) THEN
CALL prtlog
(nx,ny,nz,6)
CALL prtlog
(nx,ny,nz,0)
ELSE
CALL prtlog
(nproc_x*(nx-3)+3,nproc_y*(ny-3)+3,nz,6)
CALL prtlog
(nproc_x*(nx-3)+3,nproc_y*(ny-3)+3,nz,0)
ENDIF
END IF
CALL acct_stop_inter
!
!-----------------------------------------------------------------------
!
! Allocate arrays etc.
!
!-----------------------------------------------------------------------
!
mptr = 1 ! Set the grid number to 1 for a single grid run.
nestgrd = 0 ! Set the grid nesting flag to zero, i.e. no nesting.
nxy = nx*ny
nxyz = nxy*nz
IF (myproc == 0) WRITE(6,*) 'Allocating arrays'
!wdt tmp buffer
!n_buffer = 100*(max(nx,ny)*nz+MPI_BSEND_OVERHEAD)
!ALLOCATE(mpi_buffer(n_buffer))
!CALL MPI_BUFFER_ATTACH(mpi_buffer,n_buffer*4,istatus)
ALLOCATE(u (nx,ny,nz,nt),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:u")
u = 0
ALLOCATE(v (nx,ny,nz,nt),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:v")
v = 0
ALLOCATE(w (nx,ny,nz,nt),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:w")
w = 0
ALLOCATE(wcont(nx,ny,nz ),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:wcont")
wcont = 0
ALLOCATE(ptprt(nx,ny,nz,nt),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:ptprt")
ptprt = 0
ALLOCATE(pprt (nx,ny,nz,nt),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:pprt")
pprt = 0
ALLOCATE(qv (nx,ny,nz,nt),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:qv")
qv = 0
ALLOCATE(qc (nx,ny,nz,nt),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:qc")
qc = 0
ALLOCATE(qr (nx,ny,nz,nt),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:qr")
qr = 0
ALLOCATE(qi (nx,ny,nz,nt),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:qi")
qi = 0
ALLOCATE(qs (nx,ny,nz,nt),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:qs")
qs = 0
ALLOCATE(qh (nx,ny,nz,nt),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:qh")
qh = 0
ALLOCATE(tke (nx,ny,nz,nt),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tke")
tke = 0
ALLOCATE(pbldpth(nx,ny,nt),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:pbldpth")
pbldpth = 0
ALLOCATE(kmh(nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:kmh")
kmh = 0
ALLOCATE(kmv(nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:kmv")
kmv = 0
ALLOCATE(rprntl(nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:rprntl")
rprntl = 0
ALLOCATE(udteb(ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:udteb")
udteb = 0
ALLOCATE(udtwb(ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:udtwb")
udtwb = 0
ALLOCATE(udtnb(nx,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:udtnb")
udtnb = 0
ALLOCATE(udtsb(nx,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:udtsb")
udtsb = 0
ALLOCATE(vdteb(ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:vdteb")
vdteb = 0
ALLOCATE(vdtwb(ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:vdtwb")
vdtwb = 0
ALLOCATE(vdtnb(nx,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:vdtnb")
vdtnb = 0
ALLOCATE(vdtsb(nx,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:vdtsb")
vdtsb = 0
ALLOCATE(wdteb(ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:wdteb")
wdteb = 0
ALLOCATE(wdtwb(ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:wdtwb")
wdtwb = 0
ALLOCATE(wdtnb(nx,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:wdtnb")
wdtnb = 0
ALLOCATE(wdtsb(nx,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:wdtsb")
wdtsb = 0
ALLOCATE(pdteb(ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:pdteb")
pdteb = 0
ALLOCATE(pdtwb(ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:pdteb")
pdtwb = 0
ALLOCATE(pdtnb(nx,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:pdtnb")
pdtnb = 0
ALLOCATE(pdtsb(nx,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:pdtsb")
pdtsb = 0
ALLOCATE(sdteb(ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:sdteb")
sdteb = 0
ALLOCATE(sdtwb(ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:sdtwb")
sdtwb = 0
ALLOCATE(sdtnb(nx,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:sdtnb")
sdtnb = 0
ALLOCATE(sdtsb(nx,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:sdtsb")
sdtsb = 0
ALLOCATE(ubar (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:ubar")
ubar = 0
ALLOCATE(vbar (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:vbar")
vbar = 0
ALLOCATE(ptbar (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:ptbar")
ptbar = 0
ALLOCATE(pbar (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:pbar")
pbar = 0
ALLOCATE(ptbari(nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:ptbari")
ptbari = 0
ALLOCATE(pbari (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:pbari")
pbari = 0
ALLOCATE(rhostr(nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:rhostr")
rhostr = 0
ALLOCATE(rhostri(nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:rhostri")
rhostri = 0
ALLOCATE(qvbar (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:qvbar")
qvbar = 0
ALLOCATE(ppi (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:ppi")
ppi = 0
ALLOCATE(csndsq(nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:csndsq")
csndsq = 0
ALLOCATE( CALL check_alloc_status
(istatus, "arps:x")
x = 0
ALLOCATE( CALL check_alloc_status
(istatus, "arps:y")
y = 0
ALLOCATE( CALL check_alloc_status
(istatus, "arps:z")
z = 0
ALLOCATE(zp(nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:zp")
zp = 0
ALLOCATE(hterain(nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:hterain")
hterain = 0
ALLOCATE(mapfct(nx,ny,8),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:mapfct")
mapfct = 0
ALLOCATE(j1 (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:j1")
j1 = 0
ALLOCATE(j2 (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:j2")
j2 = 0
ALLOCATE(j3 (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:j3")
j3 = 0
ALLOCATE(aj3x (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:aj3x")
aj3x = 0
ALLOCATE(aj3y (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:aj3y")
aj3y = 0
ALLOCATE(aj3z (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:aj3z")
aj3z = 0
ALLOCATE(j3inv(nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:j3inv")
j3inv = 0
ALLOCATE(trigs1(3*(nx-1)/2+1),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:trigs1")
trigs1 = 0
ALLOCATE(trigs2(3*(ny-1)/2+1),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:trigs2")
trigs2 = 0
ALLOCATE(ifax1(13),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:ifax1")
ifax1 = 0
ALLOCATE(ifax2(13),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:ifax2")
ifax2 = 0
ALLOCATE(vwork1(nx+1,ny+1),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:vwork1")
vwork1 = 0
ALLOCATE(vwork2(ny,nx+1),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:vwork2")
vwork2 = 0
ALLOCATE(wsave1(3*(ny-1)+15),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:wsave1")
wsave1 = 0
ALLOCATE(wsave2(3*(nx-1)+15),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:wsave2")
wsave2 = 0
ALLOCATE(sinlat(nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:sinlat")
sinlat = 0
ALLOCATE(ptcumsrc(nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:ptcumsrc")
ptcumsrc = 0
ALLOCATE(qcumsrc(nx,ny,nz,5),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:qcumsrc")
qcumsrc = 0
ALLOCATE(w0avg(nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:w0avg")
w0avg = 0
ALLOCATE(soiltyp (nx,ny,nstyps),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:soiltyp")
soiltyp = 0
ALLOCATE(stypfrct(nx,ny,nstyps),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:stypfrct")
stypfrct = 0
ALLOCATE(vegtyp(nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:vegtyp")
vegtyp = 0
ALLOCATE(lai (nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:lai")
lai = 0
ALLOCATE(roufns(nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:roufns")
roufns = 0
ALLOCATE(veg (nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:veg")
veg = 0
ALLOCATE(tsfc (nx,ny,0:nstyps),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tsfc")
tsfc = 0
ALLOCATE(tsoil (nx,ny,0:nstyps),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tsoil")
tsoil = 0
ALLOCATE(wetsfc (nx,ny,0:nstyps),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:wetsfc")
wetsfc = 0
ALLOCATE(wetdp (nx,ny,0:nstyps),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:wetdp")
wetdp = 0
ALLOCATE(wetcanp (nx,ny,0:nstyps),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:wetcanp")
wetcanp = 0
ALLOCATE(qvsfc (nx,ny,0:nstyps),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:qvsfc")
qvsfc = 0
ALLOCATE(ptsfc (nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:ptsfc")
ptsfc = 0
ALLOCATE(snowdpth(nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:snowdpth")
snowdpth = 0
ALLOCATE(raing (nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:raing")
raing = 0
ALLOCATE(rainc (nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:rainc")
rainc = 0
ALLOCATE(kfraincv (nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:kfraincv")
kfraincv = 0
ALLOCATE(nca (nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:nca")
nca = 0
ALLOCATE(prcrate(nx,ny,4),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:prcrate")
prcrate = 0
!EMK BMJ
ALLOCATE(cldefi(nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:cldefi")
cldefi(:,:) = 1
ALLOCATE(xland(nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:xland")
xland(:,:) = 0
ALLOCATE(bmjraincv (nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:bmjraincv")
bmjraincv = 0
! EMK END
ALLOCATE(radfrc(nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:radfrc")
radfrc = 0
ALLOCATE(radsw (nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:radsw")
radsw = 0
ALLOCATE(rnflx (nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:rnflx")
rnflx = 0
ALLOCATE(rad2d (nx,ny,nrad2d),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:rad2d")
rad2d = 0
ALLOCATE(radbuf(rbufsz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:radbuf")
radbuf = 0
ALLOCATE(usflx (nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:usflx")
usflx = 0
ALLOCATE(vsflx (nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:vsflx")
vsflx = 0
ALLOCATE(ptsflx(nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:ptsflx")
ptsflx = 0
ALLOCATE(qvsflx(nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:qvsflx")
qvsflx = 0
ALLOCATE(exbcbuf(exbcbufsz ),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:exbcbuf")
exbcbuf = 0
ALLOCATE(bcrlx(nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:bcrlx")
bcrlx = 0
IF (myproc == 0) print *, ' nxndg,nyndg,nzndg = ',nxndg,nyndg,nzndg
ALLOCATE(uincr(nxndg,nyndg,nzndg),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:uincr")
uincr = 0.
ALLOCATE(vincr(nxndg,nyndg,nzndg),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:vincr")
vincr = 0.
ALLOCATE(wincr(nxndg,nyndg,nzndg),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:wincr")
wincr = 0.
ALLOCATE(pincr(nxndg,nyndg,nzndg),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:pincr")
pincr = 0.
ALLOCATE(ptincr(nxndg,nyndg,nzndg),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:ptincr")
ptincr = 0.
ALLOCATE(qvincr(nxndg,nyndg,nzndg),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:qvincr")
qvincr = 0.
ALLOCATE(qcincr(nxndg,nyndg,nzndg),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:qcincr")
qcincr = 0.
ALLOCATE(qrincr(nxndg,nyndg,nzndg),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:qrincr")
qrincr = 0.
ALLOCATE(qiincr(nxndg,nyndg,nzndg),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:qiincr")
qiincr = 0.
ALLOCATE(qsincr(nxndg,nyndg,nzndg),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:qsincr")
qsincr = 0.
ALLOCATE(qhincr(nxndg,nyndg,nzndg),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:qhincr")
qhincr = 0.
ALLOCATE(temxy1(nx,ny),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:temxy1")
temxy1 = 0
ALLOCATE(tem1 (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tem1")
tem1 = 0
ALLOCATE(tem2 (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tem2")
tem2 = 0
ALLOCATE(tem3 (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tem3")
tem3 = 0
ALLOCATE(tem4 (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tem4")
tem4 = 0
ALLOCATE(tem5 (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tem5")
tem5 = 0
ALLOCATE(tem6 (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tem6")
tem6 = 0
ALLOCATE(tem7 (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tem7")
tem7 = 0
ALLOCATE(tem8 (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tem8")
tem8 = 0
ALLOCATE(tem9 (nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tem9")
tem9 = 0
ALLOCATE(tem10(nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tem10")
tem10 = 0
ALLOCATE(tem11(nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tem11")
tem11 = 0
ALLOCATE(tem12(nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tem12")
tem12 = 0
ALLOCATE(tem13(nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tem13")
tem13 = 0
ALLOCATE(tem14(nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tem14")
tem14 = 0
ALLOCATE(tem15(nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tem15")
tem15 = 0
ALLOCATE(tem16(nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tem16")
tem16 = 0
ALLOCATE(tem17(nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tem17")
tem17 = 0
ALLOCATE(tem18(nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tem18")
tem18 = 0
ALLOCATE(tem19(nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tem19")
tem19 = 0
ALLOCATE(tem20(nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tem20")
tem20 = 0
ALLOCATE(tem21(nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tem21")
tem21 = 0
ALLOCATE(tem22(nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tem22")
tem22 = 0
ALLOCATE(tem23(nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tem23")
tem23 = 0
ALLOCATE(tem24(nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tem24")
tem24 = 0
ALLOCATE(tem25(nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tem25")
tem25 = 0
ALLOCATE(tem26(nx,ny,nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tem26")
tem26 = 0
ALLOCATE(tem1_0(0:nx,0:ny,0:nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tem1_0")
tem1_0 = 0
ALLOCATE(tem2_0(0:nx,0:ny,0:nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tem2_0")
tem2_0 = 0
ALLOCATE(tem3_0(0:nx,0:ny,0:nz),STAT=istatus)
CALL check_alloc_status
(istatus, "arps:tem3_0")
tem3_0 = 0
IF (myproc == 0) WRITE(6,*) 'Done allocating arrays'
!
!-----------------------------------------------------------------------
!
! Set up exbcbuf pointers.
!
!-----------------------------------------------------------------------
!
IF( lbcopt == 2 .AND. mptr == 1 ) CALL setexbcptr
(nx,ny,nz)
!
!-----------------------------------------------------------------------
!
! Initialize all arrays and variables, and set initial
! condition for thermal disturbance if desired.
!
!-----------------------------------------------------------------------
!
!EMK BMJ
CALL initial
(mptr,nx,ny,nz,nxndg,nyndg,nzndg,nstyps,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,hterain,mapfct, &
j1,j2,j3,aj3x,aj3y,aj3z,j3inv, &
trigs1,trigs2,ifax1,ifax2, &
wsave1,wsave2,vwork1,vwork2, &
sinlat,kmh,kmv,rprntl, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth,ptsfc,qvsfc, &
ptcumsrc,qcumsrc,w0avg,nca,kfraincv, &
cldefi,xland,bmjraincv, &
raing,rainc,prcrate,exbcbuf,bcrlx,radfrc,radsw, &
rnflx,usflx,vsflx,ptsflx,qvsflx, &
uincr,vincr,wincr,pincr,ptincr,qvincr, &
qcincr,qrincr,qiincr,qsincr,qhincr, &
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)
!EMK END
!call test_dump(u,"XXXAinitial_u",nx,ny,3*nz,1,1)
!call test_dump(v,"XXXAinitial_v",nx,ny,3*nz,2,1)
!call test_dump(w,"XXXAinitial_w",nx,ny,3*nz,3,1)
!call test_dump(wcont,"XXXAinitial_wcont",nx,ny,nz,0,1)
!call test_dump(ptprt,"XXXAinitial_ptprt",nx,ny,3*nz,0,1)
!call test_dump(pprt,"XXXAinitial_pprt",nx,ny,3*nz,0,1)
!call test_dump(qv,"XXXAinitial_qv",nx,ny,3*nz,0,1)
!call test_dump(qc,"XXXAinitial_qc",nx,ny,3*nz,0,1)
!call test_dump(qr,"XXXAinitial_qr",nx,ny,3*nz,0,1)
!call test_dump(qi,"XXXAinitial_qi",nx,ny,3*nz,0,1)
!call test_dump(qs,"XXXAinitial_qs",nx,ny,3*nz,0,1)
!call test_dump(qh,"XXXAinitial_qh",nx,ny,3*nz,0,1)
!call test_dump(tke,"XXXAinitial_tke",nx,ny,3*nz,0,1)
!call test_dump(udteb,"XXXAinitial_udteb",1,ny,nz,0,1)
!call test_dump(udtwb,"XXXAinitial_udtwb",1,ny,nz,0,1)
!call test_dump(udtnb,"XXXAinitial_udtnb",nx,1,nz,0,1)
!call test_dump(udtsb,"XXXAinitial_udtsb",nx,1,nz,0,1)
!call test_dump(vdteb,"XXXAinitial_vdteb",1,ny,nz,0,1)
!call test_dump(vdtwb,"XXXAinitial_vdtwb",1,ny,nz,0,1)
!call test_dump(vdtnb,"XXXAinitial_vdtnb",nx,1,nz,0,1)
!call test_dump(vdtsb,"XXXAinitial_vdtsb",nx,1,nz,0,1)
!call test_dump(wdteb,"XXXAinitial_wdteb",1,ny,nz,0,1)
!call test_dump(wdtwb,"XXXAinitial_wdtwb",1,ny,nz,0,1)
!call test_dump(wdtnb,"XXXAinitial_wdtnb",nx,1,nz,0,1)
!call test_dump(wdtsb,"XXXAinitial_wdtsb",nx,1,nz,0,1)
!call test_dump(pdteb,"XXXAinitial_pdteb",1,ny,nz,0,1)
!call test_dump(pdtwb,"XXXAinitial_pdtwb",1,ny,nz,0,1)
!call test_dump(pdtnb,"XXXAinitial_pdtnb",nx,1,nz,0,1)
!call test_dump(pdtsb,"XXXAinitial_pdtsb",nx,1,nz,0,1)
!call test_dump(sdteb,"XXXAinitial_sdteb",1,ny,nz,0,1)
!call test_dump(sdtwb,"XXXAinitial_sdtwb",1,ny,nz,0,1)
!call test_dump(sdtnb,"XXXAinitial_sdtnb",nx,1,nz,0,1)
!call test_dump(sdtsb,"XXXAinitial_sdtsb",nx,1,nz,0,1)
!call test_dump(ubar,"XXXAinitial_ubar",nx,ny,nz,1,1)
!call test_dump(vbar,"XXXAinitial_vbar",nx,ny,nz,2,1)
!call test_dump(ptbar,"XXXAinitial_ptbar",nx,ny,nz,0,1)
!call test_dump(pbar,"XXXAinitial_pbar",nx,ny,nz,0,1)
!call test_dump(ptbari,"XXXAinitial_ptbari",nx,ny,nz,0,1)
!call test_dump(pbari,"XXXAinitial_pbari",nx,ny,nz,0,1)
!call test_dump(rhostr,"XXXAinitial_rhostr",nx,ny,nz,0,1)
!call test_dump(rhostri,"XXXAinitial_rhostri",nx,ny,nz,0,1)
!call test_dump(qvbar,"XXXAinitial_qvbar",nx,ny,nz,0,1)
!call test_dump(ppi,"XXXAinitial_ppi",nx,ny,nz,0,1)
!call test_dump(csndsq,"XXXAinitial_csndsq",nx,ny,nz,0,1)
!call test_dump(x,"XXXAinitial_x",nx,1,1,1,1)
!call test_dump(y,"XXXAinitial_y",1,ny,1,2,1)
!call test_dump(z,"XXXAinitial_z",1,1,nz,3,1)
!call test_dump(zp,"XXXAinitial_zp",nx,ny,nz,3,1)
!call test_dump(hterain,"XXXAinitial_hterain",nx,ny,1,0,1)
!call test_dump(mapfct,"XXXAinitial_mapfct",nx,ny,8,0,1)
!call test_dump(j1,"XXXAinitial_j1",nx,ny,nz,1,1)
!call test_dump(j2,"XXXAinitial_j2",nx,ny,nz,2,1)
!call test_dump(j3,"XXXAinitial_j3",nx,ny,nz,3,1)
!call test_dump(aj3x,"XXXAinitial_aj3x",nx,ny,nz,1,1)
!call test_dump(aj3y,"XXXAinitial_aj3y",nx,ny,nz,2,1)
!call test_dump(aj3z,"XXXAinitial_aj3z",nx,ny,nz,3,1)
!call test_dump(j3inv,"XXXAinitial_j3inv",nx,ny,nz,3,1)
!call test_dump(sinlat,"XXXAinitial_sinlat",nx,ny,1,0,1)
!call test_dump(kmh,"XXXAinitial_kmh",nx,ny,nz,0,1)
!call test_dump(kmv,"XXXAinitial_kmv",nx,ny,nz,0,1)
!call test_dump(rprntl,"XXXAinitial_rprntl",nx,ny,nz,0,1)
!call test_dump(soiltyp,"XXXAinitial_soiltyp",nx,ny,nstyps,0,1)
!call test_dump(stypfrct,"XXXAinitial_stypfrct",nx,ny,nstyps,0,1)
!call test_dump(vegtyp,"XXXAinitial_vegtyp",nx,ny,1,0,1)
!call test_dump(lai,"XXXAinitial_lai",nx,ny,1,0,1)
!call test_dump(roufns,"XXXAinitial_roufns",nx,ny,1,0,1)
!call test_dump(veg,"XXXAinitial_veg",nx,ny,1,0,1)
!call test_dump(tsfc,"XXXAinitial_tsfc",nx,ny,nstyps+1,0,1)
!call test_dump(tsoil,"XXXAinitial_tsoil",nx,ny,nstyps+1,0,1)
!call test_dump(wetsfc,"XXXAinitial_wetsfc",nx,ny,nstyps+1,0,1)
!call test_dump(wetdp,"XXXAinitial_wetdp",nx,ny,nstyps+1,0,1)
!call test_dump(wetcanp,"XXXAinitial_wetcanp",nx,ny,nstyps+1,0,1)
!call test_dump(snowdpth,"XXXAinitial_snowdpth",nx,ny,1,0,1)
!call test_dump(ptsfc,"XXXAinitial_ptsfc",nx,ny,1,0,1)
!call test_dump(qvsfc,"XXXAinitial_qvsfc",nx,ny,1,0,1)
!call test_dump(bcrlx,"XXXAinitial_bcrlx",nx,ny,1,0,1)
!
!-----------------------------------------------------------------------
!
! The current model time (initial time):
!
!-----------------------------------------------------------------------
!
curtim = tstart
IF( myproc == 0 ) WRITE(6,'(1x,a,f13.3,a)') &
'The initial model time is at ', curtim,' seconds.'
!
!-----------------------------------------------------------------------
!
! Output the initial fields
!
!-----------------------------------------------------------------------
!
CALL set_acct
(output_acct)
CALL initout
(mptr,nx,ny,nz,nstyps,exbcbufsz, &
u,v,w,wcont,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke, &
ubar,vbar,ptbar,pbar,rhostr,qvbar,kmh,kmv, &
x,y,z,zp,hterain,mapfct,j1,j2,j3,j3inv, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
raing,rainc,prcrate,exbcbuf, &
radfrc,radsw,rnflx, &
usflx,vsflx,ptsflx,qvsflx, &
tem1,tem2,tem3,tem4,tem5,tem6,tem7, &
tem8,tem9,tem10,tem11)
IF (mp_opt > 0) THEN
CALL mpbarrier
()
END IF
CALL set_acct
(misc_acct)
nstep = nint( curtim/dtbig )
!
!-----------------------------------------------------------------------
!
! Time integration loop begins ----------------------------------->
!
!-----------------------------------------------------------------------
!
900 CONTINUE ! Entry point of time step integration.
!
!-----------------------------------------------------------------------
!
! Define the time step counter nstep reference to time zero
! (curtim=0.0). This means for tstart.ne.0 case, nstep for the
! first step of integration is not 1.
!
!-----------------------------------------------------------------------
!
nstep = nstep + 1
IF( (ABS(curtim-tstart) <= 1.0E-10) .AND. (restrt /= 1) ) THEN
frstep=1 ! Indicate that this is the initial step of
! model integration. For this step, a forward
! time integration scheme will be used.
ELSE ! For non-first step or restart run
frstep=0 ! When frstep=0, leapfrog scheme is used.
END IF
!
!-----------------------------------------------------------------------
!
! Perform one time step integration for all equations:
! On exit of this routine, all time dependent fields are
! advanced by one time step.
!
!-----------------------------------------------------------------------
!
!EMK
CALL cordintg
(mptr,frstep, nx,ny,nz,nxndg,nyndg,nzndg, &
rbufsz,nstyps,exbcbufsz, &
u,v,w,wcont,ptprt,pprt,qv,qc,qr,qi,qs,qh, &
tke,pbldpth, &
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, mapfct, &
j1,j2,j3,aj3x,aj3y,aj3z,j3inv, &
trigs1,trigs2,ifax1,ifax2, &
wsave1,wsave2,vwork1,vwork2, &
sinlat, kmh,kmv,rprntl, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp, &
snowdpth,ptsfc,qvsfc, &
ptcumsrc,qcumsrc,raing,rainc,prcrate, &
w0avg,nca,kfraincv, &
cldefi,xland,bmjraincv, &
radfrc,radsw,rnflx,rad2d,radbuf,exbcbuf,bcrlx, &
usflx,vsflx,ptsflx,qvsflx, &
uincr,vincr,wincr,pincr,ptincr,qvincr, &
qcincr,qrincr,qiincr,qsincr,qhincr, &
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)
!EMK BMJ
CALL set_acct
(misc_acct)
!
!-----------------------------------------------------------------------
!
! Update physical time and generate output files
!
!-----------------------------------------------------------------------
!
curtim = curtim + dtbig
!
!-----------------------------------------------------------------------
!
! Print timestep marker
!
!-----------------------------------------------------------------------
!
!wdt
IF (myproc == 0) &
WRITE(6,'(a,i8,a,f10.2,a,f8.3,a)') &
' End of integration time step ', nstep, &
', Model time=',curtim,' s (', curtim/3600.0, ' h)'
CALL flush
(6) ! GMB wdt
CALL set_acct
(output_acct)
CALL output
(mptr,nx,ny,nz,nstyps,exbcbufsz, &
u,v,w,wcont,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke, &
udteb,udtwb,vdtnb,vdtsb,pdteb,pdtwb,pdtnb,pdtsb, &
ubar,vbar,ptbar,pbar,rhostr,qvbar,kmh,kmv, &
x,y,z,zp,hterain, mapfct, j1,j2,j3,j3inv, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth,qvsfc, &
ptcumsrc,qcumsrc,w0avg,nca,kfraincv, &
cldefi,xland,bmjraincv, &
raing,rainc,prcrate,exbcbuf, &
radfrc,radsw,rnflx, &
usflx,vsflx,ptsflx,qvsflx, &
tem1, tem2,tem3,tem4,tem5, tem6,tem7, &
tem8,tem9,tem10,tem11)
CALL set_acct
(misc_acct)
!
!-----------------------------------------------------------------------
!
! Check the stability of the integration. If the model solution
! appears to be exceeding the linear stability condition, then
! perform a data dump for post-mortem.
!
!-----------------------------------------------------------------------
!
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem11(i,j,k) = rhostr(i,j,k)*j3inv(i,j,k)
END DO
END DO
END DO
CALL chkstab
(mptr,nx,ny,nz,nstyps, &
u,v,w,wcont,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke, &
ubar,vbar,ptbar,pbar,tem11,qvbar,kmh,kmv, &
x,y,z,zp,hterain,mapfct, j1,j2,j3, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx, &
usflx,vsflx,ptsflx,qvsflx, &
tem1,tem2,tem3,tem4)
!
!-----------------------------------------------------------------------
!
! Calculate and apply the adjustment of domain translation
! speed using either cell-tracking or optimal mean speed algorithm.
!
!-----------------------------------------------------------------------
!
CALL grdtran
(nx,ny,nz,ubar,vbar,u,v,w,ptprt,pprt, &
qv,qc,qr,qi,qs,qh,qvbar,rhostr,x,y,zp,j3,j3inv, &
tem1,tem2,tem3,tem4,tem5,tem6,tem7, &
tem8,tem9,tem10,tem11)
!
!-----------------------------------------------------------------------
!
! Time integration loop ends, go back to the beginning of the
! time step loop if stop time is not reached.
!
!-----------------------------------------------------------------------
!
IF( curtim+eps*dtbig < tstop ) GO TO 900
!
!-----------------------------------------------------------------------
!
! End of entire model time integration. The program stops.
!
! Close opened files.
!
!-----------------------------------------------------------------------
!
IF (hdmpfmt == 5) THEN
CALL mclosescheme (gridid, ierr)
CALL mclosedataset (dsindex, ierr)
ELSE IF (hdmpfmt == 9) THEN
CLOSE (nchdmp)
END IF
CALL acct_finish
CALL acct_report_arps
IF (myproc == 0) THEN
WRITE(6,'(//1x,a,/1x,a,f13.3,a,/1x,a)') &
'ARPS stopped normally in the main program. ', &
'The ending time was ', curtim,' seconds.', &
'Thanks for using ARPS.'
WRITE (6,*) "Maxumum memory allocation (in words):", &
max_memory_use
END IF
IF (mp_opt > 0) THEN
CALL mpexit
(0)
END IF
STOP
END PROGRAM ARPS