Search code examples
loopsfortrannested-loops

Arbitrary order loop in Fortran


The program below generates all ascending triplets of integers in a range using a triply nested loop. How would you do this for an arbitrary order? I don't want to have separate code for 2, 3, 4 integers etc.

program main
implicit none
integer :: i1,i2,i3,n,ivec(3)
n = 10
do i1=1,n
   do i2=i1+1,n
      do i3=i2+1,n
         ivec = [i1,i2,i3]
         print*,"ivec =",ivec
      end do
   end do
end do
end program main

Solution

  • Recursion is a cool Fortran95 feature. maxlevel=2 means 2 nested levels.

     recursive subroutine innerloop(start, end, mylevel, ivec, maxlevel)
      integer, intent(in)::start,end,mylevel,maxlevel
      integer, intent(in),dimension(mylevel)::ivec
      integer, dimension(mylevel+1)::ipass
      integer::i
    
      do i=start+1,end
         if (mylevel.eq.maxlevel) then
            ipass(1:mylevel)=ivec
            ipass(mylevel+1)=i
            print*, "ivec =", ipass
         else
            ipass(1:mylevel)=ivec
            ipass(mylevel+1)=i
            call innerloop(i,end,mylevel+1,ipass,maxlevel)
         end if
      end do
    end subroutine innerloop
    
    program main
    implicit none
    integer::n,i
    integer,dimension(1)::ivec
    integer::maxlevel=2
    n=10
    do i=1,n
       ivec=i
       call innerloop(i,n,1,ivec,maxlevel)
    end do
    end program main