2 %
function simulating a simple linear convection scheme with source term
3 % u_t + b*Du + cu = 0, u(x,0) = u0.
4 % u0 is 1 inside a box and 0 otherwise. This box gets transported in
5 % direction b with a slowing term c.
6 % returns 1, if error to exact solution is "small enough".
9 % Martin Drohmann 26.05.2008
13 params = lin_evol_model_default;
16 params.gridtype =
'rectgrid';
17 % params.grid_initfile =
'2dsquaretriang';
19 %params.gridtype =
'rectgrid';
20 params.xnumintervals = 40;
21 params.ynumintervals = 40;
22 params.xrange = [0,1];
23 params.yrange = [0,1];
25 params.bnd_rect_corner1 = [-1, -1];
26 params.bnd_rect_corner2 = [2, 2];
28 %params.bnd_rect_index = (-2);
29 %params.neumann_values_ptr = @neumann_values_outflow;
30 params.bnd_rect_index = (-1);
37 params.axis_equal = 1;
40 %params.implict_operators_algorithm =
'eye';
41 params.c_init_up = 1.0;
42 params.c_init_lo = 1.0;
44 %params.conv_flux_ptr = @velocity_transport;
45 params.velocity_ptr = @velocity_constant;
46 params.transport_x = 0.1;
47 params.transport_y = 0.1;
49 params.flux_linear = 1;
50 params.divclean_mode = 0;
53 params.transport_source = 1;
54 params.no_lines =
true;
56 params.filecache_velocity_matrixfile_extract = 0;
58 %%%%
for using Lax-Friedrichs Flux:
59 %params.num_conv_flux_ptr = @fv_num_conv_flux_lax_friedrichs;
60 %params.lxf_lambda = [];
61 %%%params.lxf_lambda = 100;
62 %%%%
for using Engquist-Osher Flux:
63 params.num_conv_flux_ptr = @fv_num_conv_flux_engquist_osher;
65 params.flux_quad_degree = 1;
66 params.fv_expl_diff_weight = 0;
67 params.fv_expl_conv_weight = 1;
68 params.fv_expl_react_weight = 0;
70 %
for a detailed simulation we
do not need the affine parameter
72 params.affine_decomp_mode =
'complete';
74 grid = construct_grid(params);
76 model_data.grid = grid;
77 model_data.W = spdiags(grid.A,0,grid.nelements,grid.nelements);
78 params.decomp_mode = 0;
80 % initial values by midpoint evaluation
81 U0 = fv_init_values(params, model_data);
83 U = zeros(length(U0(:)),params.nt+1);
85 params.dt = params.T/params.nt;
88 params.data_const_in_time = 1;
93 if params.verbose > 19
94 disp([
'entered time-loop step ',num2str(t),
' for transport equation']);
95 elseif params.verbose > 9
99 [inc, fluxes] = fv_explicit_space(params, model_data, U(:,t), []);
101 U(:,t+1) = U(:,t) - params.dt * inc;
106 %plot_params.plot_function = @
fv_plot
107 %plot_data_sequence(params,grid,U,plot_params)
109 EX = zeros(length(U0(:)), params.nt + 1);
113 EX(:,t+1) = exp(-params.transport_source * t * dt ) * ...
114 params.init_values_ptr([grid.CX(:)-params.transport_x * t *dt, ...
115 grid.CY(:) - params.transport_y * t * dt], params);
118 err =
fv_l2_error(U(:,params.nt+1), EX(:,params.nt+1), model_data.W);