在 Fortran 77 或下一个标准中,如何在一个简单的计算中进行多列输出,并使用嵌套循环?

计算科学 正则
2021-12-08 19:41:40

我有一个关于在运行 Fortran 代码后管理输出的简单问题,有一个嵌套循环..
我想为不同的k=1,5,9计算范围内的值与步骤由于所有范围是相同的,我想在cal.dat文件中进行如下输出(当然没有函数,只有数字):Sin(kx)x=0:2πh=0.01xk

x sin(x) sin(5x) sin(9x)
0.0 0 0 0
... ... ... ...


我的代码是:

         program test3
         real dx,f,x
         k=1
         pi=4.0*atan(1.0)
         open(11,file='sinkx.dat',status='unknown',form='formatted')
         do  while(k<10)
         x=0.0
         dx=0.01
         do while(x<2*pi)
         f=sin(k*x) 
         write(11,1001) x,f
1001     format(' ',f9.3,' ',e12.3)
         x=x+dx
         enddo
         k=k+4
         enddo
         end



问题是,当您运行此代码时,您得到的输出不是根据需要在多列输出中,而是在两列输出中,其中首先出现的数字x范围和第二列中的值Sin(kx)对于不同的k=1, 然后k=5然后k=9.
正如我在上面所指出的,如何在多列输出中写入结果?
我认为问题在于运算符而不是计算?
当然,我可以将结果写在三个不同的cal.dat中,但我更喜欢将它写在一个dat文件中,因为x所有人都一样k.

2个回答

您的程序存在多个问题。我不确定您为什么期望它以您想要的方式产生多列输出。您正在为每个k循环x您需要先切换此嵌套。

正如您正确猜测的那样,write 语句有一个说明符advance='no',您可以在使用格式化输出时使用它来不前进到下一行。我已经做出了可以为您提供所需格式的更改。它有点hacky,但它有效。

program test3
  real dx,f,x
  pi=4.0*atan(1.0)
  open(11,file='sinkx.dat',status='unknown',form='formatted')
  x=0.0
  dx=0.01
  do while(x<2*pi)
    write(11,'(f9.3)',advance='no') x
    k=1
    do  while(k<10)
      f=sin(k*x) 
      write(11,1001,advance='no') f
      k=k+4
    enddo
    x=x+dx
    write(11,*) ' '
  enddo
  1001  format(' ',e12.3)
endprogram

我建议转移到 Fortran 90 并在 write 语句中使用隐含的 do 循环:

program test3
    real, parameter :: dx=0.01
    real :: x
    integer :: k
    pi=4.0*atan(1.0)
    open(unit=11,file='sinkx.dat',status='replace',form='formatted')
    x=0.0
    do while(x < 2.0*pi)
        write(unit=11,fmt='(X,F9.3,10(X,E12.3))') &
            x, (SIN(REAL(k)*x),k=1,10,4)
        x=x+dx
    end do
    close(unit=11)
end program test3

fmt='(X,F9.3,10(X,E12.3))'编辑:请注意,如果我们将 10 替换为大于或等于 3 的任何数字,这也将起作用。我们还可以在运行时计算数字:

program test3
    ...
    integer, parameter :: k_max=10
    character(len=64) :: my_format
    write(my_format,'(A,I0,A)') "(X,F9.3,", 1+(k_max-1)/4, "(X,E12.3))"
    ...
    do while(x < 2.0*pi)
        write(unit=11,fmt=my_format) &
            x, (SIN(REAL(k)*x),k=1,k_max,4)
        x=x+dx
    end do
    ...
end program test3