DEFINITION MODULE FMatEA;

  (*------------------------------------------------------------------------*)
  (* Routinen zur Ein- Ausgabe von Vektoren und Matrizen.                   *)
  (* Routines for input and output of Vectors and matrices.                 *)
  (*------------------------------------------------------------------------*)
  (* Implementation : Michael Riedl                                         *)
  (* Licence        : GNU Lesser General Public License (LGPL)              *)
  (*------------------------------------------------------------------------*)

  (* $Id: FMatEA.def,v 1.7 2017/10/01 07:45:04 mriedl Exp mriedl $ *)

FROM Deklera    IMPORT PMATRIX;
FROM FileSystem IMPORT File;

PROCEDURE LesePaare(VAR Ein : File;
                    VAR X,Y : ARRAY OF LONGREAL;
                    VAR dim : CARDINAL); (* Anzahl der Datenpaare *)

          (*----------------------------------------------------------------*)
          (* Lie\3t von der Datei Ein solange Datenpaare X_i,X_i, bis das   *)
          (* Dateiende erreicht ist.                                        *)
          (*----------------------------------------------------------------*)

PROCEDURE LeseMat(VAR Ein : File;
                  VAR Mat : ARRAY OF ARRAY OF LONGREAL;
                  VAR dim : CARDINAL);

          (*----------------------------------------------------------------*)
          (* Einlesen einer Matrix im einfachen Format                      *)
          (*                                                                *)
          (*   1.1 1.2 1.3                                                  *)
          (*   2.1 2.2 2.3                                                  *)
          (*   3.1 3.2 3.3                                                  *)
          (*----------------------------------------------------------------*)

PROCEDURE LeseSV(VAR Ein : File;
                 VAR SV  : ARRAY OF LONGREAL; (* SUPERVEKTOR *)
                 VAR dim : CARDINAL);

          (*----------------------------------------------------------------*)
          (* Einlesen eines Supervektors im einfachen Format                *)
          (*                                                                *)
          (*   1.0                                                          *)
          (*   2.0 3.0                                                      *)
          (*   4.0 4.0 6.0                                                  *)
          (*----------------------------------------------------------------*)

PROCEDURE LeseMatAus(VAR Ein     : File;
                     VAR Mat     : ARRAY OF ARRAY OF LONGREAL;
                         dim     : CARDINAL;  (* Dimension der Matrix    *)
                         Spalten : CARDINAL;  (* Vektorenanzahl je Block *)
                         VekAnz  : CARDINAL); (* Anzahl der Vektoren     *)

          (*----------------------------------------------------------------*)
          (* Lie\3t eine mit der Routine MATaus geschriebene Matrix von der *)
          (* Datei Ein.                                                     *)
          (*----------------------------------------------------------------*)

PROCEDURE Ausgabe(VAR Aus      : File;
                  VAR VEK      : ARRAY OF LONGREAL;
                      Kurzname : ARRAY OF CHAR;
                      Name     : ARRAY OF CHAR;
                      dim      : CARDINAL;
                      FeldBr   : CARDINAL;
                      Form     : CARDINAL);

          (*----------------------------------------------------------------*)
          (* Schreibt den Vektor VEK auf die Datei Aus in der Feldbreite    *)
          (* Breite. Wenn Form = 1 in E-Format, sonst in F-FormatE aus. Der *)
          (* Name wird dabei als "Uberschrift ausgegeben und Kurzname bei   *)
          (* jedem einzelen Vektorelement.                                  *)
          (*----------------------------------------------------------------*)

PROCEDURE CAusgabe(VAR Aus      : File;
                   VAR VEK      : ARRAY OF LONGCOMPLEX;
                       Kurzname : ARRAY OF CHAR;
                       Name     : ARRAY OF CHAR;
                       dim      : CARDINAL;
                       Breite   : CARDINAL;
                       Form     : CARDINAL);

          (*----------------------------------------------------------------*)
          (* Schreibt den komplexen Vektor VEK auf die Datei Aus in der     *)
          (* Feldbreite Breite. Wenn Form = 1 in E-Format, sonst in         *)
          (* F-FormatE aus. Der Name wird dabei als Ueberschrift ausgegeben *)
          (* und Kurzname bei jedem einzelen Vektorelement.                 *)
          (*----------------------------------------------------------------*)

PROCEDURE MATein(VAR Ein   : File;
                 VAR MAT   : ARRAY OF ARRAY OF LONGREAL; (* Einzules. MATRIX *)
                 VAR Name  : ARRAY OF CHAR;
                 VAR dim   : CARDINAL;   (* dim : Dimension der MATRIX *)
                 VAR halt  : CARDINAL;
                     sym   : CARDINAL);

          (*----------------------------------------------------------------*)
          (* Lie\3t eine quadratische Matrix MAT von Ein                    *)
          (*                                                                *)
          (*      1.Zeile   : Kommentar            ==> Name                 *)
          (*      2.Zeile   : Dimension der Matrix ==> dim                  *)
          (*      3.Zeile   : Indices von MAT(I,J) , Wert von MAT(I,J)      *)
          (*                  IND = 0, wenn keine weitren Matrixelemnte,    *)
          (*                  sonst 1                                       *)
          (*      halt      : Gibt an rufendes Programm zur"uck,ob noch     *)
          (*                  Datens"atze auf Ein vorhanden sind.           *)
          (*      halt  = 0 : Keine weiteren Daten.                         *)
          (*      halt  = 1 : Weiteren Daten vorhanden.                     *)
          (*      sym   = 1 : Symmetrische Matrix  MAT(I,J) = MAT(J,I)      *)
          (*      sym   = 0 : Matrix wie in Ein angegeben.                  *)
          (*      Beispiel:  NAME                                           *)
          (*                 3                                              *)
          (*                 1 1 1.0 1          1 0 0                       *)
          (*                 2 2 1.0 1  ergibt  0 1 0  in LONGREAL-Form     *)
          (*                 3 1 1.0 1          1 0 2                       *)
          (*                 3 3 2.0 0                                      *)
          (*                 0                                              *)
          (*                                                                *)
          (* Die im Fehlerfalle gemeldete Eingabedateizeile, in der         *)
          (* der gemeldete Fehler liegen soll, ist nicht immer korrekt.     *)
          (* Werden auf verschiedenen Kan"alen gleichzeitig Matritzen       *)
          (* eingelesen, sind diese Zeilennummern sicher falsch.            *)
          (* Gleiches gilt f"ur die Prozeduren CMATein,SVein und CSVein.    *)
          (*----------------------------------------------------------------*)

PROCEDURE AsymMatEin(VAR Ein   : File;
                     VAR Mat   : ARRAY OF ARRAY OF LONGREAL;
                     VAR Name  : ARRAY OF CHAR;
                     VAR M     : CARDINAL;   (* dim : Dimension der MATRIX *)
                     VAR N     : CARDINAL;
                         trp   : BOOLEAN;
                     VAR halt  : CARDINAL);

          (*----------------------------------------------------------------*)
          (* Lie\3t eine nicht-quadratische Matrix MAT von Ein              *)
          (*                                                                *)
          (* Parameter:                                                     *)
          (*                                                                *)
          (*   trp   : Wenn wahr wird Mat wird transponiert eingelesen      *)
          (*   M     : Anzahl der Vektoren in Mat                           *)
          (*   N     : Laenge eines Vektors in Mat                          *)
          (*                                                                *)
          (* Andere Parameter wie in Prouzedur MATein                       *)
          (*----------------------------------------------------------------*)

PROCEDURE PMatEin(VAR Ein   : File;
                  VAR Mat   : PMATRIX;
                  VAR Name  : ARRAY OF CHAR;
                  VAR M     : CARDINAL;
                  VAR N     : CARDINAL;
                  VAR halt  : CARDINAL;
                      alloc : BOOLEAN);

          (*----------------------------------------------------------------*)
          (* Parameter:                                                     *)
          (*                                                                *)
          (*   M     : Anzahl der Vektoren in Mat                           *)
          (*   N     : Laenge eines Vektors in Mat                          *)
          (*   alloc : Wenn TRUE allokiert die Routine den Speicher für     *)
          (*           die Matrix Mat. Ansonsten muss vorher ausreichend    *)
          (*           Speicherplatz allokiert worden sein. Es finded       *)
          (*           (noch) keine Ueberpruefung statt.                    *)
          (*                                                                *)
          (* Andere Parameter wie in Prouzedur MATein                       *)
          (*----------------------------------------------------------------*)

PROCEDURE CMATein(VAR Ein   : File;
                  VAR CMAT  : ARRAY OF ARRAY OF LONGCOMPLEX; (* Einzules. *)
                  VAR Name  : ARRAY OF CHAR;
                  VAR dim   : CARDINAL;   (* dim : Dimension der CMATRIX *)
                  VAR halt  : CARDINAL;
                      sym   : CARDINAL);

          (*----------------------------------------------------------------*)
          (* Lie\3t eine quadratische komplexe Matrix CMAT von Ein          *)
          (*                                                                *)
          (*      1.Zeile   : Kommentar            ==> Name                 *)
          (*      2.Zeile   : Dimension der Matrix ==> dim                  *)
          (*      3.Zeile   : Indices von MAT(I,J) , Wert von CMAT(I,J)     *)
          (*                  IND = 0, wenn keine weitren Matrixelemnte,    *)
          (*                  sonst 1                                       *)
          (*      halt      : Gibt an rufendes Programm zur"uck,ob noch     *)
          (*                  Datens"atze auf Ein vorhanden sind.           *)
          (*      halt  = 0 : Keine weiteren Daten.                         *)
          (*      halt  = 1 : Weiteren Daten vorhanden.                     *)
          (*      sym   = 1 : Hermitische Matrix CMAT(I,J) = CMAT(J,I)^*    *)
          (*      sym   = 0 : Matrix wie in Ein angegeben.                  *)
          (*      Beispiel:  NAME                                           *)
          (*                 3                                              *)
          (*                 1 1 1.0  0.0 1                                 *)
          (*                 2 2 1.0  3.0 1                                 *)
          (*                 3 1 1.0  1.0 1                                 *)
          (*                 3 3 2.0 -1.0 0                                 *)
          (*                 0                                              *)
          (*----------------------------------------------------------------*)

PROCEDURE SVein(VAR Ein   : File;
                VAR SV    : ARRAY OF LONGREAL; (* Einzules. SUPERVEKTOR *)
                VAR Name  : ARRAY OF CHAR;
                VAR dim   : CARDINAL;    (* dim : Dimension der MATRIX *)
                VAR halt  : CARDINAL);

          (*----------------------------------------------------------------*)
          (* Kommentare siehe MATein, es wird jedoch nur eine gepackte      *)
          (* symmetrische Matrix eingelesen, daher kein Parameter sym.      *)
          (*----------------------------------------------------------------*)

PROCEDURE CSVein(VAR Ein   : File;
                 VAR CSV   : ARRAY OF LONGCOMPLEX; (* Einzules. SUPERVEKTOR *)
                 VAR Name  : ARRAY OF CHAR;
                 VAR dim   : CARDINAL;    (* dim : Dimension der MATRIX *)
                 VAR halt  : CARDINAL);

          (*----------------------------------------------------------------*)
          (* Kommentare siehe CMATein, es wird jedoch nur eine gepackte     *)
          (* hermitische Matrix eingelesen, daher kein Parameter sym.       *)
          (*----------------------------------------------------------------*)

PROCEDURE WrMatAus(VAR Aus  : File;
                   VAR A    : ARRAY OF ARRAY OF LONGREAL;
                       Name : ARRAY OF CHAR;
                       M,N  : CARDINAL;
                       halt : CARDINAL;
                       eps  : LONGREAL);

          (*----------------------------------------------------------------*)
          (* Schreibt die Matrix A auf Aus                                  *)
          (* Routine ist komplementa"ar zu Prozedur MatEin                  *)
          (*                                                                *)
          (* 1.Zeile  : Kommentar            ==> Name                       *)
          (* 2.Zeile  : Dimension der Matrix ==> M N                        *)
          (* 3.Zeile  : Indizes von Mat(i,j), Wert von Mat(i,j) & Indikator *)
          (*            ind = 0, wenn keine weiteren Matrixelemente kommen, *)
          (*             sonst 1                                            *)
          (* halt = 0 : Keine weiteren Daten                                *)
          (* halt = 1 : Weiteren Daten vorhanden die in einem n"achsten     *)
          (*            Auf-uf geschrieben werden sollen                    *)
          (* eps      : Matrixelemente kleiner als eps werden nicht ausge-  *)
          (*            schrieben                                           *)
          (* Siehe auch Kommentare bei MatEin                               *)
          (*----------------------------------------------------------------*)

PROCEDURE VEKaus(VAR Aus    : File;
                     dim    : CARDINAL;
                     Name   : ARRAY OF CHAR;
                 VAR Vek    : ARRAY OF LONGREAL;
                     Breite : CARDINAL;
                     FeldBr : CARDINAL;
                     Form   : CARDINAL);

          (*----------------------------------------------------------------*)
          (* Schreibt den Vektor Vek auf Aus.                               *)
          (*                                                                *)
          (*   Name       : Name des Vektor etc.                            *)
          (*   Breite     : Gesamtbeite des Ausdrucks                       *)
          (*   Feldbr     : Feldbreite eines Vektorelements                 *)
          (*   Form   = 1 : E-Format.                                       *)
          (*   Form   = 2 : Flie\3kommadarstellung.                         *)
          (*----------------------------------------------------------------*)

PROCEDURE CVEKaus(VAR Aus    : File;
                      dim    : CARDINAL;
                      Name   : ARRAY OF CHAR;
                  VAR Vek    : ARRAY OF LONGCOMPLEX;
                      Breite : CARDINAL;
                      FeldBr : CARDINAL;
                      Form   : CARDINAL);

          (*----------------------------------------------------------------*)
          (* Schreibt den komplexen Vektor Vek auf Aus.                     *)
          (* Erklaerungen bei VEKaus                                        *)
          (*----------------------------------------------------------------*)

PROCEDURE MATaus(VAR Aus      : File;
                     M,N      : CARDINAL;  (* Dimension der MATRIX *)
                 VAR Mat      : ARRAY OF ARRAY OF LONGREAL;
                     GesamtBr : CARDINAL;  (* Breite des Ausdrucks *)
                     FeldBr   : CARDINAL;  (* Feldbreite einer Komponente *)
                     Format   : CARDINAL);

          (*----------------------------------------------------------------*)
          (* Schreibt die Matrix MAT auf Aus.                               *)
          (*   Format = 1 : E-Format.                                       *)
          (*   Format = 2 : Flie\3kommadarstellung.                         *)
          (*   Format = 3 : Flie\3kommadarstellung bei der 0 als 0.0{ }     *)
          (*                statt 0.0{0} dargestellt wird                   *)
          (*   M          : Anzahl der auszuschreibenden Vektoren           *)
          (*   N          : Laenges einses Vektors                          *)
          (* Dimensionen von sind also Mat[0..M-1,0..dim-1]                 *)
          (*----------------------------------------------------------------*)

PROCEDURE PMATaus(VAR Aus      : File;
                      M        : CARDINAL;  (* Anzahl der Vektoren *)
                      N        : CARDINAL;  (* L"ange der Vektoren  *)
                  VAR Mat      : PMATRIX;
                      GesamtBr : CARDINAL;  (* Breite des Ausdrucks *)
                      FeldBr   : CARDINAL;  (* Feldbreite einer Komponente *)
                      Format   : CARDINAL);

          (*----------------------------------------------------------------*)
          (* Uebergabeparameter wie f"ur MATaus                             *)
          (*----------------------------------------------------------------*)

PROCEDURE CMATaus(VAR Aus      : File;
                      M        : CARDINAL;  (* Anzahl der   Vektoren *)
                      N        : CARDINAL;  (* Laenge eines Vektors  *)
                  VAR CMat     : ARRAY OF ARRAY OF LONGCOMPLEX;
                      GesamtBr : CARDINAL;  (* Breite des Ausdrucks *)
                      FeldBr   : CARDINAL;  (* Feldbreite einer Komponente *)
                      Format   : CARDINAL);

          (*----------------------------------------------------------------*)
          (* Schreibt die Matrix MAT auf Aus.                               *)
          (* Format = 1 : E-Format.                                         *)
          (* Format = 2 : Flie\3kommadarstellung.                           *)
          (* maxVek     : Anzahl der auszugebenden Spaltenvektoren.         *)
          (*----------------------------------------------------------------*)

PROCEDURE SVaus(VAR Aus      : File;
                    dim      : CARDINAL;    (* Dimension des SUPERVEKTOR *)
                    maxVek   : CARDINAL;
                VAR SV       : ARRAY OF LONGREAL; (* SUPERVEKTOR *)
                    GesamtBr : CARDINAL;   (* Breite des Ausdrucks *)
                    FeldBr   : CARDINAL;   (* Feldbreite einer Komponente *)
                    Format   : CARDINAL);

          (*----------------------------------------------------------------*)
          (* Schreibt den Supervektor SV auf Aus.                           *)
          (* Format = 1 : E-Format.                                         *)
          (* Format = 2 : Flie\3kommadarstellung.                           *)
          (* maxVek     : Anzahl der auszugebenden Spaltenvektoren von SV   *)
          (*----------------------------------------------------------------*)

PROCEDURE CSVaus(VAR Aus      : File;
                     dim      : CARDINAL;    (* Dimension des SUPERVEKTOR *)
                     maxVek   : CARDINAL;
                 VAR CSV      : ARRAY OF LONGCOMPLEX; (* SUPERVEKTOR *)
                     GesamtBr : CARDINAL;   (* Breite des Ausdrucks *)
                     FeldBr   : CARDINAL;   (* Feldbreite einer Komponente *)
                     Format   : CARDINAL);

          (*----------------------------------------------------------------*)
          (* Schreibt den Supervektor CSV auf Aus.                          *)
          (* Format = 1 : E-Format.                                         *)
          (* Format = 2 : Flie\3kommadarstellung.                           *)
          (* Format = 3 : Siehe MATaus                                      *)
          (* maxVek     : Anzahl d. auszugebenden Spaltenvektoren von CSV   *)
          (*----------------------------------------------------------------*)

PROCEDURE MatVekAus(VAR Aus      : File;
                        M,N      : CARDINAL;
                    VAR Vek      : ARRAY OF LONGREAL;
                    VAR Mat      : ARRAY OF ARRAY OF LONGREAL;
                        GesamtBr : CARDINAL;
                        FeldBr   : CARDINAL;
                        Format   : CARDINAL);

          (*----------------------------------------------------------------*)
          (* Schreibt die Mat und den Vektor Vek auf Aus.                   *)
          (*   Format = 1 : E-Format.                                       *)
          (*   Format = 2 : Flie\3kommadarstellung.                         *)
          (*   Format = 3 : Flie\3kommadarstellung bei der 0 als 0.0{ }     *)
          (*                statt 0.0{0} dargestellt wird                   *)
          (*   M          : Anzahl der auszuschreibenden Vektoren           *)
          (*   N          : Laenges einses Vektors                          *)
          (* Dimensionen von sind also Mat[0..M-1,0..N-1]                   *)
          (*----------------------------------------------------------------*)

PROCEDURE PMatVekAus(VAR Aus      : File;
                         M,N      : CARDINAL;
                     VAR Vek      : ARRAY OF LONGREAL;
                     VAR Mat      : PMATRIX;
                         GesamtBr : CARDINAL;
                         FeldBr   : CARDINAL;
                         Format   : CARDINAL);

          (*----------------------------------------------------------------*)
          (* Schreibt die Mat und den Vektor Vek auf Aus.                   *)
          (* Format = 1 : E-Format.                                         *)
          (* Format = 2 : Flie\3kommadarstellung.                           *)
          (* M          : Anzahl d. auszugebenden Spaltenvektoren von Mat   *)
          (*----------------------------------------------------------------*)

PROCEDURE CMatVekAus(VAR Aus      : File;
                         N        : CARDINAL;
                         M        : CARDINAL;
                     VAR CVek     : ARRAY OF LONGCOMPLEX;
                     VAR CMat     : ARRAY OF ARRAY OF LONGCOMPLEX;
                         GesamtBr : CARDINAL;
                         FeldBr   : CARDINAL;
                         Format   : CARDINAL);

          (*----------------------------------------------------------------*)
          (* Schreibt die komplexe Matrix CMat und den komplexen Vektor     *)
          (* CVek auf Aus.                                                  *)
          (* Format = 1 : E-Format.                                         *)
          (* Format = 2 : Flie\3kommadarstellung.                           *)
          (* M          : Anzahl d. auszugebenden Spaltenvektoren von CMat  *)
          (*----------------------------------------------------------------*)

PROCEDURE MVKaus(VAR Aus      : File;
                     N        : CARDINAL;
                     M        : CARDINAL;
                 VAR Komm     : ARRAY OF ARRAY OF CHAR;
                 VAR Vek      : ARRAY OF LONGREAL;
                 VAR Mat      : ARRAY OF ARRAY OF LONGREAL;
                     GesamtBr : CARDINAL;
                     FeldBr   : CARDINAL;
                     Format   : CARDINAL);

          (*----------------------------------------------------------------*)
          (* Schreibt die Matrix Mat sowie den Vektor Vek auf Aus.          *)
          (* Dabei wird jeder Zeile von Mat der Kommentar Komm[i] vor-      *)
          (* angestellt und "uber jeder Zeile von Mat das entsprechende     *)
          (* Element von Vek.                                               *)
          (* Formatanweisungen wie in MATaus.                               *)
          (*----------------------------------------------------------------*)

PROCEDURE SVKaus(VAR Aus      : File;
                     M,N      : CARDINAL;
                 VAR SV       : ARRAY OF LONGREAL; (* SUPERVEKTOR *)
                 VAR Komm     : ARRAY OF ARRAY OF CHAR;
                     GesamtBr : CARDINAL;
                     FeldBr   : CARDINAL;
                     Format   : CARDINAL;
                     quad     : BOOLEAN);

          (*----------------------------------------------------------------*)
          (* Wie Routine SVaus, allerdings werden die Zeilen und Spalten    *)
          (* zus"atzlich zu den Nummern durch die Eintr"age in dem Feld     *)
          (* Komm beschriftet. Dabei wird davon ausgegangen, das die        *)
          (* Kommentarfelder nicht l"anger als 5 Zeichen sind, anderenfalls *)
          (* ist die Ausgabe nicht sauber formatiert.                       *)
          (*----------------------------------------------------------------*)

END FMatEA.
