vis2int.F90 Source File


Source Code

!-----------------------------------------------------------------------------------------!
! Copyright (c) 2016 Peter Grünberg Institut, Forschungszentrum Jülich, Germany           !
! This file is part of kk-prime@juKKR and available as free software under the conditions !
! of the MIT license as expressed in the LICENSE file in more detail.                     !
!-----------------------------------------------------------------------------------------!


program findvis2int
  use mod_mympi,      only: mympi_init, myrank, nranks, master
  use mod_read,       only: read_kpointsfile_vis, read_kpointsfile_int
  use mod_fermisurf_basic,  only: save_kpointsfile_vis
#ifdef CPP_MPI
  use mpi
#endif

  implicit none


  integer :: ierr, ikp, n_status_out

  !symmetry arrays
  integer :: nsym1, nsym2
  integer, allocatable :: isym1(:), isym2(:)

  !local k-point arrays
  integer :: nkpts_irr, nkpts_int, nkpts_vis
  integer, allocatable :: kpt2irr(:), irr2kpt(:), vis2int(:), vis2int_tmp(:)
  double precision, allocatable :: kpoints_vis(:,:), kpoints_irr(:,:), kpoints_int(:,:), areas(:)

!=================================!
!========== BEGIN CODE ===========!

  !init
#ifdef CPP_MPI
  call MPI_Init( ierr )
#endif
  call mympi_init()

  call read_kpointsfile_vis(nkpts_vis, nkpts_irr, kpoints_irr, nsym1, isym1, kpt2irr, irr2kpt)
  call read_kpointsfile_int(nkpts_int, kpoints_int, areas, nsym2, isym2)

  allocate(kpoints_vis(3,nkpts_vis), STAT=ierr)
  if(ierr/=0) stop 'Problem allocating kpoints_vis'
  kpoints_vis = kpoints_irr(:,kpt2irr)

  if(nsym1/=nsym2)then
   stop 'wrong number of symmetries'
  else
   if(any(isym1/=isym2))then
     stop 'symmetries not compatible'
   end if
  end if

  allocate(vis2int(nkpts_vis), vis2int_tmp(nkpts_irr), STAT=ierr)
  if(ierr/=0) stop 'Problem allocating vis2int'

  write(*,'(A,I0,A)') 'Finding the nearest neighbours to ', nkpts_vis, ' kpoints.'
  n_status_out = nkpts_irr/100

  do ikp=1,nkpts_irr
    call find_closest_kpoint(nkpts_int, kpoints_int, kpoints_irr(:,ikp), vis2int_tmp(ikp))
!   write(*,*) ikp
    if(mod(ikp,n_status_out)==0) write(*,'(I0,A)') nint(float(ikp*100)/float(nkpts_irr)), ' percent done'
  end do!ikp

  if(any(vis2int_tmp==-1)) stop 'something went wrong'

  vis2int = vis2int_tmp(kpt2irr)

  call save_kpointsfile_vis(nkpts_vis, nkpts_irr, kpoints_vis, nsym1, isym1, kpt2irr, irr2kpt, vis2int, 'FSpoints.vis2int.new')

  call MPI_Finalize( ierr )


contains

  subroutine find_closest_kpoint(nkpts, kpoints_arr, refpoint, minindex)
    implicit none
    integer, intent(in) :: nkpts
    double precision, intent(in) :: kpoints_arr(3,nkpts), refpoint(3)
    integer, intent(out) :: minindex

    integer :: ikp2
    double precision :: distvec(nkpts), mindist, dist

    minindex = -1
    mindist = 1d18

    do ikp2=1,nkpts
      dist = sum((kpoints_arr(:,ikp2) - refpoint(:))**2)
      if(dist<mindist)then
        mindist = dist
        minindex = ikp2
      end if!dist<mindist
    end do!ikp

  end subroutine find_closest_kpoint


end program findvis2int