GPU-Fähige Geometrie-Transformation
Die Geometrie-Transformation aus #40 (closed) verwendet noch die default Storage für die Koordinaten, ein std::vector
. Das ist nicht GPU-kompatibel. Die Storage kann umgestellt werden, indem man die Traits-Klasse für die Dune::MultiLinearGeometry
anpasst.
Es sollte ausreichen von der default Traits-Klasse Dune::MultiLinearGeometryTraits
abzuleiten, und in der abgeleiteten Klasse den member-Typ CornerStorage
umzudefinieren, so daß dessen member-Typ Type
ein std::array
mit passendem Element-Typ ist. Die größe des arrays darf dabei hardcodiert werden, entweder fest auf 4 für Quadrilaterals, oder wenn ihr dimensionsunabhängig sein wollt auf 2<<dim
.
Unit test
Ich würde kurzes main()
vorschlagen, das die Eckenkoordinaten des Einheitsquadrats ein einem std::array
ablegt. Das sollte dann einen PACXX-kernel mit einem thread aufrufen und die koordinaten by-value übergeben (z.B. als by-value Lambda-Capture). Im Kernel sollte eine Geometrie mit diesen Koordinaten angelegt werden. Von der Geometrie sollte das Volumen (a.k.a. Fläche in 2D) abgefragt werden, dafür gibt es die Methode .volume()
. Das Ergebnis sollte 1.0 sein.
bei dem Vergleich kann es zu numerischer Ungenauigkeit kommen, i.e. der test geo.volume() == 1.0
ist unpraktikabel. Heuristisch funktioniert ein test wie der folgende ganz OK:
using std::abs;
using std::sqrt;
auto tolerance = sqrt(std::numeric_limits<double>::epsilon())*8;
return abs(geo.volume() - 1.0) < tolerance;
(vorausgesetzt man verwendet double
als koordinatentyp)
Blocked by: