Spaces:
Build error
Build error
Create hardy_cross_solver.py
Browse files- hardy_cross_solver.py +33 -0
hardy_cross_solver.py
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import numpy as np
|
| 2 |
+
import pandas as pd
|
| 3 |
+
|
| 4 |
+
def hardy_cross_solver(pipes_data, loops, max_iterations=10, tolerance=0.001):
|
| 5 |
+
df = pd.DataFrame(pipes_data)
|
| 6 |
+
df['area'] = np.pi * (df['diameter'] / 2) ** 2
|
| 7 |
+
df['R'] = (df['friction_factor'] * df['length']) / (df['diameter'] * 2 * 9.81 * df['area'] ** 2)
|
| 8 |
+
df['Q'] = df['initial_flow']
|
| 9 |
+
iteration_results = []
|
| 10 |
+
for iteration in range(max_iterations):
|
| 11 |
+
max_delta_Q = 0
|
| 12 |
+
for loop_id, loop_pipes in loops.items():
|
| 13 |
+
loop_df = df[df['pipe_id'].isin(loop_pipes)].copy()
|
| 14 |
+
loop_df['sign'] = loop_df.apply(lambda row: 1 if row['loop_id'] == loop_id else -1, axis=1)
|
| 15 |
+
loop_df['RQ_absQ'] = loop_df['R'] * loop_df['Q'] * np.abs(loop_df['Q']) * loop_df['sign']
|
| 16 |
+
loop_df['nR_absQ'] = 2 * loop_df['R'] * np.abs(loop_df['Q'])
|
| 17 |
+
numerator = loop_df['RQ_absQ'].sum()
|
| 18 |
+
denominator = loop_df['nR_absQ'].sum()
|
| 19 |
+
delta_Q = - numerator / denominator
|
| 20 |
+
df.loc[df['pipe_id'].isin(loop_pipes), 'Q'] += delta_Q * loop_df['sign']
|
| 21 |
+
max_delta_Q = max(max_delta_Q, abs(delta_Q))
|
| 22 |
+
iteration_results.append({
|
| 23 |
+
'iteration': iteration + 1,
|
| 24 |
+
'loop_id': loop_id,
|
| 25 |
+
'delta_Q': delta_Q,
|
| 26 |
+
'max_delta_Q': max_delta_Q,
|
| 27 |
+
'numerator': numerator,
|
| 28 |
+
'denominator': denominator,
|
| 29 |
+
'Q_values': df[['pipe_id', 'Q']].to_dict(orient='records')
|
| 30 |
+
})
|
| 31 |
+
if max_delta_Q < tolerance:
|
| 32 |
+
break
|
| 33 |
+
return iteration_results, df[['pipe_id', 'Q']]
|