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.
- lsurf/__init__.py +471 -0
- lsurf/analysis/__init__.py +107 -0
- lsurf/analysis/healpix_utils.py +418 -0
- lsurf/analysis/sphere_viz.py +1280 -0
- lsurf/cli/__init__.py +48 -0
- lsurf/cli/build.py +398 -0
- lsurf/cli/config_schema.py +318 -0
- lsurf/cli/gui_cmd.py +76 -0
- lsurf/cli/interactive.py +850 -0
- lsurf/cli/main.py +81 -0
- lsurf/cli/run.py +806 -0
- lsurf/detectors/__init__.py +266 -0
- lsurf/detectors/analysis.py +289 -0
- lsurf/detectors/base.py +284 -0
- lsurf/detectors/constant_size_rings.py +485 -0
- lsurf/detectors/directional.py +45 -0
- lsurf/detectors/extended/__init__.py +73 -0
- lsurf/detectors/extended/local_sphere.py +353 -0
- lsurf/detectors/extended/recording_sphere.py +368 -0
- lsurf/detectors/planar.py +45 -0
- lsurf/detectors/protocol.py +187 -0
- lsurf/detectors/recording_spheres.py +63 -0
- lsurf/detectors/results.py +1140 -0
- lsurf/detectors/small/__init__.py +79 -0
- lsurf/detectors/small/directional.py +330 -0
- lsurf/detectors/small/planar.py +401 -0
- lsurf/detectors/small/spherical.py +450 -0
- lsurf/detectors/spherical.py +45 -0
- lsurf/geometry/__init__.py +199 -0
- lsurf/geometry/builder.py +478 -0
- lsurf/geometry/cell.py +228 -0
- lsurf/geometry/cell_geometry.py +247 -0
- lsurf/geometry/detector_arrays.py +1785 -0
- lsurf/geometry/geometry.py +222 -0
- lsurf/geometry/surface_analysis.py +375 -0
- lsurf/geometry/validation.py +91 -0
- lsurf/gui/__init__.py +51 -0
- lsurf/gui/app.py +903 -0
- lsurf/gui/core/__init__.py +39 -0
- lsurf/gui/core/scene.py +343 -0
- lsurf/gui/core/simulation.py +264 -0
- lsurf/gui/renderers/__init__.py +40 -0
- lsurf/gui/renderers/ray_renderer.py +353 -0
- lsurf/gui/renderers/source_renderer.py +505 -0
- lsurf/gui/renderers/surface_renderer.py +477 -0
- lsurf/gui/views/__init__.py +48 -0
- lsurf/gui/views/config_editor.py +3199 -0
- lsurf/gui/views/properties.py +257 -0
- lsurf/gui/views/results.py +291 -0
- lsurf/gui/views/scene_tree.py +180 -0
- lsurf/gui/views/viewport_3d.py +555 -0
- lsurf/gui/views/visualizations.py +712 -0
- lsurf/materials/__init__.py +169 -0
- lsurf/materials/base/__init__.py +64 -0
- lsurf/materials/base/full_inhomogeneous.py +208 -0
- lsurf/materials/base/grid_inhomogeneous.py +319 -0
- lsurf/materials/base/homogeneous.py +342 -0
- lsurf/materials/base/material_field.py +527 -0
- lsurf/materials/base/simple_inhomogeneous.py +418 -0
- lsurf/materials/base/spectral_inhomogeneous.py +497 -0
- lsurf/materials/implementations/__init__.py +120 -0
- lsurf/materials/implementations/data/alpha_values_typical_atmosphere_updated.txt +24 -0
- lsurf/materials/implementations/duct_atmosphere.py +390 -0
- lsurf/materials/implementations/exponential_atmosphere.py +435 -0
- lsurf/materials/implementations/gaussian_lens.py +120 -0
- lsurf/materials/implementations/interpolated_data.py +123 -0
- lsurf/materials/implementations/layered_atmosphere.py +134 -0
- lsurf/materials/implementations/linear_gradient.py +109 -0
- lsurf/materials/implementations/linsley_atmosphere.py +764 -0
- lsurf/materials/implementations/standard_materials.py +126 -0
- lsurf/materials/implementations/turbulent_atmosphere.py +135 -0
- lsurf/materials/implementations/us_standard_atmosphere.py +149 -0
- lsurf/materials/utils/__init__.py +77 -0
- lsurf/materials/utils/constants.py +45 -0
- lsurf/materials/utils/device_functions.py +117 -0
- lsurf/materials/utils/dispersion.py +160 -0
- lsurf/materials/utils/factories.py +142 -0
- lsurf/propagation/__init__.py +91 -0
- lsurf/propagation/detector_gpu.py +67 -0
- lsurf/propagation/gpu_device_rays.py +294 -0
- lsurf/propagation/kernels/__init__.py +175 -0
- lsurf/propagation/kernels/absorption/__init__.py +61 -0
- lsurf/propagation/kernels/absorption/grid.py +240 -0
- lsurf/propagation/kernels/absorption/simple.py +232 -0
- lsurf/propagation/kernels/absorption/spectral.py +410 -0
- lsurf/propagation/kernels/detection/__init__.py +64 -0
- lsurf/propagation/kernels/detection/protocol.py +102 -0
- lsurf/propagation/kernels/detection/spherical.py +255 -0
- lsurf/propagation/kernels/device_functions.py +790 -0
- lsurf/propagation/kernels/fresnel/__init__.py +64 -0
- lsurf/propagation/kernels/fresnel/protocol.py +97 -0
- lsurf/propagation/kernels/fresnel/standard.py +258 -0
- lsurf/propagation/kernels/intersection/__init__.py +79 -0
- lsurf/propagation/kernels/intersection/annular_plane.py +207 -0
- lsurf/propagation/kernels/intersection/bounded_plane.py +205 -0
- lsurf/propagation/kernels/intersection/plane.py +166 -0
- lsurf/propagation/kernels/intersection/protocol.py +95 -0
- lsurf/propagation/kernels/intersection/signed_distance.py +742 -0
- lsurf/propagation/kernels/intersection/sphere.py +190 -0
- lsurf/propagation/kernels/propagation/__init__.py +85 -0
- lsurf/propagation/kernels/propagation/grid.py +527 -0
- lsurf/propagation/kernels/propagation/protocol.py +105 -0
- lsurf/propagation/kernels/propagation/simple.py +460 -0
- lsurf/propagation/kernels/propagation/spectral.py +875 -0
- lsurf/propagation/kernels/registry.py +331 -0
- lsurf/propagation/kernels/surface/__init__.py +72 -0
- lsurf/propagation/kernels/surface/bisection.py +232 -0
- lsurf/propagation/kernels/surface/detection.py +402 -0
- lsurf/propagation/kernels/surface/reduction.py +166 -0
- lsurf/propagation/propagator_protocol.py +222 -0
- lsurf/propagation/propagators/__init__.py +101 -0
- lsurf/propagation/propagators/detector_handler.py +354 -0
- lsurf/propagation/propagators/factory.py +200 -0
- lsurf/propagation/propagators/fresnel_handler.py +305 -0
- lsurf/propagation/propagators/gpu_gradient.py +566 -0
- lsurf/propagation/propagators/gpu_surface_propagator.py +707 -0
- lsurf/propagation/propagators/gradient.py +429 -0
- lsurf/propagation/propagators/intersection_handler.py +327 -0
- lsurf/propagation/propagators/material_propagator.py +398 -0
- lsurf/propagation/propagators/signed_distance_handler.py +522 -0
- lsurf/propagation/propagators/spectral_gpu_gradient.py +553 -0
- lsurf/propagation/propagators/surface_interaction.py +616 -0
- lsurf/propagation/propagators/surface_propagator.py +719 -0
- lsurf/py.typed +1 -0
- lsurf/simulation/__init__.py +70 -0
- lsurf/simulation/config.py +164 -0
- lsurf/simulation/orchestrator.py +462 -0
- lsurf/simulation/result.py +299 -0
- lsurf/simulation/simulation.py +262 -0
- lsurf/sources/__init__.py +128 -0
- lsurf/sources/base.py +264 -0
- lsurf/sources/collimated.py +252 -0
- lsurf/sources/custom.py +409 -0
- lsurf/sources/diverging.py +228 -0
- lsurf/sources/gaussian.py +272 -0
- lsurf/sources/parallel_from_positions.py +197 -0
- lsurf/sources/point.py +172 -0
- lsurf/sources/uniform_diverging.py +258 -0
- lsurf/surfaces/__init__.py +184 -0
- lsurf/surfaces/cpu/__init__.py +50 -0
- lsurf/surfaces/cpu/curved_wave.py +463 -0
- lsurf/surfaces/cpu/gerstner_wave.py +381 -0
- lsurf/surfaces/cpu/wave_params.py +118 -0
- lsurf/surfaces/gpu/__init__.py +72 -0
- lsurf/surfaces/gpu/annular_plane.py +453 -0
- lsurf/surfaces/gpu/bounded_plane.py +390 -0
- lsurf/surfaces/gpu/curved_wave.py +483 -0
- lsurf/surfaces/gpu/gerstner_wave.py +377 -0
- lsurf/surfaces/gpu/multi_curved_wave.py +520 -0
- lsurf/surfaces/gpu/plane.py +299 -0
- lsurf/surfaces/gpu/recording_sphere.py +587 -0
- lsurf/surfaces/gpu/sphere.py +311 -0
- lsurf/surfaces/protocol.py +336 -0
- lsurf/surfaces/registry.py +373 -0
- lsurf/utilities/__init__.py +175 -0
- lsurf/utilities/detector_analysis.py +814 -0
- lsurf/utilities/fresnel.py +628 -0
- lsurf/utilities/interactions.py +1215 -0
- lsurf/utilities/propagation.py +602 -0
- lsurf/utilities/ray_data.py +532 -0
- lsurf/utilities/recording_sphere.py +745 -0
- lsurf/utilities/time_spread.py +463 -0
- lsurf/visualization/__init__.py +329 -0
- lsurf/visualization/absorption_plots.py +334 -0
- lsurf/visualization/atmospheric_plots.py +754 -0
- lsurf/visualization/common.py +348 -0
- lsurf/visualization/detector_plots.py +1350 -0
- lsurf/visualization/detector_sphere_plots.py +1173 -0
- lsurf/visualization/fresnel_plots.py +1061 -0
- lsurf/visualization/ocean_simulation_plots.py +999 -0
- lsurf/visualization/polarization_plots.py +916 -0
- lsurf/visualization/raytracing_plots.py +1521 -0
- lsurf/visualization/ring_detector_plots.py +1867 -0
- lsurf/visualization/time_spread_plots.py +531 -0
- lsurf-1.0.0.dist-info/METADATA +381 -0
- lsurf-1.0.0.dist-info/RECORD +180 -0
- lsurf-1.0.0.dist-info/WHEEL +5 -0
- lsurf-1.0.0.dist-info/entry_points.txt +2 -0
- lsurf-1.0.0.dist-info/licenses/LICENSE +32 -0
- 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
|
+
]
|