|
|
|
|
||
|
DEFINITION MODULE LgMatrices; (******************************************************************* Module LgMatrices (Version 1.0) Copyright (c) 1995-2006 by Dimitrios Gyalistras and ETH Zurich. Purpose Handling of double precision matrices and vectors (large matrices, more than 4k x 4k elements). Remarks See also modules LgMatIO, LgMatCalc, LgMatInv. Programming o Design Dimitrios Gyalistras 12/05/1995 o Implementation Dimitrios Gyalistras 12/05/1995 ETH Zurich Systems Ecology CHN E 35.1 Universitaetstrasse 16 8092 Zurich SWITZERLAND URLs: <mailto:RAMSES@env.ethz.ch> <http://www.sysecol.ethz.ch> <http://www.sysecol.ethz.ch/SimSoftware/RAMSES> Last revision of definition: 04/04/2005 AF *******************************************************************) FROM SYSTEM IMPORT ADDRESS; IMPORT Errors; (**************************************) (*##### General declarations #####*) (**************************************) CONST (* result codes returned *) allOk = Errors.allOk; notDone = Errors.onlyAnInsert; (* IF VERSION_MacMETH *) CONST MaxElems = 4*1024-1; (* ENDIF VERSION_MacMETH *) (* IF VERSION_EPC *) (*. CONST MaxElems = 8*512*1024; (* = 8*524'288 = 4'194'304 *) .*) (* ENDIF VERSION_EPC *) (* IF VERSION_STONYBROOK *) (*. CONST MaxElems = 8*1024-1; .*) (* ENDIF VERSION_STONYBROOK *) (* IF VERSION_P1 *) (*. CONST MaxElems = 8*512*1024; (* = 8*524'288 = 4'194'304 *) .*) (* ENDIF VERSION_P1 *) TYPE LVec = ARRAY [1..MaxElems] OF LONGREAL; LVector = POINTER TO LVec; LMat = ARRAY [1..MaxElems] OF LVector; LMatrix = POINTER TO LMat; MatrixType = LONGINT; MatrixCode = LONGINT; MatrixAttribute = ADDRESS; VAR (* read only *) notAllocatedLVector : LVector; notAllocatedLMatrix : LMatrix; undefMatrixType : MatrixType; anyMatrixType : MatrixType; undefMatrixCode : MatrixCode; anyMatrixCode : MatrixCode; undefMatrixAttribute : MatrixAttribute; (************************************) (*##### Objects management #####*) (************************************) PROCEDURE AllocMatrix( VAR mat : LMatrix; nRows : INTEGER; (* actually allocated *) nCols : INTEGER; (* actually allocated *) initVal : LONGREAL; (* value to use for initialization *) VAR resCode : INTEGER; VAR errTxt : ARRAY OF CHAR ); (* The (i,j)-th element is dereferenced as mat^[i]^[j] IMPORTANT NOTE: To warrant successful completion of this routine under all circumstances, it is recommended to initialize mat with value notAllocatedLMatrix prior to calling AllocMatric. *) PROCEDURE MatrixExists( mat: LMatrix ): BOOLEAN; PROCEDURE DeallocMatrix( VAR mat: LMatrix ); PROCEDURE AllocVector( VAR vec : LVector; nElems : INTEGER; (* actually allocated *) initVal : LONGREAL; (* value to use for initialization *) VAR resCode : INTEGER; VAR errTxt : ARRAY OF CHAR ); (* The i-the element is dereferenced as vec^[i] IMPORTANT NOTE: To warrant successful completion of this routine under all circumstances, it is recommended to initialize vec with value notAllocatedLVector prior to calling AllocVector. *) PROCEDURE VectorExists( vec: LVector ): BOOLEAN; PROCEDURE DeallocVector( VAR vec: LVector ); (* IMPLEMENTATION RESCTRICTION: operates only correctly on inidividual vectors, not on rows of matrices! For efficiency reasons, no testing of this precondition is done. *) (**************************************) (*##### Dimensions retrieval #####*) (**************************************) PROCEDURE NRows( mat: LMatrix ): INTEGER; (* Returns number of allocated rows *) PROCEDURE NCols( mat: LMatrix ): INTEGER; (* Returns number of allocated columns *) PROCEDURE NElems( vec: LVector ): INTEGER; (* Returns number of allocated elements *) (*************************************) (*##### Checking of objects #####*) (*************************************) PROCEDURE GetQuotedMatDescr( mat : LMatrix; genericDescr : ARRAY OF CHAR; (* used if mat has no descriptor attached to it *) VAR quotedDescr : ARRAY OF CHAR ); PROCEDURE MatrixOK( mat : LMatrix; genericDescr : ARRAY OF CHAR; callee : ARRAY OF CHAR; minRows : INTEGER; minCols : INTEGER; VAR errTxt : ARRAY OF CHAR ): BOOLEAN; PROCEDURE MatTypeOK( mat : LMatrix; genericDescr : ARRAY OF CHAR; callee : ARRAY OF CHAR; expectedType : MatrixType; VAR errTxt : ARRAY OF CHAR ): BOOLEAN; PROCEDURE MatCodeOK( mat : LMatrix; genericDescr : ARRAY OF CHAR; callee : ARRAY OF CHAR; expectedCode : MatrixCode; VAR errTxt : ARRAY OF CHAR ): BOOLEAN; PROCEDURE GetQuotedVecDescr( vec : LVector; genericDescr : ARRAY OF CHAR; (* used if vec has no descriptor attached to it *) VAR quotedDescr : ARRAY OF CHAR ); PROCEDURE VectorOK( vec : LVector; genericDescr : ARRAY OF CHAR; callee : ARRAY OF CHAR; minElems : INTEGER; VAR errTxt : ARRAY OF CHAR ): BOOLEAN; (***********************************) (*##### Matrix attributes #####*) (***********************************) PROCEDURE SetMatrixDescr( mat : LMatrix; descr : ARRAY OF CHAR ); PROCEDURE GetMatrixDescr( mat : LMatrix; VAR descr : ARRAY OF CHAR ); PROCEDURE SetMatrixType( mat : LMatrix; type : MatrixType ); PROCEDURE MatType( mat: LMatrix ): MatrixType; PROCEDURE SetMatrixCode( mat : LMatrix; code : MatrixCode ); PROCEDURE MatCode( mat: LMatrix ): MatrixCode; PROCEDURE SetColIds( mat : LMatrix; VAR ids : ARRAY OF CHAR ); (* VAR for speed-up only *) PROCEDURE GetColIds( mat : LMatrix; VAR ids : ARRAY OF CHAR ); PROCEDURE SetRowIds( mat : LMatrix; VAR ids : ARRAY OF CHAR ); (* VAR for speed-up only *) PROCEDURE GetRowIds( mat : LMatrix; VAR ids : ARRAY OF CHAR ); PROCEDURE SetMatrixAttr( mat : LMatrix; attr : MatrixAttribute ); PROCEDURE MatrixAttr( mat: LMatrix ): MatrixAttribute; PROCEDURE CopyAllMatrixAttributes( from, to: LMatrix ); (*********************************************) (*##### Manipulation of object data #####*) (*********************************************) PROCEDURE SetMatrix( mat : LMatrix; val : LONGREAL ); PROCEDURE SetMatrixCol( mat : LMatrix; colNr : INTEGER; colData : LVector ); PROCEDURE GetMatrixCol( mat : LMatrix; colNr : INTEGER; colData : LVector ); PROCEDURE SetMatrixRow( mat : LMatrix; rowNr : INTEGER; rowData : LVector ); PROCEDURE GetMatrixRow( mat : LMatrix; rowNr : INTEGER; rowData : LVector ); PROCEDURE SetMatCol( mat : LMatrix; colNr : INTEGER; nElems : INTEGER; VAR colData : ARRAY OF LONGREAL ); (* VAR for speed-up only *) PROCEDURE GetMatCol( mat : LMatrix; colNr : INTEGER; VAR nElems : INTEGER; VAR colData : ARRAY OF LONGREAL ); PROCEDURE SetMatRow( mat : LMatrix; rowNr : INTEGER; nElems : INTEGER; VAR rowData : ARRAY OF LONGREAL ); (* VAR for speed-up only *) PROCEDURE GetMatRow( mat : LMatrix; rowNr : INTEGER; VAR nElems : INTEGER; VAR rowData : ARRAY OF LONGREAL ); PROCEDURE CopyMatrix( mat : LMatrix; res : LMatrix ); PROCEDURE Transpose( mat : LMatrix; res : LMatrix ); PROCEDURE SetVector( vec : LVector; val : LONGREAL ); PROCEDURE CopyVector( vec : LVector; res : LVector ); END LgMatrices.
|
||
|
|
|