Entropyk/docs/migration/boundary-conditions.md

7.9 KiB

Migration Guide: Boundary Conditions

Overview

The FlowSource and FlowSink types have been replaced with typed alternatives that provide better type safety and more explicit fluid handling:

Old Type New Type Use Case
FlowSource RefrigerantSource Refrigerants (R410A, R134a, CO₂, etc.)
FlowSource BrineSource Liquid heat transfer fluids (water, glycol, brine)
FlowSource AirSource Humid air (HVAC applications)
FlowSink RefrigerantSink Refrigerants
FlowSink BrineSink Liquid heat transfer fluids
FlowSink AirSink Humid air

Deprecation Timeline

Version Status
0.2.0 Deprecation warnings added
0.3.0 Old types hidden behind feature flag
1.0.0 Complete removal of old types

Migration Examples

Water Source

Before (deprecated):

use entropyk_components::FlowSource;

let source = FlowSource::incompressible("Water", 3.0e5, 63_000.0, port)?;

After:

use entropyk_components::BrineSource;
use entropyk_core::{Pressure, Temperature, Concentration};
use entropyk_fluids::CoolPropBackend;
use std::sync::Arc;

let backend = Arc::new(CoolPropBackend::new());

let source = BrineSource::new(
    "Water",                                    // Fluid name
    Pressure::from_pascals(3.0e5),             // Pressure
    Temperature::from_celsius(15.0),           // Temperature
    Concentration::zero(),                      // No glycol
    backend.clone(),
    port
)?;

Glycol Mixture Source

Before (deprecated):

use entropyk_components::FlowSource;

// MEG at 30% concentration, 3 bar, -5°C
let source = FlowSource::incompressible("MEG", 3.0e5, 20_000.0, port)?;

After:

use entropyk_components::BrineSource;
use entropyk_core::{Pressure, Temperature, Concentration};
use entropyk_fluids::CoolPropBackend;
use std::sync::Arc;

let backend = Arc::new(CoolPropBackend::new());

let source = BrineSource::new(
    "MEG",                                      // Fluid name
    Pressure::from_pascals(3.0e5),             // Pressure
    Temperature::from_celsius(-5.0),           // Temperature
    Concentration::from_percent(30.0),         // 30% glycol concentration
    backend.clone(),
    port
)?;

Refrigerant Source

Before (deprecated):

use entropyk_components::FlowSource;

// R410A at 10 bar, enthalpy 280 kJ/kg
let source = FlowSource::compressible("R410A", 10.0e5, 280_000.0, port)?;

After:

use entropyk_components::RefrigerantSource;
use entropyk_core::{Pressure, VaporQuality};
use entropyk_fluids::CoolPropBackend;
use std::sync::Arc;

let backend = Arc::new(CoolPropBackend::new());

// Option 1: Using pressure and vapor quality
let source = RefrigerantSource::new(
    "R410A",
    Pressure::from_pascals(10.0e5),
    VaporQuality::from_fraction(0.5),          // 50% vapor quality
    backend.clone(),
    port
)?;

// Option 2: Using saturated vapor (quality = 1)
let source = RefrigerantSource::new(
    "R410A",
    Pressure::from_pascals(10.0e5),
    VaporQuality::saturated_vapor(),
    backend.clone(),
    port
)?;

Air Source

Before (deprecated):

// Air sources were not available in the old API

After:

use entropyk_components::AirSource;
use entropyk_core::{Pressure, Temperature, RelativeHumidity};

// Option 1: From dry-bulb temperature and relative humidity
let source = AirSource::from_dry_bulb_rh(
    Temperature::from_celsius(35.0),           // Dry-bulb temperature
    RelativeHumidity::from_percent(50.0),      // 50% relative humidity
    Pressure::from_pascals(101_325.0),         // Atmospheric pressure
    port
)?;

// Option 2: From dry-bulb and wet-bulb temperatures
let source = AirSource::from_dry_and_wet_bulb(
    Temperature::from_celsius(35.0),           // Dry-bulb temperature
    Temperature::from_celsius(25.0),           // Wet-bulb temperature
    Pressure::from_pascals(101_325.0),         // Atmospheric pressure
    port
)?;

Water Sink

Before (deprecated):

use entropyk_components::FlowSink;

// Return header: 1.5 bar back-pressure
let sink = FlowSink::incompressible("Water", 1.5e5, None, port)?;

After:

use entropyk_components::BrineSink;
use entropyk_core::{Pressure, Concentration};
use entropyk_fluids::CoolPropBackend;
use std::sync::Arc;

let backend = Arc::new(CoolPropBackend::new());

let sink = BrineSink::new(
    "Water",
    Pressure::from_pascals(1.5e5),             // Back-pressure
    None,                                       // No fixed temperature (free enthalpy)
    None,                                       // No concentration needed when temp is None
    backend.clone(),
    port
)?;

Refrigerant Sink

Before (deprecated):

use entropyk_components::FlowSink;

// R410A low-side: 8.5 bar
let sink = FlowSink::compressible("R410A", 8.5e5, None, port)?;

After:

use entropyk_components::RefrigerantSink;
use entropyk_core::Pressure;
use entropyk_fluids::CoolPropBackend;
use std::sync::Arc;

let backend = Arc::new(CoolPropBackend::new());

let sink = RefrigerantSink::new(
    "R410A",
    Pressure::from_pascals(8.5e5),             // Back-pressure
    None,                                       // No fixed vapor quality (free enthalpy)
    backend.clone(),
    port
)?;

Air Sink

Before (deprecated):

// Air sinks were not available in the old API

After:

use entropyk_components::AirSink;
use entropyk_core::Pressure;

// Simple back-pressure sink (free enthalpy)
let sink = AirSink::new(
    Pressure::from_pascals(101_325.0),         // Atmospheric pressure
    port
)?;

// Or with fixed return temperature:
let mut sink = AirSink::new(Pressure::from_pascals(101_325.0), port)?;
sink.set_return_temperature(
    Temperature::from_celsius(25.0),
    RelativeHumidity::from_percent(50.0)
)?;

Benefits of New Types

1. Type Safety

The fluid type is now explicit in the type name, making code more self-documenting:

// Old: Unclear what type of fluid this is
let source = FlowSource::incompressible("Water", ...);

// New: Clear that this is a brine/water source
let source = BrineSource::new("Water", ...);

2. Concentration Support

BrineSource supports glycol concentration natively:

let source = BrineSource::new(
    "MEG",
    Pressure::from_pascals(3.0e5),
    Temperature::from_celsius(-10.0),
    Concentration::from_percent(40.0),  // 40% MEG
    backend.clone(),
    port
)?;

3. Vapor Quality Input

RefrigerantSource supports vapor quality input instead of raw enthalpy:

// Saturated vapor at condenser outlet
let source = RefrigerantSource::new(
    "R410A",
    Pressure::from_pascals(24.0e5),
    VaporQuality::saturated_vapor(),
    backend.clone(),
    port
)?;

// Two-phase mixture
let source = RefrigerantSource::new(
    "R410A",
    Pressure::from_pascals(8.5e5),
    VaporQuality::from_fraction(0.3),  // 30% vapor
    backend.clone(),
    port
)?;

4. Psychrometrics

AirSource supports psychrometric calculations:

// Outdoor air with humidity
let source = AirSource::from_dry_bulb_rh(
    Temperature::from_celsius(35.0),
    RelativeHumidity::from_percent(50.0),
    Pressure::from_pascals(101_325.0),
    port
)?;

Type Aliases Also Deprecated

The following type aliases are also deprecated:

Old Alias Replacement
IncompressibleSource BrineSource
CompressibleSource RefrigerantSource
IncompressibleSink BrineSink
CompressibleSink RefrigerantSink

Note: AirSource and AirSink are new types with no deprecated aliases.

Need Help?

If you encounter issues during migration:

  1. Check the API documentation for the new types
  2. Review the examples in the examples/ directory
  3. Open an issue on GitHub with the migration label