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,381 @@
1
+ Metadata-Version: 2.4
2
+ Name: lsurf
3
+ Version: 1.0.0
4
+ Summary: L-SURF: GPU-accelerated physically-accurate raytracing framework for simulating light-surface interactions
5
+ Author: Tobias Heibges
6
+ Maintainer: Tobias Heibges
7
+ License: BSD-3-Clause-Clear
8
+ Project-URL: Homepage, https://github.com/tobi-h/lsurf
9
+ Project-URL: Documentation, https://github.com/tobi-h/lsurf#readme
10
+ Project-URL: Repository, https://github.com/tobi-h/lsurf.git
11
+ Project-URL: Issues, https://github.com/tobi-h/lsurf/issues
12
+ Keywords: raytracing,gpu,cuda,numba,optics,fresnel,reflection,refraction,waves,ocean,simulation,physics
13
+ Classifier: Development Status :: 4 - Beta
14
+ Classifier: Intended Audience :: Science/Research
15
+ Classifier: License :: OSI Approved :: BSD License
16
+ Classifier: Operating System :: OS Independent
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Programming Language :: Python :: 3.14
20
+ Classifier: Topic :: Scientific/Engineering :: Physics
21
+ Classifier: Topic :: Scientific/Engineering :: Visualization
22
+ Requires-Python: >=3.13
23
+ Description-Content-Type: text/markdown
24
+ License-File: LICENSE
25
+ Requires-Dist: numpy>=1.24.0
26
+ Requires-Dist: matplotlib>=3.7.0
27
+ Requires-Dist: pydantic>=2.0.0
28
+ Requires-Dist: numba>=0.58.0
29
+ Requires-Dist: h5py>=3.8.0
30
+ Requires-Dist: astropy-healpix>=1.0.0
31
+ Requires-Dist: matplotlib-label-lines>=0.7.0
32
+ Requires-Dist: click>=8.0.0
33
+ Requires-Dist: rich>=13.0.0
34
+ Requires-Dist: questionary>=2.0.0
35
+ Requires-Dist: pyyaml>=6.0.0
36
+ Requires-Dist: tomli>=2.0.0
37
+ Requires-Dist: tomli-w>=1.0.0
38
+ Requires-Dist: dearpygui>=2.0.0
39
+ Requires-Dist: pytest>=7.0.0
40
+ Requires-Dist: pytest-cov>=4.0.0
41
+ Requires-Dist: scipy>=1.11.0
42
+ Requires-Dist: black>=23.0.0
43
+ Requires-Dist: ruff>=0.1.0
44
+ Requires-Dist: mypy>=1.0.0
45
+ Requires-Dist: pre-commit>=3.0.0
46
+ Requires-Dist: build>=1.0.0
47
+ Requires-Dist: twine>=4.0.0
48
+ Provides-Extra: docs
49
+ Requires-Dist: sphinx>=7.0.0; extra == "docs"
50
+ Requires-Dist: sphinx-rtd-theme>=2.0.0; extra == "docs"
51
+ Requires-Dist: sphinx-autodoc-typehints>=1.24.0; extra == "docs"
52
+ Dynamic: license-file
53
+
54
+ # L-SURF
55
+
56
+ <p align="center">
57
+ <img src="lsurf_logo.jpg" alt="L-SURF Logo" width="400">
58
+ </p>
59
+
60
+ <p align="center">
61
+ <a href="https://pypi.org/project/lsurf/"><img src="https://badge.fury.io/py/lsurf.svg" alt="PyPI version"></a>
62
+ <a href="https://www.python.org/downloads/"><img src="https://img.shields.io/badge/python-3.13+-blue.svg" alt="Python 3.13+"></a>
63
+ <a href="https://spdx.org/licenses/BSD-3-Clause-Clear.html"><img src="https://img.shields.io/badge/License-BSD--3--Clause--Clear-blue.svg" alt="License"></a>
64
+ <a href="https://l-surf-b86f2d.gitlab.io/"><img src="https://img.shields.io/badge/docs-GitLab%20Pages-orange.svg" alt="Documentation"></a>
65
+ </p>
66
+
67
+ **L**ight **SURF**ace Reflections - GPU-accelerated physically-accurate raytracing framework for simulating light-surface interactions.
68
+
69
+ **Documentation:** https://l-surf-b86f2d.gitlab.io
70
+
71
+ ## Features
72
+
73
+ - **Fresnel reflection and refraction** - Physically accurate polarization-dependent coefficients
74
+ - **Multiple scattering** - Multi-bounce ray tracing with intensity splitting
75
+ - **Ocean wave surfaces** - Gerstner wave modeling with curved Earth geometry
76
+ - **GPU acceleration** - CUDA-accelerated via Numba for high-performance simulations
77
+ - **Wavelength-dependent materials** - Sellmeier and Cauchy dispersion models
78
+ - **Polarization tracking** - s and p polarization component handling
79
+
80
+ ## Installation
81
+
82
+ ### Prerequisites
83
+
84
+ #### NVIDIA GPU Support (Recommended)
85
+
86
+ For GPU-accelerated ray tracing, you need:
87
+
88
+ 1. **NVIDIA GPU** with CUDA Compute Capability 3.5+ (most GPUs from 2012 onwards)
89
+ 2. **NVIDIA Driver** (version 450+ recommended)
90
+ 3. **CUDA Toolkit** (version 11.0+ recommended)
91
+
92
+ **Check your system:**
93
+ ```bash
94
+ # Check NVIDIA driver
95
+ nvidia-smi
96
+
97
+ # Check CUDA version (if installed)
98
+ nvcc --version
99
+ ```
100
+
101
+ **Installing NVIDIA drivers (if needed):**
102
+ ```bash
103
+ # Ubuntu/Debian
104
+ sudo apt update
105
+ sudo apt install nvidia-driver-535 # or latest version
106
+
107
+ # Fedora
108
+ sudo dnf install akmod-nvidia
109
+ ```
110
+
111
+ **Installing CUDA Toolkit:**
112
+ - Download from [NVIDIA CUDA Downloads](https://developer.nvidia.com/cuda-downloads)
113
+ - Or use your distribution's package manager
114
+
115
+ > **Note:** The package works without a GPU (CPU fallback), but simulations will be significantly slower.
116
+
117
+ #### Python Environment
118
+
119
+ - Python >= 3.13
120
+ - pip, conda, or mamba
121
+
122
+ ### Install from PyPI
123
+
124
+ ```bash
125
+ pip install lsurf
126
+ ```
127
+
128
+ ### Development Installation
129
+
130
+ ```bash
131
+ git clone https://github.com/tobi-h/lsurf.git
132
+ cd lsurf
133
+ pip install -e .
134
+ ```
135
+
136
+ ### Verifying GPU Setup
137
+
138
+ After installation, verify everything works:
139
+
140
+ ```python
141
+ from numba import cuda
142
+
143
+ # Check CUDA availability
144
+ print(f"CUDA available: {cuda.is_available()}")
145
+
146
+ if cuda.is_available():
147
+ gpu = cuda.get_current_device()
148
+ print(f"GPU: {gpu.name}")
149
+ print(f"Compute Capability: {gpu.compute_capability}")
150
+ print(f"Memory: {gpu.total_memory / 1e9:.1f} GB")
151
+ ```
152
+
153
+ ### Troubleshooting
154
+
155
+ | Issue | Solution |
156
+ |-------|----------|
157
+ | `CUDA not available` | Install NVIDIA drivers and CUDA toolkit |
158
+ | `conda: PackagesNotFoundError` | Update conda: `conda update -n base conda` |
159
+ | `numba.cuda import error` | Ensure CUDA_HOME is set and nvcc is in PATH |
160
+ | `Out of memory` | Reduce `num_rays` or use batched processing |
161
+
162
+ ## Quick Start
163
+
164
+ ### Using the CLI (Recommended)
165
+
166
+ The **command-line interface** is the recommended way to run simulations:
167
+
168
+ ```bash
169
+ # Build a configuration interactively
170
+ lsurf build -o my_simulation.yaml
171
+
172
+ # Or use a built-in template
173
+ lsurf build --template ocean -o ocean_sim.yaml
174
+
175
+ # Validate the configuration
176
+ lsurf run my_simulation.yaml --dry-run
177
+
178
+ # Run the simulation
179
+ lsurf run my_simulation.yaml --progress
180
+
181
+ # Run with custom parameters
182
+ lsurf run my_simulation.yaml --num-rays 100000 --output-dir ./results
183
+ ```
184
+
185
+ ### Using the GUI
186
+
187
+ For interactive exploration and visualization, use the **graphical interface**:
188
+
189
+ ```bash
190
+ # Launch the GUI
191
+ lsurf gui
192
+
193
+ # Or load an existing configuration
194
+ lsurf gui my_simulation.yaml
195
+ ```
196
+
197
+ The GUI provides:
198
+ - Interactive 3D visualization of geometry
199
+ - Configuration editor with live preview
200
+ - One-click simulation execution
201
+ - Built-in result visualization and analysis
202
+
203
+ ### Python API
204
+
205
+ For custom workflows and advanced use cases, use the Python API with `GeometryBuilder`:
206
+
207
+ ```python
208
+ import lsurf as sr
209
+ from lsurf.geometry import GeometryBuilder
210
+ from lsurf.simulation import Simulation, SimulationConfig
211
+ from lsurf.surfaces import SphereSurface, PlaneSurface, SurfaceRole
212
+
213
+ # Define constants
214
+ EARTH_RADIUS = 6.371e6 # meters
215
+
216
+ # Create materials
217
+ atmosphere = sr.ExponentialAtmosphere(n_sea_level=1.000293)
218
+
219
+ # Create surfaces
220
+ ocean = SphereSurface(
221
+ center=(0, 0, -EARTH_RADIUS),
222
+ radius=EARTH_RADIUS,
223
+ role=SurfaceRole.OPTICAL,
224
+ name="ocean",
225
+ )
226
+
227
+ detector = PlaneSurface(
228
+ point=(0, 0, 35000),
229
+ normal=(0, 0, 1),
230
+ role=SurfaceRole.DETECTOR,
231
+ name="detector_35km",
232
+ )
233
+
234
+ # Build geometry with named media
235
+ geometry = (
236
+ GeometryBuilder()
237
+ .register_medium("atmosphere", atmosphere)
238
+ .register_medium("ocean", sr.WATER)
239
+ .set_background("atmosphere") # Ray propagation medium
240
+ .add_surface(ocean, front="atmosphere", back="ocean")
241
+ .add_detector(detector)
242
+ .build()
243
+ )
244
+
245
+ # Configure simulation
246
+ config = SimulationConfig(
247
+ step_size=100.0, # Max step size in meters
248
+ max_bounces=5, # Maximum surface interactions
249
+ adaptive_stepping=True, # Use smaller steps near surfaces
250
+ min_step_size=3e-4, # 0.3mm for ~1ps time resolution
251
+ )
252
+
253
+ # Create simulation and run
254
+ sim = Simulation(geometry, config)
255
+
256
+ # Generate rays from a source
257
+ source = sr.CollimatedBeam(
258
+ center=(0, 0, 1000),
259
+ direction=(0.17, 0, -0.98), # ~10° grazing angle
260
+ radius=10.0,
261
+ num_rays=10000,
262
+ wavelength=532e-9,
263
+ )
264
+ rays = source.generate()
265
+
266
+ # Run simulation
267
+ result = sim.run(rays)
268
+ print(f"Detected: {result.statistics.rays_detected}")
269
+ print(f"Absorbed: {result.statistics.rays_absorbed}")
270
+ ```
271
+
272
+ ### Simple Surface Interaction
273
+
274
+ For quick tests without the full simulation framework:
275
+
276
+ ```python
277
+ import lsurf as sr
278
+
279
+ # Create a water surface
280
+ surface = sr.PlaneSurface(
281
+ point=(0, 0, 0),
282
+ normal=(0, 0, 1),
283
+ material_front=sr.AIR_STP,
284
+ material_back=sr.WATER,
285
+ role=sr.SurfaceRole.OPTICAL,
286
+ name="water_surface",
287
+ )
288
+
289
+ # Create a collimated beam
290
+ source = sr.CollimatedBeam(
291
+ center=(0, 0, 0.1),
292
+ direction=(0.707, 0, -0.707), # 45° incidence
293
+ radius=0.01,
294
+ num_rays=1000,
295
+ wavelength=532e-9,
296
+ )
297
+ rays = source.generate()
298
+
299
+ # Process reflection/refraction
300
+ reflected, refracted = sr.process_surface_interaction(
301
+ rays, surface,
302
+ wavelength=532e-9,
303
+ generate_reflected=True,
304
+ generate_refracted=True,
305
+ )
306
+
307
+ print(f"Reflected rays: {reflected.num_rays}")
308
+ print(f"Refracted rays: {refracted.num_rays}")
309
+ ```
310
+
311
+ ## Example Scripts
312
+
313
+ The `scripts/` directory contains **educational example scripts** that demonstrate specific features and techniques. These are provided as learning resources and references for custom workflows.
314
+
315
+ > **Note:** For standard simulations, use the CLI (`lsurf run`) or GUI (`lsurf gui`) instead of writing custom scripts. The CLI/GUI handle configuration management, validation, and output automatically.
316
+
317
+ | Script | Description |
318
+ | -------------------------------------- | ---------------------------------------------- |
319
+ | `01_basic.py` | Basic raytracing setup |
320
+ | `02_sources.py` | Different ray source types |
321
+ | `03_visualization.py` | Visualization capabilities |
322
+ | `04_glass_reflection.py` | Fresnel reflection at glass interface |
323
+ | `05_water_brewster.py` | Brewster angle validation |
324
+ | `06_detector_scan.py` | Detector position scanning (planar) |
325
+ | `07_detector_scan_waves.py` | Detector scanning with wave surface |
326
+ | `08_detector_scan_waves_largescale.py` | Large-scale ocean simulation |
327
+ | `09_full_3d_curved_ocean.py` | Full 3D ray tracing with curved ocean surface |
328
+ | `10_time_spread_estimate.py` | Geometric time spread estimation |
329
+
330
+ Run an example:
331
+
332
+ ```bash
333
+ cd scripts
334
+ python 01_basic.py
335
+ ```
336
+
337
+ ## Dependencies
338
+
339
+ | Category | Packages |
340
+ |----------|----------|
341
+ | **Core** | numpy >= 1.24, matplotlib >= 3.7, pydantic >= 2.0 |
342
+ | **GPU** | numba >= 0.58, CUDA toolkit >= 11.0 |
343
+ | **Optional** | h5py >= 3.8 (HDF5 support), astropy-healpix (spherical analysis) |
344
+ | **Dev** | pytest, black, ruff, mypy, pre-commit |
345
+
346
+ All dependencies are automatically installed via `environment.yml` or `pip install -e ".[dev]"`.
347
+
348
+ ## Project Structure
349
+
350
+ ```
351
+ lsurf/
352
+ ├── src/
353
+ │ └── lsurf/ # Main package
354
+ │ ├── geometry/ # GeometryBuilder and Geometry
355
+ │ ├── simulation/ # Simulation, SimulationConfig, results
356
+ │ ├── propagation/ # Ray propagation engines and GPU kernels
357
+ │ ├── materials/ # Material definitions (homogeneous, atmosphere)
358
+ │ ├── sources/ # Ray source generators
359
+ │ ├── surfaces/ # Surface geometries (cpu/ and gpu/)
360
+ │ ├── detectors/ # Detection and analysis
361
+ │ ├── utilities/ # Ray data, fresnel, recording
362
+ │ ├── visualization/ # Plotting functions
363
+ │ └── interactions.py # Surface interaction processing
364
+ ├── scripts/ # Example scripts
365
+ ├── tests/ # Test suite
366
+ ├── docs/ # Sphinx documentation
367
+ ├── pyproject.toml # Python packaging config
368
+ └── environment.yml # Development environment
369
+ ```
370
+
371
+ ## Testing
372
+
373
+ ```bash
374
+ pytest tests/ -v
375
+ ```
376
+
377
+ ## License
378
+
379
+ Clear BSD License - see [LICENSE](LICENSE) for details.
380
+
381
+ Copyright (c) 2026 Tobias Heibges. All rights reserved.
@@ -0,0 +1,180 @@
1
+ lsurf/__init__.py,sha256=8vuByhVqLej1XeXsOezdqJRGmcCheB8Es4FIdcUTExE,14229
2
+ lsurf/py.typed,sha256=qww23I-O7yv_Kf5Wu2UW3r8K1Vd12UDESBl5tmzRSI0,60
3
+ lsurf/analysis/__init__.py,sha256=f7Fwyev9IPYdGnNksJpWHjjbaL0xolD_uSFcaxro3jg,3818
4
+ lsurf/analysis/healpix_utils.py,sha256=HzqtZ4_ulOLpHxrif3CNsl9rYEporzBNl0YbQjnQ6W4,13261
5
+ lsurf/analysis/sphere_viz.py,sha256=jGYGJZe1asihxtZ0PIcc7naX8ceIrJuLGDWAKaBaT5A,41662
6
+ lsurf/cli/__init__.py,sha256=onnKHxRNUptPCtiZa3WMTmHFC9wCdNabcAoxe7KvNgs,2121
7
+ lsurf/cli/build.py,sha256=9jWFbnEMWxj1CDDBAhvfbs6j8GCBGOURAx-aiVbbxO4,12434
8
+ lsurf/cli/config_schema.py,sha256=R-Ir_NeJhm6LlHwvQxBAeij60AlaPG2MpG7HCFRH8ck,11157
9
+ lsurf/cli/gui_cmd.py,sha256=1kzKM-oRlGD4A9naGFXzGMXsrFbODy9fsrDmQC8z7T0,2859
10
+ lsurf/cli/interactive.py,sha256=1Ikvr-SC0aOFBHwT_4kFxvRHXdIKY_npXdFL3Xh5mmY,27963
11
+ lsurf/cli/main.py,sha256=rIoetClqXmbi1j46YO-aJ9THA8RegdHpMo9111gKoX4,2871
12
+ lsurf/cli/run.py,sha256=Z4VfqUFc6AHmNAyPB4Je_HHh2KBLCieHBO3mLhjwPs4,28744
13
+ lsurf/detectors/__init__.py,sha256=uHrGazg8C8eCrDqQJsAUjL8QRZwpKDTobI_ilmteJnA,8335
14
+ lsurf/detectors/analysis.py,sha256=FbO8KDKEIBmXVMVARocErVKUmOv_prlKRjOYBWGiw6Q,9292
15
+ lsurf/detectors/base.py,sha256=q7Iu00rRnDq8NOhsMI4ekZIAzz7uzurPuv3nrqzJV7s,8936
16
+ lsurf/detectors/constant_size_rings.py,sha256=cvvrG0RNjH77lg4y9u88nOGScCURfVZ29Cl25etuqFg,17472
17
+ lsurf/detectors/directional.py,sha256=Zzi_UsbvamugZDesLo4-_laCAiuaZIVfOgZxpvyhVfs,2126
18
+ lsurf/detectors/planar.py,sha256=bOH4hjsqR_JcZR444IPF3Kfbb-3I4i4YfiJCPG4u37Y,2101
19
+ lsurf/detectors/protocol.py,sha256=mY1MuxaxwIlv8hmuVnopso_jzjQc-C-mZ0o8Gkl7Dss,5985
20
+ lsurf/detectors/recording_spheres.py,sha256=kv-fXPwBK4LIUDOKzHfRXuccDiWcepO7SY4wuJI2dH8,2689
21
+ lsurf/detectors/results.py,sha256=IL-S4HFQmrW08cgCFzxRGdT24T82fSGhVY7octSEyuk,38579
22
+ lsurf/detectors/spherical.py,sha256=Zr8fqZ3dTEByyDr5AvUxKV7LyNsDwIFDLWeMbZJHaK4,2116
23
+ lsurf/detectors/extended/__init__.py,sha256=8wJG-fq8NUuDXw9LZWQV_HctVroG4cSda6E8uo5aRr4,3030
24
+ lsurf/detectors/extended/local_sphere.py,sha256=YmfwsHxMpeNYWfvUbhm_vGnUlOTva6p8ZsvrJdGulx4,12097
25
+ lsurf/detectors/extended/recording_sphere.py,sha256=TrB0cJWlyxj07QecIFNiVOUUTAWBtiSsIdzAFaJHSKw,13092
26
+ lsurf/detectors/small/__init__.py,sha256=fguEeVxy2zFdJA86G7BjgiqAW-9H9D7S3ybyXCEhiek,2839
27
+ lsurf/detectors/small/directional.py,sha256=dW04Mb73vNKF-8ippRuKKOmtdIoI9q452mgtHEwNkKU,11983
28
+ lsurf/detectors/small/planar.py,sha256=OkOZKIY-4vNl5osT1WukPuPz_jiYide37JK0Ll7KQE4,14131
29
+ lsurf/detectors/small/spherical.py,sha256=kIqz3hc58Dyh0Oa3iwE0a_Dp9oT9Ce1dhwNAtAMUu70,14861
30
+ lsurf/geometry/__init__.py,sha256=9UaOx3EumDvoXlFSNAkPbuMy1Y7foNzQevx5hYkNV-g,6766
31
+ lsurf/geometry/builder.py,sha256=TT8a-p_xi-0hUEMYF0IqCQI14WemUOXhDCvPFvc1iME,16462
32
+ lsurf/geometry/cell.py,sha256=FmvFoICPuxl0FZRBr8Igz0QCEck1TwIULYSB3TOeoC4,7332
33
+ lsurf/geometry/cell_geometry.py,sha256=UyKdMABFt_WNlqtr0qKBFdUbf_GQ7LVvcy2onIYKui0,8301
34
+ lsurf/geometry/detector_arrays.py,sha256=fbEw-XGyHePomGQPx-QMco9hBqblHwSGkqe4cheh08c,64199
35
+ lsurf/geometry/geometry.py,sha256=Fi0u-tDPp2ivhnzCPZF3tE21sc6LDtf7Aizkokp6S68,7082
36
+ lsurf/geometry/surface_analysis.py,sha256=KwSsU6u7fsxtRAfDUh58rRLEWOU2Ew5ZsUhHTPpjZWc,12966
37
+ lsurf/geometry/validation.py,sha256=hk3N2roJhAKqASzQ8TSq7kVeyWgmdB2UZzynVlwamxY,3593
38
+ lsurf/gui/__init__.py,sha256=-_iAroUzt-7dVpzaQSbaawdudvfxjOICIb7cw7y1OBo,2168
39
+ lsurf/gui/app.py,sha256=Zd6Xh4-zz0nf2RHnDNXovmyMYNXLcX6quAdLx9r0SlY,33173
40
+ lsurf/gui/core/__init__.py,sha256=57Neh1Afb2KywYM6lWREdC0RTXuewtddG01PvTWGnCE,1944
41
+ lsurf/gui/core/scene.py,sha256=EAs7dB3b9fDEmaAC2BORWhkv2tH7sVVL3a_53fJChhg,12470
42
+ lsurf/gui/core/simulation.py,sha256=iWWHlTbDt3o2t-qVgkEjMTBFyTKRCtC7iT2gl-FT9KU,9028
43
+ lsurf/gui/renderers/__init__.py,sha256=6PYO-3Ce37IVjn1tXjLxCEpjpgpzpI4BlXo2ynvzo7M,1998
44
+ lsurf/gui/renderers/ray_renderer.py,sha256=658u5jj52Xx7SNIp1pgSAC9CXHNZF2bMyNpG617NqeE,11954
45
+ lsurf/gui/renderers/source_renderer.py,sha256=2YvFCX_Jnxctx9l_HCqU-4gatUVid0X9ziMywx1XARA,18584
46
+ lsurf/gui/renderers/surface_renderer.py,sha256=S4mVlIMc1MObCEX2kndbg0JuYOArfDiqG9vL7XYVI3Q,17320
47
+ lsurf/gui/views/__init__.py,sha256=jLpHXktYNmBuZkNTb1jea0zBnQlo0pyCRnaSd5CkH0Q,2100
48
+ lsurf/gui/views/config_editor.py,sha256=HomqjyVBE4FCWv6yWpu6AEGhE1u-FXbb2EeX0l2-5Fc,125913
49
+ lsurf/gui/views/properties.py,sha256=W1WzuIMxU30DucbhR4RFRWLN6OWHIJGD287pmbqDKTg,10518
50
+ lsurf/gui/views/results.py,sha256=hfaK-N4yIgIO7vsW98Ivmk1fU2gXmgEGPTV90dHehtE,10583
51
+ lsurf/gui/views/scene_tree.py,sha256=kEOfGPc_rhMD3_JGvCQBw_6_9_qpVPXDopVRg-jctU8,6313
52
+ lsurf/gui/views/viewport_3d.py,sha256=vM_Vq74nGEmj9PcDydRnrlS0blOdDSMGC9j-GQuRvzI,19320
53
+ lsurf/gui/views/visualizations.py,sha256=9bV-ANEFIR07TKEO1h5tLQLkKNzNwyZjPo5Qxfe84Q4,24251
54
+ lsurf/materials/__init__.py,sha256=XfEJXQ2P42z_teDodIFc2vXj2BWyWZJUTg74JyagC9I,5136
55
+ lsurf/materials/base/__init__.py,sha256=icrv4UzshB4fQ3LzVR0xp3qKO9-KJoRcA5uC29d9UJk,2880
56
+ lsurf/materials/base/full_inhomogeneous.py,sha256=O-TVeC6bqBVYKHl1GOriE4AR6vHflUGbqMSxw0-skxU,7232
57
+ lsurf/materials/base/grid_inhomogeneous.py,sha256=NKWUe6OtbZ_5qWn3oaZjZiErjbFu-YwRMlkw-seXVDE,11724
58
+ lsurf/materials/base/homogeneous.py,sha256=0mHu8_W3NcKNlrRLcKygQBzTopSDc75OP1CjZrXd3jY,12019
59
+ lsurf/materials/base/material_field.py,sha256=y-Dt55fo8h6Vbp-HEsUwtjU46NtLJ0jCiQwDLRKoDQA,16887
60
+ lsurf/materials/base/simple_inhomogeneous.py,sha256=86aIH7B6lOEoWGdignVYFJx05EQfChi02j2SG0uCVI0,15112
61
+ lsurf/materials/base/spectral_inhomogeneous.py,sha256=woStEp6bfCj8-T_XxhOjQkpCA_kdAQ2LRjtnaFzJq2M,18491
62
+ lsurf/materials/implementations/__init__.py,sha256=D1XMtQnVHlODrJuWgyr1H5Juu91XsD8NOs3I6IYEzmM,4166
63
+ lsurf/materials/implementations/duct_atmosphere.py,sha256=KDJrSjGMZ-gx0CpAvj3M17m-3CwyPGtCJkUr7uvyC44,13621
64
+ lsurf/materials/implementations/exponential_atmosphere.py,sha256=my356p3mCsftbmWAqnlPMQ5kIu9o-gVOoAN8rhX9bPE,14953
65
+ lsurf/materials/implementations/gaussian_lens.py,sha256=HhvU96SKGXZlotfmKdgo3kfIlSdp3X7Z9c5_NvkOLVk,4372
66
+ lsurf/materials/implementations/interpolated_data.py,sha256=WQvbvFCBmpvgboKqcfRLY2TOFYjNtBNsTZEa1Y0IPqI,4353
67
+ lsurf/materials/implementations/layered_atmosphere.py,sha256=uR6cnH3GQmyIv5JITh-kzVUhlyKY8om2aRwXPGmUdOY,4795
68
+ lsurf/materials/implementations/linear_gradient.py,sha256=NlcryvZEvQqmQMV9RKn7fQe9H_o45shae7Lth0Du-pE,4215
69
+ lsurf/materials/implementations/linsley_atmosphere.py,sha256=rR5l7pqeJmtUwXcbsKqFJvcnaKtc1Qbhf-DM4_OXxPQ,24353
70
+ lsurf/materials/implementations/standard_materials.py,sha256=TXPJEVKP7LNii5JZZXok6FqxBNfwFC8oaNEMUSdHTNA,3768
71
+ lsurf/materials/implementations/turbulent_atmosphere.py,sha256=QfofHYNlK-4uOO4QrBJPubSY6R-W1c7Rw3fb7g7YwBQ,4981
72
+ lsurf/materials/implementations/us_standard_atmosphere.py,sha256=8k2VHJ8k270g6l5dyojEVH3YmxY3M5HeA1McL4YvWqk,5700
73
+ lsurf/materials/implementations/data/alpha_values_typical_atmosphere_updated.txt,sha256=-h_ifle-Va3OT68qpmnwCgnh4NST-2Co0mxGd7ody7o,10186
74
+ lsurf/materials/utils/__init__.py,sha256=aH-LPvDFgP34zpP7-3ki6cMdCVh2Nr-Js4JxF7OhAKI,2736
75
+ lsurf/materials/utils/constants.py,sha256=uXIPHfmZ4VptdICxnMsdhIOnIaVVxFQ8grKUTskfyTM,2083
76
+ lsurf/materials/utils/device_functions.py,sha256=sG_FDOEodfQ3yPQCoPcK-zVa9HBY4GUvi3-F_FlzPgs,3607
77
+ lsurf/materials/utils/dispersion.py,sha256=LXC3G-FgfpFRS0xCj03uydCFhHEYAUy_jsK8qOs0IVU,4905
78
+ lsurf/materials/utils/factories.py,sha256=F7TUQlx2cm3QkNCTuC5QEyugEbe5hK6O3YS-hL7WDpM,4464
79
+ lsurf/propagation/__init__.py,sha256=D01sA_pguEGhA0bathQb8odiduH-iJqTBCOSKZQqLB8,3190
80
+ lsurf/propagation/detector_gpu.py,sha256=pdtNTAVYUy-HiVN8J5Ychebt4BLk0ATQxpVKMU_g0tQ,2677
81
+ lsurf/propagation/gpu_device_rays.py,sha256=4GTT9IoAzA_Z0j2Ma7Ly54yzouI-To4BpxqUYDFKNnc,10444
82
+ lsurf/propagation/propagator_protocol.py,sha256=uLBQ3c5Kj2YqRaIGo2HRSbhNxVK8Ts09kgDVJzdY1l8,7442
83
+ lsurf/propagation/kernels/__init__.py,sha256=L5syNgqeTuF24ZjUlYgy_JQi34uspEUJaS9nQuXj0b4,5888
84
+ lsurf/propagation/kernels/device_functions.py,sha256=XGz_fbKA4gDuclAkf5AHh5BDE94qg3nozEHgU_LCWPA,22480
85
+ lsurf/propagation/kernels/registry.py,sha256=nQx5O3RPp3uaWfhWxUG-aHlQkU6ZH7oLSVuCJ4-3dag,10605
86
+ lsurf/propagation/kernels/absorption/__init__.py,sha256=0GM4eNDOjCm3KIpxHuKMixDqncE4649JKkVhBlj9tJ0,2405
87
+ lsurf/propagation/kernels/absorption/grid.py,sha256=5pKOHs6rVVQRA1pxIzmwXvvljmmSelzbuNfSitkKLtQ,6547
88
+ lsurf/propagation/kernels/absorption/simple.py,sha256=qbPadlEBpK0h2I4o70FFPP7LBjxNxrCViiKW3bxZeCk,6872
89
+ lsurf/propagation/kernels/absorption/spectral.py,sha256=c4x4OB01Rar1B5jbwnzFrnHU0QW0SFhCElnFMQRqHt0,11340
90
+ lsurf/propagation/kernels/detection/__init__.py,sha256=tLYqGX_2fE2BMKMosjtDPmqvW6e30UuX02DSF8qvQ8A,2480
91
+ lsurf/propagation/kernels/detection/protocol.py,sha256=ZQ37HdRi-E3j6x8_HcHISqC1cl4TFUjzAwRfP4TiRXw,3810
92
+ lsurf/propagation/kernels/detection/spherical.py,sha256=dN6JFkHCW_ikc9xBrO4m_eqGZhFD-0IjN9lW2CRGhJc,7921
93
+ lsurf/propagation/kernels/fresnel/__init__.py,sha256=JokSSxRQL1R-6wT4J_Udb6fHTaWxb0dep58h_xW5ZDg,2552
94
+ lsurf/propagation/kernels/fresnel/protocol.py,sha256=xToP58oxN28HASbH6wNYtCmeK-shkzTswxmhULLDe2A,3680
95
+ lsurf/propagation/kernels/fresnel/standard.py,sha256=Tsc9jiO9SZstPikNZtVIiQakCTeJ2-Gl2NkfH5p3v9Q,7850
96
+ lsurf/propagation/kernels/intersection/__init__.py,sha256=3WvmVughu_8r-emC_B6kbJ9oLeeUqdlIDwVnUihV7eg,3397
97
+ lsurf/propagation/kernels/intersection/annular_plane.py,sha256=aK3EsZX2CMT1LqKBSGU6_xGk7mrBcl_BlOl38o3ZR_Y,6407
98
+ lsurf/propagation/kernels/intersection/bounded_plane.py,sha256=MEbpXysbvIWqfgVz7w-e5vZM0GYjHNyK3M9x_NaHkT8,6251
99
+ lsurf/propagation/kernels/intersection/plane.py,sha256=E_h9mfm_FJn-0rZIDqu-wd221_MLnAkQoI_iIg74vvU,5326
100
+ lsurf/propagation/kernels/intersection/protocol.py,sha256=ZkkzmpE5IW1KOJNzYvH2ikEmhmXABwrhocawVRlqUnA,3588
101
+ lsurf/propagation/kernels/intersection/signed_distance.py,sha256=GNvHDAx8Ee4mUpuxDvch_wbe35x4jjj_uuutKCmewOw,23242
102
+ lsurf/propagation/kernels/intersection/sphere.py,sha256=1sRy5ljhmnrKfGwLVFOYUgrsSpzaA4noU7nBsbWJHFc,5605
103
+ lsurf/propagation/kernels/propagation/__init__.py,sha256=8J4N424ydALztXqZAXdf0vAd6t2wB3rZsP_pRQPw5lQ,3413
104
+ lsurf/propagation/kernels/propagation/grid.py,sha256=EjKB0yUHpr0C-R6swOqpIa08GagkQGZeKVmBO4PYQAc,13535
105
+ lsurf/propagation/kernels/propagation/protocol.py,sha256=nq33PXg1IwqehC_r3do2b5cGokGQemz8hujL6-xvpjc,4018
106
+ lsurf/propagation/kernels/propagation/simple.py,sha256=cgbXl9tRKWfQzYrSFcU1q3A5HpXY_SG4F6o0pUni0aQ,11936
107
+ lsurf/propagation/kernels/propagation/spectral.py,sha256=FTvugC2x3jBhcVQKmXgJowI4YktEAC8S7RkoNMPhM04,22284
108
+ lsurf/propagation/kernels/surface/__init__.py,sha256=kj1O81V8t1U_Hk_YaBoi83sFjiKKW1jdEMcbi--49kQ,2899
109
+ lsurf/propagation/kernels/surface/bisection.py,sha256=vJ39_69u2hTY9ndOem7oJIaXnJvGMWzbfkmQIVKKMnY,8169
110
+ lsurf/propagation/kernels/surface/detection.py,sha256=W2tjMfz2SfGYwbMN9SCfEoFHMTqywq5xdhgdxOibsAA,13070
111
+ lsurf/propagation/kernels/surface/reduction.py,sha256=azxqmFM2-I1VX4EtGeHxLfq45TekL6BPh7ZEQ2BDrt8,5277
112
+ lsurf/propagation/propagators/__init__.py,sha256=_KZYnNjo2xxjtl5bsrlWiIFiwXsAF6sfHFv1PzO9A7E,3973
113
+ lsurf/propagation/propagators/detector_handler.py,sha256=F_jNrOd3D3ECXRTsEExocVH3J-jQh3b0hErLkE3uHCE,11770
114
+ lsurf/propagation/propagators/factory.py,sha256=mCFArd7YoaPRVauw7ck-K2pZu8NLN5OUqo9xN94xkOs,7801
115
+ lsurf/propagation/propagators/fresnel_handler.py,sha256=dxocOOchlaLQfufzw6DaYzv5xdryCd4mrLUG39exDfw,9909
116
+ lsurf/propagation/propagators/gpu_gradient.py,sha256=iqZcZDRBvLqlHOy_srqRCuyW0DEs_wKooWQl-CkUbpc,20890
117
+ lsurf/propagation/propagators/gpu_surface_propagator.py,sha256=xdviwfbswdYvZdCOZmTzJ-CTuM3v8zHpgPD0pAvUoYM,27249
118
+ lsurf/propagation/propagators/gradient.py,sha256=zy0eeIoQzAm-oW2WyMyfKI8_Ez293UH0M6dJrmJnjDU,15317
119
+ lsurf/propagation/propagators/intersection_handler.py,sha256=I7KVRtpqLgvXILVSQJfGH1LqMqz4fWJPcFQLiVPnepE,10737
120
+ lsurf/propagation/propagators/material_propagator.py,sha256=sKc2arT75gbKORmcnBLRz3xTruMVJVFPqiZioMaMyBA,12711
121
+ lsurf/propagation/propagators/signed_distance_handler.py,sha256=1coyh5t_OYpkxfaMmFSIBEwNhb1WVipNiUwDl190Wx8,16925
122
+ lsurf/propagation/propagators/spectral_gpu_gradient.py,sha256=GP9Yjt4KglRnC_imGDgwn4y3HDZhfNfiWQpsFiY8c5U,20526
123
+ lsurf/propagation/propagators/surface_interaction.py,sha256=xqtpzY1S_r4x_E7qWjc6Xzmei4XJr34J5jTfK-oXN9Y,22705
124
+ lsurf/propagation/propagators/surface_propagator.py,sha256=89J_zJbQUwi59iDVYnUqYfHetD__uX9b2yv0DMeF2aY,26012
125
+ lsurf/simulation/__init__.py,sha256=HeUUXi75J-I0ElWtXvedRj9yRXLabB4FA9nHnSj9eW0,2615
126
+ lsurf/simulation/config.py,sha256=dHckMmyib0HPFIthBYV3pgbOQUaS5nREWlUiSC0zK40,7416
127
+ lsurf/simulation/orchestrator.py,sha256=GUB5lElKMBnudlNmY--Xw0_9csOQtG2eJpEwjcs7ymI,16989
128
+ lsurf/simulation/result.py,sha256=eZyI528GZnH6dfFxdi75fzYHOAiMkTW3nWK5F14aGKA,9636
129
+ lsurf/simulation/simulation.py,sha256=AjBiaBmj4ha7j5V3VdJTLdzJdaqF1R_gCgGrG7xOTus,9153
130
+ lsurf/sources/__init__.py,sha256=m7n-wmz96tkixFndy5kry1D4pzvbuEQlGHI-LeAgVQY,4326
131
+ lsurf/sources/base.py,sha256=WMs0eKhPL-ZzYCszzllCi6P-GggQA4X0o3bHuAOyJt4,8951
132
+ lsurf/sources/collimated.py,sha256=gqUeO1CyfRWYCD2kV-A4wborTX4qXkIZLkgS_Y2z_R4,8658
133
+ lsurf/sources/custom.py,sha256=a5EBGZJ_Gy0KhrUTimq1uljoXxx6AFPu8VWmtyf4m54,14734
134
+ lsurf/sources/diverging.py,sha256=z-A6intvBxwxd8QHfITSfxg3IrdS92uXZOU5J0WtzHQ,7760
135
+ lsurf/sources/gaussian.py,sha256=6KWdsC99gRkE_sp-Ty-4-UrN1eCNqi9egkitwYEnlXQ,8675
136
+ lsurf/sources/parallel_from_positions.py,sha256=WUJ68udWUVgNkz715anURlmKU4eooeB8--nPRzWLewA,7123
137
+ lsurf/sources/point.py,sha256=yaZe9168s_i_-MPugAcl8xZwxxVYRXAHuItCo3ps4QQ,5498
138
+ lsurf/sources/uniform_diverging.py,sha256=WGYIRntZb3KBYUipdrvv1jp4Qet_jIfBp7xVvuvuT78,8908
139
+ lsurf/surfaces/__init__.py,sha256=TPcIS2GjMJzywmemQsv7P3Qnkq7ieFkC3ysKvQH99ss,5779
140
+ lsurf/surfaces/protocol.py,sha256=fQtcjgl7qgwN1zplTrxStFqyFffRReEiRCtik5-WcsY,10915
141
+ lsurf/surfaces/registry.py,sha256=-fkFntMmMngAD20pm3E1skWNeNAM1oDUSb3sDE-At1A,12320
142
+ lsurf/surfaces/cpu/__init__.py,sha256=NxMR7E7vfhezGpZAHw1s6GfS1_FfCcxaHLINZtM9yzE,2171
143
+ lsurf/surfaces/cpu/curved_wave.py,sha256=0DEXjpmogflJ9enJsYwRn7XvWwatPgLhHITcxa0RPJ8,17301
144
+ lsurf/surfaces/cpu/gerstner_wave.py,sha256=-3CBDjc8IiprDw5Za8r3i7rVibj9oSkBBRXYmOIKanE,13170
145
+ lsurf/surfaces/cpu/wave_params.py,sha256=2-hkNFVPYP6VbGjDPADtX2qFcjjTIwbEIbSDzExdwM8,4346
146
+ lsurf/surfaces/gpu/__init__.py,sha256=zFEdFAa4pLvXyRROweE_l0-HIjYOL-Y3c-7yaxnPHJ4,3256
147
+ lsurf/surfaces/gpu/annular_plane.py,sha256=AO8b8i84LbLZn5oGdk_-K1PI8wcaM2qJ6Gfcy7-UiRA,15327
148
+ lsurf/surfaces/gpu/bounded_plane.py,sha256=yfdelNNEX3HHvwiuDl5vTJZEd09pc-1pHtm19wMdO-Q,12845
149
+ lsurf/surfaces/gpu/curved_wave.py,sha256=5mirEcXD3fMzxfn-eoEwNAT1SxzC60DRYK-szR7zA0M,17221
150
+ lsurf/surfaces/gpu/gerstner_wave.py,sha256=Wu9UPb2x7IHqm_pCe-gIAEBFDw7k2l59QrZJL59wgN0,12195
151
+ lsurf/surfaces/gpu/multi_curved_wave.py,sha256=8B_i1zMqL81qmTv3YGKy69EqAC9pj8iG_qFiXOsUcyA,19169
152
+ lsurf/surfaces/gpu/plane.py,sha256=GGI5REm3niCAQGutNf8Xu8HabZYbrXPvz_9e5HExAss,9827
153
+ lsurf/surfaces/gpu/recording_sphere.py,sha256=Dvl1tC7brTRYDUgzO6-W3G7oWg0njXjCQL8XpCUBNdA,19454
154
+ lsurf/surfaces/gpu/sphere.py,sha256=DHa84ctj6Syqth8wQXCkhzI1AL18tkgJb55MsLwTbFs,10027
155
+ lsurf/utilities/__init__.py,sha256=B0oooVOnnYMsCstLkIVw05hE3ydvk7vjd3YGA7hwYHA,5365
156
+ lsurf/utilities/detector_analysis.py,sha256=HAiYzz9Aqpxb_aw7oo8l9TOJI25Weaj9B-mC1_jJHuU,28421
157
+ lsurf/utilities/fresnel.py,sha256=TAS_be90ACdvsnEnkegIFlej5-wp4f6JI37ZVsZrIh8,23872
158
+ lsurf/utilities/interactions.py,sha256=Q1R0tpDym2UXg7mncKQr-00IZuYlRuBiGdMb0S8pwKc,48663
159
+ lsurf/utilities/propagation.py,sha256=3s2PSkX-Ti72GNw7TZhd65d46RW8ZID79KN33_q-ywo,16581
160
+ lsurf/utilities/ray_data.py,sha256=glA7Zeg8GN1_yQYGEvKxRmnb5T1SELOphFK8izJSSYs,19677
161
+ lsurf/utilities/recording_sphere.py,sha256=nDZV_wAavw_UdqRv3QHd9-ap5hXttfoBk5mfrpiWPuE,26437
162
+ lsurf/utilities/time_spread.py,sha256=9vgqw5PdB7_0y4lkVv_RHDE_aCNhv5lQY29iELijCh0,15959
163
+ lsurf/visualization/__init__.py,sha256=26DATlx0pDnfMTMduo2EUbyiZkC2dOhH09Zs3rIdl8w,10203
164
+ lsurf/visualization/absorption_plots.py,sha256=BHsytg-krjcDPQp6Hlhm6CpDmte2U-RV3EseDqI5uTM,10266
165
+ lsurf/visualization/atmospheric_plots.py,sha256=AHruTs_fwErMDnymCDY1CHerV2t5zn-39bl2di28w9s,24492
166
+ lsurf/visualization/common.py,sha256=jtSIshrIK73rqd22JEWdz1qCa3aiIDmcy15rNvt2Crw,9616
167
+ lsurf/visualization/detector_plots.py,sha256=F_7zG6KDGr1wQ6nNJDmHQfDgJsg2hB5rJqjSQ3gazpE,39704
168
+ lsurf/visualization/detector_sphere_plots.py,sha256=Dn7h1SfJBH7M4Pmj6y_lMDsWjiYqCSSBn6y0mqzKt3o,36572
169
+ lsurf/visualization/fresnel_plots.py,sha256=H0oQRelbWqKKAv9F3s9qbFd_LeAI7PAKuQgSjz0maX0,30916
170
+ lsurf/visualization/ocean_simulation_plots.py,sha256=W407l06DSUAi1LInJjV0DHTyxDZC-J02AJ8XWJmo1HY,35264
171
+ lsurf/visualization/polarization_plots.py,sha256=skvKDH84s36fJHA-cVBh1l1FnRlnYTvALNrSerrLPpI,31147
172
+ lsurf/visualization/raytracing_plots.py,sha256=QmgyKo6HkilpXEeJACD2nfd_XSf0VWGMkpD9X84hb9I,48344
173
+ lsurf/visualization/ring_detector_plots.py,sha256=crtuT95hHJBURQseuDLd_MsD6H8t5rOPCqpAmTf58Tk,62713
174
+ lsurf/visualization/time_spread_plots.py,sha256=fvlYNxP3bToKh-nRjaLHWItcgEJoDGNMoAs04xRz1qM,16221
175
+ lsurf-1.0.0.dist-info/licenses/LICENSE,sha256=WhlL3HL7wwJNJeprh279_l4U36ffbGIolTEpY_Ux5SM,1744
176
+ lsurf-1.0.0.dist-info/METADATA,sha256=u94H0d8TFC85FXcWC0DBGFtgwYfGawJ2OGzNhtbrIQY,12129
177
+ lsurf-1.0.0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
178
+ lsurf-1.0.0.dist-info/entry_points.txt,sha256=vkfVHyelZv18JMXBfv8jAr4tlGV_iYdZr1QWlyZd_Q0,45
179
+ lsurf-1.0.0.dist-info/top_level.txt,sha256=P3F5UGQHnyMjcmeEFUlj3CTpTNMy962cmithocM8_4w,6
180
+ lsurf-1.0.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.10.2)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ lsurf = lsurf.cli.main:cli
@@ -0,0 +1,32 @@
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.
@@ -0,0 +1 @@
1
+ lsurf