12#include "algebra/impl/vc_aos_types.hpp"
13#include "detray/algebra/common/math.hpp"
14#include "detray/algebra/common/vector.hpp"
15#include "detray/algebra/concepts.hpp"
16#include "detray/definitions/detail/qualifiers.hpp"
20#pragma warning(push, 0)
31namespace detray::algebra::vc_aos::math {
34template <detray::concepts::vc_aos_vector vector_t>
35DETRAY_HOST_DEVICE
constexpr auto phi(
const vector_t &v) {
36 return algebra::math::atan2(v[1], v[0]);
40template <detray::concepts::vc_aos_vector vector_t>
41DETRAY_HOST_DEVICE
constexpr auto perp(
const vector_t &v) {
46template <detray::concepts::vc_aos_vector vector_t>
47DETRAY_HOST_DEVICE
constexpr auto theta(
const vector_t &v) {
48 return algebra::math::atan2(perp(v), v[2]);
59template <detray::concepts::vc_aos_vector vector_t1,
60 detray::concepts::vc_aos_vector vector_t2>
61DETRAY_HOST_DEVICE
constexpr auto dot(
const vector_t1 &a,
const vector_t2 &b) {
68template <detray::concepts::vc_aos_vector vector_t>
69DETRAY_HOST_DEVICE
constexpr auto norm(
const vector_t &v) {
78template <detray::concepts::vc_aos_vector vector_t>
79DETRAY_HOST_DEVICE
constexpr auto normalize(
const vector_t &v) {
87template <detray::concepts::vc_aos_vector vector_t>
88DETRAY_HOST_DEVICE
constexpr auto eta(
const vector_t &v)
noexcept {
89 return algebra::math::atanh(v[2] / norm(v));
100template <detray::concepts::vc_aos_vector vector_t1,
101 detray::concepts::vc_aos_vector vector_t2>
102 requires(std::same_as<detray::traits::value_t<vector_t1>,
float> &&
103 std::same_as<detray::traits::value_t<vector_t2>,
float>)
104DETRAY_HOST_DEVICE
constexpr auto cross(
const vector_t1 &a,
const vector_t2 &b)
105 ->
decltype(a * b - b * a) {
106 using T = detray::traits::value_t<vector_t1>;
107 using simd_array_t = Vc::SimdArray<T, 4>;
110 const typename simd_array_t::mask_type
m{simd_array_t::IndexesFromZero() > 1};
114 simd_array_t a_rot =
static_cast<simd_array_t
>(a).rotated(1);
116 a_rot(m) = a_rot.rotated(1);
119 simd_array_t b_rot =
static_cast<simd_array_t
>(b).rotated(1);
120 b_rot(m) = b_rot.rotated(1);
122 simd_array_t res = a_rot * b_rot.rotated(1) - a_rot.rotated(1) * b_rot;
137template <detray::concepts::vc_aos_vector vector_t1,
138 detray::concepts::vc_aos_vector vector_t2>
139 requires(std::same_as<detray::traits::value_t<vector_t1>,
double> ||
140 std::same_as<detray::traits::value_t<vector_t2>,
double>)
141DETRAY_HOST_DEVICE
constexpr auto cross(
const vector_t1 &a,
const vector_t2 &b)
142 ->
decltype(a * b - b * a) {
155template <detray::concepts::vc_aos_vector vector_t>
156DETRAY_HOST_DEVICE
constexpr auto sum(
const vector_t &v) {
157 return v.get().sum();
constexpr double m
Meter.
Definition Units.hpp:97
constexpr double T
Magnetic field, native unit (eV*s)/(e*m²).
Definition Units.hpp:168
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