rbmatlab 0.10.01
|
00001 function Udirichlet = dirichlet_values(model,X,Y) 00002 %UDIRICHLET = DIRICHLET_VALUES([X],[Y], MODEL) 00003 % Examples 00004 % dirichlet_values([0,1,2],[1,1,1],struct('name_dirichlet_values', 'homogeneous', ... 00005 % 'c_dir', 1)) 00006 % dirichlet_values([0:0.1:1],[0],struct('name_dirichlet_values', 'xstripes', ... 00007 % 'c_dir', [0 1 2], ... 00008 % 'dir_borders', [0.3 0.6])) 00009 % dirichlet_values([0:0.1:1],[0],struct('name_dirichlet_values', 'box', ... 00010 % 'c_dir', 1, ... 00011 % 'dir_box_xrange', [0.3 0.6], ... 00012 % 'dir_box_yrange', [-0.1 0.1])) 00013 % 00014 % function computing dirichlet-values by pointwise evaluations 00015 % 'zero' Udirichlet = 0 00016 % 'homogeneous' Udirichlet = c_dir 00017 % 'leftright' Udirichlet = c_dir_left for x <= dir_middle 00018 % Udirichlet = c_dir_right for x > dir_middle 00019 % 'xstripes' values constant in stripes divided by x-coordinats 00020 % n+1 values are given in c_dir 00021 % the separating coodrinates in dir_borders 00022 % 'box': values constant model.c_dir in box given by 00023 % model.dir_box_xrange and dir_box_yrange 00024 % 'weighted_boxes': values constant model.c_dir in box given by 00025 % (beta=1): model.dir_box_xrange{1} and dir_box_yrange{1} 00026 % (beta=0): model.dir_box_xrange{2} and dir_box_yrange{2} 00027 % for intermediate betas, the two boxes are weighted 00028 % 'gauss_convcomb': convex combination of gaussian distributions at 00029 % left border 00030 % 'function_ptr' : dirichlet function given by function 00031 % pointer to complete evaluation: 00032 % model.dirichlet_values_ptr 00033 % Function must 00034 % allow call U = f(X,Y,model), where X, Y are 00035 % vectors of the same size. Return is a vector of 00036 % values in the corresponding points. 00037 % 'decomp_function_ptr' : dirichlet function given by function 00038 % pointer to components and coefficients: 00039 % model.dirichlet_values_coefficients_ptr 00040 % Function must 00041 % allow call U = f([],[],model) 00042 % Return is a vector of length Q with (parameter 00043 % dependent) coefficients in U. 00044 % model.dirichlet_values_components_ptr 00045 % Functions must 00046 % allow call U = f(X,Y,model), where X, Y are 00047 % vectors of the same size. 00048 % Return of components is a cell array of vectors of 00049 % the same size as X and Y with the point values 00050 % of the components. Linear combination of 00051 % components by coefficients then yields the 00052 % complete evaluation. 00053 % 00054 % required fields of model: 00055 % name_dirichlet_values : 'zero', 'homogeneous', 'leftright', 'uplow' 00056 % c_dir(s) : boundary value(s) in case of homogeneous dirichlet 00057 % value or stripes or box 00058 % c_dir_left : left dirichlet value 00059 % c_dir_right : left dirichlet value 00060 % c_dir_up : upper dirichlet value 00061 % c_dir_low : lower dirichlet value 00062 % dir_middle : coordinate for separatin between two domains 00063 % dir_borders : coordinates for separation between stripes 00064 % dir_box_xrange : x-coordinate interval for dirichlet box 00065 % dir_box_yrange : y-coordinate interval for dirichlet box 00066 % 00067 % in case of gld-dirichlet-value: upper wall value c_dir, remaining 0.0 00068 % 00069 % Function supports affine decomposition, i.e. different operation modes 00070 % guided by optional field affine_decomp_mode in model. See also the 00071 % contents.txt for general explanation 00072 % 00073 % optional fields of model: 00074 % mu_names : names of fields to be regarded as parameters in vector mu 00075 % affine_decomp_mode: operation mode of the function 00076 % 'none' (default): no parameter dependence or decomposition is 00077 % performed. output is as described above. 00078 % 'components': For each output argument a cell array of output 00079 % arguments is returned representing the q-th component 00080 % independent of the parameters given in mu_names 00081 % 'coefficients': For each output argument a cell array of output 00082 % arguments is returned representing the q-th coefficient 00083 % dependent of the parameters given in mu_names 00084 % 00085 % in 'coefficients' mode, the parameters in brackets are empty 00086 00087 % Bernard Haasdonk 11.4.2006 00088 00089 % determine affine_decomposition_mode as integer 00090 %decomp_mode = get_affine_decomp_mode(model); 00091 decomp_mode = model.decomp_mode; 00092 00093 % flag indicating whether the computation respected the decomposition 00094 respected_decomp_mode = 0; 00095 00096 if isequal(model.name_dirichlet_values,'zero') 00097 if decomp_mode == 2 00098 Udirichlet = 0; 00099 elseif decomp_mode == 1 00100 Udirichlet = {[]}; 00101 elseif decomp_mode == 0 00102 Udirichlet = zeros(length(X),1); 00103 else 00104 error('unknown decomp_mode'); 00105 end; 00106 respected_decomp_mode = 1; 00107 elseif isequal(model.name_dirichlet_values,'homogeneous') 00108 Udirichlet = model.c_dir * ones(length(X),1); 00109 elseif isequal(model.name_dirichlet_values,'leftright') 00110 i = (X <= model.dir_middle); 00111 U0 = i; 00112 U1 = (1-i); 00113 if decomp_mode == 2 00114 Udirichlet = [model.c_dir_left, model.c_dir_right]; 00115 elseif decomp_mode == 1 00116 Udirichlet = {U0,U1}; 00117 elseif decomp_mode == 0 00118 Udirichlet = U0 * model.c_dir_left + U1 * model.c_dir_right; 00119 end; 00120 respected_decomp_mode = 1; 00121 elseif isequal(model.name_dirichlet_values,'uplow') 00122 i = (Y <= model.dir_middle); 00123 if decomp_mode == 2 00124 Udirichlet = [model.c_dir_low, model.c_dir_up]; 00125 elseif decomp_mode == 1 00126 Udirichlet = {i, (1-i)}; 00127 elseif decomp_mode == 0 00128 Udirichlet = model.c_dir_low * i + (1-i) * model.c_dir_up; 00129 end; 00130 respected_decomp_mode = 1; 00131 elseif isequal(model.name_dirichlet_values,'xstripes') 00132 % setzen aller Streifen von links nach rechts, (mehrmals ueberschrieben) 00133 Udirichlet = ones(size(X)) * model.c_dir(1); 00134 for n = 2:length(model.c_dir) 00135 fi = X > model.dir_borders(n-1); 00136 Udirichlet(fi) = model.c_dir(n); 00137 end; 00138 elseif isequal(model.name_dirichlet_values,'box') 00139 Udirichlet = zeros(size(X)); 00140 fi = X > model.dir_box_xrange(1) & ... 00141 X < model.dir_box_xrange(2) & ... 00142 Y > model.dir_box_yrange(1) & ... 00143 Y < model.dir_box_yrange(2); 00144 Udirichlet(fi) = model.c_dir; 00145 elseif isequal(model.name_dirichlet_values,'weighted_boxes') 00146 if decomp_mode == 0 00147 Udirichlet = zeros(size(X)); 00148 xrange = model.dir_box_xrange{1}; 00149 yrange = model.dir_box_yrange{1}; 00150 fi = X > xrange(1) & ... 00151 X < xrange(2) & ... 00152 Y > yrange(1) & ... 00153 Y < yrange(2); 00154 Udirichlet(fi) = model.c_dir*model.beta; 00155 xrange = model.dir_box_xrange{2}; 00156 yrange = model.dir_box_yrange{2}; 00157 fi = X > xrange(1) & ... 00158 X < xrange(2) & ... 00159 Y > yrange(1) & ... 00160 Y < yrange(2); 00161 Udirichlet(fi) = model.c_dir*(1-model.beta); 00162 elseif decomp_mode == 1 00163 % two components if beta is in mu, otherwise one component 00164 Udirichlet = cell(2,1); 00165 for q=1:2 00166 Udirichlet{q} = zeros(size(X)); 00167 xrange = model.dir_box_xrange{q}; 00168 yrange = model.dir_box_yrange{q}; 00169 fi = X > xrange(1) & ... 00170 X < xrange(2) & ... 00171 Y > yrange(1) & ... 00172 Y < yrange(2); 00173 Udirichlet{q}(fi) = 1; 00174 end; 00175 if ~ismember('beta',model.mu_names) 00176 % merge to one component 00177 Udirichlet = {model.beta*Udirichlet{1} + ... 00178 (1-model.beta)*Udirichlet{2}}; 00179 end; 00180 else % decomp_mode = 2 00181 if ~ismember('beta',model.mu_names) 00182 Udirichlet = model.c_dir; 00183 else 00184 Udirichlet = model.c_dir * [model.beta; 1-model.beta]; 00185 end; 00186 end; 00187 respected_decomp_mode = 1; 00188 00189 elseif isequal(model.name_dirichlet_values,'gauss_convcomb') 00190 xscale = model.udir_xscale; 00191 if decomp_mode == 0 00192 a = model.udir_amplitude; 00193 gauss = cell(6); 00194 for i = 1:6 00195 gauss{i} = a * exp(-100 * ((Y-0.1*i).^2 + (X*xscale).^2)); 00196 end; 00197 00198 mu4 = model.udir_height; 00199 if mu4>=1 && mu4<=2 00200 coeff = [2-mu4, mu4-1, 0, 0, 0, 0]; 00201 elseif mu4>2 && mu4<=3 00202 coeff = [0, 3-mu4, mu4-2, 0, 0, 0]; 00203 elseif mu4>3 && mu4<=4 00204 coeff = [0, 0, 4-mu4, mu4-3, 0, 0]; 00205 elseif mu4>4 && mu4<=5 00206 coeff = [0, 0, 0, 5-mu4, mu4-4, 0]; 00207 elseif mu4>5 && mu4<=6 00208 coeff = [0, 0, 0, 0, 6-mu4, mu4-5]; 00209 end; 00210 00211 Udirichlet = zeros(size(X)); 00212 for i = 1:6 00213 Udirichlet = Udirichlet + gauss{i} * coeff(i); 00214 end; 00215 elseif decomp_mode == 1 00216 a = model.udir_amplitude; 00217 Udirichlet = cell(6); 00218 for i = 1:6 00219 Udirichlet{i} = a * exp(-100 * ((Y-0.1*i).^2 + (X*xscale).^2)); 00220 end; 00221 elseif decomp_mode == 2 % coefficients 00222 mu4 = model.udir_height; 00223 if mu4>=1 && mu4<=2 00224 Udirichlet = [2-mu4, mu4-1, 0, 0, 0, 0]; 00225 elseif mu4>2 && mu4<=3 00226 Udirichlet = [0, 3-mu4, mu4-2, 0, 0, 0]; 00227 elseif mu4>3 && mu4<=4 00228 Udirichlet = [0, 0, 4-mu4, mu4-3, 0, 0]; 00229 elseif mu4>4 && mu4<=5 00230 Udirichlet = [0, 0, 0, 5-mu4, mu4-4, 0]; 00231 elseif mu4>5 && mu4<=6 00232 Udirichlet = [0, 0, 0, 0, 6-mu4, mu4-5]; 00233 else 00234 error('udir_height out of range!'); 00235 end; 00236 else 00237 error('dirichlet value not implemented for complete or components!'); 00238 end; 00239 respected_decomp_mode = 1; 00240 00241 elseif isequal(model.name_dirichlet_values,'decomp_function_ptr') 00242 if decomp_mode == 2 00243 Udirichlet = model.dirichlet_values_coefficients_ptr([],[],model); 00244 elseif decomp_mode == 1; % components 00245 Udirichlet = model.dirichlet_values_components_ptr(X,Y,model); 00246 else % decomp_mode = 0, complete 00247 Ucoefficients = model.dirichlet_values_coefficients_ptr([],[],model); 00248 Ucomponents = model.dirichlet_values_components_ptr(X,Y,model); 00249 Udirichlet = lincomb_sequence(Ucomponents,Ucoefficients); 00250 end; 00251 respected_decomp_mode = 1; 00252 00253 elseif isequal(model.name_dirichlet_values,'function_ptr') 00254 Udirichlet = model.dirichlet_values_ptr(X,Y,model); 00255 respected_decomp_mode = 0; 00256 00257 else 00258 error('unknown name_dirichlet_values'); 00259 end; 00260 00261 if decomp_mode>0 && respected_decomp_mode==0 00262 error('function does not support affine decomposition!'); 00263 end; 00264 00265 %| \docupdate