rbmatlab 0.10.01
datafunc/diffusivity.m
00001 function diffusivity = diffusivity(model,X,Y,U)
00002 %function diffusivity = diffusivity(model,[X],[Y],[U])
00003 %
00004 % TODO: Add the function values U to parameter list
00005 % function computing the diffusivity of a convection problem by pointwise
00006 % evaluation in the point sequences indicated by X and Y. 
00007 % fields of diffusivity:
00008 %     epsilon: upper bound on diffusivity value
00009 %     K: vector with diffusivity values
00010 %
00011 % fields of model:
00012 % name_diffusivity = 'none', 'homogeneous', 'linear_gradient'
00013 %
00014 % in case of 'homogeneous'
00015 % k : scalar diffusivity parameter
00016 %
00017 % in case of 'linear_gradient'
00018 % diff_left : value at left border
00019 % diff_right : value at right border
00020 %
00021 % optional: time
00022 %
00023 % Function supports affine decomposition, i.e. different operation modes
00024 % guided by optional field affine_decomp_mode in model. See also the 
00025 % contents.txt for general explanation
00026 %
00027 % optional fields of model:
00028 %   affine_decomp_mode: operation mode of the function
00029 %     'none' (default): no parameter dependence or decomposition is 
00030 %                performed. output is as described above.
00031 %     'components': For each output argument a cell array of output
00032 %                 arguments is returned representing the q-th component
00033 %                 independent of the parameters given in mu_names  
00034 %     'coefficients': For each output argument a cell array of output
00035 %                 arguments is returned representing the q-th coefficient
00036 %                 dependent of the parameters given in mu_names  
00037 %
00038 % in 'coefficients' mode, the parameters in brackets are empty
00039 
00040 % Bernard Haasdonk 11.4.2006
00041 
00042 % determine affine_decomposition_mode as integer  
00043 %decomp_mode = get_affine_decomp_mode(model);
00044 decomp_mode = model.decomp_mode;
00045 % flag indicating whether the computation respected the decomposition
00046 respected_decomp_mode = 0;
00047 
00048 diffusivity = [];
00049 diffusivity.epsilon = 0;
00050 
00051 if isequal(model.name_diffusivity,'none')
00052     diffusivity.K = zeros(length(X),1);
00053 elseif isequal(model.name_diffusivity,'homogeneous')
00054   if decomp_mode == 0
00055     diffusivity.epsilon = model.k;
00056     diffusivity.K = model.k * ones(length(X),1);
00057   elseif (decomp_mode == 1)
00058     d = [];
00059     % single component independent whether k in mu
00060     d.epsilon = model.k;
00061     d.K = ones(length(X),1);
00062     diffusivity = {d};
00063   else % decomp_mode ==2, single component
00064     diffusivity = model.k;
00065   end;
00066   respected_decomp_mode = 1;
00067 elseif isequal(model.name_diffusivity,'homogeneous2') ...
00068         || isequal(model.name_diffusivity,'linear_gradient')
00069 
00070   if decomp_mode == 0
00071     diffusivity.epsilon = model.k;
00072     diffusivity.K = model.k * speye(2*length(X));
00073   elseif (decomp_mode == 1)
00074     d = [];
00075     % single component independent whether k in mu
00076     d.epsilon = model.k;
00077     d.K = speye(2*length(X));%ones(length(X),1);
00078     diffusivity = {d};
00079   else % decomp_mode ==2, single component
00080     diffusivity = model.k;
00081   end;
00082   respected_decomp_mode = 1;
00083 elseif isequal(model.name_diffusivity,'linear_gradient2')
00084   temp_m = (model.diff_right-model.diff_left) / ...
00085            (model.xrange(2) - model.xrange(1));
00086   lin_grad = @(x) (x - model.xrange(1) );
00087   if decomp_mode == 0
00088     diffusivity.epsilon = max(model.diff_left, model.diff_right);
00089     diffusivity.K = model.diff_left + (lin_grad(X) * temp_m);
00090   elseif (decomp_mode == 1)
00091     d = [];
00092     d.epsilon = max(model.diff_left, model.diff_right);
00093     d.K = lin_grad(X);
00094     diffusivity = {d};
00095   else % decomp_mode == 2
00096     diffusivity = temp_m;
00097   end
00098 elseif isequal(model.name_diffusivity,'richards_nonlinear')
00099   % How can I construct a tensor for each dof?
00100   vlen = size(U,1);
00101   p_mu = spline_select(model);
00102   U = U - model.gravity * Y.*(1+ppval(p_mu, X));
00103   Kaval = model.k * model.richards_k(U') .* model.richards_p(U');
00104   diffusivity.K = spdiags(reshape([Kaval;Kaval],2*vlen,1),0,2*vlen,2*vlen);
00105   diffusivity.epsilon = max(Kaval);
00106   %    Utemp = U' * model.k + 0.0004;
00107   %    diffusivity.K = spdiags(reshape([Utemp;zeros(1,vlen)],2*vlen,1),0,2*vlen,2*vlen);
00108   %    diffusivity.epsilon = max(Utemp);
00109 else 
00110   error('diffusivity function unknown');
00111 end;
00112 
00113 if decomp_mode>0 && respected_decomp_mode==0
00114   error('function does not support affine decomposition!');
00115 end;
00116 
00117 %| \docupdate 
 All Classes Namespaces Files Functions Variables