1 unstable release

Uses new Rust 2024

new 0.1.0 May 4, 2025

#83 in Science

47 downloads per month

MIT license

27MB
6K SLoC

rfluids

GitHub docs.rs crates.io CI codecov

🦀 Rusty CoolProp wrapper.

Supported platforms

  • Windows x86-64
  • Windows AArch64
  • Linux x86-64
  • macOS x86-64
  • macOS AArch64

MSRV

rfluids requires rustc 1.85.0 or later.

How to install

Run the following command in your project directory:

cargo add rfluids

🎁 It comes with native CoolProp dynamic libraries for supported platforms. The library required for your platform will be automatically copied to the target directory during build.

Examples

ℹ️ All calculations are performed in SI units

Specific heat [J/kg/K] of saturated water vapor at 1 atm:

use approx::assert_relative_eq;
use rfluids::prelude::*;

let mut water_vapor = Fluid::from(Pure::Water).in_state(
    FluidInput::pressure(101_325.0),
    FluidInput::quality(1.0),
)?;
assert_relative_eq!(
    water_vapor.specific_heat()?,
    2_079.937_085_633_241,
    max_relative = 1e-6
);

Dynamic viscosity [Pa·s] of propylene glycol aqueous solution with 60 % mass fraction at 100 kPa and -20 °C:

use approx::assert_relative_eq;
use rfluids::prelude::*;

let mut propylene_glycol = Fluid::from(
    BinaryMixKind::MPG.with_fraction(0.6)?,
).in_state(
    FluidInput::pressure(100e3),
    FluidInput::temperature(253.15),
)?;
assert_relative_eq!(
    propylene_glycol.dynamic_viscosity()?,
    0.139_073_910_539_388_78,
    max_relative = 1e-6
);

Density [kg/m³] of ethanol aqueous solution (with ethanol 40 % mass fraction) at 200 kPa and 4 °C:

use approx::assert_relative_eq;
use rfluids::prelude::*;
use std::collections::HashMap;

let mut mix = Fluid::try_from(
    CustomMix::mass_based(HashMap::from([
        (Pure::Water, 0.6),
        (Pure::Ethanol, 0.4),
    ]))?
)?.in_state(
    FluidInput::pressure(200e3),
    FluidInput::temperature(277.15),
)?;
assert_relative_eq!(
    mix.density()?,
    883.392_277_162_775_9,
    max_relative = 1e-6
);

Wet-bulb temperature [K] of humid air at 300 m above sea level, 30 °C and 50 % relative humidity:

use approx::assert_relative_eq;
use rfluids::prelude::*;

let mut humid_air = HumidAir::new().in_state(
    HumidAirInput::altitude(300.0)?,
    HumidAirInput::temperature(303.15),
    HumidAirInput::rel_humidity(0.5),
)?;
assert_relative_eq!(
    humid_air.wet_bulb_temperature()?,
    295.067_569_033_474_57,
    max_relative = 1e-6
);

Fluid and HumidAir implement the PartialEq trait. Equality is checked by the thermodynamic state:

use rfluids::prelude::*;

let mut humid_air = HumidAir::new().in_state(
    HumidAirInput::altitude(0.0)?,
    HumidAirInput::temperature(293.15),
    HumidAirInput::rel_humidity(0.5),
)?;
let mut another_humid_air = HumidAir::new().in_state(
    HumidAirInput::pressure(101_325.0),
    HumidAirInput::temperature(293.15),
    HumidAirInput::rel_humidity(0.5),
)?;
assert_eq!(humid_air, another_humid_air);

another_humid_air.update(
    HumidAirInput::pressure(101_325.0),
    HumidAirInput::temperature(303.15),
    HumidAirInput::rel_humidity(0.5),
)?;
assert_ne!(humid_air, another_humid_air);

License

This project is licensed under MIT License.

Dependencies

~0.4–7MB
~54K SLoC