source: trunk/anuga_validation/analytical_solutions/circular_hydraulic_jump.py @ 8916

Last change on this file since 8916 was 8464, checked in by steve, 13 years ago

Working on validation tests

File size: 5.4 KB
Line 
1"""Example of shallow water wave equation analytical solution of the
2circular hydraulic jump experimental data treated as a two-dimensional solution.
3
4   Copyright 2005
5   Christopher Zoppou, Stephen Roberts
6   Geoscience Australia, ANU
7"""
8
9#-------------------------------
10# Setup modules
11
12from anuga.shallow_water import Dirichlet_Discharge_boundary
13from anuga import Domain
14from anuga import Transmissive_Momentum_Set_Stage_boundary, Dirichlet_boundary
15from math import pi, sqrt
16from anuga.abstract_2d_finite_volumes.mesh_factory import strang_mesh
17
18
19#---------
20# Geometry
21bed = ([.519, .519, .519, .519, .5192, .5194, .5196, .520, .5207, .5215, .5233, .5233])
22distance = ([.08, .10, .11, .16, .21, .26, .31, .36, .41, .46, .50, .52])
23n_bed = 12
24
25#---------
26# Case A.4
27Q = 9.985/1000.0
28wh0 = Q/(2.0*pi*0.1)
29stage0 = bed[2] + 0.005
30wh1 = -Q/(2.0*pi*0.503)
31stage1 = 0.562
32Manning = 0.009
33
34#------------------
35# Set up the domain
36# Strang_domain will search through the file and test to see if there are
37# two or three entries. Two entries are for points and three for triangles.
38points, elements = strang_mesh('circular.pt')
39domain = Domain(points, elements)
40
41print "Number of triangles = ", len(domain)
42
43#----------------------
44# Set a default tagging
45
46
47for id, face in domain.boundary:
48    domain.boundary[(id,face)] = 'outer'
49    point = domain.get_vertex_coordinate(id,(face+1)%3)
50    radius2 = point[0]*point[0] + point[1]*point[1]
51    typical_outer = (id,face)
52    if radius2 < 0.1:
53        domain.boundary[(id,face)] = 'inner'
54        typical_inner = (id,face)
55
56
57#-------------------------------------
58# Provide file name for storing output
59#domain.visualise = True
60domain.store = True
61domain.format = 'sww'
62domain.set_name('circular_second_order')
63
64#------------------------------------------
65# Reduction operation for get_vertex_values
66from anuga.utilities.numerical_tools import mean
67#domain.reduction = mean
68#domain.reduction = min  #Looks better near steep slopes
69
70#---------------------------
71# Function for bed-elevation
72def bed_z(x,y):
73    n = x.shape[0]
74    z = 0*x
75    for i in range(n):
76        r = sqrt(x[i]*x[i]+y[i]*y[i])
77        for j in range(n_bed-1):
78            if distance[j] <= r:
79                if distance[j+1] > r:
80                    z[i] = bed[j] + (bed[j+1] - bed[j])/(distance[j+1] - distance[j])*(r - distance[j])
81    return z
82
83domain.set_quantity('elevation', bed_z)
84
85#---------
86# Friction
87domain.set_quantity('friction', Manning)
88
89#---------------------------------
90# Function for initial water elevation
91# (stage)
92def level(x,y):
93    z = bed_z(x,y)
94    n = x.shape[0]
95    stage = 0*x
96    for i in range(n):
97        stage[i] = stage0
98    return stage
99
100
101#def outflow_stage(t):
102#    return [stage1, 0 , 0]
103
104
105domain.set_quantity('stage', level)
106
107#---------------------------
108# Set up boundary conditions
109DD_BC_INNER = Dirichlet_Discharge_boundary(domain, stage0, wh0)
110DD_BC_OUTER = Dirichlet_Discharge_boundary(domain, stage1, wh1)
111
112domain.set_boundary({'inner': DD_BC_INNER, 'outer': DD_BC_OUTER})
113
114#------------------
115# Order of accuracy
116domain.default_order = 2
117domain.beta_w      = 1.0
118domain.beta_w_dry  = 0.2
119domain.beta_uh     = 1.0
120domain.beta_uh_dry = 0.2
121domain.beta_vh     = 1.0
122domain.beta_vh_dry = 0.2
123domain.CFL = 0.5
124
125#domain.smooth = True
126
127
128# domain.initialise_visualiser()
129# domain.visualiser.coloring['stage'] = True
130# domain.visualiser.scale_z['stage'] = 2.0
131# domain.visualiser.scale_z['elevation'] = 0.05
132
133
134#domain.initialise_visualiser()
135#    #domain.visualiser.coloring['stage'] = True
136#domain.visualiser.scale_z['stage'] = 2.0
137#domain.visualiser.scale_z['elevation'] = 0.05
138#
139#
140
141domain.initialise_visualiser()
142#from anuga.visualiser.vtk_realtime_visualiser import Visualiser
143
144#from realtime_visualisation_new import Visualiser
145#vis = Visualiser(domain,title="stage")
146#vis.setup['elevation'] = True
147#vis.updating['stage'] = True
148#vis.qcolor['stage'] = (0.0,0.0,0.8)
149#vis.coloring['stage']= True
150##vxmom = Visualiser(domain,title='xmomentum',scale_z=10.0)
151##vymom = Visualiser(domain,title='ymomentum',scale_z=10.0)
152
153stage = domain.quantities['stage']
154
155#----------
156# Evolution
157import time
158
159f = open("circular_hydraulic_jump_true.txt","w")
160
161t0 = time.time()
162for t in domain.evolve(yieldstep = .02, finaltime = 3.0):
163    domain.write_time()
164    #vis.update()
165    exp = '(xmomentum**2 + ymomentum**2)**0.5'
166    radial_momentum = domain.create_quantity_from_expression(exp)
167
168    print 'outer stage      ', stage.get_values(location='vertices',
169                                            indices=[typical_outer[0]])
170    print '      radial mom ', \
171          radial_momentum.get_values(location='centroids',
172                                     indices=[typical_outer[0]])
173
174    print 'inner stage      ', stage.get_values(location='centroids',
175                                            indices=[typical_inner[0]])
176    print '      radial mom ', \
177          radial_momentum.get_values(location='centroids',
178                                     indices=[typical_inner[0]])
179
180#    f.write('time = %25.15e wall clock time %g \n' % (domain.time, time.time()))
181#    f.write('%10.3f %25.15e %25.15e %25.15e %25.15e \n' % (domain.time, inner_stage, inner_radial_mom, outer_stage, outer_radial_mom))
182
183    f.write('time = %25.15e wall clock time %g \n' % (domain.time, time.time()))
184    f.write('%g \n' % stage.get_values(location='centroids',
185                                   indices=[typical_outer[0]])[0])
186
187f.close()
188
189print 'That took %.2f seconds' %(time.time()-t0)
Note: See TracBrowser for help on using the repository browser.