当前位置:文档之家› Fortran做EOF分析

Fortran做EOF分析

Fortran做EOF分析
Fortran做EOF分析

!此程序为EOF程序

! 运行时要改动前面的空间、时间格点以及文件路径,ks和kvt根据自己的需要进行改动!程序中自动去除缺省值并将其写回生成数据(生成数据中缺省值为-9999.0)

!对程序中data_in到F的传递进行调整后此程序也可用于s-eof和mv-eof

!

PROGRAM EOF

IMPLICIT NONE

INTEGER,PARAMETER :: nt=12,nx=23,ny=34 ! you need change,NT为时间长度

INTEGER,PARAMETER ::M=nt,KS=0,KVT=8 !kvt为输出的模态数

! KS的设置:ks>0 计算前先将数据标准化,

! ks=0时取距平,ks<0时不进行这一步处理

INTEGER :: i,j ,MNH,N ,K,IM , m1

REAL, allocatable,dimension(:,:,:)::DA TA_IN

REAL, allocatable,dimension(:,:)::F,S,ER,A,S1,F1

CHARACTER(LEN=20) :: NOW , TRACK

REAL :: land(nx,ny), D,A VE,PT(NX,NY,kvt) ,ran1

TRACK='E:\aat\EA\' !输出的目标文件夹,默认为程序所在文件夹

call time(now)

print*, now

!!1111111111读入数据并去掉缺省值11111111111111

ALLOCA TE(DA TA_IN(NX,NY,NT))

OPEN(1,file='E:\aat\EA\aat.eof.dat',access='direct',recl=nx*ny*nt) !****修改路径

READ(1,rec=1) (((data_in(I,J,K),I=1,nx),J=1,ny),K=1,nt)

CLOSE(1)

!注意数据排列顺序

!************做纬度加权平均,中、高纬度使用,热带或小范围不必******(未验证)!do j=1,ny

!z(j)=0.+(real(j)-1.)*2.5/180.*3.1415926575 !使用时需要改动格距和起始纬度

!data_in(:,j,:)=data_in(:,j,:)*sqrt(cos(z(j)))

!enddo

land=0.0

N=NX*NY

DO I=1,nx

DO J=1,ny

DO K=1,nt

IF(abs(data_in(I,J,K))>99999.0)then !判断缺省值(注意条件)

land(I,J)=-9999.0

N=N-1

EXIT

ENDIF

ENDDO

ENDDO

ENDDO

ALLOCA TE(F(1:N,1:M))

im=0

DO I=1,nx

DO J=1,ny

IF(land(I,J)/=-9999.0)then

im=im+1

F(IM,1:m)=data_in(I,J,1:m)

ENDIF

ENDDO

ENDDO

print*, '空间点数' , nx*ny, '非缺省值空间点数:',im,N

DEALLOCA TE(DA TA_IN)

MNH=min(N,M)

ALLOCA TE( A(MNH,MNH))

ALLOCA TE(S(MNH,MNH))

ALLOCA TE(ER(mnh,6))

!222222222222222222计算过程22222222222222222222222

CALL TRANSF(N,M,F,KS) !根据KS的设置,-1时跳出,0时距平,1时标准化

print*,"**"

CALL FORMA(N,M,MNH,F,A) !求协方差矩阵A

print*,"***"

CALL JCB(MNH,A,S,0.0000001) !雅可比过关法求特征值特征向量

print*,"****" !最后这个EPS的值控制计算精度,越小精度越高

CALL ARRANG(MNH,A,ER,S) !按照特征值大小排序

print*,"*****"

DEALLOCA TE( A)

CALL TCOEFF(KVT,N,M,MNH,S,F,ER) !给出时间序列和标准化

的空间场

print*,"******"

ALLOCA TE(S1(MNH,MNH))

ALLOCA TE(F1(N,M))

!33333********数据输出**********333333333 !输出数据为标准化后的时间序列及相应的空间场

!求时间序列的标准差,时间序列除以标准差,空间乘以该标准差

IF (M>=N) THEN

DO K=1,KVT

A VE=SUM(F(K,1:M))/REAL(M)

F1(K,1:M)=F(K,1:M)-A VE

D= SQRT(SUM(F1(K,1:M)*F1(K,1:M))/REAL(M))

F(K,1:M)= F(K,1:M)/D !时间

S(K,1:N)= S(K,1:N)*D !空间

ENDDO

m1=0

DO i=1,nx

DO j=1,ny

IF(land(i,j).eq.0.0)then

m1=m1+1

PT(i,j,1:kvt)=S(1:kvt,m1)

ELSE

PT(i,j,1:kvt)=-9999.00

ENDIF

ENDDO

ENDDO

OPEN (1,file=TRIM(track)//'pt.dat',access='direct',recl=NX*NY)

DO k=1,KVT

WRITE(1,rec=k)((PT(i,j,k),i=1,nx),j=1,ny)

ENDDO

CLOSE(1)

OPEN (2,FILE=TRIM(track)//'PC.DA T',ACCESS='DIRECT',RECL=M)

DO K=1,KVT

WRITE(2,REC=K) ((F(K,1:M)))

ENDDO

CLOSE(2)

ELSE

DO K=1,KVT

A VE=SUM(S(1:M,K))/REAL(M)

S1(1:M,K)=S(1:M,K)-A VE

D= SQRT( SUM(S1(1:M,K)*S1(1:M,K))/REAL(M))

S(1:M,K)=S(1:M,K)/D !时间

F(1:N,K)=F(1:N,K)*D !空间

ENDDO

m1=0

DO i=1,nx

DO j=1,ny

IF(land(i,j).eq.0.0)then

m1=m1+1

PT(i,j,1:kvt)=F(m1,1:kvt)

ELSE

PT(i,j,1:kvt)=-9999.00

ENDIF

ENDDO

ENDDO

OPEN (1,file=TRIM(track)//'PT.dat',access='direct',recl=NX*NY)

DO k=1,KVT

WRITE(1,rec=k) ((PT(i,j,k),i=1,nx),j=1,ny)

ENDDO

CLOSE(1)

OPEN (2,FILE=TRIM(track)//'PC.DA T',ACCESS='DIRECT',RECL=KVT) DO K=1,M

WRITE(2,REC=K) ((S(K,1:KVT)))

ENDDO

CLOSE(2)

OPEN(3,FILE=TRIM(TRACK)//'PC10.TXT')

DO K=1,M

WRITE(3,'(8F16.4)') S(K,1:KVT)

ENDDO

ENDIF

call time(now)

print*, now ,'OK!'

ENDPROGRAM

!######################################!

! !

! 以下为计算过程调用的5个子程序!

! !

!######################################!

!11111111111111111!根据KS的设置进行初步处理

SUBROUTINE TRANSF(N,M,F,KS)

IMPLICIT NONE

! THIS SUBROUTINE PROVIDES INITIAL F BY KS

INTEGER ::KS, I,M,N

REAL ::F(N,M),A VF(N),DF(N)

A VF=0.0

DF=0.0

IF(KS>0 .or. KS ==0) then !根据KS的设置,-1时跳出,0时距平,1时标准化

DO I=1,N

A VF(I)=SUM(F(I,1:M)/M)

F(I,1:M)=F(I,1:M)-A VF(I)

ENDDO

IF(KS==0) RETURN

DO I=1,N

DF(I)=SUM(F(I,1:M)*F(I,1:M))

DF(I)=SQRT(DF(I)/M)

F(I,1:M)=F(I,1:M)/DF(I)

ENDDO

ENDIF

RETURN

END

!!22222222222222222222222222222222求协方差矩阵A

SUBROUTINE FORMA(N,M,MNH,F,A)

IMPLICIT NONE

! THIS SUBROUTINE FORMS A BY F

INTEGER :: I,J,M,N,MNH

REAL :: F(N,M),A(MNH,MNH)

A=0.0

IF(M

DO I=1,M

DO J=I,M

A(I,J)=SUM(F(1:N,I)*F(1:N,J))

A(J,I)=A(I,J)

ENDDO

ENDDO

ELSE

DO I=1,N

DO J=I,N

A(I,J)=SUM(F(I,1:M)*F(J,1:M))

A(J,I)=A(I,J)

ENDDO

ENDDO

ENDIF

RETURN

END

!!333333333333333333333333333333333333333雅可比过关法求特征值特征向量SUBROUTINE JCB(N,A,S,EPS)

IMPLICIT NONE

! THIS SUBROUTINE COMPUTS EIGENV ALUES

! AND EIGENVECTORS OF A RETUERN S

INTEGER :: I,J,K,N,L ,I1

REAL ::A(N,N),S(N,N)

REAL :: EPS,G,S1,S2,S3,V1,V2,V3,ST,CT,IP,IQ,U,IQ1

S=0.

DO 30 I=1,N

DO 30 J=1,I

IF(I-J) 20,10,20

10 S(I,J)=1.

GO TO 30

20 S(I,J)=0.

S(J,I)=0.

30 CONTINUE

G=0.

DO 40 I=2,N

I1=I-1

DO 40 J=1,I1

40 G=G+2.*A(I,J)*A(I,J)

S1=SQRT(G)

print*,"999"

S2=EPS/FLOA T(N)*S1

S3=S1

L=0

50 S3=S3/FLOA T(N)

60 DO 130 IQ=2,N

IQ1=IQ-1

DO 130 IP=1,IQ1

IF(ABS(A(IP,IQ)).LT.S3) GOTO 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)

!PRINT*,V2*V2+U*U,1.-G*G,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) GOTO 50

RETURN

END

!!444444444444444444444444444444444444444按照特征值大小排序SUBROUTINE ARRANG(MNH,A,ER,S)

IMPLICIT NONE

! THIS SUBROUTINE PROVIDES A SERIES OF EIGENV ALUES ! FROM MAX TO MIN

INTEGER :: MNH,K1,K2,I ,MNH1

REAL :: A(MNH,MNH),ER(mnh,6),S(MNH,MNH)

REAL :: TR,C

TR=0.0

DO I=1,MNH

TR=TR+A(I,I)

ER(I,1)=A(I,I)

ENDDO

MNH1=MNH-1

DO K1=MNH1,1,-1

DO 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 I=1,MNH

C=S(I,K2+1)

S(I,K2+1)=S(I,K2)

S(I,K2)=C

ENDDO

ENDIF

ENDDO

ENDDO

ER(1,2)=ER(1,1)

DO I=2,mnh

ER(I,2)=ER(I-1,2)+ER(I,1)

enddo

CONTINUE

er(:,5)=er(:,1)*sqrt(2/real(mnh))

er(:,6)=er(:,5)/TR*100

ER(:,3)=ER(:,1)/TR*100

ER(:,4)=ER(:,2)/TR*100

OPEN(119,file="E:\aat\EA\eigenvalues.txt")

DO i=1,mnh

WRITE(119,'(2f16.2,4f16.6)') er(i,1),er(i,2),er(i,3),er(i,4),er(i,5),er(i,6)

ENDDO

CLOSE(119)

RETURN

END

!!555555555555555555555555555求Y!给出时间序列和标准化的空间场

SUBROUTINE TCOEFF(KVT,N,M,MNH,S,F,ER)

IMPLICIT NONE

! THIS SUBROUTINE PROVIDES EIGENVECTORS (M.GE.N,SA VED IN S;

! M.L T.N,SA VED IN F) AND ITS STANDARD TIME COEFFICENTS SERIES (M.GE.N, ! SA VED IN F; M.LT.N,SA VED IN S)

INTEGER :: i,j,k,M,N,JS ,MNH,IS,KVT

REAL :: S(MNH,MNH),F(N,M),V(MNH),ER(mnh,6) REAL :: C

DO J=1,KVT

C=0.

C=SUM(S(:,J)*S(:,J))

C=SQRT(C)

S(:,J)=S(:,J)/C

ENDDO

IF(N.LE.M) THEN

DO J=1,M

V(1:N)=F(1:N,J)

F(1:N,J)=0.

DO IS=1,KVT

F(IS,J)=SUM(V(1:N)*S(1:N,IS))

ENDDO

ENDDO

ELSE

DO I=1,N

V(1:M)=F(I,1:M)

F(I,1:M)=0.

DO JS=1,KVT

F(I,JS)=SUM(V(1:M)*S(1:M,JS))

ENDDO

ENDDO

DO JS=1,KVT

S(1:M,JS)=S(1:m,JS)*SQRT(ER(JS,1))

F(1:N,JS)=F(1:N,JS)/SQRT(ER(JS,1))

ENDDO

ENDIF

RETURN

END

fortran常见问题解决

楼主为了减少重复回答问题,特编此帖,并不定期添加和更新内容。 错误难免,欢迎讨论,仅供参考。 很多人问哪里可以找到Fortran编译器,有不少热心学友提供网址,特汇集在这里。虽然俺检验过这些链接,但是它们不一定总有效。 Fortran编译器下载: CVF? FTN95(License:Freeforpersonaluse) 以下操作,如无特别说明,都是以为例。 1.如何加大Stacksize? 选Project=>Settings=>Link=>Category:Output=>? Stackallocations Reserve:这里填新值(默认为1M,若需要10M,则填) 2.如何用Fortran批量生成文件? 设要生成4000个文件,文件名为AA1-AA4000,如何写循环生成文件,而不用写4000次write 命令呢? 用内部文件: character(len=80)::filename,form integer::i doi=1,4000 selectcase(i) case(1:9) write(form,'(i1)')i case(10:99) write(form,'(i2)')i case(100:999) write(form,'(i3)')i case(1000:9999) write(form,'(i4)')i endselect write(filename,*)"AA",trim(form),".TXT" open(10,file=filename) write(10,*)i close(10)

enddo? stop end 3.如何用Fortran动态生成输出格式? 设有一个数组data(100),输出时,希望每行输出num个数,而num由用户输入,如何实现? 用内部文件: character(len=80)::form real::data(100) integer::i,num data=(/(i,i=1,100)/)/ read(*,*)num write(form,*)"(",num,"" write(*,form)data stop end 4.MS是不是很垃圾? 是垃圾,其中Bug太多,多到不可用的地步! 在这个主题里,换了CVF后问题就没了的人已有相当的数目。 如果你用,遇到莫名其妙的错误,建议换,这是一个比较成熟的编译器。 5.如何用F90/95生成随机数? 注意: 现在计算机产生的随机数都是伪随机数。 random_number(x)产生一个0到1之间的随机数(x可以是向量),但是每次总是那几个数。用了random_seed()后,系统根据日期和时间随机地提供种子,使得随机数更随机了。 programrandom implicitnone real::x callrandom_seed()!系统根据日期和时间随机地提供种子 callrandom_number(x)!每次的随机数就都不一样了 write(*,*)x stop endprogramrandom 6.函数/子程序超载的例子

EOF在大气科学中的应用,eof介绍

最近做了一些数据分析,用到EOF分解,但是并没有发现网上有中文的相关资源,个人认为这个东西的理解对搞物理海洋和大气科学的人还是非常重要的,这里谈点自己的理解,也请大家多批评指正。 EOF Decomposition即正交经验函数分解,英文也常用PCA(Pri ncipal Components Analysis)即主成分分析。撒一把芝麻在地上,让你用个尽可能小的椭圆把它们圈起来。这个椭圆的长轴,就是这堆芝麻的第一主成分,所谓first leading EOF,也叫Mode-1,短轴呢,就是第二主成分了。如果这群芝麻撒得特听话,基本排成一条线,你的椭圆就会特别扁,这时候长轴就特别能描述这群芝麻的特点。理想化一下,芝麻们就排成一直线,椭圆就理想成Ax+B了。长轴和短轴差别越大,即长轴的“方差贡献”越大,描述地越好。这是最简单的对EOF的理解。 说起将EOF用在大气海洋,不可不提的一个人就是John Kutzbach,U niv.Wisconsin-Madison的senior scientist。以前的EOF是一个纯数学概念,和海洋大气并不搭界,而Kutzbach第一个把EOF引入海洋大气界,开始彻底改变人们对数据分析和物理现象的认识。Kutzbach 是个很有传奇色彩的人物,有很多开创性的工作。比如虽然大家公认Wallace是Arctic Oscillation的提出者,其实Kutzbach很早就发现了AO的存在。再比如Earth's Climate System概念的提出及学科系统的完善,他也是功不可没。Ruddiman著Earth's Climate:Past and Future的时候,第一句话就是献给Kutzbach,极高地评价他headed

EOF分解程序

fid=fopen('HadISST1_SST_1961-1990.txt','r'); Num=360; data=zeros(360,180,Num); for i=1:Num aaa=fscanf(fid,'%s',7); data(:,:,i)=fscanf(fid,'%f',[360,180]); end sst1=data(1:90,11:70,1:Num); % 选取所需要区域的数据sst2=data(311:360,11:70,1:Num); sst3=zeros(140,60,Num); sst3(90:-1:1,1:60,1:Num)=sst1; sst3(140:-1:91,1:60,1:Num)=sst2; sst=sst3; for i=1:140 for j=1:60 for k=1:Num if(sst(i,j,k)==-1000)||((sst(i,j,k)==-32768)) 页脚内容1

sst(i,j,k)=NaN; end end end end sst_area1=zeros(Num,8400); % zeros全零数组 for i=1:Num; squ=squeeze(sst(:,:,i)); % 执行该指令后sst数据转换为二维数组sst_area1(i,:)=reshape(squ,1,8400); % 将数据转变为二维 end sst_nan=isnan(sst_area1); i=0; for j=1:8400 if sum(sst_nan(:,j))==0; i=i+1; sst_region(:,i)=sst_area1(:,j); end 页脚内容2

FORTRAN 90 程序编程规范

FORTRAN 90 程序编程规范 Fortran 90 编程规范,使程序代码高度组织化,更加易读、易懂、易于维护,程序更加高效。使编出的程序更易懂、易于维护。 1 语言选择 数值预报创新系统软件开发应避免使用Fortran77 的某些过时特征以Fortran 90不一致的特征。选择Fortran 90 作为开发语言,并采用Fortran 90 的新功能,如动态内存的分配(dynamic memory allocation)、递归(recursion ), 模块(modules)、POINTER 、长变量名、自由格式等。 Fortran 77其中某些只是一些冗余的功能,这些功能已经过时,另外,还有一些在Fortran90 中被证明是不好的用法,建议不要使用。 2 Fortran 90 的新特性 2.1.1 建议使用的Fortran 90 新特性 建议使用Fortran 90 提供的模块(module ),并用Use ONLY 指定module 中哪些变量或派生类型定义可用于调用程序。 尽量使用数组下标三元组,这样可优化并减少所需的代码行数。为提高可读性,要在括号内表明数组的维数,例如: 1dArrayA(:) = 1dArrayB(:) + 1dArrayC(:) 2dArray(: , :) = scalar * Another2dArray(: , :) 当访问数组的子集时,例如在有限差分等式中,可以通过使用下标三元组实现。例如:2dArray(: , 2:len2) = scalar *( & Another2dArray(:, 1:len2 -1) & - Another2dArray(:, 2:len2) & ) 对程序单元(program units )命名,并使用End program ,End subroutine ,End interface ,End module 等结构再次指定“program unit ”的名称。 在逻辑表达式中使用>、 >=、 ==、 <、 <=、 /=,它们分别代 替.gt.、.ge.、.eq.、.lt.、.le.、.ne. 。新的表示方法更接近标准的数学符号 在变量定义中始终使用“::”;始终用“DIMENSION ”定义数组形状;始终用(len=)的语法格式声明字符变量的长度。

自然正交函数分析(EOF)程序

5.3自然正交函数分析(EOF)程序 近年来,自然正交函数(又称经验正交函数)展开在气象上应用比较广泛。这种正交函数展开不象三角函数展开、球函数展开那样有固定的展开形式。它无固定的函数形式,不是事先人为地给定典型场函数,图形是由场本身来决定的,它具有收敛快又能更好地反映出场的基本结构的特征。它可以在有限的区域中进行,既可以取空间不同站点进行分解,也可以对同一站点的不同时间、不同高度的多种要素进行综和分析。因此它在气象中具有广泛的应用,可用于气象要素场分析、大气垂直结构分析、动力模型垂直分层等。 5.3.1功能 计算要素场的自然正交函数分解。 5.3.2方法说明 自然正交函数分解是针对气象要素场进行的,它的基本思想是把包含p个空间点(或p个变量)的n 个时次的观测场随时间进行分解,即将某一区域的气象要素场序列ij F (i=1, 2, …,p ;j=1,2,…,n ,即p 个空间点的n 个时次的观测资料)分解成相互正交的时间函数与相互正交的空间函数的乘积之和,常把空间函数ik v 看作典型场,时间函数kj t 看作典型场的权重系数,则不同时间的要素场是若干个典型场按不同权重线性叠加的结果,各个场之间的差别就在于各典型场的系数不同。则气象要素场可以表示为 ∑=+++==p 1k pj ip j 22i j 11i kj ik ij t v t v t v t v F (5.3.1) 其中F ij 表示第i 个场中的第j 个测点的观测值。 可将(5.3.1)是写为矩阵的形式 VT F = (5.3.2) 式中F 为n p ?阶的均值为0的资料阵, V 为p p ?阶的空间函数阵,T 为n p ?阶的时间函数阵。由于V 和T 是根据场的资料阵F 进行分解而得到的,分解的函数没有固定的函数形式,因而称为“经验”的,另外,我们还要求这种分解具有“正交”性,即要求满足下式 ??? ????≠=='≠=='∑∑==)l k (0t t t t )l k (0v v v v n 1j lj kj l k p 1i il ik l k (5.3.3) 事实上,我们对(5.3.2)式右乘T '可得 V T VT F F ''=' (5.3.4) 因F F '是p p ?阶对称阵,其元素为距平变量的交叉积。根据实对称矩阵的分解定理有 V V ΛF F '=' (5.3.5) 其中Λ是F F '矩阵的特征值组成的对角阵,V 是对应的特征向量为列向量组成的矩阵。比较(5.3.4)和(5.3.5)式可知 ΛT T =' (5.3.6) 又根据特征向量的性质有 I V V V V ='=' (5.3.7)

fortran常见错误

FAQ之常见错误 2014-02-02 13:45:35 来源:Fcode研讨团队评论:2点击:4419 本文从编译错误,链接错误,运行时错误,计算结果错误等四个方面介绍了常见的错误及解决思路。适合初学者阅读。 首先应该明确:错误有哪几种?我们当前遇到的是何种错误? 阐述这些问题前,我们先讨论一下常规的应用程序开发的过程: 1>>编写代码,使用一个或多个源代码文件。 2>>对第一步的每一个源代码文件执行编译操作。得到一个或若干个目标代码。 3>>将目标代码,运行时库(Run-time Library)和其他使用到的函数库链接起来。得到一个可执行文件(EXE 或其他) 4>>编写程序的说明书,必要的(输入)数据文件 5>>将上述得到的结果发布给用户。(发布的方式可以是刻录成光盘,销售,放在网站上供别人下载,或者其他) 6>>用户得到程序后,运行,输入数据,得到计算结果。 对于很多 Fortran 程序员来说,可能用户就是自己,也可能仅仅是自己教研室的同事同学。所以第4,5,6步骤很多时候不明显。而如果使用集成开发环境(IDE)进行开发,第1,2,3步骤又可以一键完成。因此,很多初学者就认为,写程序就是:输入代码,运行,得到结果。这样的理解太狭义。 不管我们面对什么使用者来写代码,程序开发应该是上述的过程。我们的编译器,编译环境,也是为这个过程而设计的。 于是,我们将错误分为四种: 一. 编译错误(发生在第2步) 编译错误,一般是源代码书写格式不正确,不符合语法要求。 二. 链接错误(发生在第3步) 链接错误,一般是源代码结构不完整,运行时库或函数库使用不合理。 三. 运行时错误(发生在第6步) 运行时错误,一般是执行代码时,遇到了事先未料及的错误。比如内存不足了,磁盘空间不够了,输入文件格式不对了,输出文件写入失败了等等。 四. 计算结果不符合预期(程序代码不规范,或不符合你的设想) 计算结果不符合预期,可能性就很多了。语法与你的想法不一致,超出函数库的适用范围,执行流程控制不当等等。 这四种错误,其排查难度依次增大。也就是,编译错误最容易排查和修改,而计算结果不正确,最让人头疼。

正交函数分解(EOF)源代码(Visual Basic 6.0)

'************************************* ' 全局变量,便于主函数调用。 ' VB 6.0 的函数返回的参数偏少, ' 使用全局变量在一定程度可以解决这个问题。 '**************************************** Public A() As Single ' 协方差/相关系数矩阵A Public V() As Single '特征向量为列组成的矩阵,即空间函数V (EOF)Public T() As Single '时间系数矩阵T(PC) Public B() As Single '特征值λ(E),按从大到小排列 Public GM() As Single '解释的方差(%)(特征向量对X场的累积贡献率)P Public GA() As Single Public GB() As Single '个体i特征向量对X场的贡献率ρ Public XF() As Single '模拟结果 '******************************************************** ' 函数名:CovarMat ' 函数用途: 计算协方差(相关系数)矩阵 ' 参数说明:矩阵下标为1:N,从1开始; ' X,存放原始观测值,二维实型数组,X(P,P)。 ' 返回:计算协方差(相关系数)矩阵。 '******************************************************* Function CovarMat(X() As Single) As Single() Dim XX() As Single Dim P As Integer, N As Integer Dim px As Single P = UBound(X, 1) N = UBound(X, 2) px = IIf(N > 0, 1 / N, 1) ReDim Preserve XX(1 To P, 1 To P) Dim iAs Integer, j As Integer, k As Integer ' 求X乘以X的转置,即A=XXˊ For i = 1 To P For j = 1 To P XX(i, j) = 0 For k = 1 To N XX(i, j) = XX(i, j) + X(i, k) * X(j, k) Next k XX(i, j) = XX(i, j) * px Next j Next i

Fortran常见错误

fortran运行常用错误(转) (2006-11-1010:18:44) 转载▼ 分类:分子动力学 41Insufficient virtual memory虚拟内存不足 70Integer overflow整数溢出错误 71Integer divide by zero整数除0错误 72Floating overflow浮点数溢出错误 73Floating divide by zero浮点数除0错误 74Floating underflow浮点数下溢错误 75Floating point exception浮点数异常错误 77Subscript out of range数组定义超出边界 95Floating-point conversion failed浮点数格式转换失败 146Null pointer error空指针错误 147Stack overflow堆栈溢出 148String length error字符串长度超出允许范围 149Substring error数组下标超出允许范围 150Range error整数值超出允许范围 151Allocatable array is already allocated数组重复定义 161Program Exception-array bounds exceeded引用数组下标超出允许范围162Program Exception-denormal floating-point operand非法浮点数操作符163Program Exception-floating stack check浮点数堆栈检查 164Program Exception-integer divide by zero整数除0错误 165Program Exception-integer overflow整数溢出 166Program Exception-privileged instruction非法执行特权指令 168Program Exception-illegal instruction非法指令 170Program Exception-stack overflow堆栈溢出

Fortran 运行中给出的系统错误及解决方法

. Fortran 运行中给出的系统错误及解决方法 以下均为linker tools errors and warnings Linker Tools Error LNK1000 unknown error; consult documentation for technical support options Note the circumstances of the error, try to isolate the problem and create a reproducible test case, then contact technical support. Linker Tools Error LNK1101 incorrect MSPDBxx.DLL version; recheck installation of this product The version of MSPDBxx.DLL available on your system does not match the version required by this tool. Linker Tools Error LNK1102 out of memory There was not enough memory for the tool to run. Probably the paging file exceeded available disk space. If a shortage of disk space is not the cause, note the circumstances of the error, try to isolate the problem and create a reproducible test case, then request technical support. Linker Tools Error LNK1103 debugging information corrupt; recompile module Probably the compilation was terminated before a valid object file was created.Recompile the given object file. If recompiling does not correct the problem,note the circumstances of the error, try to isolate the problem and create a reproducible test case, then consult technical support. Linker Tools Error LNK1104 cannot open file "filename" The tool could not open the given file. One of the following may be a cause: l There was not enough disk space. l The file does not exist. l The filename or its path was incorrectly specified. l The specified drive is invalid. l The file does not have the appropriate permissions. l The path for filename expands to more than 260 characters. l If the given file is named LNKn, which is a filename generated by the linker for a temporary file, then the directory specified in the TMP environment variable may not exist, or more than one directory is specified for the TMP environment variable. (Only one directory path should be specified for the TMP environment variable.) l If the error occurs on the executable filename, an earlier version of the executable may still be running. You will need to terminate the executable before linking it. In Windows NT (including Windows 2000) or Windows 95,you can use the utility PVIEW to look for and kill instances of the application. l If the error message occurs for a library name, and you recently ported the .MAK file from a previous Microsoft Visual C++ development

青藏高原冬季积雪时空变化特征EOF分析_高文良

收稿日期:2003-10-20作者简介:高文良(1971-),男,工程师。主要从事短期气候预测研究。 青藏高原冬季积雪时空变化特征EOF 分析 高文良1,陈忠明2,闵文彬1 (1.中国气象局成都高原气象研究所,成都 610072;2 四川省气象局) 摘要:通过对青藏高原冬季积雪的EOF 分析,揭示了 青藏高原冬季积雪的时间变化和空间分布特征,分析出高原冬季积雪的突变现象,对青藏高原冬季积雪时空变化规律提出了自己的观点。关键词:青藏高原;冬季积雪;EOF 分析中图分类号:P437文献标识码:A 文章编号:1003-7187(2004)03-0007-041 引言 大气运动下边界的冰雪对大气的作用不可忽视,其对气候变率具有重要影响。在积雪研究中的一个很重要问题是资料的可信度、准确度问题。由于青藏高原上的测站较少,分布不均,所处的位置多位于河谷一带,测站观测资料的代表性受到一定影响。卫星资料也有一定的误差,而且由于不同年代的处理方法的变化经常带来资料精度的不同。因而从各种资料得出的结果存在显著差异。有必要对积雪本身的空间分布和时间变化进一步研究。只有搞清楚它自身的变化特征,才能对它所起的影响做出准确的评判。对于用台站资料做出的一系列研究成果,有必要用其它资料进行验证。2 资料和方法 近年来NCEP /N CA R 再分析资料得到了广泛的应用,取得了十分好的效果。这里就N CEP /NCAR 再分析资料中的月累积积雪深度小当量资料作一些分析,与已有的研究成果作一些比较。虽然NCEP /NCA R 再分析资料是模式资料,但它经过与实测资料的同化再分析和模式物理及动力学约束,可用来探讨某些大气环流变化问题。 NCEP /NCAR 再分析全球月累积积雪水当量深度资料,时间从1949年1月到1999年12月共51年。纬向为1.875°的格距,经向为高斯格点共94点, 单位为kg /m 2。青藏高原取为63.75°~108.75°E , 23.809°~44.761°N 的区域,主要研究了冬季时段(当年12月至下一年2月)的积雪。 EOF 分析方法(经验正交函数展开)对时空场的分解有很多优点,它没有固定的函数,而且展开的收敛速度快。文献[1]中有详细介绍。 EOF 分析分解出的特征向量是有物理意义的信号还是毫无意义的噪音,应该进行显著性检验,特别是当时空场的空间点数大于样本量时,显著性检验十分重要,用Nor th [2]等提出方法来对特征向量进行显著性检验。 根据N orth 等的推导,特征向量λα的误差δλα≈λα 2N 1 2(1)记Δλα=λα-λα-1,那么当δλα/Δλα<1时,λα与λα-1是可以分离的,二特征值间的间距大于特征值的误差,认为该特征值是有意义的,而不是毫无意义的噪音[1]。 另外,在文中还用到了滑动t 检验和M ann -Kendall 方法来检验气候突变。3 结果分析3.1 青藏高原冬季积雪距平场EO F 分析 EOF 分析能够比较清晰地揭示一个时空场的主要时间演变规律和空间分布特征。以前有些工作以积雪的原始场作EOF 分析[3~5],并且以第一特征向量的分布与多年平均场之间的差异作为判定EO F 分析是否成功的标志。依据文献[6]中所述,原始观测场时间序列的第一特征向量与气候平均场的相似性依赖于原始观测场序列在相空间中的结构。时间平均场(气候场)与时间偏差(异常)场的相对强弱在二者的相似与否中起到重要作用。当时间偏差(异常)场的强度较大时,第一特征向量与时间平均场(气候场)完全不相似。因此对冬季高原积雪的距平场作E OF 分析。 · 7·

EOF分解程序

fid=fopen('','r'); Num=360; data=zeros(360,180,Num); for i=1:Num aaa=fscanf(fid,'%s',7); data(:,:,i)=fscanf(fid,'%f',[360,180]); end sst1=data(1:90,11:70,1:Num); % 选取所需要区域的数据 sst2=data(311:360,11:70,1:Num); sst3=zeros(140,60,Num); sst3(90:-1:1,1:60,1:Num)=sst1; sst3(140:-1:91,1:60,1:Num)=sst2; sst=sst3; for i=1:140

for j=1:60 for k=1:Num if(sst(i,j,k)==-1000)||((sst(i,j,k)==-32768)) sst(i,j,k)=NaN; end end end end sst_area1=zeros(Num,8400); % zeros全零数组 for i=1:Num; squ=squeeze(sst(:,:,i)); % 执行该指令后sst数据转换为二维数组 sst_area1(i,:)=reshape(squ,1,8400); % 将数据转变为二维 end

sst_nan=isnan(sst_area1); i=0; for j=1:8400 if sum(sst_nan(:,j))==0; i=i+1; sst_region(:,i)=sst_area1(:,j); end end % 求距平~注意季节的变换 X=zeros(size(sst_region)); % 学者给的程序 for i=1:12 X(i:12:Num-12+i,:)=sst_region(i:12:end,:) - repmat( mean(sst_region(i:12:end,:),1) , size(sst_region(i:12:end,:),1), 1); end

Visual Fortran常见错误内容

Visual Fortran 常见运行错误信息 41 Insufficient virtual memory 虚拟内存不足 70 Integer overflow 整数溢出错误 71 Integer divide by zero 整数除0错误 72 Floating overflow 浮点数溢出错误 73 Floating divide by zero 浮点数除0错误 74 Floating underflow 浮点数下溢错误 75 Floating point exception 浮点数异常错误 77 Subscript out of range 数组定义超出边界 95 Floating-point conversion failed 浮点数格式转换失败 146 Null pointer error 空指针错误 147 Stack overflow 堆栈溢出 148 String length error 字符串长度超出允许范围 149 Substring error 数组下标超出允许范围 150 Range error 整数值超出允许范围 151 Allocatable array is already allocated 数组重复定义 161 Program Exception - array bounds exceeded 引用数组下标超出允许范围 162 Program Exception - denormal floating-point operand 非法浮点数操作符 163 Program Exception - floating stack check 浮点数堆栈检查 164 Program Exception - integer divide by zero 整数除0错误 165 Program Exception - integer overflow 整数溢出 166 Program Exception - privileged instruction 非法执行特权指令 168 Program Exception - illegal instruction 非法指令 170 Program Exception - stack overflow 堆栈溢出 540 Array or substring subscript expression out of range 数组下标低下数组定义 下界或高于数组定义上界 541 CHARACTER substring expression out of range 字符串非法表示 542 Label not found in assigned GOTO list 不属于GOTO语句引用的标号 543 INTEGER arithmetic overflow 整数运算结果出现溢出 544 INTEGER overflow on input 输入的整数值超出允许范围 545 Invalid INTEGER 非法整数值 546 REAL indefinite (uninitialized or previous error) 产生非法实数 547 Invalid REAL 非法实数 548 REAL math overflow 实数值溢出 549 No matching CASE found for SELECT CASE select case语句中缺少case项 550 INTEGER assignment overflow 整数定义超出允许范围 556 A edit descriptor expected for CHARACTER 字符型数据的格式化输入和输出需要A编辑符 557 E, F, D, or G edit descriptor expected for REAL 实数型数据的格式化输入和输 出需要E,F,D,G编辑符 558 I edit descriptor expected for INTEGER 整数型数据的格式化输入和输出需要I编辑符 559 L edit descriptor expected for LOGICAL 逻辑型数据的格式化输入和输出需要L编辑符 568 Multiple radix specifiers 输入或输出语句重复说明 582 Array already allocated 数组已分配 583 Array size zero or negative 数组大小为0或负数

北太平洋SST(1980-1992)的EOF分解及初步分析

北太平洋SST(1980-1992)的EOF分解及初步分析 数据来源: 本文利用来自英国气象局Hadley气候预测和研究中心的HadISST海温资料,对北太平洋(20N-80N 130E-90W)1980至1992年156个月的SST进行研究,。本文选取下载了1870年1月至2011年3月的全球SST数据,数据格式为*cdf,分辨率为1°。以下给出了数据下载的途径和链接: ①点击页面中心处蓝色“main data page”: 图1 ②选择SST数据下载:

图2 数据处理: 本文选取下载了1870年1月至2011年3月的全球SST数据,数据格式为*cdf,数据名为,截取北太平洋(20N-80N 130E-90W)1980年1月至1992年12月156个月份的SST数据进行经验正交函数(Empirical Othorgnal Function)分解,简记为EOF分解,得到该区域该时段的海温时空特征。 在编写Matlab程序过程中,应特别注意: ⑴剔除与其它站点相关系数小的站点的数据~简单的认为剔除陆地和冬季结冰点的数据; ⑵求距平值的协方差矩阵时,要进行逐月平均求距平,而不能是156个月的平均值,否则会导致第1模态的方差贡献率很大; ⑶当变量数m远大于观测样本数n时,导致协方差矩阵mRm=(nXm’)*(nXm)的阶数较大,可先求(nXm)*(nXm’)矩阵的特征值和特征向量,再求(nXm’)*(nXm)的特征值和特征向量,这叫做时空转换; ⑷M文件编写时要尽量减少循环量,提高运算速度; ⑸EOF分析能够有效地体现物理场主要信息,保留次要信息,并排除外来的随机干扰。 数据分析: 用主成分分析(Principal Component Analysis)的方法,即PCA对结果进行分析: 主成分分析是多元统计分析中一个非常重要的内容,它是一种从多个变量化为少数变量的统计方法。由于多个变量之间是相互影响的,它们之间的关系是非常复杂的,为简化分析又不损失信息,并提取它们之间相互关系的主要特征,主成分分析利用多个变量之间的相互关系

FORTRAN常见错误

FORTRAN常见错误 41 Insufficient virtual memory 虚拟内存不足 70 Integer overflow 整数溢出错误 71 Integer divide by zero 整数除0错误 72 Floating overflow 浮点数溢出错误 73 Floating divide by zero 浮点数除0错误 74 Floating underflow 浮点数下溢错误 75 Floating point exception 浮点数异常错误 77 Subscript out of range 数组定义超出边界 95 Floating-point conversion failed 浮点数格式转换失败 146 Null pointer error 空指针错误 147 Stack overflow 堆栈溢出 148 String length error 字符串长度超出允许范围 149 Substring error 数组下标超出允许范围 150 Range error 整数值超出允许范围 151 Allocatable array is already allocated 数组重复定义 161 Program Exception - array bounds exceeded 引用数组下标超出允许范围 162 Program Exception - denormal floating-point operand 非法浮点数操作符 163 Program Exception - floating stack check 浮点数堆栈检查 164 Program Exception - integer divide by zero 整数除0错误 165 Program Exception - integer overflow 整数溢出 166 Program Exception - privileged instruction 非法执行特权指令 168 Program Exception - illegal instruction 非法指令 170 Program Exception - stack overflow 堆栈溢出 540 Array or substring subscript expression out of range 数组下标低下数组定义 下界或高于数组定义上界 541 CHARACTER substring expression out of range 字符串非法表示 542 Label not found in assigned GOTO list 不属于GOTO语句引用的标号 543 INTEGER arithmetic overflow 整数运算结果出现溢出 544 INTEGER overflow on input 输入的整数值超出允许范围 545 Invalid INTEGER 非法整数值 546 REAL indefinite (uninitialized or previous error) 产生非法实数 547 Invalid REAL 非法实数 548 REAL math overflow 实数值溢出 549 No matching CASE found for SELECT CASE select case语句中缺少case项550 INTEGER assignment overflow 整数定义超出允许范围 556 A edit descriptor expected for CHARACTER 字符型数据的格式化输入和输出需要A编辑符 557 E, F, D, or G edit descriptor expected for REAL 实数型数据的格式化输入和输 出需要E,F,D,G编辑符 558 I edit descriptor expected for INTEGER 整数型数据的格式化输入和输出需要I编

fortran 排除错误

安装好VISUAL FORTRAN后 1、运行Developer studio即可开始编译FORTRAN程序 2、选择File菜单中的New选项 3、在弹出的对话框选择projects标签,其他标签不用管,projects格式选用Fortran console application;在project name里命名(最好英文名),点击“ok ” 4、接下来画面中,选择“an empty project”,点击“finish” 5、接下来画面点击“ok” 6、再选择一次File菜单中的new 7、对话框选用files标签,选择Fortran free format source file ,并在file里命名 8、点击“ok” Source Files 放源文件(.c、.cpp)程序的实现代码全放在这里 Header Files 放头文件(.h)声明放在这里 Resource Files 资源文件(.rc)放图标、图片、菜单、文字之类的,主要用来做界面的东东一般都放这里 External Dependencies 除上三种以外的,程序编译时用到的文件全放这里 fortran内部函数出错信息解释 内部函数出错信息解释 [sourcefile(line)]run-time error M62××MATH 错误号函数级数学错误信息 M6201 functionnames:DOMAIN error 函数的自变量超出了约定的取值域,例如sqrt(-1) M6202 functionname:SING error 无意义的变量。例如log10(0) M6203 functionname:OVERFLOW error 函数的结果值或其中一个既时计算值太大以致不能表示,例如EXP(250000.0) M6204 functionname:UNDERFLOW error 函数的结果值或其中一个既时计算值太小以致不能表示。 M6205 functionname:TLOSS error 完全丢失精度,例如COS(1E30) M6206 functionname:PLOSS error fortran debug模式设置和技巧 CVF中有两种编译(连接、执行)模式:release模式和debug模式。调试程序时,宜用debug 模式;调好后再用release模式,得到高效的执行程序。设定debug模式:点击菜单 Build/Set Active Project Configuration,选*- Win32 Debug,OK,即设定为debug模式。以debug模式执行:点击“Go (F5)”按钮,或直接按F5键,则执行程序,并在第 一个出错语句处停止,在该语句前有一个小黄色箭头。若程序没错,则一直执行完毕,自动关闭dos窗口。此时,宜用“!”按钮或“Ctrl+F5”键,执行完成后,dos窗口等

相关主题
文本预览
相关文档 最新文档