processforge 0.3.1__tar.gz → 0.3.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of processforge might be problematic. Click here for more details.
- {processforge-0.3.1/src/processforge.egg-info → processforge-0.3.2}/PKG-INFO +4 -6
- {processforge-0.3.1 → processforge-0.3.2}/README.md +3 -4
- {processforge-0.3.1 → processforge-0.3.2}/flowsheets/closed-loop-chain.json +1 -1
- processforge-0.3.2/flowsheets/custom/crimson/MUWS.json +216 -0
- processforge-0.3.2/flowsheets/custom/simple_hyrdaulic_scheme.json +202 -0
- {processforge-0.3.1 → processforge-0.3.2}/flowsheets/hydraulic-chain.json +3 -3
- {processforge-0.3.1 → processforge-0.3.2}/pyproject.toml +1 -2
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/__init__.py +1 -1
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/analysis/dof.py +2 -2
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/cli/apply.py +2 -1
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/cli/common.py +4 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/cli/diagram.py +2 -2
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/cli/plan.py +2 -1
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/cli/run.py +2 -1
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/units/pump_eo.py +2 -2
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/modelica/unit_equations.py +4 -4
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/schemas/flowsheet_schema.json +1 -1
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/state.py +1 -1
- processforge-0.3.2/src/processforge/units/base.py +38 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/units/cstr.py +2 -2
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/units/pfr.py +2 -2
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/units/pipes.py +2 -2
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/units/pump.py +8 -8
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/units/solver_unit.py +3 -3
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/units/strainer.py +6 -6
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/units/tank.py +2 -2
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/units/valve.py +2 -2
- {processforge-0.3.1 → processforge-0.3.2/src/processforge.egg-info}/PKG-INFO +4 -6
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge.egg-info/SOURCES.txt +3 -2
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge.egg-info/requires.txt +0 -1
- {processforge-0.3.1 → processforge-0.3.2}/tests/test_state.py +19 -19
- processforge-0.3.1/src/processforge/units/provider_mixin.py +0 -33
- processforge-0.3.1/src/processforge/units/solver.py +0 -5
- {processforge-0.3.1 → processforge-0.3.2}/LICENSE +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/MANIFEST.in +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/flowsheets/festim/hydrogen_transport_1d.json +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/flowsheets/openmc/msre_eigenvalue.json +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/setup.cfg +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/__main__.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/_schema.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/analysis/__init__.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/cli/__init__.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/cli/display.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/cli/export_fmu.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/cli/export_modelica.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/cli/init.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/cli/validate.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/compose.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/__init__.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/backends/__init__.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/backends/base.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/backends/casadi_backend.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/backends/pyomo_backend.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/backends/scipy_backend.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/flowsheet.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/jacobian.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/mixin.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/solver.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/stream_var.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/units/__init__.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/units/flash_eo.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/units/heater_eo.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/units/pipes_eo.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/units/strainer_eo.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/units/valve_eo.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/flowsheet.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/fmu/__init__.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/fmu/_fmi_vars.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/fmu/builder.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/fmu/slave_template.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/lock.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/modelica/__init__.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/modelica/mo_writer.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/modelica/omc_runner.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/modelica/transpiler.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/pcl/__init__.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/pcl/compiler.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/pcl/namespace.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/provenance.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/providers/__init__.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/providers/base.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/providers/base_jacobian_mixin.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/providers/cantera_jacobian.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/providers/cantera_provider.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/providers/coolprop_provider.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/providers/festim_provider.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/providers/jacobian_contributor.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/providers/manager.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/providers/modelica_jacobian.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/providers/modelica_provider.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/providers/openmc_provider.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/providers/reference_state_registry.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/providers/registry.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/result.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/result_schema.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/schemas/__init__.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/schemas/openmc/openmc_model.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/simulate.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/solver.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/thermo.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/types.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/units/__init__.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/units/flash.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/units/heater.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/units/registry.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/utils/__init__.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/utils/flowsheet_diagram.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/utils/mermaid_diagram.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/utils/topology.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/utils/unit_consistency.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/utils/validate_flowsheet.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge/utils/validation.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge.egg-info/dependency_links.txt +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge.egg-info/entry_points.txt +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/src/processforge.egg-info/top_level.txt +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/tests/test_cli.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/tests/test_festim_provider.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/tests/test_init.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/tests/test_providers.py +0 -0
- {processforge-0.3.1 → processforge-0.3.2}/tests/test_types.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: processforge
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.2
|
|
4
4
|
Summary: A Python-based process simulation framework for chemical engineering applications.
|
|
5
5
|
Author-email: Processforge Team <team@processforge.dev>
|
|
6
6
|
License-Expression: BSD-3-Clause
|
|
@@ -30,7 +30,6 @@ Requires-Dist: pandas>=2.2
|
|
|
30
30
|
Requires-Dist: zarr>=3.0
|
|
31
31
|
Requires-Dist: coolprop>=7.2.0
|
|
32
32
|
Requires-Dist: typer>=0.12
|
|
33
|
-
Requires-Dist: pip>=26.1.2
|
|
34
33
|
Provides-Extra: eo
|
|
35
34
|
Requires-Dist: pyomo>=6.7; extra == "eo"
|
|
36
35
|
Provides-Extra: eo-casadi
|
|
@@ -103,9 +102,9 @@ uv tool install "processforge[modelica]"
|
|
|
103
102
|
3. **Initialize, plan, and apply**
|
|
104
103
|
|
|
105
104
|
```bash
|
|
106
|
-
pf init
|
|
107
|
-
pf plan hydraulic-chain.json
|
|
108
|
-
pf apply hydraulic-chain.json
|
|
105
|
+
pf init flowsheets/hydraulic-chain.json
|
|
106
|
+
pf plan flowsheets/hydraulic-chain.json
|
|
107
|
+
pf apply flowsheets/hydraulic-chain.json
|
|
109
108
|
```
|
|
110
109
|
|
|
111
110
|
`plan` validates the flowsheet (schema, DOF, units) without running the solver; `apply` solves it and stores a snapshot.
|
|
@@ -115,7 +114,6 @@ uv tool install "processforge[modelica]"
|
|
|
115
114
|
`pf apply` writes results under `outputs/`:
|
|
116
115
|
- `*_results.zarr` — simulation results store (per-variable arrays, composition flattened)
|
|
117
116
|
- `*_results.zarr.schema.json` — schema file describing streams, variables, dtypes, units, shapes, and run provenance
|
|
118
|
-
- `*_validation.xlsx` — validation report
|
|
119
117
|
- `*.pfstate/` — versioned snapshot store with a `latest` pointer
|
|
120
118
|
|
|
121
119
|
For flowsheets with Tank units (dynamic), use `pf run` instead of `pf apply` to solve with the SM solver.
|
|
@@ -43,9 +43,9 @@ uv tool install "processforge[modelica]"
|
|
|
43
43
|
3. **Initialize, plan, and apply**
|
|
44
44
|
|
|
45
45
|
```bash
|
|
46
|
-
pf init
|
|
47
|
-
pf plan hydraulic-chain.json
|
|
48
|
-
pf apply hydraulic-chain.json
|
|
46
|
+
pf init flowsheets/hydraulic-chain.json
|
|
47
|
+
pf plan flowsheets/hydraulic-chain.json
|
|
48
|
+
pf apply flowsheets/hydraulic-chain.json
|
|
49
49
|
```
|
|
50
50
|
|
|
51
51
|
`plan` validates the flowsheet (schema, DOF, units) without running the solver; `apply` solves it and stores a snapshot.
|
|
@@ -55,7 +55,6 @@ uv tool install "processforge[modelica]"
|
|
|
55
55
|
`pf apply` writes results under `outputs/`:
|
|
56
56
|
- `*_results.zarr` — simulation results store (per-variable arrays, composition flattened)
|
|
57
57
|
- `*_results.zarr.schema.json` — schema file describing streams, variables, dtypes, units, shapes, and run provenance
|
|
58
|
-
- `*_validation.xlsx` — validation report
|
|
59
58
|
- `*.pfstate/` — versioned snapshot store with a `latest` pointer
|
|
60
59
|
|
|
61
60
|
For flowsheets with Tank units (dynamic), use `pf run` instead of `pf apply` to solve with the SM solver.
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
{
|
|
2
|
+
"metadata": {
|
|
3
|
+
"name": "Make-up Water System",
|
|
4
|
+
"description": "A two-pump, five-valve, one-strainer, one tank steady-state make-up water system.",
|
|
5
|
+
"version": "2.0"
|
|
6
|
+
},
|
|
7
|
+
"providers": {
|
|
8
|
+
"coolprop": {
|
|
9
|
+
"type": "coolprop"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"materials": {
|
|
13
|
+
"Water": {
|
|
14
|
+
"id": 1
|
|
15
|
+
},
|
|
16
|
+
"Steel": {
|
|
17
|
+
"id": 2
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"streams": {
|
|
21
|
+
"feed": {
|
|
22
|
+
"T": 313.00,
|
|
23
|
+
"P": 101325,
|
|
24
|
+
"flowrate": 1,
|
|
25
|
+
"z": { "Water": 1.0 }
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
|
|
29
|
+
"units": {
|
|
30
|
+
|
|
31
|
+
"tank_1": {
|
|
32
|
+
"type": "Tank",
|
|
33
|
+
"in": ["feed", "recycle_to_tank"],
|
|
34
|
+
"out": "after_tank_1",
|
|
35
|
+
"outlet_flow": 1.0,
|
|
36
|
+
"initial_n": {
|
|
37
|
+
"Benzene": 9.0,
|
|
38
|
+
"Toluene": 1.0
|
|
39
|
+
},
|
|
40
|
+
"initial_T": 298.15,
|
|
41
|
+
"P": 101325,
|
|
42
|
+
"duty": 0.0,
|
|
43
|
+
"material": 1
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
"pipe_1": {
|
|
47
|
+
"type": "Pipes",
|
|
48
|
+
"in": "after_tank_1",
|
|
49
|
+
"out": "after_pipe_1",
|
|
50
|
+
"delta_p": 1000.0,
|
|
51
|
+
"diameter": 0.05,
|
|
52
|
+
"material": 2
|
|
53
|
+
},
|
|
54
|
+
"global_valve_1": {
|
|
55
|
+
"type": "Valve",
|
|
56
|
+
"in": "after_pipe_1",
|
|
57
|
+
"out": "after_global_valve_1",
|
|
58
|
+
"opening": 50,
|
|
59
|
+
"pressure_ratio": 0.5,
|
|
60
|
+
"q_flowrate": 50,
|
|
61
|
+
"material": 2
|
|
62
|
+
},
|
|
63
|
+
"pipe_2": {
|
|
64
|
+
"type": "Pipes",
|
|
65
|
+
"in": "after_global_valve_1",
|
|
66
|
+
"out": "after_pipe_2",
|
|
67
|
+
"delta_p": 1000.0,
|
|
68
|
+
"diameter": 0.05,
|
|
69
|
+
"material": 2
|
|
70
|
+
},
|
|
71
|
+
|
|
72
|
+
"low_pressure_pump":{
|
|
73
|
+
"type": "Pump",
|
|
74
|
+
"in": "after_pipe_2",
|
|
75
|
+
"out": "after_low_pressure_pump",
|
|
76
|
+
"q_flowrate": 4,
|
|
77
|
+
"head": 57,
|
|
78
|
+
"efficiency": 36,
|
|
79
|
+
"power": 1.3,
|
|
80
|
+
"cap": 2.5,
|
|
81
|
+
"motor_rating": 370,
|
|
82
|
+
"design_press": 6,
|
|
83
|
+
"material": 2,
|
|
84
|
+
"delta_p": 1000.0
|
|
85
|
+
},
|
|
86
|
+
"pipe_3": {
|
|
87
|
+
"type": "Pipes",
|
|
88
|
+
"in": "after_low_pressure_pump",
|
|
89
|
+
"out": "after_pipe_3",
|
|
90
|
+
"delta_p": 1000.0,
|
|
91
|
+
"diameter": 0.05,
|
|
92
|
+
"material": 2
|
|
93
|
+
},
|
|
94
|
+
"non_return_valve_1": {
|
|
95
|
+
"type": "Valve",
|
|
96
|
+
"in": "after_pipe_3",
|
|
97
|
+
"out": "after_non_return_valve_1",
|
|
98
|
+
"q_flowrate": 4,
|
|
99
|
+
"pressure_ratio": 0.5,
|
|
100
|
+
"pressure_drop": 0.72,
|
|
101
|
+
"material": 2
|
|
102
|
+
},
|
|
103
|
+
"pipe_4": {
|
|
104
|
+
"type": "Pipes",
|
|
105
|
+
"in": "after_non_return_valve_1",
|
|
106
|
+
"out": "after_pipe_4",
|
|
107
|
+
"delta_p": 1000.0,
|
|
108
|
+
"diameter": 0.05,
|
|
109
|
+
"material": 2
|
|
110
|
+
},
|
|
111
|
+
"strainer": {
|
|
112
|
+
"type": "Strainer",
|
|
113
|
+
"in": "after_pipe_4",
|
|
114
|
+
"out": "after_strainer",
|
|
115
|
+
"q_flowrate": 4,
|
|
116
|
+
"pressure_drop": 0.192,
|
|
117
|
+
"material": 2,
|
|
118
|
+
"delta_p": 1000.0
|
|
119
|
+
},
|
|
120
|
+
"pipe_5": {
|
|
121
|
+
"type": "Pipes",
|
|
122
|
+
"in": "after_strainer",
|
|
123
|
+
"out": "after_pipe_5",
|
|
124
|
+
"delta_p": 1000.0,
|
|
125
|
+
"diameter": 0.05,
|
|
126
|
+
"material": 2
|
|
127
|
+
},
|
|
128
|
+
"global_valve_2": {
|
|
129
|
+
"type": "Valve",
|
|
130
|
+
"in": "after_pipe_5",
|
|
131
|
+
"out": "after_global_valve_2",
|
|
132
|
+
"opening": 50,
|
|
133
|
+
"q_flowrate": 50,
|
|
134
|
+
"material": 2,
|
|
135
|
+
"pressure_ratio": 0.5
|
|
136
|
+
},
|
|
137
|
+
"pipe_6": {
|
|
138
|
+
"type": "Pipes",
|
|
139
|
+
"in": "after_global_valve_2",
|
|
140
|
+
"out": "after_pipe_6",
|
|
141
|
+
"delta_p": 1000.0,
|
|
142
|
+
"diameter": 0.05,
|
|
143
|
+
"material": 2
|
|
144
|
+
},
|
|
145
|
+
"high_pressure_pump":{
|
|
146
|
+
"type": "Pump",
|
|
147
|
+
"in": "after_pipe_6",
|
|
148
|
+
"out": "after_high_pressure_pump",
|
|
149
|
+
"q_flowrate": 35,
|
|
150
|
+
"head": 32,
|
|
151
|
+
"efficiency": 25,
|
|
152
|
+
"power": 4.75,
|
|
153
|
+
"cap": 600,
|
|
154
|
+
"discharge_press": 50,
|
|
155
|
+
"motor_rating": 7.5,
|
|
156
|
+
"relief_press": 200,
|
|
157
|
+
"material": 2,
|
|
158
|
+
"delta_p": 1000.0
|
|
159
|
+
},
|
|
160
|
+
"pipe_7": {
|
|
161
|
+
"type": "Pipes",
|
|
162
|
+
"in": "after_high_pressure_pump",
|
|
163
|
+
"out": "after_pipe_7",
|
|
164
|
+
"delta_p": 1000.0,
|
|
165
|
+
"diameter": 0.05,
|
|
166
|
+
"material": 2
|
|
167
|
+
},
|
|
168
|
+
"non_return_valve_2": {
|
|
169
|
+
"type": "Valve",
|
|
170
|
+
"in": "after_pipe_7",
|
|
171
|
+
"out": "after_non_return_valve_2",
|
|
172
|
+
"q_flowrate": 4,
|
|
173
|
+
"pressure_drop": 0.72,
|
|
174
|
+
"material": 2,
|
|
175
|
+
"pressure_ratio": 0.5
|
|
176
|
+
},
|
|
177
|
+
"pipe_8": {
|
|
178
|
+
"type": "Pipes",
|
|
179
|
+
"in": "after_non_return_valve_2",
|
|
180
|
+
"out": "after_pipe_8",
|
|
181
|
+
"delta_p": 1000.0,
|
|
182
|
+
"diameter": 0.05,
|
|
183
|
+
"material": 2
|
|
184
|
+
},
|
|
185
|
+
"global_valve_3": {
|
|
186
|
+
"type": "Valve",
|
|
187
|
+
"in": "after_pipe_8",
|
|
188
|
+
"out": "after_valve_3",
|
|
189
|
+
"opening": 50,
|
|
190
|
+
"q_flowrate": 50,
|
|
191
|
+
"material": 2,
|
|
192
|
+
"pressure_ratio": 0.5
|
|
193
|
+
},
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
"pipe_9": {
|
|
197
|
+
"type": "Pipes",
|
|
198
|
+
"in": "after_valve_3",
|
|
199
|
+
"out": "recycle_to_tank",
|
|
200
|
+
"delta_p": 1000.0,
|
|
201
|
+
"diameter": 0.08,
|
|
202
|
+
"material": 2
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
},
|
|
206
|
+
"simulation": {
|
|
207
|
+
"mode": "dynamic",
|
|
208
|
+
"t0": 0.0,
|
|
209
|
+
"tf": 17.0,
|
|
210
|
+
"dt": 1.0,
|
|
211
|
+
"backend": "scipy"
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
{
|
|
2
|
+
"metadata": {
|
|
3
|
+
"name": "Hydraulic Chain Example",
|
|
4
|
+
"description": "A two-pump, one-valve, one-strainer steady-state hydraulic system.",
|
|
5
|
+
"version": "2.0"
|
|
6
|
+
},
|
|
7
|
+
"providers": {
|
|
8
|
+
"coolprop": {
|
|
9
|
+
"type": "coolprop"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"materials": {
|
|
13
|
+
"Benzene": {
|
|
14
|
+
"id": 1
|
|
15
|
+
},
|
|
16
|
+
"Toluene": {
|
|
17
|
+
"id": 2
|
|
18
|
+
},
|
|
19
|
+
"Steel": {
|
|
20
|
+
"id": 3
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"material_mixes": {
|
|
24
|
+
"Benzene_Toluene_Mix": {
|
|
25
|
+
"friendly_material_mix_id": 1,
|
|
26
|
+
"percent_type": "ao",
|
|
27
|
+
"components": [
|
|
28
|
+
{"name": "Benzene", "fraction": 0.8},
|
|
29
|
+
{"name": "Toluene", "fraction": 0.2}
|
|
30
|
+
]
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"streams": {
|
|
34
|
+
"feed": {
|
|
35
|
+
"T": 298.15,
|
|
36
|
+
"P": 101325,
|
|
37
|
+
"flowrate": 38,
|
|
38
|
+
"material_mix": 1
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"units": {
|
|
42
|
+
"pipe_1": {
|
|
43
|
+
"type": "Pipes",
|
|
44
|
+
"in": "feed",
|
|
45
|
+
"out": "after_pipe_1",
|
|
46
|
+
"delta_p": 1000.0,
|
|
47
|
+
"diameter": 0.040,
|
|
48
|
+
"material": 3
|
|
49
|
+
},
|
|
50
|
+
"valve_1": {
|
|
51
|
+
"type": "Valve",
|
|
52
|
+
"in": "after_pipe_1",
|
|
53
|
+
"out": "after_valve_1",
|
|
54
|
+
"pressure_ratio": 0.5,
|
|
55
|
+
"material": 3
|
|
56
|
+
},
|
|
57
|
+
"pipe_2": {
|
|
58
|
+
"type": "Pipes",
|
|
59
|
+
"in": "after_valve_1",
|
|
60
|
+
"out": "after_pipe_2",
|
|
61
|
+
"delta_p": 1000.0,
|
|
62
|
+
"diameter": 0.08,
|
|
63
|
+
"material": 3
|
|
64
|
+
},
|
|
65
|
+
"pump_1": {
|
|
66
|
+
"type": "Pump",
|
|
67
|
+
"in": "after_pipe_2",
|
|
68
|
+
"out": "after_pump_1",
|
|
69
|
+
"delta_p": 600000.0,
|
|
70
|
+
"efficiency": 0.75,
|
|
71
|
+
"material": 3
|
|
72
|
+
},
|
|
73
|
+
"pipe_3": {
|
|
74
|
+
"type": "Pipes",
|
|
75
|
+
"in": "after_pump_1",
|
|
76
|
+
"out": "after_pipe_3",
|
|
77
|
+
"delta_p": 1000.0,
|
|
78
|
+
"diameter": 0.08,
|
|
79
|
+
"material": 3
|
|
80
|
+
},
|
|
81
|
+
"strainer_1": {
|
|
82
|
+
"type": "Strainer",
|
|
83
|
+
"in": "after_pipe_3",
|
|
84
|
+
"out": "after_strainer_1",
|
|
85
|
+
"delta_p": 5000.0,
|
|
86
|
+
"material": 3
|
|
87
|
+
},
|
|
88
|
+
"pipe_4": {
|
|
89
|
+
"type": "Pipes",
|
|
90
|
+
"in": "after_strainer_1",
|
|
91
|
+
"out": "after_pipe_4",
|
|
92
|
+
"delta_p": 1000.0,
|
|
93
|
+
"diameter": 0.08,
|
|
94
|
+
"material": 3
|
|
95
|
+
},
|
|
96
|
+
"pipe_1a": {
|
|
97
|
+
"type": "Pipes",
|
|
98
|
+
"in": "after_strainer_1",
|
|
99
|
+
"out": "after_pipe_1a",
|
|
100
|
+
"delta_p": 1000.0,
|
|
101
|
+
"diameter": 0.08,
|
|
102
|
+
"material": 3
|
|
103
|
+
},
|
|
104
|
+
"valve_1a": {
|
|
105
|
+
"type": "Valve",
|
|
106
|
+
"in": "after_pipe_1a",
|
|
107
|
+
"out": "after_valve_1a",
|
|
108
|
+
"pressure_ratio": 0.5,
|
|
109
|
+
"material": 3
|
|
110
|
+
},
|
|
111
|
+
"pipe_2a": {
|
|
112
|
+
"type": "Pipes",
|
|
113
|
+
"in": "after_valve_1a",
|
|
114
|
+
"out": "after_pipe_2a",
|
|
115
|
+
"delta_p": 1000.0,
|
|
116
|
+
"diameter": 0.08,
|
|
117
|
+
"material": 3
|
|
118
|
+
},
|
|
119
|
+
"valve_2": {
|
|
120
|
+
"type": "Valve",
|
|
121
|
+
"in": "after_pipe_4",
|
|
122
|
+
"out": "after_valve_2",
|
|
123
|
+
"pressure_ratio": 0.5,
|
|
124
|
+
"material": 3
|
|
125
|
+
},
|
|
126
|
+
"pipe_5": {
|
|
127
|
+
"type": "Pipes",
|
|
128
|
+
"in": "after_valve_2",
|
|
129
|
+
"out": "after_pipe_5",
|
|
130
|
+
"delta_p": 1000.0,
|
|
131
|
+
"diameter": 0.08,
|
|
132
|
+
"material": 3
|
|
133
|
+
},
|
|
134
|
+
"pump_2": {
|
|
135
|
+
"type": "Pump",
|
|
136
|
+
"in": "after_pipe_5",
|
|
137
|
+
"out": "after_pump_2",
|
|
138
|
+
"delta_p": 600000.0,
|
|
139
|
+
"efficiency": 0.75,
|
|
140
|
+
"material": 3
|
|
141
|
+
},
|
|
142
|
+
"pipe_6": {
|
|
143
|
+
"type": "Pipes",
|
|
144
|
+
"in": "after_pump_2",
|
|
145
|
+
"out": "after_pipe_6",
|
|
146
|
+
"delta_p": 1000.0,
|
|
147
|
+
"diameter": 0.08,
|
|
148
|
+
"material": 3
|
|
149
|
+
},
|
|
150
|
+
"valve_3": {
|
|
151
|
+
"type": "Valve",
|
|
152
|
+
"in": "after_pipe_6",
|
|
153
|
+
"out": "after_valve_3",
|
|
154
|
+
"pressure_ratio": 0.5,
|
|
155
|
+
"material": 3
|
|
156
|
+
},
|
|
157
|
+
"pipe_7": {
|
|
158
|
+
"type": "Pipes",
|
|
159
|
+
"in": "after_valve_3",
|
|
160
|
+
"out": "after_pipe_7",
|
|
161
|
+
"delta_p": 1000.0,
|
|
162
|
+
"diameter": 0.08,
|
|
163
|
+
"material": 3
|
|
164
|
+
},
|
|
165
|
+
"valve_4": {
|
|
166
|
+
"type": "Valve",
|
|
167
|
+
"in": "after_pipe_7",
|
|
168
|
+
"out": "after_valve_4",
|
|
169
|
+
"pressure_ratio": 0.5,
|
|
170
|
+
"material": 3
|
|
171
|
+
},
|
|
172
|
+
"pipe_8": {
|
|
173
|
+
"type": "Pipes",
|
|
174
|
+
"in": "after_valve_4",
|
|
175
|
+
"out": "after_pipe_8",
|
|
176
|
+
"delta_p": 1000.0,
|
|
177
|
+
"diameter": 0.08,
|
|
178
|
+
"material": 3
|
|
179
|
+
},
|
|
180
|
+
"valve_5": {
|
|
181
|
+
"type": "Valve",
|
|
182
|
+
"in": ["after_pipe_8","after_pipe_2a"],
|
|
183
|
+
"out": "after_valve_5",
|
|
184
|
+
"pressure_ratio": 0.5,
|
|
185
|
+
"material": 3
|
|
186
|
+
},
|
|
187
|
+
"pipe_9": {
|
|
188
|
+
"type": "Pipes",
|
|
189
|
+
"in": "after_valve_5",
|
|
190
|
+
"out": "after_pipe_9",
|
|
191
|
+
"delta_p": 1000.0,
|
|
192
|
+
"diameter": 0.025,
|
|
193
|
+
"material": 3
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
},
|
|
197
|
+
"simulation": {
|
|
198
|
+
"mode":"dynamic",
|
|
199
|
+
"t_final": 20,
|
|
200
|
+
"t_step": 1
|
|
201
|
+
}
|
|
202
|
+
}
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"type": "Pump",
|
|
44
44
|
"in": "feed",
|
|
45
45
|
"out": "after_pump_1",
|
|
46
|
-
"
|
|
46
|
+
"delta_p": 100000.0,
|
|
47
47
|
"efficiency": 0.75,
|
|
48
48
|
"material": 3
|
|
49
49
|
},
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
"type": "Strainer",
|
|
75
75
|
"in": "after_pipe_2",
|
|
76
76
|
"out": "after_strainer_1",
|
|
77
|
-
"
|
|
77
|
+
"delta_p": 5000.0,
|
|
78
78
|
"material": 3
|
|
79
79
|
},
|
|
80
80
|
"pipe_3": {
|
|
@@ -89,7 +89,7 @@
|
|
|
89
89
|
"type": "Pump",
|
|
90
90
|
"in": "after_pipe_3",
|
|
91
91
|
"out": "after_pump_2",
|
|
92
|
-
"
|
|
92
|
+
"delta_p": 200000.0,
|
|
93
93
|
"efficiency": 0.8,
|
|
94
94
|
"material": 3
|
|
95
95
|
},
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "processforge"
|
|
7
|
-
version = "0.3.
|
|
7
|
+
version = "0.3.2"
|
|
8
8
|
description = "A Python-based process simulation framework for chemical engineering applications."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "BSD-3-Clause"
|
|
@@ -36,7 +36,6 @@ dependencies = [
|
|
|
36
36
|
"zarr>=3.0",
|
|
37
37
|
"coolprop>=7.2.0",
|
|
38
38
|
"typer>=0.12",
|
|
39
|
-
"pip>=26.1.2",
|
|
40
39
|
]
|
|
41
40
|
|
|
42
41
|
[project.optional-dependencies]
|
|
@@ -29,9 +29,9 @@ class SystemDOFReport:
|
|
|
29
29
|
# - a string means the key must be present
|
|
30
30
|
# - a tuple means at least one of the keys must be present
|
|
31
31
|
_UNIT_REQUIRED: dict[str, list] = {
|
|
32
|
-
"Pump": ["
|
|
32
|
+
"Pump": ["delta_p"],
|
|
33
33
|
"Valve": ["pressure_ratio"],
|
|
34
|
-
"Strainer": ["
|
|
34
|
+
"Strainer": ["delta_p"],
|
|
35
35
|
"Pipes": ["delta_p", "diameter"],
|
|
36
36
|
"Heater": [("duty", "outlet_T")], # at least one of these
|
|
37
37
|
"Flash": ["P"],
|
|
@@ -17,6 +17,7 @@ from .common import (
|
|
|
17
17
|
build_divergence_report,
|
|
18
18
|
build_run_metadata,
|
|
19
19
|
check_providers,
|
|
20
|
+
flowsheet_basename,
|
|
20
21
|
load_state_manager,
|
|
21
22
|
log_residual_breakdown,
|
|
22
23
|
output_root,
|
|
@@ -58,7 +59,7 @@ def apply(
|
|
|
58
59
|
# Check provider availability
|
|
59
60
|
check_providers(config, flowsheet)
|
|
60
61
|
|
|
61
|
-
base_name =
|
|
62
|
+
base_name = flowsheet_basename(flowsheet)
|
|
62
63
|
|
|
63
64
|
sim_cfg = config.get("simulation", {})
|
|
64
65
|
mode = sim_cfg.get("mode", "steady")
|
|
@@ -34,6 +34,10 @@ def output_root() -> str:
|
|
|
34
34
|
return os.environ.get("PROCESSFORGE_OUTPUT_DIR", "outputs")
|
|
35
35
|
|
|
36
36
|
|
|
37
|
+
def flowsheet_basename(path: str) -> str:
|
|
38
|
+
return os.path.splitext(os.path.basename(path))[0]
|
|
39
|
+
|
|
40
|
+
|
|
37
41
|
def require_existing_file(path: str, label: str = "Flowsheet file") -> None:
|
|
38
42
|
"""Fail fast with a consistent message when an input path is missing."""
|
|
39
43
|
if not os.path.exists(path):
|
|
@@ -10,7 +10,7 @@ import typer
|
|
|
10
10
|
from loguru import logger
|
|
11
11
|
|
|
12
12
|
from ..utils.flowsheet_diagram import draw_flowsheet
|
|
13
|
-
from .common import require_existing_file
|
|
13
|
+
from .common import flowsheet_basename, require_existing_file
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
def diagram(
|
|
@@ -41,7 +41,7 @@ def diagram(
|
|
|
41
41
|
output_dir = output_dir or "diagrams"
|
|
42
42
|
fmt = format or "png"
|
|
43
43
|
|
|
44
|
-
base_name =
|
|
44
|
+
base_name = flowsheet_basename(flowsheet)
|
|
45
45
|
|
|
46
46
|
try:
|
|
47
47
|
output_path = draw_flowsheet(
|
|
@@ -12,6 +12,7 @@ from ..utils.validate_flowsheet import validate_flowsheet_dict
|
|
|
12
12
|
from ..state import StateManager
|
|
13
13
|
from ..utils.mermaid_diagram import generate_mermaid
|
|
14
14
|
from .common import (
|
|
15
|
+
flowsheet_basename,
|
|
15
16
|
load_state_manager,
|
|
16
17
|
output_root,
|
|
17
18
|
require_existing_file,
|
|
@@ -89,7 +90,7 @@ def plan(
|
|
|
89
90
|
)
|
|
90
91
|
|
|
91
92
|
# Step 6: Structural diff vs. saved state
|
|
92
|
-
base_name =
|
|
93
|
+
base_name = flowsheet_basename(flowsheet)
|
|
93
94
|
outputs_dir = output_root()
|
|
94
95
|
sm, state = load_state_manager(outputs_dir, base_name)
|
|
95
96
|
diff = None
|
|
@@ -14,6 +14,7 @@ from ..result import plot_results, plot_timeseries, save_results_zarr
|
|
|
14
14
|
from ..state import StateManager
|
|
15
15
|
from .common import (
|
|
16
16
|
check_providers,
|
|
17
|
+
flowsheet_basename,
|
|
17
18
|
output_root,
|
|
18
19
|
require_existing_file,
|
|
19
20
|
validate_runtime_flowsheet,
|
|
@@ -35,7 +36,7 @@ def run(
|
|
|
35
36
|
# Check provider availability
|
|
36
37
|
check_providers(config, flowsheet)
|
|
37
38
|
|
|
38
|
-
base_name =
|
|
39
|
+
base_name = flowsheet_basename(flowsheet)
|
|
39
40
|
outputs_dir = output_root()
|
|
40
41
|
|
|
41
42
|
sim_cfg = config.get("simulation", {})
|
|
@@ -35,7 +35,7 @@ class PumpEOMixin(EOUnitModelMixin):
|
|
|
35
35
|
except ImportError as exc:
|
|
36
36
|
raise ImportError("PyomoBackend requires 'pyomo'.") from exc
|
|
37
37
|
|
|
38
|
-
delta_p = self.
|
|
38
|
+
delta_p = self.delta_p # type: ignore[attr-defined]
|
|
39
39
|
eta = max(self.efficiency, 1e-6) # type: ignore[attr-defined]
|
|
40
40
|
dt_pump = delta_p / (_RHO * _CP * eta) # K per (Pa / (rho*Cp*eta))
|
|
41
41
|
|
|
@@ -66,7 +66,7 @@ class PumpEOMixin(EOUnitModelMixin):
|
|
|
66
66
|
outlet_syms: dict,
|
|
67
67
|
config: dict,
|
|
68
68
|
) -> list:
|
|
69
|
-
delta_p = self.
|
|
69
|
+
delta_p = self.delta_p # type: ignore[attr-defined]
|
|
70
70
|
eta = max(self.efficiency, 1e-6) # type: ignore[attr-defined]
|
|
71
71
|
dt_pump = delta_p / (_RHO * _CP * eta)
|
|
72
72
|
|
|
@@ -77,7 +77,7 @@ def pump_eq(
|
|
|
77
77
|
sn = _sanitize_name(name)
|
|
78
78
|
i, o = _sanitize_name(inlet), _sanitize_name(outlet)
|
|
79
79
|
lines = [f" // [{name}] Pump"]
|
|
80
|
-
lines.append(f" {o}_P = {i}_P + {sn}
|
|
80
|
+
lines.append(f" {o}_P = {i}_P + {sn}_delta_p;")
|
|
81
81
|
# Simplified adiabatic: T_out = T_in (ignoring small rise)
|
|
82
82
|
lines.append(f" {o}_T = {i}_T;")
|
|
83
83
|
lines.append(f" {o}_F = {i}_F;")
|
|
@@ -145,9 +145,9 @@ def strainer_eq(
|
|
|
145
145
|
sn = _sanitize_name(name)
|
|
146
146
|
i, o = _sanitize_name(inlet), _sanitize_name(outlet)
|
|
147
147
|
lines = [f" // [{name}] Strainer"]
|
|
148
|
-
delta_p = cfg.get("
|
|
148
|
+
delta_p = cfg.get("delta_p", 0.0)
|
|
149
149
|
if delta_p != 0.0:
|
|
150
|
-
lines.append(f" {o}_P = {i}_P - {sn}
|
|
150
|
+
lines.append(f" {o}_P = {i}_P - {sn}_delta_p;")
|
|
151
151
|
else:
|
|
152
152
|
lines.append(f" {o}_P = {i}_P;")
|
|
153
153
|
lines.append(f" {o}_T = {i}_T;")
|
|
@@ -169,7 +169,7 @@ def pipes_eq(
|
|
|
169
169
|
sn = _sanitize_name(name)
|
|
170
170
|
i, o = _sanitize_name(inlet), _sanitize_name(outlet)
|
|
171
171
|
lines = [f" // [{name}] Pipes"]
|
|
172
|
-
delta_p = cfg.get("delta_p", cfg.get("
|
|
172
|
+
delta_p = cfg.get("delta_p", cfg.get("delta_p", 0.0))
|
|
173
173
|
if delta_p != 0.0:
|
|
174
174
|
lines.append(f" {o}_P = {i}_P - {sn}_delta_p;")
|
|
175
175
|
else:
|