Skip to content

peclet-flow 1.2.0

Choose a tag to compare

@eajfpeters eajfpeters released this 27 Sep 10:48
· 474 commits to main since this release

Changed (named numerics changes)

  • Volumetric forces are applied where the velocity lives. A per-cell body force
    (enable_cell_force: the CFD-DEM feedback, Boussinesq buoyancy) and the drag coefficient
    (enable_drag) are now evaluated at the velocity unknown's position by one rule for every
    equation: on the staggered grid the mean of the two cells sharing the face, on the collocated grid
    the cell value. Before, the constant-density path applied the cell value half a cell off the face
    (first order), and on the variable-density, non-porous path the drag's right-hand side and its
    implicit diagonal used different values. Surface forces (pressure, viscous stress, surface
    tension) are unchanged: they are integrals over the control volume's faces, not interpolated
    cell values.
  • Variable viscosity on the staggered grid is taken on the velocity control volume's own faces.
    Each velocity component used to see the viscosity half a cell shifted. A mirror-symmetric pair of
    runs now stays symmetric to round-off (asymmetry 1e-2…3e-2 → 1e-14); in the bubble column the
    bubbles had collected at one wall.
  • Collocated variable density and surface tension. The pressure, surface-tension and body
    forces enter the implicit momentum predictor instead of a face-acceleration kick after it, and a
    balanced-force pre-projection (set_balanced_force_projection) is on by default in that
    configuration (off, with a one-time notice, when the domain has an inflow or outflow face): a
    fluid at rest under gravity with a density jump stays at rest to ~1e-12.
  • Collocated advection uses the projected, divergence-free face velocity (the
    Almgren–Bell–Colella prescription) instead of the average of the two cell velocities, so the
    advective flux is conservative. This was the last uniform-grid difference from peclet.amr.

Changed (API)

  • diagnostics.rebalance_by_weights(w) builds a weighted partition whose cuts sit on multiples of
    2^a — so the pressure multigrid can coarsen a levels in place before any redistribution —
    and returns that alignment. A code that co-decomposes with flow must build its partition from
    the same weights and this alignment (dem's migrate_to_weights(w, align=)).
  • predict_hierarchy(..., weights=) forecasts the multigrid ladder after such a rebalance and then
    returns (rows, align); without weights it returns the rows alone, exactly as before.
  • init_mpi must precede the geometry, and now raises otherwise. A geometry built first left
    each rank with a pressure hierarchy for its own block as if it were a periodic domain: every solve
    converged, but the projected velocity kept each block's divergence (max |div u| 7.5e-2 at np 2).
  • A variable viscosity with an explicitly requested velocity multigrid raises ValueError (the
    V-cycle takes a constant viscosity and used to ignore the closure silently).
  • set_superficial_velocity(enabled, axis, velocity) holds the mixture superficial velocity along
    a periodic axis.

Added

  • Coarse-level multigrid stages from core 1.2.0: the telescope's stage policy and field movement
    are core's, and a weighted level-0 partition takes a Repartition stage instead of collapsing onto
    few ranks.
  • VoF marker blocks: a curvature admissibility clip (|κ| ≤ 1/Δ_min), removal of sub-grid debris
    with its volume returned exactly to the interface, and a capillary time-step bound that
    accounts for overlapping (gas–gas) interfaces (diagnostics.set_vof_phantom_capillary_bound,
    default on). The overlap failure of colliding bubbles traced to debris curvature.
  • A faster VoF step with identical results: face-form pressure-operator storage (32 instead of 56
    bytes per cell per read), fused periodic wraps, device-resident Krylov scalars, and batched
    kernels across all local marker blocks.

Fixed

  • ε^n survives a rebalance. A redistribution whose blocks changed size reset the previous
    porosity to zero before the migrated field arrived, so the first porous projection after the move
    saw dε/dt = ε/dt (pressure off by 2e2 in coupling's rebalance test).
  • VoF markers touching a low no-slip wall no longer gain or lose volume through it (per-marker
    volume drift 3.9e-3 → 7.7e-15 over 3000 steps).
  • The pressure solve no longer discards its correction on a uniform periodic bed. When the
    right-hand side is round-off on a constant (the null space of the periodic pressure operator), the
    bottom-level CG divided 0 by 0; the NaN made the multigrid preconditioner report a non-finite
    value, and the solver zeroed the whole correction and marked the step CAPPED. The bottom CG now
    stops when p·Ap = 0, as core's GraphAMG PCG already did. Paths with p·Ap > 0 are bitwise
    unchanged; the porous fixed-bed Ergun case goes from 63 CAPPED warnings to none. Double operator
    storage had been credited with curing this; it did not.
  • Pinned to core v1.3.0.