变量在Fortran中的do循环中不会更改

时间:2018-10-12 10:31:35

标签: loops fortran

我写了这个简单的代码。我获得了Q_inQ_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

1 个答案:

答案 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可能有更好的版本,但我将作为练习。