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: