Fortranner
Fortranner

Reputation: 2605

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

Upvotes: 1

Views: 115

Answers (1)

Horst Grünbusch
Horst Grünbusch

Reputation: 276

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

Upvotes: 2

Related Questions