DEFINITION MODULE PMatLib;

  (*------------------------------------------------------------------------*)
  (* Einige Matrix-Operationen f"ur den Datentyp PMATRIX                    *)
  (* Some matrix operations for data typ Deklera.PMATRIX                    *)
  (*------------------------------------------------------------------------*)
  (* Implementation : Michael Riedl                                         *)
  (* Licence        : GNU Lesser General Public License (LGPL)              *)
  (*------------------------------------------------------------------------*)

  (* $Id: PMatLib.def,v 1.1 2015/09/15 07:05:52 mriedl Exp $ *)

FROM Deklera  IMPORT PMATRIX;

PROCEDURE NormVek2(VAR X           : ARRAY OF LONGREAL;
                       IStart,IEnd : CARDINAL;
                       MaxNorm     : BOOLEAN);

          (*---------------------------------------------------------------*)
          (* Normiert den Vektor X im Bereich X[IStart] bis X[IEnd].       *)
          (* Wenn MaxNorm = TRUE so, da3 das Maximale Element die Gr"o3e   *)
          (* 1 hat, ansonsten nach der Euklidschen Norm auf 1              *)
          (*---------------------------------------------------------------*)

PROCEDURE PMatVek(VAR A      : PMATRIX;
                      m,n    : CARDINAL; (* Dimension der Matrix A *)
                      Alpha  : LONGREAL;
                  VAR X      : ARRAY OF LONGREAL;
                      Beta   : LONGREAL;
                  VAR Y      : ARRAY OF LONGREAL;
                      TransA : CHAR);

          (*---------------------------------------------------------------*)
          (* Berechnet  Y = Alpha * opt(A) X + Beta Y, wobei               *)
          (*   opt(A) = A  f"ur CAP(TransA) = N                            *)
          (*   opt(A) = A' f"ur CAP(TransA) = T                            *)
          (*                                                               *)
          (* Diese Routine ist eine Adaption von BLAS dgemv                *)
          (*---------------------------------------------------------------*)

PROCEDURE PMatMult(VAR C      : PMATRIX;
                   VAR A      : PMATRIX;
                   VAR B      : PMATRIX;
                       ma,na  : CARDINAL;
                       mb,nb  : CARDINAL;
                       Alpha  : LONGREAL;
                       Beta   : LONGREAL;
                       TransA : CHAR;
                       TransB : CHAR);

          (*---------------------------------------------------------------*)
          (* Berechnet die Matrixmultiplikation                            *)
          (* C = Alpha (op(A) op(B)) + Beta C                              *)
          (*                                                               *)
          (* op(X) ist X fuer CAP(TransX) # "T", op(X) = X^+ sonst.        *)
          (* Sowohl die Matrix A als auch B k"onnen mit C identisch        *)
          (* sein, da diese erst im letzten Berechnungsschritt "uber-      *)
          (* schrieben wird.                                               *)
          (* A hat die Dimension A[1..ma][1..na].                          *) 
          (* B hat die Dimension B[1..mb][1..nb].                          *)
          (* Wird eine Transpornierte bei der Berechnung gew"unscht, so    *)
          (* werden trotztdem die Dimensionen der untranspornierten Matrix *)
          (* angegeben.                                                    *)
          (* Die Dimension von C h"angt von der gew"unschten Berechnung    *)
          (* ab, die geforderten Bedingungen gehen aus der folgenden       *)
          (* Tabelle hervor.                                               *)
          (*                                                               *)
          (* C[1..ma][1..nb] fuer C = Alpha (A   B  ) + Beta C mit (na=mb) *)
          (* C[1..na][1..nb] fuer C = Alpha (A^+ B  ) + Beta C mit (ma=mb) *)
          (* C[1..ma][1..mb] fuer C = Alpha (A   B^+) + Beta C mit (na=nb) *)
          (* C[1..na][1..mb] fuer C = Alpha (A^+ B^+) + Beta C mit (ma=nb) *)
          (*                                                               *)
          (* Diese Routine ist eine Adaption von BLAS dgemm                *)
          (*---------------------------------------------------------------*) 

PROCEDURE MinMaxNorm(VAR X : ARRAY OF LONGREAL;
                         n : CARDINAL);         (* Anzahl der Datenpunkte *)

          (*---------------------------------------------------------------*) 
          (* Normiert den Vektor X, so da3 MIN(X) = 0 und MAX(X) = 1       *)
          (*---------------------------------------------------------------*) 

PROCEDURE dger(    m,n   : CARDINAL;
                   Alpha : LONGREAL;
               VAR X     : ARRAY OF LONGREAL;
                   IncX  : CARDINAL;
               VAR Y     : ARRAY OF LONGREAL;
                   IncY  : CARDINAL;
               VAR A     : PMATRIX);

           (*--------------------------------------------------------------*)
           (*  DGER   performs the rank 1 operation                        *)
           (*                                                              *)
           (*     A := Alpha*(x;y) + A,                                    *)
           (*                                                              *)
           (*  where Alpha is a scalar, x is an m element vector, y is     *)
           (*  an n element vector and A is an m by n matrix.              *)
           (*  (x;y) denotes a dyadic product of the vectors x and y.      *)
           (*                                                              *)
           (*  -- Written on 22-October-1986.                              *)
           (*     Jack Dongarra, Argonne National Lab.                     *)
           (*     Jeremy Du Croz, Nag Central Office.                      *)
           (*     Sven Hammarling, Nag Central Office.                     *)
           (*     Richard Hanson, Sandia National Labs.                    *)
           (*                                                              *)
           (*  Anpassung an Modula-2 : M. Riedl, Aug. 1996.                *)
           (*                                                              *)
           (*  PARAMETER                                                   *)
           (*  =========                                                   *)
           (*                                                              *)
           (*  X    : Array of dimension at least (1 + ( m - 1 )* IncX) .  *)
           (*         Before entry, the incremented array X must contain   *)
           (*         the m element vector x.                              *)
           (*         Unchanged on exit.                                   *)
           (*  IncX : On entry, IncX specifies the increment for the       *)
           (*         elements of X.                                       *)
           (*  Y    : Array of dimension at least ( 1 + ( n - 1 )* IncY ). *)
           (*         Before entry, the incremented array Y must contain   *)
           (*         the n element vector y.                              *)
           (*         Unchanged on exit.                                   *)
           (*  IncY : On entry, IncY specifies the increment for the       *)
           (*         elements of Y.                                       *)
           (*  A    : Array of DIMENSION ( m, n ).                         *)
           (*         Before entry, the leading m by n part of the array A *)
           (*         must contain the matrix of coefficients. On exit, A  *)
           (*         is overwritten by the updated matrix.                *)
           (*                                                              *)
           (*--------------------------------------------------------------*)

END PMatLib.
