2016-03-31 6 views
0

Wie kann eine beliebige Anzahl verschachtelter Schleifen in Fortran erstellt werden? Zum Beispiel so, dass die Anzahl der verschachtelten Schleifen k kann zur Laufzeit bestimmt werden:Wie kann eine beliebige Anzahl verschachtelter Schleifen in Fortran erstellt werden?

do i1 = 1,n1 
do i2 = 1,n2 
do i3 = 1,n3 
do i4 = 1,n4 
... 
! use i1,i2,i3,i4,....,ik for something 
... 
enddo 
enddo 
enddo 
enddo 
+0

Ich musste das einmal tun, als eine sehr einfache und schlechte Lösung für ein bestimmtes Problem (in C). Kurz gesagt, hatte ich, soweit ich mich erinnere, ein Wrapper-Skript, das die Datei mit den erforderlichen verschachtelten Schleifen schrieb und dann das Projekt kompilierte und ausführte, das es verwendete. Es hat tatsächlich funktioniert. – zdim

+2

Dies lädt eher die Frage ein * Warum willst du das tun? * Wenn du dich zum Beispiel SO umschaust, wirst du Fragen haben, wie man Nöhlen in beliebiger Tiefe macht, auf die die Antwort lautet: * Benutze ein * 'elemental '* Funktion *. Für andere ist ein rekursiver Ansatz angemessen. Also, warum willst du das machen? –

+0

Ich möchte dazu einen Tensor beliebigen Ranges transformieren und trotzdem einen Code haben, der physikalisch "transparent" aussieht. – lenzinho

Antwort

0

Also, wenn ich Sie richtig verstehe, müssen Sie verschachtelte Schleifen machen (und in der Regel möchte man verschachtelte Schleifen halten ein Minimum).

Aber zur Kompilierzeit wissen Sie nicht einmal, wie viele Nester Sie tun müssen.

Wenn ich dieses Problem hätte, würde ich wahrscheinlich die Nester in eine einzelne Schleife auspacken und die verschiedenen Indizes von Grund auf neu berechnen. Hier ist ein Beispiel, das ich gerade ausprobiert habe:

program nested 
    implicit none 
    integer :: num_nests, i 
    integer, dimension(:), allocatable :: nest_limits 
    integer, dimension(:), allocatable :: nests 

    print *, "Please enter number of nests:" 
    read(*, *) num_nests 
    allocate(nest_limits(num_nests)) 
    allocate(nests(num_nests)) 

    print *, "Please enter nest limits:" 
    read(*, *) nest_limits 

    nests(:) = 1 
    outer_loop : do 
     print *, nests(:) 
     i = 1 
     ! Calculate the next indices: 
     inner_loop : do 
      nests(i) = nests(i) + 1 

      ! If this is still a valid index, exit the inner 
      ! loop and go for the next iteration 
      if (nests(i) <= nest_limits(i)) exit inner_loop 

      ! The index has overflown, so reset it to 1 and 
      ! move to next index. 
      nests(i) = 1 
      i = i + 1 

      ! If the next index would be outside of num_nests, 
      ! the whole loop is finished. 
      if (i > num_nests) exit outer_loop 

     end do inner_loop 
    end do outer_loop 
end program nested