Published March 3, 2026
| Version v0.17.0
Software
Open
DESC
Authors/Creators
- 1. Thea Energy
- 2. University of Maryland, College Park
- 3. Princeton University
- 4. University of Wisconsin-Madison
Description
New Features
- Adds particle tracing capabilities in
desc.particlesmodule.- Particle tracing is done via
desc.particles.trace_particlesfunction. - Particles can be initialized in couple different ways:
ManualParticleInitializerLab: Initializes particles at given positions in lab coordinates.ManualParticleInitializerFlux: Initializes particles at given positions in flux coordinates.CurveParticleInitializer: Initializes N particles on a given curve.SurfaceParticleInitializer: Initializes N particles on a given surface.
- Implemented particle trajectory models are:
VacuumGuidingCenterTrajectory: Integrates the particle motion by vacuum guiding center ODEs, conserving energy and mu.
- Particle trajectories can be plotted with
desc.plotting.plot_particle_trajectoriesfunction.
- Particle tracing is done via
- Adds new option for
loss_function,"sum", which changes an objective to target the sum of the values computed. - Adds utility functions
desc.external.paraview.export_surface_to_paraview,desc.external.paraview.export_volume_to_paraviewanddesc.external.paraview.export_coils_to_paraviewto export Paraview files for surfaces, volume and coils. These functions use an optional dependencypyvistawhich is not automatically installed. - The
x_scaleoption foreq.optimizeand related functions can now be given as a dictionary mapping individual parameter names to their relevant scales, or if multiple things are being optimized,x_scalecan be a list of dict, one for each optimizable thing. - Adds new option
x_scale='ess'to use exponential spectral scaling from (Jang 2025) which has been shown to improve performance and robustness as an alternative to fourier continuation methods. - Adds
x_scale='ess'option for theOmigenousFieldclass. - Adds
"scipy-l-bfgs-b"optimizer option as a wrapper to scipy's"l-bfgs-b"method. - The
x_scaleparameter can now be used with stochastic gradient descent type optimizers. - Adds wrappers for
optaxoptimizers. They can be used by prepending'optax-'to the name of the optimizer (i.e.optax-adam). Additional arguments to the optimizer such aslearning_ratecan be pass viaoptions = {'optax-options': {'learning_rate': 0.01}}. Even a customoptaxoptimizer can be used by specifying the method as'optax-custom'and passing theoptaxoptimizer via the'update-rule'key ofoptax-optionsin theoptionsdictionary. See the docstring of theoptax-customfor details. - Adds
check_intersectionflag todesc.magnetic_fields.FourierCurrentPotentialField.to_Coilset, to allow the choice of checking the resulting coilset for intersections or not. - Changes the import paths for
desc.externalto require reference to the sub-modules. - Adds a differentiable utility for finding constant offset toroidal surfaces inside of optimizations. See PR for more details.
- Add support for Python 3.14
Bug Fixes
- No longer uses the full Hessian to compute the scale when
x_scale="auto"and using a scipy optimizer that approximates the hessian (e.g. if using"scipy-bfgs", no longer attempts the Hessian computation to get the x_scale). SplineMagneticField.from_field()correctly uses theNFPinput when given. Also adds this as a similar input option toMagneticField.save_mgrid().- Fixes some bugs that hampered robustness of
desc.geometry.FourierRZToroidalSurface.constant_offset_surface, particularly when the given grid had stellarator symmetry or when NFP=1. - Fixes possible bug in computing normalizations when both kinetic and pressure profiles are assigned. Also adds warnings whenever an pressure is added to a kinetic-constrained equilibrium and vice-versa to alert user to ambiguous equilibrium setups.
- Adds error in
MercierStabilityto guard against situation where if a grid with a point atrho=0were used, NaN would be computed, asMercierStabilityis undefined on-axis.
Performance Improvements
ProximalProjection.graduses a single VJP on the objective instead of multiple JVP followed by a manual VJP. This should be more efficient for expensive objectives.
Deprecations
sgdoptimizer is deprecated in favor ofoptax-sgd, and will be removed in a future release. To achieve the same behavior withoptimizer = Optimizer('sgd')andoptions={'alpha': ..., 'beta': ...}when the optimizer is removed, one can useoptimizer = Optimizer('optax-sgd')andoptions={'optax-options': {'learning_rate': alpha, 'momentum': beta, 'nesterov': True}}.- Removes
FiniteDiffDerivativefrom the public API. This class was no longer actually usable with the current versions of DESC's optimization framework, as JAX is now required for running any equilibrium or optimization solves.
New Contributors
- @byoungj made their first contribution in https://github.com/PlasmaControl/DESC/pull/1736
Full Changelog: https://github.com/PlasmaControl/DESC/compare/v0.16.0...v0.17.0
Notes
Files
PlasmaControl/DESC-v0.17.0.zip
Files
(402.7 MB)
| Name | Size | Download all |
|---|---|---|
|
md5:24d299c02a0e31e62f96ec2630823246
|
402.7 MB | Preview Download |
Additional details
Related works
- Is supplement to
- Software: https://github.com/PlasmaControl/DESC/tree/v0.17.0 (URL)
Software
- Repository URL
- https://github.com/PlasmaControl/DESC