【问题标题】:recursively take in input file for operation递归地取输入文件进行操作
【发布时间】:2015-05-13 00:23:31
【问题描述】:

我有几个名称为angleFile1.dat、angleFile2.dat、angleFile3.dat 等的输入数据文件。 (我有超过 100 个文件)

每个文件包含 45000 个角度数据。我想对这些角度进行分组以获得 0 到 360 度之间的分布。

我已经编写了一个 Fortran 代码来一次处理一个文件。

此代码将读取输入文件“angleFile1.dat”并将分布(以 bin 为单位)写入“angleOut.dat”文件。

program binangle
implicit none

integer :: i, j, k
integer,parameter :: arr=45000

real,dimension(1:arr) :: aangle
integer,dimension(0:360) :: binaangle

do i = 0,360
 binaangle(i) = 0.0
end do

 !OPEN OUTPUT FILE
open(unit=49,status="unknown",file="angleOut.dat")

 !OPEN INPUT FILE
open(unit=50,status="unknown",file="angleFile1.dat")
read(50,'(F8.3)') (aangle(i), i = 1,arr)


! DO THE BINNING    
do j = 1, arr
        binaangle(int(aangle(j))) = binaangle(int(aangle(j))) + 1
end do


! WRITE INTO OUTPUT FILE    
do k = 0,360
write(49,*) k, "    ", binaangle(k)
end do

如何使这段代码递归地接收输入文件(angleFile1.dat、angleFile2.dat、angleFile3.dat 和直到angleFile100.dat)并将分布写入同一个输出文件?

非常感谢您的帮助。

【问题讨论】:

  • 这个问题的答案——stackoverflow.com/questions/6146516/…——向您展示了如何在程序执行时构建文件名。当你写“递归”时,我认为你的意思是“迭代”。

标签: fortran fortran90 gfortran fortran95


【解决方案1】:

嗯,一种方法是将阅读分成一个单独的子程序。类似(未经测试):


program binangle
implicit none

integer :: i, k
integer,parameter :: nfiles = 100 ! Use get_command_argument to read the
                                  ! value at runtime rather than hardcoded,
                                  ! left as an exercise to the reader

integer,dimension(361) :: binaangle

binaangle = 0 ! Use array op rather than manual loop

do i = 1, nfiles
  call add_angles_to_bins(binaangle, i)
end do

!OPEN OUTPUT FILE
open(unit=49,status="replace",file="angleOut.dat")

! WRITE INTO OUTPUT FILE    
do k = 1, ubound(binaangle, 1)
  write(49,*) k - 1, "    ", binaangle(k)
end do

contains
subroutine add_angles_to_bins(bins, fnum)
  integer, intent(inout) :: bins(:)
  integer, intent(in) :: fnum
  character(len=200) :: fname
  integer, parameter :: arr = 45000
  real :: aangle(arr)
  write(fname, '(A,I0,A)') 'angleFile', fnum, '.dat'
  !OPEN INPUT FILE
  open(unit=50,status="old",file=fname)
  read(50,'(F8.3)') aangle
  close(50)
  ! DO THE BINNING    
  do j = 1, arr
    binaangle(int(aangle(j)) + 1) = binaangle(int(aangle(j)) + 1) + 1
  end do
end program binangle

(有人可能会补充说,上述建议的解决方案不使用递归。)

【讨论】:

  • 谢谢。我定义了“j”并添加了“end subroutine add_angles_to_bins”短语。如果您不介意,我想问一下如何规范化输出文件“angleOut.dat”中的第 2 列。就是这样。
  • @Vijay:如果通过规范化你的意思是你希望最大的 bin 具有 1.0 的值,而其他 bin 的值小于 1.0,那么这很容易,只需跟踪最大的 bin 计数,然后在最后将整个数组除以最大计数。 (当然,您还需要制作 REAL 类型的 binaangle)。
  • 是的,这是仪式。我只是想弄清楚 Fotran 代码以保持跟踪并选择数组“binaangle”中的最大值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-05
相关资源
最近更新 更多