# Story 8.2: CoolProp Fluids Extension & Python Real Components

Status: in-progress

## Story

As a **simulation user (Alice)**,
I want **66+ refrigerants available in CoolProp backend and real thermodynamic components in Python (not placeholders)**,
so that **I can simulate complete heat pump/chiller systems with accurate physics and multiple refrigerant options**.

## Acceptance Criteria

### AC1: Extended CoolProp Fluid List
**Given** the CoolProp backend
**When** querying available fluids
**Then** 66+ fluids are available including:
- HFC refrigerants (R134a, R410A, R32, R407C, R404A, R22, R143a, R152A, R245fa, etc.)
- HFO/Low-GWP (R1234yf, R1234ze(E), R1233zd(E), R513A, R454B, R452B)
- Natural refrigerants (R717/Ammonia, R290/Propane, R744/CO2, R1270/Propylene)
- Predefined mixtures (R513A, R507A, R452B, R454C, R455A)
- Non-refrigerant fluids (Water, Air, Nitrogen, etc.)

### AC2: Python Notebooks with Real Physics
**Given** Jupyter notebooks in `bindings/python/`
**When** running the notebooks
**Then** they demonstrate:
- Fluid properties comparison across refrigerants
- Newton/Picard solver usage
- Constraint system (superheat, subcooling, capacity)
- BoundedVariables for inverse control
- Complete thermodynamic system with refrigerant AND water circuits

### AC3: Real Thermodynamic Components in Python
**Given** Python bindings
**When** using components from Python
**Then** they use real CoolProp physics (not placeholders):
- Compressor with AHRI 540 model
- Expansion valve with isenthalpic throttling
- Heat exchanger with epsilon-NTU method and water side
- Pipe with pressure drop
- FlowSource/FlowSink for boundary conditions

### AC4: Complete System with Water Circuits
**Given** a heat pump simulation
**When** building the system
**Then** it includes BOTH:
- Refrigerant circuit (compressor, condenser, valve, evaporator)
- Water circuits (source side and load side)

## Tasks / Subtasks

- [x] Task 1: Extend CoolProp fluid list (AC: #1)
  - [x] 1.1 Add HFC refrigerants (R143a, R152A, R22, R23, R41, R245fa, R245ca)
  - [x] 1.2 Add HFO/Low-GWP (R1234yf, R1234ze(E), R1234ze(Z), R1233zd(E), R1243zf, R1336mzz(E), R513A, R513B, R454B, R452B)
  - [x] 1.3 Add natural refrigerants (R717/Ammonia, R1270/Propylene)
  - [x] 1.4 Add predefined mixtures (R513A, R507A, R452B, R454C, R455A)
  - [x] 1.5 Update fluid_name() mappings in coolprop.rs

- [x] Task 2: Create Python notebooks (AC: #2)
  - [x] 2.1 Create `fluids_examples.ipynb` - 66+ fluids guide
  - [x] 2.2 Create `refrigerant_comparison.ipynb` - refrigerant comparison by application
  - [x] 2.3 Create `solver_control_examples.ipynb` - solver/control API
  - [x] 2.4 Create `complete_thermodynamic_system.ipynb` - complete system with water circuits

- [/] Task 3: Implement real thermodynamic components (AC: #3)
  - [x] 3.1 Create `python_components.rs` with PyCompressorReal (AHRI 540)
  - [x] 3.2 Implement PyExpansionValveReal (isenthalpic)
  - [x] 3.3 Implement PyHeatExchangerReal (epsilon-NTU with water side)
  - [x] 3.4 Implement PyPipeReal, PyFlowSourceReal, PyFlowSinkReal
  - [x] 3.5 Update `components.rs` to use real components
  - [/] 3.6 Fix compilation errors (in progress)
  - [ ] 3.7 Build and test Python module

- [ ] Task 4: Test complete system (AC: #4)
  - [ ] 4.1 Run notebooks with real physics
  - [ ] 4.2 Verify solver convergence
  - [ ] 4.3 Check energy balance
  - [ ] 4.4 Validate against known values

## Dev Notes

### Changes Made (2026-02-22)

#### 1. CoolProp Fluids Extension

**File:** `crates/fluids/src/coolprop.rs`

Extended `available_fluids` vector from 12 to 66+ fluids:
```rust
FluidId::new("R134a"),
FluidId::new("R410A"),
FluidId::new("R32"),
// ... 60+ more fluids
```

Updated `fluid_name()` mappings for CoolProp internal names:
- Added HFC: R143a, R152A, R22, R23, R41, R245fa, R245ca
- Added HFO: R1234yf, R1234ze(E), R1234ze(Z), R1233zd(E), R1243zf, R1336mzz(E)
- Added blends: R513A, R513B, R454B, R452B, R507A
- Added naturals: R717 (Ammonia), R1270 (Propylene)

Fixed bugs:
- Duplicate pattern `"r152a" | "r152a"` → `"r152a"`
- Missing `props_si_px` function for P-Q inputs (used instead of non-existent `props_si_pq`)
- Moved helper methods `property_mixture`, `phase_mix`, `is_mixture_supported`, `is_fluid_available` to impl block (not trait)

#### 2. Python Notebooks

**Files created:**
- `bindings/python/fluids_examples.ipynb` - Guide to 66+ available fluids
- `bindings/python/refrigerant_comparison.ipynb` - Compare refrigerants by application (HVAC, commercial, industrial)
- `bindings/python/solver_control_examples.ipynb` - Newton/Picard solvers, constraints, inverse control
- `bindings/python/complete_thermodynamic_system.ipynb` - Full system with refrigerant + water circuits

#### 3. Real Thermodynamic Components

**File:** `crates/components/src/python_components.rs` (new)

Implemented real components with CoolProp physics:

```rust
pub struct PyCompressorReal {
    // AHRI 540 coefficients
    n: [f64; 10],
    suction_port: usize,
    discharge_port: usize,
    // ...
}

pub struct PyHeatExchangerReal {
    ua: f64,  // Overall heat transfer coefficient [W/K]
    water_inlet_temp: f64,
    water_flow_rate: f64,
    water_cp: f64,  // Specific heat [J/kg/K]
    refrigerant_port: usize,
    water_port: usize,
}
```

**File:** `crates/components/src/lib.rs`
- Added `mod python_components;`
- Exported real component types

**File:** `bindings/python/src/components.rs`
- Rewrote to use `PyCompressorReal`, `PyHeatExchangerReal`, etc.
- Removed `SimpleAdapter` placeholder usage

**File:** `bindings/python/Cargo.toml`
- Added `[features]` section with `coolprop = ["entropyk-fluids/coolprop"]`

#### 4. Compilation Status

Current errors being fixed:
- `FluidBackend` trait requires `is_fluid_available()` method
- Helper methods moved to impl block (not trait methods)

### Architecture Context

**Key files modified:**
```
crates/fluids/src/coolprop.rs          - Fluid list + name mappings
crates/components/src/python_components.rs - Real component implementations
crates/components/src/lib.rs           - Module exports
bindings/python/src/components.rs      - Python wrapper using real components
bindings/python/Cargo.toml             - Feature flags
bindings/python/*.ipynb                - Jupyter notebooks
```

**State vector layout (for reference):**
```
[P_edge0, h_edge0, P_edge1, h_edge1, ..., internal_state..., control_vars...]
```

### Critical Constraints

1. **CoolProp Feature Flag**: Must build with `--features coolprop` for real physics
2. **Type-State Pattern**: Original Rust components use type-state; Python wrappers use separate types
3. **FluidBackend Trait**: All trait methods must be implemented
4. **No Panics**: All errors must be returned as `FluidResult<T>`

### References

- [Story 2.2: CoolProp Integration](file:///Users/sepehr/dev/Entropyk/_bmad-output/implementation-artifacts/2-2-coolprop-integration-sys-crate.md)
- [Story 6.2: Python Bindings](file:///Users/sepehr/dev/Entropyk/_bmad-output/implementation-artifacts/6-2-python-bindings-pyo3.md)
- [Architecture: Fluid Backend](file:///Users/sepehr/dev/Entropyk/_bmad-output/planning-artifacts/architecture.md#Fluid-Backend)

## Dev Agent Record

### Agent Model Used

claude-3-5-sonnet (via opencode)

### Completion Notes List

- CoolProp fluid extension complete (66+ fluids)
- Python notebooks created (4 files)
- Real component implementations created
- Compilation errors being fixed

### Change Log

- 2026-02-22: Initial implementation - extended fluids, created notebooks, implemented real components
- 2026-02-22: Fixed compilation errors - duplicate patterns, missing functions, trait method issues
- 2026-02-22: Moved helper methods to impl block (not trait)

### File List

- `crates/fluids/src/coolprop.rs` - Extended fluid list, fixed mappings
- `crates/components/src/python_components.rs` - Real component implementations (new)
- `crates/components/src/lib.rs` - Module exports
- `bindings/python/src/components.rs` - Rewritten for real components
- `bindings/python/Cargo.toml` - Added coolprop feature
- `bindings/python/fluids_examples.ipynb` - Fluid guide (new)
- `bindings/python/refrigerant_comparison.ipynb` - Refrigerant comparison (new)
- `bindings/python/solver_control_examples.ipynb` - Solver/control examples (new)
- `bindings/python/complete_thermodynamic_system.ipynb` - Complete system (new)
