12#include "algebra/impl/array_operators.hpp"
13#include "detray/algebra/common/math.hpp"
14#include "detray/algebra/concepts.hpp"
15#include "detray/algebra/generic/generic.hpp"
16#include "detray/definitions/detail/qualifiers.hpp"
18namespace detray::algebra::array {
23template <concepts::index index_t,
template <
typename, index_t>
class array_t,
24 concepts::scalar scalar_t, index_t N>
26DETRAY_HOST_DEVICE
constexpr scalar_t phi(
const array_t<scalar_t, N> &v) {
27 return algebra::generic::math::phi(v);
33template <concepts::index index_t,
template <
typename, index_t>
class array_t,
34 concepts::scalar scalar_t, index_t N>
36DETRAY_HOST_DEVICE
constexpr scalar_t perp(
const array_t<scalar_t, N> &v) {
37 return algebra::generic::math::perp(v);
43template <concepts::index index_t,
template <
typename, index_t>
class array_t,
44 concepts::scalar scalar_t, index_t N>
46DETRAY_HOST_DEVICE
constexpr scalar_t theta(
const array_t<scalar_t, N> &v) {
47 return algebra::generic::math::theta(v);
62template <concepts::index index_t,
template <
typename, index_t>
class array_t,
63 concepts::scalar scalar_t, index_t N>
65DETRAY_HOST_DEVICE
constexpr array_t<scalar_t, N> cross(
66 const array_t<scalar_t, N> &a,
const array_t<scalar_t, N> &b) {
67 return algebra::generic::math::cross(a, b);
70template <concepts::index index_t,
template <
typename, index_t>
class array_t,
71 concepts::scalar scalar_t, index_t N>
73DETRAY_HOST_DEVICE
constexpr array_t<scalar_t, N> cross(
74 const array_t<scalar_t, N> &a,
const array_t<array_t<scalar_t, N>, 1> &b) {
75 return algebra::generic::math::cross(a, b);
78template <concepts::index index_t,
template <
typename, index_t>
class array_t,
79 concepts::scalar scalar_t, index_t N>
81DETRAY_HOST_DEVICE
constexpr array_t<scalar_t, N> cross(
82 const array_t<array_t<scalar_t, N>, 1> &a,
const array_t<scalar_t, N> &b) {
83 return algebra::generic::math::cross(a, b);
86template <concepts::index index_t,
template <
typename, index_t>
class array_t,
87 concepts::scalar scalar_t, index_t N>
89DETRAY_HOST_DEVICE
constexpr array_t<scalar_t, N> cross(
90 const array_t<array_t<scalar_t, N>, 1> &a,
91 const array_t<array_t<scalar_t, N>, 1> &b) {
92 return algebra::generic::math::cross(a, b);
103template <concepts::index index_t,
template <
typename, index_t>
class array_t,
104 concepts::scalar scalar_t, index_t N>
105DETRAY_HOST_DEVICE
constexpr scalar_t dot(
const array_t<scalar_t, N> &a,
106 const array_t<scalar_t, N> &b) {
107 array_t<scalar_t, N> tmp{};
108 for (index_t i = 0; i < N; i++) {
109 tmp[i] = a[i] * b[i];
112 for (index_t i = 0; i < N; i++) {
118template <concepts::index index_t,
template <
typename, index_t>
class array_t,
119 concepts::scalar scalar_t, index_t N>
120DETRAY_HOST_DEVICE
constexpr scalar_t dot(
121 const array_t<scalar_t, N> &a,
const array_t<array_t<scalar_t, N>, 1> &b) {
122 array_t<scalar_t, N> tmp{};
123 for (index_t i = 0; i < N; i++) {
124 tmp[i] = a[i] * b[0][i];
127 for (index_t i = 0; i < N; i++) {
133template <concepts::index index_t,
template <
typename, index_t>
class array_t,
134 concepts::scalar scalar_t, index_t N>
135DETRAY_HOST_DEVICE
constexpr scalar_t dot(
136 const array_t<array_t<scalar_t, N>, 1> &a,
const array_t<scalar_t, N> &b) {
137 array_t<scalar_t, N> tmp{};
138 for (index_t i = 0; i < N; i++) {
139 tmp[i] = a[0][i] * b[i];
142 for (index_t i = 0; i < N; i++) {
148template <concepts::index index_t,
template <
typename, index_t>
class array_t,
149 concepts::scalar scalar_t, index_t N>
150DETRAY_HOST_DEVICE
constexpr scalar_t dot(
151 const array_t<array_t<scalar_t, N>, 1> &a,
152 const array_t<array_t<scalar_t, N>, 1> &b) {
153 array_t<scalar_t, N> tmp{};
154 for (index_t i = 0; i < N; i++) {
155 tmp[i] = a[0][i] * b[0][i];
158 for (index_t i = 0; i < N; i++) {
168template <concepts::index index_t,
template <
typename, index_t>
class array_t,
169 concepts::scalar scalar_t, index_t N>
171DETRAY_HOST_DEVICE
constexpr scalar_t norm(
const array_t<scalar_t, N> &v) {
179template <concepts::index index_t,
template <
typename, index_t>
class array_t,
180 concepts::scalar scalar_t, index_t N>
182DETRAY_HOST_DEVICE
constexpr scalar_t eta(
183 const array_t<scalar_t, N> &v)
noexcept {
184 return algebra::math::atanh(v[2] / norm(v));
190template <concepts::index index_t,
template <
typename, index_t>
class array_t,
191 concepts::scalar scalar_t, index_t N>
192DETRAY_HOST_DEVICE
constexpr array_t<scalar_t, N> normalize(
193 const array_t<scalar_t, N> &v) {
194 return (
static_cast<scalar_t
>(1.) / norm(v)) * v;
constexpr decltype(auto) sqrt(T &&vec)
Definition vc_soa_math.hpp:78