quantum-espresso/NEB/path_gen_inputs.f90

183 lines
4.7 KiB
Fortran

subroutine path_gen_inputs(parse_file_name,engine_prefix,nimage,root,comm)
!
USE io_files, only : find_free_unit
USE mp_global, only : mp_rank
implicit none
!
character(len=*), intent(in) :: parse_file_name
character(len=*), intent(in) :: engine_prefix
integer, intent(out) :: nimage
integer, intent(in) :: root
integer, intent(in) :: comm
!
character(len=256) :: dummy, dummy2
integer :: i, j
integer :: parse_unit, neb_unit
integer, allocatable :: unit_tmp(:)
integer :: unit_tmp_i
character(len=10) :: a_tmp
integer :: myrank
myrank = mp_rank(comm)
parse_unit = find_free_unit()
open(unit=parse_unit,file=trim(parse_file_name),status="old")
! ---------------------------------------------------
! NEB INPUT PART
! ---------------------------------------------------
i=0
nimage = 0
neb_unit = find_free_unit()
open(unit=neb_unit,file='neb.dat',status="unknown")
read(parse_unit,*) dummy
if(trim(dummy)=="BEGIN") then
do while (trim(dummy)/="END")
read(parse_unit,*) dummy
if(trim(dummy)=="BEGIN_PATH_INPUT") then
read(parse_unit,'(A256)') dummy
do while (trim(dummy)/="END_PATH_INPUT")
if(myrank==root) write(neb_unit,*) trim(dummy)
read(parse_unit,'(A256)') dummy
enddo
endif
if(trim(dummy)=="FIRST_IMAGE") then
nimage = nimage + 1
endif
if(trim(dummy)=="INTERMEDIATE_IMAGE") then
nimage = nimage + 1
endif
if(trim(dummy)=="LAST_IMAGE") then
nimage=nimage+1
endif
enddo
else
write(0,*) "key word BEGIN missing"
endif
close(neb_unit)
!------------------------------------------------
!
!
! ------------------------------------------------
! ENGINE INPUT PART
! ------------------------------------------------
allocate(unit_tmp(1:nimage))
unit_tmp(:) = 0
do i=1,nimage
unit_tmp(i) = find_free_unit()
enddo
do i=1,nimage
if(i>=1.and.i<10) then
write(a_tmp,'(i1)') i
elseif(i>10.and.i<100) then
write(a_tmp,'(i2)') i
elseif(i>100.and.i<1000) then
write(a_tmp,'(i3)')
endif
unit_tmp_i = unit_tmp(i)
open(unit=unit_tmp_i,file=trim(engine_prefix)//trim(a_tmp)//".in")
REWIND(parse_unit)
read(parse_unit,*) dummy
if(trim(dummy)=="BEGIN") then
do while (trim(dummy)/="END")
read(parse_unit,*) dummy
if(trim(dummy)=="BEGIN_ENGINE_INPUT") then
read(parse_unit,'(A256)') dummy
do while (trim(dummy)/="BEGIN_POSITIONS")
if(myrank==root) write(unit_tmp_i,*) trim(dummy)
read(parse_unit,'(A256)') dummy
enddo
if(i==1) then
do while (trim(dummy)/="FIRST_IMAGE")
read(parse_unit,'(A256)') dummy
enddo
if(trim(dummy)=="FIRST_IMAGE") then
read(parse_unit,'(A256)') dummy
do while (trim(dummy)/="INTERMEDIATE_IMAGE".and.(trim(dummy)/="LAST_IMAGE"))
if(myrank==root) write(unit_tmp_i,*) trim(dummy)
read(parse_unit,'(A256)') dummy
enddo
do while (trim(dummy)/="END_POSITIONS")
read(parse_unit,'(A256)') dummy
enddo
read(parse_unit,'(A256)') dummy
do while (trim(dummy)/="END_ENGINE_INPUT")
if(myrank==root) write(unit_tmp_i,*) trim(dummy)
read(parse_unit,'(A256)') dummy
enddo
endif
endif
!
if(i==nimage) then
do while (trim(dummy)/="LAST_IMAGE")
read(parse_unit,'(A256)') dummy
enddo
if(trim(dummy)=="LAST_IMAGE") then
read(parse_unit,'(A256)') dummy
do while (trim(dummy)/="END_POSITIONS")
if(myrank==root) write(unit_tmp_i,*) trim(dummy)
read(parse_unit,'(A256)') dummy
enddo
read(parse_unit,'(A256)') dummy
do while (trim(dummy)/="END_ENGINE_INPUT")
if(myrank==root) write(unit_tmp_i,*) trim(dummy)
read(parse_unit,'(A256)') dummy
enddo
endif
endif
!
if(i/=nimage.and.i/=1) then
do j=2,i
do while (trim(dummy)/="INTERMEDIATE_IMAGE")
read(parse_unit,'(A256)') dummy
enddo
enddo
if(trim(dummy)=="INTERMEDIATE_IMAGE") then
read(parse_unit,'(A256)') dummy
do while ((trim(dummy)/="LAST_IMAGE").and.trim(dummy)/="INTERMEDIATE_IMAGE")
if(myrank==root) write(unit_tmp_i,*) trim(dummy)
read(parse_unit,'(A256)') dummy
enddo
do while (trim(dummy)/="END_POSITIONS")
read(parse_unit,'(A256)') dummy
enddo
read(parse_unit,'(A256)') dummy
do while (trim(dummy)/="END_ENGINE_INPUT")
if(myrank==root) write(unit_tmp_i,*) trim(dummy)
read(parse_unit,'(A256)') dummy
enddo
endif
endif
!
endif
enddo
endif
close(unit_tmp_i)
enddo
deallocate(unit_tmp)
close(parse_unit)
!
end subroutine path_gen_inputs