@@ -932,12 +932,13 @@ def orifice_flow_coefficients(self, u=None):
932932 _alpha_o = self ._alpha_o # Orifice flow coefficient alpha_o
933933 _beta_o = self ._beta_o # Orifice flow coefficient beta_o
934934 _chi_o = self ._chi_o # Orifice flow coefficient chi_o
935+ _unidir_o = self ._unidir_o
935936 # If no input signal, assume orifice is closed
936937 if u is None :
937938 u = np .zeros (self .n_o , dtype = np .float64 )
938939 # Specify orifice heads at previous timestep
939940 numba_orifice_flow_coefficients (_alpha_o , _beta_o , _chi_o , H_j , _Qo , u , _z_inv_j ,
940- _z_o , _tau_o , _Co , _Ao , _y_max_o , _J_uo , _J_do )
941+ _z_o , _tau_o , _Co , _Ao , _y_max_o , _unidir_o , _J_uo , _J_do )
941942 # Export instance variables
942943 self ._alpha_o = _alpha_o
943944 self ._beta_o = _beta_o
@@ -1424,13 +1425,14 @@ def solve_orifice_flows(self, dt, u=None):
14241425 _Co = self ._Co # Discharge coefficient of orifice o
14251426 _Ao = self ._Ao # Maximum flow area of orifice o
14261427 _V_sj = self ._V_sj
1428+ _unidir_o = self ._unidir_o
14271429 g = 9.81
14281430 # If no input signal, assume orifice is closed
14291431 if u is None :
14301432 u = np .zeros (self .n_o , dtype = np .float64 )
14311433 # Compute orifice flows
14321434 _Qo_next = numba_solve_orifice_flows (H_j , u , _z_inv_j , _z_o , _tau_o , _y_max_o , _Co , _Ao ,
1433- _J_uo , _J_do , g )
1435+ _unidir_o , _J_uo , _J_do , g )
14341436 # TODO: Move this inside numba function
14351437 upstream_ctrl = (H_j [_J_uo ] > H_j [_J_do ])
14361438 _Qo_max = np .where (upstream_ctrl , _V_sj [_J_uo ], _V_sj [_J_do ]) / dt
@@ -2519,10 +2521,12 @@ def xi_dk(dx_dk, B_dk, theta_dk, dt):
25192521 return result
25202522
25212523@njit (int64 (float64 [:], float64 [:], float64 [:], float64 [:], float64 [:], float64 [:], float64 [:],
2522- float64 [:], float64 [:], float64 [:], float64 [:], float64 [:], int64 [:], int64 [:]),
2524+ float64 [:], float64 [:], float64 [:], float64 [:], float64 [:], boolean [:],
2525+ int64 [:], int64 [:]),
25232526 cache = True )
25242527def numba_orifice_flow_coefficients (_alpha_o , _beta_o , _chi_o , H_j , _Qo , u , _z_inv_j ,
2525- _z_o , _tau_o , _Co , _Ao , _y_max_o , _J_uo , _J_do ):
2528+ _z_o , _tau_o , _Co , _Ao , _y_max_o , _unidir_o ,
2529+ _J_uo , _J_do ):
25262530 g = 9.81
25272531 _H_uo = H_j [_J_uo ]
25282532 _H_do = H_j [_J_do ]
@@ -2539,6 +2543,7 @@ def numba_orifice_flow_coefficients(_alpha_o, _beta_o, _chi_o, H_j, _Qo, u, _z_i
25392543 _z_o + _z_inv_uo + (_tau_o * _y_max_o * u / 2 ))
25402544 cond_2 = (_omega_o * _H_uo + (1 - _omega_o ) * _H_do >
25412545 _z_o + _z_inv_uo )
2546+ cond_3 = (_H_do >= _H_uo ) & _unidir_o
25422547 # Fill coefficient arrays
25432548 # Submerged on both sides
25442549 a = (cond_0 & cond_1 )
@@ -2559,17 +2564,18 @@ def numba_orifice_flow_coefficients(_alpha_o, _beta_o, _chi_o, H_j, _Qo, u, _z_i
25592564 _chi_o [c ] = (_gamma_o [c ] * (- 1 )** (1 - _omega_o [c ])
25602565 * (- _z_inv_uo [c ] - _z_o [c ]))
25612566 # No flow
2562- d = (~ cond_0 & ~ cond_2 )
2567+ d = (~ cond_0 & ~ cond_2 ) | cond_3
25632568 _alpha_o [d ] = 0.0
25642569 _beta_o [d ] = 0.0
25652570 _chi_o [d ] = 0.0
25662571 return 1
25672572
25682573@njit (float64 [:](float64 [:], float64 [:], float64 [:], float64 [:],
2569- float64 [:], float64 [:], float64 [:], float64 [:], int64 [:], int64 [:], float64 ),
2574+ float64 [:], float64 [:], float64 [:], float64 [:], boolean [:],
2575+ int64 [:], int64 [:], float64 ),
25702576 cache = True )
25712577def numba_solve_orifice_flows (H_j , u , _z_inv_j , _z_o ,
2572- _tau_o , _y_max_o , _Co , _Ao , _J_uo , _J_do , g = 9.81 ):
2578+ _tau_o , _y_max_o , _Co , _Ao , _unidir_o , _J_uo , _J_do , g = 9.81 ):
25732579 # Specify orifice heads at previous timestep
25742580 _H_uo = H_j [_J_uo ]
25752581 _H_do = H_j [_J_do ]
@@ -2590,6 +2596,7 @@ def numba_solve_orifice_flows(H_j, u, _z_inv_j, _z_o,
25902596 _z_o + _z_inv_uo + (_tau_o * _y_max_o * u / 2 ))
25912597 cond_2 = (_omega_o * _H_uo + (1 - _omega_o ) * _H_do >
25922598 _z_o + _z_inv_uo )
2599+ cond_3 = (_H_do >= _H_uo ) & _unidir_o
25932600 # Fill coefficient arrays
25942601 # Submerged on both sides
25952602 a = (cond_0 & cond_1 )
@@ -2610,7 +2617,7 @@ def numba_solve_orifice_flows(H_j, u, _z_inv_j, _z_o,
26102617 _chi_o [c ] = (_gamma_o [c ] * (- 1 )** (1 - _omega_o [c ])
26112618 * (- _z_inv_uo [c ] - _z_o [c ]))
26122619 # No flow
2613- d = (~ cond_0 & ~ cond_2 )
2620+ d = (~ cond_0 & ~ cond_2 ) | cond_3
26142621 _alpha_o [d ] = 0.0
26152622 _beta_o [d ] = 0.0
26162623 _chi_o [d ] = 0.0
@@ -2716,8 +2723,8 @@ def numba_pump_flow_coefficients(_alpha_p, _beta_p, _chi_p, H_j, _z_inv_j, _Qp,
27162723 cond_0 = _H_up > _z_inv_up + _z_p
27172724 # Condition 1: Head difference is within range of pump curve
27182725 cond_1 = (_dHp > _dHp_min ) & (_dHp < _dHp_max )
2719- _dHp [_dHp > _dHp_max ] = _dHp_max
2720- _dHp [_dHp < _dHp_min ] = _dHp_min
2726+ _dHp [_dHp > _dHp_max ] = _dHp_max [ _dHp > _dHp_max ]
2727+ _dHp [_dHp < _dHp_min ] = _dHp_min [ _dHp < _dHp_min ]
27212728 # Compute universal coefficients
27222729 _gamma_p = gamma_p (_Qp , _b_p , _c_p , u )
27232730 # Fill coefficient arrays
@@ -2748,8 +2755,8 @@ def numba_solve_pump_flows(H_j, u, _z_inv_j, _z_p, _dHp_max, _dHp_min, _a_p, _b_
27482755 _z_inv_up = _z_inv_j [_J_up ]
27492756 # Create conditionals
27502757 _dHp = _H_dp - _H_up
2751- _dHp [_dHp > _dHp_max ] = _dHp_max
2752- _dHp [_dHp < _dHp_min ] = _dHp_min
2758+ _dHp [_dHp > _dHp_max ] = _dHp_max [ _dHp > _dHp_max ]
2759+ _dHp [_dHp < _dHp_min ] = _dHp_min [ _dHp < _dHp_min ]
27532760 cond_0 = _H_up > _z_inv_up + _z_p
27542761 # Compute universal coefficients
27552762 _Qp_next = (u / _b_p * (_a_p - _dHp ))** (1 / _c_p )
0 commit comments