ACTS
Experiment-independent tracking
Loading...
Searching...
No Matches
array_matrix.hpp
1// This file is part of the ACTS project.
2//
3// Copyright (C) 2016 CERN for the benefit of the ACTS project
4//
5// This Source Code Form is subject to the terms of the Mozilla Public
6// License, v. 2.0. If a copy of the MPL was not distributed with this
7// file, You can obtain one at https://mozilla.org/MPL/2.0/.
8
9#pragma once
10
11// Project include(s).
12#include "detray/algebra/common/math.hpp"
13#include "detray/algebra/concepts.hpp"
14#include "detray/algebra/generic/generic.hpp"
15#include "detray/definitions/detail/qualifiers.hpp"
16
17namespace detray::algebra::array {
18
20template <concepts::matrix matrix_t>
21 requires(std::is_scalar_v<typename matrix_t::value_type::value_type>)
22DETRAY_HOST_DEVICE constexpr matrix_t zero() {
23 matrix_t ret{};
24
25 for (std::size_t j = 0; j < detray::traits::columns<matrix_t>; ++j) {
26 for (std::size_t i = 0; i < detray::traits::rows<matrix_t>; ++i) {
27 ret[j][i] = 0;
28 }
29 }
30
31 return ret;
32}
33
35template <concepts::matrix matrix_t>
36 requires(std::is_scalar_v<typename matrix_t::value_type::value_type>)
37DETRAY_HOST_DEVICE constexpr auto identity() {
38 auto ret{zero<matrix_t>()};
39
40 for (std::size_t i = 0; i < detray::traits::max_rank<matrix_t>; ++i) {
41 ret[i][i] = 1;
42 }
43
44 return ret;
45}
46
48template <std::size_t ROWS, std::size_t COLS, concepts::scalar scalar_t,
49 template <typename, std::size_t> class array_t>
50DETRAY_HOST_DEVICE constexpr void set_zero(
51 array_t<array_t<scalar_t, ROWS>, COLS> &m) {
52 m = zero<array_t<array_t<scalar_t, ROWS>, COLS>>();
53}
54
56template <std::size_t ROWS, std::size_t COLS, concepts::scalar scalar_t,
57 template <typename, std::size_t> class array_t>
58DETRAY_HOST_DEVICE constexpr void set_identity(
59 array_t<array_t<scalar_t, ROWS>, COLS> &m) {
60 m = identity<array_t<array_t<scalar_t, ROWS>, COLS>>();
61}
62
64template <std::size_t ROWS, std::size_t COLS, concepts::scalar scalar_t,
65 template <typename, std::size_t> class array_t>
66DETRAY_HOST_DEVICE constexpr auto transpose(
67 const array_t<array_t<scalar_t, ROWS>, COLS> &m) {
68 return algebra::generic::math::transpose(m);
69}
70
72template <std::size_t ROWS, std::size_t COLS, concepts::scalar scalar_t,
73 template <typename, std::size_t> class array_t>
74DETRAY_HOST_DEVICE constexpr scalar_t determinant(
75 const array_t<array_t<scalar_t, ROWS>, COLS> &m) {
76 return algebra::generic::math::determinant(m);
77}
78
80template <std::size_t ROWS, std::size_t COLS, concepts::scalar scalar_t,
81 template <typename, std::size_t> class array_t>
82DETRAY_HOST_DEVICE constexpr auto inverse(
83 const array_t<array_t<scalar_t, ROWS>, COLS> &m) {
84 return algebra::generic::math::inverse(m);
85}
86
87} // namespace detray::algebra::array
constexpr double m
Meter.
Definition Units.hpp:97