The use of the SSO routines is best illustrated by the small example application. It opens an input SSDS, copies to output, and adds a new field combining information from two of the existing fields.The status checks normal in such an application have been omitted for clarity.
CALL AST_INIT() ! Initialise CALL SSO_INIT() CALL SSO_ASSOCI( 'INP', 'READ', ILOC, SET, STATUS ) ! Get input and CALL DAT_TYPE( ILOC, TYPE, STATUS ) ! output and CALL USI_ASSOCO( 'OUT', TYPE, OLOC, STATUS ) ! copy one to CALL HDX_COPY( ILOC, OLOC, STATUS ) ! the other CALL SSO_GETNSRC( ILOC, NSRC, STATUS ) ! Any records? IF ( NSRC .EQ. 0 ) GOTO 99 CALL SSO_CHKFLD( ILOC, 'X_CORR', XOK, STATUS ) ! Input fields CALL SSO_CHKFLD( ILOC, 'Y_CORR', YOK, STATUS ) ! present? IF (XOK.AND.YOK) THEN CALL SSO_CREFLD( OLOC, 'RADIUS', '_REAL', STATUS ) ! Create and CALL SSO_MAPFLD( OLOC, 'RADIUS', '_REAL', 'WRITE', ! map field RPTR, STATUS ) CALL SSO_MAPFLD( ILOC, 'X_CORR', '_REAL', 'READ', ! Map input XPTR, STATUS ) ! fields CALL SSO_MAPFLD( ILOC, 'Y_CORR', '_REAL', 'READ', YPTR, STATUS ) CALL SSO_CHKFITEM( ILOC, 'X_CORR', 'UNITS', UOK, ! Units to STATUS ) ! be copied? IF ( UOK ) THEN CALL SSO_GETFITEM0C( ILOC, 'X_CORR', 'UNITS', ! Copy units UNITS, STATUS ) ! Note extra arg CALL SSO_PUTFITEM0C( OLOC, 'RADIUS', 'UNITS', ! needed when 40, UNITS, STATUS ) ! writing char END IF ! strings CALL PYTHAG( NSRC, %VAL(XPTR), %VAL(YPTR), ! See below %VAL(RPTR), STATUS ) CALL SSO_UNMAPFLD( ILOC, 'X_CORR', STATUS ) ! Unmap fields CALL SSO_UNMAPFLD( ILOC, 'Y_CORR', STATUS ) CALL SSO_UNMAPFLD( OLOC, 'RADIUS', STATUS ) END IF CALL SSO_RELEASE( ILOC, STATUS ) ! Free files CALL SSO_RELEASE( OLOC, STATUS ) CALL SSO_CLOSE() ! Shutdown. CALL AST_CLOSE() SUBROUTINE PYTHAG( N, X, Y, R, STATUS ) ! The action REAL X(*),Y(*),R(*) IF (STATUS.EQ.SAI__OK) THEN DO I =1,N R(I)=SQRT(X(I)**2+Y(I)**2) END DO END IF END
Points to note.