!
!##################################################################
!##################################################################
!###### ######
!###### PROGRAM ARPSTINTRP ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
PROGRAM arpstintrp,100
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! This program interpolates two ARPS history data on grid of the same
! size to a time inbetween them. The output will be written into a new
! history dump file.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
!
! 2/25/1999. Written based on ARPSTINTRP.
!
! MODIFICATION HISTORY:
!
! 1999/10/13 (Gene Bassett)
! Corrected a roundoff error problem for the history dump reference
! times. Made the history dump output characterists similar
! to arpsintrp.
!
! 2001/06/18 (Gene Bassett)
! Corrected error with absolute time (iabstinit variables).
!
! 2002/03/19 (Keith Brewster)
! Corrected time calculations for the case when the user chooses
! to have curtim be relative to initime of the input file.
!
!-----------------------------------------------------------------------
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
!
!-----------------------------------------------------------------------
!
! Dimension of the base grid (input data).
!
!-----------------------------------------------------------------------
!
INTEGER :: nx,ny,nz
INTEGER :: nstyps
!
!-----------------------------------------------------------------------
!
! ARPS arrays. The last dimension is for the two sets of 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 :: ptprt (:,:,:,:) ! Perturbation potential temperature
! from that of base state atmosphere (Kelvin).
REAL, ALLOCATABLE :: pprt (:,:,:,:) ! Perturbation pressure from that
! of base state atmosphere (Pascal).
REAL, ALLOCATABLE :: qv (:,:,:,:) ! Water vapor mixing ratio (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 :: kmh (:,:,:,:) ! Horizontal turb. mixing coef. for
! momentum. ( m**2/s )
REAL, ALLOCATABLE :: kmv (:,:,:,:) ! Vertical turb. mixing coef. for
! momentum. ( m**2/s )
INTEGER, ALLOCATABLE :: soiltyp (:,:,:) ! Soil type
REAL, ALLOCATABLE :: stypfrct(:,:,:) ! Fraction of soil type
INTEGER, ALLOCATABLE :: vegtyp (:,:) ! Vegetation type
REAL, ALLOCATABLE :: roufns (:,:) ! Surface roughness
REAL, ALLOCATABLE :: lai (:,:) ! Leaf Area Index
REAL, ALLOCATABLE :: veg (:,:) ! Vegetation fraction
REAL, ALLOCATABLE :: tsfc (:,:,:,:) ! Ground sfc. temperature (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 cover
REAL, ALLOCATABLE :: raing(:,:,:) ! Grid supersaturation rain
REAL, ALLOCATABLE :: rainc(:,:,:) ! Cumulus convective rain
REAL, ALLOCATABLE :: prcrate(:,:,:,:) ! precipitation rate (kg/(m**2*s))
! prcrate(:,:,:,:) = total precip. rate
! prcrate(:,:,:,:) = grid scale precip. rate
! prcrate(:,:,:,:) = cumulus precip. rate
! prcrate(:,:,:,:) = microphysics precip. rate
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 :: 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*s**2))
REAL, ALLOCATABLE :: qvsflx(:,:,:) ! Surface moisture flux (kg/(m**2*s))
REAL, ALLOCATABLE :: ubar (:,:,:) ! Base state u-velocity (m/s).
REAL, ALLOCATABLE :: vbar (:,:,:) ! Base state v-velocity (m/s).
REAL, ALLOCATABLE :: wbar (:,:,:) ! Base state w-velocity (m/s).
REAL, ALLOCATABLE :: ptbar (:,:,:) ! Base state potential temperature (K)
REAL, ALLOCATABLE :: pbar (:,:,:) ! Base state pressure (Pascal).
REAL, ALLOCATABLE :: rhobar(:,:,:) ! Base state air density (kg/m**3)
REAL, ALLOCATABLE :: qvbar (:,:,:) ! Base state water vapor specific humidity
! (kg/kg,2).
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 on the staggered grid.
REAL, ALLOCATABLE :: hterain(:,:) ! The height of terrain.
REAL, ALLOCATABLE :: uprt (:,:,:,:) ! Perturbation u-velocity (m/s)
REAL, ALLOCATABLE :: vprt (:,:,:,:) ! Perturbation v-velocity (m/s)
REAL, ALLOCATABLE :: qvprt (:,:,:,:) ! Perturbation water vapor specific humidity (kg/kg)
REAL, ALLOCATABLE :: tem1 (:,:,:) ! Temporary array
REAL, ALLOCATABLE :: tem2 (:,:,:) ! Temporary array
REAL, ALLOCATABLE :: tem3 (:,:,:) ! Temporary array
REAL, ALLOCATABLE :: tem4 (:,:,:) ! Temporary array
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i, j, k
REAL :: amin, amax
CHARACTER (LEN=80) :: basdmpfn
INTEGER :: lbasdmpf
CHARACTER (LEN=80) :: ternfn,sfcoutfl,soiloutfl,temchar
INTEGER :: lternfn,lfn
INTEGER :: iss,is
!wdt Copyright (c) 2001 Weather Decision Technologies, Inc.
REAL :: zpmax
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'phycst.inc'
INCLUDE 'globcst.inc'
INCLUDE 'bndry.inc'
INCLUDE 'indtflg.inc'
INCLUDE 'grid.inc'
!wdt Copyright (c) 2001 Weather Decision Technologies, Inc.
INCLUDE 'exbc.inc'
INTEGER :: hinfmt,houtfmt, nchin, nchout
CHARACTER (LEN=80) :: filename
CHARACTER (LEN=80) :: grdbasfn
INTEGER :: lenfil,lengbf
INTEGER :: grdbas
INTEGER :: ireturn
REAL :: time
INTEGER :: gboutcnt, vroutcnt
DATA gboutcnt, vroutcnt /0,0/
INTEGER :: nfilemax
PARAMETER (nfilemax=2)
CHARACTER (LEN=80) :: hisfile(nfilemax)
INTEGER :: nhisfile,nd, length, lenstr
CHARACTER (LEN=80) :: timsnd
CHARACTER (LEN=80) :: new_runname
INTEGER :: tmstrln
REAL :: times(nfilemax), outtime, alpha, beta
INTEGER :: iabstinit,iabstinit1
INTEGER :: ioffset
INTEGER :: year1,month1,day1,hour1,minute1,second1,ioutabst, &
ioutabstinit
!
!-----------------------------------------------------------------------
!
! namelist Declarations:
!
!-----------------------------------------------------------------------
!
INTEGER :: use_data_t
CHARACTER (LEN=19) :: initime ! Real time in form of 'year-mo-dy:hr:mn:ss'
NAMELIST /INPUT/hinfmt,nhisfile,grdbasfn,hisfile
!wdt Copyright (c) 2001 Weather Decision Technologies, Inc.: ngbrz,zbrdmp
NAMELIST /output/ runname,use_data_t,initime,outtime, &
dirname,exbcdmp,hdmpfmt,grbpkbit,hdfcompr, &
grdout,basout,varout,mstout,rainout,prcout,iceout, &
tkeout, trbout,sfcout,landout,radout,flxout, &
qcexout,qrexout,qiexout,qsexout,qhexout, &
totout,filcmprs,sfcdmp,soildmp,ngbrz,zbrdmp
INTEGER :: nsize, nxy,nxyz
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
mgrid = 1
nestgrd = 0
!
!-----------------------------------------------------------------------
!
! Set the default parameters
!
!-----------------------------------------------------------------------
!
hinfmt = 10
grdbasfn = 'X'
nhisfile = 1
hisfile(1) = 'X'
use_data_t = 1
initime ='0000-00-00:00:00:00'
runname = 'runname_not_set'
dirname = './'
exbcdmp = 1
hdmpfmt = 1
grbpkbit = 16
hdfcompr = 0
filcmprs = 0
basout = 0
grdout = 0
varout = 1
mstout = 1
iceout = 1
tkeout = 1
trbout = 0
rainout = 0
sfcout = 0
snowout = 0
landout = 0
qcexout = 0
qrexout = 0
qiexout = 0
qsexout = 0
qhexout = 0
sfcdmp = 1
soildmp = 1
!wdt Copyright (c) 2001 Weather Decision Technologies, Inc.: ngbrz,zbrdmp
ngbrz = 5
zbrdmp = 10000.0
WRITE(6,'(/9(/2x,a)/)') &
'###############################################################', &
'###############################################################', &
'### ###', &
'### Welcome to ARPSTINTRP ###', &
'### ###', &
'###############################################################', &
'###############################################################'
READ(5,INPUT, END=100)
nhisfile = 2
WRITE(6,'(/a/)') ' Input control parameters read in are:'
IF( hinfmt == 5) THEN
WRITE(6,'(2(2x,a))') &
'The Savi3D not supported as an INPUT file format', &
'Job stopped in ARPSTINTRP.'
STOP 9102
END IF
WRITE(6,'(1x,a,i3)') ' hinfmt =', hinfmt
WRITE(6,'(1x,a,i3)') ' nhisfile =', nhisfile
length = LEN( grdbasfn )
CALL strlnth
( grdbasfn, length )
WRITE(6,'(1x,a,a)') ' grdbasfn =', grdbasfn(1:length)
DO i=1,nhisfile
length = LEN( hisfile(i) )
CALL strlnth
( hisfile(i), length )
WRITE(6,'(1x,a,i3,a,a)') ' hisfile(',i,')=',hisfile(i)(1:length)
END DO
!
!-----------------------------------------------------------------------
!
! Set the control parameters for output:
!
!-----------------------------------------------------------------------
!
WRITE(6,'(/a/)') &
' Reading in control parameters for the output data files..'
READ (5,output,END=100)
!wdt Copyright (c) 2001 Weather Decision Technologies, Inc.
IF ( exbcdmp == 4 ) rayklow = -1
WRITE(6,'(/2x,a,a)') &
'The run name to be used for constructing output file name is ', &
runname
new_runname = runname
totout = 1
CALL get_dims_from_data
(hinfmt,trim(grdbasfn), &
nx,ny,nz,nstyps, ireturn)
IF (nstyps <= 0) nstyps = 1
nstyp = nstyps
!
!-----------------------------------------------------------------------
!
! Allocate the arrays.
!
!-----------------------------------------------------------------------
!
ALLOCATE( ALLOCATE( ALLOCATE( ALLOCATE(ptprt(nx,ny,nz,2))
ALLOCATE(pprt(nx,ny,nz,2))
ALLOCATE(qv(nx,ny,nz,2))
ALLOCATE(qc(nx,ny,nz,2))
ALLOCATE(qr(nx,ny,nz,2))
ALLOCATE(qi(nx,ny,nz,2))
ALLOCATE(qs(nx,ny,nz,2))
ALLOCATE(qh(nx,ny,nz,2))
ALLOCATE(tke(nx,ny,nz,2))
ALLOCATE(kmh(nx,ny,nz,2))
ALLOCATE(kmv(nx,ny,nz,2))
ALLOCATE(soiltyp(nx,ny,nstyps))
ALLOCATE(stypfrct(nx,ny,nstyps))
ALLOCATE(vegtyp(nx,ny))
ALLOCATE(roufns(nx,ny))
ALLOCATE(lai(nx,ny))
ALLOCATE(veg(nx,ny))
ALLOCATE(tsfc(nx,ny,0:nstyps,2))
ALLOCATE(tsoil(nx,ny,0:nstyps,2))
ALLOCATE(wetsfc(nx,ny,0:nstyps,2))
ALLOCATE(wetdp(nx,ny,0:nstyps,2))
ALLOCATE(wetcanp(nx,ny,0:nstyps,2))
ALLOCATE(snowdpth(nx,ny,2))
ALLOCATE(raing(nx,ny,2))
ALLOCATE(rainc(nx,ny,2))
ALLOCATE(prcrate(nx,ny,4,2))
ALLOCATE(radfrc(nx,ny,nz,2))
ALLOCATE(radsw(nx,ny,2))
ALLOCATE(rnflx(nx,ny,2))
ALLOCATE(usflx(nx,ny,2))
ALLOCATE(vsflx(nx,ny,2))
ALLOCATE(ptsflx(nx,ny,2))
ALLOCATE(qvsflx(nx,ny,2))
ALLOCATE(ubar(nx,ny,nz))
ALLOCATE(vbar(nx,ny,nz))
ALLOCATE(wbar(nx,ny,nz))
ALLOCATE(ptbar(nx,ny,nz))
ALLOCATE(pbar(nx,ny,nz))
ALLOCATE(rhobar(nx,ny,nz))
ALLOCATE(qvbar(nx,ny,nz))
ALLOCATE( ALLOCATE( ALLOCATE( ALLOCATE(zp(nx,ny,nz))
ALLOCATE(hterain(nx,ny))
ALLOCATE(uprt(nx,ny,nz,2))
ALLOCATE(vprt(nx,ny,nz,2))
ALLOCATE(qvprt(nx,ny,nz,2))
ALLOCATE(tem1(nx,ny,nz))
ALLOCATE(tem2(nx,ny,nz))
ALLOCATE(tem3(nx,ny,nz))
ALLOCATE(tem4(nx,ny,nz))
nxyz = nx*ny*nz
nxy = nx*ny
CALL flzero
(u , nxyz*2)
CALL flzero
(v , nxyz*2)
CALL flzero
(uprt , nxyz*2)
CALL flzero
(vprt , nxyz*2)
CALL flzero
(w , nxyz*2)
CALL flzero
(ptprt , nxyz*2)
CALL flzero
(pprt , nxyz*2)
CALL flzero
(qvprt , nxyz*2)
CALL flzero
(qc , nxyz*2)
CALL flzero
(qr , nxyz*2)
CALL flzero
(qi , nxyz*2)
CALL flzero
(qs , nxyz*2)
CALL flzero
(qh , nxyz*2)
CALL flzero
(tke , nxyz*2)
CALL flzero
(kmh , nxyz*2)
CALL flzero
(kmv , nxyz*2)
CALL flzero
(radfrc, nxyz*2)
CALL flzero
(ubar , nxyz)
CALL flzero
(vbar , nxyz)
CALL flzero
(wbar , nxyz)
CALL flzero
(ptbar , nxyz)
CALL flzero
(pbar , nxyz)
CALL flzero
(rhobar, nxyz)
CALL flzero
(qvbar , nxyz)
CALL flzero
(x, nx)
CALL flzero
(y, ny)
CALL flzero
(z, nz)
CALL flzero
(zp , nxyz)
CALL flzero
(hterain,nx*ny)
nsize = nx*ny*(1+nstyps)*2
CALL flzero
(tsfc ,nsize)
CALL flzero
(tsoil ,nsize)
CALL flzero
(wetsfc ,nsize)
CALL flzero
(tsfc ,nsize)
CALL flzero
(wetdp ,nsize)
CALL flzero
(wetcanp,nsize)
DO iss=1,nstyps
DO j=1,ny
DO i=1,nx
soiltyp (i,j,iss) = 0
stypfrct(i,j,iss) = 0.0
END DO
END DO
END DO
DO is=1,2
DO j=1,ny
DO i=1,nx
snowdpth(i,j,is) = 0
vegtyp (i,j) = 0
lai (i,j) = 0.0
roufns (i,j) = 0.0
veg (i,j) = 0.0
raing (i,j,is) = 0.0
rainc (i,j,is) = 0.0
prcrate(i,j,1,is) = 0.0
prcrate(i,j,2,is) = 0.0
prcrate(i,j,3,is) = 0.0
prcrate(i,j,4,is) = 0.0
radsw (i,j,is) = 0.0
rnflx (i,j,is) = 0.0
usflx (i,j,is) = 0.0
vsflx (i,j,is) = 0.0
ptsflx (i,j,is) = 0.0
qvsflx (i,j,is) = 0.0
END DO
END DO
END DO
ldirnam=LEN(dirname)
CALL strlnth
( dirname , ldirnam)
lengbf=LEN(grdbasfn)
CALL strlnth
( grdbasfn, lengbf)
WRITE(6,'(/a,a)')' The grid/base name is ', grdbasfn(1:lengbf)
!
!-----------------------------------------------------------------------
!
! Loop over data files
!
!-----------------------------------------------------------------------
!
ireturn = 0
DO nd=1,2
filename = hisfile(nd)
lenfil=LEN(filename)
CALL strlnth
( filename, lenfil)
WRITE(6,'(/a,a,a)') &
' Data set ', filename(1:lenfil) ,' to be processed.'
!
!-----------------------------------------------------------------------
!
! Read all input data arrays
!
!-----------------------------------------------------------------------
!
CALL dtaread
(nx,ny,nz,nstyps, &
hinfmt,nchin,grdbasfn(1:lengbf),lengbf, &
filename(1:lenfil),lenfil,time, x,y,z,zp, &
uprt(1,1,1,nd),vprt (1,1,1,nd),w (1,1,1,nd),ptprt(1,1,1,nd), &
pprt(1,1,1,nd),qvprt(1,1,1,nd),qc (1,1,1,nd),qr (1,1,1,nd), &
qi (1,1,1,nd),qs (1,1,1,nd),qh (1,1,1,nd),tke (1,1,1,nd), &
kmh (1,1,1,nd),kmv (1,1,1,nd), &
ubar,vbar,wbar,ptbar,pbar,rhobar,qvbar, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc(1,1,0,nd),tsoil(1,1,0,nd),wetsfc(1,1,0,nd), &
wetdp(1,1,0,nd),wetcanp(1,1,0,nd),snowdpth(1,1,nd), &
raing(1,1,nd),rainc(1,1,nd),prcrate(1,1,1,nd), &
radfrc(1,1,1,nd),radsw(1,1,nd),rnflx(1,1,nd), &
usflx(1,1,nd),vsflx(1,1,nd),ptsflx(1,1,nd),qvsflx(1,1,nd), &
ireturn, tem1, tem2, tem3)
WRITE(6,'(/a,/2(a,i2),a,i4,a,/3(a,i2),a,f13.3,a/)') &
'History data read in for time: ', &
'month=',month,', day=', day,', year=',year,',', &
'hour =',hour ,',minute=',minute,', second=',second, &
', time=',time,'(s)'
CALL ctim2abss
(year,month,day,hour,minute,second,iabstinit)
IF(nd == 1) THEN ! Save the values for data set 1
year1 = year
month1 = month
day1 = day
hour1 = hour
minute1= minute
second1= second
iabstinit1 = iabstinit
END IF
times(nd) = time + int(iabstinit - iabstinit1)
END DO
IF( hinfmt == 9 .AND. ireturn == 2 ) THEN
WRITE(6,'(/1x,a/)') 'The end of GrADS file was reached.'
CLOSE ( nchin )
CALL retunit( nchin )
GO TO 9001
END IF
IF( ireturn /= 0 ) GO TO 9002 ! Read was unsuccessful
!
IF( use_data_t == 1) THEN ! Use init time in input file
ioutabstinit=iabstinit1
year = year1
month = month1
day = day1
hour = hour1
minute= minute1
second= second1
ELSE
READ(initime,'(i4.4,1x,i2.2,1x,i2.2,1x,i2.2,1x,i2.2,1x,i2.2)') &
year,month,day,hour,minute,second
CALL ctim2abss
(year,month,day,hour,minute,second,ioutabstinit)
END IF
PRINT*,'ioutabstinit=',ioutabstinit
PRINT*,'iabstinit1=',iabstinit1
ioffset = ioutabstinit - iabstinit1
times(1) = times(1) - ioffset
times(2) = times(2) - ioffset
curtim = outtime
WRITE(6,'(/a,/2(a,i2),a,i4,a,/3(a,i2),a,f13.3,a/)') &
'In output file, the reference time is', &
'month=',month,', day=', day,', year=',year,',', &
'hour =',hour ,',minute=',minute,', second=',second, &
', & the time relative to this reference =',curtim
IF ( curtim > MAX(times(1),times(2)) .OR. &
curtim < MIN(times(1),times(2))) THEN
WRITE (*,*) "WARNING: Performing extrapolation. Desired time ", &
"is outside the range of the reference files."
END IF
IF( times(2) == times(1)) THEN
WRITE (*,*) "ERROR: times in reference files are the same, ", &
"can't perform interpolation."
STOP 1
END IF
alpha = (times(2)-curtim)/(times(2)-times(1))
beta = 1.0-alpha
WRITE (*,*)
WRITE (*,*) "Relative weights: file 1",alpha," file 2",beta
!-----------------------------------------------------------------------
!
! Calculate total fields from that for base state and perturbations
!
!-----------------------------------------------------------------------
!
DO k=1,nz
DO j=1,ny
DO i=1,nx
uprt (i,j,k,1)=alpha*uprt (i,j,k,1)+beta*uprt (i,j,k,2)
vprt (i,j,k,1)=alpha*vprt (i,j,k,1)+beta*vprt (i,j,k,2)
w (i,j,k,1)=alpha*w (i,j,k,1)+beta*w (i,j,k,2)
ptprt (i,j,k,1)=alpha*ptprt (i,j,k,1)+beta*ptprt (i,j,k,2)
pprt (i,j,k,1)=alpha*pprt (i,j,k,1)+beta*pprt (i,j,k,2)
qvprt (i,j,k,1)=alpha*qvprt (i,j,k,1)+beta*qvprt (i,j,k,2)
qc (i,j,k,1)=alpha*qc (i,j,k,1)+beta*qc (i,j,k,2)
qr (i,j,k,1)=alpha*qr (i,j,k,1)+beta*qr (i,j,k,2)
qi (i,j,k,1)=alpha*qi (i,j,k,1)+beta*qi (i,j,k,2)
qs (i,j,k,1)=alpha*qs (i,j,k,1)+beta*qs (i,j,k,2)
qh (i,j,k,1)=alpha*qh (i,j,k,1)+beta*qh (i,j,k,2)
tke (i,j,k,1)=alpha*tke (i,j,k,1)+beta*tke (i,j,k,2)
kmh (i,j,k,1)=alpha*kmh (i,j,k,1)+beta*kmh (i,j,k,2)
kmv (i,j,k,1)=alpha*kmv (i,j,k,1)+beta*kmv (i,j,k,2)
u (i,j,k,1)=uprt (i,j,k,1)+ubar (i,j,k)
v (i,j,k,1)=vprt (i,j,k,1)+vbar (i,j,k)
qv (i,j,k,1)=qvprt(i,j,k,1)+qvbar(i,j,k)
radfrc(i,j,k,1)=alpha*radfrc(i,j,k,1)+beta*radfrc(i,j,k,2)
END DO
END DO
END DO
DO is=0,nstyp
DO j=1,ny-1
DO i=1,nx-1
tsfc (i,j,is,1)=alpha*tsfc (i,j,is,1) &
+beta*tsfc (i,j,is,2)
tsoil (i,j,is,1)=alpha*tsoil (i,j,is,1) &
+beta*tsoil (i,j,is,2)
wetsfc (i,j,is,1)=alpha*wetsfc (i,j,is,1) &
+beta*wetsfc (i,j,is,2)
wetdp (i,j,is,1)=alpha*wetdp (i,j,is,1) &
+beta*wetdp (i,j,is,2)
wetcanp(i,j,is,1)=alpha*wetcanp(i,j,is,1) &
+beta*wetcanp(i,j,is,2)
END DO
END DO
END DO
DO j=1,ny-1
DO i=1,nx-1
snowdpth(i,j,1)=alpha*snowdpth(i,j,1)+beta*snowdpth(i,j,2)
raing (i,j,1)=alpha*raing (i,j,1)+beta*raing (i,j,2)
rainc (i,j,1)=alpha*rainc (i,j,1)+beta*rainc (i,j,2)
prcrate(i,j,1,1)=alpha*prcrate(i,j,1,1)+beta*prcrate(i,j,1,2)
prcrate(i,j,2,1)=alpha*prcrate(i,j,2,1)+beta*prcrate(i,j,2,2)
prcrate(i,j,3,1)=alpha*prcrate(i,j,3,1)+beta*prcrate(i,j,3,2)
prcrate(i,j,4,1)=alpha*prcrate(i,j,4,1)+beta*prcrate(i,j,4,2)
radsw (i,j,1)=alpha*radsw (i,j,1)+beta*radsw (i,j,2)
rnflx (i,j,1)=alpha*rnflx (i,j,1)+beta*rnflx (i,j,2)
usflx (i,j,1)=alpha*usflx (i,j,1)+beta*usflx (i,j,2)
vsflx (i,j,1)=alpha*vsflx (i,j,1)+beta*vsflx (i,j,2)
ptsflx (i,j,1)=alpha*ptsflx (i,j,1)+beta*ptsflx (i,j,2)
qvsflx (i,j,1)=alpha*qvsflx (i,j,1)+beta*qvsflx (i,j,2)
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Print out the max/min of output varaibles.
!
!-----------------------------------------------------------------------
!
WRITE(6,'(/1x,a/)') &
'Min. and max. of data interpolated to the new time:'
CALL a3dmax0
(x,1,nx,1,nx,1,1,1,1,1,1,1,1, amax,amin)
WRITE(6,'(/1x,2(a,e13.6))') 'xmin = ', amin,', xmax =',amax
CALL a3dmax0
(y,1,ny,1,ny,1,1,1,1,1,1,1,1, amax,amin)
WRITE(6,'(1x,2(a,e13.6))') 'ymin = ', amin,', ymax =',amax
CALL a3dmax0
(z,1,nz,1,nz,1,1,1,1,1,1,1,1, amax,amin)
WRITE(6,'(1x,2(a,e13.6))') 'zmin = ', amin,', zmax =',amax
CALL a3dmax0
(zp,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') 'zpmin = ', amin,', zpmax =',amax
CALL a3dmax0
(ubar,1,nx,1,nx,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
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)
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)
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)
WRITE(6,'(1x,2(a,e13.6))') 'pbarmin = ', amin,', pbarmax =',amax
CALL a3dmax0
(rhobar,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') 'rhobarmin=', amin,', rhobarmax=',amax
CALL a3dmax0
(qvbar,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') 'qvbarmin= ', amin,', qvbarmax=',amax
CALL a3dmax0
(uprt,1,nx,1,nx,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') 'uprtmin = ', amin,', uprtmax =',amax
CALL a3dmax0
(vprt,1,nx,1,nx-1,1,ny,1,ny,1,nz,1,nz-1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') 'vprtmin = ', amin,', vprtmax =',amax
CALL a3dmax0
(w,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') 'wmin = ', amin,', wmax =',amax
CALL a3dmax0
(ptprt,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') 'ptprtmin= ', amin,', ptprtmax=',amax
CALL a3dmax0
(pprt,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') 'pprtmin = ', amin,', pprtmax =',amax
CALL a3dmax0
(qvprt,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') 'qvprtmin= ', amin,', qvprtmax=',amax
CALL a3dmax0
(qc,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') 'qcmin = ', amin,', qcmax =',amax
CALL a3dmax0
(qr,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') 'qrmin = ', amin,', qrmax =',amax
CALL a3dmax0
(qi,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') 'qimin = ', amin,', qimax =',amax
CALL a3dmax0
(qs,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') 'qsmin = ', amin,', qsmax =',amax
CALL a3dmax0
(qh,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') 'qhmin = ', amin,', qhmax =',amax
CALL a3dmax0
(tke,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') 'tkemin = ', amin,', tkemax =',amax
CALL a3dmax0
(kmh,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') 'kmhmin = ', amin,', kmhmax =',amax
CALL a3dmax0
(kmv,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') 'kmvmin = ', amin,', kmvmax =',amax
CALL a3dmax0
(raing,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') 'raingmin= ', amin,', raingmax=',amax
CALL a3dmax0
(rainc,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') 'raincmin= ', amin,', raincmax=',amax
CALL a3dmax0
(prcrate(1,1,1,1),1,nx,1,nx-1,1,ny,1,ny-1, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') 'prcr1min= ', amin,', prcr1max=',amax
CALL a3dmax0
(prcrate(1,1,2,1),1,nx,1,nx-1,1,ny,1,ny-1, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') 'prcr2min= ', amin,', prcr2max=',amax
CALL a3dmax0
(prcrate(1,1,3,1),1,nx,1,nx-1,1,ny,1,ny-1, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') 'prcr3min= ', amin,', prcr3max=',amax
CALL a3dmax0
(prcrate(1,1,4,1),1,nx,1,nx-1,1,ny,1,ny-1, &
1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6))') 'prcr4min= ', amin,', prcr4max=',amax
DO iss = 0, nstyp
CALL a3dmax0
(tsfc(1,1,iss,1),1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6),a,i3)') &
'tsfcmin = ', amin,', tsfcmax =',amax,' for soil type=',iss
CALL a3dmax0
(tsoil(1,1,iss,1),1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6),a,i3)') &
'tsoilmin= ', amin,', tsoilmax=',amax,' for soil type=',iss
CALL a3dmax0
(wetsfc(1,1,iss,1),1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6),a,i3)') &
'wetsmin = ', amin,', wetsmax =',amax,' for soil type=',iss
CALL a3dmax0
(wetdp(1,1,iss,1),1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6),a,i3)') &
'wetdmin = ', amin,', wetdmax =',amax,' for soil type=',iss
CALL a3dmax0
(wetcanp(1,1,iss,1), &
1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1,amax,amin)
WRITE(6,'(1x,2(a,e13.6),a,i3)') &
'wetcmin = ', amin,', wetcmax =',amax,' for soil type=',iss
END DO
CALL a3dmax0
(roufns,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') 'roufnmin =', amin,', roufnmax =',amax
CALL a3dmax0
(veg,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') 'vegmin = ', amin,', vegmax =',amax
CALL a3dmax0
(radfrc,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') 'radfnmin =', amin,', radfnmax =',amax
CALL a3dmax0
(radsw,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') 'radswmin =', amin,', radswmax =',amax
CALL a3dmax0
(rnflx,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') 'rnflxmin =', amin,', rnflxmax =',amax
CALL a3dmax0
(usflx,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') 'usflxnmin =', amin,', usflxmax =',amax
CALL a3dmax0
(vsflx,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') 'vsflxmin =', amin,', vsflxmax =',amax
CALL a3dmax0
(ptsflx,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') 'ptflxmin =', amin,', ptflxmax =',amax
CALL a3dmax0
(qvsflx,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1, &
amax,amin)
WRITE(6,'(1x,2(a,e13.6))') 'qvflxmin =', amin,', qvflxmax =',amax
DO k=1,nz
DO j=1,ny
DO i=1,nx
tem1 (i,j,k)= 0.0 ! To be put in place of wbar
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Data dump of the model grid and base state arrays:
!
! First find a unique name basdmpfn(1:lbasdmpf) for the grid and
! base state array dump file
!
! If grid/base state data has been written out once, skip
! the following writing block. Also no need to write out
! separate data for Savi3D dump. The same for GrADS dump.
!
!-----------------------------------------------------------------------
!
WRITE (cmnt(nocmnt),'(a,i4,a,i4,a,i4)') &
' nx =',nx,', ny =',ny,', nz =',nz
runname = new_runname
houtfmt = hdmpfmt
grbpkbit = 16
CALL gtlfnkey
(runname, lfnkey)
IF(houtfmt /= 9 ) THEN
IF( gboutcnt == 1 ) GO TO 500 ! If done already, skip this part.
CALL gtbasfn
(runname(1:lfnkey),dirname,ldirnam,hdmpfmt, &
1,0,basdmpfn,lbasdmpf)
PRINT*
PRINT*,'Output grid/base state file is ', basdmpfn(1:lbasdmpf)
grdbas = 1 ! Dump out grd and base state arrays only
CALL dtadump
(nx,ny,nz,nstyps,hdmpfmt,nchout, &
basdmpfn(1:lbasdmpf),grdbas,filcmprs, &
u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh, &
tke,kmh,kmv, &
ubar,vbar,tem1,ptbar,pbar,rhobar,qvbar, &
x,y,z,zp,hterain, tem1,tem1,tem1, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx, &
usflx,vsflx,ptsflx,qvsflx, &
tem2,tem3,tem4)
gboutcnt = 1
500 CONTINUE
END IF
!
!-----------------------------------------------------------------------
!
! Then the time dependent fields:
!
!-----------------------------------------------------------------------
!
IF( .NOT. (houtfmt == 9 .AND. vroutcnt == 1) ) THEN
!
!-----------------------------------------------------------------------
!
! Reconstruct the file name using the specified directory name
!
!-----------------------------------------------------------------------
!
CALL gtdmpfn
(runname(1:lfnkey),dirname, &
ldirnam,curtim,hdmpfmt,1,0, hdmpfn, ldmpf)
END IF
WRITE(6,'(a,a)') 'Writing t-dependent variable history dump ', &
hdmpfn(1:ldmpf)
grdbas = 0
CALL dtadump
(nx,ny,nz,nstyps,hdmpfmt,nchout, &
hdmpfn(1:ldmpf),grdbas,filcmprs, &
u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh, &
tke,kmh,kmv, &
ubar,vbar,tem1,ptbar,pbar,rhobar,qvbar, &
x,y,z,zp,hterain, tem1,tem1,tem1, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx, &
usflx,vsflx,ptsflx,qvsflx, &
tem2,tem3,tem4)
!
!-----------------------------------------------------------------------
!
! Write out soil model variable file
!
!-----------------------------------------------------------------------
!
IF ( sfcin == 1 ) THEN
CALL cvttsnd
( curtim, timsnd, tmstrln )
soiloutfl = runname(1:lfnkey)//".soilvar."//timsnd(1:tmstrln)
lfn = lfnkey + 9 + tmstrln
IF( dirname /= ' ' ) THEN
temchar = soiloutfl
soiloutfl = dirname(1:ldirnam)//'/'//temchar
lfn = lfn + ldirnam + 1
END IF
CALL fnversn
(soiloutfl, lfn)
IF (soildmp > 0) THEN
PRINT *, 'Writing soil data to ',soiloutfl(1:lfn)
CALL wrtsoil
(nx,ny,nstyps, soiloutfl(1:lfn),dx,dy, &
mapproj,trulat1,trulat2,trulon,sclfct,ctrlat,ctrlon, &
1,1,1,1,1,1, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth,soiltyp)
IF (soildmp == 1) CALL soilcntl
(nx,ny, soiloutfl(1:lfn), &
1,1,1,1,1,1, x,y)
END IF
END IF ! sfcin.eq.1
!-----------------------------------------------------------------------
!
! Write out surface property data file: sfcoutfl .
!
!-----------------------------------------------------------------------
!
IF ( landin == 1 ) THEN
sfcoutfl = runname(1:lfnkey)//".sfcdata"
lfn = lfnkey + 8
IF( dirname /= ' ' ) THEN
temchar = sfcoutfl
sfcoutfl = dirname(1:ldirnam)//'/'//temchar
lfn = lfn + ldirnam + 1
END IF
CALL fnversn
(sfcoutfl, lfn)
IF (sfcdmp > 0) THEN
PRINT *, 'Write surface property data in ',sfcoutfl(1:lfn)
CALL wrtsfcdt
(nx,ny,nstyps,sfcoutfl(1:lfn), dx,dy, &
mapproj,trulat1,trulat2,trulon,sclfct,ctrlat,ctrlon, &
1,1,1,1,1,0, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg,veg)
IF (sfcdmp == 1) CALL sfccntl
(nx,ny, sfcoutfl(1:lfn), &
1,1,1,1,1,0, x,y, tem1,tem2)
END IF
END IF ! landin.eq.1
STOP 0
100 WRITE(6,'(a)') &
'Error reading NAMELIST file. Program ARPSTINTRP stopped.'
STOP 9104
9001 CONTINUE
WRITE(6,'(/2x,a)')'For the output grid:'
WRITE(6,'(2x,a,f12.4)') &
'The latitude of the output grid center, ctrlat=',ctrlat
WRITE(6,'(2x,a,f12.4/)') &
'The longitude of the output grid center, ctrlon=',ctrlon
WRITE(6,'(2x,a/2x,a,2f15.4,a)') &
'The SW corner (i,j)=(2,2) of the grid is located at ', &
'(',xgrdorg,ygrdorg,') of the input grid.'
STOP 9001
9002 CONTINUE
WRITE(6,'(1x,a,i2,/1x,a)') &
'Data read was unsuccessful. ireturn =', ireturn, &
'Job stopped in ARPSTINTRP.'
STOP 9002
END PROGRAM arpstintrp