processforge 0.2.40__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.2.40 → processforge-0.3.2}/PKG-INFO +10 -8
- {processforge-0.2.40 → processforge-0.3.2}/README.md +9 -7
- {processforge-0.2.40 → 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.2.40 → processforge-0.3.2}/flowsheets/hydraulic-chain.json +3 -3
- {processforge-0.2.40 → processforge-0.3.2}/pyproject.toml +1 -1
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/__init__.py +1 -1
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/analysis/dof.py +2 -2
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/cli/apply.py +2 -1
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/cli/common.py +4 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/cli/diagram.py +2 -2
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/cli/plan.py +2 -1
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/cli/run.py +2 -1
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/units/pump_eo.py +2 -2
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/modelica/unit_equations.py +4 -4
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/result.py +163 -57
- processforge-0.3.2/src/processforge/result_schema.py +26 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/schemas/flowsheet_schema.json +1 -1
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/state.py +1 -1
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/types.py +51 -115
- processforge-0.3.2/src/processforge/units/base.py +38 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/units/cstr.py +2 -2
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/units/pfr.py +2 -2
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/units/pipes.py +2 -2
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/units/pump.py +8 -8
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/units/solver_unit.py +3 -3
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/units/strainer.py +6 -6
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/units/tank.py +2 -2
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/units/valve.py +2 -2
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge.egg-info/PKG-INFO +10 -8
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge.egg-info/SOURCES.txt +6 -3
- {processforge-0.2.40 → processforge-0.3.2}/tests/test_state.py +19 -19
- processforge-0.3.2/tests/test_types.py +440 -0
- processforge-0.2.40/src/processforge/units/provider_mixin.py +0 -33
- processforge-0.2.40/src/processforge/units/solver.py +0 -5
- {processforge-0.2.40 → processforge-0.3.2}/LICENSE +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/MANIFEST.in +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/flowsheets/festim/hydrogen_transport_1d.json +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/flowsheets/openmc/msre_eigenvalue.json +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/setup.cfg +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/__main__.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/_schema.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/analysis/__init__.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/cli/__init__.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/cli/display.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/cli/export_fmu.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/cli/export_modelica.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/cli/init.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/cli/validate.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/compose.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/__init__.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/backends/__init__.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/backends/base.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/backends/casadi_backend.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/backends/pyomo_backend.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/backends/scipy_backend.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/flowsheet.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/jacobian.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/mixin.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/solver.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/stream_var.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/units/__init__.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/units/flash_eo.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/units/heater_eo.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/units/pipes_eo.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/units/strainer_eo.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/units/valve_eo.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/flowsheet.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/fmu/__init__.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/fmu/_fmi_vars.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/fmu/builder.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/fmu/slave_template.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/lock.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/modelica/__init__.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/modelica/mo_writer.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/modelica/omc_runner.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/modelica/transpiler.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/pcl/__init__.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/pcl/compiler.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/pcl/namespace.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/provenance.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/providers/__init__.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/providers/base.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/providers/base_jacobian_mixin.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/providers/cantera_jacobian.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/providers/cantera_provider.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/providers/coolprop_provider.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/providers/festim_provider.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/providers/jacobian_contributor.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/providers/manager.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/providers/modelica_jacobian.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/providers/modelica_provider.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/providers/openmc_provider.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/providers/reference_state_registry.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/providers/registry.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/schemas/__init__.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/schemas/openmc/openmc_model.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/simulate.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/solver.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/thermo.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/units/__init__.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/units/flash.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/units/heater.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/units/registry.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/utils/__init__.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/utils/flowsheet_diagram.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/utils/mermaid_diagram.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/utils/topology.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/utils/unit_consistency.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/utils/validate_flowsheet.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge/utils/validation.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge.egg-info/dependency_links.txt +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge.egg-info/entry_points.txt +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge.egg-info/requires.txt +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/src/processforge.egg-info/top_level.txt +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/tests/test_cli.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/tests/test_festim_provider.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/tests/test_init.py +0 -0
- {processforge-0.2.40 → processforge-0.3.2}/tests/test_providers.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: processforge
|
|
3
|
-
Version: 0.2
|
|
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
|
|
@@ -102,9 +102,9 @@ uv tool install "processforge[modelica]"
|
|
|
102
102
|
3. **Initialize, plan, and apply**
|
|
103
103
|
|
|
104
104
|
```bash
|
|
105
|
-
pf init
|
|
106
|
-
pf plan hydraulic-chain.json
|
|
107
|
-
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
|
|
108
108
|
```
|
|
109
109
|
|
|
110
110
|
`plan` validates the flowsheet (schema, DOF, units) without running the solver; `apply` solves it and stores a snapshot.
|
|
@@ -112,8 +112,8 @@ uv tool install "processforge[modelica]"
|
|
|
112
112
|
4. **Look at the output**
|
|
113
113
|
|
|
114
114
|
`pf apply` writes results under `outputs/`:
|
|
115
|
-
- `*_results.zarr` — simulation results store
|
|
116
|
-
- `*
|
|
115
|
+
- `*_results.zarr` — simulation results store (per-variable arrays, composition flattened)
|
|
116
|
+
- `*_results.zarr.schema.json` — schema file describing streams, variables, dtypes, units, shapes, and run provenance
|
|
117
117
|
- `*.pfstate/` — versioned snapshot store with a `latest` pointer
|
|
118
118
|
|
|
119
119
|
For flowsheets with Tank units (dynamic), use `pf run` instead of `pf apply` to solve with the SM solver.
|
|
@@ -127,8 +127,10 @@ fs = EOFlowsheet(config, backend="scipy")
|
|
|
127
127
|
results = fs.run()
|
|
128
128
|
```
|
|
129
129
|
|
|
130
|
-
## Usage
|
|
131
|
-
|
|
130
|
+
## Usage
|
|
131
|
+
See the [usage guide](docs/usage.md) for CLI commands and workflows.
|
|
132
|
+
|
|
133
|
+
Individual providers (e.g. FESTIM, OpenMC) can be run via Docker images using the provider image contract.
|
|
132
134
|
|
|
133
135
|
## Flowsheets
|
|
134
136
|
The core of Processforge is the flowsheet JSON format, which defines materials, units, and recycle rules. See below for more information on the formats and example flowsheets.
|
|
@@ -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.
|
|
@@ -53,8 +53,8 @@ uv tool install "processforge[modelica]"
|
|
|
53
53
|
4. **Look at the output**
|
|
54
54
|
|
|
55
55
|
`pf apply` writes results under `outputs/`:
|
|
56
|
-
- `*_results.zarr` — simulation results store
|
|
57
|
-
- `*
|
|
56
|
+
- `*_results.zarr` — simulation results store (per-variable arrays, composition flattened)
|
|
57
|
+
- `*_results.zarr.schema.json` — schema file describing streams, variables, dtypes, units, shapes, and run provenance
|
|
58
58
|
- `*.pfstate/` — versioned snapshot store with a `latest` pointer
|
|
59
59
|
|
|
60
60
|
For flowsheets with Tank units (dynamic), use `pf run` instead of `pf apply` to solve with the SM solver.
|
|
@@ -68,8 +68,10 @@ fs = EOFlowsheet(config, backend="scipy")
|
|
|
68
68
|
results = fs.run()
|
|
69
69
|
```
|
|
70
70
|
|
|
71
|
-
## Usage
|
|
72
|
-
|
|
71
|
+
## Usage
|
|
72
|
+
See the [usage guide](docs/usage.md) for CLI commands and workflows.
|
|
73
|
+
|
|
74
|
+
Individual providers (e.g. FESTIM, OpenMC) can be run via Docker images using the provider image contract.
|
|
73
75
|
|
|
74
76
|
## Flowsheets
|
|
75
77
|
The core of Processforge is the flowsheet JSON format, which defines materials, units, and recycle rules. See below for more information on the formats and example flowsheets.
|
|
@@ -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.2
|
|
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"
|
|
@@ -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
|
|