CHAPTER 11 PROGRAM INTERFACE TO SAD 11.1 INTRODUCTION This description assumes a knowledge of the structure of the standard data format as described in "Standard Astronomical Data Format for use by The Anglo-Australian Observatory and Mount Stromlo and Siding Spring Observatories "(DKW 29/5/79). Throughout this discussion, the following conventions are observed: bytes are eight bits, words are 16 bits, longwords are 32 bits. To distinguish parameters which start counting at one from those which count from zero, the terms index and offset, respectively, are used. All pointers, whether byte or record, are offsets from the appropriate reference location. That is, the first byte is record number zero. Arguments which have meaning in an application sense, e.g. row number, count from one. Purely computational parameters usually count from zero. All parameters, such as status codes, array dimensions, array indices and offsets, are defined symbolically. This gives a degree of resilience to changes in the format and all programs should be written in terms of symbols rather than their numerical equivalents. Conventions for naming parameters are given in Appendix A. Combining precision and readability in the one symbol has led to long names. It is suggested that, where the meaning is clear, application programs equate shorter symbols to the longer named symbols once per program and use the shorter name throughout the program. On the Mount Stromlo VAX the standard parameter file can be accessed using an 'INCLUDE LBY:SADPAR.FOR' in the Fortran source program. Page 2 11.2 NODE/IMAGE CONTROL ARRAYS The first argument of each subroutine call is a control array which plays the part of a logical unit number in a conventional Fortran read or write. It carries pointers and other information needed to access the data efficiently. When reading or writing an existing image or node, the application program has to do nothing to this array other than dimension it. Information about the image is available to the program in this array. Before creating a new image, the application program must first set up some mandatory parameters in the control array. A control array may be node or image control array depending on context. Node and image control arrays are similar and it is not necessary to know before the initial access to a node whether a node or image will be encountered. This can be determined from the subroutine status return or the control array itself subsequent to the access. Consequently, it is not necessary for a program to know the structure of a data tree prior to accessing it. As each level of node is accessed, when climbing a tree, relevant parameters are copied from the previous level array so that only one array need be specified in subsequent reads and writes to that level. Multiple files, nodes and images may be held open for access by specifying separate control arrays. Details of Node/Image Control Arrays are given in Appendix B. Page 3 11.3 SUBROUTINES The general call to a standard format access subroutine is: CALL SUBROUTINE(CA,other arguments,ISTAT) where CA is the relevant control array and ISTAT is a status return. ISTAT is defined so that it will be .TRUE. on a logical test if the operation was successful. Other status values are defined in the parameter definition file. Where character string arguments are specified in these definitions, they follow the conventions applied to the parsing of literal strings in subroutine calls. On the VAX this implies a CHARACTER data type. Nodes and images may be accessed by name or number. A positive image number indicates an access by number. If the node image number is D$P_SEQACS, the next node or image in sequence is accessed. If it is D$P_NAMACS, a named search is done. In a search by number, the name is returned; in a search by name, the number is returned; in a sequential search, both name and number are returned. Numbering in this context starts at one. Phase 1 implementation at Mt. Stromlo will not support deletion of nodes or images, nor the extensible comments feature of the data format standard. In the subroutine descriptions that follow, the letters "C" or "R" after a subroutine argument denote whether the argument is to be defined at the time of call to or return from the subroutine. Page 4 11.3.1 File Level Subroutines 1. SFOPNF SUBROUTINE This subroutine opens a disk file and opens the first node/image within that file. Call: CALL SFOPNF(CA,FILE_NAME,ACSTYP,ISTAT,LU) where: NAME I/O TYPE DESCRIPTION CA C/R I4 is the control array. No information need be provided for an existing file. When creating a new file, the following elements must be supplied: In the case of a node array only the TAG and NAME fields need be entered but for an image array the following additional fields must be supplied: DATFMT, NELS, NROWS, NPLNS, EL1, ELZ, ROW1, ROWZ, PLN1, PLNZ, FLOOR, CEILING, NULLDAT. FILE_NAME C CHAR is the file specification. ACSTYP C CHAR is the access type : 'U' (update), 'R' (read), 'W' (write). ISTAT R I4 is the return status. LU C I4 is the logical unit to be used for I/O. This is the one occasion when an argument comes after ISTAT. It is placed here because it is expected to become redundant in later implementations of the package. Status Returns: D$S_IMAGE The top node in the file was an image. D$S_NODE The top node in the file was a node. D$S_ILLNCA The control array contains an illegal field. D$S_NONMULT The record size of the SAD file is not a multiple of the size of a data element as defined in the DATFMT field. D$S_ILFORM The specified data format is illegal. D$S_UNSUPFMT The specified data format is not supported by the current SAD software. Page 5 Operating system supplied status. 2. SFCLOS SUBROUTINE This subroutine closes the SAD disk file. Call: CALL SFCLOS(CA,ISTAT) where: NAME I/O TYPE DESCRIPTION CA C/R I4 is the control array. Any control array which has been used in accessing the file may be used in the call. ISTAT R I4 is the return status. Status returns: D$S_ILLNCA The control array contains an illegal field. Operating system supplied status. Page 6 11.3.2 Node Level Subroutines 1. SFOPNN SUBROUTINE. This subroutine opens a node/image. Call: CALL SFOPNN(CA1,CA2,NODE_NAME,NODE_NO,ACSTYP,ISTAT) where: NAME I/O TYPE DESCRIPTION CA1 C/R I4 is the node control array of level higher than that being opened. This array will have been set up by the routine which opened the node. CA2 C/R I4 is the control array of node being opened. No information need be provided for an existing node. When creating a new node the following fields must be supplied : In the case of a node array only the TAG and NAME fields need be entered, but for an image array the following additional fields must be supplied : DATFMT, NELS, NROWS, NPLNS, EL1, ELZ, ROW1, ROWZ, PLN1, PLNZ, FLOOR, CEILING, NULLDAT. NODE_NAME C/R CHAR is the node name. NODE_NO C/R I4 is the node number. ACSTYP C CHAR is the access type : 'U' (update), 'R' (read), 'W' (write). ISTAT C I4 is the return Status. Status Returns: D$S_IMAGE The node opened was an image. D$S_NODE The node was a node. D$S_ILOPIM Illegal operation attempted on an image. CA1 is probably an image control array rather than a node control array. D$S_ILLNCA One of the control arrays contains an illegal field. D$S_WRPROT The node associated with CA1 is not open for writing. D$S_NXNODE The specified node does not exist. Page 7 D$S_ILNODENO The NODE_NO parameter was invalid. D$S_NONMULT The record size of the SAD file is not a multiple of the size of a data element as defined in the DATFMT field. D$S_ILFORM The specified data format is illegal. D$S_UNSUPFMT The specified data format is not supported by the current SAD software. Operating system supplied status. Page 8 2. SFWNC/SFRNC SUBROUTINES These subroutines Read/write comments to a node header. Calls: CALL SFWNCM(CA,COMNTS,ISTCHR,LSTCHR,ISTAT) CALL SFRNCM(CA,COMNTS,ISTCHR,LSTCHR,ISTAT) where: NAME I/O TYPE DESCRIPTION CA C/R I4 is the node control array. This array will have been set up by the routine which opened the node. COMNTS C/R CHAR are comments. ISTCHR C I4 is the position of the first character to be read/ written. LSTCHR C I4 is the position of the last character to be read/ written. ISTAT R I4 is the return status. Status returns: D$S_ILLNCA The control array contains an illegal field. D$S_NOCOMMENT The character positions specified (ISTCHR,LSTCHR) do not fall within the bounds of the comments field. D$S_WRPROT Attempt to write comments to a write protected node. Operating system supplied status. Page 9 11.3.3 Image level subroutines 1. SFWKWD SUBROUTINE This subroutine writes a keyword and associated values to the keyword subdivison of an image header. Call: CALL SFWKWD(CA,KEYWD,VALUE,FORMAT,COMNTS,DUPFLG,ISTAT) where: NAME I/O TYPE DESCRIPTION CA C/R I4 is the control array of the image. This array will have been set up by the routine which opened the node. KEYWD C CHAR is the keyword. VALUE C I4 is the array containing the value(s) to be written for this Keyword. FORMAT C CHAR specifies the format in which the value(s) are to be written. The general form is 'nnnX'. 'X' can be 'I', 'F', or 'A' signifying integer, real or character data respectively. 'nnn' is a count, specifying the number of values to be written. Eg. the format '3I' means three integer values are written, '180A' means a string of 180 characters is written. COMNTS C CHAR are comments to be written after the "/" in the keyword entry . DUPFLG C LOG is the flag which determines whether the keyword is to be duplicated. If the keyword already exists and DUPFLG is .FALSE., the old entry is overwritten. If DUPFLG is .TRUE., the old entry is preserved and another entry made. This allows, for example, multiple 'COMMENT' keywords to be defined. ISTAT R I4 is the return status. Status returns: D$S_ILLICA The CA defined in the call was not a legal image control array. D$S_ILSUBDIV A subdivision other than the keyword subdivision was encountered. Page 10 Operating system supplied status. 2. VALUE/IVALUE/CVALUE FUNCTIONS Three FUNCTION subroutines are provided to read keyword values. VALUE, IVALUE, and CVALUE return real, integer and character values respectively from the keyword subdivision of an image header. Calls: VALUE= VALUE(CA,KEYWD,NVAL,NKEY,ISTAT) IVAL = IVALUE(CA,KEYWD,NVAL,NKEY,ISTAT) CVAL = CVALUE(CA,KEYWD,NCHARS,NKEY,ISTAT) where: NAME I/O TYPE DESCRIPTION CA C/R I4 is the control array of the image. This array will have been set up by the routine which opened the node. KEYWD C CHAR is the keyword. NKEY C I4 is the occurrence of the keyword to be read. This allows access to each occurrence of a multiply defined keyword. NVAL C I4 is the number of the value to be returned; eg., the keyword 'RA' might have three values defined (hours, minutes, seconds). Setting NVAL to 2 will return the minutes field as the value of the function. NCHARS R I4 is the number of characters extracted from the keyword entry on return from the CVALUE routine. ISTAT R I4 is the return Status. Status returns: D$S_ILLICA The CA defined in the call was not a legal image control array. D$S_ILSUBDIV A subdivision other than the keyword subdivision was encountered. D$S_UNDEFKYWD The keyword was not found. D$S_NOVAL Fewer than NVAL values are in the entry. D$S_NOTCHARKEY The keyword requested is not written in character format. Page 11 Operating system supplied status. Page 12 3. COMMENT FUNCTION This function returns the comments which occur after the "/" in a keyword. Call: COMNT = COMMENT(CA,KEYWD,NCHARS,NKEY,ISTAT) where: NAME I/O TYPE DESCRIPTION CA C/R I4 is the control array of the image. This array will have been set up by the routine which opened the node. KEYWD C CHAR is the keyword. NKEY C I4 is the occurrence of the keyword to be read. This allows access to each occurrence of a multiply defined keyword. NCHARS R I4 On return from the routine, NCHARS is the number of characters extracted from the keyword entry. ISTAT R I4 is the return Status. Status returns: D$S_ILLICA The CA defined in the call was not a legal image control array. D$S_ILSUBDIV A subdivision other than the keyword subdivision was encountered. D$S_UNDEFKYWD The keyword was not found. D$S_NOVAL Fewer than NVAL values are in the entry. Operating system supplied status. Page 13 4. SFKEYR/SFKEYW SUBROUTINES These subroutines read/write an entire keyword card from the keyword subdivision of an image header. Calls: CALL SFKEYR(CA,KEYWDNO,KEYCARD,ISTAT) CALL SFKEYW(CA,KEYWDNO,KEYCARD,ISTAT) where: NAME I/O TYPE DESCRIPTION CA C I4 is the control array of the image. This arrray will have been set up by the routine which opened the node. KEYWDNO C I4 is the number of the keyword to access. For SFKEYR, if KEYWDNO is equal to D$P_SEQACCS the next keyword is returned, otherwise keyword access is by number. For SFKEYW, if KEYWDNO is equal to D$P_SEQACCS the keyword is written at the end of the subdivision (preserving all the current keywords) , otherwise the current keywords are erased and the subdivision started afresh. KEYCARD R CHAR is the keyword card; 80 characters are allowed. ISTAT R I4 is the return status. Status returns: D$S_ILLICA The CA defined in the call was not a legal image control array. D$S_ISUBDIV A subdivision other than the keyword subdivision was encountered. D$S_UNDEFKYWD The requested keyword was not found. This status is returned by SFKEYR when there are fewer than KEYNUM keywords, or when the "END=" keyword is encountered during a sequential access. Operating system supplied status. Page 14 5. SFRXYZ/SFWXYZ SUVROUTINES These subroutines transfer a cube of data between the program array and the SAD image. Calls: CALL SFRXYZ(CA,ARRAY,NAX,NAY,NAZ,IX,IY,IZ,NX,NY,NZ,ISTAT) CALL SFWXYZ(CA,ARRAY,NAX,NAY,NAZ,IX,IY,IZ,NX,NY,NZ,ISTAT) where: NAME I/O TYPE DESCRIPTION CA C/R I4 is the control array of the image. This array will have been set up by the routine which opened the node. ARRAY C/R BYTE is the array receiving/containing data NAX,NAY,NAZ C I4 are the dimensions of array. IX,IY,IZ C I4 are the coordinates of start of cube. (N.B. coordinates are relative to complete data array not active data array) NX, NY, NZ C I4 are the sizes of the cube. ISTAT C I4 is the return status. Status returns: D$S_ILOPND Illegal operation on a node. CA is probably a node control array rather than an image control array. D$S_ILLICA The CA defined in the call was not a legal image control array. D$S_INSARR The array is too small to contain a cube of the specified size. D$S_DATLOB The data cube specified lies outside the limits declared in the image header. D$S_WRPROT Attempt to write to a write protected image. D$S_ILFORM The specified data format is illegal. D$S_UNSUPFMT The specified data format is not supported by the current SAD software. Operating system supplied status. Page 15 6. SFRPLN/SFWPLN SUBROUTINES These subroutines transfer an entire plane of data between the program array and the SAD image. Calls: CALL SFRPLN(CA,ARRAY,NAX,NAY,NPLANE,ISTAT) CALL SFWPLN(CA,ARRAY,NAX,NAY,NPLANE,ISTAT) where: NAME I/O TYPE DESCRIPTION CA C/R I4 is the control array of the image. This array will have been set up by the routine which opened the node. ARRAY C/R BYTE is the array receiving/containing data. NAX,NAY C I4 are the dimensions of array. NPLANE C I4 is the plane number. ISTAT R I4 is the return status. Status returns: D$S_ILOPND Illegal operation on a node. CA is probably a node control array rather than an image control array. D$S_ILLICA The CA defined in the call was not a legal image control array. D$S_INSARR The array is too small to contain a plane of the specified size. D$S_DATLOB The plane specified lies outside the limits declared in the image header. D$S_WRPROT Attempt to write to a write protected image. D$S_ILFORM The specified data format is illegal. D$S_UNSUPFMT The specified data format is not supported by the current SAD software. Operating system supplied status. Page 16 7. SFRROW/SRWROW SUBROUTINES These subroutines transfer an entire row of data between the program array and the SAD image. Calls: CALL SFRROW(CA,ARRAY,NAX,NROW,NPLANE,ISTAT) CALL SFWROW(CA,ARRAY,NAX,NROW,NPLANE,ISTAT) where: NAME I/O TYPE DESCRIPTION CA C/R I4 is the control array of the image. This array will have been set up by the routine which opened the node. ARRAY C/R BYTE is the array receiving/containing data. NAX C I4 is the dimension of array. NROW C I4 is the row number. NPLANE C I4 is the plane number. ISTAT R I4 is the return status. Status returns: D$S_ILOPND Illegal operation on a node. CA is probably a node control array rather than an image control array. D$S_ILLICA The CA defined in the call was not a legal image control array. D$S_INSARR The array is too small to contain a row of the specified size. D$S_DATLOB The row specified lies outside the limits declared in the image header. D$S_WRPROT Attempt to write to a write protected image. D$S_ILFORM The specified data format is illegal. D$S_UNSUPFMT The specified data format is not supported by the current SAD software. Operating system supplied status. Page 17 11.3.4. Miscellaneous Routines 1. SDPFMT SUBROUTINE This subroutine sets the data format in which the programs will work. Translation is performed between this format and the format in which the data is stored on disk. Call: CALL SDPFMT(FORMAT,ISTAT) where: NAME I/O TYPE DESCRIPTION FORMAT C CHAR is the format to be used in the program. Legal values are 'I1', 'I2', 'I4' (one, two and four byte integer), 'R4', 'R8' (single and double precision real), and 'C8' (complex). The only format fully supported, however, is 'R4'. The 'R8' and 'C8' formats are partially supported - if the disk format is the same as the program format the read/write data routines will accept them, otherwise the read/write data routines will return the D$S_UNSUPFMT status. ISTAT R I4 is the return status. Status returns: D$S_ILFORM The specified data format is illegal. D$S_UNSUPFMT The specified data format is not supported by the current SAD software. Operating system supplied status. Page 18 11.4 SAD LOW LEVEL ROUTINES These routines provide the low level I/O and handling for the SAD I/O package. This document should be read in association with the listings. 1. BUFFER STRUCTURE Buffers are contained in the common SF$BUF and the particular buffer to be used is identified by a buffer number which is passed as an argument in subroutine calls. Buffer characteristics are determined by parameters MAXREC and NBUFFERS which are the maximum record length in bytes and the number of buffers. Currently MAXREC = 2048 and NBUFFERS = 8 See SF$LOWLEVEL for the buffer definitions. 2. MODULES Module Subroutines Function SF$LOWLEVEL SF$RDBUF Reads one record SF$RQBUF Requests a buffer for writing. SF$WRBUF Writes out a buffer SF$RLBUF Releases a requested buffer without writing. N.B., SF$RQBUF prevents further use of a buffer until it is either written or released. SF$VERYLOW SF$READW Reads record and waits for completion. SF$WAITR Waits for read to complete. SF$FIND Initiates access to record. SF$WRITEW Writes record, waits for completion. SF$INIT SF$INIT Initializes buffer queue. SF$QUEUE SF$GETQ Finds first available buffer. SF$BOTQ Moves a buffer to the bottom of the queue. SF$TOPQ Moves a buffer to the top of the queue. Note: only SF$LOWLEVEL routines should be called externally. The remaining three modules are called by SF$LOWLEVEL. Page 19 3. BUFFER HEADER STRUCTURE Buffer headers are kept in a two dimensional array the second dimension corresponding to buffer number. Length of a single buffer header is determined by the parameter. LENHDR. The contents of a header are: BHDRS(CHANNEL,.) I/O channel no. currently associated with this buffer. BHDRS(RECORD,.) Number of record currently in buffer . BHDRS(RECSIZE,.) Size (in bytes) of record currently in buffer. BHDRS(FLAGS,.) Control flags associated with the buffer. If any flag is set, buffer cannot be used by SF$GETQ. Currently defined flags are FLG$LOCK(buffer locked by SF$RQBUF) and FLG$FILL(buffer is being used in lookahead I/O). BHDRS(QNEXT,.) Number of next buffer in queue. BHDRS(QPREV,.) Number of previous buffer in queue. Page 20 4. QUEUE STRUCTURE When a buffer is required, the queue is searched from the top and the first unflagged buffer used. When a buffer is used, it is placed at the bottom of the queue. This assumes that a buffer will stay in memory the maximum possible time. There are two overall queue pointers: QFIRST and QLAST which point to the first and last buffers in the queue respectively. (Note: first buffer, top of queue and head of queue are synonimous). For a buffer at the head of the queue the header pointer to the previous buffer is zero. For a buffer at the tail, the pointer to the next buffer is zero. 5. MODULES CONTAINING DEFINITIONS These notes indicate the modules which must be modified if there is any change in definitions: Buffers SF$LOWLEVEL, higher level routines. NBUFFERS SF$LOWLEVEL, SF$INIT, SF$QUEUE Buffer Headers SF$LOWLEVEL, SF$INIT, SF$QUEUE Queue Headers SF$LOWLEVEL, SF$INIT, Used but not defined in SF$QUEUE. 6. POTENTIAL ENHANCEMENTS (i) Introduce a no wait version of writing. (ii) Separate read and write queues, generally a read queue will be longer than a write queue. (iii) Introduce lower level I/O in SF$VERYLOW. Page 21 APPENDIX A CONVENTIONS FOR DEFINING PARAMETER NAMES AND STATUS VALUES FOR STANDARD DATA I/O ROUTINES ON THE VAX A.1 Parameter Names The format of a parameter name is: D$cc_dddddd(_tt) where: cc = Category of parameter: S = Status code. P = Parameter (e.g. default record size or array dimensions) T = Tree header IC = Image control array NC = Node control array II = Image control subdivision (interchange format) IA = Image control subdivision (access format) N = Node control subdivision ND = Node directory entry A = Astronomical subdivision. dddddd = Parameter description or field name. In case of astronomical subdivision, this is broken into two parts: aaa_bbb , where aaa identifies the particular subdivision and bbb identifies the parameter. tt = Parameter type (only included where multiple types are possible): I = Array index (assuming 4 byte elements) B = Byte offset W = Word offsets L = Longword offset NB = Number of bytes in parameter field Page 22 NW = Number of words in parameter field NL = Number of longwords in parameter field Example: D$IC_NAME_I = Image control array index (counting from 1 ) of image name. D$IC_NAME_B = Byte offset (counting from 0) of the image name from the start of the image control array. A.2 Status Values Status values follow the conventions for condition values defined in Appendix C of the "VAX 11/780 Architecture Handbook" as follows: 31 30 16 15 14 3 2 0 ______________________________________________________ ! ! ! ! ! ! ! ! ! ! ! ! ______________________________________________________ < 2:0> = Severity level code <14:3> = Message number obtained from Fortran , operating system , or defined specifically for the standard data routines <15> = 1 for messages specific to the standard data routines 0 otherwise. <30:16> = Facility number of standard data routines currently 2) <31> = 1 always Bits <31:16> of status returns from standard data routines should contain the standard routine identifier (D$S_SAD) , regardless of whether the status value originated in the routines themselves or in some system utility. (That is, if the status value is defined as as an INTEGER*2 array of dimension 2 the second word should be set to D$S_SAD) . The one exception to this rule is the SS$_NORMAL return. Page 23 APPENDIX B NODE/IMAGE CONTROL ARRAY LAYOUT The fields which comprise the node and image control arrays are described below. The name of the field (as used in the standard parameter descriptions , Appendix A) , the code and length of the field (in bytes), and a brief description are given. B.1 Parameters contained in both Image and Node control arrays TAG Character 4 Two character tag ('ND' or 'IM') plus a two character version number (derived from header or disc) NAME Character 12 Node/Image name LUFL Integer 4 Logical unit number (I*2)/Flags (16 bits) (the only flag so far defined is write enable) RECLEN Integer 4 Length of random access record HDPTR Integer 4 Record pointer to node/image header B.2 Parameters contained in Node control array only NSUBND Integer 4 Number of subnodes. NLSTND Integer 4 Number of last node accessed. B.3 Parameters contained in Image control array only DATPTR Integer 4 Record pointer to data. COMPTR Integer 4 Record pointer to comments chain. DATFMT Character 8 Format of data: Page 24 byte 1 - A(SCII) ,R(eal) or I(nteger) byte 2 - number of bytes per value in non-ASCII formats bytes 3-8 - format for ASCII formats bytes 3-4 - system code for non-ASCII formats e.g. PDP-11 REAL*4 would be "R4PD " , F10.2 ASCII would be "A F10.2 ". NELS Integer 4 Number of elements per row (including inactive region) NROWS Integer 4 number of rows per plane (including inactive region) NPLNS Integer 4 Number of planes per image (including inactive region) EL1 Integer 4 Number of first active element in row ELZ Integer 4 Number of last active element in row ROW1 Integer 4 Number of first active row in plane ROWZ Integer 4 Number of last active row in plane PLN1 Integer 4 Number of first active plane in image PLNZ Integer 4 Number of last active plane in image FLOOR ### 4 Floor data value (in specified data format) - usually set at about the threshold. Any data below the floor are ignored. Not supported for ASCII data and only allows single precision. CEILING ### 4 Ceiling data value (in specified data format) - usually related to instrument saturation. Any data value above the ceiling is ignored . Not supported for ASCII data and only allows single precision. NULLDAT ### 4 Null datum code. Used to denote Page 25 undefined data. Not supported for ASCII data and only allows single precision. LSTEL Integer 4 Number of last element accessed LSTROW Integer 4 Number of last row accessed LSTPLN Integer 4 Number of last pplane accessed ### - Data format dependent