rbmatlab 0.10.01
datafunc/dirichlet_values.m
Go to the documentation of this file.
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 
All Classes Namespaces Files Functions Variables