1 function U = fv_conv_diff(model,model_data)
2 %
function fv_conv_diff(model,model_data)
4 %
function performing a full
explicit fv-simulation of a
5 % convection diffusion problem
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}}``
14 % required fields of model:
16 % nt : number of time-intervals until T, i.e. nt+1
17 % solution slices are computed
19 % plus additional parameters required by init_values, conv_flux, and diff_flux
21 % Bernard Haasdonk 25.9.2005
24 error(
'wrong number of parameters!');
27 grid = model_data.grid;
28 U = zeros(size(grid.CX,1),model.nt+1);
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;
36 if model.verbose >= 19
37 disp([
'entered time-loop step ',num2str(t)]);
39 %
if (t==1) || (num_conv_flux.time_dependent)
40 if model.verbose >= 19
41 disp(
'computing convective flux ');
43 num_conv_flux = model.num_conv_flux_ptr(model,model_data,U(:,t));
46 % diffusive flux is always time dependent:
47 num_diff_flux = model.num_diff_flux_ptr(model,model_data,U(:,t));
49 % Check CFL-condition, Mario Dissertation p. 19:
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)|
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);
59 if model.dt < 0.1*dt_max
61 disp([
'currently set dt = ',num2str(model.dt), ...
62 ' can be chosen at least 10 times as large.']);
64 elseif model.dt > dt_max
66 disp([
'maximum allowable timestep due to CFL-cond: ',num2str(dt_max)]);
67 disp([
'currently set dt = ',num2str(model.dt),
' is too large!']);
73 disp(
'stop before fv_step')
79 NU = fv_conv_diff_step(U(:,t),num_conv_flux,num_diff_flux,grid,model);
83 if model.
verbose>=5 % linebreak in fprint-list of dots by fv_conv_diff_step
function r = verbose(level, message, messageId)
This function displays messages depending on a message-id and/or a level. Aditionally you can set/res...