Loops Fortran-和与积的组合

Loops Fortran-和与积的组合,loops,fortran,combinations,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,

这是我们的节目。其实质如下。有两个维度为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

这可能是一个延伸的评论,而不是一个答案

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

   if (oldp1 + oldp > E_max) then
    goto 2
   end if
   2 continue 
这段代码对程序没有任何影响,可以删除而不产生任何影响。一个真正聪明的编译器可能已经在为你做这件事了,但是,如果你没有这样一个聪明的编译器,你可以自己删除代码来帮助它


还有一些地方的程序逻辑很难遵循,老实说,我已经放弃了。帮你自己一个忙,将程序中所有的
goto
替换为它们的现代等价物(思考
退出
,思考
循环
),删除所有
继续
语句(思考
结束
)。一旦你把所有这些都整理好,就有可能找到你所问问题的答案。

非常感谢。我会想办法解决这个问题。