!
!################################################################
!################################################################
!##### #####
!##### SUBROUTINE ASSIMFIL #####
!##### #####
!##### Copyright (c) 1993 #####
!##### Center for Analysis and Prediction of Storms #####
!##### University of Oklahoma #####
!##### #####
!################################################################
!################################################################
!
SUBROUTINE assimfil(nx,ny,nz,x,y,z,zp,ptol, & 1,2
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)
!
!---------------------------------------------------------------------
!
! PURPOSE:
!
!---------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! AUTHOR: Steve Lazarus and Alan Shapiro
! 9/29/93
!
! MODIFICATION HISTORY:
!
! 01/16/96 (Limin Zhao)
! Strip the hole-fill code from former 'assimvel.f' and modified
! it into a independent subroutine.
!
! 03/08/96 (Limin Zhao)
! Added checks for processing real data.
!
! 03/20/96 (Limin Zhao and Alan Shapiro)
! Modified the code to use background information as bounday
! condition.
!
!-----------------------------------------------------------------------
!
! 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)
!
! 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)
!
! 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
!
! tem7 Observed velocity u-component (m/s)
! tem8 Observed velocity v-component (m/s)
! tem9 Observed velocity w-component (m/s)
!
!---------------------------------------------------------------------
!
! OUTPUT:
!
! u hole-filled x component of velocity (m/s)
! v hole-filled y component of velocity (m/s)
! w hole-filled Vertical component of velocity
! in Cartesian coordinates (m/s)
!
!---------------------------------------------------------------------
!
! WORK ARRAYS:
!
! tem2 Temporary work array.
! tem3 Temporary work array.
! tem4 Temporary work array.
! tem5 Temporary work array.
! tem6 Temporary work array.
! tem8 Temporary work array.
! tem9 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
INCLUDE 'grid.inc'
!
!-----------------------------------------------------------------------
!
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.
PARAMETER (nt=3, tpast=1, tpresent=2, tfuture=3)
INTEGER :: nx, ny, nz ! Number of grid points in x, y and z directions
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 :: 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 :: 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)
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: icount ! Parameter input flag
SAVE icount
DATA icount /1/
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
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 :: 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 :: ptol ! Error tolerance for hole-filling
REAL :: rad ! Radius of sphere in Cartesian coord
REAL :: radh ! Radius of circle in hz. plane
REAL :: radinv ! Inverse radius magnitude
REAL :: umean,vmean,usum
!
!-----------------------------------------------------------------------
!
! Routines called:
!
! external pois3d
!
!-----------------------------------------------------------------------
!
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code ...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
! Hole-fill u,v,w, and vr outside the rainwater field. Hole-filling
! is performed on the perturbation velocity fields only. tem4 serves
! as a 'template' - delineating the region to be filled. The
! Dirichlet boundary conditions are set here, outside of POIS3D.
!
!-----------------------------------------------------------------------
!
WRITE(6,*) 'code in assimfil; spval=',spval
WRITE(6,*) 'adas mean wind',ubar(5,5,5),vbar(5,5,5)
umove=0.0
vmove=0.0
xmove= xshift - umove*(curtim-assimtim(1))
ymove= yshift - vmove*(curtim-assimtim(1))
WRITE(6,*) 'dx,dy,dz: ',dx,dy,dz
WRITE(6,*) 'xshift,yshift: ',xshift,yshift
tim = tpresent
! DO 128 k=1,nz
! DO 128 j=1,ny
! DO 128 i=1,nx
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,k) = 0.5*(u(i,j,k,tim)+u(i+1,j,k,tim))
tem2(i,j,k) = 0.5*(v(i,j,k,tim)+v(i,j+1,k,tim))
IF(tem7(i,j,k) /= spval) THEN
tem10(i,j,k) = tem7(i,j,k) - tem1(i,j,k)
ELSE
tem10(i,j,k) = tem7(i,j,k)
END IF
IF(tem8(i,j,k) /= spval) THEN
tem11(i,j,k) = tem8(i,j,k) - tem2(i,j,k)
ELSE
tem11(i,j,k) = tem8(i,j,k)
END IF
tem12(i,j,k) = tem9(i,j,k)
END DO
END DO
END DO
count = 0
DO k=1,nz-1
DO j=1,ny-1
! DO 140 i=1,nx
DO i=1,nx-1 ! at scalar points
tem3(i,j,k) = 0.0
tem6(i,j,k) = 0.0
tem7(i,j,k) = 0.0
IF(tem10(i,j,k) /= spval) THEN ! u component
tem5(i,j,k) = tem10(i,j,k)
tem4(i,j,k) = 0.0
! ELSE IF(i.le.2.or.i.ge.nx-1.or.j.eq.1.or.j.eq.ny-1) THEN
ELSE IF(i == 1.OR.i == nx-1.OR.j == 1.OR.j == ny-1) THEN
tem5(i,j,k) = 0.0 !Dirichlet for lateral, gradient for vertical
tem4(i,j,k) = 0.0
ELSE ! Fill u outside rain regions
tem5(i,j,k) = 0.0
tem4(i,j,k) = spval
count = count + 1
END IF
END DO
END DO
END DO
PRINT *,'On call to POIS3D, there are ',count,' filled U values'
CALL pois3d
(nx,ny,nz,dx,dy,dz,ptol,2.0,tem3,tem4,tem5,tem6,tem7)
! CALL POIS3D(nx,ny,nz,dx,dy,dz,ptol,3.0,tem3,tem4,tem5,tem6,tem7)
DO k=1,nz-1
DO j=1,ny-1
! DO 141 i=1,nx
DO i=1,nx-1
tem10(i,j,k) = tem5(i,j,k) + tem1(i,j,k)
END DO
END DO
END DO
count = 0
DO k=1,nz-1
! DO 142 j=1,ny
DO j=1,ny-1
DO i=1,nx-1
tem3(i,j,k) = 0.0
tem6(i,j,k) = 0.0
tem7(i,j,k) = 0.0
IF(tem11(i,j,k) /= spval) THEN ! v component
tem5(i,j,k) = tem11(i,j,k)
tem4(i,j,k) = 0.0
! ELSE IF(i.eq.1.or.i.eq.nx-1.or.j.le.2.or.j.ge.ny-1) THEN
ELSE IF(i == 1.OR.i == nx-1.OR.j == 1.OR.j == ny-1) THEN
tem5(i,j,k) = 0.0 !Dirichlet for lateral, gradient for vertical
tem4(i,j,k) = 0.0
ELSE ! Fill v outside rain regions
tem5(i,j,k) = 0.0
tem4(i,j,k) = spval
count = count + 1
END IF
END DO
END DO
END DO
PRINT *,'On call to POIS3D, there are ',count,' filled V values'
CALL pois3d
(nx,ny,nz,dx,dy,dz,ptol,2.0,tem3,tem4,tem5,tem6,tem7)
! CALL POIS3D(nx,ny,nz,dx,dy,dz,ptol,3.0,tem3,tem4,tem5,tem6,tem7)
DO k=1,nz-1
! DO 143 j=1,ny
DO j=1,ny-1
DO i=1,nx-1
tem11(i,j,k) = tem5(i,j,k) + tem2(i,j,k)
END DO
END DO
END DO
count = 0
! DO 144 k=1,nz
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem3(i,j,k) = 0.0
tem6(i,j,k) = 0.0
tem7(i,j,k) = 0.0
IF(tem12(i,j,k) /= spval) THEN ! w component
tem5(i,j,k) = tem12(i,j,k)
tem4(i,j,k) = 0.0
!ccxxx ELSE IF(k.le.2.or.k.ge.nz-1) THEN
!ccxxx tem5(i,j,k) = 0.0
!ccxxx tem4(i,j,k) = 0.0
! ELSE IF(k.le.2.or.k.ge.nz-1) THEN
! tem5(i,j,k) = 0.0
! tem4(i,j,k) = 0.0
ELSE ! Fill w outside rain regions
tem5(i,j,k) = 0.0
tem4(i,j,k) = spval
count = count + 1
END IF
END DO
END DO
END DO
PRINT *,'On call to POIS3D, there are ',count,' filled W values'
! CALL POIS3D(nx,ny,nz,dx,dy,dz,ptol,2.0,tem3,tem4,tem5,tem6,tem7)
! CALL POIS3D(nx,ny,nz,dx,dy,dz,ptol,3.0,tem3,tem4,tem5,tem6,tem7)
! DO 145 k=1,nz
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem12(i,j,k) = tem5(i,j,k)
END DO
END DO
END DO
DO k=1,nz
DO j=1,ny
DO i=1,nx
tem7(i,j,k) = tem10(i,j,k)
tem8(i,j,k) = tem11(i,j,k)
tem9(i,j,k) = tem12(i,j,k)
END DO
END DO
END DO
RETURN
END SUBROUTINE assimfil