Sorry für eine ziemlich lange Antwort, aber ich hatte das Gefühl, dass eine Art Klärung hilfreich wäre:
Im Allgemeinen gibt es zwei Möglichkeiten, Arten in Odein zu spezialisieren.
Eine Möglichkeit ist spezialisiert algebras die Anpassung gedacht werden, um, wie man iteriert über einen Behälter oder eine Sammlung, wie ein std::vector
, std::array
, ublas::matrix
usw. odeint einige vordefinierte Algebra existiert:
range_algebra
, die mit Arbeiten alle Behälter einer Reihe von Konzept boost.range
fusion_algebra
zur Kompilierzeit-Sequenzen
vector_space_algebra
erfüllen, die die Iteration auf die Operationen steuert.
thrust_algebra
für die Verwendung mit Schub - ein STL-ähnlichen Rahmen für CUDA
Die zweite Möglichkeit für spezielle Typen sind die Operationen anzupassen, die Sie gedacht, damit festlegen, wie die grundlegenden Operationen auf den Elementen durchzuführen des Behälters. Hier gibt es einige vordefinierte Operationen
default_operations
die Arbeit auf den meisten Typen wie double
, float
, std::complex<>
, ... default_operations
nur annehmen, dass die Operatoren +, -, *,/sind sowie die Grundfunktionen definiert wie abs
, max
.
thrust_operation
für den Einsatz mit Druck
Wenn ich verstehe Ihre Frage richtig, Sie haben einen oder mehrere Typen für die Punkte mit in verschiedenen Koordinatensystemen leben können und deshalb die Betreiber auf diese Art mit der Arbeit zu übernehmen ist Odeint. In diesem Fall können Sie die range_algebra
in Kombination mit den 'default_operations' verwenden: Sagen Sie, Ihr Typ heißt point_type
und besteht im Wesentlichen aus Doppelpunkten, dem Haupt-Gleitkommatyp.Um den 'default_operations' zu arbeiten müssen Sie
point_type operator+(point_type , double);
point_type operator+(double , point_type);
point_type operator+(point_type , point_type);
point_type operator*(point_type , double);
point_type operator*(double , point_type);
point_type operator/(point_type , double);
double abs(point_type);
Ich denke, das ist alles was benötigt wird. Dann sollten Sie in der Lage sein, Ihre POINT_TYPE in Behältern zu verwenden, wie vector
, array
, etc. Es ist auch ein Beispiel in odeint, das zeigt, wie spezielle Punkttypen anpassen: solar system mit point types. Es ist ziemlich einfach, wenn Sie die Boost.Operators-Bibliothek verwenden.
Edit: einige Fehler behoben.
Ich verstehe nicht vollständig. Wenn Sie eine Koordinatentransformation durchführen wollen, brauchen Sie keine neuen Typen, da die Gleichungen transformiert werden. Ist Ihre Frage eine: "Mit Odeint möchte ich meinen eigenen Zustandstyp verwenden. Was ist die minimale Menge von Operationen, die mein Zustandstyp unterstützen muss?" –
@ AndréBergner, ja, du hast Recht. –