Friday 17 February 2017

Fortran 90 Gleitender Durchschnitt

ANHANG 5 Intrinsische Funktionen in Fortran 90 Es gibt eine große Anzahl von intrinsischen Funktionen und fünf intrinsische Subroutinen in Fortran 90. Ich behandle die numerischen und mathematischen Routinen sehr kurz, da sie nicht von Fortran 77 geändert werden und daher gut bekannt sein sollten. Dieser Abschnitt basiert auf Abschnitt 13 der ISO-Norm (1991), der eine formalere Behandlung enthält. Wir folgen der Anordnung der verschiedenen Funktionen und Subroutinen im Standard, erklären aber direkt in der Liste. Für eine detailliertere Behandlung verweisen wir auf Metcalf und Reid (1990, 1993). Wenn ein Parameter unten optional ist, wird er in Kleinbuchstaben angegeben. Wenn eine Argumentliste mehrere Argumente enthält, kann die Funktion entweder durch positionsbezogene Argumente oder durch ein Schlüsselwort aufgerufen werden. Das Schlüsselwort muss verwendet werden, wenn ein vorheriges Argument nicht enthalten ist. Schlüsselwörter sind normalerweise die Namen, die unten angegeben werden. Wir haben nicht immer alle natürlichen Beschränkungen auf die Variablen gegeben, zum Beispiel, dass der Rang nicht erlaubt ist, negativ zu sein. Die Funktion PRÄSENT (A) gibt. TRUE zurück. Wenn das Argument A in der Anrufliste ist,.FALSE. Im anderen Fall. Die Verwendung ist im Beispielprogramm in Kapitel 8 des Haupttextes dargestellt. Von Fortran 77 sind ABS, AIMAG, AINT, ANINT, CMPLX, CONJG, DBLE, DIM, DPROD, INT, MAX, MIN, MOD, NINT, REAL und SIGN erhältlich. Darüber hinaus wurden die Fortschritte von CEILING, FLOOR und MODULO zu Fortran 90 hinzugefügt. Nur das letzte ist schwer zu erklären, was am einfachsten mit den Beispielen von ISO (1991) möglich ist. Folgende Funktionen von Fortran 77 können einen Art-Parameter verwenden In AINT (A, Art). Nämlich AINT, ANINT, CMPLX, INT, NINT und REAL. Eine historische Tatsache ist, dass die numerischen Funktionen in Fortran 66 spezifische (verschiedene) Namen in unterschiedlichen Genauigkeiten haben mussten, und diese expliziten Namen sind immer noch die einzigen, die verwendet werden können, wenn ein Funktionsname als Argument übergeben wird. Es folgt eine vollständige Tabelle aller numerischen Funktionen. Die Namen, die mit einem Stern gekennzeichnet sind, dürfen nicht als Argumente verwendet werden. Einige Funktionen, wie INT und IFIX, haben zwei spezifische Namen, die entweder verwendet werden können. Auf der anderen Seite haben einige Funktionen keinen spezifischen Namen. Im folgenden Beispiel verwende ich C für komplexe Gleitkommawerte, D für Gleitkommawerte in doppelter Genauigkeit, I für Ganzzahlen und R für Gleitpunktwerte in Einzelpräzision. Trunkierung ist gegen Null, INT (-3,7) wird -3. Aber die Rundung ist korrekt, NINT (-3,7) wird -4. Die neuen Funktionen FLOOR und CEILING schneiden auf minus bzw. plus unendlich ab. Die Funktion CMPLX kann ein oder zwei Argumente haben, wenn zwei Argumente vorhanden sind, müssen diese vom gleichen Typ sein, aber nicht von COMPLEX. Die Funktion MOD (X, Y) berechnet X - INT (XY) Y. Die Vorzeichenübertragungsfunktion SIGN (X, Y) nimmt das Vorzeichen des zweiten Arguments an und setzt es auf das erste Argument ABS (X), wenn Y gt 0 und - ABS (X) wenn Y lt 0. Positive Differenz DIM ist eine Funktion, die ich nie benutzt habe, aber DIM (X, Y) gibt X-Y, wenn dies positiv und Null im anderen Fall ist. Inneres Produkt DPROD andererseits ist eine sehr nützliche Funktion, die das Produkt von zwei Zahlen in der Einzelpräzision als doppelte Präzisionszahl gibt. Es ist schnell und genau. Die beiden Funktionen MAX und MIN sind insofern eindeutig, als sie eine beliebige Anzahl von Argumenten haben können, aber mindestens zwei. Die Argumente müssen vom gleichen Typ sein, sind aber nicht zulässig vom Typ COMPLEX. Genau wie in Fortran 77. Alle trigonometrischen Funktionen arbeiten im Bogenmaß. Die folgenden sind verfügbar: ACOS, ASIN, ATAN, ATAN2, COS, COSH, EXP, LOG, LOG10, SIN, SINH, SQRT, TAN und TANH. Eine historische Tatsache ist, dass die mathematischen Funktionen in Fortran 66 spezifische (verschiedene) Namen in verschiedenen Präzisionen haben mussten, und diese expliziten Namen sind immer noch die einzigen, die verwendet werden können, wenn ein Funktionsname als Argument übergeben wird. Es folgt eine vollständige Tabelle aller mathematischen Funktionen. Im folgenden Beispiel verwende ich C für komplexe Gleitkommawerte, D für Gleitkommawerte in doppelter Genauigkeit, I für Ganzzahlen und R für Gleitpunktwerte in Einzelpräzision. Der Zweck der meisten dieser Funktionen ist offensichtlich. Beachten Sie, dass sie alle nur für Gleitkommazahlen und nicht für Ganzzahlen definiert sind. Sie können daher die Quadratwurzel von 4 als SQRT (4) nicht berechnen. Aber stattdessen können Sie NINT (SQRT (REAL (4))). Bitte beachten Sie auch, dass alle komplexen Funktionen den Hauptwert zurückgeben. Die Quadratwurzel ergibt ein echtes Ergebnis für ein reales Argument in einfacher oder doppelter Genauigkeit und ein komplexes Ergebnis für ein komplexes Argument. So gibt SQRT (-1.0) eine Fehlermeldung (normalerweise bereits zur Kompilierzeit), während Sie die komplexe Quadratwurzel mit den folgenden Anweisungen erhalten können. Das Argument für die üblichen Logarithmen muss positiv sein, während das Argument für CLOG von Null verschieden sein muss. Der Modul für das Argument für ASIN und ACOS muss höchstens 1 sein. Das Ergebnis wird in - pi2, pi2 bzw. 0, pi liegen. Die Funktion ATAN gibt einen Wert in - pi2, pi2 zurück. Die Funktion ATAN2 (Y, X) arctan (y, x) liefert einen Wert in (-pi, pi, falls Y positiv ist, ist das Ergebnis positiv Wenn X negativ ist, ist das Ergebnis negativ, wenn X Null ist, ergibt das Ergebnis plus oder minus pi2, wobei X und Y nicht gleichzeitig gleich Null sein dürfen Die natürliche Begrenzung für die mathematischen Funktionen ist die begrenzte Genauigkeit und Reichweite, was bedeutet, dass zB EXP zu Unterströmungen oder Überläufen bei ziemlich gewöhnlichen Werten des Arguments führen kann Die trigonometrischen Funktionen erhalten sehr niedrige Genauigkeit für große Argumente Diese Einschränkungen ACHAR arbeitet mit dem Standard-ASCII-Zeichensatz, während CHAR mit der Darstellung in dem Computer arbeitet, den Sie verwenden Routinen vergleichen zwei Strings mit Sortierung nach ASCII. Wenn ein String kürzer als der andere ist, werden Leerzeichen am Ende der kurzen Zeichenfolge hinzugefügt. Wenn eine Zeichenfolge ein Zeichen außerhalb des ASCII-Zeichensatzes enthält, ist das Ergebnis implementierungsabhängig. LEN (STRING) gibt die Länge einer Zeichenfolge zurück. Der Variablen STRING muss kein Wert zugewiesen werden. Die erste gibt die Art des aktuellen Arguments zurück, das vom Typ INTEGER, REAL, COMPLEX, LOGICAL oder CHARACTER sein kann. Dem Argument X muss kein Wert zugewiesen werden. Die zweite gibt eine Ganzzahl mit der angeforderten Anzahl von Ziffern zurück, und die dritte gibt die Art für Gleitkommazahlen mit numerischer Genauigkeit mindestens P-Ziffern und einen Dezimal-Exponentenbereich zwischen - R und R zurück. Die Parameter P und R müssen skalare ganze Zahlen sein. Mindestens einer von P und R muss angegeben werden. Das Ergebnis von SELECTEDINTKIND ist eine Ganzzahl von Null und aufwärts, wenn die gewünschte Art nicht verfügbar ist, erhalten Sie -1. Wenn mehrere implementierte Typen die Bedingung erfüllen, wird diejenige mit dem kleinsten Dezimalbereich verwendet. Wenn es noch mehrere Typen oder Arten gibt, die die Bedingung erfüllen, wird diejenige mit der kleinsten Artzahl verwendet. Das Ergebnis von SELECTEDREALKIND ist auch eine Ganzzahl von Null und aufwärts, wenn die gewünschte Art nicht verfügbar ist, wird -1 zurückgegeben, wenn die Präzision nicht verfügbar ist, -2, wenn der Exponentbereich nicht verfügbar ist und -3 wenn keine der Anforderungen stehen zur Verfügung. Wenn mehrere implementierte Typen die Bedingung erfüllen, wird diejenige mit der kleinsten Dezimalgenauigkeit zurückgegeben, und wenn mehrere davon vorhanden sind, wird diejenige mit der kleinsten Zahl zurückgegeben. Beispiele finden Sie in Kapitel 2 des Haupttextes. Beispiele für Arten in ein paar verschiedenen Implementierungen (NAG und Cray) sind in Anlage 6 angegeben. LOGIKAL (L, Art) wandelt zwischen verschiedenen Arten von logischen Variablen. Logische Variablen können auf verschiedene Weise implementiert werden, beispielsweise mit einer physikalischen Darstellung, die ein Bit (nicht empfohlen), ein Byte, ein Wort oder sogar ein Doppelwort belegt. Dieser Unterschied ist wichtig, wenn COMMON und EQUIVALENCE mit logischen Variablen in einem Programm in der traditionellen Weise der Fortran-66-Programmierung missbraucht wurden. 8. Numerische Abfragefunktionen: Diese Funktionen arbeiten mit einem bestimmten Modell von Integer - und Gleitkommarithmetik, siehe ISO (1991), Abschnitt 13.7.1. Die Funktionen geben Eigenschaften von Zahlen der gleichen Art wie die Variable X zurück. Die real und in einigen Fällen integer sein kann. Funktionen, die Eigenschaften des aktuellen Arguments X zurückgeben, sind in Abschnitt 12 unten, Fließkomma-Manipulationsfunktionen verfügbar. BITSIZE (I) liefert die Anzahl der Bits gemäß dem Modell der Bitdarstellung in der Norm ISO (1991), Abschnitt 13.5.7. Normalerweise erhalten wir die Anzahl der Bits in einem (ganzen) Wort. Das Modell für die Bitdarstellung in der Norm ISO (1991), Abschnitt 13.5.7 wird verwendet. TRANSFER (SOURCE, MOLD, size) gibt an, dass die physikalische Darstellung des ersten Arguments SOURCE so behandelt werden soll, als ob es Typ und Parameter als zweites Argument MOLD hatte. Aber ohne es zu konvertieren. Der Zweck besteht darin, eine Möglichkeit zu geben, eine Menge eines bestimmten Typs über eine Routine zu verschieben, die nicht genau diesen Datentyp aufweist. 12. Fließkomma-Manipulationsfunktionen: Diese Funktionen arbeiten in einem bestimmten Modell von Integer - und Gleitkommarithmetik, siehe Norm ISO (1991), Abschnitt 13.7.1. Die Funktionen geben Zahlen zurück, die sich auf die tatsächliche Variable X des Typs REAL beziehen. Funktionen, die Eigenschaften für die Zahlen der gleichen Art wie die Variable X zurückgeben, sind unter Abschnitt 8 (Numerische Abfragefunktionen). DOTPRODUCT (VECTORA, VECTORB) bildet ein Skalarprodukt aus zwei Vektoren, die dieselbe Länge haben müssen (gleiche Anzahl von Elementen). Bitte beachten Sie, dass, wenn VECTORA vom Typ COMPLEX ist das Ergebnis SUM (CONJG (VECTORA) VECTORB). MATMUL (MATRIXA, MATRIXB) bildet das Matrixprodukt zweier Matrizen, die konsistent sein müssen, d. H. Die Dimensionen wie (M, K) und (K, N) haben. Wird in Kapitel 11 des Haupttextes verwendet. 14. Array-Funktionen: ALL (MASK, dim) gibt einen logischen Wert zurück, der angibt, ob alle Relationen in MASK. TRUE sind. . Nur die gewünschte Dimension, wenn das zweite Argument gegeben ist. ANY (MASK, dim) gibt einen logischen Wert zurück, der angibt, ob eine Relation in MASK. TRUE ist. . Nur die gewünschte Dimension, wenn das zweite Argument gegeben ist. COUNT (MASK, dim) gibt einen numerischen Wert zurück, der die Anzahl der Beziehungen in MASK ist, die. TRUE sind. . Nur die gewünschte Dimension, wenn das zweite Argument gegeben ist. MAXVAL (ARRAY, dim, mask) gibt den größten Wert im Array zurück. Von denen, die die Beziehung im dritten Argument MASK befolgen, wenn diese gegeben ist, nur entlang der gewünschten Dimension, wenn das zweite Argument DIM gegeben ist. MINVAL (ARRAY, dim, mask) gibt den kleinsten Wert im Array zurück. Von denen, die die Beziehung im dritten Argument MASK befolgen, wenn diese gegeben ist, nur entlang der gewünschten Dimension, wenn das zweite Argument DIM gegeben ist. PRODUCT (ARRAY, dim, mask) gibt das Produkt aller Elemente im Array zurück. Von denen, die die Beziehung im dritten Argument MASK befolgen, wenn diese gegeben ist, nur entlang der gewünschten Dimension, wenn das zweite Argument DIM gegeben ist. SUM (ARRAY, dim, mask) gibt die Summe aller Elemente im Array zurück. Von denen, die die Beziehung im dritten Argument MASK befolgen, wenn diese gegeben ist, nur entlang der gewünschten Dimension, wenn das zweite Argument DIM gegeben ist. Ein Beispiel ist in Anhang 3, Abschnitt 10 gegeben. ALLOCATED (ARRAY) ist eine logische Funktion, die angibt, ob das Array zugeordnet ist. LBOUND (ARRAY, dim) ist eine Funktion, die die untere Dimensionsgrenze für den ARRAY zurückgibt. Wenn DIM (die Dimension) nicht als Argument angegeben wird, erhalten Sie einen Integer-Vektor, wenn DIM enthalten ist, erhalten Sie den Integer-Wert mit genau diesem unteren Dimensionslimit, für das Sie gefragt haben. SHAPE (SOURCE) ist eine Funktion, die die Form eines Arrays SOURCE als Integer-Vektor zurückgibt. SIZE (ARRAY, dim) ist eine Funktion, die die Anzahl der Elemente in einem Array zurückgibt. Wenn DIM nicht angegeben ist, und die Anzahl der Elemente in der relevanten Dimension, wenn DIM enthalten ist. UBOUND (ARRAY, dim) ist eine Funktion ähnlich LBOUND, die die oberen Dimensionsgrenzen zurückgibt. MERGE (TSOURCE, FSOURCE, MASK) ist eine Funktion, die zwei Arrays verbindet. Es gibt die Elemente in TSOURCE, wenn die Bedingung in MASK ist. TRUE. Und FSOURCE, wenn die Bedingung in MASK. FALSE ist. Die beiden Felder TSOURCE und FSOURCE müssen vom gleichen Typ und der gleichen Form sein. Das Ergebnis ist auch diese Art und diese Form. Auch MASK muss die gleiche Form haben. Ich gebe hier ein ziemlich vollständiges Beispiel für die Verwendung von MERGE, das auch RESHAPE aus dem nächsten Abschnitt verwendet, um geeignete Testmatrizen zu bauen. Beachten Sie, dass die beiden Subroutinen WRITEARRAY und WRITELARRAY Testroutinen sind, um Matrizen zu schreiben, die im ersten Fall vom Typ REAL sind, im zweiten Fall vom Typ LOGICAL. Die folgende Ausgabe wird erhalten PACK (ARRAY, MASK, Vektor) packt ein Array an einen Vektor mit der Steuerung von MASK. Die Form des logischen Arrays MASK muss mit dem für ARRAY übereinstimmen oder MASK muss ein Skalar sein. Wenn VECTOR enthalten ist, muss es ein Array von Rang 1 (d. h. ein Vektor) mit mindestens so vielen Elementen sein, wie diejenigen, die in MASK wahr sind und denselben Typ wie ARRAY haben. Wenn MASK ein Skalar mit dem Wert. TRUE ist. Dann muss VECTOR die gleiche Anzahl von Elementen wie ARRAY haben. Das Ergebnis ist ein Vektor mit so vielen Elementen wie diejenigen in ARRAY, die den Bedingungen gehorchen, wenn VECTOR nicht enthalten ist (d. h. alle Elemente, wenn MASK ein Skalar mit dem Wert. TRUE ist). In dem anderen Fall ist die Anzahl der Elemente des Ergebnisses so viele wie in VEKTOR. Die Werte sind die zugelassenen, d. h. die Werte, die die Bedingung erfüllen, und werden in der gewöhnlichen Fortran-Reihenfolge sein. Wenn VECTOR enthalten ist und die Anzahl seiner Elemente die Anzahl der zugelassenen Werte übersteigt, werden die fehlenden Werte, die für das Ergebnis erforderlich sind, von den entsprechenden Stellen in VECTOR genommen. Das folgende Beispiel basiert auf der Modifikation des einen für MERGE. Aber ich gebe jetzt nur die Ergebnisse. SPREAD (SOURCE, DIM, NCOPIES) gibt ein Array des gleichen Typs wie das Argument SOURCE zurück, wobei der Rang um eins erhöht wird. Die Parameter DIM und NCOPIES sind ganzzahlig. Wenn NCOPIES negativ ist, wird stattdessen der Wert Null verwendet. Wenn SOURCE ein Skalar ist, wird SPREAD zu einem Vektor mit NCOPIES-Elementen, die alle denselben Wert wie SOURCE haben. Der Parameter DIM gibt an, welcher Index erweitert werden soll. Er muss im Bereich 1 und 1 liegen (Rang von SOURCE). Wenn SOURCE ein Skalar ist, dann muss DIM eins sein. Der Parameter NCOPIES ist die Anzahl der Elemente in den neuen Dimensionen. Zusätzliche Diskussion findet sich in der Lösung der Übung (11.1). UNPACK (VECTOR, MASK, ARRAY) streut einen Vektor zu einem Array unter der Kontrolle von MASK. Die Form des logischen Arrays MASK muss mit dem für ARRAY übereinstimmen. Das Array VECTOR muß den Rang 1 haben (d. h. es ist ein Vektor) mit mindestens so vielen Elementen wie diejenigen, die in MASK wahr sind. Und muss auch den gleichen Typ wie ARRAY haben. Wenn ARRAY als Skalar angegeben wird, wird es als ein Array mit der gleichen Form wie MASK und den gleichen skalaren Elementen betrachtet. Das Ergebnis ist ein Array mit der gleichen Form wie MASK und demselben Typ wie VECTOR. Die Werte sind diejenigen von VECTOR, die akzeptiert werden (d. h. diejenigen, die die Bedingung in MASK erfüllen), genommen in der gewöhnlichen Fortran-Reihenfolge, während in den verbleibenden Positionen in ARRAY die alten Werte beibehalten werden. RESHAPE (SOURCE, SHAPE, pad, order) konstruiert ein Array mit einer bestimmten Form SHAPE ausgehend von den Elementen in einem gegebenen Array SOURCE. Wenn PAD nicht enthalten ist, dann muss die Größe von SOURCE mindestens PRODUCT (SHAPE) sein. Wenn PAD enthalten ist, muss es den gleichen Typ wie SOURCE haben. Wenn ORDER enthalten ist, muss es ein INTEGER-Array mit der gleichen Form wie SHAPE sein und die Werte müssen eine Permutation von (1,2,3 N) sein, wobei N die Anzahl der Elemente in SHAPE ist. Muss es kleiner oder gleich 7 sein. Das Ergebnis hat natürlich eine Form SHAPE und die Elemente sind die in SOURCE. Möglicherweise ergänzt mit PAD. Die verschiedenen Dimensionen wurden bei der Zuordnung der Elemente permutiert, wenn ORDER eingefügt wurde, ohne jedoch die Form des Ergebnisses zu beeinflussen. Einige einfache Beispiele sind im vorigen und im nächsten Abschnitt sowie im Anhang 3, Abschnitt 9 aufgeführt. Ein komplizierteres Beispiel, das auch die optionalen Argumente veranschaulicht, folgt. Die Ausgabe des obigen Programms ist wie folgt. Die Shift-Funktionen geben die Form eines Arrays unverändert zurück, aber verschieben die Elemente. Sie sind ziemlich schwierig zu erklären, so empfehle ich, auch die Norm ISO (1991) zu studieren. CSHIFT (ARRAY, SHIFT, dim) führt durch SHIFT-Positionen nach links, wenn SHIFT positiv und nach rechts, wenn es negativ ist. Wenn ARRAY ein Vektor ist, wird die Verschiebung auf natürliche Weise durchgeführt, wenn es ein Array mit höherem Rang ist, dann ist die Verschiebung in allen Abschnitten entlang der Dimension DIM. Wenn DIM fehlt, wird es als 1 betrachtet, in anderen Fällen muss es eine skalare ganze Zahl zwischen 1 und n sein (wobei n dem Rang von ARRAY entspricht). Das Argument SHIFT ist eine skalare Ganzzahl oder ein Integer-Array vom Rang n-1 und die gleiche Form wie das ARRAY. Außer entlang der Dimension DIM (die wegen des unteren Ranges entfernt wird). Verschiedene Abschnitte können daher in verschiedenen Richtungen und mit verschiedenen Stellungen verschoben werden. EOSHIFT (ARRAY, SHIFT, boundary, dim) führt nach links, wenn SHIFT positiv und nach rechts, wenn es negativ ist. Anstelle der ausgeschobenen Elemente werden neue Elemente aus BOUNDARY genommen. Wenn ARRAY ein Vektor ist, wird die Verschiebung auf natürliche Weise durchgeführt, wenn es sich um ein Array mit einem höheren Rang handelt, ist die Verschiebung auf allen Abschnitten entlang der Dimension DIM. Wenn DIM fehlt, wird es als 1 betrachtet, in anderen Fällen muss es einen skalaren Integerwert zwischen 1 und n haben (wobei n dem Rang von ARRAY entspricht). Das Argument SHIFT ist eine skalare Ganzzahl, wenn ARRAY den Rang 1 hat. Im anderen Fall kann es sich um eine skalare Ganzzahl oder ein ganzzahliges Array mit dem Rang n-1 und mit derselben Form wie das Array ARRAY handeln Wegen des niedrigeren Ranges). Entsprechendes gilt für BOUNDARY, das den gleichen Typ wie das ARRAY haben muss. Wenn der Parameter BOUNDARY fehlt, haben Sie die Wahl der Werte Null,.FALSE. Oder Leerzeichen, abhängig vom Datentyp. Verschiedene Abschnitte können somit in verschiedenen Richtungen und mit verschiedenen Stellungen verschoben werden. Ein einfaches Beispiel für die beiden obigen Funktionen für den Vektorfall folgt sowohl dem Programm als auch dem Ausgang. Es folgt ein einfaches Beispiel für die beiden obigen Funktionen im Matrixfall. Ich habe hier RESHAPE verwendet, um eine geeignete Matrix zu erstellen, um mit der Arbeit zu beginnen. Das Programm wird hier nicht wiedergegeben, sondern nur die Hauptaussagen. TRANSPOSE (MATRIX) transponiert eine Matrix, die ein Array von Rang 2 ist. Es ersetzt die Zeilen und Spalten in der Matrix. MAXLOC (ARRAY, mask) gibt die Position des größten Elements im Array zurück. Wenn MASK nur für diejenigen enthalten ist, die die Bedingungen in MASK erfüllen. Das Ergebnis ist ein Integer-Vektor Es wird in der Lösung der Übung (11.1) verwendet. MINLOC (ARRAY, mask) gibt die Position des kleinsten Elements im Array zurück. Wenn MASK nur für diejenigen enthalten ist, die die Bedingungen in MASK erfüllen. Das Ergebnis ist ein Integer-Vektor ASSOCIATED (POINTER, target) ist eine logische Funktion, die angibt, ob der Zeiger POINTER mit einem Ziel verknüpft ist und wenn ein bestimmter TARGET enthalten ist, gibt er an, ob er mit genau diesem Ziel verknüpft ist. Wenn sowohl POINTER als auch TARGET Zeiger sind, ist das Ergebnis. TRUE. Nur wenn beide mit demselben Ziel verknüpft sind. Ich verweise den Leser auf Kapitel 12 des Haupttextes, Zeiger. Eine Subroutine, die das Datum, die Zeit und die Zeitzone zurückgibt. Mindestens ein Argument muss gegeben werden. DATE muss eine skalare Zeichenfolgenvariable mit mindestens 8 Zeichen sein und dem Wert CCYYMMDD für Jahrhundert, Jahr, Monat und Tag zugewiesen werden. Alle werden numerisch mit Leerzeichen angegeben, wenn das System das Datum nicht enthält. ZEIT muss auch eine skalare Zeichenkettenvariable mit mindestens 10 Zeichen sein und ihr wird ein Wert hhmmss. sss für die Zeit in Stunden, Minuten, Sekunden und Millisekunden zugewiesen. Alle werden numerisch mit Leerzeichen angegeben, wenn das System keine Uhr enthält. ZONE muss eine skalare Zeichenfolgenvariable mit mindestens 5 Zeichen sein und dem Wert hhmm für Vorzeichen, Zeit in Stunden und Minuten für die lokale Zeitdifferenz mit UTC (die zuvor Greenwich Mean Time genannt wurde) zugeordnet. Alle werden numerisch mit Leerzeichen angegeben, wenn das System keine Uhr enthält. In Schweden erhalten wir also 0100 im Winter und 0200 im Sommer, in Nowosibirsk bekommen wir 0700. Die Variable VALUES ist stattdessen ein Integer-Vektor mit mindestens 8 Elementen, der einfachste Weg, die Ergebnisse von DATEANDTIME bei den Berechnungen in einem Programm zu verwenden. Wenn das System nicht das Datum oder die Zeit, die Sie den Wert - HUGE (0). Das ist die kleinste ganze Zahl im Modell, als Ausgang. Der Vektor enthält die folgenden Elemente: Jahr, Monat, Tag, Zeitdifferenz in Minuten. Stunden, Minuten, Sekunden und Millisekunden. Subroutine, die die Systemzeit zurückgibt. Mindestens ein Argument muss gegeben werden. COUNT ist eine skalare Ganzzahl, die für jeden Zyklus bis zu COUNTMAX um eins erhöht wird. Wo es wieder anfängt. Wenn keine Systemuhr vorhanden ist, wird - HUGE (0) zurückgegeben. COUNTRATE ist eine skalare Ganzzahl, die die Anzahl der Zyklen pro Sekunde angibt. Ist keine Systemuhr vorhanden, wird der Wert Null zurückgegeben. COUNTMAX ist eine skalare Ganzzahl, die den maximalen Wert angibt, den COUNT erreichen kann. Wenn keine Systemuhr vorhanden ist, wird stattdessen Null zurückgegeben. Eine Unterroutine, die die Folge von Bits in Position FROMPOS kopiert und die Länge LEN zum Ziel TO hat, die in Position TOPOS startet. Die verbleibenden Bits werden nicht geändert. Alle Mengen müssen ganze Zahlen sein und alle außer TO müssen INTENT (IN) haben, während TO soll INTENT (INOUT) haben und vom gleichen Typ wie FROM sein. Die gleiche Variable kann FROM und TO sein. Einige natürliche Einschränkungen gelten für die Werte von LEN, FROMPOS und TOPOS und Sie müssen auch den Wert von BITSIZE berücksichtigen. Aus einem Startwert, der als Integer-Vektor gespeichert ist, kann eine Folge von Pseudozufallszahlen erzeugt werden. Die Subroutinen bieten eine tragbare Schnittstelle zu einer implementierungsabhängigen Zufallszahlenfolge. Diese Subroutine gibt in der Gleitkommazahl Variable HARVEST eine (oder mehrere, wenn HARVEST ein Array ist) Zufallszahlen zwischen 0 und 1. Diese Subroutine setzt den Zufallszahlengenerator zurück oder gibt Auskunft darüber. Es sind keine Argumente vorzusehen. Die Ausgangsvariable SIZE muss eine skalare Integerzahl sein und die Anzahl der Integer (N) geben, die der Prozessor für den Startwert verwendet. Die Eingangsgröße PUT ist ein ganzzahliger Vektor, der die vom Anwender gelieferten Startnummern in den Zufallszahlengenerator setzt. Die Ausgangsgröße GET (auch ein Integer-Vektor) liest den aktuellen Startwert. Beispiel: Ein einfaches Beispiel für die Verwendung dieser Funktionen ist jetzt verfügbar. Mehr auf Arrays Zuweisung: Neues Fortran: Fortran 90 Array Arithmetische Zuweisung Anweisungen, Array Initialisierung, Implante DO, Fortran 90 Intrinsics: MAXLOC. MAXVAL. MINLOC. MINVAL. SUMME. COUNT WHERE, ELSE WHERE Struktur Sobald Sie in ernsthafte Nutzung von Arrays in der Ingenieur-und wissenschaftlichen Anwendungen zu bekommen, dauert es nicht viel Mühe, um die Fähigkeiten Ihres Computers zu strecken. Es ist nur eine Frage der Erhöhung der Auflösung Ihrer Ansicht der realen Welt. Sie beginnen, sich um die Speicherung der Maschinen und die Maschinengeschwindigkeit zu kümmern und versuchen, sich an einige der Dinge zu erinnern, die Sie einmal über Pipeline-Arithmetikeinheiten, Vektor - und Parallelverarbeitung gehört haben. Ein Teil der Motivation hinter Fortran 90 war, die effiziente Nutzung dieser Maschinenelemente transparenter zu gestalten. Dies wurde durch einige einfache Spracherweiterungen und eine wesentliche Erhöhung der Menge der verfügbaren intrinsischen Funktionen erreicht. Die Details vieler zeitsparenden Funktionen sind in den intrinsischen Funktionen versteckt, wo Sie nicht brauchen, um über sie zu kümmern. Wenn Sie über Vektor-Pipelines in Computern denken, sollten Sie erkennen, dass einfache DO-Schleifen, die mit Array-Elementen sind große Möglichkeiten, um die Pipelines gefüttert halten. Das folgende Programmiersegment wird eine sehr gute Aufgabe machen, einen Strom von Zahlen in einen Pipeline-Multiplikator zu pumpen. Die Hinzufügung einiger Glocken und Pfeifen zur DO-Schleife kann es jedoch sehr schwierig machen, daß ein Compiler die Pipeline - (oder parallele) Verarbeitung nutzt. Zum Beispiel, nach der Erzeugung von Werten für die Elemente von c, müsste ich den Maximalwert, den Minimalwert und den Mittelwert der Elemente in c kennen. Ein ziemlich normaler Algorithmus zur Erzeugung dieser Werte innerhalb einer DO-Schleife ist: Beachten Sie, dass eine Summe durch Initialisieren von csum auf Null vor der Schleife erzeugt wird und jedes Element von c zu csum hinzugefügt wird, während die Schleife fortschreitet. Ein Maximalwert wird durch Initialisieren von cmax zu einer derart extrem negativen Zahl erhalten, daß jedes Element von c den ersten Wert von cmax überschreitet, wenn die Max-Tests in der Schleife fortschreiten. Eine ähnliche Aktion wird ausgehend von einem sehr großen Wert für cmin durchgeführt, um das Minimum aller Elemente in c zu erhalten. Da die Erzeugung von cmin, cmax und csum von Werten abhängt, die beim letzten Durchlauf durch die Schleife erhalten wurden, sind diese Operationen nicht direkt für eine Pipeline - oder Parallelverarbeitung geeignet. Als Ergebnis wird ein Compiler in der Regel aufzugeben versucht, alles zu tun, um die DO-Schleife zu vektorisieren. Fortran 90 fordert Sie auf, das Potenzial für höhere Computergeschwindigkeit zu halten, indem Sie eine Abkürzung für den Teil der Schleife einführen, der die Multiplikation ausführt, und die Bereitstellung von intrinsischen Funktionen, um die anderen Operationen abzudecken. Für längere Programme ziehe ich lieber eine etwas längere Form dieser Notation vor: Das macht es jedem Leser klar, dass man wirklich mit Arrays arbeitet und gibt klar den Bereich an, über den die Operationen auftreten. Diese Notation kann um einen Skipfaktor (oder Schritt) erweitert werden, der sich wie das Indexinkrement in einer DO-Anweisung verhält. Zum Beispiel könnte die Summe der ungeradzahligen Elemente in c erhalten werden mit: Die Summe von geraden Elementen wäre: Für Arrays von beliebiger signifikanter Größe ist es unwahrscheinlich, dass der Compiler effizienteren Maschinencode aus dem DO-Schleifen-Konstrukt erzeugt, als er Verwendet die Fortran 90 intrinsic Funktionen. Daher ist es sich zu erinnern: SUM - eine Fortran 90 intrinsische Funktion, um die Elemente des Arrays als Argument zur Verfügung gestellt. Wenn nur der Name des Arrays bereitgestellt wird (z. B. Summe (c)), werden alle Elemente des Arrays summiert. Ein ausgewählter Teil des Arrays kann summiert werden, wenn ein Ganzzahlbereichsausdruck mit dem Arraynamen (zB Summe (c (2: 10)) geliefert wird, summiert die Elemente 2 bis 10 von c). Diese Funktion kann zwei weitere optionale Argumente annehmen, die ausführlicher behandelt werden, wenn wir zu mehrdimensionalen Arrays gelangen. Es ist bemerkenswert hier, dass die MASK-Option Sie weitere Einschränkungen der Elemente, die Sie in die Summe einschränken können. Dies ist als Argument mit einem logischen Ausdruck enthalten, der ein Array mit der gleichen Größe einschließt wie das zu summierende Array. Zum Beispiel: wertet die Summe aller positiven Elemente in c aus und wertet die Summe aller Elemente in c aus, die negativ sind. Die Anweisung wertet die Summe aller Elemente in c aus, für die entsprechende Elemente in b größer als 8 sind (siehe sums. f für ein Testprogramm). MINVAL - Eine Fortran-90-Funktion, um den minimalen Wert aller Elemente zu erhalten, die in dem Array enthalten sind, das als Argument für die Funktion bereitgestellt wird. Die gleichen optionalen Argumente, die in SUM bereitgestellt werden, sind hier verfügbar. MINLOC - MINVAL gibt Ihnen den minimalen Wert, aber nicht sagen, welches Element diesen Wert hat. Diese Funktion Fortran 90 gibt den Index des Elements im Array zurück, dessen Wert minimal ist. Wenn c (1) 1, c (2) 0 und c (3) -1, dann gibt minloc (c (1: 3)) die ganze Zahl 3 zurück. Aufgrund der Anforderungen für die Verwendung mit multidimensionalen Arrays ist der Wert dieser Funktion Muss an ein Array zurückgegeben werden. Beispielsweise funktioniert icminminloc (c (1: 3)) nur, wenn icmin als Ganzzahlarray deklariert wurde und der Wert 3 im ersten Element von icmin platziert wird. Für diese Funktion steht das optionale Argument MASK zur Verfügung. MAXVAL - Eine Fortran 90-Funktion, um den maximalen Wert aller Elemente zu erhalten, die in dem Array enthalten sind, das als Argument für die Funktion bereitgestellt wird. Die gleichen optionalen Argumente in SUM und MINVAL sind hier verfügbar. MAXLOC - Diese Funktion Fortran 90 gibt den Index des Elements im Array zurück, dessen Wert maximal ist. Wenn c (1) 0, c (2) 1 und c (3) -1 ist, dann liefert maxloc (c (1: 3)) die ganze Zahl 2. Für diese Funktion steht das optionale Argument MASK zur Verfügung. Wenn Sie das MASK-Argument in der SUM-Funktion verwenden, ist es oft nützlich, die Anzahl der Elemente des Arrays zu kennen, für die der MASK-Ausdruck true ist. Dies wird durch die COUNT intrinsische Funktion bereitgestellt. Wenn das Array x 10 Werte hat, dann ergibt die Zählung (x 0,16) das INTEGER-Ergebnis 4. Das MASK-Argument ist sehr allgemein gehalten und muss keine Referenz auf das Array enthalten, das von der intrinsischen Funktion betrieben wird Beziehen sich auf ein Array mit der gleichen Länge. Zum Beispiel könnte ich haben Arrays mit Informationen über n Personen mit Alter mit Altersgruppen und Gewicht mit den entsprechenden Gewichten. Das durchschnittliche Gewicht der Personen von 30 bis 39 Jahren kann aus der folgenden Aussage erhalten werden: Ein weiteres allgemeines Merkmal dieser intrinsischen Funktionen des Arrays ist, dass das Argument kein einfaches Array sein muss. Es kann ein arithmetischer Ausdruck mit Arrays mit den gleichen Längen sein. Zum Beispiel von Zeit zu Zeit haben Sie eine Reihe von experimentellen Ergebnissen ydata und eine Reihe von entsprechenden theoretischen Vorhersagen ytheory. Ein nützliches Maß für die Qualität Ihrer Theorie (und möglicherweise Ihre Daten) ist die Standardabweichung, die eine Berechnung der Summe der Quadrate der Unterschiede zwischen Daten und Theorie erfordert. Beachten Sie, dass die Reihenfolge der Operation hier so ist: sumsqdf (ydata (1) - ytheory (2)) 2 (ydata (2) - ytheory (2)) 2. Wenn Sie in komplexere Programmieraufgaben gelangen, finden Sie möglicherweise die Notwendigkeit, die gleiche Art von Maskierungsfeatures, die für die SUM-Intrinsic-Funktion diskutiert werden, auf Arrayzuweisungsanweisungen anzuwenden. Zum Beispiel, wie Sie verhindern, dass eine Division durch Null in einer Array divide-Anweisung Dies wird durch die WHERE, ELSE WHERE, END WHERE, Struktur abgedeckt. Ich kann schreiben, ich kann mehr Informationen für den Fall, dass ein Element von b Null ist, werden Sie versucht sein, zu denken, WO, wo sonst Strukturen als Analogien zu IF, ELSE IF, aber nicht tragen den Vergleich zu weit. Die ELSE WHERE-Anweisung ist die gleiche wie die einfache ELSE-Anweisung in einer IF-Struktur. Es gibt kein Äquivalent zu ELSE IF in einer WHERE-Struktur. WHERE erlaubt höchstens zwei mögliche Handlungen. Für Array-Elemente, bei denen die Maske im initialen WHERE true ist, werden die Anweisungen unmittelbar nach dem WHERE-Befehl ausgeführt. Für Elemente, bei denen die Maske falsch ist, werden Anweisungen, die einem beliebigen ELSE WHERE folgen, ausgeführt (keine ELSE WHERE, dann wird nichts getan). Für mehr Praxis mit WHERE, Studie where. f das Ende von array2.f. Many times you do not want to operate on the full range of the arrays dimension. Lets take the example that we only want to operate on elements 2 through 9. Elements 1 and 10 may be boundary values in some physical problem. For a standard DO loop, you would be doing something like: In Fortran 90 the above problem is not difficult. Just use the appropriate integer range notation. Array Initialization Those of you who have been studying the examples array1.f. array2.f. sums. f. and where. f. have already seen the two methods of array initialization introduced in the two examples above. However, I havent spelled out the key rules of the game. The simplest and most common is a full specification of the arrays contents in a DATA statement. You give the array name with no index specification followed by a data list containing values for every element of the array.. Constructs like 31. say repeat the value 1. in three consecutive array elements. I could have also done something like: to specifically fill individual array elements, but not initialize others. The curious construct (a(j),j1,4) is an implied DO loop, similar to the one associated with the WRITE statements in array1.f. The implied DO can also be used with direct data initialization in a type statement. For example: is equivalent to I could have generated a more complicated series: which is the same as Assignment of values within a REAL statement is new to Fortran 90, and this use of the implied DO is restricted to the REAL (dont try it within a value list for a DATA statement). It is also worth mentioning that although a statement is valid, the statement does not work. You cant use the repeat operation of a DATA statement in a REAL assignment. Remember that an implied DO loop is legal in DATA statement only as part of the list of variables to receive values: The above statement sets odd indexed elements of a to a value of 1.0 and even indexed elements to a value of 0.0. To see the values of even elements in a, I can apply an analogous implied DO loop to a WRITE statement. Please note that nothing has changed in positioning of DATA and REAL statements, assigning initial values to arrays. They are still non-executable, and must precede any executable statements in the program unit where they are applied. Mathematica (optional) If you are coasting in the Applications Labs, I recommend that you also take a look at the symbolic algebra package called Mathematica, and have provided some sample Mathematica scripts. It is in effect another programming language, but operating at a much higher lever. Fortran really only deals with numbers, but Mathematica will manipulate symbolic (algebraic) expressions. It can handle all of those factorization problems that drove you nuts in high school algebra, and do all the chain rule work to obtain general derivatives of functions. Better yet it can do a wide range of indefinite or definite integrals. You can also use its built in capabilities to solve complicated equations, both algebraically when possible, and numerically when no closed form algebraic solution exists. Later in the semester, you may want to use Mathematica to solve an Ordinary Differential Equation If you have the time, search the Web for Mathematica Tutorials. download tutorial notebooks, and use them by starting the XWindows interface to Mathematica with the command mathematica. To solve the problem at hand I recommend that you copy the file mathin into your home directory, and try it by typing math at the Unix prompt, and the typing ltltmathin when you get a Mathematica prompt. To exit Mathematica type Quit. Once you have a feel for what mathin is doing, modify it with vi to solve your problem. You can learn more about Mathematica by looking at the book Mathematica by Stephen Wolfram in one of the campus libraries (usually on reserve in the Math Library). You can also pick up a little from my list of basics. or Chris Duffys quick reference. Check you knowledge of this material, but first be sure your Web Browser works correctly. Back to the Table of Contents HomeCategory:Fortran Listed below are all of the tasks on Rosetta Code which have been solved using Fortran. Your Help Needed If you know Fortran . please write code for some of the tasks not implemented in Fortran . Fortran is the oldest programming language still in widespread use. The language has evolved considerably since it was first released in 1957. Fortran was original developed for scientific and engineering applications, and remains especially suited to numeric computation and scientific computing. By convention, versions before Fortran 90 are spelled with all uppercase letters (e. g. FORTRAN 66, FORTRAN 77), while starting with Fortran 90, the mixed case spelling is used (i. e. Fortran 90, Fortran 95, Fortran 2003 and Fortran 2008 ). The most recent standard is Fortran 2008 (ISOIEC 1539-1:2010). The next, informally known as Fortran 2015. is underway. FORTRAN 77, being quite old, lacks almost everything one expects from a modern programming language. It uses a fixed-length line and column oriented line format which was motivated by punch cards. Due to its age, and since FORTRAN compilers generally gave very good performance for numerical code, a lot of code, especially scientific code, was written in FORTRAN. Also, for quite a while there was no free Fortran 90 compiler, which also caused a lot of FORTRAN 77 code to be written even quite some time after Fortran 90 was standardized. Because of the large body of code written in FORTRAN 77 it remains relevant today. Indeed, every modern Fortran compiler still accepts FORTRAN 77 code. Fortran 90 was a major revision of the language. It introduced a new free-form source code format, modern programming language features like modules, pointers and user-defined types, an improved type system for built-in types and superiour built-in array handling. Newer Fortran standards (Fortran 2003 and Fortran 2008) added further modern features, like support for object oriented programming. inheritance. polymorphism. parallel processing. and interoperability with the C programming language. Subcategories This category has the following 3 subcategories, out of 3 total.


No comments:

Post a Comment