turbomole_gradient Subroutine

public subroutine turbomole_gradient(mol, fname, energy, gradient, stat)

Arguments

Type IntentOptional Attributes Name
type(structure_type), intent(in) :: mol
character(len=*), intent(in) :: fname
real(kind=wp), intent(in) :: energy
real(kind=wp), intent(in) :: gradient(:,:)
integer, intent(out) :: stat

Source Code

subroutine turbomole_gradient(mol, fname, energy, gradient, stat)
   type(structure_type),intent(in) :: mol
   character(len=*),intent(in) :: fname
   real(wp),intent(in) :: energy
   real(wp),intent(in) :: gradient(:, :)
   integer, intent(out) :: stat
   character(len=:),allocatable :: line
   integer  :: i,icycle,line_number
   integer  :: err
   integer  :: igrad ! file handle
   logical  :: exist
   real(wp) :: escf
   real(wp),allocatable :: gscf(:,:)
   real(wp),allocatable :: xyz (:,:)
   allocate( gscf(3,mol%nat), source = 0.0_wp )
   stat = 0
   icycle = 1
   i = 0
   escf = 0.0_wp
   line_number = 0

   inquire(file=fname,exist=exist)
   if (exist) then
      open(newunit=igrad,file=fname)
      read_file: do
         call getline(igrad,line,iostat=err)
         if (err/=0) exit read_file
         i=i+1
         if (index(line,"cycle") > 0) line_number = i
      end do read_file
      if (line_number < 2) then
         stat = 1
         return
      end if

      rewind(igrad)
      skip_lines: do i = 1, line_number-1
         read(igrad,"(a)")
      end do skip_lines
      call getline(igrad,line)
      read(line(10:17),*,iostat=err) icycle
      if (err == 0) read(line(33:51),*,iostat=err) escf
      if (err /= 0) then
         stat = 1
         return
      end if

      allocate(xyz(3,mol%nat))
      do i = 1, mol%nat
         call getline(igrad,line)
         read(line,*,iostat=err) xyz(1,i),xyz(2,i),xyz(3,i)
         if (err /= 0) then
            stat = 1
            return
         end if
      end do
      if (any(abs(xyz-mol%xyz) > 1.0e-8_wp)) then
         stat = 1
         return
      end if
      do i = 1, mol%nat
         call getline(igrad,line)
         read(line,*,iostat=err) gscf(1,i),gscf(2,i),gscf(3,i)
         if (err /= 0) then
            stat = 1
            return
         end if
      end do
      do i = 1, mol%nat
         backspace(igrad)
         backspace(igrad)
      end do
      backspace(igrad)
   else
      open(newunit=igrad,file=fname)
      write(igrad,'("$grad")')
   end if

   write(igrad,'(2x,"cycle =",1x,i6,4x,"SCF energy =",f18.11,3x,'//&
                   '"|dE/dxyz| =",f10.6)') &
      icycle, energy+escf, norm2(gradient+gscf)
   do i = 1, mol%nat
      write(igrad,"(3(F20.14,2x),4x,a2)") mol%xyz(1,i),mol%xyz(2,i),mol%xyz(3,i),mol%sym(i)
   end do
   do i = 1, mol%nat
      write(igrad,"(3D22.13)") gradient(1,i)+gscf(1,i),gradient(2,i)+gscf(2,i),gradient(3,i)+gscf(3,i)
   end do
   write(igrad,'("$end")')
   close(igrad)

end subroutine turbomole_gradient