rbmatlab  1.13.10
 All Classes Namespaces Files Functions Variables Groups Pages
dirichlet_values.m
Go to the documentation of this file.
1 function Udirichlet = dirichlet_values(model,X,Y)
2 %UDIRICHLET = DIRICHLET_VALUES([X],[Y], MODEL)
3 % Examples
4 % dirichlet_values([0,1,2],[1,1,1],struct('name_dirichlet_values', 'homogeneous', ...
5 % 'c_dir', 1))
6 % dirichlet_values([0:0.1:1],[0],struct('name_dirichlet_values', 'xstripes', ...
7 % 'c_dir', [0 1 2], ...
8 % 'dir_borders', [0.3 0.6]))
9 % dirichlet_values([0:0.1:1],[0],struct('name_dirichlet_values', 'box', ...
10 % 'c_dir', 1, ...
11 % 'dir_box_xrange', [0.3 0.6], ...
12 % 'dir_box_yrange', [-0.1 0.1]))
13 %
14 % function computing dirichlet-values by pointwise evaluations
15 % 'zero' Udirichlet = 0
16 % 'homogeneous' Udirichlet = c_dir
17 % 'leftright' Udirichlet = c_dir_left for x <= dir_middle
18 % Udirichlet = c_dir_right for x > dir_middle
19 % 'xstripes' values constant in stripes divided by x-coordinats
20 % n+1 values are given in c_dir
21 % the separating coodrinates in dir_borders
22 % 'box': values constant model.c_dir in box given by
23 % model.dir_box_xrange and dir_box_yrange
24 % 'weighted_boxes': values constant model.c_dir in box given by
25 % (beta=1): model.dir_box_xrange{1} and dir_box_yrange{1}
26 % (beta=0): model.dir_box_xrange{2} and dir_box_yrange{2}
27 % for intermediate betas, the two boxes are weighted
28 % 'gauss_convcomb': convex combination of gaussian distributions at
29 % left border
30 % 'function_ptr' : dirichlet function given by function
31 % pointer to complete evaluation:
32 % model.dirichlet_values_ptr
33 % Function must
34 % allow call U = f(X,Y,model), where X, Y are
35 % vectors of the same size. Return is a vector of
36 % values in the corresponding points.
37 % 'decomp_function_ptr' : dirichlet function given by function
38 % pointer to components and coefficients:
39 % model.dirichlet_values_coefficients_ptr
40 % Function must
41 % allow call U = f([],[],model)
42 % Return is a vector of length Q with (parameter
43 % dependent) coefficients in U.
44 % model.dirichlet_values_components_ptr
45 % Functions must
46 % allow call U = f(X,Y,model), where X, Y are
47 % vectors of the same size.
48 % Return of components is a cell array of vectors of
49 % the same size as X and Y with the point values
50 % of the components. Linear combination of
51 % components by coefficients then yields the
52 % complete evaluation.
53 %
54 % required fields of model:
55 % name_dirichlet_values : 'zero', 'homogeneous', 'leftright', 'uplow'
56 % c_dir(s) : boundary value(s) in case of homogeneous dirichlet
57 % value or stripes or box
58 % c_dir_left : left dirichlet value
59 % c_dir_right : left dirichlet value
60 % c_dir_up : upper dirichlet value
61 % c_dir_low : lower dirichlet value
62 % dir_middle : coordinate for separatin between two domains
63 % dir_borders : coordinates for separation between stripes
64 % dir_box_xrange : x-coordinate interval for dirichlet box
65 % dir_box_yrange : y-coordinate interval for dirichlet box
66 %
67 % in case of gld-dirichlet-value: upper wall value c_dir, remaining 0.0
68 %
69 % Function supports affine decomposition, i.e. different operation modes
70 % guided by optional field affine_decomp_mode in model. See also the
71 % contents.txt for general explanation
72 %
73 % optional fields of model:
74 % mu_names : names of fields to be regarded as parameters in vector mu
75 % affine_decomp_mode: operation mode of the function
76 % 'none' (default): no parameter dependence or decomposition is
77 % performed. output is as described above.
78 % 'components': For each output argument a cell array of output
79 % arguments is returned representing the q-th component
80 % independent of the parameters given in mu_names
81 % 'coefficients': For each output argument a cell array of output
82 % arguments is returned representing the q-th coefficient
83 % dependent of the parameters given in mu_names
84 %
85 % in 'coefficients' mode, the parameters in brackets are empty
86 
87 % Bernard Haasdonk 11.4.2006
88 
89  % determine affine_decomposition_mode as integer
90  %decomp_mode = get_affine_decomp_mode(model);
91  decomp_mode = model.decomp_mode;
92 
93  % flag indicating whether the computation respected the decomposition
94  respected_decomp_mode = 0;
95 
96  if isequal(model.name_dirichlet_values,'zero')
97  if decomp_mode == 2
98  Udirichlet = 0;
99  elseif decomp_mode == 1
100  Udirichlet = {[]};
101  elseif decomp_mode == 0
102  Udirichlet = zeros(length(X),1);
103  else
104  error('unknown decomp_mode');
105  end;
106  respected_decomp_mode = 1;
107  elseif isequal(model.name_dirichlet_values,'homogeneous')
108  Udirichlet = model.c_dir * ones(length(X),1);
109  elseif isequal(model.name_dirichlet_values,'leftright')
110  i = (X <= model.dir_middle);
111  U0 = i;
112  U1 = (1-i);
113  if decomp_mode == 2
114  Udirichlet = [model.c_dir_left, model.c_dir_right];
115  elseif decomp_mode == 1
116  Udirichlet = {U0,U1};
117  elseif decomp_mode == 0
118  Udirichlet = U0 * model.c_dir_left + U1 * model.c_dir_right;
119  end;
120  respected_decomp_mode = 1;
121  elseif isequal(model.name_dirichlet_values,'uplow')
122  i = (Y <= model.dir_middle);
123  if decomp_mode == 2
124  Udirichlet = [model.c_dir_low, model.c_dir_up];
125  elseif decomp_mode == 1
126  Udirichlet = {i, (1-i)};
127  elseif decomp_mode == 0
128  Udirichlet = model.c_dir_low * i + (1-i) * model.c_dir_up;
129  end;
130  respected_decomp_mode = 1;
131  elseif isequal(model.name_dirichlet_values,'xstripes')
132  % setzen aller Streifen von links nach rechts, (mehrmals ueberschrieben)
133  Udirichlet = ones(size(X)) * model.c_dir(1);
134  for n = 2:length(model.c_dir)
135  fi = X > model.dir_borders(n-1);
136  Udirichlet(fi) = model.c_dir(n);
137  end;
138  elseif isequal(model.name_dirichlet_values,'box')
139  Udirichlet = zeros(size(X));
140  fi = X > model.dir_box_xrange(1) & ...
141  X < model.dir_box_xrange(2) & ...
142  Y > model.dir_box_yrange(1) & ...
143  Y < model.dir_box_yrange(2);
144  Udirichlet(fi) = model.c_dir;
145  elseif isequal(model.name_dirichlet_values,'weighted_boxes')
146  if decomp_mode == 0
147  Udirichlet = zeros(size(X));
148  xrange = model.dir_box_xrange{1};
149  yrange = model.dir_box_yrange{1};
150  fi = X > xrange(1) & ...
151  X < xrange(2) & ...
152  Y > yrange(1) & ...
153  Y < yrange(2);
154  Udirichlet(fi) = model.c_dir*model.beta;
155  xrange = model.dir_box_xrange{2};
156  yrange = model.dir_box_yrange{2};
157  fi = X > xrange(1) & ...
158  X < xrange(2) & ...
159  Y > yrange(1) & ...
160  Y < yrange(2);
161  Udirichlet(fi) = model.c_dir*(1-model.beta);
162  elseif decomp_mode == 1
163  % two components if beta is in mu, otherwise one component
164  Udirichlet = cell(2,1);
165  for q=1:2
166  Udirichlet{q} = zeros(size(X));
167  xrange = model.dir_box_xrange{q};
168  yrange = model.dir_box_yrange{q};
169  fi = X > xrange(1) & ...
170  X < xrange(2) & ...
171  Y > yrange(1) & ...
172  Y < yrange(2);
173  Udirichlet{q}(fi) = 1;
174  end;
175  if ~ismember('beta',model.mu_names)
176  % merge to one component
177  Udirichlet = {model.beta*Udirichlet{1} + ...
178  (1-model.beta)*Udirichlet{2}};
179  end;
180  else % decomp_mode = 2
181  if ~ismember('beta',model.mu_names)
182  Udirichlet = model.c_dir;
183  else
184  Udirichlet = model.c_dir * [model.beta; 1-model.beta];
185  end;
186  end;
187  respected_decomp_mode = 1;
188 
189  elseif isequal(model.name_dirichlet_values,'gauss_convcomb')
190  xscale = model.udir_xscale;
191  if decomp_mode == 0
192  a = model.udir_amplitude;
193  gauss = cell(6);
194  for i = 1:6
195  gauss{i} = a * exp(-100 * ((Y-0.1*i).^2 + (X*xscale).^2));
196  end;
197 
198  mu4 = model.udir_height;
199  if mu4>=1 && mu4<=2
200  coeff = [2-mu4, mu4-1, 0, 0, 0, 0];
201  elseif mu4>2 && mu4<=3
202  coeff = [0, 3-mu4, mu4-2, 0, 0, 0];
203  elseif mu4>3 && mu4<=4
204  coeff = [0, 0, 4-mu4, mu4-3, 0, 0];
205  elseif mu4>4 && mu4<=5
206  coeff = [0, 0, 0, 5-mu4, mu4-4, 0];
207  elseif mu4>5 && mu4<=6
208  coeff = [0, 0, 0, 0, 6-mu4, mu4-5];
209  end;
210 
211  Udirichlet = zeros(size(X));
212  for i = 1:6
213  Udirichlet = Udirichlet + gauss{i} * coeff(i);
214  end;
215  elseif decomp_mode == 1
216  a = model.udir_amplitude;
217  Udirichlet = cell(6);
218  for i = 1:6
219  Udirichlet{i} = a * exp(-100 * ((Y-0.1*i).^2 + (X*xscale).^2));
220  end;
221  elseif decomp_mode == 2 % coefficients
222  mu4 = model.udir_height;
223  if mu4>=1 && mu4<=2
224  Udirichlet = [2-mu4, mu4-1, 0, 0, 0, 0];
225  elseif mu4>2 && mu4<=3
226  Udirichlet = [0, 3-mu4, mu4-2, 0, 0, 0];
227  elseif mu4>3 && mu4<=4
228  Udirichlet = [0, 0, 4-mu4, mu4-3, 0, 0];
229  elseif mu4>4 && mu4<=5
230  Udirichlet = [0, 0, 0, 5-mu4, mu4-4, 0];
231  elseif mu4>5 && mu4<=6
232  Udirichlet = [0, 0, 0, 0, 6-mu4, mu4-5];
233  else
234  error('udir_height out of range!');
235  end;
236  else
237  error('dirichlet value not implemented for complete or components!');
238  end;
239  respected_decomp_mode = 1;
240 
241  elseif isequal(model.name_dirichlet_values,'decomp_function_ptr')
242  if decomp_mode == 2
243  Udirichlet = model.dirichlet_values_coefficients_ptr([],[],model);
244  elseif decomp_mode == 1; % components
245  Udirichlet = model.dirichlet_values_components_ptr(X,Y,model);
246  else % decomp_mode = 0, complete
247  Ucoefficients = model.dirichlet_values_coefficients_ptr([],[],model);
248  Ucomponents = model.dirichlet_values_components_ptr(X,Y,model);
249  Udirichlet = lincomb_sequence(Ucomponents,Ucoefficients);
250  end;
251  respected_decomp_mode = 1;
252 
253  elseif isequal(model.name_dirichlet_values,'function_ptr')
254  Udirichlet = model.dirichlet_values_ptr(X,Y,model);
255  respected_decomp_mode = 0;
256 
257  else
258  error('unknown name_dirichlet_values');
259  end;
260 
261  if decomp_mode>0 && respected_decomp_mode==0
262  error('function does not support affine decomposition!');
263  end;
264 
265 %| \docupdate