爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 2497|回复: 2

[求助] 做小波分析 用fortran程序处理数据出现警告

[复制链接]

新浪微博达人勋

发表于 2016-6-17 18:52:05 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
程序为
       program wwave
c      this file use the 93' data in nh( 105.0-120.E, 4.762-20.N)
       parameter(n=55,dt=1.0,s0=2*dt,dj=0.25,m=19)
       dimension sst(n),recon(n),con(n),wte(n,m),sst1(n)
       dimension s(m),period(m),dof(m),fft_theo(m),signif(m)
       dimension glob_ws(m),wtm(n,m),wtr(n,m),glob_signif(m)
       complex wave(n,m)
       real lag1
c
open(1,file='C:\lunwen\lb\xb\lb.txt',form='binary',
     *recl=4)
c       read(1,*)sst
       do 1 i=1,n
       read(1) sst(i)
1     continue
       close(1)
       print*,'sst()',sst(1),sst(n-1),sst(n)
c
c      ---------canceled by hhy
c       call corr(sst,n,lag1,r1,r2)
c       write(*,*)'lag1=',lag1
c
       pi=4.0*atan(1.0)
       ibase2=nint(alog(float(n))/alog(2.0))+1
       npad=int(2.0**ibase2)
       print*,'step 1'
       write(*,*)npad
       call wavelet(n,sst,dt,s0,dj,m,wave,s,period,con,npad)
c  significance testing
c  local significance test
       isigtest=0
       siglvl=0.05
       call wave_signif(isigtest,n,sst,dt,dj,m,s,period,
     &      lag1,siglvl,dof,fft_theo,signif,ymean,variance,cdelta,psi0)
c  global wavelet spectrum & signficance test
       isigtest=1
       siglvl=0.05
       do 10 j=1,m
         glob_ws(j)=0.
         do 20 i=1,n
           glob_ws(j)=glob_ws(j)+cabs(wave(i,j))**2
20      continue
         glob_ws(j)=glob_ws(j)/(n*variance)
         dof(j)=n-s(j)
10    continue
       call wave_signif(isigtest,n,sst,dt,dj,m,s,period,
     &      lag1,siglvl,dof,fft_theo,glob_signif,ymean,
     &      variance,cdelta,psi0)
       delta=0.
       do 31 i=1,n
       do 31 j=1,m
         delta=delta+(cabs(wave(i,j))**2)/s(j)
31    continue
       delta=delta*dj*dt/(cdelta*n)
       print*,'delta,variance,ymean'
       write(*,*)delta,variance,ymean
c  reconstruct the time series
       recon_mean=0.
       recon_vari=0.
       do 32 i=1,n
         recon(i)=0.
         do 33 j=1,m
33        recon(i)=recon(i)+(real(wave(i,j)))/sqrt(s(j))
         recon(i)=dj*sqrt(dt)*recon(i)/(cdelta*psi0)        
         recon_vari=recon_vari+(sst(i)-ymean-recon(i))**2
         recon_mean=recon_mean+recon(i)
32    continue
       recon_mean=recon_mean/n
       recon_vari=sqrt(recon_vari/n)
       print*,'recon_mean,recon_vari'
       write(*,*)recon_mean,recon_vari
      
       do 81 i=1,m
       do 81 j=1,n
         wtm(j,i)=cabs(wave(j,i))**2/variance
         wtr(j,i)=real(wave(j,i))
         wte(j,i)=cabs(wave(j,i))
81    continue
c
       open(21,file='C:\lunwen\lb\xb\nhr_re.dat',
     *access='direct',form='binary',recl=n*m*4)
       open(61,file='C:\lunwen\lb\xb\nhr_mse.dat',
     *access='direct',form='binary',recl=n*m*4)
       open(31,file='C:\lunwen\lb\xb\nhr_mod.dat',
     *access='direct',form='binary',recl=n*m*4)
c       open(61,file='e:\data\nh82md.dat')
c       open(31,file='e:\data\nh90en.dat')
c       open(4,file='f:\data\nh90recn.dat')
c       open(5,file='f:\data\nh90glb_ws.dat')
      
         
        write(21,rec=1) ((wtr(j,i),j=1,n),i=1,m)
        write(31,rec=1) ((wtm(j,i),j=1,n),i=1,m)
        write(61,rec=1) ((wte(j,i),j=1,n),i=1,m)
80    continue
c       write(4,200)(recon(i),i=1,72)
c       do 40 i=1,m
c         write(5,300)period(i),s(i)
c         write(5,301)i,glob_ws(i),glob_signif(i)
c 40    continue
         
200   format(10f7.2)
300   format(5x,'period is',f7.3,3x,'scale is',f7.3)
301   format(4x,i5,2(6x,f8.3))
       stop
       end
c-------------------------------------------------------------
       subroutine fast(n,x,nd,ind)
       complex x(nd),temp,theta
       j=1
       do 140 i=1,n
         if(i.ge.j)goto 110
         temp=x(j)
         x(j)=x(i)
         x(i)=temp
110     m=n/2
120     if(j.le.m)goto 130
         j=j-m
         m=m/2
         if(m.ge.2)goto 120
130     j=j+m
140   continue
       kmax=1
150   if(kmax.ge.n)return
       istep=kmax*2
       do 170 k=1,kmax
         theta=cmplx(0.0,3.141593*float(ind*(k-1))/float(kmax))
         do 160 i=k,n,istep
           j=i+kmax
           temp=x(j)*cexp(theta)
           x(j)=x(i)-temp
           x(i)=x(i)+temp
160     continue
170   continue
       kmax=istep
       goto 150
       return
       end
c-------------------------------------------------------------
       subroutine corr(sst,n,r,r1,r2)
       dimension sst(n)
       a=0.0
       s=0.0
       do 1 i=1,n
         a=a+sst(i)
1     continue
       a=a/float(n)
       do 2 i=1,n
         s=s+(sst(i)-a)**2
2     continue  
       s=sqrt(s/float(n))
       r1=0.
       do 4 i=1,n-1
         r1=r1+(sst(i)-a)*(sst(i+1)-a)
4     continue  
       r1=r1/(float(n-1)*s*s)
       r2=0.
       do 5 i=1,n-2
         r2=r2+(sst(i)-a)*(sst(i+2)-a)
5     continue  
       r2=r2/(float(n-2)*s*s)
       r=(r1+sqrt(r2))/2.0
      
       return
       end
c-----------------------------------------------
       subroutine wavelet(n,y,dt,s0,dj,jtot,
     &                    wave,s,period,coi,npad)
c       parameter(npad=128)
       real y(n),dt,s0,dj,s(jtot),period(jtot),coi(n)
       complex wave(n,jtot)
       real ymean,freq1,pi,period1,coi1,kwave(npad)
       complex yfft(npad),daughter(npad)
      
       pi=4.0*atan(1.0)
       if(npad.lt.n)then
         print*,'wavelet:"npad" must be greater than or equal to "n"'
         return
       endif
c  find the time-series mean & remove it      
       ymean=0.0
       do 10 i=1,n
         ymean=ymean+y(i)
10    continue
       ymean=ymean/n
       do 15 i=1,n
         yfft(i)=y(i)-ymean
15    continue
c  if desired,pad with extra zeroes
       do 20 i=n+1,npad
         yfft(i)=0.0
20    continue
c  find the FFT of the time series [Eqn(3)]                    
       call fast(npad,yfft,npad,-1)
       do 30 k=1,npad
         yfft(k)=yfft(k)/npad
30    continue
c  construct the wavenumber array [Eqn(5)]
       freq1=2.0*pi/(float(npad)*dt)
       kwave(1)=0.0
       do 40 i=2,npad/2+1
         kwave(i)=(float(i)-1.0)*freq1
40    continue
       do 50 i=npad/2+2,npad
         kwave(i)=-kwave(npad-i+2)
50    continue

c  main wavelet loop
       do 100 j=1,jtot
         s(j)=s0*(2.0**(float(j-1)*dj))
         call wave_function(npad,dt,s(j),kwave,period1,coi1,daughter)
         period(j)=period1
c   multiply the daughter by the time-series FFT
         do 60 k=1,npad
           daughter(k)=daughter(k)*yfft(k)
60      continue
c   inverse FFT [Eqn(4)]
         call fast(npad,daughter,npad,1)
c   store the wavelet tranform, discard,zero-padding at end
         do 70 i=1,n
           wave(i,j)=daughter(i)
70      continue
100   continue
       print*,'step2  s(1),s(17)='
       write(*,*)s(1),s(17)
c  construct the cone of influence
       do 110 i=1,(n+1)/2
         coi(i)=coi1*dt*(float(i)-1.0)
         coi(n-i+1)=coi(i)
110   continue

       return
       end
c-----------------------------------------
       subroutine wave_function(nk,dt,scale1,kwave,
     &                         period1,coi1,daughter)
       real dt,kwave(nk),scale1,period1,coi1
       complex daughter(nk)
       real expnt,pi,norm,fourier_factor
      
       pi=4.0*atan(1.0)
       norm=sqrt(2.*pi*scale1/dt)*(pi**(-0.25))
       do 10 k=1,nk/2+1
         expnt=-0.5*(scale1*kwave(k)-6.0)**2
         daughter(k)=cmplx(norm*exp(expnt))
10    continue
       do 20 k=nk/2+2,nk
         daughter(k)=cmplx(0.0)
20    continue
       fourier_factor=(4.*pi)/(6.0+sqrt(2.+6.**2))
       period1=scale1*fourier_factor
       coi1=fourier_factor/sqrt(2.0)
      
       return
       end                  
c-----------------------------------------------------
       subroutine wave_signif(isigtest,n,y,dt,dj,jtot,s,period,lag1,
     &        siglvl,dof,fft_theo,signif,ymean,variance,cdelta,psi0)
       real y(n),dt,dj,s(jtot),period(jtot)
       real lag1,siglvl,dof(jtot),fft_theo(jtot),signif(jtot)
       real ymean,variance,cdelta,psi0
       real pi,freq1,dofmin,dj0,savg,smid
       real fft_theor1
       pi=4.0*atan(1.0)
       siglvl=0.05
       if(lag1.le.0.)lag1=0.0
       dofmin=2.
       cdelta=0.776
       gammafac=2.32
       dj0=0.60
       psi0=pi**(-0.25)
c  find the time-series variance
       ymean=0.0
       do 10 i=1,n
         ymean=ymean+y(i)
10    continue
       ymean=ymean/n
       variance=0.0
       do 15 i=1,n
         variance=variance+(y(i)-ymean)**2
15    continue
       variance=variance/(float(n))
c  construct theoretical red(white)-noise power spectrum [Eqn(16)]
       do 20 j=1,jtot
         freq1=dt/period(j)
         fft_theo(j)=(1.-lag1**2)/(1.-2.*lag1*cos(freq1*2.*pi)
     &                               +lag1**2)
20    continue
       if(isigtest.eq.0)then
c----no smoothing, dof=dofmin----
c  see Eqn(18)
        chisqr2=5.99
        do 30 j=1,jtot
          signif(j)=fft_theo(j)*chisqr2/dofmin
30     continue
       elseif(isigtest.eq.1)then
c----time-averaged, dof depend on scale----
c  see Eqn(23)
        do 40 j=1,jtot
          dof(j)=dofmin*sqrt(1+(n*dt/(gammafac*s(j)))**2)
          chi1=dof(j)+0.85+1.645*sqrt(2*dof(j)-1.0)
          signif(j)=fft_theo(j)*chi1/dof(j)
40     continue
      elseif(isigtest.eq.2)then
c----scale-averaged, dof depend on scale----
        javg1=0
        javg2=0
        do 50 j=1,jtot
          if((s(j).ge.dof(1)).and.(javg1.eq.0))javg1=j
          if(s(j).le.dof(2))javg2=j
50     continue
        if((javg1.eq.0).or.(javg2.eq.0).or.(javg1.gt.javg2))then
          print*,'***wave_signif: Scales in "dof(1)" & "dof(2)"'//
     &            'are out of range'
        return
        end if
        navg=javg2-javg1+1
c  see Eqn(25)
        savg=0.
        do 60 j=javg1,javg2
          savg=savg+1./s(j)
60     continue
        savg=savg+1./savg
c  see Eqn(27)
        fft_theor1=0.
        do 70 j=javg1,javg2
          fft_theor1=fft_theor1+fft_theo(j)/s(j)
70     continue
        fft_theo(1)=savg*fft_theor1
c  see Eqn(28)
        smid=exp(0.5*(alog(s(javg1))+alog(s(javg2))))
        dof(1)=(dofmin*navg*savg/smid)*sqrt(1+(navg*dj/dj0)**2)
        chi=dof(1)+0.85+1.645*sqrt(2*dof(1)-1.0)
c  see Eqn(26)
        signif(1)=(dj*dt/(cdelta*savg))*fft_theo(1)*chi/dof(1)
        do 80 j=2,jtot
          dof(j)=0.0
          fft_theo(j)=0.0
          signif(j)=0.0
80     continue
        endif
        end
出现警告为
--------------------Configuration: WAVELETjfind - Win32 Debug--------------------
Compiling Fortran...
C:\lunwen\lb\xb\WAVELETjfind.f
C:\lunwen\lb\xb\WAVELETjfind.f(108): warning FOR4270: unused symbol SST1
WAVELETjfind.obj - 0 error(s), 1 warning(s)

运行后出现
SHIMVIEW: ShimInfo(Complete)
Loaded symbols for 'C:\lunwen\lb\xb\wavele~1.exe'
First-chance exception in WAVELETjfind.exe (WAVELE~1.EXE): 0xC0000090: Float Invalid Operation.
The program 'C:\lunwen\lb\xb\WAVELETjfind.exe' has exited with code 1 (0x1).


求助大神指点迷津

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-6-17 19:57:13 | 显示全部楼层
没人会帮你这么看程序的,自己设stop一步一步看哪出错了,但首先你得自己看懂程序!!!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-6-18 22:44:21 | 显示全部楼层
这个也太长了吧~断点看看哪儿错了呢先
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表