C $Header: /u/gcmpack/MITgcm/optim/utils.F,v 1.3 2003/11/11 20:38:27 edhill Exp $
#include "CPP_EEOPTIONS.h"
C-- File utils.F: General purpose support routines
C-- Contents
C-- U DATE - Returns date and time.
C-- IFNBLNK - Returns index of first non-blank string character.
C-- ILNBLNK - Returns index of last non-blank string character.
C-- IO_ERRCOUNT - Reads IO error counter.
C-- LCASE - Translates to lower case.
C--UM MACHINE - Returns character string identifying computer.
C-- UCASE - Translates to upper case.
C-- Routines marked "M" contain specific machine dependent code.
C-- Routines marked "U" contain UNIX OS calls.
CStartOfInterface
SUBROUTINE DATE ( string , myThreadId )
C /==========================================================\
C | SUBROUTINE DATE |
C | o Return current date |
C \==========================================================/
IMPLICIT NONE
#include "SIZE.h"
#include "EEPARAMS.h"
C
CHARACTER*(*) string
INTEGER myThreadId
CEndOfInterface
C
INTEGER lDate
CHARACTER*(MAX_LEN_MBUF) msgBuffer
C
lDate = 24
IF ( LEN(string) .LT. lDate ) GOTO 901
string = ' '
#ifdef HAVE_FDATE
CALL FDATE( string )
#endif
C
1000 CONTINUE
RETURN
901 CONTINUE
WRITE(msgBuffer,'(A)')
&' '
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
&SQUEEZE_RIGHT,myThreadId)
WRITE(msgBuffer,'(A)')
&'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
&SQUEEZE_RIGHT,myThreadId)
WRITE(msgBuffer,'(A)')
&'procedure: "DATE".'
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
&SQUEEZE_RIGHT,myThreadId)
WRITE(msgBuffer,'(A)')
&'Variable passed to S/R DATE is too small.'
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
&SQUEEZE_RIGHT,myThreadId)
WRITE(msgBuffer,'(A)')
&' Argument must be at least',lDate,'characters long.'
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
&SQUEEZE_RIGHT,myThreadId)
WRITE(msgBuffer,'(A)')
&'*******************************************************'
CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
&SQUEEZE_RIGHT,myThreadId)
GOTO 1000
END
CStartOfInterface
INTEGER FUNCTION IFNBLNK( string )
C /==========================================================\
C | FUNCTION IFNBLNK |
C | o Find first non-blank in character string. |
C \==========================================================/
IMPLICIT NONE
C
CHARACTER*(*) string
CEndOfInterface
C
INTEGER L, LS
C
LS = LEN(string)
IFNBLNK = 0
DO 10 L = 1, LS
IF ( string(L:L) .EQ. ' ' ) GOTO 10
IFNBLNK = L
GOTO 11
10 CONTINUE
11 CONTINUE
C
RETURN
END
CStartOfInterface
INTEGER FUNCTION ILNBLNK( string )
C /==========================================================\
C | FUNCTION ILNBLNK |
C | o Find last non-blank in character string. |
C \==========================================================/
IMPLICIT NONE
CHARACTER*(*) string
CEndOfInterface
INTEGER L, LS
C
LS = LEN(string)
ILNBLNK = LS
DO 10 L = LS, 1, -1
IF ( string(L:L) .EQ. ' ' ) GOTO 10
ILNBLNK = L
GOTO 11
10 CONTINUE
11 CONTINUE
C
RETURN
END
CStartofinterface
INTEGER FUNCTION IO_ERRCOUNT(myThid)
C /==========================================================\
C | FUNCTION IO_ERRCOUNT |
C | o Reads IO error counter. |
C \==========================================================/
IMPLICIT NONE
C == Global variables ==
#include "SIZE.h"
#include "EEPARAMS.h"
C == Routine arguments ==
INTEGER myThid
CEndofinterface
IO_ERRCOUNT = ioErrorCount(myThid)
RETURN
END
CStartOfInterface
SUBROUTINE LCASE ( string )
C /==========================================================\
C | SUBROUTINE LCASE |
C | o Convert character string to all lower case. |
C \==========================================================/
IMPLICIT NONE
CHARACTER*(*) string
CEndOfInterface
CHARACTER*26 LOWER
DATA LOWER /'abcdefghijklmnopqrstuvwxyz'/
SAVE LOWER
CHARACTER*26 UPPER
DATA UPPER /'ABCDEFGHIJKLMNOPQRSTUVWXYZ'/
SAVE UPPER
INTEGER I, L
C
DO 10 I = 1, LEN(string)
L = INDEX(UPPER,string(I:I))
IF ( L .EQ. 0 ) GOTO 10
string(I:I) = LOWER(L:L)
10 CONTINUE
C
RETURN
END
CStartOfInterface
SUBROUTINE MACHINE ( string )
C /==========================================================\
C | SUBROUTINE MACHINE |
C | o Return computer identifier in string. |
C \==========================================================/
IMPLICIT NONE
#include "SIZE.h"
#include "EEPARAMS.h"
CHARACTER*(*) string
CEndOfInterface
C
INTEGER IFNBLNK
INTEGER ILNBLNK
EXTERNAL
EXTERNAL
C
INTEGER iFirst
INTEGER iLast
INTEGER iEnd
INTEGER iFree
INTEGER idSize
CHARACTER*1024 strTmp
CHARACTER*1024 idString
strTmp = 'UNKNOWN'
iFree = 1
idSize = LEN(string)
#if (defined (TARGET_T3E) defined (TARGET_CRAY_VECTOR))
IFirst = 0
CALL PXFGETENV('USER',iFirst,strTmp,ILast,Iend )
#else
CALL GETENV('USER',strTmp )
#endif
IF ( strTmp .NE. ' ' ) THEN
iFirst = IFNBLNK(strTmp)
iLast = ILNBLNK(strTmp)
iEnd = iLast-iFirst+1
IF (iEnd .GE. 0 ) THEN
idString(iFree:) = strTmp(iFirst:iFirst+iEnd)
ENDIF
iFree = iFree+iEnd+1
IF ( iFree .LE. idSize ) THEN
idString(iFree:iFree) = '@'
iFree = iFree+1
ENDIF
ENDIF
strTmp = 'UNKNOWN'
#if (defined (TARGET_T3E) defined (TARGET_CRAY_VECTOR))
IFirst = 0
CALL PXFGETENV('HOST',iFirst,strTmp,ILast,Iend )
#else
CALL GETENV('HOST',strTmp )
#endif
IF ( strTmp .NE. ' ' ) THEN
iFirst = IFNBLNK(strTmp)
iLast = ILNBLNK(strTmp)
iEnd = iLast-iFirst+1
iEnd = MIN(iEnd,idSize-iFree)
iEnd = iEnd-1
IF (iEnd .GE. 0 ) THEN
idString(iFree:) = strTmp(iFirst:iFirst+iEnd)
ENDIF
iFree = iFree+iEnd+1
ENDIF
C
string = idString
C
1000 CONTINUE
RETURN
END
C***********************************************************************
SUBROUTINE UCASE ( string )
IMPLICIT NONE
C Translate string to upper case.
CHARACTER*(*) string
CHARACTER*26 LOWER
DATA LOWER /'abcdefghijklmnopqrstuvwxyz'/
SAVE LOWER
CHARACTER*26 UPPER
DATA UPPER /'ABCDEFGHIJKLMNOPQRSTUVWXYZ'/
SAVE UPPER
INTEGER I, L
C
DO 10 I = 1, LEN(string)
L = INDEX(LOWER,string(I:I))
IF ( L .EQ. 0 ) GOTO 10
string(I:I) = UPPER(L:L)
10 CONTINUE
C
RETURN
END
C************************************************************************