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.

Files changed (120) hide show
  1. {processforge-0.3.1/src/processforge.egg-info → processforge-0.3.2}/PKG-INFO +4 -6
  2. {processforge-0.3.1 → processforge-0.3.2}/README.md +3 -4
  3. {processforge-0.3.1 → processforge-0.3.2}/flowsheets/closed-loop-chain.json +1 -1
  4. processforge-0.3.2/flowsheets/custom/crimson/MUWS.json +216 -0
  5. processforge-0.3.2/flowsheets/custom/simple_hyrdaulic_scheme.json +202 -0
  6. {processforge-0.3.1 → processforge-0.3.2}/flowsheets/hydraulic-chain.json +3 -3
  7. {processforge-0.3.1 → processforge-0.3.2}/pyproject.toml +1 -2
  8. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/__init__.py +1 -1
  9. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/analysis/dof.py +2 -2
  10. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/cli/apply.py +2 -1
  11. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/cli/common.py +4 -0
  12. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/cli/diagram.py +2 -2
  13. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/cli/plan.py +2 -1
  14. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/cli/run.py +2 -1
  15. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/units/pump_eo.py +2 -2
  16. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/modelica/unit_equations.py +4 -4
  17. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/schemas/flowsheet_schema.json +1 -1
  18. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/state.py +1 -1
  19. processforge-0.3.2/src/processforge/units/base.py +38 -0
  20. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/units/cstr.py +2 -2
  21. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/units/pfr.py +2 -2
  22. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/units/pipes.py +2 -2
  23. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/units/pump.py +8 -8
  24. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/units/solver_unit.py +3 -3
  25. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/units/strainer.py +6 -6
  26. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/units/tank.py +2 -2
  27. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/units/valve.py +2 -2
  28. {processforge-0.3.1 → processforge-0.3.2/src/processforge.egg-info}/PKG-INFO +4 -6
  29. {processforge-0.3.1 → processforge-0.3.2}/src/processforge.egg-info/SOURCES.txt +3 -2
  30. {processforge-0.3.1 → processforge-0.3.2}/src/processforge.egg-info/requires.txt +0 -1
  31. {processforge-0.3.1 → processforge-0.3.2}/tests/test_state.py +19 -19
  32. processforge-0.3.1/src/processforge/units/provider_mixin.py +0 -33
  33. processforge-0.3.1/src/processforge/units/solver.py +0 -5
  34. {processforge-0.3.1 → processforge-0.3.2}/LICENSE +0 -0
  35. {processforge-0.3.1 → processforge-0.3.2}/MANIFEST.in +0 -0
  36. {processforge-0.3.1 → processforge-0.3.2}/flowsheets/festim/hydrogen_transport_1d.json +0 -0
  37. {processforge-0.3.1 → processforge-0.3.2}/flowsheets/openmc/msre_eigenvalue.json +0 -0
  38. {processforge-0.3.1 → processforge-0.3.2}/setup.cfg +0 -0
  39. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/__main__.py +0 -0
  40. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/_schema.py +0 -0
  41. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/analysis/__init__.py +0 -0
  42. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/cli/__init__.py +0 -0
  43. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/cli/display.py +0 -0
  44. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/cli/export_fmu.py +0 -0
  45. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/cli/export_modelica.py +0 -0
  46. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/cli/init.py +0 -0
  47. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/cli/validate.py +0 -0
  48. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/compose.py +0 -0
  49. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/__init__.py +0 -0
  50. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/backends/__init__.py +0 -0
  51. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/backends/base.py +0 -0
  52. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/backends/casadi_backend.py +0 -0
  53. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/backends/pyomo_backend.py +0 -0
  54. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/backends/scipy_backend.py +0 -0
  55. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/flowsheet.py +0 -0
  56. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/jacobian.py +0 -0
  57. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/mixin.py +0 -0
  58. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/solver.py +0 -0
  59. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/stream_var.py +0 -0
  60. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/units/__init__.py +0 -0
  61. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/units/flash_eo.py +0 -0
  62. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/units/heater_eo.py +0 -0
  63. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/units/pipes_eo.py +0 -0
  64. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/units/strainer_eo.py +0 -0
  65. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/eo/units/valve_eo.py +0 -0
  66. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/flowsheet.py +0 -0
  67. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/fmu/__init__.py +0 -0
  68. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/fmu/_fmi_vars.py +0 -0
  69. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/fmu/builder.py +0 -0
  70. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/fmu/slave_template.py +0 -0
  71. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/lock.py +0 -0
  72. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/modelica/__init__.py +0 -0
  73. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/modelica/mo_writer.py +0 -0
  74. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/modelica/omc_runner.py +0 -0
  75. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/modelica/transpiler.py +0 -0
  76. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/pcl/__init__.py +0 -0
  77. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/pcl/compiler.py +0 -0
  78. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/pcl/namespace.py +0 -0
  79. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/provenance.py +0 -0
  80. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/providers/__init__.py +0 -0
  81. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/providers/base.py +0 -0
  82. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/providers/base_jacobian_mixin.py +0 -0
  83. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/providers/cantera_jacobian.py +0 -0
  84. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/providers/cantera_provider.py +0 -0
  85. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/providers/coolprop_provider.py +0 -0
  86. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/providers/festim_provider.py +0 -0
  87. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/providers/jacobian_contributor.py +0 -0
  88. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/providers/manager.py +0 -0
  89. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/providers/modelica_jacobian.py +0 -0
  90. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/providers/modelica_provider.py +0 -0
  91. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/providers/openmc_provider.py +0 -0
  92. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/providers/reference_state_registry.py +0 -0
  93. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/providers/registry.py +0 -0
  94. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/result.py +0 -0
  95. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/result_schema.py +0 -0
  96. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/schemas/__init__.py +0 -0
  97. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/schemas/openmc/openmc_model.py +0 -0
  98. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/simulate.py +0 -0
  99. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/solver.py +0 -0
  100. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/thermo.py +0 -0
  101. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/types.py +0 -0
  102. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/units/__init__.py +0 -0
  103. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/units/flash.py +0 -0
  104. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/units/heater.py +0 -0
  105. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/units/registry.py +0 -0
  106. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/utils/__init__.py +0 -0
  107. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/utils/flowsheet_diagram.py +0 -0
  108. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/utils/mermaid_diagram.py +0 -0
  109. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/utils/topology.py +0 -0
  110. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/utils/unit_consistency.py +0 -0
  111. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/utils/validate_flowsheet.py +0 -0
  112. {processforge-0.3.1 → processforge-0.3.2}/src/processforge/utils/validation.py +0 -0
  113. {processforge-0.3.1 → processforge-0.3.2}/src/processforge.egg-info/dependency_links.txt +0 -0
  114. {processforge-0.3.1 → processforge-0.3.2}/src/processforge.egg-info/entry_points.txt +0 -0
  115. {processforge-0.3.1 → processforge-0.3.2}/src/processforge.egg-info/top_level.txt +0 -0
  116. {processforge-0.3.1 → processforge-0.3.2}/tests/test_cli.py +0 -0
  117. {processforge-0.3.1 → processforge-0.3.2}/tests/test_festim_provider.py +0 -0
  118. {processforge-0.3.1 → processforge-0.3.2}/tests/test_init.py +0 -0
  119. {processforge-0.3.1 → processforge-0.3.2}/tests/test_providers.py +0 -0
  120. {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.1
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.
@@ -118,7 +118,7 @@
118
118
  "type": "Pump",
119
119
  "in": "before_pump_1",
120
120
  "out": "after_pump_1",
121
- "deltaP": 200000.0,
121
+ "delta_p": 200000.0,
122
122
  "efficiency": 0.75,
123
123
  "material": 3
124
124
  },
@@ -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
- "deltaP": 100000.0,
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
- "deltaP": 5000.0,
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
- "deltaP": 200000.0,
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.1"
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,7 +29,7 @@ from .units.flash import Flash
29
29
  from .units.heater import Heater
30
30
  from .eo import EOFlowsheet, EOSolver
31
31
 
32
- __version__ = "0.3.0"
32
+ __version__ = "0.3.2"
33
33
 
34
34
  __all__ = [
35
35
  "Flowsheet",
@@ -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": ["deltaP"],
32
+ "Pump": ["delta_p"],
33
33
  "Valve": ["pressure_ratio"],
34
- "Strainer": ["deltaP"],
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 = os.path.splitext(os.path.basename(flowsheet))[0]
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 = os.path.splitext(os.path.basename(flowsheet))[0]
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 = os.path.splitext(os.path.basename(flowsheet))[0]
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 = os.path.splitext(os.path.basename(flowsheet))[0]
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.deltaP # type: ignore[attr-defined]
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.deltaP # type: ignore[attr-defined]
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}_deltaP;")
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("deltaP", 0.0)
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}_deltaP;")
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("deltaP", 0.0))
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: