!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE ASSIMRD ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE assimrd(nx,ny,nz,x,y,z,zp, & 4,21
isrc,itag,ireturn,assimtim, &
ubar,vbar,pbar,ptbar,rhostr,qvbar,rhobar, &
u,v,w,pprt,ptprt,qv,qc,qr,qi,qs,qh,j1,j2,j3, &
tem1,tem5,tem6,tem7,tem8,tem9,tem10,tem11, &
tem12,tem13)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Coordinates the ingestion of history data dump files in various
! formats and the ingestion of 'pre-processed' Lincoln Lab radar data.
! Other data types can be used by selecting the 'other' option for
! the 'dtyp' parameter in ASSIM.INPUT. The velocity fields can be
! used for an insertion, adjustment and/or recovery (see ASSIMCON.F).
!
! NOTE: In order to use the 'other' option, corresponding changes
! are needed in this routine. In this version, only two type
! of data are processed.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Alan Shapiro and Steven Lazarus
!
! 2/25/1993
!
! MODIFICATION HISTORY:
!
! 02/22/96 (Limin Zhao)
! Changes are made to match the new version of assimilation package.
!
! 02/26/96 (Steve Lazarus & Limin Zhao)
! Added the simple moisture parameterization (Kessler formula) for
! qr and qv.
!
! 02/27/96 (Limin Zhao)
! A critical value of qr is used to set flags at the area outside of
! rainwater regions for OSSE type of experiments.
!
! 02/29/96 (Limin Zhao)
! Added two temporary arrays to avoid overwritten of pbar and ptbar,
! which will be used in thermodynamic retrieval.
!
! 05/08/96 (Limin Zhao)
! A bug was fixed when control input parameters are set
! varopt=0,insrtopt=0 and recovopt =1.
! A correct filename is given now.
!
! 05/14/96 (Limin Zhao and Alan Shapiro)
! Modified the stratage to get qv by using background temperature
! and pressure information.
!
! 05/15/96 (Limin Zhao)
! A control parameter is hardwired to control the moisture retrieval
! switch on or off.
!
! 09/24/96 (Limin Zhao)
! Fix a bug in qr reading with isrc=4. qr should be read in for
! thermodynamic retrieval.
!
!-----------------------------------------------------------------------
!
! 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)
!
! isrc Flag, indicating the calling routine
! itag Counter indicating file name and time
!
! OUTPUT:
!
! ireturn Flag, indicating read status of input file
! = 0 Successful read
! = 1 Unsuccessful read
!
! assimtim Times of all input files
!
! 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) times j3
! qvbar Base state water vapor specific humidity (kg/kg)
!
! u x component of velocity at a given time level (m/s)
! v y component of velocity at a given time level (m/s)
! w Vertical component of Cartesian velocity at a given
! time level (m/s)
! pprt Perturbation pressure at times tpast and tpresent (Pascal)
! ptprt Perturbation potential temperature at times tpast and
! tpresent (K)
!
! 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
!
! WORK ARRAYS:
!
! tem1 Temporary work array.
! tem5 Temporary work array.
! tem6 Temporary work array.
! tem7 Temporary work array.
! tem8 Temporary work array.
! tem9 Temporary work array.
! tem10 Temporary work array.
! tem11 Temporary work array.
! tem12 Temporary work array.
! tem13 Temporary work array.
!
! rhobar Base state density (kg/m**3)
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
!
INTEGER :: nt ! Number of time levels of time-dependent arrays.
INTEGER :: tim ! Index of time level.
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.
PARAMETER (nt=3, tpast=1, tpresent=2, tfuture=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.
INTEGER :: isrc ! Flag indicating source of calling routine
INTEGER :: itag ! Counter indicating file name and time
INTEGER :: nstyps
REAL :: assimtim(100) ! Time of data input files
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 :: rhobar(nx,ny,nz) ! Base state air density (kg/m**3)
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 :: pprt (nx,ny,nz,nt) ! Perturbation pressure (Pascal)
REAL :: ptprt (nx,ny,nz,nt) ! Perturbation potential temperature (K)
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 -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) ! Temporary work array
REAL :: tem5 (nx,ny,nz) ! Temporary work array
REAL :: tem6 (nx,ny,nz) ! Temporary work array
REAL :: tem7 (nx,ny,nz) ! Temporary work array
REAL :: tem8 (nx,ny,nz) ! Temporary work array
REAL :: tem9 (nx,ny,nz) ! Temporary work array
REAL :: tem10 (nx,ny,nz) ! Temporary work array
REAL :: tem11 (nx,ny,nz) ! Temporary work array
REAL :: tem12 (nx,ny,nz) ! Temporary work array
REAL :: tem13 (nx,ny,nz) ! Temporary work array
INTEGER :: ireturn
REAL :: frsvnth, coef
REAL :: rad,xs,ys,zs
REAL :: xmove,ymove
REAL :: plcl
INTEGER :: in,jn
INTEGER :: klcl
INTEGER :: itimesv
!
! real dummy(153,99,43) !Note: temporary fix for extra arrays
! integer idummy(153,99,43)
!
! real dummy(133,133,37) !Note: temporary fix for extra arrays
! integer idummy(133,133,37)
!
!-----------------------------------------------------------------------
!
! Routines called:
!
!-----------------------------------------------------------------------
!
EXTERNAL dtahead
EXTERNAL dtaread
EXTERNAL radread
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: is ! Counter, used for reading input data
SAVE is
DATA is/1/
INTEGER :: i,j,k,n ! Loop index
INTEGER :: nchanl ! FORTRAN I/O channel number for history data output.
INTEGER :: lengbf,lendtf,lbasdmpf
REAL :: xor ! Coordinate (xor,yor,zor) of the model grid
REAL :: yor ! origin relative to the radar.
REAL :: zor !
REAL :: storstop ! Temporarily stores the model stop time
CHARACTER (LEN=128 ) :: saverunm ! Temporarily stores the name of this run
CHARACTER (LEN=128 ) :: filein ! Input file name for recovery
REAL :: temp,pres,qvsat
INTEGER :: imoist
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'assim.inc'
INCLUDE 'globcst.inc'
INCLUDE 'phycst.inc'
INCLUDE 'grid.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
! If isrc=1, then read the times (assimtim) from 3 data file headers.
! This is done in order to determine when either a recovery,
! adjustment, and/or an insertion should be performed. It is
! assumed that 3 data files exist at the beginning of the
! assimilation period. For this reason the counter, itag, is
! initially set to 3 as well as updated in ASSIMCON.F.
!
! The grid/base state file (inigbf) and input file names (assimdat)
! are to be provided by the user in ASSIM.INPUT. The grid/base
! state file is used when model data is ingested only.
!
! NOTE: None of the time-dependent variables are read in during
! this step.
!
!-----------------------------------------------------------------------
!
WRITE(6,*) 'code in assimrd: is,isrc=',is,isrc
IF( isrc == 1) THEN ! Called by ASSIMCON
DO i=1,itag
tim = i
lendtf=LEN(assimdat(i))
CALL strlnth
( assimdat(i), lendtf)
WRITE(6,*) 'The filename assimdat(',i,')=', &
assimdat(i)(1:lendtf)
!c
!clz
!c The option for dtyp=0 is not well considered for SOP, It will
!c be modified in future
!c
IF( dtyp == 0) THEN
saverunm = runname
CALL dtahead
(nx,ny,nz, &
inifmt,inigbf,lengbf,assimdat(i), &
lendtf,assimtim(i),x,y,z,zp,tem11,tem12,tem13, &
ptprt(1,1,1,tim),pprt(1,1,1,tim),tem7, &
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),tem9, &
ubar,vbar,tem8,ptbar,pbar,rhobar,qvbar, &
ireturn,tem1,tem9,tem10)
runname = saverunm
IF(ireturn /= 0) RETURN
ELSE IF(dtyp == 1) THEN
CALL radread
(assimdat(i),lendtf, &
isrc,assimtim(i),ireturn, &
nx,ny,nz,dx,dy,dz, &
xor,yor,zor, &
tem1,tem5,tem6,tem7,tem8, &
tem9,tem10,tem11,tem12,tem13)
IF(ireturn /= 0) RETURN
END IF
END DO
!
!-----------------------------------------------------------------------
!
! Read in a single header to recover the time. For recovopt=1
!
! NOTE: None of the time-dependent variables are read in during
! this step.
!
!-----------------------------------------------------------------------
!
ELSE IF(isrc == 2) THEN ! Called by ASSIMCON
tim = tpresent
lendtf=LEN(assimdat(itag))
CALL strlnth
( assimdat(itag), lendtf)
WRITE(6,*) 'The filename assimdat(',itag,')=', &
assimdat(itag)(1:lendtf)
IF( dtyp == 0) THEN
saverunm = runname
CALL dtahead
(nx,ny,nz, &
inifmt,inigbf,lengbf,assimdat(itag), &
lendtf,assimtim(itag),x,y,z,zp,tem11,tem12,tem13, &
ptprt(1,1,1,tim),pprt(1,1,1,tim),tem7, &
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),tem9, &
ubar,vbar,tem8,ptbar,pbar,rhobar,qvbar, &
ireturn,tem1,tem9,tem10)
runname = saverunm
IF( ireturn /= 0) RETURN
ELSE IF(dtyp == 1) THEN
CALL radread
(assimdat(itag),lendtf, &
isrc,assimtim(itag),ireturn, &
nx,ny,nz,dx,dy,dz, &
xor,yor,zor, &
tem1,tem5,tem6,tem7,tem8, &
tem9,tem10,tem11,tem12,tem13)
IF(ireturn /= 0) RETURN
END IF
!
!-----------------------------------------------------------------------
!
! Read in a single data file. The radial velocities are used
! to perform a variational adjustment and/or insertion.
!
! NOTE: If model data is ingested (dtyp=0) all current model
! prognostic variables are overwritten with the exeption of
! u,v,w and qv. uprt,vprt,wprt, and qvprt are returned in
! tem4,tem5,tem6,and tem7 respectively. The total fields
! can then reconstructed from these and their respective base
! state quantities. qv is reconstructed here.
!
!-----------------------------------------------------------------------
!
ELSE IF(isrc == 3) THEN ! Called by ASSIMVEL
tim = tpresent
IF( dtyp == 0) THEN
lengbf=LEN(inigbf)
CALL strlnth
( inigbf, lengbf)
WRITE(6,'(/a,a)') &
'The grid/base state file name is ',inigbf(1:lengbf)
lendtf=LEN(assimdat(is))
CALL strlnth
( assimdat(is), lendtf)
WRITE(6,'(/a,a)')'The file name is ',assimdat(is)(1:lendtf)
saverunm = runname
!
!-----------------------------------------------------------------------
!
! Set the tem8, tem5 and tem6 arrays to zero. This is done to avoid
! overwriting wbar, pbar and ptbar on calls to dtaread.
!
!-----------------------------------------------------------------------
!
DO k=1,nz
DO j=1,ny
DO i=1,nx
tem8(i,j,k) = 0.0
tem5(i,j,k) = 0.0
tem6(i,j,k) = 0.0
END DO
END DO
END DO
storstop = tstop ! Temporary. For ingestion of model data
! generated prior to 4.0
CALL ctim2abss
( year, month, day, hour, minute, second, itimesv )
CALL dtaread
(nx,ny,nz,nstyps, &
inifmt,nchanl,inigbf,lengbf,assimdat(is), &
lendtf,assimtim(is),x,y,z,zp,tem11,tem12,tem13, &
ptprt(1,1,1,tim),pprt(1,1,1,tim),tem7, &
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),tem9,tem9,tem9, &
ubar,vbar,tem8,ptbar,pbar,rhobar,qvbar, &
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), &
ireturn,tem6,tem9,tem10)
CALL abss2ctim
( itimesv, year, month, day, hour, minute, second )
tstop = storstop
runname = saverunm
IF(ireturn /= 0) RETURN
!
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
rhostr(i,j,k) = rhobar(i,j,k)*j3(i,j,k)
qv(i,j,k,tim) = tem7(i,j,k) + qvbar(i,j,k)
END DO
END DO
END DO
DO k = 1,nz
DO j = 1,ny
DO i = 1,nx
tem11(i,j,k) = tem11(i,j,k) + ubar(i,j,k)
tem12(i,j,k) = tem12(i,j,k) + vbar(i,j,k)
tem13(i,j,k) = tem13(i,j,k)
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
!
! Interpolate input 'model' velocity components to scalar grid point.
! Where:
! tem7 = scalar u component
! tem8 = scalar v component
! tem9 = scalar w component
!
!-----------------------------------------------------------------------
!
CALL avgx
(tem11, 0, nx,ny,nz, &
1,nx-1,1,ny-1,1,nz-1,tem7)
CALL avgy
(tem12, 0, nx,ny,nz, &
1,nx-1,1,ny-1,1,nz-1,tem8)
CALL avgz
(tem13, 0, nx,ny,nz, &
1,nx-1,1,ny-1,1,nz-1,tem9)
!
!-----------------------------------------------------------------------
!
! Calculate the radial velocity component of the input model data.
! This is for OSSE type experiments. The input model data may or
! may not match that of the current model stream.
!
! WARNING: The insertion below assumes that, the user has supplied
! the radar coordinates with respect to the lower left hand
! corner of the grid (See ASSIM.INPUT). The grid origin is
! assumed to be at (0,0,0).
!
! * (0,0,0) grid origin
! . .
! . . ymove
! . .
! radar (- ..........
! xmove
!
!
!-----------------------------------------------------------------------
!
umove=0.0
vmove=0.0
xmove= xshift - umove*(curtim-assimtim(1))
ymove= yshift - vmove*(curtim-assimtim(1))
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
xs = 0.5*(x(i)+x(i+1)) - xmove
ys = 0.5*(y(j)+y(j+1)) - ymove
zs = 0.5*(z(k)+z(k+1)) - zshift
rad = SQRT(xs**2+ys**2+zs**2)
!
!
! tem1(i,j,k) = (tem7(i,j,k)*xs + tem9(i,j,k)*ys
! : + tem9(i,j,k)*zs)/rad
tem1(i,j,k) = (tem7(i,j,k)*xs + tem8(i,j,k)*ys &
+ tem9(i,j,k)*zs)/rad
END DO
END DO
END DO
!
DO k = 1,nz
DO j = 1,ny
DO i = 1,nx
tem11(i,j,k) = tem11(i,j,k) - ubar(i,j,k)
tem12(i,j,k) = tem12(i,j,k) - vbar(i,j,k)
tem13(i,j,k) = tem13(i,j,k)
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Set flags outside of rainwater area.
!
!-----------------------------------------------------------------------
!
DO k=1,nz
DO j=1,ny
DO i=1,nx
IF(qr(i,j,k,tim) < 0.0005) THEN
tem1(i,j,k) = spval
tem11(i,j,k) = spval
tem12(i,j,k) = spval
tem13(i,j,k) = spval
END IF
END DO
END DO
END DO
!
!clz for real data ingestion
!
ELSE IF(dtyp == 1) THEN
!cc
!cc
!ccNote: no overwritten for model variables.
!cc
!cc
lendtf=LEN(assimdat(is))
CALL strlnth
( assimdat(is), lendtf)
WRITE(6,'(/a,a)')'The filename', assimdat(is)(1:lendtf)
CALL radread
(assimdat(is),lendtf, &
isrc,assimtim(is),ireturn, &
nx,ny,nz,dx,dy,dz, &
xor,yor,zor, &
tem1,tem5,tem6,tem7,tem8, &
tem9,tem10,tem11,tem12,tem13)
IF(ireturn /= 0) RETURN
!
!-----------------------------------------------------------------------
!
! Compute the rainwater from the radar reflectivity factor. See
! Kessler (1969). Reflectivity is assumed to be in dBz, i.e.,
! Z (mm**6/m**3), and dBz = 10log10(Z).
!
! Note: When reflectivity is too small or too large, qr might be
! reliable from the qr-Z relation, a upper limit and lower
! limit are set up here.
!
!
! Set qr max at 50 dbz for AMS99 testing (SSW 12-7-98)
!
!
!-----------------------------------------------------------------------
!
imoist=1
IF(imoist == 0) GO TO 911
WRITE(6,*) 'This run is with qr and qv'
coef = LOG(10.)/10.
frsvnth = 4./7.
DO k = 1,nz-1
DO j = 1,ny-1
DO i = 1,nx-1
IF (tem8(i,j,k) > 50.0.AND.tem8(i,j,k) /= spval) THEN
! IF (tem8(i,j,k).gt.75.0.and.tem8(i,j,k).ne.spval) THEN
! IF (tem8(i,j,k).gt.75.0.and.tem8(i,j,k).ne.spval) THEN
! tem8(i,j,k) = 75.0
tem8(i,j,k) = 50.0
END IF
! IF (tem8(i,j,k).ne.spval.and.tem8(i,j,k).gt.20.0) THEN
! IF (tem8(i,j,k).ne.spval.and.tem8(i,j,k).gt.0.0) THEN
! IF (tem8(i,j,k).ne.spval.and.tem8(i,j,k).gt.5.0) THEN
IF (tem8(i,j,k) /= spval) THEN
qr(i,j,k,tim) = (.001/rhobar(i,j,k))* &
( (1./17300.)*EXP(coef*tem8(i,j,k)) )**frsvnth
ELSE
qr(i,j,k,tim) = 0.0
END IF
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! For real data, dtyp=1, assume qv=qvs in rainwater regions with
! updraft. In downdraft area, model background mean is used.
!
! Calculate the saturation water vapor specific humidity,
! qvs, from pressure and potential temperature using Teten's formula.
!
!
! Comment out Limin's old qvsat for AMS99 testing (SSW 12-7-98)
!
!
!-----------------------------------------------------------------------
!
! CALL satmrpt(nx,ny,nz,pbar,ptbar,tem9) ! calculate qvs
! DO 195 k=1,nz-1
! DO 195 j=1,ny-1
! DO 195 i=1,nx-1
! pres = pbar(i,j,k)+pprt(i,j,k,tim)
! temp = (ptbar(i,j,k)+ptprt(i,j,k,tim))*((pres/p0)**rddcp)
!ccxxx IF(temp.ge.273.16) THEN
! qvsat=(380. / pres) * !Teten's formula
! : exp( 17.27 * (temp-273.15)/(temp-35.86) )
!ccxxx ELSE
!ccxxx qvsat=(380. / pres) *
!ccxxx : exp( 21.875* (temp-273.15)/(temp-7.5) )
!ccxxx ENDIF
!ccxxx
! IF(tem8(i,j,k).gt.20.0.and.tem8(i,j,k).ne.spval
! : .and.w(i,j,k,tim).ge.0.0) THEN
! qv(i,j,k,tim) = qvsat
! ELSE IF(tem8(i,j,k).gt.20.0.and.tem8(i,j,k).
! : ne.spval.and.w(i,j,k,tim).lt.0.0) THEN
! qv(i,j,k,tim) = 0.8*qvsat
! ENDIF
!195 CONTINUE
911 CONTINUE
END IF
is = is + 1
!
!-----------------------------------------------------------------------
!
! Read in the winds, which may (or may not) be variationally adjusted,
! at three time steps, i.e.
!
! t1 t2 t3
! ---|----------|----------|---
!
! The time interval between these files corresponds to the frequency
! of the radar data. The time between each radar observation does not
! have to be the same (see RETRINT.F).
! NOTE:
! The adjusted winds are dumped via the dump3d routine (see ASSIMVEL.F).
! Hence, for the recovery option (recovopt=1), the adjusted winds and
! associated model data at that time step are always written off in
!
! a model format as specified by the user in ARPSINIT.INPUT
!
!-----------------------------------------------------------------------
!
ELSE IF(isrc == 4) THEN ! Called by RETPTPR
tim = 1
lengbf=LEN(inigbf)
CALL strlnth
( inigbf, lengbf)
WRITE(6,'(/a,a)') &
'The grid/base state file name is ',inigbf(1:lengbf)
!
!
!ccxxx
!ccxxx You have to hardwire the filenames if you choose to do
!ccxxx thermodynamic retrieval only
!ccxxx
!ccxxx adjdat(1) = 'assim4.bin000032'
!ccxxx adjdat(2) = 'assim4.bin000384'
!ccxxx adjdat(3) = 'assim4.bin000736'
!
! adjdat(1) = 'ADA_15.bin000000.9408171830'
! adjdat(2) = 'ADA_15.bin000000.9408171836'
! adjdat(3) = 'ADA_15.bin000000.9408171841'
!
! adjdat(1) = 'WANG15.bin000000.940817183548'
! adjdat(2) = 'WANG15.bin000000.940817183600'
! adjdat(3) = 'WANG15.bin000000.940817183612'
!
! adjdat(1) = 'KI1881.bin000000'
! adjdat(2) = 'KI1881.bin000351'
! adjdat(3) = 'KI1881.bin000702'
DO n = itag-3,itag-1
WRITE(6,*)'itag,n',itag,n
! IF (varopt.eq.0.and.insrtopt.eq.0) THEN
! lendtf=len(assimdat(n))
! CALL strlnth( assimdat(n), lendtf)
! filein = assimdat(n)(1:lendtf)
! write(6,'(/a,a)')
! : 'The input file name is ',filein
! ELSE
lendtf=LEN(adjdat(n))
CALL strlnth
( adjdat(n), lendtf)
filein = adjdat(n)(1:lendtf)
WRITE(6,'(/a,a)') &
'The input file name is ',filein
! ENDIF
saverunm = runname
!
!-----------------------------------------------------------------------
!
! Set the tem8 array to zero. This is done to avoid overwriting
! wbar on calls to dtaread.
!
!-----------------------------------------------------------------------
!
DO k=1,nz
DO j=1,ny
DO i=1,nx
tem8(i,j,k) = 0.0
tem7(i,j,k) = 0.0
tem6(i,j,k) = 0.0
END DO
END DO
END DO
storstop = tstop ! Temporary. For ingestion of model data
! generated prior to 4.0
CALL ctim2abss
( year, month, day, hour, minute, second, itimesv )
CALL dtaread
(nx,ny,nz,nstyps, &
hdmpfmt,nchanl,inigbf,lengbf,filein, &
lendtf,assimtim(n),x,y,z,zp,tem11,tem12,tem13, &
ptprt(1,1,1,tim),pprt(1,1,1,tim),tem7, &
qc(1,1,1,tim),tem6,qi(1,1,1,tim), &
qs(1,1,1,tim),qh(1,1,1,tim),tem1,tem1,tem1, &
ubar,vbar,tem8,ptbar,pbar,rhobar,qvbar, &
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), &
ireturn,tem5,tem9,tem10)
CALL abss2ctim
( itimesv, year, month, day, hour, minute, second )
!
!
! if( n.eq.1 ) assimtim(n) = 0.0 ! 18:30z
! if( n.eq.2 ) assimtim(n) = 360.0 ! 18:36z
! if( n.eq.3 ) assimtim(n) = 660.0 ! 18:41z
!
! if( n.eq.1 ) assimtim(n) = 0.0 ! 18:35:48z
! if( n.eq.2 ) assimtim(n) = 12.0 ! 18:36:00z
! if( n.eq.3 ) assimtim(n) = 24.0 ! 18:36:12z
!
! if( n.eq.1 ) assimtim(n) = 0.0 ! 18:35:36z for SDVR data
! if( n.eq.2 ) assimtim(n) = 351.0 ! 18:41:26z
! if( n.eq.3 ) assimtim(n) = 702.0 ! 18:47:17z
!
tstop = storstop
runname = saverunm
IF( ireturn /= 0) RETURN
!
!-----------------------------------------------------------------------
!
! The arrays tem11,tem12 and tem13 contain uprt, vprt, and wprt
! respectively. The recovery requires the total velocities,i.e.,
! u = uprt + ubar.
!
! Reconstruct qv from qvprt which is returned from the call to
! DTAREAD in the tem7 array.
!
! Construct rhostr from rhobar and j3.
!
!-----------------------------------------------------------------------
!
DO i = 1,nx
DO j = 1,ny-1
DO k = 1,nz-1
u(i,j,k,tim) = tem11(i,j,k) + ubar(i,j,k)
END DO
END DO
END DO
DO i = 1,nx-1
DO j = 1,ny
DO k = 1,nz-1
v(i,j,k,tim) = tem12(i,j,k) + vbar(i,j,k)
END DO
END DO
END DO
DO i = 1,nx-1
DO j = 1,ny-1
DO k = 1,nz
w(i,j,k,tim) = tem13(i,j,k)
END DO
END DO
END DO
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
qv(i,j,k,tim) = tem7(i,j,k) + qvbar(i,j,k)
qr(i,j,k,tim) = tem6(i,j,k)
END DO
END DO
END DO
tim = tim + 1
END DO
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
rhostr(i,j,k) = rhobar(i,j,k)*j3(i,j,k)
END DO
END DO
END DO
END IF
RETURN
END SUBROUTINE assimrd
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE PALCL ######
!###### ######
!###### Steven Lazarus ######
!###### University of Oklahoma ######
!###### School of Meteorology ######
!##################################################################
!##################################################################
SUBROUTINE palcl(nx,ny,nz,in,jn,p,pienv,tinit,qinit,klcl,plcl)
!
!-----------------------------------------------------------------------
!
! Purpose:
!
! Subroutine calculates the lifting condensation level
!
!-----------------------------------------------------------------------
!
! Author: Steve Lazarus
! 6/10/93
!
! Modification History:
!
!-----------------------------------------------------------------------
!
! Input :
!
! nx,ny,nz Model grid dimensions
! in,jn A given point in the horizontally homogenous domain
! p Sounding pressure (Pa)
! pienv Sounding pressure (non-dimensional)
! tinit Sounding temperature (K)
! qinit Sounding mixing ratio (kg/kg)
!
! Cp Specific heat for dry air (kg/(m s**2))
! Rd Gas constant for dry air (kg/(m s**2))
! p0 Surface pressure (Pa)
!
! Output:
!
! klcl Index just above LCL
! plcl Pressure at LCL (Pa)
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
REAL :: pie, qvs
REAL :: qtest
REAL :: plcl
REAL :: plcl1
REAL :: pilcl
REAL :: pilcl1
REAL :: pavg
REAL :: piavg
INTEGER :: in,jn
INTEGER :: nx,ny,nz
REAL :: p(nx,ny,nz),pienv(nx,ny,nz),tinit(nx,ny,nz),qinit(nx,ny,nz)
INTEGER :: k,klcl
INTEGER :: iter
!
!-----------------------------------------------------------------------
!
! Include files
!
!-----------------------------------------------------------------------
!
INCLUDE 'phycst.inc'
!
!-----------------------------------------------------------------------
!
! Calculate non-dimensional pressure, pienv.
!
!-----------------------------------------------------------------------
!
PRINT *,'Entering subroutine palcl'
DO k=1,nz
pienv(in,jn,k) = pie( END DO
k=1
qtest = 999.
10 CONTINUE
IF(qtest > qinit(in,jn,2)) THEN
k= k + 1
qtest = qvs( p(in,jn,k),pienv(in,jn,k),tinit(in,jn,2))
GO TO 10
END IF
klcl = k
IF(klcl == 1) klcl=2
!
!-----------------------------------------------------------------------
!
! Interpolate to determine the 'exact' pressure of the LCL
!
!-----------------------------------------------------------------------
!
plcl = p(in,jn,klcl)
plcl1 = p(in,jn,klcl-1)
pilcl = pienv(in,jn,klcl)
pilcl1 = pienv(in,jn,klcl-1)
qtest = 999.
iter = 0
20 CONTINUE
IF( ABS(qtest - qinit(in,jn,2)) > .00001) THEN
iter = iter + 1
pavg = (plcl + plcl1 )*.5
piavg = (pilcl + pilcl1)*.5
qtest = qvs(pavg,piavg,tinit(in,jn,2))
IF(qtest > qinit(in,jn,1)) THEN
plcl1 = pavg
pilcl1 = piavg
ELSE
plcl = pavg
pilcl = piavg
END IF
GO TO 20
END IF
plcl = pavg
pilcl= piavg
RETURN
END SUBROUTINE palcl
!
!##################################################################
!##################################################################
!###### ######
!###### FUNCTION PIE ######
!###### ######
!###### Steven Lazarus ######
!###### University of Oklahoma ######
!###### School of Meteorology ######
!##################################################################
!##################################################################
FUNCTION pie(pdim,p0,rd,cp)
!
!-----------------------------------------------------------------------
!
! Purpose:
!
! Calculate the non-dimensional pressure given the dimensional
! pressure.
!
!-----------------------------------------------------------------------
!
! Author: Steve Lazarus
! 6/10/93
!
! Modification History:
!
!-----------------------------------------------------------------------
!
! Input :
!
! pdim Sounding pressure (Pa)
! p0 Surface pressure (Pa)
! Rd Gas constant for dry air (kg/(m s**2))
! Cp Specific heat for dry air (kg/(m s**2))
!
! Output:
!
! pie Non-dimensional pressure
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable declarations.
!
!-----------------------------------------------------------------------
!
REAL :: pdim,rd,cp,p0
!
!
pie = (pdim/p0)**(rd/cp)
!
! end of function pie
END FUNCTION pie
!
!##################################################################
!##################################################################
!###### ######
!###### FUNCTION QVS ######
!###### ######
!###### Steven Lazarus ######
!###### University of Oklahoma ######
!###### School of Meteorology ######
!##################################################################
!##################################################################
FUNCTION qvs(pdim,pnon,t)
!
!-----------------------------------------------------------------------
!
! Purpose:
!
! Calculate the saturation vapor pressure
!
!-----------------------------------------------------------------------
!
! Author: Steve Lazarus
! 6/10/93
!
! Modification History:
!
!-----------------------------------------------------------------------
!
! Input :
!
! pdim Sounding pressure (Pa)
! pnon Sounding pressure (nondimensional)
! t Sounding Potential temperature at level k (K)
!
! Output:
!
! qvs Saturation vapor pressure
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable declarations.
!
!-----------------------------------------------------------------------
!
REAL :: pdim,pnon,t
!
a = 7.5*LOG(10.)
b = 3.8/pdim
!
es = 610.78*EXP(a*(pnon*t - 273.16)/(pnon*t - 35.86))
qvs = 0.622*es/(pdim-es)
!
! end of function qvs
END FUNCTION qvs