2 %UDIRICHLET = DIRICHLET_VALUES([X],[Y], MODEL)
4 %
dirichlet_values([0,1,2],[1,1,1],
struct(
'name_dirichlet_values',
'homogeneous', ...
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]))
11 %
'dir_box_xrange', [0.3 0.6], ...
12 %
'dir_box_yrange', [-0.1 0.1]))
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
30 %
'function_ptr' : dirichlet
function given by
function
31 % pointer to complete evaluation:
32 % model.dirichlet_values_ptr
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
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
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.
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
67 % in case of gld-dirichlet-value: upper wall value c_dir, remaining 0.0
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
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
85 % in
'coefficients' mode, the parameters in brackets are empty
87 % Bernard Haasdonk 11.4.2006
89 % determine affine_decomposition_mode as integer
90 %decomp_mode = get_affine_decomp_mode(model);
91 decomp_mode = model.decomp_mode;
93 % flag indicating whether the computation respected the decomposition
94 respected_decomp_mode = 0;
96 if isequal(model.name_dirichlet_values,
'zero')
99 elseif decomp_mode == 1
101 elseif decomp_mode == 0
102 Udirichlet = zeros(length(X),1);
104 error(
'unknown decomp_mode');
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);
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;
120 respected_decomp_mode = 1;
121 elseif isequal(model.name_dirichlet_values,
'uplow')
122 i = (Y <= model.dir_middle);
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;
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);
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')
147 Udirichlet = zeros(size(X));
148 xrange = model.dir_box_xrange{1};
149 yrange = model.dir_box_yrange{1};
150 fi = X > xrange(1) & ...
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) & ...
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);
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) & ...
173 Udirichlet{q}(fi) = 1;
175 if ~ismember(
'beta',model.mu_names)
176 % merge to one component
177 Udirichlet = {model.beta*Udirichlet{1} + ...
178 (1-model.beta)*Udirichlet{2}};
180 else % decomp_mode = 2
181 if ~ismember(
'beta',model.mu_names)
182 Udirichlet = model.c_dir;
184 Udirichlet = model.c_dir * [model.beta; 1-model.beta];
187 respected_decomp_mode = 1;
189 elseif isequal(model.name_dirichlet_values,'gauss_convcomb')
190 xscale = model.udir_xscale;
192 a = model.udir_amplitude;
195 gauss{i} = a * exp(-100 * ((Y-0.1*i).^2 + (X*xscale).^2));
198 mu4 = model.udir_height;
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];
211 Udirichlet = zeros(size(X));
213 Udirichlet = Udirichlet + gauss{i} * coeff(i);
215 elseif decomp_mode == 1
216 a = model.udir_amplitude;
217 Udirichlet = cell(6);
219 Udirichlet{i} = a * exp(-100 * ((Y-0.1*i).^2 + (X*xscale).^2));
221 elseif decomp_mode == 2 % coefficients
222 mu4 = model.udir_height;
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];
234 error(
'udir_height out of range!');
237 error(
'dirichlet value not implemented for complete or components!');
239 respected_decomp_mode = 1;
241 elseif isequal(model.name_dirichlet_values,
'decomp_function_ptr')
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);
251 respected_decomp_mode = 1;
253 elseif isequal(model.name_dirichlet_values,'function_ptr')
254 Udirichlet = model.dirichlet_values_ptr(X,Y,model);
255 respected_decomp_mode = 0;
258 error('unknown name_dirichlet_values');
261 if decomp_mode>0 && respected_decomp_mode==0
262 error('function does not support affine decomposition!');