% Script-File

% Hinzufügen eines Suchpfades für M-Files (nur falls erforderlich)
addpath('../routines/');

% Vektor mit Dimension der Matrix
v=[10 100 1000];

% Abbruchschranke für das Residuum
tol=1e-8;

% Maximale Anzahl Iterationen 
kmax=1000; % gegebenenfalls diesen Wert heruntersetzen, z.B. auf 600 !


k=menu('Auswahl der Testbeispiele', ...
       'Gesamtschrittverfahren (Jacobi)', ...
       'Einzelschrittverfahren (Gauss-Seidel)', ...
       'Konjugierte Gradienten (CG) ohne Vork.', ...
       'Konjugierte Gradienten (CG) mit sym. Gauss-Seidel-Vork.', ...
       'Vergleich aller',...
       'Ende');

while (k<6)

       % Vektoren für Zeit, Fehler
       zeit    =zeros(4,length(v));
       residuum=zeros(4,length(v),kmax);
       anzahl  =zeros(4,length(v));
       i=1;
       for n=v
	   A=spdiags(ones(n,1)*[-1 2 -1], -1:1,n,n);
	   b=ones(n,1);
	   x0=zeros(n,1);

	   % 1. Variante, Jacobi-Iteration
	   if (k==1 | k==5)
	      flops(0);
	      [x,res]=JAC(A,b,x0,tol,kmax);
	      zeit(1,i)                  =flops;
              anzahl(1,i)                =length(res);
	      residuum(1,i,1:length(res))=res;
	   end % if

	   % 2. Variante, Gauss-Seidel-Iteration
	   if (k==2 | k==5)
	      flops(0);
	      [x,res]=GS(A,b,x0,tol,kmax);
	      zeit(2,i)                  =flops;
              anzahl(2,i)                =length(res);
	      residuum(2,i,1:length(res))=res;
	   end % if

	   % 3. Variante, CG-Verfahren ohne Vorkonditionierung
	   if (k==3 | k==5)
	      flops(0);
	      [x,res]=CG(A,b,x0,tol,kmax);
              % Korrigiere letzten Wert, damit er in der Grafik zu sehen ist
	      if res(length(res))<eps*min(1,res(1));
		 res(length(res))=eps*min(1,res(1));
	      end % if
	      zeit(3,i)                  =flops;
              anzahl(3,i)                =length(res);
	      residuum(3,i,1:length(res))=res;
	   end % if

	   % 4. Variante, CG-Verfahren mit symm. Gauss-Seidel als Vork.
	   if (k==4 | k==5)
	      flops(0);
	      [x,res]=PCG(A,b,x0,tol,'PRECSGS',kmax);
              % Korrigiere letzten Wert, damit er in der Grafik zu sehen ist
	      if res(length(res))<eps*min(1,res(1));
		 res(length(res))=eps*min(1,res(1));
	      end % if
	      zeit(4,i)                  =flops;
              anzahl(4,i)                =length(res);
	      residuum(4,i,1:length(res))=res;
	   end % if

	   i=i+1;
       end % for

       figure(1);
       set(gcf,'DefaultLineLineWidth',2);
       set(gcf,'DefaultTextFontSize',12);
       set(gcf,'DefaultTextFontWeight','bold');
       hold off;
       if (k==1 | k==5)
	  loglog(v,zeit(1,:),'+r');
	  hold on;
       end; % if
       if (k==2 | k==5)
 	  loglog(v,zeit(2,:),'og');
       end; % if
       if (k==3 | k==5)
 	  loglog(v,zeit(3,:),'*y');
       end; % if
       if (k==4 | k==5)
 	  loglog(v,zeit(4,:),'xb');
       end; % if
       hold off;
       title('Rechenzeit in flops');
       xlabel('n, `+r`=Jacobi, `og`=Gauss-Seidel, `*y`=CG, `xb`=PCG');
       ylabel('flops');

       i=1;
       for n=v
           figure(i+1);
	   set(gcf,'DefaultLineLineWidth',2);
	   set(gcf,'DefaultTextFontSize',12);
	   set(gcf,'DefaultTextFontWeight','bold');
	   hold off;
	   if (k==1 | k==5)
	      schritte=1:anzahl(1,i);
	      res(schritte)=residuum(1,i,schritte);
	      loglog(schritte,res(schritte),'+r');
	      hold on;
           end; % if
	   if (k==2 | k==5)
	      schritte=1:anzahl(2,i);
	      res(schritte)=residuum(2,i,schritte);
	      loglog(schritte,res(schritte),'og');
	   end; % if
	   if (k==3 | k==5)
	      schritte=1:anzahl(3,i);
	      res(schritte)=residuum(3,i,schritte);
	      loglog(schritte,res(schritte),'*y');
	   end; % if
	   if (k==4 | k==5)
	      schritte=1:anzahl(4,i);
	      res(schritte)=residuum(4,i,schritte);
	      loglog(schritte,res(schritte),'xb');
	   end; % if
	   hold off;
	   title('Residuenverlauf');
	   xlabel('Anzahl Schritte, `+r`=Jacobi, `og`=Gauss-Seidel, `*y`=CG, `xb`=PCG');
	   ylabel('||b-Ax||');
	   hold off;

	   i=i+1;
       end % for
	    
       k=menu('Auswahl der Testbeispiele', ...
              'Gesamtschrittverfahren (Jacobi)', ...
	      'Einzelschrittverfahren (Gauss-Seidel)', ...
	      'Konjugierte Gradienten (CG) ohne Vork.', ...
	      'Konjugierte Gradienten (CG) mit sym. Gauss-Seidel-Vork.', ...
	      'Vergleich aller',...
	      'Ende');
end; % while
