Shamrock 2025.10.0
Astrophysical Code
Loading...
Searching...
No Matches
geometry_utils.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
19#include "shambackends/sycl.hpp"
20#include <tuple>
21
22template<class flt>
24 // TODO replace std::tuple<vec,vec> by this class
25 using vec = sycl::vec<flt, 3>;
26
27 public:
28 vec min_coord;
29 vec max_coord;
30
31 ALignedAxisBoundingBox(const vec &min, const vec &max) : min_coord(min), max_coord(max) {}
32
33 inline vec get_size() const { return max_coord - min_coord; }
34
35 inline flt get_max_side_length() const {
36 const vec sz = get_size();
37 return sycl::fmax(sycl::fmax(sz.x(), sz.y()), sz.z());
38 }
39};
40
41namespace BBAA {
42
43 template<class VecType>
44 bool is_coord_in_range(VecType part_pos, VecType pos_min_patch, VecType pos_max_patch);
45
46 template<>
47 inline bool is_coord_in_range<f32_3>(f32_3 part_pos, f32_3 pos_min_patch, f32_3 pos_max_patch) {
48 return (
49 (pos_min_patch.x() <= part_pos.x()) && (part_pos.x() < pos_max_patch.x())
50 && (pos_min_patch.y() <= part_pos.y()) && (part_pos.y() < pos_max_patch.y())
51 && (pos_min_patch.z() <= part_pos.z()) && (part_pos.z() < pos_max_patch.z()));
52 }
53
54 template<>
55 inline bool is_coord_in_range<f64_3>(f64_3 part_pos, f64_3 pos_min_patch, f64_3 pos_max_patch) {
56 return (
57 (pos_min_patch.x() <= part_pos.x()) && (part_pos.x() < pos_max_patch.x())
58 && (pos_min_patch.y() <= part_pos.y()) && (part_pos.y() < pos_max_patch.y())
59 && (pos_min_patch.z() <= part_pos.z()) && (part_pos.z() < pos_max_patch.z()));
60 }
61
62 template<class VecType>
63 bool is_coord_in_range_incl_max(VecType part_pos, VecType pos_min_patch, VecType pos_max_patch);
64
65 template<>
66 inline bool is_coord_in_range_incl_max<f32_3>(
67 f32_3 part_pos, f32_3 pos_min_patch, f32_3 pos_max_patch) {
68 return (
69 (pos_min_patch.x() <= part_pos.x()) && (part_pos.x() <= pos_max_patch.x())
70 && (pos_min_patch.y() <= part_pos.y()) && (part_pos.y() <= pos_max_patch.y())
71 && (pos_min_patch.z() <= part_pos.z()) && (part_pos.z() <= pos_max_patch.z()));
72 }
73
74 template<>
75 inline bool is_coord_in_range_incl_max<f64_3>(
76 f64_3 part_pos, f64_3 pos_min_patch, f64_3 pos_max_patch) {
77 return (
78 (pos_min_patch.x() <= part_pos.x()) && (part_pos.x() <= pos_max_patch.x())
79 && (pos_min_patch.y() <= part_pos.y()) && (part_pos.y() <= pos_max_patch.y())
80 && (pos_min_patch.z() <= part_pos.z()) && (part_pos.z() <= pos_max_patch.z()));
81 }
82
83 template<class VecType>
84 bool iscellb_inside_a(
85 VecType pos_min_cella, VecType pos_max_cella, VecType pos_min_cellb, VecType pos_max_cellb);
86
87 template<>
88 inline bool iscellb_inside_a<u32_3>(
89 u32_3 pos_min_cella, u32_3 pos_max_cella, u32_3 pos_min_cellb, u32_3 pos_max_cellb) {
90 return (
91 (pos_min_cella.x() <= pos_min_cellb.x()) && (pos_min_cellb.x() < pos_max_cellb.x())
92 && (pos_max_cellb.x() <= pos_max_cella.x()) && (pos_min_cella.y() <= pos_min_cellb.y())
93 && (pos_min_cellb.y() < pos_max_cellb.y()) && (pos_max_cellb.y() <= pos_max_cella.y())
94 && (pos_min_cella.z() <= pos_min_cellb.z()) && (pos_min_cellb.z() < pos_max_cellb.z())
95 && (pos_max_cellb.z() <= pos_max_cella.z()));
96 }
97
98 template<>
99 inline bool iscellb_inside_a<f32_3>(
100 f32_3 pos_min_cella, f32_3 pos_max_cella, f32_3 pos_min_cellb, f32_3 pos_max_cellb) {
101 return (
102 (pos_min_cella.x() <= pos_min_cellb.x()) && (pos_min_cellb.x() < pos_max_cellb.x())
103 && (pos_max_cellb.x() <= pos_max_cella.x()) && (pos_min_cella.y() <= pos_min_cellb.y())
104 && (pos_min_cellb.y() < pos_max_cellb.y()) && (pos_max_cellb.y() <= pos_max_cella.y())
105 && (pos_min_cella.z() <= pos_min_cellb.z()) && (pos_min_cellb.z() < pos_max_cellb.z())
106 && (pos_max_cellb.z() <= pos_max_cella.z()));
107 }
108
109 template<class VecType>
110 bool cella_neigh_b(
111 VecType pos_min_cella, VecType pos_max_cella, VecType pos_min_cellb, VecType pos_max_cellb);
112
113 template<>
114 inline bool cella_neigh_b<f32_3>(
115 f32_3 pos_min_cella, f32_3 pos_max_cella, f32_3 pos_min_cellb, f32_3 pos_max_cellb) {
116 return (
117 (sycl::fmax(pos_min_cella.x(), pos_min_cellb.x())
118 <= sycl::fmin(pos_max_cella.x(), pos_max_cellb.x()))
119 && (sycl::fmax(pos_min_cella.y(), pos_min_cellb.y())
120 <= sycl::fmin(pos_max_cella.y(), pos_max_cellb.y()))
121 && (sycl::fmax(pos_min_cella.z(), pos_min_cellb.z())
122 <= sycl::fmin(pos_max_cella.z(), pos_max_cellb.z())));
123 }
124
125 template<>
126 inline bool cella_neigh_b<f64_3>(
127 f64_3 pos_min_cella, f64_3 pos_max_cella, f64_3 pos_min_cellb, f64_3 pos_max_cellb) {
128 return (
129 (sycl::fmax(pos_min_cella.x(), pos_min_cellb.x())
130 <= sycl::fmin(pos_max_cella.x(), pos_max_cellb.x()))
131 && (sycl::fmax(pos_min_cella.y(), pos_min_cellb.y())
132 <= sycl::fmin(pos_max_cella.y(), pos_max_cellb.y()))
133 && (sycl::fmax(pos_min_cella.z(), pos_min_cellb.z())
134 <= sycl::fmin(pos_max_cella.z(), pos_max_cellb.z())));
135 }
136
137 template<class VecType>
138 bool intersect_not_null_cella_b(
139 VecType pos_min_cella, VecType pos_max_cella, VecType pos_min_cellb, VecType pos_max_cellb);
140
141 template<>
142 inline bool intersect_not_null_cella_b<f64_3>(
143 f64_3 pos_min_cella, f64_3 pos_max_cella, f64_3 pos_min_cellb, f64_3 pos_max_cellb) {
144 return (
145 (sycl::fmax(pos_min_cella.x(), pos_min_cellb.x())
146 < sycl::fmin(pos_max_cella.x(), pos_max_cellb.x()))
147 && (sycl::fmax(pos_min_cella.y(), pos_min_cellb.y())
148 < sycl::fmin(pos_max_cella.y(), pos_max_cellb.y()))
149 && (sycl::fmax(pos_min_cella.z(), pos_min_cellb.z())
150 < sycl::fmin(pos_max_cella.z(), pos_max_cellb.z())));
151 }
152
153 template<>
154 inline bool intersect_not_null_cella_b<f32_3>(
155 f32_3 pos_min_cella, f32_3 pos_max_cella, f32_3 pos_min_cellb, f32_3 pos_max_cellb) {
156 return (
157 (sycl::fmax(pos_min_cella.x(), pos_min_cellb.x())
158 < sycl::fmin(pos_max_cella.x(), pos_max_cellb.x()))
159 && (sycl::fmax(pos_min_cella.y(), pos_min_cellb.y())
160 < sycl::fmin(pos_max_cella.y(), pos_max_cellb.y()))
161 && (sycl::fmax(pos_min_cella.z(), pos_min_cellb.z())
162 < sycl::fmin(pos_max_cella.z(), pos_max_cellb.z())));
163 }
164
165 template<>
166 inline bool intersect_not_null_cella_b<u64_3>(
167 u64_3 pos_min_cella, u64_3 pos_max_cella, u64_3 pos_min_cellb, u64_3 pos_max_cellb) {
168 return (
169 (sycl::max(pos_min_cella.x(), pos_min_cellb.x())
170 < sycl::min(pos_max_cella.x(), pos_max_cellb.x()))
171 && (sycl::max(pos_min_cella.y(), pos_min_cellb.y())
172 < sycl::min(pos_max_cella.y(), pos_max_cellb.y()))
173 && (sycl::max(pos_min_cella.z(), pos_min_cellb.z())
174 < sycl::min(pos_max_cella.z(), pos_max_cellb.z())));
175 }
176
177 template<>
178 inline bool intersect_not_null_cella_b<u32_3>(
179 u32_3 pos_min_cella, u32_3 pos_max_cella, u32_3 pos_min_cellb, u32_3 pos_max_cellb) {
180 return (
181 (sycl::max(pos_min_cella.x(), pos_min_cellb.x())
182 < sycl::min(pos_max_cella.x(), pos_max_cellb.x()))
183 && (sycl::max(pos_min_cella.y(), pos_min_cellb.y())
184 < sycl::min(pos_max_cella.y(), pos_max_cellb.y()))
185 && (sycl::max(pos_min_cella.z(), pos_min_cellb.z())
186 < sycl::min(pos_max_cella.z(), pos_max_cellb.z())));
187 }
188
189 template<class VecType>
190 std::tuple<VecType, VecType> get_intersect_cella_b(
191 VecType pos_min_cella, VecType pos_max_cella, VecType pos_min_cellb, VecType pos_max_cellb);
192
193 template<>
194 inline std::tuple<f64_3, f64_3> get_intersect_cella_b<f64_3>(
195 f64_3 pos_min_cella, f64_3 pos_max_cella, f64_3 pos_min_cellb, f64_3 pos_max_cellb) {
196 return {sycl::fmax(pos_min_cella, pos_min_cellb), sycl::fmin(pos_max_cella, pos_max_cellb)};
197 }
198
199 template<>
200 inline std::tuple<f32_3, f32_3> get_intersect_cella_b<f32_3>(
201 f32_3 pos_min_cella, f32_3 pos_max_cella, f32_3 pos_min_cellb, f32_3 pos_max_cellb) {
202
203 return {sycl::fmax(pos_min_cella, pos_min_cellb), sycl::fmin(pos_max_cella, pos_max_cellb)};
204 }
205
206 template<class VecType>
207 typename VecType::element_type get_sq_distance_to_BBAAsurface(
208 VecType pos, VecType pos_min_cell, VecType pos_max_cell);
209
210 template<>
211 inline f32 get_sq_distance_to_BBAAsurface<f32_3>(
212 f32_3 pos, f32_3 pos_min_cell, f32_3 pos_max_cell) {
213 f32_3 clamped;
214
215 clamped.x() = sycl::clamp(pos.x(), pos_min_cell.x(), pos_max_cell.x());
216 clamped.y() = sycl::clamp(pos.y(), pos_min_cell.y(), pos_max_cell.y());
217 clamped.z() = sycl::clamp(pos.z(), pos_min_cell.z(), pos_max_cell.z());
218
219 clamped -= pos;
220
221 return sycl::dot(clamped, clamped);
222 }
223
224 template<>
225 inline f64 get_sq_distance_to_BBAAsurface<f64_3>(
226 f64_3 pos, f64_3 pos_min_cell, f64_3 pos_max_cell) {
227 f64_3 clamped;
228
229 clamped.x() = sycl::clamp(pos.x(), pos_min_cell.x(), pos_max_cell.x());
230 clamped.y() = sycl::clamp(pos.y(), pos_min_cell.y(), pos_max_cell.y());
231 clamped.z() = sycl::clamp(pos.z(), pos_min_cell.z(), pos_max_cell.z());
232
233 clamped -= pos;
234
235 return sycl::dot(clamped, clamped);
236 }
237
238} // namespace BBAA
double f64
Alias for double.
float f32
Alias for float.