PROGRAM DIFFV2 C C This program reads the MM5 version 2 modeling system outputs C And generates difference files for hmv. C C C IX : Output domain grid dimension in I direction (north-south) C JX : Output domain grid dimension in J direction (east-west) C KX : Output domain grid dimension in K direction (vertical) C PARAMETER(IX=200,JX=200,KX=40) INTEGER MIF(1000,20,2) REAL MRF(1000,20,2) CHARACTER*80 MIFC(1000,20,2),MRFC(1000,20,2) CHARACTER*8 ID CHARACTER*80 FILE1, FILE2, ARG3 DIMENSION DUM3D(IX,JX,KX+1,2),DUM2D(IX,JX,2) LOGICAL Efound LOGICAL Justplot INTEGER LEVLIM Efound = .false. Justplot = .false. LEVLIM = -1 C get arguments if ( iargc() .ge. 2 ) then call getarg(1,file1) call getarg(2,file2) ierr = 0 open(10,file=file1,status="old",form="unformatted",err=922) open(20,file=file2,status="old",form="unformatted",err=923) goto 924 922 print*,'error opening ',file1 stop C bounce here if second name is not openable -- this would mean that C it's a field name instead. 923 continue Justplot = .true. 924 continue if ( iargc() .eq. 3 ) then call getarg(3,arg3) read(arg3,*)levlim print*,'LEVLIM = ',LEVLIM endif else print*,'Usage: command file1 file2' stop endif N=0 ! time period counter 5 CONTINUE N=N+1 if ( n .gt. 10 ) then write(*,*)'Stopping after 10 frames' goto 999 endif C C MIF : Array store integer variables information C MIFC: Character array describs the MIF array C MRF : Array store real variables information C MRFC: Character array describs the MRF array C READ(10,END=999) $ ((MIF(I,J,1), I=1,1000),J=1,20), $ ((MRF(I,J,1), I=1,1000),J=1,20), $ ((MIFC(I,J,1), I=1,1000),J=1,20), $ ((MRFC(I,J,1), I=1,1000),J=1,20) IF ( .NOT. JUSTPLOT ) READ(20,END=999) $ ((MIF(I,J,2), I=1,1000),J=1,20), $ ((MRF(I,J,2), I=1,1000),J=1,20), $ ((MIFC(I,J,2), I=1,1000),J=1,20), $ ((MRFC(I,J,2), I=1,1000),J=1,20) C C get record header information C PRINT *,'MM5 version 1 record header information' PRINT *,' ' PRINT *,' ' IF ( .NOT. JUSTPLOT ) CALL GETGIST(MIF,MRF,MIFC,MRFC) PRINT *,' ' PRINT *,' ' PRINT *,' ' C C INDEX : output is generated by which program? C 1 TERRAIN C 2 DATAGRID C 3 RAWINS 3-D analysis C 4 RAWINS surface 4DDA C 5 MM5 initial condition from INTERP C 6 MM5 C 7 Interpolated model output on pressure levels from INTERP C INDEX=MIF(1,1,1) IF(INDEX.EQ.1) THEN PRINT *,'READING TERRAIN OUTPUT' ELSEIF(INDEX.EQ.2) THEN PRINT *,'READING DATAGRID OUTPUT' ELSEIF(INDEX.EQ.3) THEN PRINT *,'READING RAWINS 3-D ANALYSIS OUTPUT' ELSEIF(INDEX.EQ.4) THEN PRINT *,'READING RAWINS SURFACE 4DDA OUTPUT' ELSEIF(INDEX.EQ.5) THEN PRINT *,'READING MODEL INITIAL CONDITION' ELSEIF(INDEX.EQ.6) THEN PRINT *,'READING MM5 OUTPUT' ELSEIF(INDEX.EQ.7) THEN PRINT *,'READING INTERPOLATED MODEL OUTPUT ON P' END IF PRINT *,'DATE = ',MIF(1,INDEX,1) PRINT *,' ' PRINT *,' ' C C NUM3D : Number of 3-D fields in this output C NUM2D : Number of 2-D fields in this output C NUM1D : Number of 1-D fields in this output C NUM0D : Number of 0-D fields in this output C NUM3D = MIF(201,INDEX,1) NUM2D = MIF(202,INDEX,1) NUM1D = MIF(203,INDEX,1) NUM0D = MIF(204,INDEX,1) C C ID : Description of the 3-D fields C IDOT : Is this field defined on cross or dot points C 1 DOT POINT C 2 CROSS POINT C IL = MIF(104,1,1) JL = MIF(105,1,1) KL = MRF(101,INDEX,1) print*,"IL, JL = ",IL,JL,KL IF ( KL .LT. 0 ) THEN PRINT*,"INPUT KL" READ(*,*)KL ENDIF C IF ( JUSTPLOT ) GOTO 10000 C DO 120 IFLD=1,NUM3D IDOT=1-MIF(204+IFLD,INDEX,1)/10 ID=MIFC(204+IFLD,INDEX,1)(1:8) IF(ID.EQ.'W ' .AND. MIF( 10,1,1).EQ.2) THEN KR = KL + 1 ELSE KR = KL ENDIF READ(10) (((DUM3D(I,J,K,1),I=1,IL),J=1,JL),K=1,KR) READ(20) (((DUM3D(I,J,K,2),I=1,IL),J=1,JL),K=1,KR) IFDIFFS = 0 DO K = 1,KR IKDIFFS = 0 DO J = 1,JL-IDOT DO I = 1,IL-IDOT IF (DUM3D(I,J,K,1) .NE. DUM3D(I,J,K,2)) THEN IKDIFFS = IKDIFFS + 1 IFDIFFS = IFDIFFS + 1 ENDIF ENDDO ENDDO IF ( IKDIFFS .NE. 0 ) THEN c EFOUND = .TRUE. PRINT*,'LEVEL ',K,' WITH ',IKDIFFS,' DIFFS' IF ( LEVLIM.EQ.-1.OR.K.EQ.LEVLIM) THEN write(88,*)JL,IL,' ',ID,' LEVEL ',K,' TIME ',N write(98,*)JL,IL,' ',ID,' LEVEL ',K,' TIME ',N DO I = 1,IL DO J = 1,JL WRITE(88,*)DUM3D(I,J,K,1) WRITE(98,*)DUM3D(I,J,K,2) ENDDO ENDDO ENDIF ENDIF ENDDO IF (IFDIFFS .NE. 0 ) THEN PRINT *,'3D FIELD ID= ',ID,' IDOT= ',IDOT, * ' N DIFFS= ',IFDIFFS ENDIF 120 CONTINUE PRINT *,' ' PRINT *,' ' DO 140 IFLD=1,NUM2D IDOT=1-MIF(204+NUM3D+IFLD,INDEX,1)/10 ID=MIFC(204+NUM3D+IFLD,INDEX,1)(1:8) READ (10) ((DUM2D(I,J,1),I=1,IL),J=1,JL) READ (20) ((DUM2D(I,J,2),I=1,IL),J=1,JL) IFDIFFS = 0 DO J = 1,JL-IDOT DO I = 1,IL-IDOT IF (DUM2D(I,J,1) .NE. DUM2D(I,J,2)) THEN IFDIFFS = IFDIFFS + 1 ENDIF ENDDO ENDDO IF ( IFDIFFS .NE. 0 ) THEN c EFOUND = .TRUE. write(88,*)JL,IL,' ',ID,' TIME ',N write(98,*)JL,IL,' ',ID,' TIME ',N DO I = 1,IL DO J = 1,JL WRITE(88,*)DUM2D(I,J,1) WRITE(98,*)DUM2D(I,J,2) ENDDO ENDDO ENDIF PRINT *,'2D FIELD ID= ',ID,' IDOT= ',IDOT, * ' N DIFFS = ',IFDIFFS 140 CONTINUE IF (.NOT. EFOUND ) GO TO 5 GO TO 999 10000 CONTINUE DO 220 IFLD=1,NUM3D IDOT=1-MIF(204+IFLD,INDEX,1)/10 ID=MIFC(204+IFLD,INDEX,1)(1:8) IF ( N .EQ. 1 ) PRINT*,IFLD,MIFC(204+IFLD,INDEX,1)(1:80) IF(ID.EQ.'W ' .AND. MIF( 10,1,1).EQ.2) THEN KR = KL + 1 ELSE KR = KL ENDIF READ(10) (((DUM3D(I,J,K,1),I=1,IL),J=1,JL),K=1,KR) IFDIFFS = 0 IF ( ID .EQ. FILE2 ) THEN DO K = 1,KR IF ( LEVLIM.EQ.-1.OR.K.EQ.LEVLIM) THEN write(88,*)JL-IDOT,IL-IDOT,' ',ID,' LEVEL ',K DO I = 1,IL-IDOT DO J = 1,JL-IDOT WRITE(88,*)DUM3D(I,J,K,1) ENDDO ENDDO ENDIF ENDDO ENDIF 220 CONTINUE DO 240 IFLD=1,NUM2D IDOT=1-MIF(204+NUM3D+IFLD,INDEX,1)/10 ID=MIFC(204+NUM3D+IFLD,INDEX,1)(1:8) IF ( N .EQ. 1 ) PRINT*,IFLD,MIFC(204+NUM3D+IFLD,INDEX,1)(1:80) READ (10) ((DUM2D(I,J,1),I=1,IL),J=1,JL) IF ( ID .EQ. FILE2 ) THEN write(88,*)JL-IDOT,IL-IDOT,ID DO I = 1,IL-IDOT DO J = 1,JL-IDOT WRITE(88,*)DUM2D(I,J,1) ENDDO ENDDO ENDIF 240 CONTINUE IF (.NOT. EFOUND ) GO TO 5 999 CONTINUE END SUBROUTINE GETGIST(MIF,MRF,MIFC,MRFC) C C PURPOSE INTERPRET THE VERSION 1 HEADER INFO C INTEGER MIF(1000,20,2) REAL MRF(1000,20,2) CHARACTER*80 MIFC(1000,20,2),MRFC(1000,20,2) DO 30 J=1,20 DO 10 I=1,1000 IF(MIF(I,J,1).NE.MIF(I,J,2).AND.MIF(I,J,1).NE.-999) THEN PRINT 100,I,J,MIF(I,J,1),MIF(I,J,2),MIFC(I,J,1) ENDIF 10 CONTINUE DO 20 I=1,1000 IF(MRF(I,J,1).NE.MRF(I,J,2).AND.MRF(I,J,1).NE.-999.) THEN PRINT 110,I,J,MRF(I,J,1),MRF(I,J,2),MRFC(I,J,1) ENDIF 20 CONTINUE 30 CONTINUE 100 FORMAT('MIF(',I3,',',I1,') = ',I10,' <> ',I10,' : ',A80) 110 FORMAT('MRF(',I3,',',I1,') = ',F10.2,' <> ',F10.2,' : ',A80) RETURN END