Heat Exchanger Network Synthesis ================================ Install the HEN synthesis extra and the IDAES solver extensions before running solver-backed methods: .. code-block:: bash python -m pip install "openpinch[synthesis]" idaes get-extensions Ranked Synthesis ---------------- .. code-block:: python from OpenPinch import PinchProblem problem = PinchProblem( "Four-stream-Yee-and-Grossmann-1990-1.json", project_name="Four Stream", ) design = problem.design.heat_exchanger_network( approach_temperatures=[10.0, 14.0, 18.0], stages=[3], best_solutions=3, ) top = design.top(3) network = design.network(rank=1) grid = design.grid(rank=1) The design view also exposes ``selected_network``, total recovery, hot and cold utility duty, and ``utility(name)``. Serialize the complete result with ``design.result.model_dump(mode="json")``. Named Advanced Methods ---------------------- .. code-block:: python enhanced = problem.design.enhanced_heat_exchanger_network(quality_tier=2) open_hens = problem.design.open_hens() pinch_design = problem.design.pinch_design() thermal = problem.design.thermal_derivative( (pinch_design.selected_network,) ) evolved = problem.design.network_evolution( (thermal.selected_network,) ) Successful synthesis stores the serializable result on ``problem.results.design`` (the ``TargetOutput.design`` field). The design view provides the selected network, ranked candidates, manifest, diagnostics, and task metadata without requiring process engineers to call contributor services. For multiple operating periods, call ``problem.design.multiperiod_heat_exchanger_network(...)`` after explicit all-period targeting. Serialized Network Input ------------------------ The supported bridge carries the exact JSON-visible runtime dump through ``TargetInput.network``: .. code-block:: python from OpenPinch.contracts.input import TargetInput network_payload = network.model_dump(mode="json") input_data = TargetInput.model_validate( { "streams": stream_payloads, "utilities": utility_payloads, "network": network_payload, } ) restored = TargetInput.model_validate_json(input_data.model_dump_json()) assert restored.model_dump(mode="json")["network"] == network_payload The nested value is a transport schema, not a synthesis seed. Private solver and source metadata are absent from the dump and rejected if manually added. Endpoint classifications use title-case ``StreamID`` values: ``Process`` and ``Utility``. ``Unassigned`` and legacy lowercase values are invalid. 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 segments define the local temperature--duty relation, heat-transfer coefficients, and exchanger area; segment count does not inflate physical stream, match, exchanger, or stage counts. HEN preparation retains ordered segment temperatures, cumulative duties, local heat-capacity flowrates, heat-transfer coefficients, and deterministic segment identities. Stage balances advance a cumulative parent heat coordinate through the piecewise ``T(Q)`` profile. Pinch decomposition can split the active profile while preserving the one physical parent identity. 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 solver guidance; OpenPinch does not silently substitute an average parent ``CP``. 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 multiperiod design area is the maximum period-total slice area, not a sum of segment maxima taken from different periods. Area Objective and Reported Area -------------------------------- The nonlinear topology and total-cost objective retains the smooth Chen area surrogate. After solving, OpenPinch calculates reported exchanger area from ordered duty-aligned slices with their local terminal temperatures and heat-transfer coefficients. These segment-summed areas are used for result verification, ranking, and derivative calculations. A future exact logarithmic-LMTD formulation would be limited to the continuous NLP path and is not the current contract. Contributor verification separates ordinary, synthesis, and external-solver profiles: .. code-block:: bash pytest -m "not synthesis and not solver" pytest -m synthesis pytest -m solver See notebooks 15 through 17 in :doc:`../examples/notebook-series`.