Loops Fortran-和与积的组合
这是我们的节目。其实质如下。有两个维度为2到3的数组。我需要根据过滤器E_max找到所有可能的和和与积的组合。您能告诉我如何编写更紧凑的嵌套循环吗,即,如果我有10列,请不要绘制10个嵌套循环?请帮帮我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,
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
替换为它们的现代等价物(思考退出
,思考循环
),删除所有继续
语句(思考结束
)。一旦你把所有这些都整理好,就有可能找到你所问问题的答案。非常感谢。我会想办法解决这个问题。