1 function diffusivity = diffusivity(model,X,Y,U)
2 %
function diffusivity = diffusivity(model,[X],[Y],[U])
4 % TODO: Add the
function values U to parameter list
5 %
function computing the diffusivity of a convection problem by pointwise
6 % evaluation in the point sequences indicated by X and Y.
7 % fields of diffusivity:
8 % epsilon: upper bound on diffusivity value
9 % K: vector with diffusivity values
12 % name_diffusivity =
'none',
'homogeneous',
'linear_gradient'
14 % in
case of
'homogeneous'
15 % k : scalar diffusivity parameter
17 % in
case of
'linear_gradient'
18 % diff_left : value at left border
19 % diff_right : value at right border
23 % Function supports affine decomposition, i.e. different operation modes
24 % guided by optional field affine_decomp_mode in model. See also the
25 % contents.txt
for general explanation
27 % optional fields of model:
28 % affine_decomp_mode: operation mode of the
function
29 %
'none' (
default): no parameter dependence or decomposition is
30 % performed. output is as described above.
31 %
'components': For each output argument a cell array of output
32 % arguments is returned representing the q-th component
33 % independent of the parameters given in mu_names
34 %
'coefficients': For each output argument a cell array of output
35 % arguments is returned representing the q-th coefficient
36 % dependent of the parameters given in mu_names
38 % in
'coefficients' mode, the parameters in brackets are empty
40 % Bernard Haasdonk 11.4.2006
42 % determine affine_decomposition_mode as integer
43 %decomp_mode = get_affine_decomp_mode(model);
44 decomp_mode = model.decomp_mode;
45 % flag indicating whether the computation respected the decomposition
46 respected_decomp_mode = 0;
49 diffusivity.epsilon = 0;
51 if isequal(model.name_diffusivity,
'none')
52 diffusivity.K = zeros(length(X),1);
53 elseif isequal(model.name_diffusivity,'homogeneous')
55 diffusivity.epsilon = model.k;
56 diffusivity.K = model.k * ones(length(X),1);
57 elseif (decomp_mode == 1)
59 % single component independent whether k in mu
61 d.K = ones(length(X),1);
63 else % decomp_mode ==2, single component
64 diffusivity = model.k;
66 respected_decomp_mode = 1;
67 elseif isequal(model.name_diffusivity,
'homogeneous2') ...
68 || isequal(model.name_diffusivity,
'linear_gradient')
71 diffusivity.epsilon = model.k;
72 diffusivity.K = model.k * speye(2*length(X));
73 elseif (decomp_mode == 1)
75 % single component independent whether k in mu
77 d.K = speye(2*length(X));%ones(length(X),1);
79 else % decomp_mode ==2, single component
80 diffusivity = model.k;
82 respected_decomp_mode = 1;
83 elseif isequal(model.name_diffusivity,
'linear_gradient2')
84 temp_m = (model.diff_right-model.diff_left) / ...
85 (model.xrange(2) - model.xrange(1));
86 lin_grad = @(x) (x - model.xrange(1) );
88 diffusivity.epsilon = max(model.diff_left, model.diff_right);
89 diffusivity.K = model.diff_left + (lin_grad(X) * temp_m);
90 elseif (decomp_mode == 1)
92 d.epsilon = max(model.diff_left, model.diff_right);
95 else % decomp_mode == 2
98 elseif isequal(model.name_diffusivity,
'richards_nonlinear')
99 % How can I construct a tensor
for each dof?
101 p_mu = spline_select(model);
102 U = U - model.gravity * Y.*(1+ppval(p_mu, X));
103 Kaval = model.k * model.richards_k(U
') .* model.richards_p(U');
104 diffusivity.K = spdiags(reshape([Kaval;Kaval],2*vlen,1),0,2*vlen,2*vlen);
105 diffusivity.epsilon = max(Kaval);
106 % Utemp = U
' * model.k + 0.0004;
107 % diffusivity.K = spdiags(reshape([Utemp;zeros(1,vlen)],2*vlen,1),0,2*vlen,2*vlen);
108 % diffusivity.epsilon = max(Utemp);
110 error('diffusivity
function unknown
');
113 if decomp_mode>0 && respected_decomp_mode==0
114 error('function does not support affine decomposition!
');