63 std::semiregular<typename T::Cell> && std::copyable<typename T::TimeDependentValue> &&
65 std::same_as<
decltype(T::stencil_radius),
const uindex_t> && (T::stencil_radius >= 1) &&
66 std::same_as<
decltype(T::n_subiterations),
const uindex_t> && (T::n_subiterations >= 1) &&
68 requires(T
const &trans_func,
69 Stencil<typename T::Cell, T::stencil_radius, typename T::TimeDependentValue>
const
71 { trans_func(
stencil) } -> std::same_as<typename T::Cell>;
73 requires(T
const &trans_func,
uindex_t i_iteration) {
75 trans_func.get_time_dependent_value(i_iteration)
76 } -> std::same_as<typename T::TimeDependentValue>;
116 { G(c, r) } -> std::same_as<G>;
117 { G(sycl::range<2>(c, r)) } -> std::same_as<G>;
118 { G(buffer) } -> std::same_as<G>;
119 { grid.copy_from_buffer(buffer) } -> std::same_as<void>;
120 { grid.copy_to_buffer(buffer) } -> std::same_as<void>;
121 { grid.get_grid_width() } -> std::convertible_to<uindex_t>;
122 { grid.get_grid_height() } -> std::convertible_to<uindex_t>;
123 { grid.make_similar() } -> std::same_as<G>;
158 requires(SU stencil_update, G &grid,
typename SU::Params params) {
159 { SU(params) } -> std::same_as<SU>;
160 { stencil_update.get_params() } -> std::same_as<typename SU::Params &>;
161 { stencil_update(grid) } -> std::same_as<G>;
164 requires(
typename SU::Params params) {
165 { params.transition_function } -> std::same_as<TF &>;
166 { params.halo_value } -> std::same_as<typename TF::Cell &>;
167 { params.iteration_offset } -> std::same_as<uindex_t &>;
168 { params.n_iterations } -> std::same_as<uindex_t &>;
169 { params.device } -> std::same_as<sycl::device &>;
170 } && TransitionFunction<TF> && Grid<G, typename TF::Cell> &&