! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE INCRSAVE ###### !###### ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma. ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE incrsave(nx,ny,nz,nxndg,nyndg,nzndg, & 1 u,v,w,pprt,ptprt,qv, & qc,qr,qi,qs,qh, & uincr,vincr,wincr,pincr,ptincr,qvincr, & qcincr,qrincr,qiincr,qsincr,qhincr, & istatus) ! !----------------------------------------------------------------------- ! ! PURPOSE: Save the original background field in the incrememt ! arrays for later computiona of the total analysis increment. ! !----------------------------------------------------------------------- ! ! AUTHOR: Keith Brewster ! March 1998 ! ! MODIFICATION HISTORY: ! ! 07/10/2001 (K. Brewster) ! Changed to accomodate dynamically allocated increment arrays. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz INTEGER :: nxndg,nyndg,nzndg ! REAL :: u(nx,ny,nz) REAL :: v(nx,ny,nz) REAL :: w(nx,ny,nz) REAL :: pprt(nx,ny,nz) REAL :: ptprt(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 :: uincr(nxndg,nyndg,nzndg) REAL :: vincr(nxndg,nyndg,nzndg) REAL :: wincr(nxndg,nyndg,nzndg) REAL :: pincr(nxndg,nyndg,nzndg) REAL :: ptincr(nxndg,nyndg,nzndg) REAL :: qvincr(nxndg,nyndg,nzndg) REAL :: qcincr(nxndg,nyndg,nzndg) REAL :: qrincr(nxndg,nyndg,nzndg) REAL :: qiincr(nxndg,nyndg,nzndg) REAL :: qsincr(nxndg,nyndg,nzndg) REAL :: qhincr(nxndg,nyndg,nzndg) INTEGER :: istatus ! !----------------------------------------------------------------------- ! ! Misc local variables ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! DO k=1,nzndg DO j=1,nyndg DO i=1,nxndg uincr(i,j,k) = u(i,j,k) vincr(i,j,k) = v(i,j,k) wincr(i,j,k) = w(i,j,k) pincr(i,j,k) = pprt(i,j,k) ptincr(i,j,k)=ptprt(i,j,k) qvincr(i,j,k)= qv(i,j,k) qcincr(i,j,k)= qc(i,j,k) qrincr(i,j,k)= qr(i,j,k) qiincr(i,j,k)= qi(i,j,k) qsincr(i,j,k)= qs(i,j,k) qhincr(i,j,k)= qh(i,j,k) END DO END DO END DO RETURN END SUBROUTINE incrsave ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE INCRCALC ###### !###### ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma. ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE incrcalc(nx,ny,nz,nxndg,nyndg,nzndg, & 1 u,v,w,pprt,ptprt,qv, & qc,qr,qi,qs,qh, & uincr,vincr,wincr,pincr,ptincr,qvincr, & qcincr,qrincr,qiincr,qsincr,qhincr, & istatus) ! !----------------------------------------------------------------------- ! ! PURPOSE: Calculate total analysis increment by subtracting ! the analyzed fields from the original background fields which ! were temporarily held in the incr arrays. ! !----------------------------------------------------------------------- ! ! AUTHOR: Keith Brewster ! March 1998 ! ! MODIFICATION HISTORY: ! ! 07/10/2001 (K. Brewster) ! Changed to accomodate dynamically allocated increment arrays. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz INTEGER :: nxndg,nyndg,nzndg ! REAL :: u(nx,ny,nz) REAL :: v(nx,ny,nz) REAL :: w(nx,ny,nz) REAL :: pprt(nx,ny,nz) REAL :: ptprt(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 :: uincr(nxndg,nyndg,nzndg) REAL :: vincr(nxndg,nyndg,nzndg) REAL :: wincr(nxndg,nyndg,nzndg) REAL :: pincr(nxndg,nyndg,nzndg) REAL :: ptincr(nxndg,nyndg,nzndg) REAL :: qvincr(nxndg,nyndg,nzndg) REAL :: qcincr(nxndg,nyndg,nzndg) REAL :: qrincr(nxndg,nyndg,nzndg) REAL :: qiincr(nxndg,nyndg,nzndg) REAL :: qsincr(nxndg,nyndg,nzndg) REAL :: qhincr(nxndg,nyndg,nzndg) INTEGER :: istatus ! !----------------------------------------------------------------------- ! ! Misc local variables ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! DO k=1,nzndg DO j=1,nyndg DO i=1,nxndg uincr(i,j,k) = u(i,j,k)- uincr(i,j,k) vincr(i,j,k) = v(i,j,k)- vincr(i,j,k) wincr(i,j,k) = w(i,j,k)- wincr(i,j,k) pincr(i,j,k) = pprt(i,j,k)- pincr(i,j,k) ptincr(i,j,k)=ptprt(i,j,k)-ptincr(i,j,k) qvincr(i,j,k)= qv(i,j,k)-qvincr(i,j,k) qcincr(i,j,k)= qc(i,j,k)-qcincr(i,j,k) qrincr(i,j,k)= qr(i,j,k)-qrincr(i,j,k) qiincr(i,j,k)= qi(i,j,k)-qiincr(i,j,k) qsincr(i,j,k)= qs(i,j,k)-qsincr(i,j,k) qhincr(i,j,k)= qh(i,j,k)-qhincr(i,j,k) END DO END DO END DO RETURN END SUBROUTINE incrcalc ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE INCRDUMP ###### !###### ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma. ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE incrdump(nxndg,nyndg,nzndg,incrdmp,incrfnam, & 1,45 uincr,vincr,wincr,pincr,ptincr,qvincr, & qcincr,qrincr,qiincr,qsincr,qhincr, & uincdmp,vincdmp,wincdmp, & pincdmp,ptincdmp,qvincdmp, & qcincdmp,qrincdmp,qiincdmp,qsincdmp,qhincdmp, & istatus) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Write analysis increments shift vectors to a file for use in ! Newtonian nudging assimilation. ! !----------------------------------------------------------------------- ! ! AUTHOR: Keith Brewster ! March, 1998 ! !----------------------------------------------------------------------- ! ! INPUT : ! ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nxndg,nyndg,nzndg INTEGER :: incrdmp ! Option to write ADAS analysis increments ! to a file ! = 0, Don't create increment file; ! = 1, write increment file ! (unformatted IEEE binary); ! = 2, write HDF uncompressed format ! increment file; ! = 3, write HDF format increment file using ! hdfcompr for compression option; ! = 4, write HDF gzip format increment file. CHARACTER (LEN=132) :: incrfnam REAL :: uincr(nxndg,nyndg,nzndg) REAL :: vincr(nxndg,nyndg,nzndg) REAL :: wincr(nxndg,nyndg,nzndg) REAL :: pincr(nxndg,nyndg,nzndg) REAL :: ptincr(nxndg,nyndg,nzndg) REAL :: qvincr(nxndg,nyndg,nzndg) REAL :: qcincr(nxndg,nyndg,nzndg) REAL :: qrincr(nxndg,nyndg,nzndg) REAL :: qiincr(nxndg,nyndg,nzndg) REAL :: qsincr(nxndg,nyndg,nzndg) REAL :: qhincr(nxndg,nyndg,nzndg) ! INTEGER :: uincdmp,vincdmp,wincdmp,pincdmp,ptincdmp,qvincdmp, & qcincdmp,qrincdmp,qiincdmp,qsincdmp,qhincdmp ! INTEGER :: istatus ! !----------------------------------------------------------------------- ! ! Misc local variables ! !----------------------------------------------------------------------- ! INTEGER :: i4time INTEGER :: nchinc,ierr INTEGER(2), allocatable :: itmp(:,:,:) ! Temporary array REAL, allocatable :: hmax(:), hmin(:) ! Temporary array INTEGER :: incrcompr INTEGER :: sd_id, stat !----------------------------------------------------------------------- ! ! Include files ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'grid.inc' ! Grid parameters ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IF (incrdmp == 0) RETURN IF (incrdmp == 2) THEN incrcompr = hdfcompr ELSE IF (incrdmp == 3) THEN incrcompr = 5 ELSE incrcompr = 0 END IF IF (incrcompr > 3) THEN allocate (itmp(nxndg,nyndg,nzndg),stat=stat) IF (stat /= 0) THEN WRITE (6,*) "INCRDUMP: ERROR allocating itmp, returning" RETURN END IF allocate (hmax(nzndg),stat=stat) IF (stat /= 0) THEN WRITE (6,*) "INCRDUMP: ERROR allocating hmax, returning" RETURN END IF allocate (hmin(nzndg),stat=stat) IF (stat /= 0) THEN WRITE (6,*) "INCRDUMP: ERROR allocating hmin, returning" RETURN END IF END IF !----------------------------------------------------------------------- ! ! Write out in Fortran unformatted. ! !----------------------------------------------------------------------- IF (incrdmp == 1) 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='unknown') GO TO 900 950 CONTINUE WRITE(6,'(/a,a,a/)') & 'INCRDUMP: Error opening analysis increment output file: ', & trim(incrfnam),'. No file was written.' istatus = -1 RETURN 900 CONTINUE ! CALL ctim2abss( year,month,day,hour,minute,second, i4time) WRITE(nchinc) runname,nxndg,nyndg,nzndg,i4time, & year,month,day,hour,minute,second ! WRITE(nchinc) mapproj,trulat1,trulat2,trulon, & sclfct,ctrlat,ctrlon ! WRITE(nchinc) uincdmp,vincdmp,wincdmp,pincdmp,ptincdmp,qvincdmp, & qcincdmp,qrincdmp,qiincdmp,qsincdmp,qhincdmp ! IF(uincdmp > 0) THEN WRITE(nchinc) 'uinc ' WRITE(nchinc) uincr END IF IF(vincdmp > 0) THEN WRITE(nchinc) 'vinc ' WRITE(nchinc) vincr END IF IF(wincdmp > 0) THEN WRITE(nchinc) 'winc ' WRITE(nchinc) wincr END IF IF(pincdmp > 0) THEN WRITE(nchinc) 'pinc ' WRITE(nchinc) pincr END IF IF(ptincdmp > 0) THEN WRITE(nchinc) 'ptinc ' WRITE(nchinc) ptincr END IF IF(qvincdmp > 0) THEN WRITE(nchinc) 'qvinc ' WRITE(nchinc) qvincr END IF IF(qcincdmp > 0) THEN WRITE(nchinc) 'qcinc ' WRITE(nchinc) qcincr END IF IF(qrincdmp > 0) THEN WRITE(nchinc) 'qrinc ' WRITE(nchinc) qrincr END IF IF(qiincdmp > 0) THEN WRITE(nchinc) 'qiinc ' WRITE(nchinc) qiincr END IF IF(qsincdmp > 0) THEN WRITE(nchinc) 'qsinc ' WRITE(nchinc) qsincr END IF IF(qhincdmp > 0) THEN WRITE(nchinc) 'qhinc ' WRITE(nchinc) qhincr END IF ! CLOSE(nchinc) CALL retunit(nchinc) !----------------------------------------------------------------------- ! ! Write out in HDF4. ! !----------------------------------------------------------------------- ELSE CALL hdfopen(trim(incrfnam), 2, sd_id) IF (sd_id < 0) THEN WRITE(6,'(/a,a,a/)') & 'INCRDUMP: Error opening analysis increment output file: ', & trim(incrfnam),'. No file was written.' istatus = -1 RETURN END IF CALL ctim2abss( year,month,day,hour,minute,second, i4time) CALL hdfwrti(sd_id, 'i4time', i4time, stat) CALL hdfwrti(sd_id, 'day', day, stat) CALL hdfwrti(sd_id, 'year', year, stat) CALL hdfwrti(sd_id, 'month', month, stat) CALL hdfwrti(sd_id, 'hour', hour, stat) CALL hdfwrti(sd_id, 'minute', minute, stat) CALL hdfwrti(sd_id, 'second', second, stat) CALL hdfwrti(sd_id, 'nx', nxndg, stat) CALL hdfwrti(sd_id, 'ny', nyndg, stat) CALL hdfwrti(sd_id, 'nz', nzndg, stat) CALL hdfwrtr(sd_id, 'dx', dx, stat) CALL hdfwrtr(sd_id, 'dy', dy, stat) CALL hdfwrtr(sd_id, 'dz', dz, stat) CALL hdfwrtr(sd_id, 'dzmin', dzmin, stat) CALL hdfwrti(sd_id, 'strhopt', strhopt, stat) CALL hdfwrtr(sd_id, 'zrefsfc', zrefsfc, stat) CALL hdfwrtr(sd_id, 'dlayer1', dlayer1, stat) CALL hdfwrtr(sd_id, 'dlayer2', dlayer2, stat) CALL hdfwrtr(sd_id, 'zflat', zflat, stat) CALL hdfwrtr(sd_id, 'strhtune', strhtune, stat) CALL hdfwrti(sd_id, 'mapproj', mapproj, stat) CALL hdfwrtr(sd_id, 'trulat1', trulat1, stat) CALL hdfwrtr(sd_id, 'trulat2', trulat2, stat) CALL hdfwrtr(sd_id, 'trulon', trulon, stat) CALL hdfwrtr(sd_id, 'sclfct', sclfct, stat) CALL hdfwrtr(sd_id, 'ctrlat', ctrlat, stat) CALL hdfwrtr(sd_id, 'ctrlon', ctrlon, stat) IF(uincdmp > 0) THEN CALL hdfwrt3d(uincr,nxndg,nyndg,nzndg,sd_id,1,incrcompr, & 'uincr','u-velocity increment','m/s', & itmp,hmax,hmin) END IF IF(vincdmp > 0) THEN CALL hdfwrt3d(vincr,nxndg,nyndg,nzndg,sd_id,1,incrcompr, & 'vincr','v-velocity increment','m/s', & itmp,hmax,hmin) END IF IF(wincdmp > 0) THEN CALL hdfwrt3d(wincr,nxndg,nyndg,nzndg,sd_id,1,incrcompr, & 'wincr','w-velocity increment','m/s', & itmp,hmax,hmin) END IF IF(pincdmp > 0) THEN CALL hdfwrt3d(pincr,nxndg,nyndg,nzndg,sd_id,1,incrcompr, & 'pincr','Pressure increment','Pascal', & itmp,hmax,hmin) END IF IF(ptincdmp > 0) THEN CALL hdfwrt3d(ptincr,nxndg,nyndg,nzndg,sd_id,1,incrcompr, & 'ptincr','Potential temperature increment','K', & itmp,hmax,hmin) END IF IF(qvincdmp > 0) THEN CALL hdfwrt3d(qvincr,nxndg,nyndg,nzndg,sd_id,1,incrcompr, & 'qvincr','Water vapor specific humidity increment','kg/kg', & itmp,hmax,hmin) END IF IF(qcincdmp > 0) THEN CALL hdfwrt3d(qcincr,nxndg,nyndg,nzndg,sd_id,1,incrcompr, & 'qcincr','Cloud water mixing ratio increment','kg/kg', & itmp,hmax,hmin) END IF IF(qrincdmp > 0) THEN CALL hdfwrt3d(qrincr,nxndg,nyndg,nzndg,sd_id,1,incrcompr, & 'qrincr','Rain water mixing ratio increment','kg/kg', & itmp,hmax,hmin) END IF IF(qiincdmp > 0) THEN CALL hdfwrt3d(qiincr,nxndg,nyndg,nzndg,sd_id,1,incrcompr, & 'qiincr','Cloud ice mixing ratio increment','kg/kg', & itmp,hmax,hmin) END IF IF(qsincdmp > 0) THEN CALL hdfwrt3d(qsincr,nxndg,nyndg,nzndg,sd_id,1,incrcompr, & 'qsincr','Snow mixing ratio increment','kg/kg', & itmp,hmax,hmin) END IF IF(qhincdmp > 0) THEN CALL hdfwrt3d(qhincr,nxndg,nyndg,nzndg,sd_id,1,incrcompr, & 'qhincr','Hail mixing ratio increment','kg/kg', & itmp,hmax,hmin) END IF CALL hdfclose(sd_id,stat) deallocate (itmp,stat=stat) deallocate (hmax,stat=stat) deallocate (hmin,stat=stat) END IF WRITE(6,'(/a,a,a/)') & 'INCRDUMP: Successfully wrote analysis incr file: ', & trim(incrfnam),'.' istatus = 0 RETURN END SUBROUTINE incrdump