- 积分
- 1452
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2014-9-19
- 最后登录
- 1970-1-1
|
楼主 |
发表于 2015-5-6 14:17:01
|
显示全部楼层
这是滤波程序:
!include 'distance.inc'
program main
implicit none
integer,parameter::xx=144,yy=73,dg=1
real,parameter::C1=10000,C2=150000,G=0.3,pi=3.14
real,external::distance
integer::i,j,k,l
real::r,ii,jj,kk,ll
real::hgt(yy,xx),F1(yy,xx),F2(yy,xx),F(yy,xx),D1(yy,xx),D2(yy,xx),&
E1(yy,xx),E2(yy,xx),F11(yy,xx),F21(yy,xx),F12(yy,xx),F22(yy,xx),t1,t2,w1,w2
open(unit=1,file='f:\tbbdata\1982_02\olr\olr1.dat',form='unformatted',access='direct',recl=1,status='old')
k=0
do i=1,yy
do j=1,xx
k=k+1
read(unit=1,rec=k) hgt(i,j)
enddo
enddo
close(1)
!write(*,*) hgt(1:5,1:5)
!method1
do i=1,yy
do j=1,xx
w1=0
t1=0
w2=0
t2=0
do k=1,yy,dg
do l=1,xx,dg
r=distance(-90.0+(i-1)*2.5,-90.0+(k-1)*2.5,(j-1)*2.5,(l-1)*2.5)
if(r<=sqrt(C1))then
w1=w1+exp(-r**2/(4*C1))
t1=t1+hgt(k,l)*exp(-r**2/(4*C1))
endif
if(r<=sqrt(C2))then
w2=w2+exp(-r**2/(4*C2))
t2=t2+hgt(k,l)*exp(-r**2/(4*C2))
endif
enddo
enddo
F1(i,j)=t1/w1
F2(i,j)=t2/w2
enddo
enddo
print *,'Finish method1'
F=F1-F2
open(unit=20,file='f:\tbbdata\1982_02\olr\olr01.dat',form='binary')
do i=1,yy
do j=1,xx
write(10) F(i,j)
enddo
enddo
!method2
D1=hgt-F1
D2=hgt-F2
do i=1,yy
do j=1,xx
w1=0
t1=0
w2=0
t2=0
do k=1,yy,dg
do l=1,xx,dg
r=distance(-90.0+(i-1)*2.5,-90.0+(k-1)*2.5,(j-1)*2.5,(l-1)*2.5)
if(r<=sqrt(C1))then
w1=w1+exp(-r**2/(4*G*C1))
t1=t1+D1(k,l)*exp(-r**2/(4*G*C1))
endif
if(r<=sqrt(C2))then
w2=w2+exp(-r**2/(4*G*C2))
t2=t2+D2(k,l)*exp(-r**2/(4*G*C2))
endif
enddo
enddo
F11(i,j)=F1(i,j)+t1/w1
F21(i,j)=F2(i,j)+t2/w2
enddo
enddo
print *,'Finish method2'
F=F11-F21
do i=1,yy
do j=1,xx
write(10) F(i,j)
enddo
enddo
!method3
E1=F11-F1
E2=F21-F2
do i=1,yy
do j=1,xx
w1=0
t1=0
w2=0
t2=0
do k=1,yy,dg
do l=1,xx,dg
r=distance(-90.0+(i-1)*2.5,-90.0+(k-1)*2.5,(j-1)*2.5,(l-1)*2.5)
if(r<=sqrt(C1))then
w1=w1+exp(-r**2/(4*C1))
t1=t1+E1(k,l)*exp(-r**2/(4*C1))
endif
if(r<=sqrt(C2))then
w2=w2+exp(-r**2/(4*C2))
t2=t2+E2(k,l)*exp(-r**2/(4*C2))
endif
enddo
enddo
F12(i,j)=F11(i,j)+3*(F11(i,j)-F1(i,j))/4-t1/w1
F22(i,j)=F21(i,j)+3*(F21(i,j)-F2(i,j))/4-t2/w2
enddo
enddo
print *,'Finish method3'
F=F12-F22
! write(*,*) F(1:5,1:5)
do i=1,yy
do j=1,xx
write(20) F(i,j)
enddo
enddo
close(20)
end program main
function distance(lat1,lat2,lon1,lon2)
implicit none
real,parameter::R=6371.004,pi=3.1415926
real::lat1,lat2,lon1,lon2
real::distance,temp
temp=(cos(lat1*pi/180)*cos(lat2*pi/180)*cos((lon1-lon2)*pi/180)+sin(lat1*pi/180)*sin(lat2*pi/180))
distance=R*acos(temp)
return
end function distance
|
|