razaali10 commited on
Commit
309f674
·
verified ·
1 Parent(s): aa16b2c

Create hardy_cross_solver.py

Browse files
Files changed (1) hide show
  1. 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']]