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.4 (2026-09-30)¶
Add
ember.average.mass_band, the part of a structured 2D cut carrying a given band of mass fraction, such as a midspan streamsurfaceFix
ember.cut.interpolate_to_structuredputting nodes in empty space when cutting through a solidAdd Reichardt wall function
Fix bug with halved interior viscous stresses and heat fluxes
Apply the wall-law stress on the wall face itself, not on the face above the wall cell, and stop masking the wall cell’s viscous force
Add a prescribed transition property
Block.fac_lam, to scale interior turbulent viscosity down and wall function toward laminarAdd
Solver.sf2_T, a separate weight on the temperature limb of the adaptive smoothing sensor, defaulting tosf2
0.4.3 (2026-09-16)¶
Match periodic patches on a difference in theta, instead of wrapping each face separately, relax tolerance slightly
Divergence check now raises on negative pressure
Add endwall bands to mixing plane exchange, reducing the mean relaxation approaching the hub and casing by a specified factor, and turning off the harmonic relaxation entirely
0.4.2 (2026-09-12)¶
Add Jameson-style adaptive smoothing
Allow cusp patches over partial j ranges
Add affordances for faces collapsing to zero area: wall function clipping and
NotWallPatchto exempt collapsed nodes from the wall distance calculationAdd a soft-start reconfiguration method
BaseSolver.soft()
0.4.1 (2026-09-10)¶
Promote cut.signed_distance to public API
Made performance improvements to cutting functions
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.