rbmatlab 0.10.01
datafunc/neuman_values.m
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 
All Classes Namespaces Files Functions Variables