Wenn Sie mit Multiphysik-Simulationen arbeiten, müssen Sie häufig zwei oder mehr spezialisierte Solver koppeln, damit sie während der Berechnung Daten austauschen. Precice ist eine ausgereifte Open-Source-Kopplungsbibliothek für partitionierte Multi-Physik-Simulationen, insbesondere wenn unabhängige Solver wie FIPY, OpenFOAM oder Calculix angeschlossen werden.
Aber Precice ist nicht immer eine Option. Sie können in einer Umgebung arbeiten, in der die Installation einer C++-basierten Bibliothek mit Python-Bindungen nicht praktikabel ist. Sie können einen kommerziellen Solver verwenden, der Precice nicht unterstützt. Oder Ihr Multi-Physik-Problem kann einfach genug sein, dass sich ein Full-Kopplung-Framework wie ein Overkill anfühlt.
Dieser Artikel behandelt praktische Alternativen, einschließlich sequentieller Aktualisierung innerhalb von FIPY, Operator-Splitting, Polynom-Extrapolationsmethoden und Universal-Kopplungsbibliotheken.
Schlüssel zum Mitnehmen
- Precice ist leistungsstark, aber nicht die einzige Option für die Multi-Physik-Kopplung. Die richtige Alternative hängt von der Verfügbarkeit von Solver, den Spracheinstellungen, der HPC-Bereitschaft und der Komplexität des Problems ab.
- Die sequentielle Kopplung innerhalb von FIPY funktioniert gut, wenn beide Gleichungen im selben Python-Prozess leben. Es ist einfach, debuggbar und erfordert keine externe Kopplungsbibliothek.
- Operator-Splitting entkoppelt die Physik, indem jede Gleichung separat gelöst wird. Es ist nützlich, wenn verschiedene physikalische Prozesse auf unterschiedlichen Zeitskalen ablaufen.
- Allgemeine Kopplungsbibliotheken wie MUI und Moose MultiApps bieten alternative Architekturen mit unterschiedlichen Kompromissen in Bezug auf Komplexität, Sprachunterstützung und Skalierbarkeit.
- Die polynomiale Orchestrierung durch Tools wie Rhapsopy ist ein aufkommender Ansatz höherer Ordnung, der Zeitschritte unter Verwendung von Kopplungsvariablen Fehlerschätzungen anpasst.
Partitionierte vs. monolithische vs. sequentielle Kopplung
Vor dem Vergleich von Alternativen hilft es, die wichtigsten Kopplungsstrategien zu klären. Die Multiphysik-Kopplung fällt normalerweise in drei Kategorien.
Teilung Kopplung
Bei der partitionierten Kopplung kommunizieren separate Löser über eine externe Schnittstelle oder Middleware-Schicht. Die Löser bleiben unabhängige Blackboxen, und jeder Solver muss die interne Struktur des anderen nicht kennen.
Precice ist das kanonische Beispiel. Zu den Vorteilen gehören die Wiederverwendung von Code, Flexibilität und die Möglichkeit, kommerzielle oder ältere Codes zu koppeln. Der Kompromiss ist der Kommunikationsaufwand und die Notwendigkeit von Mesh-Mapping, Datenübertragung und Kopplungskoordination.
Monolithische Kopplung
Bei der monolithischen Kopplung werden alle Physiken in einem einzigen Solver gelöst und teilen sich häufig die gleiche Systemmatrix. Dies kann bei eng gekoppelten Problemen effizienter sein, da Nichtlinearitäten implizit behandelt werden.
Der Kompromiss ist ein hoher Entwicklungsaufwand. Alle Physik muss in einem Framework implementiert werden. Moose ist ein bemerkenswertes Framework, das Workflows im monolithischen Stil unterstützt und auch partitionierte Muster durch MultiApps bietet.
Sequentielle Kopplung
Die sequentielle Kopplung funktioniert, wenn alle Physik in einem Solver-Framework ausgedrückt werden kann. In FIPY können Sie beispielsweise gekoppelte Gleichungen nacheinander im selben Python-Prozess lösen.
Dies vermeidet externe Middleware vollständig. Der Kompromiss besteht darin, dass Sie die Fähigkeit verlieren, unabhängige Löser zu koppeln, die in verschiedenen Sprachen geschrieben oder von verschiedenen Organisationen gepflegt werden.
Sequentielle Kopplung mit FIPY Sweeping
Die einfachste Alternative zu Precice besteht darin, gekoppelte Gleichungen im selben Python-Prozess sequentiell zu lösen. FIPY unterstützt dieses Muster durch die Methoden sweep() und updateOld().
Das Muster
Die Standardimplementierung folgt einer verschachtelten Schleife:
- Deklarieren Sie Variablen mit
hasOld=True, damit sie frühere Werte für transiente Begriffe speichern können. - Rufen Sie
updateOld()einmal pro physikalischer Zeitschritt auf, um den aktuellen Zustand als den alten Wert zu sperren. eq.sweep()wiederholt in einer inneren Schleife aufrufen, bis die Residuen konvergieren.
from fipy import CellVariable, Grid1D
from fipy import TransientTerm, DiffusionTerm, ImplicitSourceTerm
# 1. Setup mesh and variables
mesh = Grid1D(nx=50, Lx=1.0)
v0 = CellVariable(
name="Variable 0",
mesh=mesh,
value=0.5,
hasOld=True
)
v1 = CellVariable(
name="Variable 1",
mesh=mesh,
value=0.5,
hasOld=True
)
# 2. Define coupled equations
eq0 = (
TransientTerm(var=v0)
== DiffusionTerm(coeff=0.01, var=v0)
- ImplicitSourceTerm(coeff=1.0, var=v1)
)
eq1 = (
TransientTerm(var=v1)
== DiffusionTerm(coeff=0.01, var=v1)
- ImplicitSourceTerm(coeff=1.0, var=v0)
)
# 3. Simulation parameters
dt = 1e-3
steps = 100
tolerance = 1e-4
# 4. Time-stepping and sweeping loop
for step in range(steps):
v0.updateOld()
v1.updateOld()
residual0 = residual1 = 1.0
while (residual0 > tolerance) or (residual1 > tolerance):
residual0 = eq0.sweep(var=v0, dt=dt)
residual1 = eq1.sweep(var=v1, dt=dt)
Wenn das am besten funktioniert
- Beide Physiken können als PDEs in FIPY ausgedrückt werden.
- Sie benötigen Rapid Prototyping oder Debuggen ohne externe Abhängigkeiten.
- Das gekoppelte System weist eine moderate Nichtlinearität auf, die mit iterativem Sweeping konvergiert.
- Sie lösen Phasenfeldmodelle, Diffusionsreaktionssysteme oder gekoppelte Transportprobleme.
Wenn es fehlschlägt
- Sie müssen in C ++, Fortran oder anderen Sprachen geschriebene Solver koppeln.
- Die Physik ist so eng gekoppelt, dass sequentielle Sweeps zu viele Iterationen erfordern.
- Ihre Löser sind separate ausführbare Dateien aus verschiedenen Organisationen.
- Sie benötigen eine parallele Skalierung des verteilten Speichers über mehrere Rechenknoten.
Operator-Splitting-Ansätze
Das Splitting des Operators, auch fraktionales Steppen genannt, zerlegt ein gekoppeltes System in sequentielle Teilschritte. Jeder Teilschritt löst ein Physikmodell. Dies ist nützlich, wenn physikalische Prozesse auf unterschiedlichen Zeitskalen ablaufen.
Additiv vs Multiplikative Splitting
Additive Splitting zerlegt eine Gleichung in separate Operatoren und löst jeden Beitrag unabhängig. Multiplikative Splitting wendet Operatoren sequentiell mit einer definierten Reihenfolge an, was wichtig ist, wenn Operatoren nicht pendeln.
Bei Multiphysik-Workflows ist eine additive Spaltung oft einfacher anzuwenden. Jedes Physikmodell kann seinen eigenen optimierten Solver verwenden, und die Kopplungslogik bleibt modular.
Python-Operator-Splitting-Bibliotheken
Mehrere Python-orientierte Tools und Beispiele unterstützen Workflows für das Aufteilen von Operatoren:
- Pythos ist eine Python-Bibliothek zum systematischen Aufteilen von Differentialgleichungen. Es unterstützt Muster wie Strang-Splitting, implizit-explizite Methoden und adaptive Zeitschritte.
- Venedig ist ein Multi-Scale-Operator-Splitting-Algorithmus, der Strang-Splitting mit adaptiven Zeitschritten verwendet. Es ist relevant, wenn gekoppelte Physik über verschiedene Zeitskalen hinweg funktioniert.
- Operator-Splitting-Methoden Bietet eigenständige Python-Skripte für die pädagogische Verwendung. Diese Skripte sind zum Lernen nützlich, sind jedoch nicht produktionsbereit.
Fipy mit Operator-Splitting
Sie können FIPY auch manuell mit Operator-Splitting kombinieren. Ein Diffusionsreaktionssystem kann in einen Diffusionsschritt und einen Reaktionsschritt aufgeteilt werden:
# Separate the reaction step from diffusion
dt_diffusion = 0.001
dt_reaction = 0.1
# Solve diffusion with a small time step
eq_diff = TransientTerm(var=T) == DiffusionTerm(coeff=k, var=T)
eq_diff.sweep(dt=dt_diffusion)
# Solve reaction with a larger time step
eq_react = TransientTerm(var=T) == ReactionTerm(source, var=T)
eq_react.sweep(dt=dt_reaction)
Das Grundschema ist genau erster Ordnung. Verwenden Sie für die Genauigkeit zweiter Ordnung Strangsplitting: Halbschrittdiffusion, Vollschrittreaktion und dann Halbschrittdiffusion.
Allgemeine Kopplungsbibliotheken
Wenn Sie eine partitionierte Kopplung benötigen, aber nicht Precice verwenden können, gibt es mehrere Alternativen.
MUI: universelle Multiscale-Schnittstelle
MUI ist eine reine Header-C++-Bibliothek zum Koppeln heterogener Solver. Es behandelt ausgetauschte Daten als Punktwolken und behandelt die räumliche und zeitliche Interpolation automatisch.
Zu den wichtigsten Funktionen gehören:
- Punktbasierte Darstellung. MUI kann Daten übertragen, ohne dass ein Solver die Mesh-Konnektivität eines anderen Solvers kennen muss.
- Raum- und Zeitinterpolation. Eingebaute Interpolationstools helfen Solvern, die auf verschiedenen Skalen arbeiten, zu kommunizieren.
- Intelligenter senden. Dieser Algorithmus beschränkt die Kommunikation auf überlappende Domänen und reduziert unnötige All-to-All-Kommunikation.
- Sprachunterstützung. MUI ist in C++ geschrieben und bietet Wrapper für Python, Fortran und C.
MUI ist nützlich, wenn Sie Solver mit grundlegend unterschiedlichen Diskretisierungen wie FEM, FVM, DEM oder SPH koppeln müssen.
Wählen Sie MUI über Precice, wenn Sie eine leichte eingebettete Schnittstelle benötigen oder wenn die Netzverbindungsunterschiede die Standardkopplungsinfrastruktur zu schwer machen.
Halten Sie sich an die precice, wenn Sie eine ausgereifte parallele Skalierung, eine Quasi-Newton-Beschleunigung für stark gekoppelte Probleme und ein größeres Adapter-Ökosystem benötigen.
Moose MultiApps und Transfersysteme
Moose kann vollständig gekoppelte Systeme lösen, aber seine MultiApps – und Transfer -Systeme unterstützen auch partitionierte Ansätze. Moose erstellt Unteranwendungen, die Felddaten hin und her übergeben.
Moose unterstützt mehrere Kopplungsstile:
- Vollständig gekoppelte Workflows, bei denen alle Physik in einer nichtlinearen Iteration gelöst wird.
- Eng gekoppelte Picard- oder Newton-Workflows, in denen Physik-Unteranwendungen innerhalb jedes Zeitschritts iterieren.
- Versetzte Workflows, bei denen jede Physik unabhängig voranschreitet und Daten an definierten Grenzen austauscht.
Elch ist in erster Linie C ++ – fokussiert. Python-Tools gibt es, aber das Ökosystem ist weniger Python-nativ als Workflows, die um FIPY oder Precice herum aufgebaut sind.
Kopplung auf Polynombasis mit Rhapsopy
rhapsopy verwendet polynomische Approximationen der Kopplungsvariablen im Laufe der Zeit. Anstatt bei jedem Kopplungsschritt nur einen einzigen Wert auszutauschen, integriert sich jedes Subsystem unter Verwendung einer polynomialen Approximation seiner Eingabe aus dem anderen Subsystem.
Wie es funktioniert
Während eines Kopplungsschritts wird jedes Subsystem mit einem eigenen Solver integriert, während polynomisch angenäherte Eingangsgrößen verwendet werden. Am Ende des Schritts werden neue Kopplungsvariablen berechnet und die Polynome aktualisiert.
Dieser Ansatz kann helfen bei:
- Genauigkeit. Polynom-Approximationen höherer Ordnung erfassen zeitliche Änderungen besser als konstante oder lineare Extrapolation.
- Adaptive Zeitschritt. Fehlerschätzungen aus Polynom-Approximationen können die Zeitschrittgröße der Kopplung leiten.
- explizite und implizite Kopplung. Implizite Versionen können die Stabilität verbessern, erfordern jedoch die Lösung eines Fixpunktproblems bei jedem Schritt.
Aktueller Status
Rhapsopy wird derzeit am besten als Demonstrationswerkzeug für kleine Probleme angesehen. Es ist vielversprechend für Python-Benutzer, die eine adaptive Kopplung höherer Ordnung wünschen, aber es ist noch keine ausgereifte HPC-Lösung im großen Maßstab.
comsol native Kopplung
Comsol Multiphysics verwendet ein anderes Modell. Anstatt externe Solver zu koppeln, definiert COMSOL Multiphysik-Kopplungen nativ innerhalb derselben Softwareumgebung.
Comsol-Benutzer können:
- Definieren Sie Schnittstellenbedingungen wie Wärmeflusskontinuität oder Spannungsgleichgewicht.
- Verwenden Sie vollständig gekoppelte Lösungsstrategien für nichtlineare Probleme.
- Wechseln Sie je nach Problemkomplexität zwischen getrennten und vollständig gekoppelten Strategien.
Dies ist unkompliziert für Benutzer, die bereits in COMSOL sind. Der Kompromiss ist der Verkäufer-Lock-in. Das Koppeln von externen Solvern erfordert in der Regel comsol-spezifische Schnittstellen, Livelink-Workflows oder Scripting-Bridges.
Vergleichszusammenfassung
| Sich nähern | am besten für | Vorteile | Nachteile | Externe Abhängigkeit |
|---|---|---|---|---|
| Fipy sequentieller Sweeping | Gleichprozess gekoppelte PDs | Einfach, debuggbar, keine externe Kopplungsbibliothek | Begrenzt auf FIPY- und sequentielle Iterationen | Keiner |
| Operator-Splitting | Verschiedene Zeitskalen | modular und wiederverwendet optimierte Löser | Teilungsfehler und Stabilitätsbeschränkungen | Optionale Bibliothek wie Pythos |
| mui | Verschiedene Netztypen und Diskretisierungen | Nur-Header-Design und großer Simulationsbereich | In einigen Fällen weniger ausgereifte parallele Skalierung als Präzipiente | MUI-Bibliothek |
| Elch-Multi-Apps | C++- und Moose-Ökosystem-Workflows | Monolithische und partitionierte Optionen | in erster Linie C++ und weniger Python-nativ | Elchrahmen |
| Rhapsopy | Adaptive Kopplung höherer Ordnung | Dynamische Zeitschritte und Fehlerschätzungen | Nur im Frühstadium und nur im Kleinstadium | Rhapsopy |
| comsol native Kopplung | Integrierte kommerzielle Workflows | Vollständig gekoppelte und intuitive Benutzeroberfläche | Verkäufersperre | COMSOL-Lizenz |
| Präzise | Reife partitionierte Kopplung | Bewährt, dokumentiert und von einer Community unterstützt | Erfordert C++/Python-Bindungen und Adapter-Setup | Precice Library |
Praktischer Entscheidungsführer
Verwenden Sie dieses Entscheidungshandbuch, wenn Sie Precice nicht verwenden können oder möchten.
- Sind alle Physik innerhalb von FIPY ausdrückbar? Verwenden Sie sequentielles Sweeping. Es ist der einfachste Weg und erfordert keine externen Abhängigkeiten.
- Funktioniert Ihre Physik auf sehr unterschiedlichen Zeitskalen? Try operator splitting. Durch die Entkopplung kann jede Physik ihren eigenen Zeitschritt verwenden.
- Koppeln Sie Solver mit grundlegend unterschiedlichen Diskretisierungen? Betrachten Sie MUI. Seine punktbasierte Darstellung kann Maschen-zu-Maschen- und Netz-zu-Teilchen-Kopplung verarbeiten.
- Arbeiten Sie in C ++ oder im Elch-Ökosystem? Moose MultiApps bieten monolithische, eng gekoppelte und versetzte Optionen in einem Framework.
- Benötigen Sie eine adaptive Zeitschritte auf der Grundlage von Kopplungsfehlern? Versuchen Sie Rhapsopy für kleine Experimente oder überwachen Sie die Entwicklung für größere Workflows.
- Verwenden Sie einen kommerziellen Solver? Überprüfen Sie, ob es native Multiphysik-Funktionen hat oder externe Kopplungsbibliotheken unterstützt.
Was wir empfehlen
Für FIPY-Benutzer, die in Python arbeiten, hängt die Empfehlung von der Komplexität der Problemstellung ab.
- Einfache Kopplung, wie Diffusionsreaktion, Phasenfeld oder Transport: Sequential Sweeping mit
sweep(). Es ist unkompliziert und erfordert keine externen Abhängigkeiten. - Moderate Komplexität, wie z. B. lose gekoppelte externe Solver oder unterschiedliche Zeitskalen: Verwenden Sie Operator-Splitting mit einer strukturierten Bibliothek wie Pythos.
- Hohe Komplexität, wie z. B. eng gekoppelte Löser in verschiedenen Sprachen: Verwenden Sie nach Möglichkeit Precice. Die Alternativen bieten noch nicht die gleiche Reife, parallele Skalierbarkeit oder Konvergenzbeschleunigung.
Wenn Precice nicht verfügbar ist, hängt die nächstbeste Option von Ihrer Umgebung ab. Für die akademische Forschung ohne HPC-Zugang kann das Nur-Header-Design von MUI einfacher zu integrieren sein. Für Produktionssimulationen, die eine parallele Skalierung erfordern, bleibt Precice die stärkste Option, wenn Sie es verwenden können.
Was zu vermeiden
- Manueller Datenaustausch in Schleifen ohne Iterations- oder Konvergenzkriterien. Dies kann ungenau oder ungenaue Ergebnisse hervorbringen.
- Extrapolieren von Kopplungsvariablen ohne Fehlerkontrolle. Die Verwendung des Kopplungswerts des vorherigen Zeitschritts als Stromwert ist nur erster Ordnung genau und kann bei stark gekoppelten Problemen instabil sein.
- Vernachlässigung der Unterentspannung. Für die nichtlineare Kopplung sollten Parameter unterrelaxiert werden, um die Divergenz der Solver zu verringern.
- Unter der Annahme von sequentiellen Kehrskalen. Die sequentielle Kopplung innerhalb eines Python-Prozesses wird nicht über Rechenknoten mit verteiltem Speicher skaliert.
Verwandte Anleitungen
- Code-Kopplung mit dem Präcice: Multi-Physics-Simulationen in Python — Installation, Adapterimplementierung und Konfiguration wann PRECICE ist verfügbar.
- Erweitern von FIPY mit benutzerdefinierten Modulen – Organisieren wiederverwendbarer PDE-Codes, Quellbegriffe und gekoppelter Modelle in FIPY.
- Was ist FIPY und wann sollten Sie es verwenden? – FIPY-Grundlagen und Anwendungsfälle.
- Phasenfeldmodelle in der Materialwissenschaft verstehen – Multi-Physics-Phasenfeldanwendungen.
- Verwalten von PDE-Problemen im großen Maßstab: Strategien, Solver und HPC-Fallstudien – Strategien zur Skalierung komplexer Simulationsworkflows.
Benötigen Sie Hilfe bei der Gestaltung Ihres Multiphysik-Workflows?
Die Wahl des richtigen Kopplungsansatzes hängt von Ihren Lösern, Einschränkungen und Problemkomplexität ab. Matforge bietet Beratungsleistungen für Forschungssoftware und Simulationsdesign an. Wir können dabei helfen, Kompromisse zwischen Präzize, sequentielle Kopplung, Operatorsplitting und anderen Ansätzen für Ihr spezifisches Multiphysik-Problem zu bewerten.
Besuchen Sie die Matforge-Homepage, um mehr über Beratungsdienste und Forschungsworkflows zu erfahren.