Entropyk/docs/tutorial/03-components.md

9.2 KiB
Raw Permalink Blame History

Components Reference

This document describes all available thermodynamic components in Entropyk, their equations, and usage examples.

Component Categories

Category Purpose Components
Active Add work to fluid Compressor, Pump, Fan
Passive Pressure drop, no work Pipe, ExpansionValve
Heat Transfer Exchange heat between fluids Evaporator, Condenser, Economizer, HeatExchanger
Boundary Fixed conditions FlowSource, FlowSink
Junction Flow splitting/merging FlowSplitter, FlowMerger

Active Components

Compressor

A positive displacement compressor using the AHRI 540 performance model.

Equations (2):

  • Mass flow: ṁ = M1 × (1 - (P_suc/P_dis)^(1/M2)) × ρ_suc × V_disp × N/60
  • Power: Ẇ = M3 + M4 × (P_dis/P_suc) + M5 × T_suc + M6 × T_dis

Ports: 2 (inlet, outlet)

use entropyk_components::compressor::{Compressor, Ahri540Coefficients};
use entropyk_components::port::{FluidId, Port};
use entropyk_core::{Pressure, Enthalpy};

// Create with AHRI 540 coefficients
let coeffs = Ahri540Coefficients::new(
    0.85, 2.5,      // M1, M2 (flow)
    500.0, 1500.0, -2.5, 1.8,  // M3-M6 (cooling power)
    600.0, 1600.0, -3.0, 2.0   // M7-M10 (heating power)
);

// Create disconnected ports
let inlet = Port::new(
    FluidId::new("R134a"),
    Pressure::from_bar(3.5),
    Enthalpy::from_kj_per_kg(405.0),
);
let outlet = Port::new(
    FluidId::new("R134a"),
    Pressure::from_bar(12.0),
    Enthalpy::from_kj_per_kg(440.0),
);

// Build compressor
let compressor = Compressor::new(
    coeffs,
    2900.0,    // speed_rpm
    0.0001,    // displacement m³/rev
    inlet,
    outlet,
)?;

Calibration: f_m (mass flow), f_power (power), f_etav (volumetric efficiency)


Pump

A centrifugal pump for incompressible fluids (water, brine, glycol).

Equations (2):

  • Pressure rise: ΔP = f_head × ρ × g × H_curve(Q)
  • Power: Ẇ = ρ × g × Q × H / η

Ports: 2 (inlet, outlet)

use entropyk_components::pump::Pump;
use entropyk_components::port::{FluidId, Port};
use entropyk_core::{Pressure, Enthalpy};

let inlet = Port::new(
    FluidId::new("Water"),
    Pressure::from_bar(1.0),
    Enthalpy::from_kj_per_kg(63.0),  // ~15°C
);
let outlet = Port::new(
    FluidId::new("Water"),
    Pressure::from_bar(3.0),
    Enthalpy::from_kj_per_kg(63.0),
);

let pump = Pump::new(
    "Chilled Water Pump",
    inlet,
    outlet,
    0.5,    // design flow rate kg/s
    200.0,  // design head kPa
)?;

Fan

An air-moving device for condenser cooling or ventilation.

Equations (2):

  • Pressure rise: ΔP = fan_curve(Q, N)
  • Power: Ẇ = Q × ΔP / η

Ports: 2 (inlet, outlet)

use entropyk_components::fan::Fan;

let fan = Fan::new(
    "Condenser Fan",
    inlet_port,
    outlet_port,
    2.0,    // design flow m³/s
    150.0,  // design static pressure Pa
)?;

Passive Components

Pipe

A fluid transport pipe with Darcy-Weisbach pressure drop.

Equations (1):

  • Pressure drop: ΔP = f × (L/D) × (ρ × v² / 2)

Ports: 2 (inlet, outlet)

use entropyk_components::pipe::{Pipe, PipeGeometry, roughness};

let geometry = PipeGeometry::new(
    10.0,              // length m
    0.025,             // inner diameter m
    roughness::SMOOTH, // roughness m
)?;

let pipe = Pipe::for_incompressible(
    geometry,
    inlet_port,
    outlet_port,
    998.0,    // density kg/m³
    0.001,    // viscosity Pa·s
)?;

Expansion Valve

A thermostatic or electronic expansion valve for refrigerant systems.

Equations (1):

  • Mass flow: ṁ = C_v × opening × √(ρ × ΔP)

Ports: 2 (inlet, outlet)

use entropyk_components::expansion_valve::ExpansionValve;

let valve = ExpansionValve::new(
    FluidId::new("R134a"),
    0.8,    // opening (0-1)
    inlet_port,
    outlet_port,
)?;

Heat Transfer Components

Heat Exchanger Architecture

All heat exchangers have 4 ports:

   Hot Side:
   Inlet ─────►┌──────────┐──────► Outlet
               │   HX     │
   Cold Side:  │          │
   Inlet ─────►└──────────┘──────► Outlet
Component Hot Side Cold Side Model
Condenser Refrigerant (condensing) Water/Air LMTD
Evaporator Water/Air Refrigerant (evaporating) ε-NTU
Economizer Hot refrigerant Cold refrigerant ε-NTU

Condenser

A heat exchanger where refrigerant condenses from vapor to liquid.

Equations (3):

  • Hot side energy: Q_hot = ṁ_hot × (h_in - h_out)
  • Cold side energy: Q_cold = ṁ_cold × Cp × (T_out - T_in)
  • Heat transfer: Q = UA × LMTD

Ports: 4 (hot_in, hot_out, cold_in, cold_out)

use entropyk_components::heat_exchanger::Condenser;

let condenser = Condenser::new(10_000.0);  // UA = 10 kW/K

// Set saturation temperature for condensation
condenser.set_saturation_temp(323.15);  // 50°C

// Calibration for matching real data
condenser.set_calib(Calib { f_ua: 1.1, ..Default::default() });

Thermodynamic Notes:

  • Refrigerant enters as superheated vapor
  • Refrigerant exits as subcooled liquid
  • Typical subcooling: 3-10 K

Evaporator

A heat exchanger where refrigerant evaporates from liquid to vapor.

Equations (3):

  • Hot side energy: Q_hot = ṁ_hot × Cp × (T_in - T_out)
  • Cold side energy: Q_cold = ṁ_cold × (h_out - h_in)
  • Heat transfer: Q = ε × ṁ_cold × Cp_cold × (T_hot_in - T_cold_in)

Ports: 4 (hot_in, hot_out, cold_in, cold_out)

use entropyk_components::heat_exchanger::Evaporator;

let evaporator = Evaporator::new(8_000.0);  // UA = 8 kW/K

// Set saturation temperature and superheat target
evaporator.set_saturation_temp(278.15);  // 5°C
evaporator.set_superheat_target(5.0);    // 5 K superheat

Thermodynamic Notes:

  • Refrigerant enters as two-phase mixture (after expansion valve)
  • Refrigerant exits as superheated vapor
  • Typical superheat: 5-10 K

Economizer

A heat exchanger for subcooling liquid refrigerant using expanded vapor.

Equations (3): Same as generic heat exchanger

Ports: 4 (hot_in, hot_out, cold_in, cold_out)

use entropyk_components::heat_exchanger::Economizer;

let economizer = Economizer::new(2_000.0);  // UA = 2 kW/K

Boundary Components

FlowSource

Imposes fixed pressure and enthalpy at circuit inlet.

Equations (2):

  • r_P = P_edge - P_set = 0
  • r_h = h_edge - h_set = 0

Ports: 1 (outlet only)

use entropyk_components::flow_boundary::FlowSource;

// City water supply: 3 bar, 15°C
let source = FlowSource::incompressible(
    "Water",
    3.0e5,      // pressure Pa
    63_000.0,   // enthalpy J/kg (~15°C)
    connected_port,
)?;

// Refrigerant reservoir: 12 bar, 40°C subcooled
let source = FlowSource::compressible(
    "R134a",
    12.0e5,     // pressure Pa
    250_000.0,  // enthalpy J/kg (subcooled liquid)
    connected_port,
)?;

FlowSink

Imposes back-pressure at circuit outlet.

Equations (1-2):

  • r_P = P_edge - P_back = 0
  • Optional: r_h = h_edge - h_back = 0

Ports: 1 (inlet only)

use entropyk_components::flow_boundary::FlowSink;

// Return header with back-pressure
let sink = FlowSink::incompressible(
    "Water",
    1.5e5,      // back-pressure Pa
    None,       // no fixed enthalpy
    connected_port,
)?;

// With fixed return temperature
let sink = FlowSink::incompressible(
    "Water",
    1.5e5,
    Some(84_000.0),  // fixed enthalpy (~20°C)
    connected_port,
)?;

Junction Components

FlowSplitter

Divides one inlet flow into multiple outlets.

Equations (N_outlets):

  • Mass conservation: ṁ_in = Σ ṁ_out
  • Pressure equality at all outlets

Ports: 1 inlet + N outlets

use entropyk_components::flow_junction::FlowSplitter;

let splitter = FlowSplitter::new(
    "Chilled Water Splitter",
    inlet_port,
    vec![outlet1, outlet2, outlet3],
)?;

FlowMerger

Combines multiple inlet flows into one outlet.

Equations (N_inlets):

  • Mass conservation: Σ ṁ_in = ṁ_out
  • Enthalpy mixing: h_out = Σ(ṁ_in × h_in) / ṁ_out

Ports: N inlets + 1 outlet

use entropyk_components::flow_junction::FlowMerger;

let merger = FlowMerger::new(
    "Return Water Merger",
    vec![inlet1, inlet2, inlet3],
    outlet_port,
)?;

Component Summary Table

Component Equations Ports Calibration
Compressor 2 2 f_m, f_power, f_etav
Pump 2 2 f_m, f_power
Fan 2 2 f_m, f_power
Pipe 1 2 f_dp
ExpansionValve 1 2 f_m
Condenser 3 4 f_ua, f_dp
Evaporator 3 4 f_ua, f_dp
Economizer 3 4 f_ua, f_dp
FlowSource 2 1 -
FlowSink 1-2 1 -
FlowSplitter N 1+N -
FlowMerger N N+1 -

Next Steps