M. Pester - LV im SS 2017
Speicherung von Matrizen und Submatrizen

Speicherung von Matrizen und Submatrizen

Ziel:
Überprüfen Sie, wie die Elemente von Matrizen in verschiedenen Situationen durch Fortran im Speicher angeordnet werden. Zu diesem Zweck genügt INTEGER als Datentyp der Matrix. Es wird davon Gebrauch gemacht, dass als Argument an ein Unterprogramm nur die (Start-)Adresse der aktuellen Variablen übergeben wird.

Mit Hilfe eines Unterprogramms sollen die Feldelemente in der gespeicherten Reihenfolge ausgegeben werden, indem das Unterprogramm ein als Argument übergebenes Feld nur eindimensional vereinbart (INTEGER Feld(*)). Ein zusätzlicher Parameter kann angeben, wieviele Elemente des Feldes auszugeben sind.

Im Hauptprogramm oder mit Hilfe eines anderen Unterprogramms, in dem das Feld als n×m-Matrix vereinbart ist, sollen die Elemente zuvor mit zweckdienlichen Werten belegt worden sein, z.B. aij = 100 i + j, so dass

A = (
(
(
(
(
101
102
201
202
:
:
···
)
)
)
)
)

TEIL 1:

  • Im Hauptprogramm wird eine Integer-Matrix A(NMAX,NMAX) vereinbart, wobei NMAX eine große Konstante sein sollte ( ~ 100  …  10 000).
  • Um evtl. Lücken zwischen den Elementen zu erkennen, wird der gesamten Matrix als Anfangswert Null zugewiesen (oder -1).
    Testen Sie dazu verschiedene Möglichkeiten und vergleichen Sie die Auswirkungen (soweit erkennbar) auf
    • Übersetzungszeit,
    • Größe der ausführbaren Datei (siehe Anzeige mit ls -l bzw. ls -lh )
    • Programmlaufzeit.

    1. implizite F90-Methode: integer,dimension(NMAX,NMAX):: A = 0
      bzw. zum Vergleich:   integer,dimension(NMAX,NMAX):: A = -1
    2. explizite DATA-Anweisung mit
      PARAMETER (NM2=NMAX*NMAX)
      DATA A /NM2 * 0/
    3. traditionell mittels Laufanweisungen nach Programmstart
    4. ohne Schleife, aber nach Programmstart durch Zuweisung einer Konstanten ans ganze Feld

    Für spätere Tests kann NMAX wieder kleiner gewählt werden.
  • Für kleine Werte n,m ( ~ 2 … 10) < NMAX sollen die Matrixelemente aij, 1 ≤ i ≤ n,  1 ≤ j ≤ m, jeweils nach einer der folgenden Methoden belegt werden (wie oben beschrieben):

    1. im Hauptprogramm
    2. in einem Unterprogramm, das mit call matrix(n,m,A) aufgerufen wird und in dem diese Matrix mit Dimension (n,m) vereinbart ist.
  • Nach Belegung der n·m Matrixelemente soll ein Unterprogramm die ersten NELn·m Elemente des Feldes A ausgeben:
          subroutine Ausgabe(NEL, Feld)
          integer NEL, Feld(*)
TEIL 2:

  • Wiederholen Sie ähnliche Tests mit Submatrizen, die Fortran 90 mittels target und pointer zulässt, z.B.
        integer,target, dimension(NMAX,NMAX) :: A
        integer,pointer,dimension(:,:)       :: oben,unten
        …
        oben  => A(1:n,1:m)
        unten => A(n+1:2*n, m+1:2*m)
    
  • Belegen Sie die Matrix oben (bzw. unten) und vergleichen Sie mit dem Ausgabeprogramm den Inhalt von oben (bzw. unten) mit dem von A.
    Speziell interessiert die Frage, ob etwa oben ein Teil des Feldes A oder eine Kopie davon ist, oder mit anderen Worten: Ist die Ausgabe dieselbe, wenn man A oder oben an das Ausgabeprogramm übergibt (bzw. A(n+1,m+1) oder unten)?




File translated from TEX by TTH, version 2.92.