Software: FEMM - Elektrostatik - Modellscript: Unterschied zwischen den Versionen
(→Leiterkapazität im endlichen Raum: Anmerkung zu Notepad++ im Pool) |
|||
(15 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
<div align="center"> [[Software:_FEMM_-_Elektrostatik_-_LUA-Scripting| | [[Software:_FEM_-_Tutorial_-_Elektrostatik|↑]] <div align="center"> [[Software:_FEMM_-_Elektrostatik_-_LUA-Scripting|←]] [[Software:_FEMM_-_Elektrostatik_-_OBC-Script|→]] </div> | ||
<div align="center"> '''Parametrisiertes Modellscript''' </div> | |||
== Leiterkapazität im endlichen Raum == | |||
=== Leiterkapazität im endlichen Raum === | |||
<div align="center">[[Bild:Software_FEMM_-_Elektrostatik_-_Netz_und_Berechnung_feld_feines_netz.gif]]</div> | <div align="center">[[Bild:Software_FEMM_-_Elektrostatik_-_Netz_und_Berechnung_feld_feines_netz.gif]]</div> | ||
Unser erstes FEMM-Modell werden wir nun schrittweise nicht auf der grafischen Oberfläche, sondern mit einem LUA-Script entwickeln. | Unser erstes FEMM-Modell werden wir nun schrittweise nicht auf der grafischen Oberfläche, sondern mit einem LUA-Script entwickeln. | ||
Zeile 12: | Zeile 13: | ||
* Es ist jedoch günstig, einen Editor zu verwenden, welcher die LUA-Schlüsselworte farbig hervorhebt. | * Es ist jedoch günstig, einen Editor zu verwenden, welcher die LUA-Schlüsselworte farbig hervorhebt. | ||
* Geeignet dafür ist z.B. der Crimson-Editor, der auch noch sehr viele andere Script- bzw. Programmiersprachen beherrscht. | * Geeignet dafür ist z.B. der Crimson-Editor, der auch noch sehr viele andere Script- bzw. Programmiersprachen beherrscht. | ||
* Der Crimson Editor kann als Freeware kostenlos aus dem Internet geladen werden (http://www.crimsoneditor.com). | * Der Crimson Editor kann als Freeware kostenlos aus dem Internet geladen werden ('''http://www.crimsoneditor.com'''). | ||
* '''''Hinweis:''''' Im PC-Pool ist aktuell Notepad++ als Editor installiert. Dieser ist genau so gut geeignet und kann im Folgenden Anstelle des Crimson-Editors genutzt werden. | |||
* Wir starten den Crimson-Editor und speichern das leere Textfile als '''Leiterplatte1_xx.LUA''' (mit '''xx'''=Teilnehmer-Nummer): | * Wir starten den Crimson-Editor und speichern das leere Textfile als '''Leiterplatte1_xx.LUA''' (mit '''xx'''=Teilnehmer-Nummer): | ||
<div align="center">[[Bild:Software_FEMM_-_Elektrostatik_-_Modellscript_crimson-editor.gif]]</div> | <div align="center">[[Bild:Software_FEMM_-_Elektrostatik_-_Modellscript_crimson-editor.gif]]</div> | ||
[[Bild:Software_FEMM_-_Elektrostatik_-_Modellscript_lua-logo.gif]] '''LUA- | [[Bild:Software_FEMM_-_Elektrostatik_-_Modellscript_lua-logo.gif]] '''LUA-Konsole in FEMM''' | ||
* Mittels '''''View - Lua Console''''' öffnen wir im FEMM die Lua- | * Mittels '''''View - Lua Console''''' öffnen wir im FEMM die Lua-Konsole:<div align="center">[[Bild:Software_FEMM_-_Elektrostatik_-_Modellscript_lua-console.gif]]</div> | ||
<div align="center">[[Bild:Software_FEMM_-_Elektrostatik_-_Modellscript_lua-console.gif]]</div> | |||
* Im unteren "Input"-Teil kann man LUA-Anweisungen eingeben. | * Im unteren "Input"-Teil kann man LUA-Anweisungen eingeben. | ||
* Nach dem Drücken von "Evaluate" werden diese Anweisungen abgearbeitet. | * Nach dem Drücken von "Evaluate" werden diese Anweisungen abgearbeitet. | ||
* Falls darin Fehler existieren, erhält man eine entsprechende Fehlermeldung. | * Falls darin Fehler existieren, erhält man eine entsprechende Fehlermeldung. | ||
* Wir werden das Script Zeile für Zeile im Crimson-Editor schreiben und dabei die einzelnen Zeilen in der LUA- | * Wir werden das Script Zeile für Zeile im Crimson-Editor schreiben und dabei die einzelnen Zeilen in der LUA-Konsole austesten bis sie funktionieren (Kopieren über die Zwischenablage). | ||
'''Hinweis:'''<br> | |||
Im Rahmen dieser Übung kopieren wir die Zeilen aus der Übungsanleitung Abschnittsweise über die Zwischenablage in den Crimson-Editor. Dabei sollte man trotzdem versuchen, die Bedeutung der einzelnen Anweisungen zu verstehen ([https://www.femm.info/Archives/doc/manual42.pdf '''Manual'''] als PDF-Datei geöffnet halten!). | |||
=== Script-Entwicklung === | === Script-Entwicklung === | ||
Zeile 37: | Zeile 34: | ||
In einem ersten Abschnitt listet man alle konstruktiven Parameter auf, die man im Sinne des Experimentierzieles bei Bedarf ändern müsste. Hierzu gehört auch die Teilnehmer-Nummer xx, welche Einfluss auf die konkrete Geometrie hat: | In einem ersten Abschnitt listet man alle konstruktiven Parameter auf, die man im Sinne des Experimentierzieles bei Bedarf ändern müsste. Hierzu gehört auch die Teilnehmer-Nummer xx, welche Einfluss auf die konkrete Geometrie hat: | ||
-- Parameter -- | -- Parameter -- | ||
xx=99; -- Teilnehmer-Nr. 00 bis 99 | xx=99; -- Teilnehmer-Nr. 00 bis 99 | ||
Zeile 43: | Zeile 41: | ||
b_Cu=0.2+xx/1000; -- Breite des Leiterzugs | b_Cu=0.2+xx/1000; -- Breite des Leiterzugs | ||
d_FR4=0.5; -- Dicke der Laminat-Schicht | d_FR4=0.5; -- Dicke der Laminat-Schicht | ||
b_FR4=10; -- Breite der modellierten | b_FR4=10; -- Breite der modellierten Laminat-Schicht | ||
h_Air=2.5; -- Höhe des modellierten Luftraums | h_Air=2.5; -- Höhe des modellierten Luftraums | ||
''Hinweis:'' Kommentare beginnen mit -- und erstrecken sich jeweils bis zum Zeilen-Ende. | |||
''Hinweis:''<br>Kommentare beginnen mit -- und erstrecken sich jeweils bis zum Zeilen-Ende. | |||
'''2. Definition des Problem-Typs:''' | '''2. Definition des Problem-Typs:''' | ||
Zeile 56: | Zeile 54: | ||
-- 1e-8=Max. Fehler für Solver | -- 1e-8=Max. Fehler für Solver | ||
-- 30° =Min. Winkel für Netz | -- 30° =Min. Winkel für Netz | ||
'''3. Geometrie:''' | '''3. Geometrie:''' | ||
Zeile 132: | Zeile 131: | ||
'''6. Vernetzung und Berechnung:''' | '''6. Vernetzung und Berechnung:''' | ||
Die Vernetzungsparameter wurden in den Blockproperties der Modellbereiche spezifiziert. Die Vernetzung ist jedoch erst möglich, wenn dass Modell zuvor gespeichert wurde | Die Vernetzungsparameter wurden in den Blockproperties der Modellbereiche spezifiziert. Die Vernetzung ist jedoch erst möglich, wenn dass Modell zuvor gespeichert wurde: | ||
-- Vernetzung und Berechnung ======================================== | -- Vernetzung und Berechnung ======================================== | ||
ei_saveas(" | ei_saveas("leiter.fee"); -- Speichern in Ordner der LUA-Datei | ||
ei_createmesh(); --> nur gespeichertes Modell wird vernetzt! | ei_createmesh(); --> nur gespeichertes Modell wird vernetzt! | ||
ei_analyze(1); -- Solver in einem Fenster 0=minimiert / 1=sichtbar | ei_analyze(1); -- Solver in einem Fenster 0=minimiert / 1=sichtbar | ||
Zeile 150: | Zeile 149: | ||
-- 0|1 ,0=color, min , max , 0=V|1=D|2=E | -- 0|1 ,0=color, min , max , 0=V|1=D|2=E | ||
eo_showdensityplot( 1 , 0 , 0 , U , 0 ); | eo_showdensityplot( 1 , 0 , 0 , U , 0 ); | ||
eo_showcontourplot(20,0,U); -- blendet 20 | eo_showcontourplot(20,0,U); -- blendet 20 Aequipotentiallinien ein | ||
-- Darstellung normiert auf aktuellen Maximalwert durch max=U | -- Darstellung normiert auf aktuellen Maximalwert durch max=U | ||
print ("C=", C*1e12, "[pF/m]") -- in Outputfeld der LUA- | print ("C=", C*1e12, "[pF/m]") -- in Outputfeld der LUA-Konsole | ||
print (" mit U=", U, "[V]"); | print (" mit U=", U, "[V]"); | ||
print (" und Q=", Q, "[As]"); | print (" und Q=", Q, "[As]"); | ||
[[Bild:Software_FEMM_button_open_lua_script.gif]] Mit '''''File - Open Lua Script''''' können wir die Script-Datei '''''Leiterplatte1_xx.LUA''''' nun komplett abarbeiten. Dazu sollten wir zuvor das bisherige Modell schließen. | [[Bild:Software_FEMM_button_open_lua_script.gif]] Mit '''''File - Open Lua Script''''' können wir die Script-Datei '''''Leiterplatte1_xx.LUA''''' nun komplett abarbeiten. Dazu sollten wir zuvor das bisherige Modell schließen. | ||
<div align="center"> [[Software:_FEMM_-_Elektrostatik_-_LUA-Scripting|←]] [[Software:_FEMM_-_Elektrostatik_-_OBC-Script|→]] </div> | |||
<div align="center"> [[Software:_FEMM_-_Elektrostatik_-_LUA-Scripting| |
Aktuelle Version vom 1. März 2022, 15:17 Uhr
Leiterkapazität im endlichen Raum
Unser erstes FEMM-Modell werden wir nun schrittweise nicht auf der grafischen Oberfläche, sondern mit einem LUA-Script entwickeln.
Der LUA-"Experte" schreibt seine Scripte sofort in eine Textdatei und hofft, dass es dann funktioniert. Den Frust der anschließenden Fehlersuche wollen wir uns als LUA-"Greenhorn" ersparen und nur zuvor getestete LUA-Anweisungen in die LUA-Textdatei Leiterplatte1_xx.LUA aufnehmen. Dazu bedienen wir uns zweier Hilfsmittel:
- Das Erstellen der LUA-Datei funktioniert prinzipiell mit jedem ASCII-Editor (z.B. Notepad.EXE).
- Es ist jedoch günstig, einen Editor zu verwenden, welcher die LUA-Schlüsselworte farbig hervorhebt.
- Geeignet dafür ist z.B. der Crimson-Editor, der auch noch sehr viele andere Script- bzw. Programmiersprachen beherrscht.
- Der Crimson Editor kann als Freeware kostenlos aus dem Internet geladen werden (http://www.crimsoneditor.com).
- Hinweis: Im PC-Pool ist aktuell Notepad++ als Editor installiert. Dieser ist genau so gut geeignet und kann im Folgenden Anstelle des Crimson-Editors genutzt werden.
- Wir starten den Crimson-Editor und speichern das leere Textfile als Leiterplatte1_xx.LUA (mit xx=Teilnehmer-Nummer):
- Mittels View - Lua Console öffnen wir im FEMM die Lua-Konsole:
- Im unteren "Input"-Teil kann man LUA-Anweisungen eingeben.
- Nach dem Drücken von "Evaluate" werden diese Anweisungen abgearbeitet.
- Falls darin Fehler existieren, erhält man eine entsprechende Fehlermeldung.
- Wir werden das Script Zeile für Zeile im Crimson-Editor schreiben und dabei die einzelnen Zeilen in der LUA-Konsole austesten bis sie funktionieren (Kopieren über die Zwischenablage).
Hinweis:
Im Rahmen dieser Übung kopieren wir die Zeilen aus der Übungsanleitung Abschnittsweise über die Zwischenablage in den Crimson-Editor. Dabei sollte man trotzdem versuchen, die Bedeutung der einzelnen Anweisungen zu verstehen (Manual als PDF-Datei geöffnet halten!).
Script-Entwicklung
1. Parameter:
In einem ersten Abschnitt listet man alle konstruktiven Parameter auf, die man im Sinne des Experimentierzieles bei Bedarf ändern müsste. Hierzu gehört auch die Teilnehmer-Nummer xx, welche Einfluss auf die konkrete Geometrie hat:
-- Parameter -- xx=99; -- Teilnehmer-Nr. 00 bis 99 D=1000; -- Länge des Leiters = Dicke 2D-Elemente d_Cu=0.035; -- Dicke der Cu-Schicht b_Cu=0.2+xx/1000; -- Breite des Leiterzugs d_FR4=0.5; -- Dicke der Laminat-Schicht b_FR4=10; -- Breite der modellierten Laminat-Schicht h_Air=2.5; -- Höhe des modellierten Luftraums
Hinweis:
Kommentare beginnen mit -- und erstrecken sich jeweils bis zum Zeilen-Ende.
2. Definition des Problem-Typs:
-- Definition des Problem-Typs ======================================= showconsole(); -- LUA-Console, falls Script als Datei ausgeführt create(1); -- 1=electrostatic 0=magnetic ei_probdef ("millimeters", "planar", 1e-8, D, 30); -- 1e-8=Max. Fehler für Solver -- 30° =Min. Winkel für Netz
3. Geometrie:
Wie auf der grafischen Oberfläche definiert man die Geometrie über die Eck-Knoten und die dazwischen liegende Linien-Segmente:
Dabei muss man jedoch im Sinne der Modell-Parametrisierung Folgendes beachten:
- Alle x- und y-Koordinaten werden auf die zuvor definierten Parameter bezogen.
- Die Koordinaten der End- oder Mittelpunkte der Geometrie-Bereiche werden mehrmals benötigt. Deshalb sollte man für jeden Punkt separate x- und y-Koordinate als Variable definieren:
-- Geometrie ========================================================= ei_seteditmode ("nodes") -- FR4-Laminat *************************** x1_FR4= 0; y1_FR4= 0; ei_addnode (x1_FR4, y1_FR4); x2_FR4= 0; y2_FR4= d_FR4; ei_addnode (x2_FR4, y2_FR4); x3_FR4= 0.5*b_FR4; y3_FR4= d_FR4; ei_addnode (x3_FR4, y3_FR4); x4_FR4= 0.5*b_FR4; y4_FR4= 0; ei_addnode (x4_FR4, y4_FR4); ei_seteditmode ("segments") ei_addsegment ( x1_FR4,y1_FR4 , x2_FR4,y2_FR4 ); ei_addsegment ( x2_FR4,y2_FR4 , x3_FR4,y3_FR4 ); ei_addsegment ( x3_FR4,y3_FR4 , x4_FR4,y4_FR4 ); ei_addsegment ( x4_FR4,y4_FR4 , x1_FR4,y1_FR4 ); ei_seteditmode ("nodes") -- Luft ********************************* x1_Air= 0.5*b_Cu; y1_Air= d_FR4; ei_addnode (x1_Air,y1_Air); x2_Air= 0.5*b_Cu; y2_Air= d_FR4+d_Cu; ei_addnode (x2_Air,y2_Air); x3_Air= 0; y3_Air= d_FR4+d_Cu; ei_addnode (x3_Air,y3_Air); x4_Air= 0; y4_Air= d_FR4+h_Air; ei_addnode (x4_Air,y4_Air); x5_Air= 0.5*b_FR4; y5_Air= d_FR4+h_Air; ei_addnode (x5_Air,y5_Air); ei_seteditmode ("segments") ei_addsegment ( x1_Air,y1_Air , x2_Air,y2_Air ); ei_addsegment ( x2_Air,y2_Air , x3_Air,y3_Air ); ei_addsegment ( x3_Air,y3_Air , x4_Air,y4_Air ); ei_addsegment ( x4_Air,y4_Air , x5_Air,y5_Air ); ei_addsegment ( x5_Air,y5_Air , x3_FR4,y3_FR4 ); ei_zoomnatural(); ei_zoomout(); -- Komplette Ansicht im Fenster
4. Material für Modell-Bereiche:
Es gibt zwar eine Materialbibliothek mit den entsprechenden Material-Kennwerten. Scheinbar existiert jedoch keine Möglichkeit auf diese Werte zuzugreifen. Das ist aber aus zwei Gründen in einem Modell-Script auch nicht sinnvoll:
- Da eine Materialbibliothek vom Nutzer verändert werden kann, wäre die Portabilität des Modell-Scripts nicht gewährleistet.
- Material-Parameter innerhalb des Scripts ermöglichen Experimente zur Untersuchung des Material-Einflusses auf das Modellverhalten.
-- Material fuer Modell-Bereiche (Mesh Size=0.25 mm) ================ ei_addmaterial ("Air", 1.0, 1.0, 0); -- Luft ei_addmaterial ("FR4", 4.7, 4.7, 0); -- Laminat ei_seteditmode ("blocks") -- Label immer in Mitte der Bereiche! x0_FR4= 0.25*b_FR4; y0_FR4= 0.5*d_FR4; -- FR4-Laminat ************ ei_addblocklabel(x0_FR4, y0_FR4); ei_selectlabel (x0_FR4,y0_FR4); ei_setblockprop ("FR4",0,0.25,0); ei_clearselected(); x0_Air= 0.25*b_FR4; y0_Air= d_FR4+0.5*h_Air; -- Luft ************* ei_addblocklabel(x0_Air, y0_Air); ei_selectlabel (x0_Air,y0_Air); ei_setblockprop ("Air",0,0.25,0); ei_clearselected();
5. Leiter-Potentiale als Constraints:
Die Leiterpotentiale muss man den Linien-Segmenten ihrer Grenzflächen zuweisen. Leider kann man Segmente nur über eine Koordinate x,y selektieren. Es wird das Segment gewählt, welches dem Punkt x,y am nächsten liegt. Damit dies unabhängig von den Werten der Modell-Parameter funktioniert, sollte man immer den Mittelpunkt des zu selektierenden Liniensegments berechnen:
-- Leiter-Potentiale ================================================ -- ei_addconductorprop ("name" , Vc, qc, type: 1=Vc/0=qc) ei_addconductorprop ("1 V" , 1 , 0 , 1 ); ei_addconductorprop ("Null" , 0 , 0 , 1 ); ei_seteditmode ("segments") -- Cu-Leiter mit 1 V **************** -- ei_selectsegment(x,y) -> Mitte xs,ys des Segments P1,P2 nutzen: -- xs=x1+(x2-x1)/2; ys=y1+(y2-y1)/2; -- SegA= 2_FR4...1_Air: xs_A=x2_FR4+(x1_Air-x2_FR4)/2; ys_A=y2_FR4+(y1_Air-y2_FR4)/2; ei_selectsegment(xs_A,ys_A); -- SegB= 1_Air...2_Air: xs_B=x1_Air+(x2_Air-x1_Air)/2; ys_B=y1_Air+(y2_Air-y1_Air)/2; ei_selectsegment(xs_B,ys_B); -- SegC= 2_Air...3_Air: xs_C=x2_Air+(x3_Air-x2_Air)/2; ys_C=y2_Air+(y3_Air-y2_Air)/2; ei_selectsegment(xs_C,ys_C); -- ei_setsegmentprop("bound.",elem.size,automesh,hide,group,"cond.") ei_setsegmentprop("<None>",0.01 , 0 , 0 , 0 , "1 V"); ei_clearselected(); -- SegM= 1_FR4...4_FR4: -- Masse-Ebene mit Nullpotential ******** xs_M=x1_FR4+(x4_FR4-x1_FR4)/2; ys_M=y1_FR4+(y4_FR4-y1_FR4)/2; ei_selectsegment(xs_M,ys_M); ei_setsegmentprop("<None>",0 , 1 , 0 , 0 , "Null"); ei_clearselected();
6. Vernetzung und Berechnung:
Die Vernetzungsparameter wurden in den Blockproperties der Modellbereiche spezifiziert. Die Vernetzung ist jedoch erst möglich, wenn dass Modell zuvor gespeichert wurde:
-- Vernetzung und Berechnung ======================================== ei_saveas("leiter.fee"); -- Speichern in Ordner der LUA-Datei ei_createmesh(); --> nur gespeichertes Modell wird vernetzt! ei_analyze(1); -- Solver in einem Fenster 0=minimiert / 1=sichtbar ei_loadsolution(); -- öffnet Ergebnisfenster für Postprozess
7. Ergebnisse (Postprocessing):
Die Kommandos für den Postprozessor beginnen für die elektrostatische Domäne mit "eo_":
-- Felddarstellung und Kapazitätsberechnung ========================= eo_showmesh(); -- Anzeige der Vernetzung eo_zoomnatural(); eo_zoomout(); -- Komplette Ansicht im Fenster U,Q = eo_getconductorproperties("1 V"); C = 2*Q/U; -- Gesamtkapazität/m von Leiter gegen Masse -- ACHTUNG: Grenzwerte "upper" und "lower" in Manual vertauscht! -- eo_showdensityplot(legend,gscale,lower_D,upper_D,type); -- 0|1 ,0=color, min , max , 0=V|1=D|2=E eo_showdensityplot( 1 , 0 , 0 , U , 0 ); eo_showcontourplot(20,0,U); -- blendet 20 Aequipotentiallinien ein -- Darstellung normiert auf aktuellen Maximalwert durch max=U print ("C=", C*1e12, "[pF/m]") -- in Outputfeld der LUA-Konsole print (" mit U=", U, "[V]"); print (" und Q=", Q, "[As]");
Mit File - Open Lua Script können wir die Script-Datei Leiterplatte1_xx.LUA nun komplett abarbeiten. Dazu sollten wir zuvor das bisherige Modell schließen.