Software: FEM - Tutorial - Magnetfeld - OptiY-Datenschnittstellen
Datenfluss über Input-/Output-Dateien
Es existieren unterschiedliche Varianten, wie ein Optimierungstool die Parameterwerte (Input) eines Modells modifizieren und auf die damit berechneten Ergebniswerte (Output) zugreifen kann. Eine sehr allgemeine und übersichtliche Methode ist die Benutzung von ASCII-Textdateien für den Input/Output eines Modells:
- Das Optimierungstool schreibt die aktuellen Parameterwerte an die dafür vorgesehenen Stellen in eine Textdatei.
- Aus dieser Textdatei liest das Modell seine Werte für eine Simulationsrechnung.
- Die berechneten Ergebnisgrößen werden vom Modell nach der Simulationsrechnung wieder an definierte Stellen in eine andere Textdatei geschrieben.
- Das Optimierungstool liest diese Ergebniswerte aus der Textdatei und verarbeitet sie je nach Experimentierziel. In unserem Beispiel der Raster-Suche würden die Ergebnisgrößen nur als Funktionsflächen in 3D-Diagrammen dargestellt.
Es ist meist besser, eine strikte Trennung zwischen Parametern (Input-File), Modell (LUA-Script) und Ergebnisgrößen (Output-File) vorzunehmen. In diesem Sinne soll das LUA-Script nun umgestaltet werden.
Input-Datei für Vorgabe-Parameter
Bisher sind die Input-Parameter Bestandteil des Modell-Scripts. Die Input-Parameter sollen als separate ASCII-Textdatei Eingabe_xx.txt (mit xx=Teilnehmer-Nummer) gestaltet werden. Die Datenwerte in dieser Textdatei müssen so strukturiert werden, dass sowohl das Optimierungsprogramm als auch das Modellscript problemlos darauf zugreifen können:
Wichtung:
Jeder Teilnehmer der FEM-Lehrveranstaltung benutzt ab sofort einen individuellen Strom von i=0,2xx A (mit xx=Teilnehmer-Nummer):
dMagnet 40 hTopf 27.5 dAnker 10 lAnker 10 hDeckel 2.5 dStift 1 dWand 1 wSpule 400 dLack 0.06 sWickel 0.5 sAnker 1 sDeckel 0.01 sGleit 0.1 iSpule 0.2xx
: ------------------------------------------------------------------------------- -- Konstruktive, technologische und Betriebs-Parameter (Standardwerte) -- ------------------------------------------------------------------------------- xx=00; -- Teilnehmer-Nr. 00 bis 30 -- dMagnet=40; -- Topf-Durchmesser [mm] -- hTopf=27.5; -- Topf-Höhe [mm] -- dAnker=10; -- Anker-Durchmesser [mm] -- lAnker=10; -- Anker-Länge [mm] -- hDeckel=2.5; -- Höhe des Deckels bzw. Topfbodens [mm] -- dStift=1; -- Durchmesser der Bohrung [mm] -- dWand=1; -- Wandstärke des Topfes [mm] -- wSpule=400; -- Windungen in der Spule -- dLack=0.06; -- Gesamtdicke der Drahtbeschichtung [mm] -- sWickel=0.5; -- Spalt zw. Spulendraht und Eisen [mm] -- sAnker=1; -- Arbeitsluftspalt [mm] -- sDeckel=0.01; -- Restspalt zw. Deckel und Topf [mm] -- sGleit=0.1; -- Führungsluftspalt für Anker [mm] -- iSpule=1; -- Spulenstrom [A] -- Parameter aus Textdatei einlesen mit Fehlertest in = openfile(mydir .. "Eingabe_xx.txt","r"); -- Datei öffnen zum Lesen if in then -- wenn Datei geöffnet, dann Werte einlesen read(in, "*l"); dMagnet = read(in, "*l", "*n"); read(in, "*l"); hTopf = read(in, "*l", "*n"); read(in, "*l"); dAnker = read(in, "*l", "*n"); read(in, "*l"); lAnker = read(in, "*l", "*n"); read(in, "*l"); hDeckel = read(in, "*l", "*n"); read(in, "*l"); dStift = read(in, "*l", "*n"); read(in, "*l"); dWand = read(in, "*l", "*n"); read(in, "*l"); wSpule = read(in, "*l", "*n"); read(in, "*l"); dLack = read(in, "*l", "*n"); read(in, "*l"); sWickel = read(in, "*l", "*n"); read(in, "*l"); sAnker = read(in, "*l", "*n"); read(in, "*l"); sDeckel = read(in, "*l", "*n"); read(in, "*l"); sGleit = read(in, "*l", "*n"); read(in, "*l"); iSpule = read(in, "*l", "*n"); else print("Could not open Eingabe_xx.txt"); end; closefile(in); ------------------------------------------------------------------------------- -- Materialien (Luft, Kupfer, Eisen) -- ------------------------------------------------------------------------------- :
Die Input-Zeilen mit den Parameter-Namen werden jeweils überlesen. Der auf der nächsten Zeile folgende Wert wird dem im Script definierten Parameter-Bezeichner zugewiesen. Die ursprünglichen Parameterwerte sollte man mit Standardwerten versehen und auskommentieren. Damit weiß man auch später noch, um welche Parameter es sich handelt.
Achtung: Es ist unbedingt zu überprüfen, ob nach der Verwendung einer Input-Datei mit den gleichen Parameter-Werten wirklich die gleichen Ergebnisse berechnet werden. Dazu muss man den Stromwert kurzzeitig wieder auf 1 A setzen!
Output-Datei für Simulationsergebnisse
Die für die Bewertung der Simulation relevanten Ergebnisgrößen müssen ebenfalls in eine Textdatei geschrieben werden. In unserem Beispiel sind das die Magnetkraft und der Koppelfluss. Die erforderlichen File-Operationen werden an das Ende des LUA-Scripts platziert:
: -- Output-File mit Ergebniswerten erzeugen: out = openfile(mydir .. "Ergebnis_xx.txt", "w"); write (out,"F=" , Fz_Anker, "\n"); write (out,"Psi=", Psi , "\n"); closefile(out); -- Dateien loeschen: remove (mydir .. "Magnet_xx.fem"); -- Loeschen der Modelldatei remove (mydir .. "Magnet_xx.ans"); -- Loeschen der Grafikdatei -- exit(); -- FEMM-Programm beenden
Verifizierung des Modells
Nach diesen Änderungen müssen nach Ausführung des kompletten LUA-Scripts im FEMM in der Datei Ergebnis_xx.txt die richtigen Werte für Magnetkraft und Koppelfluss stehen..
Einbindung in den OptiY-Workflow
Falls es nicht mehr geöffnet ist, so öffnen wir erneut OptiY mit der Datei Magnet_xx.opy und ergänzen nun die fehlende Einbindung des Modells.
- Einfügen der Symbole von Input- und Output-File auf dem Workflow, Benennung und Zuordnung der konkreten ASCII-Textdatei:
- Workaround:
In der OptiY-Version 4.5 (Stand 24.01.2019) existiert ein Problem mit dem Auslesen von Keystring-basierten Relativen Variablen aus einer Output-Datei. Anstatt nach dem im folgenden beschriebenen Vorgehen muss man deshalb die Werte der Variablen aus Absoluten Zeilen einfügen und das LUA-Script entsprechend anpassen (Siehe: Output-File in Übung 4). Mit OptiY-Version 4.6 ist das Problem behoben und die Anleitung kann wieder regulär genutzt werden. - Bevor wir die Nennwerte des Workflows mit der Input-Datei verbinden, beginnen wir mit dem Herstellen der beiden Output-Verbindungen zum Output-File. Wir markieren dazu im allgemeinen Dialog des Outputfiles die zu verbindenden Ausgangsgrößen _F und _Psi. Dann wechseln wir in den Output File-Dialog:
- Nach Wahl der zuzuordnenden Output-Variablen _F definieren wir "F=" als Key-String, welcher vor dem eigentlichen Wert steht:
- Nach dem Markieren des Strings führt der Klick mit der rechten Maustaste zum Definitionsmenü.
- Wird ein Key-String definiert, so wird der Zahlenwert erst nach diesem Schlüsselwort erwartet.
- Die zuzuordnende Output-Variable sollte immer noch ausgewählt sein. Wir definieren nun die Position des Zahlenwertes relativ zum Key-String:
- Wir markieren dazu die gesamte Zahl ohne Key-String. Der Klick mit der rechten Maustaste führt wieder zum Definitionsmenü.
- Die Zahl wird als Relative Variable in Bezug zum Key-String erwartet:
- Mit dieser Art der Definition findet OptiY den Wert für _F auch, wenn sich durch weitere Ergebnisgrößen die Struktur der Output-Datei ändert. Allerdings muss vor dem Zahlenwert der Key-String "F=" stehen!
- Nach dem gleichen Prinzip ordnen wir die Output-Variable _Psi dem Datei-Eintrag zu.
- Die Zuordnung der Workflow-Ausgangsgrößen _F und _Psi zur Output-Datei widerspiegelt sich im Workflow:
- Es fehlt noch die Zuordnung des Spulestroms i und des Arbeitsluftspalts s zur Input-Datei. Nach Doppelklick auf die Eingabe-Datei markiert man diese Input-Verbindungen:
- Über die Registerkarte des Input File legt man für das OptiY fest, wo die beiden Parameter-Werte in die Input-Datei einzutragen sind. Die Zuordnung innerhalb der Input-Datei funktioniert nach dem gleichen Schema, wie in der Output-Datei (Input-Variable wählen und zugehörigen Wert markieren). Jedoch existiert im Menü der rechten Maustaste nur die Funktion "Variable einfügen":
- Die im Workflow noch fehlende Anbindung der In- und Outputdateien an das Modell wollen wir nun nachholen. Dazu öffnen wir durch Doppelklick den Script-Dialog zu Magnet_xx.LUA und markieren die entsprechenden Input-/Output-Verbindungen:
Damit ist der Workflow für das Experiment fertig. Im nächsten Schritt werden wir die Rastersuche als Experiment konfigurieren.
Hinweis:
Ein Wert > Null für die "Max. Prozess-Zeit [s]" verhindert ein Verklemmen der folgenden Experimente infolge einer aus kleinen Luftspalten manchmal resultierenden fehlerhaften Vernetzung (extreme Elementezahl führt zu extremen Berechnungszeiten!)