Shamrock 2025.10.0
Astrophysical Code
Loading...
Searching...
No Matches
intervals.hpp
Go to the documentation of this file.
1// -------------------------------------------------------//
2//
3// SHAMROCK code for hydrodynamics
4// Copyright (c) 2021-2026 Timothée David--Cléris <tim.shamrock@proton.me>
5// SPDX-License-Identifier: CeCILL Free Software License Agreement v2.1
6// Shamrock is licensed under the CeCILL 2.1 License, see LICENSE for more information
7//
8// -------------------------------------------------------//
9
10#pragma once
11
20#include "shambackends/math.hpp"
22
23namespace shammath {
24
35 template<class T, std::enable_if_t<sham::is_valid_sycl_base_type<T>, int> = 0>
36 inline bool is_in_half_open(T val, T min, T max) {
37 return (val >= min) && (val < max);
38 }
39
49 template<class T>
50 inline bool is_in_half_open(sycl::vec<T, 2> val, sycl::vec<T, 2> min, sycl::vec<T, 2> max) {
51 return (
52 is_in_half_open(val.x(), min.x(), max.x())
53 && is_in_half_open(val.y(), min.y(), max.y()));
54 }
55
65 template<class T>
66 inline bool is_in_half_open(sycl::vec<T, 3> val, sycl::vec<T, 3> min, sycl::vec<T, 3> max) {
67 return (
68 is_in_half_open(val.x(), min.x(), max.x()) && is_in_half_open(val.y(), min.y(), max.y())
69 && is_in_half_open(val.z(), min.z(), max.z()));
70 }
71
81 template<class T>
82 inline bool is_in_half_open(sycl::vec<T, 4> val, sycl::vec<T, 4> min, sycl::vec<T, 4> max) {
83 return (
84 is_in_half_open(val.x(), min.x(), max.x()) && is_in_half_open(val.y(), min.y(), max.y())
85 && is_in_half_open(val.z(), min.z(), max.z())
86 && is_in_half_open(val.w(), min.w(), max.w()));
87 }
88
98 template<class T>
99 inline bool is_in_half_open(sycl::vec<T, 8> val, sycl::vec<T, 8> min, sycl::vec<T, 8> max) {
100 return (
101 is_in_half_open(val.s0(), min.s0(), max.s0())
102 && is_in_half_open(val.s1(), min.s1(), max.s1())
103 && is_in_half_open(val.s2(), min.s2(), max.s2())
104 && is_in_half_open(val.s3(), min.s3(), max.s3())
105 && is_in_half_open(val.s4(), min.s4(), max.s4())
106 && is_in_half_open(val.s5(), min.s5(), max.s5())
107 && is_in_half_open(val.s6(), min.s6(), max.s6())
108 && is_in_half_open(val.s7(), min.s7(), max.s7()));
109 }
110
120 template<class T>
121 inline bool is_in_half_open(sycl::vec<T, 16> val, sycl::vec<T, 16> min, sycl::vec<T, 16> max) {
122 return (
123 is_in_half_open(val.s0(), min.s0(), max.s0())
124 && is_in_half_open(val.s1(), min.s1(), max.s1())
125 && is_in_half_open(val.s2(), min.s2(), max.s2())
126 && is_in_half_open(val.s3(), min.s3(), max.s3())
127 && is_in_half_open(val.s4(), min.s4(), max.s4())
128 && is_in_half_open(val.s5(), min.s5(), max.s5())
129 && is_in_half_open(val.s6(), min.s6(), max.s6())
130 && is_in_half_open(val.s7(), min.s7(), max.s7())
131 && is_in_half_open(val.s8(), min.s8(), max.s8())
132 && is_in_half_open(val.s9(), min.s9(), max.s9())
133 && is_in_half_open(val.sA(), min.sA(), max.sA())
134 && is_in_half_open(val.sB(), min.sB(), max.sB())
135 && is_in_half_open(val.sC(), min.sC(), max.sC())
136 && is_in_half_open(val.sD(), min.sD(), max.sD())
137 && is_in_half_open(val.sE(), min.sE(), max.sE())
138 && is_in_half_open(val.sF(), min.sF(), max.sF()));
139 }
140
142 // domain_are_connected
144
155 template<class T, std::enable_if_t<sham::is_valid_sycl_base_type<T>, int> = 0>
156 inline bool domain_are_connected(T bmin1, T bmax1, T bmin2, T bmax2) {
157 return sham::max(bmin1, bmin2) <= sham::min(bmax1, bmax2);
158 }
159
170 template<class T>
172 sycl::vec<T, 2> bmin1,
173 sycl::vec<T, 2> bmax1,
174 sycl::vec<T, 2> bmin2,
175 sycl::vec<T, 2> bmax2) {
176
177 return (
178 domain_are_connected(bmin1.x(), bmax1.x(), bmin2.x(), bmax2.x())
179 && domain_are_connected(bmin1.y(), bmax1.y(), bmin2.y(), bmax2.y()));
180 }
181
192 template<class T>
194 sycl::vec<T, 3> bmin1,
195 sycl::vec<T, 3> bmax1,
196 sycl::vec<T, 3> bmin2,
197 sycl::vec<T, 3> bmax2) {
198
199 return (
200 domain_are_connected(bmin1.x(), bmax1.x(), bmin2.x(), bmax2.x())
201 && domain_are_connected(bmin1.y(), bmax1.y(), bmin2.y(), bmax2.y())
202 && domain_are_connected(bmin1.z(), bmax1.z(), bmin2.z(), bmax2.z()));
203 }
204
206 // domain_have_intersect
208
219 template<class T, std::enable_if_t<sham::is_valid_sycl_base_type<T>, int> = 0>
220 inline bool domain_have_intersect(T bmin1, T bmax1, T bmin2, T bmax2) {
221 return sham::max(bmin1, bmin2) < sham::min(bmax1, bmax2);
222 }
223
234 template<class T>
236 sycl::vec<T, 2> bmin1,
237 sycl::vec<T, 2> bmax1,
238 sycl::vec<T, 2> bmin2,
239 sycl::vec<T, 2> bmax2) {
240
241 return (
242 domain_have_intersect(bmin1.x(), bmax1.x(), bmin2.x(), bmax2.x())
243 && domain_have_intersect(bmin1.y(), bmax1.y(), bmin2.y(), bmax2.y()));
244 }
245
256 template<class T>
258 sycl::vec<T, 3> bmin1,
259 sycl::vec<T, 3> bmax1,
260 sycl::vec<T, 3> bmin2,
261 sycl::vec<T, 3> bmax2) {
262
263 return (
264 domain_have_intersect(bmin1.x(), bmax1.x(), bmin2.x(), bmax2.x())
265 && domain_have_intersect(bmin1.y(), bmax1.y(), bmin2.y(), bmax2.y())
266 && domain_have_intersect(bmin1.z(), bmax1.z(), bmin2.z(), bmax2.z()));
267 }
268
270 // domain_have_common_face
272
283 template<class T>
285 sycl::vec<T, 3> bmin1,
286 sycl::vec<T, 3> bmax1,
287 sycl::vec<T, 3> bmin2,
288 sycl::vec<T, 3> bmax2) {
289 u32 cnt = ((domain_have_common_face(bmin1.x(), bmax1.x(), bmin2.x(), bmax2.x())) ? 1 : 0)
290 + ((domain_have_common_face(bmin1.y(), bmax1.y(), bmin2.y(), bmax2.y())) ? 1 : 0)
291 + ((domain_have_common_face(bmin1.z(), bmax1.z(), bmin2.z(), bmax2.z())) ? 1 : 0);
292
293 return cnt > 1;
294 }
295
296} // namespace shammath
std::uint32_t u32
32 bit unsigned integer
namespace for math utility
Definition AABB.hpp:26
bool domain_are_connected(T bmin1, T bmax1, T bmin2, T bmax2)
Check if two 1D intervals share boundary or overlap.
bool domain_have_intersect(T bmin1, T bmax1, T bmin2, T bmax2)
Check if two 1D intervals have non-empty intersection.
bool is_in_half_open(T val, T min, T max)
return true if val is in [min,max[
Definition intervals.hpp:36
bool domain_have_common_face(sycl::vec< T, 3 > bmin1, sycl::vec< T, 3 > bmax1, sycl::vec< T, 3 > bmin2, sycl::vec< T, 3 > bmax2)
Check if two 3D boxes share a common face.
Contains traits and utilities for backend related types.
Traits for C++ types.