12#include "algebra/impl/vc_soa_math.hpp"
13#include "detray/algebra/common/vector.hpp"
14#include "detray/algebra/concepts.hpp"
15#include "detray/definitions/detail/qualifiers.hpp"
19#pragma warning(push, 0)
26namespace detray::algebra::vc_soa::math {
35template <std::size_t N, concepts::value value_t,
36 template <
typename, std::
size_t>
class array_t>
38DETRAY_HOST_DEVICE
constexpr auto phi(
39 const algebra::storage::vector<N, Vc::Vector<value_t>, array_t> &v) {
40 return Vc::atan2(v[1], v[0]);
50template <std::size_t N, concepts::value value_t,
51 template <
typename, std::
size_t>
class array_t>
53DETRAY_HOST_DEVICE
constexpr auto perp(
54 const algebra::storage::vector<N, Vc::Vector<value_t>, array_t> &v) {
55 return Vc::sqrt(Vc::fma(v[0], v[0], v[1] * v[1]));
65template <std::size_t N, concepts::value value_t,
66 template <
typename, std::
size_t>
class array_t>
68DETRAY_HOST_DEVICE
constexpr auto theta(
69 const algebra::storage::vector<N, Vc::Vector<value_t>, array_t> &v) {
70 return Vc::atan2(perp(v), v[2]);
83template <std::size_t N, concepts::value value_t,
84 template <
typename, std::
size_t>
class array_t>
86DETRAY_HOST_DEVICE
constexpr algebra::storage::vector<N, Vc::Vector<value_t>,
88cross(
const algebra::storage::vector<N, Vc::Vector<value_t>, array_t> &a,
89 const algebra::storage::vector<N, Vc::Vector<value_t>, array_t> &b) {
90 return {Vc::fma(a[1], b[2], -b[1] * a[2]), Vc::fma(a[2], b[0], -b[2] * a[0]),
91 Vc::fma(a[0], b[1], -b[0] * a[1])};
104template <std::size_t N, concepts::value value_t,
105 template <
typename, std::
size_t>
class array_t>
106DETRAY_HOST_DEVICE
constexpr Vc::Vector<value_t> dot(
107 const algebra::storage::vector<N, Vc::Vector<value_t>, array_t> &a,
108 const algebra::storage::vector<N, Vc::Vector<value_t>, array_t> &b) {
109 auto ret = a[0] * b[0];
111 for (
unsigned int i{1u}; i < N; i++) {
112 ret = Vc::fma(a[i], b[i], ret);
125template <std::size_t N, concepts::value value_t,
126 template <
typename, std::
size_t>
class array_t>
127DETRAY_HOST_DEVICE
constexpr auto norm(
128 const algebra::storage::vector<N, Vc::Vector<value_t>, array_t> &v) {
129 return Vc::sqrt(dot(v, v));
139template <std::size_t N, concepts::value value_t,
140 template <
typename, std::
size_t>
class array_t>
141DETRAY_HOST_DEVICE
constexpr algebra::storage::vector<N, Vc::Vector<value_t>,
143normalize(
const algebra::storage::vector<N, Vc::Vector<value_t>, array_t> &v) {
144 return (Vc::Vector<value_t>::One() / norm(v)) * v;
161template <std::size_t N, concepts::value value_t,
162 template <
typename, std::
size_t>
class array_t>
164DETRAY_HOST_DEVICE
constexpr auto eta(
165 const algebra::storage::vector<N, Vc::Vector<value_t>, array_t> &v) {
167 auto atanh_func = [](value_t
e) {
return std::atanh(e); };
169 return (v[2] / norm(v)).apply(atanh_func);
187template <std::size_t N, concepts::value value_t,
188 template <
typename, std::
size_t>
class array_t>
189DETRAY_HOST_DEVICE
constexpr Vc::Vector<value_t> sum(
190 const algebra::storage::vector<N, Vc::Vector<value_t>, array_t> &v) {
191 Vc::Vector<value_t> res{v[0]};
193 for (std::size_t i = 1u; i < Vc::Vector<value_t>::size(); ++i) {
constexpr double e
Charge, native unit e (elementary charge).
Definition Units.hpp:165