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.inverted now defaults to False, keeping the box interior, which is what its documentation has always said and what vis.PlaneClip does. It previously defaulted to True and removed the interior. A script that relied on the old default without setting inverted explicitly will now produce the complementary region.

Features

  • New vis.Probe samples 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 reports probe_found of 0 with NaN field 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. Because Probe is a filter, one object can both draw the points in a Scene and download their values through a DataExtractor.

    Note: This feature is experimental and may change in a future release.

  • vis.range_query() accepts metrics, a list of mesh quality quantities such as VisQuantity.CELL_VOLUME, and reports their ranges alongside the solution fields. Metrics are cell-centered, so combining them with FieldAssociation.POINTS raises a ValueError before a request is sent. Computing them requires loading the mesh topology, which makes the query slower than the default.

  • vis.extrema_query() accepts cell_quantities to report mesh metrics for each result cell, and include_neighbors to report that cell’s face neighbors in ExtremaResult.neighbors with 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 is NaN and its id is -1; filter on the id rather than the value, so that a max() 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 MultiPhysicsCouplingOptions are 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). Coupled mode combined with mp_coupling_n_intensive_loops > 0 is 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, while download_surface_output() and download_output_from_definition() require a terminal state, so call Simulation.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.