rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
fv_conv_diff.m
1 function U = fv_conv_diff(model,model_data)
2 %function fv_conv_diff(model,model_data)
3 %
4 % function performing a full explicit fv-simulation of a
5 % convection diffusion problem
6 %
7 % ``u_t + \nabla \cdot ( f(u,x,t) - k (x,t) \nabla u) = 0``
8 % `` u(x,t) = u_0 \quad\mbox{for}\quad t = 0 ``
9 % `` u(x,0) = u_{\mbox{dir}} \quad\mbox{for}
10 % \quad x \in \partial \Omega_{\mbox{dir}}``
11 % `` ( f - k \nabla u) \cdot n = c_{\mbox{neu}}
12 % \quad\mbox{for}\quad x \in \partial \Omega_{\mbox{neu}}``
13 %
14 % required fields of model:
15 % T : final time
16 % nt : number of time-intervals until T, i.e. nt+1
17 % solution slices are computed
18 %
19 % plus additional parameters required by init_values, conv_flux, and diff_flux
20 
21 % Bernard Haasdonk 25.9.2005
22 
23  if nargin ~= 2
24  error('wrong number of parameters!');
25  end;
26 
27  grid = model_data.grid;
28  U = zeros(size(grid.CX,1),model.nt+1);
29 
30  % initial values by midpoint evaluation
31  U(:,1) = model.init_values_ptr([grid.CX,grid.CY],model);
32  model.dt = model.T/model.nt;
33 
34  % loop over fv-steps
35  for t = 1:model.nt
36  if model.verbose >= 19
37  disp(['entered time-loop step ',num2str(t)]);
38  end;
39  % if (t==1) || (num_conv_flux.time_dependent)
40  if model.verbose >= 19
41  disp('computing convective flux ');
42  end;
43  num_conv_flux = model.num_conv_flux_ptr(model,model_data,U(:,t));
44  % end;
45 
46  % diffusive flux is always time dependent:
47  num_diff_flux = model.num_diff_flux_ptr(model,model_data,U(:,t));
48 
49  % Check CFL-condition, Mario Dissertation p. 19:
50  Xi = 0.00001;
51  % num_flux.Lg = max(max(grid.S)) * model.c * 0.25;
52  % Lipschitz-constant of num-flux
53  % for LxF = sup_ij |S_ij|* sup_xy |v(x,y)|
54  % epsilon = model.k;
55  dt_max = (1-Xi)*grid.alpha^3*(grid.hmin^2)/...
56  (grid.alpha*num_conv_flux.Lg*grid.hmin+...
57  num_diff_flux.epsilon);
58  if model.verbose >= 9
59  if model.dt < 0.1*dt_max
60  if model.verbose > 9
61  disp(['currently set dt = ',num2str(model.dt), ...
62  ' can be chosen at least 10 times as large.']);
63  end;
64  elseif model.dt > dt_max
65  if model.verbose > 9
66  disp(['maximum allowable timestep due to CFL-cond: ',num2str(dt_max)]);
67  disp(['currently set dt = ',num2str(model.dt),' is too large!']);
68  end;
69  end;
70  end;
71 
72  if model.verbose >= 9
73  disp('stop before fv_step')
74  if model.verbose >= 100
75  keyboard;
76  end;
77  end;
78 
79  NU = fv_conv_diff_step(U(:,t),num_conv_flux,num_diff_flux,grid,model);
80  U(:,t+1) = NU;
81  end;
82 
83  if model.verbose>=5 % linebreak in fprint-list of dots by fv_conv_diff_step
84  fprintf('\n');
85  end;
86 
87 
function r = verbose(level, message, messageId)
This function displays messages depending on a message-id and/or a level. Aditionally you can set/res...
Definition: verbose.m:17