File indexing completed on 2026-05-27 07:24:14
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011
0012 #include "detray/definitions/detail/qualifiers.hpp"
0013
0014
0015 #include "detray/test/device/device_fixture.hpp"
0016 #include "detray/test/framework/types.hpp"
0017
0018
0019 #include <vecmem/containers/data/vector_view.hpp>
0020 #include <vecmem/containers/device_vector.hpp>
0021 #include <vecmem/containers/vector.hpp>
0022 #include <vecmem/memory/memory_resource.hpp>
0023
0024
0025 #include <gtest/gtest.h>
0026
0027
0028 #include <cmath>
0029 #include <memory>
0030
0031 namespace detray::test {
0032
0033
0034 template <detray::concepts::algebra A>
0035 class vector_fixture : public device_fixture<dscalar<A>> {
0036 using scalar_t = dscalar<A>;
0037 using point2_t = dpoint2D<A>;
0038 using vector3_t = dvector3D<A>;
0039
0040 using result_t = scalar_t;
0041 using base_fixture = device_fixture<result_t>;
0042
0043 public:
0044
0045 vector_fixture(vecmem::memory_resource& mr) : base_fixture(mr) {}
0046
0047 protected:
0048
0049 virtual void SetUp() override {
0050
0051 base_fixture::SetUp();
0052
0053
0054 m_p1 = std::make_unique<vecmem::vector<point2_t>>(this->size(),
0055 &this->resource());
0056 m_p2 = std::make_unique<vecmem::vector<point2_t>>(this->size(),
0057 &this->resource());
0058
0059 m_v1 = std::make_unique<vecmem::vector<vector3_t>>(this->size(),
0060 &this->resource());
0061 m_v2 = std::make_unique<vecmem::vector<vector3_t>>(this->size(),
0062 &this->resource());
0063
0064
0065 for (std::size_t i = 0; i < this->size(); ++i) {
0066 m_p1->at(i) = {static_cast<scalar_t>(i * 0.5),
0067 static_cast<scalar_t>((i + 1) * 1.0)};
0068 m_p2->at(i) = {static_cast<scalar_t>((i + 2) * 1.2),
0069 static_cast<scalar_t>(i * 0.6)};
0070
0071 m_v1->at(i) = {static_cast<scalar_t>(i * 0.6),
0072 static_cast<scalar_t>((i + 1) * 1.2),
0073 static_cast<scalar_t>((i + 2) * 1.3)};
0074 m_v2->at(i) = {static_cast<scalar_t>((i + 1) * 1.8),
0075 static_cast<scalar_t>(i * 2.3),
0076 static_cast<scalar_t>((i + 2) * 3.4)};
0077 }
0078 }
0079
0080
0081 virtual void TearDown() override {
0082
0083 m_p1.reset();
0084 m_p2.reset();
0085 m_v1.reset();
0086 m_v2.reset();
0087
0088
0089 base_fixture::TearDown();
0090 }
0091
0092
0093
0094
0095 std::unique_ptr<vecmem::vector<point2_t>> m_p1, m_p2;
0096 std::unique_ptr<vecmem::vector<vector3_t>> m_v1, m_v2;
0097
0098
0099
0100 };
0101
0102
0103 template <detray::concepts::algebra A>
0104 class vector_2d_ops_functor {
0105 using scalar_t = dscalar<A>;
0106 using point2_t = dpoint2D<A>;
0107
0108 public:
0109 DETRAY_HOST_DEVICE void operator()(
0110 std::size_t i, vecmem::data::vector_view<const point2_t> a,
0111 vecmem::data::vector_view<const point2_t> b,
0112 vecmem::data::vector_view<scalar_t> output) const {
0113
0114 vecmem::device_vector<const point2_t> vec_a(a), vec_b(b);
0115 vecmem::device_vector<scalar_t> vec_output(output);
0116
0117
0118 auto ii = static_cast<typename decltype(vec_output)::size_type>(i);
0119 vec_output[ii] = vector_2d_ops(vec_a[ii], vec_b[ii]);
0120 }
0121
0122 private:
0123
0124 DETRAY_HOST_DEVICE
0125 scalar_t vector_2d_ops(point2_t a, point2_t b) const {
0126 point2_t c = a + b;
0127 point2_t c2 = c * 2.0;
0128
0129 scalar_t phi = detray::vector::phi(c2);
0130 scalar_t perp = detray::vector::perp(c2);
0131 scalar_t norm1 = detray::vector::norm(c2);
0132
0133 scalar_t dot = detray::vector::dot(a, b);
0134 point2_t norm2 = detray::vector::normalize(c);
0135 scalar_t norm3 = detray::vector::norm(norm2);
0136
0137 return (phi + perp + norm1 + dot + norm3);
0138 }
0139 };
0140
0141
0142 template <detray::concepts::algebra A>
0143 class vector_3d_ops_functor {
0144 using scalar_t = dscalar<A>;
0145 using vector3_t = dvector3D<A>;
0146
0147 public:
0148 DETRAY_HOST_DEVICE void operator()(
0149 std::size_t i, vecmem::data::vector_view<const vector3_t> a,
0150 vecmem::data::vector_view<const vector3_t> b,
0151 vecmem::data::vector_view<scalar_t> output) const {
0152
0153 vecmem::device_vector<const vector3_t> vec_a(a), vec_b(b);
0154 vecmem::device_vector<scalar_t> vec_output(output);
0155
0156
0157 auto ii = static_cast<typename decltype(vec_output)::size_type>(i);
0158 vec_output[ii] = vector_3d_ops(vec_a[ii], vec_b[ii]);
0159 }
0160
0161 private:
0162
0163 DETRAY_HOST_DEVICE
0164 scalar_t vector_3d_ops(vector3_t a, vector3_t b) const {
0165 vector3_t c = a + b;
0166 vector3_t c2 = c * 2.0;
0167
0168 scalar_t phi = detray::vector::phi(c2);
0169 scalar_t perp = detray::vector::perp(c2);
0170 scalar_t norm1 = detray::vector::norm(c2);
0171
0172 vector3_t d = detray::vector::cross(a, b);
0173
0174 scalar_t dot = detray::vector::dot(a, d);
0175 vector3_t norm2 = detray::vector::normalize(c);
0176 scalar_t norm3 = detray::vector::norm(norm2);
0177
0178 return (phi + perp + norm1 + dot + norm3);
0179 }
0180 };
0181
0182 }