File indexing completed on 2026-05-27 07:24:26
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011
0012 #include "detray/core/detail/multi_store.hpp"
0013 #include "detray/core/detail/single_store.hpp"
0014 #include "detray/definitions/containers.hpp"
0015 #include "detray/definitions/indexing.hpp"
0016 #include "detray/geometry/mask.hpp"
0017 #include "detray/geometry/shapes/rectangle2D.hpp"
0018 #include "detray/geometry/shapes/trapezoid2D.hpp"
0019 #include "detray/geometry/surface_descriptor.hpp"
0020 #include "detray/io/backend/detail/type_info.hpp" // mask_info
0021 #include "detray/material/material_slab.hpp"
0022 #include "detray/navigation/accelerators/brute_force.hpp"
0023
0024
0025 #include "detray/tutorial/types.hpp"
0026
0027
0028 #include "my_square2D.hpp"
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045 namespace detray::tutorial {
0046
0047
0048
0049 struct my_metadata {
0050
0051 using algebra_type = detray::tutorial::algebra_t;
0052
0053
0054 using nav_link = std::uint_least16_t;
0055
0056
0057
0058 template <template <typename...> class vector_t = dvector>
0059 using transform_store = single_store<transform3, vector_t, geometry_context>;
0060
0061
0062
0063
0064
0065
0066 using square = mask<square2D, algebra_type, nav_link>;
0067 using trapezoid = mask<trapezoid2D, algebra_type, nav_link>;
0068
0069 using rectangle = mask<rectangle2D, algebra_type, nav_link>;
0070
0071
0072
0073
0074
0075 enum class mask_id : std::uint_least8_t {
0076 e_square2D = 0u,
0077 e_trapezoid2D = 1u,
0078 e_rectangle2D = 2u
0079 };
0080
0081 friend std::ostream& operator<<(std::ostream& os, const mask_id& id) {
0082 switch (id) {
0083 case mask_id::e_square2D:
0084 os << "e_square2D";
0085 break;
0086 case mask_id::e_trapezoid2D:
0087 os << "e_trapezoid2D";
0088 break;
0089 case mask_id::e_rectangle2D:
0090 os << "e_rectangle2D";
0091 break;
0092 default:
0093 os << "Unknown mask_id";
0094 break;
0095 }
0096 return os;
0097 }
0098
0099
0100
0101
0102 template <template <typename...> class vector_t = dvector>
0103 using mask_store =
0104 regular_multi_store<mask_id, empty_context, dtuple, vector_t, square,
0105 trapezoid, rectangle>;
0106
0107
0108
0109
0110
0111
0112
0113 using slab = material_slab<scalar>;
0114
0115
0116 enum class material_id : std::uint_least8_t {
0117 e_material_slab = 0u,
0118 e_none = 1u,
0119 };
0120
0121 friend std::ostream& operator<<(std::ostream& os, const material_id& id) {
0122 switch (id) {
0123 case material_id::e_material_slab:
0124 os << "e_material_slab";
0125 break;
0126 case material_id::e_none:
0127 os << "e_none";
0128 break;
0129 default:
0130 os << "Unknown material_id";
0131 break;
0132 }
0133 return os;
0134 }
0135
0136
0137
0138 template <typename container_t = host_container_types>
0139 using material_store =
0140 multi_store<material_id, empty_context, dtuple,
0141 typename container_t::template vector_type<slab>>;
0142
0143
0144
0145
0146
0147
0148 enum geo_objects : std::uint_least8_t {
0149 e_portal = 0u,
0150 e_passive = 0u,
0151 e_sensitive = 1u,
0152 e_volume = 2u,
0153 e_size = 3u,
0154 e_all = e_size,
0155 };
0156
0157 DETRAY_HOST inline friend std::ostream& operator<<(std::ostream& os,
0158 geo_objects gobj) {
0159 switch (gobj) {
0160 case geo_objects::e_portal:
0161
0162 os << "e_portal/e_passive";
0163 break;
0164 case geo_objects::e_sensitive:
0165 os << "e_sensitive";
0166 break;
0167 case geo_objects::e_volume:
0168 os << "e_volume";
0169 break;
0170 case geo_objects::e_size:
0171
0172 os << "e_size/e_all";
0173 break;
0174 }
0175 return os;
0176 }
0177
0178
0179
0180
0181 using transform_link = typename transform_store<>::single_link;
0182 using mask_link = typename mask_store<>::single_link;
0183 using material_link = typename material_store<>::single_link;
0184 using surface_type =
0185 surface_descriptor<mask_link, material_link, transform_link, nav_link>;
0186
0187
0188
0189 enum class accel_id : std::uint_least8_t {
0190 e_surface_brute_force = 0u,
0191 e_volume_cylinder3D_grid = 1u,
0192 e_surface_default = e_surface_brute_force,
0193 e_volume_default = e_volume_cylinder3D_grid,
0194 };
0195
0196 friend std::ostream& operator<<(std::ostream& os, const accel_id& id) {
0197 switch (id) {
0198 case accel_id::e_surface_brute_force:
0199 os << "e_surface_brute_force/e_surface_default";
0200 break;
0201 default:
0202 os << "Unknown accel_id";
0203 break;
0204 }
0205 return os;
0206 }
0207
0208
0209 using object_link_type =
0210 dmulti_index<dtyped_index<accel_id, dindex>, geo_objects::e_size>;
0211
0212
0213
0214 template <typename container_t = host_container_types>
0215 using volume_accelerator =
0216 spatial_grid<algebra_type,
0217 axes<cylinder3D, axis::bounds::e_open, axis::irregular,
0218 axis::regular, axis::irregular>,
0219 bins::single<dindex>, simple_serializer, container_t, false>;
0220
0221
0222
0223
0224
0225
0226 template <typename container_t = host_container_types>
0227 using accelerator_store =
0228 multi_store<accel_id, empty_context, dtuple,
0229 brute_force_collection<surface_type, container_t>,
0230 grid_collection<volume_accelerator<container_t>>>;
0231 };
0232
0233 }