drbx 2.0.0.dev0__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 (106) hide show
  1. drbx/__init__.py +20 -0
  2. drbx/__main__.py +5 -0
  3. drbx/cli.py +586 -0
  4. drbx/config/__init__.py +20 -0
  5. drbx/config/boutinp.py +556 -0
  6. drbx/config/model.py +34 -0
  7. drbx/config/normalization.py +66 -0
  8. drbx/data/atomic_rates/__init__.py +1 -0
  9. drbx/data/atomic_rates/iz_AMJUEL_H.x_2.1.5.json +213 -0
  10. drbx/data/atomic_rates/iz_AMJUEL_H.x_2.3.9a.json +213 -0
  11. drbx/data/atomic_rates/rec_AMJUEL_H.x_2.1.8.json +213 -0
  12. drbx/data/atomic_rates/rec_AMJUEL_H.x_2.3.13a.json +213 -0
  13. drbx/geometry/__init__.py +207 -0
  14. drbx/geometry/embedding.py +56 -0
  15. drbx/geometry/essos_import.py +1385 -0
  16. drbx/geometry/fci_geometry.py +4622 -0
  17. drbx/geometry/fci_maps.py +85 -0
  18. drbx/geometry/island_divertor.py +291 -0
  19. drbx/geometry/metric_tensor.py +99 -0
  20. drbx/geometry/open_slab.py +150 -0
  21. drbx/geometry/rotating_ellipse.py +253 -0
  22. drbx/geometry/shifted_torus.py +225 -0
  23. drbx/geometry/stellarator.py +287 -0
  24. drbx/geometry/vmec_extender_import.py +499 -0
  25. drbx/geometry/vmec_jax_import.py +306 -0
  26. drbx/linear/__init__.py +37 -0
  27. drbx/linear/dispersion.py +138 -0
  28. drbx/linear/eigen.py +91 -0
  29. drbx/native/__init__.py +224 -0
  30. drbx/native/array_backend.py +64 -0
  31. drbx/native/deck_runner.py +779 -0
  32. drbx/native/electromagnetic.py +250 -0
  33. drbx/native/expression.py +173 -0
  34. drbx/native/fci.py +295 -0
  35. drbx/native/fci_2_field_rhs.py +182 -0
  36. drbx/native/fci_4_field_rhs.py +1267 -0
  37. drbx/native/fci_boundaries.py +2494 -0
  38. drbx/native/fci_differentiable_case.py +304 -0
  39. drbx/native/fci_drb_EB_rhs.py +1243 -0
  40. drbx/native/fci_drb_rhs.py +190 -0
  41. drbx/native/fci_halo.py +1575 -0
  42. drbx/native/fci_helpers.py +350 -0
  43. drbx/native/fci_model.py +294 -0
  44. drbx/native/fci_neutral.py +139 -0
  45. drbx/native/fci_operators.py +4081 -0
  46. drbx/native/fci_sharding.py +597 -0
  47. drbx/native/fci_sheath_recycling.py +206 -0
  48. drbx/native/fci_time_integrator.py +96 -0
  49. drbx/native/fci_vorticity.py +198 -0
  50. drbx/native/fluid_1d.py +330 -0
  51. drbx/native/hasegawa_wakatani.py +196 -0
  52. drbx/native/limiters.py +57 -0
  53. drbx/native/mesh.py +238 -0
  54. drbx/native/metrics.py +234 -0
  55. drbx/native/neutrals/__init__.py +58 -0
  56. drbx/native/neutrals/atomic_rates.py +134 -0
  57. drbx/native/neutrals/detachment_sol_model.py +221 -0
  58. drbx/native/neutrals/reactions.py +164 -0
  59. drbx/native/neutrals/recycling_sol_model.py +197 -0
  60. drbx/native/sol_flux_tube.py +133 -0
  61. drbx/native/stellarator_turbulence.py +343 -0
  62. drbx/native/transport.py +134 -0
  63. drbx/native/units.py +32 -0
  64. drbx/native/vorticity.py +252 -0
  65. drbx/runtime/__init__.py +53 -0
  66. drbx/runtime/artifacts.py +161 -0
  67. drbx/runtime/memory.py +144 -0
  68. drbx/runtime/output.py +374 -0
  69. drbx/runtime/paths.py +9 -0
  70. drbx/runtime/performance.py +161 -0
  71. drbx/runtime/run_config.py +184 -0
  72. drbx/runtime/scheduler.py +99 -0
  73. drbx/runtime/state.py +40 -0
  74. drbx/validation/__init__.py +424 -0
  75. drbx/validation/autodiff_diffusion.py +329 -0
  76. drbx/validation/autodiff_diffusion_uncertainty.py +235 -0
  77. drbx/validation/diverted_tokamak_movie.py +558 -0
  78. drbx/validation/essos_fieldline_import_campaign.py +181 -0
  79. drbx/validation/essos_imported_artifact_audit.py +535 -0
  80. drbx/validation/essos_imported_drb_movie_campaign.py +2826 -0
  81. drbx/validation/essos_imported_fci_campaign.py +5241 -0
  82. drbx/validation/essos_imported_pytree_campaign.py +406 -0
  83. drbx/validation/essos_vmec_closed_field_campaign.py +314 -0
  84. drbx/validation/essos_vmec_closed_field_transient_campaign.py +629 -0
  85. drbx/validation/essos_vmec_fieldline_surface_campaign.py +620 -0
  86. drbx/validation/fluid_1d_mms_convergence.py +250 -0
  87. drbx/validation/geometry_lineouts.py +136 -0
  88. drbx/validation/geometry_slices.py +178 -0
  89. drbx/validation/publication_plotting.py +91 -0
  90. drbx/validation/stellarator_drb_pytree_campaign.py +621 -0
  91. drbx/validation/stellarator_fci_geometry_campaign.py +200 -0
  92. drbx/validation/stellarator_fci_operator_campaign.py +304 -0
  93. drbx/validation/stellarator_fci_suite_campaign.py +264 -0
  94. drbx/validation/stellarator_metric_mms_campaign.py +289 -0
  95. drbx/validation/stellarator_neutral_physics_campaign.py +255 -0
  96. drbx/validation/stellarator_sheath_recycling_campaign.py +331 -0
  97. drbx/validation/stellarator_sol_showcase.py +628 -0
  98. drbx/validation/stellarator_vorticity_campaign.py +304 -0
  99. drbx/validation/vmec_extender_edge_field_campaign.py +260 -0
  100. drbx/validation/vmec_extender_sol_smoke_campaign.py +365 -0
  101. drbx-2.0.0.dev0.dist-info/METADATA +380 -0
  102. drbx-2.0.0.dev0.dist-info/RECORD +106 -0
  103. drbx-2.0.0.dev0.dist-info/WHEEL +5 -0
  104. drbx-2.0.0.dev0.dist-info/entry_points.txt +2 -0
  105. drbx-2.0.0.dev0.dist-info/licenses/LICENSE +21 -0
  106. drbx-2.0.0.dev0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,380 @@
1
+ Metadata-Version: 2.4
2
+ Name: drbx
3
+ Version: 2.0.0.dev0
4
+ Summary: JAX-first edge and scrape-off-layer plasma code with differentiable, hardware-agnostic solver infrastructure.
5
+ License-Expression: MIT
6
+ Classifier: Programming Language :: Python :: 3
7
+ Classifier: Programming Language :: Python :: 3.10
8
+ Classifier: Programming Language :: Python :: 3.11
9
+ Classifier: Programming Language :: Python :: 3.12
10
+ Requires-Python: >=3.10
11
+ Description-Content-Type: text/markdown
12
+ License-File: LICENSE
13
+ Requires-Dist: jax
14
+ Requires-Dist: scipy
15
+ Requires-Dist: matplotlib
16
+ Requires-Dist: netCDF4
17
+ Requires-Dist: rich
18
+ Requires-Dist: pillow
19
+ Requires-Dist: solvax>=0.8.6
20
+ Requires-Dist: tomli; python_version < "3.11"
21
+ Provides-Extra: dev
22
+ Requires-Dist: pytest; extra == "dev"
23
+ Requires-Dist: pytest-cov; extra == "dev"
24
+ Requires-Dist: pytest-xdist; extra == "dev"
25
+ Provides-Extra: docs
26
+ Requires-Dist: mkdocs; extra == "docs"
27
+ Requires-Dist: pymdown-extensions; extra == "docs"
28
+ Dynamic: license-file
29
+
30
+ # DRBX
31
+
32
+ [![Tests](https://github.com/uwplasma/drbx/actions/workflows/test.yml/badge.svg)](https://github.com/uwplasma/drbx/actions/workflows/test.yml)
33
+ [![Docs](https://github.com/uwplasma/drbx/actions/workflows/docs.yml/badge.svg)](https://github.com/uwplasma/drbx/actions/workflows/docs.yml)
34
+ [![Coverage](https://github.com/uwplasma/drbx/actions/workflows/coverage.yml/badge.svg)](https://github.com/uwplasma/drbx/actions/workflows/coverage.yml)
35
+ [![PyPI](https://img.shields.io/pypi/v/drbx.svg)](https://pypi.org/project/drbx/)
36
+ [![Python](https://img.shields.io/pypi/pyversions/drbx.svg)](https://pypi.org/project/drbx/)
37
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
38
+ [![JAX](https://img.shields.io/badge/JAX-enabled-0a9396.svg)](https://jax.readthedocs.io/)
39
+ [![Read the Docs](https://readthedocs.org/projects/drbx/badge/?version=latest)](https://drbx.readthedocs.io/)
40
+
41
+ **DRBX is a JAX-based, end-to-end differentiable drift-reduced Braginskii
42
+ (DRB) code for edge and scrape-off-layer (SOL) plasma turbulence** — on both
43
+ closed and open field lines, in axisymmetric (tokamak) and non-axisymmetric
44
+ (stellarator) geometry via the flux-coordinate-independent (FCI) approach.
45
+
46
+ Because the whole model is written in JAX, every simulation is `jit`-compiled,
47
+ runs on CPU or GPU unchanged, and is differentiable: you can take gradients of
48
+ any output (a saturated fluctuation energy, a transport level) with respect to
49
+ any input (a density gradient, an adiabaticity, a diffusivity) through the
50
+ solver. To our knowledge no other published DRB SOL turbulence code is
51
+ differentiable, and none combines differentiability with FCI stellarator
52
+ geometry.
53
+
54
+ Documentation: [drbx.readthedocs.io](https://drbx.readthedocs.io/en/latest/).
55
+
56
+ ## Stellarator turbulence in three dimensions
57
+
58
+ Four-field drift-reduced turbulence on a rotating-ellipse stellarator — a torus
59
+ whose elliptical cross-section rotates with the toroidal angle. The cutaway
60
+ shows the density fluctuations on a flux surface and through the interior;
61
+ every frame is a `jit`-compiled, differentiable JAX step:
62
+
63
+ ![Stellarator turbulence in 3D](docs/media/stellarator_3d_turbulence.gif)
64
+
65
+ *Reproduce with [`examples/stellarator/stellarator_3d_render.py`](examples/stellarator/stellarator_3d_render.py).*
66
+
67
+ The same geometry supports closed and open field lines: core field lines (blue)
68
+ stay on flux surfaces, while beyond a toroidal limiter the scrape-off-layer
69
+ field lines (red) end on the limiter plate, where a Bohm sheath drains the
70
+ plasma:
71
+
72
+ ![Closed and open field lines in 3D](docs/media/stellarator_3d_field_lines.png)
73
+
74
+ *Reproduce with [`examples/stellarator/stellarator_3d_render.py`](examples/stellarator/stellarator_3d_render.py).*
75
+
76
+ ## Install
77
+
78
+ ```bash
79
+ pip install drbx # from PyPI
80
+ # or, from source:
81
+ git clone https://github.com/uwplasma/drbx && cd drbx && pip install -e .
82
+ ```
83
+
84
+ Runtime dependencies are `jax`, `scipy`, `matplotlib`, `netCDF4`, `rich`,
85
+ `pillow`, and [`solvax`](https://github.com/uwplasma/SOLVAX). Python 3.10-3.12.
86
+
87
+ ## Quick start
88
+
89
+ Run a simulation from a TOML deck, or inspect one without running it:
90
+
91
+ ```bash
92
+ drbx inspect examples/inputs/restartable_diffusion.toml # resolve and print the plan
93
+ drbx run examples/inputs/restartable_diffusion.toml # run and write artifacts
94
+ ```
95
+
96
+ From Python, a differentiable turbulence run is a few lines:
97
+
98
+ ```python
99
+ import jax.numpy as jnp
100
+ import numpy as np
101
+ from drbx.native.hasegawa_wakatani import HasegawaWakataniParameters, hw_grid, hw_run
102
+
103
+ grid = hw_grid(64, 2 * jnp.pi * 8)
104
+ params = HasegawaWakataniParameters(adiabaticity=1.0, gradient=1.0)
105
+ rng = np.random.default_rng(0)
106
+ zeta0 = jnp.fft.fft2(jnp.asarray(1e-2 * rng.standard_normal((64, 64))))
107
+ n0 = jnp.fft.fft2(jnp.asarray(1e-2 * rng.standard_normal((64, 64))))
108
+ zeta, n = hw_run(zeta0, n0, grid, params, dt=5e-3, steps=500) # jit-compiled, differentiable
109
+ ```
110
+
111
+ Every example below is a flat script: parameters at the top, run, plot.
112
+
113
+ ## Highlights
114
+
115
+ **Turbulence on closed and open field lines.** The same multi-mode seed on the
116
+ rotating-ellipse stellarator, with all field lines closed (top) and with a
117
+ limiter opening the outer flux surfaces into a sheath-drained scrape-off layer
118
+ (bottom). Four toroidal cross-sections; the mode pattern differs plane by plane
119
+ because the flux surfaces rotate:
120
+
121
+ ![Stellarator turbulence, closed](docs/media/stellarator_turbulence_closed.gif)
122
+
123
+ ![Stellarator SOL turbulence, open](docs/media/stellarator_turbulence_open.gif)
124
+
125
+ *Reproduce with [`examples/stellarator/stellarator_turbulence.py`](examples/stellarator/stellarator_turbulence.py).*
126
+
127
+ **Island divertor.** A sheared rotational transform with resonant perturbations
128
+ forms island chains and a stochastic edge. The open scrape-off layer emerges
129
+ from the field itself: multi-transit field-line tracing marks the finite
130
+ connection-length region, and the turbulence drains through it:
131
+
132
+ ![Island divertor](docs/media/island_divertor.png)
133
+
134
+ *Reproduce with [`examples/stellarator/island_divertor.py`](examples/stellarator/island_divertor.py).*
135
+
136
+ **Imported fields: real coils and VMEC equilibria.** The same closed/open
137
+ field-line machinery runs on imported fields: the vacuum Biot-Savart field of
138
+ the Landreman-Paul quasi-axisymmetric coil set (via ESSOS) shows nested closed
139
+ surfaces inside a chaotic open edge, and a VMEC equilibrium (via vmec_jax)
140
+ provides closed surfaces whose traced rotational transform matches the
141
+ equilibrium's `iotaf` profile to ~1e-6 — with the open scrape-off-layer lines
142
+ traced to their exit from the confined region:
143
+
144
+ | Coil field (closed core, open edge) | VMEC equilibrium + coil-field SOL |
145
+ |---|---|
146
+ | ![Landreman-Paul coils Poincare](docs/media/closed_open_vacuum_poincare.png) | ![VMEC closed and open field lines](docs/media/vmec_jax_closed_open_field_lines.png) |
147
+
148
+ *Reproduce with [`examples/geometry-3D/essos-field-lines/closed_open_vacuum_poincare.py`](examples/geometry-3D/essos-field-lines/closed_open_vacuum_poincare.py) (left) and [`examples/geometry-3D/vmec-jax/closed_open_field_lines.py`](examples/geometry-3D/vmec-jax/closed_open_field_lines.py) (right).*
149
+
150
+ **Neutrals and detachment.** The open SOL flux tube reaches the two-point Bohm
151
+ steady state; the hermes-3 neutral model (packaged AMJUEL atomic rates, target
152
+ recycling) builds the neutral cushion; and with an evolved temperature the SOL
153
+ detaches — the target cools through 1 eV and the target ion flux rolls over
154
+ (the SD1D benchmark):
155
+
156
+ | Open SOL flux tube | Recycling SOL with neutrals |
157
+ |---|---|
158
+ | ![Open SOL flux tube](docs/media/open_sol_flux_tube.png) | ![Recycling SOL](docs/media/recycling_sol.png) |
159
+
160
+ *Reproduce with [`examples/sol/open_sol_flux_tube.py`](examples/sol/open_sol_flux_tube.py) (left) and [`examples/sol/recycling_sol.py`](examples/sol/recycling_sol.py) (right).*
161
+
162
+ ![Detachment rollover](docs/media/b6_detachment.png)
163
+
164
+ *Reproduce with [`examples/benchmarks/b6_detachment_rollover.py`](examples/benchmarks/b6_detachment_rollover.py).*
165
+
166
+ ## Gradient-based optimization through the physics
167
+
168
+ Because the solver is differentiable end to end, control and design problems
169
+ become gradient computations. Example: **detachment control** — find the
170
+ upstream density that places the divertor target exactly at the 1 eV
171
+ detachment threshold (Dudson et al., PPCF 61, 065008; Body et al., NME 41,
172
+ 101819). The sensitivity `dTe_target/dn_up` is computed by forward-mode
173
+ autodiff **through the entire 20,000-step stiff SOL solve**, and a trust-region
174
+ Newton iteration walks down the detachment cliff to the threshold:
175
+
176
+ ![Detachment control](docs/media/detachment_control.png)
177
+
178
+ *Reproduce with [`examples/autodiff/detachment_control.py`](examples/autodiff/detachment_control.py).*
179
+
180
+ A second example: **turbulence optimization** — find the adiabaticity (the
181
+ parallel electron conductivity) at which saturated drift-wave transport drops
182
+ to a quarter of its hydrodynamic-regime level, the classic
183
+ hydrodynamic-to-adiabatic transition of Hasegawa-Wakatani turbulence (Camargo,
184
+ Biskamp & Scott, *Phys. Plasmas* 2, 48 (1995)). A damped Newton iteration on
185
+ the adiabaticity, with forward-mode gradients through the saturated turbulence,
186
+ converges in 7 iterations; an independent long run verifies a 3.96x flux
187
+ reduction against the 4x target. Left column: the initial hydrodynamic state;
188
+ right column: the optimized adiabatic state:
189
+
190
+ ![Hasegawa-Wakatani optimization](docs/media/hasegawa_wakatani_optimization.png)
191
+
192
+ *Reproduce with [`examples/tokamak/hasegawa_wakatani_optimization.py`](examples/tokamak/hasegawa_wakatani_optimization.py).*
193
+
194
+ The same machinery recovers a transport-drive parameter by gradient descent
195
+ through nonlinear drift-wave turbulence
196
+ ([inverse design](examples/tokamak/drift_wave_inverse_design.py)), and the
197
+ [differentiation-methods example](examples/autodiff/differentiation_methods.py)
198
+ measures which method is cheapest (forward mode for a few parameters, ~2x a
199
+ forward run; reverse mode for parameter fields; checkpointing when memory-bound).
200
+
201
+ ## Performance and parallel execution
202
+
203
+ Single-CPU turbulence throughput is about 2 million cell-updates per second in
204
+ float64, and one gradient through a 200-step rollout costs 2-3x a forward run.
205
+ The full four-field FCI step — four RHS evaluations, each with a GMRES
206
+ potential inversion — compiles as a single `jit` program with no host
207
+ synchronization inside, which roughly halves the stellarator-turbulence
208
+ step time on one CPU
209
+ ([details](docs/performance_and_differentiability.md)):
210
+
211
+ | Turbulence performance | Cost of each differentiation method |
212
+ |---|---|
213
+ | ![Performance](docs/media/performance.png) | ![Differentiation methods](docs/media/differentiation_methods.png) |
214
+
215
+ *Reproduce with [`examples/benchmarks/performance_benchmark.py`](examples/benchmarks/performance_benchmark.py) (left) and [`examples/autodiff/differentiation_methods.py`](examples/autodiff/differentiation_methods.py) (right).*
216
+
217
+ The FCI stack runs across devices with `shard_map`: the sharded step is
218
+ bit-exact against single-device execution, and on a 36-core host with one core
219
+ per shard a 1.05M-cell step reaches a 7.4x speedup at 16 shards; the same step
220
+ on one NVIDIA A4000 GPU runs ~96x faster than a single CPU shard
221
+ ([demo](examples/benchmarks/fci_sharded_strong_scaling.py)):
222
+
223
+ ![Strong scaling](docs/media/strong_scaling.png)
224
+
225
+ *Reproduce with [`examples/benchmarks/fci_sharded_strong_scaling.py`](examples/benchmarks/fci_sharded_strong_scaling.py).*
226
+
227
+ ## Hasegawa-Wakatani benchmark
228
+
229
+ The standard two-field drift-wave turbulence benchmark: grown from noise
230
+ through the linear instability (growth rate verified against the analytic
231
+ dispersion relation to ~1e-14) into nonlinear E×B transport. Detailed
232
+ verification figures — dispersion scans, MMS convergence orders, and
233
+ gradient-vs-finite-difference checks — are in the
234
+ [documentation](https://drbx.readthedocs.io/en/latest/):
235
+
236
+ ![Drift-wave turbulence](docs/media/drift_wave_turbulence.gif)
237
+
238
+ *Reproduce with [`examples/tokamak/drift_wave_turbulence.py`](examples/tokamak/drift_wave_turbulence.py).*
239
+
240
+ ## Reproducing the figures and movies
241
+
242
+ Every figure and movie above states the script that generates it. Each is a
243
+ flat pedagogical file in [`examples/`](examples/): all parameters at the top
244
+ with comments, explicit model/geometry/boundary-condition setup through the
245
+ public API, progress printed while it runs, plot written at the end. The
246
+ embedded copies live compressed in `docs/media/`; the scripts regenerate
247
+ full-quality versions under `output/`.
248
+
249
+ ## What it does
250
+
251
+ | Capability | What ships |
252
+ |---|---|
253
+ | **Turbulence models** | Hasegawa-Wakatani drift-wave (pseudo-spectral, differentiable); FCI 2-field, 4-field interchange (density/vorticity/parallel flows), and electromagnetic drift-reduced stacks with curvature and vorticity/potential closures |
254
+ | **Geometry** | Rotating-ellipse stellarator (closed core + optional limiter SOL), island-divertor field (emergent stochastic SOL), shifted-torus helical flux tube, open slab SOL, imported ESSOS coil / VMEC / hybrid equilibria — metrics by autodiff of analytic embeddings |
255
+ | **Field-line topology** | Closed and open field lines; FCI traced field-line maps; multi-transit connection-length tracing; Bohm sheath + target recycling closure on open endpoints |
256
+ | **Neutrals (hermes-3 model)** | Packaged AMJUEL ionization/recombination + charge-exchange rates (no external database); Galilean-invariant plasma-neutral coupling; recycling SOL and a self-consistent detaching SOL (implicit Spitzer conduction, self-limiting radiation, SD1D rollover) |
257
+ | **Linear solver** | `drbx.linear` linearizes any model about an equilibrium; drift-wave, shear-Alfven, and interchange dispersion reproduced to machine precision |
258
+ | **Differentiability** | `jit`/`grad`/`vmap` through every model — sensitivity, uncertainty propagation, inverse design, detachment control; forward/reverse/checkpointed methods measured and gated to agree |
259
+ | **Parallelism** | Multi-device `shard_map` FCI stepping (bit-exact vs single device) with halo exchange; CPU strong scaling demonstrated, GPU-ready |
260
+ | **Solvers** | Structured solves via [`solvax`](https://github.com/uwplasma/SOLVAX) (spectral Fourier-Helmholtz elliptic, tridiagonal, Krylov, preconditioners) |
261
+ | **Runtime** | TOML-deck CLI (`drbx inspect` / `run`) and a small Python API; restartable runs; portable JSON/NPZ artifacts |
262
+
263
+ ## Validation
264
+
265
+ `drbx` is validated against a ladder of literature-anchored benchmarks.
266
+ Each rung has a test (or a documented gate) and an example that regenerates
267
+ its figure.
268
+
269
+ Verified today (each with a passing test):
270
+
271
+ | Case | Anchor | What is checked |
272
+ |------|--------|-----------------|
273
+ | Method of manufactured solutions | Riva et al., *Phys. Plasmas* 21, 062301 (2014); Dudson et al. 23, 062303 (2016) | operator / 1D-fluid / FCI convergence order → 2 |
274
+ | Resistive drift-wave dispersion | Dudson et al., *Comput. Phys. Commun.* 180, 1467 (2009) | growth rate and frequency vs analytic dispersion |
275
+ | Shear-Alfvén wave dispersion | Stegmeir et al., *Phys. Plasmas* 26, 052517 (2019) | phase velocity vs analytic (with electron inertia) |
276
+ | Interchange / Rayleigh-Taylor | curvature-driven flute dispersion | growth rate vs `√(gκ)·k_y/k` analytic |
277
+ | FCI on non-axisymmetric geometry | Shanahan et al., *PPCF* 61, 025007 (2019, BSTING) | parallel-operator MMS; differentiable rollout (grad vs FD 6e-11) |
278
+ | Rotating-ellipse (`l = 2`) FCI | Stegmeir et al., *Comput. Phys. Commun.* 198, 139 (2016, GRILLIX) | direct & traced-field-line parallel gradient converge at order 2 on a genuinely non-axisymmetric metric; shape-differentiable; a seeded four-field filament generates interchange vorticity on the rotating surfaces |
279
+ | Island-divertor field (B8) | Shanahan et al., *J. Plasma Phys.* 90 (2024, BSTING); GBS island-divertor studies | sheared-iota island chains + stochastic edge; closed core and finite-connection-length open SOL emerge from multi-transit tracing; turbulence drains through the emergent divertor masks |
280
+ | Open-field-line SOL flux tube | two-point / Bohm-sheath SOL theory (Stangeby, *The Plasma Boundary of Magnetic Fusion Devices*, 2000) | parallel flow reaches Mach 1 at the targets; target density = half upstream; exact Bohm particle balance and sheath-recycling accounting |
281
+ | Neutrals and recycling (hermes-3 model) | hermes-3: Dudson et al., *Comput. Phys. Commun.* 296, 108991 (2024); AMJUEL atomic rates | physically-correct ionization/recombination/CX rates; exact plasma↔neutral particle & momentum conservation; neutrals conserve on the 3D closed rotating ellipse and recycle on the open slab |
282
+ | SD1D detachment rollover (B6) | SD1D: Dudson et al., *Plasma Phys. Control. Fusion* 61, 065008 (2019) | self-consistent SOL (evolved temperature, implicit Spitzer conduction, self-limiting radiation): the target cools through 1 eV into the recombining regime and the target ion flux rolls over as upstream density rises; differentiable |
283
+ | Differentiable inverse design | — | gradient descent through turbulence recovers a drive parameter |
284
+
285
+ Planned rungs (seeded-blob inertial scaling and others) are
286
+ tracked in the project planning notes; benchmark reports live under
287
+ [docs/](docs/linear_dispersion_benchmark.md) and
288
+ [docs/validation_gallery.md](docs/validation_gallery.md).
289
+
290
+ ## Examples
291
+
292
+ Flagship simulations, by geometry:
293
+
294
+ | | Turbulence flagship | Geometry |
295
+ |---|---|---|
296
+ | **Tokamak** | [drift-wave turbulence](examples/tokamak/drift_wave_turbulence.py) (Hasegawa-Wakatani; linear phase B2-verified, differentiable) + [inverse design](examples/tokamak/drift_wave_inverse_design.py) | periodic flux tube |
297
+ | **Stellarator** | [turbulence on closed + open field lines](examples/stellarator/stellarator_turbulence.py) (four-field, limiter SOL, movies) + [3D renders](examples/stellarator/stellarator_3d_render.py) (cutaway turbulence movie, field-line topology) + [island divertor](examples/stellarator/island_divertor.py) (B8: Poincare, connection lengths, emergent open SOL) + [rotating-ellipse FCI](examples/stellarator/rotating_ellipse_fci.py) (parallel-operator convergence) + [seeded filament](examples/stellarator/rotating_ellipse_filament.py) + [differentiable FCI drift-reduced model](examples/stellarator/fci_differentiable.py) | rotating ellipse (closed core + limiter SOL) + shifted-torus helical + imported [ESSOS/VMEC](examples/geometry-3D/) |
298
+ | **Coils (vacuum)** | [Landreman-Paul closed + open field lines](examples/geometry-3D/essos-field-lines/closed_open_vacuum_poincare.py) (ESSOS Biot-Savart, Poincare classification) | imported coil field |
299
+ | **VMEC equilibria** | [closed field lines from a wout file](examples/geometry-3D/vmec-jax/closed_field_lines.py) (vmec_jax import; traced rotational transform matches the equilibrium `iotaf` profile to ~1e-6) + [closed + open field lines](examples/geometry-3D/vmec-jax/closed_open_field_lines.py) (coil field with the VMEC last closed flux surface overlaid) | imported VMEC equilibrium (Landreman-Paul precise QA) |
300
+ | **SOL (open)** | [open SOL flux tube](examples/sol/open_sol_flux_tube.py) (parallel transport to Bohm-sheath targets; two-point steady state) + [recycling SOL](examples/sol/recycling_sol.py) (neutrals, ionization/recombination, detachment onset) | open slab flux tube |
301
+
302
+ Open-field-line SOL:
303
+ [open slab flux tube](examples/sol/open_sol_flux_tube.py) — parallel
304
+ transport to Bohm-sheath-bounded targets, relaxing to the classic two-point
305
+ steady state (Mach 1 at the targets, target density half the upstream density),
306
+ with the FCI sheath/recycling closure on the target plates.
307
+
308
+ Benchmarks, differentiable, and geometry examples:
309
+
310
+ - Linear dispersion (B2/B3):
311
+ [examples/benchmarks/linear_dispersion.py](examples/benchmarks/linear_dispersion.py)
312
+ reproduces the drift-wave and shear-Alfvén dispersion relations from the
313
+ linear solver.
314
+ - Autodiff: [gradient-based detachment control](examples/autodiff/detachment_control.py)
315
+ (forward-mode sensitivity through the stiff SOL solve, trust-region Newton onto
316
+ the 1 eV threshold), [inverse design through turbulence](examples/tokamak/drift_wave_inverse_design.py)
317
+ (recover a parameter by gradient descent through a nonlinear drift-wave run),
318
+ [choosing the most efficient differentiation method](examples/autodiff/differentiation_methods.py)
319
+ (forward vs reverse vs checkpointed reverse — same gradient, different cost),
320
+ plus [sensitivity](examples/autodiff_diffusion_sensitivity.py),
321
+ [uncertainty](examples/autodiff_diffusion_uncertainty.py), and reduced
322
+ [inverse design](examples/autodiff_diffusion_inverse_design.py).
323
+ - Stellarator FCI and imported geometry:
324
+ [examples/geometry-3D/](examples/geometry-3D/).
325
+ - Start with [examples/model_selection_guide.py](examples/model_selection_guide.py)
326
+ to choose a model family, dimension, and boundary conditions.
327
+
328
+ The examples are self-contained — no external plasma code is needed to run
329
+ them. Large figures and movies are hosted in GitHub releases so the checkout
330
+ stays small.
331
+
332
+ ## Geometry and parallelization
333
+
334
+ The FCI operator and domain-decomposition stack (`FciGeometry3D`,
335
+ `fci_operators`, halo exchange) was contributed by **Aiken Xie** in
336
+ [PR #3](https://github.com/uwplasma/drbx/pull/3) and is incorporated here.
337
+ Built on it, the drift-reduced two-field step runs across multiple devices with
338
+ `shard_map`: the domain is decomposed into halo-exchanged shards and the sharded
339
+ RK4 step is **bit-exact** against the single-device step (checked to ~1e-16 for
340
+ single-device and forced-four-device runs in
341
+ [`tests/test_fci_sharded_2field.py`](tests/test_fci_sharded_2field.py)). On a
342
+ 36-core Linux host with one core bound per shard, a 1.05M-cell step reaches a
343
+ **7.4x speedup at 16 shards**, and one NVIDIA A4000 GPU runs the same step
344
+ ~96x faster than a single CPU shard
345
+ ([strong-scaling script](examples/benchmarks/fci_sharded_strong_scaling.py),
346
+ [docs](docs/performance_and_differentiability.md)).
347
+
348
+ ## Documentation
349
+
350
+ - Physics and numerics: [physics_models.md](docs/physics_models.md),
351
+ [equation_to_code_map.md](docs/equation_to_code_map.md),
352
+ [code_structure.md](docs/code_structure.md).
353
+ - Performance and differentiability:
354
+ [performance_and_differentiability.md](docs/performance_and_differentiability.md),
355
+ [profiling_runtime.md](docs/profiling_runtime.md).
356
+ - Validation: [validation_gallery.md](docs/validation_gallery.md).
357
+ - Testing policy: [testing_strategy.md](docs/testing_strategy.md).
358
+
359
+ ## Testing
360
+
361
+ ```bash
362
+ pytest -q -m "not slow" # full fast suite
363
+ pytest -q -m "not slow" --cov=drbx --cov-branch # with coverage
364
+ ```
365
+
366
+ CI runs the full fast suite on Python 3.10–3.12.
367
+
368
+ ## Releases
369
+
370
+ The current development series is described in
371
+ [docs/release_notes_2_0_0_dev0.md](docs/release_notes_2_0_0_dev0.md).
372
+
373
+ ## Citing
374
+
375
+ If you use DRBX in published work, please cite this repository
376
+ (https://github.com/uwplasma/DRBX).
377
+
378
+ ## License
379
+
380
+ MIT — see [LICENSE](LICENSE).
@@ -0,0 +1,106 @@
1
+ drbx/__init__.py,sha256=yF8f2vTPl6VVZl7YgA98_wo71t7mhCv8pGWpAB7cVN8,585
2
+ drbx/__main__.py,sha256=PSQ4rpL0dG6f-qH4N7H-gD9igQkdHzH4yVZDcW8lfZo,80
3
+ drbx/cli.py,sha256=eyIPbYZ7kSLc1mCVErMi398nmUN0hBzp2vGD80wcbxA,21935
4
+ drbx/config/__init__.py,sha256=LsgOLLlw0gU8xoXZrV3maheUn-DvBJXMOjPqVVJLHdQ,645
5
+ drbx/config/boutinp.py,sha256=khEl_5yzR7F82T-xSGBbeD2iX01NUkD-hX4AQXC3UZI,20167
6
+ drbx/config/model.py,sha256=Xg-yOrkj5Exw_0mQ8Lon_H0IjTP4iPDikGqhulHf1Tg,967
7
+ drbx/config/normalization.py,sha256=dXjAFflh-Knpe1KlpMIR3ffSz0kfLUi6ei4xG1Gh4sQ,2074
8
+ drbx/data/atomic_rates/__init__.py,sha256=Zu7gdLI2fry6Peo-_FHadbN_2OwHyVJkUSMInXUIGIc,74
9
+ drbx/data/atomic_rates/iz_AMJUEL_H.x_2.1.5.json,sha256=phsv7xT5nsBi30B-Envr2F1J5SKsgKt_yb8VUOLh8eM,6027
10
+ drbx/data/atomic_rates/iz_AMJUEL_H.x_2.3.9a.json,sha256=Gq85BB4_qssLR1WH0Yv6xuApwOw2yzToGbxcYMGnWcQ,6220
11
+ drbx/data/atomic_rates/rec_AMJUEL_H.x_2.1.8.json,sha256=R5nYLJ7roKfE8C0QXNH8KN_5_DiAmlVQhJyIVIKHAII,6297
12
+ drbx/data/atomic_rates/rec_AMJUEL_H.x_2.3.13a.json,sha256=y0N0wlfHjqdLoGvc3GcvN5LchpjQHG5q3J3tHZ0rux8,6381
13
+ drbx/geometry/__init__.py,sha256=BcUiJeVit2B0vvoKs8zDhd6VssttCkEVIRJMYkkTvhA,6350
14
+ drbx/geometry/embedding.py,sha256=0aFTJhvuLl9XcyLikPlcwo1li78zGPFrUazjOdlHhns,2001
15
+ drbx/geometry/essos_import.py,sha256=nx0LEmr9OL9nuV37YPN9jaoafvYq1m-eO1falROKJ4U,56075
16
+ drbx/geometry/fci_geometry.py,sha256=B_T_I_Q_4OnO7inedqnPYOKf2Zf6i3n6pqkm-DV5KEc,176396
17
+ drbx/geometry/fci_maps.py,sha256=i0QPPzJjPk0gjyoVjo8sy-gt-8lzCl5wU4vsJAZ951Y,3193
18
+ drbx/geometry/island_divertor.py,sha256=CzptKOwdwd91Tr1ECh7kFhxV98E16XPYGEG3ZMVY8WQ,12028
19
+ drbx/geometry/metric_tensor.py,sha256=8o3hKfyyy35Vqk2q2NLy21nFYEGiyTEdGXdbDaYGxEE,2856
20
+ drbx/geometry/open_slab.py,sha256=tSHAbq1ZnLNiRf1Y6rt4lWDxQfNilBPeQulziDUN_ck,5595
21
+ drbx/geometry/rotating_ellipse.py,sha256=hA3JxdZD1WzH1oFfTaPWtwqDj5KclHMn0cNYHSe8YNQ,10481
22
+ drbx/geometry/shifted_torus.py,sha256=MVoOGTDIGrR3n7lXrtLNKh7NTG3Q5pjzTLnnhpdnmqw,9234
23
+ drbx/geometry/stellarator.py,sha256=ZtJ80ZM1o72nQTOcrjUBEQgF1WfcWgPyy4oON1Jb-tA,10683
24
+ drbx/geometry/vmec_extender_import.py,sha256=L7n_yn3DnC1PycUzTyC6pjc29XNnMErwKYOfyByYNGU,18650
25
+ drbx/geometry/vmec_jax_import.py,sha256=x5Nqt5yoWzwoeTkeIuIjHNSEDgCZCJp1X5jdwYQGXnI,12825
26
+ drbx/linear/__init__.py,sha256=bfv1lXTg84ESa3GbThH07hqVamiEoCs1tbsuxdGOhxY,1016
27
+ drbx/linear/dispersion.py,sha256=ue21B2iEFmslv2Zc85h4DHHHtzXLZRFMKsvYSutu-wI,5263
28
+ drbx/linear/eigen.py,sha256=zQL8PNkBNFJDN6ZMzxJvQ9w7uVxyRx3tu2fWhbp3hsI,3004
29
+ drbx/native/__init__.py,sha256=Ak5LhplfQHHGxw5rqQkRJ8Cdw8s2zF6b94SJ9CE1020,6758
30
+ drbx/native/array_backend.py,sha256=Y5c8_pHk0hBT4Kwg286xA_j7o3fIdRyRFtyXZ4VF2n4,2138
31
+ drbx/native/deck_runner.py,sha256=5r_OPIzRO3eOm2WxbOxE5A_fMKLTQvpO-GvIx_wQf14,30585
32
+ drbx/native/electromagnetic.py,sha256=CaMkkc4hMMfGBeIjwwGmsakHTQjnrGy_OY7lHc-QPpQ,10944
33
+ drbx/native/expression.py,sha256=eRGG65ovuPGIaExHaltypniwO6ZbHQ-QZh6hx2L5U7Q,6523
34
+ drbx/native/fci.py,sha256=kwtMFQBxtGeTROKZR9zPVIRXER4uywLjYgJDnOkdSj4,11934
35
+ drbx/native/fci_2_field_rhs.py,sha256=R4I-1pNy96lCyoSoAFe5A4WBbLdEMfR5XfbYnbkbjhQ,7013
36
+ drbx/native/fci_4_field_rhs.py,sha256=YqPyFfJANFJhZLo0RWy-xDW6OHnXcCpUUYju8YukUsA,52050
37
+ drbx/native/fci_boundaries.py,sha256=PFAoT4pljgNm9umTUVDdGxu6W3fVPD-5ebo7CAAgB_w,102407
38
+ drbx/native/fci_differentiable_case.py,sha256=Z6kzR3sPWWpOxwN58F_8_5J5LJV6RZUKDS5rbWIOsmE,11134
39
+ drbx/native/fci_drb_EB_rhs.py,sha256=S5Zh_ruXSQIBE3RlpUDeV_msJ3HU9IQPAE58DdbXqxw,46778
40
+ drbx/native/fci_drb_rhs.py,sha256=uMhqFh13UrHY-MfnbAWQKtajxkyuNu_QCE4C3jKrKlA,6869
41
+ drbx/native/fci_halo.py,sha256=GlhMSV7IQ_Rq0t-xo7zwEO_C6YHQ0lJzDnn8OHS0gfs,62615
42
+ drbx/native/fci_helpers.py,sha256=07GmjguxhD6OP-EiZLb9bpmuUj8arKQ8IWUqIDkgfYQ,11740
43
+ drbx/native/fci_model.py,sha256=8vMUEyDjffwReVNwhX3zwmOFsYISWfQAssOWYacnmRI,10193
44
+ drbx/native/fci_neutral.py,sha256=B3xvcvwkqVdda9A1baEdYcWQ93vuG2hwhfHVwpOdsec,6422
45
+ drbx/native/fci_operators.py,sha256=wRIGYpNsYnilkzvpd8rpU2QXJey0KFX6Zw5EAO7QlpE,167675
46
+ drbx/native/fci_sharding.py,sha256=lBU0OuOAqAAZ4N7f_bfBXCRAbteQtGrwI99NnXKCfwY,21936
47
+ drbx/native/fci_sheath_recycling.py,sha256=KvuIrqk1A0tWlP_5YWjCzy-fkd-L0lA-M6Xwk5Endqc,8254
48
+ drbx/native/fci_time_integrator.py,sha256=FlAOrCjqYGN92ShB5bGp3hSBlTn_H1vGVU50ougFOY8,3399
49
+ drbx/native/fci_vorticity.py,sha256=KnAp8YDbpF1hfHI2UsBjXDmjI8VrtIepXPZ3xjVWRsE,6805
50
+ drbx/native/fluid_1d.py,sha256=K7ZO978m9VTYBDnilg-zFbaPyorJHTPRG16WVecnOYk,11684
51
+ drbx/native/hasegawa_wakatani.py,sha256=6dbgS6xlhRkuZNhZPf6Nt_Q9eaRI6kkoFiJv19c1m_8,7477
52
+ drbx/native/limiters.py,sha256=1bHUpopBSb9VDEDxys5vw-6r9FSxaQ5EwbPYiXBSZxU,2004
53
+ drbx/native/mesh.py,sha256=P5Nct0yZ9WyekdZqNBlaSsxecOg51snzhgZByFRbME0,8153
54
+ drbx/native/metrics.py,sha256=KTjUep5n93UYB0Z3scS28hWtFzfvv3c_VelHVhD57C0,8633
55
+ drbx/native/sol_flux_tube.py,sha256=gNOdmR-SzJ30FU0g1ekmJcKO27k7-7X0GJGNt-N3U7c,5250
56
+ drbx/native/stellarator_turbulence.py,sha256=wtdMLDFxilOF1VycxcIAnbZtUYMs0Iey6MgqacwsdX4,14312
57
+ drbx/native/transport.py,sha256=mPrjJUpEz16gp9EAAN5eN_KbhRmQu3KQEzbjgWEZl4o,5390
58
+ drbx/native/units.py,sha256=rk07gFL8nmNRinKfx75V8NznpfMp8PdUp4CQ_UFZvkQ,1133
59
+ drbx/native/vorticity.py,sha256=CHxlZ24sIttFbFV1H8YO-vlzdwUnALuINYNY2li2ZSs,10036
60
+ drbx/native/neutrals/__init__.py,sha256=m5BtTQEb5Ng9pc4qblbRS6a26hVIdGF6qTG0siuH2ws,1645
61
+ drbx/native/neutrals/atomic_rates.py,sha256=9fTJjeQc2XqXTS5yjdCNHfizROxo_9Psm4YyWQ5LCUY,5405
62
+ drbx/native/neutrals/detachment_sol_model.py,sha256=QtjR01pfK07FFRkbucKKYu9G_IEVP-RGwEnrRMN-XZc,10743
63
+ drbx/native/neutrals/reactions.py,sha256=BFlOwWvXocQXpRremXuJYhII4eznw_2zoQsLwTOZUP0,6726
64
+ drbx/native/neutrals/recycling_sol_model.py,sha256=tCQMeQrGHagoCR2pMyzELqCI8ARmSmgJNfjnaTHTYZc,9461
65
+ drbx/runtime/__init__.py,sha256=FPZWM5MkvMRw6K1TCe_fTJbLoyoeh3FIT46hi7McnTM,1652
66
+ drbx/runtime/artifacts.py,sha256=Bih-kovt2kj9Zg1QKFg-y1GHnuEEzrwV8q84inM1sBE,5211
67
+ drbx/runtime/memory.py,sha256=5OjNXjrreTpUMDU6w_layARJxMY3ErK5MtPLS3K0gsk,4047
68
+ drbx/runtime/output.py,sha256=jjbaw6hrqsxz0E49FBS6DHaeI1LhO-0pLqzeZ9UK_LI,15618
69
+ drbx/runtime/paths.py,sha256=kWMwlkiPGAJYgR3ejD82-DK1DJaVHeliuKh9y8LaOdM,199
70
+ drbx/runtime/performance.py,sha256=-24iA3tmypeKqWIXEIOr6H2HJv4Scg3hL2EpcIoDfM8,6125
71
+ drbx/runtime/run_config.py,sha256=TrAOjiH0iM_5SnnJd0J-uhs-SH0cSP-oB630NpQ8Frw,6961
72
+ drbx/runtime/scheduler.py,sha256=c0ZXB_ClfCD-bA94M4n8cC8MW_OXPGruQlBKZ9G9lyw,3178
73
+ drbx/runtime/state.py,sha256=ZLgiSpJPX2rbTNzX950ZxXdl44ZibmEKhPo1lFyf8mw,1301
74
+ drbx/validation/__init__.py,sha256=o8tXQyxmS__VmcjWKgyUYy_UeabIR8XIvkjxZxNaLLY,17257
75
+ drbx/validation/autodiff_diffusion.py,sha256=nG1n47gqpVEwZHIpcrP0CrpdnKcyUXeT8kI-RiALcD4,9843
76
+ drbx/validation/autodiff_diffusion_uncertainty.py,sha256=2pEwtNW0fYnZcHSSkzzQVRbjVl-4D_geUcNbo_UVIyI,9509
77
+ drbx/validation/diverted_tokamak_movie.py,sha256=49nespLA3gfrIRuD2v_08pOEDb1dEXkQp2MlsvzZwzY,18698
78
+ drbx/validation/essos_fieldline_import_campaign.py,sha256=EJlQT1g5BQ50ubII3qIer8-WMJDJK7zWDAwGo-lY6OY,6568
79
+ drbx/validation/essos_imported_artifact_audit.py,sha256=vD34qC4WCd-qP71MTYV8UIsewI0YKhfuH60Cn1pt-Hg,19697
80
+ drbx/validation/essos_imported_drb_movie_campaign.py,sha256=toXNllrajcquS7lGcay_3Cn6kL7_kl5Hcvx9i8CHNkA,115629
81
+ drbx/validation/essos_imported_fci_campaign.py,sha256=mMwkOxWmn4uNc3EB-AWPAi5i78JfucNedK5RPqcQhQ0,226263
82
+ drbx/validation/essos_imported_pytree_campaign.py,sha256=kuXORF4FF20-2GMbvf261ii6iy7IrdF8kNKrQXg9Ct4,16761
83
+ drbx/validation/essos_vmec_closed_field_campaign.py,sha256=I3CMlX0Y285J3ufuzr4QFHnMUndBeTBpzdV3mqbIfSw,13863
84
+ drbx/validation/essos_vmec_closed_field_transient_campaign.py,sha256=2ZrHz8HHbSqBDBYh-YoIt6hPr6YlBOBHQBQi9ovtybo,26601
85
+ drbx/validation/essos_vmec_fieldline_surface_campaign.py,sha256=EonRCs13mKPIhgtNLMBRnWCsopeDMXnsa3oGwlZJAKo,26876
86
+ drbx/validation/fluid_1d_mms_convergence.py,sha256=o1zuZbfYil8O_lJws7v6LuXhqGf3woAPH8gJx0EbxUs,10712
87
+ drbx/validation/geometry_lineouts.py,sha256=5Sb-zCRd1Lgb03_m8KKQLCqhK5nIC9Aufj8qpUCPgfA,5217
88
+ drbx/validation/geometry_slices.py,sha256=qeJTjbIzW-WEZg3r0iu4MIHySvtBu0uNHZeZNYsYDV0,6526
89
+ drbx/validation/publication_plotting.py,sha256=xPtfpGrPrh5QMDh6GdyxKLQX6Gcb5Kd8Ft9gBhbCPcY,2517
90
+ drbx/validation/stellarator_drb_pytree_campaign.py,sha256=GIOohVtHUh9ZLCRj0b2LAu8u3pC7NMz0i-rHB_4jxMA,25963
91
+ drbx/validation/stellarator_fci_geometry_campaign.py,sha256=V5eJxp0jQfy1mece7nKlXZosOYPGfSe8TWezEBu2uno,8321
92
+ drbx/validation/stellarator_fci_operator_campaign.py,sha256=J_oFiMxwm4oJ7WOqlPplPGl_BWnmZZtfUCOfNeOdIZQ,13253
93
+ drbx/validation/stellarator_fci_suite_campaign.py,sha256=99RW0G4fluEWpWyNQjoXi41bpb6eNvGfnqnyb5jHakQ,9967
94
+ drbx/validation/stellarator_metric_mms_campaign.py,sha256=zJ8cT9zzaSPhjs9QCISc-gOdzCSMOF4Qmeo5ZXTPxq4,11698
95
+ drbx/validation/stellarator_neutral_physics_campaign.py,sha256=JKmiapvsrsLuW0OsJPJWJ3oKVXiNjOMufHDaGKRGFTs,10868
96
+ drbx/validation/stellarator_sheath_recycling_campaign.py,sha256=1yu6Teqfp7dcMW89Z17qhwMnJYzy9f0jRB1pVG6OOM0,13898
97
+ drbx/validation/stellarator_sol_showcase.py,sha256=Na6MU7MKDenn2Oo4aLfe7UYxa3xsOeL8FDyp058ZIhw,25611
98
+ drbx/validation/stellarator_vorticity_campaign.py,sha256=c6WXJJG73wpBATdQnfv3Zg7gGmvU-4RXrSJP_3FSTbI,12792
99
+ drbx/validation/vmec_extender_edge_field_campaign.py,sha256=y1wPBDuD6VXknFkwJUbrruGLLANbVt7UCc2bEvJZAII,10240
100
+ drbx/validation/vmec_extender_sol_smoke_campaign.py,sha256=fUsU3PIav3MAtDLjVbpXrbEqXucCZtDvPe0mXi5tt9o,14644
101
+ drbx-2.0.0.dev0.dist-info/licenses/LICENSE,sha256=prQlXlwFtThdCuEwKetGzhuBMlGzqfjHH9SluGKQ7vo,1070
102
+ drbx-2.0.0.dev0.dist-info/METADATA,sha256=28Xys1K-QR-7HXgftRH8M22grLcQZ45h6-Xek9mDNWM,22896
103
+ drbx-2.0.0.dev0.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
104
+ drbx-2.0.0.dev0.dist-info/entry_points.txt,sha256=uhQAFugyxaqll7itbIQ74nHGwAq0ltMX5ZD2NM5i97s,39
105
+ drbx-2.0.0.dev0.dist-info/top_level.txt,sha256=1zyUewDUDsUDeV7B78r8WornklzAfb9To1GvHit_gY0,5
106
+ drbx-2.0.0.dev0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (83.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ drbx = drbx.cli:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Rogerio Jorge
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
+ drbx