#block##pageblock##page (2)##setcount (1)##count per page# #head# #center#DYNAMO-Compiler #center#____________________________________________________________ #end# #bottom odd# #center#____________________________________________________________ GMD #right#DYNAMO - % #end# #bottom even# #center#____________________________________________________________ DYNAMO - % #right#GMD #end# #ib#1. Einleitung#ie# Diese Handbuch beschreibt die Funktion des EUMEL-DYNAMO-Compilers in der Version 3.3+ und seine Einschränkungen oder Änderungen gegenüber dem DYNAMO-Sprachstandard. In keiner Weise kann diese Beschreibung eine Einfüh­ rung in die Programmiersprache DYNAMO ersetzen! Die beschriebene Compilerversion enthält nun auch ein Modul zur Unterstützung von hochauflösender Grafik durch die häufig in IBM-PC/AT-Kompatiblen eingesetzte CGA-Grafikkarte. Dennoch ist es einfach möglich, diesen Grafikmodus auszuschal­ ten, und somit die alte, zeichenorientierte Grafik weiter zu verwenden. Der DYNAMO-Compiler wurde 1983 von Robert Keil und Torsten Fröhlich (Helm­ holtz-Gymnasium, Bonn) im Rahmen des MIKROS-Projektes am Informatik-Kolleg der GMD entwickelt. Für Spezifikation und Betreuung der Entwicklung war Dr. Diether Craemer verantwortlich, software-technische Unterstützung kam von Prof. John Henize, Dr. Peter Heyderhoff, Rudolf Legde und Dipl.- Math. Lothar Oppor. Die Grafik wurde von D.Giffeler beigesteuert. #ib#1.1. Referenzliteratur#ie# [1] Craemer, Diether "Mathematisches Modellieren dynamischer Vorgänge" e. Einf. in die Programmiersprache DYNAMO Stuttgart, Teuber, 1985 ISBN 3-519-02477-2 [2] Craemer, Diether "Fluß und Zustand - Simulation dynamischer Vorgänge in DYNAMO" in: LOGIN 5 (1985), Heft 1, S. 20-23 [3] Pugh, Alexander L. "DYNAMO II User's Manual" Cambridge, London 1973: MIT-Press ISBN 0-262-66018-0 #page# #ib#1.2. Die Programmiersprache DYNAMO#ie# DYNAMO wurde von einer Gruppe um Jay FORRESTER am Massachusetts Institute of Technology (MIT) um 1960 entwickelt. Die Sprache basiert auf der #on ("i")# System Dynamic#off ("i")# von FORRESTER. In DYNAMO (#on ("u")##on ("b")#Dyna#off ("b")##off ("u")#mic #on ("u")##on ("b")#Mo#off ("b")##off ("u")#delling Language) können Systeme, in denen Veränderun­ gen kontinuierlich geschehen, modelliert und simuliert werden. Kontinuierliche Veränderungen von Größen werden über deren Veränderungsrate im Wesentlichen nach folgender Gleichung berechnet Größe jetzt = Größe früher + DT * Veränderungsrate, dabei ist DT die Länge des Zeitintervalls von "früher" bis "jetzt". Außer diesen Gleichungen für Größen braucht man Gleichungen für die Verände­ rungsraten, für Hilfsgrößen, zur Initialisierung von Größen, zur Definition von Konstan­ ten und Tabellen, zu Angaben von Simulationsläufen und zur Wiedergabe von Ergeb­ nissen in Zahlentabellen oder Diagrammen. Alle diese Gleichungen können einfach in der Form, wie man sie aus dem Mathema­ tik-Unterricht der Sekundarstufe kennt, hingeschrieben werden, ohne sich Gedanken über den Ablauf des Programms machen zu müssen. #on ("b")# DYNAMO ist also eine einfache funktional-applikative, nicht-prozedurale Sprache.#off ("b")# Das macht ihren Reiz und ihre Leistungsfähigkeit aus, die zur Formulierung der be­ kannten Weltmodelle von FORRESTER, MEADOWS ("Die Grenzen des Wachstums"), PESTEL, MESAROVIC u.a. in dieser Sprache führten. Anwendungsgebiete der Sprache sind ökologische, gesellschaftliche, wirtschaftliche und technische Systeme, deren dynamisches Verhalten der Modellbildner nachbilden und studieren möchte. Im Allgemeinen verfolgt der Modellbildner mit seinem Modell einen Zweck (Verhaltens­ änderung des nachgebildeten Systems), so daß auch neben gesicherten Fakten die Wertvorstellungen des Modellbildners in das Modell eingehen. #ib#1.3 Kurz-Einführung in die DYNAMO- Schreibweise#ie# Die System Dynamic Methode benutzt als Analogie-Bild den Archetyp des Flusses: - Wasser fließt durch das Flußbett, kann in Seen gestaut und in der Ge­ schwindigkeit durch Schleusen und Wehre reguliert werden. - Analog dazu "fließt" Geld auf dem Überweisungsweg, wird in Konten gestaut, und die Liquidität kann durch Zinssätze reguliert werden. - Gedanken "fließen" auf Nervenbahnen, werden im Gehirn gespeichert, und Gedankenströme werden über Synapsen reguliert. - Autos "fließen" über Straßen, werden auf Parkplätzen gestaut, und der Ver­ kehrsfluß wird über Ampeln reguliert. - Menschen "fließen" über Wanderwege, halten sich in Wohnorten auf, und die Bevölkerungsdynamik wird durch ein komplexes, rückgekoppeltes Zusammen­ spiel von Ein- und Auswanderungsraten sowie Geburts- und Sterberaten reguliert. Am letzten Beispiel wird deutlich, daß sich ein soziales Phänomen nur im Zusam­ menwirken vieler netzartig miteinander verbundener Variablen beschreiben läßt (wenn überhaupt). Solange jedoch einigen Variablen ZUSTANDS-CHARAKTER ("Wasserstand") und anderen VERÄNDERUNGS-CHARAKTER ("Flußgeschwindigkeit") zugeordnet werden kann, können die Größen für Berechnungen folgender Art verwendet werden: Wasserstand jetzt = Wasserstand früher + vergangene Zeit * (Zuflußrate - Abflußrate) analog: Bevölkerung jetzt = Bevölkerung früher + vergangene Zeit * (Geburtsrate - Sterberate) Diese Schreibweise kann praktisch so in ein Computerprogramm übernommen wer­ den. Mit geringfügigen Änderungen handelt es sich bei diesen Gleichungen schon um gültige Zeilen in der Programmiersprache DYNAMO. In DYNAMO wird er Zeitpunkt "jetzt" durch das Anhängsel .K, der Zeitpunkt "früher" durch das Anhängsel .J, die Zeitspanne von jetzt bis später durch das Anhängsel .KL, die Zeitspanne von früher bis jetzt durch das Anhänsel .JK und die vergangene Zeit mit DT (wie "Delta Tempus": Zeitdifferenz) bezeichnet. Die Variablen mit Zustands- Charakter heißen LEVELS (Niveaus) und die Veränderungs-Charakter heißen RATES (Veränderungsraten, Geschwindigkeiten). Die entsprechenden Gleichungen werden mit L bzw. R gekennzeichnet. Es gib weitere Kennzeichnungen: C für Konstantendefinition (constant) T für Tabellendefintion (table) A für Hilfsgrößen (auxiliaries) N für Anfangswerte (initial) X für Folgezeile (extension) PRINT für Ausgabe von Zahlen PLOT für Ausgabe von Diagrammen Ein einfaches Bevölkerungsmodell könnte z.B. so geschriben werden: L BEVÖLKERUNG.K=BEVÖLKERUNG.J+DT*(GEBURTENRATE.JK X -STERBERATE.JK) R STERBERATE.KL=5 R GEBURTENRATE.KL=20 N BEVÖLKERUNG=1000 C DT=1 (jedes Jahr wird neu berechnet) C LENGTH=60 (60 Jahre werden simuliert) PRINT BEVÖLKERUNG Für eine tiefere Einführung in DYNAMO sollte man die Referenzliteratur zu Rate ziehen. #ib#1.4 Eine erste, kleine Sitzung mit dem DYNAMO-System#ie# Wir gehen davon aus, daß das DYNAMO-System in ihrer Task generiert worden ist (siehe 2.). 1. Tippen Sie das obrige Programm mittels des EUMEL-Editors ab. 2. Verlassen Sie den Editor mit und starten Sie den DYNAMO- Compiler durch die Eingabe des Befehls "dynamo". 3. Nach erfolgreichem Übersetzen sollte Ihnen nun das DYNAMO-Runtime- System zur Verfügung stehen. Durch den Befehl 'run' wird das Programm aus­ geführt und Sie erhalten eine Zahlenkolonne, die die Entwicklung der Bevöl­ kerung in den zu untersuchenden 60 Jahren angibt. Falls Ihnen beim Abtippen des Programms Fehler unterlaufen sein sollten, so kann das Programm nicht fehlerfrei übersetzt werden. Fehlermeldunggen zur Compile-Zeit des DYNAMO-Compilers werden im Paralleleditor angezeigt; das Programm kann im oberen der beiden Editorfenster (in diesem befinden Sie sich auch nach Fehlern) korrigiert werden. Danach können Sie erneut wie nach Punkt 2 ver­ fahren. #page# #ib#2. Generierung des DYNAMO-Compilers#ie# Der DYNAMO-Compiler, seine Funktionen und die Beispielprogramme werden auf zwei Archiv-Disketten a#b#' 360 KB ausgeliefert. Zum Generieren des DYNAMO-Systems legen Sie bitte die erste Diskette in das Dikettenlaufwerk Ihres Rechners und durch folgende Kommandozeile lesen Sie den Generator vom Archiv und starten ihn: archive ("dynamo"); fetch ("dyn.inserter", archive); run Danach holt der Generator alle benötigten Dateien vom eingelegten Archiv bzw. von dem zweiten Archiv (nachdem er Sie zum Wechseln der Diskette aufgefordert hat). Anschließend wird der DYNAMO-Compiler insertiert. Am Ende der Generierung werden Sie gefragt werden, ob Sie den Compiler mit Grafik#u##count ("Grafik")##e# oder ohne benutzen wollen. Nach der Meldung "dynamo system generiert" können Sie den Compiler#foot# #u##value ("Grafik")##e# Es kann z.Zt. nur eine CGA-Grafikkarte betrieben werden #end# nutzen. #page# #ib#3. Der EUMEL-DYNAMO-Compiler#ie# Der im EUMEL-System implementierte DYNAMO-Compiler ist ein 2-Pass- Compiler, der die DYNAMO-Programme zunächst in ELAN übersetzt. Der Vorteil dieser Methode besteht darin, daß es möglich ist, übersetzte Programme unabhängig vom DYNAMO-Compiler zur Ausführung bringen zu können. Die Notation der im folgenden aufgeführten ELAN-Prozeduren des Compilers ent­ spricht der in den EUMEL-Handbüchern üblichen Prozedurkopf-Schreibweise. Als Beispiel: dynamo ("dyn.grasshasenfuchs") ein Beispiel für den Aufruf der Prozedur mit der Prozedurkopf-Schreibweise PROC dynamo (TEXT CONST filename) auf der Kommando-Ebene des Betriebssystems EUMEL. Der Prozedur 'dynamo' wird beim Aufruf der Dateiname (TEXT) 'filename' übergeben und dadurch der Compiler auf die Datei mit dem Namen 'filename' angewendet. #ib#3.1. Benutzung des DYNAMO-Compiler#ie# Um ein DYNAMO-Programm zu Übersetzen, gibt es grundsätzlich zwei Möglichkei­ ten. Erst einmal kann man ein DYNAMO-Programm in ein ELAN-Programm um­ wandeln, jedoch ohne es dabei zur Ausführung zu bringen. Dieses ELAN-Programm kann man nun unabhängig vom eingentlichen Compiler starten. Die zweite, wohl öfter angewendete Methode ist, ein DYNAMO-Programm in ein ELAN-Programm zu compilieren, wobei es danach direkt ausgeführt wird. Ob danach ein ELAN- Programm zur Verfügung stehen soll, kann der Benutzer selbst entscheiden. PROC dynamo Zweck: Aufruf des DYNAMO-Compilers mit 'quelldatei' = 'last param', d.h. das zu übersetzende Programm steht in der zuletzt bearbeiteten Datei. PROC dynamo (TEXT CONST quelldatei) Zweck: Ruft den DYNAMO-Compiler für die Datei 'quelldatei' auf. Anmerkung: Gleichbedeutend mit 'dynamo (quelltext, quelltext + ".elan", TRUE)', s. nächste Prozedur. Beispiel: dynamo ("dyn.grashasenfuchs") Der DYNAMO-Compiler wird auf die Datei "dyn.grashasenfuchs" ange­ wendet. PROC dynamo (TEXT CONST quelldatei, zieldatei, BOOL CONST pass2 ausfuehren) Zweck: Diese Prozedur startet den DYNAMO-Compiler. 'quelldatei' gibt den Namen der Datei an, in welcher der DYNAMO-Quelltext enthalten ist, 'zieldatei' ist der Name der Datei, die das erzeugte ELAN-Programm beinhalten soll. Wenn 'pass2 ausfuehren' = TRUE, dann wird dieses auch durch den ELAN-Compiler weiterverarbeitet (das Programm wird zur Ausführung gebracht). Beispiel: dynamo ("dyn.grashasenfuchs", "grashasenfuchs.elanprogramm", FALSE) Im obigen Beispiel wird der in der Datei "dyn.grashasenfuchs" enthaltene DYNAMO-Quelltext in die Datei "grashasenfuchs.elanprogramm" als ELAN-Programm geschrieben. Das ELAN-Programm wird nicht ausge­ führt. PROC erase (BOOL CONST erase option) Zweck: Wenn 'erase option' = TRUE, so werden die erzeugten ELAN-Programme nach Beendigung der Ausführung gelöscht, bei 'erase option' = FALSE bleiben sie erhalten (Voreinstellung: 'erase option' = FALSE). PROC error listing (TEXT CONST fehlerdatei) Zweck: Falls gewünscht ist, die Fehlermeldungen, die ggf. beim Übersetzen ein­ treten, auch in eine Datei zu schreiben, so können Sie hier unter 'fehler­ datei' einen Dateinamen angeben. Bei der Angabe von "" wird die Umlei­ tung in die Datei ausgeschaltet werden (Voreingestellt ist 'fehlerdatei' = ""). PROC graphic (BOOL CONST graphic option) Zweck: Mit dieser Prozedur läßt sich einstellen, ob bei der DYNAMO-Anweisung PLOT die hochauflösende Grafik ('graphic option' = TRUE) oder die zei­ chenorientierte Grafik ('grafik option' = FALSE) verwendet werden soll. Die Voreinstellung wird bei der Installation des Compilers erfragt. PROC protokoll (BOOL CONST protokoll option) Zweck: Bei 'protokoll option' = TRUE werden alle Textausgaben, die bei der Laufzeit des DYNAMO-Programmes auftreten, nicht nur auf dem Bild­ schirm dargestellt, sondern auch in eine Datei mit dem Namen "dyn.out" protokolliert (voreingestellt ist 'protokoll option' = FALSE). Die Datei "dyn.out" enthält auch Seitenvorschubbefehle ('\#page\#') und sollte nur mit einem EUMEL-Printer ausgedruckt werden. #ib#3.2. Abweichungen gegenüber dem Sprachstandard#ie# - Die Länge der Namen ist nicht auf 7 Zeichen festgelegt, sondern praktisch be­ liebig (32000). Dies ist eine Erweiterung; wer seine Programme auch auf ande­ ren DYNAMO-Compilern laufen lassen will, sollte sich aber auf 7 Zeichen be­ schränken. - Zahlen werden intern mit einer Mantisse von 13 Stellen abgespeichert, von denen nur die ersten 7 bei der Ausgabe dargestellt werden. Die größte darstellbare Zahl ist daher 9.999999999999e126. - Die maximale Anzahl der Gleichungen ist auf 950 festgelegt. - Der Compiler akzeptiert aus Gründen der besseren Lesbarkeit auch Programme, die in Kleinschrift geschrieben sind. Dabei ist es sinnvoll, die Quellprogramme konsistent zu halten (d.h. Groß- und Kleinschrift nicht zu vermischen). Man sollte grundsätzlich Kleinschrift vorziehen, da diese vom Compiler auch effizienter verarbeitet werden kann. - Quellprogramme dürfen eine beliebige Zahl von Leerzeilen enthalten. X - Befeh­ le (Fortschreibungszeilen) werden davon nicht beeinflußt. - In der augenblicklichen Version 3.3 des Compilers gelten folgende Einschränkun­ gen : 1. Bei der Verarbeitung von Array-Gleichungen werden Compilerseitig keine Semantik-Überprüfungen auf eventuell unzureichende Initialisierung oder Überlappung (d.h. mehrfaches Setzen desselben Elements) durchgeführt. Defaultmäßig bekommen alle Elemente einer Array-Gleichung bei der Initiali­ sierung den Wert '0.0' zugewiesen. 2. Die maximale Größe von Tables und Array-Gleichungen ist durch Verwen­ dung des Vector-Pakets auf 4000 Elemente festgelegt. Da pro Table-Ele­ ment aber zur Zeit eine Zeile im Zielprogramm generiert wird, sollte man dies besser nicht ausnutzen. 3. Supplementary-Gleichungen werden aus Kompatibilitäts-Gründen korrekt übersetzt, aber sonst wie Auxiliary-Gleichungen behandelt. 4. Print ('prtper')- und Plotperiode ('pltper') werden nur als Konstanten verarbei­ tet. Falls Gleichungen für 'prtper' oder 'pltper' angegeben werden, so bewirken diese keine Veränderung. 5. Array-Gleichungen dürfen nicht mehr als eine Dimension besitzen. 6. Für Gleichungen, die Makro-Aufrufe enthalten, sollten Initialisierungs (N)- Gleichungen angegeben werden. #ib#3.3. Das DYNAMO Runtime-System#ie# Nach erfolgreicher Übersetzung wird vom Zielprogramm das Runtime-System aufge­ rufen. In diesem Modus (das DYNAMO-Runtime-System meldet sich mit "dynamo runtime system :") ist es möglich, Konstanten zu ändern und DynamoProgramme zur Ausführung zu bringen. Im DYNAMO-Runtime-System stehen folgende Kommandos zur Verfügung (näheres zur Notation siehe Kapitel 4, S. #to page ("Anweisungen und Funktionen")#). run Zweck: Ausführen des übersetzten Programms run Zweck: Ausführen des übersetzten Programms und retten des Konstantendaten­ raums in des Datenraum mit dem Namen ".const". Existiert der Datenraum bereits, werden die Konstanten aus dem Datenraum in den Lauf übernommen. Somit ermöglicht der Compiler, Konstantenwerte aus einem früheren Lauf wieder zu verwenden. c =Wert [/=Wert [...]] Zweck: Änderung einer oder mehrerer Konstanten ? Zweck: Anzeigen der Konstanten und ihrer Werte quit Zweck: Verlassen des Runtime-Systems help Zweck: Zeigt eine kurze Erklärung Bei PRINT- und PLOT-Ausgaben sind folgende Kommandos möglich: + Nächster Bildschirm o (Off), keine Unterbrechung der Ausgabe (nicht möglich bei hochauflösen­ der Grafik) e (End), Zurück zum Runtime System p Phasendiagramm (nur bei hochauflösender Grafik möglich) #ib#3.4. Fehlermeldungen des DYNAMO-Compilers#ie# Falls der Compiler einen Fehler im DYNAMO-Programm entdeckt, gibt er eine Feh­ lermeldung nach dem folgenden Muster aus: "Fehler in Zeile bei >> << : . Im folgenden sind alle Fehlermeldungen und Möglichkeiten zur Abhilfe aufgelistet, sofern diese nicht klar ersichtlich sind: 1 GLEICHUNG DOPPELT DEFINIERT 2 DOPPELTE INITIALISIERUNG 3 FALSCHER ZEILENTYP -> Erlaubt sind : a, c, l, n, r, s, print, plot, note, spec, *, x, macro, mend, for, noise, run. 4 VERSCHACHTELTE MAKRO-DEFINITION -> 'mend' - Befehl fehlt. 5 MAKRO-NAME ERWARTET 6 '(' ERWARTET 7 FORMALER PARAMETER ERWARTET 8 ')' NACH PARAMETERLISTE ERWARTET 9 BEI AUXILIARIES NUR SUBSKRIPTION MIT '.K' ERLAUBT 10 BEI KONSTANTEN-DEFINITION NAME ERWARTET 11 BEI LEVELS NUR SUBSKRIPTION MIT '.K' ERLAUBT 12 BEI RATES NUR SUBSKRIPTTION MIT '.KL' ERLAUBT 13 BEI TABLE-DEFINITIONEN KEINE SUBSKRIPTION ERLAUBT 14 X - BEFEHL HIER NICHT ERLAUBT 15 BEI FOR-DEFINITION NAME ERWARTET 16 '=' NACH FOR-VARIABLE ERWARTET 17 BEREICHSANGABE ERWARTET 18 ',' ERWARTET 19 LOKALE GLEICHUNG NUR IN MAKRO ERLAUBT 20 BEI DEFINITION NAME ERWARTET 21 '=' ERWARTET 22 INDEX NICHT KORREKT -> Als Index ist nur erlaubt : !, !. ::= "+"; "-". 23 ')' NACH INDIZIERUNG ERWARTET 24 PRTPER NICHT DEFINIERT -> Wenn das Programm einen Print-Befehl enthält, muß 'prtper' (Printperiode) als Konstante definiert werden. 25 PLTPER NICHT DEFINIERT -> Wenn das Programm einen Plot-Befehl enthält, muß 'pltper' (Plotperiode) als Konstante definiert werden. 26 '/' ODER ',' BEI PLOT ERWARTET 27 NAME ALS PLOTPARAMETER ERWARTET 28 DOPPELTE SCALE - ANGABE IN EINER GRUPPE -> Wenn mehrere Plotparameter mit ',' getrennt werden (also die gleiche Ska­ lierung erhalten), dürfen nicht mehrere feste Skalierungen angegeben wer­ den. 29 ERSTE SCALE - ANGABE ERWARTET 30 ZWEITE SCALE - ANGABE ERWARTET 31 ')' NACH SCALE - ANGABE FEHLT 32 PRINTPARAMETER NICHT DEFINIERT 33 PRINTPARAMETER ERWARTET 34 TIME DARF NUR INITIALISIERT WERDEN 35 DT NICHT DEFINIERT 36 LENGTH NICHT DEFINIERT 37 BEI KONSTANTEN - DEFINITION ZAHL ERWARTET 38 BEI INITIALISIERUNG KONSTANTE ERWARTET 39 LEVELS MUESSEN INITIALISIERT WERDEN 40 KONSTANTE BEI TABLE ERWARTET 41 '/' ODER "," ERWARTET 42 TABLE - DEFINITION OHNE BENUTZUNG 43 SIMULTANE GLEICHUNGEN -> Bei dem Versuch, A, R, oder N - Gleichungen zu sortieren, trat eine direkte oder indirekte Rekursion auf. 44 FAKTOR ERWARTET -> Erwartet : ; ; ; ; '(', , ')'; , . ::= '+'; '-'. 45 TIME MUSS MIT '.J' ODER '.K' SUBSKRIBIERT WERDEN 46 SYMBOL NICHT DEFINIERT 47 FUNKTION NICHT DEFINIERT 48 UNZULAESSIGE INDIZIERUNG -> Die Indices auf beiden Seiten der Gleichung müssen immer gleich sein. 49 FALSCHE PARAMETERANZAHL 50 FALSCHES TRENNSYMBOL ZWISCHEN PARAMETERN 51 ALS PARAMETER TABLE ERWARTET 52 FALSCHER PARAMETER IN TABLEFUNKTION 53 ZU VIELE AKTUELLE PARAMETER 54 ')' NACH MAKROAUFRUF FEHLT 55 REKURSIVER MAKROAUFRUF 56 BEI N - GLEICHUNG KEINE SUBSKRIPTION ERLAUBT 57 FALSCHE SUBSKRIPTION IN AUXILIARY - GLEICHUNG 58 ')' ERWARTET 59 FALSCHE SUBSKRIPTION IN LEVEL - GLEICHUNG 60 FALSCHE SUBSKRIPTION IN RATE - GLEICHUNG 61 FOR - VARIABLE NICHT DEFINIERT -> Eine FOR - Variable muß vor der ersten Benutzung definiert werden. 62 KONSTANTE ERWARTET 63 FALSCHES REAL - FORMAT -> Exponent fehlt 64 GLOBALE GLEICHUNG IN MACRO NICHT ERLAUBT 65 DOPPELTE DEFINITION BEI MEHRFACHEM MAKROAFRUF 66 ALS NOISE - PARAMETER ZAHL ERWARTET #page# #ib#4. Anweisungen und Funktionen des EUMEL-DYNAMO-Compilers#ie# #goal page ("Anweisungen und Funktionen")# Dieses Kapitel gibt eine alphabetische Übersicht über die im EUMEL-DYNAMO- Compiler realisierten Anweisungen und Funktionen (wertliefernde Algorithmen). Die Beschreibung der Anweisungen und Funktionen ist nach der DYNAMO- Syntaxregel angegeben, wobei folgende Zeichen mit besonderer Bedeutung verwendet werden: [] optionale Angabe [...] beliebig häufige Wiederholung der letzten optionalen Angabe < > in spitzen Klammern stehende Namen sind Variablen- bzw. Konstan­ tennamen steht für einen beliebigen Bezeichner gemäß der DYNAMO-Syntax bezeichnet einen beliebigen Wert (also auch eine Ausdruck) {} Alternative Angabe X DYNAMO Anweisung, kennzeichnet eine Fortsetzungsszeile der vorhergegangenen Anweiung (S. #to page ("X")#) Alle Anweisungen und Funktionen werden nach dem gleichen Schema dargestellt: Funktionsname#right#Typ (Funkt. oder Anweisung) Zweck: Schlagwort zur Wirkung Format: Beschreibung des Formates (spezielle Zeichen s.o.) Erklärung: kurze Beschreibung der Anweisung/Funktion Beispiel: Anwendung der Anweisung/Funktion Programm: Beispielprogramm, in welchem die Anweisung/Funktion angewendet wird. Referenz: Verweis auf ähnliche oder äquivalente Anweisungen/Funktionen im Format ', Seitennummer'. Eine oder mehrere dieser Felder können fehlen (z.B. wenn es keine Referenz oder kein Beispielprogramm gibt). #page# #ib#4.1. Übersicht über die Anweisungen und Funktionen#ie# #goal page ("A")##ib (2)#A#ie (2)##on ("i")##right#Anweisung#off ("i")# Zweck: Auxiliary-Gleichung (A-Gleichung, Hilfsgleichung) Format: A .K=#u##count ("Ausdruck")##e# #foot# #u##value ("Ausdruck")##e# genaueres über die Definition eines Ausdruckes siehe [1], S. 93 #end# Erklärung: Mit Hilfe von Auxiliary-Gleichungen werden Level- und Hilfsgrößen (Auxiliaries) zum selben Zeitpunkt verknüpft. Beispiel: A JM.K=MM.K/MEJ Programm: "dyn.workfluc" #ib (2)#ABS#ie (2)##on ("i")##right#Funktion#off ("i")# Zweck: Absolutbetrag Format: ABS() Erklärung: Liefert den Absolutbetrag IF >= 0 THEN ELSE - END IF Beispiel: N X=ABS(A*2.0) #goal page ("ARCTAN")#ARCTAN#on ("i")##right#Funktion#off ("i")# Zweck: Berechnung der trigonometrischen Funktion Arcustangens Format: ARCTAN() Erklärung: Berechnet den Arcustangens von ; Ergebnis im Bogenmaß. Beispiel: N X=ARCTAN(TAN(1.3)) (X = 1.3) Referenz: COSD, S. #to page ("COSD")# SIN, S. #to page ("SIN")# SIND, S. #to page ("SIND")# TAN, S. #to page ("TAN")# TAND, S. #to page ("TAND")# ARCTAND, S. #to page ("ARCTAN")# COS, S. #to page ("COS")# #goal page ("ARCTAND")##ib (2)#ARCTAND#ie (2)##on ("i")##right#Funktion#off ("i")# Zweck: Berechnung der trigonometrischen Funktion Arcustangens Format: ARCTAND() Erklärung: Berechnet den Arcustangens von ; Ergebnis im Gradmaß Beispiel: N X=ARCTAND(TAND(45.0)) (X = 45.0) Referenz: COSD, S. #to page ("COSD")# SIN, S. #to page ("SIN")# SIND, S. #to page ("SIND")# TAN, S. #to page ("TAN")# TAND, S. #to page ("TAND")# COS, S. #to page ("COS")# ARCTAN, S. #to page ("ARCTAND")# #goalpage ("C")##ib (2)#C#ie (2)##on ("i")##right#Anweisung#off ("i")# Zweck: Konstantendefinition Format: C = Erklärung: Werte, die während eines Simulationslaufes gleich bleiben, können durch die Konstantendefintion benannt werden (s. auch 'c' im Runtime- System). Beispiel: C POPI=30.3 Programm: "dyn.wohnen" #goal page ("CLIP")##ib (2)#CLIP#ie (2)##on ("i")##right#Funktion#off ("i")# Zweck: Wert nach Bedingung Format: CLIP(,,,) Erklärung: Liefert den Wert des ersten Argumentes, wenn das dritte Argument größer oder gleich dem vierten Argument ist. Andernfalls wird der Wert des zweiten Argumentes geliefert. IF >= THEN ELSE END IF Beispiel: N X=CLIP(1.0,2.0,3.0,4.0) (X = 2.0) Programm: "dyn.welt/forrester" Referenz: FIFGE, S. #to page ("FIFGE")# (äquivalente Funktion) #goalpage ("COS")#COS#on ("i")##right#Funktion#off ("i")# Zweck: Berechnung der trigonometrischen Funktion Cosinus Format: COS() Erklärung: Es wird der Cosinus des Wertes , welcher im Bogenmaß vorlie­ gen muß, geliefert. Beispiel: N X=COS(1.6) Referenz: COSD, S. #to page ("COSD")# SIN, S. #to page ("SIN")# SIND, S. #to page ("SIND")# TAN, S. #to page ("TAN")# TAND, S. #to page ("TAND")# ARCTAN, S. #to page ("ARCTAN")# ARCTAND, S. #to page ("ARCTAND")# #goal page ("COSD")##ib (2)#COSD#ie (2)##on ("i")##right#Funktion#off ("i")# Zweck: Berechnung der trigonometrischen Funktion Cosinus Format: COSD() Erklärung: Es wird der Cosinus des Wertes , welcher im Gradmaß vorliegen muß, geliefert. Beispiel: N X=COSD(33.5) Referenz: COS, S. #to page ("COS")# SIN, S. #to page ("SIN")# SIND, S. #to page ("SIND")# TAN, S. #to page ("TAN")# TAND, S. #to page ("TAND")# ARCTAN, S. #to page ("ARCTAN")# ARCTAND, S. #to page ("ARCTAND")# #goal page ("EXP")##ib (2)#EXP#ie (2)##on ("i")##right#Funktion#off ("i")# Zweck: Exponentialfunktion zur Basis e Format: EXP() Erklärung: Liefert e#u##e# Beispiel: N X=EXP(1.0) (X = 2.71 = e) Referenz: LN, S. #to page ("LN")# (Umkehrfunktion) #goal page ("FIFGE")##ib (2)#FIFGE#ie (2)##on ("i")##right#Funktion#off ("i")# Zweck: Wert nach Bedingung (#on ("u")#f#off ("u")#irst #on ("u")#if#off ("u")# #on ("u")#g#off ("u")#reater or #on ("u")#e#off ("u")#qual) Format: FIFGE(,,,) Erklärung: Liefert den Wert des ersten Argumentes, wenn das dritte Argument größer oder gleich dem vierten Argument ist. Andernfalls wird der Wert des zweiten Argumentes geliefert. IF >= THEN ELSE END IF Beispiel: N X=FIFGE(1.0,2.0,3.0,4.0) (X = 2.0) Referenz: CLIP, S. #to page ("CLIP")# (äquivalente Funktion) #goal page ("FIFZE")##ib (2)#FIFZE#ie (2)##on ("i")##right#Funktion#off ("i")# Zweck: Wert nach Bedingung (#on ("u")#f#off ("u")#irst #on ("u")#if#off ("u")# #on ("u")#ze#off ("u")#ro) Format: FIFZE(,,) Erklärung: Wenn der Parameter den Wert 0 hat, so wird geliefert, andernfalls IF = 0 THEN ELSE END IF Beispiel: N X=FIFZE(1.0,2.0,3.0) (X = 2.0) Referenz: SWITCH, S. #to page ("SWITCH")# #goal page ("FLOOR")##ib (2)#FLOOR#ie (2)##on ("i")##right#Funktion#off ("i")# Zweck: Vorkommastellen Format: FLOOR() Erklärung: Liefert die Vorkommastellen von Beipiel: N X=FLOOR(3.14) (X = 3.0) Referenz: FRAC, S. #to page ("FRAC")# #ib (2)#FOR#ie (2)##on ("i")##right#Anweisung#off ("i")# Zweck: Schleifen-Definition Format: FOR =, Erklärung: bezeichnet eine Schleifenvariable, die von bis hochgezählt wird. Somit ist es möglich, gleiche Berechnungen für die verschiedenen Werte einer Tabelle durchzuführen. Beispiel: FOR BERECHNUNGSZEITRAUM=1900,2100 Programm: "dyn.bev" #goal page ("FRAC")##ib (2)#FRAC#ie (2)##on ("i")##right#Funktion#off ("i")# Zweck: Nachkommastellen Format: FRAC() Erklärung: Liefert die Nachkommastellen von Beispiel: N X=FRAC(3.14) (X = 0.14) Referenz: FLOOR, S. #to page ("FLOOR")# #goal page ("L")##ib (2)#L#ie (2)##on ("i")##right#Anweisung#off ("i")# Zweck: Level-Gleichung Format: L .K=.J+ Erklärung: Die Level-Gleichung stellt einen gegenwärtigen Wert in Bezug zu seinem Wert in der Vergangenheit und seiner Veränderungsrate in der bis dahin vergangenen Zeit (Vergangenheitsausdruck s. [1], S. 96). Beispiel: L HASEN.K=CLIP(HASEN.J+DT*(HGRATE.JK X -HSRATE.JK),0,HASEN.J,0) Programm: "dyn.grashasenfuchs" #goal page ("LN")##ib (2)#LN#ie (2)##on ("i")##right#Funktion#off ("i")# Zweck: Logarithmus-Funktion Format: LN() Erklärung: Berechnet den natürlichen Logarithmus von Beispiel: N X=LN(1.0) (X = 0.0) Programm: "dyn.wasseröko" Referenz: LOG2, S. #to page ("LOG2")# LOG10, S. #to page ("LOG10")# EXP, S. #to page ("EXP")# #goal page ("LOG2")##ib (2)#LOG2#ie (2)##on ("i")##right#Funktion#off ("i")# Zweck: Logarithmus-Funktion Format: LOG2() Erklärung: Berechnet den Logarithmus von zur Basis 2 Beispiel: N X=LOG2(8.0) (X = 3.0) Referenz: LN, S. #to page ("LN")# LOG10, S. #to page ("LOG10")# #goal page ("LOG10")##ib (2)#LOG10#ie (2)##on ("i")##right#Funktion#off ("i")# Zweck: Logarithmus-Funktion Format: LOG10() Erklärung: Berechnet den Logarithmus von zur Basis 10 Beispiel: N X=LOG10(100.0) (X = 2.0) Referenz: LOG2, S. #to page ("LOG2")# LN, S. #to page ("LN")# EXP, S. #to page ("EXP")# #goal page ("MACRO")##ib (2)#MACRO#ie (2)##on ("i")##right#Anweisung#off ("i")# Zweck: Macro-Definition Format: MACRO ([,[...]]) Erklärung: Durch die Verwendung der MACRO-Anweisung können Sie einer oder mehreren DYNAMO-Gleichungen einen Namen geben (). Macros müssen durch MEND abgeschloßen werden und dürfen #on ("u")#nicht#off ("u")# rekursiv aufgerufen werden (vergl. Refinements in ELAN). Beispiel: MACRO SMOOTH(IN,DEL) L SMOOTH.K=SMOOTH.J+DT*(IN.J-SMOOTH.J)/DEL N SMOOTH=IN MEND Programm: "dyn.mac" (diese Datei enthält alle bisherigen Makros) Referenz: MEND, S. #to page ("MEND")# #goal page ("MAX")##ib (2)#MAX#ie (2)##on ("i")##right#Funktion#off ("i")# Zweck: Maximum zweier Größen Format: MAX(,) Erklärung: Liefert die größere Zahl aus und IF > THEN ELSE END IF Beispiel: N X=MAX(1.0,2.0) (X = 2.0) Referenz: MIN, S. #to page ("MIN")# #goal page ("MEND")##ib (2)#MEND#ie (2)##on ("i")##right#Anweisung#off ("i")# Zweck: Macro-Definition Format: MEND Erklärung: MEND beendet eine Macro-Definition Beispiel: MACRO SMOOTH(IN,DEL) L SMOOTH.K=SMOOTH.J+DT*(IN.J-SMOOTH.J) X /DEL N SMOOTH=IN MEND Programm: "dyn.mac" (diese Datei enthält alle bisherigen Makros) Referenz: MACRO, S. #to page ("MACRO")# #goal page ("MIN")##ib (2)#MIN#ie (2)##on ("i")##right#Funktion#off ("i")# Zweck: Minimum zweier Größen Format: MIN(,) Erklärung: Liefert die kleinere Zahl aus und Beispiel: N X=MIN(1.0,2.0) (X = 1.0) Programm: "dyn.forst7" Referenz: MAX, S. #to page ("MAX")# #goal page ("N")##ib (2)#N#ie (2)##on ("i")##right#Anweisung#off ("i")# Zweck: Initialisierungsgleichung Format: N = Erklärung: Initialisert eine Variable mit dem Bezeichner auf den Wert , d.h. es wird ihr ein Startwert zugewiesen. Beispiel: N X=1900 Programm: "dyn.grashasenfuchs" #goal page ("NOISE")##ib (2)#NOISE#ie (2)##on ("i")##right#Funktion#off ("i")# Zweck: Pseudo-Zufallszahlen-Generator Format: NOISE() Erklärung: Diese Funktion liefert eine Pseudo-Zufallszahl zwischen -0.5 und +0.5 und setzt einen neuen Startwert für den Generator fest. Der Parameter wird nicht ausgewertet. Beispiel: N X=NOISE(0) Referenz: NORMRN, S. #to page ("NORMRN")# #goal page ("NORMRN")##ib (2)#NORMRN#ie (2)##on ("i")##right#Funktion#off ("i")# Zweck: Pseudo-Zufallszahlen-Generator Format: NORM(,) Erklärung: Liefert einen Wert zwischen - * 2.4 und + * 2.4. Beispiel: N X=NORM(1.0,10.0) Referenz: NOISE, S. #to page ("NOISE")# #ib (2)#NOTE#ie (2)##on ("i")##right#Anweisung#off ("i")# Zweck: Kommentar Format: NOTE Erklärung: Die Zeilen, die mit NOTE gekennzeichnet sind, werden vom Compiler als Kommentarzeilen erkannt und nicht beachtet. NOTE-Zeilen haben nur dokumentierenden Charakter und sind für den Programmlauf ohne jede Bedeutung. Dennoch sollte man, wenn immer möglich, Kommentare in sein DYNAMO-Programm einfügen, denn sie sind in DYNAMO an­ nähernd die einzige Möglichkeit, ein Programm lesbar zu machen, damit es auch nach längerer Zeit noch korrigiert werden kann. Beispiel: NOTE Dies ist eine Kommentarzeile Programm: "dyn.welt/forrester" #goal page ("PLOT")##ib (2)#PLOT#ie (2)##on ("i")##right#Anweisung#off ("i")# Zweck: Darstellen der Ergebnisse in Diagrammform Format: PLOT [=][(, )][/...][,...] Erklärung: Durch diese Anweisung werden die Größen nach PLTPER Zeiteinheiten in einem Diagramm ausgegeben. Die Angabe eines Druckzeichens ist nur bei zeichenorientierten Grafik erforderlich, denn bei hochauflösender Grafik werden die Graphen der verschiedenen Größen durch unterschied­ liche Linientypen gezeichnet; fehlt bei der zeichenorientierten Grafik das Druckzeichen, so werden die Graphen durch die Zahlen von 0...9 darge­ stellt. Bei "/" werden verschiedene, bei "," gleiche Skalen benutzt. Beispiel: PLOT GRAS=G(995,1005)/HASEN=H(85,115) X /FUECHS=F(15,35) Programm: "dyn.grashasenfuchs" Referenz: PRINT, S. #to page ("PRINT")# #goal page ("POWER")##ib (2)#POWER#ie (2)##on ("i")##right#Funktion#off ("i")# Zweck: Potenzfunktion Format: POWER(,) Erklärung: Liefert #u##e# Beipiel: N X=POWER(2, 2) (X = 4) Referenz: SQRT, S. #to page ("SQRT")# #goal page ("PRINT")##ib (2)#PRINT#ie (2)##on ("i")##right#Anweisung#off ("i")# Zweck: Darstellung der Ergebnisse in Tabellenform Format: PRINT [/...][,...] Erklärung: Durch diese Anweisung werden die Werte () nach PRTPER Zeiteinheiten in einer Tabelle ausgegeben. Die Ausgabe kann umgeleitet werden (s. 'protokoll'). Beispiel: PRINT GBEV,BEV(1),BEV(40),BEV(60),BEV(63) X ,BEV(65),ZBEV,PRENT Programm: "dyn.bev" Referenz: PLOT, S. #to page ("PLOT")# #goal page ("R")##ib (2)#R#ie (2)##on ("i")##right#Anweisung#off ("i")# Zweck: Rate-Gleichung Format: R.KL= Erklärung: Eine Rate-Gleichung stellt die Veränderungsrate in Bezug zu den aktu­ ellen Level-Größen. Beispiel: R FGRATE.KL=FGK*HASEN*FUECHS.K Programm: "dyn.grashasenfuchs" Referenz: A, S. #to page ("A")# C, S. #to page ("C")# L, S. #to page ("L")# #ib (2)#RAMP#ie (2)##on ("i")##right#Funktion#off ("i")# Zweck: Wert nach Bedingung Format: RAMP(,) Erklärung: Wenn TIME kleiner , dann liefert RAMP 0, andernfalls wird * (TIME - ) geliefert. IF TIME < THEN 0 ELSE * (TIME - ) END IF #goal page ("RUN")##ib (2)#RUN#ie (2)##on ("i")##right#Anweisung#off ("i")# Zweck: Überschrift Format: RUN <Überschrift> Erklärung: Gibt dem aktuellen Lauf eine Überschrift. Gleichzeitig ist "<Überschrift>.const" der Name eines Datenraums, in dem die Kon­ stanten dieses Laufs aufgehoben werden (s. 'run' im Runtime-System). Beispiel: RUN Überschrift Referenz: *, S. #to page ("*")# #ib (2)#S#ie (2)##on ("i")##right#Anweisung#off ("i")# Zweck: Supplementary-Gleichung Format: S .K= Erklärung: Gleichungen für Hilfsgrößen werden durch Supplementary-Gleichungen ausgedrückt. Beispiel: S SCHADSTOFFVERHÄLTNIS.K=COZWEI.K/OZWEI.K #ib (2)#SCLPRD#ie (2)##on ("i")##right#Funktion#off ("i")# Zweck: Skalarprodukt Format: SCLPRD(,,,,) Erklärung: Liefert das Skalarprokukt der Tabellen und , wobei und den Ausschnitt aus der ersten Tabelle angeben und den Startindex für den Vektor in der zweiten Tabelle angibt. Beispiel: GB.K=SCLPRD(BEV.K,15,44,GR,1)/2 Programm: "dyn.bev" #goal page ("SIN")##ib (2)#SIN#ie (2)##on ("i")##right#Funktion#off ("i")# Zweck: Berechnung der trigonometrischen Funktion Sinus Format: SIN() Erklärung: Berechnet den Sinus von , welche im Bogenmaß angegeben wird. Beispiel: N X=SIN(0.5) Referenz: COS, S. #to page ("COS")# COSD, S. #to page ("COSD")# SIND, S. #to page ("SIND")# TAN, S. #to page ("TAN")# TAND, S. #to page ("TAND")# ARCTAN, S. #to page ("ARCTAN")# ARCTAND, S. #to page ("ARCTAND")# #goal page ("SIND")##ib (2)#SIND#ie (2)##on ("i")##right#Funktion#off ("i")# Zweck: Berechnung der trigonometrischen Funktion Sinus Format: SIND() Erklärung: Berechnet den Sinus von , welche im Gradmaß angegeben wird. Beispiel: N X=SIND(45.0) Referenz: COS, S. #to page ("COS")# SIN, S. #to page ("SIN")# COSD, S. #to page ("COSD")# TAN, S. #to page ("TAN")# TAND, S. #to page ("TAND")# ARCTAN, S. #to page ("ARCTAN")# ARCTAND, S. #to page ("ARCTAND")# #ib (2)#SPEC#ie (2)##on ("i")##right#Anweisung#off ("i")# Zweck: Lauf-Anweisung DT= Format: SPEC { LENGTH= }[/...] PLTPER= PRTPER= Erklärung: Durch die Lauf-Anweisung werden die Systemkonstanten festgesetzt. Sie darf pro Lauf nur einmal benutzt werden. Beispiel: SPEC DT=1/PLTPER=1/PRTPER=1/LENGTH=2000 Referenz: C, S. #to page ("C")# (SPEC kann durch C-Def. ersetzt werden) #goal page ("SQRT")##ib (2)#SQRT#ie (2)##on ("i")##right#Funktion#off ("i")# Zweck: Quadratwurzel Format: SQRT() Erklärung: Berechnet die Quadratwurzel aus Beispiel: N X=SQRT(4.0) (X = 2.0) Referenz: POWER, S. #to page ("POWER")# #ib (2)#STEP#ie (2)##on ("i")##right#Funktion#off ("i")# Zweck: Wert nach Bedingung Format: STEP(,) Erklärung: Ist TIME kleiner , so wird 0 geliefert, ansonsten IF TIME < THEN 0.0 ELSE END IF Beispiel: N X=STEP(12.0,12.0) #goal page ("SUM")##ib (2)#SUM#ie (2)##on ("i")##right#Funktion#off ("i")# Zweck: Summierung einer Tabelle Format: SUM() Erklärung: Liefert die Summe der Einträge in einer Tabelle Beispiel: A GESAMTBEV.K=SUM(BEV.K) Programm: "dyn.bev" Referenz: SUMV, S. #to page ("SUMV")# #goal page ("SUMV")##ib (2)#SUMV#ie (2)##on ("i")##right#Funktion#off ("i")# Zweck: Summierung einer Tabelle Format: SUMV(,,) Erklärung: Summierung der Einträge in der Tabelle von Element bis Element Beispiel: A ZBEV.K=SUMV(BEV.K,16,59) Teilbevölkerung Programm: "dyn.bev" Referenz: SUM, S. #to page ("SUM")# #goal page ("SWITCH")##ib (2)#SWITCH#ie (2)##on ("i")##right#Funktion#off ("i")# Zweck: Wert nach Bedingung Format: SWITCH(,,) Erklärung: Wenn der Parameter den Wert 0 hat, so wird geliefert, andernfalls (gleichbedeutend mit FIFZE). IF = 0 THEN ELSE END IF Beispiel: N X=SWITCH(1.0,2.0,3.0) (X = 2.0) Referenz: FIFZE, S. #to page ("FIFZE")# #goal page ("T")##ib (2)#T#ie (2)##on ("i")##right#Anweisung#off ("i")# Zweck: Tabellen-Definition Format: T =[/[....]] Erklärung: Durch die T-Anweisung wird eine Tabelle definiert, die Elemente wer­ den durch "/" getrennt hintereinander angegeben. Beispiel: T TABELLE=1/2/3/4/5/6/8/9/10/11/12 Programm: "dyn.bev" Referenz: TABLE, S. #to page ("TABLE")# TABHL, S. #to page ("TABHL")# #goal page ("TABHL")##ib (2)#TABHL#ie (2)##on ("i")##right#Funktion#off ("i")# Zweck: Tabellenfunktion Format: TABHL(,,,) Erklärung: IF < THEN () ELIF <= AND <= THEN TABLE (, , , ) ELSE () END IF Beispiel: A BRMM.K=TABHL(BRMMT,MSL.K,0,5,1) Programm: "dyn.welt/forrester" Referenz: T, S. #to page ("T")# TABLE, S. #to page ("TABLE")# #goal page ("TABLE")##ib (2)#TABLE#ie (2)##on ("i")##right#Funktion#off ("i")# Zweck: Tabellenfunktion Format: TABLE(,,,,) Erklärung: Verknüpft die Werte aus mit , wobei den ersten und den letzten Tabelleneintrag angibt. stellt die Schrittweite dar. Beispiel: T TABELLE=1/2/3/4/5 A BEISP.K=TABLE(TABELLE,X.K,2,4,1) Programm: "dyn.welt/forrester" Referenz: T, S. #to page ("T")# TABHL, S. #to page ("TABHL")# #goal page ("TAN")##ib (2)#TAN#ie (2)##on ("i")##right#Funktion#off ("i")# Zweck: Berechnung der trigonometrischen Funktion Tangens Format: TAN() Erklärung: Berechnet den Tangens von , welche im Bogenmaß angegeben wird. Beispiel: N X=TAN(0.5) Referenz: COS, S. #to page ("COS")# SIN, S. #to page ("SIN")# COSD, S. #to page ("COSD")# SIND, S. #to page ("TAN")# TAND, S. #to page ("TAND")# ARCTAN, S. #to page ("ARCTAN")# ARCTAND, S. #to page ("ARCTAND")# #goal page ("TAND")##ib (2)#TAND#ie (2)##on ("i")##right#Funktion#off ("i")# Zweck: Berechnung der trigonometrischen Funktion Tangens Format: TAND() Erklärung: Berechnet den Tangens von , welche im Gradmaß angegeben wird. Beispiel: N X=TAND(45.0) Referenz: COS, S. #to page ("COS")# SIN, S. #to page ("SIN")# COSD, S. #to page ("COSD")# TAN, S. #to page ("TAN")# SIND, S. #to page ("SIND")# ARCTAN, S. #to page ("ARCTAN")# ARCTAND, S. #to page ("ARCTAND")# #goalpage ("X")##ib (2)#X#ie (2)##on ("i")##right#Anweisung#off ("i")# Zweck: Fortsetzungszeile Format: X Erklärung: Eine in der vorangegangenen Zeile nicht beendete Anweisung wird nach einer X-Anweisung fortgesetzt (Es können beliebig viele X-Anweisun­ gen nacheinander folgen). Beispiel: T TABELLE=1/2/3/4/5/6/7/8/9/10/11/12/13/14 X /15/16/17/18/19 Programm: "dyn.bev" #goal page ("*")##ib (2)#*#ie (2)##on ("i")##right#Anweisung#off ("i")# Zweck: Überschrift Format: * <Überschrift> Erklärung: Gibt dem aktuellen Lauf eine Überschrift Beispiel: * Überschrift Referenz: RUN, S. #to page ("RUN")# #page# #ib#5. Makros in DYNAMO#ie# Der DYNAMO-Compiler bietet die Möglichkeit, benutzereigene Funktionen zu definie­ ren. Makros werden ähnlich wie Refinements in ELAN in das DYNAMO-Programm eingesetzt. Beim EUMEL-DYNAMO-Compiler werden mit "zz" beginnende Namen generiert, so daß Sie es vermeiden sollten, eigene Namen mit "zz" beginnen zu lassen. Weiterhin sollte man als Namen der aktuellen Parameter nicht die Namen der formellen Parameter verwenden. Folgende Makros werden standardmäßig vom DYNAMO-Compiler zur Verfügung gestellt: macro delay1 (in, del) Verzögerung erster Ordnung macro delay3 (in, del) Verzögerung dritter Ordnung Material macro delay3p (in, del, ppl) Verzögerung dritter Ordnung mit Pipeline macro delinf3 (in, del) Verzögerung dritter Ordnung für Information macro smooth (in, del) Verzögerung erster Ordnung für Information #ib#5.1. Insertieren von Makros#ie# Makros werden durch folgende Prozedur in die Compilertabelle eingetragen: PROC insert macro (TEXT CONST filename): Zweck: Fügt die in der Datei 'filename' enthaltenen Makros in die Makrotabelle ein. Die Datei sollte zweckmäßigerweise nur Makrodefinitionen enthalten. Es ist - im Gegensatz zu normalen DYNAMO-Programmen - nicht nötig, die Systemkonstanten zu definieren (die Standard-Makros sind in der Datei "dyn.mac" enthalten; diese Datei kann beliebig ergänzt werden). #ib#5.2. Aufbau eines Makros#ie# Makros beginnen in DYNAMO immer mit der Anweisung MACRO (s. auch Seite #to page ("MACRO")#) und enden mit MEND (s. Seite #to page ("MEND")#). Dazwischen steht ein Makrorumpf, bestehend aus einer oder mehreren DYNAMO-Gleichungen. Beim Makroaufruf können, soweit vorher definiert, Parameter angegeben werden, jedoch rekursiv aufrufen kann man Makros nicht. Beispiel: MACRO SMOOTH (IN, DEL) L SMOOTH.K = SMOOTH.J + DT * (IN.J - SMOOTH.J) X /DEL N SMOOTH = IN MEND Lokale Variablen in Makros beginnen mit einem $-Zeichen. Der Makro-Expandierer ersetzt das $-Zeichen durch "zz" gefolgt von einer Zahl. Aus diesem Grund sollen eigene Namen nicht mit "zz" beginnen. Falls Sie eine Fehlermeldung bekommen, die sich auf einen mit "zz" beginnenden Namen bezieht, sollten Sie den Fehler in dem entsprechenden Makro suchen. #on ("b")# Achtung: #off ("b")#Makros sollten nur von fortgeschrittenden DYNAMO-Programmieren verwendet werden, da Makros Eigenschaften von Refinements (textuelle Ersetzung) und Prozeduren (Parameterübergabe) vereinigen. Der daraus folgende Effekt ist nicht ganz einfach zu durchschauen. #page# #ib#6. Erweiterung des Sprachumfangs#ie# Während Makros in DYNAMO geschrieben werden, ist es ferner möglich, die Menge der Funktionen mittels der Sprache ELAN zu erweitern. Hierbei geht man wie folgt vor: 1. Schreiben einer Funktion in ELAN (näheres siehe unten) 2. Einbinden der Funktion in die Tabellen des DYNAMO-Compilers 2.1. Einschreiben des Namens der Funktion, gefolgt von den Typen der Ein­ gabeparameter in die bestehende Datei "dyn.std", wobei folgende Typen existieren: r real (Datentyp REAL) t table (Datentyp TAB) Abgeschlossen wird die "dyn.std"-Datei durch die Zeichensequenz "/*". Beispiele: power rr table trrrr /* 2.2. Laden der Funktion(en) mittels der Prozedur 'init std ("dyn.std")' Eine zur Einbindung in den DYNAMO-Compiler vorgesehene ELAN-Funktion wird unter Beachtung gewisser Regeln erstellt: 1. Die deklarierten ELAN-Prozeduren dürfen nur Parameter vom Typ REAL oder TAB besitzen oder gänzlich ohne Parameter sein. 2. Der Typ des Resultaten muß vom Typ REAL sein. Zur Manipulation von Tabellen wurde der Datentyp TAB geschaffen, auf welchen man wie auf das Standard-Vektorpaket zugreifen kann. Beispiel: REAL PROC abs (REAL CONST a): IF a < 0.0 THEN -a ELSE a END IF END PROC abs; PROC sumv (TAB CONST tab, REAL CONST erstes, letztes): REAL VAR summe := 0.0; INT VAR i; FOR i FROM int (erstes) UPTO int (letztes) REPEAT summe INCR wert (tab, i) END REPEAT; summe END PROC sumv #ib#6.1. Für fortgeschrittende ELAN-Program­ mierer#ie# Der Quellcode des EUMEL-DYNAMO-Compilers wird mit ausgeliefert. Daher können Einschränkungen (s. 3.2 Abweichungen gegenüber dem Sprachstandard) leicht beseitigt werden. Wem z.B. die Anzahl der Gleichungen (950) zu wenig ist, der kann im Quelltext des Compilers diesen Wert (annähernd) beliebig nach oben hin erhöhen.