DEFINITION MODULE GridDataSets;
(*******************************************************************
Module GridDataSets (Version 1.0)
Copyright (c) 1997-2006 by Dimitrios Gyalistras and ETH Zurich.
Purpose Manage gridded data sets and their attributes,
get or set gridpoint data.
Remarks For input/output of gridded data sets see
module GridDSIO.
For auxiliary procedures and operations on
gridded data sets see module GridDSOp.
Programming
o Design
Dimitrios Gyalistras 23/05/1997
o Implementation
Dimitrios Gyalistras 23/05/1997
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: 05/06/2002 AF
*******************************************************************)
FROM SYSTEM IMPORT BYTE;
FROM DMFiles IMPORT TextFile;
IMPORT Errors;
CONST
notDone = Errors.onlyAnInsert;
(*
All procedures exported below return errCode = Errors.allOk if the
call to the procedure was succesfull, and resCode = notDone if not.
*)
TYPE
GridDataSet;
DataMatrix;
TYPE
GridDataSetChange = (gdsDefined, gdsReplaced, gdsRemoved);
AtGridDataSetChangeP = PROCEDURE( GridDataSetChange, (* type of change *)
GridDataSet ); (* the data set affected *)
VAR
undefGridDataSet : GridDataSet; (* read only *)
undefDataMatrix : DataMatrix; (* read only *)
(*************************************************************)
(*##### Definition and removal of gridded data sets #####*)
(*************************************************************)
PROCEDURE InstallAtGridDataSetChangedHandler( gch: AtGridDataSetChangeP );
(*
This procedure allows to install a handler "gch" which is called
each time a change in the GridDataSets occurs.
*)
PROCEDURE DefineGridDataSet( VAR gds : GridDataSet;
dataID : LONGINT; (* identifier of data *)
dataDescr : ARRAY OF CHAR; (* description of data *)
sectorID : LONGINT; (* identifier of sector *)
sectorDescr : ARRAY OF CHAR; (* description of sector *)
nRows : INTEGER; (* Number of points in y-direction *)
nCols : INTEGER; (* Number of points in x-direction *)
inDegrees : BOOLEAN; (* Specify as TRUE if minLon/minLat/cellSize
are degrees.
Specify as FALSE if the meta-information
refers to an arbitrary X/Y coordinate system. *)
minLon : REAL; (* longitude of lower left corner *)
minLat : REAL; (* latitude of lower left corner *)
cellSize : REAL; (* cell size *)
nDataMats : INTEGER; (* number of data matrices *)
VAR resCode : INTEGER;
VAR errTxt : ARRAY OF CHAR );
(*
Defines a new gridded data set. If data set "gds"
already exists, it is redefined.
*)
PROCEDURE RemoveGridDataSet( VAR gds: GridDataSet );
PROCEDURE RemoveAllGridDataSets;
(*********************************************************************)
(*##### Retrieval of gridded data sets and their attributes #####*)
(*********************************************************************)
PROCEDURE NGridDataSets():INTEGER;
(* IF VERSION_STONYBROOK *) (*.
PROCEDURE GetGridDataSets( VAR gds : ARRAY OF BYTE;
VAR nGridDataSets : INTEGER);
.*) (* ENDIF VERSION_STONYBROOK *)
(* IF VERSION_MacMETH *)
PROCEDURE GetGridDataSets( VAR gds : ARRAY OF GridDataSet;
VAR nGridDataSets : INTEGER);
(* ENDIF VERSION_MacMETH *)
(* IF VERSION_EPC *) (*.
PROCEDURE GetGridDataSets( VAR gds : ARRAY OF GridDataSet;
VAR nGridDataSets : INTEGER);
.*) (* ENDIF VERSION_EPC *)
PROCEDURE GridDataSetExists( gds: GridDataSet ): BOOLEAN;
PROCEDURE GetGridDataSetAttrs( gds : GridDataSet;
VAR dataID : LONGINT;
VAR dataDescr : ARRAY OF CHAR;
VAR sectorID : LONGINT;
VAR sectorDescr : ARRAY OF CHAR;
VAR nRows : INTEGER;
VAR nCols : INTEGER;
VAR inDegrees : BOOLEAN;
VAR minLon : REAL;
VAR maxLon : REAL;
VAR minLat : REAL;
VAR maxLat : REAL;
VAR cellSize : REAL;
VAR nDataMats : INTEGER );
(* NOTE: minLon/maxLon and minLat/maxLat returned according to the GDS convention,
i.e. they denote the coordinates of the most westerly/easterly, respectively
southerly/northerly gridpoints. *)
PROCEDURE GetGridDataSetDim( gds: GridDataSet; VAR nRows, nCols, nDataMats: INTEGER );
PROCEDURE GridDataSetDataID( gds: GridDataSet ): LONGINT;
PROCEDURE GetGridDataSetDataDescr( gds: GridDataSet; VAR dataDescr: ARRAY OF CHAR );
PROCEDURE GridDataSetSectorID( gds: GridDataSet ): LONGINT;
PROCEDURE GetGridDataSetSectorDescr( gds: GridDataSet; VAR sectorDescr: ARRAY OF CHAR );
PROCEDURE GridDataSetNumRows( gds: GridDataSet ): INTEGER;
PROCEDURE GridDataSetNumCols( gds: GridDataSet ): INTEGER;
PROCEDURE GridDataSetIsInDegrees( gds: GridDataSet ): BOOLEAN;
PROCEDURE GridDataSetMinLon( gds: GridDataSet ): REAL;
PROCEDURE GridDataSetMaxLon( gds: GridDataSet ): REAL;
PROCEDURE GridDataSetMinLat( gds: GridDataSet ): REAL;
PROCEDURE GridDataSetMaxLat( gds: GridDataSet ): REAL;
PROCEDURE GridDataSetCellSize( gds: GridDataSet ): REAL;
PROCEDURE GridDataSetNumDataMats( gds: GridDataSet ): INTEGER;
(********************************************************)
(*##### Setting of gridded data set attributes #####*)
(********************************************************)
PROCEDURE SetGridDataSetDataID( gds: GridDataSet; dataID: LONGINT );
PROCEDURE SetGridDataSetDataDescr( gds: GridDataSet; dataDescr: ARRAY OF CHAR );
PROCEDURE SetGridDataSetSectorID( gds: GridDataSet; sectorID: LONGINT );
PROCEDURE SetGridDataSetSectorDescr( gds: GridDataSet; sectorDescr: ARRAY OF CHAR );
(************************************************************)
(*##### Testing of gridded datasets and attributes #####*)
(************************************************************)
PROCEDURE SetGridpointCoordRelTol( relTol: REAL );
PROCEDURE GridpointCoordRelTol(): REAL;
(*
Set or get the relative tolerance for the coordinates of a gridpoint.
A gridpoint is accepted as being consistent with the definition of a
given grid if it is located within a rectangular region with height =
width = 2*relTol*cellSize surrounding a gridpoint of the grid. The
default value for relTol is 0.01 (i.e., 1%).
The relative tolerance is considered when testing the corectness of a
given coordinate in procedures XCoordOK/YCoordOK, when using one of the
procedures Get/SetGridpointValue (see below), or when reading the
coordinates for a GridDataSet given in listFormat with the aid of
procedure ReadGridDataSet from module GridDSIO.
*)
PROCEDURE GridDataSetOK( gds : GridDataSet;
VAR errTxt : ARRAY OF CHAR ): BOOLEAN;
PROCEDURE GridDataMatOK( gds : GridDataSet;
dataMatNr : INTEGER;
VAR errTxt : ARRAY OF CHAR ): BOOLEAN;
PROCEDURE XCoordOK( gds : GridDataSet;
xCoord : REAL;
mustBeOnGrid : BOOLEAN;
VAR isInSector : BOOLEAN;
VAR isOnGrid : BOOLEAN;
VAR closestCol : INTEGER;
VAR errTxt : ARRAY OF CHAR ): BOOLEAN;
PROCEDURE YCoordOK( gds : GridDataSet;
yCoord : REAL;
mustBeOnGrid : BOOLEAN;
VAR isInSector : BOOLEAN;
VAR isOnGrid : BOOLEAN;
VAR closestRow : INTEGER;
VAR errTxt : ARRAY OF CHAR ): BOOLEAN;
PROCEDURE GridPointOK( gds : GridDataSet;
xCoord : REAL;
yCoord : REAL;
mustBeOnGrid : BOOLEAN;
VAR pointIsInSector : BOOLEAN;
VAR pointIsOnGrid : BOOLEAN;
VAR closestRow : INTEGER;
VAR closestCol : INTEGER;
VAR errTxt : ARRAY OF CHAR ): BOOLEAN;
(******************************************)
(*##### Get/set gridpoint values #####*)
(******************************************)
PROCEDURE GetGridpointValue( gds : GridDataSet;
dataMatNr : INTEGER;
xCoord : REAL;
yCoord : REAL;
VAR value : REAL;
VAR resCode : INTEGER;
VAR errTxt : ARRAY OF CHAR );
PROCEDURE SetGridpointValue( gds : GridDataSet;
dataMatNr : INTEGER;
xCoord : REAL;
yCoord : REAL;
value : REAL;
VAR resCode : INTEGER;
VAR errTxt : ARRAY OF CHAR );
(* Access to of gridpoint values using direct access to data matrices *)
PROCEDURE GetDataMatrix( gds: GridDataSet; dataMatNr: INTEGER ): DataMatrix;
PROCEDURE GetMatEle( mat: DataMatrix; row, col: INTEGER; VAR r: REAL );
(* does not check inputs! *)
PROCEDURE SetMatEle( mat: DataMatrix; row, col: INTEGER; r: REAL );
(* does not check inputs! *)
END GridDataSets.