相同的印刷声明产生不同的结果

时间:2017-05-01 19:03:05

标签: fortran

下面的示例代码表示我遇到的问题。这是为了重现我遇到的问题,我可以做到最小/完整。我的问题是,相同的打印语句,相隔三行,产生两种不同的结果。第一个print语句产生正确的结果,而第二个产生错误的结果。我是否在这3行中重写变量定义?为什么当我将打印声明向下移动3行时,我会得到一个不同的,不正确的结果?打印报表如下所示。由于变量以某种方式被更改,这导致我的代码中的预期结果中出现很多问题。但是,我只是想了解这些印刷语句的最新情况。谢谢。

Module Sample

integer :: n,m 

contains 

subroutine Sub1(localf0)
implicit none

complex, dimension(-10:10,-10:10), intent(inout) :: localf0
complex, dimension(-10:10,-10:10) :: localf1
complex, dimension(-10:10,-10:10) :: Deriv0, Deriv1


Deriv0 = Deriv(localf0)

do while (norm2(abs(Deriv0)) > 0.000001) 

   print*, abs(localf1(1,1))-abs(localf0(1,1))  
   localf1   = localf0 +1.0*Deriv(localf0) 
   Deriv0 = Deriv(localf0)
   Deriv1 = Deriv(localf1)
   print*, abs(localf1(1,1))-abs(localf0(1,1))  

end do

end subroutine Sub1

function  Deriv(func)

implicit none

real :: x, y
complex, dimension(-10:10,-10:10), intent(in) :: func
complex, dimension(-10:10,-10:10) :: localf,Deriv

localf = func

do m=-9,9
do n=-9,9

      x = real(n)*0.1
      y = real(m)*0.1
      localf(n,m)= cmplx(z1(x,y),z2(x,y))

end do
end do

do m=-9,9
do n=-9,9

    Deriv(n,m) = (localf(n+1,m)+localf(n-1,m)+localf(n,m+1)+localf(n,m-1)-4*localf(n,m))/0.01 

end do
end do

end function Deriv

End Module Sample

program MyProgram

  use Sample
  implicit none
  complex, dimension(-10:10,-10:10) :: localf0,localf1

  do m=-10,10
  do n=-10,10

       localf0(n,m) =    cmplx(z1(real(n)*0.1,real(m)*0.1) , z2(real(n)*0.1,real(m)*0.1))
       localf1   = localf0 + 1.0*Deriv(localf0)

  end do
  end do

  call  Sub1(localf0)

end program

1 个答案:

答案 0 :(得分:3)

现在我已经运行它,这里有一个阴险的东西我坦率地认为编译器应该抛出错误。 (为什么我把它作为答案而不是评论)

你已经创建了n,m模块变量,有效地使它们成为全局变量,并且在主程序循环和函数内部的循环中使用相同的n,m

您的函数deriv 更改nm的值。 (它们作为最后一个循环的结束值返回),这样主程序循环就不会完成。

如果你放入主循环,你可以看到这个:

 print*,m,n
 localf1 = localf0 + 1.0*deriv(localf0)
 print*,m,n

你得到:

  

-10 -10

     

10 10

并且循环退出..(10,10比函数内的9,9的循环限制多一个。)

您应该从模块中删除integer n,m。在需要的地方声明n,m个整数(在derivMyProgram中单独声明)

您可能还注意到,localf1没有理由首先在主程序循环中分配(或者因为您从未使用过它而设置完毕)。删除该分配也可以解决问题,但我仍然建议将n,m声明更改为本地。

请注意,修复后仍然存在while循环的每次迭代都没有变化的问题,因此它会无限循环地打印相同的值。我想你想在循环结束时更新localf0=localf1