First Solve with Python
Purpose
Use OpenPinch.PinchProblem when you want one object to load, validate,
solve, summarize, graph, export, and rerun one OpenPinch case. This is the
canonical beginner workflow and the default path for scripts and notebooks.
Prerequisites
Install the base package:
python -m pip install openpinch
Install the notebook extra when you want Plotly graphs, Jupyter notebooks, or Excel import/export:
python -m pip install "openpinch[notebook]"
Sample Case
Use basic_pinch.json first. If no local file with that name exists,
PinchProblem loads the packaged sample case from the installed wheel.
Runnable Workflow
from OpenPinch import PinchProblem
problem = PinchProblem("basic_pinch.json", project_name="basic_pinch")
validation = problem.validation_report()
result = problem.target()
summary = problem.summary_frame()
print(validation.valid)
print(summary[["Target", "Hot Utility Target", "Cold Utility Target"]])
Expected Output
The solve caches a structured result on problem and returns a summary table
with target rows. For the first pass, inspect:
Hot Utility TargetCold Utility TargetHeat RecoveryHot PinchandCold Pinch
Graph and Export Workflow
With openpinch[notebook] or openpinch[dashboard] installed:
gcc = problem.plot.grand_composite_curve()
catalog = problem.plot.catalog()
workbook_path = problem.export_excel("results")
graph_paths = problem.plot.export("graphs", graph_type="gcc")
The Grand Composite Curve is the best first graph for utility placement and Heat Pump opportunity screening.
Period-Valued Cases
Named targeting accessors accept period_id=... when the case input carries
multiperiod values:
multiperiod_problem = PinchProblem(
"crude_preheat_train_multiperiod.json",
project_name="crude_multiperiod",
)
print(multiperiod_problem.period_ids)
peak_target = multiperiod_problem.target.direct_heat_integration(period_id="peak")
all_period_results = multiperiod_problem.target_all_periods(parallel="thread")
The summary, export, and graph surfaces then reflect the selected period.
Interpretation
Stay on PinchProblem when the study has one active case. Move to
PinchWorkspace when the study itself needs named baseline and variant
cases:
from OpenPinch import PinchWorkspace
workspace = PinchWorkspace(
source="crude_preheat_train.json",
project_name="crude_preheat_train",
)
workspace.scenario("wide_dt", dt_cont_multiplier=0.5)
comparison = workspace.compare_cases("baseline", "wide_dt")
Use pinch_analysis_service only when another application needs a typed
TargetInput to TargetOutput boundary instead of a live wrapper object.
Next Steps
Input Formats and Validation for accepted source shapes.
Graphing and Interpretation for reading curves after a solve.
Notebooks and Sample Cases for maintained example assets.
PinchProblem for the full object contract.