11 #include <Kokkos_Core.hpp>
12 #if defined(__CUDACC__)
15 #if defined(__HIPCC__)
16 #include <hip/hip_runtime.h>
19 #include "ddc/discrete_domain.hpp"
20 #include "ddc/discrete_space.hpp"
21 #include "ddc/dual_discretization.hpp"
25 namespace ddc_detail {
27 template <
class DDim,
class MemorySpace>
28 using ddim_impl_t =
typename DDim::template Impl<MemorySpace>;
37 static_assert(std::is_standard_layout_v<T>,
"Not standard layout");
44 alignas(T) std::byte m_data[
sizeof(T)];
50 return reinterpret_cast<T*
>(m_data);
56 return *
reinterpret_cast<T*
>(m_data);
62 return reinterpret_cast<T*
>(m_data);
73 #if defined(__CUDACC__)
77 #elif defined(__HIPCC__)
87 os <<
"The host discretization store is initialized:\n";
89 os <<
" - " << key <<
"\n";
92 os <<
"The host discretization store is not initialized:\n";
96 template <
class Tuple, std::size_t... Ids>
99 return std::make_tuple(std::move(std::get<Ids + 1>(t))...);
108 template <
class DDim,
class... Args>
111 if (ddc_detail::g_discrete_space_dual<DDim>) {
112 throw std::runtime_error(
"Discrete space function already initialized.");
114 ddc_detail::g_discrete_space_dual<DDim>.emplace(std::forward<Args>(args)...);
116 ddc_detail::g_discrete_space_dual<DDim>.reset();
118 #if defined(__CUDACC__)
120 ddc_detail::g_discrete_space_device<DDim>,
121 &ddc_detail::g_discrete_space_dual<DDim>->get_device(),
122 sizeof(ddc_detail::g_discrete_space_dual<DDim>->get_device()));
123 #elif defined(__HIPCC__)
125 ddc_detail::g_discrete_space_device<DDim>,
126 &ddc_detail::g_discrete_space_dual<DDim>->get_device(),
127 sizeof(ddc_detail::g_discrete_space_dual<DDim>->get_device()));
136 template <
class DDimImpl,
class Arg>
139 using DDim =
typename DDimImpl::discrete_dimension_type;
140 init_discrete_space<DDim>(std::move(std::get<0>(a)));
141 return std::get<1>(a);
149 template <
class DDimImpl,
class... Args>
151 std::tuple<DDimImpl, Args...>&& a)
153 using DDim =
typename DDimImpl::discrete_dimension_type;
154 init_discrete_space<DDim>(std::move(std::get<0>(a)));
158 template <
class DDim,
class MemorySpace = DDC_CURRENT_KOKKOS_SPACE>
159 DDC_INLINE_FUNCTION ddc_detail::ddim_impl_t<DDim, MemorySpace>
const& discrete_space()
161 if constexpr (std::is_same_v<MemorySpace, Kokkos::HostSpace>) {
162 return ddc_detail::g_discrete_space_dual<DDim>->get_host();
164 #if defined(__CUDACC__)
165 else if constexpr (std::is_same_v<MemorySpace, Kokkos::CudaSpace>) {
166 return *ddc_detail::g_discrete_space_device<DDim>;
168 #elif defined(__HIPCC__)
169 else if constexpr (std::is_same_v<MemorySpace, Kokkos::Experimental::HIPSpace>) {
170 return *ddc_detail::g_discrete_space_device<DDim>;
174 static_assert(std::is_same_v<MemorySpace, MemorySpace>,
"Memory space not handled");
Definition: discrete_space.hpp:32
DDC_INLINE_FUNCTION T & operator*()
Definition: discrete_space.hpp:54
DDC_INLINE_FUNCTION T * data()
Definition: discrete_space.hpp:60
DDC_INLINE_FUNCTION T * operator->()
Definition: discrete_space.hpp:48
std::optional< std::map< std::string, std::function< void()> > > g_discretization_store
Definition: discrete_space.hpp:67
std::optional< DualDiscretization< DDim > > g_discrete_space_dual
Definition: discrete_space.hpp:71
void display_discretization_store(std::ostream &os)
Definition: discrete_space.hpp:84
auto extract_after(Tuple &&t, std::index_sequence< Ids... >)
Definition: discrete_space.hpp:97
typename DDim::template Impl< MemorySpace > ddim_impl_t
Definition: discrete_space.hpp:28
Definition: aligned_allocator.hpp:9
void init_discrete_space(Args &&... args)
Initialize (emplace) a global singleton discrete space.
Definition: discrete_space.hpp:109