12#include "detray/algebra/common/math.hpp"
13#include "detray/algebra/concepts.hpp"
14#include "detray/algebra/type_traits.hpp"
15#include "detray/definitions/detail/qualifiers.hpp"
17namespace detray::algebra::generic::math {
22template <concepts::vector vector_t>
23DETRAY_HOST_DEVICE
constexpr detray::traits::scalar_t<vector_t> phi(
24 const vector_t &v)
noexcept {
25 using element_getter_t = detray::traits::element_getter_t<vector_t>;
27 return algebra::math::atan2(element_getter_t{}(v, 1),
28 element_getter_t{}(v, 0));
34template <concepts::vector vector_t>
35DETRAY_HOST_DEVICE
constexpr detray::traits::scalar_t<vector_t> perp(
36 const vector_t &v)
noexcept {
37 using element_getter_t = detray::traits::element_getter_t<vector_t>;
41 element_getter_t{}(v, 1) * element_getter_t{}(v, 1)));
47template <concepts::vector vector_t>
48DETRAY_HOST_DEVICE
constexpr detray::traits::scalar_t<vector_t> theta(
49 const vector_t &v)
noexcept {
50 using element_getter_t = detray::traits::element_getter_t<vector_t>;
52 return algebra::math::atan2(perp(v), element_getter_t{}(v, 2));
64template <
typename vector1_t,
typename vector2_t>
66 (concepts::vector3D<vector1_t> || concepts::column_matrix3D<vector1_t>) &&
67 (concepts::vector3D<vector2_t> || concepts::column_matrix3D<vector2_t>))
68DETRAY_HOST_DEVICE
constexpr detray::traits::vector_t<vector1_t> cross(
69 const vector1_t &a,
const vector2_t &b) {
70 using element_getter_t = detray::traits::element_getter_t<vector1_t>;
74 -element_getter_t{}(b, 1) * element_getter_t{}(a, 2)),
76 -element_getter_t{}(b, 2) * element_getter_t{}(a, 0)),
78 -element_getter_t{}(b, 0) * element_getter_t{}(a, 1))};
90template <
typename vector1_t,
typename vector2_t>
91 requires((concepts::vector<vector1_t> ||
92 concepts::column_matrix<vector1_t>) &&
93 (concepts::vector<vector2_t> || concepts::column_matrix<vector2_t>))
94DETRAY_HOST_DEVICE
constexpr detray::traits::scalar_t<vector1_t> dot(
95 const vector1_t &a,
const vector2_t &b) {
96 using scalar_t = detray::traits::scalar_t<vector1_t>;
97 using index_t = detray::traits::index_t<vector1_t>;
98 using element_getter_t = detray::traits::element_getter_t<vector1_t>;
100 scalar_t ret{element_getter_t{}(a, 0) * element_getter_t{}(b, 0)};
102 for (index_t i = 1; i < detray::traits::size<vector1_t>; i++) {
103 ret = std::fma(element_getter_t{}(a, i), element_getter_t{}(b, i), ret);
112template <concepts::vector vector_t>
113DETRAY_HOST_DEVICE
constexpr detray::traits::scalar_t<vector_t> norm(
122template <concepts::vector vector_t>
123DETRAY_HOST_DEVICE
constexpr detray::traits::scalar_t<vector_t> eta(
124 const vector_t &v)
noexcept {
125 using element_getter_t = detray::traits::element_getter_t<vector_t>;
127 return algebra::math::atanh(element_getter_t{}(v, 2) / norm(v));
137template <concepts::vector vector_t>
138DETRAY_HOST_DEVICE
constexpr vector_t normalize(
const vector_t &v) {
139 using scalar_t = detray::traits::scalar_t<vector_t>;
141 return v *
static_cast<scalar_t
>(1.) / norm(v);
constexpr decltype(auto) sqrt(T &&vec)
Definition vc_soa_math.hpp:78
constexpr decltype(auto) fma(T &&x, T &&y, T &&z)
Evaluate the fused multiply-add x * y + z lane by lane.
Definition vc_soa_math.hpp:168