source: inundation/ga/storm_surge/pyvolution/netherlands.py @ 1671

Last change on this file since 1671 was 1636, checked in by ole, 20 years ago

Fixed 'lost mass' conservation problem and added unit test, that reveals it.


File size: 4.2 KB
Line 
1"""Example of shallow water wave equation.
2
3This is called Netherlands because it shows a dam with a gap in it and
4stylised housed behind it and below the water surface.
5
6"""
7
8######################
9# Module imports
10#
11#import rpdb
12#rpdb.set_active()
13
14from shallow_water import Domain, Reflective_boundary, Dirichlet_boundary,\
15     Transmissive_boundary, Constant_height, Constant_stage
16
17from mesh_factory import rectangular
18from Numeric import array
19
20
21class Weir:
22    """Set a bathymetry for simple weir with a hole.
23    x,y are assumed to be in the unit square
24    """
25
26    def __init__(self, stage):
27        self.inflow_stage = stage
28
29    def __call__(self, x, y):
30        from Numeric import zeros, Float
31
32        N = len(x)
33        assert N == len(y)
34
35        z = zeros(N, Float)
36        for i in range(N):
37            z[i] = -x[i]/20  #General slope
38
39            #Flattish bit to the left
40            if x[i] <= 0.3:
41                #z[i] = -x[i]/5
42                z[i] = -x[i]/20
43
44
45            #Weir
46            if x[i] > 0.3 and x[i] < 0.4:
47                z[i] = -x[i]/20+1.2
48
49            #Dip
50            #if x[i] > 0.6 and x[i] < 0.9:
51            #    z[i] = -x[i]/20-0.5  #-y[i]/5
52
53            #Hole in weir
54            #if x[i] > 0.3 and x[i] < 0.4 and y[i] > 0.2 and y[i] < 0.4:
55            if x[i] > 0.3 and x[i] < 0.4 and y[i] > 0.4 and y[i] < 0.6:
56                #z[i] = -x[i]/5
57                z[i] = -x[i]/20
58
59            #Poles
60            #if x[i] > 0.65 and x[i] < 0.8 and y[i] > 0.55 and y[i] < 0.65 or\
61            #       x[i] > 0.75 and x[i] < 0.9 and y[i] > 0.35 and y[i] < 0.45:
62            #    z[i] = -x[i]/20+0.4
63
64            if (x[i] - 0.72)**2 + (y[i] - 0.6)**2 < 0.05**2:# or\
65                   #x[i] > 0.75 and x[i] < 0.9 and y[i] > 0.35 and y[i] < 0.45:
66                z[i] = -x[i]/20+0.4
67
68
69            #Wall
70            if x[i] > 0.995:
71                z[i] = -x[i]/20+0.3
72
73        return z/2
74
75
76
77######################
78# Domain
79#
80
81
82N = 150 #size = 45000
83N = 130 #size = 33800
84N = 600 #Size = 720000
85N = 60
86
87
88#N = 15
89
90print 'Creating domain'
91#Create basic mesh
92points, vertices, boundary = rectangular(N, N)
93
94#Create shallow water domain
95domain = Domain(points, vertices, boundary, use_inscribed_circle=True)
96
97domain.check_integrity()
98domain.default_order = 2
99#domain.beta_h=0
100
101#Output params
102domain.smooth = False
103domain.reduction = min  #Looks a lot better on top of steep slopes
104
105print "Number of triangles = ", len(domain)
106
107#Set bed-slope and friction
108inflow_stage = 0.1
109manning = 0.03
110Z = Weir(inflow_stage)
111
112if N > 150:
113    domain.visualise = False
114    domain.checkpoint = False
115    domain.store = True    #Store for visualisation purposes
116    domain.format = 'sww'   #Native netcdf visualisation format
117    import sys, os
118    #FIXME: This was os.path.splitext but caused weird filenames based on root
119    base = os.path.basename(sys.argv[0])
120    domain.filename, _ = os.path.splitext(base)
121else:
122    domain.initialise_visualiser(rect=[0.0,0.0,1.0,1.0])
123    domain.visualiser.coloring['stage'] = True
124    domain.visualise_timer = True
125    domain.checkpoint = False
126    domain.store = False
127
128
129
130
131print 'Field values'
132domain.set_quantity('elevation', Z)
133domain.set_quantity('friction', manning)
134
135
136######################
137# Boundary conditions
138#
139print 'Boundaries'
140Br = Reflective_boundary(domain)
141Bt = Transmissive_boundary(domain)
142
143#Constant inflow
144Bd = Dirichlet_boundary([inflow_stage, 0.0, 0.0])
145
146
147#Set boundary conditions
148domain.set_boundary({'left': Bd, 'right': Br, 'bottom': Br, 'top': Br})
149
150
151######################
152#Initial condition
153#
154print 'Initial condition'
155domain.set_quantity('stage', Constant_height(Z, 0.0))
156#domain.set_quantity('stage', Constant_stage(-1.0))
157
158#Evolve
159import time
160t0 = time.time()
161
162
163
164for t in domain.evolve(yieldstep = 0.1, finaltime = 15.0):
165    domain.write_time()
166    #rpdb.set_active()
167    #domain.visualiser.scale_z = 1.0
168    #domain.visualiser.update_quantity_color('xmomentum',scale_z = 4.0)
169    #integral_label.text='Integral=%10.5e'%domain.quantities['stage'].get_integral()
170
171
172print 'That took %.2f seconds' %(time.time()-t0)
Note: See TracBrowser for help on using the repository browser.