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,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,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
|