Ich bin neu im wissenschaftlichen Rechnen. Ich suche eine Fortran (vorzugsweise f90) Implementierung eines Octree.
Mein Problem erfordert einen Octree, der meine Domäne teilt, bis nicht mehr als einige N Partikel (oder Quellen, bei denen ich den Dichtewert kenne, der in eine Integralgleichungsmethode eingefügt werden kann, um eine Gleichung wie die Laplace-Gleichung zu lösen) in einem beliebigen Feld vorhanden sind.
Ich konnte nur diese C ++ - Implementierung finden . Ich möchte wissen, ob es bereits Fortran-Bibliotheken gibt, die ich verwenden kann.
Außerdem werden gute Papierempfehlungen zu Octree-Implementierungen in Fortran geschätzt, die verwendet werden können, damit das Anwenden schneller Integralgleichungsmethoden auf die Berechnungsbox einfach wird.
quelle
Antworten:
Ich habe keine Erfahrung mit Octrees, aber wenn es eine nette C ++ - Bibliothek gibt, die ich in Fortran verwenden möchte, schreibe ich einfach einen einfachen C-Treiber - normalerweise ein paar C-Funktionen, die genau das tun, was ich brauche. Dann rufe ich sie von Fortran aus mit dem Modul iso_c_binding auf. Dies hat den großen Vorteil, dass Sie eine gut getestete Bibliothek mit einer Community um sie herum wiederverwenden.
Für Informationen zur Verwendung von iso_c_binding habe ich hier einige Informationen geschrieben:
http://fortran90.org/src/best-practices.html#interfacing-with-c
Diese spezielle Information dient dazu, Fortran von C aus anzurufen. Ich kann sehen, dass ich sie aktualisieren sollte. Hier ist mein Code, in dem ich die C ++ - Bibliothek von Fortran aus aufrufe, der erste Link ist der einfache C-Treiber, der zweite Link ist eine Fortran-Schnittstelle, und dann rufe ich ihn einfach wie jede andere Fortran-Subroutine auf:
https://github.com/certik/hfsolver/blob/master/src/qc_libint.cpp
https://github.com/certik/hfsolver/blob/master/src/qc.f90
quelle
Sie scheinen sehr darauf eingestellt zu sein, Fortran zu verwenden. Octrees sind, wenn sie effizient implementiert werden, ziemlich komplexe Datenstrukturen und eignen sich daher besser für Programmiersprachen, die dies besser unterstützen, wie z. B. C / C ++. Es gibt eine Reihe von Implementierungen von sehr hoher Qualität in C / C ++, die Sie verwenden können.
quelle
std::map
,std::multimap
,std::vector
,std::sort
, und so weiter und so weiter, die alle allgemein verfügbar , unabhängig von dem zugrunde liegenden Datentyp gespeichert werden. Es gibt kein Argument dafür, dass Sie all dies auch heute in Fortran tun können, aber es erfordert Tage und Wochen Arbeit, die Sie produktiv nutzen können, um tatsächlich an Ihrer Anwendung zu arbeiten, anstatt an den zugrunde liegenden Datenstrukturen.