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

Last change on this file since 1668 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
RevLine 
[1266]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#
[1597]11#import rpdb
12#rpdb.set_active()
[1585]13
[1266]14from shallow_water import Domain, Reflective_boundary, Dirichlet_boundary,\
[1387]15     Transmissive_boundary, Constant_height, Constant_stage
[1266]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
[1295]68
[1266]69            #Wall
[1393]70            if x[i] > 0.995:
71                z[i] = -x[i]/20+0.3
[1266]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
[1599]85N = 60
[1266]86
[1392]87
[1266]88#N = 15
89
90print 'Creating domain'
91#Create basic mesh
[1392]92points, vertices, boundary = rectangular(N, N)
[1266]93
94#Create shallow water domain
[1360]95domain = Domain(points, vertices, boundary, use_inscribed_circle=True)
[1266]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
[1295]107#Set bed-slope and friction
[1393]108inflow_stage = 0.1
109manning = 0.03
[1295]110Z = Weir(inflow_stage)
[1266]111
[1636]112if N > 150:
[1266]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:
[1599]122    domain.initialise_visualiser(rect=[0.0,0.0,1.0,1.0])
123    domain.visualiser.coloring['stage'] = True
[1295]124    domain.visualise_timer = True
[1266]125    domain.checkpoint = False
126    domain.store = False
127
128
[1360]129
[1510]130
[1266]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
[1295]144Bd = Dirichlet_boundary([inflow_stage, 0.0, 0.0])
[1266]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'
[1387]155domain.set_quantity('stage', Constant_height(Z, 0.0))
156#domain.set_quantity('stage', Constant_stage(-1.0))
[1266]157
158#Evolve
159import time
160t0 = time.time()
161
[1393]162
[1585]163
[1393]164for t in domain.evolve(yieldstep = 0.1, finaltime = 15.0):
[1266]165    domain.write_time()
[1597]166    #rpdb.set_active()
[1387]167    #domain.visualiser.scale_z = 1.0
[1393]168    #domain.visualiser.update_quantity_color('xmomentum',scale_z = 4.0)
169    #integral_label.text='Integral=%10.5e'%domain.quantities['stage'].get_integral()
[1266]170
171
172print 'That took %.2f seconds' %(time.time()-t0)
Note: See TracBrowser for help on using the repository browser.