!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE ASSIMCON ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE assimcon(nx,ny,nz,x,y,z,zp, & 1,3
ubar,vbar,pbar,ptbar,rhostr,qvbar, &
u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh, &
j1,j2,j3, &
tem1,tem2,tem3,tem4,tem5,tem6,tem7,tem8, &
tem9,tem10,tem11)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Coordinates the input of control parameter options for a thermo-
! dynamic recovery and variational adjustment. The following is a
! summary of the available options and a list of possible combinations.
!
! recovopt Dynamic retrieval option:
!
! = 0, Do NOT retrieve p' or T'
! = 1, Retrieve p' and T' (Implied insertion of the
! interpolated velocities at the
! recovery time.)
!
! varopt Variational adjustment option:
!
! = 0, NO variational adjustment
! = 1, Perform variational adjustment
!
! insrtopt Insertion option:
!
! = 0, Do NOT insert velocities (NOTE: velocities will be inserted
! in conjunction with dynamic
! retrieval if recovopt=1)
! = 1, Insert velocities (At all available data times -
! See NOTE below.)
!
! A matrix describing these assimilation options is as follows:
!
! recovopt varopt insrtopt Comments
! ----------------------------------------------------------------------
! 0 0 0 Nothing - Exit assimilation mode
! 0 0 1 Direct insertion Only
! 0 1 0 NOT ALLOWED - Exit assimilation mode
! 0 1 1 Var. adj. + direct insertion (no recovery)
! 1 0 1 Recovery + direct insertion (no var. adj.)
! 1 1 1 Recovery, adj., & direct insertion
! 1 1 0 Recovery + var. adj. (no direct insertion)
! 1 0 0 Recovery only
!
! NOTE: The insertion option (insrtopt=1) implies that the velocities
! are to be inserted directly into the model stream at the model
! time corresponding to that of the data. This inserted velocity
! data may (varopt=1) or may not (varopt=0) be 'adjusted'.
! When a recovery is performed (recovopt=1), the 3 input data
! files (at times t1,t2,& t3) are interpolated to model time
! steps m1,m2,& m3. In effect, this is also an insertion since
! the model's prognostic variables at these times are overwritten.
! Thus, even if the insertion option is not chosen (i.e., insrtopt=0)
! there will still be an 'insertion' at the recovery time if
! the recovery option is turned on (recovopt=1).
!
! t1 t2 t3
! --x-----------|--x--|-----------x--
! m1 m2 m3
!
!
!-----------------------------------------------------------------------
!
! AUTHOR: Steven Lazarus and Alan Shapiro
!
! 2/24/1993.
!
! MODIFICATION HISTORY:
!
! 03/08/96 (Limin Zhao)
! Added an adjustment to the location of radar station so that it
! will never be on grid points.
!
! 03/19/96 (Limin Zhao)
! Fixed a bug on assimtim. They need be saved after they are read
! in first time.
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
!
! 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)
!
! OUTPUT:
!
! ubar Base state x velocity component (m/s)
! vbar Base state y velocity component (m/s)
! pbar Base state pressure (Pascal)
! ptbar Base state potential temperature (K)
! rhostr Base state density (kg/m**3) * j3
! qvbar Base state water vapor specific humidity (kg/kg)
!
! u x velocity component at 3 time levels
! v y velocity component at 3 time levels
! w z velocity component at 3 time levels
!
! ptprt Perturbation potential temperature at 3 time levels
! pprt Perturbation pressure at 3 time levels
! qv Water vapor specific humidity (kg/kg)
! qc Cloud water mixing ratio (kg/kg)
! qr Rain water mixing ratio (kg/kg)
! qi Cloud ice mixing ratio (kg/kg)
! qs Snow mixing ratio (kg/kg)
! qh Hail mixing ratio (kg/kg)
!
! j1 Coordinate transformation Jacobian -d(zp)/dx
! j2 Coordinate transformation Jacobian -d(zp)/dy
! j3 Coordinate transformation Jacobian d(zp)/dz
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations:
!
! NOTE: Since ASSIMCON reads input data file headers only, the
! following are dummy arrays.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE ! Force explicit declarations
INTEGER :: nt ! The no. of t-levels of t-dependent arrays
PARAMETER (nt=3)
INTEGER :: nx, ny, nz ! Number of grid points in 3 directions
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 :: ubar (nx,ny,nz) ! Base state x-velocity (m/s)
REAL :: vbar (nx,ny,nz) ! Base state y-velocity (m/s)
REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal).
REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K)
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 :: 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 :: 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 :: j1 (nx,ny,nz) ! Coordinate transformation Jacobian defined as
! - d( zp )/d( x )
REAL :: j2 (nx,ny,nz) ! Coordinate transformation Jacobian defined as
! - d( zp )/d( y )
REAL :: j3 (nx,ny,nz) ! Coordinate transformation Jacobian defined as
! d( zp )/d( z )
REAL :: tem1 (nx,ny,nz) ! Temporary work array.
REAL :: tem2 (nx,ny,nz) ! Temporary work array.
REAL :: tem3 (nx,ny,nz) ! Temporary work array.
REAL :: tem4 (nx,ny,nz) ! Temporary work array.
REAL :: tem5 (nx,ny,nz) ! Temporary work array.
REAL :: tem6 (nx,ny,nz) ! Temporary work array.
REAL :: tem7 (nx,ny,nz) ! Temporary work array.
REAL :: tem8 (nx,ny,nz) ! Temporary work array.
REAL :: tem9 (nx,ny,nz) ! Temporary work array.
REAL :: tem10 (nx,ny,nz) ! Temporary work array.
REAL :: tem11 (nx,ny,nz) ! Temporary work array.
!
!-----------------------------------------------------------------------
!
! Miscellaneous local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: ichk ! Flag indicating whether the next data set is
SAVE ichk ! available (0=not available,1=available)
DATA ichk /1/
INTEGER :: iassim ! Flag indicating whether model time (curtim)
SAVE iassim ! exceeds the input data time (assimtim).
DATA iassim /1/ ! (0=yes, exit assimilation mode)
INTEGER :: icount ! Flag controling the reading of the batch file.
SAVE icount ! (0=do not read batch file,1=read batch file).
DATA icount /1/
INTEGER :: iread ! Counter indicating the input data file and data
SAVE iread ! time. Used to flag whether a variational adj.
DATA iread /1/ ! is to be performed this time step.
INTEGER :: igo ! Counter indicating the input data file and data
SAVE igo ! time. Used to flag whether a direct insertion
DATA igo /1/ ! is to be performed this time step.
INTEGER :: dtcount
SAVE dtcount
DATA dtcount /0/
INTEGER :: isrc ! Flag coordinating the data ingest
INTEGER :: istat ! Status of input data file
INTEGER :: itag ! If test flag (itag=ii,igo, or iread)
REAL :: assimtim(100) ! Time of (all) input data files
SAVE assimtim
REAL :: t1 ! Time of first data file
REAL :: t2 ! Time of second data file
REAL :: t3 ! Time of third data file
REAL :: temscl ! Grid scale used to calculate cdvdmp
REAL :: radloc
REAL :: stor1,stor2,stor3,stor4
INTEGER :: stor5
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc' ! Global constants that control model execution
INCLUDE 'assim.inc' ! Recovery/assimilation parameters
INCLUDE 'grid.inc'
!
!-----------------------------------------------------------------------
!
! Routines called:
!
!-----------------------------------------------------------------------
!
! external assimbat
EXTERNAL assimrd
EXTERNAL retrint
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
! If iassim is zero, then one of four things have occured:
! 1) The next available data file to be used in the assimilation
! arrived late (i.e., after the current model time exceeds that
! of the input data). Exit assimilation mode.
! 2) The wrong combination of options for recovopt,velocity,and
! insrtopt were chosen (see below). Exit assimilation mode.
! 3) The number of files (nvf) has been exceeded.
! 4) The assimilation mode has been turned off (recovopt,varopt,
! instopt= 0).
!
!-----------------------------------------------------------------------
!
WRITE(6,*)'code in assimcon, and curtim is ',curtim
IF ( iassim == 0) RETURN
!
!-----------------------------------------------------------------------
!
! Enter this IF block if this is the first entry into ASSIMCON
! (icount=1).
!
!-----------------------------------------------------------------------
!
IF ( icount == 1) THEN
!
!-----------------------------------------------------------------------
!
! Read in user-supplied recovery/assimilation parameters (ASSIMBAT.F)
! upon first entry into ASSIMCON only (icount=1). The parameter
! icount is then set to zero to avoid reading the batch file on
! subsequent visits to this routine.
!
!-----------------------------------------------------------------------
!
! CALL initassim(nx,ny,nz)
icount = 0
!
!-----------------------------------------------------------------------
!
! Check if the radar station located on grid point. If so, shift
! a small distance. Here we choose to shift (grid space/20).
!
!-----------------------------------------------------------------------
!
! radloc = xshift - dx*int(xshift/dx)
! IF (radloc.eq.0) THEN
radloc = xshift - dx*nint(xshift/dx)
IF (radloc < dx*1.0E-3) THEN
xshift = xshift + 0.05*dx
WRITE(6,*)'radar locates at x grid point'
END IF
! radloc = yshift - dy*int(yshift/dy)
! IF (radloc.eq.0) THEN
radloc = yshift - dy*nint(yshift/dy)
IF (radloc < dy*1.0E-3) THEN
yshift = yshift + 0.05*dy
WRITE(6,*)'radar locates at y grid point'
END IF
! radloc = zshift - dz*int(zshift/dz)
! IF (radloc.eq.0) THEN
radloc = zshift - dz*nint(zshift/dz)
IF (radloc < dz*1.0E-3) THEN
zshift = zshift + 0.05*dz
WRITE(6,*)'radar locates at z grid point'
END IF
WRITE(6,*)'adjusted radar locations xshift,yshift,zshift=', &
xshift,yshift,zshift
!
!-----------------------------------------------------------------------
!
! Check flags to see what combination of assimilation options
! have been chosen. If an unavailable option is chosen or the
! assimilation mode has been turned off print message and exit.
! (See table in Purpose Section above)
!
!-----------------------------------------------------------------------
!
IF ( recovopt == 0.AND.insrtopt == 0) GO TO 100
!
!-----------------------------------------------------------------------
!
! Reset nstep so that the I/O corresponds to the restart time and not
! t=0. This is a temporary fix until the option is introduced into
! ARPS proper.
!
!-----------------------------------------------------------------------
!
nstep = INT( ((curtim-tstart)+0.1*dtbig)/dtbig ) + 1
PRINT *,'in ASSIMCON, nstep =',nstep
!
!-----------------------------------------------------------------------
!
! Initialize the counter, ii, to 3. ii is declared in the common
! block of ASSIM.INC and is used by this routine and ASSIMRD.F only.
! NOTE: ii is updated in ASSIMCON only.
!
!-----------------------------------------------------------------------
!
ii = 3
!
!-----------------------------------------------------------------------
!
! Read three input data file headers. This is done so that the
! recovery can access the times of these data files. The time
! for each file is brought back via the array 'assimtim' which
! is then used to set flags to determine when to perform a
! variational adjustment, and/or direct insertion and/or the first
! recovery.
!
! NOTE: This package assumes that AT LEAST 3 input data files exist
! prior to model execution.
!
! The flag isrc coordinates the ingestion of data, where:
!
! isrc = 1, Flags ASSIMRD to read 3 file headers only
! isrc = 2, Flags ASSIMRD to read 1 file header only
! isrc = 3, Flags ASSIMRD to read 1 complete data file
! (called in ASSIMVEL.F)
! isrc = 4, Flags ASSIMRD to read 3 complete data files
!
! Note: tem11 is used to read rhobar
!
!-----------------------------------------------------------------------
!
isrc = 1 ! Flags assimrd to read 3 file headers only
itag = ii ! Counter indicating the input file name and time
PRINT *, 'ASSIMCON: CALL assimrd_1 ', itag
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)
IF (istat /= 0) THEN
iassim = 0
WRITE(6,'(/5x,a,/5x,a,/5x,a,/5x,a)') &
'WARNING: The assimilation package assumes that 3 input', &
'data files exist prior to the start of the assimilation.', &
'Please provide at least 3 files and restart assimilation.', &
'Exit assimilation mode.'
RETURN
END IF
END IF
!
!-----------------------------------------------------------------------
!
! If ichk=0, then the data file needed for the next 'assimilation'
! does not yet exist and thus we set irecov, ivar, and insrt to zero
! during that model time step. This is done since irecov, ivar, &
! insrt cannot be flagged using an 'unknown' time (assimtim).
! If the data file 'arrives' late (i.e., after the model time
! exceeds that of the input data file), the parameter iassim is set
! to 0 and the assimilation mode is turned off for the remainder of
! the simulation. If the data arrive on time, ichk is set to 1, and
! we proceed below to determine whether a recovery/assimilation is
! to be performed during this model time step.
!
!-----------------------------------------------------------------------
!
!
! assimtim(1) = 0.0 ! for 18:36, 18:41, 18:47Z
! assimtim(2) = 350.0
! assimtim(3) = 701.0
! assimtim(1) = 30.0 ! for SSW NOV 1998 tests
! assimtim(2) = 378.0 ! comment out 12-5-98 SSW
! assimtim(3) = 732.0
WRITE(6,*)'assim time are:',assimtim(1),assimtim(2),assimtim(3)
IF ( ichk == 0) THEN
irecov = 0
ivar = 0
insrt = 0
IF ( ii > nvf.OR.igo > nvf.OR.iread > nvf) iassim = 0
ELSE
!
!-----------------------------------------------------------------------
!
! If recovopt equals 1, set flags to perform a retrieval.
!
!-----------------------------------------------------------------------
!
IF ( recovopt == 1) THEN
!
!-----------------------------------------------------------------------
!
! Determine whether a recovery/assimilation is to be performed
! during this model time step.
!
!-----------------------------------------------------------------------
!
WRITE(6,*) 'curtim = ',curtim
WRITE(6,*) 'assim time = ',assimtim(1),assimtim(2),assimtim(3)
IF (curtim < assimtim(ii).OR.ii-1 >= nvf) THEN
irecov = 0 ! Flag tells RETRPTPR.F not to perform a recovery
ELSE
ii = ii + 1
irecov = 1 ! Flag tells RETRPTPR.F to perform a recovery
END IF
END IF
!
!-----------------------------------------------------------------------
!
! If varopt equals 1, set flags to perform a variational adjustment.
!
!-----------------------------------------------------------------------
!
IF (varopt == 1) THEN
!
!-----------------------------------------------------------------------
!
! Determine whether a variational adjustment is to be performed
! during this model time step.
!
!-----------------------------------------------------------------------
!
IF (curtim < assimtim(iread) .OR. iread-1 >= nvf) THEN
ivar = 0 ! Flag tells ASSIMVEL.F not to perform a variational adjustment
ELSE
iread = iread + 1
ivar = 1 ! Flag tells ASSIMVEL.F to perform a variational adjustment
END IF
END IF
!
!-----------------------------------------------------------------------
!
! If insrtopt equals 1, set flags to perform a direct insertion.
!
!-----------------------------------------------------------------------
!
IF (insrtopt == 1) THEN
!
!-----------------------------------------------------------------------
!
! Determine whether a direct insertion is to be performed
! during this model time step.
!
!-----------------------------------------------------------------------
!
IF (curtim < assimtim(igo) .OR. igo-1 >= nvf) THEN
insrt = 0 ! Flag tells ASSIMVEL.F not to perform an insertion
ELSE
igo = igo + 1
insrt = 1 ! Flag tells ASSIMVEL.F to perform an insertion
END IF
END IF
END IF
WRITE(6,*) 'irecov,ivar,insrt: ',irecov,ivar,insrt
WRITE(6,*) 'ii,iread,igo: ',ii,iread,igo
!
!-----------------------------------------------------------------------
!
! Read the next available data file. This is done in order to set the
! flags, irecov, ivar, and insrt for the next recovery, variational
! adjustment, and/or insertion. Since it is assumed that at least 3
! data files exist prior to the assimilation period, we do not read
! the 4th file header until the model time exceeds the time of the
! 3rd file (t3).
!
! t1 t2 t3 t4
! --x--------------x--------------x--------------x--
! |
! Begin search for 4th File
!
! Similarly, we do not begin looking for the next input data file
! header [at time, t(n)] until the model time exceeds the time of the
! preceeding input data file [at time, t(n-1)].
!
! t(n-1) t(n)
! --x--------------x--
! |
! Begin search for nth File
!
!-----------------------------------------------------------------------
!
IF ( ii > 3.OR.iread > 3.OR.igo > 3) THEN
IF ( irecov == 1.OR.ivar == 1.OR.insrt == 1.OR.ichk == 0) THEN
isrc = 2 ! Flags assimrd to read 1 file header only
itag = MAX(ii,iread,igo)
PRINT *, 'ASSIMCON: CALL assimrd_2 ', &
itag, irecov, ivar, insrt
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)
IF (istat /= 0 .OR. itag > nvf) THEN
ichk = 0
ELSE
ichk = 1
!
!-----------------------------------------------------------------------
!
! Check to ensure that the input of the next data file occurs no more
! than one model time step (dtbig) past the next recovery time
! assimtim(ii). If it does, exit assimilation mode by setting
! iassim = 0.
! NOTE: This precludes any further assimilation even if subsequent
! data files become available.
!
!-----------------------------------------------------------------------
!
IF (curtim-assimtim(itag) > dtbig) THEN
iassim = 0
irecov = 0
ivar = 0
insrt = 0
WRITE(6,'(/5x,a,/5x,a,/5x,a)') &
'WARNING: The successful read of the input data file occured', &
'after the insertion/adjustment/recovery window', &
'Exit assimilation mode.'
RETURN
END IF
END IF
END IF
END IF
RETURN
100 WRITE(6,'(/5x,a,/5x,a,/10x,a,i2,/10x,a,i2,/10x,a,i2,/5x,a,/5x,a)') &
'WARNING: You have either chosen an option that is not available', &
'or have turned the assimilation mode off. The input option was', &
'recovopt=',recovopt,'varopt=',varopt,'insrtopt=',insrtopt, &
'See ASSIMCON for appropriate parameters.', &
'Exit assimilation mode.'
iassim = 0
RETURN
END SUBROUTINE assimcon