SUBROUTINE cmpclddrv(nx,ny,nz,i4timanx, & 1,28
xs,ys,zs,j3,hterain,latgr,longr, &
nobsng,stnsng,csrcsng,xsng,ysng, &
timesng,latsng,lonsng,hgtsng, &
kloud,store_amt,store_hgt, &
stnrad,isrcrad,latrad,lonrad,elvrad,ixrad,jyrad, &
pprt,ptprt,qv,qc,qr,qi,qs,qh,w, &
pbar,ptbar,qvbar,rhostr, &
ref_mos_3d,w_cld,cldpcp_type_3d, &
icing_index_3d,l_mask_pcptype, &
p_3d,t_3d,rh_3d,qvprt_old,qw_old, &
qr_cld,qs_cld,qh_cld,tem1,tem2)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Driver for complex cloud analysis code.
! This subroutine serves as an interface between the ADAS
! code and the cloud code.
!
!-----------------------------------------------------------------------
!
! AUTHOR:
! Keith Brewster, CAPS
! Based on code originally installed directly into adas.f
! by Jian Zhang, CAPS
! February, 1998
!
! MODIFICATION HISTORY:
! 05/05/1998 Jian Zhang
! Abandoned the cloud grid, using the ARPS grid instead.
!
!wdt-caps sra
! 08/30/2000 D.H. Wang
! Added option for Ferrier formulation of cloud water.
!
!wdt update
! 11/02/2000 K. Brewster
! Modifications to allow tiny, insignificant differences in
! mapping parameters between radar and ADAS. Minor clean-up.
!
! 02/05/2001 Richard Carpenter, WDT
! Precipitate determined from radar enhances, rather than replaces, the
! background field.
!
!-----------------------------------------------------------------------
! July, 2001 (K. Brewster)
! Changed wrtvar calls to wrtvar1 to match new routine for writing
! 3-D arrays to be read by arpsplt as an arbitary array.
!
! Some clean-up of comments and lines that had been commented-out.
!
! Added new latent heating options, cldptopt = 4 and 5.
! cldptop = 4 replaces temperature with cloud parcel temperature
! (with entrainment) everywhere there is cloud.
! cldptopt =5 replaces adusts temperature to cloud parcel temperature
! beginning where w=-0.2 m/s ramping to full application of cloud parcel
! temperature where w>=0.
!
! 11/01/2001 (K. Brewster)
! Restructured the building of the reflectivity mosaic and moved
! it into new subroutine, refmosaic, replacing rad_patch_fill.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INCLUDE 'adas.inc'
INTEGER :: i4timanx ! analysis time in seconds from 00:00 UTC
! Jan. 1, 1960
!
!-----------------------------------------------------------------------
!
! Grid variables
!
!-----------------------------------------------------------------------
!
INTEGER :: nx,ny,nz
!
REAL :: xs(nx)
REAL :: ys(ny)
REAL :: zs(nx,ny,nz)
REAL :: j3(nx,ny,nz)
REAL :: hterain(nx,ny)
REAL :: latgr(nx,ny)
REAL :: longr(nx,ny)
REAL :: pprt(nx,ny,nz)
REAL :: ptprt(nx,ny,nz)
REAL :: w(nx,ny,nz)
REAL :: qv(nx,ny,nz)
REAL :: qc(nx,ny,nz)
REAL :: qr(nx,ny,nz)
REAL :: qi(nx,ny,nz)
REAL :: qs(nx,ny,nz)
REAL :: qh(nx,ny,nz)
REAL :: pbar(nx,ny,nz)
REAL :: ptbar(nx,ny,nz)
REAL :: qvbar(nx,ny,nz)
REAL :: rhostr(nx,ny,nz)
!
!-----------------------------------------------------------------------
!
! Single-level data
!
!-----------------------------------------------------------------------
!
INTEGER :: nobsng
REAL :: latsng(mx_sng),lonsng(mx_sng)
REAL :: hgtsng(mx_sng)
REAL :: xsng(mx_sng),ysng(mx_sng)
INTEGER :: timesng(mx_sng)
CHARACTER (LEN=5) :: stnsng(mx_sng)
CHARACTER (LEN=8) :: csrcsng(mx_sng)
CHARACTER (LEN=4) :: store_amt(mx_sng,5)
INTEGER :: kloud(mx_sng)
REAL :: store_hgt(mx_sng,5)
!
!-----------------------------------------------------------------------
!
! Radar site variables
!
!-----------------------------------------------------------------------
!
CHARACTER (LEN=5) :: stnrad(mx_rad)
INTEGER :: isrcrad(0:mx_rad)
REAL :: latrad(mx_rad),lonrad(mx_rad)
REAL :: elvrad(mx_rad)
INTEGER :: ixrad(mx_rad),jyrad(mx_rad)
!
!-----------------------------------------------------------------------
!
! Output variables
!
!-----------------------------------------------------------------------
!
REAL :: ref_mos_3d(nx,ny,nz)
REAL :: clouds_3d (nx,ny,nz) ! final 3D fractnl cloud cover analysis.
REAL :: cloud_ceiling (nx,ny) ! cloud ceiling heights( m AGL)
REAL :: vil (nx,ny) ! vertically intregrated cloud liquid/ice water
REAL :: slwc_3d (nx,ny,nz) ! cloud liquid water content (kg/kg)
REAL :: cice_3d (nx,ny,nz) ! cloud ice content (kg/kg)
REAL :: ctmp_3d (nx,ny,nz) ! cloud temperature (K)
REAL :: w_cld (nx,ny,nz) ! vertical velocity (m/s) in clouds
INTEGER*2 cldpcp_type_3d(nx,ny,nz) ! cloud/precip type field
INTEGER :: icing_index_3d(nx,ny,nz) ! icing severity index
LOGICAL :: l_mask_pcptype(nx,ny) ! analyze precip type using simulated
! radar data?
!
!-----------------------------------------------------------------------
!
! Temporary arrays
!
!-----------------------------------------------------------------------
!
REAL :: p_3d (nx,ny,nz)
REAL :: t_3d (nx,ny,nz)
REAL :: rh_3d (nx,ny,nz)
REAL :: qvprt_old(nx,ny,nz)
REAL :: qw_old (nx,ny,nz)
REAL :: qr_cld (nx,ny,nz)
REAL :: qs_cld (nx,ny,nz)
REAL :: qh_cld (nx,ny,nz)
REAL :: tem1 (nx,ny,nz)
REAL :: tem2 (nx,ny,nz)
!
!-----------------------------------------------------------------------
!
! Misc local variables
!
!-----------------------------------------------------------------------
!
REAL :: f_qvsat
REAL :: smfct1
PARAMETER (smfct1=0.5)
REAL :: epsdif
PARAMETER (epsdif=0.0001)
!
CHARACTER (LEN=6) :: varid
CHARACTER (LEN=20) :: varname
CHARACTER (LEN=20) :: varunits
INTEGER :: i,j,k,irad
INTEGER :: istat_radar
INTEGER :: istatus_cld,istatus_lwc,istatus_pcp,istatwrt
REAL :: xrad,yrad,qvsat,radri,radrj,p0inv,ppi
REAL :: tgrid,dqv_prt,dqw,qw_new,arg,rh,rhobar,wratio,ptdiff,ptcld
!
INTEGER :: strhopt_rad ! streching option
INTEGER :: mapproj_rad ! map projection indicator
REAL :: dx_rad,dy_rad,dz_rad,dzmin_rad ! grid spcngs
REAL :: ctrlat_rad,ctrlon_rad ! central lat and lon
REAL :: tlat1_rad,tlat2_rad,tlon_rad ! true lat and lon
REAL :: scale_rad ! map scale factor
REAL :: max_pt_adj,extrnz,extrnz1,extr1,relh,frac
REAL :: cldpcpfrc,onemcpf,cldtot,pcptot,cldlim
CHARACTER (LEN=72) :: warn_string
!
!-----------------------------------------------------------------------
!
! Include file
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'phycst.inc'
INCLUDE 'grid.inc' ! Grid parameters
!
!-----------------------------------------------------------------------
!
! Specify the scheme and products wanted.
!
!-----------------------------------------------------------------------
!
INTEGER :: iflag_slwc
LOGICAL :: l_flag_incld_w ,l_flag_cldtyp,l_flag_icing
!
!-----------------------------------------------------------------------
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of the cloud analysis procedure.
! Some initializations.
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
iflag_slwc = 13 ! New Smith-Fedds model for Liquid Water Content
l_flag_incld_w = .true. ! Analyze in-cloud w-field
l_flag_cldtyp = .true. ! Diagnose cloud type field
l_flag_icing = .true. ! Analyzing icing severity
!
!-----------------------------------------------------------------------
!
! Compute state variables on grid including k=1, nz-1, nz, via
! linear extrapolation, except RH is taken to be constant.
! Save the old buoyancy field.
!
!-----------------------------------------------------------------------
!
! OpenMP changed loop order to j,k,i:
!$OMP PARALLEL DO PRIVATE(i,j,k,qvsat)
DO j=1,ny-1
DO k=2,nz-1
DO i=1,nx-1
p_3d(i,j,k) = pprt(i,j,k)+pbar(i,j,k)
t_3d(i,j,k) = (ptprt(i,j,k)+ptbar(i,j,k))* &
((pprt(i,j,k)+pbar(i,j,k))/p0)**rddcp
qvsat=f_qvsat
(p_3d(i,j,k),t_3d(i,j,k))
rh_3d(i,j,k)=100.*MIN(1.,MAX(0.,(qv(i,j,k)/qvsat)))
qvprt_old(i,j,k) = qv(i,j,k) - qvbar(i,j,k)
qw_old(i,j,k) = qc(i,j,k) + qi(i,j,k) &
+ qr(i,j,k) + qs(i,j,k) + qh(i,j,k)
END DO
END DO
END DO
! OpenMP:
!$OMP PARALLEL DO PRIVATE(j,i,extrnz1,extrnz,extr1)
DO j = 1, ny-1
DO i = 1, nx-1
extrnz1 = (zs(i,j,nz-1)-zs(i,j,nz-3)) &
/ (zs(i,j,nz-2)-zs(i,j,nz-3))
t_3d(i,j,nz-1) = t_3d(i,j,nz-2) &
+ (t_3d(i,j,nz-2)-t_3d(i,j,nz-3))*extrnz1
p_3d(i,j,nz-1) = p_3d(i,j,nz-2) &
+ (p_3d(i,j,nz-2)-p_3d(i,j,nz-3))*extrnz1
rh_3d(i,j,nz-1) = rh_3d(i,j,nz-2)
extrnz = (zs(i,j,nz)-zs(i,j,nz-3)) &
/ (zs(i,j,nz-2)-zs(i,j,nz-3))
t_3d(i,j,nz) = t_3d(i,j,nz-3) &
+ (t_3d(i,j,nz-2)-t_3d(i,j,nz-3))*extrnz
p_3d(i,j,nz) = p_3d(i,j,nz-3) &
+ (p_3d(i,j,nz-2)-p_3d(i,j,nz-3))*extrnz
rh_3d(i,j,nz) = rh_3d(i,j,nz-2)
extr1 = (zs(i,j,1)-zs(i,j,3)) &
/ (zs(i,j,2)-zs(i,j,3))
t_3d(i,j,1) = t_3d(i,j,3) &
+ (t_3d(i,j,2)-t_3d(i,j,3))*extr1
p_3d(i,j,1) = p_3d(i,j,3) &
+ (p_3d(i,j,2)-p_3d(i,j,3))*extr1
rh_3d(i,j,1) = rh_3d(i,j,2)
END DO
END DO
CALL edgfill
( t_3d ,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz)
CALL edgfill
( p_3d ,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz)
CALL edgfill
(rh_3d ,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz)
CALL edgfill
( zs ,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz)
!
!-----------------------------------------------------------------------
!
! Initialize the 3D radar reflectivity array.
! Initialize the 3D cloud arrays.
!
!-----------------------------------------------------------------------
!
! OpenMP changed loop order to j,k,i:
!$OMP PARALLEL DO PRIVATE(j,i,k)
DO j=1,ny
DO k=1,nz
DO i=1,nx
ref_mos_3d(i,j,k) = r_missing
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Build radar reflectivity mosaic.
! Borrow qr_cld array here for use as a temporary array.
!
!-----------------------------------------------------------------------
!
CALL refmosaic
(nradfil,nx,ny,nz,mx_rad, &
xs,ys,zs,radfname,ref_mos_3d,ri_h,ri_v, &
qr_cld,tem1,tem2,istat_radar)
!
! OpenMP changed loop order to j,k,i:
!$OMP PARALLEL DO PRIVATE(j,i,k)
DO j=1,ny
DO k=1,nz
DO i=1,nx
qr_cld(i,j,k) = 0.0
qs_cld(i,j,k) = 0.0
qh_cld(i,j,k) = 0.0
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Analyze 3D fractional cloud cover field by using
! SAO, radar reflectivity, IR and VIS satellite data.
!
!-----------------------------------------------------------------------
!
WRITE(6,*) ' Calling Cloud Cover Analysis: cloud_cv'
!
CALL cloud_cv
(nx,ny,nz,i4timanx,curtim,dirname,runname(1:lfnkey), &
xs,ys,zs,dx,dy,hterain,latgr,longr, &
p_3d,t_3d,rh_3d, &
nobsng,stnsng,csrcsng,xsng,ysng, &
timesng,latsng,lonsng,hgtsng, &
kloud,store_amt,store_hgt, &
ref_mos_3d,istat_radar, &
clouds_3d,cloud_ceiling, &
istatus_cld)
!
IF(istatus_cld /= 1) THEN
WRITE(6,*) 'Bad status returned from cloud_cv, Aborting...'
GO TO 999
END IF
!
!-----------------------------------------------------------------------
!
! Analyze 3D cloud liquid/ice water field.
!
!-----------------------------------------------------------------------
!
WRITE(6,*) ' Calculating cloud liquid/ice water.'
!
!-----------------------------------------------------------------------
!
! Analyzing cloud liquid water field
!
!-----------------------------------------------------------------------
!
CALL cloud_lwc
(nx,ny,nz,curtim,dirname,runname(1:lfnkey), &
clouds_3d, &
t_3d,rh_3d,p_3d,zs, &
istat_radar,ref_mos_3d, &
iflag_slwc,slwc_3d,cice_3d,ctmp_3d, &
l_flag_incld_w,w_cld, &
l_mask_pcptype,l_flag_cldtyp,cldpcp_type_3d, &
l_flag_icing,icing_index_3d, &
istatus_lwc)
IF(istatus_lwc /= 1) THEN
WRITE(6,*)' Bad status returned from cloud_lwc'
GO TO 999
END IF
!
!-----------------------------------------------------------------------
!
! Calculate 3D Precipitation mixing ratio in g/kg.
! Note that qr_cld, qs_cld, and qh_cld are diagnosed
! qr, qs and qh in g/kg, respectively.
!
!-----------------------------------------------------------------------
!
!wdt-caps sra
IF(istat_radar == 1) THEN
IF (cldqropt == 1) THEN
!
! Kessler's scheme
!
WRITE(6,'(a)') ' Computing Precip mixing ratio.'
WRITE(6,'(a)') &
' Using Kessler radar reflectivity equations...'
CALL pcp_mxr
(nx,ny,nz,t_3d,p_3d,ref_mos_3d, &
cldpcp_type_3d, &
qr_cld,qs_cld,qh_cld, &
istatus_pcp)
ELSE IF (cldqropt == 2) THEN
!wdt-caps sra
!
! Ferrier's scheme
!
WRITE(6,'(a)') ' Computing Precip mixing ratio.'
WRITE(6,'(a)') &
' Using Ferrier radar reflectivity equations...'
CALL pcp_mxr_ferrier
(nx,ny,nz,t_3d,p_3d,ref_mos_3d, &
cldpcp_type_3d, &
qr_cld,qs_cld,qh_cld, &
istatus_pcp)
END IF !cldqropt=1 or 2
END IF
!
!-----------------------------------------------------------------------
!
!-----------------------------------------------------------------------
!
!-----------------------------------------------------------------------
!
! Calculate the vertically integrated condensates
! (in unit of kg/kg)
!
!-----------------------------------------------------------------------
!
! OpenMP:
!$OMP PARALLEL DO PRIVATE(j,i,k,arg,rhobar)
DO j=1,ny
DO i=1,nx
vil(i,j) = 0.0
DO k=2,nz-1
arg = slwc_3d(i,j,k)+cice_3d(i,j,k) &
+qr_cld(i,j,k)+qs_cld(i,j,k)+qh_cld(i,j,k) ! g/kg
rhobar = rhostr(i,j,k)/j3(i,j,k)
arg = 0.001* 0.5*(zs(i,j,k+1)-zs(i,j,k-1))*arg /rhobar ! kg/m**2
vil(i,j) = vil(i,j) +arg
END DO
END DO
END DO
IF(cld_files == 1) THEN
varid='colvil'
varname='Cloud VIL'
varunits='kg/m**2'
CALL wrtvar1
(nx,ny,1,vil,varid,varname,varunits, &
curtim,runname(1:lfnkey),dirname,istatwrt)
END IF
WRITE(6,'(a)')' Cloud options: '
WRITE(6,'(a,i3)') ' cldqvopt=',cldqvopt
WRITE(6,'(a,i3)') ' cldqcopt=',cldqcopt
WRITE(6,'(a,i3)') ' cldqropt=',cldqropt
WRITE(6,'(a,i3)') ' cldptopt=',cldptopt
WRITE(6,'(a,i3)') ' cldwopt =',cldwopt
!
!-----------------------------------------------------------------------
!
! Enhance the cloud liquid/ice water mixing ratio fields (convert
! g/kg to kg/kg) and THEN DO smoothing.
!
!-----------------------------------------------------------------------
!
IF (cldqcopt == 1) THEN
WRITE(6,'(a)')' Enhancing qc and qi-fields'
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
IF (qc(i,j,k) < 0.001*slwc_3d(i,j,k)) qc(i,j,k) = 0.001*slwc_3d(i,j,k)
IF (qi(i,j,k) < 0.001*cice_3d(i,j,k)) qi(i,j,k) = 0.001*cice_3d(i,j,k)
! Limit total cloud water plus ice to local qvsat.
qvsat=f_qvsat
( p_3d(i,j,k), t_3d(i,j,k))
qvsat = qvslimit_2_qc *qvsat
arg = qc(i,j,k)+qi(i,j,k)
IF (arg > 1.0E-10 .AND. arg > qvsat) THEN
relh = qc(i,j,k)/arg
qc(i,j,k) = relh*qvsat
qi(i,j,k) = (1.0-relh)*qvsat
END IF
END DO
END DO
END DO
IF (smth_opt == 1) THEN
DO k=2,nz-1
CALL smooth9p
(qc(1,1,k),nx,ny,1,nx-1,1,ny-1,tem1(1,1,1))
CALL smooth9p
(qi(1,1,k),nx,ny,1,nx-1,1,ny-1,tem1(1,1,1))
END DO
ELSE IF(smth_opt == 2) THEN
CALL smooth3d
(nx,ny,nz, 1,nx-1,1,ny-1,1,nz-1,smfct1,zs &
,qc(1,1,1),tem1,qc(1,1,1))
CALL smooth3d
(nx,ny,nz, 1,nx-1,1,ny-1,1,nz-1,smfct1,zs &
,qi(1,1,1),tem1,qi(1,1,1))
END IF
END IF ! cldqcopt.eq.1?
!
!-----------------------------------------------------------------------
!
! Enhance and THEN smooth the precipitate mixing ratio fields.
!
!-----------------------------------------------------------------------
!
IF (cldqropt == 1 .or. cldqropt==2) THEN
WRITE(6,'(a)')' Enhancing qr, qs, and qh-fields'
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
qr_cld(i,j,k) = MIN(0.001*qr_cld(i,j,k),qrlimit)
qs_cld(i,j,k) = MIN(0.001*qs_cld(i,j,k),qrlimit)
qh_cld(i,j,k) = MIN(0.001*qh_cld(i,j,k),qrlimit)
END DO
END DO
END DO
IF (smth_opt == 1) THEN
DO k=2,nz-1
CALL smooth9p
(qr_cld(1,1,k),nx,ny,1,nx-1,1,ny-1,tem1(1,1,1))
CALL smooth9p
(qs_cld(1,1,k),nx,ny,1,nx-1,1,ny-1,tem1(1,1,1))
CALL smooth9p
(qh_cld(1,1,k),nx,ny,1,nx-1,1,ny-1,tem1(1,1,1))
END DO
ELSE IF(smth_opt == 2) THEN
CALL smooth3d
(nx,ny,nz, 1,nx-1,1,ny-1,2,nz-1,smfct1,zs &
,qr_cld(1,1,1),tem1,qr_cld(1,1,1))
CALL smooth3d
(nx,ny,nz, 1,nx-1,1,ny-1,2,nz-1,smfct1,zs &
,qs_cld(1,1,1),tem1,qs_cld(1,1,1))
CALL smooth3d
(nx,ny,nz, 1,nx-1,1,ny-1,2,nz-1,smfct1,zs &
,qh_cld(1,1,1),tem1,qh_cld(1,1,1))
END IF
frac = 1.0-frac_qr_2_qc
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
qc(i,j,k) = qc(i,j,k) + frac_qr_2_qc*qr_cld(i,j,k)
qi(i,j,k) = qi(i,j,k) + &
frac_qr_2_qc * (qs_cld(i,j,k) + qh_cld(i,j,k))
qr(i,j,k) = MAX( qr(i,j,k), frac*qr_cld(i,j,k) )
qs(i,j,k) = MAX( qs(i,j,k), frac*qs_cld(i,j,k) )
qh(i,j,k) = MAX( qh(i,j,k), frac*qh_cld(i,j,k) )
END DO
END DO
END DO
END IF ! cldqropt.eq.1?
!-----------------------------------------------------------------------
!
! Adjust the cloud water fields for possible double counting from
! the combination of the Smith-Feddes cloud scheme and the
! reflectivity-to-precipitation algorithm.
!
! For now a simple approach is taken. If clouds and precipation
! are present, limit cloud water to 10% of the precipitation value.
! Then adjust precipitation fields to remove water that already
! is represented by cloud fields.
!
! Note possible conflict with frac_qr_2_qc above, so for best
! results set frac_qr_2_qc to ZERO.
!
!-----------------------------------------------------------------------
cldpcpfrc=0.20
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
cldtot=qc(i,j,k)+qi(i,j,k)
pcptot=qr(i,j,k)+qs(i,j,k)+qh(i,j,k)
IF(cldtot > 0. .AND. pcptot > 0.) THEN
cldlim=cldpcpfrc*pcptot
IF(cldtot > cldlim) THEN
qc(i,j,k)=qc(i,j,k)*cldlim/cldtot
qi(i,j,k)=qi(i,j,k)*cldlim/cldtot
END IF
END IF
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Adjust the purterbation potential temperature field to account
! for the latent heating release.
!
!wdt-caps sra
! Corrected by D.H. Wang for ppi term in temperature adjustment
! Adjustment is to temperature then converted to potential
! temperature.
!
!-----------------------------------------------------------------------
!
IF (cldptopt == 3) THEN
!wdt-caps sra
WRITE(6,'(a)')' Adjusting ptprt to account for latent heating.'
WRITE(6,'(a,f10.4,a,f10.4)') &
' frac of qc:',frac_qc_2_lh,' adj_lim:',max_lh_2_pt
p0inv=1./p0
max_pt_adj = 0.0
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
ppi = ((pbar(i,j,k)+pprt(i,j,k))*p0inv) ** rddcp
arg = lathv*frac_qc_2_lh*(qc(i,j,k)+qi(i,j,k))/(cp*ppi)
max_pt_adj = MAX(max_pt_adj,arg)
ptprt(i,j,k) = ptprt(i,j,k) + MIN(arg,max_lh_2_pt)
max_pt_adj = MAX(max_pt_adj,arg)
END DO
END DO
END DO
PRINT*,'max_adj=',max_pt_adj
ELSE IF (cldptopt == 4) THEN
WRITE(6,'(a)')' Adjusting ptprt to account for latent heating in w.'
PRINT*,'frac of qc:',frac_qc_2_lh,' adj_lim:',max_lh_2_pt
max_pt_adj = 0.0
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
IF( wratio=1.0
ptcld=ctmp_3d(i,j,k)*(p0/p_3d(i,j,k))**rddcp
ptdiff=ptcld-(ptbar(i,j,k)+ptprt(i,j,k))
IF(ptdiff > 0.) THEN
arg = frac_qc_2_lh*wratio*ptdiff
ptprt(i,j,k) = ptprt(i,j,k) + MIN(arg,max_lh_2_pt)
max_pt_adj = MAX(max_pt_adj,arg)
END IF
END IF
END DO
END DO
END DO
PRINT*,'max_adj=',max_pt_adj
ELSE IF (cldptopt == 5) THEN
WRITE(6,'(a)')' Adjusting ptprt to moist-adiab cloud temp for w>-0.2'
PRINT*,'frac of qc:',frac_qc_2_lh,' adj_lim:',max_lh_2_pt
max_pt_adj = 0.0
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
wratio=min(max(0.,(5.0*(w(i,j,k)+0.2))),1.0)
ptcld=ctmp_3d(i,j,k)*(p0/p_3d(i,j,k))**rddcp
ptdiff=ptcld-(ptbar(i,j,k)+ptprt(i,j,k))
IF(ptdiff > 0.) THEN
arg = frac_qc_2_lh*wratio*ptdiff
ptprt(i,j,k) = ptprt(i,j,k) + MIN(arg,max_lh_2_pt)
max_pt_adj = MAX(max_pt_adj,arg)
END IF
END DO
END DO
END DO
PRINT*,'max_adj=',max_pt_adj
END IF ! cldptopt=3?
!
!-----------------------------------------------------------------------
!
! Enhance rh*-field in the cloudy area with the cloud cover
! greater than thresh_cvr and then smooth the enhanced field.
!
!-----------------------------------------------------------------------
!
IF (cldqvopt == 1) THEN
WRITE(6,'(a,f5.2,a,f5.2,a,f5.1,a,f5.1,a)') &
' Enhancing RH-field for cldcvr between' &
,cvr2rh_thr1,' and ', cvr2rh_thr2 &
,'with linear ramp from ',rh_thr1*100.0 &
,'% to ',rh_thr2*100.0,'%'
!
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
IF(clouds_3d(i,j,k) > cvr2rh_thr1) THEN
rh = (clouds_3d(i,j,k)-cvr2rh_thr1)*(rh_thr2-rh_thr1) &
/(cvr2rh_thr2-cvr2rh_thr1) + rh_thr1
rh = MIN(rh,rh_thr2)
rh_3d(i,j,k) = MAX((100.*rh),rh_3d(i,j,k))
END IF
END DO
END DO
END DO
!
IF (smth_opt == 1) THEN
DO k=2,nz-1
CALL smooth9p
(rh_3d(1,1,k),nx,ny,1,nx-1,1,ny-1,tem1(1,1,1))
END DO
ELSE IF(smth_opt == 2) THEN
CALL smooth3d
(nx,ny,nz, 1,nx-1,1,ny-1,2,nz-1,smfct1,zs &
,rh_3d,tem1,rh_3d)
END IF
!
!-----------------------------------------------------------------------
!
! Convert the rh* field back into qv-field
!
!-----------------------------------------------------------------------
!
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
qvsat=f_qvsat
( p_3d(i,j,k), t_3d(i,j,k))
qv(i,j,k)=MAX(qv(i,j,k),(0.01*rh_3d(i,j,k)*qvsat))
END DO
END DO
END DO
!
END IF ! cldqvopt=1
!
!-----------------------------------------------------------------------
!
! Adjust the purterbation potential temperature field to preserve
! the previous buoyancy field.
!
!-----------------------------------------------------------------------
!
IF (cldptopt > 0.AND.cldptopt < 3) THEN
WRITE(6,'(a)')' Adjusting ptprt-field to preserve buoyancy'
PRINT*,'frac of qw:',frac_qw_2_pt
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
qw_new = qc(i,j,k) + qi(i,j,k) &
+ qr(i,j,k) + qs(i,j,k) + qh(i,j,k)
dqw = qw_new - qw_old(i,j,k)
IF (cldptopt == 1) THEN
arg = dqw/(1.0+qvbar(i,j,k))
ELSE
dqv_prt = qv(i,j,k) - qvbar(i,j,k) - qvprt_old(i,j,k)
arg = (dqv_prt + dqw)/(1.0+qvbar(i,j,k)) &
- dqv_prt/(0.622+qvbar(i,j,k))
END IF
ptprt(i,j,k) = ptprt(i,j,k) + ptbar(i,j,k)*arg*frac_qw_2_pt
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Re-adjust the qv field to account for the temp. adjustment
!
!-----------------------------------------------------------------------
!
IF (cldqvopt == 1) THEN
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
tgrid =(ptprt(i,j,k)+ptbar(i,j,k))*((p_3d(i,j,k)/p0)**rddcp)
qvsat=f_qvsat
( p_3d(i,j,k), tgrid )
qv(i,j,k)=MAX(qv(i,j,k),(0.01*rh_3d(i,j,k)*qvsat))
END DO
END DO
END DO
!
END IF ! cldqvopt=1
END IF ! cldptopt.eq.1?
!
!-----------------------------------------------------------------------
!
! Enhance and THEN smooth w-field using analyzed in-cloud w-field.
!
!-----------------------------------------------------------------------
!
IF (cldwopt == 1) THEN
WRITE(6,'(a,f8.4)') ' Enhancing w-field for areas w/ cldcvr >', &
thresh_cvr
!
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
IF(w_cld(i,j,k) > w(i,j,k)) THEN
w(i,j,k) = w_cld(i,j,k)
END IF
END DO
END DO
END DO
!
IF (smth_opt == 1) THEN
DO k=2,nz-1
CALL smooth9p
( END DO
ELSE IF(smth_opt == 2) THEN
CALL smooth3d
(nx,ny,nz, 1,nx-1,1,ny-1,2,nz-1,smfct1,zs &
,w(1,1,1),tem1,w(1,1,1))
END IF
!
END IF ! cldwopt = 1
!
!-----------------------------------------------------------------------
!
!
!
999 CONTINUE
!
RETURN
END SUBROUTINE cmpclddrv
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE INICLDGRD ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
!
SUBROUTINE inicldgrd (nx,ny,nz,zs, & 1
bgqcopt,default_clear_cover, &
topo,t_3d,p_3d,rh_3d,cf_modelfg,t_sfc_k,psfc_pa, &
cldcv,wtcldcv,z_ref_lcl,z_lcl,rh_modelfg, &
r_missing,istatus)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Create background temperature and cloud fractional
! cover fields on the cloud analysis grid (which has the same
! horizontal grid as the ADAS, but the vertical levels are
! different from ADAS).
!
! This should probably be free of very small scale horizontal
! structures for best results when combining with the satellite
! data (cloud analysis uses surface observations, radar echo,
! and satellite imagery data).
!
!-----------------------------------------------------------------------
!
! AUTHOR: (Jian Zhang)
! 03/1996
!
! MODIFICATION HISTORY
!
! 03/14/97 J. Zhang
! Cleaning up the code and implemented for the official
! arps4.2.4 version
! 09/10/97 J. Zhang
! Using a quadratic relationship for deriving cloud
! fractional cover field from gridded relative humidity
! analysis. Added calculation for lifting condensation
! levels.
! 09/15/97 J. Zhang
! Fixed a bug when calling function rh_to_cldcv
! 05/06/98 J. Zhang
! Abandoned the cloud grid, using the ARPS grid instead.
!
!-----------------------------------------------------------------------
!-----------------------------------------------------------------------
!
! INPUT:
!
! nx, ny, nz ! ADAS grid size.
!
!c Analysis variables
!
! zs (nx,ny,nz) ! The physical height coordinate
! defined at w-point of staggered grid.
! t_3d (nx,ny,nz) ! Temperature field
! p_3d (nx,ny,nz) ! Pressure field
! rh_3d(nx,ny,nz) ! Relative humidity field
!
! OUTPUT:
!
! REAL*4 cf_modelfg(nx,ny,nz) ! model first guess for cld cv.
! REAL*4 rh_modelfg(nx,ny,nz) ! model first guess for RH
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
!
!-----------------------------------------------------------------------
!
! Variables declaration
!
!-----------------------------------------------------------------------
!
! INPUT:
!
INTEGER :: nx,ny,nz ! ADAS grid size
!
INTEGER :: bgqcopt
REAL :: z_ref_lcl ! ref. level for computing LCL
REAL :: default_clear_cover ! default value for clear sky
REAL :: r_missing ! bad or missing data flag
!
REAL :: zs (nx,ny,nz) ! Hgts of each ADAS gird pt.
REAL :: topo (nx,ny) ! Terrain height
REAL :: t_3d (nx,ny,nz) ! Temperature field (K)
REAL :: p_3d (nx,ny,nz) ! Pressure field (pa)
REAL :: rh_3d (nx,ny,nz) ! relative humidity (0-100) field
!
! OUTPUT:
!
REAL :: cf_modelfg(nx,ny,nz) ! Output, 1st guess of cloud
! cover on cloud height grid
REAL :: rh_modelfg(nx,ny,nz) ! Output, 1st guess of relative
! humidity on cloud height grid
REAL :: t_sfc_k(nx,ny) ! Air temp. at sfc
REAL :: psfc_pa(nx,ny) ! pressure (Pascal) at sfc
REAL :: z_lcl(nx,ny) ! lifting condensatn lvl (MSL)
!
REAL :: cldcv (nx,ny,nz) ! 3D gridded frac cld cv analysis.
REAL :: wtcldcv (nx,ny,nz) ! wgt assigned to cld cvr analysis
!
INTEGER :: istatus ! flag indicate process status
!
! FUNCTIONS:
REAL :: rh_to_cldcv,dwpt
!
! CONSTANTS:
REAL :: gamma_d ! dry adiabatic lapse rate (K/m)
PARAMETER (gamma_d = 9.8/1004.0)
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k
REAL :: arg,frac_z
REAL :: t_ref_k,t_ref_c,rh_ref,td_ref_c,z_ref
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
WRITE(6,*) 'Initializing the cloud analysis grid'
istatus = 0
!
!-----------------------------------------------------------------------
!
! Initialize surface temperature fields with missing flag
! Initialize background cloud cover and the weight arrays.
! Initialize model first guess fields with default values
!
!-----------------------------------------------------------------------
!
DO j=1,ny
DO i=1,nx
t_sfc_k(i,j) = r_missing
END DO
END DO
DO k=1,nz
DO j=1,ny
DO i=1,nx
cldcv(i,j,k) = r_missing
wtcldcv(i,j,k) = r_missing
cf_modelfg(i,j,k) = default_clear_cover
rh_modelfg(i,j,k) = 0.0
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Calculate the surface temperature using standard atmosphere
! profile.
!
!-----------------------------------------------------------------------
!
DO j = 1, ny-1
DO i = 1, nx-1
psfc_pa(i,j) = 2.*p_3d(i,j,2)-p_3d(i,j,3)
t_sfc_k(i,j) = 2.*t_3d(i,j,2)-t_3d(i,j,3)
END DO
END DO
DO i = 1, nx-1
psfc_pa(i,ny) = psfc_pa(i,ny-1)
t_sfc_k(i,ny) = t_sfc_k(i,ny-1)
END DO
DO j = 1, ny
psfc_pa(nx,j) = psfc_pa(nx-1,j)
t_sfc_k(nx,j) = t_sfc_k(nx-1,j)
END DO
!
!-----------------------------------------------------------------------
!
! Find the lifting condensation level
!
!-----------------------------------------------------------------------
!
DO j = 1,ny-1
DO i = 1,nx-1
z_ref = z_ref_lcl + topo(i,j)
IF (z_ref <= zs(i,j,2) .OR. z_ref > zs(i,j,nz-1)) THEN
PRINT*,'Error, ref.level is out of bounds at pt:',i,j
PRINT*,'zref=',z_ref,' topo=',topo(i,j),' lower bnd=' &
,zs(i,j,2),' upper bnd=',zs(i,j,nz-1)
PRINT*,' Aborting...'
STOP
END IF
!
!-----------------------------------------------------------------------
!
! Find the model temperature and dewpoint at the reference level.
!
!-----------------------------------------------------------------------
!
DO k = 3,nz-1
IF (z_ref >= zs(i,j,k-1)) THEN
frac_z = (z_ref-zs(i,j,k-1))/(zs(i,j,k)-zs(i,j,k-1))
t_ref_k = t_3d(i,j,k-1) &
+ frac_z*(t_3d(i,j,k)-t_3d(i,j,k-1))
t_ref_c = t_ref_k - 273.15
!
rh_ref = rh_3d(i,j,k-1) &
+ frac_z*(rh_3d(i,j,k)-rh_3d(i,j,k-1))
td_ref_c = dwpt(t_ref_c,rh_ref)
END IF
END DO ! k = 2,nz-1
!
z_lcl(i,j) = z_ref + (t_ref_c - td_ref_c)/gamma_d
z_lcl(i,j) = min(zs(i,j,nz-1),max(z_lcl(i,j),zs(i,j,2)))
END DO ! I
END DO ! J
DO j = 1, ny-1
z_lcl(nx,j) = z_lcl(nx-1,j)
END DO
DO i = 1, nx
z_lcl(i,ny) = z_lcl(i,ny-1)
END DO
!
!-----------------------------------------------------------------------
!
! Remap model temperature and rh fields to cloud height grid
! and convert model rh to cloud cover
!
!-----------------------------------------------------------------------
!
WRITE(6,*)
!
DO k = 2,nz-1
DO j = 1,ny-1
DO i = 1,nx-1
rh_modelfg(i,j,k) = 0.01*rh_3d(i,j,k)
IF (zs(i,j,k) >= z_lcl(i,j) .AND. bgqcopt > 0) THEN
arg = zs(i,j,k) - topo(i,j)
cf_modelfg(i,j,k) = rh_to_cldcv(rh_modelfg(i,j,k),arg)
END IF
END DO ! I
END DO ! J
END DO ! K
DO i = 1, nx-1
DO j = 1, ny-1
rh_modelfg(i,j,1) = rh_modelfg(i,j,2)
rh_modelfg(i,j,nz) = rh_modelfg(i,j,nz-1)
END DO
END DO
DO k = 1,nz
DO j = 1,ny-1
rh_modelfg(nx,j,k) = rh_modelfg(nx-1,j,k)
cf_modelfg(nx,j,k) = cf_modelfg(nx-1,j,k)
END DO ! J
DO i = 1,nx
rh_modelfg(i,ny,k) = rh_modelfg(i,ny-1,k)
cf_modelfg(i,ny,k) = cf_modelfg(i,ny-1,k)
END DO ! I
END DO ! K
istatus=1
RETURN
END SUBROUTINE inicldgrd
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE READRAD_JZ ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE readrad_jz(nx,ny,nz,isrcrad,stnrad &,4
,latrad,lonrad,elvrad &
,gridvel,gridref,gridnyq,gridtim &
,istatus)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Reads radar data remapped on the ARPS grid.
! This routine requires the remapping to occur on the same grid
! as the analysis.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Jian Zhang
! 05/1996 Read the remapped radar data which was written by the
! corresponding output routine "wrtrad" in remaplib.f.
!
! MODIFICATION HISTORY:
! 03/19/97 J. Zhang
! Added a line of error message when there is trouble
! reading a radar file.
! 04/03/97 J. Zhang
! Added the option of reading the data file created
! from "WTRADCOL". Added output for the remapping
! parameters in the radar file (e.g., strhopt,mapproj,
! dx,dy,dz,dzmin,ctrlat,ctrlon,tlat1,tlat2,tlon,scale)
! 04/07/97 J. Zhang
! Added the QC for the case when i,j,k outside the model
! domain
! 04/09/97 J. Zhang
! Added the Initializations for gridref, girdvel...
! 04/11/97 J. Zhang
! Include dims.inc for nx,ny,nz
! 04/14/97 J. Zhang
! Added message output for the case when actual # of
! radar files exceeds the maximum allowed number in the
! ADAS include file. When that happens, the program will
! stop.
! 08/06/97 J. Zhang
! Change adascld24.inc to adascld25.inc.
! 09/11/97 J. Zhang
! Change adascld25.inc to adascld26.inc.
!
!-----------------------------------------------------------------------
!
! INCLUDE: (from dims.inc and adas.inc)
!
! 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
! mx_rad maximum number of radars
!
! nradfil number of radar files
! fradname file name for radar datasets
!
! OUTPUT:
!
! isrcrad index of radar source
! stnrad radar site name character*4
! latrad latitude of radar (degrees N)
! lonrad longitude of radar (degrees E)
! elvrad elevation of feed horn of radar (m MSL)
!
! gridvel radial velocity on ARPS grid
! gridref reflectivity on ARPS grid
! gridnyq nyquist velocity on ARPS grid
! gridtim observation time at ARPS grid
!
! istatus status indicator
!
! tem1 Temporary work array.
!
!-----------------------------------------------------------------------
!
! Variable Declarations:
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
!
!-----------------------------------------------------------------------
!
! Include files:
!
INCLUDE 'adas.inc' ! ADAS parameters
!
!-----------------------------------------------------------------------
!
! INPUT:
INTEGER :: nx,ny,nz ! the ARPS grid size
!
! INCLUDE: (from adas.inc)
! integer mx_rad
! INPUT: (from namelist in the .input file)
! integer nradfil
! character*132 fradname(mx_rad)
!
! LOCAL:
REAL :: readk(nz)
REAL :: readhgt(nz)
REAL :: readref(nz)
REAL :: readvel(nz)
REAL :: readnyq(nz)
REAL :: readtim(nz)
!
INTEGER :: kntref(nz)
INTEGER :: kntvel(nz)
INTEGER :: iradvr
INTEGER :: nradvr
!
INTEGER :: iopt_wrtrad
PARAMETER (iopt_wrtrad=2)
!
! OUTPUT:
INTEGER :: istatus
!
! OUTPUT: ARPS radar arrays
REAL :: gridvel(nx,ny,nz,mx_rad)
REAL :: gridref(nx,ny,nz,mx_rad)
REAL :: gridnyq(nx,ny,nz,mx_rad)
REAL :: gridtim(nx,ny,nz,mx_rad)
!
! OUTPUT: Radar site variables
INTEGER :: isrcrad(0:mx_rad)
CHARACTER (LEN=5) :: stnrad(mx_rad)
REAL :: latrad(mx_rad)
REAL :: lonrad(mx_rad)
REAL :: elvrad(mx_rad)
!
!-----------------------------------------------------------------------
!
! Temporary working array
!
!-----------------------------------------------------------------------
!
REAL :: tem1(nx,ny,nz)
!
!-----------------------------------------------------------------------
!
! Misc. local variables
!
!-----------------------------------------------------------------------
!
CHARACTER (LEN=4) :: stn
CHARACTER (LEN=6) :: runname
CHARACTER (LEN=132) :: fname
INTEGER :: ireftim,itime,vcpnum,idummy
INTEGER :: hdmpfmt,strhopt,mapprin
INTEGER :: nchanl,ierr
INTEGER :: iyr, imon, idy, ihr, imin, isec
INTEGER :: i,j,k,krad,kk,ipt,klev
REAL :: dxin,dyin,dzin,dzminin,ctrlatin
REAL :: ctrlonin,tlat1in,tlat2in,tlonin,scalin,rdummy
REAL :: xrd,yrd,gridlat,gridlon,elev
!
!-----------------------------------------------------------------------
!
! Common block that stores remapping parameters for the radar
! data file.
!
!-----------------------------------------------------------------------
!
COMMON/remapfactrs_rad/strhopt,mapprin
COMMON/remapfactrs_rad2/dxin,dyin,dzin,dzminin, &
ctrlatin,ctrlonin,tlat1in,tlat2in,tlonin,scalin
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!-----------------------------------------------------------------------
!
istatus=0
PRINT*,'Reading radar data from',nradfil,' sites.'
IF (nradfil > mx_rad) THEN
WRITE(6,'(a,i3,a,i3/a)') &
' ERROR: nradfil ',nradfil,' exceeds mx_rad dimension', &
mx_rad,' please increase MX_RAD in the .inc file'
PRINT*,' ABORTING from READRAD......'
STOP
END IF
IF(nradfil < 1) THEN
WRITE(6,*) 'No radar data available. Returning from READRAD...'
RETURN
END IF
!
!-----------------------------------------------------------------------
!
! Initializations
!
!-----------------------------------------------------------------------
!
DO krad = 1, mx_rad
DO k=1,nz
DO j=1,ny
DO i=1,nx
gridref(i,j,k,krad)=-9999.
gridvel(i,j,k,krad)=-9999.
gridnyq(i,j,k,krad)=-9999.
gridtim(i,j,k,krad)=-9999.
END DO
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Loop through all radars
!
!-----------------------------------------------------------------------
!
DO krad = 1, nradfil
fname=radfname(krad)
CALL asnctl
('NEWLOCAL', 1, ierr)
CALL asnfile
(fname, '-F f77 -N ieee', ierr)
CALL getunit
( nchanl )
OPEN(UNIT=nchanl,FILE=trim(fname),ERR=399, &
FORM='unformatted',STATUS='old')
!
!-----------------------------------------------------------------------
!
! Read radar description variables
!
!-----------------------------------------------------------------------
!
istatus=1
isrcrad(krad)=1
!
READ(nchanl) stn
stnrad(krad)=stn
PRINT*,'Reading ',stnrad(krad),' radar data from ', &
radfname(krad)
READ(nchanl) ireftim,itime,vcpnum,idummy,idummy, &
idummy,idummy,idummy,idummy,idummy
!
CALL abss2ctim
(itime, iyr, imon, idy, ihr, imin, isec )
iyr=MOD(iyr,100)
WRITE(6,815) imon,idy,iyr,ihr,imin
815 FORMAT(i2.2,'/',i2.2,'/',i2.2,1X,i2.2,':',i2.2,' UTC')
!
READ(nchanl) runname
READ(nchanl) hdmpfmt,strhopt,mapprin,idummy,idummy, &
idummy,idummy,idummy,idummy,idummy
READ(nchanl) dxin,dyin,dzin,dzminin,ctrlatin, &
ctrlonin,tlat1in,tlat2in,tlonin,scalin, &
latrad(krad),lonrad(krad),elvrad(krad), &
rdummy,rdummy
!
IF (iopt_wrtrad == 2) THEN
!
!-----------------------------------------------------------------------
!
! Read the data file created from subroutine "WRTRAD"
!
!-----------------------------------------------------------------------
!
READ(nchanl) tem1 ! Reflectivity
DO i=1,nx
DO j=1,ny
DO k=1,nz
gridref(i,j,k,krad) = tem1(i,j,k)
END DO
END DO
END DO
!
READ(nchanl) tem1 ! Radial Velocity
DO i=1,nx
DO j=1,ny
DO k=1,nz
gridvel(i,j,k,krad) = tem1(i,j,k)
END DO
END DO
END DO
READ(nchanl) tem1 ! Nyquist Velocity
DO i=1,nx
DO j=1,ny
DO k=1,nz
gridnyq(i,j,k,krad) = tem1(i,j,k)
END DO
END DO
END DO
READ(nchanl) tem1 ! Time (scnds) from the reference time
DO i=1,nx
DO j=1,ny
DO k=1,nz
gridtim(i,j,k,krad) = tem1(i,j,k)
END DO
END DO
END DO
!
ELSE IF (iopt_wrtrad == 1) THEN
!
!-----------------------------------------------------------------------
!
! Read the data file created from subroutine "WTRADCOL"
!
!-----------------------------------------------------------------------
!
DO k=1,nz
kntref(k) = 0
kntvel(k) = 0
END DO
READ(nchanl) nradvr,iradvr
!
DO ipt=1,(nx*ny)
READ(nchanl,END=51) i,j,xrd,yrd, &
gridlat,gridlon,elev,klev
READ(nchanl,END=52) (readk(kk),kk=1,klev)
READ(nchanl,END=52) (readhgt(kk),kk=1,klev)
READ(nchanl,END=52) (readref(kk),kk=1,klev)
READ(nchanl,END=52) (readvel(kk),kk=1,klev)
READ(nchanl,END=52) (readnyq(kk),kk=1,klev)
READ(nchanl,END=52) (readtim(kk),kk=1,klev)
IF(i <= nx.AND.i >= 1 .AND. j <= ny.AND.j >= 1) THEN
DO kk=1,klev
k=nint(readk(kk))
IF(k <= nz.AND.k >= 1) THEN
gridref(i,j,k,krad)=readref(kk)
gridvel(i,j,k,krad)=readvel(kk)
gridnyq(i,j,k,krad)=readnyq(kk)
gridtim(i,j,k,krad)=readtim(kk)
IF (gridref(i,j,k,krad) > -200. &
.AND. gridref(i,j,k,krad) < 200.) &
kntref(k)=kntref(k)+1
IF (gridvel(i,j,k,krad) > -200. &
.AND. gridvel(i,j,k,krad) < 200.) &
kntvel(k)=kntvel(k)+1
END IF ! 1 < k < nz
END DO ! kk = 1, klev
END IF ! 1 < i < nx & 1 < j < ny
END DO ! ipt = 1, nx*ny
51 CONTINUE
ipt=ipt-1
WRITE(6,'(a,i6,a)') ' End of file reached after reading', &
ipt,' columns'
GO TO 55
52 CONTINUE
WRITE(6,'(a,i6,a)') ' End of file reached while reading', &
ipt,' column'
55 CONTINUE
!
!-----------------------------------------------------------------------
!
! Write statistics
!
!-----------------------------------------------------------------------
!
WRITE(6,'(a)') ' k n ref n vel'
DO k=1,nz
WRITE(6,'(i3,2i10)') k,kntref(k),kntvel(k)
END DO
!
CLOSE(nchanl)
CALL retunit( nchanl )
END IF ! iopt_wrtrad
GO TO 400
399 CONTINUE
PRINT*,'Error reading the radar file:',fname
400 CONTINUE
END DO ! KRAD = 1, nradfil
RETURN
END SUBROUTINE readrad_jz