Changeset 6533 for branches/numpy/anuga/culvert_flows/culvert_routines.py
- Timestamp:
- Mar 17, 2009, 4:02:54 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/numpy/anuga/culvert_flows/culvert_routines.py
r6517 r6533 8 8 9 9 #NOTE: 10 # Inlet control: Delta_total_energy > inlet_specific_energy 11 # Outlet control: Delta_total_energy < inlet_specific_energy 12 # where total energy is (w + 0.5*v^2/g) and 13 # specific energy is (h + 0.5*v^2/g) 10 # Inlet control: Delta_Et > Es at the inlet 11 # Outlet control: Delta_Et < Es at the inlet 12 # where Et is total energy (w + 0.5*v^2/g) and 13 # Es is the specific energy (h + 0.5*v^2/g) 14 15 16 17 # NEW DEFINED CULVERT FLOW---- Flow from INLET 1 ------> INLET 2 (Outlet) 18 # 19 # The First Attempt has a Simple Horizontal Circle as a Hole on the Bed 20 # Flow Is Removed at a Rate of INFLOW 21 # Downstream there is a similar Circular Hole on the Bed where INFLOW effectively Surcharges 22 # 23 # This SHould be changed to a Vertical Opening Both BOX and Circular 24 # There will be several Culvert Routines such as: 25 # CULVERT_Boyd_Channel 26 # CULVERT_Orifice_and_Weir 27 # CULVERT_Simple_FLOOR 28 # CULVERT_Simple_WALL 29 # CULVERT_Eqn_Floor 30 # CULVERT_Eqn_Wall 31 # CULVERT_Tab_Floor 32 # CULVERT_Tab_Wall 33 # BRIDGES..... 34 # NOTE NEED TO DEVELOP CONCEPT 1D Model for Linked Pipe System !!!! 35 36 # COULD USE EPA SWMM Model !!!! 14 37 15 38 … … 17 40 18 41 19 def boyd_generalised_culvert_model(inlet_depth, 20 outlet_depth, 21 inlet_specific_energy, 22 delta_total_energy, 23 g, 24 culvert_length=0.0, 25 culvert_width=0.0, 26 culvert_height=0.0, 27 culvert_type='box', 28 manning=0.0, 29 sum_loss=0.0, 30 log_filename=None): 31 32 """Boyd's generalisation of the US department of transportation culvert 33 model 34 35 The quantity of flow passing through a culvert is controlled by many factors 36 It could be that the culvert is controlled by the inlet only, with it 37 being unsubmerged this is effectively equivalent to the weir Equation 38 Else the culvert could be controlled by the inlet, with it being 39 submerged, this is effectively the Orifice Equation 40 Else it may be controlled by down stream conditions where depending on 41 the down stream depth, the momentum in the culvert etc. flow is controlled 42 def boyd_generalised_culvert_model(culvert, delta_total_energy, g): 43 44 """Boyd's generalisation of the US department of transportation culvert model 45 # == The quantity of flow passing through a culvert is controlled by many factors 46 # == It could be that the culvert is controled by the inlet only, with it being Un submerged this is effectively equivalent to the WEIR Equation 47 # == Else the culvert could be controlled by the inlet, with it being Submerged, this is effectively the Orifice Equation 48 # == Else it may be controlled by Down stream conditions where depending on the down stream depth, the momentum in the culvert etc. flow is controlled 42 49 """ 43 50 … … 46 53 from anuga.utilities.numerical_tools import safe_acos as acos 47 54 48 if inlet_depth > 0.01: 55 inlet = culvert.inlet 56 outlet = culvert.outlet 57 Q_outlet_tailwater = 0.0 58 inlet.rate = 0.0 59 outlet.rate = 0.0 60 Q_inlet_unsubmerged = 0.0 61 Q_inlet_submerged = 0.0 62 Q_outlet_critical_depth = 0.0 63 64 if hasattr(culvert, 'log_filename'): 65 log_filename = culvert.log_filename 66 67 manning = culvert.manning 68 sum_loss = culvert.sum_loss 69 length = culvert.length 70 71 if inlet.depth > 0.01: 72 73 E = inlet.specific_energy 74 75 if hasattr(culvert, 'log_filename'): 76 s = 'Specific energy = %f m' %E 77 log_to_file(log_filename, s) 78 79 msg = 'Specific energy is negative' 80 assert E >= 0.0, msg 81 82 49 83 # Water has risen above inlet 50 51 if log_filename is not None: 52 s = 'Specific energy = %f m' % inlet_specific_energy 53 log_to_file(log_filename, s) 54 55 msg = 'Specific energy at inlet is negative' 56 assert inlet_specific_energy >= 0.0, msg 57 58 if culvert_type == 'circle': 59 # Round culvert (use width as diameter) 60 diameter = culvert_width 84 if culvert.culvert_type == 'circle': 85 # Round culvert 61 86 62 87 # Calculate flows for inlet control 63 Q_inlet_unsubmerged = 0.421*g**0.5*diameter**0.87*inlet_specific_energy**1.63 # Inlet Ctrl Inlet Unsubmerged 64 Q_inlet_submerged = 0.530*g**0.5*diameter**1.87*inlet_specific_energy**0.63 # Inlet Ctrl Inlet Submerged 65 66 if log_filename is not None: 67 s = 'Q_inlet_unsubmerged = %.6f, Q_inlet_submerged = %.6f' % (Q_inlet_unsubmerged, Q_inlet_submerged) 88 diameter = culvert.diameter 89 90 Q_inlet_unsubmerged = 0.421*g**0.5*diameter**0.87*E**1.63 # Inlet Ctrl Inlet Unsubmerged 91 Q_inlet_submerged = 0.530*g**0.5*diameter**1.87*E**0.63 # Inlet Ctrl Inlet Submerged 92 93 if hasattr(culvert, 'log_filename'): 94 s = 'Q_inlet_unsubmerged = %.6f, Q_inlet_submerged = %.6f' %(Q_inlet_unsubmerged, Q_inlet_submerged) 68 95 log_to_file(log_filename, s) 69 96 70 # FIXME(Ole): Are these functions really for inlet control?97 case = '' 71 98 if Q_inlet_unsubmerged < Q_inlet_submerged: 72 99 Q = Q_inlet_unsubmerged 73 100 74 alpha = acos(1 - inlet _depth/diameter)101 alpha = acos(1 - inlet.depth/diameter) 75 102 flow_area = diameter**2 * (alpha - sin(alpha)*cos(alpha)) 76 outlet_culvert_depth = inlet_depth 103 outlet_culvert_depth = inlet.depth 104 width = diameter*sin(alpha) 105 #perimeter = alpha*diameter 77 106 case = 'Inlet unsubmerged' 78 107 else: … … 80 109 flow_area = (diameter/2)**2 * pi 81 110 outlet_culvert_depth = diameter 111 width = diameter 112 #perimeter = diameter 82 113 case = 'Inlet submerged' 83 114 84 115 85 116 86 if delta_total_energy < inlet_specific_energy:117 if delta_total_energy < E: 87 118 # Calculate flows for outlet control 88 119 # Determine the depth at the outlet relative to the depth of flow in the Culvert 89 120 90 if outlet _depth > diameter: # The Outlet is Submerged121 if outlet.depth > diameter: # The Outlet is Submerged 91 122 outlet_culvert_depth=diameter 92 123 flow_area = (diameter/2)**2 * pi # Cross sectional area of flow in the culvert 93 124 perimeter = diameter * pi 125 width = diameter 94 126 case = 'Outlet submerged' 95 elif outlet _depth==0.0:96 outlet_culvert_depth=inlet _depth# For purpose of calculation assume the outlet depth = the inlet depth97 alpha = acos(1 - inlet _depth/diameter)127 elif outlet.depth==0.0: 128 outlet_culvert_depth=inlet.depth # For purpose of calculation assume the outlet depth = the inlet depth 129 alpha = acos(1 - inlet.depth/diameter) 98 130 flow_area = diameter**2 * (alpha - sin(alpha)*cos(alpha)) 99 131 perimeter = alpha*diameter 132 width = diameter*sin(alpha) 100 133 101 134 case = 'Outlet depth is zero' 102 135 else: # Here really should use the Culvert Slope to calculate Actual Culvert Depth & Velocity 103 outlet_culvert_depth=outlet _depth # For purpose of calculation assume the outlet depth = the inlet depth104 alpha = acos(1 - outlet _depth/diameter)136 outlet_culvert_depth=outlet.depth # For purpose of calculation assume the outlet depth = the inlet depth 137 alpha = acos(1 - outlet.depth/diameter) 105 138 flow_area = diameter**2 * (alpha - sin(alpha)*cos(alpha)) 106 139 perimeter = alpha*diameter 140 width = diameter*sin(alpha) 107 141 case = 'Outlet is open channel flow' 108 142 109 143 hyd_rad = flow_area/perimeter 110 144 111 if log_filename is not None:145 if hasattr(culvert, 'log_filename'): 112 146 s = 'hydraulic radius at outlet = %f' %hyd_rad 113 147 log_to_file(log_filename, s) 114 148 115 149 # Outlet control velocity using tail water 116 culvert_velocity = sqrt(delta_total_energy/((sum_loss/2*g)+(manning**2* culvert_length)/hyd_rad**1.33333))150 culvert_velocity = sqrt(delta_total_energy/((sum_loss/2*g)+(manning**2*length)/hyd_rad**1.33333)) 117 151 Q_outlet_tailwater = flow_area * culvert_velocity 118 152 119 if log_filename is not None:153 if hasattr(culvert, 'log_filename'): 120 154 s = 'Q_outlet_tailwater = %.6f' %Q_outlet_tailwater 121 155 log_to_file(log_filename, s) … … 131 165 132 166 # Calculate flows for inlet control 133 height = culvert _height134 width = culvert _width167 height = culvert.height 168 width = culvert.width 135 169 136 Q_inlet_unsubmerged = 0.540*g**0.5*width* inlet_specific_energy**1.50 # Flow based on Inlet Ctrl Inlet Unsubmerged137 Q_inlet_submerged = 0.702*g**0.5*width*height**0.89* inlet_specific_energy**0.61 # Flow based on Inlet Ctrl Inlet Submerged138 139 if log_filename is not None:170 Q_inlet_unsubmerged = 0.540*g**0.5*width*E**1.50 # Flow based on Inlet Ctrl Inlet Unsubmerged 171 Q_inlet_submerged = 0.702*g**0.5*width*height**0.89*E**0.61 # Flow based on Inlet Ctrl Inlet Submerged 172 173 if hasattr(culvert, 'log_filename'): 140 174 s = 'Q_inlet_unsubmerged = %.6f, Q_inlet_submerged = %.6f' %(Q_inlet_unsubmerged, Q_inlet_submerged) 141 175 log_to_file(log_filename, s) 142 176 143 # FIXME(Ole): Are these functions really for inlet control?177 case = '' 144 178 if Q_inlet_unsubmerged < Q_inlet_submerged: 145 179 Q = Q_inlet_unsubmerged 146 flow_area = width*inlet_depth 147 outlet_culvert_depth = inlet_depth 180 flow_area = width*inlet.depth 181 outlet_culvert_depth = inlet.depth 182 #perimeter=(width+2.0*inlet.depth) 148 183 case = 'Inlet unsubmerged' 149 184 else: … … 154 189 case = 'Inlet submerged' 155 190 156 if delta_total_energy < inlet_specific_energy:191 if delta_total_energy < E: 157 192 # Calculate flows for outlet control 158 193 # Determine the depth at the outlet relative to the depth of flow in the Culvert 159 194 160 if outlet _depth > height: # The Outlet is Submerged195 if outlet.depth > height: # The Outlet is Submerged 161 196 outlet_culvert_depth=height 162 197 flow_area=width*height # Cross sectional area of flow in the culvert 163 198 perimeter=2.0*(width+height) 164 199 case = 'Outlet submerged' 165 elif outlet _depth==0.0:166 outlet_culvert_depth=inlet _depth # For purpose of calculation assume the outlet depth = the inlet depth167 flow_area=width*inlet _depth168 perimeter=(width+2.0*inlet _depth)200 elif outlet.depth==0.0: 201 outlet_culvert_depth=inlet.depth # For purpose of calculation assume the outlet depth = the inlet depth 202 flow_area=width*inlet.depth 203 perimeter=(width+2.0*inlet.depth) 169 204 case = 'Outlet depth is zero' 170 205 else: # Here really should use the Culvert Slope to calculate Actual Culvert Depth & Velocity 171 outlet_culvert_depth=outlet _depth172 flow_area=width*outlet _depth173 perimeter=(width+2.0*outlet _depth)206 outlet_culvert_depth=outlet.depth 207 flow_area=width*outlet.depth 208 perimeter=(width+2.0*outlet.depth) 174 209 case = 'Outlet is open channel flow' 175 210 176 211 hyd_rad = flow_area/perimeter 177 212 178 if log_filename is not None:179 s = 'hydraulic radius at outlet = %f' % 213 if hasattr(culvert, 'log_filename'): 214 s = 'hydraulic radius at outlet = %f' %hyd_rad 180 215 log_to_file(log_filename, s) 181 216 182 217 # Outlet control velocity using tail water 183 culvert_velocity = sqrt(delta_total_energy/((sum_loss/2*g)+(manning**2* culvert_length)/hyd_rad**1.33333))218 culvert_velocity = sqrt(delta_total_energy/((sum_loss/2*g)+(manning**2*length)/hyd_rad**1.33333)) 184 219 Q_outlet_tailwater = flow_area * culvert_velocity 185 220 186 if log_filename is not None:187 s = 'Q_outlet_tailwater = %.6f' % 221 if hasattr(culvert, 'log_filename'): 222 s = 'Q_outlet_tailwater = %.6f' %Q_outlet_tailwater 188 223 log_to_file(log_filename, s) 189 224 Q = min(Q, Q_outlet_tailwater) … … 193 228 194 229 # Common code for circle and square geometries 195 if log_filename is not None:196 log_to_file(log_filename, 'Case: "%s"' % 230 if hasattr(culvert, 'log_filename'): 231 log_to_file(log_filename, 'Case: "%s"' %case) 197 232 198 if log_filename is not None: 199 s = 'Flow Rate Control = %f' % Q 233 flow_rate_control=Q 234 235 if hasattr(culvert, 'log_filename'): 236 s = 'Flow Rate Control = %f' %flow_rate_control 200 237 log_to_file(log_filename, s) 201 238 202 culv_froude=sqrt(Q**2*width/(g*flow_area**3)) 203 204 if log_filename is not None: 205 s = 'Froude in Culvert = %f' % culv_froude 239 inlet.rate = -flow_rate_control 240 outlet.rate = flow_rate_control 241 242 culv_froude=sqrt(flow_rate_control**2*width/(g*flow_area**3)) 243 244 if hasattr(culvert, 'log_filename'): 245 s = 'Froude in Culvert = %f' %culv_froude 206 246 log_to_file(log_filename, s) 207 247 … … 210 250 211 251 212 else: # inlet_depth < 0.01:252 else: #inlet.depth < 0.01: 213 253 Q = barrel_velocity = outlet_culvert_depth = 0.0 214 254
Note: See TracChangeset
for help on using the changeset viewer.