Software: FEMM - Elektrostatik - Modellscript

Aus OptiYummy
Zur Navigation springenZur Suche springen

Leiterkapazität im endlichen Raum

Software FEMM - Elektrostatik - Netz und Berechnung feld feines netz.gif

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:


Software FEMM - Elektrostatik - Modellscript icon-crimsoneditor.gif Script-Editor

  • 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).
  • Wir starten den Crimson-Editor und speichern das leere Textfile als Leiterplatte1_xx.LUA (mit xx=Teilnehmer-Nummer):
Software FEMM - Elektrostatik - Modellscript crimson-editor.gif


Software FEMM - Elektrostatik - Modellscript lua-logo.gif LUA-Console in FEMM

  • Mittels View - Lua Console öffnen wir im FEMM die Lua-Console:
Software FEMM - Elektrostatik - Modellscript lua-console.gif
  • 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-Console 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 Lamit-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:

Software FEMM - Elektrostatik - Modellscript geometrie.gif

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. Der Ordner muss bereits existieren:

-- Vernetzung und Berechnung ========================================
   ei_saveas("e:\\femm\\leiter.fee"); -- Speichern in vorh. Ordner
   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 Equipotentiallinien ein
-- Darstellung normiert auf aktuellen Maximalwert durch max=U
   print ("C=", C*1e12, "[pF/m]") --  in Outputfeld der LUA-Cosole
   print (" mit U=", U, "[V]");
   print (" und Q=", Q, "[As]");

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.