Einfache Magnetfeld-Berechnung mit MagnetiCalc

Webdesign, Programmierung, PC-Hardware und allgemeine Computerprobleme.

Moderatoren: MaxZ, ebastler, SeriousD

Benutzeravatar

Thread-Ersteller
Paul
Admin
Beiträge: 3596
Registriert: So 7. Aug 2005, 14:34
Schule/Uni/Arbeit: HW/SW-Entwickler
Wohnort: Braunschweig
Hat sich bedankt: 638 Mal
Danksagung erhalten: 210 Mal
Kontaktdaten:

Einfache Magnetfeld-Berechnung mit MagnetiCalc

Beitrag von Paul »

Moin Leute!

Heute habe ich mal was ganz besonderes für euch! :mrgreen:
Ich habe in meiner Freizeit einen Magnetfeld-Simulator für Luftspulen programmiert, den ich euch selbstverständlich nicht vorenthalten möchte.
Außerdem bräuchte ich euch als Beta-Tester, denn bislang habe ich das Programm nur auf meinem eigenen Rechner getestet... ihr wisst ja wie das ist! :hehe:

Das Programm ist in Python geschrieben. Unter Linux ist Python meist vorinstalliert, sodass man es mit ein paar Zeilen im Terminal direkt runterladen und starten kann.
Unter Windows muss Python ggf. manuell installiert werden, das ist aber auch kein wirklicher Aufwand. Wenn ihr Fragen zum Starten des Programms habt, helfe ich euch natürlich gerne dabei!

Hier geht es zum GitHub-Repository, wo sich der Quellcode, weitere Informationen und die Installationsanleitung für Linux findet (auf Englisch):
https://github.com/shredEngineer/MagnetiCalc (wenn ihr bei GitHub seid: Forken, Sternchen geben, mir folgen! :mrgreen: )

Momentan ist die Software eher auf "qualitative" Analyse ausgelegt. Ich kann mir aber durchaus vorstellen, z.B. eine Induktivitätsberechnung einzubauen.
Es wäre doch toll, wenn man am Rechner ein Modell seiner Spule (beliebige Geometrie!) erstellt und dann einfach die Induktivität ausgespuckt bekommt. :)
Überdies wäre es natürlich auch wünschenswert, verschiedene Kernmaterialien zu integrieren. Hier brauche ich Hilfe von jemandem, der sich besser mit der Physik auskennt!

Kurzum: Für mich ist es ein sehr nettes Programmierprojekt gewesen und ich habe extrem viel dabei gelernt.
Es macht Spaß, zu sehen, wie ein so simples Gesetz (Biot-Savart-Gesetz) über simplen Geometrien so komplexe "Strömungen" erzeugen kann!
Insgesamt finde ich es sehr faszinierend, damit herumzuspielen.
Und hier bin ich auch auf euer Feedback gespannt! :) Verbesserungsvorschläge? Fehler entdeckt (ich bin ja kein Physiker :hihi: )? Immer her damit!

Und wenn ihr Lust habt, das Programm weiter zu verbessern, dann seid ihr hiermit herzlichst dazu eingeladen! :mosh:

Hier gibt's außerdem noch eine kurze Demo des Programms in Action:


Beste Grüße und ein schönes Wochenende wünscht
- Paul!
“With great power come great heat sinks.”
paulwilhelm.de -- mosfetkiller.de
Benutzeravatar

VDX
Beiträge: 2175
Registriert: Fr 13. Jul 2018, 18:23
Spezialgebiet: Laser und Mikro-/Nanotechnik
Hat sich bedankt: 14 Mal
Danksagung erhalten: 238 Mal

Re: Einfache Magnetfeld-Berechnung mit MagnetiCalc

Beitrag von VDX »

... das sieht doch schonmal Top aus!

Ich habe seinerzeit unter Windows und auch nur in 2D mit FEMM Simulationen für meine Magnetfeld-Mikropositionierer gerechnet - hier die Homepage von FEMM:
http://www.femm.info/wiki/HomePage

Viktor
Aufruf zum Projekt "Müll-freie Meere" - https://reprap.org/forum/list.php?426 -- Facebook-Gruppe - https://www.facebook.com/groups/383822522290730
Call for the project "garbage-free seas" - https://reprap.org/forum/list.php?425
Benutzeravatar

Thunderbolt
Beiträge: 2907
Registriert: Fr 7. Apr 2006, 14:05
Spezialgebiet: Physik,Elektronik,Blender
Schule/Uni/Arbeit: M.Sc ET, Hardwareentwickler
Wohnort: 65366 Geisenheim (Hessen)
Hat sich bedankt: 1 Mal
Danksagung erhalten: 83 Mal
Kontaktdaten:

Re: Einfache Magnetfeld-Berechnung mit MagnetiCalc

Beitrag von Thunderbolt »

Hab das ganze gerade mal unter windows getestet, scheint zu funktionieren.

Allerdings fressen die Worker jeweils gut 1 GB RAM :tropfen:

Du könntest mal schauen, dass du in der __init__.py nicht alle untermodule importierst, auch wenn das die usability erleichtert.

Die worker brauchen ja z.B. kein PyQt5 laden wenn die nur auf numpy arrays rumkauen ;)

Unter linux ist das ganze halt weniger ein problem, weil die worker da geforkt werden und sich dem RAM teils mit dem parent-prozess teilen.

Was evtl. noch cool wäre, wäre wenn man die tabelle links größer ziehen könnte. vllt tabelle von den paramtern untendrunter trennen und die linke seite mit 'nem splitter layouten...
und vllt den aktuell angewählten punkt in der Visualisierung hervorheben.

Und "import *" macht man nicht :D

So, genug gemeckert ;)

Ziemlich geiles programm.

Hatte für meine anstehende Masterarbeit Nach 'nem programm zum simulieren von magentfeldern im dreidimensionalen raum gesucht, bin dann über
https://magpylib.readthedocs.io/en/latest/
gestolpert, das kann aber wohl nur einfache geometrien...
Benutzeravatar

Thread-Ersteller
Paul
Admin
Beiträge: 3596
Registriert: So 7. Aug 2005, 14:34
Schule/Uni/Arbeit: HW/SW-Entwickler
Wohnort: Braunschweig
Hat sich bedankt: 638 Mal
Danksagung erhalten: 210 Mal
Kontaktdaten:

Re: Einfache Magnetfeld-Berechnung mit MagnetiCalc

Beitrag von Paul »

Moin Leute!

Vielen Dank für euer Feedback! :awesome:

@VDX: Joo, FEMM ist mir auch schonmal über den Weg gelaufen. Aber es ist sicherlich nicht so einfach zu bedienen wie MagnetiCalc! :hihi: Aber mal im Ernst: Ich werde mir das auch nochmal genau anschauen. Scheint ja glücklicherweise auch unter einer freien Lizenz zu stehen!
Ich habe in der neuen Version nun auch eine direkte Anzeige der Flussdichte eingebaut. So ist das Programm schon ein bisschen mehr praktisch nutzbar! (Hoffe ich. :D)

@Thunderbolt: Danke für die praktischen Tipps! :headbang: Die Imports habe ich gleich optimiert. Wie das mit dem Speicherbedarf unter Windows allgemein ausschaut -- darüber habe ich mir noch gar keine Gedanken gemacht. Wenn du nochmal Zeit dafür hast, könntest du es ja jetzt noch mal mit der neuen Version 1.6 probieren. :mrgreen:
Ich wüsste jetzt aber ehrlich gesagt nicht mehr, wo ich am RAM-Bedarf noch etwas optimieren könnte...

Deine Anregung mit der kleinen Tabelle habe ich auch prompt umgesetzt! Zwar nicht mit einem Splitter -- weil ich das "Wire"-Widget nicht umständlich auftrennen wollte -- sondern einfach mit einer entsprechenden Size-Policy; die Tabelle passt ihre Höhe jetzt selbständig maximal an. Ich denke, das ist ein guter Kompromiss, mit dem sich gut arbeiten lässt. :)

Dass der aktuell ausgewählte Punkt in der 3D-Szene gehighlighted wird, habe ich mir auch schon gewünscht. Kommt noch! :zeigefinger: ;)

Zu guter letzt: Jau, von magpylib habe ich auch schon gehört. Habe es mir noch nicht im Detail angeschaut, aber grundsätzlich sieht das sehr schön durchdacht aus. Aber es ist halt auch eine Library und keine GUI! :hehe:

Beste Grüße! :)
- Paul!
“With great power come great heat sinks.”
paulwilhelm.de -- mosfetkiller.de
Benutzeravatar

Thunderbolt
Beiträge: 2907
Registriert: Fr 7. Apr 2006, 14:05
Spezialgebiet: Physik,Elektronik,Blender
Schule/Uni/Arbeit: M.Sc ET, Hardwareentwickler
Wohnort: 65366 Geisenheim (Hessen)
Hat sich bedankt: 1 Mal
Danksagung erhalten: 83 Mal
Kontaktdaten:

Re: Einfache Magnetfeld-Berechnung mit MagnetiCalc

Beitrag von Thunderbolt »

512 MB Ram pro worker, deutlich besser :moep:

Zu versuchen, dem RAM verbrauch unter python zu debuggen oder optimieren ist (bzw. war zumindest in Py2) :haufen: d.h. kann man eigentlich vergessen. Hatte mal en lustigen bug, dass 'ne Queue in Py2.7 irgendwie ein speicherleck hatte (vllt war ich damals auch zu doof die richtig zu benutzen) hat mich auf jeden fall fast in den wahnsinn getrieben :D

Bastelst du eigentlich die widgets alle von hand oder benutzt du QtDesigner?
Benutzeravatar

Thread-Ersteller
Paul
Admin
Beiträge: 3596
Registriert: So 7. Aug 2005, 14:34
Schule/Uni/Arbeit: HW/SW-Entwickler
Wohnort: Braunschweig
Hat sich bedankt: 638 Mal
Danksagung erhalten: 210 Mal
Kontaktdaten:

Re: Einfache Magnetfeld-Berechnung mit MagnetiCalc

Beitrag von Paul »

Ah, danke für die Rückmeldung. Immerhin hat es ein bisschen was gebracht! :) (Hätte ich garnicht gedacht...)

Tatsächlich habe ich die Wigets alle manuell platziert. Dabei lernt man einfach mehr, wenn man es einmal auf die harte Tour gemacht hat. :hihi:
Aber beim nächsten Projekt überlege ich mir auch, gleich den Designer zu verwenden. Habe bislang nur einmal testweise eine .ui-File mit pyuic zu Python-Code convertiert, das war eigentlich ganz easy. ^^

Viele Grüße
- Paul!
“With great power come great heat sinks.”
paulwilhelm.de -- mosfetkiller.de
Benutzeravatar

Thunderbolt
Beiträge: 2907
Registriert: Fr 7. Apr 2006, 14:05
Spezialgebiet: Physik,Elektronik,Blender
Schule/Uni/Arbeit: M.Sc ET, Hardwareentwickler
Wohnort: 65366 Geisenheim (Hessen)
Hat sich bedankt: 1 Mal
Danksagung erhalten: 83 Mal
Kontaktdaten:

Re: Einfache Magnetfeld-Berechnung mit MagnetiCalc

Beitrag von Thunderbolt »

Paul hat geschrieben: So 25. Okt 2020, 21:32 Ah, danke für die Rückmeldung. Immerhin hat es ein bisschen was gebracht! :) (Hätte ich garnicht gedacht...)

Tatsächlich habe ich die Wigets alle manuell platziert. Dabei lernt man einfach mehr, wenn man es einmal auf die harte Tour gemacht hat. :hihi:
Aber beim nächsten Projekt überlege ich mir auch, gleich den Designer zu verwenden. Habe bislang nur einmal testweise eine .ui-File mit pyuic zu Python-Code convertiert, das war eigentlich ganz easy. ^^

Viele Grüße
- Paul!
Hab damals um 2014 rum als ich mit GUI Programmierung angefangen hab (und noch wenig ahnung von objektorientierter programmierung hatte) auch alle zu fuß gemacht, noch mit TkInter... es frisst wahnsinnig viel zeit :D
Mittlerweile hab ich 'n eigenene generator für ui-files, der aus 'ner YML datei gefüttert wird und dateieingabe-dialoge erzeugt ( zeilen mit label, widget, reset-button, gliederung in tabs etc. ) und aus objektattributen liest und schreibt.

Für 'n uniprojekt hab ich das ganze noch mehr auf die spitze getrieben, type-annotations für klassen missbraucht um attribut-infos zu speichern, aus denen dann 'n editor-widget erzeugt wird :D

Code: Alles auswählen

class signalobject(xmlObject,prefixedName):
    shortname: {"type":str,"default":"My Signalobject"}
    name: {"type":str,"readonly":True}
    description: {"type":str,"default":"A Signal"}
    signalclass: {"type":"choice","value_from":"signalclass.name"}
    indriver: {"type":"choice|editable","values":["0", "default"],"default":"default"}
    outdriver: {"type":"choice|editable","values":["0", "default"],"default":"default"}
    signalpool: {"type":"choice","value_from":"signalpool.name"}
    resource: {"type":"choice","value_from":"resource.name","values":["None"]}
    resourceDefault: {"type":"button","action":"resourceDefault|reload","label":"New resource","readonly":True}
    onDataUpdate: {"type":"choice","values":["0"],"value_from":"event.name"}
    onDataUpdateDefault: {"type":"button","action":"onDataUpdateDefault|reload","label":"New event","readonly":True}
    onDataError: {"type":"choice","values":["0"],"value_from":"event.name"}
    onDataErrorDefault: {"type":"button","action":"onDataErrorDefault|reload","label":"New event","readonly":True}
Benutzeravatar

Thread-Ersteller
Paul
Admin
Beiträge: 3596
Registriert: So 7. Aug 2005, 14:34
Schule/Uni/Arbeit: HW/SW-Entwickler
Wohnort: Braunschweig
Hat sich bedankt: 638 Mal
Danksagung erhalten: 210 Mal
Kontaktdaten:

Re: Einfache Magnetfeld-Berechnung mit MagnetiCalc

Beitrag von Paul »

Boah, nicht schlecht! :mrgreen: Sowas zu automatisieren finde ich auch immer sehr spannend.
Hauptsache es endet nicht so: https://xkcd.com/1319/ :D
“With great power come great heat sinks.”
paulwilhelm.de -- mosfetkiller.de
Benutzeravatar

Thunderbolt
Beiträge: 2907
Registriert: Fr 7. Apr 2006, 14:05
Spezialgebiet: Physik,Elektronik,Blender
Schule/Uni/Arbeit: M.Sc ET, Hardwareentwickler
Wohnort: 65366 Geisenheim (Hessen)
Hat sich bedankt: 1 Mal
Danksagung erhalten: 83 Mal
Kontaktdaten:

Re: Einfache Magnetfeld-Berechnung mit MagnetiCalc

Beitrag von Thunderbolt »

Der klump für den ich den YML UI generator geschrieben hab (Warenwirtschaftssystem für Veranstaltungstechnik), hat ~2014 angefangen

~2016 kam dann V2 komplett neu mit PySide, da hab ich dann schon den UI-Designer benutzt, aber noch keine custom widget oder sowas, viel zu große dateien
wartbarkeit war 'ne katastrophe

und ende letzten jahres hab ich dann mit V3 angefangen, Py3, PySide2, Custom widgets, komplettes redesign, komplett objektorientiert, (vorher war fast alles einfach 'n dictionary :moep: ), unterteilung in module ... deutlich bessere performance + wartbarkeit xD

mittlerweile hab ich 'ne komplette test- und deployment pipeline (win10, linux, macos) dafür auf meinem gitlab server :D
Benutzeravatar

ferrum
Beiträge: 713
Registriert: Sa 11. Mai 2013, 15:31
Spezialgebiet: Kaffee
Wohnort: Bayern
Hat sich bedankt: 15 Mal
Danksagung erhalten: 52 Mal
Kontaktdaten:

Re: Einfache Magnetfeld-Berechnung mit MagnetiCalc

Beitrag von ferrum »

OK hab einen bug beim Installieren gefunden.
In manchen debian repositorys ist die pip3 Version veraltet die man zwangsweise aus den repos installieren muss.
Damit kann man pyqt5 nicht installieren.
Abhilfe schafft

Code: Alles auswählen

pip3 install --upgrade pip
pip3 install pyqt5
lg ferrum
KAFFEE SCHWARZ
Benutzeravatar

Thread-Ersteller
Paul
Admin
Beiträge: 3596
Registriert: So 7. Aug 2005, 14:34
Schule/Uni/Arbeit: HW/SW-Entwickler
Wohnort: Braunschweig
Hat sich bedankt: 638 Mal
Danksagung erhalten: 210 Mal
Kontaktdaten:

Re: Einfache Magnetfeld-Berechnung mit MagnetiCalc

Beitrag von Paul »

ferrum hat geschrieben: So 25. Okt 2020, 22:16 OK hab einen bug beim Installieren gefunden.
Aaah, danke dir! :) Werde ich ins README aufnehmen!
“With great power come great heat sinks.”
paulwilhelm.de -- mosfetkiller.de
Benutzeravatar

ferrum
Beiträge: 713
Registriert: Sa 11. Mai 2013, 15:31
Spezialgebiet: Kaffee
Wohnort: Bayern
Hat sich bedankt: 15 Mal
Danksagung erhalten: 52 Mal
Kontaktdaten:

Re: Einfache Magnetfeld-Berechnung mit MagnetiCalc

Beitrag von ferrum »

Sorry für den Doppelpost.
Man kann das Problem recht Effizient lösen. Als LSG der Maxwellgleichungen hat man bekanntermaßen in der Magnetostatik (alles in cgs Einheiten)

$$\vec{B}(\vec{r}) = \nabla \times \vec{A}$$
und
$$\vec{A}(\vec{r}) = \frac{1}{c} \int \mathrm{d}^3 r' \frac{\vec{j}(\vec{r}')}{|\vec{r} - \vec{r}'|}$$

Wendet man die erste auf die Zweite Gleichung an erhält man das Biot Savoir Gesetz und kann das Feld in jedem Punkt durch Integration berechnen. Die Aufwendige Operation ist allerdings die Integration die man somit für jeden Punkt ausführen muss. Je mehr Punkte desto aufwendiger also. Die Funktion $\frac{1}{|\vec{r} - \vec{r}'|}$ lässt sich in Kugel Koordinaten in Kugelflächenfunktionen entwickeln.
$$\frac{1}{|\vec{r} - \vec{r}'|} =4\pi \sum_{l=0}^\infty \sum_{m=-l}^l \frac{1}{2l+1} \frac{\min(r,r')^l}{\max(r,r')^{l+1}} Y^*_{lm}(\theta',\phi') Y_{lm}(\theta,\phi)$$
Kugelflächenfunktionen sind Komplexe Funktionen welche die natürlichen Eigenfunktionen vieler partieller Differentialgleichungen sind(Maxwell, Schrödinger,...). Wie diese genau aussehen ist hier eigentlich relativ egal. Hiermit lässt sich die Integration schreiben als
$$\vec{A}(\vec{r}) = \frac{1}{c} \sum_{l=0}^\infty \frac{4\pi}{2l+1} \sum_{m=-l}^l Y_{lm}(\theta,\phi) \int \mathrm{d}^3 r' \vec{j}(\vec{r}') \frac{\min(r,r')^l}{\max(r,r')^{l+1}} Y^*_{lm}(\theta',\phi')$$
Ist die Stromdichteverteilung lokalisiert d.h. $ \exists R_\mathrm{out} >0\forall |r|>R_{\mathrm{out}}: \vec{j}(\vec{r}) = 0$ lässt sich das Vektorpotential für punkte außerhalb der Stromdichteverteilung schreiben als:
$$\vec{A}(\vec{r}) = \frac{1}{c} \sum_{l=0}^\infty \frac{4\pi}{2l+1}\frac{1}{r^{l+1}} \sum_{m=-l}^l Y_{lm}(\theta,\phi) \int \mathrm{d}^3 r' \vec{j}(\vec{r}') r'^l Y^*_{lm}(\theta',\phi')$$
Das Integral wird somit unabhängig von dem Punk an dem das Feld ausgewertet wird. Anstatt für jeden Punkt eine Integration auszuführen kann man nun Koeffizienten in $l$ und $m$ Berechnen und das Feld durch einfache Reihenentwicklung in diesen Koeffizienten auswerten. Eine gute Approximation ergibt sich häufig schon für niedrige Koeffizienten beispielsweise $l= 3$ dies würde das lösen von 16 Integralen zum Berechnen des gerammten äußeren Feldes Benötigen. Das Integral $\int \mathrm{d}^3 r' \vec{j}(\vec{r}') r'^l Y^*_{lm}(\theta',\phi') := \mu_{lm}^{\mathrm{out}}$ heißt auch Multipolmoment in der Literatur. Genauer bezeichne ich es hier als äußeres Multipolmoment.

Gibt es im Inneren der Stromdichtverteilung einen Bereich ohne Stromfluss d.h. $ \exists R_\mathrm{in}>0 \forall |r|<R_{\mathrm{in}}: \vec{j}(\vec{r}) = 0$ so lässt sich ein inneres Multipolmoment definieren
$$\int \mathrm{d}^3 r' \vec{j}(\vec{r}') \frac{1}{r'^{l+1}} Y^*_{lm}(\theta',\phi') := \mu_{lm}^{\mathrm{in}}$$
Hiermit kann man das Vektorpotential im Inneren schreiben als
$$\vec{A}(\vec{r}) = \frac{1}{c} \sum_{l=0}^\infty \frac{4\pi}{2l+1}r^l \sum_{m=-l}^l Y_{lm}(\theta,\phi) \mu_{lm}^{\mathrm{in}}$$

Um das Feld von Punkten auszuwerten die auf der Kugelschale zwischen $R_{\mathrm{in}}$ und $R_{\mathrm{out}}$ liegen wird es etwas komplizierter. Hierzu muss man das Integral an der Stelle in zwei Teile teilen wo $r = r'$. Hierzu betrachtet man das Allgemeine Problem als
$$\vec{A}(\vec{r}) = \frac{1}{c} \sum_{l=0}^\infty \frac{4\pi}{2l+1} \sum_{m=-l}^l Y_{lm}(\theta,\phi) \int_0^\pi \mathrm{d}\theta'\int_0^{2\pi} \mathrm{d}\phi' \int_0^\infty\mathrm{d} r' \vec{j}(\vec{r}') \frac{\min(r,r')^l}{\max(r,r')^{l+1}} Y^*_{lm}(\theta',\phi') r'^2 \sin(\theta')$$
Es folgt:
$$\vec{A}(\vec{r}) = \frac{1}{c} \sum_{l=0}^\infty \frac{4\pi}{2l+1} \sum_{m=-l}^l Y_{lm}(\theta,\phi) \left[\frac{1}{r^{l+1}}\int_0^r \mathrm{d} r'\int_0^\pi \mathrm{d}\theta'\int_0^{2\pi} \mathrm{d}\phi' \vec{j}(\vec{r}') Y^*_{lm}(\theta',\phi') r'^{2+l} \sin(\theta') + r^l\int_r^\infty \mathrm{d} r'\int_0^\pi \mathrm{d}\theta'\int_0^{2\pi} \mathrm{d}\phi' \vec{j}(\vec{r}') Y^*_{lm}(\theta',\phi') \frac{1}{r'^{l-1}} \sin(\theta')\right]$$
$$\vec{A}(\vec{r}) := \frac{1}{c} \sum_{l=0}^\infty \frac{4\pi}{2l+1} \sum_{m=-l}^l Y_{lm}(\theta,\phi) \left[\frac{1}{r^{l+1}} \vec{\mu}_{lm,r}^\mathrm{out} + r^l\vec{\mu}_{lm,r}^\mathrm{in}\right]$$
Nachteilig ist dass die Multipolkoeffizienten nun abhängig von $r$ sind. Wählt man jedoch die Auswertungspunkte geschickt auf Kugeln um den Ursprung lässt sich so Rechenleistung spaaren.


Praktisch anwenden lässt sich das so nicht weil die meisten Stromdichteverteilungen keine Funktionen sind sondern als Distributionen geschrieben werden. Distributionen lassen sich allerdings nicht trivialerweise numerisch Integrieren. Mir sind jedoch als Problemstellung in der Elektrodynamik nur Delta Distributionen begegnet. Beispielsweise fließt der Strom auf einem dünnen Draht oder einer dünnen Fläche. Abhilfe schafft hier das Problem durch einen ein oder zweidimensionalen Parameter $\gamma$ bzw. $\gamma_1, \gamma_2$ zu Parametrisieren. Die Parametrisierung muss man dabei zu jedem Problem spezifisch angeben.

Im Eindimensionalen Fall muss man die Kurve auf der der Strom fließt $\vec{r}(\gamma)$ ,die Betragsmäßige Änderung der Kurve $\left|\frac{\mathrm{d}\vec{r}(\gamma)}{d\gamma}\right|$ sowie die Stromdichte $\vec{j}(\gamma)$ spezifizieren. Die Multipolmomente lassen sich dann mittels:
$$ \mu_{lm}^{\mathrm{out}} = \int \mathrm{d}\gamma \left|\frac{\mathrm{d}\vec{r}(\gamma)}{d\gamma}\right|\vec{j}(\gamma) r(\gamma)^{l+2} Y^*_{lm}(\theta(\gamma),\phi(\gamma)) \sin(\theta(\gamma))$$
$$ \mu_{lm}^{\mathrm{in}} = \int \mathrm{d}\gamma\left|\frac{\mathrm{d}\vec{r}(\gamma)}{d\gamma}\right| \vec{j}(\gamma) \frac{1}{r(\gamma)^{l-1}} Y^*_{lm}(\theta(\gamma),\phi(\gamma)) \sin(\theta(\gamma))$$
$$ \mu_{lm,r}^{\mathrm{out}} = \sum_{\gamma_{\mathrm{min}},\gamma_{\mathrm{max}}}\int_{\gamma_{\mathrm{min}}}^{\gamma_{\mathrm{max}}} \mathrm{d}\gamma \left|\frac{\mathrm{d}\vec{r}(\gamma)}{d\gamma}\right|\vec{j}(\gamma) r(\gamma)^{l+2} Y^*_{lm}(\theta(\gamma),\phi(\gamma)) \sin(\theta(\gamma))$$
$$ \mu_{lm,r}^{\mathrm{in}} = \sum_{\gamma_{\mathrm{min}},\gamma_{\mathrm{max}}}\int_{\gamma_{\mathrm{min}}}^{\gamma_{\mathrm{max}}} \mathrm{d}\gamma\left|\frac{\mathrm{d}\vec{r}(\gamma)}{d\gamma}\right| \vec{j}(\gamma) \frac{1}{r(\gamma)^{l-1}} Y^*_{lm}(\theta(\gamma),\phi(\gamma)) \sin(\theta(\gamma))$$

Wobei die $r$ abhängigen Koeffizienten so integriert werden dass in allen integrationsabschnitten die jeweilige Bedingung für $r(\gamma)$ erfüllt ist. Der 2D Fall funktioniert analog sprengt hier jedoch etwas den Rahmen. Ich hoffe dass klar ist dass man auf diese Art und Weise das Problem effizienter lösen kann.

@Paul: Auf jeden Fall ein super tolles Projekt vor allem die GUI beeindruckt mich. :headbang: :headbang: :headbang:

lg ferrum
KAFFEE SCHWARZ
Benutzeravatar

Thread-Ersteller
Paul
Admin
Beiträge: 3596
Registriert: So 7. Aug 2005, 14:34
Schule/Uni/Arbeit: HW/SW-Entwickler
Wohnort: Braunschweig
Hat sich bedankt: 638 Mal
Danksagung erhalten: 210 Mal
Kontaktdaten:

Re: Einfache Magnetfeld-Berechnung mit MagnetiCalc

Beitrag von Paul »

ferrum, das muss ich erstmal verarbeiten! :shock: :hihi:
Ohne jetzt alle Einzelheiten sofort im Detail verstanden zu haben: Die Berechnung der Flussdichte aus dem Vektorpotential ist mir in der Literatur
auch schon öfters mal über den Weg gelaufen, bzw. habe ich anderswo mal gelesen, dass viele Simulationsprogramme das so machen.
ferrum hat geschrieben: Mo 26. Okt 2020, 00:24Praktisch anwenden lässt sich das so nicht [...]
:rage: :trollface:
ferrum hat geschrieben: Mo 26. Okt 2020, 00:24Ich hoffe dass klar ist dass man auf diese Art und Weise das Problem effizienter lösen kann.
Jau, wenn man das einmal alles verstanden hat, ist das für manche Probleme bestimmt am sinnvollsten. :)
Aber ich bin faul und lasse den Rechner das per Superposition machen, anstatt den cleveren (gehirnschmalzfordernden), analytischen Weg zu gehen. :D
ferrum hat geschrieben: Mo 26. Okt 2020, 00:24@Paul: Auf jeden Fall ein super tolles Projekt vor allem die GUI beeindruckt mich. :headbang: :headbang: :headbang:
Danke, das freut mich zu hören! :awesome:
Hast du das Programm unter Linux oder unter Windows ausprobiert?

Habe es gestern Abend selbst mal unter Windows versucht ... das sah ja schrecklich aus. :D Ich muss mal gucken, ob und wie ich unter Windows das gleiche Qt-Theme laden kann, wie ich es auch von Ubuntu kenne.

Ach, eins noch, immer noch @ferrum:
Nun verwende ich ja überall µ = µ_0. Wenn ich nun aber ein permeables Kernmaterial simulieren möchte... gibt es da einen einfachen Weg, weiterhin das Biot-Savart-Gesetz zu verwenden?
Also kann ich dann einfach für jeden Aufpunkt, der innerhalb meines selbst definierten Kernvolumens liegt, das gewünschte µ_r einsetzen und wie gehabt weiterrechnen?
Oder müsste ich die Berechnung dann auf komplett anderem Wege durchführen, und tatsächlich auf eine "analytische" Berechnung umsteigen und vorher alle möglichen Randbedingungen lösen, etc...?
(Ich vermute mal letzteres... was habe ich einen Bock, das zu verstehen. :rage: :tropfen: :moep: :oops: )

Beste Grüße!
- Paul
“With great power come great heat sinks.”
paulwilhelm.de -- mosfetkiller.de
Benutzeravatar

ferrum
Beiträge: 713
Registriert: Sa 11. Mai 2013, 15:31
Spezialgebiet: Kaffee
Wohnort: Bayern
Hat sich bedankt: 15 Mal
Danksagung erhalten: 52 Mal
Kontaktdaten:

Re: Einfache Magnetfeld-Berechnung mit MagnetiCalc

Beitrag von ferrum »

Ich hab mal ein kleines Beispiel für die Multipolentwicklung geschrieben Code ist immer Leichter zu verstehen als Gleichungen. Ich hoffe das ist so halbwegs verständlich. Im Beispiel werden die Multipolkoeffizienten eines Drahtringes in der xy Ebene im Fernfeld berechnet. Das ganze ist so geschrieben dass man damit auch E Felder von Ladungsdichtverteilungen berechnen kann ohne groß etwas zu verändern. Sollte auch mit Vierervektoren zurechtkommen. Um von A auf das jeweilige Feld zu kommen muss man den richtigen Operator dafür noch implementieren also für Magnetfelder die Rotation, für Elektrische Felder die Divergenz.

Code: Alles auswählen

import numpy as np
from scipy.special import sph_harm 
from scipy.integrate import quad_vec
#Class for integration Functions
class KGF:
	def CfOut1D(l, m, j, theta, phi, r, dr):
		def Cf(gamma):
			return dr(gamma) * np.power(r(gamma), l + 2) * j(gamma) * np.sin(theta(gamma)) * np.conjugate(sph_harm(m, l, phi(gamma), theta(gamma)))
		return Cf
	def CfOut3D(l, m, j, theta, phi):
		def Cf(r):
			return np.power(r(gamma), l + 2) * j(r) * np.sin(theta(r)) * np.conjugate(sph_harm(m, l, phi(r), theta(r)))
		return Cf
	def CfIn1D(l, m, j, theta, phi, r, dr):
		def Cf(gamma):
			return dr(gamma) * 1/np.power(r(gamma), l - 1) * j(gamma) * np.sin(theta(gamma)) * np.conjugate(sph_harm(m, l, phi(gamma), theta(gamma)))
		return Cf
	def CfIn3D(l, m, j, theta, phi):
		def Cf(r):
			return np.power(r(gamma), l - 1) * j(r) * np.sin(theta(r)) * np.conjugate(sph_harm(m, l, phi(r), theta(r)))
		return Cf
#Define example
#Current J flows in a circle in the x-y plane
#circle has radius R
#gamma parameter: distance on circle
R = 1
def theta(gamma):
	return np.pi/2
def phi(gamma):
	return gamma/R
def r(gamma):
	return R
def dr(gamma):
	return 1
J = 1
def j(gamma):
	jz = 0
	jy = J * np.cos(gamma/R)
	jx = J * np.sin(gamma/R)
	return np.array([jx, jy, jz])
#Integrate Multipolmomentum of far field
L = 10
mu = []
for l in range(0, L):
	mul = []
	for m in range(-l,l+1):
		cf = KGF.CfOut1D(l,m,j,theta,phi,r,dr)
		mul += [quad_vec(cf, 0, 2 * np.pi * R)[0]]
	mu += [mul]
#Define Function for Vector Potential
def A(r, theta, phi):
	Av = 0
	for l in range(0, L):
		for m in range(-l,l+1):
			Av += 1/(2*l+1) * 1/np.power(r,l+1) * sph_harm(m, l, phi, theta) * mu[l][m+l]
	#The result is usually real
	#There my be smal complex parts because of numerical issues
	return np.real(Av * 4 * np.pi)
#Calc at some points
print(A(10,np.pi/2,0))
lg ferrum

PS: alles in cgs Einheiten und $c=1$ !!!
KAFFEE SCHWARZ
Benutzeravatar

Thread-Ersteller
Paul
Admin
Beiträge: 3596
Registriert: So 7. Aug 2005, 14:34
Schule/Uni/Arbeit: HW/SW-Entwickler
Wohnort: Braunschweig
Hat sich bedankt: 638 Mal
Danksagung erhalten: 210 Mal
Kontaktdaten:

Re: Einfache Magnetfeld-Berechnung mit MagnetiCalc

Beitrag von Paul »

Danke dir, werde ich mir mal reinziehen! :kaffee: :headbang:
“With great power come great heat sinks.”
paulwilhelm.de -- mosfetkiller.de
Antworten