LCOV - code coverage report
Current view: top level - src/70_gw - m_calc_ucrpa.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 0.0 % 578 0
Test Date: 2026-11-11 19:49:02 Functions: 0.0 % 6 0
Branches: 0.0 % 1022 0

             Branch data     Line data    Source code
       1                 :             : !!****m* ABINIT/m_calc_ucrpa
       2                 :             : !! NAME
       3                 :             : !!  m_calc_ucrpa
       4                 :             : !!
       5                 :             : !! FUNCTION
       6                 :             : !! Calculate the effective interaction in the correlated orbitals
       7                 :             : !!
       8                 :             : !! COPYRIGHT
       9                 :             : !! Copyright (C) 2006-2026 ABINIT group (BAmadon,ROuterovitch)
      10                 :             : !! This file is distributed under the terms of the
      11                 :             : !! GNU General Public License, see ~abinit/COPYING
      12                 :             : !! or http://www.gnu.org/copyleft/gpl.txt .
      13                 :             : !!
      14                 :             : !! INPUTS
      15                 :             : !!
      16                 :             : !! OUTPUT
      17                 :             : !!
      18                 :             : !! SOURCE
      19                 :             : 
      20                 :             : #if defined HAVE_CONFIG_H
      21                 :             : #include "config.h"
      22                 :             : #endif
      23                 :             : 
      24                 :             : 
      25                 :             : #include "abi_common.h"
      26                 :             : 
      27                 :             : MODULE m_calc_ucrpa
      28                 :             : 
      29                 :             : #ifndef HAVE_CRPA_OPTIM
      30                 :             : #ifdef FC_INTEL
      31                 :             : #warning "optimization of m_calc_ucrpa is deactivated on intel fortran"
      32                 :             : !DEC$ NOOPTIMIZE
      33                 :             : #endif
      34                 :             : #endif
      35                 :             : 
      36                 :             :  use defs_basis
      37                 :             :  implicit none
      38                 :             : 
      39                 :             :  private
      40                 :             : 
      41                 :             :  public :: calc_ucrpa
      42                 :             : !!***
      43                 :             : 
      44                 :             : contains
      45                 :             : !!****f* ABINIT/calc_ucrpa
      46                 :             : !! NAME
      47                 :             : !! calc_ucrpa
      48                 :             : !!
      49                 :             : !! FUNCTION
      50                 :             : !! Calculate the effective interaction in the correlated orbitals
      51                 :             : !!
      52                 :             : !! COPYRIGHT
      53                 :             : !! Copyright (C) 1999-2026 ABINIT group (TApplencourt,BA)
      54                 :             : !! This file is distributed under the terms of the
      55                 :             : !! GNU General Public License, see ~abinit/COPYING
      56                 :             : !! or http://www.gnu.org/copyleft/gpl.txt .
      57                 :             : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt .
      58                 :             : !!
      59                 :             : !! INPUTS
      60                 :             : !! npwe : number of plane wave for the dielectric constant
      61                 :             : !! npw : number of plane wave
      62                 :             : !! nomega  : number of frequencis
      63                 :             : !! bandinf,bandsup : kohn sham band
      64                 :             : !! optimisation : string for the optimisation
      65                 :             : !! Wfd:: MPI communicator
      66                 :             : !! mesh <kmesh_t>
      67                 :             : !!    %nbz=Number of points in the BZ
      68                 :             : !!    %nibz=Number of points in IBZ
      69                 :             : !!    %kibz(,nibz)=k-point coordinates, irreducible Brillouin zone
      70                 :             : !!    %kbz(3,nbz)=k-point coordinates, full Brillouin zone
      71                 :             : !!    %ktab(nbz)= table giving for each k-point in the BZ (kBZ), the corresponding
      72                 :             : !!    %ktabi(nbz)= for each k-point in the BZ defines whether inversion has to be considered
      73                 :             : !!    %ktabp(nbz)= phase factor associated to tnons
      74                 :             : !! M1_q_m(bandinf:bandsup,bandinf:bandsup,npw,Qmesh%nibz): Oscillator strengh in Wannier basis
      75                 :             : !! rhot1_q_m(bandinf:bandsup,bandinf:bandsup,npw,Qmesh%nibz): Oscillator strengh
      76                 :             : !!                                          multiplied by coulomb potential in Wannier basis
      77                 :             : !! OUTPUT
      78                 :             : !!
      79                 :             : !! NOTES
      80                 :             : !!
      81                 :             : !! SOURCE
      82                 :             : 
      83                 :           0 :  subroutine calc_ucrpa(itypatcor,cryst,Kmesh,lpawu,M1_q_m,Qmesh,npwe,&
      84                 :           0 : & npw,nsym,nomega,omegamin,omegamax,bandinf,bandsup,optimisation,ucvol,Wfd,fname,plowan_compute,rhot1,wanbz)
      85                 :             : 
      86                 :             :  use defs_basis
      87                 :             :  use m_abicore
      88                 :             :  use m_xmpi
      89                 :             :  use m_errors
      90                 :             : 
      91                 :             :  use m_io_tools,      only : open_file
      92                 :             :  use m_wfd,           only : wfd_t
      93                 :             :  use m_io_screening,  only : read_screening, em1_ncname
      94                 :             :  use m_bz_mesh,       only : kmesh_t
      95                 :             :  use m_crystal,       only : crystal_t
      96                 :             :  use m_plowannier,    only : operwan_realspace_type,plowannier_type
      97                 :             : !   _____                   _
      98                 :             : !  |_   _|                 | |
      99                 :             : !    | |  _ __  _ __  _   _| |_
     100                 :             : !    | | | '_ \| '_ \| | | | __|
     101                 :             : !   _| |_| | | | |_) | |_| | |_
     102                 :             : !  |_____|_| |_| .__/ \__,_|\__|
     103                 :             : !              | |
     104                 :             : !              |_|
     105                 :             : 
     106                 :             : !Arguments ------------------------------------
     107                 :             :  integer, intent(in)   :: itypatcor,lpawu,npw,npwe,nsym
     108                 :             :  integer, intent(in)   :: nomega
     109                 :             :  integer, intent(in)   :: bandinf
     110                 :             :  integer, intent(in)   :: bandsup
     111                 :             :  integer, intent(in)   :: plowan_compute
     112                 :             :  character(len=fnlen), intent(in) :: fname
     113                 :             :  character(len=*), intent(in) :: optimisation
     114                 :             :  real(dp), intent(in) :: ucvol,omegamin,omegamax
     115                 :             : 
     116                 :             :  class(wfd_t),intent(inout) :: Wfd
     117                 :             :  type(kmesh_t),intent(in) :: Kmesh,Qmesh
     118                 :             :  type(crystal_t),intent(in) :: Cryst
     119                 :             :  type(operwan_realspace_type),intent(in) :: rhot1(npw,Qmesh%nibz)
     120                 :             :  type(plowannier_type),intent(in) :: wanbz
     121                 :             :  complex(dp), intent(in) :: M1_q_m(cryst%nattyp(itypatcor),Wfd%nspinor,Wfd%nspinor,2*lpawu+1,2*lpawu+1,npw,Qmesh%nibz)
     122                 :             : 
     123                 :             : !Local variables ------------------------------
     124                 :             : !scalars
     125                 :             :  real(dp) :: x
     126                 :             :  real(dp) :: t1,t2
     127                 :             :  real(dp):: tol
     128                 :             :  complex(dp) :: uu,jj
     129                 :             : 
     130                 :             :  complex :: nC,ualter
     131                 :             : 
     132                 :             :  integer :: iatom1,iatom2,iatom3,iatom4,pos1,pos2,pos3,pos4,il1,il2,il3,il4,ispin,one_orbital
     133                 :             :  integer :: im_paral,iqalloc,ib1,ib2,m1,m2,m3,m4,iqibz,mbband1,mbband2,mbband3,mbband4,spin1,spin2
     134                 :             :  integer :: ierr,ik_bz,ik_ibz,iq_ibz,i,iG1,iG2,iG,iiG,iomega,iomega1,ispinor1,ispinor2,ispinor3,ispinor4
     135                 :             :  integer :: lpawu_read,nkibz,nbband,nkbz,nprocs,nqalloc,nqibz,ms1,ms2,ms3,ms4,mbband,nspinor
     136                 :             :  integer :: isym_kgw,iik,unt, cp_paral
     137                 :             :  complex(dp) ::ph_mkt,cplx1,cplx2
     138                 :             : 
     139                 :             :  logical :: wannier=.TRUE.
     140                 :             :  logical :: verbose=.FALSE.
     141                 :             :  logical :: bug=.FALSE.
     142                 :             :  logical :: lscr_one
     143                 :             : 
     144                 :             :  character(len=500) :: message
     145                 :             : 
     146                 :             : !arrays
     147                 :           0 :  complex(dp), allocatable :: V_m(:,:,:,:)
     148                 :           0 :  complex(dp), allocatable :: U_m(:,:,:,:)
     149                 :           0 :  complex(dp),allocatable :: uspin(:,:),jspin(:,:)
     150                 :             : ! complex(dp), allocatable :: coeffW_BZ(:,:,:),coeffW_IBZ(:,:,:)
     151                 :           0 :  complex(dp), allocatable :: rhot_q_m1m3(:,:,:,:,:,:),rhot_q_m2m4(:,:,:,:,:,:)
     152                 :           0 :  complex(dp), allocatable :: rhot_q_m1m3_npwe(:,:,:,:,:,:),rhot_q_m2m4_npwe(:,:,:,:,:,:)
     153                 :           0 :  complex(dp),allocatable :: trrho(:,:),sumrhorhoeps(:)
     154                 :           0 :  complex(gwp), allocatable :: scr(:,:,:,:)
     155                 :             : 
     156                 :           0 :  real(dp),allocatable :: k_coord(:,:)!,k_coordIBZ(:,:)
     157                 :           0 :  real(dp),allocatable :: q_coord(:,:)
     158                 :           0 :  real(dp),allocatable:: normG(:)
     159                 :           0 :  complex(dp),allocatable:: uomega(:),jomega(:)
     160                 :           0 :  real(dp),allocatable:: omega(:)
     161                 :           0 :  complex(dp),allocatable:: eiqr(:)
     162                 :             : 
     163                 :           0 :  integer,allocatable:: ikmq_bz_t(:,:)
     164                 :             : 
     165                 :           0 :  logical,allocatable :: bijection(:)
     166                 :             : !************************************************************************
     167                 :             : 
     168                 :           0 :  write(message,*) ch10, '==== Calculation of the screened interaction ===='
     169                 :           0 :  call wrtout(std_out,message,'COLL')
     170                 :           0 :  call wrtout(ab_out,message,'COLL')
     171                 :           0 :  write(message,*) ""
     172                 :           0 :  call wrtout(std_out,message,'COLL')
     173                 :           0 :  call wrtout(ab_out,message,'COLL')
     174                 :           0 :  nkbz = Kmesh%nbz
     175                 :           0 :  nqibz= Qmesh%nibz
     176                 :           0 :  nspinor=Wfd%nspinor
     177                 :             : 
     178                 :           0 :  nbband=1+bandsup-bandinf
     179                 :             : !  _  __            ____
     180                 :             : ! | |/ /   ___     / __ \
     181                 :             : ! | ' /   ( _ )   | |  | |
     182                 :             : ! |  <    / _ \/\ | |  | |
     183                 :             : ! | . \  | (_>  < | |__| |
     184                 :             : ! |_|\_\  \___/\/  \___\_\
     185                 :             : 
     186                 :           0 :  write(message,*) "Read K and Q mesh"
     187                 :           0 :  call wrtout(std_out,message,'COLL')
     188                 :           0 :  call wrtout(ab_out,message,'COLL')
     189                 :             : 
     190   [ #  #  #  #  :           0 :  ABI_MALLOC(k_coord,(nkbz,3))
          #  #  #  #  #  
                #  #  # ]
     191   [ #  #  #  #  :           0 :  ABI_MALLOC(q_coord,(nqibz,4))
          #  #  #  #  #  
                #  #  # ]
     192   [ #  #  #  #  :           0 :  ABI_MALLOC(eiqr,(nqibz))
          #  #  #  #  #  
                #  #  # ]
     193         [ #  # ]:           0 :  eiqr=czero
     194                 :             : !==Read k and q==!
     195                 :             : !open(unit=2012,file='ikbz_COORD',form='formatted',status='unknown')
     196                 :             : !read(2012,*) (ik_bz,k_coord(ik_bz,:),i=1,nkbz)
     197                 :             : !close(2012)
     198                 :             : 
     199         [ #  # ]:           0 :  do ik_bz=1,nkbz
     200   [ #  #  #  #  :           0 :    call kmesh%get_BZ_item(ik_bz,k_coord(ik_bz,:),ik_ibz,isym_kgw,iik,ph_mkt)
                   #  # ]
     201                 :             :  end do
     202                 :             : 
     203                 :             : ! open(unit=2012,file='iqbz_COORD',form='formatted',status='unknown')
     204                 :             : ! read(2012,*)
     205         [ #  # ]:           0 :  do i=1,nqibz
     206                 :             : !   read(2012,*) iq_ibz,q_coord(iq_ibz,:)
     207                 :           0 :    q_coord(i,1)=Qmesh%ibz(1,i)
     208                 :           0 :    q_coord(i,2)=Qmesh%ibz(2,i)
     209                 :           0 :    q_coord(i,3)=Qmesh%ibz(3,i)
     210                 :           0 :    q_coord(i,4)=Qmesh%wt(i)
     211                 :             : !   if (iq_ibz > nqibz) then
     212                 :             : !     write(message,*) iq_ibz,nqibz," Error on line",i,"Are you in iBZ ?"
     213                 :             : !     call wrtout(std_out,message,'COLL')
     214                 :             : !   end if
     215                 :             :  end do
     216                 :             : ! close(2012)
     217                 :             : 
     218                 :             : !==Bijection and array for k-q==!
     219   [ #  #  #  #  :           0 :  ABI_MALLOC(bijection,(nkbz))
          #  #  #  #  #  
                #  #  # ]
     220   [ #  #  #  #  :           0 :  ABI_MALLOC(ikmq_bz_t,(nkbz,nqibz))
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
     221         [ #  # ]:           0 :  bijection(:)=.FALSE.
     222         [ #  # ]:           0 :  if (nsym==1) then
     223         [ #  # ]:           0 :  do ik_bz=1,nkbz
     224         [ #  # ]:           0 :    do iq_ibz=1,nqibz
     225   [ #  #  #  #  :           0 :      ikmq_bz_t(ik_bz,iq_ibz)=findkmq(ik_bz,k_coord,q_coord(iq_ibz,:),nkbz)
                   #  # ]
     226         [ #  # ]:           0 :      if (ikmq_bz_t(ik_bz,iq_ibz)>nkbz.and.nsym==1) then
     227                 :           0 :        BUG=.TRUE.
     228                 :           0 :        write(message,*) "No K-Q for K/Q =",ik_bz,iq_ibz
     229                 :           0 :        ABI_ERROR(message)
     230                 :             :      end if
     231                 :           0 :      bijection(ikmq_bz_t(ik_bz,iq_ibz))=.TRUE.
     232                 :             :    end do
     233                 :             : 
     234   [ #  #  #  #  :           0 :    if (count(bijection).NE.nqibz.and.nsym==1) then
                   #  # ]
     235                 :           0 :    BUG=.TRUE.
     236                 :           0 :    write(message,*) 'No bijection ',ik_bz
     237                 :           0 :    ABI_ERROR(message)
     238                 :             :    end if
     239                 :             : 
     240         [ #  # ]:           0 :    bijection(:)=.FALSE.
     241                 :             :  end do
     242                 :             : 
     243         [ #  # ]:           0 :  if (.NOT.BUG.and.nsym==1) then
     244                 :           0 :    write(message,*)  "Bijection Ok."
     245                 :           0 :    call wrtout(std_out,message,'COLL')
     246                 :             :  end if
     247                 :             : endif
     248                 :             : !                                           _____
     249                 :             : !                                          / ____|
     250                 :             : !   _ __   ___  _ __ _ __ ___   ___       | |  __
     251                 :             : !  | '_ \ / _ \| '__| '_ ` _ \ / _ \      | | |_ |
     252                 :             : !  | | | | (_) | |  | | | | | |  __/      | |__| |
     253                 :             : !  |_| |_|\___/|_|  |_| |_| |_|\___|       \_____|
     254                 :             : 
     255   [ #  #  #  #  :           0 :  ABI_MALLOC(normG,(npw))
          #  #  #  #  #  
                #  #  # ]
     256         [ #  # ]:           0 :  if (verbose) then
     257                 :           0 :    write(message,*) 'Read the potential and G norm'
     258                 :           0 :    call wrtout(std_out,message,'COLL')
     259         [ #  # ]:           0 :    if (open_file('normeG',message,newunit=unt,form='formatted',status='unknown') /= 0) then
     260                 :           0 :      ABI_ERROR(message)
     261                 :             :    end if
     262   [ #  #  #  # ]:           0 :    read(unt,*) (iiG,x,normG(iiG),iG=1,npw)
     263                 :           0 :    close(unt)
     264                 :             :    !!False norme for G=0 idd G is the inverse of the potential inverse du potentiel (q=0)
     265                 :           0 :    normG(1)=0
     266                 :             :  end if
     267                 :             : 
     268                 :             : !========================================================================
     269                 :             : !------------------------------------------------------------------------
     270                 :             : 
     271                 :             : !  FIRST PART OF THE ROUTINE: USE M_G^(nn')(q,k) to do formal checks.
     272                 :             : !                             USE rhot_q_n to do compute bare interaction
     273                 :             : 
     274                 :             : !------------------------------------------------------------------------
     275                 :             : !========================================================================
     276                 :             : 
     277                 :             : !                               _
     278                 :             : !                              ( )
     279                 :             : !   _ __ ___        _ __  _ __ |/
     280                 :             : !  | '_ ` _ \      | '_ \| '_ \
     281                 :             : !  | | | | | |     | | | | | | |
     282                 :             : !  |_| |_| |_|     |_| |_|_| |_|
     283                 :             : 
     284                 :             : !==========================================================
     285                 :             : !==========================================================
     286                 :             : ! tol=1E-1
     287                 :             : ! tolerance for the normalization of wfc: should be around 0.01.
     288                 :           0 :  tol = 1 ! very large for test.
     289                 :           0 :  write(message,*) 'Check the norm of M'
     290                 :           0 :  call wrtout(std_out,message,'COLL')
     291                 :           0 :  write(message,*) 'Tolerance :',tol
     292                 :           0 :  call wrtout(std_out,message,'COLL')
     293                 :             : !  __      __
     294                 :             : !  \ \    / /
     295                 :             : !   \ \  / /      _ __
     296                 :             : !    \ \/ /      | '_ \
     297                 :             : !     \  /       | | | |
     298                 :             : !      \/        |_| |_|
     299                 :             : !==========================================================================
     300                 :             : !==Compute V_{n,n'}: bare interaction in the KS basis <- rhot_q_n -> V_n
     301                 :             : !==========================================================================
     302                 :             : !==========================================================
     303                 :             : !==Compute V_{n,n'}
     304                 :             : !==========================================================
     305         [ #  # ]:           0 :  if(verbose) then
     306                 :           0 :    write(message,*) ""
     307                 :           0 :    call wrtout(std_out,message,'COLL')
     308                 :           0 :    call wrtout(ab_out,message,'COLL')
     309                 :           0 :    write(message,*)  "==Calcul of the bare kohn-sham interaction V n=="
     310                 :           0 :    call wrtout(std_out,message,'COLL')
     311                 :             :  endif
     312                 :           0 :  tol=1E+1
     313                 :             : 
     314         [ #  # ]:           0 :  if (.NOT.wannier) RETURN
     315                 :             : 
     316                 :             : !========================================================================
     317                 :             : !------------------------------------------------------------------------
     318                 :             : 
     319                 :             : !  SECOND PART OF THE ROUTINE: Read Wannier projections
     320                 :             : 
     321                 :             : !------------------------------------------------------------------------
     322                 :             : !========================================================================
     323                 :             : !
     324                 :             : ! \ \        / /       (_)
     325                 :             : !  \ \  /\  / /_ _ _ __  _ __  _  ___ _ __
     326                 :             : !   \ \/  \/ / _` | '_ \| '_ \| |/ _ \ '__|
     327                 :             : !    \  /\  / (_| | | | | | | | |  __/ |
     328                 :             : !     \/  \/ \__,_|_| |_|_| |_|_|\___|_|
     329                 :             : 
     330                 :             : !==========================================================
     331                 :             : !==========================================================
     332                 :             : !== Read Wannier coefficient in forlb.ovlp
     333                 :             : !==========================================================
     334                 :           0 :  nkibz=Kmesh%nibz
     335                 :             : 
     336                 :             : !Read "l"
     337         [ #  # ]:           0 :  if (plowan_compute<10) then
     338                 :           0 :    write(message,*) ""
     339                 :           0 :    call wrtout(std_out,message,'COLL')
     340                 :           0 :    call wrtout(ab_out,message,'COLL')
     341                 :           0 :    write(message,*) "Read wannier in iBZ"
     342                 :           0 :    call wrtout(ab_out,message,'COLL')
     343                 :           0 :    call wrtout(std_out,message,'COLL')
     344         [ #  # ]:           0 :    if (open_file('forlb.ovlp',message,newunit=unt,form='formatted',status='unknown') /= 0) then
     345                 :           0 :      ABI_ERROR(message)
     346                 :             :    end if
     347                 :           0 :    rewind(unt)
     348                 :           0 :  read(unt,*) message
     349                 :           0 :    read(unt,*) message, lpawu_read
     350                 :           0 :    read(unt,*) message, ib1, ib2
     351                 :           0 :    close(unt)
     352                 :           0 :    mbband=2*lpawu_read+1
     353                 :             :  else
     354                 :           0 :    ib1=wanbz%bandi_wan
     355                 :           0 :    ib2=wanbz%bandf_wan
     356                 :           0 :    mbband=2*wanbz%latom_wan(1)%lcalc(1)+1
     357                 :           0 :    write(message,*)"Read l and bands from wanbz",ib1,ib2,mbband
     358                 :           0 :    call wrtout(ab_out,message,'COLL')
     359                 :           0 :    call wrtout(std_out,message,'COLL')
     360                 :             :  endif
     361   [ #  #  #  # ]:           0 :  if(ib1/=bandinf.and.ib2/=bandsup) then
     362                 :           0 :    write(message,*) "Error with bands",ib1,bandinf,ib2,bandsup
     363                 :           0 :    ABI_ERROR(message)
     364                 :             :  endif
     365                 :             : !!Read the bandinf, bandinf redondance information
     366                 :             : 
     367                 :             : 
     368                 :             : !*******************************************************
     369                 :             : !if (3==4) then
     370                 :             : !!  USELESS START
     371                 :             : !!*******************************************************
     372                 :             : ! ABI_MALLOC(coeffW_IBZ,(bandinf:bandsup,nkibz,mbband))
     373                 :             : ! coeffW_IBZ=czero
     374                 :             : !
     375                 :             : !
     376                 :             : ! if(Wfd%my_rank==0) then
     377                 :             : !   do ik_ibz=1,nkibz
     378                 :             : !     !read k
     379                 :             : !      read(2012,*)
     380                 :             : !      do iband=bandinf,bandsup
     381                 :             : !     !read band
     382                 :             : !        read(2012,*)
     383                 :             : !     !read projection
     384                 :             : !        do m1=1,mbband
     385                 :             : !          read(2012,*) binR,binR,binR,x,y
     386                 :             : !          !write(message,*)  binR,binR,binR,x,y
     387                 :             : !          coeffW_IBZ(iband,ik_ibz,m1)=cmplx(x,y)
     388                 :             : !        end do
     389                 :             : !      end do
     390                 :             : !   end do
     391                 :             : ! endif
     392                 :             : ! call xmpi_barrier(Wfd%comm)
     393                 :             : ! call xcast_mpi(coeffW_IBZ,0,Wfd%comm,ierr)
     394                 :             : ! call xmpi_barrier(Wfd%comm)
     395                 :             : ! close(2012)
     396                 :             : !
     397                 :             : ! ABI_MALLOC(coeffW_BZ,(bandinf:bandsup,nkbz,mbband))
     398                 :             : !
     399                 :             : ! if (nkbz==nkibz) then
     400                 :             : !   coeffW_BZ=coeffW_IBZ
     401                 :             : ! else
     402                 :             : !   write(message,*) "Reconstruct in full BZ"
     403                 :             : !   call wrtout(std_out,message,'COLL')
     404                 :             : !   call wrtout(ab_out,message,'COLL')
     405                 :             : !   ABI_MALLOC(k_coordIBZ,(nkibz,3))
     406                 :             : !
     407                 :             : !!   k_coordIBZ(:,:)=q_coord(:,1:3)
     408                 :             : !
     409                 :             : !   bijection(:)=.FALSE.
     410                 :             : !   write(message,*) "Indice in iBZ | Indice in BZ | Inverse in BZ"
     411                 :             : !   call wrtout(std_out,message,'COLL')
     412                 :             : !   do ik_bz=1,Kmesh%nbz
     413                 :             : !     write(6,*) "ik",ik_bz,Kmesh%tab(ik_bz),Kmesh%tabi(ik_bz),Kmesh%tabo(ik_bz)
     414                 :             : !     if(Kmesh%tabi(ik_bz)==1) then
     415                 :             : !       coeffW_BZ(:,ik_bz,:)=coeffW_IBZ(:,Kmesh%tab(ik_bz),:)
     416                 :             : !       bijection(ik_bz)=.TRUE.
     417                 :             : !     else if(Kmesh%tabi(ik_bz)==-1) then
     418                 :             : !       coeffW_BZ(:,ik_bz,:)=conjg(coeffW_IBZ(:,Kmesh%tab(ik_bz),:))
     419                 :             : !       write(message,*) Kmesh%tab(ik_bz),ik_bz
     420                 :             : !       inverse_ik_bz=Kmesh%tab(ik_bz)
     421                 :             : !       bijection(ik_bz)=.TRUE.
     422                 :             : !!       bijection(inverse_ik_bz)=.TRUE.
     423                 :             : !     endif
     424                 :             : !   enddo
     425                 :             : !
     426                 :             : !   if (count(bijection).NE.nkbz) then
     427                 :             : !    BUG=.TRUE.
     428                 :             : !    write(message,*) 'Miss somme K point for the Wannier',count(bijection),"/",nkbz
     429                 :             : !    ABI_ERROR(message)
     430                 :             : !   end if
     431                 :             : !
     432                 :             : !   if (.NOT.BUG) then
     433                 :             : !     write(message,*) "Reconstruction Success"
     434                 :             : !     call wrtout(std_out,message,'COLL')
     435                 :             : !     call wrtout(ab_out,message,'COLL')
     436                 :             : !   end if
     437                 :             : !   ABI_FREE(k_coordIBZ)
     438                 :             : ! end if
     439                 :             : !
     440                 :             : ! ABI_FREE(coeffW_IBZ)
     441                 :             : !
     442                 :             : ! wk=1.0/nkbz
     443                 :             : !
     444                 :             : ! write(message,*) 'Orthogonality check'
     445                 :             : ! call wrtout(std_out,message,'COLL')
     446                 :             : ! write(message,*)  'Sum on all the k point ,on all the Kohn-Sham band of C_(m1)*C_m(2)'
     447                 :             : ! call wrtout(std_out,message,'COLL')
     448                 :             : !
     449                 :             : !! tolerance for the sum over k-points of the Wannier functions (orthogonality)
     450                 :             : ! tol=1E-5
     451                 :             : !
     452                 :             : !! Sum for one k-point (should be around 0.1).
     453                 :             : ! tol2=10E0
     454                 :             : !
     455                 :             : ! write(message,*) 'Tolerance : k',tol2,'m',tol
     456                 :             : ! call wrtout(std_out,message,'COLL')
     457                 :             : !
     458                 :             : !
     459                 :             : ! ! Here checks on Wannier coeff are done (ortho, norm..)
     460                 :             : ! nC=cmplx(0,0)
     461                 :             : ! BUG=.FALSE.
     462                 :             : !
     463                 :             : ! do m1=1,mbband
     464                 :             : !   do m2=1,mbband
     465                 :             : !     do ik_bz=1,nkbz
     466                 :             : !       nCt=sum(conjg(coeffW_BZ(:,ik_bz,m1))*coeffW_BZ(:,ik_bz,m2))
     467                 :             : !       if (  ((m1==m2).and.(abs(abs(ncT)-1)>tol2)).OR.&
     468                 :             : !       ((m1.NE.m2).and.(abs(ncT)>tol2)) ) then
     469                 :             : !         BUG=.TRUE.
     470                 :             : !         write(message,*)  "No orthogonality for m1,m2",m1,m2,"kpt",ik_bz,abs(nCt)
     471                 :             : !         ABI_ERROR(message)
     472                 :             : !       end if
     473                 :             : !       nC=nC+wk*nCt
     474                 :             : !     end do
     475                 :             : !
     476                 :             : !     if (  ((m1==m2).and.(abs(abs(nC)-1)>tol)).OR.&
     477                 :             : !     ((m1.NE.m2).and.(abs(nC)>tol)) ) then
     478                 :             : !       bug=.TRUE.
     479                 :             : !       write(message,*) "No orthogonality for",m1,m2,abs(nC)
     480                 :             : !       ABI_ERROR(message)
     481                 :             : !     end if
     482                 :             : !     write(message,*)  m1,m2,abs(nC)
     483                 :             : !     nC=cmplx(0,0)
     484                 :             : !   end do
     485                 :             : ! end do
     486                 :             : ! if (.NOT.bug) then
     487                 :             : !   write(message,*) "Orthogonality check"
     488                 :             : !   call wrtout(std_out,message,'COLL')
     489                 :             : ! end if
     490                 :             : !
     491                 :             : !!*******************************************************
     492                 :             : !end if
     493                 :             : !  USELESS END
     494                 :             : !*******************************************************
     495                 :             : 
     496                 :             : ! do iq_ibz=1,nqibz
     497                 :             : !   do m1=1,mbband
     498                 :             : !     do m2=1,mbband
     499                 :             : !       write(6,*) "M1_q_m",M1_q_m(m1,m2,1,iq_ibz)
     500                 :             : !     end do
     501                 :             : !   end do
     502                 :             : ! end do
     503                 :             : 
     504                 :             :  if(real(M1_q_m(1,1,1,1,1,1,1))>0) then
     505                 :             :  endif
     506                 :             : 
     507                 :             : !                                       _
     508                 :             : !                                      ( )
     509                 :             : !   _ __ ___        _ __ ___  _ __ ___ |/
     510                 :             : !  | '_ ` _ \      | '_ ` _ \| '_ ` _ \
     511                 :             : !  | | | | | |     | | | | | | | | | | |
     512                 :             : !  |_| |_| |_|     |_| |_| |_|_| |_| |_|
     513                 :             : 
     514                 :             : 
     515                 :             : !!!==Calculation of M_G^(mm')(q)==!
     516                 :             : 
     517                 :           0 :  write(message,*) 'Calculation of M  m'
     518                 :           0 :  call wrtout(std_out,message,'COLL')
     519                 :             : 
     520                 :             : !=================================================================!
     521                 :             : !==Compute V_{m,m'}(q,z): Oscillator strengh in the Wannier basis
     522                 :             : !=================================================================!
     523                 :             : 
     524                 :             : ! Sum over k-points for the oscillator strengh in the Wannier basis
     525                 :             : 
     526                 :             :  if (verbose) then
     527                 :             : !   call  Sauvegarde_M_q_m(M1_q_m,normG,nqibz,npw,mbband)
     528                 :             :  end if
     529                 :             : 
     530                 :             : ! write(message,*)  "M1_q_m,m for iG=53 and iq=8"
     531                 :             : !    call wrtout(std_out,message,'COLL')
     532                 :             : 
     533                 :             : !        _                                     _
     534                 :             : !       | |                                   ( )
     535                 :             : !   _ __| |__   ___        _ __ ___  _ __ ___ |/
     536                 :             : !  | '__| '_ \ / _ \      | '_ ` _ \| '_ ` _ \
     537                 :             : !  | |  | | | | (_) |     | | | | | | | | | | |
     538                 :             : !  |_|  |_| |_|\___/      |_| |_| |_|_| |_| |_|
     539                 :             : 
     540                 :           0 :  write(message,*) ""
     541                 :           0 :  call wrtout(std_out,message,'COLL')
     542                 :           0 :  call wrtout(ab_out,message,'COLL')
     543                 :             : !==Calcul de Ro_G^(mm')(q)==!
     544                 :           0 :  write(message,*) 'Calculation of rhotwilde  m'
     545                 :           0 :  call wrtout(std_out,message,'COLL')
     546                 :             : 
     547                 :             : !===============================================================!
     548                 :             : !===============================================================!
     549                 :             : !==Compute V_{m,m'}(q,z): bare interaction in the Wannier basis
     550                 :             : !===============================================================!
     551                 :             : !===============================================================!
     552         [ #  # ]:           0 :  ABI_FREE(ikmq_bz_t)
     553                 :             : 
     554                 :             :  !ABI_MALLOC(rhot_q_m,(nspinor,nspinor,mbband,mbband,npw,nqibz))
     555                 :             : 
     556                 :             :  ! if (plowan_compute>=10)then
     557                 :             :  !   write(message,*)" cRPA calculation using plowan module"
     558                 :             :  !   call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
     559                 :             :  !   do iG=1,npw
     560                 :             :  !     do iqibz=1,nqibz
     561                 :             :  !       do ispinor1=1,nspinor
     562                 :             :  !         do ispinor2=1,nspinor
     563                 :             :  !           do m1=1,2*wanbz%latom_wan(1)%lcalc(1)+1
     564                 :             :  !             do m2=1,2*wanbz%latom_wan(1)%lcalc(1)+1
     565                 :             :  !               rhot_q_m(ispinor1,ispinor2,m1,m2,iG,iqibz)=&
     566                 :             :  !                 &rhot1(iG,iqibz)%atom_index(1,1)%position(1,1)%atom(1,1)%matl(m1,m2,1,ispinor1,ispinor2)
     567                 :             :  !               !write(6,*) rhot_q_m(ispinor1,ispinor2,m1,m2,iG,iqbz)
     568                 :             :  !             enddo
     569                 :             :  !           enddo
     570                 :             :  !         enddo
     571                 :             :  !       enddo
     572                 :             :  !     enddo
     573                 :             :  !   enddo
     574                 :             :  ! endif
     575         [ #  # ]:           0 :   do iatom1=1,wanbz%natom_wan
     576         [ #  # ]:           0 :   do iatom2=1,wanbz%natom_wan
     577         [ #  # ]:           0 :   do iatom3=1,wanbz%natom_wan
     578         [ #  # ]:           0 :   do iatom4=1,wanbz%natom_wan
     579   [ #  #  #  # ]:           0 :     if (iatom1/=iatom3 .or. iatom2/=iatom4)cycle
     580         [ #  # ]:           0 :     do pos1=1,size(wanbz%nposition(iatom1)%pos,1)
     581         [ #  # ]:           0 :     do pos2=1,size(wanbz%nposition(iatom2)%pos,1)
     582         [ #  # ]:           0 :     do pos3=1,size(wanbz%nposition(iatom3)%pos,1)
     583         [ #  # ]:           0 :     do pos4=1,size(wanbz%nposition(iatom4)%pos,1)
     584   [ #  #  #  # ]:           0 :       if (pos1/=pos3 .or. pos2/=pos4)cycle
     585         [ #  # ]:           0 :       do il1=1,wanbz%nbl_atom_wan(iatom1)
     586         [ #  # ]:           0 :       do il2=1,wanbz%nbl_atom_wan(iatom2)
     587         [ #  # ]:           0 :       do il3=1,wanbz%nbl_atom_wan(iatom3)
     588         [ #  # ]:           0 :       do il4=1,wanbz%nbl_atom_wan(iatom4)
     589   [ #  #  #  # ]:           0 :       if(il1/=il3 .or. il2/=il4)cycle
     590         [ #  # ]:           0 :       if (wanbz%nsppol/=1)then
     591   [ #  #  #  #  :           0 :         ABI_MALLOC(uspin,(4,nomega))
          #  #  #  #  #  
             #  #  #  #  
                      # ]
     592   [ #  #  #  #  :           0 :         ABI_MALLOC(jspin,(4,nomega))
          #  #  #  #  #  
                      # ]
     593                 :             :       endif
     594   [ #  #  #  #  :           0 :       if (iatom1==iatom2 .and. pos1==pos2 .and. il1 == il2)then
                   #  # ]
     595                 :           0 :         one_orbital=1
     596                 :             :       else
     597                 :           0 :         one_orbital=0
     598                 :             :       endif
     599   [ #  #  #  #  :           0 :       ABI_MALLOC(omega,(nomega))
          #  #  #  #  #  
             #  #  #  #  
                      # ]
     600         [ #  # ]:           0 :       do spin1=1,wanbz%nsppol
     601         [ #  # ]:           0 :       do spin2=1,wanbz%nsppol
     602                 :           0 :         cp_paral=0
     603                 :           0 :         mbband1=2*wanbz%latom_wan(iatom1)%lcalc(il1)+1
     604                 :           0 :         mbband2=2*wanbz%latom_wan(iatom2)%lcalc(il2)+1
     605                 :           0 :         mbband3=2*wanbz%latom_wan(iatom3)%lcalc(il3)+1
     606                 :           0 :         mbband4=2*wanbz%latom_wan(iatom4)%lcalc(il4)+1
     607   [ #  #  #  #  :           0 :         ABI_MALLOC(rhot_q_m1m3,(npw,nqibz,mbband1,mbband3,nspinor,nspinor))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  #  
                      # ]
     608   [ #  #  #  #  :           0 :         ABI_MALLOC(rhot_q_m2m4,(npw,nqibz,mbband2,mbband4,nspinor,nspinor))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  #  
                      # ]
     609   [ #  #  #  #  :           0 :         rhot_q_m1m3=czero
          #  #  #  #  #  
                #  #  # ]
     610   [ #  #  #  #  :           0 :         rhot_q_m2m4=czero
          #  #  #  #  #  
                #  #  # ]
     611         [ #  # ]:           0 :         do ispinor1=1,wanbz%nspinor
     612         [ #  # ]:           0 :         do ispinor2=1,wanbz%nspinor
     613         [ #  # ]:           0 :         do ispinor3=1,wanbz%nspinor
     614         [ #  # ]:           0 :         do ispinor4=1,wanbz%nspinor
     615         [ #  # ]:           0 :           do m1=1,mbband1
     616         [ #  # ]:           0 :           do m2=1,mbband2
     617         [ #  # ]:           0 :           do m3=1,mbband3
     618         [ #  # ]:           0 :           do m4=1,mbband4
     619         [ #  # ]:           0 :             do iqibz=1,nqibz
     620                 :             :               !Loig Vaugier PhD eq. 5.15
     621                 :             :               eiqr(iqibz)=exp(cmplx(0.0, 1.0 ) * two_pi * ( &
     622                 :             :                 q_coord(iqibz,1)* ( cryst%xred(1,wanbz%iatom_wan(iatom3)) - cryst%xred(1,wanbz%iatom_wan(iatom2)) )+ &
     623                 :             :                 q_coord(iqibz,2)* ( cryst%xred(2,wanbz%iatom_wan(iatom3)) - cryst%xred(2,wanbz%iatom_wan(iatom2)) )+ &
     624                 :           0 :                 q_coord(iqibz,3)* ( cryst%xred(3,wanbz%iatom_wan(iatom3)) - cryst%xred(3,wanbz%iatom_wan(iatom2)) )))
     625         [ #  # ]:           0 :             do iG=1,npw
     626                 :             :               ! cp_paral=cp_paral+1
     627                 :             :               ! if(mod(cp_paral-1,nprocs)==Wfd%my_rank) then
     628                 :           0 :               cplx1=rhot1(iG,iqibz)%atom_index(iatom1,iatom3)%position(pos1,pos3)%atom(il1,il3)%matl(m1,m3,spin1,ispinor1,ispinor3)
     629                 :           0 :               rhot_q_m1m3(iG,iqibz,m1,m3,ispinor1,ispinor3)=cplx1
     630                 :             : 
     631                 :           0 :               cplx2=rhot1(iG,iqibz)%atom_index(iatom2,iatom4)%position(pos2,pos4)%atom(il2,il4)%matl(m2,m4,spin2,ispinor2,ispinor4)
     632                 :           0 :               rhot_q_m2m4(iG,iqibz,m2,m4,ispinor2,ispinor4)=cplx2
     633                 :             : 
     634                 :             :               !endif
     635                 :             :             enddo!iG
     636                 :             :             enddo!iqibz
     637                 :             :           enddo!m4
     638                 :             :           enddo!m3
     639                 :             :           enddo!m2
     640                 :             :           enddo!m1
     641                 :             :         enddo!ispinor4
     642                 :             :         enddo!ispinor3
     643                 :             :         enddo!ispinor2
     644                 :             :         enddo!ispinor1
     645                 :             :         ! call xmpi_barrier(Wfd%comm)  ! First make sure that all processors are here
     646                 :             :         ! call xmpi_sum(rhot_q_m1m3,Wfd%comm,ierr)
     647                 :             :         ! call xmpi_sum(rhot_q_m2m4,Wfd%comm,ierr)
     648                 :             :         ! call xmpi_barrier(Wfd%comm)  ! First make sure that all processors are here
     649                 :             : 
     650                 :             : !    __      __
     651                 :             : !    \ \    / /
     652                 :             : !     \ \  / /      _ __ ___
     653                 :             : !      \ \/ /      | '_ ` _ \
     654                 :             : !       \  /       | | | | | |
     655                 :             : !        \/        |_| |_| |_|
     656                 :             : 
     657                 :             : 
     658   [ #  #  #  #  :           0 :         ABI_MALLOC(V_m,(mbband1*nspinor,mbband2*nspinor,mbband3*nspinor,mbband4*nspinor))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
     659                 :           0 :         write(message,*) "";call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
     660                 :           0 :         write(message,*)  "==Calculation of the bare interaction  V m=="
     661                 :           0 :         call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
     662                 :             : 
     663                 :           0 :         call print_orbitals(spin1,spin2,iatom1,iatom2,iatom3,iatom4,pos1,pos2,pos3,pos4,il1,il2,il3,il4,wanbz,1)
     664   [ #  #  #  #  :           0 :         V_m=czero
             #  #  #  # ]
     665                 :           0 :         call cpu_time ( t1 )
     666                 :           0 :         im_paral=0
     667                 :           0 :         nprocs  = xmpi_comm_size(Wfd%comm)
     668                 :             : 
     669                 :             : 
     670                 :             : 
     671                 :             : 
     672                 :             : 
     673                 :             : 
     674         [ #  # ]:           0 :         do ispinor1=1,nspinor
     675         [ #  # ]:           0 :         do ispinor2=1,nspinor
     676         [ #  # ]:           0 :         do ispinor3=1,nspinor
     677         [ #  # ]:           0 :         do ispinor4=1,nspinor
     678         [ #  # ]:           0 :           do m1=1,mbband1
     679         [ #  # ]:           0 :           do m2=1,mbband2
     680         [ #  # ]:           0 :           do m3=1,mbband3
     681         [ #  # ]:           0 :           do m4=1,mbband4
     682                 :           0 :             ms1=m1+(ispinor1-1)*mbband1
     683                 :           0 :             ms2=m2+(ispinor2-1)*mbband2
     684                 :           0 :             ms3=m3+(ispinor3-1)*mbband3
     685                 :           0 :             ms4=m4+(ispinor4-1)*mbband4
     686                 :           0 :             im_paral=im_paral+1
     687         [ #  # ]:           0 :             if(mod(im_paral-1,nprocs)==Wfd%my_rank) then
     688                 :             : !!somme interne sur iG, puis somme externe sur iq_ibz
     689                 :             : !! Sum_(iq_ibz) wi(iq_ibz)*Sum_ig  Rho(m3,m1,iG,iq)cong*Rho(m2,m4,ig,iq)
     690                 :             :               V_m(ms1,ms2,ms3,ms4)=sum(eiqr(:)*q_coord(:,4)*sum(conjg(rhot_q_m1m3(:,:,m3,m1,ispinor3,ispinor1))* &
     691   [ #  #  #  # ]:           0 :                 &rhot_q_m2m4(:,:,m2,m4,ispinor2,ispinor4),dim = 1))*Ha_eV/(ucvol)
     692                 :             :               !end do
     693                 :             :             endif!paral
     694                 :             :           end do!m4
     695                 :             :           end do!m3
     696                 :             :           end do!m2
     697                 :             :           end do!m1
     698                 :             :         end do!ispinor4
     699                 :             :         end do!ispinor3
     700                 :             :         end do!ispinor2
     701                 :             :         end do!ispinor1
     702                 :           0 :         call xmpi_barrier(Wfd%comm)  ! First make sure that all processors are here
     703                 :           0 :         call xmpi_sum(V_m,Wfd%comm,ierr)
     704                 :           0 :         call xmpi_barrier(Wfd%comm)  ! First make sure that all processors are here
     705                 :           0 :         call cpu_time ( t2 )
     706                 :           0 :         write(message,*)  "in ",t2-t1,"sec"
     707                 :           0 :         call wrtout(std_out,message,'COLL')
     708                 :             : !  !==Check if calculation is correct
     709                 :           0 :         tol=1E-2
     710                 :             : 
     711                 :           0 :         write(message,*)  "BARE INTERACTION"
     712                 :           0 :         call wrtout(std_out,message,'COLL')
     713                 :           0 :         call checkk(V_m,1,mbband*nspinor,1,0,uu,jj,"bare interaction",mbband1,mbband2,mbband3,mbband4,nspinor,one_orbital)
     714                 :             :         !call print_U(mbband1,mbband2,mbband3,mbband4,nspinor,V_m)
     715                 :             : !  ========================================================================
     716                 :             : !  ------------------------------------------------------------------------
     717                 :             : 
     718                 :             : !    THIRD PART OF THE ROUTINE: Read dielectric function
     719                 :             : 
     720                 :             : !  ------------------------------------------------------------------------
     721                 :             : !  ========================================================================
     722                 :             : 
     723                 :             : !      _____                          _
     724                 :             : !     / ____|                        (_)
     725                 :             : !    | (___   ___ _ __ ___  ___ _ __  _ _ __   __ _
     726                 :             : !     \___ \ / __| '__/ _ \/ _ \ '_ \| | '_ \ / _` |
     727                 :             : !     ____) | (__| | |  __/  __/ | | | | | | | (_| |
     728                 :             : !    |_____/ \___|_|  \___|\___|_| |_|_|_| |_|\__, |
     729                 :             : !                                              __/ |
     730                 :             : !                                             |___/
     731                 :             : !  ==========================================================
     732                 :             : !  == Read Dielectric Matrix for _SCR file
     733                 :             : !  ==========================================================
     734                 :           0 :         write(message,*) "";call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
     735                 :           0 :         call wrtout(std_out,message,'COLL')
     736                 :           0 :         call wrtout(ab_out,message,'COLL')
     737                 :             :  !  write(message,*) "==Read the dielectric matrix=="
     738                 :             :  !  call wrtout(ab_out,message,'COLL'); call wrtout(std_out,message,'COLL')
     739                 :             : 
     740                 :           0 :         lscr_one=.true.
     741                 :             : 
     742                 :             :    ! if symetry is not enabled then a large number of q-point are used
     743                 :             :    ! and they are read with direct access to avoid having too large
     744                 :             :    ! memory.
     745                 :             :    !-------------------------------------------------------------------
     746                 :             :         if(nsym>1.and..not.lscr_one) nqalloc=nqibz
     747                 :             :         if(nsym==1.or.lscr_one) nqalloc=1
     748                 :             : 
     749   [ #  #  #  #  :           0 :         ABI_MALLOC(scr,(npwe,npwe,nomega,nqalloc))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                #  #  # ]
     750   [ #  #  #  #  :           0 :         scr=czero
             #  #  #  # ]
     751                 :             :         if(nsym>1.and..not.lscr_one) then
     752                 :             :           write(message,*) "==Read the dielectric matrix=="
     753                 :             :           call wrtout(ab_out,message,'COLL'); call wrtout(std_out,message,'COLL')
     754                 :             :           call read_screening(em1_ncname,fname,npwe,nqibz,nomega,scr,IO_MODE_MPI,Wfd%comm)
     755                 :             :         endif
     756                 :             : 
     757                 :             : !   if (verbose) then
     758                 :             : !     open(unit=2211,file='Screening',form='formatted',status='unknown')
     759                 :             : !     do iG1=1,npwe
     760                 :             : !       do iG2=1,npwe
     761                 :             : !         write(2211,*) iG1,iG2,normG(iG1),normG(iG2),abs(scr(iG1,iG2,1,1)),abs(scr(iG1,iG2,2,1))
     762                 :             : !       end do
     763                 :             : !     end do
     764                 :             : !     close(2211)
     765                 :             : !   end if
     766                 :             : !
     767                 :             :         if(nsym>1.and..not.lscr_one) then
     768                 :             :           write(message,*) "Check the hermiticity"
     769                 :             :           call wrtout(ab_out,message,'COLL')
     770                 :             :           call wrtout(std_out,message,'COLL')
     771                 :             :           tol = 1E-2
     772                 :             :           do iG1=1,npwe
     773                 :             :             if (modulo(iG1,100).EQ.1) then
     774                 :             :               write(message,*)  iG1,"/",npw
     775                 :             :               call wrtout(std_out,message,'COLL')
     776                 :             :             end if
     777                 :             :             do iG2=iG1,npwe
     778                 :             :               if (ANY(abs(scr(iG1,iG2,:,:)-scr(iG2,iG1,:,:))>tol)) then
     779                 :             :                 write(message,*) iG1,iG2,"False"
     780                 :             :                 ABI_ERROR(message)
     781                 :             :                 do iomega1=1,nomega
     782                 :             :                   if(abs(scr(iG1,iG2,iomega1,1)-scr(iG2,iG1,iomega1,1))>tol) then
     783                 :             :                     write(message,*) iG1,iG2,"False",scr(iG1,iG2,iomega1,1),scr(iG2,iG1,iomega1,1)
     784                 :             :                     call wrtout(std_out,message,'COLL')
     785                 :             :                   endif
     786                 :             :                 enddo
     787                 :             :               end if
     788                 :             :               if(iG1==iG2) then
     789                 :             :                 scr(iG1,iG1,:,:)=scr(iG1,iG1,:,:)-one ! unscreened part of
     790                 :             :               endif
     791                 :             :             end do
     792                 :             :           end do
     793                 :             :           write(message,*)  "Done: Hermiticity of dielectric matrix checked"
     794                 :             :           call wrtout(std_out,message,'COLL')
     795                 :             :           call wrtout(ab_out,message,'COLL')
     796                 :             :         endif
     797                 :             : 
     798                 :             : !  ========================================================================
     799                 :             : !  ------------------------------------------------------------------------
     800                 :             : 
     801                 :             : !    FOURTH PART OF THE ROUTINE: Use dielectric function and oscillator
     802                 :             : !    strengh in Wannier basis to compute Screened cRPA interactions.
     803                 :             : 
     804                 :             : !  ------------------------------------------------------------------------
     805                 :             : !  ========================================================================
     806                 :             : !     _    _
     807                 :             : !    | |  | |
     808                 :             : !    | |  | |      _ __ ___
     809                 :             : !    | |  | |     | '_ ` _ \
     810                 :             : !    | |__| |     | | | | | |
     811                 :             : !     \____/      |_| |_| |_|
     812                 :             : !
     813                 :           0 :         write(message,*) "";call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
     814                 :           0 :         write(message,*)  "== Calculation of the screened interaction on the correlated orbital U m =="
     815                 :           0 :         call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
     816                 :           0 :         write(message,*)ch10,  " = Start loop over frequency "
     817                 :           0 :         call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
     818                 :             : 
     819   [ #  #  #  #  :           0 :         ABI_MALLOC(U_m,(mbband1*nspinor,mbband2*nspinor,mbband3*nspinor,mbband4*nspinor))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                #  #  # ]
     820   [ #  #  #  #  :           0 :         ABI_MALLOC(rhot_q_m1m3_npwe,(npwe,nqibz,mbband1,mbband3,nspinor,nspinor))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  #  
                      # ]
     821   [ #  #  #  #  :           0 :         ABI_MALLOC(rhot_q_m2m4_npwe,(npwe,nqibz,mbband2,mbband4,nspinor,nspinor))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  #  
                      # ]
     822   [ #  #  #  #  :           0 :         ABI_MALLOC(trrho,(npwe,nqibz))
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  # ]
     823   [ #  #  #  #  :           0 :         ABI_MALLOC(sumrhorhoeps,(nqibz))
          #  #  #  #  #  
                      # ]
     824                 :             : 
     825                 :             :    ! Following lines are only for debug
     826                 :             :    !--------------------------------------------
     827   [ #  #  #  # ]:           0 :         trrho(:,:)=czero
     828         [ #  # ]:           0 :         do iG1=1,npwe
     829   [ #  #  #  #  :           0 :           rhot_q_m1m3_npwe(iG1,:,:,:,:,:)=rhot_q_m1m3(iG1,:,:,:,:,:)
          #  #  #  #  #  
                      # ]
     830   [ #  #  #  #  :           0 :           rhot_q_m2m4_npwe(iG1,:,:,:,:,:)=rhot_q_m2m4(iG1,:,:,:,:,:)
          #  #  #  #  #  
                      # ]
     831                 :             :         enddo
     832                 :             :         !  do  ispinor1=1,nspinor
     833                 :             :         !     do m1=1,mbband
     834                 :             :         !       trrho(iG1,:)= trrho(iG1,:)+rhot_q_m(ispinor1,ispinor1,m1,m1,iG1,:)
     835                 :             :         !     enddo
     836                 :             :         !   enddo
     837                 :             :         ! enddo
     838                 :             : !   write(6,*) "trrho"
     839                 :             : !   do iG1=1,npwe
     840                 :             : !     do iq_ibz=1,nqibz
     841                 :             : !        write(6,*) iG1,iq_ibz,trrho(iG1,iq_ibz)
     842                 :             : !     enddo
     843                 :             : !   enddo
     844                 :             : !   write(6,*)
     845                 :             : 
     846                 :             :    ! Loop over frequencies to compute cRPA U(w)
     847                 :             :    !--------------------------------------------
     848   [ #  #  #  #  :           0 :         ABI_MALLOC(uomega,(nomega))
          #  #  #  #  #  
             #  #  #  #  
                      # ]
     849   [ #  #  #  #  :           0 :         ABI_MALLOC(jomega,(nomega))
          #  #  #  #  #  
                      # ]
     850                 :             : 
     851                 :           0 :         iomega=1
     852         [ #  # ]:           0 :         do iomega=1,nomega
     853                 :           0 :           write(message,'(2a,i4,2a)')ch10,  " --- For frequency w =",iomega, "  -------------",ch10
     854                 :           0 :           call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
     855         [ #  # ]:           0 :           sumrhorhoeps(:)=czero
     856                 :           0 :           ualter=czero
     857                 :             : 
     858                 :           0 :           write(std_out,*) Optimisation
     859   [ #  #  #  #  :           0 :           U_m=cmplx(0,0)
             #  #  #  # ]
     860                 :           0 :           SELECT CASE(trim(Optimisation))
     861                 :             :           CASE("naif")
     862                 :             :           CASE("onlyG")
     863                 :             :           CASE("Gsum2")
     864                 :             :           CASE("Gsum")
     865                 :             : ! write(message,*)  "Optimisation on G and sum"
     866                 :             : ! call wrtout(std_out,message,'COLL')
     867   [ #  #  #  #  :           0 :             U_m=cmplx(0,0)
             #  #  #  # ]
     868                 :           0 :             nc=cmplx(0,0)
     869                 :           0 :             im_paral=0
     870                 :           0 :             call cpu_time ( t1 )
     871                 :           0 :             nprocs  = xmpi_comm_size(Wfd%comm)
     872         [ #  # ]:           0 :             do iq_ibz=1,nqibz
     873                 :             :               ! eiqr=exp(cmplx(0.0, 1.0 ) * two_pi * ( &
     874                 :             :               !   q_coord(iq_ibz,1)* ( cryst%xred(1,wanbz%iatom_wan(iatom3)) - cryst%xred(1,wanbz%iatom_wan(iatom2)) )+ &
     875                 :             :               !   q_coord(iq_ibz,2)* ( cryst%xred(2,wanbz%iatom_wan(iatom3)) - cryst%xred(2,wanbz%iatom_wan(iatom2)) )+ &
     876                 :             :               !   q_coord(iq_ibz,3)* ( cryst%xred(3,wanbz%iatom_wan(iatom3)) - cryst%xred(3,wanbz%iatom_wan(iatom2)) )))
     877                 :             :               if(nsym>1.and..not.lscr_one)  iqalloc=iq_ibz
     878                 :             :               if(nsym==1.or.lscr_one) iqalloc=1
     879                 :             :               if(nsym==1.or.lscr_one) then
     880                 :             : #ifdef HAVE_MPI_IO
     881                 :           0 :                 call read_screening(em1_ncname,fname,npwe,1,nomega,scr,IO_MODE_MPI,Wfd%comm,iqiA=iq_ibz)
     882                 :             : #else
     883                 :             :                 call read_screening(em1_ncname,fname,npwe,1,nomega,scr,IO_MODE_FORTRAN,Wfd%comm,iqiA=iq_ibz)
     884                 :             : #endif
     885                 :           0 :                 write(message,*) "Check the hermiticity"
     886                 :           0 :                 call wrtout(std_out,message,'COLL')
     887                 :           0 :                 tol = 0.01_dp
     888         [ #  # ]:           0 :                 do iG1=1,npwe
     889         [ #  # ]:           0 :                   if (modulo(iG1,100).EQ.1) then
     890                 :           0 :                     write(message,*)  iG1,"/",npw
     891                 :           0 :                     call wrtout(std_out,message,'COLL')
     892                 :             :                   end if
     893         [ #  # ]:           0 :                   do iG2=iG1,npwe
     894   [ #  #  #  #  :           0 :                     if (ANY(abs(scr(iG1,iG2,:,:)-scr(iG2,iG1,:,:))>tol)) then
             #  #  #  # ]
     895         [ #  # ]:           0 :                       do iomega1=1,nomega
     896         [ #  # ]:           0 :                         if(abs(scr(iG1,iG2,iomega1,1)-scr(iG2,iG1,iomega1,1))>tol) then
     897                 :           0 :                           write(message,*) iG1,iG2,"False",scr(iG1,iG2,iomega1,1),scr(iG2,iG1,iomega1,1)
     898                 :           0 :                           call wrtout(std_out,message,'COLL')
     899                 :             :                         endif
     900                 :             :                       enddo
     901                 :           0 :                       write(message,*) "CHECK THE HERMITICITY"
     902                 :           0 :                       ABI_WARNING(message)
     903                 :             :                     end if
     904         [ #  # ]:           0 :                     if(iG1==iG2) then
     905   [ #  #  #  # ]:           0 :                       scr(iG1,iG1,:,:)=scr(iG1,iG1,:,:)-one ! unscreened part of
     906                 :             : !                 interaction is computed before
     907                 :             : !                 scr(iG1,iG1,:,:)=one
     908                 :             : !               else
     909                 :             : !                 scr(iG1,iG2,:,:)=zero
     910                 :             :                     endif
     911                 :             :                   end do
     912                 :             :                 end do
     913                 :             :               endif
     914                 :           0 :               write(message,*)  "Done: Hermiticity of dielectric matrix checked"
     915                 :             : 
     916                 :             :               ! do iG1=1,npwe
     917                 :             : !                 do iG2=1,npwe
     918                 :             : !                   sumrhorhoeps(iq_ibz)=sumrhorhoeps(iq_ibz)+conjg(trrho(iG1,iq_ibz))*trrho(iG2,iq_ibz)*scr(iG2,iG1,iomega,1)
     919                 :             : !                   sumrhorhoeps(iq_ibz)=sumrhorhoeps(iq_ibz) + scr(iG2,iG1,iomega,iqalloc)
     920                 :             : !                 enddo
     921                 :             : !               enddo
     922                 :             : !             ualter=ualter+sumrhorhoeps(iq_ibz)*q_coord(iq_ibz,4)*Ha_eV/ucvol/(mbband)**2
     923                 :             : !         write(6,*) "sumrhorhoeps",iq_ibz,sumrhorhoeps(iq_ibz)
     924                 :             : !         write(6,*) "ualter",iq_ibz,ualter
     925         [ #  # ]:           0 :               do ispinor1=1,nspinor
     926         [ #  # ]:           0 :               do ispinor2=1,nspinor
     927         [ #  # ]:           0 :               do ispinor3=1,nspinor
     928         [ #  # ]:           0 :               do ispinor4=1,nspinor
     929         [ #  # ]:           0 :                 do m1=1,mbband1
     930         [ #  # ]:           0 :                 do m2=1,mbband2
     931         [ #  # ]:           0 :                 do m3=1,mbband3
     932         [ #  # ]:           0 :                 do m4=1,mbband4
     933                 :           0 :                   ms1=m1+(ispinor1-1)*mbband1
     934                 :           0 :                   ms2=m2+(ispinor2-1)*mbband2
     935                 :           0 :                   ms3=m3+(ispinor3-1)*mbband3
     936                 :           0 :                   ms4=m4+(ispinor4-1)*mbband4
     937                 :           0 :                   im_paral=im_paral+1
     938         [ #  # ]:           0 :                   if(mod(im_paral-1,nprocs)==Wfd%my_rank) then
     939                 :             : !     sum q sum G1 sum G2 f(G1,q)f(G2,q)G(G1,G2,q)
     940                 :             : !     sum q sum G1 f(g1,q) sum G2 f(G2,q)G(G1,G2,q)
     941         [ #  # ]:           0 :                     do iG1=1,npwe
     942                 :             :                       nc=nc+conjg(rhot_q_m1m3_npwe(iG1,iq_ibz,m1,m3,ispinor1,ispinor3))*&
     943         [ #  # ]:           0 :                       &sum(rhot_q_m2m4_npwe(:,iq_ibz,m2,m4,ispinor2,ispinor4)*scr(:,iG1,iomega,iqalloc))
     944                 :             :                     end do
     945                 :             : 
     946                 :           0 :                     U_m(ms1,ms2,ms3,ms4)=U_m(ms1,ms2,ms3,ms4)+nc*q_coord(iq_ibz,4)*eiqr(iq_ibz)
     947                 :             : !                   if(m1==1.and.m2==1.and.m3==1.and.m4==1) then
     948                 :             : !                     write(6,*) "TEST2"
     949                 :             : !                     write(6,*) iq_ibz,nc
     950                 :             : !                     write(6,*) q_coord(iq_ibz,4)
     951                 :             : !                   endif
     952                 :           0 :                     nc=cmplx(0,0)
     953                 :             :                   endif!paral
     954                 :             :                 end do!m4
     955                 :             :                 end do!m3
     956                 :             :                 end do!m2
     957                 :             :                 end do!m1
     958                 :             :               end do!ispinor4
     959                 :             :               end do!ispinor3
     960                 :             :               end do!ispinor2
     961                 :             :               end do!ispinor1
     962                 :             :             end do!iq_ibz
     963   [ #  #  #  #  :           0 :             U_m(:,:,:,:)=U_m(:,:,:,:)*Ha_eV/(ucvol)
             #  #  #  # ]
     964                 :           0 :             call xmpi_barrier(Wfd%comm)  ! First make sure that all processors are here
     965                 :           0 :             call xmpi_sum(U_m,Wfd%comm,ierr)
     966                 :           0 :             call xmpi_barrier(Wfd%comm)  ! First make sure that all processors are here
     967                 :           0 :             call cpu_time ( t2 )
     968                 :           0 :             write(message,*)  "in ",t2-t1, "sec"
     969         [ #  # ]:           0 :             call wrtout(std_out,message,'COLL')
     970                 :             :           END SELECT
     971                 :             :     ! tolerance of the symetry of screened U.
     972                 :           0 :           tol=1E-2
     973                 :           0 :           call checkk(U_m,1,mbband*nspinor,0,iomega,uu,jj,"UminusVbare",mbband1,mbband2,mbband3,mbband4,nspinor,one_orbital)
     974   [ #  #  #  #  :           0 :           U_m=V_m+U_m
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  # ]
     975                 :           0 :           write(message,*)  "UCRPA interaction"
     976                 :           0 :           call wrtout(std_out,message,'COLL')
     977                 :             :           call checkk(U_m,1,mbband*nspinor,1,iomega,uomega(iomega),jomega(iomega),&
     978                 :           0 :             &"cRPA interaction",mbband1,mbband2,mbband3,mbband4,nspinor,one_orbital)
     979   [ #  #  #  # ]:           0 :           if (spin1==1 .and. spin2==1) then
     980                 :             :             ispin=1
     981   [ #  #  #  # ]:           0 :           else if(spin1==1 .and. spin2==2) then
     982                 :             :             ispin=2
     983   [ #  #  #  # ]:           0 :           else if (spin1==2 .and. spin2==1)then
     984                 :             :             ispin=3
     985                 :             :           else
     986                 :           0 :             ispin=4
     987                 :             :           endif
     988         [ #  # ]:           0 :           if (wanbz%nsppol/=1)then
     989                 :           0 :             uomega(iomega)=4*uomega(iomega)
     990                 :           0 :             jomega(iomega)=4*jomega(iomega)
     991                 :           0 :             uspin(ispin,iomega)=uomega(iomega)
     992                 :           0 :             jspin(ispin,iomega)=jomega(iomega)
     993                 :             :           endif
     994                 :             :           !write(message,*)ch10,"SCREENED INTERACTION"
     995                 :             :           !call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
     996                 :             :           !call print_U(mbband1,mbband2,mbband3,mbband4,nspinor,U_m)
     997                 :             :         enddo
     998                 :             : 
     999                 :           0 :         call print_orbitals(spin1,spin2,iatom1,iatom2,iatom3,iatom4,pos1,pos2,pos3,pos4,il1,il2,il3,il4,wanbz,0)
    1000                 :           0 :         write(message,*)ch10,"  -------------------------------------------------------------"
    1001                 :           0 :         call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1002                 :           0 :         write(message,*)"           Average U and J as a function of frequency   "
    1003                 :           0 :         call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1004                 :           0 :         write(message,*)"  -------------------------------------------------------------"
    1005                 :           0 :         call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1006                 :           0 :         write(message,*)"        omega           U(omega)            J(omega)"
    1007                 :           0 :         call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1008         [ #  # ]:           0 :         do iomega=1,nomega
    1009         [ #  # ]:           0 :           if(nomega==1) then
    1010                 :           0 :             omega(iomega)=omegamin
    1011                 :             :           else
    1012                 :           0 :             omega(iomega)=(omegamax-omegamin)/(nomega-1)*(iomega-1)+omegamin
    1013                 :             :           endif
    1014         [ #  # ]:           0 :           if(nomega==1)  omega(iomega)=omegamin
    1015                 :           0 :           write(message,'(2x,f11.3,2x,2f10.4,2x,2f10.4)')  omega(iomega)*Ha_eV, uomega(iomega),jomega(iomega)
    1016                 :           0 :           call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1017                 :             :         enddo
    1018                 :           0 :         write(message,*)"  -------------------------------------------------------------"
    1019                 :           0 :         call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1020                 :             : 
    1021                 :             : !  END OF LOOP ON ATOMS !!
    1022                 :             : 
    1023         [ #  # ]:           0 :         ABI_FREE(uomega)
    1024         [ #  # ]:           0 :         ABI_FREE(jomega)
    1025         [ #  # ]:           0 :         ABI_FREE(V_m)
    1026         [ #  # ]:           0 :         ABI_FREE(rhot_q_m1m3_npwe)
    1027         [ #  # ]:           0 :         ABI_FREE(rhot_q_m2m4_npwe)
    1028         [ #  # ]:           0 :         ABI_FREE(trrho)
    1029         [ #  # ]:           0 :         ABI_FREE(sumrhorhoeps)
    1030         [ #  # ]:           0 :         ABI_FREE(scr)
    1031         [ #  # ]:           0 :         ABI_FREE(U_m)
    1032         [ #  # ]:           0 :         ABI_FREE(rhot_q_m1m3)
    1033         [ #  # ]:           0 :         ABI_FREE(rhot_q_m2m4)
    1034                 :             : !    Print dielectric matrix
    1035                 :             : !   do iq_ibz=1,nqibz
    1036                 :             : !       call read_screening(em1_ncname,fname,npwe,1,nomega,scr,IO_MODE_FORTRAN,Wfd%comm,iqiA=iq_ibz)
    1037                 :             : !   enddo
    1038                 :             :       enddo!spin2
    1039                 :             :       enddo!spin1
    1040         [ #  # ]:           0 :       if (wanbz%nsppol/=1)then
    1041         [ #  # ]:           0 :         do iomega=1,nomega
    1042         [ #  # ]:           0 :           if(nomega==1) then
    1043                 :           0 :             omega(iomega)=omegamin
    1044                 :             :           else
    1045                 :           0 :             omega(iomega)=(omegamax-omegamin)/(nomega-1)*(iomega-1)+omegamin
    1046                 :             :           endif
    1047         [ #  # ]:           0 :           if(nomega==1)  omega(iomega)=omegamin
    1048                 :             :         enddo
    1049                 :             :         !call print_orbitals(1,1,iatom1,iatom2,iatom3,iatom4,pos1,pos2,pos3,pos4,il1,il2,il3,il4,wanbz,2)
    1050                 :           0 :         call print_uj_spin(nomega,uspin,jspin,omega,one_orbital)
    1051                 :             :       endif
    1052         [ #  # ]:           0 :       if (wanbz%nsppol/=1)then
    1053         [ #  # ]:           0 :         ABI_FREE(uspin)
    1054         [ #  # ]:           0 :         ABI_FREE(jspin)
    1055                 :             :       endif
    1056         [ #  # ]:           0 :       ABI_FREE(omega)
    1057                 :             :       enddo!il4
    1058                 :             :       enddo!il3
    1059                 :             :       enddo!il2
    1060                 :             :       enddo!il1
    1061                 :             :     enddo!pos4
    1062                 :             :     enddo!pos3
    1063                 :             :     enddo!pos2
    1064                 :             :     enddo!pos1
    1065                 :             :   enddo!iatom4
    1066                 :             :   enddo!iatom3
    1067                 :             :   enddo!iatom2
    1068                 :             :   enddo!iatom1
    1069         [ #  # ]:           0 :  ABI_FREE(k_coord)
    1070         [ #  # ]:           0 :  ABI_FREE(q_coord)
    1071         [ #  # ]:           0 :  ABI_FREE(eiqr)
    1072         [ #  # ]:           0 :  ABI_FREE(bijection)
    1073   [ #  #  #  #  :           0 :  ABI_FREE(normG)
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  #  
                      # ]
    1074                 :             : ! ABI_FREE(coeffW_BZ)
    1075                 :             : !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    1076                 :             : !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    1077                 :             : 
    1078                 :             :  CONTAINS
    1079                 :             : 
    1080                 :             : !!    __                 _   _
    1081                 :             : !!   / _|               | | (_)
    1082                 :             : !!  | |_ ___  _ __   ___| |_ _  ___  _ __
    1083                 :             : !!  |  _/ _ \| '_ \ / __| __| |/ _ \| '_ \
    1084                 :             : !!  | || (_) | | | | (__| |_| | (_) | | | |
    1085                 :             : !!  |_| \___/|_| |_|\___|\__|_|\___/|_| |_|
    1086                 :             : !
    1087                 :           0 :  integer FUNCTION fi(nkbz,k_coord,kprime_coord)
    1088                 :             : 
    1089                 :             :       integer,intent(in) :: nkbz
    1090                 :             :       real(dp),dimension(nkbz,3),intent(in) ::k_coord
    1091                 :             :       real(dp),dimension(3),intent(in) :: kprime_coord(3)
    1092                 :             : 
    1093         [ #  # ]:           0 :  do fi=1,nkbz
    1094   [ #  #  #  #  :           0 :    if (ALL(abs(kprime_coord(:)-k_coord(fi,:))<0.001)) then
                   #  # ]
    1095                 :             :      exit
    1096                 :             :    end if
    1097                 :             :  end do
    1098                 :           0 :  END FUNCTION fi
    1099                 :             : 
    1100                 :           0 :  integer FUNCTION findkmq(ik_bz,k_coord,q_coord,nkbz)
    1101                 :             : 
    1102                 :             :       integer,intent(in) :: ik_bz,nkbz
    1103                 :             :       real(dp),dimension(nkbz,3),intent(in) ::k_coord
    1104                 :             :       real(dp),dimension(4),intent(in) ::q_coord
    1105                 :             :       real(dp),dimension(3) :: kprime_coord
    1106                 :             :       integer :: i,j,k
    1107                 :             : 
    1108                 :             : 
    1109         [ #  # ]:           0 :  kprime_coord(:)=k_coord(ik_bz,:)-q_coord(1:3)
    1110                 :             : 
    1111   [ #  #  #  #  :           0 :  where (kprime_coord > 0.5)
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                      # ]
    1112                 :             :    kprime_coord(:)= kprime_coord(:)-1
    1113                 :             :  elsewhere(kprime_coord < -0.5)
    1114                 :             :    kprime_coord(:)= kprime_coord(:)+1
    1115                 :             :  end where
    1116                 :             : 
    1117                 :             : !! indice of k -q
    1118                 :           0 :  findkmq=fi(nkbz,k_coord,kprime_coord)
    1119                 :             : 
    1120                 :             : !!Test if k-q exists
    1121         [ #  # ]:           0 :  if (findkmq.EQ.(nkbz+1)) then
    1122                 :             : !!The prb comes from PBC included born_inf,born_sup]
    1123                 :             : !! One test all combination over boundaries
    1124         [ #  # ]:           0 :    do i=1,2
    1125         [ #  # ]:           0 :      if (abs(abs(kprime_coord(1))-0.5)<0.001) kprime_coord(1)=(-1)**i*0.5
    1126         [ #  # ]:           0 :      do j=1,2
    1127         [ #  # ]:           0 :        if (abs(abs(kprime_coord(2))-0.5)<0.001) kprime_coord(2)=(-1)**j*0.5
    1128         [ #  # ]:           0 :        do k=1,2
    1129         [ #  # ]:           0 :          if (abs(abs(kprime_coord(3))-0.5)<0.01) kprime_coord(3)=(-1)**k*0.5
    1130                 :           0 :          findkmq=fi(nkbz,k_coord,kprime_coord)
    1131                 :             :         !!Quand on a trouver la bonne valeur on part
    1132         [ #  # ]:           0 :          if (findkmq.NE.(nkbz+1)) return
    1133                 :             :        end do
    1134                 :             :      end do
    1135                 :             :    end do
    1136                 :             :  end if
    1137                 :             :  END FUNCTION findkmq
    1138                 :             : 
    1139         [ #  # ]:           0 :  SUBROUTINE checkk(Interaction,m_inf,m_sup,prtopt,ifreq,uu,jj,utype,mbband1,mbband2,mbband3,mbband4,nspinor,one_orbital)
    1140                 :             : 
    1141                 :             :  integer, intent(in) :: m_inf,m_sup,ifreq,mbband1,mbband2,mbband3,mbband4,nspinor,one_orbital
    1142                 :             :  complex(dp), intent(in) :: Interaction(mbband1*nspinor,mbband2*nspinor,mbband3*nspinor,mbband4*nspinor)
    1143                 :             :  complex(dp), intent(out)    :: uu,jj
    1144                 :             :  character(len=*), intent(in) :: utype
    1145                 :             :  integer :: prtopt
    1146                 :             : 
    1147                 :             : 
    1148                 :             : !==Check correctness
    1149                 :             :  ! write(message,*)  "== Check == "
    1150                 :             :  ! call wrtout(std_out,message,'COLL')
    1151                 :             :  ! write(message,*) 'Tolerance :',tol
    1152                 :             :  ! call wrtout(std_out,message,'COLL')
    1153                 :             :  ! do i=m_inf,m_sup
    1154                 :             :  !   do j=i+1,m_sup
    1155                 :             :       !if (abs(abs(Interaction(i,i,i,i)-Interaction(j,j,j,j)))>tol) then
    1156                 :             :       !     BUG=.TRUE.
    1157                 :             :       !     write(message,*) "Problem in the interband calculation"&
    1158                 :             : !&      ,i,j,abs(Interaction(i,i,i,i)),abs(Interaction(j,j,j,j))
    1159                 :             :       !     call wrtout(std_out,message,'COLL')
    1160                 :             :       !end if
    1161                 :             : 
    1162                 :             : !      if (abs(Interaction(i,j,i,j)-Interaction(j,i,j,i))>tol) then
    1163                 :             : !        BUG=.TRUE.
    1164                 :             : !        write(message,*) "Warning in the symetry of U'",i,j,abs(Interaction(i,j,i,j)),&
    1165                 :             : ! &       abs(Interaction(j,i,j,i)),abs(Interaction(i,j,i,j)-Interaction(j,i,j,i))
    1166                 :             : !        call wrtout(std_out,message,'COLL')
    1167                 :             : !      end if
    1168                 :             : 
    1169                 :             : !      if (abs(Interaction(i,i,j,j)-Interaction(j,j,i,i))>tol) then
    1170                 :             : !        BUG=.TRUE.
    1171                 :             : !        write(message,*) "Warning in the symetry of J'",i,j,abs(Interaction(i,i,j,j)),&
    1172                 :             : ! &       abs(Interaction(j,j,i,i)),abs(Interaction(j,j,i,i)-Interaction(i,i,j,j))
    1173                 :             : !        call wrtout(std_out,message,'COLL')
    1174                 :             : !      end if
    1175                 :             : !    end do
    1176                 :             : !  end do
    1177                 :             : 
    1178                 :             : 
    1179                 :             : ! do i=m_inf,m_sup
    1180                 :             : !   do j=m_inf,m_sup
    1181                 :             : !     if (i.EQ.j) cycle
    1182                 :             : !     if (abs(Interaction(i,j,j,j))>tol) then
    1183                 :             : !       BUG=.TRUE.
    1184                 :             : !       write(message,*) "Warning in the symetry U(i,j,j,j) should vanish (in the Ylm basis) for",&
    1185                 :             : !&       i,j,abs(Interaction(i,j,j,j))
    1186                 :             : !       call wrtout(std_out,message,'COLL')
    1187                 :             : !     end if
    1188                 :             : !   end do
    1189                 :             : ! end do
    1190                 :             : 
    1191                 :             : ! if (.not.BUG) then
    1192                 :             : !    call wrtout(std_out,'Calcul is possibly correct','COLL')
    1193                 :             : !    call Affichage(Interaction,m_inf,m_sup,2)
    1194                 :             : ! else
    1195                 :             : !     call wrtout(std_out,'Maybe somme error','COLL')
    1196                 :             : !     call Affichage(Interaction,m_inf,m_sup,1)
    1197                 :             : ! end if
    1198                 :             : 
    1199                 :           0 :  if(prtopt>0)  call Affichage(Interaction,m_inf,m_sup,1,ifreq,uu,jj,utype,mbband1,mbband2,mbband3,mbband4,nspinor,one_orbital)
    1200                 :             : 
    1201                 :             :  END SUBROUTINE checkk
    1202                 :             : 
    1203                 :           0 :  SUBROUTINE Affichage(Interaction,m_inf,m_sup,option,ifreq,uu,jj,utype,mbband1,mbband2,mbband3,mbband4,nspinor,one_orbital)
    1204                 :             : 
    1205                 :             :   integer, intent(in) :: m_inf,m_sup,option,ifreq,mbband1,mbband2,mbband3,mbband4,nspinor,one_orbital
    1206                 :             :   complex(dp), intent(in) :: Interaction(mbband1*nspinor,mbband2*nspinor,mbband3*nspinor,mbband4*nspinor)
    1207                 :             :   complex(dp),intent(out) :: UU,JJ
    1208                 :             :   character(len=*), intent(in) :: utype
    1209                 :             :   complex(dp) :: UU1,UUmJJ,JJ1,JJ2
    1210                 :             :   integer :: m1,m2
    1211                 :             :   logical :: lprint
    1212                 :             :   character(len=500) :: message
    1213                 :             : 
    1214                 :             : 
    1215   [ #  #  #  # ]:           0 :   if(utype=="cRPA interaction".or.utype=="bare interaction") then
    1216                 :             :    lprint=.true.
    1217                 :             :   else
    1218                 :           0 :    lprint=.false.
    1219                 :             :   endif
    1220                 :           0 :   write(message,*) "";call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
    1221                 :             : 
    1222         [ #  # ]:           0 :   if (one_orbital==1) then
    1223         [ #  # ]:           0 :     if(lprint) then
    1224                 :           0 :       write(message,*)" Diagonal ",utype
    1225                 :           0 :       call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1226                 :             :     endif
    1227                 :             : 
    1228         [ #  # ]:           0 :     do m1=m_inf,m_sup
    1229         [ #  # ]:           0 :       if (option.EQ.1) then
    1230                 :           0 :         write(message,'(a,i3,14f7.3)') " ",m1,real(Interaction(m1,m1,m1,m1))
    1231                 :           0 :         call wrtout(std_out,message,'COLL')
    1232                 :           0 :         call wrtout(ab_out,message,'COLL')
    1233                 :             :       end if
    1234                 :             :     end do
    1235                 :             :   endif
    1236                 :             : 
    1237         [ #  # ]:           0 :   if(lprint) then
    1238                 :           0 :     write(message,*) "";call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
    1239                 :           0 :     write(message,*)" U'=U(m1,m2,m1,m2) for the ",utype
    1240                 :           0 :     call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1241                 :             : 
    1242   [ #  #  #  # ]:           0 :     write(message,'(a,14i7)') " -",(m2,m2=1,mbband2)
    1243                 :           0 :     call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1244         [ #  # ]:           0 :     do m1=m_inf,m_sup
    1245         [ #  # ]:           0 :       if (option.EQ.1) then
    1246   [ #  #  #  # ]:           0 :         write(message,'(a,i3,14f7.3)') " ",m1,(real(Interaction(m1,m2,m1,m2)),m2=1,mbband2)
    1247                 :           0 :         call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1248                 :             :       end if
    1249                 :             :     end do
    1250                 :             :   endif
    1251                 :             : 
    1252                 :           0 :  write(message,*) ""
    1253                 :           0 :  call wrtout(std_out,message,'COLL')
    1254                 :           0 :  call wrtout(ab_out,message,'COLL')
    1255                 :             : 
    1256                 :           0 :  UU=czero
    1257         [ #  # ]:           0 :  do m1=1,mbband1
    1258         [ #  # ]:           0 :    do m2=1,mbband2
    1259                 :           0 :      UU=UU+Interaction(m1,m2,m1,m2)
    1260                 :             :    enddo
    1261                 :             :  enddo
    1262                 :           0 :  UU=UU/float(mbband1*mbband2)
    1263         [ #  # ]:           0 :  if(ifreq/=0) write(message,'(3a,i3,a,2f10.4,a)')'  Hubbard ',utype,' for w =',ifreq,', U=1/(2l+1)**2 \sum U(m1,m2,m1,m2)=',UU,ch10
    1264         [ #  # ]:           0 :  if(ifreq==0) write(message,'(3a,2f10.4,a)') '  Hubbard ',utype, ' U=1/(2l+1)**2 \sum U(m1,m2,m1,m2)=',UU,ch10
    1265                 :           0 :  call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1266                 :             : 
    1267                 :             : 
    1268         [ #  # ]:           0 : if (one_orbital==1)then
    1269                 :           0 :   UU1=czero
    1270         [ #  # ]:           0 :   do m1=1,mbband1
    1271                 :           0 :     UU1=UU1+Interaction(m1,m1,m1,m1)
    1272                 :             :   enddo
    1273                 :           0 :   UU1=UU1/((mbband1))
    1274         [ #  # ]:           0 :   if(ifreq/=0) write(message,'(3a,i4,a,2f10.4,2a)')&
    1275                 :           0 :     & '  (Hubbard ',utype,' for w =',ifreq,', U=1/(2l+1) \sum U(m1,m1,m1,m1)=',UU1,')',ch10
    1276         [ #  # ]:           0 :   if(ifreq==0) write(message,'(3a,2f10.4,2a)')' (Hubbard ',utype,' U=1/(2l+1) \sum U(m1,m1,m1,m1)=',UU1,')',ch10
    1277                 :           0 :   call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1278                 :             : endif
    1279                 :             : 
    1280   [ #  #  #  # ]:           0 :  if(lprint .and. one_orbital==1) then
    1281                 :           0 :    write(message,*)' Hund coupling J=U(m1,m1,m2,m2) for the ', utype
    1282                 :           0 :    call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1283                 :             : 
    1284   [ #  #  #  # ]:           0 :    write(message,'(a,14i7)') " -",(m2,m2=1,mbband1)
    1285                 :           0 :    call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1286         [ #  # ]:           0 :    do m1=1,mbband1
    1287         [ #  # ]:           0 :      if (option.EQ.1) then
    1288   [ #  #  #  # ]:           0 :         write(message,'(a,i3,14f7.3)') " ",m1,(real(Interaction(m1,m1,m2,m2)),m2=1,mbband1)
    1289                 :           0 :         call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1290                 :             :      end if
    1291                 :             :    end do
    1292                 :             :  endif
    1293         [ #  # ]:           0 :  if (one_orbital==1)then
    1294                 :           0 :    UUmJJ=czero
    1295         [ #  # ]:           0 :    do m1=1,mbband1
    1296         [ #  # ]:           0 :      do m2=1,mbband1
    1297                 :           0 :        UUmJJ=UUmJJ+Interaction(m1,m2,m1,m2)-Interaction(m1,m2,m2,m1)
    1298                 :             :      enddo
    1299                 :             :    enddo
    1300         [ #  # ]:           0 :    if (mbband1/=1) then
    1301                 :           0 :      UUmJJ=UUmJJ/float((mbband1)*(mbband1-1))
    1302                 :           0 :      JJ1=UU-UUmJJ
    1303                 :             :    endif
    1304                 :             : 
    1305                 :             : 
    1306                 :           0 :    JJ=czero
    1307         [ #  # ]:           0 :    do m1=1,mbband1
    1308         [ #  # ]:           0 :      do m2=1,mbband1
    1309         [ #  # ]:           0 :        if(m1/=m2) JJ=JJ+Interaction(m1,m2,m2,m1)
    1310                 :             :      enddo
    1311                 :             :    enddo
    1312         [ #  # ]:           0 :    if (mbband1/=1) then
    1313                 :           0 :      JJ=JJ/float((mbband1)*(mbband1-1))
    1314                 :             :    endif
    1315                 :             : 
    1316                 :           0 :    write(message,'(a,3x,2a,2f10.4,a)')ch10,utype,&
    1317                 :           0 :      & ' value of J=U-1/((2l+1)(2l)) \sum_{m1,m2} (U(m1,m2,m1,m2)-U(m1,m2,m2,m1))=',JJ1,ch10
    1318                 :           0 :    call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1319                 :             : 
    1320         [ #  # ]:           0 :    if (mbband1/=1) then
    1321                 :           0 :      UUmJJ=czero
    1322         [ #  # ]:           0 :      do m1=1,mbband1
    1323         [ #  # ]:           0 :        do m2=1,mbband1
    1324                 :           0 :          UUmJJ=UUmJJ+Interaction(m1,m2,m1,m2)-Interaction(m1,m1,m2,m2)
    1325                 :             :        enddo
    1326                 :             :      enddo
    1327                 :           0 :      UUmJJ=UUmJJ/float((mbband1)*(mbband1-1))
    1328                 :           0 :      JJ2=UU-UUmJJ
    1329         [ #  # ]:           0 :      if(abs(JJ1-JJ2)<0.0001) then
    1330                 :           0 :        JJ=JJ1
    1331                 :             :      else
    1332                 :             : 
    1333                 :           0 :      write(message,'(a,3x,2a,2f10.4,a)')ch10,utype,&
    1334                 :           0 :        &   ' value of J=U-1/((2l+1)(2l)) \sum_{m1,m2} (U(m1,m2,m1,m2)-U(m1,m1,m2,m2))=',JJ2,ch10
    1335                 :           0 :      call wrtout(std_out,message,'COLL')
    1336                 :             : !     stop
    1337                 :             :    endif
    1338                 :             :  endif
    1339                 :             : endif
    1340                 :             : 
    1341   [ #  #  #  # ]:           0 :  if(lprint .and. one_orbital==1) then
    1342                 :           0 :    write(message,*)ch10,' Hund coupling J2=U(m1,m2,m2,m1) for the ', utype
    1343                 :           0 :    call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1344                 :             : 
    1345   [ #  #  #  # ]:           0 :    write(message,'(a,14i7)') " -",(m2,m2=1,mbband1)
    1346                 :           0 :    call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1347         [ #  # ]:           0 :    do m1=1,mbband1
    1348         [ #  # ]:           0 :      if (option.EQ.1) then
    1349   [ #  #  #  # ]:           0 :         write(message,'(a,i3,14f7.3)') " ",m1,(real(Interaction(m1,m2,m2,m1)),m2=1,mbband1)
    1350                 :           0 :         call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1351                 :             :      end if
    1352                 :             :    end do
    1353                 :             : ! write(message,*) "";call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
    1354                 :             : ! write(message,*) "U'=U-2J for the t2g should be checked"
    1355                 :             : ! call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1356                 :             :  endif
    1357                 :             : 
    1358                 :           0 :  END SUBROUTINE Affichage
    1359                 :             : 
    1360                 :             :  SUBROUTINE Sauvegarde_M_q_m(M_q_m,normG,nqibz,npw,mbband)
    1361                 :             : 
    1362                 :             :  integer, intent(in) :: nqibz,npw,mbband
    1363                 :             :  complex(dp), intent(in) :: M_q_m(mbband,mbband,npw,nqibz)
    1364                 :             :  real(dp), intent(in) :: normG(npw)
    1365                 :             :  integer :: i,j,iq_ibz,iG,unt
    1366                 :             :  character(len=500) :: msg
    1367                 :             : 
    1368                 :             : !==Ecriture de M_(G=0)^(mm')(q) ==!
    1369                 :             :  if (open_file('M_mimj(n=1_2_3)(q,G=0)',msg,newunit=unt,form='formatted',status='unknown') /=0) then
    1370                 :             :    ABI_ERROR(msg)
    1371                 :             :  end if
    1372                 :             :  do iq_ibz=1,nqibz
    1373                 :             :     write(unt,*) iq_ibz,((abs(M_q_m(i,j,1,iq_ibz)),i=1,mbband),j=1,mbband)
    1374                 :             :  end do
    1375                 :             :  close(unt)
    1376                 :             : 
    1377                 :             : !==Ecriture de M_G^(mm')(q=0) ==!
    1378                 :             :  if (open_file('M_mm(m=1..mbband)(q=0)',msg,newunit=unt,form='formatted',status='unknown') /= 0) then
    1379                 :             :    ABI_ERROR(msg)
    1380                 :             :  end if
    1381                 :             :  do iG=1,npw
    1382                 :             :     write(unt,*) normG(iG),(abs(M_q_m(i,i,iG,1)),i=1,mbband)
    1383                 :             :  end do
    1384                 :             :  close(unt)
    1385                 :             :  END SUBROUTINE Sauvegarde_M_q_m
    1386                 :             : 
    1387                 :           0 :  subroutine print_orbitals(spin1,spin2,iatom1,iatom2,iatom3,iatom4,pos1,pos2,pos3,pos4,il1,il2,il3,il4,wanbz,opt)
    1388                 :             :    integer, intent(in) :: spin1,spin2,iatom1,iatom2,iatom3,iatom4,pos1,pos2,pos3,pos4,il1,il2,il3,il4,opt
    1389                 :             :    type(plowannier_type),intent(in) :: wanbz
    1390                 :             :    character(len=5000) ::message
    1391                 :             :    character(len=10):: print_spin
    1392                 :             : 
    1393   [ #  #  #  # ]:           0 :    if (spin1==spin2 .and. spin1==1)then
    1394                 :           0 :      print_spin=" Up-Up"
    1395   [ #  #  #  # ]:           0 :    else if(spin1==1 .and. spin2==2)then
    1396                 :           0 :      print_spin=" Up-Down"
    1397   [ #  #  #  # ]:           0 :    else if(spin1==2 .and. spin2==1) then
    1398                 :           0 :      print_spin=" Down-Up"
    1399                 :             :    else
    1400                 :           0 :      print_spin=" Down-Down"
    1401                 :             :    endif
    1402         [ #  # ]:           0 :    if (opt==1)then
    1403                 :           0 :      write(message,*)ch10,"==Definition of the orbitals=="
    1404         [ #  # ]:           0 :    else if (opt==0) then
    1405                 :           0 :      write(message,*)ch10,"==Reminder of the orbitals=="
    1406         [ #  # ]:           0 :    else if (opt==2) then
    1407                 :           0 :      write(message,*)ch10,"==Reminder of the orbitals=="
    1408                 :           0 :      write(print_spin,*)" summary"
    1409         [ #  # ]:           0 :    else if (opt==3) then
    1410                 :           0 :      write(message,*)ch10,"==Reminder of the orbitals=="
    1411                 :           0 :      write(print_spin,*)" average"
    1412                 :             :    endif
    1413                 :           0 :    call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
    1414   [ #  #  #  #  :           0 :    if (iatom1==iatom2.and. iatom3==iatom4 .and. iatom3==iatom2)then
                   #  # ]
    1415   [ #  #  #  #  :           0 :      if(pos1==pos2 .and. pos3==pos4 .and. pos1==pos3)then
                   #  # ]
    1416   [ #  #  #  #  :           0 :        if (il1==il2 .and. il3==il4 .and. il3==il1)then
                   #  # ]
    1417                 :           0 :          write(message,*)" Only one orbital"
    1418                 :           0 :          call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
    1419                 :           0 :          write(message,*)" Orbital with l=",wanbz%latom_wan(iatom1)%lcalc(il1),&
    1420                 :           0 :            &"on atom",wanbz%iatom_wan(iatom1),"with spin's orientations",print_spin
    1421                 :           0 :          call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
    1422                 :             :        else
    1423                 :           0 :          write(message,*)"Different orbitals on atom",wanbz%iatom_wan(iatom1),"with spin's orientations",print_spin
    1424                 :           0 :          call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
    1425                 :           0 :          write(message,*)"  orbital 1 with l=",wanbz%latom_wan(iatom1)%lcalc(il1)
    1426                 :           0 :          call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
    1427                 :           0 :          write(message,*)"  orbital 2 with l=",wanbz%latom_wan(iatom1)%lcalc(il2)
    1428                 :           0 :          call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
    1429                 :           0 :          write(message,*)"  orbital 3 with l=",wanbz%latom_wan(iatom1)%lcalc(il3)
    1430                 :           0 :          call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
    1431                 :           0 :          write(message,*)"  orbital 4 with l=",wanbz%latom_wan(iatom1)%lcalc(il4)
    1432                 :           0 :          call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
    1433                 :             :        endif
    1434                 :             :      else
    1435   [ #  #  #  #  :           0 :        if(il1==il2 .and. il3==il4 .and. il1==il3)then
                   #  # ]
    1436                 :           0 :          write(message,*)" Different position of the same orbital"
    1437                 :           0 :          call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
    1438                 :           0 :          write(message,*)" Orbitals with l=",wanbz%latom_wan(iatom1)%lcalc(il1),&
    1439                 :           0 :            &"on atom",wanbz%iatom_wan(iatom1),"with spin's orientations",print_spin
    1440                 :           0 :          call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
    1441         [ #  # ]:           0 :          write(message,*)"  orbital 1 at postion ",wanbz%nposition(iatom1)%pos(pos1,:)
    1442                 :           0 :          call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
    1443         [ #  # ]:           0 :          write(message,*)"  orbital 2 at postion ",wanbz%nposition(iatom1)%pos(pos2,:)
    1444                 :           0 :          call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
    1445         [ #  # ]:           0 :          write(message,*)"  orbital 3 at postion ",wanbz%nposition(iatom1)%pos(pos3,:)
    1446                 :           0 :          call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
    1447         [ #  # ]:           0 :          write(message,*)"  orbital 4 at postion ",wanbz%nposition(iatom1)%pos(pos4,:)
    1448                 :           0 :          call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
    1449                 :             :        else
    1450                 :           0 :          write(message,*)" Different orbitals on the same atom, with different positions"
    1451                 :           0 :          call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
    1452                 :           0 :          write(message,*)" Orbitals on atom",wanbz%iatom_wan(iatom1),"with spin's orientations",print_spin
    1453                 :           0 :          call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
    1454         [ #  # ]:           0 :          write(message,*)"  orbital 1 with l=",wanbz%latom_wan(iatom1)%lcalc(il1),"at position ",wanbz%nposition(iatom1)%pos(pos1,:)
    1455                 :           0 :          call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
    1456         [ #  # ]:           0 :          write(message,*)"  orbital 2 with l=",wanbz%latom_wan(iatom1)%lcalc(il2),"at position ",wanbz%nposition(iatom1)%pos(pos2,:)
    1457                 :           0 :          call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
    1458         [ #  # ]:           0 :          write(message,*)"  orbital 3 with l=",wanbz%latom_wan(iatom1)%lcalc(il3),"at position ",wanbz%nposition(iatom1)%pos(pos3,:)
    1459                 :           0 :          call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
    1460         [ #  # ]:           0 :          write(message,*)"  orbital 4 with l=",wanbz%latom_wan(iatom1)%lcalc(il4),"at position ",wanbz%nposition(iatom1)%pos(pos4,:)
    1461                 :           0 :          call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
    1462                 :             :        endif
    1463                 :             :      endif
    1464                 :             :    else
    1465   [ #  #  #  #  :           0 :      if(pos1==pos2 .and. pos3==pos4 .and. pos1==pos3)then
                   #  # ]
    1466                 :           0 :        write(message,*)"Different atoms, with spin orientation",print_spin
    1467                 :           0 :        call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
    1468                 :           0 :        write(message,*)"  orbital 1 with l=",wanbz%latom_wan(iatom1)%lcalc(il1),"on atom",wanbz%iatom_wan(iatom1)
    1469                 :           0 :        call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
    1470                 :           0 :        write(message,*)"  orbital 2 with l=",wanbz%latom_wan(iatom2)%lcalc(il2),"on atom",wanbz%iatom_wan(iatom2)
    1471                 :           0 :        call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
    1472                 :           0 :        write(message,*)"  orbital 3 with l=",wanbz%latom_wan(iatom3)%lcalc(il3),"on atom",wanbz%iatom_wan(iatom3)
    1473                 :           0 :        call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
    1474                 :           0 :        write(message,*)"  orbital 4 with l=",wanbz%latom_wan(iatom4)%lcalc(il4),"on atom",wanbz%iatom_wan(iatom4)
    1475                 :           0 :        call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
    1476                 :             :      else
    1477                 :           0 :        write(message,*)"Different atoms, in different postions with spin's orientations",print_spin
    1478                 :           0 :        call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
    1479                 :           0 :        write(message,*)"  orbital 1 with l=",wanbz%latom_wan(iatom1)%lcalc(il1),&
    1480         [ #  # ]:           0 :          &"on atom",wanbz%iatom_wan(iatom1),"at position ",wanbz%nposition(iatom1)%pos(pos1,:)
    1481                 :           0 :        call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
    1482                 :           0 :        write(message,*)"  orbital 2 with l=",wanbz%latom_wan(iatom2)%lcalc(il2),&
    1483         [ #  # ]:           0 :          &"on atom",wanbz%iatom_wan(iatom2),"at position ",wanbz%nposition(iatom2)%pos(pos2,:)
    1484                 :           0 :        call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
    1485                 :           0 :        write(message,*)"  orbital 3 with l=",wanbz%latom_wan(iatom3)%lcalc(il3),&
    1486         [ #  # ]:           0 :          &"on atom",wanbz%iatom_wan(iatom3),"at position ",wanbz%nposition(iatom3)%pos(pos3,:)
    1487                 :           0 :        call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
    1488                 :           0 :        write(message,*)"  orbital 4 with l=",wanbz%latom_wan(iatom4)%lcalc(il4),&
    1489         [ #  # ]:           0 :          &"on atom",wanbz%iatom_wan(iatom4),"at position ",wanbz%nposition(iatom4)%pos(pos4,:)
    1490                 :           0 :        call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
    1491                 :             :      endif
    1492                 :             :    endif
    1493                 :           0 :  end subroutine print_orbitals
    1494                 :             : 
    1495                 :             : 
    1496                 :           0 :  subroutine print_uj_spin(nomega,uspin,jspin,omega,one_orbital)
    1497                 :             :    integer,intent(in) :: nomega,one_orbital
    1498                 :             :    complex(dp),intent(in) :: uspin(4,nomega)
    1499                 :             :    complex(dp),intent(in) :: jspin(4,nomega)
    1500                 :             :    real(dp),intent(in) :: omega(nomega)
    1501                 :             :    integer :: iomega,ispin
    1502                 :           0 :    complex(dp) :: uomega(nomega),jomega(nomega)
    1503                 :             :    character(len=500)::message
    1504                 :             : 
    1505                 :           0 :    call print_orbitals(spin1,spin2,iatom1,iatom2,iatom3,iatom4,pos1,pos2,pos3,pos4,il1,il2,il3,il4,wanbz,3)
    1506                 :           0 :    write(message,*)ch10," --------------------------------------------------------------------"
    1507                 :           0 :    call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1508                 :           0 :    write(message,*)" Sum up of the calcul for different spin polarization and frequencies"
    1509                 :           0 :    call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1510                 :           0 :    write(message,*)" --------------------------------------------------------------------"
    1511                 :           0 :    call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1512                 :             : 
    1513                 :             : 
    1514                 :           0 :    write(message,*)ch10,"Sum up of U",ch10
    1515                 :           0 :    call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1516                 :             : 
    1517                 :           0 :    write(message,'(6a)')" -omega (eV)- "," Up-Up "," Up-Down "," Down-Up "," Down-Down "," Average "
    1518                 :           0 :    call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1519         [ #  # ]:           0 :    do iomega=1,nomega
    1520   [ #  #  #  #  :           0 :      write(message,'(a,f7.2,5f9.3)')"    ",omega(iomega)*Ha_eV,(real(uspin(ispin,iomega)),ispin=1,4),sum(real(uspin(:,iomega)))/4
                   #  # ]
    1521                 :           0 :      call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1522                 :             :    end do
    1523                 :             : 
    1524         [ #  # ]:           0 :    if (one_orbital==1)then
    1525                 :           0 :      write(message,*)ch10,"Sum up of J",ch10
    1526                 :           0 :      call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1527                 :             : 
    1528                 :           0 :      write(message,'(6a)')" -omega (eV)- "," Up-Up "," Up-Down "," Down-Up "," Down-Down "," Average "
    1529                 :           0 :      call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1530         [ #  # ]:           0 :      do iomega=1,nomega
    1531   [ #  #  #  #  :           0 :        write(message,'(a,f7.2,5f9.3)')"    ",omega(iomega)*Ha_eV,(real(jspin(ispin,iomega)),ispin=1,4),sum(real(jspin(:,iomega)))/4
                   #  # ]
    1532                 :           0 :        call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1533                 :             :      end do
    1534                 :             :    endif
    1535   [ #  #  #  # ]:           0 :    uomega(:)=sum(uspin,dim=1)/4
    1536   [ #  #  #  # ]:           0 :    jomega(:)=sum(jspin,dim=1)/4
    1537                 :             :    !call print_orbitals(spin1,spin2,iatom1,iatom2,iatom3,iatom4,pos1,pos2,pos3,pos4,il1,il2,il3,il4,wanbz,3)
    1538                 :           0 :    write(message,*)ch10,"  -------------------------------------------------------------"
    1539                 :           0 :    call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1540                 :           0 :    write(message,*)"           Average U and J as a function of frequency   "
    1541                 :           0 :    call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1542                 :           0 :    write(message,*)"  -------------------------------------------------------------"
    1543                 :           0 :    call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1544                 :           0 :    write(message,*)"        omega           U(omega)            J(omega)"
    1545                 :           0 :    call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1546         [ #  # ]:           0 :    do iomega=1,nomega
    1547                 :           0 :      write(message,'(2x,f11.3,2x,2f10.4,2x,2f10.4)')  omega(iomega)*Ha_eV, uomega(iomega),jomega(iomega)
    1548                 :           0 :      call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1549                 :             :    enddo
    1550                 :           0 :    write(message,*)"  -------------------------------------------------------------"
    1551                 :           0 :    call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
    1552                 :           0 :  end subroutine print_uj_spin
    1553                 :             : 
    1554                 :             :  end subroutine calc_ucrpa
    1555                 :             : !!***
    1556                 :             : 
    1557                 :             : END MODULE m_calc_ucrpa
    1558                 :             : !!***
        

Generated by: LCOV version 2.3-1