!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE ASSIMDRIV ######
!###### ######
!###### Copyright (c) 1996 ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE assimdriv(nx,ny,nz,x,y,z,zp, & 1,21
u,v,w,wcont,ptprt,pprt,qv,qc,qr,qi,qs,qh, &
tke,kmh,kmv,mapfct, &
ubar,vbar,ptbar,pbar,rhostr,qvbar,j1,j2,j3, &
tem1,tem2,tem3,tem4,tem5,tem6,tem7,tem8,tem9, &
tem10,tem11,tem12,tem13,tem14,tem15,tem16)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! This subroutine serves as a driver for data blending and
! the variational velocity adjustment.
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! AUTHOR: Limin Zhao and Alan Shapiro
! 16/01/96
!
! MODIFICATION HISTORY:
!
! 01/17/96 (Steven Lazarus)
! Added 4 new temporary arrays (tem10, tem11, tem12, and tem13).
! These arrays are passed in from FRCUVW (as uforce, vforce,
! wforce, and defsq).
!
! 02/15/96 (Limin Zhao)
! Merged in the code for blending ADAS/model data with single
! Doppler vector retrievals.
!
! 02/17/96 (Steve Lazarus)
! Added the option to fill wcont after time interpolation
! when ivar=0.
!
! 02/20/96 (Limin Zhao)
! Added the codes for computing the optimal weights.
!
! 02/21/96 (Limin Zhao)
! Added a seperate code for reading ADAS data.
!
! 02/24/96 (Limin Zhao)
! Merged in the Vr hole-filler for hole filling the observed Vr.
!
! 04/20/96 (Limin Zhao)
! Set an option to choose a 3-D hole-filler/2-D hole-filler.
!
! 04/23/96 (Limin Zhao)
! Made an option to use ADAS/model values as B.C. in hole-filler,
! which allows the background information be smoothly blended into
! the small scale retrieval fields through Dirichlet BC.
!
!-----------------------------------------------------------------------
!
! 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 z-direction (vertical)
!
! 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)
!
! mapfct Map factors at scalar, u and v points
!
! u x component of velocity (m/s)
! v y component of velocity (m/s)
! w Vertical component of velocity in Cartesian
! coordinates (m/s)
! wcont Contravariant vertical velocity (m/s)
!
! ptprt Perturbation potential temperature (K)
! pprt Perturbation pressure (Pascal)
! qv Water vapor specific humidity (kg/kg)
! qc Cloud water mixing ratio (kg/kg)
! qr Rainwater mixing ratio (kg/kg)
! qi Cloud ice mixing ratio (kg/kg)
! qs Snow mixing ratio (kg/kg)
! qh Hail mixing ratio (kg/kg)
!
! kmh Horizontal turb. mixing coef. for momentum. ( m**2/s )
! kmv Vertical turb. mixing coef. for momentum. ( m**2/s )
!
! tke Turbulent Kinetic Energy ((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)
! rhostr Base state air density (kg/m**3) times j3
! qvbar Base state water vapor specific humidity (kg/kg)
!
! j1 Coordinate transformation Jacobian -d(zp)/dx
! j2 Coordinate transformation Jacobian -d(zp)/dy
! j3 Coordinate transformation Jacobian d(zp)/dz
!
! tem1 Observed radial velocity
! tem5 Background radial velocity
!
!---------------------------------------------------------------------
!
! OUTPUT:
!
! The adjusted velocity fields.
!
!---------------------------------------------------------------------
!
! WORK ARRAYS:
!
! tem2 Temporary work array.
! tem3 Temporary work array.
! tem4 Temporary work array.
! tem6 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.
!
! (These arrays are defined and used locally (i.e. inside this
! subroutine), they may also be passed into routines called by
! this one. Exiting the call to this subroutine, these temporary
! work arrays may be used for other purposes, and therefore their
! contents may be overwritten. Please examine the usage of work
! arrays before you alter the code.)
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE ! Force explicit declarations
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'phycst.inc' ! Model physical constants
INCLUDE 'globcst.inc' ! Model control constants
INCLUDE 'assim.inc' ! Assim/Retr control parameters
INCLUDE 'bndry.inc' ! Boundary condition parameters
!
!-----------------------------------------------------------------------
!
INTEGER :: nt ! The no. of t-levels of t-dependent arrays
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 :: ptol
PARAMETER (nt=3, tpast=1, tpresent=2, tfuture=3)
PARAMETER (ptol=0.1) ! changed from 0.1 for AMS99 SSW 12-11-98
INTEGER :: nx, ny, nz ! Number of grid points in x, y and z directions
INTEGER :: nstyps
INTEGER :: grdbas
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 of the staggered grid.
REAL :: mapfct(nx,ny,3) ! Map factors at scalar, u and v points
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 (K)
REAL :: pprt (nx,ny,nz,nt) ! Perturbation pressure (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 :: 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 air density (kg/m**3) times j3
REAL :: qvbar (nx,ny,nz) ! Base state water vapor specific humidity
! (kg/kg)
REAL :: tke (nx,ny,nz,nt) ! Turbulent Kinetic Energy ((m/s)**2)
REAL :: kmh (nx,ny,nz) ! Horizontal turb. mixing coef. for
! momentum. ( m**2/s )
REAL :: kmv (nx,ny,nz) ! Vertical turb. mixing coef. for
REAL :: j1 (nx,ny,nz) ! Coordinate transformation Jacobian -d(zp)/d(x)
REAL :: j2 (nx,ny,nz) ! Coordinate transformation Jacobian -d(zp)/d(y)
REAL :: j3 (nx,ny,nz) ! Coordinate transformation Jacobian d(zp)/d(z)
REAL :: tem1(nx,ny,nz)
REAL :: tem2(nx,ny,nz)
REAL :: tem3(nx,ny,nz)
REAL :: tem4(nx,ny,nz)
REAL :: tem5(nx,ny,nz)
REAL :: tem6(nx,ny,nz)
REAL :: tem7(nx,ny,nz)
REAL :: tem8(nx,ny,nz)
REAL :: tem9(nx,ny,nz)
REAL :: tem10(nx,ny,nz)
REAL :: tem11(nx,ny,nz)
REAL :: tem12(nx,ny,nz)
REAL :: tem13(nx,ny,nz)
REAL :: tem14(nx,ny,nz)
REAL :: tem15(nx,ny,nz)
REAL :: tem16(nx,ny,nz)
! real tem17(nx,ny,nz)
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: icount ! Parameter input flag
DATA icount /1/
SAVE icount
INTEGER :: i, j, k, ir, jr
INTEGER :: istor,jstor,kstor
INTEGER :: nchout ! I/O Channel of unformatted binary restart data
INTEGER :: it,ix
INTEGER :: itmax ! Maximum number of iterations
INTEGER :: istat
INTEGER :: isrc
INTEGER :: tim
INTEGER :: idummy
INTEGER :: itag ! Counter indicating input file date/time
INTEGER :: count
INTEGER :: mdpt
INTEGER :: iassim
INTEGER :: lenstr
REAL :: t1 ! Time of first data file
REAL :: t2 ! Time of second data file
REAL :: t3 ! Time of third data file
REAL :: assimtim(100)! Time of (all) input data files
REAL :: adastim
REAL :: xs ! Scalar coordinate x-component
REAL :: ys ! Scalar coordinate y-component
REAL :: zs ! Scalar coordinate z-component
REAL :: xs1 ! Scalar coordinate x-component
REAL :: ys1 ! Scalar coordinate y-component
REAL :: zs1 ! Scalar coordinate z-component
REAL :: xmove ! (x,y) position of radar relative to
REAL :: ymove ! moving grid (grid origin at (0,0,0))
REAL :: znz2 ! = z(nz-2) - zshift
REAL :: znz1 ! = z(nz-1) - zshift
REAL :: z2 ! = z(2) - zshift
REAL :: rad ! Radius of sphere in Cartesian coord
REAL :: radinv ! Inverse radius magnitude
REAL :: xor,yor
INTEGER :: newebc ! East boundary condition parameter.
INTEGER :: newwbc ! West boundary condition parameter.
INTEGER :: newnbc ! North boundary condition parameter.
INTEGER :: newsbc ! South boundary condition parameter.
!
!-----------------------------------------------------------------------
!
! Routines called:
!
!-----------------------------------------------------------------------
!
EXTERNAL avgy
EXTERNAL avgz
EXTERNAL dtadump
EXTERNAL gtdmpfn
EXTERNAL bcu
EXTERNAL bcv
EXTERNAL rhouvw
EXTERNAL lbcw
EXTERNAL vbcw
EXTERNAL assimrd
EXTERNAL adasread
EXTERNAL assimvel
EXTERNAL assimfil
EXTERNAL assimblnd
EXTERNAL retrint
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code ...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!----------------------------------------------------------------------
!
!
! The following is a brief summary of the assimilation flags
! available within this routine. For a more detailed review
! of the options see ASSIMCON.F.
!
! ivar Variational adjustment flag:
!
! = 0, NO variational adjustment at this model time step
! = 1, Perform variational adjustment at this model time step
!
! insrt Insertion flag:
!
! = 0, Do NOT insert velocities at this time step
! = 1, Insert velocities at this time step
!
! A matrix describing the assimilation options herein:
!
! ivar insrt Comments
! --------------------------------------------------------
! 0 0 Nothing - Exit assimilation mode
! 0 1 Direct insertion only
! 1 0 Variational adjustment only
! 1 1 Variational adjustment + direct insertion
!
! NOTE: If irecov=1, then the ingest and time interpolation of
! 3 input data files occur herein.
!
!-----------------------------------------------------------------------
!
DO k=1,nz
DO j=1,ny
DO i=1,nx
tem1(i,j,k) = 0.0
tem2(i,j,k) = 0.0
tem3(i,j,k) = 0.0
tem4(i,j,k) = 0.0
tem5(i,j,k) = 0.0
tem6(i,j,k) = 0.0
tem7(i,j,k) = 0.0
tem8(i,j,k) = 0.0
tem9(i,j,k) = 0.0
tem10(i,j,k) = 0.0
tem11(i,j,k) = 0.0
tem12(i,j,k) = 0.0
tem13(i,j,k) = 0.0
tem14(i,j,k) = 0.0
tem15(i,j,k) = 0.0
tem16(i,j,k) = 0.0
END DO
END DO
END DO
WRITE(6,*) 'the code enter assimdriv'
WRITE(6,*) 'insrt,ivar,irecov = ', &
insrt,ivar,irecov
IF ( insrt == 0.AND.ivar == 0.AND.irecov == 0) RETURN
IF ( insrt == 0.AND.ivar == 0.AND.irecov == 1) GO TO 350
WRITE(6,*) 'data assimilation is turned on'
!
!-----------------------------------------------------------------------
!
! Read in model background fields or adas outputs.
!
! If this is the first time to enter this subroutine and the flag
! for ADAS data is on, read into ADAS data as the first guess fields
! for the velocity variational adjustment.
!
! Outputs are saved in tem2,tem3,tem4, which are total u,v and w
! respectively.
!
! Note: rhobar in tem10
!
!-----------------------------------------------------------------------
!
tim = tpresent
isrc = 3 ! Flags to read 1 input data file
CALL adasread
(nx,ny,nz,x,y,z,zp, &
isrc,istat,adastim, &
ubar,vbar,pbar,ptbar,rhostr,qvbar, &
u,v,w,pprt,ptprt,qv,qc,qr,qi,qs,qh,j1,j2,j3, &
tem1,tem2,tem3,tem4,tem5,tem6,tem7,tem8, &
tem9,tem10)
WRITE(6,*)'the code enter adasread successfully'
PRINT*,'zp(10,10,1),zp(10,10,2),zp(10,10,3),zp(10,10,4):'
PRINT*,zp(10,10,1),zp(10,10,2),zp(10,10,3),zp(10,10,4)
! open(30,file='data.background',status='unknown',
! : form='unformatted')
! write(30) tem1
! write(30) tem2
! write(30) tem3
! write(30) tem4
! close(30)
!
!-------------------------------------------------------------------------
!
! Read in observations or radar retrieval.
!
! Note that with the exception of u,v, and w all prognostic
! variables are directly overwritten. uprt, vprt, and wprt are
! returned in arrays tem11,tem12, and tem13. u,v and w are
! reconstructed from these and the ubar and vbar arrays. The
! ingested model data is not necessarily the same as the current
! model values.
!
! Outputs are saved in tem1, tem11, tem12 and tem13, which are
! Vr, (u,v,w) respectively.
!
!-------------------------------------------------------------------------
!
isrc = 3 ! Flags to read 1 input data file
CALL assimrd
(nx,ny,nz,x,y,z,zp, &
isrc,idummy,istat,assimtim, &
ubar,vbar,pbar,ptbar,rhostr,qvbar,tem10, &
u,v,w,pprt,ptprt,qv,qc,qr,qi,qs,qh,j1,j2,j3, &
tem1,tem5,tem6,tem7,tem8,tem9,tem14, &
tem11,tem12,tem13)
WRITE(6,*) 'the code enter assimrd successfully'
! open(31,file='data.obs',status='unknown',form='unformatted')
! write(31) tem1
! write(31) tem11
! write(31) tem12
! write(31) tem13
! close(31)
!
!-----------------------------------------------------------------------
!
! Hole-fill u,v and w outside the rainwater field. Hole-filling
! is performed on the perturbation velocity fields only. tem7 serves
! as a 'template' - delineating the region to be filled. The
! Dirichlet boundary conditions are set here, outside of POIS3D.
!
!-----------------------------------------------------------------------
!
CALL assimfil
(nx,ny,nz,x,y,z,zp,ptol, &
u,v,w,wcont,ptprt,pprt,qv,qc,qr,qi,qs,qh, &
ubar,vbar,ptbar,pbar,rhostr,qvbar,j1,j2,j3, &
tem5,tem6,tem7,tem8,tem9,tem10,tem11,tem12, &
tem13,tem14,tem15,tem16)
WRITE(6,*) 'the code enter assimfil successfully'
!
!-----------------------------------------------------------------------
!
! Hole-fill vr outside the rainwater field. Hole-filling
! is performed on the perturbation velocity fields only.
! Vr is decomposited into Cartesian components (ur,vr,wr).
! The Dirichlet boundary conditions are set here, outside
! of POIS3D.
!
! The hole-filled flag is saved in tem5.
!
!-----------------------------------------------------------------------
!
CALL vrhole
(nx,ny,nz,x,y,z,zp, &
tem14,tem15,tem16, &
tem1,ubar,vbar,ptol, &
tem5,tem6,tem7,tem8,tem9,tem10)
WRITE(6,*)'the code enter vrhole successfully'
! open(30,file='data.holefill',status='unknown',
! : form='unformatted')
! write(30) tem1
! write(30) tem11
! write(30) tem12
! write(30) tem13
! close(30)
!
!-------------------------------------------------------------------------
!
! Blend the single Doppler retrieval velocity fields with ADAS
! data. ADAS data is treated as the first guess field, and the OI
! method is used to blend the two data sets together. The blended
! velocity fields, which stored in tem7,tem8,tem9, will be sent
! to the variational adjustment as background fields.
!
! Note: The retrievals need be put on staggered grids before
! blended with model background.
!
!-------------------------------------------------------------------------
!
DO k=1,nz-1
DO j=1,ny-1
DO i=2,nx-1
tem7(i,j,k)=0.5*(tem11(i,j,k)+tem11(i-1,j,k))
END DO
END DO
END DO
DO k=1,nz-1
DO j=1,ny-1
tem7(1,j,k)=tem11(1,j,k)
tem7(nx,j,k)=tem11(nx-1,j,k)
END DO
END DO
DO k=1,nz-1
DO j=2,ny-1
DO i=1,nx-1
tem8(i,j,k)=0.5*(tem12(i,j,k)+tem12(i,j-1,k))
END DO
END DO
END DO
DO k=1,nz-1
DO i=1,nx-1
tem8(i,1,k)=tem12(i,1,k)
tem8(i,ny,k)=tem12(i,ny-1,k)
END DO
END DO
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem9(i,j,k)=0.5*(tem13(i,j,k)+tem13(i,j,k-1))
END DO
END DO
END DO
DO i=1,nx-1
DO j=1,ny-1
tem9(i,j,1)=tem13(i,j,1)
tem9(i,j,nz)=tem13(i,j,nz-1)
END DO
END DO
! open(30,file='data.ObsStaggerred',status='unknown',
! : form='unformatted')
! write(30) tem1
! write(30) tem7
! write(30) tem8
! write(30) tem9
! close(30)
CALL assimblnd
(nx,ny,nz, &
tem7,tem2,tem5, &
tem6,tem10,tem11,tem12)
CALL assimblnd
(nx,ny,nz, &
tem8,tem3,tem5, &
tem6,tem10,tem11,tem13)
WRITE(6,*) 'the code enter assimblnd successfully'
DO k=1,nz
DO j=1,ny
DO i=1,nx
u(i,j,k,tim) = tem12(i,j,k)
v(i,j,k,tim) = tem13(i,j,k)
!
! w(i,j,k,tim) = 0.7*tem9(i,j,k) + 0.3*tem4(i,j,k)
w(i,j,k,tim) = 0.9*tem9(i,j,k) + 0.1*tem4(i,j,k)
! temlz(i,j,k) = w(i,j,k,tim)
! tem17(i,j,k) = w(i,j,k,tim) ! only for output
!ccxxx tem2(i,j,k) = u(i,j,k,tim)
!ccxxx tem3(i,j,k) = v(i,j,k,tim)
!ccxxx tem4(i,j,k) = w(i,j,k,tim)
END DO
END DO
END DO
PRINT*,'base state',ubar(4,4,4),vbar(4,4,4)
! open(30,file='data.blended',status='unknown',
! : form='unformatted')
! write(30) tem1
! write(30) tem12
! write(30) tem13
! write(30) temlz
! close(30)
!
!----------------------------------------------------------------------
!
! Perform the forward velocity assimilation. Two possible choices
! are provided here. One is the modified Liou/Gal-Chen procedure,
! which incorporates the radial wind component from a Doppler radar
! into a numerical model and the velocity fields are adjusted to
! satisfy the anelastic mass conservation equation while minimizing
! the difference between the 'first guess' or 'background' winds and
! the adjusted winds. Another alternative way is to insert the radial
! velocity component directly into the model while preserving the
! model's polar and tangential components.
!
!----------------------------------------------------------------------
!
CALL assimvel
(nx,ny,nz,x,y,z,zp, &
u,v,w,wcont,ptprt,pprt,qv,qc,qr,qi,qs,qh, &
ubar,vbar,ptbar,pbar,rhostr,qvbar,j1,j2,j3, &
tem1,tem2,tem3,tem4,tem5,tem6,tem7,tem8,tem9, &
tem10,tem11,tem12,tem13)
WRITE(6,*) 'code enetr assimvel correctly'
! open(30,file='data.VarAdj',status='unknown',form='unformatted')
! write(30) tem1
! write(30) tem2
! write(30) tem3
! write(30) tem4
! close(30)
!
!----------------------------------------------------------------------
!
! Apply boundary conditions to u,v,w velocities. If ivar=1, these
! will be the variationally adjusted velocities.
!
! NOTE: there is no provision for radiation lateral boundary
! conditions; if radiation conditions are chosen, zero-gradient
! conditions are applied instead.
!
!-----------------------------------------------------------------------
!
IF (ebc == 4) THEN
newebc = 3
ELSE
newebc = ebc
END IF
IF (wbc == 4) THEN
newwbc = 3
ELSE
newwbc = wbc
END IF
IF (nbc == 4) THEN
newnbc = 3
ELSE
newnbc = nbc
END IF
IF (sbc == 4) THEN
newsbc = 3
ELSE
newsbc = sbc
END IF
CALL bcu
(nx,ny,nz,0., tem2, &
0.,0.,0.,0.,newebc,newwbc,newnbc,newsbc,tbc,bbc)
CALL bcv
(nx,ny,nz,0., tem3, &
0.,0.,0.,0.,newebc,newwbc,newnbc,newsbc,tbc,bbc)
CALL lbcw
(nx,ny,nz,0., tem4, tem5, &
0.,0.,0.,0.,newebc,newwbc,newnbc,newsbc)
CALL rhouvw
(nx,ny,nz,rhostr,tem5,tem6,tem7)
CALL wcontra
(nx,ny,nz,tem2,tem3,tem4, &
mapfct, &
j1,j2,j3, &
rhostr,tem5,tem6,tem7,wcont,tem8,tem9)
CALL vbcw
(nx,ny,nz,tem4,wcont,tbc,bbc,tem2,tem3, &
rhostr,tem5,tem6,tem7, &
j1,j2,j3)
! open(30,file='data.AfterBC',status='unknown',form='unformatted')
! write(30) tem1
! write(30) tem2
! write(30) tem3
! write(30) tem4
! close(30)
!
!----------------------------------------------------------------------
!
! If insrt = 1, insert the velocities in place of the model
! velocities. Due to the leapfrog scheme, overwrite the velocities
! at tpast with those at tpresent.
!
!----------------------------------------------------------------------
!
IF (insrt == 1.) THEN
DO k = 1,nz
DO j = 1,ny
DO i = 1,nx
u(i,j,k,tpresent) = tem2(i,j,k)
v(i,j,k,tpresent) = tem3(i,j,k)
w(i,j,k,tpresent) = tem4(i,j,k)
!ccxxx pprt(i,j,k,tpresent) = 0.0
!ccxxx ptprt(i,j,k,tpresent)= 0.0
!ccxxx qv(i,j,k,tpresent) = qvbar(i,j,k)
!ccxxx qc(i,j,k,tpresent) = 0.0
!ccxxx qr(i,j,k,tpresent) = 0.0
u(i,j,k,tpast) = tem2(i,j,k)
v(i,j,k,tpast) = tem3(i,j,k)
w(i,j,k,tpast) = tem4(i,j,k)
pprt(i,j,k,tpast) = pprt(i,j,k,tpresent)
ptprt(i,j,k,tpast)= ptprt(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)
END DO
END DO
END DO
END IF
!
!-----------------------------------------------------------------------
!
! Find a unique name hdmpfn(1:ldmpf) for the history dump data
! set at time 'curtim'. This file name is stored in 'adjdat' which
! is used by the thermodynamic recovery.
!
!-----------------------------------------------------------------------
!
lenstr = LEN(assimnm)
CALL strlnth
(assimnm, lenstr)
CALL gtdmpfn
(assimnm(1:lenstr),dirnam,ldirnm,curtim, &
hdmpfmt,mgrid,nestgrd, hdmpfn, ldmpf)
WRITE(6,'(1x,a,a)') &
'Adjusted data dump in file ',hdmpfn(1:ldmpf)
adjdat(icount) = hdmpfn(1:ldmpf)
icount = icount + 1 !!! initial value=1
grdbas = 0 !!! Note:No base state or grid array is dumped.
!
!-----------------------------------------------------------------------
!
! Write-out the model-adjusted velocity fields (tem2,tem3,and tem4),
! pressure,temperature and moisture variables. This is done so that
! when a recovery is performed, we can obtain an estimate of the
! velocity time derivatives. The data dump occurs in conjunction
! with the variational adjustment, namely at t1,t2,t3......tn
!
! t1 t2 t3 tn
! --x--------------x--------------x--------------x--
! dump dump dump dump
!
! Compute rhobar (tem9) from rhostr and j3.
!
!-----------------------------------------------------------------------
!
tim = tpresent
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem9(i,j,k) = rhostr(i,j,k)/j3(i,j,k)
tem8(i,j,k) = 0.0
END DO
END DO
END DO
CALL dtadump
(nx,ny,nz,nstyps, &
hdmpfmt,nchout,hdmpfn(1:ldmpf),grdbas,filcmprs, &
tem2,tem3,tem4,ptprt(1,1,1,tim), &
pprt(1,1,1,tim),qv(1,1,1,tim),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,kmh,kmv, &
ubar,vbar,tem8,ptbar,pbar,tem9,qvbar, &
x,y,z,zp,zp(1,1,2),j1,j2,j3, &
tem1(1,1,1),tem1(1,1,1),tem1(1,1,1), &
tem1(1,1,1),tem1(1,1,1),tem1(1,1,1), &
tem1(1,1,1),tem1(1,1,1),tem1(1,1,1), &
tem1(1,1,1),tem1(1,1,1),tem1(1,1,1), &
tem1(1,1,1),tem1(1,1,1),tem1(1,1,1), &
tem1(1,1,1),tem1(1,1,1),tem1(1,1,1), &
tem1(1,1,1),tem1(1,1,1),tem1(1,1,1),tem1(1,1,1), &
tem5,tem6,tem7)
!
!-----------------------------------------------------------------------
!
! If recovery flag is turned on (irecov=1), read in the adjusted
! velocity fields and/or moisture fields at three time levels for
! thermodynamic retrieval.
!
!-----------------------------------------------------------------------
!
350 CONTINUE
IF (irecov == 1) THEN
isrc = 4
itag = ii ! Counter indicating input file name and time
CALL assimrd
(nx,ny,nz,x,y,z,zp, &
isrc,itag,istat,assimtim, &
ubar,vbar,pbar,ptbar,rhostr,qvbar,tem11, &
u,v,w,pprt,ptprt,qv,qc,qr,qi,qs,qh,j1,j2,j3, &
tem1,tem2,tem3,tem4,tem5,tem6, &
tem7,tem8,tem9,tem10)
!
!-----------------------------------------------------------------------
!
! Set the model time back at the middle time level (t2), and perform
! a time interpolation on the input data to get data ready at three
! model time steps t2-dtbig, t2, t2+dtbig.
!
! NOTE: All prognostic variables with the exception of qi,qs, and
! qh are overwritten at all three time levels.
!
!-----------------------------------------------------------------------
!
t1 = assimtim(ii-3)
t2 = assimtim(ii-2)
t3 = assimtim(ii-1)
curtim = INT((t2+.01)/dtbig)*dtbig
nstep = INT( ((curtim-tstart)+0.1*dtbig)/dtbig ) + 1
IF (ABS(t2-curtim) > ABS(t2-(curtim+dtbig))) THEN
curtim = curtim + dtbig
END IF
CALL retrint
(nx,ny,nz, &
u,v,w,ptprt,pprt,qv,qc,qr, &
t1,t2,t3, &
tem1,tem2,tem3,tem4,tem5,tem6,tem7,tem8,tem9)
END IF
IF(ivar == 0) THEN
PRINT *,'Fill wcont after time interpolation when ivar=0'
!
!----------------------------------------------------------------------
!
! WARNING: Although u,v,w,qc,qv,qr,pprt,ptprt, are over-written
! wcont has not been. Upon exiting this routine, FORCE3D
! calls ADVUVW which uses wcont in the calculation of the
! vertical advection terms.
!
! Calculate wcont at time tpresent. wcont will be used in FRCUVW
! and FRCP. Average rhostr to u, v, w points. They are stored
! in tem5, tem6 and tem7 respectively.
!
!
!-----------------------------------------------------------------------
!
tim = tpresent
CALL rhouvw
(nx,ny,nz,rhostr,tem5,tem6,tem7)
CALL wcontra
(nx,ny,nz,u(1,1,1,tim),v(1,1,1,tim),w(1,1,1,tim), &
mapfct, &
j1,j2,j3,rhostr,tem5,tem6,tem7,wcont,tem8,tem9)
END IF
!
!-----------------------------------------------------------------------
!
! These temporary arrays are returned to FORCE3D via the arrays
! uforce, vforce, wforce and defsq. In order to avoid contaminating
! any of these terms we set them to zero prior to returning.
!
!-----------------------------------------------------------------------
!
PRINT *, 'In ASSIMDRIV fill tem10,tem11,tem12,tem13 with zeros'
DO k=1,nz
DO j=1,ny
DO i=1,nx
tem10(i,j,k) = 0.0
tem11(i,j,k) = 0.0
tem12(i,j,k) = 0.0
tem13(i,j,k) = 0.0
tem14(i,j,k) = 0.0
tem15(i,j,k) = 0.0
tem16(i,j,k) = 0.0
END DO
END DO
END DO
RETURN
END SUBROUTINE assimdriv