Heat Exchanger Network Synthesis

Purpose

Use heat exchanger network synthesis when a solved OpenPinch case should be converted into ranked network candidates and grid-diagram views.

Prerequisites

Install the synthesis extra and IDAES solver extensions before running solver-backed HEN synthesis:

python -m pip install "openpinch[synthesis]"
idaes get-extensions

Source OpenHENS CSV files are migration source material only. Convert them once into OpenPinch JSON or native TargetInput models before synthesis.

Sample Case

Use Four-stream-Yee-and-Grossmann-1990-1.json for the compact converted OpenHENS benchmark used in the packaged HEN notebook.

Runnable Workflow

from OpenPinch import PinchProblem
from OpenPinch.lib import HENDesignMethod

problem = PinchProblem(
    "Four-stream-Yee-and-Grossmann-1990-1.json",
    project_name="Four-stream converted OpenHENS example",
)

design = problem.design.enhanced_synthesis_method(quality_tier=2)
network = design.network
period_id = network.period_ids[0]
diagram = network.build_grid_diagram(period_id=period_id)

Explicit design-method accessors are also available:

problem.design.open_hens_method()
problem.design.heat_exchanger_network_synthesis()
problem.design.heat_exchanger_network_synthesis(
    method=HENDesignMethod.OpenHENS,
)
problem.design.pinch_design_method()
problem.design.thermal_derivative_method(initial_networks=(seed_network,))
problem.design.network_evolution_method(initial_networks=(existing_network,))

Expected Output

Successful synthesis stores a design result on TargetOutput.design and problem.results.design. Inspect:

  • design.design_method for the requested public design service

  • design.manifest.method_sequence for executed task-level methods

  • design.network for the selected network

  • design.ranked_networks for ranked unique candidates

  • design.network.exchangers[0].state(period_id) for one match’s operating duty, activity, approaches, split fractions, and temperatures

  • design.network.total_duty(period_id=period_id) for period duty totals

  • design.network.build_grid_diagram(period_id=period_id) for visual topology inspection

Interpretation

The public design accessor is problem-rooted. Persistent synthesis controls belong in loaded TargetInput.options keys such as HENS_APPROACH_TEMPERATURES, HENS_METHOD_SEQUENCE, HENS_SYNTHESIS_QUALITY_TIER, solver names, tolerance, output formats, and run id. Do not pass persistent design-space or solver controls as a separate runtime object to the design call.

Use enhanced_synthesis_method(quality_tier=...) for the recommended quality-tier workflow, open_hens_method() for the original tier 1 OpenHENS sequence, and network_evolution_method(initial_networks=...) for retrofit evolution from an existing network.

When Couenne is unavailable for Couenne-backed stages, OpenPinch warns and attempts the configured network-evolution route where possible.

Each exchanger stores shared design topology, area, and capital values once; ordered parent-owned period-state records hold operating values. A single-period network allows exchanger.state() and omitted query periods. A multiperiod network requires the explicit identity for duty, temperature, diagram, export, and controllability access.

Segmented Variable-Heat-Capacity Streams

A variable-heat-capacity process stream remains one physical parent on the hot or cold solver axis. Its ordered internal segment records define the local temperature–duty relation, heat-transfer coefficients, and exchanger area calculations. Segment count therefore does not inflate physical stream, match, exchanger, or stage-position counts.

HEN preparation carries ordered segment temperatures, cumulative duties, local heat-capacity flowrates, heat-transfer coefficients, and stable segment identities alongside the parent axes. Stage balances advance a cumulative parent heat coordinate and map that coordinate through the piecewise T(Q) profile. Pinch decomposition may clip or split the active profile, but it preserves the parent identity.

The supported solver behavior is explicit:

  • APOPT and Couenne use interval-disjunctive piecewise mappings.

  • IPOPT uses active-segment refinement and repeats the continuous solve until the selected intervals stabilize.

  • An unresolved active-segment solve is rejected with guidance to use APOPT or Couenne. OpenPinch does not silently substitute an average parent CP.

The selected hot and cold utility parents may also be segmented. Their local prices are integrated over the utility duty actually traversed, including a partial final segment. Cost objectives, solved totals, verification, and ranking therefore use the exact piecewise utility cost instead of multiplying total duty by an average parent price. APOPT and Couenne use the interval mapping; IPOPT uses the same active-segment refinement policy described above. The current one-hot-utility and one-cold-utility HEN selection behavior is unchanged; optimization across multiple utility parents is a future extension.

Segmented utility HTCs and temperatures are also retained in the post-solve duty-aligned area slices. Flat utilities continue to behave as one virtual segment and retain their previous objective and reporting results.

Each selected parent-level exchanger can expose ordered segment_area_contributions. A contribution records its period, hot and cold segment identities, slice duty, local endpoint temperatures, local heat- transfer coefficients, LMTD, and area. The exchanger duty is the sum of its local slices for the applicable period. Its multiperiod design area is the maximum period-total slice area, not a sum of per-segment maxima drawn from different periods.

for exchanger in design.network.exchangers:
    if exchanger.has_segment_area_contributions:
        print(exchanger.exchanger_id)
        print(exchanger.segment_area_by_period)
        print(exchanger.segment_design_area)

Grid diagrams and controllability remain parent-based. Segment details are diagnostic metadata and do not become additional topology nodes.

Area Objective and Reported Area

The nonlinear topology and total-cost objective retains the smooth Chen area surrogate. After a solution is found, OpenPinch calculates the reported exchanger area from ordered, duty-aligned segment slices using their local terminal temperatures and heat-transfer coefficients. Those segment-summed areas are also used for result verification and downstream ranking and derivative calculations.

This separation is intentional: the Chen expression remains the accepted optimization baseline, while exact local LMTD areas remain authoritative for reported segmented exchangers. A possible future exact logarithmic-LMTD formulation is limited to the continuous NLP path and is not part of the current public behavior.

Migration and Support Notes

Old import paths and OpenHENS field aliases have been removed from the runtime API. OpenPinch does not provide runtime import aliases, OpenHENS field aliases, or command parity with the original OpenHENS scripts. Use the conversion scripts and converted JSON case inputs instead. The old import paths should be treated as migration-only references, not as compatibility aliases.

For development checks, use:

pytest -m "not synthesis and not solver"
pytest -m synthesis
pytest -m solver

Next Steps