rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
diffusivity_buckley_leverett_simple_derivative.m
1 function diffusivity = diffusivity_buckley_leverett_simple_derivative(glob, U, params)
2 % function diffusivity = diffusivity_buckley_leverett_simple_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^{2-\lambda}
9 % \left( \frac{\lambda_n(u) m'(u)}{(m(u))^2} + \frac{\lambda_n'(u)}{m(u)} \right)
10 % + u^{1-\lambda}
11 % \frac{\lambda_n(u)}{m(u)} \left(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^3}{\mu_1},``
18 % ``\lambda_n(u) = \frac{(1-u)^3}{\mu_2},``
19 % ``\lambda_w'(u) = 3 \frac{u^{2}}{\mu_1},``
20 % ``\lambda_n'(u) = -3 \frac{(1-u)^2}{\mu_2},``
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_mu1 : viscosity factor `\mu_1`
30 % bl_mu2 : viscosity factor `\mu_2`
31 % bl_lambda : material parameter `\lambda`
32 %
33 % See also diffusivity_buckley_leverett_simple().
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 if params.newton_regularisation && ( ( max(U) > 1 )... % && max(U)-1e7*eps < 1 )...
50  || ( min(U) < 0 ) )%&& min(U)+1e7*eps > 0 ) )
51  U(U>1) = 1;
52  U(U<0) = 0;
53 end
54 
55 
56 ld = params.bl_lambda;
57 mu1 = params.bl_mu1;
58 mu2 = params.bl_mu2;
59 
60 lambda1 = (U(:).^3)/mu1;
61 lambda2 = ((1-U(:)).^3)/mu2;
62 
63 mobility = lambda1 + lambda2;
64 
65 lambda1d = 3*(U(:).^2)/mu1;
66 lambda2d = -3*((1-U(:)).^2)/mu2;
67 
68 mobilityd = lambda1d + lambda2d;
69 %gud = 2*U./params.diff_mu1;
70 %hu = lambda1+lambda2;
71 %hud = gud + 2*(U-1)./params.diff_mu2;
72 %fu = lambda1./(hu);
73 %fud = gud./hu - (gu.*hud)./(hu.^2);
74 
75 diffusivity.K = + params.diff_K * ld/mu1 ...
76  * real(U.^(2-ld)) .* ( ...
77  U .* ( (lambda2.*mobilityd)./mobility.^2 ...
78  + lambda2d./mobility ) ...
79  + lambda2./mobility * (2-ld) );
80 
81 
82 diffusivity.epsilon = max(diffusivity.K);
83 
84 if params.debug
85  if ( any(isnan(diffusivity.K) | isinf(diffusivity.K)) )
86  error('diffusion factor has invalid elements');
87  elseif ( max(abs(imag(U))) > 1e-6 )
88  error('U has non-trivial imaginary addend.');
89  end
90 end
91 
92 if params.decomp_mode>0
93  error('function is nonlinear and does not support affine decomposition!');
94 end
95