rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
diffusivity_buckley_leverett_derivative.m
1 function diffusivity = diffusivity_buckley_leverett_derivative(glob, U, params)
2 % function diffusivity = diffusivity_buckley_leverett_derivative(glob, U, params)
3 %
4 % function computing derivative of an nonlinear diffusivity for the Buckley-Leverett problem with
5 % respect to `u` :
6 % `` \partial_u k(x,u) = K p_c''(u) \lambda_n(u) f_w(u) + p_c'(u) \left (\lambda_n'(u)f_w(u) + \lambda_n(u) f_w'(u) \right) ``
7 % `` = -K\frac{\lambda}{\mu_1} \left[
8 % u^{\frac{2+2\lambda-\lambda^2}{\lambda}}
9 % \left( \frac{\lambda_n(u) m'(u)}{(m(u))^2} + \frac{\lambda_n'(u)}{m(u)} \right)
10 % + u^{\frac{2+\lambda-\lambda^2}{\lambda}}
11 % \frac{\lambda_n(u)}{m(u)} \left(\frac{2\lambda-\lambda^2+2}{\lambda}\right) \right]``
12 % with
13 % ``p_c(u) = u^{-\lambda},``
14 % ``p_c'(u) = -\lambda u^{-\lambda-1},``
15 % ``p_c''(u) = (\lambda^2+\lambda) {u^{-\lambda-2}},``
16 % ``f_w(u) = \frac{\lambda_w(u)}{\lambda_w(u)+\lambda_n(u)},``
17 % ``\lambda_w(u) = \frac{u^{\frac{2+3\lambda}{\lambda}}}{\mu_1},``
18 % ``\lambda_n(u) = \frac{(1-u)^2 (1-u^{\frac{2+\lambda}{\lambda})}}{\mu_2},``
19 % ``\lambda_w'(u) = \frac{2+3\lambda}{\lambda} \frac{u^{\frac{2+2\lambda}{\lambda}}}{\mu_1},``
20 % ``\lambda_n'(u) = \frac{-1}{\mu_2} \left(2(1-u) (1-u^{\frac{2+\lambda}{\lambda})} + \frac{2+\lambda}{\lambda}(1-u)^2 (1-u^{\frac{2}{\lambda}}) \right),``
21 % ``m(u) = \lambda_w(u) + \lambda_n(u),``
22 % ``m'(u) = \lambda_w'(u) + \lambda_n'(u).``
23 %
24 % parameters:
25 % U : solution at points in 'glob'
26 %
27 % required fields of params:
28 % diff_K : diffussion factor `K`
29 % bl_mu_1 : viscosity factor `\mu_1`
30 % bl_mu_2 : viscosity factor `\mu_2`
31 % bl_lambda : material parameter `\lambda`
32 %
33 % See also diffusivity_buckley_leverett().
34 %
35 % generated fields of diffusivity:
36 % epsilon: upper bound on diffusivity value
37 % K: vector with diffusivity values
38 
39 % glob column check
40 if params.debug
41  if ~isempty(glob) && size(glob,1) < size(glob,2)
42  warning('coordinates in variable glob are given row-wise, but expected them to be column-wise');
43  if params.debug > 2
44  keyboard;
45  end
46  end
47 end
48 
49 ld = params.bl_lambda;
50 mu1 = params.bl_mu1;
51 mu2 = params.bl_mu2;
52 
53 lambda1 = U.^((2+3*ld)/ld)/mu1;
54 lambda2 = (1-U).^2.*(1-U.^(2/ld+1))/mu2;
55 
56 mobility = lambda1 + lambda2;
57 
58 lambda1d = U.^((2+2*ld)/ld)/mu1*(2/ld+3);
59 lambda2d = -1/mu2*(2*(1-U).*(1-U.^(2/ld+1)) + (1-U).^2.*(1-U.^(2/ld)*(2/ld+1)));
60 
61 mobilityd = lambda1d + lambda2d;
62 %gud = 2*U./params.diff_mu1;
63 %hu = lambda1+lambda2;
64 %hud = gud + 2*(U-1)./params.diff_mu2;
65 %fu = lambda1./(hu);
66 %fud = gud./hu - (gu.*hud)./(hu.^2);
67 
68 diffusivity.K = + params.diff_K * ld/mu1 ...
69  * U.^(2-ld+2/ld) .* ( ...
70  U .* ( (lambda2.*mobilityd)./mobility.^2 ...
71  + lambda2d./mobility ) ...
72  + lambda2./mobility * (2-ld+2/ld) );
73 
74 diffusivity.epsilon = max(diffusivity.K);
75 
76 if params.debug
77  if ( any(isnan(diffusivity.K) | isinf(diffusivity.K)) )
78  error('diffusion factor has invalid elements');
79  elseif ( max(abs(imag(U))) > 1e-6 )
80  error('U has non-trivial imaginary addend.');
81  end
82 end
83 
84 if params.decomp_mode>0
85  error('function is nonlinear and does not support affine decomposition!');
86 end
87