rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
neuman_values.m
1 function FNneu = neuman_values(model,Xneu,Yneu,Uneu,Nxneu,Nyneu)
2 %function FNneu = neuman_values(model,[Xneu],[Yneu],[Uneu],[Nxneu],[Nyneu])
3 %
4 % function computing neuman-values by pointwise evaluation.
5 %
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
9 %
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
18 %
19 % required fields of model:
20 % name_neuman_values : 'zero', 'homogeneous', 'outflow', 'pressure_gdl'
21 % c_neu : boundary value in case of homogeneous
22 % dirichlet value
23 % c_neu_max : maximum flow value for 'pressure_gdl'
24 %
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
28 %
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
40 %
41 % in 'coefficient' mode, the parameters in brackets are empty
42 
43 % Bernard Haasdonk 11.4.2006
44 
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;
50 
51  if isequal(model.name_neuman_values,'zero')
52  if decomp_mode == 2
53  % cannot detect, whether any points will be available later,
54  % so at least one component must be available.
55  FNneu = 0;
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.
59  FNneu = {[]};
60  elseif decomp_mode == 0
61  FNneu = zeros(size(Xneu(:)));
62  else
63  error('unknown decomposition mode');
64  end;
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);
70  if decomp_mode == 0
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(:)));
76  for q = 1:Q_Fneu
77  FNneu{q} = Fneu{q}.Fx.*Nxneu(:) + Fneu{q}.Fy.*Nyneu(:);
78  end;
79  else % mode 2
80  % error('Not sure what to do in this case.')
81  FNneu = Fneu; % perhaps this is right?
82  end;
83  respected_decomp_mode = 1;
84  elseif isequal(model.name_neuman_values,'pressure_gdl')
85  % set all to zero
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')
98  if decomp_mode < 2
99  i = find(Xneu>model.xrange(2)-eps);
100 
101  % in case of filecaching == 2, the correct velocity file must
102  % be generated!!
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);
108  end;
109  Fneu = conv_flux(model,Uneu(i), Xneu(i), Yneu(i));
110 
111  end;
112  if decomp_mode == 0 % none
113 
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(:)));
120  for q = 1:Q_Fneu
121  FNneu{q}(i) = Fneu{q}.Fx.*Nxneu(i) + Fneu{q}.Fy.*Nyneu(i);
122  end;
123  % check dependency on xrange
124  if ismember('xrange',model.mu_names)
125  error('affine decomp with respect to mu_names not possible!');
126  end;
127  else % decomp_mode == 2 -> coefficients
128  Fneu = conv_flux(model,[], [], []);
129  FNneu = Fneu; % simple identical coefficients!
130  end;
131  respected_decomp_mode = 1;
132  else
133  error('unknown name_neuman_values');
134  end;
135 
136  if decomp_mode>0 & respected_decomp_mode==0
137  error('function does not support affine decomposition!');
138  end;
139 
140 %| \docupdate