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
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.
- implizite F90-Methode: integer,dimension(NMAX,NMAX):: A = 0
bzw. zum Vergleich: integer,dimension(NMAX,NMAX):: A = -1
- explizite DATA-Anweisung mit
PARAMETER (NM2=NMAX*NMAX)
DATA A /NM2 * 0/
- traditionell mittels Laufanweisungen nach Programmstart
- 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):
- im Hauptprogramm
- 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 NEL ≤ n·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.