Fortran - 总和和产品的组合

时间:2014-11-20 10:20:36

标签: loops fortran combinations

这是程序。其实质如下。有两个维度为2到3的数组。我需要根据过滤器E_max找到所有可能的总和和产品组合。你能否告诉我如何编写更紧凑的嵌套循环,即如果我有10列不绘制10个嵌套循环?请帮帮我。

program f_
implicit none
integer E_max, i, j, k, i1, j1, k1, l
real  f1, f2, oldp, oldp1, oldp2, oldp_1, oldp_2, p1, p2, p3, p
real(8), allocatable, dimension(:, :) :: F, ener
real(8), allocatable, dimension(:) :: E_vib, f_1
allocate (F(2,3), E_vib(3), f_1(3), ener(2,3))

open( unit=10, file= 'File.txt', status='old')
do j = 1, 2     
read(10,*) (f(j,k),k=1,3) 
end do 
201 j=j-1
close(unit=10, status='keep')
003 format(f25.20,1x,\)

open( unit=10, file= 'fileen.txt', status='old')
do j = 1, 2     
read(10,*) (ener(j,k),k=1,3) 
end do 
205 j=j-1
close(unit=10, status='keep')
004 format(f25.20,1x,\)

E_max = 4
do i = 1, 2
 oldp = ener(i,1)
 p1 = f(i,1)

  if (oldp > E_max) then
 goto 1
end if
1   continue 

do j = 1, 2
 oldp1 = ener(j,2)
 p2 = f(j,2)
   if (oldp1 + oldp > E_max) then
    goto 2
   end if
   2 continue 

   do k = 1, 2
  oldp2 = ener(k,3)
  p3 = f(k,3)
    if (oldp2 + oldp1 + oldp > E_max) then
     goto 5
    end if

  oldp_1 = oldp + oldp1 + oldp2 
  p = p1*p2*p3

  write (*,*) 'i=', i , 'j=', j,'k=', k, oldp_1, p
  5 continue  
    end do
   end do
end do

deallocate (F, E_vib, f_1, ener)
end program

1 个答案:

答案 0 :(得分:1)

这可能更像是一个扩展的评论,而不是一个答案,但现在就是这样。

要使程序更紧凑,你可以做的一件事就是仔细考虑块的逻辑,例如

   if (oldp1 + oldp > E_max) then
    goto 2
   end if
   2 continue 

这段代码对程序没有任何影响,可以删除而不会产生任何影响。一个非常聪明的编译器可能已经为你做了这件事,但是,如果你没有这样的智能编译器,你可以通过自己删除代码来帮助它。

在其他地方,程序的逻辑很难遵循,说实话,我已经放弃了。帮自己一个忙,用他们现代的等价物替换程序中的所有goto(想想exit,思考cycle),消除所有continue语句(想想{{ 1}})。一旦你完成了所有这些,就有可能找出问题的答案。