rbmatlab  1.13.10
 All Classes Namespaces Files Functions Variables Groups Pages
diffusivity.m
1 function diffusivity = diffusivity(model,X,Y,U)
2 %function diffusivity = diffusivity(model,[X],[Y],[U])
3 %
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
10 %
11 % fields of model:
12 % name_diffusivity = 'none', 'homogeneous', 'linear_gradient'
13 %
14 % in case of 'homogeneous'
15 % k : scalar diffusivity parameter
16 %
17 % in case of 'linear_gradient'
18 % diff_left : value at left border
19 % diff_right : value at right border
20 %
21 % optional: time
22 %
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
26 %
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
37 %
38 % in 'coefficients' mode, the parameters in brackets are empty
39 
40 % Bernard Haasdonk 11.4.2006
41 
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;
47 
48 diffusivity = [];
49 diffusivity.epsilon = 0;
50 
51 if isequal(model.name_diffusivity,'none')
52  diffusivity.K = zeros(length(X),1);
53 elseif isequal(model.name_diffusivity,'homogeneous')
54  if decomp_mode == 0
55  diffusivity.epsilon = model.k;
56  diffusivity.K = model.k * ones(length(X),1);
57  elseif (decomp_mode == 1)
58  d = [];
59  % single component independent whether k in mu
60  d.epsilon = model.k;
61  d.K = ones(length(X),1);
62  diffusivity = {d};
63  else % decomp_mode ==2, single component
64  diffusivity = model.k;
65  end;
66  respected_decomp_mode = 1;
67 elseif isequal(model.name_diffusivity,'homogeneous2') ...
68  || isequal(model.name_diffusivity,'linear_gradient')
69 
70  if decomp_mode == 0
71  diffusivity.epsilon = model.k;
72  diffusivity.K = model.k * speye(2*length(X));
73  elseif (decomp_mode == 1)
74  d = [];
75  % single component independent whether k in mu
76  d.epsilon = model.k;
77  d.K = speye(2*length(X));%ones(length(X),1);
78  diffusivity = {d};
79  else % decomp_mode ==2, single component
80  diffusivity = model.k;
81  end;
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) );
87  if decomp_mode == 0
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)
91  d = [];
92  d.epsilon = max(model.diff_left, model.diff_right);
93  d.K = lin_grad(X);
94  diffusivity = {d};
95  else % decomp_mode == 2
96  diffusivity = temp_m;
97  end
98 elseif isequal(model.name_diffusivity,'richards_nonlinear')
99  % How can I construct a tensor for each dof?
100  vlen = size(U,1);
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);
109 else
110  error('diffusivity function unknown');
111 end;
112 
113 if decomp_mode>0 && respected_decomp_mode==0
114  error('function does not support affine decomposition!');
115 end;
116 
117 %| \docupdate