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(*)
- 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.