visdata.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 visdata

  use type_inc,       only: inc_type
  use type_data,      only: lattice_type, cluster_type, tgmatrx_type
  use mod_mympi,      only: mympi_init, myrank, nranks, master
  use mod_symmetries, only: symmetries_type, set_symmetries, rotate_kpoints, expand_areas, expand_visarrays, expand_spinvalues, unfold_visarrays
  use mod_ioformat,   only: filemode_int, filemode_vis, fmt_fn_sub_ext, ext_formatted, filename_spin, filename_fvel
  use mod_iohelp,     only: getBZvolume
  use mod_read,       only: read_inc, read_TBkkrdata, read_kpointsfile_vis, read_kpointsfile_int, read_weights, read_fermivelocity, read_spinvalue
! use mod_calconfs,   only: calculate_spinmixing_int, calculate_spinmixing_vis
  use mod_vtkxml,     only: write_pointdata_rot

#ifdef CPP_MPI
    use mpi
#endif

    implicit none

    logical            :: lspin, lfvel, lcond, lcond2, lpairs
    character(len=256) :: filemode, filename

    type(inc_type)      :: inc
    type(lattice_type)  :: lattice
    type(cluster_type)  :: cluster
    type(tgmatrx_type)  :: tgmatrx

    !symmetry arrays
    integer :: nsym, nsym2
    integer, allocatable :: isym(:)
    type(symmetries_type) :: symmetries

    !local k-point arrays
    integer :: nkpts, nkpts_all, nkpts_int, nkpts_int_all, nkpts_vis_all, nkpts_inp_all
    integer, allocatable :: kpt2irr(:), irr2kpt(:), vis2int(:), ipairs(:)
    double precision :: tau_avg
    double precision, allocatable :: kpoints(:,:), areas(:), weights(:), fermivel(:,:), fermivel_2(:,:), meanfreepath(:,:,:), meanfreepath_sum(:), tauk(:), tauk2(:), kpoints_2(:,:), kpoints_3(:,:)

    !spinvalue locals
    integer              :: nsqa, ndegen1
    integer, allocatable :: ispincomb(:)
    double precision, allocatable :: nvect(:,:), spinval(:,:,:), spinval1(:,:,:), spinmix(:)

    !temp k-point arrays
    integer :: nkpts1, nkpts2, nkpts_all1, nkpts_all2
    integer,          allocatable :: kpt2irr1(:), irr2kpt1(:), kpt2irr2(:), irr2kpt2(:), vis2int2(:)
    double precision, allocatable :: areas1(:), weights1(:), kpoints1(:,:), kpoints2(:,:), fermivel1(:,:)

    double precision :: pi, BZVol, dos, dtmp
    integer          :: iset_select, ierr, isqa, ikp, isy, lb, ub, ispin

    integer                       :: nscalar, nvector, iscalar, ivector
    double precision, allocatable :: scalardata(:,:),  &
                                   & vectordata(:,:,:),&
                                   & dtmparr(:),       &
                                   & dtmparr2(:),      &
                                   & fvelabs(:)
    character(len=256), allocatable :: scalarstring(:), vectorstring(:)
    character(len=256) :: dummyline

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

    !Read in TBKKR-data
    call read_inc(inc)
    call read_TBkkrdata(inc, lattice, cluster, tgmatrx)


    call set_symmetries(inc, lattice, symmetries)
    BZVol = getBZvolume(lattice%recbv)

!   write(*,*) "Which set shall I visualize?"
!   write(*,*) " 1=integration set"
!   write(*,*) " 2=visualization set"
!   read(*,*)  iset_select
    iset_select=1

    if(iset_select==1) filemode = filemode_int
    if(iset_select==2) filemode = filemode_vis



    nvector=0
    nscalar=0


    !=============================!
    != Read in the k-point files =!
    if(iset_select==1)then
      call read_kpointsfile_vis(nkpts_all2, nkpts2, kpoints2, nsym, isym, kpt2irr2, irr2kpt2,vis2int=vis2int2)
      call unfold_visarrays(nkpts_all2, nkpts2, kpt2irr2, kpoints2, kpt2irr1, irr2kpt1, kpoints1)
      nkpts1    =nkpts_all2
      nkpts_all1=nkpts_all2
      deallocate(kpt2irr2, irr2kpt2, kpoints2)

      call rotate_kpoints(symmetries%rotmat, nkpts1, kpoints1, nsym, isym, nkpts, kpoints)
      call expand_visarrays(nsym, nkpts_all1, nkpts1, kpt2irr1, irr2kpt1, kpt2irr, irr2kpt)
      nkpts_vis_all = nsym*nkpts_all1
      deallocate(kpt2irr1, irr2kpt1, kpoints1, isym)

      call read_kpointsfile_int(nkpts_int, kpoints1, areas1, nsym2, isym)
      if(nsym2/=nsym) stop 'nsym2/=nsym'
      if(vis2int2(nkpts_all1)/=nkpts_int) stop 'last element from vis2int/=nkpts_int'
      nkpts_int_all = nsym*nkpts_int

      call rotate_kpoints(symmetries%rotmat, nkpts_int, kpoints1, nsym, isym, nkpts2, kpoints_2)
      if(nkpts2/=nkpts_int_all) stop 'inconsistency in number of k-points 2'

      deallocate(isym, areas1, kpoints1)

      allocate(vis2int(nkpts_all1*nsym), STAT=ierr)
      if(ierr/=0) stop 'Problem allocating vis2int'
      do isy=1,nsym
        lb=(isy-1)*nkpts_all1+1
        ub=isy*nkpts_all1
        vis2int(lb:ub) = vis2int2 + (isy-1)*nkpts_int
      end do!isym

      nkpts_inp_all = nkpts_int_all

    else

      call read_kpointsfile_vis(nkpts_all1, nkpts1, kpoints1, nsym, isym, kpt2irr1, irr2kpt1)
      call rotate_kpoints(symmetries%rotmat, nkpts1, kpoints1, nsym, isym, nkpts, kpoints)
      call expand_visarrays(nsym, nkpts_all1, nkpts1, kpt2irr1, irr2kpt1, kpt2irr, irr2kpt)
      nkpts_vis_all = nsym*nkpts_all1
      deallocate(kpt2irr1, irr2kpt1, kpoints1, isym)

      nkpts_inp_all = nsym*nkpts1

    end if!iset_select==1


    !=========================!
    != Read in the spinvalue =!
    write(filename,fmt_fn_sub_ext) filename_spin, trim(filemode), ext_formatted
    inquire(file=filename, exist=lspin)
    if(lspin) then
        call read_spinvalue(trim(filemode), nkpts1, nsqa, ndegen1, ispincomb, nvect, spinval1, nsym, isym)
        if(nkpts1*nsym/=nkpts_inp_all) stop 'inconsistency in number of k-points'
        if(ndegen1/=inc%ndegen) stop 'inconsistency in ndegen'
        call expand_spinvalues(nsym,ndegen1,nsqa,nkpts1,spinval1,spinval)
        deallocate(spinval1, isym)
        nscalar = nscalar + nsqa
    end if!lspin


    !==============================!
    != Read in the fermi velocity =!
    write(filename,fmt_fn_sub_ext) filename_fvel, trim(filemode), ext_formatted
    inquire(file=filename, exist=lfvel)
    if(lfvel) then
        call read_fermivelocity(trim(filemode), nkpts1, fermivel1, nsym, isym)
        call rotate_kpoints(symmetries%rotmat, nkpts1, fermivel1, nsym, isym, nkpts2, fermivel)
        if(nkpts2/=nkpts_inp_all) stop 'inconsistency in number of k-points'
        deallocate(fermivel1, isym)
        nvector = nvector+1
    end if!lfvel



    !================================!
    != Read in the cond_output file =!
    inquire(file='output_lifetime', exist=lcond2)
    lcond = lcond2.and.(iset_select==1)
    if(lcond) then
      call read_condfile(inc%ndegen,nkpts_inp_all, kpoints_3, meanfreepath, fermivel_2, tauk, tauk2, tau_avg)
      nscalar = nscalar+1
      nvector = nvector+0

      allocate(ipairs(nkpts_inp_all), STAT=ierr)
      if(ierr/=0) stop 'Problem allocating ipairs'

      lpairs=.true.
      !calculate pairs or read pairs from file
!     inquire(file='kpoint_pairs',exist=lpairs)
!     if(lpairs)then
!       write(*,*) 'read pairs from file'
!       open(95,file='kpoint_pairs',form='formatted',action='read')
!       read(95,*) dummyline
!       read(95,'(I8)') ipairs
!       close(95)
!     else!lpairs
!       write(*,*) 'start to find pairs'
!       call find_kpoint_pairs(nkpts_inp_all, kpoints_3, ipairs)
!       write(*,*) 'pairs found'
!       open(95,file='kpoint_pairs',form='formatted',action='write')
!       write(95,'(A,I0)') 'nkpts_inp_all = ', nkpts_inp_all
!       write(95,'(I8)') ipairs
!       close(95)
!     end if!lpairs


    end if!lcond



    allocate( scalarstring(nscalar), vectorstring(nvector), STAT=ierr )
    if(ierr/=0) stop 'Problem allocating scalarstring etc.'

    !reset symmetries
    allocate(isym(1))
    nsym = 1
    isym = (/ 1 /)

    if(nvector>0) then
      allocate(vectordata(3,nkpts,nvector), STAT=ierr)
      if(ierr/=0) stop 'Problem allocating vectordata'
    end if

    if(nscalar>0) then
      allocate(scalardata(nkpts_vis_all,nscalar), STAT=ierr)
      if(ierr/=0) stop 'Problem allocating scalardata'
    end if

    iscalar=0
    ivector=0

    if(lfvel) then
      ivector = ivector+1
      if(iset_select==1) then
        do ikp=1,nkpts_vis_all
          vectordata(:,ikp,ivector) = fermivel(:,vis2int(ikp))
        end do!ikp
      else!iset_select==1
        vectordata(:,:,ivector) = fermivel(:,:)
      end if!iset_select==1
      vectorstring(ivector) = 'fvelocity'
    end if!lfvel

    if(lspin .and. inc%ndegen==2) then
      do isqa=1,nsqa
        iscalar = iscalar+1
        if(iset_select==1) then
          do ikp=1,nkpts_vis_all
            scalardata(ikp,iscalar) = (1d0-spinval(1,isqa,vis2int(ikp)))/2
          end do!ikp
        else!iset_select==1
          scalardata(:,iscalar) = (1d0-spinval(1,isqa,:))/2
        end if!iset_select==1
        write(scalarstring(iscalar),'(A,I0)') 'Eyaf_',isqa
      end do!isqa
    elseif(lspin .and. inc%ndegen==1) then
      do isqa=1,nsqa
        iscalar = iscalar+1
        if(iset_select==1) then
          do ikp=1,nkpts_vis_all
            scalardata(ikp,iscalar) = spinval(1,isqa,vis2int(ikp))/2
          end do!ikp
        else!iset_select==1
          scalardata(:,iscalar) = spinval(1,isqa,:)/2
        end if!iset_select==1
        write(scalarstring(iscalar),'(A,I0)') 'Spin_',isqa
      end do!isqa
    end if!lspin


    if(lcond)then
      allocate(dtmparr(nkpts_inp_all), dtmparr2(nkpts_inp_all), fvelabs(nkpts_inp_all), meanfreepath_sum(nkpts_inp_all), STAT=ierr)
      if(ierr/=0) stop 'Problem allocating dtmparr'

      do ikp=1,nkpts_inp_all
        fvelabs(ikp)= sqrt(sum(fermivel_2(:,ikp)**2))
        meanfreepath_sum(ikp) = sum(meanfreepath(1,:,ikp))
      end do!ikp

!     iscalar = iscalar+1
!     dtmparr = fermivel_2(1,:)**2*tau_avg/fvelabs
!     write(scalarstring(iscalar),'(A)') 'RTA'
!     do ikp=1,nkpts_vis_all
!       scalardata(ikp,iscalar) = dtmparr(vis2int(ikp))
!     end do!ikp

!     iscalar = iscalar+1
!     dtmparr = fermivel_2(1,:)**2*tauk/fvelabs
!     write(scalarstring(iscalar),'(A)') 'BE_noscin'
!     do ikp=1,nkpts_vis_all
!       scalardata(ikp,iscalar) = dtmparr(vis2int(ikp))
!     end do!ikp

!     iscalar = iscalar+1
!     dtmparr = fermivel_2(1,:)*meanfreepath(1,:)/fvelabs
!     write(scalarstring(iscalar),'(A)') 's_xx'
!     do ikp=1,nkpts_vis_all
!       scalardata(ikp,iscalar) = dtmparr(vis2int(ikp))
!     end do!ikp

!     iscalar = iscalar+1
!     dtmparr = fermivel_2(2,:)*meanfreepath(1,:)/fvelabs
!     write(scalarstring(iscalar),'(A)') 's_xy'
!     do ikp=1,nkpts_vis_all
!       scalardata(ikp,iscalar) = dtmparr(vis2int(ikp))
!     end do!ikp

!     iscalar  = iscalar+1
      dtmparr  = 0d0
      dtmparr2 = 0d0
      dtmparr  = fermivel_2(2,:)*meanfreepath_sum(:)/fvelabs
      dtmparr2 = fermivel_2(1,:)*meanfreepath_sum(:)/fvelabs
!     write(scalarstring(iscalar)  ,'(A)') 's_xy'
!     write(scalarstring(iscalar+1),'(A)') 'diff_s_xy'
!     write(scalarstring(iscalar+2),'(A)') 'log(diff_s_xy)'
      write(scalarstring(iscalar+1),'(A)') 'tauk'
!     write(scalarstring(iscalar+2),'(A)') 'tauk2'
!     write(scalarstring(iscalar+3),'(A)') 's_xx'
      do ikp=1,nkpts_vis_all
!       dtmp =  dtmparr(vis2int(ikp))
!       scalardata(ikp,iscalar) = dtmp

!       dtmp = (dtmparr(vis2int(ikp))+dtmparr(ipairs(vis2int(ikp))))/2
!       scalardata(ikp,iscalar+1) = dtmp
!       scalardata(ikp,iscalar+2) = sign(log10(abs(dtmp)+1),dtmp)
        scalardata(ikp,iscalar+1) = tauk(vis2int(ikp))
!       scalardata(ikp,iscalar+2) = tauk2(vis2int(ikp))
!       scalardata(ikp,iscalar+3) = dtmparr2(vis2int(ikp))

      end do!ikp

!     ivector  = ivector+1
!     vectorstring(ivector) = 'meanfreepath'
!     do ikp=1,nkpts_vis_all
!       vectordata(:,ikp,ivector) = meanfreepath(:,1,vis2int(ikp))
!     end do!ikp

!     iscalar = iscalar+1
!     dtmparr = tauk
!     write(scalarstring(iscalar),'(A)') 'tau_k'
!     do ikp=1,nkpts_vis_all
!       scalardata(ikp,iscalar) = dtmparr(vis2int(ikp))
!     end do!ikp

!     iscalar = iscalar+1
!     dtmparr = tauk2
!     write(scalarstring(iscalar),'(A)') 'tau_k2'
!     do ikp=1,nkpts_vis_all
!       scalardata(ikp,iscalar) = dtmparr(vis2int(ikp))
!     end do!ikp

!     iscalar = iscalar+1
!     dtmparr = tauk-tauk2
!     write(scalarstring(iscalar),'(A)') 'tau_k-tau_k2'
!     do ikp=1,nkpts_vis_all
!       scalardata(ikp,iscalar) = dtmparr(vis2int(ikp))
!     end do!ikp

    end if!lcond



    write(filename,'(A)') 'testfile.vtp'
    call write_pointdata_rot( trim(filename),nkpts,kpoints,   &
                            & nscalar,scalardata,scalarstring,&
                            & nvector,vectordata,vectorstring,&
                            & nsym,symmetries%rotmat,isym     )


contains


  subroutine read_condfile(ndegen,nkptin, kpoints, meanfreepath, fermivel, tauk, tauk2, tau_avg)
    implicit none

    integer, intent(in) :: ndegen, nkptin
    double precision, intent(out) :: tau_avg
    double precision, allocatable, intent(out) :: kpoints(:,:), meanfreepath(:,:,:), fermivel(:,:),tauk(:), tauk2(:)

    integer :: ierr, ikp, nkpts
    double precision :: dtmp
    character(len=80) :: dummyline
    integer, parameter :: iou=56153

    allocate( kpoints(3,nkptin), meanfreepath(3,ndegen,nkptin),fermivel(3,nkptin),tauk(nkptin), tauk2(nkptin), STAT=ierr )
    if(ierr/=0) stop 'error allocating arrays in read_condfile'
    
    open(unit=iou,file='output_lifetime',form='formatted',action='read')

    read(iou,*) dummyline, nkpts
    write(*,*) 'check:', nkpts
    if(nkpts/=nkptin) stop 'error in nkpts in file output_lifetime'
    read(iou,*) dummyline
    read(iou,'(A15,ES25.16)') dummyline, tau_avg
    write(*,*) 'check:', tau_avg
    read(iou,*) dummyline

    do ikp=1,nkpts
      read(iou,*) kpoints(:,ikp), fermivel(:,ikp), tauk(ikp), tauk2(ikp), meanfreepath(:,:,ikp)
!     read(iou,*) kpoints(:,ikp), fermivel(:,ikp), dtmp, tauk(ikp)
    end do

    close(iou)
  end subroutine read_condfile


  subroutine find_kpoint_pairs(nkpts,kpoints,ipairs)
    !find a pair of two k-points that are (nearly) related by a mirror symmetry
    implicit none

    integer, intent(in) :: nkpts
    double precision, intent(in) :: kpoints(3,nkpts)
    integer, intent(out) :: ipairs(nkpts)

    integer :: ikp1, ikp2
    double precision :: kpick(3), diff, diffmin

    !init
    ipairs=0

    do ikp1=1,nkpts
      if(mod(ikp1,1000)==0) write(*,'(A,I8,A,I8)') ' .. doing ', ikp1, ' of ', nkpts
!     if(ipairs(ikp1)>0) cycle

      !pick a k-point
      kpick=kpoints(:,ikp1)

      !apply mirror symmetry
      kpick(2) = -kpick(2)

      !find the closest k-point
      diffmin=1e12
      do ikp2=1,nkpts

        diff=sum((kpoints(:,ikp2)-kpick)**2)
        if(diff<diffmin)then
          diffmin=diff
          ipairs(ikp1)=ikp2
        end if!diff<diffmin

      end do!ikp2
      write(93,*) sqrt(diffmin)

    end do!ikp1

    if(any(ipairs==0)) stop 'something went wrong in find_kpoint_pairs'

  end subroutine find_kpoint_pairs



end program visdata