v0.26.0¶
Release date: 2026-09-18
Early Access
The Luminary Cloud API and Python SDK are Early Access features that are still under development. View the Luminary Cloud Early Access Terms. The interface may change, and you may need to migrate or discard scripts and configuration files multiple times before v1.0.0 is released. In the future, migrations may also be necessary when upgrading to new major versions of the SDK (e.g. v2.0.0).
Release Notes¶
This release adds a point probe for sampling a solution at explicit coordinates, exposes mesh
quality metrics on the range and extrema queries, adds structural field quantities, exposes the
partitioned CHT coupling controls, and corrects the BoxClip default along with a browser
login loop.
Breaking Changes¶
vis.BoxClip.invertednow defaults toFalse, keeping the box interior, which is what its documentation has always said and whatvis.PlaneClipdoes. It previously defaulted toTrueand removed the interior. A script that relied on the old default without settinginvertedexplicitly will now produce the complementary region.
Features¶
New
vis.Probesamples a solution at an explicit list of points.probe_volume()interpolates at the cell containing each point;probe_surfaces()snaps each point to the nearest boundary face and reports the signed distance to it, which is what you want for physical measurement locations such as pressure taps that don’t sit exactly on the discretized surface. Every input point yields exactly one output row in input order, and a point that could not be resolved reportsprobe_foundof 0 withNaNfield values, so it can never be read as a real zero and results can be joined back against your own table of locations by row. Points are given in the project’s configured length unit. BecauseProbeis a filter, one object can both draw the points in aSceneand download their values through aDataExtractor.Note: This feature is experimental and may change in a future release.
vis.range_query()acceptsmetrics, a list of mesh quality quantities such asVisQuantity.CELL_VOLUME, and reports their ranges alongside the solution fields. Metrics are cell-centered, so combining them withFieldAssociation.POINTSraises aValueErrorbefore a request is sent. Computing them requires loading the mesh topology, which makes the query slower than the default.vis.extrema_query()acceptscell_quantitiesto report mesh metrics for each result cell, andinclude_neighborsto report that cell’s face neighbors inExtremaResult.neighborswith the same quantities. A large jump between adjacent cells is a common cause of a diverging solution, and this shows the jump at the location the query found. For a face with no cell across it the neighbor value isNaNand its id is-1; filter on the id rather than the value, so that amax()over neighbor ratios isn’t poisoned by the missing face.Note: This feature is experimental and may change in a future release.
The partitioned CHT coupling controls on
MultiPhysicsCouplingOptionsare now settable from the SDK:mp_coupling_n_intensive_loops,mp_coupling_n_gs_presweeps, and the six IQN-ILS tuning parameters (mp_coupling_iqn_ils_initial_relax,_history,_filter,_warmup_iters,_reuse_window,_disable_optimizations).Coupledmode combined withmp_coupling_n_intensive_loops > 0is now rejected, since it would otherwise run a partitioned IQN-ILS solve inside a nominally monolithic simulation. No existing valid configuration changes behavior.
Deprecations¶
None.
Bug Fixes / Improvements¶
Fix an issue with interactive browser login that prevented authentication.
An interactive login that never completes now fails with a clear timeout instead of waiting indefinitely.
API key headers are no longer sent when a cloud storage request is redirected to a third-party endpoint.
The simulation download methods now document when their data becomes available:
download_global_residuals()requires that the simulation has started, whiledownload_surface_output()anddownload_output_from_definition()require a terminal state, so callSimulation.wait()first.
Migration Guide¶
The only change that affects existing scripts is the vis.BoxClip.inverted default described
above. If you use BoxClip and never set inverted, pass inverted=True explicitly to keep the
old behavior, or leave it unset to get the documented one.