! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE ININUDGE ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma. All rights reserved. ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE ininudge(nxndg,nyndg,nzndg, & 1,3 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' INCLUDE 'mp.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 ! !----------------------------------------------------------------------- ! IF(mp_opt > 0 .AND. readsplit > 0) THEN CALL incrreadsplit(nxndg,nyndg,nzndg,incrfnam, & uincr,vincr,wincr,pincr,ptincr,qvincr, & qcincr,qrincr,qiincr,qsincr,qhincr, & istatus) ELSE CALL incrread(nxndg,nyndg,nzndg,incrfnam, & uincr,vincr,wincr,pincr,ptincr,qvincr, & qcincr,qrincr,qiincr,qsincr,qhincr, & istatus) END IF ! !----------------------------------------------------------------------- ! ! 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,53 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=256) :: 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 CHARACTER (LEN=256) :: savename ! !----------------------------------------------------------------------- ! ! Include files ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'grid.inc' ! Grid & map parameters. INCLUDE 'mp.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! IF (incrfmt == 3) 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:256) = incrfnam(1:256) WRITE(incrfnam, '(a,a,2i2.2)') trim(savename),'_',loc_x,loc_y END IF ! !----------------------------------------------------------------------- ! ! Get unit number and open file ! !----------------------------------------------------------------------- ! IF (incrfmt == 1) 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:256) = savename(1:256) RETURN ELSE IF (incrfmt == 3) THEN !----------------------------------------------------------------------- ! ! 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 ELSE ! alternate dump format ... WRITE(6,*) 'The supported increment data format are ', & 'binary (incrfmt=1) and HDF4 no compressed (incrfmt=3).' CALL arpsstop('Increment data format is not supported.',1) END IF GO TO 900 950 CONTINUE WRITE(6,'(/a,a/)') & 'INCRREAD: Error reading analysis incr output file: ', & trim(incrfnam) istatus = 1 WRITE(6,*) "INCCREAD: calling arpsstop" CALL arpsstop('arpsstop called from INCREAD error reading incr & & output file.',1) 900 CONTINUE IF (mp_opt > 0) incrfnam(1:256) = savename(1:256) IF (incrfmt == 1) THEN CLOSE(nchinc) ELSE CALL hdfclose(sd_id,istat) DEALLOCATE (itmp,stat=istat) DEALLOCATE (hmax,stat=istat) DEALLOCATE (hmin,stat=istat) END IF RETURN END SUBROUTINE incrread !################################################################## !################################################################## !###### ###### !###### SUBROUTINE INCRREADSPLIT ###### !###### ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma. ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE incrreadsplit(nxndg,nyndg,nzndg,incrfnam, & 1,118 uincr,vincr,wincr,pincr,ptincr,qvincr, & qcincr,qrincr,qiincr,qsincr,qhincr, & istatus) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Read and split analysis increments from a file for use in continuous ! adjustment process. This subroutine is for mpi runs and it is base ! on subroutine incrread. ! !----------------------------------------------------------------------- ! ! AUTHOR: Yunheng Wang ! November 2002 ! ! MODIFICATION HISTORY: ! !----------------------------------------------------------------------- ! ! INPUT : ! ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nxndg,nyndg,nzndg CHARACTER (LEN=256) :: 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 INTEGER :: nxndglg, nyndglg REAL, ALLOCATABLE :: var3din(:,:,:) ! !----------------------------------------------------------------------- ! ! Include files ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'grid.inc' ! Grid & map parameters. INCLUDE 'mp.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! nxndglg = (nxndg-3)*nproc_x+3 nyndglg = (nyndg-3)*nproc_y+3 ALLOCATE(var3din(nxndglg,nyndglg,nzndg),stat=istat) IF (incrfmt == 3) THEN ALLOCATE (itmp(nxndglg,nyndglg,nzndg),stat=istat) IF (istat /= 0) THEN WRITE (6,*) "INCRREADSPLIT: ERROR allocating itmp, returning" ierr = 1 RETURN END IF ALLOCATE (hmax(nzndg),stat=istat) IF (istat /= 0) THEN WRITE (6,*) "INCRREADSPLIT: ERROR allocating hmax, returning" ierr = 1 RETURN END IF ALLOCATE (hmin(nzndg),stat=istat) IF (istat /= 0) THEN WRITE (6,*) "INCRREADSPLIT: ERROR allocating hmin, returning" ierr = 1 RETURN END IF END IF ! !----------------------------------------------------------------------- ! ! Get unit number and open file ! !----------------------------------------------------------------------- ! IF (incrfmt == 1) THEN !----------------------------------------------------------------------- ! ! Fortran unformatted dump. ! !----------------------------------------------------------------------- IF (myproc == 0) THEN 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 END IF ! CALL mpupdatei(nxin,1) ! need to check nxin, and nyin ! CALL mpupdatei(nyin,1) ! to do later -- WYH. CALL mpupdatec(runnamin,80) CALL mpupdatei(i4timein,1) CALL mpupdatei(iyr,1) CALL mpupdatei(imon,1) CALL mpupdatei(idy,1) CALL mpupdatei(ihr,1) CALL mpupdatei(imin,1) CALL mpupdatei(isec,1) CALL mpupdatei(maprojin,1) CALL mpupdater(trlat1in,1) CALL mpupdater(trlat2in,1) CALL mpupdater(trlonin,1) CALL mpupdater(sclfctin,1) CALL mpupdater(ctrlatin,1) CALL mpupdater(ctrlonin,1) CALL mpupdater(ustor,1) CALL mpupdater(vstor,1) CALL mpupdater(wstor,1) CALL mpupdater(pstor,1) CALL mpupdater(ptstor,1) CALL mpupdater(qvstor,1) CALL mpupdater(qcstor,1) CALL mpupdater(qrstor,1) CALL mpupdater(qistor,1) CALL mpupdater(qsstor,1) CALL mpupdater(qhstor,1) IF(ustor > 0) THEN IF(myproc ==0) THEN READ(nchinc,ERR=950) varin WRITE(6,'(a,a,a)') 'Reading ',varin,' into u-increment field' READ(nchinc,ERR=950) var3din END IF CALL mpisplit3d(var3din,nxndg,nyndg,nzndg,uincr) END IF IF(vstor > 0) THEN IF(myproc ==0) THEN READ(nchinc,ERR=950) varin WRITE(6,'(a,a,a)') 'Reading ',varin,' into v-increment field' READ(nchinc,ERR=950) var3din END IF CALL mpisplit3d(var3din,nxndg,nyndg,nzndg,vincr) END IF IF(wstor > 0) THEN IF(myproc ==0) THEN READ(nchinc,ERR=950) varin WRITE(6,'(a,a,a)') 'Reading ',varin,' into w-increment field' READ(nchinc,ERR=950) var3din END IF CALL mpisplit3d(var3din,nxndg,nyndg,nzndg,wincr) END IF IF(pstor > 0) THEN IF(myproc ==0) THEN READ(nchinc,ERR=950) varin WRITE(6,'(a,a,a)') 'Reading ',varin,' into p-increment field' READ(nchinc,ERR=950) var3din END IF CALL mpisplit3d(var3din,nxndg,nyndg,nzndg,pincr) END IF IF(ptstor > 0) THEN IF(myproc ==0) THEN READ(nchinc,ERR=950) varin WRITE(6,'(a,a,a)') 'Reading ',varin,' into pt-increment field' READ(nchinc,ERR=950) var3din END IF CALL mpisplit3d(var3din,nxndg,nyndg,nzndg,ptincr) END IF IF(qvstor > 0) THEN IF(myproc ==0) THEN READ(nchinc,ERR=950) varin WRITE(6,'(a,a,a)') 'Reading ',varin,' into qv-increment field' READ(nchinc,ERR=950) var3din END IF CALL mpisplit3d(var3din,nxndg,nyndg,nzndg,qvincr) END IF IF(qcstor > 0) THEN IF(myproc ==0) THEN READ(nchinc,ERR=950) varin WRITE(6,'(a,a,a)') 'Reading ',varin,' into qc-increment field' READ(nchinc,ERR=950) var3din END IF CALL mpisplit3d(var3din,nxndg,nyndg,nzndg,qcincr) END IF IF(qrstor > 0) THEN IF(myproc ==0) THEN READ(nchinc,ERR=950) varin WRITE(6,'(a,a,a)') 'Reading ',varin,' into qr-increment field' READ(nchinc,ERR=950) var3din END IF CALL mpisplit3d(var3din,nxndg,nyndg,nzndg,qrincr) END IF IF(qistor > 0) THEN IF(myproc ==0) THEN READ(nchinc,ERR=950) varin WRITE(6,'(a,a,a)') 'Reading ',varin,' into qi-increment field' READ(nchinc,ERR=950) var3din END IF CALL mpisplit3d(var3din,nxndg,nyndg,nzndg,qiincr) END IF IF(qsstor > 0) THEN IF(myproc ==0) THEN READ(nchinc,ERR=950) varin WRITE(6,'(a,a,a)') 'Reading ',varin,' into qs-increment field' READ(nchinc,ERR=950) var3din END IF CALL mpisplit3d(var3din,nxndg,nyndg,nzndg,qsincr) END IF IF(qhstor > 0) THEN IF(myproc ==0) THEN READ(nchinc,ERR=950) varin WRITE(6,'(a,a,a)') 'Reading ',varin,' into qh-increment field' READ(nchinc,ERR=950) var3din END IF CALL mpisplit3d(var3din,nxndg,nyndg,nzndg,qhincr) END IF ELSE IF (incrfmt == 3) THEN !----------------------------------------------------------------------- ! ! HDF4 format. ! !----------------------------------------------------------------------- IF(myproc ==0) THEN CALL hdfopen(trim(incrfnam), 1, sd_id) IF (sd_id < 0) THEN WRITE (6,*) "INCRREADSPLIT: 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) END IF CALL mpupdatei(i4timein,1) CALL mpupdatei(iyr,1) CALL mpupdatei(imon,1) CALL mpupdatei(idy,1) CALL mpupdatei(ihr,1) CALL mpupdatei(imin,1) CALL mpupdatei(isec,1) CALL mpupdater(dxin,1) CALL mpupdater(dyin,1) CALL mpupdater(dzin,1) CALL mpupdater(dzminin,1) CALL mpupdatei(strhoptin,1) CALL mpupdater(zrefsfcin,1) CALL mpupdater(dlayer1in,1) CALL mpupdater(dlayer2in,1) CALL mpupdater(zflatin,1) CALL mpupdater(strhtunein,1) CALL mpupdatei(maprojin,1) CALL mpupdater(trlat1in,1) CALL mpupdater(trlat2in,1) CALL mpupdater(trlonin,1) CALL mpupdater(sclfctin,1) CALL mpupdater(ctrlatin,1) CALL mpupdater(ctrlonin,1) 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,*) "INCRREADSPLIT: ERROR, grid parameter mismatch" istatus = 1 GO TO 900 END IF IF(myproc == 0) THEN CALL hdfrd3d(sd_id,"uincr",nxndglg,nyndglg,nzndg,var3din, & istat,itmp,hmax,hmin) IF (istat > 1) GO TO 950 END IF CALL mpisplit3d(var3din,nxndg,nyndg,nzndg,uincr) IF(myproc == 0) THEN CALL hdfrd3d(sd_id,"vincr",nxndglg,nyndglg,nzndg,var3din, & istat,itmp,hmax,hmin) IF (istat > 1) GO TO 950 END IF CALL mpisplit3d(var3din,nxndg,nyndg,nzndg,vincr) IF(myproc == 0) THEN CALL hdfrd3d(sd_id,"wincr",nxndglg,nyndglg,nzndg,var3din, & istat,itmp,hmax,hmin) IF (istat > 1) GO TO 950 END IF CALL mpisplit3d(var3din,nxndg,nyndg,nzndg,wincr) IF(myproc == 0) THEN CALL hdfrd3d(sd_id,"pincr",nxndglg,nyndglg,nzndg,var3din, & istat,itmp,hmax,hmin) IF (istat > 1) GO TO 950 END IF CALL mpisplit3d(var3din,nxndg,nyndg,nzndg,pincr) IF(myproc == 0) THEN CALL hdfrd3d(sd_id,"ptincr",nxndglg,nyndglg,nzndg,var3din, & istat,itmp,hmax,hmin) IF (istat > 1) GO TO 950 END IF CALL mpisplit3d(var3din,nxndg,nyndg,nzndg,ptincr) IF(myproc == 0) THEN CALL hdfrd3d(sd_id,"qvincr",nxndglg,nyndglg,nzndg,var3din, & istat,itmp,hmax,hmin) IF (istat > 1) GO TO 950 END IF CALL mpisplit3d(var3din,nxndg,nyndg,nzndg,qvincr) IF(myproc == 0) THEN CALL hdfrd3d(sd_id,"qcincr",nxndglg,nyndglg,nzndg,var3din, & istat,itmp,hmax,hmin) IF (istat > 1) GO TO 950 END IF CALL mpisplit3d(var3din,nxndg,nyndg,nzndg,qcincr) IF(myproc == 0) THEN CALL hdfrd3d(sd_id,"qrincr",nxndglg,nyndglg,nzndg,var3din, & istat,itmp,hmax,hmin) IF (istat > 1) GO TO 950 END IF CALL mpisplit3d(var3din,nxndg,nyndg,nzndg,qrincr) IF(myproc == 0) THEN CALL hdfrd3d(sd_id,"qiincr",nxndglg,nyndglg,nzndg,var3din, & istat,itmp,hmax,hmin) IF (istat > 1) GO TO 950 END IF CALL mpisplit3d(var3din,nxndg,nyndg,nzndg,qiincr) IF(myproc == 0) THEN CALL hdfrd3d(sd_id,"qsincr",nxndglg,nyndglg,nzndg,var3din, & istat,itmp,hmax,hmin) IF (istat > 1) GO TO 950 END IF CALL mpisplit3d(var3din,nxndg,nyndg,nzndg,qsincr) IF(myproc == 0) THEN CALL hdfrd3d(sd_id,"qhincr",nxndglg,nyndglg,nzndg,var3din, & istat,itmp,hmax,hmin) IF (istat > 1) GO TO 950 END IF CALL mpisplit3d(var3din,nxndg,nyndg,nzndg,qhincr) ELSE ! alternate data format ... WRITE(6,*) 'The supported Increment data format are ', & 'binary (incrfmt=1) and HDF4 no compressed (incrfmt = 3).' CALL arpsstop('Increment data format is not supported.',1) END IF IF(myproc ==0) WRITE(6,'(/a,a/)') & ' Successfully read analysis incr file: ',incrfnam istatus=0 GO TO 900 950 CONTINUE WRITE(6,'(/a,a/)') & 'INCRREADSPLIT: Error reading analysis incr output file: ', & trim(incrfnam) istatus = 1 WRITE(6,*) "INCRREADSPLIT: calling arpsstop" CALL arpsstop('arpsstop called from INCREAD error reading incr & & output file.',1) 900 CONTINUE IF(myproc == 0) THEN IF (incrfmt == 1) THEN CLOSE(nchinc) ELSE CALL hdfclose(sd_id,istat) END IF END IF DEALLOCATE (var3din, stat=istat) IF (incrfmt == 3) THEN DEALLOCATE (itmp,stat=istat) DEALLOCATE (hmax,stat=istat) DEALLOCATE (hmin,stat=istat) END IF RETURN END SUBROUTINE incrreadsplit !################################################################## !################################################################## !###### ###### !###### 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