40 G=G+2.*A(I,J)*A(I,J)
S1=SQRT(G)
S2=EPS/FLOAT(N)*S1
S3=S1
L=0
50 S3=S3/FLOAT(N)
60 DO 130 IQ=2,N
IQ1=IQ-1
DO 130 IP=1,IQ1
IF(ABS(A(IP,IQ)).LT.S3) GO TO 130
L=1
V1=A(IP,IP)
V2=A(IP,IQ)
V3=A(IQ,IQ)
U=0.5*(V1-V3)
IF(U.EQ.0.0)G=1.
IF(ABS(U).GE.1E-10)G=-SIGN(1.,U)*V2/SQRT(V2*V2+U*U)
ST=G/SQRT(2.*(1.+SQRT(1.-G*G)))
CT=SQRT(1.-ST*ST)
DO 110 I=1,N
G=A(I,IP)*CT-A(I,IQ)*ST
A(I,IQ)=A(I,IP)*ST+A(I,IQ)*CT
A(I,IP)=G
G=S(I,IP)*CT-S(I,IQ)*ST
S(I,IQ)=S(I,IP)*ST+S(I,IQ)*CT
110 S(I,IP)=G
DO 120 I=1,N
A(IP,I)=A(I,IP)
120 A(IQ,I)=A(I,IQ)
G=2.*V2*ST*CT
A(IP,IP)=V1*CT*CT+V3*ST*ST-G
A(IQ,IQ)=V1*ST*ST+V3*CT*CT+G
A(IP,IQ)=(V1-V3)*ST*CT+V2*(CT*CT-ST*ST)
A(IQ,IP)=A(IP,IQ)
130 CONTINUE
IF(L-1) 150,140,150
140 L=0
GO TO 60
150 IF(S3.GT.S2) GO TO 50
RETURN
END
!C*********************************************************************
SUBROUTINE ARRANG(KV,MNH,A,ER,S,tr,atr)
DIMENSION A(MNH,MNH),ER(MNH,4),S(MNH,MNH)
TR=0.0
DO 200 I=1,MNH
TR=TR+A(I,I)
200 ER(I,1)=A(I,I)
atr=0.0
do 201 i=11,MNH
201 atr=atr+er(i,1)
MNH1=MNH-1
DO 210 K1=MNH1,1,-1
DO 210 K2=K1,MNH1
IF(ER(K2,1).LT.ER(K2+1,1)) THEN
C=ER(K2+1,1)
ER(K2+1,1)=ER(K2,1)
ER(K2,1)=C
DO 205 I=1,MNH
C=S(I,K2+1)
S(I,K2+1)=S(I,K2)
S(I,K2)=C
205 CONTINUE
END IF
210 CONTINUE
ER(1,2)=ER(1,1)
DO 220 I=2,MNH
ER(I,2)=ER(I-1,2)+ER(I,1)
220 CONTINUE
DO 230 I=1,MNH
ER(I,3)=ER(I,1)/TR
ER(I,4)=ER(I,2)/TR
230 CONTINUE
WRITE(6,250)atr
250 FORMAT(1x,'The total square error is',F15.5,'!')
RETURN
END
!c************************************************************************
!C CALCULATION FOR NORMALIZIEA EIGENVECTORS & THEIR TIME COEFFICIENTS *
!C IF M .GE. N THEN S FOR EIGENVECTORS & F TIME COEFFICIENTS *
!C IF M .LE. N THEN F FOR EIGENVECTORS & S TIME COEFFICIENTS *
!C************************************************************************
SUBROUTINE TCOEFF(KVT,KV,N,M,MNH,S,F,V,ER)
DIMENSION S(MNH,MNH),F(N,M),V(MNH),ER(MNH,4)
DO 360 J=1,KVT
C=0.0
DO 350 I=1,MNH
350 C=C+S(I,J)*S(I,J)
C=SQRT(C)
DO 160 I=1,MNH
160 S(I,J)=S(I,J)/C
360 CONTINUE
IF(N.LE.M) THEN
DO 390 J=1,M
DO 370 I=1,N
V(I)=F(I,J)
F(I,J)=0.0
370 CONTINUE
DO 380 IS=1,KVT
DO 380 I=1,N
380 F(IS,J)=F(IS,J)+V(I)*S(I,IS)
390 CONTINUE
ELSE
DO 410 I=1,N
DO 400 J=1,M
V(J)=F(I,J)
F(I,J)=0.0
400 CONTINUE
DO 410 JS=1,KVT
DO 410 J=1,M
F(I,JS)=F(I,JS)+V(J)*S(J,JS)
410 CONTINUE
! DO 430 JS=1,KVT
! DO 420 J=1,M
! S(J,JS)=S(J,JS)*SQRT(ER(JS,1))
! 420 CONTINUE
! DO 430 I=1,N
! F(I,JS)=F(I,JS)/SQRT(ER(JS,1))
! 430 CONTINUE
END IF
RETURN
END
!C**********************************************************************
!C ER(KV,1):LAMDAS FROM MAXIMAL TO MINLMAL *
!C LAMDA:EIGENVALUE *
!C ER(KV,2):ACCUMULATED LAMDAS *
!C ER(KV,3):PERCENT OF SINGLE EIGENVALUE *
!C ER(KV,4):ACCUMULATED ER(KV,3) *
!C**********************************************************************
SUBROUTINE OUTER(MNH,KV,ER,tr)
DIMENSION ER(MNH,4)
OPEN(77,FILE='f:\qxzl\xbrain\eof\sprFERR2.DAT',
$ status='unknown')
WRITE(77,510)
510 FORMAT(6x,'Here are the eigenvalues and analysis errors:')
WRITE(77,520)
520 FORMAT(1X,1Hn,8X,5Hlamda,8X,6Hlamdas,12X,5Hratio,10X,6Hratios)
do IS=1,KV
WRITE(77,530)is,(ER(IS,J),J=1,4)
enddo
530 FORMAT(2x,i4,2x,F13.1,f14.1,f17.10,f16.10)
WRITE(77,250) TR
250 FORMAT(1x,'The total square error is',F18.10,'!')
CLOSE(77)
RETURN
END
!C***********************************************************************
!C SAVE EIGENVECTORS & THEIR TIME COEFFICIENTS,RESPECTIVELY *
!C***********************************************************************
SUBROUTINE OUTVT(KVT,N,M,MNH,S,F)
DIMENSION F(N,M),S(MNH,MNH)
OPEN(88,FILE='f:\qxzl\xbrain\eof\spr12.grd',form='binary'
& ,status='unknown')
OPEN(99,FILE='f:\qxzl\xbrain\eof\spr22.grd',form='binary'
& ,status='unknown')
! open(66,file='f:\qxzl\xbrain\eof\spr22.dat')
IF(M.GE.N) THEN
DO 550 I=1,N
550 WRITE(88) (S(I,JS),JS=1,KVT)
! 580 FORMAT(51F7.2)
ELSE
! DO 551 I=1,N
! 551 WRITE(88,590)(F(I,JS),JS=1,kvt)
WRITE(88)((F(I,JS),I=1,62),JS=1,kvt)
pause
! WRITE(99)((S(IS,J),J=1,n),IS=1,kvt)
590 FORMAT(15F10.3)
END IF
IF(M.GE.N)THEN
DO 600 J=1,M
600 WRITE(99)(F(IS,J),IS=1,KVT)
630 FORMAT(15f10.3)
ELSE
! DO 601 J=1,M
! 601 WRITE(66)(S(J,IS),IS=1,kvt)
WRITE(99)((S(J,IS),IS=1,kvt),J=1,M)
640 FORMAT(4F7.2)
END IF
CLOSE(88)
CLOSE(99)
! close(66)
RETURN
END
!C**********************************************************************
!C PROGRAM NOTE *
!C METEOROLOGICAL FIELD EOF ANALYSES *
!C**********************************************************************
!C**********************************************************************
!C PARAMETER TABLE *
!C M: LENGTH OF TIME SERIES *
!C N: NUMBER OF STATION *
!C KS:=-1:SELF; KS=0:DEpARTURE; KS=1:NORMALIIZED *
!C KV:NUMBER OF EIGENVALUE WILL BE OUTPUT *
!C KVT:NUMBER OF EIGENVECTORS AND TIME SERIES WILL BE OUTPUT *
!C MNH=MIN(M,N) *
!C EGVT:EIGENVECTORS, ECOF:TIME COEFFIENTS FOR EGVT *
!C ER(KV,1):LAMDAS *
!C LAMDA:EIGENVALUE *
!C ER(KV,2):ACCUMULATED LAMDAS *
!C ER(KV,3):PERCENT OF SINGLE EIGENVALUE *
!C ER(KV,4):ACCUMULATED ER(KV,3) *
!C**********************************************************************
!C**********************************************************************
!C FILES NOTE *
!C UNIT=9 READ PRIMITIVE DATA *
!C UNIT=77 ERROR ANALYSES FILE NAMED FERR.D *
!C UNIT=88 EIGENVECTORS FILE NAME FVCT.D *
!C UNIT=99 TIME COEFFICIENTS FILE NAMED FTCO.D *
!C**********************************************************************
!C***** MAIN PROGRAM EOF *****
PARAMETER(KS=0,KV=10,KVT=4)
PARAMETER(N=62,M=47,MNH=47)
integer x(n,m)
real F(N,M),A(MNH,MNH),S(MNH,MNH),ER(MNH,4),DF(N),V(MNH),AVF(N)
! character*3 word1(5)
! common word1
! character*14 word2(3)
! data word1/'spr','spr','spr','spr','spr'/
! ,'sprtyl.grd','sprtyl.grd'
! & ,'sprtyh.grd','sprtyh.grd'/
! data word2/'spreofp.grd',
! do 500 lll=1,5
open(7,file='f:\qxzl\xbrain\rxb03.dat',
$ form='formatted') !读取原始资料
! do i=1,nn
read(7,101)((x(i,j),j=1,47),i=1,62) ! .............. !
101 format(47i6)
! pause
do k=1,n