feos 0.4.1

FeOs - A framework for equations of state and classical density functional theory.
Documentation
use approx::assert_relative_eq;
use feos::pcsaft::{PcSaft, PcSaftParameters};
use feos_core::parameter::{IdentifierOption, Parameter};
use feos_core::{Contributions, PhaseEquilibrium};
use quantity::si::*;
use std::error::Error;
use std::sync::Arc;

#[test]
fn vle_pure_temperature() -> Result<(), Box<dyn Error>> {
    let params = PcSaftParameters::from_json(
        vec!["propane"],
        "tests/pcsaft/test_parameters.json",
        None,
        IdentifierOption::Name,
    )?;
    let saft = Arc::new(PcSaft::new(Arc::new(params)));
    let temperatures = [
        170.0 * KELVIN,
        200.0 * KELVIN,
        250.0 * KELVIN,
        300.0 * KELVIN,
        350.0 * KELVIN,
    ];
    for &t in temperatures.iter() {
        let state = PhaseEquilibrium::pure(&saft, t, None, Default::default())?;
        assert_relative_eq!(state.vapor().temperature, t, max_relative = 1e-10);
        assert_relative_eq!(
            state.vapor().pressure(Contributions::Total),
            state.liquid().pressure(Contributions::Total),
            max_relative = 1e-8
        );
    }
    Ok(())
}

#[test]
fn vle_pure_pressure() -> Result<(), Box<dyn Error>> {
    let params = PcSaftParameters::from_json(
        vec!["propane"],
        "tests/pcsaft/test_parameters.json",
        None,
        IdentifierOption::Name,
    )?;
    let saft = Arc::new(PcSaft::new(Arc::new(params)));
    let pressures = [0.1 * BAR, 1.0 * BAR, 10.0 * BAR, 30.0 * BAR, 44.0 * BAR];
    for &p in pressures.iter() {
        let state = PhaseEquilibrium::pure(&saft, p, None, Default::default())?;
        println!(
            "liquid-p: {} vapor-p: {} p:{}",
            state.liquid().pressure(Contributions::Total),
            state.vapor().pressure(Contributions::Total),
            p
        );
        println!(
            "liquid-T: {} vapor-T: {}",
            state.liquid().temperature,
            state.vapor().temperature
        );
        assert_relative_eq!(
            state.liquid().pressure(Contributions::Total),
            p,
            max_relative = 1e-8
        );
        assert_relative_eq!(
            state.vapor().pressure(Contributions::Total),
            state.liquid().pressure(Contributions::Total),
            max_relative = 1e-8
        );
        assert_relative_eq!(
            state.vapor().temperature,
            state.liquid().temperature,
            max_relative = 1e-10
        );
    }
    Ok(())
}