12#include "detray/algebra/concepts.hpp"
13#include "detray/definitions/detail/qualifiers.hpp"
19namespace detray::algebra::array {
24template <
template <
typename, std::
size_t>
class array_t,
25 concepts::scalar scalar1_t, concepts::scalar scalar2_t>
26DETRAY_HOST_DEVICE
constexpr array_t<scalar1_t, 2>
operator*(
27 const array_t<scalar1_t, 2> &a, scalar2_t s) {
28 return {a[0] *
static_cast<scalar1_t
>(s), a[1] *
static_cast<scalar1_t
>(s)};
31template <
template <
typename, std::
size_t>
class array_t,
32 concepts::scalar scalar1_t, concepts::scalar scalar2_t>
33DETRAY_HOST_DEVICE
constexpr array_t<scalar1_t, 2> operator*(
34 scalar2_t s,
const array_t<scalar1_t, 2> &a) {
35 return {
static_cast<scalar1_t
>(s) * a[0],
static_cast<scalar1_t
>(s) * a[1]};
38template <
template <
typename, std::
size_t>
class array_t,
39 concepts::scalar scalar_t>
40DETRAY_HOST_DEVICE
constexpr array_t<scalar_t, 2>
operator-(
41 const array_t<scalar_t, 2> &a,
const array_t<scalar_t, 2> &b) {
42 return {a[0] - b[0], a[1] - b[1]};
45template <
template <
typename, std::
size_t>
class array_t,
46 concepts::scalar scalar_t>
47DETRAY_HOST_DEVICE
constexpr array_t<scalar_t, 2>
operator+(
48 const array_t<scalar_t, 2> &a,
const array_t<scalar_t, 2> &b) {
49 return {a[0] + b[0], a[1] + b[1]};
57template <
template <
typename, std::
size_t>
class array_t,
58 concepts::scalar scalar1_t, concepts::scalar scalar2_t>
59DETRAY_HOST_DEVICE
constexpr array_t<scalar1_t, 3> operator*(
60 const array_t<scalar1_t, 3> &a, scalar2_t s) {
61 return {a[0] *
static_cast<scalar1_t
>(s), a[1] *
static_cast<scalar1_t
>(s),
62 a[2] *
static_cast<scalar1_t
>(s)};
65template <
template <
typename, std::
size_t>
class array_t,
66 concepts::scalar scalar1_t, concepts::scalar scalar2_t>
67DETRAY_HOST_DEVICE
constexpr array_t<scalar1_t, 3> operator*(
68 scalar2_t s,
const array_t<scalar1_t, 3> &a) {
69 return {
static_cast<scalar1_t
>(
s) * a[0],
static_cast<scalar1_t
>(s) * a[1],
70 static_cast<scalar1_t
>(
s) * a[2]};
73template <
template <
typename, std::
size_t>
class array_t,
74 concepts::scalar scalar_t>
75DETRAY_HOST_DEVICE
constexpr array_t<scalar_t, 3> operator-(
76 const array_t<scalar_t, 3> &a,
const array_t<scalar_t, 3> &b) {
77 return {a[0] - b[0], a[1] - b[1], a[2] - b[2]};
80template <
template <
typename, std::
size_t>
class array_t,
81 concepts::scalar scalar_t>
82DETRAY_HOST_DEVICE
constexpr array_t<scalar_t, 3> operator+(
83 const array_t<scalar_t, 3> &a,
const array_t<scalar_t, 3> &b) {
84 return {a[0] + b[0], a[1] + b[1], a[2] + b[2]};
92template <
typename index_t,
template <
typename, index_t>
class array_t,
93 concepts::scalar scalar1_t, concepts::scalar scalar2_t, index_t ROWS,
95DETRAY_HOST_DEVICE
constexpr array_t<array_t<scalar1_t, ROWS>, COLS> operator*(
96 const array_t<array_t<scalar1_t, ROWS>, COLS> &a, scalar2_t s) {
97 array_t<array_t<scalar1_t, ROWS>, COLS> ret{};
99 for (index_t j = 0; j < COLS; ++j) {
100 for (index_t i = 0; i < ROWS; ++i) {
101 ret[j][i] = a[j][i] *
static_cast<scalar1_t
>(
s);
108template <
typename index_t,
template <
typename, index_t>
class array_t,
109 concepts::scalar scalar1_t, concepts::scalar scalar2_t, index_t ROWS,
111DETRAY_HOST_DEVICE
constexpr array_t<array_t<scalar1_t, ROWS>, COLS> operator*(
112 scalar2_t s,
const array_t<array_t<scalar1_t, ROWS>, COLS> &a) {
113 array_t<array_t<scalar1_t, ROWS>, COLS> ret{};
115 for (index_t j = 0; j < COLS; ++j) {
116 for (index_t i = 0; i < ROWS; ++i) {
117 ret[j][i] = a[j][i] *
static_cast<scalar1_t
>(
s);
124template <
typename index_t,
template <
typename, index_t>
class array_t,
125 concepts::scalar scalar_t, index_t M, index_t N, index_t O>
126DETRAY_HOST_DEVICE
constexpr array_t<array_t<scalar_t, M>, O> operator*(
127 const array_t<array_t<scalar_t, M>, N> &A,
128 const array_t<array_t<scalar_t, N>, O> &B) {
129 array_t<array_t<scalar_t, M>, O> C{};
131 for (index_t j = 0; j < O; ++j) {
132 for (index_t i = 0; i < M; ++i) {
137 for (index_t i = 0; i < N; ++i) {
138 for (index_t j = 0; j < O; ++j) {
139 for (index_t k = 0; k < M; ++k) {
140 C[j][k] += A[i][k] * B[j][i];
148template <
typename index_t,
template <
typename, index_t>
class array_t,
149 concepts::scalar scalar_t, index_t ROWS, index_t COLS>
150DETRAY_HOST_DEVICE
constexpr array_t<array_t<scalar_t, ROWS>, COLS> operator+(
151 const array_t<array_t<scalar_t, ROWS>, COLS> &A,
152 const array_t<array_t<scalar_t, ROWS>, COLS> &B) {
153 array_t<array_t<scalar_t, ROWS>, COLS> C{};
155 for (index_t j = 0; j < COLS; ++j) {
156 for (index_t i = 0; i < ROWS; ++i) {
157 C[j][i] = A[j][i] + B[j][i];
164template <
typename index_t,
template <
typename, index_t>
class array_t,
165 concepts::scalar scalar_t, index_t ROWS, index_t COLS>
166DETRAY_HOST_DEVICE
constexpr array_t<array_t<scalar_t, ROWS>, COLS> operator-(
167 const array_t<array_t<scalar_t, ROWS>, COLS> &A,
168 const array_t<array_t<scalar_t, ROWS>, COLS> &B) {
169 array_t<array_t<scalar_t, ROWS>, COLS> C{};
171 for (index_t j = 0; j < COLS; ++j) {
172 for (index_t i = 0; i < ROWS; ++i) {
173 C[j][i] = A[j][i] - B[j][i];
185template <
typename index_t,
template <
typename, index_t>
class array_t,
186 concepts::scalar scalar_t, index_t ROWS, index_t COLS>
187DETRAY_HOST_DEVICE
constexpr array_t<scalar_t, ROWS> operator*(
188 const array_t<array_t<scalar_t, ROWS>, COLS> &a,
189 const array_t<scalar_t, COLS> &b) {
190 array_t<scalar_t, ROWS> ret{0};
192 for (index_t j = 0; j < COLS; ++j) {
193 for (index_t i = 0; i < ROWS; ++i) {
194 ret[i] += a[j][i] * b[j];
constexpr double s
Definition Units.hpp:120
constexpr array_t< scalar1_t, 2 > operator*(const array_t< scalar1_t, 2 > &a, scalar2_t s)
Multiply an array-backed vector by a scalar.
Definition array_operators.hpp:26
constexpr array_t< scalar_t, 2 > operator+(const array_t< scalar_t, 2 > &a, const array_t< scalar_t, 2 > &b)
Add array-backed vectors component-wise.
Definition array_operators.hpp:47
constexpr array_t< scalar_t, 2 > operator-(const array_t< scalar_t, 2 > &a, const array_t< scalar_t, 2 > &b)
Subtract array-backed vectors component-wise.
Definition array_operators.hpp:40