Switch to unified view

a/MatLib.mod.m2pp b/MatLib.mod.m2pp
...
...
65
  (* 07.12.17, MRi: Einfuegen von StuerzMN,NeumaierSum & NeumaierProdSum    *)
65
  (* 07.12.17, MRi: Einfuegen von StuerzMN,NeumaierSum & NeumaierProdSum    *)
66
  (*                aus Testumgebung                                        *)
66
  (*                aus Testumgebung                                        *)
67
  (* 30.05.18, MRi: Einfuegen von TriInfNorm                                *)
67
  (* 30.05.18, MRi: Einfuegen von TriInfNorm                                *)
68
  (* 10.06.18, MRi: ZufallMat um den nicht-quadratischen Fall ergaenzt      *)
68
  (* 10.06.18, MRi: ZufallMat um den nicht-quadratischen Fall ergaenzt      *)
69
  (* 12.09.18, MRi: CMatVekProd erweitert und an MatVekProd angepasst       *)
69
  (* 12.09.18, MRi: CMatVekProd erweitert und an MatVekProd angepasst       *)
70
  (* 21.09.18, MRi: CStuerzMN eingefuegt                                    *)
71
  (* 28.09.18, MRi: MatNormL1 auf "Rechtecksfall" erweitert                 *)
72
  (* 29.09.18, MRi: In StuerzMN & CStuerzMN das Nullsetzen der Restmatrix   *)
73
  (*                ueberarbeitet, in CStuerzMN den Parameter IfConj        *)
74
  (*                eingefuegt                                              *)
70
  (*------------------------------------------------------------------------*)
75
  (*------------------------------------------------------------------------*)
71
  (* Offene Punkte                                                          *)
76
  (* Offene Punkte                                                          *)
72
  (*                                                                        *)
77
  (*                                                                        *)
73
  (* - Nachsehen ob InitMat nicht "gelitten" hat                            *)
78
  (* - Nachsehen ob InitMat nicht "gelitten" hat                            *)
74
  (* - Komplexe Typen auf ISO M2 umstellen                                  *)
79
  (* - Komplexe Typen auf ISO M2 umstellen                                  *)
...
...
90
  (*------------------------------------------------------------------------*)
95
  (*------------------------------------------------------------------------*)
91
  (* Implementation : Michael Riedl                                         *)
96
  (* Implementation : Michael Riedl                                         *)
92
  (* Licence        : GNU Lesser General Public License (LGPL)              *)
97
  (* Licence        : GNU Lesser General Public License (LGPL)              *)
93
  (*------------------------------------------------------------------------*)
98
  (*------------------------------------------------------------------------*)
94
99
95
  (* $Id: MatLib.mod.m2pp,v 1.16 2018/06/09 13:29:13 mriedl Exp mriedl $ *)
100
  (* $Id: MatLib.mod.m2pp,v 1.17 2019/02/01 22:24:03 mriedl Exp mriedl $ *)
96
101
97
FROM SYSTEM    IMPORT TSIZE,ADR;
102
FROM SYSTEM    IMPORT TSIZE,ADR;
98
FROM Storage   IMPORT ALLOCATE,DEALLOCATE;
103
FROM Storage   IMPORT ALLOCATE,DEALLOCATE;
99
FROM Deklera   IMPORT VEKTOR,MATRIX,SUPERVEKTOR,PMATRIX,MaxDim,
104
FROM Deklera   IMPORT VEKTOR,MATRIX,SUPERVEKTOR,PMATRIX,MaxDim,
100
                      CVEKTOR,CMATRIX;
105
                      CVEKTOR,CMATRIX;
101
FROM Errors    IMPORT Fehlerflag,Fehler;
106
FROM Errors    IMPORT Fehlerflag,Fehler;
102
               IMPORT Errors;
107
               IMPORT Errors;
103
FROM LongMath  IMPORT sqrt;
108
FROM LongMath  IMPORT sqrt;
104
               IMPORT LongComplexMath;
109
               IMPORT LongComplexMath;
110
FROM LMathLib  IMPORT MaxCard;
105
FROM RandomLib IMPORT Zufall;
111
FROM RandomLib IMPORT Zufall;
106
FROM LibDBlas  IMPORT idamax,dscal;
112
FROM LibDBlas  IMPORT idamax,dscal;
107
               IMPORT LibDBlasM2;
113
               IMPORT LibDBlasM2;
108
FROM DynMat    IMPORT AllocMat,DeAllocMat;
114
FROM DynMat    IMPORT AllocMat,DeAllocMat;
109
115
...
...
524
END Stuerz;
530
END Stuerz;
525
531
526
PROCEDURE StuerzMN(VAR A   : ARRAY OF ARRAY OF LONGREAL;
532
PROCEDURE StuerzMN(VAR A   : ARRAY OF ARRAY OF LONGREAL;
527
                       M,N : CARDINAL);
533
                       M,N : CARDINAL);
528
534
529
          VAR i,j : CARDINAL;
535
          VAR i,j,mn : CARDINAL;
530
              T   : PMATRIX;
536
              T      : PMATRIX;
531
BEGIN
537
BEGIN
538
      IF (M = N) THEN
539
        Stuerz(A,N);
540
      ELSE
541
        mn := MaxCard(M,N);
532
      IF (HIGH(A) < N) OR (HIGH(A[0]) < M) THEN
542
        IF (HIGH(A) < mn) OR (HIGH(A[0]) < mn) THEN
533
        Errors.FatalError("Matrix A falsch dimensioniert (MatLib.StuerzMN)");
543
          Errors.FatalError("Matrix A falsch dimensioniert (MatLib.StuerzMN)");
534
      END;
544
        END;
535
      AllocMat(T,M,N);
545
        AllocMat(T,M,N);
536
      IF (T = NIL) THEN
546
        IF (T = NIL) THEN
537
        Errors.FatalError("Kein Freispeicher vorhanden (MatLib.StuerzMN)");
547
          Errors.FatalError("Kein Freispeicher vorhanden (MatLib.StuerzMN)");
538
      END;
548
        END;
549
539
      FOR i:=0 TO M-1 DO
550
        FOR i:=0 TO M-1 DO
540
        FOR j:=0 TO N-1 DO T^[i+1]^[j+1]:=A[i,j]; END;
551
          FOR j:=0 TO N-1 DO T^[i+1]^[j+1]:=A[i,j]; END;
541
      END;
552
        END;
542
      FOR i:=N TO HIGH(A) DO
553
543
        FOR j:=M TO HIGH(A[0]) DO
554
        IF (1 = 1) THEN (* This code is not really necessary *)
544
          A[i,j]:=0.0;
555
          (* Initialisiere den Rest der (quadratischen) Matrix mit 0 *)
556
          IF (N < M) THEN
557
            FOR i:=N TO M-1 DO
558
              FOR j:=0 TO M-1 DO A[i,j]:=0.0; END;
545
        END;
559
            END;
560
          ELSE
561
            FOR i:=0 TO N-1 DO
562
              FOR j:=M TO N-1 DO A[j,i]:=0.0; END;
546
      END;
563
            END;
564
          END; (* IF M > N *)
565
        END; (* IF *)
566
547
      FOR i:=0 TO M-1 DO
567
        FOR i:=0 TO M-1 DO
548
        FOR j:=0 TO N-1 DO A[j,i]:=T^[i+1]^[j+1]; END;
568
          FOR j:=0 TO N-1 DO
569
            A[j,i]:=T^[i+1]^[j+1];
570
          END;
549
      END;
571
        END;
572
550
      DeAllocMat(T,M,N);
573
        DeAllocMat(T,M,N);
574
      END;
551
END StuerzMN;
575
END StuerzMN;
576
577
PROCEDURE CStuerzMN(VAR A      : ARRAY OF ARRAY OF LONGCOMPLEX;
578
                        M,N    : CARDINAL;
579
                        IfConj : BOOLEAN);
580
581
          VAR i,j,mn  : CARDINAL;
582
              Tre,Tim : PMATRIX;
583
BEGIN
584
      IF (M = N) THEN
585
        CStuerz(A,N,IfConj);
586
      ELSE
587
        mn := MaxCard(M,N);
588
        IF (HIGH(A) < mn) OR (HIGH(A[0]) < mn) THEN
589
          Errors.FatalError("Matrix A falsch dimensioniert (MatLib.StuerzMN)");
590
        END;
591
        AllocMat(Tre,M,N);
592
        AllocMat(Tim,M,N);
593
        IF (Tre = NIL) OR (Tim = NIL) THEN
594
          Errors.FatalError("Kein Freispeicher vorhanden (MatLib.CStuerzMN)");
595
        END;
596
        FOR i:=0 TO M-1 DO
597
          FOR j:=0 TO N-1 DO 
598
            Tre^[i+1]^[j+1] := RE(A[i,j]); 
599
            Tim^[i+1]^[j+1] := IM(A[i,j]); 
600
          END;
601
        END;
602
        
603
        IF (1 = 1) THEN (* This code is not really necessary *)
604
          (* Initialisiere den Rest der (quadratischen) Matrix mit 0 *)
605
          IF (N < M) THEN
606
            FOR i:=N TO M-1 DO
607
              FOR j:=0 TO M-1 DO A[i,j]:=zero; END;
608
            END;
609
          ELSE
610
            FOR i:=0 TO N-1 DO
611
              FOR j:=M TO N-1 DO A[i,j]:=zero; END;
612
            END;
613
          END; (* IF M > N *)
614
        END; (* IF *)
615
        FOR i:=0 TO M-1 DO
616
          IF IfConj THEN
617
            FOR j:=0 TO N-1 DO
618
              A[j,i]:=CMPLX(Tre^[i+1]^[j+1], - Tim^[i+1]^[j+1]); 
619
            END;
620
          ELSE
621
            FOR j:=0 TO N-1 DO
622
              A[j,i]:=CMPLX(Tre^[i+1]^[j+1],   Tim^[i+1]^[j+1]); 
623
            END;
624
          END; (* IF *)
625
        END;
626
        DeAllocMat(Tre,M,N);
627
        DeAllocMat(Tim,M,N);
628
      END;
629
END CStuerzMN;
552
630
553
PROCEDURE Transpose(VAR A : ARRAY OF ARRAY OF LONGREAL;
631
PROCEDURE Transpose(VAR A : ARRAY OF ARRAY OF LONGREAL;
554
                        n : CARDINAL);
632
                        n : CARDINAL);
555
633
556
          (*----------------------------------------------------------------*)
634
          (*----------------------------------------------------------------*)
...
...
1598
      END;
1676
      END;
1599
      RETURN norm;
1677
      RETURN norm;
1600
END TriInfNorm;
1678
END TriInfNorm;
1601
1679
1602
PROCEDURE MatNormL1(VAR A    : ARRAY OF ARRAY OF LONGREAL;
1680
PROCEDURE MatNormL1(VAR A    : ARRAY OF ARRAY OF LONGREAL;
1603
                        N    : INTEGER;
1681
                        M,N  : CARDINAL;
1604
                    VAR Norm : LONGREAL);
1682
                    VAR Norm : LONGREAL);
1605
1683
1606
          VAR i,j : INTEGER;
1684
          VAR i,j : CARDINAL;
1607
              Sum : LONGREAL;
1685
              Sum : LONGREAL;
1608
BEGIN
1686
BEGIN
1609
      Norm:=0.0;
1687
      Norm:=0.0;
1610
      FOR i:=0 TO N-1 DO
1688
      FOR i:=0 TO M-1 DO
1611
        Sum:=0.0;
1689
        Sum:=0.0;
1612
        FOR j:=0 TO N-1 DO Sum:=Sum + ABS(A[i,j]); END;
1690
        FOR j:=0 TO N-1 DO Sum:=Sum + ABS(A[i,j]); END;
1613
        IF (Sum > Norm) THEN Norm:=Sum; END;
1691
        IF (Sum > Norm) THEN Norm:=Sum; END;
1614
      END;
1692
      END;
1615
END MatNormL1;
1693
END MatNormL1;