rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
diffusivity_buckley_leverett.m
1 function diffusivity = diffusivity_buckley_leverett(glob, U, params)
2 % function diffusivity = diffusivity_buckley_leverett(glob, U, params)
3 %
4 % function computing an nonlinear diffusivity for the buckley leverett problem
5 % ``k(u) = K p_c'(u) \cdot \lambda_2(u) f(u) ``
6 % with
7 % ``p_c(u) = u^{-\lambda},``
8 % ``p_c'(u) = -\lambda u^{-\lambda-1},``
9 % ``f(u) = \frac{\lambda_w(u)}{\lambda_w(u)+\lambda_n(u)},``
10 % ``\lambda_w(u) = \frac{u^{\frac{2+3\lambda}{\lambda}}}{\mu_1},``
11 % ``\lambda_n(u) = \frac{(1-u)^2 (1-u^{\frac{2+\lambda}{\lambda}})}{\mu_2}.``
12 %
13 % parameters:
14 % U : solution at points in 'glob'
15 %
16 % required fields of params:
17 % diff_K : diffussion factor `K`
18 % bl_mu_1 : viscosity factor `\mu_1`
19 % bl_mu_2 : viscosity factor `\mu_2`
20 % bl_lambda : mobility parameter `\lambda`
21 %
22 % See also diffusivity_buckley_leverett_derivative().
23 %
24 % generated fields of diffusivity:
25 % epsilon: upper bound on diffusivity value
26 % K: vector with diffusivity values
27 
28 % glob column check
29 if params.debug
30  if ~isempty(glob) && size(glob,1) < size(glob,2)
31  warning('coordinates in variable glob are given row-wise, but expected them to be column-wise');
32  if params.debug > 2
33  keyboard;
34  end
35  end
36  if(any(U<0))
37  error('argument function is negative, which is disallowed here');
38  end
39 end
40 
41 ld = params.bl_lambda;
42 mu1 = params.bl_mu1;
43 mu2 = params.bl_mu2;
44 
45 lambda1 = U.^((2+3*ld)/ld)/mu1;
46 lambda2 = (1-U).^2.*(1-U.^(2/ld+1))/mu2;
47 
48 mobility = lambda1 + lambda2;
49 
50 %deg1 = (1-U).^(-0.5);
51 %deg1(isinf(deg1)) = realmax;
52 
53 diffusivity.K = + params.diff_K * ld/mu1 ...
54  .* lambda2 ...
55  .* (U.^(2-ld+2/ld) ./ mobility);
56 
57 diffusivity.epsilon = max(diffusivity.K);
58 
59 if params.debug
60  if ( any(isnan(diffusivity.K) | isinf(diffusivity.K)) )
61  error('diffusion factor has invalid elements');
62  elseif ( max(abs(imag(U))) > 1e-6 )
63  error('U has non-trivial imaginary addend.');
64  end
65 end
66 
67 if params.decomp_mode>0
68  error('function is nonlinear and does not support affine decomposition!');
69 end
70