!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE ININUDGE ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma. All rights reserved. ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE ininudge(nxndg,nyndg,nzndg, & 1,2
uincr,vincr,wincr,pincr,ptincr,qvincr, &
qcincr,qrincr,qiincr,qsincr,qhincr,istatus)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Initialize analysis increments for use in continuous
! nudging adjustment process.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Keith Brewster
! March, 1998
!
! MODIFICATION HISTORY:
!
! 07/10/2001 (K. Brewster)
! Added increment arrays to argument list and removed
! initialization to zero before reading (now done prior to call).
!
!-----------------------------------------------------------------------
!
! INPUT :
!
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nxndg,nyndg,nzndg
REAL :: uincr(nxndg,nyndg,nzndg) ! Analysis increment for u
REAL :: vincr(nxndg,nyndg,nzndg) ! Analysis increment for v
REAL :: wincr(nxndg,nyndg,nzndg) ! Analysis increment for w
REAL :: pincr(nxndg,nyndg,nzndg) ! Analysis increment for p
REAL :: ptincr(nxndg,nyndg,nzndg) ! Analysis increment for pt
REAL :: qvincr(nxndg,nyndg,nzndg) ! Analysis increment for qv
REAL :: qcincr(nxndg,nyndg,nzndg) ! Analysis increment for qc
REAL :: qrincr(nxndg,nyndg,nzndg) ! Analysis increment for qr
REAL :: qiincr(nxndg,nyndg,nzndg) ! Analysis increment for qi
REAL :: qsincr(nxndg,nyndg,nzndg) ! Analysis increment for qs
REAL :: qhincr(nxndg,nyndg,nzndg) ! Analysis increment for qh
INTEGER :: istatus
!
!-----------------------------------------------------------------------
!
! Misc local variables
!
!-----------------------------------------------------------------------
!
INTEGER :: ncorx
INTEGER :: i,j,k
! real ndtime
!
!-----------------------------------------------------------------------
!
! Include files
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'nudging.inc'
!
!-----------------------------------------------------------------------
!
! Initializations
!
!-----------------------------------------------------------------------
!
IF ( nudgopt <= 0 ) THEN
RETURN
END IF
ndtime=ndstop-ndstart
WRITE(6,'(a,f10.2,a)') &
' Application of nudging adjustment lasts ',ndtime,' secs'
!
!-----------------------------------------------------------------------
!
! Read analysis increment file
!
!-----------------------------------------------------------------------
!
CALL incrread
(nxndg,nyndg,nzndg,incrfnam, &
uincr,vincr,wincr,pincr,ptincr,qvincr, &
qcincr,qrincr,qiincr,qsincr,qhincr, &
istatus)
!
!-----------------------------------------------------------------------
!
! Compute the fixed time scale factor.
!
!-----------------------------------------------------------------------
!
IF(ndintvl > 0.) THEN
ncorx=nint(ndtime/ndintvl)
WRITE(6,'(a,i5,a,/a,f10.2)') &
' Nudging applied in ',ncorx,' steps', &
' ndintvl adjusted for dtbig =',ndintvl
ELSE
WRITE(6,'(a,/a,f10.2)') &
' Try again using new ndintvl', &
' ndintvl adjusted for dtbig =',ndintvl
WRITE(6,'(a)') ' STOPPING in ININUDGE'
CALL arpsstop
('arpsstop called from ININUDGE improper nudging &
& interval selected.',1)
END IF
RETURN
END SUBROUTINE ininudge
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE INCRREAD ######
!###### ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma. ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE incrread(nxndg,nyndg,nzndg,incrfnam, & 1,52
uincr,vincr,wincr,pincr,ptincr,qvincr, &
qcincr,qrincr,qiincr,qsincr,qhincr, &
istatus)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Read analysis increments from a file for use in continuous
! adjustment process.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Keith Brewster
! March 1998
!
! MODIFICATION HISTORY:
!
! 07/10/2001 (K. Brewster)
! Added increment arrays to argument list rather than obtaining
! them through common in nudging.inc
!
!-----------------------------------------------------------------------
!
! INPUT :
!
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nxndg,nyndg,nzndg
CHARACTER (LEN=132) :: incrfnam
REAL :: uincr(nxndg,nyndg,nzndg) ! Analysis increment for u
REAL :: vincr(nxndg,nyndg,nzndg) ! Analysis increment for v
REAL :: wincr(nxndg,nyndg,nzndg) ! Analysis increment for w
REAL :: pincr(nxndg,nyndg,nzndg) ! Analysis increment for p
REAL :: ptincr(nxndg,nyndg,nzndg) ! Analysis increment for pt
REAL :: qvincr(nxndg,nyndg,nzndg) ! Analysis increment for qv
REAL :: qcincr(nxndg,nyndg,nzndg) ! Analysis increment for qc
REAL :: qrincr(nxndg,nyndg,nzndg) ! Analysis increment for qr
REAL :: qiincr(nxndg,nyndg,nzndg) ! Analysis increment for qi
REAL :: qsincr(nxndg,nyndg,nzndg) ! Analysis increment for qs
REAL :: qhincr(nxndg,nyndg,nzndg) ! Analysis increment for qh
INTEGER :: istatus
!
!-----------------------------------------------------------------------
!
! Misc local variables
!
!-----------------------------------------------------------------------
!
CHARACTER (LEN=80) :: runnamin
CHARACTER (LEN=8) :: varin
INTEGER :: iyr,imon,idy,ihr,imin,isec
INTEGER :: nxin,nyin,nzin,i4timein
INTEGER :: maprojin
REAL :: trlat1in,trlat2in,trlonin
REAL :: sclfctin,ctrlatin,ctrlonin
INTEGER :: ustor,vstor,wstor,pstor,ptstor,qvstor, &
qcstor,qrstor,qistor,qsstor,qhstor
INTEGER :: nchinc,ierr
INTEGER :: ireturn
INTEGER :: strhoptin
REAL :: dxin,dyin,dzin,dzminin,zrefsfcin,dlayer1in, &
dlayer2in,zflatin,strhtunein
INTEGER(2), allocatable :: itmp(:,:,:) ! Temporary array
REAL, allocatable :: hmax(:), hmin(:) ! Temporary array
INTEGER :: istat, sd_id
!wdt kwthomas update
CHARACTER (LEN=132) :: savename
!
!-----------------------------------------------------------------------
!
! Include files
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid & map parameters.
!wdt kwthomas update
INCLUDE 'mp.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
IF (incrfmt /= 0) THEN
ALLOCATE (itmp(nxndg,nyndg,nzndg),stat=istat)
IF (istat /= 0) THEN
WRITE (6,*) "INCRREAD: ERROR allocating itmp, returning"
ierr = 1
RETURN
END IF
ALLOCATE (hmax(nzndg),stat=istat)
IF (istat /= 0) THEN
WRITE (6,*) "INCRREAD: ERROR allocating hmax, returning"
ierr = 1
RETURN
END IF
ALLOCATE (hmin(nzndg),stat=istat)
IF (istat /= 0) THEN
WRITE (6,*) "INCRREAD: ERROR allocating hmin, returning"
ierr = 1
RETURN
END IF
END IF
!wdt kwthomas update
IF (mp_opt > 0) THEN
savename(1:132) = incrfnam(1:132)
WRITE(incrfnam, '(a,a,2i2.2)') trim(savename),'_',loc_x,loc_y
END IF
!
!-----------------------------------------------------------------------
!
! Get unit number and open file
!
!-----------------------------------------------------------------------
!
IF (incrfmt == 0) THEN
!-----------------------------------------------------------------------
!
! Fortran unformatted dump.
!
!-----------------------------------------------------------------------
CALL getunit
(nchinc)
CALL asnctl
('NEWLOCAL', 1, ierr)
CALL asnfile
(incrfnam,'-F f77 -N ieee', ierr)
OPEN(nchinc,FILE=trim(incrfnam),ERR=950, &
FORM='unformatted',STATUS='old')
!
READ(nchinc,ERR=950) runnamin,nxin,nyin,nzin,i4timein, &
iyr,imon,idy,ihr,imin,isec
!
READ(nchinc,ERR=950) maprojin,trlat1in,trlat2in,trlonin, &
sclfctin,ctrlatin,ctrlonin
!
READ(nchinc,ERR=950) ustor,vstor,wstor,pstor,ptstor,qvstor, &
qcstor,qrstor,qistor,qsstor,qhstor
!
IF(ustor > 0) THEN
READ(nchinc,ERR=950) varin
WRITE(6,'(a,a,a)') 'Reading ',varin,' into u-increment field'
READ(nchinc,ERR=950) uincr
END IF
IF(vstor > 0) THEN
READ(nchinc,ERR=950) varin
WRITE(6,'(a,a,a)') 'Reading ',varin,' into v-increment field'
READ(nchinc,ERR=950) vincr
END IF
IF(wstor > 0) THEN
READ(nchinc,ERR=950) varin
WRITE(6,'(a,a,a)') 'Reading ',varin,' into w-increment field'
READ(nchinc,ERR=950) wincr
END IF
IF(pstor > 0) THEN
READ(nchinc,ERR=950) varin
WRITE(6,'(a,a,a)') 'Reading ',varin,' into p-increment field'
READ(nchinc,ERR=950) pincr
END IF
IF(ptstor > 0) THEN
READ(nchinc,ERR=950) varin
WRITE(6,'(a,a,a)') 'Reading ',varin,' into pt-increment field'
READ(nchinc,ERR=950) ptincr
END IF
IF(qvstor > 0) THEN
READ(nchinc,ERR=950) varin
WRITE(6,'(a,a,a)') 'Reading ',varin,' into qv-increment field'
READ(nchinc,ERR=950) qvincr
END IF
IF(qcstor > 0) THEN
READ(nchinc,ERR=950) varin
WRITE(6,'(a,a,a)') 'Reading ',varin,' into qc-increment field'
READ(nchinc,ERR=950) qcincr
END IF
IF(qrstor > 0) THEN
READ(nchinc,ERR=950) varin
WRITE(6,'(a,a,a)') 'Reading ',varin,' into qr-increment field'
READ(nchinc,ERR=950) qrincr
END IF
IF(qistor > 0) THEN
READ(nchinc,ERR=950) varin
WRITE(6,'(a,a,a)') 'Reading ',varin,' into qi-increment field'
READ(nchinc,ERR=950) qiincr
END IF
IF(qsstor > 0) THEN
READ(nchinc,ERR=950) varin
WRITE(6,'(a,a,a)') 'Reading ',varin,' into qs-increment field'
READ(nchinc,ERR=950) qsincr
END IF
IF(qhstor > 0) THEN
READ(nchinc,ERR=950) varin
WRITE(6,'(a,a,a)') 'Reading ',varin,' into qh-increment field'
READ(nchinc,ERR=950) qhincr
END IF
!
WRITE(6,'(/a,a/)') &
' Successfully read analysis incr file: ',incrfnam
istatus=0
!wdt kwthomas update
IF (mp_opt > 0) incrfnam(1:132) = savename(1:132)
RETURN
ELSE
!-----------------------------------------------------------------------
!
! HDF4 format.
!
!-----------------------------------------------------------------------
CALL hdfopen
(trim(incrfnam), 1, sd_id)
IF (sd_id < 0) THEN
WRITE (6,*) "INCRREAD: ERROR opening ", &
trim(incrfnam)," for reading."
istatus = 1
GO TO 900
END IF
CALL hdfrdi
(sd_id,"i4time",i4timein,istat)
CALL hdfrdi
(sd_id,"month",imon,istat)
CALL hdfrdi
(sd_id,"day",idy,istat)
CALL hdfrdi
(sd_id,"year",iyr,istat)
CALL hdfrdi
(sd_id,"hour",ihr,istat)
CALL hdfrdi
(sd_id,"minute",imin,istat)
CALL hdfrdi
(sd_id,"second",isec,istat)
CALL hdfrdi
(sd_id,"nx",nxin,istat)
CALL hdfrdi
(sd_id,"ny",nyin,istat)
CALL hdfrdi
(sd_id,"nz",nzin,istat)
CALL hdfrdr
(sd_id,"dx",dxin,istat)
CALL hdfrdr
(sd_id,"dy",dyin,istat)
CALL hdfrdr
(sd_id,"dz",dzin,istat)
CALL hdfrdr
(sd_id,"dzmin",dzminin,istat)
CALL hdfrdi
(sd_id,"strhopt",strhoptin,istat)
CALL hdfrdr
(sd_id,"zrefsfc",zrefsfcin,istat)
CALL hdfrdr
(sd_id,"dlayer1",dlayer1in,istat)
CALL hdfrdr
(sd_id,"dlayer2",dlayer2in,istat)
CALL hdfrdr
(sd_id,"zflat",zflatin,istat)
CALL hdfrdr
(sd_id,"strhtune",strhtunein,istat)
CALL hdfrdi
(sd_id,"mapproj",maprojin,istat)
CALL hdfrdr
(sd_id,"trulat1",trlat1in,istat)
CALL hdfrdr
(sd_id,"trulat2",trlat2in,istat)
CALL hdfrdr
(sd_id,"trulon",trlonin,istat)
CALL hdfrdr
(sd_id,"sclfct",sclfctin,istat)
CALL hdfrdr
(sd_id,"ctrlat",ctrlatin,istat)
CALL hdfrdr
(sd_id,"ctrlon",ctrlonin,istat)
CALL checkgrid3d
(nxndg,nyndg,nzndg,nxin,nyin,nzin, &
dx,dy,dz,dzmin,ctrlat,ctrlon, &
strhopt,zrefsfc,dlayer1,dlayer2,zflat,strhtune, &
mapproj,trulat1,trulat2,trulon,sclfct, &
dxin,dyin,dzin,dzminin,ctrlatin,ctrlonin, &
strhoptin,zrefsfcin,dlayer1in,dlayer2in,zflatin,strhtunein, &
maprojin,trlat1in,trlat2in,trlonin,sclfctin,ireturn)
IF (ireturn /= 0) THEN
WRITE (6,*) "INCRREAD: ERROR, grid parameter mismatch"
istatus = 1
GO TO 900
END IF
CALL hdfrdi
(sd_id,"i4time",i4timein,istat)
CALL hdfrdi
(sd_id,"iyr",iyr,istat)
CALL hdfrdi
(sd_id,"imon",imon,istat)
CALL hdfrdi
(sd_id,"idy",idy,istat)
CALL hdfrdi
(sd_id,"ihr",ihr,istat)
CALL hdfrdi
(sd_id,"imin",imin,istat)
CALL hdfrdi
(sd_id,"isec",isec,istat)
CALL hdfrd3d
(sd_id,"uincr",nxndg,nyndg,nzndg,uincr, &
istat,itmp,hmax,hmin)
IF (istat > 1) GO TO 950
CALL hdfrd3d
(sd_id,"vincr",nxndg,nyndg,nzndg,vincr, &
istat,itmp,hmax,hmin)
IF (istat > 1) GO TO 950
CALL hdfrd3d
(sd_id,"wincr",nxndg,nyndg,nzndg,wincr, &
istat,itmp,hmax,hmin)
IF (istat > 1) GO TO 950
CALL hdfrd3d
(sd_id,"pincr",nxndg,nyndg,nzndg,pincr, &
istat,itmp,hmax,hmin)
IF (istat > 1) GO TO 950
CALL hdfrd3d
(sd_id,"ptincr",nxndg,nyndg,nzndg,ptincr, &
istat,itmp,hmax,hmin)
IF (istat > 1) GO TO 950
CALL hdfrd3d
(sd_id,"qvincr",nxndg,nyndg,nzndg,qvincr, &
istat,itmp,hmax,hmin)
IF (istat > 1) GO TO 950
CALL hdfrd3d
(sd_id,"qcincr",nxndg,nyndg,nzndg,qcincr, &
istat,itmp,hmax,hmin)
IF (istat > 1) GO TO 950
CALL hdfrd3d
(sd_id,"qrincr",nxndg,nyndg,nzndg,qrincr, &
istat,itmp,hmax,hmin)
IF (istat > 1) GO TO 950
CALL hdfrd3d
(sd_id,"qiincr",nxndg,nyndg,nzndg,qiincr, &
istat,itmp,hmax,hmin)
IF (istat > 1) GO TO 950
CALL hdfrd3d
(sd_id,"qsincr",nxndg,nyndg,nzndg,qsincr, &
istat,itmp,hmax,hmin)
IF (istat > 1) GO TO 950
CALL hdfrd3d
(sd_id,"qhincr",nxndg,nyndg,nzndg,qhincr, &
istat,itmp,hmax,hmin)
IF (istat > 1) GO TO 950
istatus = 0
END IF
GO TO 900
950 CONTINUE
WRITE(6,'(/a,a/)') &
'INCRREAD: Error reading analysis incr output file: ', &
trim(incrfnam)
istatus = 1
!wdt kwthomas update
WRITE(6,*) "INCCREAD: calling arpsstop"
CALL arpsstop
('arpsstop called from INCREAD error reading incr &
& output file.',1)
900 CONTINUE
!wdt update
IF (mp_opt > 0) incrfnam(1:132) = savename(1:132)
IF (incrfmt == 0) THEN
CLOSE(nchinc)
ELSE
CALL hdfclose
(sd_id,istat)
DEALLOCATE (itmp,stat=istat)
DEALLOCATE (hmax,stat=istat)
DEALLOCATE (hmin,stat=istat)
END IF
!wdt kwthomas update
RETURN
END SUBROUTINE incrread
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE NUDGEALL ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE nudgeall(nx,ny,nz,nxndg,nyndg,nzndg, & 2,22
u,v,w,pprt,ptprt,qv,qc,qr,qi,qs,qh, &
uincr,vincr,wincr,pincr,ptincr,qvincr, &
qcincr,qrincr,qiincr,qsincr,qhincr)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
!
!-----------------------------------------------------------------------
!
! AUTHOR: Keith Brewster
! March, 1998
!
! MODIFICATION HISTORY:
!
! 07/10/2001 (K. Brewster)
! Added increment arrays to argument list rather than obtaining
! them through common in nudging.inc
!
!
!-----------------------------------------------------------------------
!
! 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
! nxndg Number x grid points for IAU
! nyndg Number y grid points for IAU
! nzndg Number z grid points for IAU
!
! u x component of velocity at times tpast and tpresent (m/s)
! v y component of velocity at times tpast and tpresent (m/s)
! w Vertical component of Cartesian velocity at times
! tpast and tpresent (m/s)
! ptprt Perturbation potential temperature at times tpast and
! tpresent (K)
! pprt Perturbation pressure at times tpast and tpresent (Pascal)
! qv Water vapor specific humidity at times tpast and tpresent (kg/kg)
! qc Cloud water mixing ratio at times tpast and tpresent (kg/kg)
! qr Rainwater mixing ratio at times tpast and tpresent (kg/kg)
! qi Cloud ice mixing ratio at times tpast and tpresent (kg/kg)
! qs Snow mixing ratio at times tpast and tpresent (kg/kg)
! qh Hail mixing ratio at times tpast and tpresent (kg/kg)
!
!-----------------------------------------------------------------------
!
! Variable Declarations:
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE ! Force explicit declarations
INTEGER :: nx, ny, nz ! Number of grid points in 3 directions
INTEGER :: nxndg,nyndg,nzndg ! Number of grid points in 3 directions
REAL :: u (nx,ny,nz) ! Total u-velocity (m/s)
REAL :: v (nx,ny,nz) ! Total v-velocity (m/s)
REAL :: w (nx,ny,nz) ! Total w-velocity (m/s)
REAL :: ptprt (nx,ny,nz) ! Perturbation potential temperature
! from that of base state atmosphere (K)
REAL :: pprt (nx,ny,nz) ! Perturbation pressure from that
! of base state atmosphere (Pascal)
REAL :: qv (nx,ny,nz) ! Water vapor specific humidity (kg/kg)
REAL :: qc (nx,ny,nz) ! Cloud water mixing ratio (kg/kg)
REAL :: qr (nx,ny,nz) ! Rain water mixing ratio (kg/kg)
REAL :: qi (nx,ny,nz) ! Cloud ice mixing ratio (kg/kg)
REAL :: qs (nx,ny,nz) ! Snow mixing ratio (kg/kg)
REAL :: qh (nx,ny,nz) ! Hail mixing ratio (kg/kg)
REAL :: uincr(nxndg,nyndg,nzndg) ! Analysis increment for u
REAL :: vincr(nxndg,nyndg,nzndg) ! Analysis increment for v
REAL :: wincr(nxndg,nyndg,nzndg) ! Analysis increment for w
REAL :: pincr(nxndg,nyndg,nzndg) ! Analysis increment for p
REAL :: ptincr(nxndg,nyndg,nzndg) ! Analysis increment for pt
REAL :: qvincr(nxndg,nyndg,nzndg) ! Analysis increment for qv
REAL :: qcincr(nxndg,nyndg,nzndg) ! Analysis increment for qc
REAL :: qrincr(nxndg,nyndg,nzndg) ! Analysis increment for qr
REAL :: qiincr(nxndg,nyndg,nzndg) ! Analysis increment for qi
REAL :: qsincr(nxndg,nyndg,nzndg) ! Analysis increment for qs
REAL :: qhincr(nxndg,nyndg,nzndg) ! Analysis increment for qh
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'nudging.inc'
!
!-----------------------------------------------------------------------
!
! Misc local variables
!
!-----------------------------------------------------------------------
!
REAL :: timscl,dmid
REAL :: timsum = 0.
INTEGER :: icall = 0
SAVE timsum,icall
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!-----------------------------------------------------------------------
!
! Compute scale factor for this application.
! nudgopt=1 Constant time function
! nudgopt=2 Triangular time function, max at mid, zero at ends.
!
!-----------------------------------------------------------------------
!
icall = icall + 1
IF(nudgopt == 1) THEN
timscl=ndscale
ELSE IF(nudgopt == 2) THEN
dmid=ABS(curtim-0.5*(ndstop-ndstart))
timscl=ndscale*AMAX1(0.,(2.-(4.*dmid/(ndstop-ndstart))))
ELSE
timscl=0.
END IF
timsum=timsum+0.5*timscl
WRITE(6,'(a,f9.4,a,f9.4,a,f9.4)') &
' Timeweight:',timscl,' Accum wgt:',timsum, &
' Accum Target:',ndgain
!
IF (nudgu == 1 .OR. nudgu == 2 ) THEN
CALL nudgevar
(nx,ny,nz,nxndg,nyndg,nzndg, &
1,nx,1,ny-1,2,nz-1,u,uincr,timscl)
ELSE IF (nudgu == 3 .AND. icall <= 2 ) THEN
CALL nudgevar
(nx,ny,nz,nxndg,nyndg,nzndg, &
1,nx,1,ny-1,2,nz-1,u,uincr,1.0)
END IF
IF (nudgv == 1 .OR. nudgv == 2 ) THEN
CALL nudgevar
(nx,ny,nz,nxndg,nyndg,nzndg, &
1,nx-1,1,ny,2,nz-1,v,vincr,timscl)
ELSE IF (nudgv == 3 .AND. icall <= 2 ) THEN
CALL nudgevar
(nx,ny,nz,nxndg,nyndg,nzndg, &
1,nx-1,1,ny,2,nz-1,v,vincr,1.0)
END IF
IF (nudgw == 1 .OR. nudgw == 2 ) THEN
CALL nudgevar
(nx,ny,nz,nxndg,nyndg,nzndg, &
1,nx-1,1,ny-1,2,nz-1,w,wincr,timscl)
ELSE IF (nudgw == 3 .AND. icall <= 2 ) THEN
CALL nudgevar
(nx,ny,nz,nxndg,nyndg,nzndg, &
1,nx-1,1,ny-1,2,nz-1,w,wincr,1.0)
END IF
IF (nudgp == 1 .OR. nudgp == 2 ) THEN
CALL nudgevar
(nx,ny,nz,nxndg,nyndg,nzndg, &
1,nx-1,1,ny-1,2,nz-1,pprt,pincr,timscl)
ELSE IF (nudgp == 3 .AND. icall <= 2 ) THEN
CALL nudgevar
(nx,ny,nz,nxndg,nyndg,nzndg, &
1,nx-1,1,ny-1,2,nz-1,pprt,pincr,1.0)
END IF
IF (nudgpt == 1 .OR. nudgpt == 2 ) THEN
CALL nudgevar
(nx,ny,nz,nxndg,nyndg,nzndg, &
1,nx-1,1,ny-1,2,nz-1,ptprt,ptincr,timscl)
ELSE IF (nudgpt == 3 .AND. icall <= 2 ) THEN
CALL nudgevar
(nx,ny,nz,nxndg,nyndg,nzndg, &
1,nx-1,1,ny-1,2,nz-1,ptprt,ptincr,1.0)
END IF
IF (nudgqv == 1 .OR. nudgqv == 2 ) THEN
CALL nudgepos
(nx,ny,nz,nxndg,nyndg,nzndg, &
1,nx-1,1,ny-1,2,nz-1,qv,qvincr,timscl)
ELSE IF (nudgqv == 3 .AND. icall <= 2 ) THEN
CALL nudgepos
(nx,ny,nz,nxndg,nyndg,nzndg, &
1,nx-1,1,ny-1,2,nz-1,qv,qvincr,1.0)
END IF
IF (nudgqc == 1 .OR. nudgqc == 2 ) THEN
CALL nudgepos
(nx,ny,nz,nxndg,nyndg,nzndg, &
1,nx-1,1,ny-1,2,nz-1,qc,qcincr,timscl)
ELSE IF (nudgqc == 3 .AND. icall <= 2 ) THEN
CALL nudgepos
(nx,ny,nz,nxndg,nyndg,nzndg, &
1,nx-1,1,ny-1,2,nz-1,qc,qcincr,1.0)
END IF
IF (nudgqr == 1 .OR. nudgqr == 2 ) THEN
CALL nudgepos
(nx,ny,nz,nxndg,nyndg,nzndg, &
1,nx-1,1,ny-1,2,nz-1,qr,qrincr,timscl)
ELSE IF (nudgqr == 3 .AND. icall <= 2 ) THEN
CALL nudgepos
(nx,ny,nz,nxndg,nyndg,nzndg, &
1,nx-1,1,ny-1,2,nz-1,qr,qrincr,1.0)
END IF
IF (nudgqi == 1 .OR. nudgqi == 2 ) THEN
CALL nudgepos
(nx,ny,nz,nxndg,nyndg,nzndg, &
1,nx-1,1,ny-1,2,nz-1,qi,qiincr,timscl)
ELSE IF (nudgqi == 3 .AND. icall <= 2 ) THEN
CALL nudgepos
(nx,ny,nz,nxndg,nyndg,nzndg, &
1,nx-1,1,ny-1,2,nz-1,qi,qiincr,1.0)
END IF
IF (nudgqs == 1 .OR. nudgqs == 2 ) THEN
CALL nudgepos
(nx,ny,nz,nxndg,nyndg,nzndg, &
1,nx-1,1,ny-1,2,nz-1,qs,qsincr,timscl)
ELSE IF (nudgqs == 3 .AND. icall <= 2 ) THEN
CALL nudgepos
(nx,ny,nz,nxndg,nyndg,nzndg, &
1,nx-1,1,ny-1,2,nz-1,qs,qsincr,1.0)
END IF
IF (nudgqh == 1 .OR. nudgqh == 2 ) THEN
CALL nudgepos
(nx,ny,nz,nxndg,nyndg,nzndg, &
1,nx-1,1,ny-1,2,nz-1,qh,qhincr,timscl)
ELSE IF (nudgqh == 3 .AND. icall <= 2 ) THEN
CALL nudgepos
(nx,ny,nz,nxndg,nyndg,nzndg, &
1,nx-1,1,ny-1,2,nz-1,qh,qhincr,1.0)
END IF
RETURN
END SUBROUTINE nudgeall
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE NUDGEVAR ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE nudgevar(nx,ny,nz,nxndg,nyndg,nzndg, & 10
ibeg,iend,jbeg,jend,kbeg,kend, &
var,varincr,timscl)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
!
!-----------------------------------------------------------------------
!
! AUTHOR: Keith Brewster
! March, 1998
!
! MODIFICATION HISTORY:
!
! 07/10/2001 (K. Brewster)
! Added increment array dimensions to argument list for consistency
! in array dimension statements.
!
!-----------------------------------------------------------------------
!
! 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
! nxndg Number x grid points for IAU
! nyndg Number y grid points for IAU
! nzndg Number z grid points for IAU
!
! var Variable to be nudged
! varincr Increment to apply to variable over time
! timscl Scale factor to determine increment to apply
! at this time
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz
INTEGER :: nxndg,nyndg,nzndg
INTEGER :: ibeg,iend,jbeg,jend,kbeg,kend
REAL :: var(nx,ny,nz)
REAL :: varincr(nxndg,nyndg,nzndg)
REAL :: timscl
!
!-----------------------------------------------------------------------
!
! Misc local variables
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
DO k=kbeg,kend
DO j=jbeg,jend
DO i=ibeg,iend
var(i,j,k)=var(i,j,k)+timscl*varincr(i,j,k)
END DO
END DO
END DO
RETURN
END SUBROUTINE nudgevar
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE NUDGEPOS ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE nudgepos(nx,ny,nz,nxndg,nyndg,nzndg, & 12
ibeg,iend,jbeg,jend,kbeg,kend, &
var,varincr,timscl)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
!
!-----------------------------------------------------------------------
!
! AUTHOR: Keith Brewster
! March, 1998
!
! MODIFICATION HISTORY:
! 07/10/2001 (K. Brewster)
! Added increment array dimensions to argument list for consistency
! in array dimension statements.
!
!-----------------------------------------------------------------------
!
! 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
! nxndg Number x grid points for IAU
! nyndg Number y grid points for IAU
! nzndg Number z grid points for IAU
!
! var Variable to be nudged
! varincr Increment to apply to variable over time
! timscl Scale factor to determine increment to apply
! at this time
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz
INTEGER :: nxndg,nyndg,nzndg
REAL :: var(nx,ny,nz)
REAL :: varincr(nxndg,nyndg,nzndg)
REAL :: timscl
!
!-----------------------------------------------------------------------
!
! Misc local variables
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k
INTEGER :: ibeg,iend,jbeg,jend,kbeg,kend
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
DO k=kbeg,kend
DO j=jbeg,jend
DO i=ibeg,iend
var(i,j,k)=MAX(0.,(var(i,j,k)+timscl*varincr(i,j,k)))
END DO
END DO
END DO
RETURN
END SUBROUTINE nudgepos