rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
conv_flux_buckley_leverett_derivative.m
1 function [flux,lambda] = conv_flux_buckley_leverett_derivative(glob, U, params)
2 % function [flux,lambda] = conv_flux_buckley_leverett_derivative(glob, U, params)
3 %
4 % function computing the derivate of a nonlinear convection function for a
5 % Buckley-Leverett problem.
6 % ``\partial_{u} f(x,u) = \frac{2M u (1-u)}{(u^2+M(1-U)^2)^2}
7 % \quad 0\leq u \leq 1``.
8 %
9 % required fields of params:
10 % bl_k : scaling factor for diffusivity `k`
11 % bl_M : steepness factor of curve `M`
12 % U : DoF vector of discrete solution
13 % grid : pointer to grid structure for neighbour
14 % information
15 %
16 % See also conv_flux_buckley_leverett()
17 %
18 
19 % glob column check
20 if params.debug
21  if ~isempty(glob) && size(glob,1) < size(glob,2)
22  warning('coordinates in variable glob are given row-wise, but expected them to be column-wise');
23  if params.debug > 2
24  keyboard;
25  end
26  end
27 end
28 
29 X = glob(:,1);
30 Y = glob(:,2);
31 
32 %grid = params.grid;
33 %
34 %U = params.U;
35 %tmpU = repmat(U, 1, grid.nneigh);
36 %neiU = tmpU;
37 %real_nb_ind = grid.NBI > 0;
38 %neiU(real_nb_ind) = U(grid.NBI(real_nb_ind));
39 %U = 0.5 * (tmpU + neiU);
40 
41 %vf = @(X,Y) [2*(2*X(:)-pi/2)-(4/3*Y(:)-pi/2)).^2.*cos((2*X(:)-pi/2)...
42 % +(4/3*Y(:)-pi/2))+0.1,...
43 % 2*((2*X(:)-pi/2)-(4/3*Y(:)-pi/2)).^2.*sin((2*X(:)-pi/2)...
44 % +(4/3*Y(:)-pi/2))+0.1];
45 %vf = @(X,Y) [...
46 % ((X(:)-Y(:))).^2.*cos((X(:)+Y(:))*pi/2)+0.1, ...
47 % ((X(:)-Y(:))).^2.*sin((X(:)+Y(:))*pi/2)+0.1 ...
48 % ];
49 
50 %vf = @(X,Y) [abs((X(:)-Y(:))).^0.50.*cos((X(:)+Y(:))*pi/2)+0.5, ...
51 % abs((X(:)-Y(:))).^0.50.*sin((X(:)+Y(:))*pi/2)+0.5];
52 %vvf = vf(X,Y);
53 %vvf(X(:)>Y(:),[1,2])=vvf(X(:)>Y(:),[2,1]);
54 
55 
56 if params.debug && ( max(U)+eps > 1 || min(U) - eps < 0 )
57  error('U is outside admissable bounds [0,1]');
58 end
59 
60 M = params.bl_M;
61 
62 %flux = params.bl_k * (2*U(:)*params.bl_M)./(U(:).^2 + params.bl_M).^2;
63 flux = params.bl_k * ...
64  ( 2*M*U(:) .* (1-U(:)) ) ...
65  ./...
66  ( U(:).^2 + M * (1-U(:)).^2 ).^2;
67 %flux = [flux, flux];
68 flux = [ flux, flux ] .* [ones(size(flux)), params.conv_a*X(:)];
69 
70 lambda = max(flux);
71 
72 if params.decomp_mode>0
73  error('function is nonlinear and does not support affine decomposition!');
74 end
75 
function [ flux , lambda ] = conv_flux_buckley_leverett(glob, U, params)
convective flux for Buckley-Leverett problem