lsurf 1.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. lsurf/__init__.py +471 -0
  2. lsurf/analysis/__init__.py +107 -0
  3. lsurf/analysis/healpix_utils.py +418 -0
  4. lsurf/analysis/sphere_viz.py +1280 -0
  5. lsurf/cli/__init__.py +48 -0
  6. lsurf/cli/build.py +398 -0
  7. lsurf/cli/config_schema.py +318 -0
  8. lsurf/cli/gui_cmd.py +76 -0
  9. lsurf/cli/interactive.py +850 -0
  10. lsurf/cli/main.py +81 -0
  11. lsurf/cli/run.py +806 -0
  12. lsurf/detectors/__init__.py +266 -0
  13. lsurf/detectors/analysis.py +289 -0
  14. lsurf/detectors/base.py +284 -0
  15. lsurf/detectors/constant_size_rings.py +485 -0
  16. lsurf/detectors/directional.py +45 -0
  17. lsurf/detectors/extended/__init__.py +73 -0
  18. lsurf/detectors/extended/local_sphere.py +353 -0
  19. lsurf/detectors/extended/recording_sphere.py +368 -0
  20. lsurf/detectors/planar.py +45 -0
  21. lsurf/detectors/protocol.py +187 -0
  22. lsurf/detectors/recording_spheres.py +63 -0
  23. lsurf/detectors/results.py +1140 -0
  24. lsurf/detectors/small/__init__.py +79 -0
  25. lsurf/detectors/small/directional.py +330 -0
  26. lsurf/detectors/small/planar.py +401 -0
  27. lsurf/detectors/small/spherical.py +450 -0
  28. lsurf/detectors/spherical.py +45 -0
  29. lsurf/geometry/__init__.py +199 -0
  30. lsurf/geometry/builder.py +478 -0
  31. lsurf/geometry/cell.py +228 -0
  32. lsurf/geometry/cell_geometry.py +247 -0
  33. lsurf/geometry/detector_arrays.py +1785 -0
  34. lsurf/geometry/geometry.py +222 -0
  35. lsurf/geometry/surface_analysis.py +375 -0
  36. lsurf/geometry/validation.py +91 -0
  37. lsurf/gui/__init__.py +51 -0
  38. lsurf/gui/app.py +903 -0
  39. lsurf/gui/core/__init__.py +39 -0
  40. lsurf/gui/core/scene.py +343 -0
  41. lsurf/gui/core/simulation.py +264 -0
  42. lsurf/gui/renderers/__init__.py +40 -0
  43. lsurf/gui/renderers/ray_renderer.py +353 -0
  44. lsurf/gui/renderers/source_renderer.py +505 -0
  45. lsurf/gui/renderers/surface_renderer.py +477 -0
  46. lsurf/gui/views/__init__.py +48 -0
  47. lsurf/gui/views/config_editor.py +3199 -0
  48. lsurf/gui/views/properties.py +257 -0
  49. lsurf/gui/views/results.py +291 -0
  50. lsurf/gui/views/scene_tree.py +180 -0
  51. lsurf/gui/views/viewport_3d.py +555 -0
  52. lsurf/gui/views/visualizations.py +712 -0
  53. lsurf/materials/__init__.py +169 -0
  54. lsurf/materials/base/__init__.py +64 -0
  55. lsurf/materials/base/full_inhomogeneous.py +208 -0
  56. lsurf/materials/base/grid_inhomogeneous.py +319 -0
  57. lsurf/materials/base/homogeneous.py +342 -0
  58. lsurf/materials/base/material_field.py +527 -0
  59. lsurf/materials/base/simple_inhomogeneous.py +418 -0
  60. lsurf/materials/base/spectral_inhomogeneous.py +497 -0
  61. lsurf/materials/implementations/__init__.py +120 -0
  62. lsurf/materials/implementations/data/alpha_values_typical_atmosphere_updated.txt +24 -0
  63. lsurf/materials/implementations/duct_atmosphere.py +390 -0
  64. lsurf/materials/implementations/exponential_atmosphere.py +435 -0
  65. lsurf/materials/implementations/gaussian_lens.py +120 -0
  66. lsurf/materials/implementations/interpolated_data.py +123 -0
  67. lsurf/materials/implementations/layered_atmosphere.py +134 -0
  68. lsurf/materials/implementations/linear_gradient.py +109 -0
  69. lsurf/materials/implementations/linsley_atmosphere.py +764 -0
  70. lsurf/materials/implementations/standard_materials.py +126 -0
  71. lsurf/materials/implementations/turbulent_atmosphere.py +135 -0
  72. lsurf/materials/implementations/us_standard_atmosphere.py +149 -0
  73. lsurf/materials/utils/__init__.py +77 -0
  74. lsurf/materials/utils/constants.py +45 -0
  75. lsurf/materials/utils/device_functions.py +117 -0
  76. lsurf/materials/utils/dispersion.py +160 -0
  77. lsurf/materials/utils/factories.py +142 -0
  78. lsurf/propagation/__init__.py +91 -0
  79. lsurf/propagation/detector_gpu.py +67 -0
  80. lsurf/propagation/gpu_device_rays.py +294 -0
  81. lsurf/propagation/kernels/__init__.py +175 -0
  82. lsurf/propagation/kernels/absorption/__init__.py +61 -0
  83. lsurf/propagation/kernels/absorption/grid.py +240 -0
  84. lsurf/propagation/kernels/absorption/simple.py +232 -0
  85. lsurf/propagation/kernels/absorption/spectral.py +410 -0
  86. lsurf/propagation/kernels/detection/__init__.py +64 -0
  87. lsurf/propagation/kernels/detection/protocol.py +102 -0
  88. lsurf/propagation/kernels/detection/spherical.py +255 -0
  89. lsurf/propagation/kernels/device_functions.py +790 -0
  90. lsurf/propagation/kernels/fresnel/__init__.py +64 -0
  91. lsurf/propagation/kernels/fresnel/protocol.py +97 -0
  92. lsurf/propagation/kernels/fresnel/standard.py +258 -0
  93. lsurf/propagation/kernels/intersection/__init__.py +79 -0
  94. lsurf/propagation/kernels/intersection/annular_plane.py +207 -0
  95. lsurf/propagation/kernels/intersection/bounded_plane.py +205 -0
  96. lsurf/propagation/kernels/intersection/plane.py +166 -0
  97. lsurf/propagation/kernels/intersection/protocol.py +95 -0
  98. lsurf/propagation/kernels/intersection/signed_distance.py +742 -0
  99. lsurf/propagation/kernels/intersection/sphere.py +190 -0
  100. lsurf/propagation/kernels/propagation/__init__.py +85 -0
  101. lsurf/propagation/kernels/propagation/grid.py +527 -0
  102. lsurf/propagation/kernels/propagation/protocol.py +105 -0
  103. lsurf/propagation/kernels/propagation/simple.py +460 -0
  104. lsurf/propagation/kernels/propagation/spectral.py +875 -0
  105. lsurf/propagation/kernels/registry.py +331 -0
  106. lsurf/propagation/kernels/surface/__init__.py +72 -0
  107. lsurf/propagation/kernels/surface/bisection.py +232 -0
  108. lsurf/propagation/kernels/surface/detection.py +402 -0
  109. lsurf/propagation/kernels/surface/reduction.py +166 -0
  110. lsurf/propagation/propagator_protocol.py +222 -0
  111. lsurf/propagation/propagators/__init__.py +101 -0
  112. lsurf/propagation/propagators/detector_handler.py +354 -0
  113. lsurf/propagation/propagators/factory.py +200 -0
  114. lsurf/propagation/propagators/fresnel_handler.py +305 -0
  115. lsurf/propagation/propagators/gpu_gradient.py +566 -0
  116. lsurf/propagation/propagators/gpu_surface_propagator.py +707 -0
  117. lsurf/propagation/propagators/gradient.py +429 -0
  118. lsurf/propagation/propagators/intersection_handler.py +327 -0
  119. lsurf/propagation/propagators/material_propagator.py +398 -0
  120. lsurf/propagation/propagators/signed_distance_handler.py +522 -0
  121. lsurf/propagation/propagators/spectral_gpu_gradient.py +553 -0
  122. lsurf/propagation/propagators/surface_interaction.py +616 -0
  123. lsurf/propagation/propagators/surface_propagator.py +719 -0
  124. lsurf/py.typed +1 -0
  125. lsurf/simulation/__init__.py +70 -0
  126. lsurf/simulation/config.py +164 -0
  127. lsurf/simulation/orchestrator.py +462 -0
  128. lsurf/simulation/result.py +299 -0
  129. lsurf/simulation/simulation.py +262 -0
  130. lsurf/sources/__init__.py +128 -0
  131. lsurf/sources/base.py +264 -0
  132. lsurf/sources/collimated.py +252 -0
  133. lsurf/sources/custom.py +409 -0
  134. lsurf/sources/diverging.py +228 -0
  135. lsurf/sources/gaussian.py +272 -0
  136. lsurf/sources/parallel_from_positions.py +197 -0
  137. lsurf/sources/point.py +172 -0
  138. lsurf/sources/uniform_diverging.py +258 -0
  139. lsurf/surfaces/__init__.py +184 -0
  140. lsurf/surfaces/cpu/__init__.py +50 -0
  141. lsurf/surfaces/cpu/curved_wave.py +463 -0
  142. lsurf/surfaces/cpu/gerstner_wave.py +381 -0
  143. lsurf/surfaces/cpu/wave_params.py +118 -0
  144. lsurf/surfaces/gpu/__init__.py +72 -0
  145. lsurf/surfaces/gpu/annular_plane.py +453 -0
  146. lsurf/surfaces/gpu/bounded_plane.py +390 -0
  147. lsurf/surfaces/gpu/curved_wave.py +483 -0
  148. lsurf/surfaces/gpu/gerstner_wave.py +377 -0
  149. lsurf/surfaces/gpu/multi_curved_wave.py +520 -0
  150. lsurf/surfaces/gpu/plane.py +299 -0
  151. lsurf/surfaces/gpu/recording_sphere.py +587 -0
  152. lsurf/surfaces/gpu/sphere.py +311 -0
  153. lsurf/surfaces/protocol.py +336 -0
  154. lsurf/surfaces/registry.py +373 -0
  155. lsurf/utilities/__init__.py +175 -0
  156. lsurf/utilities/detector_analysis.py +814 -0
  157. lsurf/utilities/fresnel.py +628 -0
  158. lsurf/utilities/interactions.py +1215 -0
  159. lsurf/utilities/propagation.py +602 -0
  160. lsurf/utilities/ray_data.py +532 -0
  161. lsurf/utilities/recording_sphere.py +745 -0
  162. lsurf/utilities/time_spread.py +463 -0
  163. lsurf/visualization/__init__.py +329 -0
  164. lsurf/visualization/absorption_plots.py +334 -0
  165. lsurf/visualization/atmospheric_plots.py +754 -0
  166. lsurf/visualization/common.py +348 -0
  167. lsurf/visualization/detector_plots.py +1350 -0
  168. lsurf/visualization/detector_sphere_plots.py +1173 -0
  169. lsurf/visualization/fresnel_plots.py +1061 -0
  170. lsurf/visualization/ocean_simulation_plots.py +999 -0
  171. lsurf/visualization/polarization_plots.py +916 -0
  172. lsurf/visualization/raytracing_plots.py +1521 -0
  173. lsurf/visualization/ring_detector_plots.py +1867 -0
  174. lsurf/visualization/time_spread_plots.py +531 -0
  175. lsurf-1.0.0.dist-info/METADATA +381 -0
  176. lsurf-1.0.0.dist-info/RECORD +180 -0
  177. lsurf-1.0.0.dist-info/WHEEL +5 -0
  178. lsurf-1.0.0.dist-info/entry_points.txt +2 -0
  179. lsurf-1.0.0.dist-info/licenses/LICENSE +32 -0
  180. lsurf-1.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,160 @@
1
+ # The Clear BSD License
2
+ #
3
+ # Copyright (c) 2026 Tobias Heibges
4
+ # All rights reserved.
5
+ #
6
+ # Redistribution and use in source and binary forms, with or without
7
+ # modification, are permitted (subject to the limitations in the disclaimer
8
+ # below) provided that the following conditions are met:
9
+ #
10
+ # * Redistributions of source code must retain the above copyright notice,
11
+ # this list of conditions and the following disclaimer.
12
+ #
13
+ # * Redistributions in binary form must reproduce the above copyright
14
+ # notice, this list of conditions and the following disclaimer in the
15
+ # documentation and/or other materials provided with the distribution.
16
+ #
17
+ # * Neither the name of the copyright holder nor the names of its
18
+ # contributors may be used to endorse or promote products derived from this
19
+ # software without specific prior written permission.
20
+ #
21
+ # NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY
22
+ # THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
23
+ # CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24
+ # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
25
+ # PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
26
+ # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27
+ # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28
+ # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
29
+ # BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
30
+ # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32
+ # POSSIBILITY OF SUCH DAMAGE.
33
+
34
+ """
35
+ Dispersion Model Functions
36
+
37
+ Provides functions for computing wavelength-dependent refractive indices
38
+ using standard dispersion models (Sellmeier, Cauchy).
39
+ """
40
+
41
+ import math
42
+
43
+
44
+ def sellmeier_refractive_index(
45
+ wavelength: float,
46
+ B1: float = 1.03961212,
47
+ B2: float = 0.231792344,
48
+ B3: float = 1.01046945,
49
+ C1: float = 6.00069867e-3,
50
+ C2: float = 2.00179144e-2,
51
+ C3: float = 1.03560653e2,
52
+ ) -> float:
53
+ """
54
+ Compute refractive index using Sellmeier equation.
55
+
56
+ The Sellmeier equation is an empirical formula that accurately models
57
+ the dispersion of optical glasses.
58
+
59
+ Parameters
60
+ ----------
61
+ wavelength : float
62
+ Wavelength in meters.
63
+ B1, B2, B3 : float
64
+ Sellmeier B coefficients (dimensionless).
65
+ Defaults are for N-BK7 glass.
66
+ C1, C2, C3 : float
67
+ Sellmeier C coefficients in μm².
68
+ Defaults are for N-BK7 glass.
69
+
70
+ Returns
71
+ -------
72
+ n : float
73
+ Refractive index at given wavelength.
74
+
75
+ Notes
76
+ -----
77
+ Sellmeier equation:
78
+
79
+ n² - 1 = B₁λ²/(λ² - C₁) + B₂λ²/(λ² - C₂) + B₃λ²/(λ² - C₃)
80
+
81
+ where λ is in micrometers.
82
+
83
+ Default coefficients are for Schott N-BK7 glass, valid 300-2500 nm.
84
+
85
+ References
86
+ ----------
87
+ .. [1] Sellmeier, W. (1871). Ann. Phys. Chem., 143, 271.
88
+ .. [2] Schott AG. Technical Information TIE-29.
89
+
90
+ Examples
91
+ --------
92
+ >>> n_589nm = sellmeier_refractive_index(589e-9)
93
+ >>> print(f"n = {n_589nm:.6f}") # ~1.5168
94
+ """
95
+ # Convert wavelength to micrometers
96
+ wl_um = wavelength * 1e6
97
+ wl2 = wl_um * wl_um
98
+
99
+ # Sellmeier equation
100
+ n2_minus_1 = B1 * wl2 / (wl2 - C1) + B2 * wl2 / (wl2 - C2) + B3 * wl2 / (wl2 - C3)
101
+
102
+ return math.sqrt(1.0 + n2_minus_1)
103
+
104
+
105
+ def cauchy_refractive_index(
106
+ wavelength: float,
107
+ A: float = 1.458,
108
+ B: float = 3.54e-3,
109
+ C: float = 0.0,
110
+ ) -> float:
111
+ """
112
+ Compute refractive index using Cauchy equation.
113
+
114
+ The Cauchy equation is a simple empirical dispersion formula,
115
+ valid in regions of normal dispersion (away from absorption bands).
116
+
117
+ Parameters
118
+ ----------
119
+ wavelength : float
120
+ Wavelength in meters.
121
+ A : float
122
+ Constant term (refractive index at infinite wavelength).
123
+ Default is for typical crown glass.
124
+ B : float
125
+ First-order dispersion coefficient in μm².
126
+ Default is for typical crown glass.
127
+ C : float
128
+ Second-order dispersion coefficient in μm⁴.
129
+ Default is 0.
130
+
131
+ Returns
132
+ -------
133
+ n : float
134
+ Refractive index at given wavelength.
135
+
136
+ Notes
137
+ -----
138
+ Cauchy equation:
139
+
140
+ n(λ) = A + B/λ² + C/λ⁴
141
+
142
+ where λ is in micrometers.
143
+
144
+ Suitable for glasses and transparent materials in visible range.
145
+ Less accurate than Sellmeier near absorption edges.
146
+
147
+ References
148
+ ----------
149
+ .. [1] Cauchy, A.-L. (1836). Bull. Sci. Math., 14, 6-10.
150
+
151
+ Examples
152
+ --------
153
+ >>> n_550nm = cauchy_refractive_index(550e-9, A=1.5, B=0.004)
154
+ >>> print(f"n = {n_550nm:.4f}")
155
+ """
156
+ # Convert to micrometers
157
+ wl_um = wavelength * 1e6
158
+ wl2 = wl_um * wl_um
159
+
160
+ return A + B / wl2 + C / (wl2 * wl2)
@@ -0,0 +1,142 @@
1
+ # The Clear BSD License
2
+ #
3
+ # Copyright (c) 2026 Tobias Heibges
4
+ # All rights reserved.
5
+ #
6
+ # Redistribution and use in source and binary forms, with or without
7
+ # modification, are permitted (subject to the limitations in the disclaimer
8
+ # below) provided that the following conditions are met:
9
+ #
10
+ # * Redistributions of source code must retain the above copyright notice,
11
+ # this list of conditions and the following disclaimer.
12
+ #
13
+ # * Redistributions in binary form must reproduce the above copyright
14
+ # notice, this list of conditions and the following disclaimer in the
15
+ # documentation and/or other materials provided with the distribution.
16
+ #
17
+ # * Neither the name of the copyright holder nor the names of its
18
+ # contributors may be used to endorse or promote products derived from this
19
+ # software without specific prior written permission.
20
+ #
21
+ # NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY
22
+ # THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
23
+ # CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24
+ # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
25
+ # PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
26
+ # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27
+ # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28
+ # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
29
+ # BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
30
+ # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32
+ # POSSIBILITY OF SUCH DAMAGE.
33
+
34
+ """
35
+ Factory Functions for Creating Materials
36
+
37
+ Provides convenience functions for creating materials with dispersion models.
38
+ """
39
+
40
+ from __future__ import annotations
41
+
42
+ from typing import TYPE_CHECKING
43
+
44
+ from .dispersion import sellmeier_refractive_index, cauchy_refractive_index
45
+
46
+ if TYPE_CHECKING:
47
+ from ..base import HomogeneousMaterial
48
+
49
+
50
+ def create_sellmeier_material(
51
+ name: str,
52
+ B1: float,
53
+ B2: float,
54
+ B3: float,
55
+ C1: float,
56
+ C2: float,
57
+ C3: float,
58
+ absorption_coef: float = 0.0,
59
+ ) -> HomogeneousMaterial:
60
+ """
61
+ Create a material with Sellmeier dispersion.
62
+
63
+ Parameters
64
+ ----------
65
+ name : str
66
+ Material name.
67
+ B1, B2, B3 : float
68
+ Sellmeier B coefficients (dimensionless).
69
+ C1, C2, C3 : float
70
+ Sellmeier C coefficients in μm².
71
+ absorption_coef : float, optional
72
+ Absorption coefficient in m⁻¹. Default is 0.
73
+
74
+ Returns
75
+ -------
76
+ material : HomogeneousMaterial
77
+ Material with wavelength-dependent refractive index.
78
+
79
+ Examples
80
+ --------
81
+ >>> # Create N-BK7 glass with Sellmeier dispersion
82
+ >>> bk7 = create_sellmeier_material(
83
+ ... "N-BK7",
84
+ ... B1=1.03961212, B2=0.231792344, B3=1.01046945,
85
+ ... C1=6.00069867e-3, C2=2.00179144e-2, C3=1.03560653e2,
86
+ ... )
87
+ """
88
+ from ..base import HomogeneousMaterial
89
+
90
+ def n_func(wavelength: float) -> float:
91
+ return sellmeier_refractive_index(wavelength, B1, B2, B3, C1, C2, C3)
92
+
93
+ return HomogeneousMaterial(
94
+ name=name,
95
+ refractive_index=n_func,
96
+ absorption_coef=absorption_coef,
97
+ )
98
+
99
+
100
+ def create_cauchy_material(
101
+ name: str,
102
+ A: float,
103
+ B: float,
104
+ C: float = 0.0,
105
+ absorption_coef: float = 0.0,
106
+ ) -> HomogeneousMaterial:
107
+ """
108
+ Create a material with Cauchy dispersion.
109
+
110
+ Parameters
111
+ ----------
112
+ name : str
113
+ Material name.
114
+ A : float
115
+ Constant term.
116
+ B : float
117
+ First-order dispersion coefficient in μm².
118
+ C : float, optional
119
+ Second-order dispersion coefficient in μm⁴. Default is 0.
120
+ absorption_coef : float, optional
121
+ Absorption coefficient in m⁻¹. Default is 0.
122
+
123
+ Returns
124
+ -------
125
+ material : HomogeneousMaterial
126
+ Material with wavelength-dependent refractive index.
127
+
128
+ Examples
129
+ --------
130
+ >>> # Create simple glass with Cauchy dispersion
131
+ >>> glass = create_cauchy_material("Glass", A=1.52, B=0.004)
132
+ """
133
+ from ..base import HomogeneousMaterial
134
+
135
+ def n_func(wavelength: float) -> float:
136
+ return cauchy_refractive_index(wavelength, A, B, C)
137
+
138
+ return HomogeneousMaterial(
139
+ name=name,
140
+ refractive_index=n_func,
141
+ absorption_coef=absorption_coef,
142
+ )
@@ -0,0 +1,91 @@
1
+ # The Clear BSD License
2
+ #
3
+ # Copyright (c) 2026 Tobias Heibges
4
+ # All rights reserved.
5
+ #
6
+ # Redistribution and use in source and binary forms, with or without
7
+ # modification, are permitted (subject to the limitations in the disclaimer
8
+ # below) provided that the following conditions are met:
9
+ #
10
+ # * Redistributions of source code must retain the above copyright notice,
11
+ # this list of conditions and the following disclaimer.
12
+ #
13
+ # * Redistributions in binary form must reproduce the above copyright
14
+ # notice, this list of conditions and the following disclaimer in the
15
+ # documentation and/or other materials provided with the distribution.
16
+ #
17
+ # * Neither the name of the copyright holder nor the names of its
18
+ # contributors may be used to endorse or promote products derived from this
19
+ # software without specific prior written permission.
20
+ #
21
+ # NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY
22
+ # THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
23
+ # CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24
+ # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
25
+ # PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
26
+ # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27
+ # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28
+ # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
29
+ # BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
30
+ # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32
+ # POSSIBILITY OF SUCH DAMAGE.
33
+
34
+ """
35
+ GPU acceleration modules for ray tracing.
36
+
37
+ This package contains CUDA kernels and GPU-accelerated functions for
38
+ ray propagation, intersection testing, and material interactions.
39
+
40
+ Module Structure
41
+ ----------------
42
+ - propagator_protocol: Protocol definitions (GPUMaterialID, GPUMaterialProtocol, etc.)
43
+ - propagators/: Propagator classes and handlers
44
+ - kernels/: Pure CUDA kernels and device functions
45
+ - detector_gpu: GPU-accelerated detector operations
46
+ """
47
+
48
+ # Re-export protocols and enums
49
+ from .propagator_protocol import (
50
+ RayPropagatorProtocol,
51
+ MaterialFieldProtocol,
52
+ GPUMaterialProtocol,
53
+ GPUMaterialID,
54
+ )
55
+
56
+ # Re-export propagators
57
+ from .propagators import (
58
+ GradientPropagator,
59
+ GPUGradientPropagator,
60
+ SpectralGPUGradientPropagator,
61
+ SurfacePropagator,
62
+ GPUSurfacePropagator,
63
+ HitData,
64
+ create_propagator,
65
+ )
66
+
67
+ # GPU device ray data structure
68
+ from .gpu_device_rays import GPUDeviceRays
69
+
70
+ # Convenience alias
71
+ GPUInhomogeneousPropagator = GPUGradientPropagator
72
+
73
+ __all__ = [
74
+ # Protocols and enums
75
+ "RayPropagatorProtocol",
76
+ "MaterialFieldProtocol",
77
+ "GPUMaterialProtocol",
78
+ "GPUMaterialID",
79
+ # Propagators
80
+ "GradientPropagator",
81
+ "GPUGradientPropagator",
82
+ "GPUInhomogeneousPropagator",
83
+ "SpectralGPUGradientPropagator",
84
+ "SurfacePropagator",
85
+ "GPUSurfacePropagator",
86
+ "HitData",
87
+ # GPU data structures
88
+ "GPUDeviceRays",
89
+ # Factory
90
+ "create_propagator",
91
+ ]
@@ -0,0 +1,67 @@
1
+ # The Clear BSD License
2
+ #
3
+ # Copyright (c) 2026 Tobias Heibges
4
+ # All rights reserved.
5
+ #
6
+ # Redistribution and use in source and binary forms, with or without
7
+ # modification, are permitted (subject to the limitations in the disclaimer
8
+ # below) provided that the following conditions are met:
9
+ #
10
+ # * Redistributions of source code must retain the above copyright notice,
11
+ # this list of conditions and the following disclaimer.
12
+ #
13
+ # * Redistributions in binary form must reproduce the above copyright
14
+ # notice, this list of conditions and the following disclaimer in the
15
+ # documentation and/or other materials provided with the distribution.
16
+ #
17
+ # * Neither the name of the copyright holder nor the names of its
18
+ # contributors may be used to endorse or promote products derived from this
19
+ # software without specific prior written permission.
20
+ #
21
+ # NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY
22
+ # THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
23
+ # CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24
+ # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
25
+ # PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
26
+ # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27
+ # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28
+ # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
29
+ # BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
30
+ # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32
+ # POSSIBILITY OF SUCH DAMAGE.
33
+
34
+ """
35
+ GPU-Accelerated Detector Operations
36
+
37
+ This module provides GPU-accelerated ray detection for spherical and planar
38
+ detectors, enabling fast parallel detection of many rays against many detector
39
+ positions simultaneously.
40
+
41
+ Architecture
42
+ ------------
43
+ - Kernels (kernels/detection/) contain pure CUDA kernels only
44
+ - Handlers (propagators/detector_handler.py) contain GPU memory management
45
+ - This module re-exports from both for backward compatibility
46
+ """
47
+
48
+ # Pure CUDA kernels from kernels module
49
+ from .kernels.detection import (
50
+ kernel_spherical_detect_single,
51
+ kernel_spherical_detect_multi,
52
+ HAS_CUDA,
53
+ )
54
+
55
+ # GPU memory management wrappers from handler
56
+ from .propagators.detector_handler import (
57
+ detect_spherical_gpu,
58
+ detect_multi_spherical_gpu,
59
+ )
60
+
61
+ __all__ = [
62
+ "kernel_spherical_detect_single",
63
+ "kernel_spherical_detect_multi",
64
+ "detect_spherical_gpu",
65
+ "detect_multi_spherical_gpu",
66
+ "HAS_CUDA",
67
+ ]