12#include "detray/algebra/common/math.hpp"
13#include "detray/algebra/concepts.hpp"
14#include "detray/definitions/detail/qualifiers.hpp"
18#pragma warning(disable : 4244 4701 4702)
20#include <Fastor/Fastor.h>
22#pragma warning(default : 4244 4701 4702)
25namespace detray::algebra::fastor::math {
33template <
typename Derived, auto N>
34DETRAY_HOST_DEVICE
constexpr auto phi(
35 const Fastor::AbstractTensor<Derived, N> &a) {
37 auto v = Fastor::evaluate(a);
44 return algebra::math::atan2(v[1], v[0]);
51template <
typename Derived, auto N>
52DETRAY_HOST
constexpr auto theta(
53 const Fastor::AbstractTensor<Derived, N> &a)
noexcept {
55 auto v = Fastor::evaluate(a);
62 return algebra::math::atan2(Fastor::norm(v(Fastor::fseq<0, 2>())), v[2]);
69template <
typename Derived, auto N>
70DETRAY_HOST
constexpr auto perp(
71 const Fastor::AbstractTensor<Derived, N> &a)
noexcept {
76 auto v = Fastor::evaluate(a);
81 Fastor::inner(v(Fastor::fseq<0, 2>()), v(Fastor::fseq<0, 2>())));
88template <
typename Derived, auto N>
89DETRAY_HOST
constexpr auto norm(
const Fastor::AbstractTensor<Derived, N> &v) {
90 return Fastor::norm(v);
98template <
typename Derived, auto N>
99DETRAY_HOST
constexpr auto eta(
100 const Fastor::AbstractTensor<Derived, N> &a)
noexcept {
101 auto v = Fastor::evaluate(a);
105 return algebra::math::atanh(v[2] / Fastor::norm(v));
111template <
typename Derived, auto N>
112DETRAY_HOST
constexpr auto normalize(
113 const Fastor::AbstractTensor<Derived, N> &v) {
114 return v / Fastor::norm(v);
123template <
typename Derived0, auto N0,
typename Derived1, auto N1>
124DETRAY_HOST
constexpr auto dot(
const Fastor::AbstractTensor<Derived0, N0> &a,
125 const Fastor::AbstractTensor<Derived1, N1> &b) {
126 return Fastor::inner(a, b);
135template <concepts::scalar scalar_t, auto N>
136DETRAY_HOST_DEVICE
constexpr scalar_t dot(
137 const Fastor::Tensor<scalar_t, N> &a,
138 const Fastor::Tensor<scalar_t, N> &b) {
139 return Fastor::inner(a, b);
148template <concepts::scalar scalar_t, auto N>
149DETRAY_HOST
constexpr scalar_t dot(
const Fastor::Tensor<scalar_t, N> &a,
150 const Fastor::Tensor<scalar_t, N, 1> &b) {
154 return Fastor::inner(a,
155 Fastor::Tensor<scalar_t, N>(b(Fastor::fseq<0, N>(), 0)));
164template <concepts::scalar scalar_t, auto N>
165DETRAY_HOST
constexpr scalar_t dot(
const Fastor::Tensor<scalar_t, N, 1> &a,
166 const Fastor::Tensor<scalar_t, N> &b) {
167 return Fastor::inner(Fastor::Tensor<scalar_t, N>(a(Fastor::fseq<0, N>(), 0)),
177template <concepts::scalar scalar_t, auto N>
178DETRAY_HOST
constexpr scalar_t dot(
const Fastor::Tensor<scalar_t, N, 1> &a,
179 const Fastor::Tensor<scalar_t, N, 1> &b) {
180 return Fastor::inner(Fastor::Tensor<scalar_t, N>(a(Fastor::fseq<0, 3>(), 0)),
181 Fastor::Tensor<scalar_t, N>(b(Fastor::fseq<0, 3>(), 0)));
190template <
typename Derived0, auto N0,
typename Derived1, auto N1>
191DETRAY_HOST
constexpr auto cross(
192 const Fastor::AbstractTensor<Derived0, N0> &a,
193 const Fastor::AbstractTensor<Derived1, N1> &b) {
194 return Fastor::cross(a, b);
203template <concepts::scalar scalar_t>
204DETRAY_HOST
constexpr auto cross(
const Fastor::Tensor<scalar_t, 3> &a,
205 const Fastor::Tensor<scalar_t, 3> &b) {
206 return Fastor::cross(a, b);
215template <concepts::scalar scalar_t>
216DETRAY_HOST
constexpr auto cross(
const Fastor::Tensor<scalar_t, 3> &a,
217 const Fastor::Tensor<scalar_t, 3, 1> &b) {
221 return Fastor::cross(a,
222 Fastor::Tensor<scalar_t, 3>(b(Fastor::fseq<0, 3>(), 0)));
231template <concepts::scalar scalar_t>
232DETRAY_HOST
constexpr auto cross(
const Fastor::Tensor<scalar_t, 3, 1> &a,
233 const Fastor::Tensor<scalar_t, 3> &b) {
234 return Fastor::cross(Fastor::Tensor<scalar_t, 3>(a(Fastor::fseq<0, 3>(), 0)),
244template <concepts::scalar scalar_t>
245DETRAY_HOST
constexpr auto cross(
const Fastor::Tensor<scalar_t, 3, 1> &a,
246 const Fastor::Tensor<scalar_t, 3, 1> &b) {
247 return Fastor::cross(Fastor::Tensor<scalar_t, 3>(a(Fastor::fseq<0, 3>(), 0)),
248 Fastor::Tensor<scalar_t, 3>(b(Fastor::fseq<0, 3>(), 0)));
constexpr decltype(auto) sqrt(T &&vec)
Definition vc_soa_math.hpp:78