rbmatlab 0.10.01
|
00001 function FNneu = neuman_values(model,Xneu,Yneu,Uneu,Nxneu,Nyneu) 00002 %function FNneu = neuman_values(model,[Xneu],[Yneu],[Uneu],[Nxneu],[Nyneu]) 00003 % 00004 % function computing neuman-values by pointwise evaluation. 00005 % 00006 % Xneu, Yneu: coordinate vectors of points to be evaluated 00007 % Uneu: corresponding U-value in case of a u-dependent flux 00008 % Nxneu,Nyneu: corresponding unit normal vectors 00009 % 00010 % required field of model: name_neuman_values: 00011 % 'zero' FNneu = 0, arguments except Xneu may be ignored 00012 % 'homogeneous' FNneu = c_neu, arguments except Xneu may be ignored 00013 % 'outflow': FNneu = F(Uneu, Xneu, Yneu) * n 00014 % 'pressure_gdl' FNeu = no_flow on upper and lower boundary. left and 00015 % right is a parabolic velocity profile with maximum c_neu_max. 00016 % Uneu and Nxneu and Nyneu may be ignored. 00017 % 'rightflow': outflow to right, noflow to upper and lower 00018 % 00019 % required fields of model: 00020 % name_neuman_values : 'zero', 'homogeneous', 'outflow', 'pressure_gdl' 00021 % c_neu : boundary value in case of homogeneous 00022 % dirichlet value 00023 % c_neu_max : maximum flow value for 'pressure_gdl' 00024 % 00025 % Function supports affine decomposition, i.e. different operation modes 00026 % guided by optional field affine_decomp_mode in model. See also the 00027 % contents.txt for general explanation 00028 % 00029 % optional fields of model: 00030 % mu_names : names of fields to be regarded as parameters in vector mu 00031 % affine_decomp_mode: operation mode of the function 00032 % 'none' (default): no parameter dependence or decomposition is 00033 % performed. output is as described above. 00034 % 'components': For each output argument a cell array of output 00035 % arguments is returned representing the q-th component 00036 % independent of the parameters given in mu_names 00037 % 'coefficients': For each output argument a cell array of output 00038 % arguments is returned representing the q-th coefficient 00039 % dependent of the parameters given in mu_names 00040 % 00041 % in 'coefficient' mode, the parameters in brackets are empty 00042 00043 % Bernard Haasdonk 11.4.2006 00044 00045 % determine affine_decomposition_mode as integer 00046 decomp_mode = model.decomp_mode; 00047 %decomp_mode = get_affine_decomp_mode(model); 00048 % flag indicating whether the computation respected the decomposition 00049 respected_decomp_mode = 0; 00050 00051 if isequal(model.name_neuman_values,'zero') 00052 if decomp_mode == 2 00053 % cannot detect, whether any points will be available later, 00054 % so at least one component must be available. 00055 FNneu = 0; 00056 elseif decomp_mode == 1 00057 % cannot detect in mode 2, whether any points will be available later, 00058 % so at least one component must be available. 00059 FNneu = {[]}; 00060 elseif decomp_mode == 0 00061 FNneu = zeros(size(Xneu(:))); 00062 else 00063 error('unknown decomposition mode'); 00064 end; 00065 respected_decomp_mode = 1; 00066 elseif isequal(model.name_neuman_values,'homogeneous') 00067 FNneu = model.c_neu * ones(size(Xneu(:))); 00068 elseif isequal(model.name_neuman_values,'outflow') 00069 Fneu = conv_flux(model,Uneu, Xneu, Yneu); 00070 if decomp_mode == 0 00071 FNneu = Fneu.Fx .* Nxneu(:) + Fneu.Fy .* Nyneu(:); 00072 elseif decomp_mode == 1 00073 Q_Fneu = length(Fneu); 00074 FNneu = cell(Q_Fneu,1); 00075 FNneu{:} = zeros(size(Xneu(:))); 00076 for q = 1:Q_Fneu 00077 FNneu{q} = Fneu{q}.Fx.*Nxneu(:) + Fneu{q}.Fy.*Nyneu(:); 00078 end; 00079 else % mode 2 00080 % error('Not sure what to do in this case.') 00081 FNneu = Fneu; % perhaps this is right? 00082 end; 00083 respected_decomp_mode = 1; 00084 elseif isequal(model.name_neuman_values,'pressure_gdl') 00085 % set all to zero 00086 FNneu = zeros(size(Xneu(:))); 00087 % left boundary negative velocity -> positive pressure gradient 00088 i = find(Xneu<model.xrange(1)+eps); 00089 FNneu(i) = model.c_neu_max * ... 00090 (model.yrange(2)-model.yrange(1))^(-2) * ... 00091 (Yneu(i)-model.yrange(1)).*(model.yrange(2)-Yneu(i))*4; 00092 % right boundary positive velocity -> negative pressure gradient 00093 i = find(Xneu>model.xrange(2)-eps); 00094 FNneu(i) = -model.c_neu_max * ... 00095 (model.yrange(2)-model.yrange(1))^(-2) * ... 00096 (Yneu(i)-model.yrange(1)).*(model.yrange(2)-Yneu(i))*4; 00097 elseif isequal(model.name_neuman_values,'rightflow') 00098 if decomp_mode < 2 00099 i = find(Xneu>model.xrange(2)-eps); 00100 00101 % in case of filecaching == 2, the correct velocity file must 00102 % be generated!! 00103 if isfield(model,'filecache_velocity_matrixfile_extract') & ... 00104 (model.filecache_velocity_matrixfile_extract == 2); 00105 model.velocity_matrixfile = ... 00106 cache_velocity_matrixfile_extract(... 00107 Xneu(i),Yneu(i),'outflow', model); 00108 end; 00109 Fneu = conv_flux(model,Uneu(i), Xneu(i), Yneu(i)); 00110 00111 end; 00112 if decomp_mode == 0 % none 00113 00114 FNneu = zeros(size(Xneu(:))); 00115 FNneu(i) = Fneu.Fx.*Nxneu(i) + Fneu.Fy.*Nyneu(i); 00116 elseif decomp_mode == 1 % components 00117 Q_Fneu = length(Fneu); 00118 FNneu = cell(Q_Fneu,1); 00119 FNneu{:} = zeros(size(Xneu(:))); 00120 for q = 1:Q_Fneu 00121 FNneu{q}(i) = Fneu{q}.Fx.*Nxneu(i) + Fneu{q}.Fy.*Nyneu(i); 00122 end; 00123 % check dependency on xrange 00124 if ismember('xrange',model.mu_names) 00125 error('affine decomp with respect to mu_names not possible!'); 00126 end; 00127 else % decomp_mode == 2 -> coefficients 00128 Fneu = conv_flux(model,[], [], []); 00129 FNneu = Fneu; % simple identical coefficients! 00130 end; 00131 respected_decomp_mode = 1; 00132 else 00133 error('unknown name_neuman_values'); 00134 end; 00135 00136 if decomp_mode>0 & respected_decomp_mode==0 00137 error('function does not support affine decomposition!'); 00138 end; 00139 00140 %| \docupdate