|
|
再来个Fortran
PROGRAM HOLU2
!
! Program to extract HOMO and LUMO data from multiple Gaussian output files
! SRK 2011/06/30
! SRK 2011/10/18 Modified to produce 3 output files, bug fix
!
! Input : A file containing a list of filenames, one per line
! Output: One line per input filename, 3 columns, holding the filename, the HOMO and the LUMO
! Input filename, HOMO and LUMO are written to file 'HOMOandLUMO.txt'
! HOMO is written to file 'HOMO.txt'
! LUMO is written to file 'LUMO.txt'
!
IMPLICIT NONE
! Variable declarations
INTEGER, PARAMETER :: inunit=22, listunit=23 ! Unit numbers for input files and list file
INTEGER, PARAMETER :: hlunit=24, hunit=25, lunit=26 ! Unit numbers for output files
INTEGER :: i ! Loop variable
INTEGER :: n ! Number of characters in current line
INTEGER :: stat ! Holds the current state of the input file, 0=OK
INTEGER :: numfiles ! Number of filenames detected in the input
INTEGER :: blockflag ! Flag variable to find the correct HOMO-LUMO data
CHARACTER (LEN=100) :: listname ! File containing the list of filenames to be processed
CHARACTER (LEN=100) :: inpfile ! Current input filename
CHARACTER (LEN=100) :: line ! Current line in the input file
CHARACTER (LEN=100) :: prevline ! Previous line in the input file
CHARACTER (LEN=9) :: homostring, lumostring ! Strings containing the HOMO/LUMO eigenvalues
!
! Executable code
WRITE (*,*) 'HOLU - a program to extract HOMO and LUMO data'
WRITE (*,*) 'Enter the name of an input file containing a list of filenames (no blank lines!)'
READ (*,'(A)') listname
OPEN(listunit,FILE=listname)
!
! Find out how many files are in the list
numfiles = 0
stat = 0
DO
READ(listunit,'(A)',iostat=stat) line
IF (stat /= 0) EXIT
numfiles = numfiles + 1
END DO
CLOSE(listunit)
WRITE (*,*) 'Detected ',numfiles,' lines in list file'
!
! Open output files
OPEN(hlunit,FILE='HOMOandLUMO.txt')
OPEN(hunit,FILE='HOMO.txt')
OPEN(lunit,FILE='LUMO.txt')
! Now loop over these files
OPEN(listunit,FILE=listname)
DO i = 1, numfiles
READ(listunit,'(A)') inpfile
OPEN(inunit,file=TRIM(inpfile))
blockflag = 0
!
! Search for the needed information in the input file
prevline = ''
DO
READ(inunit,FMT='(A)',IOSTAT=stat) line ! Read in the next line of the file using '(A)' format
IF (stat /= 0 ) EXIT
IF (index(line,'Alpha virt.') > 0 ) THEN ! found a line listing virtual states
IF (blockflag == 0) blockflag = 1
IF (blockflag == 2) THEN ! we have found the second block
lumostring = line(30:40) ! first number on this line
n = len_trim(prevline)
homostring = prevline(n-8:n) ! last number on previous line
WRITE(*,*) TRIM(inpfile),' ', 'HOMO', ' ', homostring,' ', 'LUMO', ' ', lumostring
WRITE(hlunit,'(A),(A),(A),(A)') TRIM(inpfile),' ', 'HOMO', ' ', homostring,' ', 'LUMO', ' ', lumostring
WRITE(hunit,'(A)') TRIM(inpfile),' ', 'HOMO', ' ', homostring
WRITE(lunit,'(A)') TRIM(inpfile),' ', 'LUMO', ' ', lumostring
EXIT
END IF
ELSE
IF (blockflag == 1) blockflag = 2
END IF
prevline = line
END DO
CLOSE(inunit)
END DO
! Close all files that are still open
CLOSE(listunit)
CLOSE(hlunit)
CLOSE(hunit)
CLOSE(lunit)
!
END PROGRAM HOLU2
这是source code,需要编译。
编译后,`ls -l *.log | awk '{print $9}' > file_list
再运行编译后的程序,输入文件就是file_list。所有的输出结果都显示在屏幕上,可以拷入txt文档,进行后续的计算。 |
|