SUBROUTINE SPRS(TDATA,NTDTA,NLATH,NLON,NSIG, * MSAT,SFILE,NSIGSAT,ISAT,BLAT,ELAT,GROSS,SIGL) C$$$ SUBPROGRAM DOCUMENTATION BLOCK C . . . . C SUBPROGRAM: SPRS FORM SUPEROBS FOR INTERACTIVE SATEMS. C PRGMMR: DERBER ORG: W/NMC23 DATE: 92-07-21 C C ABSTRACT: FORM SUPEROBS FOR INTERACTIVE SATEMS. C C PROGRAM HISTORY LOG: C 92-07-21 DERBER C C INPUT ARGUMENT LIST: C TDATA - OBS INFO AT OBS LOCATIONS C NTDTA - NUMBER OF OBS C NLATH - NUMBER OF LATITUDES POLE TO EQ. ON GAUSSIAN GRID C NLON - NUMBER OF LONGITUDES ON GAUSSIAN GRID C NSIG - NUMBER OF LAYERS ON GAUSSIAN GRID C ISAT - UNIT NUMBER INPUT SAT. STATISTICS C NSIGSAT - NUMBER OF SIGMA LEVELS FOR INPUT SAT. STATS C BLAT - BEGINNING LATITUDE REDUCTION OF WEIGHT REGION C ELAT - ENDING LATITUDE REDUCTION OF WEIGHT REGION C GROSS - PARAMETER FOR GROSS ERROR TESTING C SIGL - SIGMA LAYER MIDPOINT VALUES C C OUTPUT ARGUMENT LIST: C MSAT - NUMBER OF SATELLITE PROFILES C C ATTRIBUTES: C LANGUAGE: CFT77 C MACHINE: CRAY YMP C C$$$ C C-CRA DIMENSION TDATA(NTDTA,6) C-CRA DIMENSION RR(NSIG),SATERR(NSIG,NSIG,2) C-CRA DIMENSION SATERRIN(NSIGSAT,NSIGSAT,2) C-CRA DIMENSION SCRAT(3*NSIG) C-CRA DIMENSION ISCRAT(3*NSIG) C-CRA DIMENSION NUMTEMPS(NSIG),RR2(200),VLOC(200),ALSIG(NSIG) C-CRA DIMENSION INDL(NSIG) C-CRA DIMENSION EL(NSIG*NSIG) C-CRA DIMENSION AERR(NSIG*NSIG) C-CRA DIMENSION IST(2*NLATH+1,NLON+2) C-CRA DIMENSION OBSERROR(NSIG,2) C-CRA DIMENSION SIGL(NSIG),SIGLIN(NSIGSAT) C-CRA DIMENSION IOLD(NSIG) C-CRA DIMENSION SFILE(*) C-CRA REAL RRS(2*NLATH+1,NLON+2,NSIG) C-CRA REAL SATF(2*NLATH+1,NLON+2,NSIG) C-CRA LOGICAL ODIAG C WARNING!!! DIMENSION TDATA(_NTDTA_,6) IS WRONG. C IT MUST USE THE DIMENSION OF THE CALLING PROGRAM. DIMENSION TDATA(120000,6) DIMENSION RR(28),SATERR(28,28,2) DIMENSION SATERRIN(28,28,2) DIMENSION SCRAT(3*28) DIMENSION ISCRAT(3*28) DIMENSION NUMTEMPS(28),RR2(200),VLOC(200),ALSIG(28) DIMENSION INDL(28) DIMENSION EL(28*28) DIMENSION AERR(28*28) DIMENSION IST(2*48+1,192+2) DIMENSION OBSERROR(28,2) DIMENSION SIGL(28),SIGLIN(28) DIMENSION IOLD(28) DIMENSION SFILE(*) REAL RRS(2*48+1,192+2,28) REAL SATF(2*48+1,192+2,28) LOGICAL ODIAG C-------- C-------- LOCAL SPACE C------- C-------- REWIND ISAT READ(ISAT,50)MSIGSAT 50 FORMAT(1X,I3) READ(ISAT,60)SIGLIN 60 FORMAT(1X,5E15.7) DO KK=1,2 DO K=1,NSIGSAT READ(ISAT,60)(SATERRIN(I,K,KK),I=1,NSIGSAT) END DO END DO CLOSE (ISAT) C-------------FIND OLD SIGMAS CLOSEST TO NEW SIGMAS DO K=1,NSIG LMIN=0. DISTMIN=1.E50 DO L=1,NSIGSAT DIST=ABS(SIGL(K)-SIGLIN(L)) IF(DIST.LT.DISTMIN) THEN DISTMIN=DIST LMIN=L END IF END DO IOLD(K)=LMIN END DO WRITE(6,*)' READ SATCOV AND GET IN CURRENT SIGMA COORDINATE' WRITE(6,*)' IOLD=',IOLD DO LOOP=1,2 DO K=1,NSIG DO L=1,NSIG SATERR(K,L,LOOP)=SATERRIN(IOLD(K),IOLD(L),LOOP) END DO END DO END DO C------- OBERMAX=-1.E50 OBERMIN=1.E50 RESMAX=-1.E50 RATMAX=-1.E50 NUMGROSS=0 C------- C-CRA SATF=0. C REAL SATF(2*NLATH+1,NLON+2,NSIG) DO ITMP=1,(2*NLATH+1)*(NLON+2)*NSIG SATF(ITMP,1,1)=0. ENDDO C-CRA IST=0 C DIMENSION IST(2*NLATH+1,NLON+2) DO ITMP=1,(2*NLATH+1)*(NLON+2) IST(ITMP,1)=0 ENDDO NLAT=2*NLATH DO 183 L=1,NSIG 183 ALSIG(L)=FLOAT(L) C-CRA RRS=0. C REAL RRS(2*NLATH+1,NLON+2,NSIG) DO ITMP=1,(2*NLATH+1)*(NLON+2)*NSIG RRS(ITMP,1,1)=0. ENDDO LLLCNT=0 IACNT=1 IPCNT=0 C-CRA AERR=0. C DIMENSION AERR(NSIG*NSIG) DO ITMP=1,NSIG*NSIG AERR(ITMP)=0. ENDDO C-CRA INDL=0 C DIMENSION INDL(NSIG) DO ITMP=1,NSIG INDL(ITMP)=0 ENDDO ILON=1 ILAT=2 ISIG=3 ITRES=4 ITIME=5 ILTYPE=6 C C 96/3/25 - PATCH TO TRANSITION VTPR DATA ENCODEDA AS TYPE 170 TO 171 C DO I=1,NTDTA IF (TDATA(I,ILTYPE) .EQ. 170) TDATA(I,ILTYPE) = 171 ENDDO C-CRA NUMTEMPS=0 C DIMENSION NUMTEMPS(NSIG),RR2(200),VLOC(200),ALSIG(NSIG) DO ITMP=1,NSIG NUMTEMPS(ITMP)=0 ENDDO NREC=0 IF(NTDTA .EQ. 0)GO TO 440 ANLON=FLOAT(NLON) NNSAT=0 DO L=1,NSIG OBSERROR(L,1)=SQRT(SATERR(L,L,1)) OBSERROR(L,2)=SQRT(SATERR(L,L,2)) WRITE(6,75321)L,OBSERROR(L,1),OBSERROR(L,2) 75321 FORMAT(' SAT ERRORS FOR L=',I3,' ARE ', 2F10.2) END DO DO 160 LLLLL=161,169 DO 160 LLLL=1,2 LLL=(LLLL-1)*10+LLLLL IC=0 ITYPE=LLL-160 IF(ITYPE .GT. 10) ITYPE=ITYPE-10 IF(ITYPE .LT. 5)ISFLAG=1 IF(ITYPE .GT. 5) ITYPE=ITYPE-5 IF(ITYPE .EQ. 1 .OR. ITYPE .EQ. 2) IND=1 IF(ITYPE .EQ. 3 )IND=2 DO 100 I=1,NTDTA IF(IC .GE. NTDTA)GO TO 100 IC=IC+1 RTTYPE=TDATA(IC,ILTYPE) ISTYPE=NINT(RTTYPE) IF(ISTYPE .NE. LLL)GO TO 100 C-----------------------------------GROSS ERROR TEST ADDED HERE OBSERRLM=OBSERROR(MIN(NSIG,MAX(1,NINT(TDATA(IC,ISIG)))),IND) RESIDUAL=ABS(TDATA(IC,ITRES)) RATIO=RESIDUAL/OBSERRLM OBERMAX=MAX(OBERMAX,OBSERRLM) OBERMIN=MIN(OBERMIN,OBSERRLM) RESMAX=MAX(RESMAX,RESIDUAL) RATMAX=MAX(RATMAX,RATIO) IF(RATIO.GT.GROSS) THEN NUMGROSS=NUMGROSS+1 GO TO 100 END IF STLAT=NINT(TDATA(IC,ILAT)) STLON=NINT(TDATA(IC,ILON)) NLEVSV=1 RR2(1)=TDATA(IC,ITRES) VLOC(1)=TDATA(IC,ISIG) IF(STLON .GE. ANLON+1.)STLON=STLON-ANLON IF(STLON .LT. 1. )STLON=STLON+ANLON JLAT=STLAT JLON=STLON JLAT=MAX(1,MIN(JLAT,NLAT)) IF(JLON .GT. NLON)JLON=JLON-NLON IF(IST(JLAT,JLON) .NE. 0 .AND. IST(JLAT,JLON) .LT. IND) * GO TO 100 JLATP=JLAT+1 JLONP=JLON+1 JLATP=MIN(JLATP,NLAT) DO 422 LLM=1,199 ICP=IC+1 IF(ICP .GT. NTDTA)GO TO 423 IF(TDATA(ICP,ILAT) .NE. TDATA(IC,ILAT) .OR. * TDATA(ICP,ILON) .NE. TDATA(IC,ILON)) GO TO 423 ITYPEP=NINT(TDATA(ICP,ILTYPE)) IF(ITYPEP .NE. ISTYPE) GO TO 423 IF(TDATA(ICP,ISIG) .LT. TDATA(IC,ISIG))GO TO 423 IC=ICP NLEVSV=NLEVSV+1 RR2(NLEVSV)=TDATA(IC,ITRES) VLOC(NLEVSV)=TDATA(IC,ISIG) 422 CONTINUE 423 CONTINUE NLEVS=0 IF(NLEVSV .EQ. 1) THEN RR(1)=RR2(1) INDL(1)=NINT(VLOC(1)) NUMTEMPS(INDL(1))=NUMTEMPS(INDL(1))+1 NLEVS=1 GO TO 130 END IF LESIG=VLOC(NLEVSV) LESIG=MIN(LESIG,NSIG) LESIG=MAX(1,LESIG) LBSIG=IFIX(VLOC(1))+1 LBSIG=MIN(LBSIG,NSIG) LBSIG=MAX(1,LBSIG) IBVAL=1 DIFFL=VLOC(1)-FLOAT(LBSIG-1) IF(DIFFL .LT. .02 .AND. * LBSIG .GE. 2) THEN NLEVS=NLEVS+1 NUMTEMPS(LBSIG-1)=NUMTEMPS(LBSIG-1)+1 INDL(NLEVS)=LBSIG-1 RR(NLEVS)=RR2(1) END IF IF(LBSIG .GT. LESIG) GO TO 140 DO 129 LL=LBSIG,LESIG DO 131 L=IBVAL+1,NLEVSV IF(VLOC(L) .GT. FLOAT(LL)) GO TO 132 131 CONTINUE PRINT *,' INTERPOLATION ERROR ', VLOC,LBSIG,LESIG 132 IBVAL=L-1 NLEVS=NLEVS+1 NUMTEMPS(LL)=NUMTEMPS(LL)+1 INDL(NLEVS)=LL RR(NLEVS)=((VLOC(IBVAL+1)-ALSIG(LL))*RR2(IBVAL)+ * (ALSIG(LL)-VLOC(IBVAL))*RR2(IBVAL+1))/ * (VLOC(IBVAL+1)-VLOC(IBVAL)) 129 CONTINUE 140 DIFFL=LESIG+1-VLOC(NLEVSV) IF(DIFFL .GT. 0. .AND. DIFFL .LT. .02 .AND. * LESIG .LE. NSIG-1) THEN NLEVS=NLEVS+1 NUMTEMPS(LESIG+1)=NUMTEMPS(LESIG+1)+1 INDL(NLEVS)=LESIG+1 RR(NLEVS)=RR2(NLEVSV) END IF IF(NLEVS .GT. 0)THEN IST(JLAT,JLON)=IND DO 192 L=1,NLEVS SATF(JLAT,JLON,INDL(L))=SATF(JLAT,JLON,INDL(L))+1. RRS(JLAT,JLON,INDL(L))=RRS(JLAT,JLON,INDL(L))+RR(L) 192 CONTINUE ELSE PRINT *,' NUMBER OF LEVELS EQUAL TO ZERO ',JLAT,JLON END IF 130 CONTINUE 100 CONTINUE 160 CONTINUE DO 161 I=1,2*NLATH DO 161 J=1,NLON IF(IST(I,J) .NE. 0)THEN L=0 DO 162 K=1,NSIG IF(SATF(I,J,K) .GT. 0.)THEN L=L+1 INDL(L)=K RR(L)=RRS(I,J,K)/SATF(I,J,K) END IF 162 CONTINUE IF(L .EQ. 0)GO TO 333 STLAT=I WSCALE=1. IF(STLAT .GE. ELAT)WSCALE=2. IF(STLAT .GT. BLAT .AND. STLAT .LT. ELAT)THEN WSCALE=(2.*(STLAT-BLAT)+ELAT-STLAT)/(ELAT-BLAT) END IF NLEVS=L IND=IST(I,J) DO 101 L=1,NLEVS DO 101 M=1,NLEVS AERR(L+(M-1)*NLEVS)=SATERR(INDL(L),INDL(M),IND)*WSCALE 101 CONTINUE C-CRA CALL MINV(AERR,NLEVS,NLEVS,SCRAT,DET,1.E-12,0,1) CALL IMINV(AERR,NLEVS,DET,ISCRAT(1),ISCRAT(NLEVS+1)) IF(DET .LE. 1.E-12) PRINT *,' DET ERROR',IC,DET CALL CHLML(AERR,EL,NLEVS,NLEVS,NLEVS,ODIAG) IF(ODIAG)THEN PRINT *,I,J,NLEVS,(AERR(M),M=1,NLEVS*NLEVS) STOP END IF IPCNT=IPCNT+1 DO N=1,NSIG+NSIG*NSIG+3 SFILE(N+IACNT)=0. END DO C SFILE(1+IACNT)=NLEVS+.01 SFILE(1+IACNT)=I+.01 SFILE(2+IACNT)=J+.01 SFILE(3+IACNT)=INDL(1)+.01 IOFF=INDL(1) IACNT=IACNT+3 NXIG=NSIG-IOFF+1 DO 45 N=1,NLEVS 45 INDL(N)=INDL(N)-IOFF+1 DO 44 N=1,NLEVS 44 SFILE(INDL(N)+IACNT)=RR(N) IACNT=IACNT+NSIG DO 444 NN=1,NLEVS DO 444 N=1,NLEVS 444 SFILE((INDL(NN)-1)*NXIG+INDL(N)+IACNT)=EL((NN-1)*NLEVS+N) IACNT=IACNT+NSIG*NSIG NNSAT=NNSAT+1 333 CONTINUE END IF 161 CONTINUE PRINT *,' IACNT ',IACNT SFILE(1)=IPCNT NREC=NREC+1 LSAT=0 DO 350 K=1,NSIG LSAT=LSAT+NUMTEMPS(K) WRITE(6,340)NUMTEMPS(K),K 340 FORMAT(' THERE ARE ',I9,' SATEM OBS AT LEVEL ',I4) 350 CONTINUE PRINT *,' TOTAL NUMBER OF SATEM SPROBS=',LSAT PRINT *, ' NUMBER OF SATELLITE PROFILES =', NNSAT 440 MSAT=NREC PRINT *,' MSAT= ',MSAT WRITE(6,*)' GROSS ERROR CHECK FOR SATTEMPS:' WRITE(6,*)' OBS ERROR MAX,MIN=',OBERMAX,OBERMIN WRITE(6,*)' FOR CHECK, MAX RATIO RESIDUAL/OB ERROR =',GROSS WRITE(6,*)' MAX RESIDUAL=',RESMAX WRITE(6,*)' MAX RATIO=',RATMAX WRITE(6,*)' NUMBER OBS THAT FAILED GROSS TEST = ',NUMGROSS RETURN END