rbmatlab  1.13.10
 All Classes Namespaces Files Functions Variables Groups Pages
test_linear_convection.m
Go to the documentation of this file.
1 function OK = test_linear_convection
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".
7 % returns 0 otherwise
8 
9 % Martin Drohmann 26.05.2008
10 
11 OK = 1;
12 
13 params = lin_evol_model_default;
14 
15 % rectgrid or trigrid
16 params.gridtype = 'rectgrid';
17 % params.grid_initfile = '2dsquaretriang';
18 
19 %params.gridtype = 'rectgrid';
20 params.xnumintervals = 40;
21 params.ynumintervals = 40;
22 params.xrange = [0,1];
23 params.yrange = [0,1];
24 
25 params.bnd_rect_corner1 = [-1, -1];
26 params.bnd_rect_corner2 = [2, 2];
27 
28 %params.bnd_rect_index = (-2);
29 %params.neumann_values_ptr = @neumann_values_outflow;
30 params.bnd_rect_index = (-1);
31 params.dirichlet_values_ptr = @dirichlet_values_homogeneous;
32 params.c_dir = 0.0;
33 
34 params.T = 1.0;
35 params.nt = 400;
36 
37 params.axis_equal = 1;
38 
39 params.init_values_ptr = @init_values_gradient_box;
40 %params.implict_operators_algorithm = 'eye';
41 params.c_init_up = 1.0;
42 params.c_init_lo = 1.0;
43 
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;
48 params.conv_flux_ptr = @conv_flux_linear;
49 params.flux_linear = 1;
50 params.divclean_mode = 0;
51 params.verbose = 1;
52 params.debug = false;
53 params.transport_source = 1;
54 params.no_lines = true;
55 
56 params.filecache_velocity_matrixfile_extract = 0;
57 
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;
64 params.conv_flux_derivative_ptr = @conv_flux_forward_difference;
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;
69 
70 % for a detailed simulation we do not need the affine parameter
71 % decomposition
72 params.affine_decomp_mode = 'complete';
73 
74 grid = construct_grid(params);
75 
76 model_data.grid = grid;
77 model_data.W = spdiags(grid.A,0,grid.nelements,grid.nelements);
78 params.decomp_mode = 0;
79 
80 % initial values by midpoint evaluation
81 U0 = fv_init_values(params, model_data);
82 
83 U = zeros(length(U0(:)),params.nt+1);
84 U(:,1) = U0(:);
85 params.dt = params.T/params.nt;
86 dt = params.dt;
87 
88 params.data_const_in_time = 1;
89 
90 % loop over fv-steps
91 for t = 1:params.nt
92  params.t = t;
93  if params.verbose > 19
94  disp(['entered time-loop step ',num2str(t), ' for transport equation']);
95  elseif params.verbose > 9
96  fprintf('.');
97  end;
98 
99  [inc, fluxes] = fv_explicit_space(params, model_data, U(:,t), []);
100 
101  U(:,t+1) = U(:,t) - params.dt * inc;
102 
103 end
104 
105 %%%% for plotting:
106 %plot_params.plot_function = @fv_plot
107 %plot_data_sequence(params,grid,U,plot_params)
108 
109 EX = zeros(length(U0(:)), params.nt + 1);
110 EX(:,1) = U0(:);
111 
112 for t = 1:params.nt
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);
116 end
117 
118 err = fv_l2_error(U(:,params.nt+1), EX(:,params.nt+1), model_data.W);
119 if err > 0.2
120  OK = 0;
121 end
122