rfluids

Crates.iorfluids
lib.rsrfluids
version0.2.0
created_at2025-05-04 17:23:07.529192+00
updated_at2025-06-06 17:21:19.575219+00
description🦀 Rusty CoolProp wrapper
homepagehttps://github.com/portyanikhin/rfluids
repositoryhttps://github.com/portyanikhin/rfluids
max_upload_size
id1659818
size322,060
Vladimir Portyanikhin (portyanikhin)

documentation

README

rfluids

GitHub docs.rs crates.io CI codecov

🦀 Rusty CoolProp wrapper.

Supported platforms

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

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.
Commit count: 356

cargo fmt