! This file is copied and modified from QUANTUM ESPRESSO ! Kun Cao, Henry Lambert, Feliciano Giustino ! ! Copyright (C) 2011 Quantum ESPRESSO group ! This file is distributed under the terms of the ! GNU General Public License. See the file `License' ! in the root directory of the present distribution, ! or http://www.gnu.org/copyleft/gpl.txt . ! ! !---------------------------------------------------------------------- MODULE dfile_autoname !---------------------------------------------------------------------- USE kinds, ONLY : DP ! PUBLIC :: dfile_name, dfile_generate_name, dfile_get_qlist ! PRIVATE CHARACTER(len=12),PARAMETER :: dfile_directory_basename='.dfile_dir' ! CONTAINS !---------------------------------------------------------------------- FUNCTION dfile_directory_file(basename, prefix) !---------------------------------------------------------------------- IMPLICIT NONE CHARACTER(len=*),INTENT(in) :: basename CHARACTER(len=*),INTENT(in) :: prefix CHARACTER(len=512) :: dfile_directory_file dfile_directory_file = TRIM(prefix)//"."// & TRIM(basename)//dfile_directory_basename RETURN !---------------------------------------------------------------------- END FUNCTION dfile_directory_file !---------------------------------------------------------------------- ! !---------------------------------------------------------------------- FUNCTION open_dfile_directory(basename, prefix) !---------------------------------------------------------------------- USE io_files, ONLY : find_free_unit IMPLICIT NONE CHARACTER(len=*),INTENT(in) :: basename CHARACTER(len=*),INTENT(in) :: prefix ! directory where to operate INTEGER :: open_dfile_directory INTEGER :: ios CHARACTER(len=256) :: filename ! LOGICAL :: exst ! filename = dfile_directory_file(basename, prefix) !print*, "opening dir:", TRIM(filename) open_dfile_directory = find_free_unit() ! ! INQUIRE( FILE = TRIM(filename), EXIST = exst ) !IF(.not.exst) print*, "does not exist: >",TRIM(filename),"<" #ifdef __XLF OPEN(UNIT = open_dfile_directory, & ACCESS= 'sequential', & POSITION='append', & FILE = TRIM(filename), & FORM ='formatted', status='unknown', iostat=ios) #else OPEN(UNIT = open_dfile_directory, & ACCESS= 'append', & FILE = TRIM(filename), & FORM ='formatted', status='unknown', iostat=ios) #endif ! IF(ios/=0) CALL errore('open_dfile_directory','Cannot open: '//TRIM(filename),ABS(ios)) ! RETURN !---------------------------------------------------------------------- END FUNCTION open_dfile_directory !---------------------------------------------------------------------- ! !---------------------------------------------------------------------- FUNCTION scan_dfile_directory(iunit, xq, at, found, equiv) !---------------------------------------------------------------------- IMPLICIT NONE CHARACTER(len=256) :: scan_dfile_directory ! REAL(DP),INTENT(in) :: xq(3) REAL(DP),INTENT(in) :: at(3,3) INTEGER,INTENT(in) :: iunit LOGICAL,INTENT(out) :: found LOGICAL,INTENT(in),OPTIONAL :: equiv ! if .false. only look for exactly q ! if .true. any q+G is ok (default) ! INTEGER :: ios, iq_ REAL(DP) :: xp(3), aq(3), ap(3) CHARACTER(len=256) :: xp_name REAL(DP),PARAMETER :: gam(3) = (/ 0._dp, 0._dp, 0._dp /), accept = 1.e-5_dp ! LOGICAL :: equiv_ LOGICAL,EXTERNAL :: eqvect ! found=.false. scan_dfile_directory = '' ! equiv_ = .true. IF(present(equiv)) equiv_ = equiv ! xq in crystal coordinates: aq = xq CALL cryst_to_cart (1,aq,at,-1) ! REWIND(iunit) ios=0 ! SCAN_FILE : & DO WHILE(ios==0) READ(iunit,*,iostat=ios) xp, ap, iq_, xp_name ! ap = xp ! CALL cryst_to_cart (1,ap,at,-1) ! IF (equiv_) THEN IF (eqvect(aq,ap,gam,accept) .and. ios==0) THEN found=.true. scan_dfile_directory = TRIM(ADJUSTL(xp_name)) EXIT SCAN_FILE ENDIF ELSE IF ( ALL(ABS(ap-aq) "0" ! -4 --> "-4" ! 0.25 --> "1o4" ! -1.66666666667 -> "-5/3" ! !---------------------------------------------------------------------- FUNCTION real2frac(r) RESULT (f) !---------------------------------------------------------------------- IMPLICIT NONE REAL(DP),INTENT(in) :: r CHARACTER(len=64) :: f ! INTEGER :: d, n INTEGER,PARAMETER :: max_denominator = 48000 REAL(DP),PARAMETER :: accept = 1.d-6 CHARACTER(len=64) :: nc,dc ! IF(max_denominator*accept*20>1._dp) & CALL errore('real2frac', 'incompatible parameters', 2) ! Threat zero and integers separately: IF (ABS(r) max_denominator) CALL errore('real2frac', 'not a fraction', 1) ! IF (d > max_denominator) THEN WRITE(*, '("WARNING from real2frac:",e25.15," is not a fraction, falling back to hex." )') r WRITE(f,'(Z64)') r f='0x'//TRIM(ADJUSTL(f)) RETURN ENDIF ! n = NINT(r*d) ! WRITE(nc, '(i16)') n WRITE(dc, '(i16)') d ! f = TRIM(ADJUSTL(nc))//'o'//TRIM(ADJUSTL(dc)) ! RETURN ! !---------------------------------------------------------------------- END FUNCTION real2frac !---------------------------------------------------------------------- ! !---------------------------------------------------------------------- END MODULE dfile_autoname !----------------------------------------------------------------------