DIPOLE_orbital_magnetization_cd.F Source File


Source Code

!
! License-Identifier: GPL
!
! Copyright (C) 2019 The Yambo Team
!
! Authors (see AUTHORS file for details): DS
!
subroutine Dipole_orbital_magnetization_cd(Xen,Xk,Dip)
 !
 ! This routine returns <L>
 !
 use pars,                ONLY:SP,cI
 use LIVE_t,              ONLY:live_timing
 use electrons,           ONLY:levels,n_sp_pol
 use parallel_m,          ONLY:PAR_IND_DIPk_ibz,PAR_DIPk_ibz_index
 use vec_operate,         ONLY:cross_product
 use R_lattice,           ONLY:bz_samp
 use DIPOLES,             ONLY:DIP_iR,DIP_orbital,DIPOLE_t,DIP_v
 use parallel_m,          ONLY:PAR_IND_DIPk_ibz,PAR_DIPk_ibz_index,PAR_IND_DIPk_ibz_ID,&
&                              PAR_IND_VAL_BANDS_DIP,PAR_IND_VAL_BANDS_DIP_ID,&
&                              PAR_IND_CON_BANDS_DIP,PAR_IND_CON_BANDS_DIP_ID
 use timing_m,            ONLY:timing
 !
 implicit none
 !
 type(levels),  intent(in)    :: Xen
 type(bz_samp), intent(in)    :: Xk
 type(DIPOLE_t),intent(inout) :: Dip
 !
 ! Work Space
 !
 integer                      :: ik,ic,iv,ib,i_sp_pol,n_LT_steps,ik_mem
 complex(SP)                  :: DIP_x_loc(3),DIP_v_loc(3)
 !
 call timing("DIPOLE_orbital_M_CD",OPR="start")
 !
 n_LT_steps=n_sp_pol*PAR_IND_DIPk_ibz%n_of_elements(PAR_IND_DIPk_ibz_ID+1)*&
&                    PAR_IND_VAL_BANDS_DIP%n_of_elements(PAR_IND_VAL_BANDS_DIP_ID+1)*&
&                    PAR_IND_CON_BANDS_DIP%n_of_elements(PAR_IND_CON_BANDS_DIP_ID+1)
 !
 if (n_LT_steps>0) call live_timing('Orbital magnetization (CD)',n_LT_steps)
 !
 ! Main loop over k in IBZ
 !
 do i_sp_pol=1,n_sp_pol
   !
   if (n_LT_steps==0) cycle
   ! 
   do ik=1,Xk%nibz
     !
     if (.not.PAR_IND_DIPk_ibz%element_1D(ik)) cycle 
     !
     ik_mem=PAR_DIPk_ibz_index(ik)
     ! 
     !> @var ib(1)  lowest valence, ib(2)     upper conduction
     !> @var ib_lim(1) top valence, ib_lim(2) bottom conduction
     !
     do iv=Dip%ib(1),Dip%ib_lim(1) 
       !
       if(.not.PAR_IND_VAL_BANDS_DIP%element_1D(iv)) cycle
       !
       do ic=max(iv,Dip%ib_lim(2)),Dip%ib(2)
         !
         if(.not.PAR_IND_CON_BANDS_DIP%element_1D(ic)) cycle
         !
         do ib=Dip%ib(1),Dip%ib(2)
           !
           ! conjg because of how cross_product is coded in mod_vec_operate.F
           DIP_x_loc(:)=conjg(-cI*DIP_iR(:,ib,iv,ik_mem,i_sp_pol))
           !
           DIP_v_loc(:)=DIP_v(:,ic,ib,ik_mem,i_sp_pol)
           !
           DIP_orbital(:,ic,iv,ik_mem,i_sp_pol,1)=&
&                   DIP_orbital(:,ic,iv,ik_mem,i_sp_pol,1)+cross_product(DIP_x_loc,DIP_v_loc)
           !
           ! DEBUG <
           !write(*,*) "[DIP] writing DIP_orbital(..,ic,iv,ik,,) values"
           ! DEBUG >
           !
         enddo
         !
         call live_timing(steps=1)
         !
       enddo    ! conduction band loop
     enddo      ! valence    band loop
     ! 
   enddo        ! sp_pol loop
   !
 enddo          ! k-points
 !
 call live_timing()
 !
 call timing("DIPOLE_orbital_M_CD",OPR="stop")
 !
end subroutine Dipole_orbital_magnetization_cd

📚 Documentation Pages
⏱️ Real-Time
🔗 Code API