program barnes
implicit none
external sub1,sub2
integer,parameter::xx=4,yy=4
real Fa(xx,yy),Fb(xx,yy),Fd(xx,yy),Fk(xx,yy),F0(xx,yy),F(xx,yy)
real G1,G2
integer c1,c2,i,j
write(*,*)'please write G1,c1'
read *,G1,c1
open(3,file='d:/barns/beijing.grd',form='binary')
read(3) ((Fk(i,j),j=1,yy),i=1,xx)
call sub1(Fk,c1)
call sub2(F0,G1,Fk,c1)
Fa=F
write(*,*)'please write G2,c2'
read*,G2,c2
call sub1(Fk,c2)
call sub2(F0,G1,Fk,c2)
Fb=F
do i=1,xx
do j=1,yy
Fd(i,j)=Fa(i,j)-Fb(i,j)
write(*,*)Fd
enddo
enddo
write(*,*)
OPEN(11,FILE='d:/barns/out2.grd',form='binary')
write(11) ((Fd(i,j),j=1,yy),i=1,yy)
close(11)
close(8)
end
subroutine sub1(Ff,c)!计算初始值
implicit none
integer i,j,m,n,c,xx,yy
real F0(xx,yy),Ff(xx,yy),F2,F3,F4,Wk,Rk
common xx,yy
do i=1,xx
do j=1,yy
do m=1,xx
do n=1,yy
Rk=sqrt((i-m)**2.0+(j-n)**2.0)
Wk=exp(-(Rk**2.0)/(4.0*c))!权重函数计算
F2=Wk*Ff(m,n) !分子计算
F3=F2+F3
F4=F4+Wk
enddo
enddo
F0(i,j)=F3/F4
enddo
enddo
endsubroutine
subroutine sub2(F0,G,Ff,c)!计算F值
implicit none
integer i,j,m,n,c,xx,yy
real F0(4,4),Ff(4,4),F(4,4),Fs(4,4),D,F2,F3,F4,Rk,Wk,G
common xx,yy
do i=1,xx
do j=1,yy
do m=1,xx
do n=1,yy
D=Ff(m,n)-F0(m,n)
Rk=sqrt((i-m)**2.0+(j-n)**2.0)
Wk=exp(-(Rk**2.0)/(4.0*c*G))!权重函数计算
F2=Wk*D !分子计算
F3=F2+F3
F4=F4+Wk
enddo
enddo
Fs(i,j)=F3/F4
F(i,j)=Fs(i,j)+F(i,j)
enddo
enddo
endsubroutine
QQ截图20140506205104.png (22.96 KB, 下载次数: 518)
计算结果
225 Bytes, 下载次数: 1
资料
vvt 发表于 2014-5-6 21:12
没有输入文件 beijing.grd,无法替你调试。
学会 Debug,你会自己解决所有的计算结果不符合预期的问题。
fcode 发表于 2014-5-6 22:13
真是....说一句做一句。
你让别人调试,至少要让别人能按照你的意图跑一遍啊。一开始,不提供输入文件。然 ...
fcode 发表于 2014-5-6 22:20
Fd(i,j)=Fa(i,j)-Fb(i,j)
write(*,*)Fd
盐酸兔子 发表于 2014-5-6 22:44
想将第一次计算的F数组赋给Fa,第二次计算的赋给Fb。Fa=F不可以直接将数组赋值过去么 ...
fcode 发表于 2014-5-6 22:46
可以直接赋值数组。问题是,你的 F 也没有值啊。你算 F 了么?
请注意,子程序里的 F,主程序不能直接使 ...
aliouying 发表于 2014-5-7 12:21
开个贴讲下如何发帖求助吧
fcode 发表于 2014-5-6 22:46
可以直接赋值数组。问题是,你的 F 也没有值啊。你算 F 了么?
请注意,子程序里的 F,主程序不能直接使 ...
fcode 发表于 2014-5-8 21:49
绝大多数错误,只要自己翻译一下错误提示就可以了。
错误就是,数组的维度定义了超过一次。一般数组只定义 ...
fcode 发表于 2014-5-8 22:00
实参,虚参传递,是基本的函数调用。
就像你的 sub1 一样,把 FF 和 c 传递过去。
x=3.0
call sub( x )
write(*,*) x
subroutine sub(y)
y = 4.0
end subroutine sub
fcode 发表于 2014-5-8 22:09
一样,没有区别。
[mw_shl_code=fortran,true]
x=3.0
fcode 发表于 2014-5-8 22:23
子程序里或许需要对 F 进行一些修改。
实参虚参传递,是一个最基本的使用,你必须学会。(实际上,sub1里 ...
fcode 发表于 2014-5-8 22:23
子程序里或许需要对 F 进行一些修改。
实参虚参传递,是一个最基本的使用,你必须学会。(实际上,sub1里 ...
fcode 发表于 2014-5-12 22:59
Debug 一下,看 call 子程序的语句是否执行了?
欢迎光临 Fortran Coder (http://bbs.fcode.cn/) | Powered by Discuz! X3.2 |