Full code for the simple application and all necessary subroutines is listed here, interspersed with more comprehensive comments and notes written in italics. A copy of this file can be obtained from the Birmingham FTP or WWW site. The code has been reduced to the almost-minimum required - the next document will cover more comprehensive methods that perform extra checking and involve access axis, error and quality information.
SUBROUTINE SIMPLE( STATUS )All ASTERIX applications are written as subroutines with an INTEGER status value as their sole argument. The program wrapper is generated during linking.
* Type Definitions: IMPLICIT NONE * Global Constants: INCLUDE '/star/include/sae_par' INCLUDE 'adi_par'Choose a central place to store the ASTERIX include files (eg. /star/asterix/include) and either create a symbolic link (%ln -s /star/asterix/include/adi_par) or specify that directory when compiling (%f77 -c simple.f -I/star/asterix/include).
* Status: INTEGER STATUS * Local variables: INTEGER IFID ! Input file identifier INTEGER IDPTR ! Input data array pointer INTEGER NDIM ! Number of dimensions INTEGER DIMS(ADI__MXDIM) ! Size of dimensions LOGICAL DATAOK ! Is the data present? * Initialise ASTERIX CALL AST_INIT()Must be called before any serious work can start.
* Obtain name of data file, and get an identifier to it CALL USI_ASSOC( 'INP', 'BINDS', 'UPDATE', IFID, STATUS ) IF ( STATUS .NE. SAI__OK ) RETURNASSOC implies that a pointer is to be associated with a file. INP is the parameter name as specified in the interface file. BINDS is the type of data expected in this file (a binned data set). UPDATE instructs the file to be opened for reading and writing. IFID is the pointer to the opened file.
* Look for components. CALL BDI_CHK( IFID, 'Data', DATAOK, STATUS ) IF ( .NOT. DATAOK ) STATUS = SAI__ERRORThe file is checked to see if contains a data section (ie. a component called `INP'.DATA_ARRAY).
* Get shape of input data CALL BDI_GETSHP( IFID, ADI__MXDIM, DIMS, NDIM, STATUS )Get the dimensionality and size of the main data component in the file.
* Map the data CALL BDI_MAPR( IFID, 'Data', 'UPDATE', IDPTR, STATUS )The data component is mapped to the pointer IDPTR as REAL values and for both reading and writing.
* Modify the array CALL SIMPLE_TASK( %VAL(IDPTR), NDIM, DIMS, STATUS )To use the values mapped by a pointer it must first be eVALuated by passing it as an argument to a subroutine.
* Tidy up CALL AST_CLOSE() CALL AST_ERR( STATUS )Closing down ASTERIX unmaps the data and file pointers, closes the opened file, and frees all other resources that have been used internally by ASTERIX and Starlink. The modified data values are automatically written back to the data file, as it was opened for UPDATE and the data mapped for UPDATE. Then, if any errors have been encountered, print an explanatory message to the screen.
END SUBROUTINE SIMPLE_TASK( DATA, NDIM, DIMS, STATUS ) * Global constants: INCLUDE '/star/include/sae_par' * Status: INTEGER STATUS * Import: REAL DATA(*) ! Array of data valuesThe data pointer has now become a standard data type after evaluation.
INTEGER NDIM ! Number of dimensions INTEGER DIMS(*) ! Size of dimensions * Local variables: INTEGER NELM ! Number of data elements INTEGER I ! Loop variable * Check inherited global status IF ( STATUS .NE. SAI__OK ) RETURN * Get size of the data array CALL ARR_SUMDIM( NDIM, DIMS, NELM )Find the total number of data values by multiplying up the dimensions.
* Perform the task as a vector operation on the data DO I = 1, NELM DATA(I) = SQRT( DATA(I) ) END DOThe pointer has been evaluated as a 1-D data array to allow for simple processing of the values. The actually file may contain a scalar value or an array with from 1 to 7 dimensions.
END