12#include <Kokkos_Core.hpp>
18namespace ddc::detail {
20template <
class ExecSpace>
21SplinesLinearProblem3x3Blocks<ExecSpace>::SplinesLinearProblem3x3Blocks(
22 std::size_t
const mat_size,
23 std::size_t
const top_size,
24 std::unique_ptr<SplinesLinearProblem<ExecSpace>> center_block)
25 : SplinesLinearProblem2x2Blocks<ExecSpace>(mat_size, std::move(center_block))
26 , m_top_size(top_size)
30template <
class ExecSpace>
31SplinesLinearProblem3x3Blocks<ExecSpace>::~SplinesLinearProblem3x3Blocks() =
default;
33template <
class ExecSpace>
34void SplinesLinearProblem3x3Blocks<ExecSpace>::adjust_indices(std::size_t& i, std::size_t& j)
const
36 std::size_t
const nq = m_top_left_block->size();
40 }
else if (i < m_top_size + nq) {
46 }
else if (j < m_top_size + nq) {
51template <
class ExecSpace>
52Real SplinesLinearProblem3x3Blocks<ExecSpace>::get_element(std::size_t i, std::size_t j)
const
55 return SplinesLinearProblem2x2Blocks<ExecSpace>::get_element(i, j);
58template <
class ExecSpace>
59void SplinesLinearProblem3x3Blocks<ExecSpace>::set_element(
65 SplinesLinearProblem2x2Blocks<ExecSpace>::set_element(i, j, aij);
68template <
class ExecSpace>
69void SplinesLinearProblem3x3Blocks<ExecSpace>::interchange_rows_from_3_to_2_blocks_rhs(
70 MultiRHS
const b)
const
72 std::size_t
const nq = m_top_left_block->size();
75 = Kokkos::subview(b, std::pair<std::size_t, std::size_t> {0, m_top_size}, Kokkos::ALL);
76 MultiRHS
const b_bottom = Kokkos::
77 subview(b, std::pair<std::size_t, std::size_t> {m_top_size + nq, size()}, Kokkos::ALL);
79 MultiRHS
const b_top_dst = Kokkos::
81 std::pair<std::size_t, std::size_t> {m_top_size + nq, 2 * m_top_size + nq},
83 MultiRHS
const b_bottom_dst = Kokkos::
85 std::pair<std::size_t, std::size_t> {2 * m_top_size + nq, m_top_size + size()},
88 if (b_bottom.extent(0) > b_top.extent(0)) {
90 MultiRHS
const buffer = Kokkos::create_mirror(ExecSpace(), b_bottom);
92 Kokkos::deep_copy(buffer, b_bottom);
93 Kokkos::deep_copy(b_bottom_dst, buffer);
95 Kokkos::deep_copy(b_bottom_dst, b_bottom);
97 Kokkos::deep_copy(b_top_dst, b_top);
100template <
class ExecSpace>
101void SplinesLinearProblem3x3Blocks<ExecSpace>::interchange_rows_from_2_to_3_blocks_rhs(
102 MultiRHS
const b)
const
104 std::size_t
const nq = m_top_left_block->size();
107 = Kokkos::subview(b, std::pair<std::size_t, std::size_t> {0, m_top_size}, Kokkos::ALL);
108 MultiRHS
const b_bottom = Kokkos::
109 subview(b, std::pair<std::size_t, std::size_t> {m_top_size + nq, size()}, Kokkos::ALL);
111 MultiRHS
const b_top_src = Kokkos::
113 std::pair<std::size_t, std::size_t> {m_top_size + nq, 2 * m_top_size + nq},
115 MultiRHS
const b_bottom_src = Kokkos::
117 std::pair<std::size_t, std::size_t> {2 * m_top_size + nq, m_top_size + size()},
120 Kokkos::deep_copy(b_top, b_top_src);
121 if (b_bottom.extent(0) > b_top.extent(0)) {
123 MultiRHS
const buffer = Kokkos::create_mirror(ExecSpace(), b_bottom);
125 Kokkos::deep_copy(buffer, b_bottom_src);
126 Kokkos::deep_copy(b_bottom, buffer);
128 Kokkos::deep_copy(b_bottom, b_bottom_src);
132template <
class ExecSpace>
133void SplinesLinearProblem3x3Blocks<ExecSpace>::solve(MultiRHS
const b,
bool const transpose)
const
135 assert(b.extent(0) == size() + m_top_size);
137 interchange_rows_from_3_to_2_blocks_rhs(b);
138 SplinesLinearProblem2x2Blocks<ExecSpace>::
143 std::size_t> {m_top_size, m_top_size + size()},
146 interchange_rows_from_2_to_3_blocks_rhs(b);
149template <
class ExecSpace>
150std::size_t SplinesLinearProblem3x3Blocks<ExecSpace>::impl_required_number_of_rhs_rows()
const
152 return size() + m_top_size;
155#if defined(KOKKOS_ENABLE_SERIAL
)
156template class SplinesLinearProblem3x3Blocks<Kokkos::Serial>;
158#if defined(KOKKOS_ENABLE_OPENMP)
159template class SplinesLinearProblem3x3Blocks<Kokkos::OpenMP>;
161#if defined(KOKKOS_ENABLE_CUDA)
162template class SplinesLinearProblem3x3Blocks<Kokkos::Cuda>;
164#if defined(KOKKOS_ENABLE_HIP)
165template class SplinesLinearProblem3x3Blocks<Kokkos::HIP>;
167#if defined(KOKKOS_ENABLE_SYCL)
168template class SplinesLinearProblem3x3Blocks<Kokkos::SYCL>;
The top-level namespace of DDC.