1
<?xml version='1.0' encoding='utf-8'?>
2
<shallow_water_options>
4
<string_value lines="1">wave_A</string_value>
8
<integer_value rank="0">3</integer_value>
10
<mesh name="CoordinateMesh">
11
<from_file file_name="src/mesh_A">
12
<format name="triangle"/>
14
<integer_value rank="0">1</integer_value>
21
<mesh name="VelocityMesh">
23
<mesh name="PeriodicMesh"/>
25
<string_value>discontinuous</string_value>
32
<mesh name="PressureMesh">
34
<mesh name="PeriodicMesh"/>
37
<integer_value rank="0">2</integer_value>
45
<mesh name="PeriodicMesh">
47
<mesh name="CoordinateMesh"/>
48
<periodic_boundary_conditions name="periodicity">
49
<physical_boundary_ids>
50
<integer_value shape="1" rank="1">1</integer_value>
51
</physical_boundary_ids>
52
<aliased_boundary_ids>
53
<integer_value shape="1" rank="1">2</integer_value>
54
</aliased_boundary_ids>
56
<string_value lines="20" type="python">def val(X,t):
58
result[0]=result[0]-1.0
59
return result</string_value>
61
</periodic_boundary_conditions>
69
<integer_value rank="0">4</integer_value>
75
<string_value>vtk</string_value>
77
<dump_period_in_timesteps>
79
<integer_value rank="0">1</integer_value>
81
</dump_period_in_timesteps>
82
<output_mesh name="CoordinateMesh"/>
86
<real_value rank="0">0</real_value>
89
<real_value rank="0">0.25</real_value>
91
<nonlinear_iterations>
92
<integer_value rank="0">1</integer_value>
93
</nonlinear_iterations>
95
<real_value rank="0">1</real_value>
101
<real_value rank="0">1</real_value>
103
<vector_field name="GravityDirection" rank="1">
105
<mesh name="CoordinateMesh"/>
106
<value name="WholeMesh">
108
<real_value shape="3" dim1="dim" rank="1">0 0 -1</real_value>
116
<exclude_from_detectors/>
124
</physical_parameters>
125
<material_phase name="Fluid">
126
<vector_field name="Velocity" rank="1">
128
<mesh name="VelocityMesh"/>
129
<equation name="ShallowWater"/>
130
<spatial_discretisation>
131
<discontinuous_galerkin>
135
</discontinuous_galerkin>
136
<conservative_advection>
137
<real_value rank="0">0</real_value>
138
</conservative_advection>
139
</spatial_discretisation>
141
<iterative_method name="preonly"/>
142
<preconditioner name="lu"/>
144
<real_value rank="0">1e-07</real_value>
147
<integer_value rank="0">500</integer_value>
149
<never_ignore_solver_failures/>
154
<initial_condition name="WholeMesh">
156
<string_value lines="20" type="python">def val(X, t):
157
import shallow_water_optimisation_revolve as constants
158
return constants.u_exact(X[0], 0.0)</string_value>
166
</previous_time_step>
172
<include_in_convergence/>
175
<include_in_detectors/>
178
<include_in_steady_state/>
180
<consistent_interpolation/>
183
<scalar_field name="LayerThickness" rank="0">
185
<mesh name="PressureMesh"/>
186
<spatial_discretisation>
187
<continuous_galerkin>
189
<exclude_advection_terms/>
191
</continuous_galerkin>
192
<conservative_advection>
193
<real_value rank="0">0</real_value>
194
</conservative_advection>
195
</spatial_discretisation>
196
<temporal_discretisation>
198
<real_value rank="0">0.5</real_value>
201
<real_value rank="0">1</real_value>
203
</temporal_discretisation>
205
<iterative_method name="preonly"/>
206
<preconditioner name="lu"/>
208
<real_value rank="0">1e-07</real_value>
211
<integer_value rank="0">500</integer_value>
213
<never_ignore_solver_failures/>
214
<cache_solver_context/>
219
<initial_condition name="WholeMesh">
221
<string_value lines="20" type="python">def val(X, t):
222
import shallow_water_optimisation_revolve as constants
223
#return constants.eta_exact(X[0], 0.0)
224
# Instead of prescribing the exact eta we will optimise to it
225
return 1.0</string_value>
228
<mean_layer_thickness>
229
<real_value rank="0">1</real_value>
230
</mean_layer_thickness>
233
<consistent_interpolation/>
236
<scalar_field name="AnalyticalLayerThickness" rank="0">
238
<mesh name="PressureMesh"/>
239
<value name="WholeMesh">
241
<string_value lines="20" type="python">def val(X,t):
242
import shallow_water_optimisation_revolve as constants
244
return constants.eta_exact(x, t)</string_value>
250
<exclude_from_detectors/>
257
<scalar_field name="LayerThicknessError" rank="0">
259
<algorithm source_field_2_type="scalar" name="scalar_difference" source_field_1_name="LayerThickness" source_field_2_name="AnalyticalLayerThickness" material_phase_support="single" source_field_1_type="scalar">
260
<absolute_difference/>
262
<mesh name="PressureMesh"/>
266
<include_in_convergence/>
269
<include_in_detectors/>
272
<include_in_steady_state/>
279
<vector_field name="AnalyticalVelocity" rank="1">
281
<mesh name="VelocityMesh"/>
282
<value name="WholeMesh">
284
<string_value lines="20" type="python">def val(X,t):
285
import shallow_water_optimisation_revolve as constants
287
return constants.u_exact(x, t)</string_value>
295
<exclude_from_detectors/>
302
<vector_field name="VelocityError" rank="1">
304
<algorithm source_field_2_type="vector" name="vector_difference" source_field_1_name="Velocity" source_field_2_name="AnalyticalVelocity" material_phase_support="single" source_field_1_type="vector">
305
<absolute_difference/>
307
<mesh name="VelocityMesh"/>
313
<include_in_convergence/>
316
<include_in_detectors/>
319
<include_in_steady_state/>
329
<max_memory_checkpoints>
330
<integer_value rank="0">5</integer_value>
331
</max_memory_checkpoints>
332
<max_disk_checkpoints>
333
<integer_value rank="0">0</integer_value>
334
</max_disk_checkpoints>
336
<functional name="integral_eta_t1">
338
<algorithm name="functional_value">
339
<string_value lines="20" type="python">J = 0.0
340
T1 = 0.5 # the time at which to evaluate
341
T2 = 1.0 # the time at which to evaluate
345
if time < T1 <= time+dt:
347
elif time < T2 <= time+dt:
349
if time < T <= time+dt:
351
eta_prev = states[n-1]["Fluid"].scalar_fields["LayerThickness"]
352
eta = states[n]["Fluid"].scalar_fields["LayerThickness"]
353
eta_exact_prev = states[n-1]["Fluid"].scalar_fields["AnalyticalLayerThickness"]
354
eta_exact = states[n]["Fluid"].scalar_fields["AnalyticalLayerThickness"]
356
# We want to temporally interpolate to evaluate eta at t=1.0
357
alpha = (time + dt - T) / dt
358
assert 0 <= alpha < 1
359
tmp_eta = alpha * (eta_prev.val - eta_exact_prev.val) + (1-alpha) * (eta.val - eta_exact.val)
361
# Now we want to integrate that over space
362
coord = states[0]["Fluid"].vector_fields["Coordinate"]
363
assert eta.element_count == eta_prev.element_count == coord.element_count
364
for ele in range(coord.element_count):
365
t = Transform(ele, coord)
366
shape = eta_prev.ele_shape(ele)
367
mass = t.shape_shape(shape, shape)
368
nodes = eta_prev.ele_nodes(ele)
369
J = J + numpy.dot(tmp_eta[nodes], numpy.dot(mass, tmp_eta[nodes]))</string_value>
375
<functional_dependencies>
376
<algorithm name="functional_dependencies">
377
<string_value lines="20" type="python">def dependencies(times, timestep):
378
if times[0] < 0.5 <= times[1] or times[0] < 1.0 <= times[1]:
379
return {"Fluid::Coordinate": [0],
380
"Fluid::LayerThickness": [timestep-1, timestep],
381
"Fluid::AnalyticalLayerThickness": [timestep-1, timestep]
385
return {}</string_value>
387
</functional_dependencies>
390
<control name="InitEta">
391
<type field_name="Fluid::LayerThickness" name="initial_condition"/>
395
</shallow_water_options>