source: anuga_work/development/convergence_okushiri_2008/compare_timeseries.py @ 6409

Last change on this file since 6409 was 5397, checked in by Leharne, 17 years ago

Output timeseries at gauge locations to a new text file

File size: 4.8 KB
Line 
1"""Verify that simulation produced by ANUGA compares to published
2validation timeseries ch5, ch7 and ch9 as well as the boundary timeseries.
3
4RMS norm is printed and plots are produced.
5"""
6
7from Numeric import allclose, argmin, argmax
8from Scientific.IO.NetCDF import NetCDFFile
9
10from anuga.abstract_2d_finite_volumes.util import file_function
11from anuga.utilities.numerical_tools import\
12     ensure_numeric, cov, get_machine_precision
13
14import project_truescale
15
16try:
17    from pylab import ion, hold, plot, title, legend, xlabel, ylabel, savefig
18except:
19    plotting = False
20else:
21    plotting = True
22
23print 'plotting', plotting
24#plotting = False
25
26#-------------------------
27# Basic data
28#-------------------------
29
30finaltime = 450
31timestep = 1
32
33gauge_locations = [[0.000, 678.4]] # Boundary gauge
34gauge_locations += [[1808.4, 478.4],  [1808.4, 678.4],  [1808.4, 878.4]] #Ch 5-7-9
35gauge_names = ['Boundary', 'ch5', 'ch7', 'ch9']
36
37validation_data = {}
38for key in gauge_names:
39    validation_data[key] = []
40
41
42#-------------------------
43# Read validation dataa
44#-------------------------
45
46print 'Reading', project_truescale.boundary_filename
47fid = NetCDFFile(project_truescale.boundary_filename, 'r')
48input_time = fid.variables['time'][:]
49validation_data['Boundary'] = fid.variables['stage'][:]
50
51reference_time = []
52fid = open(project_truescale.validation_filename)
53lines = fid.readlines()
54fid.close()
55
56for i, line in enumerate(lines[1:]):
57    if i == len(input_time): break
58   
59    fields = line.split()
60
61    reference_time.append(float(fields[0]))    # Record reference time
62    for j, key in enumerate(gauge_names[1:]):  # Omit boundary gauge
63        value = float(fields[1:][j])           # Omit time
64        validation_data[key].append(value) 
65
66
67# Checks
68assert reference_time[0] == 0.0
69assert reference_time[-1] == finaltime
70assert allclose(reference_time, input_time)
71
72for key in gauge_names:
73    validation_data[key] = ensure_numeric(validation_data[key])
74
75
76#--------------------------------------------------
77# Read and interpolate model output
78#--------------------------------------------------
79
80import sys
81if len(sys.argv) > 1:
82    sww_filename = sys.argv[1]
83else:   
84    sww_filename = project_truescale.output_filename
85   
86f = file_function(sww_filename,
87                  quantities='stage',
88                  interpolation_points=gauge_locations,
89                  use_cache=True,
90                  verbose=True)
91
92#--------------------------------------------------
93# Check max runup
94#--------------------------------------------------
95
96from anuga.shallow_water.data_manager import get_maximum_inundation_elevation
97from anuga.shallow_water.data_manager import get_maximum_inundation_location
98from anuga.utilities.polygon import is_inside_polygon
99
100q = get_maximum_inundation_elevation(sww_filename, tolerance=.4)
101loc = get_maximum_inundation_location(sww_filename, tolerance=.4)
102
103print 'Max runup elevation: ', q
104print 'Max runup location:  ', loc
105
106
107
108#--------------------------------------------------
109# Compare model output to validation data
110#--------------------------------------------------
111
112eps = get_machine_precision()
113for k, name in enumerate(gauge_names):
114    sqsum = 0
115    denom = 0
116    model = []
117    print 
118    print 'Validating ' + name
119    observed_timeseries = validation_data[name]
120    for i, t in enumerate(reference_time):
121        model.append(f(t, point_id=k)[0])
122
123
124    # Covariance measures   
125    res = cov(observed_timeseries, model)     
126    print 'Covariance = %.18e' %res
127
128    # Difference measures   
129    res = sum(abs(observed_timeseries-model))/len(model)     
130    print 'Accumulated difference = %.18e' %res
131
132
133    # Extrema
134    res = abs(max(observed_timeseries)-max(model))
135    print 'Difference in maxima = %.18e' %res
136
137   
138    res = abs(min(observed_timeseries)-min(model))
139    print 'Difference in minima = %.18e' %res
140
141    # Locations of extrema
142    i0 = argmax(observed_timeseries)
143    i1 = argmax(model)
144    res = abs(reference_time[i1] - reference_time[i0])
145    print 'Timelag between maxima = %.18e' %res
146   
147
148    i0 = argmin(observed_timeseries)
149    i1 = argmin(model)
150    res = abs(reference_time[i1] - reference_time[i0])
151    print 'Timelag between minima = %.18e' %res
152
153
154    # Write timeseries at gauge locations to file
155    filename=name+'_truescale_model.txt'
156    fid=open(filename,'w')
157    fid.write('Time (s), Stage (m)\n')
158    for i, t in enumerate(reference_time):
159        v=model[i]
160        fid.write('%.2f, %.2f\n' %(t, v))
161
162    fid.close()       
163   
164
165    if plotting is True:
166        ion()
167        hold(False)
168   
169        plot(reference_time, validation_data[name], 'r-',
170             reference_time, model, 'k-')
171        title('Gauge %s' %name)
172        xlabel('time(s)')
173        ylabel('stage (m)')   
174        legend(('Observed', 'Modelled'), shadow=True, loc='upper left')
175        savefig(name, dpi = 300)       
176
177        raw_input('Next')
178
179
180
Note: See TracBrowser for help on using the repository browser.