Domain Classes
The class layer is the in-memory model behind the OpenPinch workflow. Most of
these objects are created for you by
prepare_problem(), but they are also
useful directly when building tests, custom workflows, or post-processing
studies.
How These Objects Fit Together
StreamandStreamCollectionrepresent the thermal streams and ordered stream sets used to build problem tables.Zonegroups streams, utilities, targets, and subzones into a hierarchical model of the process, site, or wider system.ProblemTablestores the numerical temperature-interval cascade that drives pinch and utility calculations.BaseTargetModelstores one solved set of metrics for a zone and is later serialised into the public output schema.Valuewraps scalar and discrete-period quantities with units for report-friendly serialisation.
Core domain classes used throughout OpenPinch.
Streams and Collections
These are the most commonly manipulated domain objects outside the top-level service layer.
Data model representing process and utility streams.
- class OpenPinch.classes.stream.Stream(name='Stream', t_supply=None, t_target=None, p_supply=None, p_target=None, h_supply=None, h_target=None, dt_cont=0.0, dt_cont_multiplier=1.0, heat_flow=0.0, htc=1.0, price=None, is_process_stream=True, fluid_name=None, fluid_phase=None, segments=None)[source]
Bases:
objectGeneric thermal stream used for both process and utility duties.
A
Streamstores supply/target states together with derived values such as hot/cold classification, shifted temperature bounds, heat-capacity flow rate, and simple economic attributes. The same class is reused for process streams, utilities, and derived net streams created during site- level aggregation.Initialise a stream and infer hot/cold classification.
- Parameters:
name (str)
t_supply (Optional[MaybeVU])
t_target (Optional[MaybeVU])
p_supply (Optional[MaybeVU])
p_target (Optional[MaybeVU])
h_supply (Optional[MaybeVU])
h_target (Optional[MaybeVU])
dt_cont (MaybeVU)
dt_cont_multiplier (float)
heat_flow (MaybeVU)
htc (MaybeVU)
price (Optional[MaybeVU])
is_process_stream (bool)
fluid_name (Optional[str])
fluid_phase (Optional[str | FluidPhase])
- property segments: tuple[StreamSegment, ...]
Ordered immutable view of the stream’s piecewise thermal segments.
- property dt_cont_act: Value
Effective delta-T contribution used in shifted-temperature calculations.
- property dt_cont_multiplier: float
Effective delta-T contribution used in shifted-temperature calculations.
- property dt_cont_multiplier_locked: bool
Whether the delta-T contribution multiplier is locked against changes.
- property shifted_minimum_temperature: Value | None
Alias for the shifted minimum stream temperature.
- property shifted_maximum_temperature: Value | None
Alias for the shifted maximum stream temperature.
- property delta_t_contribution_multiplier: float
Alias for the shifted-temperature contribution multiplier.
- property effective_delta_t_contribution: Value
Alias for the effective shifted-temperature contribution.
- property resistance_capacity_product: Value | None
Alias for the stream resistance-capacity product.
- invert()[source]
Flip a utility stream into its generating process-stream analogue.
- Return type:
None
- replace_segments(segments)[source]
Normalize and atomically replace the piecewise profile.
- Return type:
None
- update_segment(index, **changes)[source]
Apply one segment update transactionally and revalidate the profile.
- Parameters:
index (int)
- Return type:
None
- update_segments(updates)[source]
Atomically apply sparse attribute changes to ordered child segments.
Utility container for managing ordered sets of stream objects.
- class OpenPinch.classes.stream_collection.StreamCollection(streams=None)[source]
Bases:
objectA dynamic, ordered collection of streams.
Key features include:
Add and remove streams by name.
Prevent overwriting existing streams by auto-renaming.
Configure sort keys as attributes or callables.
Iterate efficiently with lazy sorting.
Support ascending or descending ordering.
Initialise an empty collection sorted by descending supply temperature.
- Parameters:
streams (List['Stream'] | None)
- property period_ids: dict[str, int] | None
Return the canonical period identifiers for this collection.
- add(stream, key=None, prevent_overwrite=True)[source]
Insert a stream, optionally renaming the key to avoid collisions.
- add_many(streams, keys=None, prevent_overwrite=True)[source]
Insert several streams, optionally using explicit keys for each stream.
- sum_stream_attribute(attr_name, idx=None)[source]
Return the total of a specified attribute for streams in the collection.
- set_common_stream_attribute(attr_name, value, *, idx=None)[source]
Set a common attribute across all streams in the collection.
- set_sort_key(key, reverse=False)[source]
Set the sorting key. Supports attribute names or custom lambdas.
- copy(*, deep=False)[source]
Return a copy of the collection, optionally deep-copying streams.
- Parameters:
deep (bool)
- Return type:
- set_period_context(period_ids, weights, num_periods=None)[source]
Persist the canonical shared period model for this collection.
- numeric_view(idx=None)[source]
Return a cached dense numeric view for stream-analysis kernels.
- Parameters:
idx (int | None)
- Return type:
StreamCollectionNumericView
- segment_numeric_view(idx=None)[source]
Return a cached numeric view expanded to ordered thermal segments.
- Parameters:
idx (int | None)
- Return type:
StreamCollectionNumericView
- get_index(stream)[source]
Return the position (index) of a stream object in the sorted stream list.
- Return type:
- export_to_csv(filename='heat pump streams')[source]
Export stream data to
results/<filename>and return the path written.
- to_dict(idx=None, *, expand_segments=False)[source]
Return stream data as serializable rows in standard reporting order.
- get_hot_streams(include_process_streams=True, include_utility_streams=True, invert_utility=False, sort_attr=None)[source]
Return a new collection containing only hot streams.
- get_cold_streams(include_process_streams=True, include_utility_streams=True, invert_utility=False, sort_attr=None)[source]
Return a new collection containing only cold streams.
- get_process_streams(sort_attr=None)[source]
Return a new collection containing only process streams.
- Parameters:
sort_attr (str | None)
- get_hot_process_streams(sort_attr=None)[source]
Return a new collection containing only hot process streams.
- Parameters:
sort_attr (str | None)
- get_cold_process_streams(sort_attr=None)[source]
Return a new collection containing only cold process streams.
- Parameters:
sort_attr (str | None)
- get_utility_streams(sort_attr=None)[source]
Return a new collection containing only utility streams.
- Parameters:
sort_attr (str | None)
- get_hot_utility_streams(sort_attr=None)[source]
Return a new collection containing only hot utility streams.
- Parameters:
sort_attr (str | None)
- get_cold_utility_streams(sort_attr=None)[source]
Return a new collection containing only cold utility streams.
- Parameters:
sort_attr (str | None)
Zones, Targets, and Tables
These classes represent the solved hierarchy and its numerical results.
Zone data structure capturing nested scopes and their thermal targets.
- class OpenPinch.classes.zone.Zone(name='Zone', type='Process Zone', config=None, parent_zone=None)[source]
Bases:
objectHierarchical analysis boundary containing streams, utilities, and targets.
Zones form the backbone of the in-memory OpenPinch model. Each zone can own process streams, utility streams, solved targets, generated graphs, and nested child zones. Direct and indirect integration routines progressively populate this structure as the analysis moves from local process scopes up to site-style aggregation.
Initialise an empty zone with stream, target, and graph containers.
- Parameters:
name (str)
type (str)
config (Optional[Configuration])
parent_zone (Zone)
- property name
Display name used when addressing the zone in the hierarchy.
- property type
Zone type type from
ZoneType.
- property config
Configuration object controlling analysis behaviour for this zone.
- property parent_zone
Direct parent zone in the site hierarchy, if any.
- property weights
Canonical period weights for this zone.
- property num_periods
Number of distinct states for this zone.
- property dt_cont_multiplier: float
Effective multiplier applied to stream and utility
dt_contvalues.
- property hot_streams
Process streams that release heat within this zone.
- property cold_streams
Process streams that require heat within this zone.
- property net_hot_streams
Net hot streams derived from zonal aggregation.
- property net_cold_streams
Net cold streams derived from zonal aggregation.
- property hot_utilities
Hot utility streams assigned to the zone.
- property cold_utilities
Cold utility streams assigned to the zone.
- property graphs
Graphs generated for this zone.
- property subzones
Immediate child zones keyed by name.
- property targets
Energy targets keyed by target name.
- property process_streams
Combined hot and cold process streams for the zone.
- property net_process_streams
Combined net hot and net cold process streams for the zone.
- property utility_streams
Combined hot and cold utility streams for the zone.
- property all_streams
All process and utility streams defined on the zone.
- set_period_context(period_ids, weights, num_periods)[source]
Set the canonical period lookup owned by this zone and propagate refs.
- add_graph(name, result)[source]
Store a graph result under
namefor later export or display.- Parameters:
name (str)
- add_zone(zone_to_add, sub=True)[source]
Add a single zone object keyed by its name.
If the zone name already exists: - If the zone is identical (e.g. same stream and utility objects), skip. - If it’s different, add it with a suffix like ‘_1’, ‘_2’, etc.
- Parameters:
sub (bool)
- add_target(target_to_add)[source]
Add one target to a specific zone.
- Parameters:
target_to_add (BaseTargetModel)
- add_targets(targets=None)[source]
Add multiple targets to a specific zone.
- Parameters:
targets (list | None)
- import_hot_and_cold_streams_from_sub_zones(get_net_streams=False, is_n_zone_depth=True, is_new_stream_collection=True)[source]
Get referenced hot and cold streams across multiple subzones.
Lightweight table structure used by the pinch analysis pipeline.
- class OpenPinch.classes.problem_table.ProblemTable(data_input=None, add_default_labels=True)[source]
Bases:
objectNumPy-backed pinch problem table with enum-friendly accessors.
Initialise the table from a dictionary or list-of-columns structure.
- Parameters:
- class ColumnViewByIndex(parent)[source]
Bases:
objectExpose read/write access to columns addressed by integer index.
- Parameters:
parent (ProblemTable)
- property icol
Return a view for column access by integer position.
- class ColumnViewByName(parent)[source]
Bases:
objectExpose read/write access to columns addressed by label or enum.
- Parameters:
parent (ProblemTable)
- property col
Return a view for column access by string label or ProblemTableLabel.
- class ColumnsViewByName(parent)[source]
Bases:
objectVectorised view over multiple labelled columns or enums.
- Parameters:
parent (ProblemTable)
- property cols
Return a vectorised view over multiple labelled columns or enums.
- class LocationByRowByColName(parent)[source]
Bases:
objectRow/column accessor mirroring
DataFrame.locsemantics.- Parameters:
parent (ProblemTable)
- property loc
Expose row/column access using label semantics (
loc).
- class LocationByRowByCol(parent)[source]
Bases:
objectRow/column accessor mirroring
DataFrame.ilocsemantics.- Parameters:
parent (ProblemTable)
- property iloc
Expose row/column access using positional semantics (
iloc).
- slice(keys)[source]
Return a new ProblemTable containing only the requested columns.
- Parameters:
keys (str | ProblemTableLabel | Sequence[str | ProblemTableLabel])
- Return type:
- property shape
Tuple describing
(rows, columns)for the buffer.
- property to_dataframe: DataFrame
Convert the buffer into a pandas DataFrame.
- property copy
Return a deep copy of the table.
- to_list(col=None)[source]
Return table data as Python lists; optionally restrict to a single column.
- Parameters:
col (str | ProblemTableLabel | None)
- pinch_idx(col=ProblemTableLabel.H_NET)[source]
Return the row indices of the hot and cold pinch temperatures.
- pinch_temperatures(col_T=ProblemTableLabel.T, col_H=ProblemTableLabel.H_NET)[source]
Determine the hottest hot and coldest cold pinch temperatures.
- Parameters:
col_T (str | ProblemTableLabel)
col_H (int | str | ProblemTableLabel)
- Return type:
- shift_heat_cascade(dh, col)[source]
Shift a heat-cascade column by
dhand return a table copy.- Parameters:
dh (float)
col (int | str | ProblemTableLabel)
- Return type:
Mutate both tables so they use the union of their temperature intervals.
Returns a tuple containing
(rows_inserted_into_self, rows_inserted_into_other).- Parameters:
other (ProblemTable)
- Return type:
- insert_temperature_interval(T_ls)[source]
Insert any missing temperature intervals and return count inserted.
- insert(row_dict, index)[source]
Insert a single row (dict of column: value) at the specified index.
- update_row(index, row_dict)[source]
Update selected columns for one row using values from
row_dict.
- update(updates=None, T_col=None)[source]
Assign aligned column values in-place using an explicit source T column.
- Parameters:
updates (dict[str | ProblemTableLabel, ndarray] | None)
T_col (ndarray | None)
- Return type:
- sort_by_column(column, ascending=True)[source]
Sort rows in-place by the given column.
- Parameters:
column (str | ProblemTableLabel)
ascending (bool)
Heat Exchanger Network Design Records
These classes are the OpenPinch-native public result model for heat exchanger network design outcomes. They expose exchanger links by source and sink stream identity; raw solver axis positions remain internal implementation details.
OpenPinch-native heat exchanger design records.
- class OpenPinch.classes.heat_exchanger.HeatExchanger(*, exchanger_id=None, kind, source_stream, sink_stream, source_stream_role, sink_stream_role, stage=None, period_states, area=None, match_allowed=True, capital_cost=None, segment_area_contributions=<factory>, solver_metadata=<factory>, source_metadata=<factory>)[source]
Bases:
BaseModelOne labelled heat-transfer link in a heat exchanger network.
Create a new model by parsing and validating input data from keyword arguments.
Raises [ValidationError][pydantic_core.ValidationError] if the input data cannot be validated to form a valid model.
self is explicitly positional-only to allow self as a field name.
- Parameters:
exchanger_id (str | None)
kind (HeatExchangerKind)
source_stream (str)
sink_stream (str)
source_stream_role (HeatExchangerStreamRole)
sink_stream_role (HeatExchangerStreamRole)
stage (int | None)
period_states (Annotated[tuple[HeatExchangerPeriodState, ...], MinLen(min_length=1)])
area (float | None)
match_allowed (bool)
capital_cost (float | None)
segment_area_contributions (tuple[HeatExchangerAreaSlice, ...])
- model_config = {'extra': 'forbid', 'validate_assignment': True}
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- property has_segment_area_contributions: bool
Return whether exact local segment-area slices are available.
- property segment_duty_by_period: dict[str, float]
Return local slice duty totals grouped by operating period.
- property segment_area_by_period: dict[str, float]
Return local slice area totals grouped by operating period.
- property segment_design_area: float | None
Return the maximum period-total slice area when slices are available.
- property period_ids: tuple[str, ...]
Return ordered operating-period identities for this exchanger.
- state(period_id=None)[source]
Return one period state, requiring identity for multiperiod results.
- Parameters:
period_id (str | None)
- Return type:
HeatExchangerPeriodState
- class OpenPinch.classes.heat_exchanger.HeatExchangerKind(*values)[source]
-
Supported heat-transfer link families in a heat exchanger network design.
- class OpenPinch.classes.heat_exchanger.HeatExchangerStreamRole(*values)[source]
-
Identity class for the source and sink streams on an exchanger link.
OpenPinch-native heat exchanger network result model.
- class OpenPinch.classes.heat_exchanger_network.HeatExchangerNetwork(*, exchangers=<factory>, run_id=None, task_id=None, period_id=None, method=None, stage_count=None, objective_value=None, total_annual_cost=None, utility_cost=None, capital_cost=None, summary_metrics=<factory>, solver_axis_metadata=<factory>, source_metadata=<factory>)[source]
Bases:
BaseModelOrdered heat exchanger network result collection.
Create a new model by parsing and validating input data from keyword arguments.
Raises [ValidationError][pydantic_core.ValidationError] if the input data cannot be validated to form a valid model.
self is explicitly positional-only to allow self as a field name.
- Parameters:
exchangers (tuple[HeatExchanger, ...])
run_id (str | None)
task_id (str | None)
period_id (str | None)
method (str | None)
stage_count (int | None)
objective_value (float | None)
total_annual_cost (float | None)
utility_cost (float | None)
capital_cost (float | None)
summary_metrics (dict[str, float | int | str | bool | None])
- model_config = {'extra': 'forbid', 'validate_assignment': True}
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- build_grid_diagram(*, period_id=None, stream_line_width=5.0, temperature_scaled=False)[source]
Return a grid diagram for this heat exchanger network.
- quantify_controllability(*, period_id=None, **kwargs)[source]
Return steady-state controllability metrics for this network.
- property period_ids: tuple[str, ...]
Return ordered period identities represented by exchanger states.
- resolve_period_id(period_id=None)[source]
Resolve an optional period identity without ambiguous multiperiod access.
- exchangers_involving_stream(stream_id, *, active_only=False, period_id=None)[source]
Return all exchangers that use
stream_idas source or sink.- Parameters:
- Return type:
tuple[HeatExchanger, …]
- exchanger_between(*, source_stream, sink_stream, stage=None, kind=None)[source]
Return the unique exchanger for a labelled source/sink/stage link.
- Parameters:
source_stream (str)
sink_stream (str)
stage (int | None)
kind (HeatExchangerKind | str | None)
- Return type:
HeatExchanger | None
- total_duty(*, kind=None, stream=None, stage=None, active_only=True, period_id=None)[source]
Return duty total filtered by kind, stream identity, and stage.
- total_area(*, kind=None, stream=None, stage=None, active_only=True, period_id=None)[source]
Return area total filtered by kind, stream identity, and stage.
- total(label, *, kind=None, stream=None, stage=None, active_only=True, period_id=None)[source]
Return a numeric total for a supported heat exchanger network label.
- Parameters:
label (HeatExchangerNetworkLabel | str)
kind (HeatExchangerKind | str | None)
stream (str | None)
stage (int | None)
active_only (bool)
period_id (str | None)
- Return type:
- labelled_value(label, *, source_stream, sink_stream, stage=None, kind=None, period_id=None)[source]
Return a labelled value from one source/sink/stage exchanger link.
- Parameters:
label (HeatExchangerNetworkLabel | str)
source_stream (str)
sink_stream (str)
stage (int | None)
kind (HeatExchangerKind | str | None)
period_id (str | None)
- Return type:
Heat Exchanger Network Unit Models
The HEN synthesis unit-model modules sit below the public design accessors.
They are useful when inspecting how the pinch-design and stagewise equations
are assembled, but users normally call the methods through
problem.design.
Private equation-model boundary for OpenPinch heat exchanger network synthesis.
The symbols in this package are implementation details behind the problem-rooted synthesis service. Importing the package must stay lightweight; GEKKO, Pyomo, and external solver checks happen only when a concrete backend is created or configured.
Base setup for migrated heat exchanger network equation kernels.
- class OpenPinch.services.heat_exchanger_network_synthesis.unit_models.base.BaseHeatExchangerNetworkModel(name, framework, solver, solver_arrays, dTmin, z_restriction, min_dqda, minimisation_goal, non_isothermal_model, integers, tol, solver_options=None, import_file=None)[source]
Bases:
ABCShared private state for migrated PDM/TDM/ESM equation models.
The constructor mirrors the source OpenHENS solver defaults, but it accepts OpenPinch-prepared solver arrays instead of a CSV path. This layer owns the guarded GEKKO backend setup, source-shaped array normalization, inherited topology restrictions, common diagnostics, and helper equations that are stable across the moved private
PinchDecompModelandStageWiseModel. HENS-08 still owns topology evolution and stage-reduction behavior; those remain outside the base contract.- Parameters:
name (str)
framework (Literal['PDM', 'TDM', 'ESM'])
solver (Literal['couenne', 'ipopt-pyomo', 'ipopt-GEKKO', 'apopt'])
solver_arrays (PreparedSolverArrays)
dTmin (float)
z_restriction (list | None)
min_dqda (float)
minimisation_goal (Literal['hot utility', 'total utility', 'utility costs', 'heat recovery', 'total cost', 'variable total cost'])
non_isothermal_model (bool)
integers (bool)
tol (float)
import_file (Path | None)
- setup_model()[source]
Create and configure the GEKKO model behind optional guards.
- Return type:
None
- abstractmethod setup()[source]
Create concrete equation variables, constraints, and objective.
- Return type:
None
- abstractmethod set_preprocessing()[source]
Populate model dimensions and derived solver constants.
- Return type:
None
- abstractmethod set_stage_wise_superstructure()[source]
Create the stage-wise superstructure in concrete model slices.
- Return type:
None
- abstractmethod set_obj()[source]
Attach the concrete objective formula unchanged from OpenHENS.
- Return type:
None
- abstractmethod get_post_process()[source]
Extract solved arrays after a successful concrete solve.
- Return type:
None
- get_alpha_values()[source]
Calculate source alpha flow-on values in a post-optimisation solve.
- Return type:
- set_alpha_dqda_equations(*, m=None, postoptimisation=False)[source]
Move the source alpha and dQ/dA equations without changing formulas.
- set_blank_input_parameters()[source]
Initialize the solver-array attributes expected by source equations.
- Return type:
None
- get_model_parameters_from_solver_arrays()[source]
Populate model attributes from the OpenPinch private array adapter.
- Return type:
None
- set_match_restrictions(restrictions)[source]
Apply inherited topology restrictions in the source array shape.
- Return type:
None
Migrated PDM coordinator and above/below-pinch model construction.
- class OpenPinch.services.heat_exchanger_network_synthesis.unit_models.pinch_design.PinchDecompModel(*, name, framework, solver, solver_arrays, dTmin, z_restriction, min_dqda, minimisation_goal, non_isothermal_model, integers, tol, pinch_loc, pinch_decomposition, stage_selection, solver_options=None)[source]
Bases:
BaseHeatExchangerNetworkModelSource-compatible private PDM slice for one pinch side.
- Parameters:
name (str)
framework (Literal['PDM'])
solver (Literal['couenne', 'ipopt-pyomo', 'ipopt-GEKKO', 'apopt'])
solver_arrays (PreparedSolverArrays)
dTmin (float)
z_restriction (list | None)
min_dqda (float)
minimisation_goal (Literal['hot utility', 'cold utility', 'total utility', 'utility costs', 'heat recovery', 'total cost', 'variable total cost', 'min units'])
non_isothermal_model (bool)
integers (bool)
tol (float)
pinch_loc (Literal['above', 'below'])
pinch_decomposition (PinchDesignDecomposition)
stage_selection (Literal['automated'] | list[int] | tuple[int, int])
- get_model_parameters_from_solver_arrays()[source]
Populate model attributes from the OpenPinch private array adapter.
- Return type:
None
- calculate_pinch()[source]
Read target values from the private OpenPinch decomposition.
- Return type:
None
- set_stage_wise_superstructure()[source]
Create PDM variables, constraints, and binaries.
- Return type:
None
- get_post_process()[source]
Extract source PDM side arrays after a successful solve.
- Return type:
None
- amalgamate_networks(*, below_case, above_case)[source]
Amalgamate solved above/below-pinch side models into one network.
- Parameters:
below_case (PinchDecompModel)
above_case (PinchDecompModel)
- Return type:
Migrated StageWise TDM/ESM equation construction.
This module is private to the problem-rooted synthesis service. The equations mirror the source OpenHENS StageWise model while taking prepared OpenPinch solver arrays instead of source CSV rows.
- class OpenPinch.services.heat_exchanger_network_synthesis.unit_models.stagewise.StageWiseModel(*, name, framework, solver, solver_arrays, stages, dTmin, z_restriction, min_dqda, minimisation_goal, non_isothermal_model, integers, tol, solver_options=None)[source]
Bases:
BaseHeatExchangerNetworkModelSource-compatible StageWise model for private TDM/ESM construction.
- Parameters:
name (str)
framework (Literal['TDM', 'ESM', 'PDM'])
solver (Literal['couenne', 'ipopt-pyomo', 'ipopt-GEKKO', 'apopt'])
solver_arrays (PreparedSolverArrays)
stages (int)
dTmin (float)
z_restriction (list | None)
min_dqda (float)
minimisation_goal (Literal['hot utility', 'cold utility', 'total utility', 'utility costs', 'heat recovery', 'total cost', 'variable total cost', 'dQ/dA obj'])
non_isothermal_model (bool)
integers (bool)
tol (float)
- set_preprocessing()[source]
Pre-process SynHEAT superstructure parameters for all states.
- Return type:
None
- set_stage_wise_superstructure()[source]
Create StageWise variables, constraints, and binaries.
- Return type:
None
- set_initial_values_for_variables(init_solution, *, brackets=False)[source]
Warm-start this model from a solved parent model.
- Parameters:
brackets (bool)
- Return type:
None
- get_net_benefit_evolution(print_output, max_depth=5, n_ad_branches=1, n_rm_branches=1, max_parallel=1, no_improvement_patience=None)[source]
Evolve topology using branched add/remove net-benefit heuristics.
- get_n_minus_one_evolution(print_output, unit, prev_case)[source]
Build and solve the source minus-one topology evolution candidate.
- get_n_plus_one_evolution(print_output, unit, prev_case)[source]
Build and solve the source plus-one topology evolution candidate.
- get_post_process()[source]
Extract source post-process arrays after a successful solve.
- Return type:
None
- get_lowest_benefit_HX_candidates(limit)[source]
Return active exchangers sorted by ascending source net benefit.
Pinch-decomposition model with explicit stage packing constraints.
- class OpenPinch.services.heat_exchanger_network_synthesis.unit_models.packed_pinch_design.StagePackedPinchDecompModel(*, name, framework, solver, solver_arrays, dTmin, z_restriction, min_dqda, minimisation_goal, non_isothermal_model, integers, tol, pinch_loc, pinch_decomposition, stage_selection, solver_options=None)[source]
Bases:
PinchDecompModelPDM slice with packed recovery stages to reduce stage-index symmetry.
- Parameters:
name (str)
framework (Literal['PDM'])
solver (Literal['couenne', 'ipopt-pyomo', 'ipopt-GEKKO', 'apopt'])
solver_arrays (PreparedSolverArrays)
dTmin (float)
z_restriction (list | None)
min_dqda (float)
minimisation_goal (Literal['hot utility', 'cold utility', 'total utility', 'utility costs', 'heat recovery', 'total cost', 'variable total cost', 'min units'])
non_isothermal_model (bool)
integers (bool)
tol (float)
pinch_loc (Literal['above', 'below'])
pinch_decomposition (PinchDesignDecomposition)
stage_selection (Literal['automated'] | list[int] | tuple[int, int])
Stage-wise HEN model with explicit stage packing constraints.
- class OpenPinch.services.heat_exchanger_network_synthesis.unit_models.packed_stagewise.StagePackedStageWiseModel(*, name, framework, solver, solver_arrays, stages, dTmin, z_restriction, min_dqda, minimisation_goal, non_isothermal_model, integers, tol, solver_options=None)[source]
Bases:
StageWiseModelStageWise model with integer-stage symmetry reduced for TDM solves.
- Parameters:
name (str)
framework (Literal['TDM', 'ESM', 'PDM'])
solver (Literal['couenne', 'ipopt-pyomo', 'ipopt-GEKKO', 'apopt'])
solver_arrays (PreparedSolverArrays)
stages (int)
dTmin (float)
z_restriction (list | None)
min_dqda (float)
minimisation_goal (Literal['hot utility', 'cold utility', 'total utility', 'utility costs', 'heat recovery', 'total cost', 'variable total cost', 'dQ/dA obj'])
non_isothermal_model (bool)
integers (bool)
tol (float)
Stage-packing constraints for HEN integer model variants.
- OpenPinch.services.heat_exchanger_network_synthesis.unit_models.stage_packing.add_recovery_stage_packing_constraints(model)[source]
Force active recovery stages to be contiguous in integer models.
- Parameters:
model (Any)
- Return type:
None
Internal heat exchanger network problem shell behind the synthesis service.
Bases:
NotImplementedErrorRaised when a later migration slice is asked to run too early.
- class OpenPinch.services.heat_exchanger_network_synthesis.unit_models.problem.InternalHeatExchangerNetworkProblem(solver_arrays, name='', framework='TDM', solver='couenne', dTmin=0.1, min_dqda=0.0, z_restriction=None, minimisation_goal='hot utility', non_isothermal_model=False, integers=True, parent=None, tol=0.001, solver_options=None, stage_selection='automated', stages=None, synthesis_task_id=None, pinch_decompositions=None)[source]
Bases:
objectOpenPinch-owned replacement for source
HeatExchangerNetworkProblem.This object is private solver state. HENS-07 constructs moved PDM and StageWise models from OpenPinch-prepared solver arrays and emits OpenPinch network/result data at the extraction boundary. HENS-08 still owns stage reduction and topology evolution.
- Parameters:
solver_arrays (PreparedSolverArrays)
name (str)
framework (Literal['PDM', 'TDM', 'ESM'])
solver (str)
dTmin (float)
min_dqda (float)
z_restriction (list | None)
minimisation_goal (str)
non_isothermal_model (bool)
integers (bool)
parent (InternalHeatExchangerNetworkProblem | None)
tol (float)
stages (int | None)
synthesis_task_id (str | None)
pinch_decompositions (Mapping[str, PinchDesignDecomposition] | None)
- load_model(*, model_factories=None)[source]
Construct the private PDM or StageWise model for this task.
- get_solution(*, print_output=True, evolution=None, evolution_n_ad_branches=1, evolution_n_rm_branches=1, evolution_max_parallel=1, evolution_no_improvement_patience=None, model_factories=None)[source]
Load, solve, and return the private solved model for this task.
- extract_network(*, run_id)[source]
Convert the solved private case into an OpenPinch network result.
- Parameters:
run_id (str)
- Return type:
- extract_result(*, run_id, problem_id=None, workspace_variant=None, period_id=None)[source]
Return the serializable result data for the service boundary.
Units and Scalar Helpers
Value supports both ordinary scalar
quantities and discrete-period values with period_ids and normalised
weights. This makes it suitable for both deterministic reports and
period-weighted scenario data.
Unit-aware scalar and multiperiod value wrapper powered by Pint quantities.
- class OpenPinch.classes.value.Value(data=None, unit=None)[source]
Bases:
objectThin wrapper around a Pint
Quantitywith serialization helpers.Create a scalar or multiperiod value from data and optional unit.
- Parameters:
unit (str)
- property value
Return scalar or per-period magnitudes for multiperiod values.
- property values: list[float]
Return magnitudes as a JSON-friendly list for period-value compatibility.
- property unit
Return the unit in a human-friendly compact representation.
Process Component Models
Process components are live model mutations attached after preparation and before rerunning targets. The direct process MVR component owns the original stream records, replacement streams, per-period stage results, and activation/deactivation state used by workspace comparison studies.
Lightweight base records for process components.
- class OpenPinch.services.components.process_components.ProcessComponent(id, problem, component_type, active=True)[source]
Bases:
objectBase class for memory-only process components.
- Parameters:
id (str)
problem (PinchProblem)
component_type (str)
active (bool)
MVR-specific process component records and factory.
- class OpenPinch.services.components.process_mvr.ProcessMVRComponent(id, problem, component_type='process_mvr', active=True, settings=<factory>, source_selectors=<factory>, stream_records=<factory>)[source]
Bases:
ProcessComponentMemory-only direct process MVR component.
- Parameters:
id (str)
problem (PinchProblem)
component_type (str)
active (bool)
settings (DirectGasMVRSettings)
source_selectors (list[Any])
stream_records (list[_ProcessMVRStreamRecord])
- OpenPinch.services.components.process_mvr.create_process_mvr_component(problem, *, source_streams, mvr_id=None, n_stages=1, liquid_injection=True, mvr_stage_t_lift=None, mvr_stage_pressure_ratio=None, max_stage_t_sat_lift=None, eta_mvr_comp=None, eta_motor=None, options=None, period_id=None)[source]
Create, activate, and register a direct process MVR component.
- Parameters:
- Return type:
Direct process-gas MVR component solver.
- class OpenPinch.services.components.direct_mvr.direct_gas_mvr.DirectGasMVROutputUnits(temperature='degC', pressure='kPa', enthalpy='kJ/kg', heat_flow='kW')[source]
Bases:
objectUnits used for public direct-MVR outputs.
- class OpenPinch.services.components.direct_mvr.direct_gas_mvr.DirectGasMVRSettings(n_stages=1, mvr_stage_t_lift=None, mvr_stage_pressure_ratio=None, liquid_injection=False, eta_mvr_comp=0.7, eta_motor=0.95, dt_diff_max=0.1)[source]
Bases:
objectUser-facing settings for one direct gas MVR solve.
- class OpenPinch.services.components.direct_mvr.direct_gas_mvr.DirectGasMVRStageResult(source_stream, stage_index, p_in, p_out, t_in, t_discharge, t_hot_supply, t_target, heat_flow, work, h_hot_supply, h_target, th_curve, linearised_profile, q_liquid_injection=0.0, liquid_injection_applied=False, temperature_unit='degC', pressure_unit='kPa', enthalpy_unit='kJ/kg', heat_flow_unit='kW', source_mass_flow=0.0, hot_mass_flow=0.0, liquid_injection_ratio=0.0)[source]
Bases:
objectSolved accounting for one direct gas MVR stage.
- Parameters:
source_stream (str)
stage_index (int)
p_in (float)
p_out (float)
t_in (float)
t_discharge (float)
t_hot_supply (float)
t_target (float)
heat_flow (float)
work (float)
h_hot_supply (float)
h_target (float)
th_curve (ndarray)
linearised_profile (ndarray)
q_liquid_injection (float)
liquid_injection_applied (bool)
temperature_unit (str)
pressure_unit (str)
enthalpy_unit (str)
heat_flow_unit (str)
source_mass_flow (float)
hot_mass_flow (float)
liquid_injection_ratio (float)
- class OpenPinch.services.components.direct_mvr.direct_gas_mvr.DirectGasMVRStreamSolveResult(replacement_streams, stage_results=<factory>)[source]
Bases:
objectSolved direct gas MVR streams for one source stream at one period index.
- Parameters:
replacement_streams (StreamCollection)
stage_results (list[DirectGasMVRStageResult])
- OpenPinch.services.components.direct_mvr.direct_gas_mvr.coerce_positive_mvr_stage_count(value, *, context='Direct gas MVR')[source]
Return a validated integer direct-MVR stage count.
- OpenPinch.services.components.direct_mvr.direct_gas_mvr.solve_direct_gas_mvr_stream(stream, *, settings, idx=0)[source]
Solve direct gas MVR replacement streams for one source stream and period.
- Parameters:
stream (Stream)
settings (DirectGasMVRSettings)
idx (int)
- Return type:
Thermal Cycle and Cogeneration Unit Models
These classes support the advanced Heat Pump, refrigeration, and utility system
workflows documented in
OpenPinch.services.heat_pump_integration.heat_pump_and_refrigeration_entry. They are
primarily useful for advanced users who want to inspect or construct detailed
cycle configurations directly.
Cycle-specific heat pump unit model classes.
Simple vapour-compression heat pump cycle utilities built on CoolProp.
- class OpenPinch.services.heat_pump_integration.unit_models.vapour_compression_cycle.VapourCompressionCycle[source]
Bases:
objectSingle vapour-compression heat pump cycle.
Supports an optional internal heat exchanger.
Initialise an unsolved cycle with default operating assumptions.
- property state
Underlying CoolProp fluid state used during cycle calculations.
- property dt_diff_max: float | None
Maximum piecewise temperature error for derived stream profiles.
- property T_evap_sat_vap: float | None
Saturated vapour temperature at evaporating pressure in degrees Celsius.
- property T_cond_sat_liq: float | None
Saturated liquid temperature at condensing pressure in degrees Celsius.
- solve(T_evap, T_cond, *, dtcont, dT_superheat=0.0, dT_subcool=0.0, eta_comp=0.7, refrigerant='water', dT_ihx_gas_side=10.0, Q_heat=None, Q_cas_heat=0.0, Q_cool=None, Q_cas_cool=0.0, is_heat_pump=True)[source]
Solve the heat pump cycle for the provided operating point.
- Parameters:
T_evap (float) – Liquid saturation temperature in the evaporator [deg C].
T_cond (float) – Gas saturation temperature in the condenser [deg C].
dtcont (float) – Minimum temperature approach used by HPR targeting [K].
dT_superheat (float, optional) – Degree of superheating of the suction gas, supplied by the process [K].
dT_subcool (float, optional) – Degree of subcooling after the condenser, heat delivered to the process [K].
eta_comp (float, optional) – Isentropic efficiency of the compressor [-].
refrigerant (str, optional) – Cycle refrigerant; supports multi-component fluids.
dT_ihx_gas_side (float, optional) – Delta-T on the gas side of the internal heat exchanger [K].
Q_heat (float, optional) – Heat delivered to the process [W]. Used for heat-pump and cascade configurations only.
Q_cas_heat (float, optional) – Extra condenser heat transferred to the next cascade cycle [W]. Used only for cascade heat pump configurations.
Q_cool (float, optional) – Cooling delivered to the process [W]. Used for refrigeration and cascade configurations only.
Q_cas_cool (float, optional) – Extra evaporator cooling transferred to the next cascade cycle [W]. Used only for cascade refrigeration configurations.
is_heat_pump (bool, optional) – Flag to indicate if the cycle is in heat pump or refrigeration mode.
- Returns:
Compressor power requirement for the solved operating point [W].
- Return type:
Parallel heat pump network assembled from independent subcycles.
- class OpenPinch.services.heat_pump_integration.unit_models.parallel_vapour_compression_cycles.ParallelVapourCompressionCycles[source]
Bases:
objectParallel set of vapour-compression heat pumps solved independently.
Initialise an unsolved parallel heat pump model.
- property Q_cas_heat_arr: ndarray | None
Per-subcycle heat handed off to any downstream cascade usage.
- property dt_diff_max: float | None
Maximum piecewise temperature error for derived stream profiles.
- property subcycles: List[VapourCompressionCycle]
Solved simple heat pump subcycles that make up the network.
- solve(T_evap, T_cond, *, dtcont, dT_superheat=0.0, dT_subcool=0.0, eta_comp=0.7, refrigerant='water', dT_ihx_gas_side=10.0, Q_heat=None, Q_cool=None, Q_heat_base=None, x_heat_split=None, Q_heat_available=None, Q_cool_base=None, x_cool_split=None, Q_cool_available=None, is_heat_pump=True)[source]
Solve a set of parallel simple heat pump cycles.
- Parameters:
T_evap (np.ndarray) – Liquid saturation temperatures in the evaporator [deg C].
T_cond (np.ndarray) – Gas saturation temperatures in the condenser [deg C].
dtcont (float) – Minimum temperature approach used by HPR targeting [K].
dT_superheat (np.ndarray, optional) – Degree of superheating of the suction gas [K].
dT_subcool (np.ndarray, optional) – Degree of subcooling after the condenser [K].
eta_comp (float, optional) – Isentropic efficiency of the compressor [-].
refrigerant (List[str] | str, optional) – Cycle refrigerants; one per heat pump or a scalar value.
dT_ihx_gas_side (np.ndarray | float, optional) – Delta-T on the gas side of the internal heat exchanger [K].
Q_heat (np.ndarray | float | None, optional) – Heat delivered to the process [W].
Q_cool (np.ndarray | float | None, optional) – Cooling delivered to the process [W].
is_heat_pump (bool, optional) – Flag to indicate if the cycle is in heat pump or refrigeration mode.
Q_heat_base (float | None)
x_heat_split (ndarray | None)
Q_heat_available (ndarray | None)
Q_cool_base (float | None)
x_cool_split (ndarray | None)
Q_cool_available (ndarray | None)
- Returns:
Total compressor power requirement for the solved operating point [W].
- Return type:
Cascade heat pump network assembled from staged subcycles.
- class OpenPinch.services.heat_pump_integration.unit_models.cascade_vapour_compression_cycle.CascadeVapourCompressionCycle[source]
Bases:
objectCascade of vapour-compression heat pumps coupled through cascade exchangers.
Initialise an unsolved cascade with no configured subcycles.
- property dt_diff_max: float | None
Maximum piecewise temperature error for derived stream profiles.
- property subcycles: List[VapourCompressionCycle]
Solved simple heat pump subcycles that make up the cascade.
- solve(T_evap, T_cond, *, dtcont, dT_superheat=0.0, dT_subcool=0.0, eta_comp=0.7, refrigerant='water', dT_ihx_gas_side=10.0, Q_heat=None, Q_cool=None, Q_heat_base=None, x_heat_split=None, Q_heat_available=None, Q_cool_base=None, x_cool_split=None, Q_cool_available=None, dt_cascade_hx=1.0, is_heat_pump=True)[source]
Solve the heat pump cycle for the provided operating point.
- Parameters:
T_evap (np.ndarray) – Liquid saturation temperature in the evaporator [deg C].
T_cond (np.ndarray) – Gas saturation temperature in the condenser [deg C].
dtcont (float) – Minimum temperature approach used by HPR targeting [K].
dT_superheat (np.ndarray, optional) – Degree of superheating of the suction gas, supplied by the process [K].
dT_subcool (np.ndarray, optional) – Degree of subcooling after the condenser, heat delivered to the process [K].
eta_comp (float, optional) – Isentropic efficiency of the compressor [-].
refrigerant (List[str], optional) – Cycle refrigerant; supports multi-component fluids.
dT_ihx_gas_side (np.ndarray | float, optional) – Delta-T on the gas side of the internal heat exchanger [K].
Q_heat (np.ndarray, optional) – Heat delivered to the process [W].
Q_cool (np.ndarray, optional) – Cooling delivered to the process [W].
dt_cascade_hx (float, optional) – Temperature difference between condensing and evaporating temperatures in the cascade heat exchanger.
is_heat_pump (bool, optional) – Flag to indicate if the cycle is in heat pump or refrigeration mode.
Q_heat_base (float | None)
x_heat_split (ndarray | None)
Q_heat_available (ndarray | None)
Q_cool_base (float | None)
x_cool_split (ndarray | None)
Q_cool_available (ndarray | None)
- Returns:
Compressor power requirement for the solved operating point [W].
- Return type:
Carnot-family HPR backend classes.
- class OpenPinch.services.heat_pump_integration.unit_models.carnot_cycles.CascadeCarnotCycle[source]
Bases:
objectCascade Carnot backend with shared solve-state properties.
- class OpenPinch.services.heat_pump_integration.unit_models.carnot_cycles.ParallelCarnotCycles[source]
Bases:
objectParallel simple Carnot heat-pump, heat-engine, and recovery stages.
Mechanical vapour recompression cycle utilities built on CoolProp.
- class OpenPinch.services.heat_pump_integration.unit_models.mechanical_vapour_recompression_cycle.MechanicalVapourRecompressionCycle[source]
Bases:
VapourCompressionCycleSingle-stage mechanical vapour recompression model.
The open stage is represented as source vapour at the evaporating pressure, dry real compression to the condensing pressure, post-compression internal liquid-injection desuperheating, process-side condensation, and optional liquid subcooling.
Initialise an unsolved MVR cycle with water as the default fluid.
- property source_m_dot: float | None
Vapour mass flow generated or received before liquid injection.
- property q_desuperheat: float | None
External specific desuperheating heat after internal injection.
- property q_liquid_injection: float | None
Dry-compression superheat consumed by injection per source mass.
- property process_m_dot_out: float | None
Post-injection vapour mass flow sent to the next open MVR stage.
- property COP_h: float | None
Total condenser-duty coefficient of performance based on electric work.
- solve_from_source_heat(T_evap, T_cond, *, Q_source, dT_superheat=0.0, dT_subcool=0.0, eta_mvr_comp=0.7, eta_motor=1.0, fluid='Water', liquid_injection=True, process_split=1.0, source_heat_is_external=True)[source]
Solve an open MVR stage from source heat.
The generated inlet vapour is saturated at
T_evapplus any supplieddT_superheat. Whensource_heat_is_externalis false, the source duty is retained for cycle accounting but omitted frombuild_stream_collection().
- solve_from_mass_flow(T_evap, T_cond, *, m_dot, dT_superheat=0.0, dT_subcool=0.0, eta_mvr_comp=0.7, eta_motor=1.0, fluid='Water', liquid_injection=True, process_split=1.0)[source]
Solve the MVR stage from inlet vapour mass flow.
This is primarily used by serial MVR cascades where a downstream stage receives the uncondensed discharge vapour from the previous stage.
- process_heat_components(process_split=None)[source]
Return external MVR heat components for a process condensation split.
When
process_splitis omitted, the components stored duringsolve_from_*are returned.
- build_stream_collection(include_cond=False, include_evap=False, is_process_stream=False, dtcont=0.0, dt_diff_max=0.5)[source]
Build external MVR process-heating streams.
include_evapemits the source/generator duty only for cycles solved from external source heat. Serial cascade source heat is internal and is not emitted by this unit model.
Vapour-compression plus serial MVR cascade model.
- class OpenPinch.services.heat_pump_integration.unit_models.vapour_compression_mvr_cascade.VapourCompressionMvrCascade[source]
Bases:
objectCascade top VC condenser heat into a serial MVR vapour train.
Initialise an unsolved VC+MVR cascade.
- property vc_cycles: List[VapourCompressionCycle]
Solved low-stage vapour-compression cycles.
- property mvr_cycles: List[MechanicalVapourRecompressionCycle]
Solved high-stage MVR cycles.
- property mvr_stage_mass_in: ndarray
Source vapour mass flow entering each MVR stage before injection.
- property mvr_stage_mass_out: ndarray
Post-injection uncondensed vapour mass flow leaving each MVR stage.
- solve(*, T_evap_vc, T_cond_vc, dT_lift_mvr, Q_heat_vc=None, mvr_source_split=0.0, mvr_process_split=None, Q_heat_base=None, x_heat_split=None, Q_heat_available=None, dT_subcool_vc=0.0, dT_subcool_mvr=0.0, dT_ihx_gas_side_vc=0.0, eta_comp=0.7, eta_mvr_comp=0.7, eta_motor=1.0, refrigerant='water', mvr_fluid='Water', dt_cascade_hx=0.0, dtcont=0.0)[source]
Solve the VC+MVR cascade for serial MVR lift and split variables.
- Parameters:
- Return type:
Brayton-cycle heat pump model used by advanced utility targeting workflows.
The class in this module wraps a TESPy network while exposing the shared OpenPinch heat pump cycle helper API.
- class OpenPinch.services.heat_pump_integration.unit_models.brayton_heat_pump.SimpleBraytonHeatPumpCycle[source]
Bases:
objectBrayton heat pump cycle using TESPy internally.
Public API mirrors the simple Rankine
HeatPumpCycleclass so the object is interchangeable in downstream code.Notes
The solver uses
Network.solve(mode="design").Pressures are left to TESPy to determine (option A). The user provides compressor inlet/outlet temperatures and the heat duty in the HTHX (Q_ht). Compressor and turbine isentropic efficiencies must be specified.
The cycle-state mapping is:
0=C1 compressor inlet,1=C2 compressor outlet,2=C3 turbine inlet,3=C4 turbine outlet.
Initialize an unsolved Brayton heat pump cycle container.
- property cycle_states
Return cycle state data in cycle-state order.
- property Hs: Sequence[float]
Return state specific enthalpies.
- Returns:
Enthalpy values [J/kg] for states 0..3.
- Return type:
Sequence[float]
- property Ts: Sequence[float]
Return state temperatures.
- Returns:
Temperatures [degC] for states 0..3.
- Return type:
Sequence[float]
- property Ps: Sequence[float]
Return state pressures.
- Returns:
Pressures [Pa] for states 0..3.
- Return type:
Sequence[float]
- property Ss: Sequence[float]
Return state specific entropies when available.
- Returns:
Entropy values for states 0..3. Entries may be
Nonewhen not populated by the underlying model.- Return type:
Sequence[float]
- property Q_heat: float | None
Return configured heat-delivery target.
- Returns:
Requested gas-cooler heat duty [kW].
- Return type:
float or None
- property Q_cool: float | None
Return low-temperature heat-rejection duty after solution.
- Returns:
LTHX duty [kW].
- Return type:
float or None
- property work_net: float | None
Return net shaft work after solution.
- Returns:
Compressor plus turbine power [kW] using TESPy sign convention.
- Return type:
float or None
- solve(T_comp_in, T_comp_out, dT_gc, Q_heat, eta_comp, eta_exp, is_recuperated, refrigerant=None)[source]
Solve the Brayton cycle using TESPy.
- Parameters:
T_comp_in (float) – Compressor inlet temperature [degC] (state 1).
T_comp_out (float) – Compressor outlet temperature [degC] (state 2).
dT_gc (float) – Temperature difference between compressor outlet and turbine inlet:
dT_gc = T_comp_out - T_turb_in.Q_heat (float) – Heat delivered in the gas cooler [kW], positive for process heating.
eta_comp (float) – Compressor isentropic efficiency (fraction).
eta_exp (float) – Turbine/expander isentropic efficiency (fraction).
is_recuperated (bool) – Whether recuperation is requested. Currently ignored and downgraded to a warning.
refrigerant (Any, optional) – Working-fluid label stored for reporting.
- Returns:
The cycle object is updated in place with solved states and duties.
- Return type:
None
- Raises:
RuntimeError – If TESPy solves but result extraction fails.
- get_hp_th_profiles()[source]
Return hot- and cold-side T-h profiles.
- Returns:
(HTHX_profile, LTHX_profile).- Return type:
tuple[np.ndarray, np.ndarray]
- get_hp_hot_and_cold_streams()[source]
Convert solved profiles to hot and cold utility stream collections.
- Returns:
Hot streams from HTHX and cold streams from LTHX.
- Return type:
Multi-stage steam turbine targeting utilities.
- class OpenPinch.services.power_cogeneration.unit_models.multi_stage_steam_turbine.MultiStageSteamTurbine[source]
Bases:
objectMutable multi-stage steam turbine solver for pinch targeting.
- property result: TurbineSolveResult
Return the validated solve result for the most recent run.
- property stages: list[TurbineStageResult]
Return the per-stage turbine results from the most recent run.