15 View<Scalar**, Kokkos::LayoutRight, MemorySpace, Kokkos::MemoryTraits<Kokkos::Unmanaged>>;
19 View<Scalar*, Kokkos::LayoutRight, MemorySpace, Kokkos::MemoryTraits<Kokkos::Unmanaged>>;
49KOKKOS_FUNCTION
void copy_matrix(MatrixView1 dst, MatrixView2 src)
51 assert(dst.extent(0) == src.extent(0) && dst.extent(1) == src.extent(1));
52 for (std::size_t i = 0; i < dst.extent(0); ++i) {
53 for (std::size_t j = 0; j < dst.extent(1); ++j) {
54 dst(i, j) = src(i, j);
61 SubmatrixView submatrix,
63 RowIds
const& row_ids,
64 ColIds
const& col_ids)
66 assert(submatrix.extent(0) == row_ids.size() && submatrix.extent(1) == col_ids.size());
67 for (std::size_t i = 0; i < row_ids.size(); ++i) {
68 for (std::size_t j = 0; j < col_ids.size(); ++j) {
69 submatrix(i, j) = matrix(row_ids[i], col_ids[j]);
75KOKKOS_FUNCTION
typename MatrixView::non_const_value_type
determinant(MatrixView matrix)
77 assert(matrix.extent(0) == matrix.extent(1) &&
"Matrix should be square.");
78 if (matrix.extent(0) == 0) {
81 typename MatrixView::non_const_value_type det = 1.;
84 for (std::size_t i = 0; i < matrix.extent(0); ++i) {
85 std::size_t pivot = i;
86 auto pivot_abs = Kokkos::abs(matrix(i, i));
87 for (std::size_t row = i + 1; row < matrix.extent(0); ++row) {
88 auto const candidate_abs = Kokkos::abs(matrix(row, i));
89 if (candidate_abs > pivot_abs) {
91 pivot_abs = candidate_abs;
95 if (pivot_abs == 0.) {
101 for (std::size_t col = 0; col < matrix.extent(1); ++col) {
102 Kokkos::kokkos_swap(matrix(i, col), matrix(pivot, col));
106 auto const diagonal = matrix(i, i);
108 for (std::size_t row = i + 1; row < matrix.extent(0); ++row) {
109 auto const factor = matrix(row, i) / diagonal;
110 for (std::size_t col = i + 1; col < matrix.extent(1); ++col) {
111 matrix(row, col) -= factor * matrix(i, col);
120KOKKOS_FUNCTION
bool invert(InverseView inverse, MatrixView matrix, WorkspaceView workspace)
122 assert(inverse.extent(0) == inverse.extent(1) &&
"Inverse target should be square.");
123 assert(matrix.extent(0) == matrix.extent(1) &&
"Input matrix should be square.");
124 assert(inverse.extent(0) == matrix.extent(0) &&
"Input/output matrix sizes should match.");
125 assert(workspace.extent(0) >= matrix.extent(0) * matrix.extent(1) &&
"Workspace is too small.");
128 typename MatrixView::non_const_value_type,
129 typename MatrixView::
130 memory_space>(workspace.data(), matrix.extent(0), matrix.extent(1));
134 for (std::size_t i = 0; i < matrix.extent(0); ++i) {
135 std::size_t pivot = i;
136 auto pivot_abs = Kokkos::abs(matrix_work(i, i));
137 for (std::size_t row = i + 1; row < matrix.extent(0); ++row) {
138 auto const candidate_abs = Kokkos::abs(matrix_work(row, i));
139 if (candidate_abs > pivot_abs) {
141 pivot_abs = candidate_abs;
145 if (pivot_abs == 0.) {
146 for (std::size_t row = 0; row < inverse.extent(0); ++row) {
147 for (std::size_t col = 0; col < inverse.extent(1); ++col) {
148 inverse(row, col) = 0.;
155 for (std::size_t col = 0; col < matrix_work.extent(1); ++col) {
156 Kokkos::kokkos_swap(matrix_work(i, col), matrix_work(pivot, col));
157 Kokkos::kokkos_swap(inverse(i, col), inverse(pivot, col));
161 auto const diagonal = matrix_work(i, i);
162 for (std::size_t col = 0; col < matrix_work.extent(1); ++col) {
163 matrix_work(i, col) /= diagonal;
164 inverse(i, col) /= diagonal;
167 for (std::size_t row = 0; row < matrix_work.extent(0); ++row) {
171 auto const factor = matrix_work(row, i);
172 for (std::size_t col = 0; col < matrix_work.extent(1); ++col) {
173 matrix_work(row, col) -= factor * matrix_work(i, col);
174 inverse(row, col) -= factor * inverse(i, col);
185 RowIds
const& row_ids,
186 ColIds
const& col_ids,
187 std::array<double, N * N>& submatrix_alloc)
189 if constexpr (N == 0) {
194 typename MatrixView::memory_space>(submatrix_alloc.data(), N, N);