!/ ------------------------------------------------------------------- / PROGRAM NWW3GFS !/ !$$$ MAIN PROGRAM DOCUMENTATION BLOCK ! . . . . ! MAIN PROGRAM: NWW3GFS UNPACK WIND FIELDS ! PRGMMR: HENDRIK ORG: NP21 DATE: 2005-04-20 ! ! ABSTRACT: UNPACK SPECTRAL WIND FILES TO OBTAIN 10m WIND SPEEDS AND ! AIR-SEA TEMPERATURE DIFFERENCE BETWEEN LOWEST LEVEL AND PROVIDED ! SST ! ! PROGRAM HISTORY LOG: ! 98-10-28 H.L. TOLMAN ORIGINATION ! 98-11-05 H.S. CHEN ADD DOCBLOK AND OTHER NCO COMPLIANCE ISSUES ! H.L. TOLMAN ! 99-04-28 H.L. TOLMAN 4 DIGIT YEAR IN NAMES, SKIP OVER MISSING ! FILES. ! 02-04-01 H.L. TOLMAN PREPARE FOR T254L64. ! 05-04-20 H.L. TOLMAN PREPARE FOR T382L64. ! 06-01-03 D CAO TRANSFER FROM F77 TO F90 ! ! USAGE: ! INPUT FILES: ! UNIT 05 - FIRST AND LAST TIME OF FIELDS TO BE PROCESSED ! UNIT 11 - SINGLE UNFORMATTED SST FIELD (sst.ww3) ON THE OUTPUT ! GRID ! UNIT 12 - SPECTRAL DATA FILES FROM GDAS, GFS OR MRF. FOR EACH ! - TIME STEP A SEPARATE FILE IS ATTACHED TO THIS UNIT ! - NUMBER BY OPENING IT BY NAME (swnd.yymmddhh). THE ! - NUMBER OF FILES TO BE READ HERE MAY BE AS LARGE AS ! - 85 FOR A 10 DAY WAVE FORECAST WITH WIND FIELDS AT 3 ! - HOUR INTERVALS. THEREFORE, A SEPARATE UNIT NUMBER ! - CANNOT BE ASSIGNED TO EACH INDIVIDUAL FILE. NOTE ! - THAT THE DIAGNOSTIC OUTPUT OF THE CODE SHOWS THE NAME ! - OF THE FILE CURRENTLY BEING READ, AND THAT ALL ! - POSSIBLE OPEN AND READ ERRORS ARE CAPTURED IN THE ! - CODE AND WILL RESULT IN AN ERROR MESSAGE AND CODE ! - ABORT. ALL POSSIBLE IO ERRORS TO THESE FILES CAN ! - THEREFORE BE TRACED TRANSPARENTLY TO THE ACTUAL FILE. ! ! OUTPUT FILES: (INCLUDING SCRATCH FILES) ! UNIT 51 - OUTPUT FILE WITH ALL WIND SPEED COMPONENTS AND WITH ! - ALL AIR-SEA TEMPERATURE DIFFERENCES. ! ! SUBPROGRAMS CALLED: (LIST ALL CALLED FROM ANYWHERE IN CODES) ! UNIQUE: - TICK21 IYMD21 MYMD21 DSEC21 CONVRT ! LIBRARY: ! W3LIB - W3TAGB W3TAGE ! SPLIB - SPTEZV SPTEZ ! ! EXIT STATES: ! COND = 0 - SUCCESSFUL RUN ! = N - ABORT, SEE DIAGNOSTIC OUTPUT ! ! REMARKS: MAXIMUM SPECTRAL RESOLUTION AND NUMBER OF LEVELS IS ! PRESENTLY HARDWIRED. THE LATTER IS NEEDED TO ESTIMATE THE ! ACTUAL HEIGHT OF THE LOWEST LEVEL (UM). ! - INTERVAL BETWEEN WIND FIELDS HADWIRED AT 3 HOURS. ! ! ATTRIBUTES: ! LANGUAGE: FORTRAN 90 ! MACHINE: CRAY C90 ! !$$$ !/ !/ +-----------------------------------+ !/ | WAVEWATCH-III NOAA/NMC | !/ | H. L. Tolman | !/ | FORTRAN 77 | !/ | Last update : 20-Apr-2005 | !/ +-----------------------------------+ !/ ! 1. Purpose : ! ! Extract lowest sigma level winds and temperatures from spectral ! GDAS and GFS files. ! ! 2. Method : ! ! Spectral coefficients read from unit 12, fields written to ! unit 51, time range obtained from standard input. ! SST field is read form unit 11, file sst.ww3. ! ! Unpacking with SPTEZ(V). ! ! 3. Parameters : ! ! Variables set in parameter statements. ! ---------------------------------------------------------------- ! KMAX Int. Number of levels in gfs model. ! WAVMX Int. Number of spectral components in gfs model. ! IDIML Int. Dimension of regular long-lat grid. ! JDIML Int. (Full globe with both poles) ! JCLIP Int. Number of top and bottom latitudes not stored. ! ---------------------------------------------------------------- ! ! 4. Subroutines used : ! ! 5. Called by : ! ! None (main program). ! ! 6. Error messages : ! ! Check on time and array dimensions. ! ! 7. Remarks : ! ! 8. Structure : ! ! See source code. ! ! 9. Switches : ! ! None. ! ! 10. Source code : ! ! ---------------------------------------------------------------------- ! ! Declarations ! INTEGER :: IDIML, JDIML, JCLIP ! INTEGER,DIMENSION(4) :: IDATE INTEGER,DIMENSION(2) :: TIME, TEND, TTST INTEGER :: KMAX, KMAXP, IY, IM, ID, IS, IFT, NM, IMAX INTEGER :: JMAX, MAXWV, MWVE, MWVE2, I, J, IJMAX, IJ0, IJN,IJ REAL,DIMENSION(245) :: EXT REAL :: FHOUR, FDSEC, DTTST, FAC REAL :: USIG, U10, UMIN, UMAX, TMIN, TMAX CHARACTER(LEN=15) :: NAMEI, NAMEO CHARACTER(LEN=10) :: TID ! REAL,ALLOCATABLE :: G0WV(:), PSWV(:), WAVDUM(:), WAVET(:) REAL,ALLOCATABLE :: WAVE(:), WAVE2(:), WAVEQ(:), UU(:), VV(:) REAL,ALLOCATABLE :: T1(:), Q(:), SSTXY(:,:), SST1(:) ! ! CALL W3TAGB('NWW3GFS ',1998,0327,0092,'NP21 ') ! ! 1. Initializations ------------------------------------------------- ! 1.a DATA statements ! DATA DTTST / 21600. / ! ! 1.b Parameters ! READ (*,*) IDIML, JDIML, JCLIP ! IMAX = IDIML JMAX = JDIML IJMAX = IMAX * JMAX IJ0 = 1 + JCLIP*IMAX IJN = IJMAX - JCLIP*IMAX ! ALLOCATE ( UU(IJMAX), VV(IJMAX), T1(IJMAX), Q(IJMAX), & SSTXY(IDIML,JDIML), SST1(IJMAX) ) ! ! 1.c Time range ! WRITE (*,900) IDIML, JDIML, JCLIP ! READ (*,*) TIME, TEND WRITE (*,901) TIME(1), TIME(2)/10000, TEND(1), TEND(2)/10000 ! ! 1.d File info ! NAMEI = 'swnd.yyyymmddhh' ! NAMEO = 'gwnd.yyyymmddhh' ! NAMEO = 'gfs.wind' OPEN (51,FILE=NAMEO,FORM='UNFORMATTED') REWIND (51) ! ! 1.e Read SST file ! OPEN (11,FILE='sst.ww3',FORM='UNFORMATTED') READ (11) ((SSTXY(I,J),I=1,IDIML),J=JDIML-JCLIP,1+JCLIP,-1) CLOSE (11) DO J=1,JDIML DO I=1,IDIML IJ=I+(J-1)*IDIML SST1(IJ)=SSTXY(I,J) ENDDO ENDDO ! ! 2. Loop over files ================================================== ! 200 CONTINUE ! ! 2.a Open file ! WRITE (TID,'(I8.8,I2.2)') TIME(1), TIME(2)/10000 NAMEI(6:15) = TID ! NAMEO(6:13) = TID OPEN (12,FILE=NAMEI,FORM='UNFORMATTED') ! OPEN (51,FILE=NAMEO,FORM='UNFORMATTED') REWIND (12) ! REWIND (51) ! WRITE (*,920) NAMEI, NAMEO ! READ (12,END=750,ERR=750,IOSTAT=IERR) ! ! 2.b Read header data ! READ(12,END=800,ERR=801,IOSTAT=IERR) FHOUR, IDATE, EXT ! IFT = FHOUR ! IY = IDATE(4) IF ( IY .LT. 100 ) IY = IY + 1900 IM = IDATE(2) ID = IDATE(3) IH = IDATE(1) NRES = EXT(202) NLEV = EXT(203) ! TTST(1) = IY*10000 + IM*100 + ID TTST(2) = IH*10000 FDSEC = FHOUR * 3600. CALL TICK21 ( TTST , FDSEC ) ! KMAX = NLEV KMAXP = KMAX+1 MAXWV = NRES MWVE = (MAXWV+1)*(MAXWV+2)/2 MWVE2 = MWVE*2 ! IF ( ALLOCATED (G0WV) ) & DEALLOCATE ( G0WV, PSWV, WAVDUM, WAVET, WAVE, WAVE2, WAVEQ ) ALLOCATE ( G0WV(MWVE2), PSWV(MWVE2), WAVDUM(MWVE2), WAVET(MWVE2), & WAVE(MWVE2), WAVE2(MWVE2), WAVEQ(MWVE2) ) ! WRITE (*,922) IY, IM, ID, IH, IFT, TTST(1), TTST(2)/100 WRITE (*,923) NRES, NLEV ! UM = -1. IF ( NLEV .LE. 28 ) UM = 35. IF ( NLEV .EQ. 42 ) UM = 30. IF ( NLEV .EQ. 64 ) UM = 22. IF ( UM .LT. 0. ) GOTO 820 ! IF ( TIME(1).NE.TTST(1) .OR. TIME(2).NE.TTST(2) ) GOTO 810 ! ! 3. Orography (no processing) ---------------------------------------- ! READ (12,END=800,ERR=801,IOSTAT=IERR) (G0WV(NM),NM=1,MWVE2) ! WRITE (*,925) ! ! 4. Surface pressure (no processing) --------------------------------- ! READ (12,END=800,ERR=801,IOSTAT=IERR) (PSWV(NM),NM=1,MWVE2) ! WRITE (*,926) ! ! 5. Read all spectral coefficients (only level 1 saved) -------------- ! (early read stop) ! READ (12,END=800,ERR=801,IOSTAT=IERR) (WAVET(NM),NM=1,MWVE2) ! DO 500 K=2,KMAX READ (12) (WAVDUM(NM),NM=1,MWVE2) 500 CONTINUE ! READ (12,END=800,ERR=801,IOSTAT=IERR) (WAVE (NM),NM=1,MWVE2) READ (12,END=800,ERR=801,IOSTAT=IERR) (WAVE2(NM),NM=1,MWVE2) ! DO 510 K=2,KMAX READ (12) (WAVDUM(NM),NM=1,MWVE2) READ (12) (WAVDUM(NM),NM=1,MWVE2) 510 CONTINUE ! READ (12,END=800,ERR=801,IOSTAT=IERR) (WAVEQ(NM),NM=1,MWVE2) CLOSE (12) ! ! WRITE (*,927) WAVET(1), WAVE(1), WAVE2(1), WAVEQ(1) ! ! 6. From coefficients to level 1 data -------------------------------- ! 6.a Winds ! CALL SPTEZV ( 0, MAXWV, 0, IDIML,JDIML, WAVE,WAVE2, UU,VV, 1 ) ! ! 6.b DT, conversion, minima and maxima ! CALL SPTEZ ( 0, MAXWV, 0, IDIML, JDIML, WAVET, T1, 1 ) CALL SPTEZ ( 0, MAXWV, 0, IDIML, JDIML, WAVEQ, Q , 1 ) ! UMIN = 100. UMAX = 0. TMIN = 546. TMAX = 0. ! DO 620, I=IJ0, IJN USIG = SQRT ( UU(I)**2 + VV(I)**2 ) IF ( USIG .GT. 0.01 ) THEN UU(I) = UU(I) / USIG VV(I) = VV(I) / USIG CALL CONVRT ( UM, USIG, U10 ) UU(I) = UU(I) * U10 VV(I) = VV(I) * U10 ENDIF UMAX = MAX ( UMAX , USIG ) UMIN = MIN ( UMIN , USIG ) T1(I) = T1(I) / ( 1. + 0.61 * Q(I) ) - 273.15 TMIN = MIN ( TMIN , T1(I) ) TMAX = MAX ( TMAX , T1(I) ) T1(I) = T1(I) - SST1(I) 620 CONTINUE ! WRITE (*,928) UMIN, UMAX, TMIN, TMAX ! ! 7. Make archieve file ----------------------------------------------- ! WRITE (51) TIME WRITE (51) (UU(I),I=IJ0,IJN) WRITE (51) (VV(I),I=IJ0,IJN) WRITE (51) (T1(I),I=IJ0,IJN) ! CLOSE (51) ! ! Test output ! ! WRITE (*,970) 'WIND SPEEDS' ! FAC = 10. / (UMAX-UMIN) ! DO 700, I=2, IMAX, 2 ! IF ( MOD(I,10) .EQ. 0 ) THEN ! WRITE (*,971) I, ( ( NINT ( FAC * ! & ( SQRT(UU(I+(J-1)*IMAX)**2+VV(I+(J-1)*IMAX)**2) ! & - UMIN ) ) ), J=JMAX-JCLIP-1, JCLIP+1, -2 ) ! ELSE ! WRITE (*,972) ( ( NINT ( FAC * ! & ( SQRT(UU(I+(J-1)*IMAX)**2+VV(I+(J-1)*IMAX)**2) ! & - UMIN ) ) ), J=JMAX-JCLIP-1, JCLIP+1, -2 ) ! ENDIF ! 700 CONTINUE ! ! WRITE (*,970) 'TEMPERATURE' ! FAC = 10. / (TMAX-TMIN) ! DO 710, I=2, IMAX, 2 ! IF ( MOD(I,10) .EQ. 0 ) THEN ! WRITE (*,971) I, ( ( NINT ( FAC * ( T1(I+(J-1)*IMAX) ! & - TMIN ) ) ), J=JMAX-JCLIP-1, JCLIP+1, -2 ) ! ELSE ! WRITE (*,972) ( ( NINT ( FAC * ( T1(I+(J-1)*IMAX) ! & - TMIN ) ) ), J=JMAX-JCLIP-1, JCLIP+1, -2 ) ! ENDIF ! 710 CONTINUE ! ! STOP ! ! 8. Branching back if necessary -------------------------------------- ! 750 CONTINUE CALL TICK21 ( TIME, 10800. ) IF ( DSEC21(TIME,TEND) .GE. 0. ) GOTO 200 ! ! ... End of loop over files =========================================== ! WRITE (*,999) GOTO 888 ! ! ERROR eccape locations ! 800 CONTINUE WRITE (*,1000) IERR CALL EXIT ( 1 ) ! 801 CONTINUE WRITE (*,1001) IERR CALL EXIT ( 2 ) ! 810 CONTINUE WRITE (*,1010) TIME, TTST CALL EXIT ( 10 ) ! 820 CONTINUE WRITE (*,1020) NLEV CALL EXIT ( 20 ) ! 888 CONTINUE ! CALL W3TAGE('NWW3GFS ') ! ! Formats ! 900 FORMAT (/' EXTRACTING U, V AND T FROM SPECTRAL FILES'/ & ' ========================================='// & ' OUTPUT GRID : ',3I6) 901 FORMAT ( ' STARTING TIME : ',I8.8,I3.2,'Z'/ & ' ENDING TIME : ',I8.8,I3.2,'Z'/) ! 920 FORMAT ( ' ==> FILE ',A,' (',A,') STARTING') 922 FORMAT ( ' TIME :',I5.4,3I3.2,' FORECAST HOUR :',I4.3, & ' (',I8.8,I5.4,')') 923 FORMAT ( ' RESOLUTION : T',I3.3,' LEVELS : ',I3) 925 FORMAT ( ' OROGRAPHY READ') 926 FORMAT ( ' SURFACE PRESSURE READ') 927 FORMAT ( ' SPECTRAL COEFFICIENTS READ'/ & ' WAVET(1) = ',E12.4/ & ' WAVE (1) = ',E12.4/ & ' WAVE2(1) = ',E12.4/ & ' WAVEQ(1) = ',E12.4) 928 FORMAT ( ' FIELDS TRANSFERRED TO LL GRID'/ & ' U RANGE : ',2F7.2,' T RANGE : ',2F7.2) 950 FORMAT ( ' *** SKIPPING TIME *** ') ! 970 FORMAT (/' TEST OUTPUT : ',A/) 971 FORMAT ( 1X,I5,1X,120I1) 972 FORMAT ( 1X,5X,1X,120I1) ! 999 FORMAT (/' END OF PROGRAM '/ & ' =============='/) ! 1000 FORMAT (/' *** ERROR ***'/ & ' PREMATURE END OF INPUT FILE'/ & ' IOSTAT= ',I6/) ! 1001 FORMAT (/' *** ERROR ***'/ & ' READ ERROR IN INPUT FILE'/ & ' IOSTAT= ',I6/) ! 1010 FORMAT (/' *** ERROR ***'/ & ' UNEXPECTED TIME IN FILE '/ & ' FROM FILE : ',I8.8,I7.6/ & ' SHOULD BE : ',I8.8,I7.6/) ! 1020 FORMAT (/' *** ERROR ***'/ & ' LEVEL OF LOWEST LAYER ',I3,' LEVELS NOT DEFINED.') ! ! End of NWW3GFS ------------------------------------------------------- ! END