source: trunk/anuga_core/source/anuga/structures/testing_culvert.py @ 7977

Last change on this file since 7977 was 7975, checked in by steve, 12 years ago

Got a working culvert!

File size: 4.9 KB
Line 
1import os.path
2import sys
3
4from anuga.utilities.system_tools import get_pathname_from_package
5from anuga.geometry.polygon_function import Polygon_function
6       
7from anuga.abstract_2d_finite_volumes.mesh_factory import rectangular_cross
8from anuga.abstract_2d_finite_volumes.quantity import Quantity
9
10import anuga
11
12from anuga.structures.culvert_operator import Generic_box_culvert
13                           
14#from anuga.culvert_flows.culvert_routines import boyd_generalised_culvert_model
15     
16from math import pi, pow, sqrt
17
18import numpy as num
19
20
21
22
23
24"""test_that_culvert_runs_rating
25
26This test exercises the culvert and checks values outside rating curve
27are dealt with       
28"""
29
30path = get_pathname_from_package('anuga.culvert_flows')   
31
32length = 40.
33width = 5.
34
35dx = dy = 0.5          # Resolution: Length of subdivisions on both axes
36
37points, vertices, boundary = rectangular_cross(int(length/dx),
38                                               int(width/dy),
39                                               len1=length, 
40                                               len2=width)
41domain = anuga.Domain(points, vertices, boundary)   
42domain.set_name('Test_culvert')                 # Output name
43domain.set_default_order(2)
44#domain.set_beta(1.5)
45
46
47#----------------------------------------------------------------------
48# Setup initial conditions
49#----------------------------------------------------------------------
50
51def topography(x, y):
52    """Set up a weir
53   
54    A culvert will connect either side
55    """
56    # General Slope of Topography
57    z=-x/1000
58   
59    N = len(x)
60    for i in range(N):
61
62       # Sloping Embankment Across Channel
63        if 5.0 < x[i] < 10.1:
64            # Cut Out Segment for Culvert face               
65            if  1.0+(x[i]-5.0)/5.0 <  y[i]  < 4.0 - (x[i]-5.0)/5.0: 
66               z[i]=z[i]
67            else:
68               z[i] +=  0.5*(x[i] -5.0)    # Sloping Segment  U/S Face
69        if 10.0 < x[i] < 12.1:
70           z[i] +=  2.5                    # Flat Crest of Embankment
71        if 12.0 < x[i] < 14.5:
72            # Cut Out Segment for Culvert face               
73            if  2.0-(x[i]-12.0)/2.5 <  y[i]  < 3.0 + (x[i]-12.0)/2.5:
74               z[i]=z[i]
75            else:
76               z[i] +=  2.5-1.0*(x[i] -12.0) # Sloping D/S Face
77                   
78       
79    return z
80
81
82domain.set_quantity('elevation', topography) 
83domain.set_quantity('friction', 0.01)         # Constant friction
84domain.set_quantity('stage',
85                    expression='elevation')   # Dry initial condition
86
87filename=os.path.join(path, 'example_rating_curve.csv')
88culvert1 = Generic_box_culvert(domain,
89                              end_point0=[9.0, 2.5], 
90                              end_point1=[13.0, 2.5],
91                              width=1.00,
92                              verbose=False)
93
94
95#culvert2 = Generic_box_culvert(domain,
96#                              end_point0=[19.0, 2.5],
97#                              end_point1=[25.0, 2.5],
98#                              width=1.00,
99#                              verbose=False)
100
101
102
103
104#print domain.fractional_step_operators
105
106#domain.apply_fractional_steps()
107
108##-----------------------------------------------------------------------
109## Setup boundary conditions
110##-----------------------------------------------------------------------
111
112## Inflow based on Flow Depth and Approaching Momentum
113Bi = anuga.Dirichlet_boundary([2.0, 0.0, 0.0])
114Br = anuga.Reflective_boundary(domain)              # Solid reflective wall
115#Bo = anuga.Dirichlet_boundary([-5, 0, 0])           # Outflow
116
117## Upstream and downstream conditions that will exceed the rating curve
118## I.e produce delta_h outside the range [0, 10] specified in the the
119## file example_rating_curve.csv
120#Btus = anuga.Time_boundary(domain, \
121            #lambda t: [100*num.sin(2*pi*(t-4)/10), 0.0, 0.0])
122#Btds = anuga.Time_boundary(domain, \
123            #lambda t: [-5*(num.cos(2*pi*(t-4)/20)), 0.0, 0.0])
124#domain.set_boundary({'left': Btus, 'right': Btds, 'top': Br, 'bottom': Br})
125domain.set_boundary({'left': Bi, 'right': Br, 'top': Br, 'bottom': Br})
126
127
128##-----------------------------------------------------------------------
129## Evolve system through time
130##-----------------------------------------------------------------------
131
132#min_delta_w = sys.maxint
133#max_delta_w = -min_delta_w
134for t in domain.evolve(yieldstep = 1.0, finaltime = 200):
135    domain.write_time()
136
137    if domain.get_time() > 150.5 and domain.get_time() < 151.5 :
138        Bi = anuga.Dirichlet_boundary([0.0, 0.0, 0.0])
139        domain.set_boundary({'left': Bi, 'right': Br, 'top': Br, 'bottom': Br})
140
141    #delta_w = culvert.inlet.stage - culvert.outlet.stage
142   
143    #if delta_w > max_delta_w: max_delta_w = delta_w
144    #if delta_w < min_delta_w: min_delta_w = delta_w           
145   
146    pass
147
148## Check that extreme values in rating curve have been exceeded
149## so that we know that condition has been exercised
150#assert min_delta_w < 0
151#assert max_delta_w > 10       
152
153
154#os.remove('Test_culvert.sww')
Note: See TracBrowser for help on using the repository browser.