C Interface routines for MICROSOFT FORTRAN 5.1: SLIBPC.FOR C C Copyright (C) 1989, California Institute of Technology C All rights reserved. U. S. Government Sponsorship under C NASA Contract NAS7-918 is acknowledged. C C Herbert M. Pickett, 20 Mar 1989 C C installation notes: C find parameter statement with HEAPLN in CALCAT and CALFIT and C comment it out , then remove leading C in the following comment. C The value of HEAPLN may have to be adjusted down further C if you have less available memory C this version has capability for command line arguements and C capability to end gracefully on ^C. C C fl -AH -4I2 -O -c calfit.for subfit.for calcat.for C fl -AH -4I2 -O -c blas.for ulib.for dpi.for spinv.for slibpc.for C lib splib.lib,ulib.obj+blas.obj+slibpc.obj+spinv.obj; C link/exepack calfit+subfit,spfit,spfit,splib C link/exepack calcat,spcat,spcat,splib C link/exepack calmrg+slibpc,calmrg,calmrg INCLUDE 'CALPGM.INC' INCLUDE 'flib.fi' C SUBROUTINE CHTIME(STR) C C SUBROUTINE TO RETURN 30 CHARACTERS WITH THE TIME AND DATE C CHARACTER*(*)STR INTEGER*2 HR,MIN,SEC,HSEC,YR,MO,DAY CALL GETTIM(HR,MIN,SEC,HSEC) CALL GETDAT(YR,MO,DAY) WRITE(STR,100) HR,MIN,SEC,HSEC,MO,DAY,YR 100 FORMAT(I3,':',I2,':',I2,'.',I2,I4,'/',I2,'/',I4) RETURN END INTEGER FUNCTION NDBLE(INUM) INTEGER INUM C .. number of REAL*8 words for INUM integer*2 words NDBLE= (INUM+3)/4 RETURN END SUBROUTINE FILGET(CFIL,CEXT,NFILE) C C Get NFILE names with extent given in CEXT C Put names in CFIL C C CHARACTER*(*) CFIL(*),CEXT(*) INTEGER NFILE CHARACTER EXT*3,EXTQ*3,FIL*63,EXTDOT*1 INTEGER NLEN,J,K,IEXT,ICHAR,IEXTQ,NARG LOGICAL QUERY INTEGER*4 NARGS INTEGER*2 INUM,ISTAT C define character which delimits EXT field EXTDOT='.' C get first parameter NARG=NARGS()-1 QUERY=NARG.LE.0 IF(QUERY) THEN NARG=NFILE WRITE(*,*) ' Enter file name ' READ(*,100) FIL ELSE INUM=1 CALL GETARG(INUM,FIL,ISTAT) ENDIF NLEN=INDEX(FIL,EXTDOT) IF(NLEN.EQ.0) THEN C extdot not found NLEN=INDEX(FIL,' ') IF(NLEN.LE.1) STOP FIL(NLEN:NLEN)=EXTDOT ENDIF C set up defaults DO 10 J=1,NFILE EXT=CEXT(J) 10 CFIL(J)=FIL(1:NLEN)//EXT C find non default values DO 20 INUM=2,NARG IF(QUERY) THEN WRITE(*,*) ' Enter file name ' READ(*,100,END=50) FIL ELSE CALL GETARG(INUM,FIL,ISTAT) ENDIF K=INDEX(FIL,EXTDOT) IF(K.EQ.0) GO TO 50 EXT=FIL(K+1:) DO 30 J=1,NFILE EXTQ=CEXT(J) DO 35 K=1,3 IEXT=ICHAR(EXT(K:K)) IEXTQ=ICHAR(EXTQ(K:K)) IF(IEXT.EQ.IEXTQ) GO TO 35 IF(IEXT+32.EQ.IEXTQ) GO TO 35 GO TO 30 35 CONTINUE CFIL(J)=FIL 30 CONTINUE 20 CONTINUE 50 WRITE(*,'(1X,A)') (CFIL(J),J=1,NFILE) RETURN 100 FORMAT(A) END SUBROUTINE OPENLU(LU,FNAME,CHSW) C fancy file opening and closing INTEGER LU,LUORG,LUIN,IREC,IOCHK PARAMETER (LUORG=10) CHARACTER*8 LULIST CHARACTER*(*) FNAME,CHSW CHARACTER*64 FIL SAVE LULIST DATA LULIST /'CCCCCCCC'/ LUIN=LU IF(CHSW(1:1).EQ.'C') THEN LU=LU-LUORG IF(LU.GT.0.AND.LU.LE.LEN(LULIST)) THEN IF(LULIST(LU:LU).EQ.'R') THEN REWIND (LUIN) ELSE IF(LULIST(LU:LU).EQ.'W') THEN ENDFILE (LUIN) ENDIF CLOSE(LUIN,ERR=50) LULIST(LU:LU)='C' ENDIF ELSE LU=INDEX(LULIST,'C') IF(LU.EQ.0) THEN WRITE(*,*) ' Too many open files' STOP ENDIF LULIST(LU:LU)=CHSW(1:1) LU=LU+LUORG IF(CHSW.EQ.'R') THEN OPEN(LU,FILE=FNAME,ERR=99,STATUS='OLD',IOSTAT=IOCHK) ELSE IF(CHSW.EQ.'RL') THEN OPEN(LU,FILE=FNAME,ERR=80,STATUS='OLD') ELSE IF(CHSW.EQ.'RB') THEN OPEN(LU,FILE=FNAME,ERR=85,STATUS='OLD', : FORM='UNFORMATTED',IOSTAT=IOCHK) ELSE IF(CHSW.EQ.'W') THEN OPEN(LU,FILE=FNAME,ERR=99,STATUS='UNKNOWN',IOSTAT=IOCHK) ELSE IF(CHSW.EQ.'WB') THEN OPEN(LU,FILE=FNAME,ERR=85,STATUS='UNKNOWN', : FORM='UNFORMATTED',IOSTAT=IOCHK) ELSE IF(CHSW.EQ.'WP') THEN C allow others to read my partially written file OPEN(LU,FILE=FNAME,ERR=99,STATUS='UNKNOWN',IOSTAT=IOCHK) ELSE IF(CHSW.EQ.'S') THEN IREC=LUIN*8 OPEN(LU,STATUS='SCRATCH',ACCESS='DIRECT',RECL=IREC,ERR=99 : ,IOSTAT=IOCHK) ELSE WRITE(*,*) ' OPENLU unknown option =',CHSW STOP ENDIF ENDIF 50 RETURN C try to open from default directory for parameter labels 80 FIL='\SPECTRA\'//FNAME OPEN(LU,FILE=FIL,ERR=90,STATUS='OLD') RETURN 85 LU=0 RETURN 90 WRITE(*,*) ' Trouble opening ',FIL RETURN 99 WRITE(*,*) ' Trouble opening ',FNAME WRITE(*,*) ' IOSTAT = ',IOCHK STOP END FUNCTION RQEXIT(IVAL) INTEGER RQEXIT,BRKFLG,IVAL,SIGNALQQ,SIG$INT PARAMETER (SIG$INT=2) EXTERNAL BRKQC[C] COMMON /BRKCOM/ BRKFLG SAVE /BRKCOM/ IF(IVAL.EQ.0) THEN RQEXIT=BRKFLG ELSE C initialize RQEXIT=SIGNALQQ(SIG$INT,BRKQC) BRKFLG=0 ENDIF RETURN END FUNCTION BRKQC[C]() INTEGER BRKQC,BRKFLG COMMON /BRKCOM/ BRKFLG SAVE /BRKCOM/ BRKFLG=-1 BRKQC=0 RETURN END SUBROUTINE BRKQR RETURN END