#solver #pde #transport #numerical #diffusion

oxiflow

Generic PDE solving engine for transport, reaction and diffusion phenomena (∂u/∂t + ∇·F = S)

2 unstable releases

0.3.0 Jun 3, 2026
0.0.1 Feb 16, 2026

#557 in Algorithms

Apache-2.0

330KB
5K SLoC

oxiflow

CI Coverage Crates.io Docs.rs License

Generic numerical engine for transport–reaction–diffusion problems.

oxiflow provides the architectural building blocks to construct rigorous, maintainable and performant PDE solvers in Rust — from simple 1D chromatography models to complex multi-physics coupled systems. It is designed from the ground up to support structured grids (v1.0), unstructured finite element meshes (v2.0), and a family of domain-specific frameworks (v3.0).


Architecture

oxiflow is structured as an engine + niche frameworks:

oxiflow              (engine — fields, fluxes, meshes, couplings, solvers)
├── oxiflow-chrom    (chromatography framework)
├── oxiflow-geo      (surface geophysics framework)
├── oxiflow-thermo   (heat transfer framework)
├── oxiflow-em       (diffusive electromagnetism framework)
└── ...              (third-party frameworks on crates.io)

Each framework is an independent crate that depends on the engine and provides domain-specific models, boundary conditions, nomenclature and declarative configuration. Third parties can publish their own oxiflow-* frameworks on crates.io using the same plugin API — the engine exposes stable, object-safe extension points for exactly this purpose.


Engine Features

  • Generic context systemContextValue supports scalars, vectors, matrices and 2D fields; no more f64-only bottlenecks
  • Type-safe dependency declaration — models declare what they need via RequiresContext; missing calculators are caught before the solver runs
  • Multi-component systems — indexed PhysicalQuantity handles N-solute problems, competitive adsorption, thermal coupling and more
  • Multi-domain couplingCouplingOperator connects distinct physical domains across moving interfaces (gravitational flows, fluid–solid interaction, ...)
  • Abstract spatial operatorsDiscreteOperator decouples solvers from discretisation schemes; FD, FV and (in v2.0) FEM plug in without rewriting integrators
  • Abstract meshMesh trait keeps PhysicalState free of grid assumptions; UniformGrid1D in v1.0, unstructured triangular meshes in v2.0
  • Rich integrator library — Forward Euler, RK4, Dormand–Prince 4/5, Backward Euler, Crank–Nicolson, BDF2/3, IMEX (Strang splitting)
  • Spatial schemes — upwind/centred FD, WENO3/5, conservative FV, Lax–Wendroff, flux limiters (MinMod, Van Leer, Superbee)
  • Plugin-safe API — all public traits are object-safe, enabling third-party niche frameworks to extend the engine without touching its internals (v2.0 — INV-4)
  • Optional parallelism — Rayon-based, opt-in via parallel feature flag

Quick Start

[dependencies]
oxiflow = "0.2"
# oxiflow-chrom = "3.0"    # chromatography framework (available from v3.0)

A minimal transport–diffusion model using the engine directly:

use oxiflow::prelude::*;

struct DiffusionModel { diffusivity: f64 }

impl PhysicalModel for DiffusionModel {
    fn compute(&self, state: &PhysicalState, ctx: &ComputeContext)
        -> Result<PhysicalState, OxiflowError>
    {
        let u     = ctx.vector(ContextVariable::Concentration)?;
        let lap_u = ctx.vector(ContextVariable::Laplacian)?;
        Ok(state.update(u + self.diffusivity * lap_u * ctx.time_step()?))
    }
}

impl RequiresContext for DiffusionModel {
    fn required_variables(&self) -> Vec<ContextVariable> {
        vec![
            ContextVariable::Concentration,
            ContextVariable::Laplacian,
            ContextVariable::TimeStep,
        ]
    }
}

fn main() -> Result<(), OxiflowError> {
    let result = Scenario::builder()
        .mesh(UniformGrid1D::new(100, 0.0, 1.0))
        .model(DiffusionModel { diffusivity: 1e-3 })
        .integrator(CrankNicolson::default())
        .time_span(0.0, 10.0)
        .dt(0.01)
        .build()?
        .solve()?;

    println!("{:?}", result.state());
    Ok(())
}

Note: The API above reflects the v0.2 target — see Development Status.


Covered Domains

The engine is domain-agnostic. Any problem of the canonical form ∂u/∂t + ∇·F(u, ∇u) = S(u, x, t) is a candidate:

Domain Example Target framework
Chromatography Multi-solute gradient elution oxiflow-chrom
Heat transfer 1D transient bar cooling oxiflow-thermo
Reaction–diffusion Gray–Scott Turing patterns engine direct
Fluid mechanics Burgers boundary layer engine direct
Geomechanics Terzaghi consolidation engine direct
Surface geophysics Lahar–lake wave generation oxiflow-geo

Design Invariants

Four constraints guarantee a non-breaking evolution from v1.0 to v3.0, and ensure that third-party frameworks remain compatible across engine versions:

Invariant Description Introduced
INV-1 Mesh is abstract — PhysicalState carries no grid assumptions v0.2
INV-2 DiscreteOperator is abstract — integrators are generic over the scheme v0.5
INV-3 CouplingOperator supports distinct domains with moving interfaces v0.4
INV-4 All public traits are object-safe — third-party crates can implement them v2.0

Development Status

Milestone Version Status Theme
J0 — Foundations v0.0.5 ✅ Published Placeholder · CI · project structure
J1 — Core Architecture v0.1 🔄 In progress ContextValue · OxiflowError · Mesh (INV-1)
J2 — Complete Context v0.2 ⏳ Planned Requiring BCs · topological ordering
J3 — Multi-Component v0.3 ⏳ Planned PhysicalQuantity · CouplingOperator (INV-3)
J4 — Solvers v0.4–0.5 ⏳ Planned Integrators · DiscreteOperator (INV-2)
J5 — Performance v0.6 ⏳ Planned Rayon · cache · benchmarks
J6 — Ecosystem v1.0 v1.0 ⏳ Planned 7 examples · FEM audit · stable API
J7 — FEM v2.0 🔭 Horizon Unstructured meshes · ALE · INV-4 plugin-safe
J8 — Frameworks v3.0 🔭 Horizon oxiflow-chrom · oxiflow-geo · CLI oxiflow run

See DEVELOPMENT.md for the full architectural specification.


Feature Flags

Flag Description Available from
(default) Engine core, serial execution v0.2
parallel Rayon parallelism for independent calculators v0.6
serde Serialisation of states and scenarios v0.6
hdf5 HDF5 import/export for tabulated external data v0.6

Contributing

Contributions are welcome at every milestone — bug fixes, new features (after discussion), documentation, benchmarks, tests, and niche framework development.

Building a framework on oxiflow? Open a GitHub Discussion before publishing so it can be listed in the official ecosystem documentation. Third-party oxiflow-* crates are explicitly encouraged — the engine plugin API (INV-4) is designed for exactly this.

Read CONTRIBUTING.md before submitting a pull request. Coverage is tracked on Codecov: target ≥ 85% overall, ≥ 90% on INV components.


License

Copyright 2026 [ton nom]

Licensed under the Apache License, Version 2.0.

You may use, distribute and modify this software freely, including for commercial purposes, provided you retain the copyright notice and the NOTICE file in any redistribution. The license includes a patent retaliation clause protecting the author — see the full text for details.

Dependencies

~3–4.5MB
~93K SLoC