Switch to side-by-side view

--- a/LinLib.def
+++ b/LinLib.def
@@ -8,9 +8,9 @@
   (* Licence        : GNU Lesser General Public License (LGPL)              *)
   (*------------------------------------------------------------------------*)
 
-  (* $Id: LinLib.def,v 1.2 2017/10/04 07:02:51 mriedl Exp mriedl $ *)
-
-FROM Deklera IMPORT VEKTOR,MATRIX,CARDVEKTOR,CVEKTOR,CMATRIX,PMATRIX;
+  (* $Id: LinLib.def,v 1.11 2018/08/31 14:14:46 mriedl Exp mriedl $ *)
+
+FROM Deklera IMPORT PMATRIX;
 
 PROCEDURE CondHager(VAR A     : ARRAY OF ARRAY OF LONGREAL;
                         N     : INTEGER;
@@ -31,10 +31,10 @@
          (* In case iFehl # 0 Cond is MAX(LONGREAL)                         *)
          (*-----------------------------------------------------------------*)
 
-PROCEDURE Zerlege(VAR A        : MATRIX;     (* Koeffizientenmatrix *)
-                  VAR IndexI   : CARDVEKTOR;
-                  VAR IndexJ   : CARDVEKTOR;
-                  VAR RPivot   : VEKTOR;
+PROCEDURE Zerlege(VAR A        : ARRAY OF ARRAY OF LONGREAL;
+                  VAR IndexI   : ARRAY OF CARDINAL;
+                  VAR IndexJ   : ARRAY OF CARDINAL;
+                  VAR RPivot   : ARRAY OF LONGREAL;
                   VAR Det      : LONGREAL;   (* Determinante der Matrix     *)
                       dim      : CARDINAL;   (* Dimension der qadr. Matrix  *)
                       MaxPivot : BOOLEAN);   (* w=Totalpivot, f=Zeilenpivot *)
@@ -48,23 +48,30 @@
           (* Fehler auf TRUE gesetzt.                                       *)
           (*----------------------------------------------------------------*)
 
-PROCEDURE BerechneLoesung(VAR A      : MATRIX;
-                          VAR X      : VEKTOR;
-                              C      : VEKTOR;
-                          VAR RPivot : VEKTOR;
-                          VAR IndexI : CARDVEKTOR;
-                          VAR IndexJ : CARDVEKTOR;
+PROCEDURE BerechneLoesung(VAR A      : ARRAY OF ARRAY OF LONGREAL;
+                          VAR X      : ARRAY OF LONGREAL;
+                              C      : ARRAY OF LONGREAL;
+                          VAR RPivot : ARRAY OF LONGREAL;
+                          VAR IndexI : ARRAY OF CARDINAL;
+                          VAR IndexJ : ARRAY OF CARDINAL;
                               dim    : CARDINAL);
 
           (*----------------------------------------------------------------*)
           (* Berechnet den L\"osungsvektor X der Gleichung A X = C mit der  *)
           (* in der Zerlege nach Gauss zerlegten Matrix A                   *)
-          (* IndexI : Zeilenvertauschungsinformationen.                     *)
-          (* IndexJ : Spaltenvertauschungsinformationen. IndexJ_k = k wenn  *)
-          (*          nur Zeilenpivot.                                      *)
-          (*----------------------------------------------------------------*)
-
-PROCEDURE Det(VAR A : MATRIX; dim : CARDINAL) : LONGREAL;
+          (*                                                                *)
+          (*   A      : Koeffizientenmatrix                                 *)
+          (*   X      : Gesuchte Loesung des Gleichungssystems              *)
+          (*   C      : Konstantenvektor, rechte Seite d. Gleichungssystems *)
+          (*   RPivot : Reziproke Pivotelemente wie von Zerlege berechnet   *)
+          (*   IndexI : Zeilenvertauschungsinformationen.                   *)
+          (*   IndexJ : Spaltenvertauschungsinformationen. IndexJ_k = k     *)
+          (*            wenn nur Zeilenpivot.                               *)
+          (*   dim    : Dimension der qadr. Matrix A                        *)
+          (*----------------------------------------------------------------*)
+
+PROCEDURE Det(VAR A   : ARRAY OF ARRAY OF LONGREAL;
+                  dim : CARDINAL) : LONGREAL;
 
           (*----------------------------------------------------------------*)
           (* Berechnet die Determinante von A, wobei die Koeffizienten-     *)
@@ -73,9 +80,9 @@
           (* die globale Variable Fehler auf TRUE gesetzt.                  *)
           (*----------------------------------------------------------------*)
 
-PROCEDURE Gauss(VAR A        : MATRIX;    (* Koeffizientenmatrix     *)
-                VAR X        : VEKTOR;    (* L\"osungsvektor des LG  *)
-                    C        : VEKTOR;    (* Konstantenvektor des LG *)
+PROCEDURE Gauss(VAR A        : ARRAY OF ARRAY OF LONGREAL;
+                VAR X        : ARRAY OF LONGREAL;
+                    C        : ARRAY OF LONGREAL;
                     dim      : CARDINAL;
                 VAR Det      : LONGREAL;  (* Determinante von A      *)
                     MaxIter  : CARDINAL;
@@ -93,14 +100,24 @@
           (* nachiteriert.                                                  *)
           (* Wenn die Matrix singul\"ar oder sonstwie nicht l\"osbar ist,   *)
           (* wird die globale Variable Fehler auf TRUE gesetzt.             *)
-          (* iFehl = 0 : kein Fehler aufgetreten.                           *)
-          (*         1 : Koeffizentenmatrix zerst\"ort (kein Nachiterieren) *)
-          (*         2 : Iteration nicht konvergent.                        *)
-          (*         3 : Koeffizentenmatix singul\"ar.                      *)
-          (*         4 : Dimension der Matrix < 1                           *)
-          (*----------------------------------------------------------------*)
-
-PROCEDURE Householder(VAR A  : MATRIX;
+          (*                                                                *)
+          (*   A        : Koeffizientenmatrix                               *)
+          (*   X        : L\"osungsvektor des LG                            *)
+          (*   C        : Konstantenvektor des LG                           *)
+          (*   dim      : Dimension von A                                   *)
+          (*   Det      : Determinante von A                                *)
+          (*   MaxIter  : Maximalzahl der Nachiterationen                   *)
+          (*   PivStrat : Pivotstrategie                                    *)
+          (*   iFehl    : Fehlernummer                                      *)
+          (*                0 : kein Fehler aufgetreten.                    *)
+          (*                1 : Koeffizentenmatrix zerst\"ort               *)
+          (*                    (kein Nachiterieren moeglich)               *)
+          (*                2 : Iteration nicht konvergent.                 *)
+          (*                3 : Koeffizentenmatix singul\"ar.               *)
+          (*                4 : Dimension der Matrix < 1                    *)
+          (*----------------------------------------------------------------*)
+
+PROCEDURE Householder(VAR A  : ARRAY OF ARRAY OF LONGREAL;
                       VAR X  : ARRAY OF LONGREAL;
                           C  : ARRAY OF LONGREAL;
                           n  : CARDINAL;  (* Anzahl der Gleichungen, n >= m *)
@@ -194,9 +211,9 @@
           (* Bauer/Reinsch, pp. 47 im "Handbuch", Alogol60 routine gidef2   *)
           (*----------------------------------------------------------------*)
 
-PROCEDURE Jacobi(VAR A       : MATRIX;            (* <==  *)
-                 VAR X       : VEKTOR;            (* <==> *)
-                 VAR C       : ARRAY OF LONGREAL; (* <==  *)
+PROCEDURE Jacobi(VAR A       : ARRAY OF ARRAY OF LONGREAL;   (* <==  *)
+                 VAR X       : ARRAY OF LONGREAL;            (* <==> *)
+                 VAR C       : ARRAY OF LONGREAL;            (* <==  *)
                      dim     : CARDINAL; 
                      Tol     : LONGREAL; 
                      Neu     : CARDINAL;
@@ -239,37 +256,62 @@
           (* F"ur alle Fehlercodes gr"o\3er 3 wurde kein L"osung gefunden.  *)
           (*----------------------------------------------------------------*)
 
-PROCEDURE GaussSeidel(VAR A        : MATRIX;     (* Koeffizinten - Matrix *)
-                      VAR X        : VEKTOR;     (* L\"osungsvektor *)
-                      VAR C        : VEKTOR;
+PROCEDURE GaussSeidel(VAR A        : ARRAY OF ARRAY OF LONGREAL;
+                      VAR X        : ARRAY OF LONGREAL;
+                      VAR C        : ARRAY OF LONGREAL;
                           dim      : CARDINAL;
-                          genau    : LONGREAL;   (* Abbruchkriterium *)
+                          genau    : LONGREAL;
                           MaxIter  : CARDINAL;
                           Neu      : CARDINAL;
-                          FehlMeld : BOOLEAN;    (* Fehlermeldungen j/n 1/0 *)
+                          FehlMeld : BOOLEAN;
                       VAR Iter     : CARDINAL;
                       VAR iFehl    : INTEGER);
 
           (*----------------------------------------------------------------*)
+          (* Solves the (diagonal dominant) linear system of equations      *)
+          (* A x X = C by the (iterativ) Gauss - Seidel Algorithm.          *)
+          (* (E - L)x^{k+1} = C + Ux^k mit A = E-U-L.                       *)
+          (*                                                                *)
           (* L\"o\3t das (diagonal dominante) lineare Gleichungssystem      *)
-          (* A X = C nach dem (iterativen) Gauss - Seidel Algorithmus.      *)
+          (* A x X = C nach dem (iterativen) Gauss - Seidel Algorithmus.    *)
           (* (E - L)x^{k+1} = C + Ux^k mit A = E-U-L.                       *)
-          (* Neu =                                                          *)
+          (*                                                                *)
+          (*    A        : Koeffizinten - Matrix                            *)
+          (*    X        : L\"osungsvektor                                  *)
+          (*    C        : Konstantenvektor                                 *)
+          (*    dim      : Dimension der Koeffizientenmatrix                *)
+          (*    genau    : Abbruchkriterium                                 *)
+          (*    MaxIter  : Maximalzahl der Iterationen                      *)
+          (*    Neu      : s.u.                                             *)
+          (*    FehlMeld : Fehlermeldungen j/n 1/0                          *)
+          (*    Iter     : Anzahl der benoetigten Iterationen               *)
+          (*    iFehl    : s.u.                                             *)
+          (*                                                                *)
+          (* Neu:                                                           *)
+          (*                                                                *)
           (*   0 : Der Startvektor f\"ur X wird vorgegeben.                 *)
           (*   1 : Der Startvektor f\"ur X wird neu berechnet.              *)
-          (* iFehl =                                                        *)
+          (*                                                                *)
+          (* iFehl:                                                         *)
+          (*                                                                *)
           (*   0 : Es ist kein Fehler aufgetreten.                          *)
           (*   1 : Es ist kein Fehler aufgetreten, die Matrix ist aber      *)
           (*       nicht diagonal dominant. (h\"oherer Zeitaufwand)         *)
           (*   2 : MaxIter ist \"uberschritten                              *)
-          (*   3 : Problem ist mit dieser Routine nicht l\"o\3bar.          *)
-          (*   6 : Ein Diagonalelement von A ist Null - es kann keine       *)
+          (*   3 : Problem ist mit dieser Routine nicht l\"o\3bar da ein    *)
+          (*       Diagonalelement im Zuge der Berechnung zu klein geworden *)
+          (*       ist                                                      *)
+          (*   4 : Die Matrix ist nicht diagonal dominant und die           *)
+          (*       Berechnung der Loesung divergiert                        *)
+          (*   6 : Ein Diagonalelement von A exakt Null - es kann keine     *)
           (*       L"osung  berechnet werden.                               *)
-          (* In allen F\"allen, in denen FehlZahl > 0 werden auch die       *)
-          (* globalen Variablen Fehler und Fehlerflag entsprechend          *)
-          (* gesetzt. Wenn FehlZahl = 1 kann die Routine mit (Neu = 0)      *)
-          (* wieder gerufen werden.                                         *)
-          (* FehlMeld =                                                     *)
+          (*                                                                *)
+          (* In allen F\"allen, in denen iFehl > 0 werden auch die globalen *)
+          (* Variablen Fehler und Fehlerflag entsprechend gesetzt. Wenn     *)
+          (* iFehl=1 kann die Routine mit (Neu = 0) wieder gerufen werden.  *)
+          (*                                                                *)
+          (* FehlMeld:                                                      *)
+          (*                                                                *)
           (*   FALSE : Fehler werden nicht auf dem Bildschirm angezeigt.    *)
           (*   TRUE  : Alle Fehler werden auf dem Bildschirm angezeigt.     *)
           (*                                                                *)
@@ -321,6 +363,10 @@
                    VAR iFehl : INTEGER);
 
           (*----------------------------------------------------------------*)
+          (* Calculates the solution of a linear system of equations        *)
+          (* A x X = C with symmetric, positiv definite coefficien matrix   *)
+          (* A stored in super linear form.                                 *)
+          (*                                                                *)
           (* Berechnet die L\"osung X eines linearen Gleichungsystem        *)
           (* A X = C mit symmetrischer, positiv definiten Koeffizienten -   *)
           (* matrix A in Superlinearform.                                   *)
@@ -394,22 +440,28 @@
           (* "Handbuch" routine cholsol1                                    *)
           (*----------------------------------------------------------------*)
 
-PROCEDURE CZerlege(VAR A      : CMATRIX;     (* Koeffizientenmatrix *)
-                   VAR Index  : CARDVEKTOR;
+PROCEDURE CZerlege(VAR A      : ARRAY OF ARRAY OF LONGCOMPLEX;
+                   VAR Index  : ARRAY OF CARDINAL;
                    VAR Det    : LONGCOMPLEX;
-                   VAR EDet   : INTEGER;     (* Det(A) = Det*2^EDet *)
-                       dim    : CARDINAL);   (* Dimension der qadr. Matrix *)
+                   VAR EDet   : INTEGER;
+                       dim    : CARDINAL);
 
           (*----------------------------------------------------------------*)
           (* Zerlegt die komplexe Matrix A. (LU = A) mit Zeilenpivotierung  *)
           (* Vertauschungen werden in Index angezeigt                       *)
           (* Fehlermeldungen wenn A singul\"ar oder unl\"osbar.             *)
-          (*----------------------------------------------------------------*)
-
-PROCEDURE CBerechneLoesung(VAR A     : CMATRIX;
-                           VAR X     : CVEKTOR;
-                               C     : CVEKTOR;
-                               Index : CARDVEKTOR;
+          (*                                                                *)
+          (*   A      : Koeffizientenmatrix                                 *)
+          (*   Index  : Information ueber Vertauschungen durch Pivotierung  *)
+          (*   Det    : Basis der Determinante von A                        *)
+          (*   EDet   : Det(A) = Det*2^EDet                                 *)
+          (*   dim    : Dimension der qadr. Matrix A                        *)
+          (*----------------------------------------------------------------*)
+
+PROCEDURE CBerechneLoesung(VAR A     : ARRAY OF ARRAY OF LONGCOMPLEX;
+                           VAR X     : ARRAY OF LONGCOMPLEX;
+                               C     : ARRAY OF LONGCOMPLEX;
+                           VAR Index : ARRAY OF CARDINAL;
                                dim   : CARDINAL);
 
           (*----------------------------------------------------------------*)
@@ -418,7 +470,8 @@
           (* Die Routine ist das komplexe Analogon zu BerechneLoesung.      *)
           (*----------------------------------------------------------------*)
 
-PROCEDURE CDet(dim : CARDINAL; VAR A : CMATRIX) : LONGCOMPLEX;
+PROCEDURE CDet(    dim : CARDINAL; 
+               VAR A   : ARRAY OF ARRAY OF LONGCOMPLEX) : LONGCOMPLEX;
 
           (*----------------------------------------------------------------*)
           (* Berechnet die komplexe Determinante von A.                     *)
@@ -427,15 +480,15 @@
           (* gesetzt und eine Fehlermeldung ausgeschrieben.                 *)
           (*----------------------------------------------------------------*)
  
-PROCEDURE CLoeseGlSy(VAR A       : CMATRIX;
-                     VAR X       : CVEKTOR;  (* L\"osungsvektor.   *)
-                         C       : CVEKTOR;
-                     VAR Det     : LONGCOMPLEX; (* Determinte von A *)
-                         dim     : CARDINAL;
-                     VAR iFehl   : INTEGER);
-
-          (*----------------------------------------------------------------*)
-          (* Berechnet die L\"osung des komplexen Gleichngssystems Ax = c   *)
+PROCEDURE CLoeseGlSy(VAR A     : ARRAY OF ARRAY OF LONGCOMPLEX;
+                     VAR X     : ARRAY OF LONGCOMPLEX; (* L\"osungsvektor.  *)
+                         C     : ARRAY OF LONGCOMPLEX;
+                     VAR Det   : LONGCOMPLEX; (* Determinte von A *)
+                         dim   : CARDINAL;
+                     VAR iFehl : INTEGER);
+
+          (*----------------------------------------------------------------*)
+          (* Berechnet die Loesung des komplexen Gleichngssystems A x X = C *)
           (* Wenn die Matrix singul\"ar oder sonstwie nicht l\"osbar        *)
           (* ist, wird dir globale Variable Fehler auf TRUE gesetzt.        *)
           (*                                                                *)