rbmatlab 0.10.01
|
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