Gibt es einen Open-Source-Satz von ODE-Lösern für C, die den systemeigenen C99-Komplextyp verwenden?

12

Ich habe GSL als Grundlage für viele meiner Simulationen verwendet, aber es ist für meine Zwecke ein bisschen übertrieben und es definiert seinen eigenen komplexen Typ aus Legacy-Gründen. Anstatt meinen eigenen Runge-Kutta-ODE-Solver zu programmieren, der wahrscheinlich nicht sehr effizient wäre, gibt es Open-Source-ODE-Solver, die den nativen C99-Komplextyp verwenden?

qubyte
quelle
Ich weiß nicht, wo Sie es verwenden möchten, aber im Allgemeinen ist es ziemlich schwierig, RK in nicht effizienter Weise zu implementieren. Haben Sie Benchmarks erstellt, die gezeigt haben, dass Sie dieses Problem haben?
mbq
2
Keiner. Ich habe mein eigenes nicht geschrieben, weil ich das Rad nicht neu erfinden will. Wenn ich muss, werde ich es tun, aber Zeit für etwas zu finden, das nicht kaputt ist, ist für mich im Moment nicht geplant. Wenn eine Antwort kommt, nach der ich suche, kann ich sie erst nach einigen Monaten verwenden. Außerdem ist RK nicht immer das, was ich brauche, sondern genau das, wofür ich den Algorithmus kenne.
Qubyte
Im Übrigen mache ich die meiste Zeit Simulationen von kleinen Quantensystemen. Allerdings nicht ausschließlich.
Qubyte
Ich würde davon abraten, RK mit variabler Schrittgröße selbst zu implementieren (außer für Bildungszwecke). Es sind viele Heuristiken erforderlich, um die optimale Schrittgröße zu finden.
Jitse Niesen
Wie gesagt, alles, was ich schnell schreiben würde, wäre entweder falsch oder langsam. Ist es besonders schwierig, RK mit komplexen Ein- / Ausgängen zu implementieren? Ich weiß, Sie können es einfach in zwei Teile aufteilen, aber das ist irgendwie ärgerlich!
Qubyte

Antworten:

10

Sie könnten es als "Overkill" bezeichnen, aber das Zeitintegrationspaket von PETSc kann mit C99 complex (configure --with-scalar-type=complex) verwendet werden. Unterstützte Methoden sind

Diese Implementierungen eignen sich am besten für hochdimensionale Probleme wie semi-diskretisierte partielle Differentialgleichungen (Linienmethode).

Jed Brown
quelle
Es ist ein bisschen groß, aber ich wusste nicht so +1. Idealerweise ist das, was ich benutze, nicht größer als GSL. Ich werfe einen Blick in das Handbuch und sehe, was ich denke.
Qubyte
Um klar zu sein, verknüpfen Sie diese Bibliotheken beim Kompilieren. Ist das richtig?
Qubyte
Zum Zeitpunkt der Kompilierung ist nichts verknüpft. Je. Die Verknüpfung erfolgt nach dem Kompilieren (auch wenn der Compiler den Linker aufruft). Sie können die Bibliothek dynamisch laden, aber Sie benötigen die Header, um Ihren Code zu kompilieren und in die Bibliothek aufzurufen. Wenn dies Ihre Frage nicht beantwortet, erklären Sie bitte, was Sie tun möchten.
Jed Brown
Du hast natürlich recht. Blöder Fehler, aber du wusstest was ich meinte. Meine Frage hätte besser lauten können: "Verlinke ich zu diesen Bibliotheken?" Im Gegensatz zum Kompilieren der Bits benötige ich zur gleichen Zeit meinen eigenen Code, wie es bei Boost der Fall ist. Mir ist bewusst, dass das Aufrufen von Funktionen aus einer Bibliothek Header erfordert. Ich mache das schon seit einiger Zeit.
Qubyte
Ja, Sie kompilieren PETSc unabhängig von Ihrer Anwendung. Es ist nicht nur wie Boost Header.
Jed Brown
1

Wenn das System nicht kompliziert ist, können Sie auch einfach von einer komplexen Notation zu einem Problem mit zwei Unbekannten konvertieren, die den Real- und den Imaginärteil darstellen. Sie können dann einen Standard-ODE-Löser mit realem Wert verwenden.

Wolfgang Bangerth
quelle
Genau das versuche ich zu vermeiden. Tatsächlich sind GSL-Integratoren nur dann real, wenn Speicher zur Verfügung steht. Deshalb mache ich das im Moment.
Qubyte