18KOKKOS_FUNCTION
typename ViewType::value_type
determinant(
const ViewType& matrix)
20 assert(matrix.extent(0) == matrix.extent(1)
21 &&
"Matrix should be squared to compute its determinant");
23 const std::size_t N = matrix.extent(0);
26 int permutation_sign = 1;
29 for (std::size_t i = 0; i < N; ++i) {
31 std::size_t pivot = i;
32 typename ViewType::value_type max_val = Kokkos::abs(matrix(i, i));
33 for (std::size_t j = i + 1; j < N; ++j) {
34 if (Kokkos::abs(matrix(j, i)) > max_val) {
36 max_val = Kokkos::abs(matrix(j, i));
42 permutation_sign *= -1;
43 for (std::size_t k = 0; k < N; ++k) {
44 Kokkos::kokkos_swap(matrix(i, k), matrix(pivot, k));
49 if (matrix(i, i) == 0.0) {
54 for (std::size_t j = i + 1; j < N; ++j) {
55 matrix(j, i) /= matrix(i, i);
56 for (std::size_t k = i + 1; k < N; ++k) {
57 matrix(j, k) -= matrix(j, i) * matrix(i, k);
63 typename ViewType::value_type det = permutation_sign;
64 for (std::size_t i = 0; i < N; ++i) {
75 static_assert(TensorType::natural_domain_t::rank() == 2);
76 auto extents = ddc::detail::array(tensor.natural_domain().extents());
77 assert(extents[0] == extents[1] &&
"Matrix should be squared to compute its determinant");
78 const std::size_t n = extents[0];
80 Kokkos::View<typename TensorType::element_type**, Kokkos::LayoutRight, Kokkos::HostSpace>
81 buffer(
"determinant_buffer", n, n);
82 ddc::parallel_for_each(
83 Kokkos::DefaultHostExecutionSpace(),
84 tensor.accessor().natural_domain(),
86 buffer(ddc::detail::array(index)[0], ddc::detail::array(index)[1])
87 = tensor(tensor.access_element(index));