pystilt 0.1.0a1__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 (83) hide show
  1. pystilt-0.1.0a1.dist-info/METADATA +350 -0
  2. pystilt-0.1.0a1.dist-info/RECORD +83 -0
  3. pystilt-0.1.0a1.dist-info/WHEEL +5 -0
  4. pystilt-0.1.0a1.dist-info/entry_points.txt +2 -0
  5. pystilt-0.1.0a1.dist-info/licenses/LICENSE +21 -0
  6. pystilt-0.1.0a1.dist-info/top_level.txt +1 -0
  7. stilt/__init__.py +64 -0
  8. stilt/__main__.py +12 -0
  9. stilt/cli.py +629 -0
  10. stilt/collections.py +583 -0
  11. stilt/config/__init__.py +50 -0
  12. stilt/config/fields.py +60 -0
  13. stilt/config/footprint.py +61 -0
  14. stilt/config/meteorology.py +119 -0
  15. stilt/config/model.py +242 -0
  16. stilt/config/params.py +483 -0
  17. stilt/config/runtime.py +70 -0
  18. stilt/config/spatial.py +67 -0
  19. stilt/config/transforms.py +83 -0
  20. stilt/errors.py +107 -0
  21. stilt/execution/__init__.py +40 -0
  22. stilt/execution/backends/__init__.py +20 -0
  23. stilt/execution/backends/factory.py +36 -0
  24. stilt/execution/backends/kubernetes.py +150 -0
  25. stilt/execution/backends/local.py +138 -0
  26. stilt/execution/backends/protocol.py +80 -0
  27. stilt/execution/backends/slurm.py +305 -0
  28. stilt/execution/entrypoints.py +86 -0
  29. stilt/execution/execute.py +229 -0
  30. stilt/execution/phases.py +313 -0
  31. stilt/execution/tasks.py +145 -0
  32. stilt/footprint.py +1114 -0
  33. stilt/hysplit/__init__.py +5 -0
  34. stilt/hysplit/bin/linux_x64/hycs_std +0 -0
  35. stilt/hysplit/bin/macos_x64/hycs_std +0 -0
  36. stilt/hysplit/bin/version +1 -0
  37. stilt/hysplit/control.py +169 -0
  38. stilt/hysplit/data/ASCDATA.CFG +6 -0
  39. stilt/hysplit/data/LANDUSE.ASC +180 -0
  40. stilt/hysplit/data/ROUGLEN.ASC +180 -0
  41. stilt/hysplit/data/TERRAIN.ASC +180 -0
  42. stilt/hysplit/driver.py +366 -0
  43. stilt/hysplit/namelist.py +85 -0
  44. stilt/index/__init__.py +15 -0
  45. stilt/index/base.py +369 -0
  46. stilt/index/factory.py +44 -0
  47. stilt/index/postgres.py +197 -0
  48. stilt/index/protocol.py +182 -0
  49. stilt/index/rebuild.py +136 -0
  50. stilt/index/sql.py +311 -0
  51. stilt/index/sqlite.py +202 -0
  52. stilt/index/updates.py +79 -0
  53. stilt/meteorology.py +344 -0
  54. stilt/model.py +503 -0
  55. stilt/observations/__init__.py +79 -0
  56. stilt/observations/apply.py +90 -0
  57. stilt/observations/chemistry.py +149 -0
  58. stilt/observations/geometry.py +86 -0
  59. stilt/observations/observation.py +54 -0
  60. stilt/observations/operators.py +27 -0
  61. stilt/observations/receptors.py +252 -0
  62. stilt/observations/scenes.py +166 -0
  63. stilt/observations/selection.py +399 -0
  64. stilt/observations/sensors/__init__.py +7 -0
  65. stilt/observations/sensors/base.py +96 -0
  66. stilt/observations/sensors/column.py +56 -0
  67. stilt/observations/sensors/point.py +38 -0
  68. stilt/observations/uncertainty.py +75 -0
  69. stilt/observations/weighting.py +170 -0
  70. stilt/py.typed +2 -0
  71. stilt/receptors.py +597 -0
  72. stilt/selection.py +189 -0
  73. stilt/service/__init__.py +5 -0
  74. stilt/service/kubernetes.py +313 -0
  75. stilt/simulation.py +512 -0
  76. stilt/storage/__init__.py +58 -0
  77. stilt/storage/files.py +196 -0
  78. stilt/storage/layout.py +108 -0
  79. stilt/storage/project.py +150 -0
  80. stilt/storage/store.py +326 -0
  81. stilt/trajectory.py +343 -0
  82. stilt/transforms.py +157 -0
  83. stilt/visualization.py +669 -0
@@ -0,0 +1,350 @@
1
+ Metadata-Version: 2.4
2
+ Name: pystilt
3
+ Version: 0.1.0a1
4
+ Summary: A Python implementation of the STILT Lagrangian atmospheric transport model.
5
+ Author-email: James Mineau <jameskmineau@gmail.com>
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/jmineau/PYSTILT
8
+ Project-URL: Documentation, https://jmineau.github.io/PYSTILT/
9
+ Project-URL: Repository, https://github.com/jmineau/PYSTILT
10
+ Project-URL: Issues, https://github.com/jmineau/PYSTILT/issues
11
+ Keywords: stilt,hysplit,atmospheric-transport,lagrangian,footprint,meteorology
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Intended Audience :: Science/Research
14
+ Classifier: Topic :: Scientific/Engineering :: Atmospheric Science
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Programming Language :: Python :: 3.14
21
+ Requires-Python: >=3.10
22
+ Description-Content-Type: text/markdown
23
+ License-File: LICENSE
24
+ Requires-Dist: arlmet>=0.1.0a1
25
+ Requires-Dist: fsspec>=2024.2
26
+ Requires-Dist: netcdf4>=1.6.5
27
+ Requires-Dist: numpy>=1.24
28
+ Requires-Dist: pandas>=2.0
29
+ Requires-Dist: pyarrow>=14.0
30
+ Requires-Dist: pydantic>=2.0
31
+ Requires-Dist: pydantic-settings>=2.0
32
+ Requires-Dist: pyyaml>=6.0
33
+ Requires-Dist: scipy>=1.10
34
+ Requires-Dist: shapely>=2.0
35
+ Requires-Dist: typer>=0.9
36
+ Requires-Dist: typing-extensions>=4.0
37
+ Requires-Dist: xarray>=2023.6
38
+ Provides-Extra: projection
39
+ Requires-Dist: pyproj>=3.5; extra == "projection"
40
+ Provides-Extra: visualization
41
+ Requires-Dist: matplotlib>=3.7; extra == "visualization"
42
+ Provides-Extra: cloud
43
+ Requires-Dist: gcsfs>=2024.2; extra == "cloud"
44
+ Requires-Dist: psycopg[binary]>=3.1; extra == "cloud"
45
+ Requires-Dist: kubernetes>=28.0; extra == "cloud"
46
+ Requires-Dist: s3fs>=2024.2; extra == "cloud"
47
+ Provides-Extra: complete
48
+ Requires-Dist: pystilt[projection]; extra == "complete"
49
+ Requires-Dist: pystilt[visualization]; extra == "complete"
50
+ Requires-Dist: pystilt[cloud]; extra == "complete"
51
+ Dynamic: license-file
52
+
53
+ # PYSTILT
54
+
55
+ [![Tests](https://github.com/jmineau/PYSTILT/actions/workflows/tests.yml/badge.svg)](https://github.com/jmineau/PYSTILT/actions/workflows/tests.yml)
56
+ [![Documentation](https://github.com/jmineau/PYSTILT/actions/workflows/docs.yml/badge.svg)](https://github.com/jmineau/PYSTILT/actions/workflows/docs.yml)
57
+ [![Code Quality](https://github.com/jmineau/PYSTILT/actions/workflows/quality.yml/badge.svg)](https://github.com/jmineau/PYSTILT/actions/workflows/quality.yml)
58
+ [![codecov](https://codecov.io/gh/jmineau/PYSTILT/branch/main/graph/badge.svg)](https://codecov.io/gh/jmineau/PYSTILT)
59
+ [![PyPI version](https://badge.fury.io/py/pystilt.svg)](https://badge.fury.io/py/pystilt)
60
+ [![Python Version](https://img.shields.io/pypi/pyversions/pystilt.svg)](https://pypi.org/project/pystilt/)
61
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
62
+ [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
63
+ [![Pyright](https://img.shields.io/badge/pyright-checked-brightgreen.svg)](https://github.com/microsoft/pyright)
64
+
65
+ PYSTILT is a Python implementation of the [STILT](https://uataq.github.io/stilt/) Lagrangian atmospheric transport model.
66
+ It runs backward trajectories with [HYSPLIT](https://www.ready.noaa.gov/HYSPLIT.php) and computes receptor footprints
67
+ that map where upwind surface fluxes influence a measurement.
68
+
69
+ The project is in alpha and focused on a unified execution model that works for one-off runs,
70
+ large batch runs, and streaming queue workers.
71
+
72
+ ## Status
73
+
74
+ PYSTILT is alpha software (v0.1.0a1). No backward compatibility guarantees before v1.0.
75
+
76
+ The core transport is stable: HYSPLIT execution, trajectory and footprint generation,
77
+ numerical R-STILT parity, and the local and SLURM execution paths are all exercised by the
78
+ test suite. The public API may change while the package settles.
79
+
80
+ ## Choose a workflow
81
+
82
+ - **One-off transport runs** for local analysis and notebooks:
83
+ use `Model.run()` or `stilt run`.
84
+ - **Queue-backed batch or service runs** for HPC/cloud execution:
85
+ use `Model.register_pending()`, `stilt register`, `stilt pull-worker`, and
86
+ `stilt serve` with a PostgreSQL-backed queue index configured via
87
+ `PYSTILT_DB_URL`.
88
+ - **Observation-driven workflows** for science-facing code:
89
+ use `stilt.observations` to turn normalized observations into `Receptor`
90
+ objects before feeding them into the same runtime.
91
+
92
+ ## Roadmap
93
+
94
+ PYSTILT draws design and science inspiration from two sister projects:
95
+ [X-STILT](https://github.com/uataq/X-STILT) for column and satellite science workflows, and
96
+ [stiltctl](https://github.com/jmineau/air-tracker-stiltctl) for cloud-native execution
97
+ patterns. The tables below track what has been absorbed and what remains in scope.
98
+ See the full [roadmap](https://jmineau.github.io/PYSTILT/roadmap.html) for more details.
99
+
100
+ ### Execution and orchestration (from stiltctl)
101
+
102
+ | Feature | Status |
103
+ |---|---|
104
+ | Pull-mode queue workers (`stilt pull-worker`) | Implemented |
105
+ | Long-lived streaming mode (`stilt serve`) | Implemented |
106
+ | PostgreSQL-backed simulation registry | Implemented |
107
+ | Scene-based submission grouping | Implemented |
108
+ | Thin CLI → Model → worker call path | Implemented |
109
+ | Kubernetes worker deployment | Partial |
110
+ | Cloud object store outputs (GCS, S3) | In scope |
111
+
112
+ ### Column and satellite science (from X-STILT)
113
+
114
+ Full X-STILT feature parity is not a goal. PYSTILT absorbs X-STILT's observation-layer
115
+ design and column-weighting concepts without trying to replicate every script.
116
+
117
+ | Feature | Status |
118
+ |---|---|
119
+ | `stilt.observations` layer (`Observation`, `Scene`, sensor families) | Implemented |
120
+ | Column receptor support | Implemented |
121
+ | Vertical operator particle transforms (AK / pressure weighting) | Implemented |
122
+ | First-order lifetime decay transform | Implemented |
123
+ | Declarative per-footprint transforms in config | Implemented |
124
+ | Slant-column receptor support | In scope (pending HYSPLIT validation) |
125
+ | Additional transform types | In scope |
126
+ | Specific sensor adapters (OCO-2/3, TROPOMI, TCCON) | Deferred |
127
+ | Inventory coupling and background estimation | Deferred |
128
+
129
+ ## Installation
130
+
131
+ ```bash
132
+ pip install pystilt
133
+ ```
134
+
135
+ For Slurm, Kubernetes, projections, plotting, and cloud object stores:
136
+
137
+ ```bash
138
+ pip install "pystilt[complete]"
139
+ ```
140
+
141
+ ## Quickstart: one-off run
142
+
143
+ Define a receptor, configure meteorology and footprint grid, then run:
144
+
145
+ ```python
146
+ import pandas as pd
147
+ import stilt
148
+
149
+ receptor = stilt.Receptor(
150
+ time=pd.Timestamp("2023-07-15 18:00", tz="UTC"),
151
+ latitude=40.766,
152
+ longitude=-111.848,
153
+ altitude=10,
154
+ )
155
+
156
+ model = stilt.Model(
157
+ project="./my_project",
158
+ receptors=[receptor],
159
+ config=stilt.ModelConfig(
160
+ n_hours=-24,
161
+ numpar=100,
162
+ mets={
163
+ "hrrr": stilt.MetConfig(
164
+ directory="/data/hrrr",
165
+ file_format="hrrr_%Y%m%d.arl",
166
+ file_tres="1h",
167
+ )
168
+ },
169
+ footprints={
170
+ "default": stilt.FootprintConfig(
171
+ grid=stilt.Grid(
172
+ xmin=-113.0,
173
+ xmax=-110.5,
174
+ ymin=40.0,
175
+ ymax=42.0,
176
+ xres=0.01,
177
+ yres=0.01,
178
+ )
179
+ )
180
+ },
181
+ ),
182
+ )
183
+
184
+ handle = model.run()
185
+ handle.wait()
186
+
187
+ sim = list(model.simulations.values())[0]
188
+ traj = sim.trajectories
189
+ foot = sim.get_footprint("default")
190
+ ```
191
+
192
+ ## Quickstart: queue/service runtime
193
+
194
+ ```bash
195
+ # Queue workers require a PostgreSQL-backed queue index.
196
+ export PYSTILT_DB_URL=postgresql://user:pass@host:5432/pystilt
197
+
198
+ # Initialize project files (config.yaml and receptors.csv)
199
+ stilt init ./my_project
200
+
201
+ # Run with local workers (blocks until complete)
202
+ stilt run ./my_project --backend local --n-workers 8
203
+
204
+ # Register one grouped scene submission
205
+ stilt register ./my_project --scene-id daily_2026_04_13
206
+
207
+ # Drain queue from worker processes (batch mode)
208
+ stilt pull-worker ./my_project
209
+
210
+ # Long-lived queue workers (streaming mode)
211
+ stilt serve ./my_project
212
+
213
+ # Check project status
214
+ stilt status ./my_project
215
+ ```
216
+
217
+ The same queue model is available in Python:
218
+
219
+ ```python
220
+ import stilt
221
+ from stilt.execution import pull_simulations
222
+
223
+ model = stilt.Model(project="./my_project")
224
+ model.register_pending(scene_id="daily_2026_04_14")
225
+ pull_simulations(model, follow=False) # batch mode
226
+ print(model.status(scene_id="daily_2026_04_14"))
227
+ ```
228
+
229
+ In all modes, workers claim simulations from the PostgreSQL-backed index and
230
+ write terminal state directly back to the same registry.
231
+
232
+ ## Quickstart: observation layer
233
+
234
+ PYSTILT also includes a narrow science-facing layer in `stilt.observations`.
235
+ It is designed to sit above `Receptor`, not replace the transport/runtime core.
236
+
237
+ ```python
238
+ import stilt
239
+ from stilt.observations import PointSensor
240
+
241
+ sensor = PointSensor(name="tower", supported_species=("co2",))
242
+ observations = [
243
+ sensor.make_observation(
244
+ time="2023-01-01 12:00:00",
245
+ latitude=40.77,
246
+ longitude=-111.85,
247
+ altitude=30.0,
248
+ observation_id="tower-001",
249
+ )
250
+ ]
251
+
252
+ [scene] = sensor.group_scenes(observations)
253
+ receptors = [sensor.build_receptor(obs) for obs in scene.observations]
254
+
255
+ model = stilt.Model(project="./my_project") # existing project config on disk
256
+ model.register_pending(receptors=receptors, scene_id=scene.id)
257
+ ```
258
+
259
+ Direct `Observation(...)` construction is still available when you already
260
+ have a separate product-specific normalization layer. The sensor helper just
261
+ keeps the common path less repetitive.
262
+
263
+ This layer currently focuses on:
264
+
265
+ - normalized `Observation` and `Scene` objects
266
+ - geometry/operator metadata
267
+ - generic point/column sensor families
268
+ - observation-to-receptor conversion
269
+
270
+ See `docs/advanced/observations.rst` for the intended workflow boundary.
271
+
272
+ ## Declarative transforms
273
+
274
+ Per-footprint transforms can be declared in config instead of embedded as
275
+ ad hoc callbacks.
276
+
277
+ ```yaml
278
+ footprints:
279
+ column:
280
+ grid: slv
281
+ transforms:
282
+ - kind: vertical_operator
283
+ mode: ak_pwf
284
+ levels: [0.0, 1000.0, 2000.0]
285
+ values: [0.2, 0.5, 0.3]
286
+ coordinate: xhgt
287
+ - kind: first_order_lifetime
288
+ lifetime_hours: 4.0
289
+ time_column: time
290
+ time_unit: min
291
+ ```
292
+
293
+ The built-in transform interface is intentionally small:
294
+
295
+ - vertical operator weighting
296
+ - first-order lifetime decay
297
+ - runtime typed transforms for more advanced Python workflows
298
+
299
+ ## Accessing results
300
+
301
+ ```python
302
+ import pandas as pd
303
+
304
+ for sim in model.simulations.values():
305
+ traj = sim.trajectories
306
+ foot = sim.get_footprint("default")
307
+
308
+ # Load footprints across all matching simulations
309
+ footprints = model.footprints["default"].load(
310
+ time_range=("2023-01-01", "2023-01-31")
311
+ )
312
+
313
+ coords = [(-111.9, 40.7), (-111.8, 40.8)]
314
+ time_bins = pd.interval_range(
315
+ start=pd.Timestamp("2023-01-01 00:00", tz="UTC"),
316
+ end=pd.Timestamp("2023-01-02 00:00", tz="UTC"),
317
+ freq="1h",
318
+ )
319
+
320
+ for footprint in footprints:
321
+ hourly = footprint.aggregate(coords=coords, time_bins=time_bins)
322
+ ```
323
+
324
+ If a footprint is tracked as `complete-empty`, no NetCDF file is expected for that footprint.
325
+ The model APIs treat it as a successful terminal outcome while skipping missing file loads.
326
+
327
+ ## R-STILT parity
328
+
329
+ PYSTILT footprints match the [uataq/stilt](https://github.com/uataq/stilt) R
330
+ implementation on **numerical values** at `rtol=1e-7` per cell, validated by
331
+ end-to-end fidelity scenarios against a **pinned upstream commit**.
332
+ NetCDF output is not byte-compatible with R-STILT;
333
+ it should be read as generic CF-1.8 NetCDF.
334
+ See [STILT-R.md](STILT-R.md) for more details.
335
+
336
+ ## Documentation
337
+
338
+ Full documentation is available at [https://jmineau.github.io/PYSTILT/](https://jmineau.github.io/PYSTILT/)
339
+
340
+ ## Contributing
341
+
342
+ Contributions are welcome! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
343
+
344
+ ## License
345
+
346
+ This project is licensed under the MIT License - see the LICENSE file for details.
347
+
348
+ ## Author
349
+
350
+ **James Mineau** - [jmineau](https://github.com/jmineau)
@@ -0,0 +1,83 @@
1
+ pystilt-0.1.0a1.dist-info/licenses/LICENSE,sha256=-TH5h2GDfpoQGqqDKtdwDOBUE2ZTRa_QUjvMql8XYS4,1069
2
+ stilt/__init__.py,sha256=CNM55QjKb8RwI452CRNsa5Fq8za7qHYO_H3EiUJzeU4,1319
3
+ stilt/__main__.py,sha256=tRtYKAhgh6vbURxzN8pA37nYbQLvImfxHOL8Sb1zaJI,178
4
+ stilt/cli.py,sha256=fHGpED_Qy4mTW1xmFtk2CrU5ZauYp4ejKp0zPPqe9rA,20058
5
+ stilt/collections.py,sha256=vdCqG_AWR0wnEzAzR3pMM1irLE7foYGVIpOW2m3aFdg,19239
6
+ stilt/errors.py,sha256=mooCTt6ofSJ0eWV2eyZE4kglnYDCPGAX3CyPKviU3uw,3189
7
+ stilt/footprint.py,sha256=blHT0_bEGMddoAHmmdSZIbOTiKCFKZ6TBKahc3n8cxY,37047
8
+ stilt/meteorology.py,sha256=y26t5du36-cAobO2oiFG-CLRv5QJ44BTXVz4u2VV7vY,12644
9
+ stilt/model.py,sha256=-D1Aiq-JaYGGupgDUMfRchsU2Fys0BnD3e8I2g4B1uI,18660
10
+ stilt/py.typed,sha256=WJtVGe64tcQSssSo4RD7zCf_3u7X2BmFCWDCroWOcaQ,88
11
+ stilt/receptors.py,sha256=1jEZaTZ91uTYqHwo_Npbw3LJmIpqMKeQWhNUi5beqT8,20427
12
+ stilt/selection.py,sha256=6hpy_hPxK6fy_JUI1wlXeiFzEuGjG8hoivnkZBbTUDI,5167
13
+ stilt/simulation.py,sha256=emFcuAr9tKL6XibTuCklDyYFf6H2fUZKzm2pE9FUjno,17516
14
+ stilt/trajectory.py,sha256=--t5_PzB2b4oNazISsg6XVSjX5_7BKoA5XoDfVLhwfc,11351
15
+ stilt/transforms.py,sha256=xj9S58sefpPbogcZSAwF7S9kCw9hKDsGHxiNGY08qss,5062
16
+ stilt/visualization.py,sha256=Rm2vqHviNoK3JZbyz1_LWOn4ZppS9v__sBxNdBhP2Wo,20801
17
+ stilt/config/__init__.py,sha256=LAB3dV8IXmEVZ4ATAFam54wXGGFdFZ5TX8PTH9Ti_as,1283
18
+ stilt/config/fields.py,sha256=N_tBN0fawFCy-i4wM1kZCYfk7zeVPHI6emzurgck7WQ,1601
19
+ stilt/config/footprint.py,sha256=jECyr8SZpSfmarmhf6pJtA2gN8ob2_7tSwFRiKWWam0,1848
20
+ stilt/config/meteorology.py,sha256=PMkoNqbiUGV_mfH6TLMhkI8K271kND3tKlcNZLScswQ,4326
21
+ stilt/config/model.py,sha256=DLn3sIOVUZ4CMfYY6K6-jLCd-BGIGl9aAZfMgqfUcs4,8283
22
+ stilt/config/params.py,sha256=ZUdJo8kL83BmLEBdUUMYA9IXTtXaJUtf8sGUlQeAzMw,16355
23
+ stilt/config/runtime.py,sha256=UM1R6iL5Uk9IrZn5REQGJ75gX7FuGu7U2HbJi9HyomU,2220
24
+ stilt/config/spatial.py,sha256=1OzUk4rRhWEMUT5-PJnmeGvqTaNn--mNlyyX739tLR8,2135
25
+ stilt/config/transforms.py,sha256=npOfOy1Vz6umjDrRNG5j91klPV8DDmOFXbo_9xvXQm4,3116
26
+ stilt/execution/__init__.py,sha256=gmfjJrOHbpQ4bw4bYfJW8L_ExlOclHbVaSMb3jzLqEQ,913
27
+ stilt/execution/entrypoints.py,sha256=i4GTcH-358JJ3nrKEgT4o6r5Pe5sTKV3Xrd-q7hSyMo,2434
28
+ stilt/execution/execute.py,sha256=q8ZALzYTk_n3af3NVtw3_qtC3ji14lOPEF41l3NgnFE,7303
29
+ stilt/execution/phases.py,sha256=Jp62hbhErRk19uKLVKZhPdh6d9ViNdizMBmfNK62eL4,9981
30
+ stilt/execution/tasks.py,sha256=4taquQOU3az4ADNcg_EuY5feDWXM4j1RfNLWucERQUg,4601
31
+ stilt/execution/backends/__init__.py,sha256=HZBlG8aG5Wwz4hcNePi4IQ09hzmcr2-bMeuiD0gIAJU,518
32
+ stilt/execution/backends/factory.py,sha256=ud2Iyvu-ck2qzUJVBlw1W-btfuNHNnfxM7Z2--ALvk4,1069
33
+ stilt/execution/backends/kubernetes.py,sha256=qkKGN7aXuYHmo2M4sO4UARYk7q1QnV0uQKD3garVbxQ,4681
34
+ stilt/execution/backends/local.py,sha256=Cy9an6EnKPjLvAJloFt5bYcePZ0VDomDccUdP5aPx6M,3999
35
+ stilt/execution/backends/protocol.py,sha256=cTWUaBFGlGNOxkUb4ZwBjaiTIxwmbMae8i3czQkEFKg,2010
36
+ stilt/execution/backends/slurm.py,sha256=YHEhKG_LXVe9O4-g_gdD3cPpOtUQGS7Y3IShsgVfg4U,10510
37
+ stilt/hysplit/__init__.py,sha256=mJ6apiVbc0td7bRPEvgg1JrhQJZcvf9NBwyGYZ2zvQE,101
38
+ stilt/hysplit/control.py,sha256=LtojoEdBvZTFSu0ZGObKmrvvC623CFcVDspAptSI5Xg,6227
39
+ stilt/hysplit/driver.py,sha256=P7vMBauu6kqUOyzUs3BEzsblgz2Ktus5lkSn7Ndha0o,13353
40
+ stilt/hysplit/namelist.py,sha256=Tt8FY4WlkNqdxTdGDBvw0bW0BP9YDutwmVGEZPnTfho,2952
41
+ stilt/hysplit/bin/version,sha256=B47zEKtwI8I31PaJnxqoR0-rQ-ApiiA1NkEdEYLnoGo,7
42
+ stilt/hysplit/bin/linux_x64/hycs_std,sha256=NzRr7oGmLzHS8nPJgT1Tp2xU1Zz9Wtvz92p_hw4_Sfk,2637544
43
+ stilt/hysplit/bin/macos_x64/hycs_std,sha256=8E4-Wbk78AsQ9mt8JhkUG3565HFu6d33tj5NdKfEFEk,969344
44
+ stilt/hysplit/data/ASCDATA.CFG,sha256=_UiVkmVL9gD9lrCNLM3nb5DwZyt-hy-5-jPdNj-6pkM,311
45
+ stilt/hysplit/data/LANDUSE.ASC,sha256=3mOy4_QFzey-L0WZuidr8htbsF14bNVOnCSgUcQrhRE,259380
46
+ stilt/hysplit/data/ROUGLEN.ASC,sha256=qFA5U4d7CekG6FNk5AgcQ_-11zU-P_2yWQlKy7lViLE,259380
47
+ stilt/hysplit/data/TERRAIN.ASC,sha256=Bgi1GNOcpj_od0rviH9x9FGxxpjEtwi-rTbrkmq4Ymg,259380
48
+ stilt/index/__init__.py,sha256=WNZeL5xJWwNA1RQ_MFQucY_f8VpKHNHyBIkAAsauatU,286
49
+ stilt/index/base.py,sha256=gqnwE8U5OrzLBpzSTxIiFVK0QFtd4b4PTf7WWE-FzvQ,13678
50
+ stilt/index/factory.py,sha256=zJcgAVfhVUavjv60y83PQ_zH4Hb1qn-zUa9c3XFoz7U,1290
51
+ stilt/index/postgres.py,sha256=vqaJiiA3EGIhp5dEvgsIGeWAefaO0rihI_FRNZe-uzw,6451
52
+ stilt/index/protocol.py,sha256=D8qQdFitWoNzNdMLcFjt7pjNGJoemWS-jkCypdK1PcQ,5889
53
+ stilt/index/rebuild.py,sha256=uOyk6uygtTv7qxSHq-yN7_UEBBzhJdQk5bkuDTTRJeo,4200
54
+ stilt/index/sql.py,sha256=Esvios9txVfXU4wS1bZ6SrvOFUmJ9eXtb3bDQvMhBvA,9361
55
+ stilt/index/sqlite.py,sha256=0Ijzj0vdMjEx1qTG8srChoLQgwCmFs06vT56py9xGpE,6441
56
+ stilt/index/updates.py,sha256=H7CFh8jEJUXa-fz8XzdtqdA3dhg11oWnROK2I2REvNI,2468
57
+ stilt/observations/__init__.py,sha256=Z3LhXbUXCxMxFh-9VL2wBTVkj2ahypGr3SQZEzc9c_I,1978
58
+ stilt/observations/apply.py,sha256=vsMj9DJN6NDKdrQjDnrAB_VoZLHYcyk1hjZitX0Jctc,3449
59
+ stilt/observations/chemistry.py,sha256=bAnB8jPlOs-wmKNMZkTHEcVdhKF0zKYK60lsVU5Z1Cc,4302
60
+ stilt/observations/geometry.py,sha256=XriyLMNj09JG6mMDGdQU-Xx6kx9_pNLRxw3602vmIFc,3142
61
+ stilt/observations/observation.py,sha256=kW4RQCO3QEhuPJ_395DpLxBA3qwhz03-oMJcM70VYuU,1859
62
+ stilt/observations/operators.py,sha256=g3h05BL0gMvJsqSCfYLFKa1SBNJh_aEGFYiLkPzieBE,673
63
+ stilt/observations/receptors.py,sha256=sUf1yErF26wj6kL4CK9vcrzftKMtYoSJj78NdNQyEu4,8473
64
+ stilt/observations/scenes.py,sha256=wHqoZ8bLa8LjzRAHmIK7s7mpZaX0G4xO1xq_BmCXJDI,5083
65
+ stilt/observations/selection.py,sha256=FOyik13Wys3yc3bLK1wfeplusOaazhvhfq-xHuCAdAA,14353
66
+ stilt/observations/uncertainty.py,sha256=KydDbUwLR2FO2FtVf-GyPWy97RH1m6qisL15JFkhP5I,2324
67
+ stilt/observations/weighting.py,sha256=aIMp8-7aqPWZmAzsWnlC_9G8HdhWA-_zfRvRxK3v_Vk,5309
68
+ stilt/observations/sensors/__init__.py,sha256=cgR903ik3EeXHc7vuIcO-Zs1zPxHXVcS2Z-goW1tSmw,227
69
+ stilt/observations/sensors/base.py,sha256=bsN4nZVNnngKMwSTU1x1TCUr3Gc2Uz6UV3-qApM8ZaU,3293
70
+ stilt/observations/sensors/column.py,sha256=yqiLvMFGOls_EykiaDk443M4-4tOAg9jsRw4RCTXvq4,1832
71
+ stilt/observations/sensors/point.py,sha256=DKLTFI_sKva95OO127vYiY_kiLbEpnITUESxM8nHAqw,1361
72
+ stilt/service/__init__.py,sha256=OQw4Skq1sr9KpQ5RJL9extUD8C12OME_Jl-MymUXI7I,102
73
+ stilt/service/kubernetes.py,sha256=M0E0vsnCWEnZ7FEgMpWWg2l-jCi8ZKn-CR7fkDr8tq8,8719
74
+ stilt/storage/__init__.py,sha256=-uPWYKtNOXzbUQOWNP6mYVvfGiXIURnqECuvF-12qWU,1359
75
+ stilt/storage/files.py,sha256=9LMep_5fDnNdNeYlJ5cQIQNRY4kkKbhvwVVsiU_TCdA,7078
76
+ stilt/storage/layout.py,sha256=uhW4uObzMjWSHC0mjx3Pbeua-Xm76w3uixg164fnBHk,3562
77
+ stilt/storage/project.py,sha256=jQsCtf0gLhIzNLH1iZdLmwiOgrxhBDSDQXMiGImklxI,5421
78
+ stilt/storage/store.py,sha256=TbPvexA6O1xHOHu5swOJkYuhQ6njSVShJK1VQXaZgF4,11839
79
+ pystilt-0.1.0a1.dist-info/METADATA,sha256=AgZP2OuhQclYqNk8l457e1l_do-f_yRlUilqKvta3bI,12151
80
+ pystilt-0.1.0a1.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
81
+ pystilt-0.1.0a1.dist-info/entry_points.txt,sha256=SZ_xrPLIvshGKAGIWSZOLXSgmTmECa01eT7WQo-1vuQ,40
82
+ pystilt-0.1.0a1.dist-info/top_level.txt,sha256=DygYFBeEKKI0HDXaHdP-sa_XD5qBYsZQyWN71M4kwsI,6
83
+ pystilt-0.1.0a1.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (82.0.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ stilt = stilt.cli:app
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 James Mineau
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1 @@
1
+ stilt
stilt/__init__.py ADDED
@@ -0,0 +1,64 @@
1
+ """PYSTILT public package surface."""
2
+
3
+ from importlib.metadata import PackageNotFoundError
4
+ from importlib.metadata import version as _version
5
+
6
+ from .config import (
7
+ Bounds,
8
+ FootprintConfig,
9
+ Grid,
10
+ MetConfig,
11
+ ModelConfig,
12
+ RuntimeSettings,
13
+ )
14
+ from .footprint import Footprint
15
+ from .meteorology import MetStream
16
+ from .model import Model
17
+ from .receptors import (
18
+ ColumnReceptor,
19
+ LocationID,
20
+ MultiPointReceptor,
21
+ PointReceptor,
22
+ Receptor,
23
+ ReceptorID,
24
+ read_receptors,
25
+ )
26
+ from .simulation import SimID, Simulation
27
+ from .trajectory import Trajectories
28
+ from .transforms import ParticleTransform
29
+
30
+ try:
31
+ __version__ = _version("pystilt")
32
+ except PackageNotFoundError:
33
+ __version__ = "0+unknown"
34
+ __author__ = "James Mineau"
35
+ __email__ = "jameskmineau@gmail.com"
36
+
37
+ __all__ = [
38
+ # Core
39
+ "Model",
40
+ # Configuration
41
+ "ModelConfig",
42
+ "FootprintConfig",
43
+ "Grid",
44
+ "Bounds",
45
+ "MetConfig",
46
+ "RuntimeSettings",
47
+ # Data objects (returned by Model methods)
48
+ "Simulation",
49
+ "SimID",
50
+ "Footprint",
51
+ "Trajectories",
52
+ # Receptors
53
+ "Receptor",
54
+ "ColumnReceptor",
55
+ "LocationID",
56
+ "MultiPointReceptor",
57
+ "PointReceptor",
58
+ "ReceptorID",
59
+ "read_receptors",
60
+ # Meteorology
61
+ "MetStream",
62
+ # Transforms
63
+ "ParticleTransform",
64
+ ]
stilt/__main__.py ADDED
@@ -0,0 +1,12 @@
1
+ """Module entry point for ``python -m stilt``."""
2
+
3
+ from stilt.cli import app
4
+
5
+
6
+ def main() -> None:
7
+ """Run the Typer CLI."""
8
+ app()
9
+
10
+
11
+ if __name__ == "__main__":
12
+ main()