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.