!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE ASSIMOUT ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE assimout(nx,ny,nz,retfname, & 1,4
x,y,z,zp, &
u,v, &
ptprt,pprt,qvprt,qr, &
ubar,vbar,ptbar,pbar,qvbar, &
tem1,tem2,tem3,tem4,tem5)
!
!--------------------------------------------------------------------------
!
! PURPOSE:
!
! This subroutine outputs the adjusted wind, thermo and moisture
! fields to ARPS data analysis system (ADAS) as "pseudo-soundings".
!
!---------------------------------------------------------------------------
!
! AUTHOR: Limin Zhao
! 5/06/96.
!
! MODIFICATION HISTORY:
!
! 06/10/96 (Keith Brewster and Limin Zhao)
! Found a bug in calculating the location of "pseudo-soundings".
!
!-----------------------------------------------------------------------
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE ! Force explicit declarations
!
!-----------------------------------------------------------------------
!
! Arrays to be read in:
!
!-----------------------------------------------------------------------
!
INTEGER :: nx,ny,nz
REAL :: x(nx)
REAL :: y(ny)
REAL :: z(nz)
REAL :: zp(nx,ny,nz)
REAL :: u(nx,ny,nz)
REAL :: v(nx,ny,nz)
REAL :: ptprt(nx,ny,nz)
REAL :: pprt(nx,ny,nz)
REAL :: qvprt(nx,ny,nz)
REAL :: qr(nx,ny,nz)
REAL :: ubar(nx,ny,nz)
REAL :: vbar(nx,ny,nz)
REAL :: ptbar(nx,ny,nz)
REAL :: pbar(nx,ny,nz)
REAL :: qvbar(nx,ny,nz)
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)
!
!-----------------------------------------------------------------------
!
INTEGER :: ncl
PARAMETER (ncl=500)
! NOTE: ncl must be greater than or equal to nx,ny, & nz
!
!-----------------------------------------------------------------------
!
REAL :: tem1d1(ncl),tem1d2(ncl),tem1d3(ncl),tem1d4(ncl)
REAL :: tem1d5(ncl),tem1d6(ncl),tem1d7(ncl),tem1d8(ncl)
REAL :: tem1d9(ncl)
!
REAL :: xsc(ncl),ysc(ncl)
!
!-----------------------------------------------------------------------
!
! "Fake" radar id stuff
!
!-----------------------------------------------------------------------
!
INTEGER :: iretfmt
CHARACTER (LEN=128) :: retfname
PARAMETER(iretfmt=1)
! character*4 radid
! real latrad,lonrad,elvrad
!
!
! parameter(radid='KTLX', !need change for different radar
! : latrad= 35.3331,
! : lonrad=-97.2778,
!cc : elvrad=389.4)
! : elvrad=384.0)
!
! parameter(radid='KDDC',
! : latrad= 37.7597,
! : lonrad=-99.9678,
! : elvrad=814.0)
!
! parameter(radid='KICT',
! : latrad= 37.654444,
! : lonrad=-97.442778,
! : elvrad=427.0)
!
!
!-----------------------------------------------------------------------
!
! Misc internal variables.
!
!-----------------------------------------------------------------------
!
REAL :: latnot(2)
INTEGER :: i,j,k,ireturn
CHARACTER (LEN=128) :: filename
CHARACTER (LEN=128) :: grdbasfn
INTEGER :: ngchan,nchan1,lenfil,lengbf
INTEGER :: nchin,iyr
REAL :: xctr,yctr,x0,y0
REAL :: flag
REAL :: temv,rhobar,refdbz,svnfrth,arg
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'phycst.inc'
INCLUDE 'assim.inc'
INCLUDE 'grid.inc'
!
!-----------------------------------------------------------------------
!
! Routines called:
!
!-----------------------------------------------------------------------
!
EXTERNAL wtretcol
!
!
!=======================================================================
!
! Special mods for AMS99 TD retr from SDVR
!
! open(unit=59,file='radloc.input',form='formatted',status='old')
! read (59,83) radid
! read (59,*) latrad
! read (59,*) lonrad
! read (59,*) elvrad
! close(unit=59)
!83 format(a4)
!
!=======================================================================
!
!
!-----------------------------------------------------------------------
!
! Check the dimension for local 1-D arrays. It must be
! defined larger than the model's dimension.
!
!-----------------------------------------------------------------------
!
spval = 999.0
WRITE (*,*) "XXX IASSIM nx,ny,nz,ncl",nx,ny,nz,ncl
IF(ncl < nx .OR. ncl < ny .OR. ncl < nz) THEN
WRITE(6,'(3(/1x,a))') &
'Dimension of ncl in ASSIMOUT is less than ARPS model,', &
'please redefine it. it should be larger than OR', &
'equal TO arps model dimensions.'
WRITE(6,'(1x,a)') &
'ncl,nx,ny,nz:', ncl,nx,ny,nz
WRITE(6,'(1x,a)') &
'Program aborted in ASSIMOUT'
STOP
END IF
!
!-----------------------------------------------------------------------
!
! Put the (u,v) at the scalar points.
!
!-----------------------------------------------------------------------
!
DO i=1,nx-1
xsc(i) = 0.5*(x(i)+x(i+1))
END DO
xsc(nx)=2.0*xsc(nx-1)-xsc(nx-2)
DO j=1,ny-1
ysc(j) = 0.5*(y(j)+y(j+1))
END DO
ysc(ny) = 2.0*ysc(ny-1)-ysc(ny-2)
DO i=1,nx
x(i) = xsc(i)
END DO
DO j=1,ny
y(j) = ysc(j)
END DO
svnfrth = 7./4.
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem4(i,j,k) = 0.5*(zp(i,j,k) + zp(i,j,k+1))
tem1(i,j,k)=0.5*(u( i,j,k)+u( i+1,j,k))
tem2(i,j,k)=0.5*(v(i, j,k)+v(i, j+1,k))
!
!
temv = ptbar(i,j,k) * (pbar(i,j,k)/p0)**rddcp
temv = temv * (rddrv+qvbar(i,j,k)) / &
( rddrv*(1.0+qvbar(i,j,k)) )
! Base state virtual temperature
rhobar = pbar(i,j,k) / (rd*temv)
arg = 17300.0*( 1000.0*rhobar &
* MAX(0.0,qr(i,j,k)) )**svnfrth !! needs a pcntg
refdbz = 10.0 * ALOG10( MAX(arg,1.0) )
!
!
flag=tem5(i,j,k)
IF ( flag == spval ) THEN
ptprt(i,j,k) = -999.0
pprt(i,j,k) = -999.0
qr(i,j,k) = -999.0
qvprt(i,j,k) = -999.0
ptbar(i,j,k) = -999.0
pbar(i,j,k) = -999.0
qvbar(i,j,k) = -999.0
tem1(i,j,k) = -999.0
tem2(i,j,k) = -999.0
tem3(i,j,k) = -999.0
ELSE
tem3(i,j,k) = 1.0
END IF
!
! test #1: no u & v output for re-analysis; i.e., the original ones are used.
! Others are output every other point.
!
! tem1(i,j,k) = -999.0 ! no output for these variables
! tem2(i,j,k) = -999.0
! qr(i,j,k) = -999.0
! qvprt(i,j,k) = -999.0
! qvbar(i,j,k) = -999.0
!
! if( refdbz .lt. 20.0 ) then
! ptprt(i,j,k) = -999.0
! pprt (i,j,k) = -999.0
! ptbar(i,j,k) = -999.0
! pbar (i,j,k) = -999.0
!
! tem3 (i,j,k) = -999.0
! else
! tem3 (i,j,k) = 1.0
! endif
!
! test #2: u & v output for re-analysis; output every other point.
!
!
! if( i.eq.(i/2)*2 .or. j.eq.(j/2)*2 ) then
! tem1(i,j,k) = -999.0
! tem2(i,j,k) = -999.0
! qr(i,j,k) = -999.0
! qvprt(i,j,k) = -999.0
! ptprt(i,j,k) = -999.0
! pprt(i,j,k) = -999.0
! ptbar(i,j,k) = -999.0
! pbar(i,j,k) = -999.0
! qvbar(i,j,k) = -999.0
!
! tem3(i,j,k) = -999.0
! else
! tem3(i,j,k) = 1.0
! endif
!
!
END DO
END DO
END DO
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
zp(i,j,k) = tem4(i,j,k)
END DO
END DO
END DO
latnot(1) = trulat1
latnot(2) = trulat2
CALL setmapr
(mapproj,1.0,latnot,trulon)
CALL lltoxy
(1,1,ctrlat,ctrlon,xctr,yctr)
x0=xctr-(((nx-3)/2)*(x(2)-x(1)))
y0=yctr-(((ny-3)/2)*(y(2)-y(1)))
CALL setorig
(1,x0,y0)
iyr=MOD(year,100)
WRITE(retfname,'(a,a,i4,2i2.2,a,2i2.2)') &
radid,'ret.',year,month,day,'.',hour,minute
PRINT *, ' Writing data into ',retfname
CALL wtretcol
(nx,ny,nz, &
2,nx-2,2,ny-2,2,nz-2, &
iyr,month,day,hour,minute,second, &
iretfmt,retfname,radid,latrad,lonrad,elvrad, &
x,y,zp, &
tem1,tem2,ptprt,pprt,qvprt,qr, &
ptbar,pbar,qvbar,tem3, &
tem1d1,tem1d2,tem1d3,tem1d4, &
tem1d5,tem1d6,tem1d7,tem1d8,tem1d9)
RETURN
END SUBROUTINE assimout
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE WTRETCOL ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### university of Oklahoma. All rights reserved. ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE wtretcol(nx,ny,nz, & 2,9
ibeg,iend,jbeg,jend,kbeg,kend, &
iyr,imon,iday,ihr,imin,isec, &
iretfmt,retfname,radid,latrad,lonrad,elvrad, &
xsc,ysc,zpsc, &
us,vs,ptprt,pprt,qvprt,qr, &
ptbar,pbar,qvbar,retrflg, &
outk,outhgt,outu,outv, &
outpr,outpt,outqv,outqr,outret)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Test writing of retrieval columns.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Keith Brewster
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! Writes gridded radar data to a file
!
! INPUT
!
! 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 (km)
! zp z coordinate of grid points in computational space (m)
!
! uprt x component of perturbation velocity (m/s)
! vprt y component of perturbation velocity (m/s)
! wprt Vertical component of perturbation velocity in Cartesian
! coordinates (m/s).
!
! ptprt Perturbation potential temperature (K)
! pprt Perturbation pressure (Pascal)
!
! qvprt Perturbation water vapor mixing ratio (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)
! wbar Base state z velocity component (m/s)
! ptbar Base state potential temperature (K)
! pbar Base state pressure (Pascal)
! rhobar Base state air density (kg/m**3)
! qvbar Base state water vapor mixing ratio (kg/kg)
! qr Rainwater mixing ratio (kg/kg)
!
!-----------------------------------------------------------------------
!
!
IMPLICIT NONE
!
INTEGER :: nx,ny,nz
INTEGER :: ibeg,iend,jbeg,jend,kbeg,kend
!
REAL :: xsc(nx)
REAL :: ysc(ny)
REAL :: zpsc(nx,ny,nz)
REAL :: us(nx,ny,nz) ! total u velocity component at scalar points
REAL :: vs(nx,ny,nz) ! total v velocity component at scalar points
REAL :: ptprt (nx,ny,nz) ! Perturbation potential temperature (K)
REAL :: pprt (nx,ny,nz) ! Perturbation pressure (Pascal)
REAL :: qvprt (nx,ny,nz) ! Perturbation water vapor specific
! humidity (kg/kg)
REAL :: qr (nx,ny,nz) ! Rain water mixing ratio (kg/kg)
REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K)
REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal)
REAL :: qvbar (nx,ny,nz) ! Base state water vapor specific humidity
! (kg/kg)
REAL :: retrflg(nx,ny,nz)
!
INTEGER :: iretfmt
CHARACTER (LEN=128) :: retfname
CHARACTER (LEN=4) :: radid
REAL :: latrad
REAL :: lonrad
REAL :: elvrad
INTEGER :: iyr,imon,iday,ihr,imin,isec
!
!-----------------------------------------------------------------------
!
! Retrieval output variables
!
!-----------------------------------------------------------------------
!
REAL :: outk(nz)
REAL :: outhgt(nz)
REAL :: outu(nz)
REAL :: outv(nz)
REAL :: outpr(nz)
REAL :: outpt(nz)
REAL :: outqv(nz)
REAL :: outqr(nz)
REAL :: outret(nz)
!
!-----------------------------------------------------------------------
!
! Retrieved data threshold
!
!-----------------------------------------------------------------------
!
REAL :: retrthr
PARAMETER(retrthr=0.0)
!
!-----------------------------------------------------------------------
!
! Include file
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc'
!
!-----------------------------------------------------------------------
!
! Misc. local variables
!
!-----------------------------------------------------------------------
!
INTEGER :: iunit,myr,itime
INTEGER :: i,j,k,klev,kk,kntcol
INTEGER :: ireftim,idummy
INTEGER :: ierr
REAL :: gridlat,gridlon,elev,rdummy
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
WRITE(6,*) '===> into WTRETCOL'
ireftim = 0
myr=1900+iyr
IF(myr < 1960) myr=myr+100
CALL ctim2abss
(myr,imon,iday,ihr,imin,isec,itime)
CALL asnctl
('NEWLOCAL', 1, ierr)
CALL asnfile
(retfname, '-F f77 -N ieee', ierr)
CALL getunit
(iunit)
!
! Open file for output
!
OPEN(iunit,FILE=retfname,STATUS='unknown', &
FORM='unformatted')
!
! Write retrieval description variables
!
idummy = 0
WRITE(iunit) radid
WRITE(iunit) ireftim,itime,idummy,idummy,idummy, &
idummy,idummy,idummy,idummy,idummy
!
! Write grid description variables
! This should provide enough info to verify that the
! proper grid has been chosen. To recreate the grid,
! icluding elevation information,
! the reading program should get a grid-base-file
! named runname.grdbasfil
!
idummy=0
rdummy=0.
WRITE(iunit) runname
WRITE(iunit) hdmpfmt,strhopt,mapproj,nx,ny, &
nz,idummy,idummy,idummy,idummy
WRITE(iunit) dx,dy,dz,dzmin,ctrlat, &
ctrlon,trulat1,trulat2,trulon,sclfct, &
latrad,lonrad,elvrad,rdummy,rdummy
!cc
!cc
WRITE(6,*) runname
WRITE(6,*) hdmpfmt,strhopt,mapproj,idummy,idummy, &
idummy,idummy,idummy,idummy,idummy
WRITE(6,*) dx,dy,dz,dzmin,ctrlat, &
ctrlon,trulat1,trulat2,trulon,sclfct, &
latrad,lonrad,elvrad,rdummy,rdummy
!
! For each horizontal grid point form a column of remapped
! data containing the non-missing grid points
!
kntcol=0
DO j=jbeg,jend
DO i=ibeg,iend
klev=0
DO k=kbeg,kend
IF(retrflg(i,j,k) > retrthr) THEN
klev=klev+1
outk(klev)=FLOAT(k)
outhgt(klev)=zpsc(i,j,k)
outu(klev)=us(i,j,k)
outv(klev)=vs(i,j,k)
outpr(klev)=pprt(i,j,k)+pbar(i,j,k)
outpt(klev)=ptprt(i,j,k)+ptbar(i,j,k)
outqv(klev)=qvprt(i,j,k)+qvbar(i,j,k)
outqr(klev)=qr(i,j,k)
outret(klev)=retrflg(i,j,k)
!------------------------------------------------------
! print some diagnostics
!
WRITE(6,*) i,j,k,outu(klev),outpt(klev),outqr(klev),outqv(klev), &
outret(klev)
!
!------------------------------------------------------
END IF
END DO
!
! If there are data in this column, write them to the file.
!
IF(klev > 0) THEN
kntcol=kntcol+1
CALL xytoll
(1,1,xsc(i),ysc(j),gridlat,gridlon)
elev=0.5*(zpsc(i,j,1)+zpsc(i,j,2))
WRITE(iunit) i,j,xsc(i),ysc(j), &
gridlat,gridlon,elev,klev
WRITE(iunit) (outk(kk),kk=1,klev)
WRITE(iunit) (outhgt(kk),kk=1,klev)
WRITE(iunit) (outu(kk),kk=1,klev)
WRITE(iunit) (outv(kk),kk=1,klev)
WRITE(iunit) (outpr(kk),kk=1,klev)
WRITE(iunit) (outpt(kk),kk=1,klev)
WRITE(iunit) (outqv(kk),kk=1,klev)
WRITE(iunit) (outqr(kk),kk=1,klev)
WRITE(iunit) (outret(kk),kk=1,klev)
! write(99,*) i,j,xsc(i),ysc(j),gridlat,gridlon,elev,klev
! write(93,*)kntcol,xsc(i),ysc(j),gridlat,gridlon
! write(93,*)(kk,outu(kk),outv(kk),outqv(kk),kk=1,klev)
END IF
IF(i == 92 .AND. j == 92) THEN
CALL xytoll
(1,1,xsc(i),ysc(j),gridlat,gridlon)
END IF
END DO
END DO
CLOSE(iunit)
CALL retunit(iunit)
!
! Report on what data were written
!
WRITE(6,'(//a,i2.2,i2.2,i2.2,a1,i2.2,a1,i2.2)') &
' Output statistics for time ', &
iyr,imon,iday,' ',ihr,':',imin
WRITE(6,'(a,i6,a,/a,i6,a//)') &
' There were ',kntcol,' columns written ', &
' of a total ',(nx*ny),' possible.'
RETURN
END SUBROUTINE wtretcol