Fortran: Fortran 95: Standardfunktionen: Feldfunktionen

Aus Wikibooks

Konstruktion und Umgestaltung von Feldern[Bearbeiten]

Funktion Beschreibung
arr = reshape ( arr1, arr2, [arr3, arr4] ) Ein gegebenes Feld in ein Feld anderer Form umwandeln.
  • arr1 ... source (Quellfeld)
  • arr2 ... form, Datentyp integer, Größe: 1 bis 7, Festlegung der neuen Feldform
  • arr3 ... pad, Datentyp und kind-Wert wie arr1. Wird verwendet um zusätzliche Felelemente einzufügen.
  • arr4 ... order, Feld der selben Form wie arr2, Datentyp integer. Bestimmt die Anordnung der zusätzlichen Feldelemente.

Der Rückgabewert ist ein Feld, dessen Feldelemente vom gleichen Datentyp und kind-Wert sind wie bei arr1. Die genaue Form dieses Feldes wird durch die Parameter arr2 bestimmt.


Beispiele:

  • integer, dimension(6)  :: a1 = (/ 1, 2, 3, 4, 5, 6 /)
    integer, dimension(3,2) :: a2
    a2 = reshape( a1, (/ 3, 2 /) )
a1
1
2
3
4
5
6
a2 = reshape( a1, (/ 3, 2 /) )
1 4
2 5
3 6
  • integer, dimension(6)  :: a1 = (/ 1, 2, 3, 4, 5, 6 /)
    integer, dimension(4, 2) :: a2, a3
    a2 = reshape( a1, (/ 4, 2 /), (/ 11, 22 /), (/ 1, 2 /) )
    a3 = reshape( a1, (/ 4, 2 /), (/ 11, 22 /), (/ 2, 1 /) )
a1
1
2
3
4
5
6
a2 = reshape( a1, (/ 4, 2 /), (/ 11, 22 /), (/ 1, 2 /) )
1 5
2 6
3 11
4 22
a3 = reshape( a1, (/ 4, 2 /), (/ 11, 22 /), (/ 2, 1 /) )
1 4
2 5
3 6
11 22
arr = merge ( arr1, arr2, arr3 ) Fusioniert die Felder arr1 und arr2 entsprechend der Maske arr3 zu einem neuen Feld.

Werte in arr3:

  • .true. ... Wert aus arr1 wird gewählt
  • .false. ... Wert aus arr2 wird gewählt

Beispiel:

integer, dimension(3, 3) :: a, b
logical, dimension(3, 3) :: mask
a = reshape( (/ 1, 2, 3, 4, 5, 6, 7, 8, 9 /), (/ 3, 3 /) )
b = reshape( (/ -1, -2, -3, -4, -5, -6, -7, -8, -9 /), (/ 3, 3 /) )
mask = reshape( (/ .true., .true., .true., .true., .false., .true., .true., .false., .true. /), (/ 3, 3 /) )
merge( a, b, mask ) ⇒ ( 1, 2, 3, 4, -5, 6, 7, -8, 9 )
a
1 4 7
2 5 8
3 6 9
b
-1 -4 -7
-2 -5 -8
-3 -6 -9
mask
T T T
T F F
T T T
merge( a, b, mask )
1 4 7
2 -5 -8
3 6 9
arr = pack ( arr1, arr2 [, arr3] ) Packt ein Feld arr1 unter Beachtung der Werte einer Maske arr2 in einen Vektor. Die Feldelemente der Maske arr2 müssen logischen Datentyp aufweisen. Optional kann ein Vektor arr3 angegeben werden. Die in der Maske arr2 als .true. gekennzeichneten Feldwerte aus arr1 werden mit diesem Vektor verschmolzen. Das Ergebnis wird zurückgegeben. arr3 soll mindestens soviele Feldelemente aufweisen, wie .true.-Werte in arr2 sind.

Beispiel:

a = reshape( (/ 1, 2, 3, 4, 5, 6, 7, 8, 9 /), (/ 3, 3 /) )
b = (/ -10, -20, -30, -40 /)
mask = reshape( (/ .false., .false., .false., .true., .false., .true., .false., .false., .true. /), (/ 3, 3 /) )
pack( a, mask ) ⇒ ( 4, 6, 9 )
pack( a, mask, b ) ⇒ ( 4, 6, 9, -40 )
arr = unpack ( arr1, arr2 , arr3 ) Entpackt den Vektor arr1 unter Beachtung der Werte einer Maske arr2 in ein Feld. Das Ergebnis wird zurückgegeben und weist die Form von arr2 auf, der Datentyp ist der gleiche wie bei arr1.

Beispiel:

integer, dimension(3, 3) :: a
integer, dimension (4) :: b
logical, dimension(3, 3) :: mask
a = reshape( (/ 1, 2, 3, 4, 5, 6, 7, 8, 9 /), (/ 3, 3 /) )
b = (/ -10, -20, -30, -40 /)
mask = reshape( (/ .false., .false., .false., .true., .false., .true., .false., .false., .true. /), (/ 3, 3 /) )
unpack( b, mask, a ) ⇒ ( 1, 2, 3, -10, 5, -20, 7, 8, -30 )
arr = spread ( arr, i1, i2 ) Vervielfältigung der Feldinhalte in eine zusätzliche Felddimension (i1 ... dim, i2 ... ncopies).

Beispiel:

integer, dimension(2, 2) :: a
integer, dimension(2, 2, 2) :: b
a = reshape( (/ 1, 2, 3, 4 /), (/ 2, 2 /) )
b = spread( a, 3, 2 ) ⇒ ( 1, 2, 3, 4, 1, 2, 3, 4 )
a
1 3
2 4

Abfragen von Feldstatus, Felddaten und Feldmetadaten[Bearbeiten]

Funktion Beschreibung
l = allocated ( arr ) Prüft den Allokationsstatus eines Feldes.

Beispiel:

  • integer, dimension(:), allocatable :: a
    allocate(a(3))
    allocated(a) ⇒ .true.

Ist Speicherplatz für das abgefragte Feld alloziert, so ist der Rückgabewert .true..

i = lbound ( arr [,i] ) Untere Feldgrenzen. i gibt optional die Felddimension vor, die abgefragt werden soll.

Beispiel:

  • integer, dimension(4:6, 2) :: a = reshape( (/ 1, 2, 3, 4, 5, 6 /), (/ 3, 2 /) )
    lbound (a) ⇒ ( 4, 1 )
i = ubound ( arr [,i] ) . Obere Feldgrenzen. i gibt optional die Felddimension vor, die abgefragt werden soll.

Beispiel:

  • integer, dimension(4:6, 2) :: a = reshape( (/ 1, 2, 3, 4, 5, 6 /), (/ 3, 2 /) )
    ubound (a) ⇒ ( 6, 2 )
l = all ( arr [, i] ) Prüft, ob alle Feldelemente .true. sind. Das erste Argument steht für die Abfragemaske (bzw. das Feld mit den Feldelementen vom Datentyp logical), das optionale zweite für die Dimension.

Beispiele:

  • logical, dimension(3) :: a = (/ .true., .false., .true. /)
    all( a ) ⇒ .false.
  • integer, dimension(3) :: a = (/ -1, 0, 5 /), b = (/ -1, 3, -2 /)
    all( a == b ) ⇒ .false.
  • logical, dimension(2, 2) :: a = reshape( (/ .true., .false., .false., .false. /), (/ 2, 2 /) )
    all( a, 1 ) ⇒ ( .false., .false. )

Der Rückgabewert kann ein Skalar oder ein Feld sein.

l = any ( arr [, i] ) Prüft, ob irgend ein Feldelemente .true. ist. Das erste Argument steht für die Abfragemaske (bzw. das Feld mit den Feldelementen vom Datentyp logical), das optionale zweite für die Dimension.

Beispiele:

  • logical, dimension(3) :: a = (/ .true., .false., .true. /)
    any( a ) ⇒ .true.
  • integer, dimension(3) :: a = (/ -1, 0, 5 /), b = (/ -1, 3, -2 /)
    any( a == b ) ⇒ .true.
  • logical, dimension(2, 2) :: a = reshape( (/ .true., .false., .false., .false. /), (/ 2, 2 /) )
    any( a, 1 ) ⇒ (.true., .false.)

Der Rückgabewert kann ein Skalar oder ein Feld sein.

i = count ( arr [, i] ) Zählt die .true.-Elemente in einem Feld. Das erste Argument steht für die Abfragemaske (bzw. das Feld mit den Feldelementen vom Datentyp logical), das optionale zweite für die Dimension.

Beispiel:

  • logical , dimension(3, 2) :: a = reshape( (/ .true., .false., .false., .false., .true., .false. /), (/ 3, 2 /) )
    count( a, 2) ⇒ (1, 1, 0)

Der Rückgabewert kann ein Skalar oder ein Feld sein.

i = size ( arr [, i] ) Anzahl der Elemente in einem Feld oder einer spezifizierten Dimension. i gibt optional die Felddimension vor, die abgefragt werden soll.

Beispiel:

  • integer, dimension(4:6, 2) :: a = reshape( (/ 1, 2, 3, 4, 5, 6 /), (/ 3, 2 /) )
    size (a) ⇒ 6
    size (a, 2) ⇒ 2
arr = shape ( arr ) Form der Feldes arr.

Beispiel:

  • integer, dimension(4:6, 2) :: a = reshape( (/ 1, 2, 3, 4, 5, 6 /), (/ 3, 2 /) )
    shape (a) ⇒ ( 3, 2 )
ir = minval ( arr [, i] [, l] ) Kleinster Wert im Feld (i ... dim, l ... mask). Die Feldelemente müssen vom Datentyp real oder integer sein.
ir = maxval ( arr [, i] [, l] ) Größter Wert im Feld (i ... dim, l ... mask). Die Feldelemente müssen vom Datentyp real oder integer sein.
i = minloc ( arr [, i] [, l] ) Position des kleinsten Wertes im Feld (i ... dim, l ... mask). Die Feldelemente müssen vom Datentyp real oder integer sein.
i = maxloc ( arr [, i] [, l] ) Position des größten Wertes im Feld (i ... dim, l ... mask). Die Feldelemente müssen vom Datentyp real oder integer sein.

Funktionen für Vektoren und Matrizen[Bearbeiten]

Funktion Beschreibung
arr = dot_product ( arr1, arr2 ) Bildet das Skalarprodukt der beiden Vektoren arr1 und arr2. arr1 und arr2 können Vektoren mit Feldelementen von numerischen oder logischen Datentyp sein.
  • Numerischer Datentyp:
  • Logischer Datentyp:
arr = matmul ( arr1, arr2 ) Matrizenmultiplikation. arr1 und arr2 können Vektoren mit Feldelementen von numerischen oder logischen Datentyp sein.
arr = transpose ( arr1 ) Transponierte Matrix arr1T.

Sonstige[Bearbeiten]

Funktion Beschreibung
arr = cshift ( arr, i1 [, i2] ) Circular shift (i1: shift, i2: dim).

Beispiel:

integer , dimension(3, 3) :: a
a = reshape( (/ 1, 2, 3, 4, 5, 6, 7, 8, 9 /), (/ 3, 3 /) )
cshift( a, 1 ) ⇒ ( 2, 3, 1, 5, 6, 4, 8, 9, 7 )
cshift( a, 2 ) ⇒ ( 3, 1, 2, 6, 4, 5, 9, 7, 8 )
cshift( a, 3 ) ⇒ ( 1, 2, 3, 4, 5, 6, 7, 8, 9 )
cshift( a, 1, 2 ) ⇒ ( 4, 5, 6, 7, 8, 9, 1, 2, 3 )
cshift( a, 2, 2 ) ⇒ ( 7, 8, 9, 1, 2, 3, 4, 5, 6 )
cshift( a, (/ 1, 2, -1 /), 1 ) ⇒ ( 2, 3, 1, 6, 4, 5, 9, 7, 8 )
a
1 4 7
2 5 8
3 6 9
cshift( a, 1 )
2 5 8
3 6 9
1 4 7
cshift( a, 2)
3 6 9
1 4 7
2 5 8
cshift( a, 3 )
1 4 7
2 5 8
3 6 9
cshift( a, 1, 2 )
4 7 1
5 8 2
6 9 3
cshift( a, 2, 2 )
7 1 4
8 2 5
9 3 6
cshift( a, (/ 1, 2, -1 /), 1 )
2 6 9
3 4 7
1 5 8
arr = eoshift ( arr1, i1 [, zlc, i2] ) End-off shift (i1 ... shift, zlc ... boundary, i2 ... dim)

Beispiel:

integer , dimension(3, 3) :: a
a = reshape( (/ 1, 2, 3, 4, 5, 6, 7, 8, 9 /), (/ 3, 3 /) )
eoshift( a, 1 ) ⇒ ( 2, 3, 0, 5, 6, 0, 8, 9, 0 )
eoshift( a, 2 ) ⇒ ( 3, 0, 0, 6, 0, 0, 9, 0, 0 )
eoshift( a, 3 ) ⇒ ( 0, 0, 0, 0, 0, 0, 0, 0, 0 )
eoshift( a, 1, -99 ) ⇒ ( 2, 3, -99, 5, 6, -99, 8, 9, -99 )
eoshift( a, (/ 1, 2, -1 /), (/ -111, -222, -333 /) ) ⇒ ( 2, 3, -111, 6, -222, -222, -333, 7, 8 )
eoshift( a, (/ 1, 2, -1 /), 999, 2 ) ⇒ ( 4, 8, 999, 7, 999, 3, 999, 999, 6 )
eoshift( a, (/ 1, 2, -1 /), 999, 2 )
1 4 7
2 5 8
3 6 9
eoshift( a, 1 )
2 5 8
3 6 9
0 0 0
eoshift( a, 2)
3 6 9
0 0 0
0 0 0
eoshift( a, 3 )
0 0 0
0 0 0
0 0 0
eoshift( a, 1, -99 )
2 5 8
3 6 9
-99 -99 -99
eoshift( a, (/ 1, 2, -1 /), (/ -111, -222, -333 /) )
2 6 -333
3 -222 7
-111 -222 8
eoshift( a, (/ 1, 2, -1 /), 999, 2 )
4 7 999
8 999 999
999 3 6
any = sum ( arr [, i] [, l] ) Summe der Feldelemente, bzw. Summe der Feldelemente bei denen die Maskenwerte .true. sind (i ... dim, l ...mask)

Beispiel:

  • integer , dimension(3, 3) :: a
    a = reshape( (/ 1, 2, 3, 4, 5, 6, 7, 8, 9 /), (/ 3, 3 /) )
    sum( a ) ⇒ 45

Der Rückgabewert kann ein Skalar oder ein Feld sein. Datentyp und kind-Wert sind wie bei arr.

any = product ( arr [, i] [, l] ) Produkt der Feldelemente, bzw. Produkt der Feldelemente bei denen die Maskenwerte .true. sind (i ... dim, l ...mask)

Beispiel:

  • integer , dimension(3, 3) :: a
    a = reshape( (/ 1, 2, 3, 4, 5, 6, 7, 8, 9 /), (/ 3, 3 /) )
    product( a ) ⇒ 362880

Der Rückgabewert kann ein Skalar oder ein Feld sein. Datentyp und kind-Wert sind wie bei arr.