rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
A_operator.m
1 function [v,index_n]=A_operator(mu,u,index,Phi,M,epsilon,tau,dx)
2 %
3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4 %%% A-Operator fuer Buckley-Leverett Problem %%%
5 %%% A = Id-epsilon^2 tau D(u)_x d/dx - epsilon^2 tau D(u) d^2/dx^2 %%%
6 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7 %
8 % Input: mu Parameter
9 % u Lsg u, wird komplett eingelesen und liest dann
10 % \in IR^{|index|x1} aus
11 % index Inidice-Menge, auf der lokale Lsg berechnet werden soll,
12 % fuer index=[] global berechnen
13 % Phi Menge aus Basisvektoren, wird komplett eingelesen und
14 % liest dann \in IR^{|index|xN} aus
15 % M Viskositaetsverhaeltnis
16 % epsilon Regularisierungsparameter
17 % tau Parameter
18 % dx Ortsschrittweite
19 %
20 % Output: v Auswertung des A-Operators, d.h. linke Seite des
21 % BL-Problems an Basisvektoren aus Phi, \in IR^{|index_n|xN}
22 % index_n neue Indexmenge, nimmt von jedem Miniintervall einen
23 % Randpunkt weg
24 %
25 
26 
27 if isempty(index) % globale Lsg
28  n_x = length(u);
29  a = zeros(n_x,1);
30  c = zeros(n_x-1,1);
31  for i=2:n_x
32  a(i) = dx^2/(epsilon^2*tau)+BL_D(u(i-1),M)+BL_D(u(i),M);
33  end
34  a(1)=1;
35  a(end)=1;
36  for i=1:n_x-1
37  c(i) = -BL_D(u(i),M);
38  end
39  A = sparse(epsilon^2*tau/dx^2*(diag(a)+diag(c,1)+diag(c,-1)));
40  A(1,2);
41  A(n_x,n_x-1);
42 
43  v = A*Phi;
44 
45  index_n = [];
46 
47 else % lokale Lsg
48 
49  index = sort(index);
50  V = [];
51  Ie = [];
52  Ia = 1;
53  I = [];
54 
55  for i=1:length(index)-1;
56  if index(i+1)-index(i)==0
57  error('Index kommt doppelt vor');
58  elseif index(i+1)-index(i)>1 % Zusaetzliche Abfrage, dass mind 3 aufeinanderfolgende Werte
59  Ia = [Ia, i+1];
60  Ie = [Ie, i];
61  end
62  end
63  Ie = [Ie,length(index)];
64 
65  for i=1:length(Ie)
66  ni = Ie(i)-Ia(i)+1; % Anzahl aufeinanderfolgender Stuetzstellen
67  if ni<=2
68  error('Zu wenig aufeinanderfolgende Stuetzstellen.')
69  end
70 
71  a = zeros(ni,1);
72  c = zeros(ni-1,1);
73  uc = u(index(Ia(i)):index(Ie(i)));
74  for k=2:ni
75  a(k) = dx^2/(epsilon^2*tau)+BL_D(uc(k-1),M)+BL_D(uc(k),M);
76  end
77 
78  for k=1:ni-1
79  c(k) = -BL_D(uc(k),M);
80  end
81 
82  A = sparse(epsilon^2*tau/dx^2*(diag(a)+diag(c,1)+diag(c,-1)));
83  vi = A*Phi(index(Ia(i)):index(Ie(i)),:);
84  vi(1,:) = [];
85  vi(end,:) = [];
86 
87  V = [V;vi];
88  I = [I,index(Ia(i)+1):index(Ie(i)-1)];
89 
90  end
91  v = V;
92  index_n = I;
93 
94 
95 end