19KOKKOS_FUNCTION
typename ViewType::value_type
determinant(
const ViewType& matrix)
21 assert(matrix.extent(0) == matrix.extent(1)
22 &&
"Matrix should be squared to compute its determinant");
24 const std::size_t N = matrix.extent(0);
27 int permutation_sign = 1;
30 for (std::size_t i = 0; i < N; ++i) {
32 std::size_t pivot = i;
33 typename ViewType::value_type max_val = Kokkos::abs(matrix(i, i));
34 for (std::size_t j = i + 1; j < N; ++j) {
35 if (Kokkos::abs(matrix(j, i)) > max_val) {
37 max_val = Kokkos::abs(matrix(j, i));
43 permutation_sign *= -1;
44 for (std::size_t k = 0; k < N; ++k) {
45 Kokkos::kokkos_swap(matrix(i, k), matrix(pivot, k));
50 if (matrix(i, i) == 0.0) {
55 for (std::size_t j = i + 1; j < N; ++j) {
56 matrix(j, i) /= matrix(i, i);
57 for (std::size_t k = i + 1; k < N; ++k) {
58 matrix(j, k) -= matrix(j, i) * matrix(i, k);
64 typename ViewType::value_type det = permutation_sign;
65 for (std::size_t i = 0; i < N; ++i) {
76 static_assert(TensorType::natural_domain_t::rank() == 2);
77 auto extents = ddc::detail::array(tensor.natural_domain().extents());
78 assert(extents[0] == extents[1] &&
"Matrix should be squared to compute its determinant");
79 const std::size_t n = extents[0];
81 Kokkos::View<typename TensorType::element_type**, Kokkos::LayoutRight, Kokkos::HostSpace>
82 buffer(
"determinant_buffer", n, n);
83 SIMILIE_DEBUG_LOG(
"similie_compute_determinant");
84 ddc::parallel_for_each(
85 "similie_compute_determinant",
86 Kokkos::DefaultHostExecutionSpace(),
87 tensor.accessor().natural_domain(),
89 buffer(ddc::detail::array(index)[0], ddc::detail::array(index)[1])
90 = tensor(tensor.access_element(index));