LCOV - code coverage report
Current view: top level - src/68_dmft - m_hubbard_one.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 96.0 % 274 263
Test Date: 2026-11-08 08:00:28 Functions: 100.0 % 3 3
Branches: 57.7 % 664 383

             Branch data     Line data    Source code
       1                 :             : !!****m* ABINIT/m_hubbard_one
       2                 :             : !! NAME
       3                 :             : !!  m_hubbard_one
       4                 :             : !!
       5                 :             : !! FUNCTION
       6                 :             : !!
       7                 :             : !! Solve Anderson model with the density/density Hubbard one approximation
       8                 :             : !!
       9                 :             : !! COPYRIGHT
      10                 :             : !! Copyright (C) 2006-2026 ABINIT group (BAmadon)
      11                 :             : !! This file is distributed under the terms of the
      12                 :             : !! GNU General Public License, see ~abinit/COPYING
      13                 :             : !! or http://www.gnu.org/copyleft/gpl.txt .
      14                 :             : !!
      15                 :             : !! INPUTS
      16                 :             : !!
      17                 :             : !! OUTPUT
      18                 :             : !!
      19                 :             : !! SOURCE
      20                 :             : 
      21                 :             : #if defined HAVE_CONFIG_H
      22                 :             : #include "config.h"
      23                 :             : #endif
      24                 :             : 
      25                 :             : 
      26                 :             : #include "abi_common.h"
      27                 :             : 
      28                 :             : ! nvtx related macro definition
      29                 :             : #include "nvtx_macros.h"
      30                 :             : 
      31                 :             : MODULE m_hubbard_one
      32                 :             : 
      33                 :             : 
      34                 :             :  use defs_basis
      35                 :             : 
      36                 :             : #ifdef HAVE_GPU_MARKERS
      37                 :             :  use m_nvtx_data
      38                 :             : #endif
      39                 :             : 
      40                 :             :  implicit none
      41                 :             : 
      42                 :             :  private
      43                 :             : 
      44                 :             :  public :: hubbard_one
      45                 :             : !!***
      46                 :             : 
      47                 :             : contains
      48                 :             : 
      49                 :             : !!****f* m_hubbard_one/hubbard_one
      50                 :             : !! NAME
      51                 :             : !! hubbard_one
      52                 :             : !!
      53                 :             : !! FUNCTION
      54                 :             : !! Solve the hubbard one approximation
      55                 :             : !!
      56                 :             : !! COPYRIGHT
      57                 :             : !! Copyright (C) 1999-2026 ABINIT group (BAmadon)
      58                 :             : !! This file is distributed under the terms of the
      59                 :             : !! GNU General Public License, see ~abinit/COPYING
      60                 :             : !! or http://www.gnu.org/copyleft/gpl.txt .
      61                 :             : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt .
      62                 :             : !!
      63                 :             : !! INPUTS
      64                 :             : !!  cryst_struc
      65                 :             : !!  istep    =  step of iteration for DFT.
      66                 :             : !!  dft_occup
      67                 :             : !!  mpi_enreg=information about MPI parallelization
      68                 :             : !!  paw_dmft =  data for self-consistent DFT+DMFT calculations.
      69                 :             : !!
      70                 :             : !! OUTPUT
      71                 :             : !!  paw_dmft =  data for self-consistent DFT+DMFT calculations.
      72                 :             : !!
      73                 :             : !! NOTES
      74                 :             : !!
      75                 :             : !! SOURCE
      76                 :             : 
      77                 :         138 : subroutine hubbard_one(cryst_struc,green,hu,paw_dmft,pawprtvol,hdc,weiss)
      78                 :             : 
      79                 :             :  use defs_basis
      80                 :             :  use m_errors
      81                 :             :  use m_abicore
      82                 :             : 
      83                 :             :  use m_crystal, only : crystal_t
      84                 :             :  use m_green, only : green_type,init_green,destroy_green
      85                 :             :  use m_paw_dmft, only : paw_dmft_type
      86                 :             :  use m_oper, only : oper_type,init_oper,destroy_oper,print_oper
      87                 :             :  use m_matlu, only : matlu_type,sym_matlu, print_matlu, gather_matlu,&
      88                 :             : & diag_matlu,init_matlu,destroy_matlu,rotate_matlu,copy_matlu,slm2ylm_matlu
      89                 :             :  use m_hu, only : destroy_vee,hu_type,init_vee,rotatevee_hu,vee_type
      90                 :             :  use m_datafordmft, only : compute_levels
      91                 :             : 
      92                 :             : !Arguments ------------------------------------
      93                 :             : !scalars
      94                 :             : ! type(pawang_type), intent(in) :: pawang
      95                 :             :  type(crystal_t),intent(in) :: cryst_struc
      96                 :             :  type(green_type), intent(inout) :: green
      97                 :             :  type(paw_dmft_type), intent(in)  :: paw_dmft
      98                 :             :  type(hu_type), intent(inout) :: hu(cryst_struc%ntypat)
      99                 :             :  type(oper_type), intent(inout) :: hdc
     100                 :             :  integer, intent(in) :: pawprtvol
     101                 :             :  type(green_type), intent(inout) :: weiss
     102                 :             : 
     103                 :             : !Local variables ------------------------------
     104                 :             :  type  :: level2_type
     105                 :             :   integer, pointer :: repart(:,:) => null()
     106                 :             :   integer, contiguous, pointer :: ocp(:,:) => null()
     107                 :             :   integer, contiguous, pointer :: transition(:,:) => null()
     108                 :             :   integer, contiguous, pointer :: transition_m(:,:) => null()
     109                 :             :  end type level2_type
     110                 :             :  type  :: level1_type
     111                 :             :   real(dp), pointer :: config(:) => null()
     112                 :             :  end type level1_type
     113                 :             : ! scalars
     114                 :             :  character(len=500) :: message
     115                 :             :  integer :: iatom,ifreq,im,im1,isppol,ispinor,ispinor1
     116                 :             :  integer :: lpawu,mbandc,natom,ndim,nkpt,nspinor,nsppol,nsppol_imp,testblock,useylm
     117                 :             : ! complex(dp) :: g,g0,w
     118                 :             : ! arrays
     119                 :          69 :  complex(dp), allocatable :: Id(:,:,:,:)
     120                 :          69 :  type(matlu_type), allocatable :: eigvectmatlu(:)
     121                 :          69 :  type(matlu_type), allocatable :: udens_atoms(:)
     122                 :          69 :  type(oper_type)  :: energy_level
     123                 :          69 :  type(green_type) :: green_hubbard
     124                 :          69 :  type(matlu_type), allocatable :: level_diag(:)
     125                 :             :  complex(dp) :: omega_current
     126                 :          69 :  type(vee_type), allocatable :: vee_rotated(:)
     127                 :             : ! ************************************************************************
     128                 :          69 :  mbandc=paw_dmft%mbandc
     129                 :          69 :  nkpt=paw_dmft%nkpt
     130                 :          69 :  nsppol=paw_dmft%nsppol
     131                 :          69 :  natom=paw_dmft%natom
     132                 :          69 :  nspinor=paw_dmft%nspinor
     133                 :             : 
     134                 :             : 
     135                 :             : !Initialise for compiler
     136                 :          69 :  omega_current=czero
     137                 :             : 
     138                 :             : !======================================
     139                 :             : !Allocations: levels and eigenvectors
     140                 :             : !======================================
     141   [ -  +  +  -  :         509 :  ABI_MALLOC(level_diag,(natom))
          +  -  +  -  -  
             +  -  +  +  
                      + ]
     142   [ -  +  +  -  :         440 :  ABI_MALLOC(eigvectmatlu,(natom))
          -  +  -  +  +  
                      + ]
     143   [ -  +  +  -  :         440 :  ABI_MALLOC(udens_atoms,(natom))
          -  +  -  +  +  
                      + ]
     144                 :          69 :  call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu,level_diag)
     145                 :          69 :  call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu,eigvectmatlu)
     146                 :          69 :  call init_matlu(natom,2,1,paw_dmft%lpawu,udens_atoms)
     147         [ +  + ]:         371 :  do iatom=1,cryst_struc%natom
     148                 :         302 :    lpawu=paw_dmft%lpawu(iatom)
     149         [ +  + ]:         371 :    if(lpawu/=-1) then
     150   [ +  +  +  +  :        4301 :      level_diag(iatom)%mat=czero
                   +  + ]
     151                 :             :    end if
     152                 :             :  end do
     153                 :             : 
     154                 :          69 :  call init_oper(paw_dmft,energy_level,opt_ksloc=3)
     155                 :          69 :  call compute_levels(energy_level,hdc,paw_dmft)
     156                 :             : !!========================
     157                 :             : !!Get KS eigenvalues
     158                 :             : !!========================
     159                 :             : ! call init_oper(paw_dmft,energy_level,opt_ksloc=3)
     160                 :             : ! do iband=1,mbandc
     161                 :             : !   do ikpt=1,nkpt
     162                 :             : !     do isppol=1,nsppol
     163                 :             : !!      Take \epsilon_{nks}
     164                 :             : !!      ========================
     165                 :             : !       energy_level%ks(isppol,ikpt,iband,iband)=paw_dmft%eigen_dft(isppol,ikpt,iband)
     166                 :             : !     end do
     167                 :             : !   end do
     168                 :             : ! end do
     169                 :             : !
     170                 :             : !
     171                 :             : !!======================================================================
     172                 :             : !!Compute atomic levels from projection of \epsilon_{nks} and symetrize
     173                 :             : !!======================================================================
     174                 :             : ! call loc_oper(energy_level,paw_dmft,1)
     175                 :             : ! write(message,'(a,2x,a,f13.5)') ch10," == Print Energy levels before sym and only DFT"
     176                 :             : ! call wrtout(std_out,message,'COLL')
     177                 :             : ! call print_matlu(energy_level%matlu,natom,1)
     178                 :             : ! do iatom = 1 , natom
     179                 :             : !   lpawu=paw_dmft%lpawu(iatom)
     180                 :             : !   if(lpawu/=-1) then
     181                 :             : !     do isppol=1,nsppol
     182                 :             : !       do ispinor=1,nspinor
     183                 :             : !         do im1=1,2*lpawu+1
     184                 :             : !           energy_level%matlu(iatom)%mat(im1,im1,isppol,ispinor,ispinor)=&
     185                 :             : !&           energy_level%matlu(iatom)%mat(im1,im1,isppol,ispinor,ispinor)&
     186                 :             : !&           -hdc%matlu(iatom)%mat(im1,im1,isppol,ispinor,ispinor)-paw_dmft%fermie
     187                 :             : !         end do
     188                 :             : !       end do
     189                 :             : !     end do
     190                 :             : !!    write(std_out,*) "DC,fermie",hdc%matlu(iatom)%mat(1,1,1,1,1),paw_dmft%fermie
     191                 :             : !   end if
     192                 :             : ! end do ! natom
     193                 :             : ! call sym_matlu(cryst_struc,energy_level%matlu,pawang)
     194                 :             : !
     195                 :             : ! write(message,'(a,2x,a,f13.5)') ch10," == Print Energy levels for Fermi Level=",paw_dmft%fermie
     196                 :             : ! call wrtout(std_out,message,'COLL')
     197                 :             : !!call print_oper(energy_level,1,paw_dmft,1)
     198                 :             : ! call print_matlu(energy_level%matlu,natom,1)
     199                 :             : 
     200                 :             : !========================
     201                 :             : !Compute Weiss function
     202                 :             : !========================
     203   [ -  +  +  -  :         276 :  ABI_MALLOC(Id,(20,20,nspinor,nspinor))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     204         [ +  + ]:         371 :  do iatom = 1 , natom
     205                 :         302 :    lpawu=paw_dmft%lpawu(iatom)
     206         [ +  + ]:         371 :    if(lpawu/=-1) then
     207   [ +  +  +  +  :       41867 :      Id=czero
             +  +  +  + ]
     208         [ +  + ]:         486 :      do im=1,2*lpawu+1
     209         [ +  + ]:         893 :        do ispinor=1,nspinor
     210                 :         800 :          Id(im,im,ispinor,ispinor)=cone
     211                 :             :        end do
     212                 :             :      end do ! ib
     213                 :          93 :      ndim = 2*lpawu+1
     214         [ +  + ]:        5925 :      do ifreq=1,weiss%nw
     215         [ +  - ]:        5832 :        if(weiss%w_type=="imag") then
     216                 :        5832 :          omega_current=cmplx(zero,weiss%omega(ifreq),kind=dp)
     217         [ #  # ]:           0 :        else if(green%w_type=="real") then
     218                 :           0 :          omega_current=cmplx(weiss%omega(ifreq),zero,kind=dp)
     219                 :             :        end if
     220         [ +  + ]:       27613 :        do im=1,2*lpawu+1
     221         [ +  + ]:      115656 :          do im1=1,2*lpawu+1
     222         [ +  + ]:      240296 :            do isppol=1,nsppol
     223         [ +  + ]:      358880 :              do ispinor=1,nspinor
     224         [ +  + ]:      430616 :                do ispinor1=1,nspinor
     225                 :             :                  weiss%oper(ifreq)%matlu(iatom)%mat(im+(ispinor-1)*ndim,im1+(ispinor1-1)*ndim,isppol)=&
     226                 :             : &                 ( omega_current*Id(im,im1,ispinor,ispinor1) - &
     227                 :      300144 : &                 energy_level%matlu(iatom)%mat(im+(ispinor-1)*ndim,im1+(ispinor1-1)*ndim,isppol))
     228                 :             :                end do ! ispinor1
     229                 :             :              end do ! ispinor
     230                 :             :            end do ! isppol
     231                 :             :          end do ! im1
     232                 :             :        end do ! im
     233                 :             :      end do ! ifreq
     234                 :             :    end if ! lpawu
     235                 :             :  end do ! natom
     236         [ -  + ]:          69 :  ABI_FREE(Id)
     237                 :             : 
     238                 :             : !=================================================================
     239                 :             : !Diagonalizes atomic levels and keep eigenvectors in eigvectmatlu
     240                 :             : !=================================================================
     241                 :             : !if jpawu=0, rotatevee_hu will have no effect so it is not necessary to
     242                 :             : !have a single rotation matrix for up and dn spins.
     243                 :             : 
     244   [ +  +  +  + ]:          69 :  if(hu(1)%jpawu_zero.and.nsppol==2) nsppol_imp=2
     245   [ +  +  +  + ]:          69 :  if(.not.hu(1)%jpawu_zero.or.nsppol/=2) nsppol_imp=1
     246                 :             : !  Diagonalize energy levels
     247                 :          69 :  useylm=paw_dmft%dmft_blockdiag
     248         [ +  - ]:          69 :  if(useylm==1) call slm2ylm_matlu(energy_level%matlu,natom,paw_dmft,1,pawprtvol)
     249                 :          69 :  testblock=1
     250                 :           0 :  if(useylm==1) testblock=8
     251                 :             :  call diag_matlu(energy_level%matlu,level_diag,natom,prtopt=pawprtvol,eigvectmatlu=eigvectmatlu, &
     252                 :          69 :                & nsppol_imp=nsppol_imp,opt_real=1,test=testblock)
     253                 :             : 
     254                 :             : !  Use rotation matrix to rotate interaction
     255   [ -  +  +  -  :         440 :  ABI_MALLOC(vee_rotated,(natom))
          -  +  -  +  +  
                      + ]
     256                 :          69 :  call init_vee(paw_dmft,vee_rotated)
     257         [ -  + ]:          69 :  if(useylm==1) then
     258                 :           0 :    call rotatevee_hu(hu,paw_dmft,pawprtvol,eigvectmatlu,4,udens_atoms,vee_rotated)
     259                 :             :  else
     260                 :          69 :    call rotatevee_hu(hu,paw_dmft,pawprtvol,eigvectmatlu,1,udens_atoms,vee_rotated)
     261                 :             :  endif
     262                 :          69 :  call destroy_vee(paw_dmft,vee_rotated)
     263   [ +  -  +  +  :         371 :  ABI_FREE(vee_rotated)
             -  +  -  + ]
     264                 :             : !write(std_out,*)"udens after rotatevee", udens_atoms(1)%value
     265                 :          69 :  write(message,'(a,2x,a,f13.5)') ch10,&
     266                 :         138 : & " == Print Diagonalized Energy levels for Fermi Level=",paw_dmft%fermie
     267                 :          69 :  call wrtout(std_out,message,'COLL')
     268                 :          69 :  call print_matlu(level_diag,natom,1)
     269                 :             : 
     270                 :             : !  Print out
     271         [ +  + ]:          69 :  if(nspinor==2) then
     272                 :           2 :    write(message,'(a,2x,a,f13.5)') ch10,&
     273                 :           4 : &   " == Print weiss for small freq"
     274                 :           2 :    call wrtout(std_out,message,'COLL')
     275                 :           2 :    call print_matlu(weiss%oper(1)%matlu,natom,1)
     276                 :           2 :    write(message,'(a,2x,a,f13.5)') ch10,&
     277                 :           4 : &   " == Print weiss for large freq"
     278                 :           2 :    call wrtout(std_out,message,'COLL')
     279                 :           2 :    call print_matlu(weiss%oper(weiss%nw)%matlu,natom,1)
     280                 :             :  end if
     281                 :             : 
     282                 :             : !========================
     283                 :             : !Compute Green function
     284                 :             : !========================
     285                 :          69 :  call init_green(green_hubbard,paw_dmft,opt_oper_ksloc=2,wtype=green%w_type) ! initialize only matlu
     286                 :             : !write(std_out,*)"udens", udens_atoms(1)%value
     287                 :             : ! write(std_out,*)"levels",  level_diag(1)%mat
     288                 :          69 :  call green_atomic_hubbard(cryst_struc,green_hubbard,hu,level_diag,paw_dmft,udens_atoms)
     289                 :             : !call rotate_matlu(energy_level%matlu,natom,pawprtvol=3)
     290                 :             : !write(81,*) "I1",paw_dmft%omega_lo(1), real(green%oper(1)%matlu(1)%mat(1,1,1,1,1)),imag(green%oper(1)%matlu(1)%mat(1,1,1,1,1))
     291                 :             : !========================================================================
     292                 :             : !Rotate back Green function in the original basis before diagonalization
     293                 :             : !========================================================================
     294                 :             : !call print_matlu(level_diag,natom,1)
     295                 :             : !test scall rotate_matlu(level_diag,eigvectmatlu,natom,3)
     296                 :             : !todo_ab: add check here for back rotation
     297                 :             : !call print_matlu(level_diag,natom,1)
     298                 :          69 :  write(message,'(2a,f13.5)') ch10," == Green function before rotation"
     299                 :          69 :  call wrtout(std_out,message,'COLL')
     300                 :          69 :  call print_matlu(green_hubbard%oper(1)%matlu,natom,1)
     301         [ +  + ]:        5133 :  do ifreq=1,green_hubbard%nw
     302                 :        5064 :    call rotate_matlu(green_hubbard%oper(ifreq)%matlu,eigvectmatlu,natom,0)
     303         [ -  + ]:        5064 :    if(useylm==1) call slm2ylm_matlu(green_hubbard%oper(ifreq)%matlu,natom,paw_dmft,2,0)
     304                 :        5133 :    call copy_matlu(green_hubbard%oper(ifreq)%matlu,green%oper(ifreq)%matlu,natom)
     305                 :             :  end do
     306                 :          69 :  write(message,'(2a,f13.5)') ch10," == Green function after rotation"
     307                 :          69 :  call wrtout(std_out,message,'COLL')
     308                 :          69 :  call print_matlu(green%oper(1)%matlu,natom,1)
     309         [ +  + ]:          69 :  if(nspinor==2) then
     310                 :           2 :    write(message,'(a,2x,a,f13.5)') ch10,&
     311                 :           4 : &   " == Print green for small freq"
     312                 :           2 :    call wrtout(std_out,message,'COLL')
     313                 :           2 :    call print_matlu(green%oper(1)%matlu,natom,1)
     314                 :           2 :    write(message,'(a,2x,a,f13.5)') ch10,&
     315                 :           4 : &   " == Print green for large freq"
     316                 :           2 :    call wrtout(std_out,message,'COLL')
     317                 :           2 :    call print_matlu(green%oper(green%nw)%matlu,natom,1)
     318                 :             :  end if
     319                 :             : !do ifreq=1,paw_dmft%dmft_nwlo
     320                 :             : !g=green%oper(ifreq)%matlu(1)%mat(1,1,1,1,1)
     321                 :             : !g0=cone/weiss%oper(ifreq)%matlu(1)%mat(1,1,1,1,1)
     322                 :             : !w=cmplx(0.d0,paw_dmft%omega_lo(ifreq),kind=dp)
     323                 :             : !write(160,*) paw_dmft%omega_lo(ifreq),real(weiss%oper(ifreq)%matlu(1)%mat(1,1,1,1,1)),imag(weiss%oper(ifreq)%matlu(1)%mat(1,1,1,1,1))
     324                 :             : !write(161,*) paw_dmft%omega_lo(ifreq),real(green%oper(ifreq)%matlu(1)%mat(1,1,1,1,1) ),imag(green%oper(ifreq)%matlu(1)%mat(1,1,1,1,1) )
     325                 :             : !write(164,*) paw_dmft%omega_lo(ifreq),real(one/green%oper(ifreq)%matlu(1)%mat(1,1,1,1,1) ),imag(one/green%oper(ifreq)%matlu(1)%mat(1,1,1,1,1))
     326                 :             : !write(166,*) paw_dmft%omega_lo(ifreq),real(weiss%oper(ifreq)%matlu(1)%mat(1,1,1,1,1)-one/green%oper(ifreq)%matlu(1)%mat(1,1,1,1,1) ),imag(weiss%oper(ifreq)%matlu(1)%mat(1,1,1,1,1)-one/green%oper(ifreq)%matlu(1)%mat(1,1,1,1,1))
     327                 :             : !write(167,*) paw_dmft%omega_lo(ifreq),real((g-g0)/(g0*g)),imag((g-g0)/(g0*g))
     328                 :             : !write(168,*) paw_dmft%omega_lo(ifreq),real(1/g-w),imag(1/g-w)
     329                 :             : !write(169,*) paw_dmft%omega_lo(ifreq),real(1/g0-w),imag(1/g0-w)
     330                 :             : !write(170,*) paw_dmft%omega_lo(ifreq),w
     331                 :             : !write(171,*) paw_dmft%omega_lo(ifreq),real(1/g),imag(1/g)
     332                 :             : !write(172,*) paw_dmft%omega_lo(ifreq),real(w),imag(w)
     333                 :             : 
     334                 :             : !! voir si en faisant GG0/(G-G0) cela reduit l'erreur
     335                 :             : !enddo
     336                 :             : !call abi_abort('COLL')
     337                 :             : 
     338                 :             : 
     339                 :             : !write(message,'(2a,f13.5)') ch10," == Print Energy levels after diagonalisation"
     340                 :             : !call wrtout(std_out,message,'COLL')
     341                 :             : !call print_matlu(energy_level%matlu,natom,1)
     342                 :             : 
     343                 :             : !======================================
     344                 :             : !Deallocations and destroys
     345                 :             : !======================================
     346                 :          69 :  call destroy_green(green_hubbard)
     347                 :          69 :  call destroy_oper(energy_level)
     348                 :          69 :  call destroy_matlu(level_diag,natom)
     349                 :          69 :  call destroy_matlu(udens_atoms,natom)
     350                 :          69 :  call destroy_matlu(eigvectmatlu,natom)
     351   [ +  -  +  +  :         371 :  ABI_FREE(level_diag)
             -  +  -  + ]
     352   [ +  -  +  +  :         371 :  ABI_FREE(eigvectmatlu)
             -  +  -  + ]
     353   [ +  -  +  +  :         371 :  ABI_FREE(udens_atoms)
          -  +  -  +  -  
          +  -  -  -  -  
          -  +  -  +  -  
          -  -  -  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  -  -  -  
          -  -  -  -  -  
          -  -  +  -  -  
          -  -  -  -  -  
          -  -  -  -  +  
          -  -  -  -  -  
          -  -  -  -  -  
          -  +  -  -  -  
                -  -  + ]
     354                 :             : !!***
     355                 :             : 
     356                 :             : contains
     357                 :             : 
     358                 :             : !!****f* m_hubbard_one/green_atomic_hubbard
     359                 :             : !! NAME
     360                 :             : !! green_atomic_hubbard
     361                 :             : !!
     362                 :             : !! FUNCTION
     363                 :             : !!
     364                 :             : !!
     365                 :             : !! COPYRIGHT
     366                 :             : !! Copyright (C) 1999-2026 ABINIT group (BAmadon)
     367                 :             : !! This file is distributed under the terms of the
     368                 :             : !! GNU General Public License, see ~abinit/COPYING
     369                 :             : !! or http://www.gnu.org/copyleft/gpl.txt .
     370                 :             : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt .
     371                 :             : !!
     372                 :             : !! INPUTS
     373                 :             : !!  cryst_struc
     374                 :             : !!  istep    =  step of iteration for DFT.
     375                 :             : !!  dft_occup
     376                 :             : !!  mpi_enreg=information about MPI parallelization
     377                 :             : !!  paw_dmft =  data for self-consistent DFT+DMFT calculations.
     378                 :             : !!  pawang <type(pawang)>=paw angular mesh and related data
     379                 :             : !!
     380                 :             : !! OUTPUT
     381                 :             : !!  paw_dmft =  data for self-consistent DFT+DMFT calculations.
     382                 :             : !!
     383                 :             : !! NOTES
     384                 :             : !!
     385                 :             : !! SOURCE
     386                 :             : 
     387                 :         138 : subroutine green_atomic_hubbard(cryst_struc,green_hubbard,hu,level_diag,paw_dmft,udens_atoms)
     388                 :             : 
     389                 :             : 
     390                 :          69 :  use defs_basis
     391                 :             :  use m_errors
     392                 :             :  use m_abicore
     393                 :             :  use m_crystal, only : crystal_t
     394                 :             :  use m_special_funcs,  only : factorial, permutations
     395                 :             :  use m_green, only : green_type,init_green,destroy_green
     396                 :             :  use m_hu, only : hu_type
     397                 :             :  use m_paw_dmft, only : paw_dmft_type
     398                 :             : 
     399                 :             : !Arguments ------------------------------------
     400                 :             : !scalars
     401                 :             : ! type(pawang_type), intent(in) :: pawang
     402                 :             :  type(crystal_t),intent(in) :: cryst_struc
     403                 :             :  type(green_type), intent(inout) :: green_hubbard
     404                 :             :  type(paw_dmft_type), intent(in)  :: paw_dmft
     405                 :             :  type(matlu_type),intent(in) :: level_diag(cryst_struc%natom)
     406                 :             :  type(hu_type), intent(inout) :: hu(cryst_struc%ntypat)
     407                 :             :  type(matlu_type),intent(in) :: udens_atoms(cryst_struc%natom)
     408                 :             : 
     409                 :             : !Local variables ------------------------------
     410                 :             : ! scalars
     411                 :             :  integer :: cnk,iacc,iatom,iconfig,ielec,ifreq,ilevel,im,im1,isppol,ispinor,itrans,jconfig,jelec
     412                 :             :  integer :: lpawu,m_temp,nconfig,ndim,nelec,nlevels,nspinor,nsppol,occupied_level,sum_test,gpu_option
     413                 :             :  integer :: nconfig_next
     414                 :          69 :  integer, allocatable :: occup(:,:),nconfig_nelec(:)
     415                 :             :  character(len=500) :: message
     416                 :          69 :  integer, contiguous, pointer :: ocp(:,:),ocp_next(:,:),transition(:,:),transition_m(:,:)
     417                 :             : ! arrays
     418                 :          69 :  type(green_type) :: green_hubbard_realw
     419                 :          69 :  type(level2_type), allocatable :: occ_level(:)
     420                 :          69 :  type(level1_type), allocatable :: e_nelec(:)
     421                 :          69 :  complex(dp), allocatable :: green_temp(:,:)
     422                 :          69 :  complex(dp), allocatable :: green_temp_realw(:,:)
     423                 :             :  complex(dp) :: Z_part
     424                 :          69 :  real(dp), allocatable :: maxener(:),minener(:)
     425                 :          69 :  real(dp), allocatable :: elevels(:)
     426                 :             :  real(dp) :: emax,emin,eshift,prtopt, Ej_np1, Ei_n,beta,maxarg_exp,tmp
     427                 :             : !************************************************************************
     428                 :             :    ABI_NVTX_START_RANGE(NVTX_DMFT_HUBBARD_ONE)
     429                 :          69 :    maxarg_exp=300
     430                 :             : 
     431                 :             : !  hu is not used anymore.
     432                 :             :    if(hu(1)%lpawu==0) then
     433                 :             :    end if
     434                 :             : !  ======================================
     435                 :             : !  General loop over atoms
     436                 :             : !  ======================================
     437                 :          69 :    nsppol=paw_dmft%nsppol
     438                 :          69 :    nspinor=paw_dmft%nspinor
     439                 :          69 :    prtopt=1
     440                 :          69 :    beta=one/paw_dmft%temp
     441                 :          69 :    call init_green(green_hubbard_realw,paw_dmft,opt_oper_ksloc=2,wtype=green_hubbard%w_type) ! initialize only matlu
     442                 :          69 :    gpu_option=paw_dmft%gpu_option
     443                 :             : 
     444         [ +  + ]:         371 :    do iatom=1,cryst_struc%natom
     445                 :         302 :      lpawu=paw_dmft%lpawu(iatom)
     446         [ +  + ]:         371 :      if(lpawu/=-1) then
     447                 :          93 :        nlevels=nsppol*nspinor*(2*lpawu+1)
     448         [ +  + ]:          93 :        if(nsppol==1.and.nspinor==1) nlevels=2*nspinor*(2*lpawu+1)
     449                 :             : 
     450                 :             : !      ===================================
     451                 :             : !      Allocations
     452                 :             : !      ===================================
     453   [ -  +  +  -  :        1158 :        ABI_MALLOC(occ_level,(0:nlevels))
          +  -  +  -  -  
             +  -  +  +  
                      + ]
     454   [ -  +  +  -  :         279 :        ABI_MALLOC(maxener,(0:nlevels))
          +  -  +  -  -  
                +  -  + ]
     455   [ -  +  +  -  :         186 :        ABI_MALLOC(minener,(0:nlevels))
             -  +  -  + ]
     456   [ -  +  +  -  :         279 :        ABI_MALLOC(elevels,(nlevels))
          +  -  +  -  -  
                +  -  + ]
     457   [ -  +  +  -  :        1158 :        ABI_MALLOC(e_nelec,(0:nlevels))
          +  -  +  -  -  
             +  -  +  +  
                      + ]
     458         [ +  + ]:         972 :        do nelec=0,nlevels ! number of electrons
     459                 :         879 :          cnk=nint(permutations(nlevels,nelec)/factorial(nelec))
     460   [ -  +  +  -  :        3516 :          ABI_MALLOC(occ_level(nelec)%repart      ,(cnk,nelec))
          +  +  +  -  +  
          -  +  +  -  +  
                   -  + ]
     461   [ -  +  +  -  :        3516 :          ABI_MALLOC(occ_level(nelec)%ocp         ,(cnk,nlevels))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     462   [ -  +  +  -  :        3516 :          ABI_MALLOC(occ_level(nelec)%transition  ,(cnk,nlevels-nelec))
          +  +  +  -  +  
          -  +  +  -  +  
                   -  + ]
     463   [ -  +  +  -  :        2637 :          ABI_MALLOC(occ_level(nelec)%transition_m,(cnk,nlevels))
          -  +  +  -  -  
                +  -  + ]
     464   [ -  +  +  -  :        2637 :          ABI_MALLOC(e_nelec  (nelec)%config      ,(cnk))
          +  -  +  -  -  
                +  -  + ]
     465         [ +  + ]:      119244 :          e_nelec(nelec)%config(:)=zero
     466                 :             : !        write(std_out,*) "permutations",nint(permutations(nlevels,nelec)/factorial(nelec))
     467                 :             : !        write(std_out,*) "size",size(occ_level),size(occ_level(nelec)%repart,1)
     468                 :             : !        write(std_out,*) "size",size(occ_level),size(occ_level(nelec)%repart,2)
     469                 :             : !        for a given nb of electrons nelec, gives for a given repartition
     470                 :             : !        of electron, the position of the ielec electron inside atomic
     471                 :             : !        levels
     472                 :             : !        levels
     473                 :             :        end do
     474   [ -  +  +  -  :         372 :        ABI_MALLOC(occup,(0:nlevels,nlevels))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     475   [ -  +  +  -  :         279 :        ABI_MALLOC(nconfig_nelec,(0:nlevels))
          +  -  +  -  -  
                +  -  + ]
     476                 :             : 
     477                 :             : !      ===================================
     478                 :             : !      Initialization
     479                 :             : !      ===================================
     480         [ +  + ]:         972 :        nconfig_nelec=0
     481                 :          93 :        nconfig=1
     482   [ +  +  +  + ]:        8789 :        occup=0
     483                 :          93 :        nconfig_nelec(0)=1
     484         [ +  + ]:         879 :        occup(0,:)=0
     485                 :         879 :        iacc=0
     486         [ +  + ]:         879 :        elevels=zero
     487                 :             :        ndim=2*lpawu+1
     488         [ +  + ]:         237 :        do isppol=1,nsppol
     489         [ +  + ]:         383 :          do ispinor=1,nspinor
     490         [ +  + ]:         956 :            do im1=1,(2*lpawu+1)
     491                 :         666 :              iacc=iacc+1
     492                 :         666 :              elevels(iacc)=level_diag(iatom)%mat(im1+(ispinor-1)*ndim,im1+(ispinor-1)*ndim,isppol)
     493         [ -  + ]:         666 :              if(abs(aimag(level_diag(iatom)%mat(im1+(ispinor-1)*ndim,im1+(ispinor-1)*ndim,isppol)))>tol8) then
     494                 :           0 :                message = " Hubbard I: levels are imaginary"
     495                 :           0 :                write(std_out,*) level_diag(iatom)%mat(im1+(ispinor-1)*ndim,im1+(ispinor-1)*ndim,isppol)
     496                 :           0 :                ABI_BUG(message)
     497                 :             :              end if
     498         [ +  + ]:         812 :              if(nsppol==1.and.nspinor==1) then
     499                 :         120 :                elevels(nspinor*(2*lpawu+1)+iacc)=level_diag(iatom)%mat(im1+(ispinor-1)*ndim,im1+(ispinor-1)*ndim,isppol)
     500                 :             :              end if
     501                 :             : !            ! change it by: real(level_diag) with warning
     502                 :             :            end do
     503                 :             :          end do
     504                 :             :        end do
     505                 :             : 
     506                 :             : !      ===================================
     507                 :             : !      Compute possible occupations
     508                 :             : !      ===================================
     509                 :             : !      Value for nelec=0:
     510                 :             :        nconfig_nelec(0)=1
     511         [ +  + ]:         879 :        occ_level(0)%ocp(1,:)=0
     512                 :             : !      Loop on possible occupation of levels with nelec
     513         [ +  + ]:         879 :        do nelec=1,nlevels ! number of electrons
     514                 :             : !        write(message,'(2a,i3,a)') ch10," For number of electrons",  &
     515                 :             : !        &       nelec," positions of electrons are:"
     516                 :             : !        call wrtout(std_out,message,'COLL')
     517                 :             : !        write(std_out,*) "nelec",nelec
     518                 :             : !        write(std_out,*) "nlevels",nlevels
     519                 :         786 :          call combin(1,nconfig,nconfig_nelec,nelec,nlevels,occ_level,occup)
     520         [ -  + ]:         786 :          if(nconfig_nelec(nelec)/=nint(permutations(nlevels,nelec)/factorial(nelec))) then
     521                 :           0 :            message = " BUG in hubbard_one/combin"
     522                 :           0 :            ABI_BUG(message)
     523                 :             :          end if
     524   [ +  +  +  + ]:     1441748 :          occ_level(nelec)%ocp=zero
     525         [ +  + ]:      119058 :          do iconfig=1,nconfig_nelec(nelec)
     526         [ +  + ]:      836277 :            do ielec=1,nelec
     527                 :             : !            occ_level%repart: gives the place of electron ielec for the configuration iconfig (among the config for the total number of electron nelec
     528                 :      717312 :              occupied_level=occ_level(nelec)%repart(iconfig,ielec)
     529                 :             : !            occ_level%ocp: gives if level occupied_level is occupied or not
     530                 :      835491 :              occ_level(nelec)%ocp(iconfig,occupied_level)=1
     531                 :             :            end do
     532                 :             :          end do
     533                 :             :        end do
     534                 :             : 
     535                 :             : !      ===================================
     536                 :             : !      Print possible occupations
     537                 :             : !      ===================================
     538                 :             :        if(prtopt>3) then
     539                 :             :          do nelec=0,nlevels ! number of electrons f
     540                 :             :            write(message,'(2a,i3,2a,i5,a)') ch10," For",nelec," electrons, ", &
     541                 :             : &           "there are ",nconfig_nelec(nelec)," repartitions which are:"
     542                 :             :            call wrtout(std_out,message,'COLL')
     543                 :             :            do iconfig=1,nconfig_nelec(nelec)
     544                 :             :              write(message,'(40i4)') (occ_level(nelec)%ocp(iconfig,ilevel),ilevel=1,nlevels),&
     545                 :             : &             (occ_level(nelec)%repart(iconfig,ielec),ielec=1,nelec)
     546                 :             :              call wrtout(std_out,message,'COLL')
     547                 :             :            end do
     548                 :             :          end do
     549                 :             :        end if
     550                 :             : 
     551                 :             : !      ============================================
     552                 :             : !      Compute energy for each of the occupations
     553                 :             : !      ============================================
     554         [ +  + ]:         972 :        do nelec=0,nlevels !
     555         [ +  + ]:      119151 :          e_nelec(nelec)%config=zero
     556         [ +  + ]:      119151 :          do iconfig=1,nconfig_nelec(nelec)
     557                 :             : !          First compute energy level contribution
     558         [ +  + ]:      835584 :            do ielec=1,nelec
     559                 :             :              e_nelec(nelec)%config(iconfig)= e_nelec(nelec)%config(iconfig) &
     560                 :      835584 : &             + elevels(occ_level(nelec)%repart(iconfig,ielec))
     561                 :             :            end do
     562                 :             : !          write(std_out,*) "Nelec",nelec,"iconfig",iconfig,"eleve",e_nelec(nelec)%config(iconfig)
     563                 :             : 
     564                 :             : !          Second: Compute interaction part
     565                 :             : !          do ielec=1,nelec-1 ! compute interaction among the nelec electrons in the configuration iconfig
     566                 :             : !          e_nelec(nelec)%config(iconfig)= e_nelec(nelec)%config(iconfig)   &
     567                 :             : !          &             + hu(cryst_struc%typat(iatom))%udens(occ_level(nelec)%repart(iconfig,ielec), &
     568                 :             : !          &               occ_level(nelec)%repart(iconfig,ielec+1))
     569                 :             : !          enddo
     570         [ +  + ]:      836463 :            do ielec=1,nelec ! compute interaction among the nelec electrons in the configuration iconfig
     571         [ +  + ]:     5682944 :              do jelec=1,nelec
     572                 :             :                e_nelec(nelec)%config(iconfig)= e_nelec(nelec)%config(iconfig)   &
     573                 :             : !              &               + hu(cryst_struc%typat(iatom))%udens(occ_level(nelec)%repart(iconfig,ielec), &
     574                 :             : &               + dble(udens_atoms(iatom)%mat(occ_level(nelec)%repart(iconfig,ielec), &
     575                 :     5564672 : &               occ_level(nelec)%repart(iconfig,jelec),1))/2.d0 ! udens(i,i)=0
     576                 :             : !              write(std_out,*) ielec,occ_level(nelec)%repart(iconfig,ielec)
     577                 :             : !              write(std_out,*) jelec,occ_level(nelec)%repart(iconfig,jelec)
     578                 :             : !              write(std_out,*)hu(cryst_struc%typat(iatom))%udens(occ_level(nelec)%repart(iconfig,ielec), &
     579                 :             : !              &                occ_level(nelec)%repart(iconfig,jelec))/2.d0
     580                 :             :              end do ! jelec
     581                 :             :            end do ! ielec
     582                 :             : !          write(std_out,*) "Nelec",nelec,"iconfig",iconfig,"ecorr",e_nelec(nelec)%config(iconfig)
     583                 :             : 
     584                 :             :          end do ! iconfig
     585   [ +  -  -  +  :      120030 :          maxener(nelec)=maxval(-e_nelec(nelec)%config(:))
             -  -  +  + ]
     586   [ +  -  -  +  :      120123 :          minener(nelec)=minval(-e_nelec(nelec)%config(:))
             -  -  +  + ]
     587                 :             :        end do
     588                 :             : !      write(std_out,*) "maxener", maxener(:)
     589   [ +  -  -  +  :        1065 :        emax=maxval(maxener(:))
             -  -  +  + ]
     590                 :             :        emin=minval(minener(:))
     591                 :             :        eshift=zero
     592                 :          93 :        eshift=emax/two
     593                 :          93 :        eshift=emax-maxarg_exp/beta
     594                 :             : !      eshift=emax
     595                 :             : !      write(std_out,*)"emax",emax
     596                 :             : !      write(std_out,*)"emin",emin
     597                 :             : !      write(std_out,*)"eshift",eshift
     598                 :          93 :        write(message,'(a,3x,3a,3x,a)') ch10," Hubbard I: Energies as a", &
     599                 :          93 : &       " function of number of electrons",ch10,&
     600                 :         186 : &       "     Nelec     Min. Ene.       Max. Ener."
     601                 :          93 :        call wrtout(std_out,message,'COLL')
     602         [ +  + ]:         972 :        do nelec=0,nlevels
     603                 :         879 :          write(message,'(3x,a,i4,2f17.7)') "HI", nelec,&
     604   [ +  -  -  +  :      240060 : &         minval(e_nelec(nelec)%config(:)),maxval(e_nelec(nelec)%config(:))
          -  -  +  +  +  
          -  -  +  -  -  
                   +  + ]
     605                 :         972 :          call wrtout(std_out,message,'COLL')
     606                 :             :        end do
     607                 :             : 
     608                 :             : !      ===================================
     609                 :             : !      Print possibles occupations
     610                 :             : !      ===================================
     611                 :             :        if(prtopt>3) then
     612                 :             :          do nelec=0,nlevels ! number of electrons
     613                 :             :            write(message,'(2a,i3,2a,i5,3a)') ch10," For",nelec," electrons, ", &
     614                 :             : &           "there are ",nconfig_nelec(nelec)," repartitions which are :", &
     615                 :             : &           ch10,"Energy and Occupations"
     616                 :             :            call wrtout(std_out,message,'COLL')
     617                 :             :            do iconfig=1,nconfig_nelec(nelec)
     618                 :             :              write(message,'(f12.6,20i4)') e_nelec(nelec)%config(iconfig),&
     619                 :             : &             (occ_level(nelec)%repart(iconfig,ielec),ielec=1,nelec)
     620                 :             :              call wrtout(std_out,message,'COLL')
     621                 :             :            end do
     622                 :             :          end do
     623                 :             :        end if
     624                 :             : 
     625                 :             : !      sum_test=zero
     626                 :             : !      do ielec=1,nelec+1
     627                 :             : !      sum_test = sum_test + (occ_level(nelec)%repart(iconfig,ielec)  &
     628                 :             : !      &              -occ_level(nelec)%repart(iconfig,ielec))
     629                 :             : !      enddo
     630                 :             : !      ===================================
     631                 :             : !      Built transitions between configurations
     632                 :             : !      ===================================
     633         [ +  + ]:         879 :        do nelec=0,nlevels-1
     634                 :             : 
     635                 :             : 
     636                 :             : 
     637                 :         786 :          nconfig      = nconfig_nelec(nelec)
     638                 :         786 :          nconfig_next = nconfig_nelec(nelec+1)
     639                 :         786 :          transition   => occ_level(nelec)%transition
     640                 :         786 :          transition_m => occ_level(nelec)%transition_m
     641                 :         786 :          ocp          => occ_level(nelec)%ocp
     642                 :         786 :          ocp_next     => occ_level(nelec+1)%ocp
     643                 :             : 
     644         [ +  - ]:         786 :          if(gpu_option==ABI_GPU_DISABLED) then
     645                 :             :            !$OMP PARALLEL DO PRIVATE(iconfig,jconfig,itrans,sum_test,m_temp)
     646         [ +  + ]:      118965 :            do iconfig=1,nconfig
     647                 :             :              itrans=0 ! transition from iconfig
     648         [ +  + ]:   158149325 :              do jconfig=1, nconfig_next
     649                 :   158030360 :                sum_test=0
     650         [ +  + ]:  2337281800 :                do ilevel=1,nlevels
     651                 :             :   !              test if their is one electron added to the starting configuration
     652                 :             :                  sum_test=sum_test + &
     653                 :  2179251440 :   &               (ocp_next(jconfig,ilevel)-ocp(iconfig,ilevel))**2
     654                 :             :   !              save the level for the electron added
     655   [ +  +  +  + ]:  2337281800 :                  if(ocp_next(jconfig,ilevel)==1.and.ocp(iconfig,ilevel)==0) then
     656                 :  2179251440 :                    m_temp=ilevel
     657                 :             :                  end if
     658                 :             :                end do ! ilevel
     659         [ +  + ]:   158148539 :                if(sum_test==1) then
     660                 :      717312 :                  itrans=itrans+1
     661                 :             :                  !if(itrans>nlevels-nelec) then
     662                 :             :                  !  write(message,'(a,4i4)') "BUG: itrans is to big in hubbard_one",itrans,iconfig,jconfig,ilevel
     663                 :             :                  !  call wrtout(std_out,message,'COLL')
     664                 :             :                  !end if
     665                 :      717312 :                  transition(iconfig,itrans)=jconfig  ! jconfig=config(n+1) obtained after transition
     666                 :      717312 :                  transition_m(iconfig,itrans)=m_temp  !  level to fill to do the transition
     667                 :             :                end if
     668                 :             :              end do ! jconfig
     669                 :             :            end do ! iconfig
     670                 :             :          else if(gpu_option==ABI_GPU_OPENMP) then
     671                 :             : #ifdef HAVE_OPENMP_OFFLOAD
     672                 :             :            !$OMP TARGET PARALLEL DO PRIVATE(iconfig,jconfig,itrans,sum_test,m_temp) &
     673                 :             :            !$OMP MAP(tofrom:transition,transition_m) MAP(to:ocp,ocp_next)
     674                 :             :            do iconfig=1,nconfig
     675                 :             :              itrans=0 ! transition from iconfig
     676                 :             :              do jconfig=1, nconfig_next
     677                 :             :                sum_test=0
     678                 :             :                do ilevel=1,nlevels
     679                 :             :   !              test if their is one electron added to the starting configuration
     680                 :             :                  sum_test=sum_test + &
     681                 :             :   &               (ocp_next(jconfig,ilevel)-ocp(iconfig,ilevel))**2
     682                 :             :   !              save the level for the electron added
     683                 :             :                  if(ocp_next(jconfig,ilevel)==1.and.ocp(iconfig,ilevel)==0) then
     684                 :             :                    m_temp=ilevel
     685                 :             :                  end if
     686                 :             :                end do ! ilevel
     687                 :             :                if(sum_test==1) then
     688                 :             :                  itrans=itrans+1
     689                 :             :                  !if(itrans>nlevels-nelec) then
     690                 :             :                  !  write(message,'(a,4i4)') "BUG: itrans is to big in hubbard_one",itrans,iconfig,jconfig,ilevel
     691                 :             :                  !  call wrtout(std_out,message,'COLL')
     692                 :             :                  !end if
     693                 :             :                  transition(iconfig,itrans)=jconfig  ! jconfig=config(n+1) obtained after transition
     694                 :             :                  transition_m(iconfig,itrans)=m_temp  !  level to fill to do the transition
     695                 :             :                end if
     696                 :             :              end do ! jconfig
     697                 :             :            end do ! iconfig
     698                 :             : #endif
     699                 :             :          end if
     700                 :             : 
     701                 :             : 
     702                 :             : 
     703                 :          93 :          if(prtopt>3) then
     704                 :             :            do iconfig=1,nconfig
     705                 :             :              write(std_out,'(a,2i5,a,18i5)') "occ_level", nelec,&
     706                 :             : &             iconfig,"  :",(transition(iconfig,itrans),itrans=1,nlevels-nelec)
     707                 :             :              write(std_out,'(a,2i5,a,18i5)') "electron added", nelec,iconfig,&
     708                 :             : &             "  :",(transition_m(iconfig,itrans),itrans=1,nlevels-nelec)
     709                 :             :            end do
     710                 :             :          end if
     711                 :             : 
     712                 :             :        end do ! nelec
     713                 :             : 
     714                 :             : !      ===================================
     715                 :             : !      Built Partition Function
     716                 :             : !      ===================================
     717                 :          93 :        Z_part=czero
     718                 :             : !      do nelec=1,nlevels-1
     719         [ +  + ]:         972 :        do nelec=0,nlevels
     720         [ +  + ]:      119244 :          do iconfig=1,nconfig_nelec(nelec)
     721                 :      118272 :            Ei_n    = e_nelec  (nelec  )%config(iconfig) + eshift
     722                 :      119151 :            Z_part=Z_part+dexp(-Ei_n*beta)
     723                 :             : !          write(std_out,*) "fonction de partition",nelec,iconfig, Z_part,Ei_n*beta,Ei_n,eshift
     724                 :             :          end do
     725                 :             :        end do
     726                 :             : !      write(std_out,*) "Z_part",Z_part
     727                 :             : 
     728                 :             : !      ===================================
     729                 :             : !      Built Green Function
     730                 :             : !      ===================================
     731   [ -  +  +  -  :         372 :        ABI_MALLOC(green_temp,(green_hubbard%nw,nlevels))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     732   [ -  +  +  -  :         279 :        ABI_MALLOC(green_temp_realw,(green_hubbard%nw,nlevels))
          -  +  +  -  -  
                +  -  + ]
     733                 :             : !      For each freq.
     734                 :             : 
     735   [ +  +  +  + ]:       44255 :        green_temp=czero
     736   [ +  +  +  + ]:       44255 :        green_temp_realw=czero
     737                 :          93 :        tmp=zero
     738         [ +  + ]:         879 :        do nelec=0,nlevels-1
     739                 :             : !        write(std_out,*) "For nelec    =",nelec
     740         [ +  + ]:      119058 :          do iconfig=1,nconfig_nelec(nelec)
     741                 :             : !          write(std_out,*) "The config nb:",iconfig
     742         [ +  + ]:      836277 :            do itrans=1,nlevels-nelec
     743                 :      717312 :              jconfig = occ_level(nelec  )%transition(iconfig,itrans)
     744                 :      717312 :              m_temp  = occ_level(nelec  )%transition_m(iconfig,itrans)
     745                 :      717312 :              Ej_np1  = e_nelec  (nelec+1)%config(jconfig) + eshift
     746                 :      717312 :              Ei_n    = e_nelec  (nelec  )%config(iconfig) + eshift
     747                 :             : !            write(std_out,'(a,i4,a)') "Transition nb:",itrans,"involve"
     748                 :             : !            write(std_out,'(a,i4,a)') "                        jconfig=",jconfig
     749                 :             : !            write(std_out,'(a,i4,a)') "                        m_temp=",m_temp
     750         [ +  + ]:    39909283 :              do ifreq=1,green_hubbard%nw
     751         [ +  - ]:    39073792 :                if(green_hubbard%w_type=="imag") then
     752                 :    39073792 :                  omega_current=cmplx(zero,green_hubbard%omega(ifreq),kind=dp)
     753         [ #  # ]:           0 :                else if(green_hubbard%w_type=="real") then
     754                 :           0 :                  omega_current=cmplx(green_hubbard%omega(ifreq),zero,kind=dp)
     755                 :             :                end if
     756                 :             :                green_temp(ifreq,m_temp)=green_temp(ifreq,m_temp)+  &
     757                 :             : &               (dexp(-Ej_np1*beta)+ dexp(-Ei_n*beta))/ &
     758                 :    39073792 : &               ( omega_current +Ei_n-Ej_np1)
     759                 :             :                if(ifreq==1.and.m_temp==1) tmp=tmp+(dexp(-Ej_np1*beta)+ dexp(-Ei_n*beta))
     760                 :             : 
     761                 :             :                green_temp_realw(ifreq,m_temp)=green_temp_realw(ifreq,m_temp)+  &
     762                 :             : &               (dexp(-Ej_np1*beta)+ dexp(-Ei_n*beta))/ &
     763                 :    39791104 : &               ( omega_current +Ei_n-Ej_np1)
     764                 :             :              end do
     765                 :             : !            green_temp_realw(m_temp)=green_temp_realw(m_temp)+  &
     766                 :             : !            &           (dexp(-Ej_np1*beta)+ dexp(-Ei_n*beta)) -> will give one at the end
     767                 :             : !            write(std_out,*) "green",-Ej_np1*beta,-Ei_n*beta,dexp(-Ej_np1*beta),dexp(-Ei_n*beta)
     768                 :             :            end do
     769                 :             :          end do
     770                 :             :        end do
     771                 :             : !      write(std_out,*) "tmp",tmp
     772                 :             :        ilevel=0
     773         [ +  + ]:         188 :        do ispinor=1,nspinor
     774         [ +  + ]:         334 :          do isppol=1,nsppol
     775         [ +  + ]:         907 :            do im=1,(2*lpawu+1)
     776                 :         666 :              ilevel=ilevel+1
     777                 :             : !            write(std_out,'(16e15.6)') paw_dmft%omega_lo(ifreq),(real(green_temp_realw(ilevel)/Z_part),ilevel=1,nlevels)
     778         [ +  + ]:       32188 :              do ifreq=1,green_hubbard%nw
     779                 :       31376 :                green_hubbard%oper(ifreq)%matlu(iatom)%mat(im+(ispinor-1)*ndim,im+(ispinor-1)*ndim,isppol)=green_temp(ifreq,ilevel)/Z_part
     780                 :       32042 :                green_hubbard_realw%oper(ifreq)%matlu(iatom)%mat(im+(ispinor-1)*ndim,im+(ispinor-1)*ndim,isppol)=green_temp_realw(ifreq,ilevel)/Z_part
     781                 :             :              end do
     782                 :             :            end do
     783                 :             :          end do
     784                 :             :        end do
     785                 :             : 
     786                 :             : !      End calculation for this frequency
     787         [ -  + ]:          93 :        ABI_FREE(green_temp)
     788         [ -  + ]:          93 :        ABI_FREE(green_temp_realw)
     789                 :             : 
     790                 :             : !      ===================================
     791                 :             : !      Deallocations
     792                 :             : !      ===================================
     793         [ +  + ]:         972 :        do nelec=0,nlevels
     794         [ -  + ]:         879 :          ABI_FREE(occ_level(nelec)%repart)
     795         [ -  + ]:         879 :          ABI_FREE(occ_level(nelec)%ocp)
     796         [ -  + ]:         879 :          ABI_FREE(occ_level(nelec)%transition)
     797         [ -  + ]:         879 :          ABI_FREE(occ_level(nelec)%transition_m)
     798         [ -  + ]:         972 :          ABI_FREE(e_nelec(nelec)%config)
     799                 :             :        end do
     800                 :          93 :        ABI_FREE(occ_level)
     801         [ -  + ]:          93 :        ABI_FREE(occup)
     802                 :          93 :        ABI_FREE(nconfig_nelec)
     803         [ -  + ]:          93 :        ABI_FREE(e_nelec)
     804         [ -  + ]:          93 :        ABI_FREE(elevels)
     805         [ -  + ]:          93 :        ABI_FREE(maxener)
     806         [ -  + ]:          93 :        ABI_FREE(minener)
     807                 :             :      end if
     808                 :             :    end do
     809                 :          69 :    call destroy_green(green_hubbard_realw)
     810                 :             : 
     811                 :             :    ABI_NVTX_END_RANGE()
     812                 :             : 
     813   [ -  +  -  -  :         138 :  end subroutine green_atomic_hubbard
          -  -  -  +  -  
          +  -  -  -  -  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  -  
          -  -  -  -  -  
          -  -  -  -  +  
          -  -  -  -  -  
          -  -  -  -  -  
          -  +  -  -  -  
          -  -  -  -  -  
                   -  - ]
     814                 :             : !!***
     815                 :             : 
     816                 :             : !!****f* m_hubbard_one/combin
     817                 :             : !! NAME
     818                 :             : !! combin
     819                 :             : !!
     820                 :             : !! FUNCTION
     821                 :             : !!
     822                 :             : !!
     823                 :             : !! COPYRIGHT
     824                 :             : !! Copyright (C) 1999-2026 ABINIT group (BAmadon)
     825                 :             : !! This file is distributed under the terms of the
     826                 :             : !! GNU General Public License, see ~abinit/COPYING
     827                 :             : !! or http://www.gnu.org/copyleft/gpl.txt .
     828                 :             : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt .
     829                 :             : !!
     830                 :             : !! INPUTS
     831                 :             : !!
     832                 :             : !!
     833                 :             : !! OUTPUT
     834                 :             : !!
     835                 :             : !! NOTES
     836                 :             : !!
     837                 :             : !! SOURCE
     838                 :             : 
     839                 :      118179 :  recursive subroutine combin(ielec,nconfig,nconfig_nelec,nelec,nlevels,occ_level,occup)
     840                 :             : 
     841                 :             : !Arguments ------------------------------------
     842                 :             : !scalars
     843                 :             : ! type(pawang_type), intent(in) :: pawang
     844                 :             :  integer, intent(in) :: ielec,nelec,nlevels
     845                 :             :  integer, intent(inout) :: nconfig,nconfig_nelec(0:nlevels)
     846                 :             :  integer, intent(inout) :: occup(0:nlevels,nlevels)
     847                 :             : ! type  :: level2_type
     848                 :             : !  integer, pointer :: repart(:,:)
     849                 :             : ! end type
     850                 :             :  type(level2_type), intent(inout) :: occ_level(0:nlevels)
     851                 :             : ! integer, intent(in) :: prtopt
     852                 :             : 
     853                 :             : !Local variables ------------------------------
     854                 :             : ! scalars
     855                 :             :  integer :: max_ielec,pos,min_ielec,jelec,prtopt
     856                 :             :  character(len=500) :: message
     857                 :             : ! arrays
     858                 :             : !************************************************************************
     859                 :      118179 :    prtopt=1
     860                 :      118179 :    max_ielec=nlevels-nelec+ielec
     861                 :             : !  write(std_out,*) "call to combin ielec,nelec,nlevels",ielec,nelec,nlevels
     862                 :             :    select case (ielec)
     863                 :             :    case (1)
     864                 :      117393 :      min_ielec=1
     865                 :             :    case default
     866         [ +  + ]:      118179 :      min_ielec=occup(nelec,ielec-1)+1
     867                 :             :    end select
     868                 :             : !  write(std_out,*) "For ielec", ielec, "min_ielec,max_ielec",min_ielec,max_ielec
     869         [ +  + ]:      353751 :    do pos = min_ielec, max_ielec
     870         [ +  + ]:      353751 :      if(ielec==nelec) then
     871                 :      118179 :        occup(nelec,ielec)=pos
     872                 :      118179 :        nconfig=nconfig+1
     873                 :      118179 :        nconfig_nelec(nelec)=nconfig_nelec(nelec)+1
     874                 :             : !      write(std_out,*) "size",size(occ_level),size(occ_level(nelec)%repart,1)
     875                 :             : !      write(std_out,*) "size",size(occ_level),size(occ_level(nelec)%repart,2)
     876         [ +  + ]:      835491 :        do jelec=1,nelec
     877                 :             : !        write(std_out,*) "nconfig",nconfig_nelec(nelec),nelec
     878                 :             : !        write(std_out,*) "occup",occup(nelec,jelec)
     879                 :      835491 :          occ_level(nelec)%repart(nconfig_nelec(nelec),jelec)=occup(nelec,jelec)
     880                 :             :        end do
     881                 :             : !      write(std_out,*) "For ielec", ielec, "case nelec"
     882                 :             :        if(prtopt>=3) then
     883                 :             :          write(message,'(a,i3,a,30i5)') "For ielec",ielec," Occupf are", (occup(nelec,jelec),jelec=1,nelec)
     884                 :             :          call wrtout(std_out,message,'COLL')
     885                 :             :        end if
     886                 :             :      else
     887                 :      117393 :        occup(nelec,ielec)=pos
     888                 :             : !      write(std_out,*) "For ielec", ielec, "case 1 and default"
     889                 :      117393 :        call combin(ielec+1,nconfig,nconfig_nelec,nelec,nlevels,occ_level,occup)
     890                 :             :        if(prtopt>=3) then
     891                 :             :          write(message,'(a,i3,a,30i5)') "For ielec",ielec," Occup are", (occup(nelec,jelec),jelec=1,nelec)
     892                 :             :          call wrtout(std_out,message,'COLL')
     893                 :             :        end if
     894                 :             :      end if
     895                 :             :    end do
     896                 :             : 
     897                 :          69 :  end subroutine combin
     898                 :             : !!***
     899                 :             : 
     900                 :             : end subroutine hubbard_one
     901                 :             : !!***
     902                 :             : 
     903                 :             : END MODULE m_hubbard_one
     904                 :             : !!***
        

Generated by: LCOV version 2.3-1