C*********************************************************************** C PROGRAM "RANK OF COMBINED Z-MATRIX" BY ROBERT FRACZKIEWICZ * C DEPARTMENT OF CHEMISTRY, UNIVERSITY OF HOUSTON, 1992 * C CHEM86@JETSON.UH.EDU * C*********************************************************************** IMPLICIT REAL*8(A-H,O-Z) DIMENSION NR(2000),NC(2000),NFO(2000),Z(2000),NRK(150,100), 1 AK(150,100),NRW(150,100),NRC(150,100),NONZ(150),NROW(4), 2 NCOL(4),NPO(4),DATIN(4) CHARACTER*60 NAME,CR DO 180 I=1,2000 180 NFO(I)=0 NZO=0 NQ=0 PRINT * PRINT *,' RANK OF COMBINED Z-MATRIX ' PRINT *,' RANKZ VERSION 1.0 (1992) ' PRINT * PRINT *,'INPUT THE TOTAL NUMBER OF INDEPENDENT FORCE CONSTANTS' READ(*,*) NF NRANK=NF 200 PRINT *,'INPUT THE name OF THE FILE (WITHOUT EXTENSION !!!) ' PRINT *,'WHERE THE Z-MATRIX IS STORED AND PRESS . ' PRINT *,'THE ".ZMAT" EXTENSION WILL BE AUTOMATICALLY ASSUMED. ' PRINT *,'THE LENGTH OF THE name CANNOT EXCEED 50 CHARACTERS. ' READ(*,'(A60)') NAME NAMLEN = LSTNBL(NAME) PRINT *,'INPUT THE DIMENSION OF THE Z-MATRIX' READ(*,*) NNQ OPEN(UNIT=15, FILE=NAME(1:NAMLEN)//'.ZMAT', 1 ERR=9991, STATUS='OLD') 190 NOZ=0 191 READ(15,18) (NROW(L),NCOL(L),NPO(L),DATIN(L),L=1,4) 18 FORMAT(4(3I3,F9.6)) DO 196 L=1,4 IF(NROW(L))198,196,193 193 NOZ=NOZ+1 NR(NZO+NOZ)=NQ+NROW(L) NC(NZO+NOZ)=NQ+NCOL(L) NFO(NZO+NOZ)=NPO(L) Z(NZO+NOZ)=DATIN(L) 196 CONTINUE GO TO 191 198 NZO=NZO+NOZ NQ=NQ+NNQ CLOSE(UNIT=15) PRINT *,'END OF DATA ? ' READ(*,'(A60)') CR IF(CR(1:1).EQ.'Y'.OR. CR(1:1).EQ.'y') GO TO 199 GO TO 200 199 PRINT *,'THE RESULTS OF THE PROGRAM WILL BE STORED IN THE' PRINT *,'OUTPUT FILE WITH EXTENSION ".RAOUT" .' OPEN(UNIT=16, FILE=NAME(1:NAMLEN)//'.RAOUT', 1 STATUS='NEW') DO 100 I=1,150 NONZ(I)=0 DO 100 J=1,50 NRK(I,J)=0 100 AK(I,J)=0.0 DO 10 L=1,NZO K=NFO(L) NONZ(K)=NONZ(K)+1 NRW(K,NONZ(K))=NR(L) NRC(K,NONZ(K))=NC(L) NRK(K,NONZ(K))=NQ*(NR(L)-1)+NC(L) AK(K,NONZ(K))=Z(L) 10 CONTINUE DO 40 K=1,NF IF(NONZ(K).EQ.0) THEN NRANK=NRANK-1 WRITE(16,41) K 41 FORMAT(1X,I3,' - TH FORCE CONSTANT NOT PRESENT') ELSE KOL=1 AMAX=AK(K,1) DO 50 J=2,NONZ(K) IF(ABS(AK(K,J)).GT.ABS(AMAX)) THEN AMAX=AK(K,J) KOL=J ENDIF 50 CONTINUE IF(AMAX.EQ.0.0) THEN NRANK=NRANK-1 WRITE(16,42) K 42 FORMAT(1X,I3,' - TH FORCE CONSTANT LINEARLY DEPENDENT') ELSE KK=NRK(K,KOL) IF(KK.NE.K) THEN DO 60 L=1,NF DO 60 I=1,NONZ(L) KX=NRK(L,I) IF(KX.EQ.KK) NRK(L,I)=K 60 IF(KX.EQ.K) NRK(L,I)=KK ENDIF DO 70 J=1,NONZ(K) L=NRK(K,J) DO 70 I=K+1,NF DO 70 M=1,NONZ(I) IF(NRK(I,M).EQ.K) THEN DO 71 N=1,NONZ(I) IF(NRK(I,N).EQ.L) AK(I,N)=AK(I,N)-AK(I,M)*AK(K,J)/ 1AK(K,KOL) IF(ABS(AK(I,N)).LT.9.0E-07) AK(I,N)=0.0 71 CONTINUE ENDIF 70 CONTINUE ENDIF ENDIF 40 CONTINUE WRITE(16,45) NAME,NRANK 45 FORMAT(1X,'FILE : ',A14,/1X,'RANK OF THE COMBINED Z-MATRIX = ',i3) CLOSE(UNIT=6) STOP 1 C ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 9991 PRINT * PRINT *, 1 'INPUT OPERATION UNSUCCESFUL. CANNOT FIND Z-MATRIX FILE '// 2 NAME(1:NAMLEN)//'.ZMAT' STOP 3 C ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ END C ------------------- LSTNBL ----- C Routine which finds last nonblank character in a character variable C INTEGER FUNCTION LSTNBL(CHRVAR) CHARACTER*(*) CHRVAR INTEGER I, L L = LEN(CHRVAR) DO 100 I = L, 1, -1 IF(CHRVAR(I:I) .NE. ' ')GOTO 200 100 CONTINUE 200 LSTNBL = I RETURN END