Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 在Fortran中,变量在do循环中不会更改_Loops_Fortran - Fatal编程技术网

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

Loops 在Fortran中,变量在do循环中不会更改,loops,fortran,Loops,Fortran,我写了这个简单的代码。我在和Q_fin中获得Q_,但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 d

我写了这个简单的代码。我在和Q_fin中获得
Q_,但
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
您的错误在于:

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。也许这给了编译器更多的优化机会(运行并比较两种方法)。您将删除整个
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
可能有更好的版本,但我将此作为练习。

您的错误在于:

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。也许这给了编译器更多的优化机会(运行并比较两种方法)。您将删除整个
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
可能有一个更好的版本,但我将把它作为练习。

输入文件中有什么?(也可以尝试使用较小的文件,只需将程序中的
nj
设置为例如5,并在调试过程中尝试打印中间结果。在读取之后放置一个print语句,查看a是否正确分配
1/2
对于整数算术返回0,这可能是问题的原因。感谢@RodrigoRodrigues,我删除了这个。Paolo,让我知道1/2问题是否解决了你的问题,如果可以,我可以发布答案。输入文件中有什么?(也可以尝试使用较小的文件,只需将程序中的
nj
设置为例如5,并在调试过程中尝试打印中间结果。在读取之后放置一个print语句,查看a是否正确分配
1/2
对于整数算术返回0,这可能是问题的原因。感谢@RodrigoRodrigues,我删除了这个。Paolo,让我知道1/2的问题是否解决了你的问题,如果可以的话,我可以发布一个答案。非常感谢。今天这是我第一次使用fortran。我知道很好的matlab事实我写这段代码就像我使用matlab一样谢谢。今天是我第一次使用fortran。我知道很好的matlab事实我写这段代码就像我使用matlab一样