1 function FNneu = neuman_values(model,Xneu,Yneu,Uneu,Nxneu,Nyneu)
2 %
function FNneu = neuman_values(model,[Xneu],[Yneu],[Uneu],[Nxneu],[Nyneu])
4 %
function computing neuman-values by pointwise evaluation.
6 % Xneu, Yneu: coordinate vectors of points to be evaluated
7 % Uneu: corresponding U-value in
case of a u-dependent flux
8 % Nxneu,Nyneu: corresponding unit normal vectors
10 % required field of model: name_neuman_values:
11 %
'zero' FNneu = 0, arguments except Xneu may be ignored
12 %
'homogeneous' FNneu = c_neu, arguments except Xneu may be ignored
13 %
'outflow': FNneu = F(Uneu, Xneu, Yneu) * n
14 %
'pressure_gdl' FNeu = no_flow on upper and lower boundary. left and
15 % right is a parabolic velocity profile with maximum c_neu_max.
16 % Uneu and Nxneu and Nyneu may be ignored.
17 %
'rightflow': outflow to right, noflow to upper and lower
19 % required fields of model:
20 % name_neuman_values :
'zero',
'homogeneous',
'outflow',
'pressure_gdl'
21 % c_neu : boundary value in
case of homogeneous
23 % c_neu_max : maximum flow value
for 'pressure_gdl'
25 % Function supports affine decomposition, i.e. different operation modes
26 % guided by optional field affine_decomp_mode in model. See also the
27 % contents.txt
for general explanation
29 % optional fields of model:
30 % mu_names : names of fields to be regarded as parameters in vector mu
31 % affine_decomp_mode: operation mode of the
function
32 %
'none' (
default): no parameter dependence or decomposition is
33 % performed. output is as described above.
34 %
'components': For each output argument a cell array of output
35 % arguments is returned representing the q-th component
36 % independent of the parameters given in mu_names
37 %
'coefficients': For each output argument a cell array of output
38 % arguments is returned representing the q-th coefficient
39 % dependent of the parameters given in mu_names
41 % in
'coefficient' mode, the parameters in brackets are empty
43 % Bernard Haasdonk 11.4.2006
45 % determine affine_decomposition_mode as integer
46 decomp_mode = model.decomp_mode;
47 %decomp_mode = get_affine_decomp_mode(model);
48 % flag indicating whether the computation respected the decomposition
49 respected_decomp_mode = 0;
51 if isequal(model.name_neuman_values,
'zero')
53 % cannot detect, whether any points will be available later,
54 % so at least one component must be available.
56 elseif decomp_mode == 1
57 % cannot detect in mode 2, whether any points will be available later,
58 % so at least one component must be available.
60 elseif decomp_mode == 0
61 FNneu = zeros(size(Xneu(:)));
63 error(
'unknown decomposition mode');
65 respected_decomp_mode = 1;
66 elseif isequal(model.name_neuman_values,
'homogeneous')
67 FNneu = model.c_neu * ones(size(Xneu(:)));
68 elseif isequal(model.name_neuman_values,'outflow')
69 Fneu = conv_flux(model,Uneu, Xneu, Yneu);
71 FNneu = Fneu.Fx .* Nxneu(:) + Fneu.Fy .* Nyneu(:);
72 elseif decomp_mode == 1
73 Q_Fneu = length(Fneu);
74 FNneu = cell(Q_Fneu,1);
75 FNneu{:} = zeros(size(Xneu(:)));
77 FNneu{q} = Fneu{q}.Fx.*Nxneu(:) + Fneu{q}.Fy.*Nyneu(:);
80 % error(
'Not sure what to do in this case.')
81 FNneu = Fneu; % perhaps this is right?
83 respected_decomp_mode = 1;
84 elseif isequal(model.name_neuman_values,'pressure_gdl')
86 FNneu = zeros(size(Xneu(:)));
87 % left boundary negative velocity -> positive pressure gradient
88 i = find(Xneu<model.xrange(1)+eps);
89 FNneu(i) = model.c_neu_max * ...
90 (model.yrange(2)-model.yrange(1))^(-2) * ...
91 (Yneu(i)-model.yrange(1)).*(model.yrange(2)-Yneu(i))*4;
92 % right boundary positive velocity -> negative pressure gradient
93 i = find(Xneu>model.xrange(2)-eps);
94 FNneu(i) = -model.c_neu_max * ...
95 (model.yrange(2)-model.yrange(1))^(-2) * ...
96 (Yneu(i)-model.yrange(1)).*(model.yrange(2)-Yneu(i))*4;
97 elseif isequal(model.name_neuman_values,'rightflow')
99 i = find(Xneu>model.xrange(2)-eps);
101 % in case of filecaching == 2, the correct velocity file must
103 if isfield(model,'filecache_velocity_matrixfile_extract') & ...
104 (model.filecache_velocity_matrixfile_extract == 2);
105 model.velocity_matrixfile = ...
106 cache_velocity_matrixfile_extract(...
107 Xneu(i),Yneu(i),'outflow', model);
109 Fneu = conv_flux(model,Uneu(i), Xneu(i), Yneu(i));
112 if decomp_mode == 0 % none
114 FNneu = zeros(size(Xneu(:)));
115 FNneu(i) = Fneu.Fx.*Nxneu(i) + Fneu.Fy.*Nyneu(i);
116 elseif decomp_mode == 1 % components
117 Q_Fneu = length(Fneu);
118 FNneu = cell(Q_Fneu,1);
119 FNneu{:} = zeros(size(Xneu(:)));
121 FNneu{q}(i) = Fneu{q}.Fx.*Nxneu(i) + Fneu{q}.Fy.*Nyneu(i);
123 % check dependency on xrange
124 if ismember(
'xrange',model.mu_names)
125 error('affine decomp with respect to mu_names not possible!');
127 else % decomp_mode == 2 -> coefficients
128 Fneu = conv_flux(model,[], [], []);
129 FNneu = Fneu; % simple identical coefficients!
131 respected_decomp_mode = 1;
133 error('unknown name_neuman_values');
136 if decomp_mode>0 & respected_decomp_mode==0
137 error('function does not support affine decomposition!');