Version history¶
ember roughly follows semantic versioning starting at 0.1.0. However, until 1.0.0, minor releases may make breaking changes to the public API without a deprecation period.
0.4.0 (2026-09-01)¶
Multigrid now applies a uniform coarse correction to the fine nodes, instead of linearly interpolating through the coarse cell centers. This is more stable on clustered grids.
The equation-of-state-agnostic fluid base class is now public as
Fluid, renamed from_Fluid, and carries the sharedfrom_dict/to_dictandchange_*contract.Trimmed the
realgas_fitpublic surface tofit,sample_coolprop,FitResultandFitInfo;legfit2dis now private, and the pure Legendre/coordinate helpers move to theember._realgas_polyleaf module.
0.3.0 (2026-08-31)¶
Selective frequency damping is available again.
Add
OutletPatch.P_throttle, the static pressure level a throttled outlet has been adjusted to. It is equal to the initially prescribed pressure plus the mass flow PID correction. Also for consistency renamed the throttle pressure correction fromP_throttletodP_throttleinConvergenceHistory.Delete
Block.xlen_sq_ndandBlock.conserved_cell_nd, calculate them inline in the Fortran kernels instead.Add
RealFluidreal-gas equation of state and fitting module, following Wheeler (2024) polynomial entropy fit.Make
Block.cp_nda nodal array rather than a scalar, pass fields of viscous and thermal transport properties to the source term kernels.Add
to_dictandfrom_dictto fluid classes.Add
Fluid.get_kappathermal conductivity to the fluid API.Add
change_visc()to fluid clasess, returning a new instance with viscosity scaled up or down. Perfect gases simply alter their scalar viscosity; real gases carry ascale_viscfactor that multiplies the true fitted viscosity.Exchange viscous/thermal halos via six face arrays instead of a full volume array.
Run the change limiter (
Solver.dampin) before implicit residual smoothing (Solver.sf_resid) rather than after, fused into the kernel already traversing the volume. IRS is linear and the limiter is nonlinear in a global block mean, so the two orderings do not commute: at the defaultsf_resid=1.0, dampin=25the residual differs by ~19% of the field scale, growing withsf_resid. The converged answer is unchanged, only the path to it, and the fusion is worth -6% serial and -11% at 100-rank saturation.Block.scratchis now the sole scratch array, and all transient workspace for the Fortan kernels is carved out of it.Various performance improvements to reduce memory footprint.
0.2.0 (2026-08-18)¶
Renamed
ember.set_itertoember.set_iterative.Removed
BlockRestartand its helpers.Removed
ember.geometry; its functions are now private helpers of their callers.Made
ember.structand the Plot3D I/O module private.Removed
Grid.apply_rotation. It assumed a mesh topology — thatj=-1is the casing — of any grid handed to it, which is not ember’s to assume, and itstip_gapandshroudrow types were in any case indistinguishable: every wall already takes its block’sOmega, sotip_gapoverrode five faces with the value they already had and left the casing turning with the blade. SetBlock.Omegafor the frame, and add aRotatingPatchonly for a wall that is not at that speed.Pruned dead code from
ember.utiland made its single-caller helpers private.Replaced the reflecting mixing plane with the non-reflecting one.
Solveris now a frozen immutable class, derive a variant withdataclasses.replaceinstead of assigning.Changed
Solverdefaults:cfl0.4 to 5.0,dampinNoneto 25,sf_resid0.0 to 1.0, andn_levels0 to 3.Block.flatis now a property, and flattens in Fortran order.Split
interp_fromintoGrid.interp_from_arraysandGrid.interp_from_grid, and transfer primitives rather than conserved variables to prevent datum offset errors.Generalised non-reflecting patches to any surface of revolution.
Added
OutletPatch.KpandOutletPatch.Ki, exposing the throttle gains set byset_throttle.Added
InletPatch.Po,InletPatch.To,InletPatch.Alpha,InletPatch.BetaandOutletPatch.P, reading back the currently prescribed boundary state in physical units.Added
wall_yplusfor y+ post-processing.Added
Block.memory_usage.Added
Block.freeze(), returning an immutable copy.Added
block_util.repeat_pitchwise, viewing a periodic passage as a cascade. A periodic solver computes one passage, which is rarely all anyone wants to look at: the passage-to-passage picture is what shows a wake meeting the next leading edge, or a shock crossing a pitch. Returns one copy per passage rather than a concatenated block, and drops patches, a rotated copy being a view of the flow rather than a member of a connected grid.Added
util.unwrap_meridional, giving the conformal coordinatem' = int dm/rthat a blade-to-blade view is drawn on.Fixed
mix_outreturning slightly different states for a cut and its k-reversed twin. The Newton loop now iterates to its fixed point instead of stopping at the first iterate insideatol, cutting that difference from ~3e-4 to ~2e-6.Added precompiled wheels for macOS (arm64) and Windows (AMD64), alongside the existing Linux (x86_64) wheels.
Fixed
mass_averageraising on a partial reduction. The averaging already honoured theaxesargument, but the zero-flux guard beneath it assumed a scalar, so averaging over the pitch alone and keeping the span raised about an ambiguous truth value instead of returning a profile.Fixed
matvecbroadcast dispatch order for(ni,1,1)matrices.yaml_utilnow uses libyaml’sCSafeLoader/CSafeDumperwhere available for speed.Fixed YAML being read and written in the locale’s encoding rather than UTF-8, so a file carrying a degree sign or a non-ASCII name round-tripped losslessly only by coincidence of environment.
Fixed YAML writing a
PathraisingRepresenterErroron Windows.Fixed the sign of the cusp seam correction.
Restored the smooth-then-damp order in
update_residual.Fixed the mixing-length viscosity returning
-infon flows with no resolved shear when built with gfortran 13.
0.1.0 (2026-08-06)¶
First public release on the Python Package Index.