Switch to side-by-side view

--- a
+++ b/FMatEA.mod
@@ -0,0 +1,1520 @@
+IMPLEMENTATION MODULE FMatEA;
+
+  (*------------------------------------------------------------------------*)
+  (* Routinen zur Ein- Ausgabe von Vektoren und Matrizen.                   *)
+  (* Routines for input and output of Vectors and matrices.                 *)
+  (*------------------------------------------------------------------------*)
+  (* Letzte Bearbeitung :                                                   *)
+  (*                                                                        *)
+  (* 12.10.94, MRi: Fehlerkorrekturen.                                      *)
+  (* 28.07.98, MRi: Einführen der Routine SVKaus.                           *)
+  (* 28.10.15, MRi: Umstellen von MATaus auf "open array" Parameter         *)
+  (* 13.04.16, MRi: Umstellen von MatVekaus auf "open array" Parameter      *)
+  (*                und Parameter dim,MaxVek auf M,N veraendert             *)
+  (*                Ungenutzte Variablen geloescht, Initialisierungs-       *)
+  (*                warnungen eliminiert                                    *)
+  (* 15.04.16, MRi: Modul aus SMatEA neu erzeugt - damit sind die Module    *)
+  (*                wieder abgeglichen. Aufwand ca. 15 Minuten ;-)          *)
+  (* 05.05.16, MRi: Prozedur AsymMatEin und PMatEin eingefuegt.             *)
+  (* 18.06.16, MRi: VAL({INTEGER|CARDINAL},TRUNC(x)) durch VAL(Typ,x) und   *)
+  (*                lg durch log10 ersetzt                                  *)
+  (* 04.08.16, MRi: Prozedur WrMatAus eingefuegt                            *)
+  (* 13.08.16, MRi: Parameter "trp" in AsymMatEin eingefuegt                *)
+  (* 08.12.16, MRi: Ueberarbeiten der Routine SVKaus                        *)
+  (* 19.12.16, MRi: Korrektur bei der Eingabe symmetrischer Matrizen in der *)
+  (*                Prozedur MATein                                         *)
+  (* 24.07.17, MRi: Komplette Elimination von MATRIX,VEKTOR etc. sowie des  *)
+  (*                Record-Type LONGCOMPLEX                                 *)
+  (* 25.07.17, MRi: Korrektuten in CMATein bezueglich Symmetrieabfrage und  *)
+  (*                ueberarbeiten der Routine SVKaus                        *)
+  (* 27.07.17, MRi: Umbenennung nach FMatEA (passt besser zu SMatEA)        *)
+  (*------------------------------------------------------------------------*)
+  (* Hinweis: Das Modul SMatEA kann aus FMatEA durch folgende Aenderungen   *)
+  (*          erzeugt werden                                                *)
+  (*                                                                        *)
+  (* - Ersetzen von FileSystem durch Streams                                *)
+  (* - Ersetzen von Close durch CloseStream                                 *)
+  (* - Globales Ersetzen von "File" durch Stream                            *)
+  (* - Globales Ersetzen von "FIO2" durch SIO                               *)
+  (* - Ersetzen von EOF durch Ein.EOF                                       *)
+  (*                                                                        *)
+  (*------------------------------------------------------------------------*)
+  (* Implementation : Michael Riedl                                         *)
+  (* Licence        : GNU Lesser General Public License (LGPL)              *)
+  (*------------------------------------------------------------------------*)
+
+  (* $Id: FMatEA.mod,v 1.8 2017/10/01 07:45:10 mriedl Exp mriedl $ *)
+
+FROM SYSTEM     IMPORT TSIZE,ADDRESS;
+FROM Storage    IMPORT ALLOCATE,DEALLOCATE;
+FROM StringsLib IMPORT Length,RmMultBlnk;
+FROM Deklera    IMPORT PMATRIX;
+FROM Errors     IMPORT Fehler,Fehlerflag,ErrOut,FatalError;
+                IMPORT Errors;
+                IMPORT LongComplexMath;
+FROM LMathLib   IMPORT log10,CardPot;
+FROM MatLib     IMPORT IJtab;
+FROM Strings    IMPORT Assign;
+FROM DynMat     IMPORT AllocMat;
+                IMPORT TIO;
+FROM FileSystem IMPORT File,Close;
+FROM FIO2       IMPORT WrChar,WrCharN,WrLn,WrLnN,RdStr,WrStr,WrStrForm,
+                       RdCard,WrCard,RdLngReal,WrLngReal,WrLngCmplx,EOF;
+                IMPORT FIO2;
+FROM MatLib     IMPORT MinMaxVek,MinMaxSv;
+
+VAR       MZeil  : CARDINAL;  (* Zeilenz"ahler in MATein.  *)
+          AMZeil : CARDINAL;  (* Zeilenz"ahler in AsymMatEin. *)
+          PZeil  : CARDINAL;  (* Zeilenz"ahler in PMatEin.  *)
+          CMZeil : CARDINAL;  (* Zeilenz"ahler in CMATein. *)
+          SZeil  : CARDINAL;  (* Zeilenz"ahler in SVein.   *)
+          CSZeil : CARDINAL;  (* Zeilenz"ahler in CSVein.  *)
+
+PROCEDURE LesePaare(VAR Ein : File;
+                    VAR X,Y : ARRAY OF LONGREAL;
+                    VAR dim : CARDINAL); (* Anzahl der Datenpaare *)
+
+          CONST Protokoll = FALSE; (* Werte auf den Bildschirm ausschreiben  ? *)
+
+          VAR   i : CARDINAL;
+BEGIN
+      i:=0;
+      LOOP
+        IF (i > HIGH(X)) OR (i > HIGH(Y)) THEN
+          Errors.ErrOut('Zuviele Datenpaare (LesePaare) !'); EXIT;
+        END;
+        RdLngReal(Ein,X[i]);
+        IF EOF THEN EXIT END;
+        IF (X[i] = MAX(LONGREAL)) THEN
+          Errors.WriteString("Lesefehler in Zeile ");
+          Errors.WriteInt   (i+1);
+          Errors.WriteString(" in der Datei ");
+          Errors.WriteString(" ??? "); (* Das kann man besser machen !!! *)
+          Errors.WriteString(" (SMatEA.LesePaare) !");
+          Errors.WriteLn;
+          Errors.FatalError("Programm abgebrochen !");
+        END;
+        RdLngReal(Ein,Y[i]);
+        IF Protokoll THEN
+          TIO.WrLngReal(X[i],18,9); TIO.WrLngReal(Y[i],18,9); TIO.WrLn;
+        END;
+        IF EOF THEN EXIT END;
+        INC(i);
+      END; (* LOOP *)
+      dim:=i;
+END LesePaare;
+
+PROCEDURE LeseMat(VAR Ein : File;
+                  VAR Mat : ARRAY OF ARRAY OF LONGREAL;
+                  VAR dim : CARDINAL);
+
+          VAR i,j : CARDINAL;
+BEGIN
+      RdCard(Ein,dim);
+      FOR i:=0 TO dim-1 DO
+        FOR j:=0 TO dim-1 DO RdLngReal(Ein,Mat[i,j]); END;
+      END;
+END LeseMat;
+
+PROCEDURE LeseSV(VAR Ein : File;
+                 VAR SV  : ARRAY OF LONGREAL;
+                 VAR dim : CARDINAL);
+
+          VAR i,j,ij : CARDINAL;
+BEGIN
+      RdCard(Ein,dim);
+      ij:=0;
+      FOR i:=1 TO dim DO
+        FOR j:=1 TO i DO RdLngReal(Ein,SV[ij]); INC(ij); END;
+      END;
+END LeseSV;
+
+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     *)
+
+          VAR  MaxBlock,Rest,Block  : CARDINAL;
+               i,j,jj,p,q           : CARDINAL;
+BEGIN
+      FOR i:=0 TO dim-1 DO FOR j:=0 TO dim-1 DO Mat[i,j]:=0.0; END; END;
+      MaxBlock:=VekAnz DIV Spalten;
+      Rest:=(VekAnz MOD Spalten);
+      IF (Rest > 0) THEN
+        INC(MaxBlock);
+      ELSIF (Rest = 0) THEN
+        Rest:=VekAnz;
+      END;
+      jj:=0;
+      FOR Block:=1 TO MaxBlock DO
+        IF (Block < MaxBlock) THEN
+          FOR q:=1 TO Spalten DO RdCard(Ein,p); END;
+        ELSE
+          FOR q:=1 TO Rest DO RdCard(Ein,p); END;
+        END;
+        FOR i:=1 TO dim DO
+          RdCard(Ein,p);
+          j:=jj;
+          IF (Block < MaxBlock) THEN
+            FOR q:=1 TO Spalten DO
+              INC(j);
+              RdLngReal(Ein,Mat[j-1,i-1]);
+            END;
+          ELSE
+            FOR q:=1 TO Rest DO
+              INC(j);
+              RdLngReal(Ein,Mat[j-1,i-1]);
+            END;
+          END; (* IF Block *)
+          IF EOF AND ((Block < MaxBlock) AND (i < dim)) THEN
+            ErrOut('Dateiende erreicht (ReadMatAus)');
+            RETURN;
+          END;
+        END; (* FOR i *)
+        INC(jj,Spalten);
+      END; (* FOR Block *)
+END LeseMatAus;
+
+PROCEDURE Ausgabe(VAR Aus      : File;
+                  VAR VEK      : ARRAY OF LONGREAL;
+                      Kurzname : ARRAY OF CHAR;
+                      Name     : ARRAY OF CHAR;
+                      dim      : CARDINAL;
+                      FeldBr   : CARDINAL;
+                      Form     : CARDINAL);
+
+          VAR k,m,leer  : CARDINAL;
+              Exp,Komma : INTEGER;
+              Min,Max   : LONGREAL;
+BEGIN
+      IF (FeldBr > 32) THEN FeldBr:=32; END;
+      IF (Form = 1) THEN
+        IF (FeldBr < 9) THEN FeldBr:=9; END;
+        Komma:= - (VAL(INTEGER,FeldBr) - 8);
+        IF (FIO2.ExpAnz = 2) THEN DEC(Komma); END;
+      ELSE
+        IF (FeldBr < 4) THEN FeldBr:=4; END;
+        Komma:=FeldBr - 3;
+        MinMaxVek(Min,Max,VEK,dim,1);
+        IF (ABS(Max) >= 10.0) THEN
+          Exp:=VAL(INTEGER,log10(ABS(Max)));
+          DEC(Komma,Exp);
+          IF (Komma < 1) THEN Komma:=1; FeldBr:=Exp+4; END;
+        END;
+      END;
+      WrLn(Aus); WrStr(Aus,Name); WrLn(Aus);
+      FOR k:=1 TO FeldBr + 9 + Length(Kurzname) DO WrChar(Aus,'-'); END;
+      WrLn(Aus); m:=3;
+      FOR k:=1 TO dim DO
+        IF (k > 9 ) THEN m:=2; END;
+        IF (k > 99) THEN m:=1; END;
+        WrStr(Aus,Kurzname); WrChar(Aus,'(');
+        WrCard(Aus,k,1);     WrChar(Aus,')');
+        FOR leer:=1 TO m DO  WrChar(Aus,' '); END;
+        WrStr(Aus,' = ');
+        WrLngReal(Aus,VEK[k-1],VAL(CARDINAL,FeldBr),Komma);
+        WrLn(Aus);
+      END;
+      WrLn(Aus);
+END Ausgabe;
+
+PROCEDURE CAusgabe(VAR Aus      : File;
+                   VAR VEK      : ARRAY OF LONGCOMPLEX;
+                       Kurzname : ARRAY OF CHAR;
+                       Name     : ARRAY OF CHAR;
+                       dim      : CARDINAL;
+                       Breite   : CARDINAL;
+                       Form     : CARDINAL);
+
+          VAR k,m,leer : CARDINAL;
+              Vorz     : INTEGER;
+BEGIN
+      IF (Breite > 32) THEN Breite:=32; END;
+      IF (Form = 1) THEN Vorz:=-1; ELSE Vorz:=1; END;
+      WrLn(Aus); WrStr(Aus,Name); WrLn(Aus);
+      FOR k:=1 TO 14 + Length(Kurzname) DO WrChar(Aus,'-'); END;
+      FOR k:=1 TO 2*Breite DO WrChar(Aus,'-'); END;
+      WrLn(Aus);
+      m:=3;
+      FOR k:=1 TO dim DO
+        IF (k > 9 ) THEN m:=2; END;
+        IF (k > 99) THEN m:=1; END;
+        WrStr(Aus,Kurzname); WrChar(Aus,'(');
+        WrCard(Aus,k,1);     WrChar(Aus,')');
+        FOR leer:=1 TO m DO WrChar(Aus,' '); END;
+        WrStr(Aus,' = ');
+        WrLngReal(Aus,RE(VEK[k-1]),Breite,(Breite-8));
+        IF (IM(VEK[k-1]) < 0.0) THEN
+          WrStr(Aus,' - i ');
+        ELSE
+          WrStr(Aus,' + i ');
+        END;
+        WrLngReal(Aus,ABS(IM(VEK[k-1])),Breite,Vorz*VAL(INTEGER,Breite-8));
+        WrLn(Aus);
+      END;
+      WrLn(Aus);
+END CAusgabe;
+
+PROCEDURE EinFehl(VAR Ein      : File;
+                      Zeile    : CARDINAL;
+                      ProcName : ARRAY OF CHAR); (* Eingabeprozedurname *)
+
+          (*-------------------------------------------------------*)
+          (* Unterroutine zu MATein,SVein,CMATein,CSVein.          *)
+          (* Protokolliert Eingabefehler u. bricht d. Programm ab. *)
+          (*-------------------------------------------------------*)
+BEGIN
+      TIO.WrLnN(2); TIO.WrStr('Eingabefehler in Zeile '); TIO.WrCard(Zeile,3);
+      TIO.WrStr(' in der Eingabedatei : '); TIO.WrStr("???"); TIO.WrLnN(2);
+      TIO.WrStr('Programm abgebrochen (');  TIO.WrStr(ProcName);
+      TIO.WrStr(') !');                     TIO.WrLnN(2);
+      Close(Ein); HALT;
+END EinFehl;
+
+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);
+
+          PROCEDURE MeldFehl; BEGIN EinFehl(Ein,MZeil,'MATein'); END MeldFehl;
+
+          VAR  mat     : LONGREAL;
+               ind,i,j : CARDINAL;
+BEGIN
+      RdStr(Ein,Name); INC(MZeil);
+      RdCard(Ein,dim); INC(MZeil);
+      IF (dim > HIGH(Mat)-1) THEN
+        ErrOut('Dimension der Matrix zu gro\3 (MATein)');
+        MeldFehl;
+      ELSE
+        FOR i:=0 TO dim-1 DO FOR j:=0 TO dim-1 DO Mat[i,j]:=0.0; END; END;
+        REPEAT         (* Lese von Null verschiedene Matrixelemente *)
+          INC(MZeil);
+          RdCard(Ein,i);      IF (i   = MAX(CARDINAL)) THEN MeldFehl; END;
+          RdCard(Ein,j);      IF (j   = MAX(CARDINAL)) THEN MeldFehl; END;
+          RdLngReal(Ein,mat); IF (mat = MAX(LONGREAL)) THEN MeldFehl; END;
+          RdCard(Ein,ind);    IF (ind = MAX(CARDINAL)) THEN MeldFehl; END;
+          IF (mat # 0.0) THEN
+            Mat[i-1,j-1]:=mat;
+            IF (sym = 1) AND (i # j) THEN
+              IF (Mat[j-1,i-1] = 0.0) THEN
+                Mat[j-1,i-1]:=mat;
+              ELSIF (Mat[j-1,i-1] # mat) THEN
+                ErrOut('Matrix unsymmetrisch und Parameter sym = 1.');
+                MeldFehl;
+              END;
+            END;
+          END;
+        UNTIL (ind=0);
+        RdCard(Ein,halt); INC(MZeil);
+        IF (halt = MAX(CARDINAL)) THEN MeldFehl; END;
+      END; (*ELSE*)
+END MATein;
+
+PROCEDURE AsymMatEin(VAR Ein   : File;
+                     VAR Mat   : ARRAY OF ARRAY OF LONGREAL;
+                     VAR Name  : ARRAY OF CHAR;
+                     VAR M     : CARDINAL;
+                     VAR N     : CARDINAL;
+                         trp   : BOOLEAN;
+                     VAR halt  : CARDINAL);
+
+          PROCEDURE MeldFehl; BEGIN EinFehl(Ein,AMZeil,'MATein'); END MeldFehl;
+
+          VAR  mat     : LONGREAL;
+               ind,i,j : CARDINAL;
+BEGIN
+      RdStr(Ein,Name); INC(AMZeil);
+      RdCard(Ein,M);   RdCard(Ein,N); INC(AMZeil);
+      FOR i:=0 TO M-1 DO FOR j:=0 TO N-1 DO Mat[i][j]:=0.0; END; END;
+      REPEAT         (* Lese von Null verschiedene Matrixelemente *)
+        INC(AMZeil);
+        RdCard(Ein,i);      IF (i   = MAX(CARDINAL)) THEN MeldFehl; END;
+        RdCard(Ein,j);      IF (j   = MAX(CARDINAL)) THEN MeldFehl; END;
+        RdLngReal(Ein,mat); IF (mat = MAX(LONGREAL)) THEN MeldFehl; END;
+        RdCard(Ein,ind);    IF (ind = MAX(CARDINAL)) THEN MeldFehl; END;
+        IF trp THEN
+          Mat[j-1][i-1]:=mat;
+        ELSE
+          Mat[i-1][j-1]:=mat;
+        END;
+      UNTIL (ind=0);
+      RdCard(Ein,halt); INC(AMZeil);
+      IF (halt = MAX(CARDINAL)) THEN MeldFehl; END;
+END AsymMatEin;
+
+PROCEDURE PMatEin(VAR Ein   : File;
+                  VAR Mat   : PMATRIX;
+                  VAR Name  : ARRAY OF CHAR;
+                  VAR M     : CARDINAL;   (* dim : Dimension der MATRIX *)
+                  VAR N     : CARDINAL;
+                  VAR halt  : CARDINAL;
+                      alloc : BOOLEAN);
+
+          PROCEDURE MeldFehl; BEGIN EinFehl(Ein,PZeil,'MATein'); END MeldFehl;
+
+          VAR  mat     : LONGREAL;
+               ind,i,j : CARDINAL;
+BEGIN
+      RdStr(Ein,Name); INC(PZeil);
+      RdCard(Ein,M);   RdCard(Ein,N); INC(PZeil);
+      IF alloc THEN
+        AllocMat(Mat,M,N);
+      END;
+      FOR i:=1 TO M DO FOR j:=1 TO N DO Mat^[i]^[j]:=0.0; END; END;
+      REPEAT         (* Lese von Null verschiedene Matrixelemente *)
+        INC(PZeil);
+        RdCard(Ein,i);      IF (i   = MAX(CARDINAL)) THEN MeldFehl; END;
+        RdCard(Ein,j);      IF (j   = MAX(CARDINAL)) THEN MeldFehl; END;
+        RdLngReal(Ein,mat); IF (mat = MAX(LONGREAL)) THEN MeldFehl; END;
+        RdCard(Ein,ind);    IF (ind = MAX(CARDINAL)) THEN MeldFehl; END;
+        Mat^[i]^[j]:=mat;
+(*
+        TIO.WrCard(i,3); TIO.WrCard(j,3); TIO.WrLngReal(mat,7,3);
+        TIO.WrCard(ind,3); TIO.WrLn;
+ *)
+      UNTIL (ind=0);
+      RdCard(Ein,halt); INC(PZeil);
+      IF (halt = MAX(CARDINAL)) THEN MeldFehl; END;
+END PMatEin;
+
+PROCEDURE CMATein(VAR Ein   : File;
+                  VAR CMat  : ARRAY OF ARRAY OF LONGCOMPLEX;
+                  VAR Name  : ARRAY OF CHAR;
+                  VAR dim   : CARDINAL;   (* dim : Dimension der MATRIX *)
+                  VAR halt  : CARDINAL;
+                      sym   : CARDINAL);
+
+          PROCEDURE MeldFehl; BEGIN EinFehl(Ein,CMZeil,'CMATein'); END MeldFehl;
+
+          VAR  cmat    : RECORD re,im : LONGREAL; END;
+               ind,i,j : CARDINAL;
+BEGIN
+      RdStr(Ein,Name); INC(CMZeil);
+      RdCard(Ein,dim); INC(CMZeil);
+      IF (dim > HIGH(CMat)-1) THEN
+        ErrOut('Dimension der Matrix zu gro\3 (MATein)');
+        MeldFehl;
+      ELSE
+        FOR i:=0 TO dim-1 DO
+          FOR j:=0 TO dim-1 DO CMat[i,j]:=CMPLX(0.0,0.0); END;
+        END;
+        REPEAT        (* Lese von Null verschiedene CMATRIXelemente *)
+          INC(CMZeil);
+          RdCard(Ein,i); IF (i = MAX(CARDINAL)) THEN MeldFehl; END;
+          RdCard(Ein,j); IF (j = MAX(CARDINAL)) THEN MeldFehl; END;
+          DEC(i); DEC(j);
+          RdLngReal(Ein,cmat.re);
+          IF (cmat.re = MAX(LONGREAL)) THEN MeldFehl; END;
+          RdLngReal(Ein,cmat.im);
+          IF (cmat.im = MAX(LONGREAL)) THEN MeldFehl; END;
+          RdCard(Ein,ind);    IF (ind = MAX(CARDINAL)) THEN MeldFehl; END;
+          CMat[i,j]:=CMPLX(cmat.re,cmat.im);
+          IF (sym = 1) THEN
+            IF  (i # j) AND
+                (CMat[i,j] # LongComplexMath.conj(CMat[j,i])) AND
+                (CMat[j,i] # LongComplexMath.zero)
+            THEN
+              ErrOut('Matrix unsymmetrisch und Parameter sym = 1.');
+              MeldFehl;
+            END;
+            IF (i # j) THEN CMat[j,i]:=CMPLX(cmat.re,-cmat.im); END;
+          END;
+        UNTIL (ind=0);
+        RdCard(Ein,halt); INC(CMZeil);
+        IF (halt = MAX(CARDINAL)) THEN MeldFehl; END;
+      END; (* ELSE *)
+END CMATein;
+
+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);
+
+          PROCEDURE MeldFehl; BEGIN EinFehl(Ein,SZeil,'SVein'); END MeldFehl;
+
+          CONST Protokoll = FALSE; (* Werte auf d. Bildschirm ausschreiben ? *)
+
+          VAR  sv             : LONGREAL;
+               ind,int,i,j,ij : CARDINAL;
+BEGIN
+      RdStr(Ein,Name); INC(SZeil);
+      RdCard(Ein,dim); INC(SZeil);
+      IF (((dim*(dim+1) DIV 2)-1) > HIGH(SV)) THEN
+        ErrOut('Dimension der Matrix zu gro\3 (SVein)');
+        MeldFehl;
+      ELSE
+        FOR ij:=1 TO (dim*(dim+1) DIV 2) DO SV[ij-1]:=0.0; END;
+        REPEAT           (* Lese von Null verschiedene SVelemente *)
+          INC(SZeil);
+          RdCard(Ein,i);     IF (i   = MAX(CARDINAL)) THEN MeldFehl; END;
+          RdCard(Ein,j);     IF (j   = MAX(CARDINAL)) THEN MeldFehl; END;
+          RdLngReal(Ein,sv); IF (sv  = MAX(LONGREAL)) THEN MeldFehl; END;
+          RdCard(Ein,ind);   IF (ind = MAX(CARDINAL)) THEN MeldFehl; END;
+          IF (i < j ) THEN int:=i; i:=j; j:=int; END;
+          ij:=(i*(i-1) DIV 2 ) + j;
+          SV[ij-1]:=sv;
+          IF Protokoll THEN
+            TIO.WrCard(i,4); TIO.WrCard(j,4);
+            TIO.WrLngReal(SV[ij-1],18,9); TIO.WrCard(ind,3); TIO.WrLn;
+          END;
+        UNTIL (ind = 0);
+        INC(SZeil);
+        RdCard(Ein,halt);    IF (halt = MAX(CARDINAL)) THEN MeldFehl; END;
+      END; (* ELSE *)
+END SVein;
+
+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);
+
+          PROCEDURE MeldFehl; BEGIN EinFehl(Ein,CSZeil,'CSVein'); END MeldFehl;
+
+          VAR   csv            : RECORD re,im : LONGREAL; END;
+                ind,int,i,j,ij : CARDINAL;
+BEGIN
+      RdStr(Ein,Name); INC(CSZeil);
+      RdCard(Ein,dim); INC(CSZeil);
+      IF (((dim*(dim+1) DIV 2)-1) > HIGH(CSV)) THEN
+        ErrOut('Dimension der Matrix zu gro\3 (CSVein)');
+        MeldFehl; (* HALT !!!! *)
+      ELSE
+        FOR ij:=1 TO (dim*(dim+1) DIV 2) DO CSV[ij-1]:=CMPLX(0.0,0.0); END;
+        REPEAT           (* Lese von Null verschiedene SVelemente *)
+          INC(CSZeil);
+          RdCard(Ein,i);     IF (i   = MAX(CARDINAL)) THEN MeldFehl; END;
+          RdCard(Ein,j);     IF (j   = MAX(CARDINAL)) THEN MeldFehl; END;
+          RdLngReal(Ein,csv.re);
+          IF (csv.re  = MAX(LONGREAL)) THEN MeldFehl; END;
+          RdLngReal(Ein,csv.im);
+          IF (csv.im  = MAX(LONGREAL)) THEN MeldFehl; END;
+          RdCard(Ein,ind);   IF (ind = MAX(CARDINAL)) THEN MeldFehl; END;
+          IF (i < j ) THEN int:=i; i:=j; j:=int; END;
+          ij:=(i*(i-1) DIV 2 ) + j;
+          CSV[ij-1]:=CMPLX(csv.re,csv.im);
+        UNTIL (ind = 0);
+        INC(CSZeil);
+        RdCard(Ein,halt);    IF (halt = MAX(CARDINAL)) THEN MeldFehl; END;
+      END; (* ELSE *)
+END CSVein;
+
+PROCEDURE WrMatAus(VAR Aus  : File;
+                   VAR A    : ARRAY OF ARRAY OF LONGREAL;
+                       Name : ARRAY OF CHAR;
+                       M,N  : CARDINAL;
+                       halt : CARDINAL;
+                       eps  : LONGREAL);
+
+           VAR i,j : CARDINAL;
+               Aij : LONGREAL;
+BEGIN
+      WrStr(Aus,Name); WrLn(Aus);
+      WrCard(Aus,M,3); WrCard(Aus,N,3); WrLn(Aus);
+      FOR i:=1 TO M DO
+        FOR j:=1 TO N DO
+          Aij:=A[i-1,j-1];
+          IF NOT ((i = M) AND (j = N)) THEN
+            IF (ABS(Aij) > eps) THEN
+              WrCard(Aus,i,3);          WrCard(Aus,j,3);
+              WrLngReal(Aus,Aij,20,12); WrStr(Aus,"  1");
+              WrLn(Aus);
+            END; (* IF *)
+          END; (* IF *)
+        END;
+      END;
+      WrCard(Aus,M,3);                 WrCard(Aus,N,3);
+      WrLngReal(Aus,A[M-1,N-1],20,12); WrStr(Aus,"  0");
+      WrLn(Aus);
+      WrCard(Aus,halt,1); WrLn(Aus);
+END WrMatAus;
+
+PROCEDURE VEKaus(VAR Aus    : File;
+                     dim    : CARDINAL;
+                     Name   : ARRAY OF CHAR;
+                 VAR Vek    : ARRAY OF LONGREAL;
+                     Breite : CARDINAL;
+                     FeldBr : CARDINAL;
+                     Form   : CARDINAL);
+
+          VAR i,j,k,Leer,VekAnz     : CARDINAL;
+              Komma,Exp             : INTEGER;
+              max,Rest,Zeile,Zeilen : CARDINAL;
+              Min,Max               : LONGREAL;
+BEGIN
+      IF (Form = 1) THEN
+        IF (FeldBr < 9) THEN FeldBr:=9; END;
+        Komma:=-(VAL(INTEGER,FeldBr) - 8);
+      ELSE
+        IF (FeldBr < 4) THEN FeldBr:=4; END;
+        Komma:=VAL(INTEGER,FeldBr) - 3;
+        MinMaxVek(Min,Max,Vek,dim,1);
+        IF (ABS(Max) >= 10.0) THEN
+          Exp:=VAL(INTEGER,log10(ABS(Max)));
+          DEC(Komma,Exp);
+          IF (Komma < 1) THEN Komma:=1; FeldBr:=Exp+4; END;
+        END;
+      END;
+      i:=0; WHILE (Name[i] <> 0C) AND (i < HIGH(Name)) DO INC(i); END;
+      VekAnz:=Breite DIV (FeldBr + i + 10);
+      Zeilen:=dim DIV VekAnz;
+      Rest  :=dim MOD VekAnz;
+      IF (Rest = 0) THEN Rest:=VekAnz; ELSE INC(Zeilen) END;
+
+      WrLnN(Aus,2);
+      i:=0; Zeile:=1;
+      REPEAT
+        IF (Zeile < Zeilen) THEN max:=VekAnz ELSE max:=Rest END;
+        FOR j:=1 TO max DO
+          INC(i);
+          WrStr(Aus,'  '); WrStr(Aus,Name); WrChar(Aus,'[');
+          WrCard(Aus,i,1); WrChar(Aus,']');
+          IF (i < 10) THEN Leer:=2;
+          ELSIF (i >= 100) THEN Leer:=0;
+          ELSE Leer:=1; END;
+          FOR k:=1 TO Leer DO WrChar(Aus,' '); END;
+          WrStr(Aus,' : ');
+          WrLngReal(Aus,Vek[i-1],FeldBr,Komma);
+        END;
+        INC(Zeile);
+        WrLn(Aus);
+      UNTIL (i >= dim);
+      WrLn(Aus);
+END VEKaus;
+
+PROCEDURE CVEKaus(VAR Aus    : File;
+                      dim    : CARDINAL;
+                      Name   : ARRAY OF CHAR;
+                  VAR Vek    : ARRAY OF LONGCOMPLEX;
+                      Breite : CARDINAL;
+                      FeldBr : CARDINAL;
+                      Form   : CARDINAL);
+
+          VAR i,j,k,Leer,VekAnz     : CARDINAL;
+              Komma,Exp             : INTEGER;
+              max,Rest,Zeile,Zeilen : CARDINAL;
+              Max                   : LONGREAL;
+BEGIN
+      IF (Form = 1) THEN
+        IF (FeldBr < 9) THEN FeldBr:=9; END;
+        Komma:=-(VAL(INTEGER,FeldBr) - 8);
+      ELSE
+        IF (FeldBr < 4) THEN FeldBr:=4; END;
+        Komma:=VAL(INTEGER,FeldBr) - 3;
+        Max:=0.0;
+        FOR i:=0 TO dim-1 DO
+          IF (ABS(RE(Vek[i])) > Max) THEN Max:=ABS(RE(Vek[i])); END;
+          IF (ABS(IM(Vek[i])) > Max) THEN Max:=ABS(IM(Vek[i])); END;
+        END;
+        IF (ABS(Max) >= 10.0) THEN
+          Exp:=VAL(INTEGER,log10(ABS(Max)));
+          DEC(Komma,Exp);
+          IF (Komma < 1) THEN Komma:=1; FeldBr:=Exp+4; END;
+        END;
+      END;
+      i:=0; WHILE (Name[i] <> 0C) AND (i < HIGH(Name)) DO INC(i); END;
+      VekAnz:=Breite DIV (2*FeldBr + i + 14);
+      IF (VekAnz < 1) THEN
+        ErrOut("Bitte das Argument Breite ueberpruefen (FMatEA.CVEKaus)");
+        VekAnz:=1;
+      END;
+      Zeilen:=dim DIV VekAnz;
+      Rest  :=dim MOD VekAnz;
+      IF (Rest = 0) THEN Rest:=VekAnz; ELSE INC(Zeilen) END;
+
+      WrLnN(Aus,2);
+      i:=0; Zeile:=1;
+      REPEAT
+        IF (Zeile < Zeilen) THEN max:=VekAnz ELSE max:=Rest END;
+        FOR j:=1 TO max DO
+          INC(i);
+          WrStr(Aus,'  '); WrStr(Aus,Name); WrChar(Aus,'[');
+          WrCard(Aus,i,1); WrChar(Aus,']');
+          IF (i < 10) THEN Leer:=2;
+          ELSIF (i >= 100) THEN Leer:=0;
+          ELSE Leer:=1; END;
+          FOR k:=1 TO Leer DO WrChar(Aus,' '); END;
+          WrStr(Aus,' : ');
+          WrLngCmplx(Aus,Vek[i-1],FeldBr,Komma);
+        END;
+        INC(Zeile);
+        WrLn(Aus);
+      UNTIL (i >= dim);
+      WrLn(Aus);
+END CVEKaus;
+
+PROCEDURE Formate(    dim,Format      : CARDINAL;
+                  VAR GesamtBr,FeldBr : CARDINAL;
+                  VAR Komma           : INTEGER;
+                  VAR leer            : CARDINAL;
+                  VAR maxVek          : CARDINAL;
+                      Max             : LONGREAL;
+                      testdim         : BOOLEAN);
+
+          (*-------------------------------------------------------------*)
+          (* Die Routine testet die Formatanweisungen der Matrixausgabe- *)
+          (* routinen MATaus,SVaus,CMataus,CSVaus,MatVekAus,CMatVekAus   *)
+          (* und korrigiert diese bei Fehleingaben.                      *)
+          (*-------------------------------------------------------------*)
+
+          VAR Exp : CARDINAL;
+BEGIN
+      IF (maxVek > dim) AND testdim THEN maxVek:=dim; END;
+      IF (GesamtBr > 132) THEN GesamtBr:=132; END;
+      IF (FeldBr > 30) THEN FeldBr:=30; END;
+      Exp:=0;
+      IF (Format = 1) THEN
+        IF (FIO2.ExpAnz = 3) THEN
+          IF (FeldBr < 9) THEN FeldBr:=9; END;
+          Komma:=-VAL(INTEGER,FeldBr-8);
+        ELSIF (FIO2.ExpAnz = 2) THEN
+          IF (FeldBr < 8) THEN FeldBr:=8; END;
+          Komma:=-VAL(INTEGER,FeldBr-7);
+        END;
+      ELSE
+        IF (FeldBr < 4) THEN FeldBr:=4; END;
+        Komma:=FeldBr - 3;
+        IF (ABS(Max) >= 10.0) THEN
+          Exp:=VAL(CARDINAL,log10(ABS(Max)));
+          DEC(Komma,Exp);
+          IF (Komma < 1) THEN Komma:=1; FeldBr:=Exp+4; END;
+        END;
+      END;
+      IF (GesamtBr < (9+FeldBr)) THEN GesamtBr:=FeldBr + 9; END;
+      leer:=Exp + 8; IF (Komma = 1) THEN DEC(leer); END;
+END Formate;
+
+PROCEDURE Null(VAR NullStr : ARRAY OF CHAR;
+                   FeldBr  : CARDINAL;
+                   Komma   : INTEGER);
+
+          (*----------------------------------------------------------------*)
+          (* Initialisiert den String "NullStr" als '0.' in der durch       *)
+          (* FeldBr und Komma vorgegebenen Form u. L"ange                   *)
+          (*----------------------------------------------------------------*)
+
+          VAR i : INTEGER;
+BEGIN
+      FOR i:=0 TO VAL(INTEGER,HIGH(NullStr))-1 DO NullStr[i]:=' '; END;
+      i := VAL(INTEGER,FeldBr) - Komma - 2;
+      IF (i >= 0) AND (i < VAL(INTEGER,HIGH(NullStr)-1)) THEN
+        NullStr[i+1]:='0'; NullStr[i+2]:='.';
+      END;
+      IF (HIGH(NullStr) >= FeldBr+1) THEN
+        NullStr[FeldBr+1]:=0C;
+      ELSE
+        NullStr[HIGH(NullStr)]:=0C;
+      END;
+END Null;
+
+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);
+
+          VAR  VekAnz,m,k,j,i,leer : CARDINAL;
+               Komma               : INTEGER;
+               Max,Schwelle        : LONGREAL;
+               NullStr             : ARRAY [0..34] OF CHAR;
+BEGIN
+      IF (HIGH(Mat) < M-1) OR (HIGH(Mat[0]) < N-1) THEN
+        Errors.Fehler:=TRUE;
+        Errors.Fehlerflag:="*** Dimensionierungsfehler (MatEA.MATaus) ***";
+        Errors.ErrOut(Errors.Fehlerflag);
+        WrLn(Aus); WrStr(Aus,Errors.Fehlerflag); WrLnN(Aus,2);
+        RETURN;
+      END;
+      IF (NOT (Format IN {1,2,3})) THEN Format:=1; END;
+      Max:=ABS(Mat[0,0]);
+      IF (Format > 1) THEN
+        FOR i:=0 TO M-1 DO
+          FOR j:=0 TO N-1 DO
+            IF (ABS(Mat[i,j]) > Max) THEN Max:=ABS(Mat[i,j]); END;
+          END;
+        END;
+      END;
+
+      Formate(N,Format,GesamtBr,FeldBr,Komma,leer,M,Max,FALSE);
+
+      VekAnz:=(GesamtBr-8) DIV (FeldBr+1);
+
+      Schwelle := MAX(LONGREAL); (* Wg. Compilerwarnung *)
+      IF (Format = 3) THEN
+        Null(NullStr,FeldBr,Komma);
+        Schwelle := 0.5 / CardPot(10.0,VAL(CARDINAL,Komma));
+      END;
+
+      m:=1;
+      REPEAT
+        k:=m+VekAnz-1;
+        IF (k >= M) THEN k:=M; END;
+        WrLn(Aus);
+        FOR i:=1 TO leer DO WrChar(Aus,' '); END;
+        FOR i:=m TO k-1 DO
+          WrCard(Aus,i,4);
+          FOR j:=1 TO FeldBr-3 DO WrChar(Aus,' '); END;
+        END;
+        WrCard(Aus,k,4); WrLnN(Aus,2);
+        FOR i:=0 TO N-1 DO
+          WrCard(Aus,i+1,4); WrStr(Aus,'  ');
+          FOR j:=m-1 TO k-1 DO
+            IF (Format = 3) AND (ABS(Mat[j,i]) < Schwelle) THEN
+              WrStr(Aus,NullStr);
+            ELSIF (Format = 1) THEN
+              WrLngReal(Aus,Mat[j,i],(FeldBr+1),Komma);
+            ELSE
+              WrLngReal(Aus,Mat[j,i],(FeldBr+1),Komma);
+            END;
+          END;
+          WrLn(Aus);
+        END; (* FOR i *)
+        INC(m,VekAnz);
+      UNTIL (k >= M);
+      WrLn(Aus);
+END MATaus;
+
+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);
+
+          VAR VekAnz,m,k,j,i,leer : CARDINAL;
+              Komma               : INTEGER;
+              Max,Schwelle        : LONGREAL;
+              NullStr             : ARRAY [0..34] OF CHAR;
+BEGIN
+      IF (NOT (Format IN {1,2,3})) THEN Format:=1; END;
+      Max:=ABS(Mat^[1]^[1]);
+      IF (Format > 1) THEN
+        FOR i:=1 TO M DO
+          FOR j:=1 TO N DO
+            IF (ABS(Mat^[i]^[j]) > Max) THEN Max:=ABS(Mat^[i]^[j]); END;
+          END;
+        END;
+      END;
+      Formate(N,Format,GesamtBr,FeldBr,Komma,leer,M,Max,FALSE);
+      VekAnz:=(GesamtBr-8) DIV (FeldBr+1);
+      Schwelle := MAX(LONGREAL); (* Wg. Compilerwarnung *)
+      IF (Format = 3) THEN
+        Null(NullStr,FeldBr,Komma);
+        Schwelle := 0.5 / CardPot(10.0,VAL(CARDINAL,Komma));
+      END;
+
+      m:=1;
+      REPEAT
+        k:=m+VekAnz-1;
+        IF (k >= M) THEN k:=M; END;
+        WrLn(Aus);
+        FOR i:=1 TO leer DO WrChar(Aus,' '); END;
+        FOR i:=m TO k-1 DO
+          WrCard(Aus,i,4); FOR j:=1 TO FeldBr-3 DO WrChar(Aus,' '); END;
+        END;
+        WrCard(Aus,k,4); WrLnN(Aus,2);
+        FOR i:=1 TO N DO
+          WrCard(Aus,i,4); WrStr(Aus,'  ');
+          FOR j:=m TO k DO
+            IF (Format = 3) AND (ABS(Mat^[j]^[i]) < Schwelle) THEN
+              WrStr(Aus,NullStr);
+            ELSE
+              WrLngReal(Aus,Mat^[j]^[i],(FeldBr+1),Komma);
+            END;
+          END;
+          WrLn(Aus);
+        END; (* FOR i *)
+        INC(m,VekAnz);
+      UNTIL (k >= M);
+      WrLn(Aus);
+END PMATaus;
+
+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);
+
+          VAR VekAnz,m,k,j,i,leer : CARDINAL;
+              Komma               : INTEGER;
+              Max,Schwelle        : LONGREAL;
+              NullStr             : ARRAY [0..34] OF CHAR;
+BEGIN
+      IF (NOT (Format IN {1,2,3})) THEN Format:=1; END;
+      Max:=ABS(RE(CMat[0,0]));
+      IF (Format > 2) THEN (* Bestimme Maximum f"ur Flie\3kommadarstllung. *)
+        FOR i:=0 TO M-1 DO
+          FOR j:=0 TO N-1 DO
+            IF (ABS(RE(CMat[i,j])) > Max) THEN Max:=ABS(RE(CMat[i,j])); END;
+            IF (ABS(IM(CMat[i,j])) > Max) THEN Max:=ABS(IM(CMat[i,j])); END;
+          END;
+        END;
+      END;
+      Formate(N,Format,GesamtBr,FeldBr,Komma,leer,M,Max,FALSE);
+      VekAnz:=(GesamtBr-8) DIV (2*(FeldBr+1));
+      Schwelle := MAX(LONGREAL); (* Wg. Compilerwarnung *)
+      IF (Format = 3) THEN
+        Null(NullStr,FeldBr,Komma);
+        Schwelle := 0.5 / CardPot(10.0,VAL(CARDINAL,Komma));
+      END;
+
+      m:=1;
+      REPEAT
+        k:=m+VekAnz-1;
+        IF (k >= M) THEN k:=M; END;
+        WrLn(Aus);
+        FOR i:=1 TO leer DO WrChar(Aus,' '); END;
+        FOR i:=m TO k-1 DO
+          WrCard(Aus,i,4); FOR j:=1 TO 2*FeldBr-2 DO WrChar(Aus,' '); END;
+        END;
+        WrCard(Aus,k,4); WrLnN(Aus,2);
+        FOR i:=1 TO N DO
+          WrCard(Aus,i,4); WrStr(Aus,'  ');
+          FOR j:=m TO k DO
+            IF (Format = 3) AND (ABS(RE(CMat[j-1,i-1])) < Schwelle) THEN
+              WrStr(Aus,NullStr);
+            ELSE
+              WrLngReal(Aus,RE(CMat[j-1,i-1]),(FeldBr+1),Komma);
+            END;
+            IF (Format = 3) AND (ABS(IM(CMat[j-1,i-1])) < Schwelle) THEN
+              WrStr(Aus,NullStr);
+            ELSE
+(*
+              IF (IM(CMat[j-1,i-1]) < 0.0) THEN
+                WrStr(Aus," -i*");
+              ELSE
+                WrStr(Aus," +i*");
+              END;
+ *)
+              WrLngReal(Aus,(IM(CMat[j-1,i-1])),(FeldBr+1),Komma);
+            END;
+          END;
+          WrLn(Aus);
+        END; (* FOR i *)
+        INC(m,VekAnz);
+      UNTIL (k >= M);
+      WrLn(Aus);
+END CMATaus;
+
+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);
+
+          VAR VekAnz,m,k,j,i,ii,maxk,leer : CARDINAL;
+              Komma                       : INTEGER;
+              Min,Max,Schwelle            : LONGREAL;
+              NullStr                     : ARRAY [0..34] OF CHAR;
+BEGIN
+      IF (NOT (Format IN {1,2,3})) THEN Format:=1; END;
+      Max:=MAX(LONGREAL); (* Wg. Compilerwarnung *)
+      IF (Format > 1) THEN MinMaxSv(Min,Max,SV,dim,1); END;
+      Formate(dim,Format,GesamtBr,FeldBr,Komma,leer,maxVek,Max,TRUE);
+      VekAnz:=(GesamtBr-8) DIV (FeldBr+1);
+      Schwelle := MAX(LONGREAL); (* Wg. Compilerwarnung *)
+      IF (Format = 3) THEN
+        Null(NullStr,FeldBr,Komma);
+        Schwelle := 0.5 / CardPot(10.0,VAL(CARDINAL,Komma));
+      END;
+
+      m:=1;
+      REPEAT
+        k:=m+VekAnz-1; IF (k >= maxVek) THEN k:=maxVek; END;
+        WrLn(Aus); FOR i:=1 TO leer DO WrChar(Aus,' '); END;
+        FOR i:=m TO k-1 DO
+          WrCard(Aus,i,4); FOR j:=1 TO FeldBr-3 DO WrChar(Aus,' '); END;
+        END;
+        WrCard(Aus,k,4); WrLnN(Aus,2);
+        ii:=m*(m-1) DIV 2;
+        FOR i:=m TO dim DO
+          maxk:=i; IF (maxk > k) THEN maxk:=k; END;
+          WrCard(Aus,i,4); WrStr(Aus,'  ');
+          FOR j:=m TO maxk DO
+            IF (Format = 3) AND (ABS(SV[ii+j-1]) < Schwelle) THEN
+              WrStr(Aus,NullStr);
+            ELSE
+              WrLngReal(Aus,SV[ii+j-1],(FeldBr+1),Komma);
+            END;
+          END;
+          WrLn(Aus);
+          INC(ii,i);
+        END; (* FOR i *)
+        INC(m,VekAnz);
+      UNTIL (k >= maxVek);
+      WrLn(Aus);
+END SVaus;
+
+PROCEDURE CSVaus(VAR Aus      : File;
+                     dim      : CARDINAL;    (* Dimension des SUPERVEKTOR *)
+                     maxVek   : CARDINAL;
+                 VAR CSV      : ARRAY OF LONGCOMPLEX;
+                     GesamtBr : CARDINAL;   (* Breite des Ausdrucks *)
+                     FeldBr   : CARDINAL;   (* Feldbreite einer Komponente *)
+                     Format   : CARDINAL);
+
+          VAR  VekAnz,m,k,j,i,ii,maxk,leer : CARDINAL;
+               Komma                       : INTEGER;
+               Max,Schwelle                : LONGREAL;
+               NullStr                     : ARRAY [0..34] OF CHAR;
+BEGIN
+      IF (NOT (Format IN {1,2,3})) THEN Format:=1; END;
+      Max:=0.0;
+      IF (Format = 2) THEN
+        FOR i:=0 TO dim*(dim+1)-1 DIV 2 DO
+          IF (ABS(RE(CSV[i])) > Max) THEN Max:=ABS(RE(CSV[i])); END;
+          IF (ABS(IM(CSV[i])) > Max) THEN Max:=ABS(IM(CSV[i])); END;
+        END;
+      END;
+      Formate(dim,Format,GesamtBr,FeldBr,Komma,leer,maxVek,Max,TRUE);
+      VekAnz:=(GesamtBr-8) DIV (2*(FeldBr+1));
+      Schwelle := MAX(LONGREAL); (* Wg. Compilerwarnung *)
+      IF (Format = 3) THEN
+        Null(NullStr,FeldBr,Komma);
+        Schwelle := 0.5 / CardPot(10.0,VAL(CARDINAL,Komma));
+      END;
+
+      m:=1;
+      REPEAT
+        k:=m+VekAnz-1; IF (k >= maxVek) THEN k:=maxVek; END;
+        WrLn(Aus); FOR i:=1 TO leer DO WrChar(Aus,' '); END;
+        FOR i:=m TO k-1 DO
+          WrCard(Aus,i,4); FOR j:=1 TO 2*FeldBr-2 DO WrChar(Aus,' '); END;
+        END;
+        WrCard(Aus,k,4); WrLnN(Aus,2);
+        ii:=m*(m-1) DIV 2;
+        FOR i:=m TO dim DO
+          maxk:=i; IF (maxk > k) THEN maxk:=k; END;
+          WrCard(Aus,i,4); WrStr(Aus,'  ');
+          FOR j:=m TO maxk DO
+            IF (Format = 3) AND (ABS(RE(CSV[ii+j-1])) < Schwelle) THEN
+              WrStr(Aus,NullStr);
+            ELSE
+              WrLngReal(Aus,RE(CSV[ii+j-1]),(FeldBr+1),Komma);
+            END;
+            IF (Format = 3) AND (ABS(IM(CSV[ii+j-1])) < Schwelle) THEN
+              WrStr(Aus,NullStr);
+            ELSE
+              WrLngReal(Aus,IM(CSV[ii+j-1]),(FeldBr+1),Komma);
+            END;
+          END; (* FOR j *)
+          WrLn(Aus);
+          INC(ii,i);
+        END; (* FOR i *)
+        INC(m,VekAnz);
+      UNTIL (k >= maxVek);
+      WrLn(Aus);
+END CSVaus;
+
+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);
+
+       VAR  VekAnz,m,k,j,i,leer,Interim : CARDINAL;
+            Komma,VKomma                : INTEGER;
+            Max,VMax,Schwelle           : LONGREAL;
+            VExp                        : BOOLEAN;
+            NullStr                     : ARRAY [0..31] OF CHAR;
+BEGIN
+      IF (HIGH(Mat)< M-1) OR (HIGH(Mat[0])< N-1) OR (HIGH(Vek) < M-1) THEN
+        Errors.Fehlerflag:="*** Dimensionierungsfehler (SMatEA.MATaus) ***";
+        Errors.ErrOut(Errors.Fehlerflag);
+        WrLn(Aus); WrStr(Aus,Errors.Fehlerflag); WrLnN(Aus,2);
+        RETURN;
+      END;
+
+      IF (NOT (Format IN {1,2,3})) THEN Format:=1; END;
+      IF (Format = 1) THEN
+        VExp:=TRUE; Max:=0.0;
+      ELSE
+        VMax:=ABS(Vek[0]); Max:=ABS(Mat[0,0]);
+        FOR i:=0 TO M-1 DO (* Bestimme Maxima von Vek,Mat *)
+          IF (ABS(Vek[i]) > VMax) THEN VMax:=ABS(Vek[i]); END;
+          FOR j:=0 TO N-1 DO
+            IF (ABS(Mat[i,j]) > Max) THEN Max:=ABS(Mat[i,j]); END;
+          END;
+        END;
+        VExp:=(VMax >= 100.0*Max); (* Exponentialdarstellung des Vektors ? *)
+        IF NOT VExp AND (VMax > Max) THEN Max:=VMax; END;
+        IF VExp AND (FeldBr < 8) THEN FeldBr:=8; Komma:=FeldBr - 3; END;
+      END;
+      Formate(N,Format,GesamtBr,FeldBr,Komma,leer,M,Max,FALSE);
+      VKomma:=Komma;
+      VekAnz:=(GesamtBr-8) DIV (FeldBr+1);
+      Interim:=FIO2.ExpAnz; (* Wg. Compilerwarnung aus IF herausgezogen *)
+      IF VExp AND (Format > 1) THEN
+        FIO2.ExpAnz:=2; VKomma:=-VAL(INTEGER,FeldBr-7);
+      END;
+      Schwelle := MAX(LONGREAL); (* Wg. Compilerwarnung *)
+      IF (Format = 3) THEN
+        Null(NullStr,FeldBr,Komma);
+        Schwelle := 0.5 / CardPot(10.0,VAL(CARDINAL,Komma));
+      END;
+
+      m:=1;
+      REPEAT
+        k:=m+VekAnz-1;
+        IF (k > M) THEN k:=M; END;
+        WrLn(Aus);
+        FOR i:=1 TO leer DO WrChar(Aus,' '); END;
+        FOR i:=m TO k-1 DO
+          WrCard(Aus,i,4);
+          FOR j:=1 TO FeldBr-3 DO WrChar(Aus,' '); END;
+        END;
+        WrCard(Aus,k,4); WrLnN(Aus,2);
+
+        FOR i:=1 TO 6 DO WrChar(Aus,' '); END;
+        FOR i:=m TO k DO WrLngReal(Aus,Vek[i-1],(FeldBr+1),VKomma); END;
+        WrLnN(Aus,2);
+
+        FOR i:=0 TO N-1 DO
+          WrCard(Aus,i+1,4); WrChar(Aus,' '); WrChar(Aus,' ');
+          FOR j:=m-1 TO k-1 DO
+            IF (Format = 3) AND (ABS(Mat[j,i]) < Schwelle) THEN
+              WrStr(Aus,NullStr);
+            ELSE
+              WrLngReal(Aus,Mat[j,i],(FeldBr+1),Komma);
+            END;
+          END;
+          WrLn(Aus);
+        END; (* FOR i *)
+
+        INC(m,VekAnz);
+      UNTIL (k >= M);
+      WrLn(Aus);
+      IF VExp AND (Format = 2) THEN FIO2.ExpAnz:=Interim; END;
+END MatVekAus;
+
+PROCEDURE PMatVekAus(VAR Aus      : File;
+                         M,N      : CARDINAL;
+                     VAR Vek      : ARRAY OF LONGREAL;
+                     VAR Mat      : PMATRIX;
+                         GesamtBr : CARDINAL;
+                         FeldBr   : CARDINAL;
+                         Format   : CARDINAL);
+
+       VAR  VekAnz,m,k,j,i,leer,Interim : CARDINAL;
+            Komma,VKomma                : INTEGER;
+            Max,VMax,Schwelle           : LONGREAL;
+            VExp                        : BOOLEAN;
+            NullStr                     : ARRAY [0..32] OF CHAR;
+BEGIN
+      IF (NOT (Format IN {1,2,3})) THEN Format:=1; END;
+      IF (Format = 1) THEN
+        VExp:=TRUE; Max:=0.0;
+      ELSE
+        VMax:=ABS(Vek[0]); Max:=ABS(Mat^[1]^[1]);
+        FOR i:=1 TO M DO (* Bestimme Maxima von CVek,CMat *)
+          IF (ABS(Vek[i-1]) > VMax) THEN VMax:=ABS(Vek[i-1]); END;
+          FOR j:=1 TO N DO
+            IF (ABS(Mat^[i]^[j]) > Max) THEN Max:=ABS(Mat^[i]^[j]); END;
+          END;
+        END;
+        VExp:=(VMax >= 100.0*Max); (* Exponentialdarstellung des Vektors ? *)
+        IF NOT VExp AND (VMax > Max) THEN Max:=VMax; END;
+        IF VExp AND (FeldBr < 8) THEN FeldBr:=8; Komma:=FeldBr - 3; END;
+      END;
+      Formate(N,Format,GesamtBr,FeldBr,Komma,leer,M,Max,FALSE);
+      VKomma:=Komma;
+      VekAnz:=(GesamtBr-8) DIV (FeldBr+1);
+      Interim:=FIO2.ExpAnz; (* Wg. Compilerwarnung aus IF herausgezogen *)
+      IF VExp AND (Format > 1) THEN
+        FIO2.ExpAnz:=2; VKomma:=-VAL(INTEGER,FeldBr-7);
+      END;
+      Schwelle := MAX(LONGREAL); (* Wg. Compilerwarnung *)
+      IF (Format = 3) THEN
+        Null(NullStr,FeldBr,Komma);
+        Schwelle := 0.5 / CardPot(10.0,VAL(CARDINAL,Komma));
+      END;
+
+      m:=1;
+      REPEAT
+        k:=m+VekAnz-1;
+        IF (k > M) THEN k:=M; END;
+        WrLn(Aus);
+        FOR i:=1 TO leer DO WrChar(Aus,' '); END;
+        FOR i:=m TO k-1 DO
+          WrCard(Aus,i,4);
+          FOR j:=1 TO FeldBr-3 DO WrChar(Aus,' '); END;
+        END;
+        WrCard(Aus,k,4); WrLnN(Aus,2);
+
+        FOR i:=1 TO 6 DO WrChar(Aus,' '); END;
+        FOR i:=m TO k DO WrLngReal(Aus,Vek[i-1],(FeldBr+1),VKomma); END;
+        WrLnN(Aus,2);
+
+        FOR i:=1 TO N DO
+          WrCard(Aus,i,4); WrChar(Aus,' '); WrChar(Aus,' ');
+          FOR j:=m TO k DO
+            IF (Format = 3) AND (ABS(Mat^[j]^[i]) < Schwelle) THEN
+              WrStr(Aus,NullStr);
+            ELSE
+              WrLngReal(Aus,Mat^[j]^[i],(FeldBr+1),Komma);
+            END;
+          END;
+          WrLn(Aus);
+        END; (* FOR i *)
+        INC(m,VekAnz);
+      UNTIL (k >= M);
+      WrLn(Aus);
+      IF VExp AND (Format = 2) THEN FIO2.ExpAnz:=Interim; END;
+END PMatVekAus;
+
+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);
+
+       VAR  VekAnz,m,k,j,i,leer,Interim : CARDINAL;
+            Komma,VKomma                : INTEGER;
+            Max,VMax,Schwelle           : LONGREAL;
+            VExp                        : BOOLEAN;
+            NullStr                     : ARRAY [0..34] OF CHAR;
+BEGIN
+      IF (NOT (Format IN {1,2,3})) THEN Format:=1; END;
+      IF (Format = 1) THEN
+        VExp:=TRUE; Max:=0.0;
+      ELSE
+        VMax:=0.0; Max:=0.0;
+        FOR i:=0 TO M-1 DO (* Bestimme Maxima von CVek,CMat *)
+          IF (ABS(RE(CVek[i])) > VMax) THEN VMax:=ABS(RE(CVek[i])); END;
+          IF (ABS(IM(CVek[i])) > VMax) THEN VMax:=ABS(IM(CVek[i])); END;
+          FOR j:=0 TO N-1 DO
+            IF (ABS(RE(CMat[i,j])) > Max) THEN Max:=ABS(RE(CMat[i,j])); END;
+            IF (ABS(IM(CMat[i,j])) > Max) THEN Max:=ABS(IM(CMat[i,j])); END;
+          END;
+        END;
+        VExp:=(VMax >= 100.0*Max); (* Exponentialdarstellung des Vektors ? *)
+        IF NOT VExp AND (VMax > Max) THEN Max:=VMax; END;
+        IF VExp AND (FeldBr < 8) THEN FeldBr:=8; Komma:=FeldBr - 3; END;
+      END;
+      Formate(N,Format,GesamtBr,FeldBr,Komma,leer,M,Max,TRUE);
+      VekAnz:=(GesamtBr-8) DIV (2*(FeldBr+1));
+      VKomma:=Komma;
+      Interim:=FIO2.ExpAnz; (* Wg. Compilerwarnung aus IF herausgezogen *)
+      IF VExp AND (Format > 1) THEN
+        FIO2.ExpAnz:=2; VKomma:=-VAL(INTEGER,FeldBr-7);
+      END;
+      Schwelle := MAX(LONGREAL); (* Wg. Compilerwarnung *)
+      IF (Format = 3) THEN
+        Null(NullStr,FeldBr,Komma);
+        Schwelle := 0.5 / CardPot(10.0,VAL(CARDINAL,Komma));
+      END;
+
+      m:=1;
+      REPEAT
+        k:=m+VekAnz-1;
+        IF (k > M) THEN k:=M; END;
+        WrLn(Aus);
+        FOR i:=1 TO leer DO WrChar(Aus,' '); END;
+        FOR i:=m TO k-1 DO
+          WrCard(Aus,i,4);
+          FOR j:=1 TO 2*FeldBr-2 DO WrChar(Aus,' '); END;
+        END;
+        WrCard(Aus,k,4); WrLnN(Aus,2);
+
+        FOR i:=1 TO 6 DO WrChar(Aus,' '); END;
+        FOR i:=m TO k DO
+          WrLngReal(Aus,RE(CVek[i-1]),(FeldBr+1),VKomma);
+          WrLngReal(Aus,IM(CVek[i-1]),(FeldBr+1),VKomma);
+        END;
+        WrLnN(Aus,2);
+
+        FOR i:=1 TO N DO
+          WrCard(Aus,i,4); WrChar(Aus,' '); WrChar(Aus,' ');
+          FOR j:=m TO k DO
+            IF (Format = 3) AND (ABS(RE(CMat[j-1,i-1])) < Schwelle) THEN
+              WrStr(Aus,NullStr);
+            ELSE
+              WrLngReal(Aus,RE(CMat[j-1,i-1]),(FeldBr+1),Komma);
+            END;
+            IF (Format = 3) AND (ABS(IM(CMat[j-1,i-1])) < Schwelle) THEN
+              WrStr(Aus,NullStr);
+            ELSE
+              WrLngReal(Aus,IM(CMat[j-1,i-1]),(FeldBr+1),Komma);
+            END;
+          END;
+          WrLn(Aus);
+        END; (* FOR i *)
+        INC(m,VekAnz);
+      UNTIL (k >= M);
+      WrLn(Aus);
+      IF VExp AND (Format = 2) THEN FIO2.ExpAnz:=Interim; END;
+END CMatVekAus;
+
+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);
+
+       CONST links = TRUE; (* Linksb"undiges Ausgabeformat f"ur Komm *)
+
+       VAR   VekAnz,m,k,j,i,MaxLen : CARDINAL;
+             Interim,leer,itmp     : CARDINAL;
+             Komma,VKomma          : INTEGER;
+             Max,VMax,Schwelle     : LONGREAL;
+             VExp                  : BOOLEAN;
+             NullStr               : ARRAY [0..34] OF CHAR;
+             LenK                  : POINTER TO
+                                     ARRAY [0..MAX(INTEGER)-1] OF CARDINAL;
+BEGIN
+      ALLOCATE(LenK,N*TSIZE(CARDINAL));
+      IF (NOT (Format IN {1,2,3})) THEN Format:=1; END;
+      LenK^[0]:=Length(Komm[0]); MaxLen:=LenK^[0];
+      FOR i:=1 TO N-1 DO
+        LenK^[i]:=Length(Komm[i-1]);
+        IF (LenK^[i] > MaxLen) THEN MaxLen:=LenK^[i]; END;
+      END;
+      IF (Format = 1) THEN
+        VExp:=TRUE; Max:=0.0;
+      ELSE
+        VMax:=ABS(Vek[0]); Max:=ABS(Mat[0,0]);
+        FOR i:=0 TO M-1 DO (* Bestimme Maxima von CVek,CMat *)
+          IF (ABS(Vek[i]) > VMax) THEN VMax:=ABS(Vek[i]); END;
+          FOR j:=0 TO N-1 DO
+            IF (ABS(Mat[i,j]) > Max) THEN Max:=ABS(Mat[i,j]); END;
+          END;
+        END;
+        VExp:=(VMax >= 100.0*Max); (* Exponentialdarstellung des Vektors ? *)
+        IF NOT VExp AND (VMax > Max) THEN Max:=VMax; END;
+        IF VExp AND (FeldBr < 8) THEN FeldBr:=8; Komma:=FeldBr - 3; END;
+      END;
+      Formate(N,Format,GesamtBr,FeldBr,Komma,leer,M,Max,TRUE);
+      VKomma:=Komma;
+      VekAnz:=(GesamtBr-MaxLen-8) DIV (FeldBr+1);
+      IF (VekAnz = 0) THEN
+        ErrOut('Zu lange Kommentare (MVKaus).');
+        MatVekAus(Aus,N,M,Vek,Mat,GesamtBr,FeldBr,Format);
+        RETURN;
+      END;
+      Interim:=FIO2.ExpAnz; (* Wg. Compilerwarnung aus IF herausgezogen *)
+      IF VExp AND (Format > 1) THEN
+        FIO2.ExpAnz:=2; VKomma:=-VAL(INTEGER,FeldBr-7);
+      END;
+      Schwelle := MAX(LONGREAL); (* Wg. Compilerwarnung *)
+      IF (Format = 3) THEN
+        Null(NullStr,FeldBr,Komma);
+        Schwelle := 0.5 / CardPot(10.0,VAL(CARDINAL,Komma));
+      END;
+
+      m:=1;
+      REPEAT
+        k:=m + VekAnz - 1;
+        IF (k > M) THEN k:=M; END;
+        WrLn(Aus);
+        FOR i:=1 TO leer + MaxLen + 2 DO WrChar(Aus,' '); END;
+        FOR i:=m TO k-1 DO
+          WrCard(Aus,i,4);
+          FOR j:=1 TO FeldBr-3 DO WrChar(Aus,' '); END;
+        END;
+        WrCard(Aus,k,4); WrLnN(Aus,2);
+
+        FOR i:=1 TO (8 + MaxLen) DO WrChar(Aus,' '); END;
+        FOR i:=m TO k DO WrLngReal(Aus,Vek[i-1],(FeldBr+1),VKomma); END;
+        WrLnN(Aus,2);
+
+        FOR i:=1 TO N DO
+          WrCard(Aus,i,4); WrChar(Aus,' '); WrChar(Aus,' ');
+          IF links THEN WrStr(Aus,Komm[i-1]); END;
+(*
+          FOR j:=1 TO (MaxLen - LenK^[i-1]) DO WrChar(Aus,' '); END;
+* [*** 0.00 F450]
+* compilation aborted: ASSERT(FALSE,55656) at line 856 of reg386.ob2
+ *)
+          itmp:=Length(Komm[i-1]);
+          FOR j:=1 TO (MaxLen - itmp) DO WrChar(Aus,' '); END;
+
+          IF NOT links THEN WrStr(Aus,Komm[i-1]); END;
+          WrChar(Aus,' '); WrChar(Aus,' ');
+          FOR j:=m TO k DO
+            IF (Format = 3) AND (ABS(Mat[j-1,i-1]) < Schwelle) THEN
+              WrStr(Aus,NullStr);
+            ELSE
+              WrLngReal(Aus,Mat[j-1,i-1],(FeldBr+1),Komma);
+            END;
+          END;
+          WrLn(Aus);
+        END; (* FOR i *)
+        INC(m,VekAnz);
+      UNTIL (k >= M);
+      WrLn(Aus);
+      IF VExp AND (Format = 2) THEN FIO2.ExpAnz:=Interim; END;
+      DEALLOCATE(LenK,N*TSIZE(CARDINAL));
+END MVKaus;
+
+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);
+
+          CONST MaxINT = MAX(INTEGER);
+                StrLen = 32;
+
+          VAR  m,k,i,j,ij,ii,maxk : CARDINAL;
+               VekAnz,leer,MaxLen : CARDINAL;
+               Komma              : INTEGER;
+               Max,Schwelle,SVij  : LONGREAL;
+               Len                : POINTER TO 
+                                    ARRAY [0..MaxINT-1] OF CARDINAL;
+               KommH              : POINTER TO ARRAY [0..MaxINT-1] OF 
+                                    POINTER TO ARRAY [0..StrLen-1] OF CHAR;
+               NullStr            : ARRAY [0..StrLen-1] OF CHAR;
+BEGIN
+      ALLOCATE(Len,N*TSIZE(CARDINAL));
+      ALLOCATE(KommH,N*TSIZE(ADDRESS));
+      FOR i:=0 TO N-1 DO
+        ALLOCATE(KommH^[i],StrLen*TSIZE(CHAR));
+      END;
+
+      Fehler:=FALSE;
+      IF (NOT (Format IN {1,2,3})) THEN Format:=1; END;
+      Len^[0]:=Length(Komm[0]); MaxLen:=Len^[0];
+      FOR i:=1 TO N-1 DO
+        Len^[i]:=Length(Komm[i-1]);
+        IF (Len^[i] > MaxLen) THEN MaxLen:=Len^[i]; END;
+      END;
+      IF (Format = 1) THEN
+        Max:=0.0;
+      ELSE
+        Max:=ABS(SV[1]); ij:=0;
+        FOR i:=1 TO N DO (* Bestimme Maxima von SV *)
+          FOR j:=1 TO i DO
+            IF (ABS(SV[ij]) > Max) THEN Max:=ABS(SV[ij]); END;
+            INC(ij);
+          END;
+        END;
+      END;
+      Formate(N,Format,GesamtBr,FeldBr,Komma,leer,M,Max,FALSE);
+
+      FOR i:=0 TO N-1 DO
+        Assign(Komm[i],KommH^[i]^);
+        RmMultBlnk(KommH^[i]^); (* Get rid of multiple blanks *)
+      END;
+      IF (MaxLen > FeldBr) THEN (* Schneide die Kommentare ab *)
+        FOR i:=0 TO N-1 DO
+          KommH^[i]^[FeldBr-1]:="~";
+          KommH^[i]^[FeldBr  ]:=0C;
+        END;
+      END;
+
+      (* Die 8 da fuer Index-Feld 4 Zeichen und je 2 Leerzeichen  *)
+      (* vor dem Index und hinter dem Kommentar ausgegeben werden *)
+
+      IF (GesamtBr < MaxLen+8) THEN
+        ErrOut('Breite der Ausgabe falsch gewaehlt (SVKaus)');
+        SVaus(Aus,N,N,SV,GesamtBr,FeldBr,Format);
+        RETURN;
+      END;
+      VekAnz:=(GesamtBr-MaxLen-8) DIV (FeldBr+1);
+      IF (VekAnz = 0) THEN
+        ErrOut('Zu lange Kommentare (SVKaus)');
+        SVaus(Aus,N,N,SV,GesamtBr,FeldBr,Format);
+        RETURN;
+      END;
+      IF (Format > 1) AND (Max < 1.0E+100) THEN
+        FIO2.ExpAnz:=2;
+      END;
+      Schwelle := MAX(LONGREAL); (* Wg. Compilerwarnung *)
+      IF (Format = 3) THEN
+        Null(NullStr,FeldBr,Komma);
+        Schwelle := 0.5 / CardPot(10.0,VAL(CARDINAL,Komma));
+      END;
+
+      m:=1;
+      REPEAT
+        k:=m + VekAnz - 1; IF (k > M) THEN k:=M; END;
+        WrLn(Aus);
+        FOR i:=1 TO leer + MaxLen + 2 DO WrChar(Aus,' '); END;
+        FOR i:=m TO k-1 DO
+          WrCard(Aus,i,4);
+          FOR j:=1 TO FeldBr-3 DO WrChar(Aus,' '); END;
+        END;
+        WrCard(Aus,k,4); WrLnN(Aus,2);
+
+        FOR i:=1 TO leer + MaxLen + 1 DO WrChar(Aus,' '); END;
+        FOR i:=m TO k DO
+          WrChar(Aus,' ');
+          IF (i < k) THEN
+            WrStrForm(Aus,KommH^[i-1]^,-VAL(INTEGER,FeldBr));
+          ELSE
+            WrStr(Aus,KommH^[i-1]^);
+          END;
+        END;
+        WrLnN(Aus,2);
+
+        IF quad THEN
+          FOR i:=1 TO N DO
+            WrCard(Aus,i,4); WrCharN(Aus,' ',2);
+            WrStrForm(Aus,Komm[i-1],-VAL(INTEGER,MaxLen));
+            WrCharN(Aus,' ',2);
+            FOR j:=m TO k DO
+              SVij := SV[IJtab(i,j)-1];
+              IF (Format = 3) AND (ABS(SVij) < Schwelle) THEN
+                WrStr(Aus,NullStr);
+              ELSE
+                WrLngReal(Aus,SVij,(FeldBr+1),Komma);
+              END;
+            END;
+            WrLn(Aus);
+          END; (* FOR i *)
+        ELSE
+          ii:=m*(m-1) DIV 2;
+          FOR i:=m TO N DO
+            WrCard(Aus,i,4); WrCharN(Aus,' ',2);
+            WrStrForm(Aus,Komm[i-1],-VAL(INTEGER,MaxLen));
+            WrCharN(Aus,' ',2);
+            maxk:=i; IF (maxk > k) THEN maxk:=k; END;
+            FOR j:=m TO maxk DO
+              IF (Format = 3) AND (ABS(SV[ii+j-1]) < Schwelle) THEN
+                WrStr(Aus,NullStr);
+              ELSE
+                WrLngReal(Aus,SV[ii+j-1],(FeldBr+1),Komma);
+              END;
+            END;
+            WrLn(Aus);
+            INC(ii,i);
+          END; (* FOR i *)
+        END; 
+        INC(m,VekAnz);
+        IF (k < N) THEN WrLn(Aus); END;
+      UNTIL (k >= M);
+      WrLn(Aus);
+      FOR i:=0 TO N-1 DO
+        DEALLOCATE(KommH^[i],StrLen*TSIZE(CHAR));
+      END;
+      DEALLOCATE(KommH,N*TSIZE(ADDRESS));
+      DEALLOCATE(Len,N*TSIZE(CARDINAL));
+END SVKaus;
+
+BEGIN
+      MZeil:=0; CMZeil:=0;
+      SZeil:=0; CSZeil:=0;
+END FMatEA.