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.

Files changed (120) hide show
  1. {processforge-0.2.40 → processforge-0.3.2}/PKG-INFO +10 -8
  2. {processforge-0.2.40 → processforge-0.3.2}/README.md +9 -7
  3. {processforge-0.2.40 → 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.2.40 → processforge-0.3.2}/flowsheets/hydraulic-chain.json +3 -3
  7. {processforge-0.2.40 → processforge-0.3.2}/pyproject.toml +1 -1
  8. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/__init__.py +1 -1
  9. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/analysis/dof.py +2 -2
  10. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/cli/apply.py +2 -1
  11. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/cli/common.py +4 -0
  12. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/cli/diagram.py +2 -2
  13. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/cli/plan.py +2 -1
  14. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/cli/run.py +2 -1
  15. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/units/pump_eo.py +2 -2
  16. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/modelica/unit_equations.py +4 -4
  17. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/result.py +163 -57
  18. processforge-0.3.2/src/processforge/result_schema.py +26 -0
  19. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/schemas/flowsheet_schema.json +1 -1
  20. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/state.py +1 -1
  21. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/types.py +51 -115
  22. processforge-0.3.2/src/processforge/units/base.py +38 -0
  23. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/units/cstr.py +2 -2
  24. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/units/pfr.py +2 -2
  25. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/units/pipes.py +2 -2
  26. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/units/pump.py +8 -8
  27. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/units/solver_unit.py +3 -3
  28. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/units/strainer.py +6 -6
  29. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/units/tank.py +2 -2
  30. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/units/valve.py +2 -2
  31. {processforge-0.2.40 → processforge-0.3.2}/src/processforge.egg-info/PKG-INFO +10 -8
  32. {processforge-0.2.40 → processforge-0.3.2}/src/processforge.egg-info/SOURCES.txt +6 -3
  33. {processforge-0.2.40 → processforge-0.3.2}/tests/test_state.py +19 -19
  34. processforge-0.3.2/tests/test_types.py +440 -0
  35. processforge-0.2.40/src/processforge/units/provider_mixin.py +0 -33
  36. processforge-0.2.40/src/processforge/units/solver.py +0 -5
  37. {processforge-0.2.40 → processforge-0.3.2}/LICENSE +0 -0
  38. {processforge-0.2.40 → processforge-0.3.2}/MANIFEST.in +0 -0
  39. {processforge-0.2.40 → processforge-0.3.2}/flowsheets/festim/hydrogen_transport_1d.json +0 -0
  40. {processforge-0.2.40 → processforge-0.3.2}/flowsheets/openmc/msre_eigenvalue.json +0 -0
  41. {processforge-0.2.40 → processforge-0.3.2}/setup.cfg +0 -0
  42. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/__main__.py +0 -0
  43. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/_schema.py +0 -0
  44. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/analysis/__init__.py +0 -0
  45. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/cli/__init__.py +0 -0
  46. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/cli/display.py +0 -0
  47. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/cli/export_fmu.py +0 -0
  48. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/cli/export_modelica.py +0 -0
  49. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/cli/init.py +0 -0
  50. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/cli/validate.py +0 -0
  51. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/compose.py +0 -0
  52. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/__init__.py +0 -0
  53. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/backends/__init__.py +0 -0
  54. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/backends/base.py +0 -0
  55. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/backends/casadi_backend.py +0 -0
  56. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/backends/pyomo_backend.py +0 -0
  57. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/backends/scipy_backend.py +0 -0
  58. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/flowsheet.py +0 -0
  59. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/jacobian.py +0 -0
  60. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/mixin.py +0 -0
  61. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/solver.py +0 -0
  62. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/stream_var.py +0 -0
  63. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/units/__init__.py +0 -0
  64. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/units/flash_eo.py +0 -0
  65. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/units/heater_eo.py +0 -0
  66. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/units/pipes_eo.py +0 -0
  67. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/units/strainer_eo.py +0 -0
  68. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/eo/units/valve_eo.py +0 -0
  69. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/flowsheet.py +0 -0
  70. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/fmu/__init__.py +0 -0
  71. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/fmu/_fmi_vars.py +0 -0
  72. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/fmu/builder.py +0 -0
  73. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/fmu/slave_template.py +0 -0
  74. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/lock.py +0 -0
  75. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/modelica/__init__.py +0 -0
  76. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/modelica/mo_writer.py +0 -0
  77. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/modelica/omc_runner.py +0 -0
  78. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/modelica/transpiler.py +0 -0
  79. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/pcl/__init__.py +0 -0
  80. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/pcl/compiler.py +0 -0
  81. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/pcl/namespace.py +0 -0
  82. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/provenance.py +0 -0
  83. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/providers/__init__.py +0 -0
  84. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/providers/base.py +0 -0
  85. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/providers/base_jacobian_mixin.py +0 -0
  86. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/providers/cantera_jacobian.py +0 -0
  87. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/providers/cantera_provider.py +0 -0
  88. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/providers/coolprop_provider.py +0 -0
  89. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/providers/festim_provider.py +0 -0
  90. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/providers/jacobian_contributor.py +0 -0
  91. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/providers/manager.py +0 -0
  92. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/providers/modelica_jacobian.py +0 -0
  93. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/providers/modelica_provider.py +0 -0
  94. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/providers/openmc_provider.py +0 -0
  95. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/providers/reference_state_registry.py +0 -0
  96. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/providers/registry.py +0 -0
  97. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/schemas/__init__.py +0 -0
  98. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/schemas/openmc/openmc_model.py +0 -0
  99. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/simulate.py +0 -0
  100. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/solver.py +0 -0
  101. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/thermo.py +0 -0
  102. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/units/__init__.py +0 -0
  103. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/units/flash.py +0 -0
  104. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/units/heater.py +0 -0
  105. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/units/registry.py +0 -0
  106. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/utils/__init__.py +0 -0
  107. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/utils/flowsheet_diagram.py +0 -0
  108. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/utils/mermaid_diagram.py +0 -0
  109. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/utils/topology.py +0 -0
  110. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/utils/unit_consistency.py +0 -0
  111. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/utils/validate_flowsheet.py +0 -0
  112. {processforge-0.2.40 → processforge-0.3.2}/src/processforge/utils/validation.py +0 -0
  113. {processforge-0.2.40 → processforge-0.3.2}/src/processforge.egg-info/dependency_links.txt +0 -0
  114. {processforge-0.2.40 → processforge-0.3.2}/src/processforge.egg-info/entry_points.txt +0 -0
  115. {processforge-0.2.40 → processforge-0.3.2}/src/processforge.egg-info/requires.txt +0 -0
  116. {processforge-0.2.40 → processforge-0.3.2}/src/processforge.egg-info/top_level.txt +0 -0
  117. {processforge-0.2.40 → processforge-0.3.2}/tests/test_cli.py +0 -0
  118. {processforge-0.2.40 → processforge-0.3.2}/tests/test_festim_provider.py +0 -0
  119. {processforge-0.2.40 → processforge-0.3.2}/tests/test_init.py +0 -0
  120. {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.40
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
- - `*_validation.xlsx` — validation report
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 and Docker
131
- Processforge is also available as Docker images, and can be run in the cloud. See the [usage guide](docs/usage.md) for CLI commands, workflows, Docker, and cloud notes.
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
- - `*_validation.xlsx` — validation report
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 and Docker
72
- Processforge is also available as Docker images, and can be run in the cloud. See the [usage guide](docs/usage.md) for CLI commands, workflows, Docker, and cloud notes.
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.
@@ -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.2.40"
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,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.2.40"
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