我写了这个简单的代码。我获得了Q_in
和Q_fin
,但是Q
的值仍然为零。因此,我认为do
循环无效。
program readwrite
implicit none
real a(200,4),Q_in,Q_fin,Q,Q_tot,v_med
integer i,j,nj
character*40 nome
write(6,*) 'nome file'
read(5,'(a)') nome
open(unit=16,file=nome)
nj=180
do i=1,nj
read(16,*) (a(i,j),j=1,4)
enddo
Q_in=(a(1,1)-a(1,3))/2*a(1,2)
Q_fin=(2-a(180,1))/2*a(180,2)
Q=0
do i=1,nj-1
Q=Q+1/2*((a(i+1,2)+a(i,2))*(a(i+1,1)-a(i,1)))
enddo
Q_tot=Q+Q_in+Q_fin
v_med=Q_tot/2
write(6,*) 'velocita media', v_med
write(6,*) 'Q', Q
write(6,*) 'Q_in', Q_in
write(6,*) 'Q_fin', Q_fin
end
答案 0 :(得分:2)
您的错误在于:
Q=Q+1/2*((a(i+1,2)+a(i,2))*(a(i+1,1)-a(i,1)))
1/2
是整数算术运算,返回0,然后乘以余数,所有迭代的总和仍为0。只需将其更改为真实值0.5
Q=Q+0.5*((a(i+1,2)+a(i,2))*(a(i+1,1)-a(i,1)))
此外,您可以使用数组操作代替显式操作。也许这为编译器提供了更多优化的机会(运行并比较两种方法)。您将删除整个do I=1, nj-1 (...) end do
块并替换为:
Q = 0.5 * sum((a(2:nj, 2) + a(:nj-1, 2)) * (a(2:nj, 1) - a(:nj-1, 1)))
dot_product
可能有更好的版本,但我将作为练习。