LCOV - code coverage report
Current view: top level - src/68_dmft - m_forctqmc.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 22.7 % 2253 511
Test Date: 2026-09-21 22:40:37 Functions: 15.0 % 20 3

            Line data    Source code
       1              : !!****m* ABINIT/m_forctqmc
       2              : !! NAME
       3              : !!  m_forctqmc
       4              : !!
       5              : !! FUNCTION
       6              : !! Prepare CTQMC and call CTQMC
       7              : !!
       8              : !! COPYRIGHT
       9              : !! Copyright (C) 2006-2026 ABINIT group (BAmadon, VPlanes)
      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              : #include "abi_common.h"
      25              : 
      26              : MODULE m_forctqmc
      27              : 
      28              :  use defs_basis
      29              :  use m_abicore
      30              :  use m_Ctqmc
      31              :  use m_CtqmcInterface
      32              :  use m_Ctqmcoffdiag
      33              :  use m_CtqmcoffdiagInterface
      34              :  use m_CtqmcoffdiagComplex
      35              :  use m_CtqmcoffdiagInterfaceComplex
      36              :  use m_data4entropyDMFT
      37              :  use m_errors
      38              :  use m_GreenHyb
      39              :  use m_time
      40              : 
      41              :  use m_crystal, only : crystal_t
      42              :  use m_datafordmft, only : compute_levels,hybridization_asymptotic_coefficient
      43              :  use m_energy, only : compute_migdal_energy,compute_trace_log_loc
      44              :  use m_fstrings, only : int2char4
      45              :  use m_green, only : compute_moments_loc,copy_green,destroy_green,green_type, &
      46              :     & init_green,int_fct,occup_green_tau,print_green
      47              :  use m_hide_lapack, only : matrginv,xginv
      48              :  use m_hu, only : copy_hu,destroy_hu,destroy_vee,hu_type,init_vee, &
      49              :     & rotatevee_hu,vee_type,vee_ndim2tndim_hu_r
      50              :  use m_io_tools, only : flush_unit,open_file
      51              :  use m_matlu, only : add_matlu,checkdiag_matlu,checkreal_matlu,chi_matlu,copy_matlu,destroy_matlu, &
      52              :      & diag_matlu,diff_matlu,fac_matlu,gather_matlu,init_matlu,magmomforb_matlu,magmomfspin_matlu, &
      53              :      & magmomfzeeman_matlu,matlu_type,print_matlu,printplot_matlu,prod_matlu,rotate_matlu,shift_matlu, &
      54              :      & slm2ylm_matlu,sym_matlu,symmetrize_matlu,xmpi_matlu,ylm2jmj_matlu,zero_matlu,magnfield_matlu,magmomjmj_matlu
      55              :  use m_numeric_tools, only : coeffs_gausslegint
      56              :  use m_oper, only : destroy_oper,gather_oper,identity_oper,init_oper,inverse_oper,oper_type, &
      57              :      & init_oper_ndat,copy_oper_to_ndat,copy_oper_from_ndat
      58              :  use m_paw_correlations, only : calc_vee
      59              :  use m_paw_dmft, only : paw_dmft_type
      60              :  use m_paw_numeric, only : jbessel => paw_jbessel
      61              :  use m_pawang, only : pawang_type
      62              :  use m_self, only : destroy_self,initialize_self,self_type
      63              :  use m_special_funcs, only : sbf8
      64              :  use m_splines, only : spline2_complex
      65              : 
      66              :  use netcdf !If calling TRIQS via python invocation, write a .nc file
      67              : 
      68              :  implicit none
      69              : 
      70              :  private
      71              : 
      72              :  public :: qmc_prep_ctqmc
      73              :  public :: testcode_ctqmc
      74              :  public :: testcode_ctqmc_b
      75              :  public :: ctqmcoutput_to_green
      76              :  public :: ctqmcoutput_printgreen
      77              :  public :: ctqmc_calltriqs
      78              :  public :: ctqmc_calltriqs_c
      79              : !!***
      80              : 
      81              : contains
      82              : !!****f* m_forctqmc/qmc_prep_ctqmc
      83              : !! NAME
      84              : !! qmc_prep_ctqmc
      85              : !!
      86              : !! FUNCTION
      87              : !! Prepare and call the qmc subroutines
      88              : !!
      89              : !! INPUTS
      90              : !!  cryst_struc <type(crystal_t)>=crystal structure data
      91              : !!  self <type(self_type)>= self-energy
      92              : !!  hu <type(hu_type)>= U interaction
      93              : !!  paw_dmft <type(paw_dmft_type)>= DMFT data structure
      94              : !!  pawang <type(pawang)>=paw angular mesh and related data
      95              : !!  pawprtvol = drive the amount of writed data.
      96              : !!  weiss <type(green_type)>= weiss function
      97              : !!
      98              : !! OUTPUT
      99              : !!  green <type(green_type)>= green function
     100              : !!
     101              : !! NOTES
     102              : !!
     103              : !! SOURCE
     104              : 
     105           34 : subroutine qmc_prep_ctqmc(cryst_struc,green,self,hu,paw_dmft,pawang,pawprtvol,weiss)
     106              : 
     107              : !Arguments ------------------------------------
     108              : !scalars
     109              : ! type(pawang_type), intent(in) :: pawang
     110              :  type(crystal_t), intent(in) :: cryst_struc
     111              :  type(green_type), intent(inout) :: green  ! MGNAG: This fix the problem with v7[27:29] on nag@petrus
     112              :  type(hu_type), intent(inout) :: hu(cryst_struc%ntypat)
     113              :  type(paw_dmft_type), intent(inout) :: paw_dmft
     114              :  type(pawang_type), intent(in) :: pawang
     115              :  integer, intent(in) :: pawprtvol
     116              :  type(green_type), target, intent(inout) :: weiss
     117              :  type(self_type), intent(inout) :: self
     118              : !Local variables ------------------------------
     119              :  integer :: iatom,icomp,ierr,if1,if2,iflavor1,iflavor2,ifreq,im1,im2,ima,imb,ispa,ispb,ispinor
     120              :  integer :: ispinor1,ispinor2,isppol,itau,itypat,lpawu,myproc,natom,ndim,nflavor,nomega,nproc
     121              :  integer :: nspinor,nsppol,nsppol_imp,ntypat,nwlo,opt_diag,opt_fk,opt_nondiag,opt_complex
     122              :  integer :: opt_rot,rot_type_vee,testcode,testrot,tndim,unt,unt2,useylm,basis,usejmj,opt_hybri
     123              :  integer, parameter :: optdb = 0
     124              :  logical :: nondiaglevels
     125              :  logical(kind=1) :: leg_measure = .true.
     126              :  real(dp) :: doccsum,EE,f4of2_sla,f6of2_sla,noise,omega
     127           34 :  type(green_type) :: weiss_for_rot
     128           68 :  type(oper_type) :: energy_level,level_diag
     129           34 :  type(CtqmcInterface) :: hybrid
     130          102 :  type(CtqmcoffdiagInterface) :: hybridoffdiag
     131          102 :  type(CtqmcoffdiagInterfaceComplex) :: hybridoffdiagComplex
     132              :  real(dp) :: umod(2,2)
     133              :  complex(dp) :: integral(2,2)
     134           68 :  real(dp), allocatable :: docc(:,:),gtmp(:,:),gtmp_nd(:,:,:),levels_ctqmc(:),vee(:,:,:,:)
     135           68 :  complex(dpc), allocatable :: muorb(:),muspin(:),muzeem(:),levels_ctqmc_complex(:),gtmp_ndc(:,:,:)
     136           34 :  complex(dpc), allocatable :: fw1(:,:),fw1_nd(:,:,:),gw_tmp(:,:),gw_tmp_nd(:,:,:)
     137           68 :  complex(dpc), allocatable :: gw1_nd(:,:,:),hybri_limit(:,:),levels_ctqmc_nd(:,:),shift(:)
     138           34 :  type(coeff2c_type), allocatable :: magmom_orb(:),magmom_spin(:),magmom_tot(:)
     139           34 :  type(hu_type), allocatable :: hu_for_s(:)
     140           34 :  type(matlu_type), allocatable :: dmat_diag(:),eigvectmatlu(:),hybri_coeff(:),matlu1(:),matlu2(:),matlu3(:)
     141           34 :  type(matlu_type), allocatable :: matlu4(:),matlumag(:),matlumag_orb(:),matlumag_spin(:),matlumag_tot(:)
     142           34 :  type(matlu_type), allocatable :: udens_atoms(:),udens_atoms_for_s(:)
     143           34 :  type(matlu_type), allocatable :: levels_temp(:),magnfield(:)
     144           34 :  type(vee_type), allocatable :: vee_for_s(:),vee_rotated(:)
     145              :  character(len=13) :: tag
     146              :  character(len=2)  :: tag_atom
     147              :  character(len=500) :: message
     148              :  real(dp) :: tsec(2)
     149              : #ifdef HAVE_OPENMP_OFFLOAD
     150              :  type(oper_type) :: green_oper_ndat
     151              : #endif
     152              : ! ************************************************************************
     153              : 
     154           34 :  call timab(701,1,tsec(:))
     155           34 :  call timab(702,1,tsec(:))
     156              :  !mbandc=paw_dmft%mbandc
     157              :  !nkpt=paw_dmft%nkpt
     158           34 :  natom   = paw_dmft%natom
     159           34 :  nspinor = paw_dmft%nspinor
     160           34 :  nsppol  = paw_dmft%nsppol
     161           34 :  ntypat  = paw_dmft%ntypat
     162           34 :  nwlo    = paw_dmft%dmft_nwlo
     163           34 :  basis   = paw_dmft%dmftctqmc_basis
     164              :  !greendft%whichgreen="DFT"
     165              : 
     166           34 :  call init_green(weiss_for_rot,paw_dmft,opt_oper_ksloc=2)
     167              :  ! call init_green(gw_loc,paw_dmft)
     168           34 :  call copy_green(weiss,weiss_for_rot,opt_tw=2)
     169              :  !=======================================================================
     170              :  !== Use one QMC solver   ===============================================
     171              :  !=======================================================================
     172           34 :  write(message,'(3a)') ch10,'  ===  CT-QMC solver === '
     173           34 :  call wrtout(std_out,message,'COLL')
     174              : 
     175              :  ! Initialise for compiler
     176              :  ! omega_current=czero
     177              : 
     178              :  ! Initialise nproc
     179           34 :  nproc=paw_dmft%nproc
     180           34 :  myproc = paw_dmft%myproc
     181              : 
     182              :  ! ======================================
     183              :  ! Allocations: diagonalization and eigenvectors
     184              :  ! ======================================
     185          164 :  ABI_MALLOC(udens_atoms,(natom))
     186          130 :  ABI_MALLOC(eigvectmatlu,(natom))
     187          164 :  ABI_MALLOC(magmom_orb,(natom))
     188          130 :  ABI_MALLOC(matlumag_orb,(natom))
     189          130 :  ABI_MALLOC(magmom_spin,(natom))
     190          130 :  ABI_MALLOC(matlumag_spin,(natom))
     191          130 :  ABI_MALLOC(magmom_tot,(natom))
     192          130 :  ABI_MALLOC(matlumag_tot,(natom))
     193           34 :  if (paw_dmft%ientropy == 1) then
     194            0 :    ABI_MALLOC(udens_atoms_for_s,(natom))
     195              :  end if
     196          130 :  ABI_MALLOC(dmat_diag,(natom))
     197           34 :  call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu(:),dmat_diag(:))
     198           34 :  call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu(:),eigvectmatlu(:))
     199           34 :  call init_matlu(natom,2,1,paw_dmft%lpawu(:),udens_atoms(:))
     200           34 :  if (paw_dmft%ientropy == 1) then
     201            0 :    call init_matlu(natom,2,1,paw_dmft%lpawu(:),udens_atoms_for_s(:))
     202              :  end if
     203           96 :  do iatom=1,natom
     204           62 :    lpawu = paw_dmft%lpawu(iatom)
     205           62 :    if (lpawu == -1) cycle
     206          136 :    ABI_MALLOC(magmom_orb(iatom)%value,(2*(2*lpawu+1),2*(2*lpawu+1)))
     207         4698 :    magmom_orb(iatom)%value=czero
     208          102 :    ABI_MALLOC(magmom_spin(iatom)%value,(2*(2*lpawu+1),2*(2*lpawu+1)))
     209         4698 :    magmom_spin(iatom)%value=czero
     210          102 :    ABI_MALLOC(magmom_tot(iatom)%value,(2*(2*lpawu+1),2*(2*lpawu+1)))
     211         4760 :    magmom_tot(iatom)%value=czero
     212              :  end do ! iatom
     213              : 
     214              :  ! =================================================================
     215              :  ! Impose diago of density matrix
     216              :  ! =================================================================
     217              : 
     218              :  ! =================================================================
     219              :  ! Impose diago of levels and Ylm basis if opt_nondiag=1
     220              :  ! =================================================================
     221              :  ! opt_diag=1 ! 1: diago the levels (The best choice).
     222              :  ! opt_diag=2 ! 2: diago density matrix (can be used for historical reasons)
     223              : 
     224              :  !  Need in the general case of two input variable for opt_diag and
     225              :  !  opt_nondiag!
     226              :  !  opt_nondiag should be 0 by default
     227           34 :  opt_diag    = 1
     228           34 :  opt_nondiag = 0
     229           34 :  if (paw_dmft%dmft_solv >= 6) opt_nondiag = 1 ! Use ctqmc in abinit with offdiag terms in F
     230              :  !else
     231              :  !  opt_nondiag = 0 ! use fast ctqmc in ABINIT without off diagonal terms in F
     232              :  !end if
     233              : 
     234           34 :  useylm = 0
     235           34 :  if (nspinor == 2) useylm = 1 ! to avoid complex G(tau)
     236           34 :  if (basis .eq. 4) then
     237            0 :    useylm = 1 ! first step before rotation to jmj
     238            0 :    usejmj = 1 ! jmj local basis
     239            0 :    opt_diag = 0 ! no diagonalization of local Hamiltonian
     240            0 :    opt_nondiag = 1 ! off_diag element taken into account
     241              :  else
     242           34 :    usejmj = 0
     243              :  endif
     244              : 
     245           34 :  opt_complex = 0
     246           34 :  if (paw_dmft%dmft_solv .eq. 10) then
     247            0 :     opt_complex = 1 !Complex G(tau)
     248            0 :     opt_hybri = paw_dmft%dmft_hybri_limit
     249              :  endif
     250              : 
     251              :  !write(6,*) "nspinor,useylm",nspinor,useylm
     252           34 :  if (useylm == 0) then
     253           34 :    write(std_out,*) " Slm (real spherical harmonics) basis is used (before a possible rotation)"
     254           34 :    rot_type_vee = 1 ! for rotatevee_hu
     255              : ! else if (useylm == 1) then
     256              : !   !write(std_out,*) " Ylm (complex spherical harmonics) basis is used (before rotation)"
     257              : !   write(message,'(3a)') ch10,"   == Only Density-Density Terms Included"
     258              : !   call wrtout(std_out,message,'COLL')
     259            0 :  else if (useylm == 1 .and. usejmj == 0) then
     260            0 :    write(message,'(3a)') ch10,"   == Only Density-Density Terms Included"
     261            0 :    call wrtout(std_out,message,'COLL')
     262              :    !write(std_out,*) " Ylm (complex spherical harmonics) basis is used (before rotation)"
     263            0 :    rot_type_vee = 4 ! for rotatevee_hu
     264            0 :  else if (useylm == 1 .and. usejmj == 1) then
     265            0 :    write(message,'(3a)') ch10,'   == Jmj local basis is used without diagonalization of local Hamiltonian ',ch10
     266            0 :    call wrtout(std_out,message,'COLL')
     267            0 :    rot_type_vee = 3 !
     268              :  end if ! useylm
     269              : 
     270              :  ! if(useylm==1.and.opt_diag/=1) ABI_ERROR("useylm==1 and opt_diag/=0 is not possible")
     271           34 :  if (hu(1)%jpawu_zero .and. nsppol == 2) nsppol_imp = 2 ! J=0 and nsppol=2
     272           34 :  if (.not. hu(1)%jpawu_zero .or. nsppol /= 2) nsppol_imp = 1  ! J/=0 ou nsppol=1
     273              :  ! =================================================================
     274              :  ! Compute DFT Green's function to compare to weiss_for_rot (check)
     275              :  ! =================================================================
     276              :  ! call init_green(greendft,paw_dmft,opt_oper_ksloc=3)
     277              :  ! call greendftcompute_green(cryst_struc,greendft,pawang,paw_dmft)
     278              :  !! call copy_green(greendft,weiss_for_rot,2)
     279              : 
     280              :  ! =================================================================
     281              :  ! Compute atomic levels
     282              :  ! =================================================================
     283           34 :  call init_oper(paw_dmft,energy_level,opt_ksloc=2)
     284              : 
     285              :  ! ----------------------------------
     286              :  ! Compute atomic levels in Slm basis
     287              :  ! ----------------------------------
     288           34 :  call compute_levels(energy_level,self%hdc,paw_dmft,nondiag=nondiaglevels)
     289              : 
     290              :  ! ------------------------------------------------
     291              :  ! If levels are not diagonal, then diagonalize it (according to
     292              :  ! dmftctqmc_basis)
     293              :  ! dmftctqmc_basis = 0 : Slm
     294              :  ! dmftctqmc_basis = 1 : diagonalize hamiltonian
     295              :  ! dmftctqmc_basis = 2 : Ylm
     296              :  ! dmftctqmc_basis = 3 : digonalize occupation matrix
     297              :  ! dmftctqmc_basis = 4 : JmJ
     298              :  ! ------------------------------------------------
     299           34 :  if (paw_dmft%dmftctqmc_basis == 1) then
     300           20 :    if (nondiaglevels .or. useylm == 1) then
     301            0 :      opt_diag = 1
     302            0 :      write(message,'(3a)') ch10,"   == Hamiltonian in local basis is not diagonal: diagonalize it",ch10
     303              :    else
     304           20 :      opt_diag = 0
     305           20 :      write(message,'(5a)') ch10,"   == Hamiltonian in local basis is diagonal in the Slm basis ",ch10, &
     306           40 :         & "      CTQMC will use this basis",ch10
     307              :    end if ! nondiaglevels or useylm
     308           14 :  else if (paw_dmft%dmftctqmc_basis == 2) then
     309           14 :    if (nondiaglevels .or. useylm == 1) then
     310           14 :      write(message,'(7a)') ch10,"   == Hamiltonian in local basis is not diagonal",ch10, &
     311           14 :        & "   == According to dmftctqmc_basis: diagonalize density matrix",ch10, &
     312           28 :        & "   == Warning : Check that the Hamiltonian is diagonal !",ch10
     313           14 :      opt_diag = 2
     314              :    else
     315            0 :      write(message,'(5a)') ch10,"   == Hamiltonian in local basis is diagonal in the Slm basis ",ch10, &
     316            0 :         & "      CTQMC will use this basis",ch10
     317            0 :      opt_diag = 0
     318              :    end if ! nondiaglevels or useylm
     319            0 :  else if (paw_dmft%dmftctqmc_basis == 0) then
     320            0 :    if (nondiaglevels) then
     321            0 :      write(message,'(4a)') ch10,"   == Hamiltonian in local basis is not diagonal",ch10, &
     322            0 :        & "   == According to dmftctqmc_basis: keep this non diagonal basis for the calculation"
     323              :    else
     324            0 :      write(message,'(5a)') ch10,"   == Hamiltonian in local basis is diagonal in the Slm basis ",ch10, &
     325            0 :        & "      CTQMC will use this basis",ch10
     326              :    end if ! nondiaglevels
     327            0 :    opt_diag = 0
     328              :  end if ! dmftctqmc_basis
     329           34 :  call wrtout(std_out,message,'COLL')
     330           34 :  if (opt_diag == 1) then
     331            0 :    write(message,'(5a)') "   == Switching to CTQMC basis: using basis that diagonalizes the electronic levels"
     332            0 :    call wrtout(std_out,message,'COLL')
     333           34 :  else if (opt_diag == 2) then
     334           14 :    write(message,'(5a)') "   == The correlated occupation matrix is diagonalized"
     335           14 :    call wrtout(std_out,message,'COLL')
     336              :  end if ! opt_diag
     337              : 
     338              :  ! =================================================================
     339              :  ! Now, check if diagonalisation is necessary
     340              :  ! =================================================================
     341              : 
     342              : 
     343              :  ! =================================================================
     344              :  ! First rotate to Ylm basis the atomic levels
     345              :  ! =================================================================
     346              : 
     347           34 :  if (useylm == 1) then
     348              : 
     349            0 :    write(message,'(2a)') ch10, "   == Switching to Ylm basis first"
     350            0 :    call wrtout(std_out,message,'COLL')
     351              : 
     352              :    ! Rotate from Slm to Ylm the atomic levels
     353              :    ! ----------------------------------------
     354            0 :    call slm2ylm_matlu(energy_level%matlu(:),natom,paw_dmft,1,0)
     355              : 
     356              :    ! Print atomic energy levels in Ylm basis
     357              :    ! --------------------------------
     358            0 :    if (pawprtvol >= 3) then
     359            0 :      write(message,'(2a)') ch10,"   == Print Energy levels in Ylm basis"
     360            0 :      call wrtout(std_out,message,'COLL')
     361            0 :      call print_matlu(energy_level%matlu(:),natom,1)
     362              :    end if ! pawprtvol>=3
     363              : 
     364              :    !==================================================================
     365              :    ! Add Zeeman contributions to local energy levels when nspinor = 2
     366              :    !==================================================================
     367            0 :    if(paw_dmft%dmft_magnfield .eq. 2 .and. nspinor .eq. 2) then
     368              : 
     369            0 :      ABI_MALLOC(magnfield,(natom))
     370            0 :      ABI_MALLOC(levels_temp,(natom))
     371              : 
     372            0 :      write(message,'(a,2x,a)') ch10, "   == Add Zeeman contributions to local energy levels in Ylm"
     373            0 :      call wrtout(std_out,message,'COLL')
     374              : 
     375            0 :      call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu,magnfield)
     376            0 :      call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu,levels_temp)
     377            0 :      call copy_matlu(energy_level%matlu,levels_temp,natom)
     378              : 
     379              :      !Spin-Orbit case, not much tested so far (need to remove AFM sym)
     380            0 :      call magnfield_matlu(magnfield,natom,paw_dmft%dmft_magnfield_b,2)
     381              :      !call print_matlu(magnfield,natom,1)
     382            0 :      call add_matlu(levels_temp,magnfield,energy_level%matlu,natom,-1)
     383            0 :      call print_matlu(energy_level%matlu,natom,1)
     384            0 :      call destroy_matlu(magnfield,natom)
     385            0 :      call destroy_matlu(levels_temp,natom)
     386              : 
     387            0 :      ABI_FREE(magnfield)
     388            0 :      ABI_FREE(levels_temp)
     389              :    endif !dmft_magnfield
     390              :  end if ! useylm
     391              : 
     392           34 :  if (usejmj .eq. 1) then
     393              :    !rotate form Ylm to jmj the atomic levels
     394            0 :    call ylm2jmj_matlu(energy_level%matlu(:),natom,1,paw_dmft)
     395              : 
     396              :    ! Print atomic energy levels in Ylm basis
     397              :    ! --------------------------------
     398            0 :    if (pawprtvol >= 3) then
     399            0 :      write(message,'(2a)') ch10," == Print Energy levels in jmj basis"
     400            0 :      call wrtout(std_out,message,'COLL')
     401            0 :      call print_matlu(energy_level%matlu(:),natom,1)
     402              :    end if ! pawprtvol>=3
     403              :  endif
     404              : 
     405          130 :  ABI_MALLOC(vee_rotated,(natom))
     406           34 :  call init_vee(paw_dmft,vee_rotated(:))
     407              : 
     408              :  ! ===========================================================================================
     409              :  ! Start for diagonalization of levels/density matrix according to opt_diag
     410              :  ! ===========================================================================================
     411              : 
     412              :  !opt_rot=2 ! do it one time before CTQMC
     413           34 :  opt_rot = 1 ! do all the rotations successively on all different quantities.
     414           34 :  if (opt_diag == 1 .or. opt_diag == 0) then
     415              : 
     416           20 :    if (opt_diag == 1) then
     417              :      ! =================================================================
     418              :      ! Diagonalize atomic levels
     419              :      ! =================================================================
     420            0 :      call init_oper(paw_dmft,level_diag,opt_ksloc=2)
     421              : 
     422              :      ! Diagonalize atomic levels (opt_real is necessary, because
     423              :      ! rotation must be real in order for the occupations and Green's
     424              :      ! function to be real)
     425              :      ! ---------------------------------------------------------------
     426            0 :      write(message,'(2a)') ch10, "   == Diagonalization of local Hamiltonian"
     427            0 :      call wrtout(std_out,message,'COLL')
     428              : 
     429              :      call diag_matlu(energy_level%matlu(:),level_diag%matlu(:),natom,pawprtvol,eigvectmatlu(:),&
     430            0 :                    & nsppol_imp=nsppol_imp,opt_real=1,test=paw_dmft%dmft_solv)  ! temporary: test should be extended to all cases.
     431              : 
     432              :  !     call rotate_matlu(energy_level%matlu,eigvectmatlu,natom,3,1)
     433              :  !       write(message,'(a,2x,a,f13.5)') ch10,&
     434              :  !&       " == Print first Diagonalized Energy levels for Fermi Level=",paw_dmft%fermie
     435              :  !       call wrtout(std_out,message,'COLL')
     436              :  !       call print_matlu(energy_level%matlu,natom,1,compl=1,opt_exp=1)
     437              : 
     438              :      if (opt_rot == 1) then
     439            0 :        call copy_matlu(level_diag%matlu(:),energy_level%matlu(:),natom)
     440              :      end if
     441              : 
     442            0 :      call destroy_oper(level_diag)
     443              : 
     444              :      ! Print diagonalized levels
     445              :      ! --------------------------
     446            0 :      write(tag,'(f13.5)') paw_dmft%fermie
     447            0 :      if (pawprtvol >= 3) then
     448            0 :        write(message,'(a,2x,2a)') ch10,&
     449            0 :          & " == Print Energy levels in CTQMC basis"
     450            0 :        call wrtout(std_out,message,'COLL')
     451            0 :        call print_matlu(energy_level%matlu(:),natom,1,compl=0)
     452              :      else
     453            0 :        write(message,'(a,2x,2a)') ch10,&
     454            0 :          & " == Energy levels Diagonalized for Fermi Level=",adjustl(tag)
     455            0 :        call wrtout(std_out,message,'COLL')
     456              :      end if ! pawprtvol>=3
     457              : 
     458              :    else if (opt_diag == 0) then
     459           68 :      do iatom = 1, natom
     460           48 :        lpawu = paw_dmft%lpawu(iatom)
     461           48 :        if (lpawu == -1) cycle
     462           20 :        itypat = paw_dmft%typat(iatom)
     463              :        !  write(6,*) size(udens_atoms(iatom)%value)
     464              :        !  write(6,*) size(hu(itypat)%udens)
     465              :        !  write(6,*) udens_atoms(iatom)%value
     466              :        !  write(6,*) hu(itypat)%udens
     467              :        !udens_atoms(iatom)%mat(:,:,1)=hu(itypat)%udens(:,:)
     468       155328 :        vee_rotated(iatom)%mat(:,:,:,:) = hu(itypat)%veeslm2(:,:,:,:)
     469              : 
     470           40 :        if (usejmj == 1) then
     471            0 :          do iflavor1=1,tndim
     472            0 :            do iflavor2=1,tndim
     473            0 :              if(iflavor1==iflavor2) then
     474            0 :                 eigvectmatlu(iatom)%mat(iflavor1,iflavor2,1)=cone
     475              :              else
     476            0 :                 eigvectmatlu(iatom)%mat(iflavor1,iflavor2,1)=czero
     477              :              end if
     478              :            end do
     479              :          end do
     480              : 
     481            0 :          call rotatevee_hu(hu(:),paw_dmft,pawprtvol,eigvectmatlu(:),rot_type_vee,udens_atoms(:),vee_rotated(:))
     482              : 
     483              :        else
     484         1744 :          udens_atoms(iatom)%mat(:,:,1)=hu(itypat)%udens(:,:)
     485              :        endif
     486              :      end do ! iatom
     487              :    end if ! opt_diag=0 or 1
     488              :  ! call rotatevee_hu(cryst_struc,hu,nspinor,nsppol,pawprtvol,eigvectmatlu,udens_atoms)
     489              : 
     490           14 :  else if (opt_diag == 2) then
     491              :    ! =================================================================
     492              :    ! Diagonalizes density matrix and keep eigenvectors in eigvectmatlu
     493              :    ! =================================================================
     494              : 
     495              :    ! Print density matrix before diagonalization
     496              :    ! -------------------------------------------
     497           14 :    if (pawprtvol >= 3) then
     498           14 :      write(message,'(a,2x,a)') ch10," == Density Matrix before diagonalization ="
     499           14 :      call wrtout(std_out,message,'COLL')
     500              :      !MGNAG: This call is wrong if green has intent(out), now we use intent(inout)
     501           14 :      call print_matlu(green%occup%matlu(:),natom,1)
     502              :    end if ! pawprtvol>=3
     503              : 
     504              :    !!  checkstop: we can have two different diagonalisation basis for the up and dn
     505              :    !!  but one use the same basis, unless the error is really to large(>0.1)
     506              : 
     507              :    ! Diagonalize density matrix
     508              :    ! ---------------------------
     509              :    call diag_matlu(green%occup%matlu(:),dmat_diag(:),natom,4,eigvectmatlu(:), &
     510           14 :                  & nsppol_imp=nsppol_imp,checkstop=.false.)
     511              : 
     512              :    ! Print diagonalized density matrix
     513              :    ! ----------------------------------
     514           14 :    if (pawprtvol >= 3) then
     515           14 :      write(message,'(a,2x,a)') ch10,&
     516           28 :        & " == Diagonalized Density Matrix in the basis used for QMC ="
     517           14 :      call wrtout(std_out,message,'COLL')
     518           14 :      call print_matlu(dmat_diag(:),natom,1)
     519              : 
     520              :      !write(message,'(2a,i3,13x,a)') ch10,'    ==  Rotation of interaction matrix =='
     521              :      !call wrtout(std_out,message,'COLL')
     522              :    end if ! pawprtvol>=3
     523              : 
     524              :    !if (.not.hu(1)%jpawu_zero) &
     525              :    !ABI_WARNING("In qmc_prep_ctqmc J/=0 and rotation matrix not rotated")
     526              :    !  Rotate interaction.
     527              :    !   call rotatevee_hu(cryst_struc,hu,nspinor,nsppol,pawprtvol,eigvectmatlu,udens_atoms)
     528              :    !   call rotatevee_hu(cryst_struc,hu,nspinor,nsppol,pawprtvol,eigvectmatlu,udens_atoms,rot_type_vee)
     529              :  end if
     530              :  ! ===========================================================================================
     531              :  ! END Of diagonalization
     532              :  ! ===========================================================================================
     533              : 
     534           34 :  if (paw_dmft%ientropy == 1) then
     535            0 :    ABI_MALLOC(hu_for_s,(ntypat))
     536              :        ! Usefull to compute interaction energy for U=1 J=J/U when U=0.
     537            0 :    call copy_hu(ntypat,hu(:),hu_for_s(:))
     538            0 :    f4of2_sla = - one
     539            0 :    f6of2_sla = - one
     540            0 :    do itypat=1,ntypat
     541            0 :      ndim = 2*hu(itypat)%lpawu + 1
     542            0 :      ABI_MALLOC(vee,(ndim,ndim,ndim,ndim))
     543              :      call calc_vee(f4of2_sla,f6of2_sla,paw_dmft%j_for_s/paw_dmft%u_for_s, &
     544            0 :                  & hu_for_s(itypat)%lpawu,pawang,one,vee(:,:,:,:))
     545            0 :      hu_for_s(itypat)%vee(:,:,:,:) = cmplx(vee(:,:,:,:),zero,kind=dp)
     546            0 :      ABI_FREE(vee)
     547              :    end do
     548            0 :    ABI_MALLOC(vee_for_s,(natom))
     549            0 :    call init_vee(paw_dmft,vee_for_s(:))
     550              :    call rotatevee_hu(hu_for_s(:),paw_dmft,pawprtvol,eigvectmatlu(:), &
     551            0 :                    & rot_type_vee,udens_atoms_for_s(:),vee_for_s(:))
     552            0 :    call destroy_hu(hu_for_s(:),ntypat)
     553              : !      udens_atoms_for_s will be used later.
     554            0 :    ABI_FREE(hu_for_s)
     555            0 :    call destroy_vee(paw_dmft,vee_for_s(:))
     556            0 :    ABI_FREE(vee_for_s)
     557              :  end if ! ientropy=1
     558              : 
     559           34 :  call flush_unit(std_out)
     560              : 
     561              :  ! ===========================================================================================
     562              :  ! Broadcast matrix of rotation from processor 0 to the other
     563              :  ! In case of degenerate levels, severals rotations are possible. Here we
     564              :  ! choose the rotation of proc 0. It is arbitrary.
     565              :  ! ===========================================================================================
     566           34 :  call xmpi_matlu(eigvectmatlu(:),natom,paw_dmft%spacecomm,master=0,option=2)
     567              : 
     568           34 :  if (opt_diag /= 0 ) then
     569              :    call rotatevee_hu(hu(:),paw_dmft,pawprtvol,eigvectmatlu(:), &
     570           14 :                    & rot_type_vee,udens_atoms(:),vee_rotated(:))
     571              :  end if
     572              : 
     573              :  !unitnb=300000+paw_dmft%myproc
     574              :  !call int2char4(paw_dmft%myproc,tag_proc)
     575              :  !tmpfil = 'eigvectmatluaftermpi'//tag_proc
     576              :  !open (unit=unitnb,file=trim(tmpfil),status='unknown',form='formatted')
     577              :  !do iflavor1=1,14
     578              :  !  do iflavor2=1,14
     579              :  !    write(unitnb,*) iflavor1,iflavor2,eigvectmatlu(1,1)%value(iflavor1,iflavor2)
     580              :  !  enddo
     581              :  !enddo
     582              : 
     583              :  ! ===========================================================================================
     584              :  ! Now rotate various quantities in the new basis
     585              :  ! ===========================================================================================
     586              : 
     587              :  !=======================================================
     588              :  ! Allocate, Compute, and Rotate atomic levels for CTQMC
     589              :  !=======================================================
     590              : 
     591              :  ! If levels not rotated, rotate them
     592              :  ! -----------------------------------
     593           34 :  if (opt_diag == 2 .and. opt_rot == 1) then
     594           14 :    call rotate_matlu(energy_level%matlu(:),eigvectmatlu(:),natom,1)
     595              :  end if
     596              : 
     597              :  ! Print atomic levels
     598              :  ! -------------------
     599           34 :  if (pawprtvol >= 3 .and. opt_diag == 2 .and. opt_rot == 1) then
     600           14 :    write(message,'(a,2x,a)') ch10," == Print Energy levels in CTQMC basis"
     601           14 :    call wrtout(std_out,message,'COLL')
     602           14 :    call print_matlu(energy_level%matlu(:),natom,1)
     603           20 :  else if (opt_diag == 2 .and. opt_rot == 1) then
     604            0 :    write(message,'(a,2x,a)') ch10," == CT-QMC Energy levels rotated"
     605            0 :    call wrtout(std_out,message,'COLL')
     606              :  end if ! pawprtvol>=3
     607              : 
     608              :  !====================================================================
     609              :  ! If levels were diagonalized before, then rotate density matrix for
     610              :  ! information.
     611              :  !====================================================================
     612           34 :  if (opt_diag == 1) then
     613              : 
     614            0 :    ABI_MALLOC(matlu1,(natom))
     615            0 :    call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu(:),matlu1(:))
     616            0 :    call copy_matlu(green%occup%matlu(:),matlu1(:),natom)
     617            0 :    if (pawprtvol >= 3) then
     618            0 :      write(message,'(a,2x,a)') ch10," == Print occupations in cubic basis"
     619            0 :      call wrtout(std_out,message,'COLL')
     620            0 :      call print_matlu(green%occup%matlu(:),natom,1)
     621              :    end if ! pawprtvol>=3
     622              : 
     623              :    ! 1) rotate density matrix to Ylm basis
     624              :    ! --------------------------------------
     625            0 :    if (useylm == 1) then
     626            0 :      call slm2ylm_matlu(matlu1(:),natom,paw_dmft,1,0)
     627              :     ! if (pawprtvol >= 3 ) then
     628              :     !   write(message,'(2a)') ch10," == Print occupations in Ylm basis"
     629              :     !   call wrtout(std_out,message,'COLL')
     630              :     !   call print_matlu(matlu1(:),natom,1)
     631              :     ! end if
     632              :    end if ! useylm
     633              : 
     634              :    ! 2) rotate density matrix to rotated basis
     635              :    ! -------------------------------------------
     636              :    if (opt_rot == 1 .or. opt_rot == 2) then
     637            0 :      call rotate_matlu(matlu1(:),eigvectmatlu(:),natom,1)
     638              :    end if
     639            0 :    write(message,'(a,2x,a)') ch10," == Print occupations in CTQMC basis"
     640            0 :    call wrtout(std_out,message,'COLL')
     641            0 :    call print_matlu(matlu1(:),natom,1,compl=1)
     642            0 :    if (paw_dmft%dmft_solv .eq. 10) then
     643            0 :      write(message,'(a,2x,a)') ch10,"   The potential complex off diagonal occupation matrix elements are &
     644            0 :       &taken into account in the CT-QMC with dmft_solv = 10."
     645            0 :      call wrtout(std_out,message,'COLL')
     646              :    else
     647            0 :      call checkreal_matlu(matlu1(:),natom,tol10)
     648              :    endif
     649            0 :    call destroy_matlu(matlu1(:),natom)
     650            0 :    ABI_FREE(matlu1)
     651              : 
     652              :  end if ! opt_diag=1
     653              : 
     654           34 :  call flush_unit(std_out)
     655              : 
     656              :  ! =================================================================
     657              :  ! Rotate weiss function according to eigenvectors.
     658              :  ! =================================================================
     659              :  !!!stop
     660              :  ! Rotate Weiss function first in Ylm basis
     661              :  ! -----------------------------------------------------------------
     662           34 :  if (pawprtvol >= 3) then
     663           28 :    write(message,'(a,2x,a)') ch10, " == Print Weiss-field for first frequency in Cubic basis"
     664           28 :    call wrtout(std_out,message,'COLL')
     665           28 :    call print_matlu(weiss_for_rot%oper(1)%matlu(:),natom,1,compl=1) !
     666              :  endif
     667              : 
     668           34 :  if(useylm==1) then
     669              :    !write(message,'(a,2x,a)') ch10, " == Rotation of weiss and greendft in the Ylm Basis="
     670              :    !call wrtout(std_out,message,'COLL')
     671            0 :    do ifreq=1,nwlo
     672            0 :      call slm2ylm_matlu(weiss_for_rot%oper(ifreq)%matlu(:),natom,paw_dmft,1,0)
     673            0 :      call slm2ylm_matlu(weiss%oper(ifreq)%matlu(:),natom,paw_dmft,1,0)
     674              :      ! call slm2ylm_matlu(greendft%oper(ifreq)%matlu,natom,1,0)
     675              :    end do
     676              :  end if
     677              : 
     678           34 :  if(usejmj==1) then
     679            0 :    write(message,'(a,2x,a)') ch10, " == Rotation of weiss and greendft in the jmj Basis="
     680            0 :    call wrtout(std_out,message,'COLL')
     681            0 :    do ifreq=1,nwlo
     682            0 :      call ylm2jmj_matlu(weiss_for_rot%oper(ifreq)%matlu(:),natom,1,paw_dmft)
     683            0 :      call ylm2jmj_matlu(weiss%oper(ifreq)%matlu(:),natom,1,paw_dmft)
     684              :    end do
     685              :  end if
     686              : 
     687              : 
     688              :  if (pawprtvol >= 3) then
     689              :    !   write(message,'(a,2x,a,f13.5)') ch10,& ! debug
     690              :    !   " == Print weiss for small freq 1 before rot" ! debug
     691              :    !   call wrtout(std_out,message,'COLL') ! debug
     692              :    !   call print_matlu(weiss_for_rot%oper(1)%matlu,natom,1) !  debug
     693              : 
     694              :    ! Print Weiss function
     695              :    ! --------------------
     696              :   ! write(message,'(a,2x,a)') ch10," == Print weiss for 1st freq before rot" ! debug
     697              :   ! call wrtout(std_out,message,'COLL') ! debug
     698              :   ! call print_matlu(weiss_for_rot%oper(1)%matlu(:),natom,1,compl=1) !  debug
     699              :   ! write(message,'(a,2x,a)') ch10," == Print weiss for last freq before rot" ! debug
     700              :   ! call wrtout(std_out,message,'COLL') ! debug
     701              :   ! call print_matlu(weiss_for_rot%oper(nwlo)%matlu(:),natom,1,compl=1) !  debug
     702              : !    write(message,'(a,2x,a,f13.5)') ch10,& ! debug
     703              : !&   " == Print DFT G for 1st freq before rot" ! debug
     704              : !    call wrtout(std_out,message,'COLL') ! debug
     705              : !    call print_matlu(greendft%oper(1)%matlu,natom,1,compl=1,opt_exp=2) !  debug
     706              : !    write(message,'(a,2x,a,f13.5)') ch10,& ! debug
     707              : !&   " == Print DFT G for last freq before rot" ! debug
     708              : !    call wrtout(std_out,message,'COLL') ! debug
     709              : !    call print_matlu(greendft%oper(paw_dmft%dmft_nwlo)%matlu,natom,1,compl=1,opt_exp=2) !  debug
     710              :  end if ! pawprtvol>=3
     711              : 
     712           34 :  if (opt_diag /= 0) then
     713              :    ! Rotate Weiss function from the Slm (or Ylm) to the basis of diagonalisation
     714              :    ! -------------------------------------------------------------------
     715              :    !write(message,'(a,2x,a)') ch10, " == Rotation of weiss ="
     716              :    !call wrtout(std_out,message,'COLL')
     717              : 
     718         1274 :    do ifreq=1,nwlo
     719           14 :      if (opt_rot == 1) then
     720         1260 :        call rotate_matlu(weiss_for_rot%oper(ifreq)%matlu(:),eigvectmatlu(:),natom,1)
     721         1260 :        call rotate_matlu(weiss%oper(ifreq)%matlu(:),eigvectmatlu(:),natom,1)
     722              :      end if ! opt_rot=1
     723              : !    call checkdiag_matlu(weiss_for_rot%oper(ifreq)%matlu,natom,tol6)
     724              :    end do ! ifreq
     725              : 
     726           28 :    do iatom=1,natom
     727              : 
     728           14 :      if (iatom < 10) then
     729           14 :        write(tag_atom,'("0",I1)') iatom
     730              :      else
     731            0 :        write(tag_atom,'(I2)') iatom
     732              :      endif
     733              : 
     734              :      !print Weiss field for correlated atoms
     735           14 :      lpawu = paw_dmft%lpawu(iatom)
     736           14 :      if (lpawu == -1) cycle
     737              : 
     738           28 :      if (myproc == mod(nproc+1,nproc)) then
     739            8 :        if (open_file(trim(paw_dmft%filapp)//"_atom_"//tag_atom//"_G0w.dat",message,newunit=unt) /= 0) ABI_ERROR(message)
     740            8 :        ndim = 2*paw_dmft%lpawu(iatom) + 1
     741          728 :        do ifreq=1,nwlo
     742          720 :          write(unt,'(29f21.14)') paw_dmft%omega_lo(ifreq),&
     743         2880 :            & (((weiss_for_rot%oper(ifreq)%matlu(iatom)%mat(im1+(ispinor-1)*ndim,im1+(ispinor-1)*ndim,isppol),&
     744         5048 :            & im1=1,3),ispinor=1,nspinor),isppol=1,nsppol)
     745              :        end do ! ifreq
     746            8 :        close(unit=unt)
     747              :      end if ! myproc=master
     748              :    enddo
     749              : 
     750           14 :    call flush_unit(std_out)
     751           14 :    if (pawprtvol >= 3) then
     752           14 :      write(message,'(a,2x,a)') ch10," == Print Weiss-field for first frequency in CTQMC basis" ! debug
     753           14 :      call wrtout(std_out,message,'COLL') ! debug
     754           14 :      call print_matlu(weiss_for_rot%oper(1)%matlu(:),natom,1,compl=1) !  debug
     755              :     ! write(message,'(a,2x,a)') ch10," == Print weiss for last freq after rot"   ! debug
     756              :     ! call wrtout(std_out,message,'COLL')   ! debug
     757              :     ! call print_matlu(weiss_for_rot%oper(nwlo)%matlu(:),natom,1,compl=1) ! debug
     758              :    end if ! pawprtvol>=3
     759              : 
     760              :    !   ! Rotate DFT Green's function first in Ylm basis then in the rotated basis and compare to weiss_for_rot
     761              :    !   ! -----------------------------------------------------------------------------------------------------
     762              :    !   write(message,'(a,2x,a)') ch10, " == Rotation of greendft ="
     763              :    !   call wrtout(std_out,message,'COLL')
     764              :    !   do ifreq=1,paw_dmft%dmft_nwlo
     765              :    !     if(opt_rot==1) call rotate_matlu(greendft%oper(ifreq)%matlu,eigvectmatlu,natom,3,1)
     766              :    !     call diff_matlu("Weiss_for_rot","greendft",weiss_for_rot%oper(ifreq)%matlu,greendft%oper(ifreq)%matlu,natom,1,tol14)
     767              :    !!    call checkdiag_matlu(weiss_for_rot%oper(ifreq)%matlu,natom,tol6)
     768              :    !   end do
     769              :    !   if(pawprtvol>=3) then
     770              :    !     write(message,'(a,2x,a,f13.5)') ch10,& ! debug
     771              :    !&    " == Print greendft for small freq 1 after rot" ! debug
     772              :    !     call wrtout(std_out,message,'COLL') ! debug
     773              :    !     call print_matlu(greendft%oper(1)%matlu,natom,1,compl=1,opt_exp=2) !  debug
     774              :    !     write(message,'(a,2x,a,f13.5)') ch10,&   ! debug
     775              :    !&    " == Print greendft for last freq after rot"   ! debug
     776              :    !     call wrtout(std_out,message,'COLL')   ! debug
     777              :    !     call print_matlu(greendft%oper(paw_dmft%dmft_nwlo)%matlu,natom,1,compl=1,opt_exp=2) ! debug
     778              :    !   end if
     779              :    !   call flush_unit(std_out)
     780              :  end if
     781              : 
     782              :  ! =================================================================
     783              :  ! Compute analytic limit of hybridization and rotate it
     784              :  ! =================================================================
     785          164 :  ABI_MALLOC(hybri_coeff,(natom))
     786           34 :  call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu(:),hybri_coeff(:))
     787              :  !write(6,*)"hybri1",hybri_coeff(1)%mat(1,1,1,1,1),paw_dmft%natom,cryst_struc%natom
     788              : 
     789              :  ! Compute analytical C_ij such that F_ij -> C_ij/iw_n
     790              :  ! ---------------------------------------
     791           34 :  call hybridization_asymptotic_coefficient(cryst_struc,paw_dmft,hybri_coeff(:))
     792              : 
     793              :  ! Print analytical C_ij (not rotated)
     794              :  ! ---------------------------------------
     795           34 :  if (paw_dmft%dmft_solv /= 10) then
     796           34 :    write(message,'(a,2x,a)') ch10," == Coeff analytical C_ij such that F -> C_ij/iw_n for large frequency"
     797           34 :    call wrtout(std_out,message,'COLL')
     798           34 :    call print_matlu(hybri_coeff(:),natom,1)
     799              :  endif
     800              : 
     801              :  ! Rotate analytical C_ij in Ylm basis
     802              :  ! ---------------------------------------
     803           34 :  if (useylm == 1) then
     804            0 :    call slm2ylm_matlu(hybri_coeff(:),natom,paw_dmft,1,0)
     805              :  end if
     806              :  !rotate in jmj basis
     807           34 :  if (usejmj == 1) then
     808            0 :    call ylm2jmj_matlu(hybri_coeff(:),natom,1,paw_dmft)
     809              :  end if
     810              : 
     811           34 :  if (opt_diag /= 0)  then
     812              :    ! Rotate analytical C_ij in rotated basis
     813              :    ! ---------------------------------------
     814              :    if (opt_rot == 1 .or. opt_rot == 2) then
     815           14 :      call rotate_matlu(hybri_coeff(:),eigvectmatlu(:),natom,1)
     816              :    end if
     817              : 
     818              :    ! Print analytical C_ij (rotated)
     819              :    ! ---------------------------------------
     820           14 :    if (paw_dmft%dmft_solv /= 10) then
     821           14 :      write(message,'(a,2x,a)') ch10," == Coeff analytical C_ij such that F -> C_ij/iw_n after rotation"
     822           14 :      call wrtout(std_out,message,'COLL')
     823           14 :      call print_matlu(hybri_coeff(:),natom,1,compl=1,opt_exp=0)
     824              :    endif
     825              :  end if
     826              : 
     827              :  ! =================================================================
     828              :  ! Check if rotation is properly done.
     829              :  ! =================================================================
     830              :  if(3 == 4) then
     831              :    write(message,'(a,2x,a)') ch10, " == Print  dmat before rot"
     832              :    call wrtout(std_out,message,'COLL')
     833              :    call print_matlu(green%occup%matlu(:),natom,1)
     834              :    if (useylm == 1) then
     835              :      call slm2ylm_matlu(green%occup%matlu(:),natom,paw_dmft,1,0)
     836              :    end if
     837              :    if (opt_rot == 1) then
     838              :      call rotate_matlu(green%occup%matlu(:),eigvectmatlu(:),natom,1)
     839              :    end if
     840              :    write(message,'(a,2x,a)') ch10," == Print  dmat after rot"
     841              :    call wrtout(std_out,message,'COLL')
     842              :    call print_matlu(green%occup%matlu(:),natom,1)
     843              : 
     844              :    write(message,'(2a)') ch10,' QMC STOP: DEBUG'
     845              :    call wrtout(std_out,message,'COLL')
     846              :    ABI_ERROR(message)
     847              :  end if
     848              :  ! =================================================================
     849              :  ! Check
     850              :  ! =================================================================
     851              : 
     852              :  ! write(message,'(a,2x,a,f13.5)') ch10,&
     853              :  !&   " == Print weiss for small tau"
     854              :  ! call wrtout(std_out,message,'COLL')
     855              :  ! call print_matlu(weiss%oper(1)%matlu,natom,1)
     856              :  ! write(message,'(a,2x,a,f13.5)') ch10,&
     857              :  !&   " == Print weiss for large tau"
     858              :  ! call wrtout(std_out,message,'COLL')
     859              :  ! call print_matlu(weiss%oper(paw_dmft%dmft_nwlo)%matlu,natom,1)
     860              :  ! call flush_unit(std_out)
     861              :  ! write(message,'(2a)') ch10,' Check weiss_for_rot(last freq)'
     862              :  ! call wrtout(std_out,message,'COLL')
     863              :  ! call checkdiag_matlu(weiss_for_rot%oper(paw_dmft%dmft_nwlo)%matlu,natom,tol6,opt=nspinor)
     864              :  ! call flush_unit(std_out)
     865              :  ! write(message,'(2a)') ch10,' Check weiss_for_rot(ifreq=1)'
     866              :  ! call wrtout(std_out,message,'COLL')
     867              :  ! call checkdiag_matlu(weiss_for_rot%oper(1)%matlu,natom,tol6,opt=nspinor)
     868              :  ! call flush_unit(std_out)
     869              : 
     870              :  !master = 0
     871              : 
     872              :  ! =================================================================
     873              :  ! Print out
     874              :  ! =================================================================
     875              : 
     876              : ! Print Weiss
     877              : ! -------------
     878           34 :  if (paw_dmft%dmft_prgn == 1) then
     879            0 :    call print_green('Weiss_diag',weiss_for_rot,1,paw_dmft,opt_wt=1,opt_decim=1)
     880              :  end if
     881              : 
     882           34 :  if (paw_dmft%dmft_solv /= 10) then
     883           34 :    write(message,'(a,2x,a)') ch10," == Preparing data for CTQMC"
     884           34 :    call wrtout(std_out,message,'COLL')
     885              : 
     886              :  ! Print Rotate Weiss for 1st and last frequencies (a second time ? why ?)
     887              :  ! ------------------------------------------------
     888           34 :    if (pawprtvol >= 3) then
     889           28 :      write(message,'(a,2x,a)') ch10," == Print rotated weiss function for small freq in the rotated basis"  ! debug
     890           28 :      call wrtout(std_out,message,'COLL')  ! debug
     891           28 :      call print_matlu(weiss_for_rot%oper(1)%matlu(:),natom,1,compl=1)  ! debug
     892           28 :      write(message,'(a,2x,a)') ch10," == Print rotated weiss function for largest freq in the rotated basis"  ! debug
     893           28 :      call wrtout(std_out,message,'COLL')  ! debug
     894           28 :      call print_matlu(weiss_for_rot%oper(nwlo)%matlu(:),natom,1,compl=1)  ! debug
     895              :    end if ! pawprtvol>=3
     896              :  endif
     897              :  ! =================================================================
     898              :  !  VARIABLES FOR CTQMC TESTS
     899           34 :  testcode = 0
     900           34 :  testrot = 0
     901              :  ! opt_fk = 0 ! for developpers to check Fourier transform and computes G0(tau)
     902           34 :  opt_fk = 1 ! usual case: for real calculations
     903              :  ! =================================================================
     904              : 
     905              :  ! _________________________________________________________________
     906              :  !
     907              :  !  SECOND PART : BUILT HYBRIDIZATION FROM G0
     908              :  ! _________________________________________________________________
     909              :  !
     910              :  ! =================================================================
     911              :  ! Compute inverse of weiss and compute hybridization
     912              :  ! =================================================================
     913              : 
     914              :  ! Compute inverse of weiss for each Frequency
     915              :  ! -----------------------------------------------------------------
     916              : 
     917        17963 :   do ifreq=1,nwlo
     918        56139 :     ABI_MALLOC(matlu1,(natom))
     919        56139 :     ABI_MALLOC(matlu2,(natom))
     920        17929 :     call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu(:),matlu1(:))
     921        17929 :     call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu(:),matlu2(:))
     922              : 
     923        17929 :     call copy_matlu(weiss_for_rot%oper(ifreq)%matlu(:),matlu1(:),natom)
     924              : 
     925              :     ! Print G_0(iw_n)
     926              :     ! ----------------
     927              :     if (optdb == 1) then
     928              :       call printplot_matlu(weiss_for_rot%oper(ifreq)%matlu(:),natom,paw_dmft%omega_lo(ifreq),"go",60000,imre=1)
     929              :     end if
     930              : 
     931              :     ! Compute G_0^-1
     932              :     ! -------------------------------------------
     933              :     ! if opt_fk=1 or testcode/=0  Do the inversion
     934              :     ! if opt_fk=0                 Do not inverse.
     935              :     ! If testcode=2 and opt_fk=0  Do the inversion
     936              :     ! If testcode=1 and opt_fk=0  Do the inversion but no effect, because it will nevertheless be erased
     937              :     ! If opt_fk=1                 Do the inversion
     938              :     ! -------------------------------------------
     939              :     if (optdb == 1) then
     940              :       call printplot_matlu(matlu1(:),natom,paw_dmft%omega_lo(ifreq),"weiss",12000,imre=1)
     941              :     end if
     942              :     if (opt_fk == 1 .or. testcode /= 0) then
     943        17929 :       call inverse_oper(weiss_for_rot%oper(ifreq),2)
     944              :     end if
     945              : 
     946              :     ! Print G_0^-1(iw_n)
     947              :     ! ----------------
     948              :     if (optdb == 1) then
     949              :       call printplot_matlu(weiss_for_rot%oper(ifreq)%matlu(:),natom,paw_dmft%omega_lo(ifreq),"goinv",70000,imre=1)
     950              :     end if
     951              : 
     952        17929 :     if (paw_dmft%dmft_solv /= 10) then
     953        17929 :       if (pawprtvol >= 4 .or. ifreq == nwlo) then
     954              :         if (opt_fk == 1 .or. testcode /= 0) then
     955              :           ! Check inversion : do the product
     956              :           ! ----------------------------------------------
     957           34 :           call prod_matlu(weiss_for_rot%oper(ifreq)%matlu(:),matlu1(:),matlu2(:),natom)
     958           34 :           write(message,'(a,2x,a,i7)') ch10," == Print product of  weiss times invers for freq",ifreq
     959           34 :           call wrtout(std_out,message,'COLL')  ! debug
     960           34 :           call print_matlu(matlu2(:),natom,1)  ! debug
     961              :         end if
     962              :       end if
     963              :     endif
     964              : 
     965        17929 :     call destroy_matlu(matlu1(:),natom)
     966        17929 :     call destroy_matlu(matlu2(:),natom)
     967        38210 :     ABI_FREE(matlu1)
     968        38244 :     ABI_FREE(matlu2)
     969              : 
     970              :   end do ! ifreq
     971              : 
     972              :  ! Copy weiss_for_rot into weiss
     973              :  ! -------------------------------
     974              :  !call copy_matlu(weiss_for_rot%oper(ifreq)%matlu,weiss%oper(ifreq)%matlu,natom)
     975              : 
     976              : 
     977              :  ! Print G_0^-1 for 1st and last frequencies.
     978              :  ! -----------------------------------------
     979           34 :  if (paw_dmft%dmft_solv /= 10) then
     980           34 :    if (pawprtvol >= 3) then
     981           28 :      write(message,'(a,2x,a)') ch10," == Print G_0^-1 for small freq in the rotated basis"  ! debug
     982           28 :      call wrtout(std_out,message,'COLL')  ! debug
     983           28 :      call print_matlu(weiss_for_rot%oper(1)%matlu(:),natom,1)  ! debug
     984           28 :      write(message,'(a,2x,a,e18.10,a)') ch10,&   ! debug
     985           56 :        & " == Print G_0^-1 for last freq in the rotated basis (last freq=",paw_dmft%omega_lo(nwlo),")"  ! debug
     986           28 :      call wrtout(std_out,message,'COLL')   ! debug
     987           28 :      call print_matlu(weiss_for_rot%oper(paw_dmft%dmft_nwlo)%matlu(:),natom,1,compl=1) ! debug
     988              :    end if ! pawprtvol>=3
     989              :  endif
     990              :  ! Substract frequency from diagonal part
     991              :  ! ======================================
     992              : 
     993          102 :  ABI_MALLOC(shift,(natom))
     994        17963 :  do ifreq=1,nwlo
     995              : 
     996        38210 :    shift(:) = cmplx(zero,paw_dmft%omega_lo(ifreq),kind=dp)
     997              : 
     998              :    !  write(5555,'(400e17.4)') paw_dmft%omega_lo(ifreq),((((((weiss_for_rot%oper(ifreq)%matlu(1)%mat&
     999              :    !  & (im,im1,isppol,ispinor,ispinor1)-cmplx(0.d0,paw_dmft%omega_lo(ifreq),kind=dp)),im=1,2*3+1),&
    1000              :    !&      im1=1,2*3+1),isppol=1,nsppol),ispinor=1,nspinor),ispinor1=1,nspinor)
    1001              : 
    1002              :    if (opt_fk == 1) then
    1003              :      ! Compute G_0^-1-iw_n
    1004              :      ! --------------------
    1005        17929 :      call shift_matlu(weiss_for_rot%oper(ifreq)%matlu(:),natom,shift(:))
    1006              : 
    1007              :      ! Compute -G_0^-1+iw_n
    1008              :      ! --------------------
    1009        17929 :      call fac_matlu(weiss_for_rot%oper(ifreq)%matlu(:),natom,-cone)
    1010              :    end if
    1011              : 
    1012              :    ! Print -G_0^-1+iw_n
    1013              :    ! --------------------
    1014           34 :    if (optdb == 1) then
    1015              :      call printplot_matlu(weiss_for_rot%oper(ifreq)%matlu(:),natom,paw_dmft%omega_lo(ifreq), &
    1016              :                         & "G0inv_minus_omega",20000,imre=1)
    1017              :    end if
    1018              :  end do ! ifreq
    1019              : 
    1020              :  ! Print -G_0^+1-iw_n=(F-levels) for last freq in the rotated basis"
    1021              :  ! ------------------------------------------------------------------
    1022           34 :  ABI_FREE(shift)
    1023           34 :  if (pawprtvol >= 3) then
    1024           28 :    if (paw_dmft%dmft_solv .eq. 10) then
    1025            0 :      write(message,'(a,2x,a)') ch10,&
    1026            0 :        & " == Print G_0^-1-iw_n=-(F-levels) for first frequency in CTQMC basis"
    1027            0 :      call wrtout(std_out,message,'COLL')
    1028            0 :      call print_matlu(weiss_for_rot%oper(1)%matlu(:),natom,1)
    1029              :    end if !dmft_solv=10
    1030              :    else
    1031            6 :      write(message,'(a,2x,a)') ch10,&  ! debug
    1032           12 :        & " == Print G_0^-1-iw_n=-(F-levels) for last freq in the rotated basis"  ! debug
    1033            6 :      call wrtout(std_out,message,'COLL')   ! debug
    1034            6 :      call print_matlu(weiss_for_rot%oper(nwlo)%matlu(:),natom,1,compl=1) ! debug
    1035              :  end if ! pawprtvol>=3
    1036              : 
    1037              :  ! Check numerical limit of F(i_wn)*iw_n (can be used also to compute F )
    1038              :  ! ======================================
    1039              : 
    1040           34 :  if (opt_nondiag == 1) then
    1041              : 
    1042            0 :    ABI_MALLOC(matlu1,(natom))
    1043            0 :    ABI_MALLOC(matlu2,(natom))
    1044            0 :    ABI_MALLOC(matlu3,(natom))
    1045            0 :    ABI_MALLOC(matlu4,(natom))
    1046            0 :    call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu(:),matlu1(:))
    1047            0 :    call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu(:),matlu2(:))
    1048            0 :    call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu(:),matlu3(:))
    1049            0 :    call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu(:),matlu4(:))
    1050              : 
    1051              :    !write(message,'(a,2x,a)') ch10," == energy_levels"
    1052              :    !call wrtout(std_out,message,'COLL')
    1053              :    !call print_matlu(energy_level%matlu(:),natom,1,opt_exp=2,compl=0)
    1054              : 
    1055            0 :    do ifreq=nwlo,1,-1 ! necessary to have matlu4 computed for the max frequency and available for all frequency.
    1056              :      ! do ifreq=paw_dmft%dmftqmc_l,1,-1 ! necessary to have matlu4 computed for the max frequency and available for all frequency.
    1057              : 
    1058              :      ! Compute F (substract levels) for max frequency
    1059              :      ! -----------------------------------------------
    1060            0 :      call add_matlu(weiss_for_rot%oper(ifreq)%matlu(:),energy_level%matlu(:),matlu1(:),natom,-1)
    1061              : 
    1062              :      ! Print F(iw_n)=-(G_0^-1-iw_n+levels)  for last frequency.
    1063              :      ! --------------------------------------------------------
    1064            0 :      if ((ifreq == nwlo .or. ifreq == paw_dmft%dmftqmc_l) .and. paw_dmft%dmft_solv /= 10) then
    1065            0 :        write(message,'(a,2x,a,i4,a,f13.5,a)') ch10, &
    1066            0 :          & " == Print F(iw_n)=-(G_0^-1-iw_n+levels) for freq nb",ifreq," (=",paw_dmft%omega_lo(ifreq),")"
    1067            0 :        call wrtout(std_out,message,'COLL')
    1068            0 :        call print_matlu(matlu1(:),natom,1,opt_exp=1,compl=1)
    1069              :      end if
    1070              :      if (optdb == 1) then
    1071              :        call printplot_matlu(matlu1(:),natom,paw_dmft%omega_lo(ifreq),"Hybridization",10000,imre=1)
    1072              :      end if
    1073              : 
    1074              :      ! Put F in weiss_for_rot -> CTQMC
    1075              :      ! -------------------------------
    1076              :      if (opt_rot == 2) then
    1077              :        call rotate_matlu(weiss_for_rot%oper(ifreq)%matlu(:),eigvectmatlu(:),natom,1)
    1078              :      end if
    1079              :      ! The following line will produce directly the weiss function for the CTQMC code
    1080              :      if (opt_fk == 1) then
    1081            0 :        call copy_matlu(matlu1(:),weiss_for_rot%oper(ifreq)%matlu(:),natom)
    1082              :      end if
    1083              : 
    1084              :      ! Multiply F by frequency
    1085              :      ! ------------------------
    1086            0 :      call copy_matlu(matlu1(:),matlu2(:),natom)
    1087            0 :      call fac_matlu(matlu1(:),natom,cmplx(zero,paw_dmft%omega_lo(ifreq),kind=dp))
    1088            0 :      if ((ifreq == nwlo .or. ifreq == paw_dmft%dmftqmc_l) .and. paw_dmft%dmft_solv /= 10) then
    1089            0 :        write(message,'(a,2x,a,i4,a,f13.5,a)') ch10, &
    1090            0 :          & " == Print numerical C_ij = F(iw_n)*iw_n for freq nb",ifreq," (=",paw_dmft%omega_lo(ifreq),")"
    1091            0 :        call wrtout(std_out,message,'COLL')
    1092            0 :        call print_matlu(matlu1(:),natom,1,opt_exp=1,compl=1)
    1093              :      end if
    1094              :      if (optdb == 1) then
    1095              :        call printplot_matlu(matlu1(:),natom,paw_dmft%omega_lo(ifreq),"cij",72800,imre=1)
    1096              :      end if
    1097              :      ! call rotate_matlu(matlu1,eigvectmatlu,natom,3,1)
    1098              : 
    1099            0 :      if ((ifreq == nwlo .or. ifreq == paw_dmft%dmftqmc_l) .and. paw_dmft%dmft_solv /= 10) then
    1100            0 :        write(message,'(a,2x,a,i4,a,f13.5,a)') ch10, &
    1101            0 :           & " == Print numerical after back rotation C_ij = F(iw_n)*iw_n for freq nb",ifreq," (=",paw_dmft%omega_lo(ifreq),")"
    1102            0 :        call wrtout(std_out,message,'COLL')
    1103            0 :        call print_matlu(matlu1(:),natom,1,opt_exp=1,compl=1)
    1104              :      end if
    1105              :      if (optdb == 1) then
    1106              :        call printplot_matlu(matlu1(:),natom,paw_dmft%omega_lo(ifreq),"cij_rotated",72900,imre=1)
    1107              :      end if
    1108              : 
    1109              :      ! Built C_ij/iw_n
    1110              :      ! ------------------------
    1111            0 :      call copy_matlu(hybri_coeff(:),matlu1(:),natom)
    1112            0 :      call fac_matlu(matlu1(:),natom,cone/cmplx(zero,paw_dmft%omega_lo(ifreq),kind=dp))
    1113              :      if (optdb == 1) then
    1114              :        call printplot_matlu(matlu1(:),natom,paw_dmft%omega_lo(ifreq),"cij_over_omega",72000)
    1115              :      end if
    1116              :      ! if(ifreq==paw_dmft%dmft_nwlo) then
    1117              :      !   write(message,'(a,2x,a,f13.5)') ch10,  " == Print numerical C_ij/iw_n for frequency",paw_dmft%omega_lo(ifreq)
    1118              :      !   call wrtout(std_out,message,'COLL')
    1119              :      !   call print_matlu(matlu1,natom,1,opt_exp=1,compl=1)
    1120              :      ! endif
    1121              : 
    1122              :      ! For test: put C_ij/i_wn into weiss_for_rot
    1123              :      ! --------------------------------------------
    1124              :      ! call copy_matlu(matlu1,weiss_for_rot%oper(ifreq)%matlu,natom,opt_non_diag=1)
    1125              : 
    1126              :      ! Compute Hybri - C_ij/iw_n
    1127              :      ! ------------------------
    1128            0 :      call add_matlu(matlu2(:),matlu1(:),matlu3(:),natom,-1)
    1129              : 
    1130              :      ! Print Hybri - C_ij/iw_n
    1131              :      ! ------------------------
    1132              :      if (optdb == 1) then
    1133              :        call printplot_matlu(matlu3(:),natom,paw_dmft%omega_lo(ifreq),"hybri_minus_asymp",74000,imre=1)
    1134              :      end if
    1135              : 
    1136              :      ! Multiply (F-C_ij/i_wn) by (iw_n)**2 to find D_ij such that (F-C_ij/i_wn) -> D_ij/(iw_n)^2 only for last frequency.
    1137              :      ! ------------------------------------------------------------------------------------------------------------------
    1138            0 :      call copy_matlu(matlu3(:),matlu2(:),natom)
    1139            0 :      call fac_matlu(matlu2(:),natom,cmplx(zero,paw_dmft%omega_lo(ifreq),kind=dp)**2)
    1140              :      if (optdb == 1) then
    1141              :        call printplot_matlu(matlu2(:),natom,paw_dmft%omega_lo(ifreq),"fminuscijtimesw2",75000,imre=1)
    1142              :      end if
    1143            0 :      if ((ifreq == nwlo .or. ifreq == paw_dmft%dmftqmc_l) .and. paw_dmft%dmft_solv /= 10) then
    1144            0 :        call copy_matlu(matlu2(:),matlu4(:),natom)
    1145            0 :        write(message,'(a,2x,a,i4,a,f13.5,a)') ch10, &
    1146            0 :           & " == Print numerical (F(iw_n)-C_ij/iw_n)%iw_n^2 for freq nb",ifreq," (=",paw_dmft%omega_lo(ifreq),")"
    1147            0 :        call wrtout(std_out,message,'COLL')
    1148            0 :        call print_matlu(matlu4(:),natom,1)
    1149              :      end if
    1150              : 
    1151              :      ! Built C_ij/iw_n+D_ij/(iw_n)^2
    1152              :      ! ------------------------
    1153            0 :      call copy_matlu(matlu4(:),matlu3(:),natom,opt_re=1)
    1154            0 :      call fac_matlu(matlu3(:),natom,cone/cmplx(zero,paw_dmft%omega_lo(ifreq),kind=dp)**2)
    1155            0 :      call add_matlu(matlu1(:),matlu3(:),matlu2(:),natom,1)
    1156            0 :      if (optdb == 1) then
    1157              :        call printplot_matlu(matlu2(:),natom,paw_dmft%omega_lo(ifreq),"cij_w_plus_dij_w2",72700,imre=1)
    1158              :      end if
    1159              :      ! For test: put C_ij/i_wn +D_ij/(iw_n)^2 into weiss_for_rot
    1160              :      ! --------------------------------------------
    1161              :      ! call copy_matlu(matlu2,weiss_for_rot%oper(ifreq)%matlu,natom,opt_non_diag=1)
    1162              : 
    1163              : 
    1164              :    end do ! ifreq
    1165              : 
    1166              :    ! Print F(iw_n) used by CTQMC for first frequency
    1167              :    ! -----------------------------
    1168            0 :    if(paw_dmft%dmft_solv .eq. 10) then
    1169            0 :      write(message,'(a,2x,a)') ch10," == Print F(iw_n)=-(G_0^-1-iw_n+levels) for first frequency in CTQMC basis"
    1170            0 :      call wrtout(std_out,message,'COLL')
    1171            0 :      call print_matlu(weiss_for_rot%oper(1)%matlu(:),natom,1)
    1172              :    endif
    1173              : 
    1174              : 
    1175            0 :    call destroy_matlu(matlu1(:),natom)
    1176            0 :    call destroy_matlu(matlu2(:),natom)
    1177            0 :    call destroy_matlu(matlu3(:),natom)
    1178            0 :    call destroy_matlu(matlu4(:),natom)
    1179            0 :    ABI_FREE(matlu1)
    1180            0 :    ABI_FREE(matlu2)
    1181            0 :    ABI_FREE(matlu3)
    1182            0 :    ABI_FREE(matlu4)
    1183              :  end if ! if opt_nondiag=1
    1184              : 
    1185              :  ! =======================
    1186              :  !
    1187              :  ! Rotation of Magnetic moment for CT-QMC
    1188              :  !
    1189              :  ! =======================
    1190           34 :  if(nspinor .eq. 2 .and. paw_dmft%dmftctqmc_localprop .gt. 1) then
    1191            0 :    write(message,'(a,2x,2a)') ch10, " == Making rotation for magnetic moments", ch10
    1192            0 :    call wrtout(std_out,message,'COLL')
    1193              : 
    1194            0 :    if(usejmj .eq. 1) then
    1195              :    !  == Mj values
    1196            0 :      call init_matlu(natom=1,nspinor=paw_dmft%nspinor,nsppol=paw_dmft%nsppol,lpawu_natom=paw_dmft%lpawu,matlu=matlumag_tot)
    1197            0 :      call zero_matlu(matlumag_tot,natom=1)
    1198            0 :      call magmomjmj_matlu(matlumag_tot,natom=1)
    1199              :     !call print_matlu(matlumag_tot,natom=1,prtopt=1)
    1200            0 :      call gather_matlu(matlumag_tot,magmom_tot,natom=1,option=1,prtopt=0)
    1201            0 :      call destroy_matlu(matlumag_tot,natom=1)
    1202              : 
    1203              :    else
    1204              :    !create a rotation matrix for diagonal Hamiltonian
    1205            0 :      if(opt_diag == 0) then
    1206            0 :        write(message,'(a,2x,2a)') ch10, " --> Hamiltonian is already diagonal in Slm", ch10
    1207            0 :        call wrtout(std_out,message,'COLL')
    1208            0 :        do iatom = 1,paw_dmft%natom
    1209            0 :           if(paw_dmft%lpawu(iatom) /= -1) then
    1210            0 :            do iflavor1=1,tndim
    1211            0 :              do iflavor2=1,tndim
    1212            0 :                if(iflavor1==iflavor2) then
    1213            0 :                  eigvectmatlu(iatom)%mat(iflavor1,iflavor2,1)=cone
    1214              :                else
    1215            0 :                  eigvectmatlu(iatom)%mat(iflavor1,iflavor2,1)=czero
    1216              :                end if
    1217              :              end do
    1218              :            end do
    1219              :          end if
    1220              :        end do
    1221              :      end if !end opt_diag=0
    1222              : 
    1223              :      ! == orbital angular momentum
    1224            0 :      call init_matlu(natom=natom,nspinor=paw_dmft%nspinor,nsppol=paw_dmft%nsppol,lpawu_natom=paw_dmft%lpawu,matlu=matlumag_orb)
    1225            0 :      call zero_matlu(matlumag_orb,natom=natom)
    1226            0 :      call chi_matlu(matlumag_orb,natom=natom,option=1,optprt=0)
    1227            0 :      call rotate_matlu(matlumag_orb,eigvectmatlu,natom=natom,inverse=1)
    1228              :      !call print_matlu(matlumag_orb,iatom,prtopt=1)
    1229            0 :      call gather_matlu(matlumag_orb,magmom_orb,natom=natom,option=1,prtopt=0)
    1230            0 :      call destroy_matlu(matlumag_orb,natom=natom)
    1231              : 
    1232              :      ! == spin angular momentum
    1233            0 :      call init_matlu(natom=natom,nspinor=paw_dmft%nspinor,nsppol=paw_dmft%nsppol,lpawu_natom=paw_dmft%lpawu,matlu=matlumag_spin)
    1234            0 :      call zero_matlu(matlumag_spin,natom=natom)
    1235            0 :      call chi_matlu(matlumag_spin,natom=natom,option=2,optprt=0)
    1236            0 :      call rotate_matlu(matlumag_spin,eigvectmatlu,natom=natom,inverse=1)
    1237              :      !call print_matlu(matlumag_spin,natom,prtopt=1)
    1238            0 :      call gather_matlu(matlumag_spin,magmom_spin,natom=natom,option=1,prtopt=0)
    1239            0 :      call destroy_matlu(matlumag_spin,natom=natom)
    1240              : 
    1241              :      ! == total angular momentum
    1242            0 :      call init_matlu(natom=natom,nspinor=paw_dmft%nspinor,nsppol=paw_dmft%nsppol,lpawu_natom=paw_dmft%lpawu,matlu=matlumag_tot)
    1243            0 :      call zero_matlu(matlumag_tot,natom=natom)
    1244            0 :      call chi_matlu(matlumag_tot,natom=natom,option=3,optprt=0)
    1245            0 :      call rotate_matlu(matlumag_tot,eigvectmatlu,natom=natom,inverse=1)
    1246              :      !call print_matlu(matlumag_tot,natom=1,prtopt=1)
    1247            0 :      call gather_matlu(matlumag_tot,magmom_tot,natom=natom,option=1,prtopt=0)
    1248            0 :      call destroy_matlu(matlumag_tot,natom=natom)
    1249              :    endif !usejmj
    1250            0 :    write(message,'(a,2x,2a)') ch10, " ==> Rotation done", ch10
    1251            0 :    call wrtout(std_out,message,'COLL')
    1252              : 
    1253              :  end if ! dmftctqmc_localprop
    1254              :  !======================
    1255              : 
    1256           34 :  call timab(702,2,tsec(:))
    1257              :  ! =========================================================================================
    1258              :  ! Start big loop over atoms to compute hybridization and do the CTQMC
    1259              :  ! =========================================================================================
    1260              : 
    1261           34 :  call timab(703,1,tsec(:))
    1262           96 :  do iatom=1,natom
    1263              : 
    1264           62 :    lpawu = paw_dmft%lpawu(iatom)
    1265           62 :    if (lpawu == -1) cycle
    1266              : 
    1267           34 :    green%ecorr_qmc(iatom) = zero
    1268           34 :    itypat = paw_dmft%typat(iatom)
    1269           34 :    tndim = 2*lpawu + 1
    1270              :    ! if(lpawu/=-1) then
    1271              : 
    1272           34 :    nflavor = 2 * tndim
    1273              : 
    1274           34 :    if (testcode >= 1) then
    1275            0 :      nflavor = 2
    1276              :      if (testcode == 2) then
    1277              :        ispa = 1
    1278              :        ispb = 2
    1279              :        if (nspinor == 1) ispb = 1
    1280              :        ima = 1
    1281              :        imb = 1
    1282              :        if (tndim > 4) then
    1283              :          ima = 5 ! row
    1284              :          imb = 4 ! column
    1285              :        end if
    1286              :      end if ! testcode=2
    1287              :    end if ! testcode >=1
    1288              : 
    1289          136 :    ABI_MALLOC(fw1,(nwlo,nflavor))
    1290          170 :    ABI_MALLOC(fw1_nd,(nwlo,nflavor,nflavor))
    1291          102 :    ABI_MALLOC(levels_ctqmc,(nflavor))
    1292          136 :    ABI_MALLOC(levels_ctqmc_nd,(nflavor,nflavor))
    1293         4698 :    levels_ctqmc_nd(:,:) = czero
    1294          102 :    ABI_MALLOC(levels_ctqmc_complex,(nflavor))
    1295          402 :    levels_ctqmc_complex(:) = czero
    1296          102 :    ABI_MALLOC(hybri_limit,(nflavor,nflavor))
    1297         4698 :    hybri_limit(:,:) = czero
    1298      1880926 :    fw1_nd(:,:,:) = czero
    1299       182380 :    fw1(:,:) = czero
    1300              : 
    1301              :    ! =================================================================
    1302              :    ! Put hybridization in new arrays for CTQMC
    1303              :    ! =================================================================
    1304           34 :    if (testcode == 0) then
    1305           34 :      iflavor1 = 0
    1306           34 :      iflavor2 = 0
    1307              : 
    1308           88 :      do isppol=1,nsppol
    1309          142 :        do ispinor1=1,nspinor
    1310          162 :          do ispinor2=1,nspinor
    1311          378 :            do im1=1,tndim
    1312         1786 :              do im2=1,tndim
    1313              : 
    1314              :                  ! first diagonal terms whatever opt_nondiag
    1315         1462 :                iflavor1 = im1 + tndim*(ispinor1-1) + tndim*(isppol-1)
    1316         1462 :                iflavor2 = im2 + tndim*(ispinor2-1) + tndim*(isppol-1)
    1317              : 
    1318         1732 :                if (iflavor1 == iflavor2 ) then
    1319              : 
    1320              :                    ! Put weiss_for_rot in fw1
    1321       173428 :                  do ifreq=1,nwlo
    1322       173158 :                    if (opt_fk == 1 .or. opt_fk == 0) fw1(ifreq,iflavor1) = &
    1323       173428 :                      & weiss_for_rot%oper(ifreq)%matlu(iatom)%mat(im1+(ispinor1-1)*tndim,im1+(ispinor1-1)*tndim,isppol)
    1324              :                  end do  ! ifreq
    1325       173428 :                  fw1_nd(:,iflavor1,iflavor1) = fw1(:,iflavor1)
    1326              : 
    1327          270 :                  if(paw_dmft%dmft_solv .eq. 10) then
    1328              :                    !off diag levels are always null beceause of diagonalisation
    1329              :                    levels_ctqmc_complex(iflavor1) = &
    1330            0 :                      & energy_level%matlu(iatom)%mat(im1+(ispinor1-1)*tndim,im1+(ispinor1-1)*tndim,isppol)
    1331            0 :                    hybri_limit(iflavor1,iflavor1) = hybri_coeff(iatom)%mat(im1+(ispinor1-1)*tndim,im1+(ispinor1-1)*tndim,isppol)
    1332              :                  else
    1333              :                    levels_ctqmc(iflavor1) = &
    1334          270 :                       & dble(energy_level%matlu(iatom)%mat(im1+(ispinor1-1)*tndim,im1+(ispinor1-1)*tndim,isppol))
    1335          270 :                    hybri_limit(iflavor1,iflavor1) = hybri_coeff(iatom)%mat(im1+(ispinor1-1)*tndim,im1+(ispinor1-1)*tndim,isppol)
    1336              :                  endif
    1337              : 
    1338              :                    ! case nsppol=nspinor=1
    1339          270 :                  if (nsppol == 1 .and. nspinor == 1) then
    1340         8918 :                    fw1(:,iflavor1+tndim) = fw1(:,iflavor1)
    1341         8918 :                    fw1_nd(:,iflavor1+tndim,iflavor1+tndim) = fw1(:,iflavor1)
    1342           98 :                    if(paw_dmft%dmft_solv .eq. 10) then
    1343            0 :                      levels_ctqmc_complex(iflavor1+tndim) = levels_ctqmc_complex(iflavor1)
    1344              :                    else
    1345           98 :                      levels_ctqmc(iflavor1+tndim) = levels_ctqmc(iflavor1)
    1346           98 :                      hybri_limit(iflavor1+tndim,iflavor1+tndim) = hybri_limit(iflavor1,iflavor1)
    1347              :                    endif
    1348              :                  end if
    1349              : 
    1350              :                ! off diagonal terms
    1351              :                else
    1352              : 
    1353              :                  ! Put weiss_for_rot in fw1_nd
    1354       704408 :                  do ifreq=1,nwlo
    1355       703216 :                    if (opt_fk == 1 .or. opt_fk == 0) fw1_nd(ifreq,iflavor1,iflavor2) = &
    1356       704408 :                      & weiss_for_rot%oper(ifreq)%matlu(iatom)%mat(im1+(ispinor1-1)*tndim,im2+(ispinor2-1)*tndim,isppol)
    1357              :                  end do ! ifreq
    1358         1192 :                  hybri_limit(iflavor1,iflavor2) = hybri_coeff(iatom)%mat(im1+(ispinor1-1)*tndim,im2+(ispinor2-1)*tndim,isppol)
    1359              : 
    1360              :                  ! case nsppol=nspinor=1
    1361         1192 :                  if (nsppol == 1 .and. nspinor == 1) then
    1362        53508 :                    fw1_nd(:,iflavor1+tndim,iflavor2+tndim) = fw1_nd(:,iflavor1,iflavor2)
    1363          588 :                    hybri_limit(iflavor1+tndim,iflavor2+tndim) = hybri_limit(iflavor1,iflavor2)
    1364              :                  end if
    1365              : 
    1366              :                end if ! iflavor1=iflavor2
    1367              : 
    1368              : ! <  / HACK >
    1369              :              end do ! im2
    1370              :            end do ! im1
    1371              :          end do  ! ispinor2
    1372              :        end do  ! ispinor1
    1373              :      end do  ! isppol
    1374              : ! < HACK >
    1375              :      ! JB. On 1000 cpus this can not work since all CPU try to open/write the files
    1376              :      ! Action : Don't print it or check only one cpu does it.
    1377              : 
    1378           34 :      if (pawprtvol >= 10000000) then
    1379            0 :        write(message,'(a,2x,a)') ch10,  " == Hybri for all flavors for CTQMC "
    1380            0 :        call wrtout(std_out,message,'COLL')
    1381            0 :        do iflavor1=1,nflavor
    1382            0 :          write(message,'(4x,14(2e14.5,2x))') (hybri_limit(iflavor1,iflavor2),iflavor2=1,nflavor)
    1383            0 :          call wrtout(std_out,message,'COLL')
    1384              :        end do ! iflavor1
    1385              : 
    1386            0 :        if (open_file('Hybri_cijoveromega',message,newunit=unt,status='unknown',form='formatted') /= 0) &
    1387            0 :          & ABI_ERROR(message)
    1388            0 :        if (open_file('Hybri',message,newunit=unt2,status='unknown',form='formatted') /= 0) ABI_ERROR(message)
    1389            0 :        do ifreq=1,nwlo
    1390              :          !  weiss_for_rot is G_0^-1-iw_n=-(F-levels)
    1391            0 :          if (optdb == 1) then
    1392              :            call printplot_matlu(weiss_for_rot%oper(ifreq)%matlu(:),natom,paw_dmft%omega_lo(ifreq),"weissbefore112",30000)
    1393              :          end if
    1394              :        end do
    1395            0 :        do iflavor1=1,nflavor
    1396            0 :          do iflavor2=1,nflavor
    1397            0 :            do ifreq=1,nwlo
    1398            0 :              omega = pi * paw_dmft%temp * (two*float(ifreq)-1)
    1399              :              ! fw1_nd is -G_0^+1-iw_n=(F-levels)
    1400            0 :              write(unt,'(300e16.5)') paw_dmft%omega_lo(ifreq), &
    1401            0 :                & fw1_nd(ifreq,iflavor1,iflavor2)-hybri_limit(iflavor1,iflavor2)/cmplx(zero,paw_dmft%omega_lo(ifreq),kind=dp)
    1402            0 :              write(unt2,'(300e16.5)') paw_dmft%omega_lo(ifreq),fw1_nd(ifreq,iflavor1,iflavor2)
    1403              :            end do ! ifreq
    1404            0 :            write(unt,*)
    1405            0 :            write(unt2,*)
    1406              :          end do ! iflavor2
    1407              :        end do ! iflavor1
    1408            0 :        close(unt)
    1409            0 :        close(unt2)
    1410              :      end if ! pawprtvol>=10000000
    1411              :    end if ! testcode
    1412              : ! </ HACK >
    1413              : 
    1414              : 
    1415              : 
    1416              : 
    1417              :      ! ====================================================================================
    1418              :      !  TEST
    1419              :      !  For testing purpose, built ultra simple hybridization (constant in
    1420              :      !  imaginary time or very simple) or extract some part of the calculated hybridization
    1421              :      ! ====================================================================================
    1422           34 :    if (testcode >= 1) then
    1423              :        !dmft_nwlo = paw_dmft%dmft_nwlo
    1424            0 :      paw_dmft%dmft_nwlo = paw_dmft%dmftqmc_l
    1425            0 :      ABI_MALLOC(gw1_nd,(paw_dmft%dmft_nwlo,nflavor,nflavor))
    1426            0 :      gw1_nd(:,:,:) = czero
    1427              : 
    1428              :        !  Call testcode_ctqmc: built simple hybridization
    1429              :        !--------------------------------------------------
    1430            0 :      if (testcode == 1) then
    1431              :        call testcode_ctqmc(paw_dmft%dmftqmc_l,fw1_nd(:,:,:),fw1(:,:),gtmp_nd(:,:,:),gw_tmp_nd(:,:,:),&
    1432            0 :          & levels_ctqmc(:),hybri_limit(:,:),nflavor,1,paw_dmft%temp,testrot,testcode,umod(:,:))
    1433              :        !  Select 2x2 hybridization matrix from the current larger matrix
    1434              :        !  ima and imb are defined above.
    1435              :        !----------------------------------------------------------------
    1436            0 :      else if (testcode == 2) then
    1437              :          !close(unt)
    1438              :          !close(unt2)
    1439              :        call testcode_ctqmc_b(energy_level,hybri_coeff,weiss_for_rot,paw_dmft%dmftqmc_l,fw1_nd(:,:,:),&
    1440            0 :          & levels_ctqmc(:),levels_ctqmc_nd(:,:),hybri_limit(:,:),paw_dmft%temp,umod(:,:),opt_diag,opt_fk)
    1441              :      end if
    1442              : 
    1443              :        ! Calculation of Inverse Green's function from hybridization
    1444              :        !-------------------------------------------------------------
    1445            0 :      do if1=1,2
    1446            0 :        do if2=1,2
    1447            0 :          do ifreq=1,paw_dmft%dmftqmc_l
    1448            0 :            omega = pi * paw_dmft%temp * (two*dble(ifreq)-1)
    1449            0 :            if (if1 == if2) then
    1450            0 :              gw1_nd(ifreq,if1,if2) = (cmplx(zero,omega,kind=dp)-fw1_nd(ifreq,if1,if2))
    1451              :            else
    1452            0 :              gw1_nd(ifreq,if1,if2) = -fw1_nd(ifreq,if1,if2)
    1453              :            end if
    1454              :          end do ! ifreq
    1455              :        end do ! if2
    1456              :      end do ! if1
    1457              :        ! Calculation of Green's function (call inverse)
    1458              :        !-------------------------------------------------------------
    1459            0 :      do ifreq=1,paw_dmft%dmftqmc_l
    1460            0 :        call xginv(gw1_nd(ifreq,:,:),2)
    1461              :      end do
    1462            0 :      write(std_out,*) " testctqmc high frequency limit of hybridization",fw1_nd(paw_dmft%dmftqmc_l,:,:)
    1463              : 
    1464              :        ! Integrate Green's function
    1465              :        !-------------------------------------------------------------
    1466            0 :      do if1=1,2
    1467            0 :        do if2=1,2
    1468            0 :          call int_fct(gw1_nd(:,if1,if2),(if1==if2),2,paw_dmft,integral(if1,if2))  ! test_1
    1469              :        end do
    1470              :      end do
    1471              :        ! Write Occupations
    1472            0 :      write(std_out,*) "Occupation of model in matrix form"
    1473            0 :      do if1=1,2
    1474            0 :        write(std_out,'(2(2f13.5,3x))') ((integral(if1,if2)+conjg(integral(if2,if1)))/two,if2=1,2)
    1475              :      end do
    1476            0 :      write(std_out,*) "Limit of hybridization "
    1477            0 :      do if1=1,2
    1478            0 :        write(std_out,'(2(2f13.5,3x))') (hybri_limit(if1,if2),if2=1,2)
    1479              :      end do
    1480              : 
    1481              :        ! If opt_fk=0, give Green's function to CTQMC code instead of
    1482              :        ! hybridization
    1483              :        !-------------------------------------------------------------
    1484            0 :      if (opt_fk == 0) fw1_nd(:,:,:) = gw1_nd(:,:,:)
    1485              : 
    1486            0 :      ABI_FREE(gw1_nd)
    1487            0 :      paw_dmft%dmft_nwlo = nwlo
    1488              : 
    1489              :      ! and testcode>1
    1490              :    end if ! testcode>=1
    1491              : 
    1492              : 
    1493           34 :    call flush_unit(std_out)
    1494              :    ! =================================================================
    1495              : 
    1496              :    ! ___________________________________________________________________________________
    1497              :    !
    1498              :    !  THIRD PART : CALL CTQMC
    1499              :    ! ___________________________________________________________________________________
    1500              : 
    1501              :    ! ==================================================================
    1502              :    !    Main calls to CTQMC code in ABINIT (INITIALIZATION and OPTIONS)
    1503              :    ! ==================================================================
    1504           34 :    if (paw_dmft%dmft_solv == 5 .or. paw_dmft%dmft_solv == 8 .or. paw_dmft%dmft_solv == 10) then
    1505           34 :      write(message,'(a,2x,a)') ch10," == Initializing CTQMC"
    1506           34 :      call wrtout(std_out,message,'COLL')
    1507              : 
    1508              :      !    Initialisation
    1509              :      ! =================================================================
    1510           34 :      if (paw_dmft%dmft_solv == 5) then
    1511           34 :        nomega = paw_dmft%dmftqmc_l
    1512              :        call CtqmcInterface_init(hybrid,paw_dmft%dmftqmc_seed,paw_dmft%dmftqmc_n, &
    1513              :          & paw_dmft%dmftqmc_therm,paw_dmft%dmftctqmc_meas,nflavor,paw_dmft%dmftqmc_l,&
    1514           34 :          & one/paw_dmft%temp,zero,std_out,paw_dmft%dmftctqmc_chains,paw_dmft%spacecomm,paw_dmft%nspinor)
    1515              :        !    options
    1516              :        ! =================================================================
    1517              :        call CtqmcInterface_setOpts(hybrid, &
    1518              :           & opt_Fk       = opt_fk, &
    1519              :           & opt_order    = paw_dmft%dmftctqmc_order, &
    1520              :           & opt_histo    = paw_dmft%dmftctqmc_localprop, &
    1521              :           & opt_movie    = paw_dmft%dmftctqmc_mov, &
    1522              :           & opt_analysis = paw_dmft%dmftctqmc_correl, &
    1523              :           & opt_check    = paw_dmft%dmftctqmc_check, &
    1524              :           & opt_noise    = paw_dmft%dmftctqmc_grnns, &
    1525              :           & opt_spectra  = paw_dmft%dmftctqmc_mrka, &
    1526           34 :           & opt_gmove    = paw_dmft%dmftctqmc_gmove)
    1527              :      end if
    1528              : 
    1529           34 :      if (paw_dmft%dmft_solv == 8) then
    1530            0 :        nomega = paw_dmft%dmftqmc_l
    1531              :        call CtqmcoffdiagInterface_init(hybridoffdiag,paw_dmft%dmftqmc_seed,&
    1532              :          & paw_dmft%dmftqmc_n,paw_dmft%dmftqmc_therm,paw_dmft%dmftctqmc_meas,&
    1533              :          & nflavor,paw_dmft%dmftqmc_l,one/paw_dmft%temp,zero,std_out,&
    1534            0 :          & paw_dmft%spacecomm,opt_nondiag,paw_dmft%nspinor)
    1535              :        !    options
    1536              :        ! =================================================================
    1537              :        call CtqmcoffdiagInterface_setOpts(hybridoffdiag,opt_Fk=opt_fk, &
    1538              :            & opt_order    = paw_dmft%dmftctqmc_order, &
    1539              :            & opt_histo    = paw_dmft%dmftctqmc_localprop, &
    1540              :            & opt_movie    = paw_dmft%dmftctqmc_mov, &
    1541              :            & opt_analysis = paw_dmft%dmftctqmc_correl, &
    1542              :            & opt_check    = paw_dmft%dmftctqmc_check, &
    1543              :            & opt_noise    = paw_dmft%dmftctqmc_grnns, &
    1544              :            & opt_spectra  = paw_dmft%dmftctqmc_mrka, &
    1545            0 :            & opt_gmove    = paw_dmft%dmftctqmc_gmove)
    1546              :      end if
    1547              : 
    1548           34 :      if (paw_dmft%dmft_solv == 10) then
    1549            0 :        nomega = paw_dmft%dmftqmc_l
    1550              :        call CtqmcoffdiagInterfaceComplex_init(hybridoffdiagComplex,paw_dmft%dmftqmc_seed,&
    1551              :          & paw_dmft%dmftqmc_n,paw_dmft%dmftqmc_therm,paw_dmft%dmftctqmc_meas,&
    1552              :          & nflavor,paw_dmft%dmftqmc_l,one/paw_dmft%temp,zero,std_out,&
    1553            0 :          & paw_dmft%spacecomm,opt_nondiag,paw_dmft%nspinor)
    1554              :        !    options
    1555              :        ! =================================================================
    1556              :        call CtqmcoffdiagInterfaceComplex_setOpts(hybridoffdiagComplex,opt_Fk=opt_fk, &
    1557              :            & opt_order    = paw_dmft%dmftctqmc_order, &
    1558              :            & opt_histo    = paw_dmft%dmftctqmc_localprop, &
    1559              :            & opt_movie    = paw_dmft%dmftctqmc_mov, &
    1560              :            & opt_analysis = paw_dmft%dmftctqmc_correl, &
    1561              :            & opt_check    = paw_dmft%dmftctqmc_check, &
    1562              :            & opt_noise    = paw_dmft%dmftctqmc_grnns, &
    1563              :            & opt_spectra  = paw_dmft%dmftctqmc_mrka, &
    1564            0 :            & opt_gmove    = paw_dmft%dmftctqmc_gmove)
    1565              :      end if
    1566              : 
    1567           34 :      write(message,'(a,2x,2a)') ch10, " == Initialization CTQMC done", ch10
    1568           34 :      call wrtout(std_out,message,'COLL')
    1569              : 
    1570              :    end if ! dmft_solv=5 or dmft_solv=8
    1571              : 
    1572           34 :    if (paw_dmft%dmft_solv == 9) then
    1573            0 :      ABI_MALLOC(gw_tmp_nd,(paw_dmft%dmft_nwli,nflavor,nflavor))
    1574              :      ! because size allocation problem with TRIQS paw_dmft%dmft_nwlo must be >= paw_dmft%dmft_nwli
    1575            0 :      open(unit=505,file=trim(paw_dmft%filapp)//"_Legendre_coefficients.dat",status='unknown',form='formatted')
    1576              :    else
    1577           34 :      if (paw_dmft%dmft_solv == 5) then
    1578          136 :        ABI_MALLOC(gw_tmp,(paw_dmft%dmft_nwlo,nflavor+1))
    1579              :      end if
    1580          170 :      ABI_MALLOC(gw_tmp_nd,(paw_dmft%dmft_nwlo,nflavor,nflavor+1))
    1581              :        !use  gw_tmp to put freq
    1582        17963 :      do ifreq=1,paw_dmft%dmft_nwlo
    1583        17929 :        if (paw_dmft%dmft_solv == 5) gw_tmp(ifreq,nflavor+1) = cmplx(zero,paw_dmft%omega_lo(ifreq),kind=dp)
    1584        17963 :        gw_tmp_nd(ifreq,nflavor,nflavor+1) = cmplx(zero,paw_dmft%omega_lo(ifreq),kind=dp)
    1585              :      end do
    1586              :    end if ! dmft_solv=9
    1587              : 
    1588          136 :    ABI_MALLOC(gtmp,(paw_dmft%dmftqmc_l,nflavor))
    1589              :      ! THIS IS A BACKUP PLAN. USING paw_dmft%hybrid makes a segfault on TIKAL
    1590              :      ! PSC with MPI only (and max2_open64). paw_dmf%hybrid is corrupted
    1591              :      ! somewhere but I could not find the place in all DMFT routines
    1592          170 :    ABI_MALLOC(gtmp_nd,(paw_dmft%dmftqmc_l,nflavor,nflavor))
    1593           34 :    if(paw_dmft%dmft_solv .eq. 10) then
    1594            0 :      ABI_MALLOC(gtmp_ndc,(paw_dmft%dmftqmc_l,nflavor,nflavor))
    1595              :    endif
    1596           34 :    call flush_unit(std_out)
    1597              : 
    1598           34 :    call timab(704,1,tsec(:))
    1599              :      ! =================================================================
    1600              :      !    BEGIN CALL TO CTQMC SOLVERS
    1601              :      ! =================================================================
    1602              : 
    1603           34 :    if (testcode == 0) then
    1604              : 
    1605              :        ! =================================================================
    1606              :        !    CTQMC run Abinit
    1607              :        ! =================================================================
    1608           34 :      if (paw_dmft%dmft_solv == 5) then
    1609              : 
    1610          136 :        ABI_MALLOC(docc,(nflavor,nflavor))
    1611         4698 :        docc(:,:) = zero
    1612              :        call CtqmcInterface_run(hybrid,fw1(1:paw_dmft%dmftqmc_l,:),Gtau=gtmp(:,:),Gw=gw_tmp(:,:),D=docc(:,:),E=green%ecorr_qmc(iatom),&
    1613              :          ! & matU=hu(itypat)%udens,opt_levels=levels_ctqmc)
    1614              :          & matU=dble(udens_atoms(iatom)%mat(:,:,1)),opt_levels=levels_ctqmc(:),Magmom_orb=REAL(magmom_orb(iatom)%value),&
    1615        18690 :          & Magmom_spin=REAL(magmom_spin(iatom)%value),Magmom_tot=REAL(magmom_tot(iatom)%value),Iatom=iatom,fname=paw_dmft%filapp)
    1616           34 :        if (paw_dmft%dmft_entropy > 0) then
    1617            9 :          call data4entropyDMFT_setDocc(paw_dmft%forentropyDMFT,iatom,docc(:,:))
    1618              :        end if
    1619           34 :        ABI_FREE(docc)
    1620              :        !DO iflavor = 1, nflavor
    1621              :        !  hybrid%Hybrid%Greens(iflavor)%oper(1:this%samples) = gtmp(1:this%samples,iflavor)
    1622              :        !  CALL GreenHyb_forFourier(this%Greens(iflavor), Gomega=Gw(:,iflavor), omega=Gw(:,this%flavors+1))
    1623              :        !END DO
    1624              : 
    1625              :        ! =================================================================
    1626              :        !    CTQMC run Abinit off diagonal terms in hybridization
    1627              :        ! =================================================================
    1628            0 :      else if (paw_dmft%dmft_solv == 8) then
    1629              :        ! =================================================================
    1630              : 
    1631            0 :        ABI_MALLOC(docc,(nflavor,nflavor))
    1632            0 :        docc(:,:) = zero
    1633              : 
    1634              :        call CtqmcoffdiagInterface_run(hybridoffdiag,fw1_nd(1:paw_dmft%dmftqmc_l,:,:),Gtau=gtmp_nd(:,:,:),&
    1635              :           & Gw=gw_tmp_nd(:,:,:),D=doccsum,E=green%ecorr_qmc(iatom),Noise=noise,matU=dble(udens_atoms(iatom)%mat(:,:,1)),&
    1636              :           & Docc=docc(:,:),opt_levels=levels_ctqmc(:),hybri_limit=hybri_limit(:,:),Magmom_orb=REAL(magmom_orb(iatom)%value),&
    1637              :           & Magmom_spin=REAL(magmom_spin(iatom)%value),Magmom_tot=REAL(magmom_tot(iatom)%value),Iatom=iatom,&
    1638            0 :           & fname=paw_dmft%filapp,jmjbasis=usejmj)
    1639              : 
    1640              :        ! For entropy (alternative formulation)
    1641            0 :        if (paw_dmft%ientropy == 1) then
    1642            0 :          EE = zero
    1643            0 :          do if1=1,nflavor
    1644            0 :            do if2=if1+1,nflavor
    1645            0 :              EE = EE + docc(if1,if2)*dble(udens_atoms_for_s(iatom)%mat(if1,if2,1))
    1646              :              ! write(std_out,*) udens_atoms_for_s(iatom)%value(if1,if2),docc(if1,if2)
    1647              :            end do
    1648              :          end do
    1649              :          ! Here in udens U=1, J=J/U, so we need to multiply bu U/Ha_eV
    1650            0 :          write(message,'(a,3(f14.10,3x))') "For entropy calculation E_corr_qmc, u_for_s, j_for,s", &
    1651            0 :              & paw_dmft%u_for_s*EE/Ha_eV,paw_dmft%u_for_s,paw_dmft%j_for_s
    1652            0 :          call wrtout(std_out,message,'COLL')
    1653            0 :          EE = zero
    1654            0 :          do if1=1,nflavor
    1655            0 :            do if2=if1+1,nflavor
    1656            0 :              EE = EE + dble(docc(if1,if2)*udens_atoms(iatom)%mat(if1,if2,1))
    1657              :              ! write(std_out,*) udens_atoms(iatom)%value(if1,if2),docc(if1,if2)
    1658              :            end do
    1659              :          end do
    1660              :          ! Here in udens U=U, J=J, so we obtain directly the results
    1661            0 :          write(message,'(a,3(f14.10,3x))') "Reference   calculation E_corr_qmc, upawu  , jpawu  ", &
    1662            0 :              & EE,hu(itypat)%upawu*Ha_eV,hu(itypat)%jpawu*Ha_eV
    1663            0 :          call wrtout(std_out,message,'COLL')
    1664              :        end if
    1665            0 :        ABI_FREE(docc)
    1666              :        ! TODO: Handle de luj0 case for entropy
    1667              : 
    1668              :         ! =================================================================
    1669              :         !    CTQMC run Abinit Complex off diagonal terms in hybridization
    1670              :         ! =================================================================
    1671            0 :       else if (paw_dmft%dmft_solv == 10) then
    1672              :         ! =================================================================
    1673              : 
    1674            0 :         ABI_MALLOC(docc,(nflavor,nflavor))
    1675            0 :         docc(:,:) = zero
    1676              : 
    1677              :         call CtqmcoffdiagInterfaceComplex_run(hybridoffdiagComplex,fw1_nd(1:paw_dmft%dmftqmc_l,:,:),Gtau=gtmp_ndc(:,:,:),&
    1678              :            & Gw=gw_tmp_nd(:,:,:),D=doccsum,E=green%ecorr_qmc(iatom),Noise=noise,matU=udens_atoms(iatom)%mat(:,:,1),&
    1679              :            & Docc=docc(:,:),opt_levels=levels_ctqmc_complex(:),hybri_limit=hybri_limit(:,:),Magmom_orb=REAL(magmom_orb(iatom)%value),&
    1680              :            & Magmom_spin=REAL(magmom_spin(iatom)%value),Magmom_tot=REAL(magmom_tot(iatom)%value),&
    1681            0 :            & Iatom=iatom,fname=paw_dmft%filapp,opthybri=opt_hybri)
    1682              : 
    1683            0 :         ABI_FREE(docc)
    1684              :        ! =================================================================
    1685              :        !    CTQMC run TRIQS
    1686              :        ! =================================================================
    1687            0 :      else if (paw_dmft%dmft_solv == 9) then
    1688              :        ! =================================================================
    1689              : 
    1690            0 :        call ctqmc_calltriqs(paw_dmft,cryst_struc,hu(:),levels_ctqmc,gtmp_nd,gw_tmp_nd,fw1_nd,leg_measure,iatom)
    1691              : 
    1692              :      end if
    1693              : 
    1694              :    ! =================================================================
    1695              :    !    CTQMC run for tests
    1696              :    ! =================================================================
    1697            0 :    else if (testcode >= 1) then
    1698              :      call CtqmcInterface_run(hybrid,fw1(1:nomega,:),Gtau=gtmp(:,:),Gw=gw_tmp(:,:),E=green%ecorr_qmc(iatom),&
    1699            0 :         & matU=umod(:,:),opt_levels=levels_ctqmc(:),Iatom=iatom,fname=paw_dmft%filapp)
    1700              : 
    1701              :      ! for non diagonal code
    1702              :      !       call CtqmcInterface_run(hybrid,fw1_nd(1:nomega,:,:),Gtau=gtmp_nd,&
    1703              :      !&       Gw=gw_tmp_nd,D=Doccsum,E=green%ecorr_qmc(iatom),&
    1704              :      !&       Noise=Noise,matU=umod,opt_levels=levels_ctqmc,hybri_limit=hybri_limit)
    1705              : 
    1706              :      !  If test of the code is activated, and testrot =1 rotate back green's function   and stop the code.
    1707              :      ! --------------------------------------------------------------------------------------------------
    1708            0 :      if (testcode == 1) then
    1709              : 
    1710              :        call testcode_ctqmc(paw_dmft%dmftqmc_l,fw1_nd(:,:,:),fw1(:,:),gtmp_nd(:,:,:),gw_tmp_nd(:,:,:), &
    1711            0 :             & levels_ctqmc(:),hybri_limit(:,:),nflavor,2,paw_dmft%temp,testrot,testcode,umod(:,:))
    1712              : 
    1713            0 :        write(message,'(2a)') ch10,' testcode end of test calculation'
    1714            0 :        ABI_ERROR(message)
    1715              :      end if
    1716              : 
    1717            0 :      if (testcode == 2) then
    1718            0 :        write(message,'(2a)') ch10,' testcode 2 end of test calculation'
    1719            0 :        ABI_ERROR(message)
    1720              :      end if
    1721              : 
    1722              :    end if
    1723           34 :    call timab(704,2,tsec(:))
    1724              :    ! =================================================================
    1725              :    !    END CALL TO CTQMC SOLVERS
    1726              :    ! =================================================================
    1727              : 
    1728              : 
    1729              :    ! Print green function is files directly from CTQMC
    1730              :    ! --------------------------------------------------
    1731           34 :    call ctqmcoutput_printgreen(paw_dmft,gtmp_nd,gtmp_ndc,gw_tmp_nd,gtmp,gw_tmp,iatom)
    1732              : 
    1733              : 
    1734              :    ! If the CTQMC code in ABINIT was used, then destroy it and deallocate arrays
    1735              :    ! ----------------------------------------------------------------------------
    1736              :    ! if(paw_dmft%dmft_solv<6.and.paw_dmft%dmft_solv>7) then
    1737              :    ! Nothing just hybrid var problem
    1738              :    ! else
    1739           34 :    write(message,'(a,2x,a)') ch10," == Destroy CTQMC"
    1740           34 :    call wrtout(std_out,message,'COLL')
    1741           34 :    if (paw_dmft%dmft_solv == 5) then
    1742           34 :      call CtqmcInterface_finalize(hybrid)
    1743              :    end if
    1744           34 :    if (paw_dmft%dmft_solv == 8) then
    1745            0 :      call CtqmcoffdiagInterface_finalize(hybridoffdiag)
    1746              :    end if
    1747           34 :    if (paw_dmft%dmft_solv == 10) then
    1748            0 :      call CtqmcoffdiagInterfaceComplex_finalize(hybridoffdiagComplex)
    1749              :    end if
    1750           34 :    write(message,'(a,2x,a)') ch10," == Destroy CTQMC done"
    1751           34 :    call wrtout(std_out,message,'COLL')
    1752           34 :    ABI_FREE(hybri_limit)
    1753           34 :    ABI_FREE(levels_ctqmc_nd)
    1754           34 :    ABI_FREE(levels_ctqmc)
    1755           34 :    ABI_FREE(levels_ctqmc_complex)
    1756           34 :    ABI_FREE(fw1)
    1757           34 :    ABI_FREE(fw1_nd)
    1758              : 
    1759              :    ! ____________________________________________________________
    1760              :    !
    1761              :    !  FOURTH PART : USE OUTPUT OF CTQMC AND THEN DO BACK ROTATION
    1762              :    ! ____________________________________________________________
    1763              :    !
    1764              : 
    1765              :    ! Put green's function values from CTQMC into green structure
    1766              :    !------------------------------------------------------------
    1767           34 :    call ctqmcoutput_to_green(green,paw_dmft,gtmp_nd,gtmp_ndc,gw_tmp_nd,gtmp,gw_tmp,iatom,leg_measure,opt_nondiag,opt_complex)
    1768              : 
    1769              :    ! Deallocate arrays for CTQMC
    1770              :    !----------------------------
    1771           34 :    if (paw_dmft%dmft_solv < 6) then
    1772           34 :      ABI_FREE(gw_tmp)
    1773              :    end if
    1774           34 :    ABI_FREE(gw_tmp_nd)
    1775           34 :    ABI_FREE(gtmp)
    1776           34 :    ABI_FREE(gtmp_nd)
    1777           68 :    if(paw_dmft%dmft_solv .eq. 10) then
    1778            0 :      ABI_FREE(gtmp_ndc)
    1779              :    endif
    1780              : 
    1781              :    ! Do Fourier transform if it was not done (ie if TRIQS is used without legendre measurement)
    1782              :    !-------------------------------------------------------------------------------------------
    1783              :    ! if(opt_nondiag==1) then  ! (As leg_measure is activated by defautl, this fourier is never done).
    1784              :    !   if(paw_dmft%dmft_solv>=6.and..not.leg_measure.and.paw_dmft%dmft_solv<=7) then
    1785              :    !     write(message,'(2a,i3,13x,a)') ch10,'   ===  Direct Fourier Transform t->w of Weiss Field'
    1786              :    !     call wrtout(std_out,message,'COLL')
    1787              :    !     call fourier_green(cryst_struc,green,paw_dmft,&
    1788              :    !     & pawang,opt_ksloc=2,opt_tw=1)
    1789              :    !     end if
    1790              :    !   endif
    1791              : 
    1792              :   ! end if
    1793              : 
    1794              :  end do ! iatom
    1795           34 :  call timab(703,2,tsec(:))
    1796              :  ! ==================================================================
    1797              :  !  End big loop over atoms to compute hybridization and do the CTQMC
    1798              :  ! ==================================================================
    1799              : 
    1800           34 :  call timab(705,1,tsec(:))
    1801           34 :  if (paw_dmft%dmft_prgn == 1) then
    1802            0 :    call print_green('QMC_diag_notsym',green,1,paw_dmft,opt_wt=2)
    1803            0 :    call print_green('QMC_diag_notsym',green,1,paw_dmft,opt_wt=1)
    1804              :  end if
    1805              :  ! write(message,'(i3,4x,2e21.14)') 6,weiss_for_rot%oper(1)%matlu(1)%mat(1,1,1,1,1)
    1806              :  ! call wrtout(std_out,message,'COLL')  ! debug
    1807              :  ! =================================================================
    1808              :  ! Inverse Weiss, then
    1809              :  ! Copy Weiss_for_rot into weiss and rotate back weiss to the original basis
    1810              :  ! =================================================================
    1811              : 
    1812              :  ! ABI_MALLOC(shift,(natom))
    1813              :  ! do ifreq=1,paw_dmft%dmft_nwlo
    1814              :  !  ! First weiss_for_rot contains -G_0^-1+iw_n
    1815              :  !  ! -------------------------------------------
    1816              :  !  ! Compute G_0^-1-iw_n
    1817              :  !  ! --------------------
    1818              :  !       write(6,*) "1"
    1819              :  !  if(opt_fk==1) call fac_matlu(weiss_for_rot%oper(ifreq)%matlu,natom,-cone)
    1820              :  !
    1821              :  !
    1822              :  !       write(6,*) "2"
    1823              :  !  ! Compute G_0^-1
    1824              :  !  ! --------------------
    1825              :  !  shift(:)=cmplx(zero,paw_dmft%omega_lo(ifreq),kind=dp)
    1826              :  !  if(opt_fk==1) call shift_matlu(weiss_for_rot%oper(ifreq)%matlu,natom,shift,signe=1)
    1827              :  !
    1828              :  !       write(6,*) "3"
    1829              :  !  ! Compute G_0
    1830              :  !  ! --------------------
    1831              :  !   call inverse_oper(weiss_for_rot%oper(ifreq),option=1,prtopt=1)
    1832              :  !   ! No need to copy if weiss_for_rot is a pointer to weiss ...
    1833              :  !!   if(useylm==1) call slm2ylm_matlu(weiss%oper(ifreq)%matlu,natom,2,0)
    1834              :  !!   if(opt_diag/=0) call rotate_matlu(weiss%oper(ifreq)%matlu,eigvectmatlu,natom,3,0)
    1835              :  !
    1836              :  !  ! Compute G_0 in the original basis
    1837              :  !  ! --------------------
    1838              :  !   call rotate_matlu(weiss_for_rot%oper(ifreq)%matlu,eigvectmatlu,natom,3,0)
    1839              :  ! end do
    1840              :  ! ABI_FREE(shift)
    1841              : 
    1842              :  ! =================================================================
    1843              :  ! Here compute Self energy from Dyson and print it
    1844              :  ! Warning : Weiss_for_rot is inversed inside dyson
    1845              :  ! =================================================================
    1846              :  ! call initialize_self(self,paw_dmft)
    1847              :  ! call dyson(green,paw_dmft,self,weiss_for_rot,opt_weissself=2)
    1848              :  ! call rw_self(self,mpi_enreg,paw_dmft,prtopt=2,opt_rw=2,opt_char="diag")
    1849              :  ! call destroy_self(self)
    1850              :   !write(message,'(i3,4x,2e21.14)') 7,weiss%oper(1)%matlu(1)%mat(1,1,1,1,1)
    1851              :   !call wrtout(std_out,message,'COLL')  ! debug
    1852              : 
    1853              : ! =================================================================
    1854              : ! Rotate back green function to original basis (non-diagonal)
    1855              : !  (and Weiss for further use: might be useful if an back Fourier
    1856              : !     transformation is done).
    1857              : ! =================================================================
    1858           34 :  if (pawprtvol >= 3) then
    1859           28 :    write(message,'(a,2x,a)') ch10, &  ! debug
    1860           56 :       & " == Print Green's function for tau=0+ in the CTQMC basis"  ! debug
    1861           28 :    call wrtout(std_out,message,'COLL')  ! debug
    1862           28 :    call print_matlu(green%oper_tau(1)%matlu(:),natom,1,compl=1)  ! debug
    1863           28 :    write(message,'(a,2x,a)') ch10,&  ! debug
    1864           56 :       & " == Print Green's function for smallest freq in the CTQMC basis"  ! debug
    1865           28 :    call wrtout(std_out,message,'COLL')  ! debug
    1866           28 :    call print_matlu(green%oper(1)%matlu(:),natom,1)  ! debug
    1867              :  end if ! pawprtvol>=3
    1868              : 
    1869              :  !  === Compute rotated Occupations in green%occup_tau
    1870           34 :  call occup_green_tau(green)
    1871              : 
    1872           34 :  if (pawprtvol >= 3) then
    1873              :  ! === Compute non rotated Occupations in green%occup_tau
    1874           28 :    write(message,'(a,2x,a)') ch10," == Occupations from G(tau=0-) in the CTQMC basis"
    1875           28 :    call wrtout(std_out,message,'COLL')
    1876           28 :    call print_matlu(green%occup_tau%matlu(:),natom,1)
    1877              :  end if ! pawprtvol>=3
    1878              : 
    1879              :  ! =================================================================
    1880              :  !
    1881              :  !  === Compute magnetic moments from CT-QMC occupations for
    1882              :  !  the x,y and z axes when SOC is activated
    1883              :  !
    1884              :  ! =================================================================
    1885           34 :  if (paw_dmft%nspinor .eq. 2) then
    1886            0 :   ABI_MALLOC(matlumag,(natom))
    1887            0 :   ABI_MALLOC(muzeem,(natom))
    1888            0 :   ABI_MALLOC(muspin,(natom))
    1889            0 :   ABI_MALLOC(muorb,(natom))
    1890            0 :   write(message,'(a,2x,a)') ch10,"== Magnetic moments from CT-QMC occupation matrix "
    1891            0 :   call wrtout(std_out,message,'COLL')
    1892              : 
    1893            0 :   do iatom=1,cryst_struc%natom
    1894            0 :     lpawu=paw_dmft%lpawu(iatom)
    1895            0 :     if(lpawu .ne. -1) then
    1896            0 :       write(message,'(a,3x,a,i4)') ch10,"-------> For Correlated Atom",iatom
    1897            0 :       call wrtout(std_out,message,'COLL')
    1898              : 
    1899              :       ! == orbital angular momentum
    1900            0 :       do icomp=1,3 !x,y,z components
    1901            0 :         muorb(iatom)=czero
    1902            0 :         call init_matlu(natom=natom,nspinor=paw_dmft%nspinor,nsppol=paw_dmft%nsppol,lpawu_natom=paw_dmft%lpawu,matlu=matlumag)
    1903            0 :         call copy_matlu(green%occup_tau%matlu,matlumag,natom)
    1904            0 :         if (usejmj == 1) then
    1905            0 :           call ylm2jmj_matlu(matlumag,natom,2,paw_dmft)
    1906              :         else
    1907            0 :           call rotate_matlu(matlumag,eigvectmatlu,natom=natom,inverse=0)
    1908              :         endif
    1909            0 :         call magmomforb_matlu(matlumag,muorb,natom=natom,option=icomp,optprt=0)
    1910            0 :         write(message,'(a,2x,a,i4,a,f8.4)') ch10," Orbital angular momentum for axis ", icomp, " is ", REAL(muorb(iatom))
    1911            0 :         call wrtout(std_out,message,'COLL')
    1912            0 :         call destroy_matlu(matlumag,(natom))
    1913              :       end do
    1914              : 
    1915              :       ! == spin angular momentum
    1916            0 :       do icomp=1,3 !x,y,z components
    1917            0 :         muspin(iatom)=czero
    1918            0 :         call init_matlu(natom=natom,nspinor=paw_dmft%nspinor,nsppol=paw_dmft%nsppol,lpawu_natom=paw_dmft%lpawu,matlu=matlumag)
    1919            0 :         call copy_matlu(green%occup_tau%matlu,matlumag,natom=natom)
    1920            0 :         if (usejmj == 1) then
    1921            0 :           call ylm2jmj_matlu(matlumag,natom,2,paw_dmft)
    1922              :         else
    1923            0 :           call rotate_matlu(matlumag,eigvectmatlu,natom=natom,inverse=0)
    1924              :         endif
    1925            0 :         call magmomfspin_matlu(matlumag,muspin,natom=natom,option=icomp,optprt=0)
    1926            0 :         write(message,'(a,2x,a,i4,a,f8.4)') ch10," Spin angular momentum for axis ", icomp, " is ", REAL(muspin(iatom))
    1927            0 :         call wrtout(std_out,message,'COLL')
    1928            0 :         call destroy_matlu(matlumag,(natom))
    1929              :       end do
    1930              : 
    1931              :       ! == total angular momentum (L_u + 2*S_u)
    1932            0 :       do icomp=1,3 !x,y,z components
    1933            0 :         muzeem(iatom)=czero
    1934            0 :         call init_matlu(natom=natom,nspinor=paw_dmft%nspinor,nsppol=paw_dmft%nsppol,lpawu_natom=paw_dmft%lpawu,matlu=matlumag)
    1935            0 :         call copy_matlu(green%occup_tau%matlu,matlumag,natom=natom)
    1936            0 :         if (usejmj == 1) then
    1937            0 :           call ylm2jmj_matlu(matlumag,natom,2,paw_dmft)
    1938              :         else
    1939            0 :           call rotate_matlu(matlumag,eigvectmatlu,natom=natom,inverse=0)
    1940              :         endif
    1941            0 :         call magmomfzeeman_matlu(matlumag,muzeem,natom=natom,option=icomp,optprt=0)
    1942            0 :         write(message,'(a,2x,a,i4,a,f8.4)') ch10," Zeeman angular momentum for axis ", icomp, " is ", REAL(muzeem(iatom))
    1943            0 :         call wrtout(std_out,message,'COLL')
    1944            0 :         call destroy_matlu(matlumag,(natom))
    1945              :       end do
    1946              :     endif !lpawu
    1947              :   end do !iatom
    1948            0 :   ABI_FREE(matlumag)
    1949            0 :   ABI_FREE(muzeem)
    1950            0 :   ABI_FREE(muspin)
    1951            0 :   ABI_FREE(muorb)
    1952              :  end if !nspinor
    1953              :  ! =================================================================
    1954              : 
    1955           34 :  if (opt_diag /= 0) then
    1956           14 :    write(message,'(a,2x,a)') ch10," == Rotate Green's function back to original basis "
    1957           14 :    call wrtout(std_out,message,'COLL')
    1958              :  end if
    1959              :  ! write(message,'(i3,4x,2e21.14)') 8,weiss%oper(1)%matlu(1)%mat(1,1,1,1,1)
    1960              :  ! call wrtout(std_out,message,'COLL')  ! debug
    1961              : 
    1962              :  ! Rotate oper_tau into Ylm basis and then Slm basis
    1963              :  ! -------------------------------------------------------------
    1964              :  ! do itau=1,paw_dmft%dmftqmc_l
    1965              :  !   if (opt_diag /= 0) call rotate_matlu(green%oper_tau(itau)%matlu(:),eigvectmatlu(:),natom,3,0)
    1966              :  !   if (useylm == 1) call slm2ylm_matlu(green%oper_tau(itau)%matlu(:),natom,2,0)
    1967              :  ! end do
    1968         7584 :  do itau=1,paw_dmft%dmftqmc_l
    1969         7550 :    if (opt_diag /= 0) then
    1970          700 :      call rotate_matlu(green%oper_tau(itau)%matlu(:),eigvectmatlu(:),natom,0)
    1971              :    end if
    1972         7550 :    if (usejmj == 1) then
    1973            0 :      call ylm2jmj_matlu(green%oper_tau(itau)%matlu(:),natom,2,paw_dmft)
    1974              :    endif
    1975         7584 :    if (useylm == 1) then
    1976            0 :      call slm2ylm_matlu(green%oper_tau(itau)%matlu(:),natom,paw_dmft,2,0)
    1977              :    end if
    1978              :  end do ! itau
    1979              : 
    1980              :  ! Rotate occup_tau into Ylm basis and then Slm basis
    1981              : 
    1982              :  ! Rotate occup_tau into Ylm basis and then Slm basis
    1983              :  !-------------------------------------------------------------
    1984           34 :  if (opt_diag /= 0) then
    1985           14 :    call rotate_matlu(green%occup_tau%matlu(:),eigvectmatlu(:),natom,0)
    1986              :  end if
    1987           34 :  if (usejmj == 1) then
    1988            0 :     write(message,'(a,2x,a)') ch10," == Occupations from G(tau=0-) in the jmj basis"
    1989            0 :     call wrtout(std_out,message,'COLL')
    1990            0 :     call ylm2jmj_matlu(green%occup_tau%matlu(:),natom,2,paw_dmft)
    1991            0 :     call print_matlu(green%occup_tau%matlu(:),natom,1)
    1992              :  endif
    1993           34 :  if (useylm == 1) then
    1994            0 :    write(message,'(a,2x,a)') ch10," == Occupations from G(tau=0-) in the Ylm basis"
    1995            0 :    call wrtout(std_out,message,'COLL')
    1996            0 :    call print_matlu(green%occup_tau%matlu(:),natom,1)
    1997            0 :    call slm2ylm_matlu(green%occup_tau%matlu(:),natom,paw_dmft,2,0)
    1998              :  end if
    1999              :  ! write(message,'(a,2x,a)') ch10," == Occupations from G(tau=0-) in the Slm basis"
    2000              :  ! call wrtout(std_out,message,'COLL')
    2001              :  ! call print_matlu(green%occup_tau%matlu(:),natom,1)
    2002              : 
    2003              :  ! Put Weiss off diagonal terms to zero because Green function will not have any offdiag terms
    2004              :  ! ------------------------------------------------------------------------------
    2005              :  !   (if opt_nondiag=0 ie dmft_solv=5)
    2006           34 :  if (opt_nondiag == 0) then
    2007        17963 :    do ifreq=1,nwlo
    2008        17963 :      call zero_matlu(weiss%oper(ifreq)%matlu(:),natom,onlynondiag=1)
    2009              :    end do ! ifreq
    2010              :  end if ! opt_nondiag=0
    2011              :  !    ( if opt_nondiag=0, then:
    2012              :  !       As Green's function is diagonal, one suppress off diag  terms in Weiss, if any.
    2013              :  !      (If off diag are non zero in the density matrix and thus in the Green's function,
    2014              :  !       there is a warning in checkreal_matlu above).)
    2015              : 
    2016              :  ! Rotate Green's and Weiss functions into Ylm basis and then Slm basis
    2017              :  !-------------------------------------------------------------
    2018              : 
    2019        17963 :  do ifreq=1,nwlo
    2020        17929 :    if (opt_diag /= 0) then
    2021         1260 :      call rotate_matlu(green%oper(ifreq)%matlu(:),eigvectmatlu(:),natom,0)
    2022         1260 :      call rotate_matlu(weiss%oper(ifreq)%matlu(:),eigvectmatlu(:),natom,0)
    2023              :    end if
    2024        17929 :    if (usejmj == 1) then
    2025            0 :      call ylm2jmj_matlu(green%oper(ifreq)%matlu(:),natom,2,paw_dmft)
    2026            0 :      call ylm2jmj_matlu(weiss%oper(ifreq)%matlu(:),natom,2,paw_dmft)
    2027              :    endif
    2028        17963 :    if (useylm == 1) then
    2029            0 :      call slm2ylm_matlu(green%oper(ifreq)%matlu(:),natom,paw_dmft,2,0)
    2030            0 :      call slm2ylm_matlu(weiss%oper(ifreq)%matlu(:),natom,paw_dmft,2,0)
    2031              :    end if
    2032              :  end do ! ifreq
    2033              : 
    2034              :  !write(message,'(i3,4x,2e21.14)') 10,weiss%oper(1)%matlu(1)%mat(1,1,1,1,1)
    2035              :  !call wrtout(std_out,message,'COLL')  ! debug
    2036              : 
    2037           34 :  if (pawprtvol >= 3) then
    2038              : !< HACK >
    2039           28 :    write(message,'(a,2x,a)') ch10,&  ! debug
    2040           56 :        & " == Print diagonalized weiss_for_rot function after rotation for small freq in the ctqmc basis"  ! debug
    2041           28 :    call wrtout(std_out,message,'COLL')  ! debug
    2042           28 :    call print_matlu(weiss_for_rot%oper(1)%matlu(:),natom,1)  ! debug
    2043              : 
    2044              : !</ HACK >
    2045           28 :    write(message,'(a,2x,a)') ch10,&  ! debug
    2046           56 :      & " == Print Weiss function for smallest freq in the Slm basis"  ! debug
    2047           28 :    call wrtout(std_out,message,'COLL')  ! debug
    2048           28 :    call print_matlu(weiss%oper(1)%matlu(:),natom,1)  ! debug
    2049              : 
    2050        17453 :    do ifreq=1,nwlo
    2051        17453 :      call sym_matlu(weiss%oper(ifreq)%matlu(:),paw_dmft)
    2052              :    end do
    2053           28 :    write(message,'(a,2x,a)') ch10,&  ! debug
    2054           56 :      & " == Print symmetrized Weiss function for smallest freq in the Slm basis"  ! debug
    2055           28 :    call wrtout(std_out,message,'COLL')  ! debug
    2056           28 :    call print_matlu(weiss%oper(1)%matlu(:),natom,1)  ! debug
    2057           28 :    write(message,'(a,2x,a)') ch10, &                  ! debug
    2058           56 :      & " == Print Green's function for tau=0+ in the Slm basis" ! debug
    2059           28 :    call wrtout(std_out,message,'COLL')                  ! debug
    2060           28 :    call print_matlu(green%oper_tau(1)%matlu(:),natom,1)  ! debug
    2061           28 :    write(message,'(a,2x,a)') ch10,&                  ! debug
    2062           56 :      & " == Print Green's function for smallest freq in the Slm basis" ! debug
    2063           28 :    call wrtout(std_out,message,'COLL')                  ! debug
    2064           28 :    call print_matlu(green%oper(1)%matlu(:),natom,1)  ! debug
    2065              :  end if ! pawprtvol>=3
    2066              : 
    2067          164 :  ABI_MALLOC(matlu1,(natom))
    2068           34 :  call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu(:),matlu1(:))
    2069           34 :  call copy_matlu(green%occup_tau%matlu(:),matlu1(:),natom)
    2070           34 :  call sym_matlu(matlu1(:),paw_dmft)
    2071              : 
    2072           34 :  write(message,'(a,2x,a)') ch10," == Occupations from G(tau=0-) in the Slm basis"
    2073           34 :  call wrtout(std_out,message,'COLL')
    2074           34 :  call print_matlu(green%occup_tau%matlu(:),natom,1)
    2075              : 
    2076           34 :  write(message,'(a,2x,a)') ch10," == Symmetrized occupations"
    2077           34 :  call wrtout(std_out,message,'COLL')
    2078           34 :  call print_matlu(matlu1(:),natom,1)
    2079              : 
    2080           34 :  call diff_matlu("CTQMC occupations","Symmetrized CTQMC occupations",green%occup_tau%matlu(:),matlu1(:),natom,0,tol4,ierr=ierr)
    2081           34 :  call destroy_matlu(matlu1(:),natom)
    2082           96 :  ABI_FREE(matlu1)
    2083              : 
    2084              :  ! =================================================================
    2085              :  ! Symmetrize green function G(tau) and G(ifreq) to recover symmetry
    2086              :  ! artificially broken by QMC
    2087              :  ! =================================================================
    2088           34 :  write(message,'(a,2x,a)') ch10," == Symmetrize Green's function after CTQMC "
    2089           34 :  call wrtout(std_out,message,'COLL')
    2090              : 
    2091           68 :  do itau=1,1 !paw_dmft%dmftqmc_l
    2092           68 :    call sym_matlu(green%oper_tau(itau)%matlu(:),paw_dmft)
    2093              :  end do ! itau
    2094              : 
    2095              :  ! Perform symetry on GPU if requested
    2096           34 :  if (paw_dmft%gpu_option == ABI_GPU_OPENMP) then
    2097              : #ifdef HAVE_OPENMP_OFFLOAD
    2098              :    ! 1) Init green_oper_ndat
    2099              :    call init_oper_ndat(paw_dmft,green_oper_ndat,nwlo,nkpt=green%oper(1)%nkpt,opt_ksloc=2,gpu_option=paw_dmft%gpu_option)
    2100              :    if (green%oper(1)%has_operks == 0) then
    2101              :      green_oper_ndat%paral  = 1
    2102              :      green_oper_ndat%shiftk = green%distrib%shiftk
    2103              :    end if
    2104              :    ! 2) Copy green%oper(:)%matlu into green_oper_ndat (CPU->GPU transfer)
    2105              :    call copy_oper_to_ndat(green%oper,green_oper_ndat,nwlo,green%nw,green%distrib%proct,green%distrib%me_freq,.false.)
    2106              : 
    2107              :    ! 3) Perform sym_matlu on green_oper_ndat (GPU enabled)
    2108              :    call sym_matlu(green_oper_ndat%matlu(:),paw_dmft)
    2109              : 
    2110              :    ! 4) Copy back green%oper(:)%matlu from green_oper_ndat (GPU->CPU transfer)
    2111              :    call copy_oper_from_ndat(green_oper_ndat,green%oper,nwlo,green%nw,green%distrib%proct,&
    2112              :    &    green%distrib%me_freq,.false.)
    2113              :    ! 5) Destroy green_oper_ndat
    2114              :    call destroy_oper(green_oper_ndat)
    2115              : #endif
    2116              :  else
    2117        17963 :    do ifreq=1,paw_dmft%dmft_nwlo
    2118        17963 :      call sym_matlu(green%oper(ifreq)%matlu(:),paw_dmft)
    2119              :    end do ! ifreq
    2120              :  end if
    2121              : 
    2122              : 
    2123           34 :  if (pawprtvol >= 3) then
    2124           28 :    write(message,'(a,2x,a)') ch10, &  ! debug
    2125           56 :       & " == Print Green's function for tau=0+ after symmetrization"  !  debug
    2126           28 :    call wrtout(std_out,message,'COLL')  ! debug
    2127           28 :    call print_matlu(green%oper_tau(1)%matlu(:),natom,1)  ! debug
    2128           28 :    write(message,'(a,2x,a)') ch10, &  ! debug
    2129           56 :       & " == Print Green's function for smallest freq after symmetrization"  !  debug
    2130           28 :    call wrtout(std_out,message,'COLL')  ! debug
    2131           28 :    call print_matlu(green%oper(1)%matlu(:),natom,1)  ! debug
    2132              :  end if ! pawprtvol>=3
    2133           34 :  if (paw_dmft%dmft_prgn == 1) then
    2134            0 :    call print_green('QMC_sym',green,1,paw_dmft,opt_wt=2)
    2135            0 :    call print_green('QMC_sym',green,1,paw_dmft,opt_wt=1)
    2136              :  end if
    2137              : 
    2138              :  ! === Compute Occupations  (Symmetrized from oper_tau)
    2139           34 :  call occup_green_tau(green)
    2140              : 
    2141              :  ! === Print occupations
    2142              :  ! call printocc_green(green,6,paw_dmft,3)
    2143              : 
    2144           34 :  call destroy_oper(energy_level)
    2145           34 :  call destroy_matlu(dmat_diag(:),natom)
    2146           34 :  call destroy_matlu(eigvectmatlu(:),natom)
    2147           34 :  call destroy_matlu(udens_atoms(:),natom)
    2148           96 :  ABI_FREE(dmat_diag)
    2149           96 :  do iatom=1,natom
    2150           62 :    lpawu = paw_dmft%lpawu(iatom)
    2151           62 :    if (lpawu == -1) cycle
    2152           34 :    ABI_FREE(magmom_orb(iatom)%value)
    2153           34 :    ABI_FREE(magmom_spin(iatom)%value)
    2154           96 :    ABI_FREE(magmom_tot(iatom)%value)
    2155              :  end do
    2156           96 :  ABI_FREE(udens_atoms)
    2157           96 :  ABI_FREE(eigvectmatlu)
    2158           96 :  ABI_FREE(magmom_orb)
    2159           96 :  ABI_FREE(magmom_spin)
    2160           96 :  ABI_FREE(magmom_tot)
    2161           96 :  ABI_FREE(matlumag_orb)
    2162           96 :  ABI_FREE(matlumag_spin)
    2163           96 :  ABI_FREE(matlumag_tot)
    2164           34 :  call destroy_green(weiss_for_rot)
    2165              :  ! call destroy_green(gw_loc)
    2166              :  ! call destroy_green(greendft)
    2167              : 
    2168              :  ! destroy limit of hybridization
    2169           34 :  call destroy_matlu(hybri_coeff(:),paw_dmft%natom)
    2170           96 :  ABI_FREE(hybri_coeff)
    2171              : 
    2172           34 :  call destroy_vee(paw_dmft,vee_rotated(:))
    2173           96 :  ABI_FREE(vee_rotated)
    2174           34 :  call timab(705,2,tsec(:))
    2175           34 :  call timab(701,2,tsec(:))
    2176              : 
    2177          272 : end subroutine qmc_prep_ctqmc
    2178              : !!***
    2179              : 
    2180              : !!****f* m_forctqmc/testcode_ctqmc_b
    2181              : !! NAME
    2182              : !! testcode_ctqmc_b
    2183              : !!
    2184              : !! FUNCTION
    2185              : !! Setup ultra simple hybridization to test CTQMC in simple situations.
    2186              : !!
    2187              : !! INPUTS
    2188              : !! temp = temperature
    2189              : !! dmftqmc_l = number of times slices
    2190              : !! levels_ctqmc_nd=level matrix
    2191              : !!
    2192              : !! OUTPUT
    2193              : !! fw1_nd=hybridization matrix
    2194              : !! umod = value of U
    2195              : !! hybri_limit= limit of F
    2196              : !! weiss_for_rot= weiss function
    2197              : !! hybri_coeff
    2198              : !!
    2199              : !! SIDE EFFECTS
    2200              : !!
    2201              : !! NOTES
    2202              : !!
    2203              : !! SOURCE
    2204              : 
    2205            0 : subroutine testcode_ctqmc_b(energy_level,hybri_coeff,weiss_for_rot,dmftqmc_l,fw1_nd,levels_ctqmc,&
    2206            0 : &   levels_ctqmc_nd,hybri_limit,temp,umod,opt_diag,opt_fk)
    2207              : 
    2208              : !Arguments ------------------------------------
    2209              : !scalars
    2210              :  integer, intent(in) :: dmftqmc_l,opt_diag,opt_fk
    2211              :  real(dp), intent(in) :: temp
    2212              :  real(dp), intent(out) :: umod(2,2)
    2213              :  real(dp), intent(inout) :: levels_ctqmc(:)
    2214              :  complex(dp), intent(out) :: fw1_nd(:,:,:)
    2215              :  complex(dp),  intent(inout) :: levels_ctqmc_nd(:,:)
    2216              :  complex(dp),  intent(inout) :: hybri_limit(:,:)
    2217              :  type(oper_type)  :: energy_level
    2218              :  type(matlu_type), allocatable  :: hybri_coeff(:)
    2219              :  type(green_type)  :: weiss_for_rot
    2220              : 
    2221              : !Local variables ------------------------------
    2222              :  integer :: ifreq,iatom,ima,imb,ispa,ispb,ndim
    2223              :  real(dp) :: omega
    2224              :  real(dp) :: facnd, facd
    2225              :  character(len=30) :: tmpfil
    2226              : ! ************************************************************************
    2227            0 :  facnd=0.8d0
    2228            0 :  facd=1.0d0
    2229            0 :  ndim=2*energy_level%matlu(iatom)%lpawu+1
    2230              :  !write(6,*) "fac",facnd,facd
    2231            0 :  levels_ctqmc_nd(2,2)   = energy_level%matlu(iatom)%mat(imb+(ispb-1)*ndim,imb+(ispb-1)*ndim,1)
    2232            0 :  levels_ctqmc_nd(1,1)   = energy_level%matlu(iatom)%mat(ima+(ispa-1)*ndim,ima+(ispa-1)*ndim,1)
    2233            0 :  levels_ctqmc(2)   = real(energy_level%matlu(iatom)%mat(imb+(ispb-1)*ndim,imb+(ispb-1)*ndim,1),kind=dp)
    2234            0 :  levels_ctqmc(1)   = real(energy_level%matlu(iatom)%mat(ima+(ispa-1)*ndim,ima+(ispa-1)*ndim,1),kind=dp)
    2235            0 :  if(opt_diag/=1) then
    2236            0 :    levels_ctqmc_nd(1,2)   = energy_level%matlu(iatom)%mat(ima+(ispa-1)*ndim,imb+(ispb-1)*ndim,1)
    2237            0 :    levels_ctqmc_nd(2,1)   = energy_level%matlu(iatom)%mat(imb+(ispb-1)*ndim,ima+(ispa-1)*ndim,1)
    2238              :  end if
    2239            0 :  hybri_limit(1,1)  = facd*hybri_coeff(iatom)%mat(ima+(ispa-1)*ndim,ima+(ispa-1)*ndim,1)
    2240            0 :  hybri_limit(2,2)  = facd*hybri_coeff(iatom)%mat(imb+(ispb-1)*ndim,imb+(ispb-1)*ndim,1)
    2241            0 :  hybri_limit(1,2)  = facnd*hybri_coeff(iatom)%mat(ima+(ispa-1)*ndim,imb+(ispb-1)*ndim,1)
    2242            0 :  hybri_limit(2,1)  = facnd*hybri_coeff(iatom)%mat(imb+(ispb-1)*ndim,ima+(ispa-1)*ndim,1)
    2243              :  !write(6,*) "hybri_limit",hybri_limit
    2244              :  !write(6,*) "levels_ctqmc",levels_ctqmc
    2245            0 :  umod=zero
    2246              : 
    2247              :  tmpfil = 'fw1_nd_re'
    2248              :  !if (open_file(newunit=unt,message,file=trim(tmpfil),status='unknown',form='formatted')/=0) then
    2249              :  !  ABI_ERROR(message)
    2250              :  !end if
    2251            0 :  tmpfil = 'fw1_nd_im'
    2252              :  !if (open_file(newunit=unt2,message,file=trim(tmpfil),status='unknown',form='formatted')/=0) then
    2253              :  !  ABI_ERROR(message)
    2254              :  !end if
    2255            0 :  write(std_out,*) "testcode==2",ispa,ispb,ima,imb
    2256            0 :  write(std_out,*) "opt_fk==",opt_fk
    2257            0 :  do ifreq=1,dmftqmc_l
    2258            0 :    if (opt_fk==1) then
    2259            0 :      fw1_nd(ifreq,1,1) = facd*weiss_for_rot%oper(ifreq)%matlu(iatom)%mat(ima+(ispa-1)*ndim,ima+(ispa-1)*ndim,1)
    2260            0 :      fw1_nd(ifreq,2,2) = facd*weiss_for_rot%oper(ifreq)%matlu(iatom)%mat(imb+(ispb-1)*ndim,imb+(ispb-1)*ndim,1)
    2261              :      !fw1_nd(ifreq,1,2) =  weiss_for_rot%oper(ifreq)%matlu(iatom)%mat(ima,imb,1,ispa,ispb)
    2262              :      !fw1_nd(ifreq,2,1) =  weiss_for_rot%oper(ifreq)%matlu(iatom)%mat(imb,ima,1,ispb,ispa)
    2263            0 :      fw1_nd(ifreq,1,2) = facnd*weiss_for_rot%oper(ifreq)%matlu(iatom)%mat(ima+(ispa-1)*ndim,imb+(ispb-1)*ndim,1)
    2264            0 :      fw1_nd(ifreq,2,1) = facnd*weiss_for_rot%oper(ifreq)%matlu(iatom)%mat(imb+(ispb-1)*ndim,ima+(ispa-1)*ndim,1)
    2265            0 :      omega=pi*temp*(two*float(ifreq)-1)
    2266            0 :    else if (opt_fk==0) then
    2267            0 :      fw1_nd(ifreq,1,1) =  facd*weiss_for_rot%oper(ifreq)%matlu(iatom)%mat(ima+(ispa-1)*ndim,ima+(ispa-1)*ndim,1)
    2268            0 :      fw1_nd(ifreq,2,2) =  facd*weiss_for_rot%oper(ifreq)%matlu(iatom)%mat(imb+(ispb-1)*ndim,imb+(ispb-1)*ndim,1)
    2269            0 :      fw1_nd(ifreq,1,2) =  facnd*weiss_for_rot%oper(ifreq)%matlu(iatom)%mat(ima+(ispa-1)*ndim,imb+(ispb-1)*ndim,1)
    2270            0 :      fw1_nd(ifreq,2,1) =  facnd*weiss_for_rot%oper(ifreq)%matlu(iatom)%mat(imb+(ispb-1)*ndim,ima+(ispa-1)*ndim,1)
    2271            0 :      call xginv(fw1_nd(ifreq,:,:),2)
    2272              :    end if
    2273              :  end do
    2274            0 : end subroutine testcode_ctqmc_b
    2275              : !!***
    2276              : 
    2277              : 
    2278              : !!****f* m_forctqmc/testcode_ctqmc
    2279              : !! NAME
    2280              : !! testcode_ctqmc
    2281              : !!
    2282              : !! FUNCTION
    2283              : !! Setup ultra simple hybridization to test CTQMC in simple situations.
    2284              : !!
    2285              : !! INPUTS
    2286              : !! gtmp_nd
    2287              : !! gw_tmp_nd
    2288              : !! temp = temperature
    2289              : !! dmftqmc_l = number of times slices
    2290              : !! nflavor = number of flavor
    2291              : !! testrot = 0/1 if rotation of hybridization is tested or not
    2292              : !! testcode = 1 if tests are activated.
    2293              : !! opt = 1/2 if pre or postprocessing of CTQMC data.
    2294              : !!
    2295              : !! OUTPUT
    2296              : !! fw1_nd = non diagonal hybridization
    2297              : !! fw1 = hybridization
    2298              : !! umod = value of U
    2299              : !!
    2300              : !!
    2301              : !! SIDE EFFECTS
    2302              : !!  gtmp_nd
    2303              : !!  gw_tmp_nd
    2304              : !!
    2305              : !! NOTES
    2306              : !!
    2307              : !! SOURCE
    2308              : 
    2309            0 : subroutine testcode_ctqmc(dmftqmc_l,fw1_nd,fw1,gtmp_nd,gw_tmp_nd,levels_ctqmc,hybri_limit,&
    2310              : &   nflavor,opt,temp,testrot,testcode,umod)
    2311              : 
    2312              : 
    2313              : !Arguments ------------------------------------
    2314              : !scalars
    2315              :  integer, intent(in) :: dmftqmc_l,nflavor,testrot,testcode,opt
    2316              :  real(dp), intent(in) :: temp
    2317              :  real(dp), intent(out) :: umod(2,2)
    2318              :  complex(dp), intent(inout) :: gw_tmp_nd(:,:,:)
    2319              :  real(dp),  intent(inout) :: gtmp_nd(:,:,:)
    2320              :  complex(dp), intent(out) :: fw1(:,:)
    2321              :  complex(dp), intent(out) :: fw1_nd(:,:,:)
    2322              :  real(dp),  intent(inout) :: levels_ctqmc(:)
    2323              :  complex(dp),  intent(inout) :: hybri_limit(:,:)
    2324              : 
    2325              : !Local variables ------------------------------
    2326              :  character(len=500) :: message
    2327              :  integer :: ifreq, itau,realrot,simplehyb
    2328              :  real(dp) :: omega
    2329              :  real(dp) :: tbi1,tbi2,e2,tbi3,tbi4,e3,e4,tbi21,tbi12,e3b,e4b,tbi21b,tbi12b
    2330              :  complex(dp) :: e1
    2331              : ! arrays
    2332              :  complex(dp) :: RR(2,2)
    2333              :  complex(dp) :: RR1(2,2)
    2334              :  complex(dp) :: RRi(2,2)
    2335              :  complex(dp) :: RRt(2,2)
    2336              : ! ************************************************************************
    2337            0 :  if (testcode==0) return
    2338            0 :  if (nflavor/=2) then
    2339            0 :    write(message,'(2a)') ch10,' testcode nflavor.ne.2'
    2340            0 :    ABI_ERROR(message)
    2341              :  end if
    2342              : 
    2343              :  simplehyb=2
    2344              :  simplehyb=1
    2345            0 :  simplehyb=3
    2346              :  !=========================
    2347              :  ! Built rotation matrix
    2348              :  !=========================
    2349              :  realrot=0
    2350            0 :  realrot=2
    2351              :  if (realrot==1) then
    2352              :    ! Real rotation
    2353              :    !=========================
    2354              :    RR(1,1)  =  SQRT(3.d0)/2.d0
    2355              :    RR(1,2)  = -1.d0/2.d0
    2356              :    RR(2,1)  =  1.d0/2.d0
    2357              :    RR(2,2)  =  SQRT(3.d0)/2.d0
    2358              :  else if (realrot==2) then
    2359              :    ! Real rotation
    2360              :    !=========================
    2361            0 :    RR(1,1)  =  SQRT(1.d0/2.d0)
    2362            0 :    RR(1,2)  = -SQRT(1.d0/2.d0)
    2363            0 :    RR(2,1)  =  SQRT(1.d0/2.d0)
    2364            0 :    RR(2,2)  =  SQRT(1.d0/2.d0)
    2365              :  else
    2366              :    ! Complex rotation
    2367              :    !=========================
    2368              :    RR(1,1)  =  CMPLX(one,two)
    2369              :    RR(1,2)  =  CMPLX(one,one)
    2370              :    RR(2,1)  =  CMPLX(one,-one)
    2371              :    RR(2,2)  =  CMPLX(-one,two)
    2372              :    RR=RR/sqrt(seven)
    2373              :  end if
    2374              :  ! Check rotation is unitary
    2375              :  !==========================
    2376            0 :  RRi(1,1) =  conjg(RR(1,1))
    2377            0 :  RRi(1,2) =  conjg(RR(2,1))
    2378            0 :  RRi(2,1) =  conjg(RR(1,2))
    2379            0 :  RRi(2,2) =  conjg(RR(2,2))
    2380            0 :  RR1(:,:)  = MATMUL ( RR(:,:) , RRi(:,:)          )
    2381              :  !write(6,*) "RR1",RR1
    2382            0 :  if(abs(RR1(1,1)-one).gt.tol7.or.abs(RR1(1,2)).gt.tol7.or.abs(RR1(2,2)-one).gt.tol7.or.abs(RR1(2,1)).gt.tol7) then
    2383            0 :    write(message,'(2a)') ch10,' testcode error in rotation matrix'
    2384            0 :    ABI_ERROR(message)
    2385              :  end if
    2386              : 
    2387              : 
    2388              :  !=================================
    2389              :  ! Built hybridization  for CTQMC
    2390              :  !=================================
    2391            0 :  if (opt==1) then
    2392              : 
    2393              :  !  Parameters: tight-binding + U
    2394              :  !  firt test of the code try umod=0, and (tbi1,tbi2,e1,e2)=(2,1,0.5,0.0) testrot=1
    2395              :  !  second test of the code try umod=four, and (tbi1,tbi2,e1,e2)=(2,1,0.0,0.0) testrot=1
    2396              :  !=======================================================================================
    2397            0 :    fw1_nd(:,:,:)= czero
    2398            0 :    tbi1=2.0_dp
    2399            0 :    tbi2=1.0_dp
    2400            0 :    tbi3=1.0_dp
    2401            0 :    tbi4=1.0_dp
    2402            0 :    tbi12=2.5_dp
    2403            0 :    tbi12b=2.5_dp
    2404            0 :    tbi21=2.5_dp
    2405            0 :    tbi21b=2.5_dp
    2406            0 :    e1=cmplx(0.0,0.0,8)
    2407            0 :    e2=zero
    2408            0 :    e3=0.2
    2409            0 :    e4=0.3
    2410            0 :    e3b=0.3
    2411            0 :    e4b=-0.2
    2412            0 :    umod(:,:)=0.d0
    2413              : 
    2414              :    if(testrot==1.and.(abs(tbi1-tbi2)<tol6)) then
    2415              :      write(message,'(3a)') ch10,' testrot=1 with tbi1=tbi2 is equivalent' &
    2416              :      ,'to testrot=0: change testrot'
    2417              :      ABI_WARNING(message)
    2418              :    end if
    2419              :    ! Built fw1_nd
    2420              :    !==============
    2421            0 :    do ifreq=1,dmftqmc_l
    2422              : 
    2423            0 :      omega=pi*temp*(two*float(ifreq)-1)
    2424              : 
    2425              :      if(simplehyb==1) then
    2426              :        fw1_nd(ifreq,1,1) =  -umod(1,1)/two+tbi1**2/(dcmplx(0.d0,omega)-e1)
    2427              :        fw1_nd(ifreq,2,2) =  -umod(1,1)/two+tbi2**2/(dcmplx(0.d0,omega)-e2)
    2428              :        fw1(ifreq,1)      =  -umod(1,1)/two+tbi1**2/(dcmplx(0.d0,omega)-e1)
    2429              :        fw1(ifreq,2)      =  -umod(1,1)/two+tbi2**2/(dcmplx(0.d0,omega)-e2)
    2430              :        hybri_limit(1,1)=tbi1**2
    2431              :        hybri_limit(2,2)=tbi2**2
    2432              :        hybri_limit(1,2)=0.d0
    2433              :        hybri_limit(2,1)=0.d0
    2434              :      else if(simplehyb==2) then
    2435              :        fw1_nd(ifreq,1,1) =  -umod(1,1)/two+tbi1**2/(dcmplx(0.d0,omega)-e1)+tbi3**2/(dcmplx(0.d0,omega)-e3)
    2436              :        fw1_nd(ifreq,2,2) =  -umod(1,1)/two+tbi2**2/(dcmplx(0.d0,omega)-e2)+tbi4**2/(dcmplx(0.d0,omega)-e4)
    2437              :        fw1(ifreq,1)      =  -umod(1,1)/two+tbi1**2/(dcmplx(0.d0,omega)-e1)
    2438              :        fw1(ifreq,2)      =  -umod(1,1)/two+tbi2**2/(dcmplx(0.d0,omega)-e2)
    2439              :      else if(simplehyb==3) then
    2440            0 :        fw1_nd(ifreq,1,1) =  -umod(1,1)/two+tbi1**2/(dcmplx(0.d0,omega)-e1)
    2441            0 :        fw1_nd(ifreq,2,2) =  -umod(1,1)/two+tbi2**2/(dcmplx(0.d0,omega)-e2)
    2442            0 :        fw1_nd(ifreq,1,2) =  tbi12**2/(dcmplx(0.d0,omega)-e3)+tbi12b**2/(dcmplx(0.d0,omega)-e3b)
    2443            0 :        fw1_nd(ifreq,2,1) =  tbi21**2/(dcmplx(0.d0,omega)-e4)+tbi21b**2/(dcmplx(0.d0,omega)-e4b)
    2444            0 :        fw1(ifreq,1)      =  -umod(1,1)/two+tbi1**2/(dcmplx(0.d0,omega)-e1)
    2445            0 :        fw1(ifreq,2)      =  -umod(1,1)/two+tbi2**2/(dcmplx(0.d0,omega)-e2)
    2446            0 :        hybri_limit(1,1)=tbi1**2
    2447            0 :        hybri_limit(2,2)=tbi2**2
    2448            0 :        hybri_limit(1,2)=tbi12**2+tbi12b**2
    2449            0 :        hybri_limit(2,1)=tbi21**2+tbi21b**2
    2450              :      end if
    2451            0 :      write(132,*) omega,real(fw1_nd(ifreq,1,1)),aimag(fw1_nd(ifreq,1,1))
    2452            0 :      write(133,*) omega,real(fw1_nd(ifreq,1,2)),aimag(fw1_nd(ifreq,1,2))
    2453            0 :      write(134,*) omega,real(fw1_nd(ifreq,2,1)),aimag(fw1_nd(ifreq,2,1))
    2454            0 :      write(135,*) omega,real(fw1_nd(ifreq,2,2)),aimag(fw1_nd(ifreq,2,2))
    2455            0 :      write(1234,*) omega, real(fw1(ifreq,1)),aimag(fw1(ifreq,1))
    2456              :    end do
    2457              :    ! Built level and limit of hybridization
    2458              :    !=======================================
    2459            0 :    levels_ctqmc(1:nflavor)=-umod(1,1)/two
    2460              : 
    2461            0 :    write(std_out,*) "fw1_nd"
    2462            0 :    write(std_out,*) fw1_nd(1,1,1), fw1_nd(1,1,2)
    2463            0 :    write(std_out,*) fw1_nd(1,2,1), fw1_nd(1,2,2)
    2464            0 :    write(std_out,*) "fw1"
    2465            0 :    write(std_out,*) fw1(1,1), fw1(1,2)
    2466            0 :    write(std_out,*) fw1(2,1), fw1(2,2)
    2467              : 
    2468              :  ! Rotate hybridization if testrot=1
    2469              :  !==================================
    2470            0 :    if(testrot==1) then
    2471              : 
    2472            0 :      do ifreq=1,dmftqmc_l
    2473            0 :        RRt(:,:)  = MATMUL ( RR(:,:)  , fw1_nd(ifreq,:,:) )
    2474              :    !write(6,*) "RRt"
    2475              :    !write(6,*) RRt(1,1), RRt(1,2)
    2476              :    !write(6,*) RRt(2,1), RRt(2,2)
    2477            0 :        RR1(:,:)  = MATMUL ( RRt(:,:) , RRi(:,:)          )
    2478              :    !write(6,*) "RR1"
    2479              :    !write(6,*) RR1(1,1), RR1(1,2)
    2480              :    !write(6,*) RR1(2,1), RR1(2,2)
    2481            0 :        fw1_nd(ifreq,:,:)=RR1(:,:)
    2482            0 :        omega=pi*temp*(two*float(ifreq)+1)
    2483            0 :        write(3322,*) omega,real(fw1_nd(ifreq,1,1)),aimag(fw1_nd(ifreq,1,1))
    2484            0 :        write(232,*) omega,real(fw1_nd(ifreq,1,1)),aimag(fw1_nd(ifreq,1,1))
    2485            0 :        write(233,*) omega,real(fw1_nd(ifreq,1,2)),aimag(fw1_nd(ifreq,1,2))
    2486            0 :        write(234,*) omega,real(fw1_nd(ifreq,2,1)),aimag(fw1_nd(ifreq,2,1))
    2487            0 :        write(235,*) omega,real(fw1_nd(ifreq,2,2)),aimag(fw1_nd(ifreq,2,2))
    2488              :      end do
    2489              : 
    2490              :      ! Rotate limit of hybridization
    2491              :      !=======================================
    2492            0 :      RRt(:,:)  = MATMUL ( RR(:,:)  , hybri_limit(:,:)  )
    2493            0 :      RR1(:,:)  = MATMUL ( RRt(:,:) , RRi(:,:)          )
    2494            0 :      hybri_limit(:,:)=RR1(:,:)
    2495              : 
    2496              :    end if
    2497              :    ! rajouter test real(fw1_nd(1,:,:)) doit etre diagonale
    2498              : 
    2499              :  !======================================
    2500              :  ! Rotate Green's function from CTQMC
    2501              :  !======================================
    2502            0 :  else if(opt==2) then
    2503              : 
    2504            0 :    write(std_out,*) "gw_tmp_nd"
    2505            0 :    write(std_out,*) gw_tmp_nd(1,1,1), gw_tmp_nd(1,1,2)
    2506            0 :    write(std_out,*) gw_tmp_nd(1,2,1), gw_tmp_nd(1,2,2)
    2507              :    ! Rotate Green's function back
    2508              :    !==============================
    2509            0 :    if(testrot==1) then
    2510            0 :      do ifreq=1,dmftqmc_l
    2511            0 :        RRt(1:nflavor,1:nflavor) = MATMUL ( RRi(1:nflavor,1:nflavor),gw_tmp_nd(ifreq,1:nflavor,1:nflavor) )
    2512            0 :        RR1(1:nflavor,1:nflavor) = MATMUL ( RRt(1:nflavor,1:nflavor),RR(1:nflavor,1:nflavor) )
    2513            0 :        gw_tmp_nd(ifreq,1:nflavor,1:nflavor)=RR1(1:nflavor,1:nflavor)
    2514              :      end do
    2515              : 
    2516            0 :      write(std_out,*) "gw_tmp_nd after rotation"
    2517            0 :      write(std_out,*) gw_tmp_nd(1,1,1), gw_tmp_nd(1,1,2)
    2518            0 :      write(std_out,*) gw_tmp_nd(1,2,1), gw_tmp_nd(1,2,2)
    2519              : 
    2520            0 :      do itau=1,dmftqmc_l
    2521            0 :        RRt(1:nflavor,1:nflavor) = MATMUL ( RRi(1:nflavor,1:nflavor),gtmp_nd(itau,1:nflavor,1:nflavor) )
    2522            0 :        RR1(1:nflavor,1:nflavor)  = MATMUL ( RRt(1:nflavor,1:nflavor),RR(1:nflavor,1:nflavor) )
    2523            0 :        gtmp_nd(itau,1:nflavor,1:nflavor)=real(RR1(1:nflavor,1:nflavor))
    2524              :      end do
    2525              : 
    2526              :    ! Rotate Green's function for comparison with testrot=1
    2527              :    !======================================================
    2528            0 :    else if (testrot==0) then ! produce rotated green's function to compare to testrot=1 case
    2529              : 
    2530            0 :      do itau=1,dmftqmc_l
    2531            0 :        RRt(1:nflavor,1:nflavor) = MATMUL ( RR(1:nflavor,1:nflavor),gtmp_nd(itau,1:nflavor,1:nflavor) )
    2532            0 :        RR1(1:nflavor,1:nflavor)  = MATMUL ( RRt(1:nflavor,1:nflavor),RRi(1:nflavor,1:nflavor) )
    2533            0 :        write(444,*) real(itau-1)/(temp*real(dmftqmc_l)),real(RR1(1,1)),real(RR1(2,2)),real(RR1(1,2)),real(RR1(2,1))
    2534              :      end do
    2535              : 
    2536              :    end if
    2537              : 
    2538              :    ! Print out rotated Green's function
    2539              :    !=====================================
    2540            0 :    do itau=1,dmftqmc_l
    2541            0 :      write(555,'(e14.5,4(2e14.5,3x))') real(itau-1)/(temp*real(dmftqmc_l)),gtmp_nd(itau,1,1),&
    2542            0 : &     gtmp_nd(itau,2,2),gtmp_nd(itau,1,2),gtmp_nd(itau,2,1)
    2543              :    end do
    2544              : 
    2545            0 :    write(message,'(2a)') ch10,' testcode end of test calculation'
    2546            0 :    ABI_ERROR(message)
    2547              : 
    2548              :  end if
    2549            0 :  close(444)
    2550            0 :  close(555)
    2551              : 
    2552              : end subroutine testcode_ctqmc
    2553              : !!***
    2554              : 
    2555              : !!****f* m_forctqmc/ctqmcoutput_to_green
    2556              : !! NAME
    2557              : !! ctqmcoutput_to_green
    2558              : !!
    2559              : !! FUNCTION
    2560              : !!  Put values of green function from ctqmc into green datatype
    2561              : !!  Symetrize over spin if calculation is non magnetic
    2562              : !!
    2563              : !! INPUTS
    2564              : !!  paw_dmft <type(paw_dmft_type)>= DMFT data structure
    2565              : !!  gtmp_nd(dmftqmc_l,nflavor,nflavor) = Green's fct in imag time (with off diag terms)
    2566              : !!  gtmp_ndc(dmftqmc_l,nflavor,nflavor) = Complex Green's fct in imag time (with off diag terms)
    2567              : !!  gw_tmp_nd(nb_of_frequency,nflavor,nflavor) = Green's fct in imag freq (with off diag terms)
    2568              : !!  gtmp(dmftqmc_l,nflavor) = Green's fct in imag time (diag)
    2569              : !!  gw_tmp(nb_of_frequency,nflavor+1) =Green's fct in imag freq (diag)
    2570              : !!  iatom = atoms on which the calculation has been done
    2571              : !!  leg_measure = logical, to Legendre Measurement or not (if done Green function is frequency is computed)
    2572              : !!  opt_nondiag = integer, it activated, then
    2573              : !!  opt_complex = integer, 1 activate complex Gtau
    2574              : !!
    2575              : !! OUTPUT
    2576              : !!  green <type(green_type)>= green's function
    2577              : !!
    2578              : !!
    2579              : !! SIDE EFFECTS
    2580              : !!
    2581              : !! NOTES
    2582              : !!
    2583              : !! SOURCE
    2584              : 
    2585           34 : subroutine ctqmcoutput_to_green(green,paw_dmft,gtmp_nd,gtmp_ndc,gw_tmp_nd,gtmp,gw_tmp,iatom,leg_measure,opt_nondiag,opt_complex)
    2586              : 
    2587              : !Arguments ------------------------------------
    2588              : !scalars
    2589              :  type(paw_dmft_type), intent(in)  :: paw_dmft
    2590              :  type(green_type), intent(inout) :: green
    2591              :  real(dp), allocatable, intent(in) :: gtmp_nd(:,:,:)
    2592              :  complex(dpc), allocatable, intent(in) :: gtmp_ndc(:,:,:)
    2593              :  complex(dpc), allocatable, intent(in) :: gw_tmp(:,:)
    2594              :  complex(dpc), allocatable, intent(in) :: gw_tmp_nd(:,:,:)
    2595              :  real(dp), allocatable, intent(in) :: gtmp(:,:)
    2596              :  integer, intent(in) :: iatom,opt_nondiag,opt_complex
    2597              :  logical(kind=1), intent(in) :: leg_measure
    2598              :  character(len=500) :: message
    2599              : 
    2600              : !Local variables ------------------------------
    2601              :  integer :: ifreq, itau,im1,im2,isppol,ispinor1,ispinor2,iflavor1
    2602              :  integer :: iflavor2,tndim,ispinor,iflavor,im,nflavor
    2603              : ! ************************************************************************
    2604           34 :  tndim=2*paw_dmft%lpawu(iatom)+1
    2605           34 :  nflavor=2*(tndim)
    2606              : 
    2607         7584 :  do itau=1,paw_dmft%dmftqmc_l
    2608       459584 :    green%oper_tau(itau)%matlu(iatom)%mat(:,:,:)=czero
    2609              :  end do
    2610          358 :  green%occup_tau%matlu(iatom)%mat(nflavor:,:,:)=czero
    2611              : 
    2612        17963 :  do ifreq=1,paw_dmft%dmft_nwlo
    2613      1102093 :    green%oper(ifreq)%matlu(iatom)%mat(:,:,:)=czero
    2614              :  end do
    2615         1820 :  green%occup%matlu(iatom)%mat(:,:,:)=czero
    2616              : 
    2617              : !   built time and frequency green's function from output of CTQMC
    2618              : ! =================================================================
    2619           34 :  if(opt_nondiag==1 .and. opt_complex==0) then
    2620            0 :    do isppol=1,paw_dmft%nsppol
    2621            0 :      do ispinor1=1,paw_dmft%nspinor
    2622            0 :        do im1=1,tndim
    2623            0 :          iflavor1=im1+tndim*(ispinor1-1)+tndim*(isppol-1)
    2624            0 :          do ispinor2=1,paw_dmft%nspinor
    2625            0 :            do im2=1,tndim
    2626            0 :              iflavor2=im2+tndim*(ispinor2-1)+tndim*(isppol-1)
    2627            0 :              do itau=1,paw_dmft%dmftqmc_l
    2628              :                green%oper_tau(itau)%matlu(iatom)%mat(im1+(ispinor1-1)*tndim,im2+(ispinor2-1)*tndim,isppol)=&
    2629            0 : &               gtmp_nd(itau,iflavor1,iflavor2)
    2630              :                ! symetrize over spin if nsppol=nspinor=1
    2631            0 :                if(paw_dmft%nsppol==1.and.paw_dmft%nspinor==1) then
    2632              :                  green%oper_tau(itau)%matlu(iatom)%mat(im1+(ispinor1-1)*tndim,im2+(ispinor2-1)*tndim,isppol)=&
    2633            0 : &                 (gtmp_nd(itau,iflavor1,iflavor2)+gtmp_nd(itau,iflavor1+tndim,iflavor2+tndim))/two
    2634              :                end if
    2635              :              end do  !itau
    2636            0 :              if(paw_dmft%dmft_solv<6.or.leg_measure) then
    2637            0 :                do ifreq=1,paw_dmft%dmft_nwlo
    2638              :                  green%oper(ifreq)%matlu(iatom)%mat(im1+(ispinor1-1)*tndim,im2+(ispinor2-1)*tndim,isppol)=&
    2639            0 : &                 gw_tmp_nd(ifreq,iflavor1,iflavor2)
    2640              :                ! symetrize over spin if nsppol=nspinor=1
    2641            0 :                  if(paw_dmft%nsppol==1.and.paw_dmft%nspinor==1) then
    2642              :                    green%oper(ifreq)%matlu(iatom)%mat(im1+(ispinor1-1)*tndim,im2+(ispinor2-1)*tndim,isppol)=&
    2643              : &                   (gw_tmp_nd(ifreq,iflavor1,iflavor2)+&
    2644            0 : &                   gw_tmp_nd(ifreq,iflavor1+tndim,iflavor2+tndim))/two
    2645              :                  end if
    2646              :                end do ! ifreq
    2647              :              end if
    2648              :            end do  ! im2
    2649              :          end do  ! ispinor2
    2650              :        end do  ! im1
    2651              :      end do  ! ispinor
    2652              :    end do ! isppol
    2653              : != Complex case
    2654           34 :  elseif(opt_nondiag==1 .and. opt_complex==1) then
    2655            0 :    do isppol=1,paw_dmft%nsppol
    2656            0 :      do ispinor1=1,paw_dmft%nspinor
    2657            0 :        do im1=1,tndim
    2658            0 :          iflavor1=im1+tndim*(ispinor1-1)+tndim*(isppol-1)
    2659            0 :          do ispinor2=1,paw_dmft%nspinor
    2660            0 :            do im2=1,tndim
    2661            0 :              iflavor2=im2+tndim*(ispinor2-1)+tndim*(isppol-1)
    2662            0 :              do itau=1,paw_dmft%dmftqmc_l
    2663              :                green%oper_tau(itau)%matlu(iatom)%mat(im1+(ispinor1-1)*tndim,im2+(ispinor2-1)*tndim,isppol)=&
    2664            0 : &               gtmp_ndc(itau,iflavor1,iflavor2)
    2665              :                ! symetrize over spin if nsppol=nspinor=1
    2666            0 :                if(paw_dmft%nsppol==1.and.paw_dmft%nspinor==1) then
    2667              :                  green%oper_tau(itau)%matlu(iatom)%mat(im1+(ispinor1-1)*tndim,im2+(ispinor2-1)*tndim,isppol)=&
    2668            0 : &                 (gtmp_ndc(itau,iflavor1,iflavor2)+gtmp_ndc(itau,iflavor1+tndim,iflavor2+tndim))/two
    2669              :                end if
    2670              :              end do  !itau
    2671            0 :              do ifreq=1,paw_dmft%dmft_nwlo
    2672              :                green%oper(ifreq)%matlu(iatom)%mat(im1+(ispinor1-1)*tndim,im2+(ispinor2-1)*tndim,isppol)=&
    2673            0 : &               gw_tmp_nd(ifreq,iflavor1,iflavor2)
    2674              :              ! symetrize over spin if nsppol=nspinor=1
    2675            0 :                if(paw_dmft%nsppol==1.and.paw_dmft%nspinor==1) then
    2676              :                  green%oper(ifreq)%matlu(iatom)%mat(im1+(ispinor1-1)*tndim,im2+(ispinor2-1)*tndim,isppol)=&
    2677              : &                 (gw_tmp_nd(ifreq,iflavor1,iflavor2)+&
    2678            0 : &                 gw_tmp_nd(ifreq,iflavor1+tndim,iflavor2+tndim))/two
    2679              :                end if
    2680              :              end do ! ifreq
    2681              :            end do  ! im2
    2682              :          end do  ! ispinor2
    2683              :        end do  ! im1
    2684              :      end do  ! ispinor
    2685              :    end do ! isppol
    2686              :  else
    2687           34 :    iflavor=0
    2688           88 :    do isppol=1,paw_dmft%nsppol
    2689          142 :      do ispinor=1,paw_dmft%nspinor
    2690          378 :        do im=1,tndim
    2691          270 :          iflavor=iflavor+1
    2692        72270 :          do itau=1,paw_dmft%dmftqmc_l
    2693        72000 :            green%oper_tau(itau)%matlu(iatom)%mat(im+(ispinor-1)*tndim,im+(ispinor-1)*tndim,isppol)=gtmp(itau,iflavor)
    2694              :            ! symetrize over spin if nsppol=paw_dmft%nspinor=1
    2695        72270 :            if(paw_dmft%nsppol==1.and.paw_dmft%nspinor==1) then
    2696              :              green%oper_tau(itau)%matlu(iatom)%mat(im+(ispinor-1)*tndim,im+(ispinor-1)*tndim,isppol)=&
    2697         4900 : &             (gtmp(itau,iflavor)+gtmp(itau,iflavor+tndim))/two
    2698              :            end if
    2699              :          end do
    2700              : !       ifreq2=0
    2701       173482 :          do ifreq=1,paw_dmft%dmft_nwlo
    2702              : !         if(paw_dmft%select_log(ifreq)==1) then
    2703              : !           ifreq2=ifreq2+1
    2704       173158 :            green%oper(ifreq)%matlu(iatom)%mat(im+(ispinor-1)*tndim,im+(ispinor-1)*tndim,isppol)=gw_tmp(ifreq,iflavor)
    2705              :            ! symetrize over spin if nsppol=paw_dmft%nspinor=1
    2706       173428 :            if(paw_dmft%nsppol==1.and.paw_dmft%nspinor==1) then
    2707              :              green%oper(ifreq)%matlu(iatom)%mat(im+(ispinor-1)*tndim,im+(ispinor-1)*tndim,isppol)=&
    2708         8820 : &             (gw_tmp(ifreq,iflavor)+gw_tmp(ifreq,iflavor+tndim))/two
    2709              :            end if
    2710              :          end do
    2711              :        end do
    2712              :      end do
    2713              :    end do
    2714              :  end if
    2715           34 :  if(paw_dmft%nsppol==1.and.paw_dmft%nspinor==1) then
    2716           14 :    write(message,'(a,2x,a,f13.5)') ch10,&
    2717           28 : &   " == nsppol==1 and nspden==1: Green functions from CTQMC have been symetrized over spin"
    2718           14 :    call wrtout(std_out,message,'COLL')
    2719              :  end if
    2720              : 
    2721           34 : end subroutine ctqmcoutput_to_green
    2722              : !!***
    2723              : 
    2724              : !!****f* m_forctqmc/ctqmcoutput_printgreen
    2725              : !! NAME
    2726              : !! ctqmcoutput_printgreen
    2727              : !!
    2728              : !! FUNCTION
    2729              : !!  Print values of green function in files.
    2730              : !!  Symetrize imaginary time Green's function in a peculiar case
    2731              : !!  (dmft_solv=8 and natom=1). Should be moved later.
    2732              : !!
    2733              : !! INPUTS
    2734              : !!  paw_dmft <type(paw_dmft_type)>= DMFT data structure
    2735              : !!  gtmp_nd(dmftqmc_l,nflavor,nflavor) = Green's fct in imag time (with off diag terms)
    2736              : !!  gtmp_ndc(dmftqmc_l,nflavor,nflavor) = Complex Green's fct in imag time (with off diag terms)
    2737              : !!  gw_tmp_nd(nb_of_frequency,nflavor,nflavor) = Green's fct in imag freq (with off diag terms)
    2738              : !!  gtmp(dmftqmc_l,nflavor) = Green's fct in imag time (diag)
    2739              : !!  gw_tmp(nb_of_frequency,nflavor+1) =Green's fct in imag freq (diag)
    2740              : !!  iatom = atoms on which the calculation has been done
    2741              : !!
    2742              : !! OUTPUT
    2743              : !!
    2744              : !!
    2745              : !! SIDE EFFECTS
    2746              : !!
    2747              : !! NOTES
    2748              : !!
    2749              : !! SOURCE
    2750              : 
    2751           34 : subroutine ctqmcoutput_printgreen(paw_dmft,gtmp_nd,gtmp_ndc,gw_tmp_nd,gtmp,gw_tmp,iatom)
    2752              : 
    2753              : !Arguments ------------------------------------
    2754              : !scalars
    2755              :  type(paw_dmft_type), intent(in)  :: paw_dmft
    2756              :  real(dp), allocatable, intent(inout) :: gtmp_nd(:,:,:)
    2757              :  complex(dpc), allocatable, intent(in) :: gtmp_ndc(:,:,:)
    2758              :  complex(dpc), allocatable, intent(in) :: gw_tmp(:,:)
    2759              :  complex(dpc), allocatable, intent(in) :: gw_tmp_nd(:,:,:)
    2760              :  real(dp), allocatable, intent(in) :: gtmp(:,:)
    2761              :  integer, intent(in) :: iatom
    2762              : 
    2763              : !Local variables ------------------------------
    2764              :  character(len=500) :: message
    2765              :  integer :: ifreq, itau,iflavor1
    2766              :  integer :: tndim,iflavor,nflavor
    2767              :  character(len=2) :: gtau_iter,iatomnb
    2768              :  integer :: unt
    2769              : ! ************************************************************************
    2770           34 :  tndim=2*paw_dmft%lpawu(iatom)+1
    2771           34 :  nflavor=2*(tndim)
    2772              :  !----------------------------------------
    2773              :  ! <DEBUG>
    2774              :  !----------------------------------------
    2775              :  ! Construct UNIT
    2776           34 :  if(paw_dmft%idmftloop < 10) then
    2777           34 :    write(gtau_iter,'("0",i1)') paw_dmft%idmftloop
    2778            0 :  elseif(paw_dmft%idmftloop >= 10 .and. paw_dmft%idmftloop < 100) then
    2779            0 :    write(gtau_iter,'(i2)') paw_dmft%idmftloop
    2780              :  else
    2781            0 :    gtau_iter="xx"
    2782              :  end if
    2783           34 :  if(iatom < 10) then
    2784           34 :    write(iatomnb,'("0",i1)') iatom
    2785            0 :  elseif(iatom >= 10 .and. iatom < 100) then
    2786            0 :    write(iatomnb,'(i2)') iatom
    2787              :  else
    2788            0 :    iatomnb='xx'
    2789              :  end if
    2790              : 
    2791           34 :  if(paw_dmft%myproc .eq. mod(paw_dmft%nproc+1,paw_dmft%nproc)) then
    2792              : ! < HACK >
    2793           19 :   if(paw_dmft%dmft_solv==6.or.paw_dmft%dmft_solv==7) then
    2794            0 :     if (open_file(trim(paw_dmft%filapp)//"_atom_"//iatomnb//"_Gw_"//gtau_iter//".dat", message, newunit=unt) /=0) then
    2795            0 :       ABI_ERROR(message)
    2796              :     end if
    2797            0 :     do ifreq=1,paw_dmft%dmft_nwli
    2798            0 :       write(unt,'(29f21.14)') paw_dmft%omega_lo(ifreq),((gw_tmp_nd(ifreq,iflavor,iflavor)), iflavor=1, nflavor)
    2799              :     end do
    2800            0 :     close(unt)
    2801              :   else
    2802           19 :     if(paw_dmft%dmft_solv==5) then
    2803           19 :       if (open_file(trim(paw_dmft%filapp)//"_atom_"//iatomnb//"_Gtau_"//gtau_iter//".dat", message, newunit=unt) /= 0) then
    2804            0 :         ABI_ERROR(message)
    2805              :       end if
    2806         2769 :       do itau=1,paw_dmft%dmftqmc_l
    2807         2750 :         write(unt,'(29f21.14)') float(itau-1)/float(paw_dmft%dmftqmc_l)/paw_dmft%temp,&
    2808         5519 :         (gtmp(itau,iflavor), iflavor=1, nflavor)
    2809              :       end do
    2810          213 :       write(unt,'(29f21.14)') 1/paw_dmft%temp, (-1_dp-gtmp(1,iflavor), iflavor=1, nflavor)
    2811           19 :       close(unt)
    2812              :     endif
    2813              : !    if(paw_dmft%dmft_solv==8 ) then
    2814              : !      if (open_file(trim(paw_dmft%filapp)//"_atom_"//iatomnb//"_Gtau_offdiag_unsym_"//gtau_iter//".dat",&
    2815              : !&      message, newunit=unt) /= 0) then
    2816              : !        ABI_ERROR(message)
    2817              : !      end if
    2818              : !      do itau=1,paw_dmft%dmftqmc_l
    2819              : !        write(unt,'(196f21.14)') float(itau-1)/float(paw_dmft%dmftqmc_l)/paw_dmft%temp,&
    2820              : !        ((gtmp_nd(itau,iflavor,iflavor1), iflavor=1, nflavor),iflavor1=1, nflavor)
    2821              : !      end do
    2822              : !      close(unt)
    2823              : !    endif
    2824           19 :     if(paw_dmft%dmft_solv .eq. 8) then
    2825            0 :       if (open_file(trim(paw_dmft%filapp)//"_atom_"//iatomnb//"_Gtau_diag_CTQMC_"//gtau_iter//".dat",&
    2826              : &      message, newunit=unt) /= 0) then
    2827            0 :        ABI_ERROR(message)
    2828              :       end if
    2829            0 :       do itau=1,paw_dmft%dmftqmc_l
    2830            0 :         write(unt,'(196f21.14)') float(itau-1)/float(paw_dmft%dmftqmc_l)/paw_dmft%temp,&
    2831            0 : &       (gtmp_nd(itau,iflavor,iflavor), iflavor=1,nflavor)
    2832              :       end do
    2833            0 :       close(unt)
    2834            0 :       if (open_file(trim(paw_dmft%filapp)//"_atom_"//iatomnb//"_Gtau_full_CTQMC_"//gtau_iter//".dat",&
    2835              : &      message, newunit=unt) /= 0) then
    2836            0 :         ABI_ERROR(message)
    2837              :       end if
    2838            0 :       do itau=1, paw_dmft%dmftqmc_l
    2839            0 :         write(unt,'(392f21.14)') float(itau-1)/float(paw_dmft%dmftqmc_l)/paw_dmft%temp,&
    2840            0 : &       ((gtmp_nd(itau,iflavor,iflavor1),iflavor=1,nflavor), iflavor1=1, nflavor)
    2841              :       end do
    2842            0 :       close(unt)
    2843              :     endif
    2844              :     !complex solver
    2845           19 :     if(paw_dmft%dmft_solv .eq. 10) then
    2846            0 :       if (open_file(trim(paw_dmft%filapp)//"_atom_"//iatomnb//"_Gtau_diag_CTQMC_"//gtau_iter//".dat",&
    2847              : &      message, newunit=unt) /= 0) then
    2848            0 :        ABI_ERROR(message)
    2849              :       end if
    2850            0 :       do itau=1,paw_dmft%dmftqmc_l
    2851            0 :         write(unt,'(196f21.14)') float(itau-1)/float(paw_dmft%dmftqmc_l)/paw_dmft%temp,&
    2852            0 : &       (gtmp_ndc(itau,iflavor,iflavor), iflavor=1,nflavor)
    2853              :       end do
    2854            0 :       close(unt)
    2855            0 :       if (open_file(trim(paw_dmft%filapp)//"_atom_"//iatomnb//"_Gtau_full_CTQMC_"//gtau_iter//".dat",&
    2856              : &      message, newunit=unt) /= 0) then
    2857            0 :         ABI_ERROR(message)
    2858              :       end if
    2859            0 :       do itau=1, paw_dmft%dmftqmc_l
    2860            0 :         write(unt,'(2x,393(e18.10e3,2x))') float(itau-1)/float(paw_dmft%dmftqmc_l)/paw_dmft%temp,&
    2861            0 : &       ((dble(gtmp_ndc(itau,iflavor,iflavor1)),aimag(gtmp_ndc(itau,iflavor,iflavor1)),iflavor=1,nflavor), iflavor1=1, nflavor)
    2862              :       end do
    2863            0 :       close(unt)
    2864              :     endif
    2865              : !      if(paw_dmft%natom==1) then ! If natom>1, it should be moved outside the loop over atoms
    2866              : !        ABI_MALLOC(matlu1,(paw_dmft%natom))
    2867              : !        call init_matlu(paw_dmft%natom,paw_dmft%nspinor,paw_dmft%nsppol,paw_dmft%lpawu,matlu1)
    2868              : !        do itau=1,paw_dmft%dmftqmc_l
    2869              : !          do isppol=1,paw_dmft%nsppol
    2870              : !            do ispinor1=1,paw_dmft%nspinor
    2871              : !              do im1=1,tndim
    2872              : !                iflavor1=im1+tndim*(ispinor1-1)+tndim*(isppol-1)
    2873              : !                do ispinor2=1,paw_dmft%nspinor
    2874              : !                  do im2=1,tndim
    2875              : !                    iflavor2=im2+tndim*(ispinor2-1)+tndim*(isppol-1)
    2876              : !                    matlu1(iatom)%mat(im1,im2,isppol,ispinor1,ispinor2)=&
    2877              : !&                     gtmp_nd(itau,iflavor1,iflavor2)
    2878              : !                  end do  ! im2
    2879              : !                end do  ! ispinor2
    2880              : !              end do  ! im1
    2881              : !            end do  ! ispinor
    2882              : !          end do ! isppol
    2883              : !          call rotate_matlu(matlu1,eigvectmatlu,paw_dmft%natom,3,0)
    2884              : !          call slm2ylm_matlu(matlu1,paw_dmft%natom,2,0)
    2885              : !          call sym_matlu(cryst_struc,matlu1,pawang,paw_dmft)
    2886              : !          call slm2ylm_matlu(matlu1,paw_dmft%natom,1,0)
    2887              : !          call rotate_matlu(matlu1,eigvectmatlu,paw_dmft%natom,3,1)
    2888              : !          do isppol=1,paw_dmft%nsppol
    2889              : !            do ispinor1=1,paw_dmft%nspinor
    2890              : !              do im1=1,tndim
    2891              : !                iflavor1=im1+tndim*(ispinor1-1)+tndim*(isppol-1)
    2892              : !                do ispinor2=1,paw_dmft%nspinor
    2893              : !                  do im2=1,tndim
    2894              : !                    iflavor2=im2+tndim*(ispinor2-1)+tndim*(isppol-1)
    2895              : !                    gtmp_nd(itau,iflavor1,iflavor2)=&
    2896              : !                     matlu1(iatom)%mat(im1,im2,isppol,ispinor1,ispinor2)
    2897              : !                  end do  ! im2
    2898              : !                end do  ! ispinor2
    2899              : !              end do  ! im1
    2900              : !            end do  ! ispinor
    2901              : !          end do ! isppol
    2902              : !        end do  !itau
    2903              : !        call destroy_matlu(matlu1,paw_dmft%natom)
    2904              : !        ABI_FREE(matlu1)
    2905              : !      endif ! if natom=1
    2906              : !      if (open_file(trim(paw_dmft%filapp)//"_atom_"//iatomnb//"_Gtau_offdiag_"//gtau_iter//".dat",&
    2907              : !&      message, newunit=unt) /= 0) then
    2908              : !        ABI_ERROR(message)
    2909              : !      end if
    2910              : !      do itau=1,paw_dmft%dmftqmc_l
    2911              : !        write(unt,'(196f21.14)') float(itau-1)/float(paw_dmft%dmftqmc_l)/paw_dmft%temp,&
    2912              : !        ((gtmp_nd(itau,iflavor,iflavor1), iflavor=1, nflavor),iflavor1=1, nflavor)
    2913              : !      end do
    2914              : !      close(unt)
    2915              : !    endif
    2916              :     !open(unit=4243, file=trim(paw_dmft%filapp)//"_atom_"//iatomnb//"_F_"//gtau_iter//".dat")
    2917              :     !call BathOperator_printF(paw_dmft%hybrid(iatom)%hybrid%bath,4243) !Already comment here
    2918              :     !close(4243)
    2919           19 :     if(paw_dmft%dmft_solv==5) then
    2920           19 :       if (open_file(trim(paw_dmft%filapp)//"_atom_"//iatomnb//"_Gw_"//gtau_iter//".dat", message, newunit=unt) /= 0) then
    2921            0 :         ABI_ERROR(message)
    2922              :       end if
    2923         6275 :       do ifreq=1,paw_dmft%dmft_nwlo
    2924         6256 :         write(unt,'(29f21.14)') paw_dmft%omega_lo(ifreq), &
    2925        12531 : &        (gw_tmp(ifreq,iflavor), iflavor=1, nflavor)
    2926              :       end do
    2927              :     endif
    2928           19 :     close(unt)
    2929              : 
    2930           19 :     if(paw_dmft%dmft_solv==8 .or. paw_dmft%dmft_solv==10) then
    2931            0 :       if (open_file(trim(paw_dmft%filapp)//"_atom_"//iatomnb//"_Gw_diag_"//gtau_iter//".dat", message, newunit=unt) /= 0) then
    2932            0 :         ABI_ERROR(message)
    2933              :       end if
    2934            0 :       do ifreq=1,paw_dmft%dmft_nwlo
    2935            0 :         write(unt,'(29f21.14)') paw_dmft%omega_lo(ifreq), &
    2936            0 :                 &        (gw_tmp_nd(ifreq,iflavor,iflavor), iflavor=1, nflavor)
    2937              :       end do
    2938              :     endif
    2939           19 :     close(unt)
    2940              : 
    2941           19 :     if(paw_dmft%dmft_solv==8 .or. paw_dmft%dmft_solv==10) then
    2942            0 :       if (open_file(trim(paw_dmft%filapp)//"_atom_"//iatomnb//"_Gw_Offdiag_"//gtau_iter//".dat", message, newunit=unt) /= 0) then
    2943            0 :         ABI_ERROR(message)
    2944              :       end if
    2945            0 :       do ifreq=1,paw_dmft%dmft_nwlo
    2946            0 :         write(unt,'(296f21.14)') paw_dmft%omega_lo(ifreq), &
    2947            0 :                 &        ((gw_tmp_nd(ifreq,iflavor,iflavor1), iflavor=iflavor1, nflavor),iflavor1=1, nflavor)
    2948              :       end do
    2949              :     endif
    2950           19 :     close(unt)
    2951              : 
    2952              :   end if
    2953              : ! </ HACK >
    2954              :   end if
    2955              : 
    2956              : 
    2957           34 : end subroutine ctqmcoutput_printgreen
    2958              : !!***
    2959              : 
    2960              : !!****f* m_forctqmc/ctqmc_calltriqs
    2961              : !! NAME
    2962              : !! ctqmc_calltriqs
    2963              : !!
    2964              : !! FUNCTION
    2965              : !!  Call TRIQS solver and perform calculation of Green's function using
    2966              : !!  Legendre coefficients.
    2967              : !!
    2968              : !! INPUTS
    2969              : !!  paw_dmft <type(paw_dmft_type)>= DMFT data structure
    2970              : !!  cryst_struc <type(crystal_t)>=crystal structure data
    2971              : !!  hu <type(hu_type)>= U interaction
    2972              : !!  levels_ctqmc(nflavor) = atomic levels
    2973              : !!  gw_tmp_nd(nb_of_frequency,nflavor,nflavor) = Green's fct in imag freq (with off diag terms)
    2974              : !!  gtmp_nd(dmftqmc_l,nflavor,nflavor) = Green's fct in imag time (with off diag terms)
    2975              : !!  fw1_nd(dmft_nwlo,nflavor,nflavor) = Hybridization fct in imag time (with off diag terms)
    2976              : !!  leg_measure = logical, true is legendre measurement is activated
    2977              : !!  iatom= index of atom
    2978              : !!
    2979              : !! OUTPUT
    2980              : !!
    2981              : !!
    2982              : !! SIDE EFFECTS
    2983              : !!
    2984              : !! NOTES
    2985              : !!
    2986              : !! SOURCE
    2987              : 
    2988            0 : subroutine ctqmc_calltriqs(paw_dmft,cryst_struc,hu,levels_ctqmc,gtmp_nd,gw_tmp_nd,fw1_nd,leg_measure,iatom)
    2989              : 
    2990              : #if defined HAVE_TRIQS_v3_2 || defined HAVE_TRIQS_v2_0 || defined HAVE_TRIQS_v1_4
    2991              :  use TRIQS_CTQMC !Triqs module
    2992              : #endif
    2993              : #if defined HAVE_PYTHON_INVOCATION
    2994              :  use m_invoke_python
    2995              : #endif
    2996              :  use, intrinsic :: iso_c_binding
    2997              : 
    2998              : !Arguments ------------------------------------
    2999              : !scalars
    3000              :  type(paw_dmft_type), intent(in)  :: paw_dmft
    3001              :  type(crystal_t),intent(in) :: cryst_struc
    3002              :  type(hu_type), intent(in) :: hu(cryst_struc%ntypat)
    3003              :  real(dp), allocatable, target, intent(inout) :: gtmp_nd(:,:,:)
    3004              :  complex(dp), allocatable, target, intent(inout) :: gw_tmp_nd(:,:,:)
    3005              :  complex(dp), allocatable, target, intent(in) :: fw1_nd(:,:,:)
    3006              :  real(dp), allocatable, target, intent(inout) ::  levels_ctqmc(:)
    3007              :  logical(kind=1), intent(in) :: leg_measure
    3008              :  integer, intent(in) :: iatom
    3009              : 
    3010              : !Local variables ------------------------------
    3011            0 :  complex(dp), allocatable, target ::fw1_nd_tmp(:,:,:)
    3012            0 :  complex(dp), allocatable, target :: g_iw(:,:,:)
    3013            0 :  real(dp), allocatable, target :: u_mat_ij(:,:)
    3014            0 :  real(dp), allocatable, target :: u_mat_ijkl(:,:,:,:)
    3015            0 :  real(dp), allocatable, target :: u_mat_ijkl_tmp(:,:,:,:)
    3016            0 :  real(dp), allocatable, target :: gl_nd(:,:,:)
    3017              :  type(c_ptr) :: levels_ptr, fw1_nd_ptr, u_mat_ij_ptr, u_mat_ijkl_ptr, g_iw_ptr, gtau_ptr, gl_ptr
    3018            0 :  real(dp), allocatable :: jbes(:)
    3019              :  character(len=500) :: message
    3020              :  integer :: ifreq, iflavor1
    3021              :  integer :: iflavor2,iflavor,nflavor,iflavor3,itypat
    3022              :  integer :: nfreq,ntau,nleg,ileg
    3023              :  integer :: verbosity_solver ! min 0 -> max 3
    3024              :  logical(kind=1) :: rot_inv = .false.
    3025              : #if defined HAVE_TRIQS_v2_0 || defined HAVE_TRIQS_v1_4 || defined HAVE_PYTHON_INVOCATION
    3026              :  logical(kind=1) :: hist = .false.
    3027              :  logical(kind=1) :: wrt_files = .true.
    3028              :  logical(kind=1) :: tot_not = .true.
    3029              : #endif
    3030              :  real(dp) :: beta,besp,bespp,xx
    3031              :  complex(dp) :: u_nl
    3032              : 
    3033              : #if defined HAVE_PYTHON_INVOCATION
    3034              : !----------
    3035              : !Variables for writing out the NETCDF file when calling PYTHON_INVOCATION
    3036              : !----------
    3037              :  integer(kind=4) :: ncid
    3038              :  integer(kind=4) :: dim_one_id, dim_nflavor_id, dim_nwlo_id, dim_nwli_id
    3039              :  integer(kind=4) :: dim_qmc_l_id, dim_nleg_id
    3040              :  integer(kind=4), dimension(2) :: dim_u_mat_ij_id
    3041              :  integer(kind=4), dimension(3) :: dim_fw1_id, dim_g_iw_id, dim_gl_id, dim_gtau_id
    3042              :  integer(kind=4), dimension(4) :: dim_u_mat_ijkl_id
    3043              :  integer(kind=4) :: var_rot_inv_id, var_leg_measure_id, var_hist_id, var_wrt_files_id
    3044              :  integer(kind=4) :: var_tot_not_id, var_n_orbitals_id, var_n_freq_id, var_n_tau_id, var_n_l_id, var_n_cycles_id
    3045              :  integer(kind=4) :: var_cycle_length_id, var_ntherm_id, var_verbo_id, var_seed_id, var_beta_id
    3046              :  integer(kind=4) :: var_levels_id, var_u_mat_ij_id, var_u_mat_ijkl_id, var_real_fw1_nd_id, var_imag_fw1_nd_id
    3047              :  integer(kind=4) :: var_real_g_iw_id, var_imag_g_iw_id, var_gtau_id, var_gl_id, var_spacecomm_id
    3048              : 
    3049              :  integer :: itau
    3050              : 
    3051              :  integer(kind=4) :: varid
    3052              :  logical :: file_exists
    3053              :  complex :: i
    3054              :  character(len=100) :: filename
    3055              : 
    3056              :  real(dp), allocatable, target :: new_re_g_iw(:,:,:), new_im_g_iw(:,:,:)
    3057              :  real(dp), allocatable, target :: new_g_tau(:,:,:), new_gl(:,:,:)
    3058              : !----------
    3059              : #endif
    3060              : ! ************************************************************************
    3061              : 
    3062              :  ! fw1_nd: Hybridation
    3063              :  ! levels_ctqmc: niveaux
    3064              :  ! hu(itypat)%udens(:,:) : U_ij
    3065              :  ! hu(itypat)%u(:,:,:,:) : uijkl
    3066              :  ! temperature : paw_dmft%temp
    3067              :  ! paw_dmft%dmftqmc_l: nombre de points en temps -1
    3068              :  ! paw_dmft%dmftqmc_n: nombre de cycles
    3069              :  ! ?? Quelles sorties: Les fonctions de Green
    3070              :  ! frequence/temps/Legendre.
    3071              :  ! Double occupations ?? <n_i n_j>
    3072              :  ! test n_tau > 2*nfreq => ntau = 2*nfreq + 1
    3073              :  !   for non diagonal code:
    3074              :  !   call CtqmcInterface_run(hybrid,fw1_nd(1:paw_dmft%dmftqmc_l,:,:),Gtau=gtmp_nd,&
    3075              :  !&  Gw=gw_tmp_nd,D=Doccsum,E=green%ecorr_qmc(iatom),&
    3076              :  !&  Noise=Noise,matU=hu(itypat)%udens,opt_levels=levels_ctqmc,hybri_limit=hybri_limit)
    3077              :  !Check choice of user to fix model bool var for the solver
    3078            0 :  if (paw_dmft%dmft_solv==6) then
    3079            0 :    rot_inv = .false.
    3080              :  else !obviously paw_dmft%dmft_solv==7 with rot invariant terms
    3081            0 :    rot_inv = .true.
    3082              :  end if
    3083              : 
    3084            0 :  nfreq = paw_dmft%dmft_nwli
    3085              :  !paw_dmft%dmft_nwlo = paw_dmft%dmft_nwli !transparent for user
    3086            0 :  ntau  = paw_dmft%dmftqmc_l !(2*paw_dmft%dmftqmc_l)+1 !nfreq=paw_dmft%dmft_nwli
    3087            0 :  nleg  = paw_dmft%dmft_triqs_nleg
    3088            0 :  nflavor=2*(2*paw_dmft%lpawu(iatom)+1)
    3089            0 :  itypat=cryst_struc%typat(iatom)
    3090              : 
    3091              : 
    3092            0 :  verbosity_solver = paw_dmft%prtvol
    3093            0 :  beta = 1.0/(paw_dmft%temp*Ha_eV)
    3094              : 
    3095              :  !Allocation in/output array phase:
    3096            0 :  ABI_MALLOC(fw1_nd_tmp,(1:nflavor,1:nflavor,1:nfreq)) !column major
    3097            0 :  ABI_MALLOC(g_iw,(1:nflavor,1:nflavor,1:nfreq)) !column major
    3098            0 :  ABI_MALLOC(u_mat_ij,(1:nflavor,1:nflavor)) !column major
    3099            0 :  ABI_MALLOC(u_mat_ijkl,(1:nflavor,1:nflavor,1:nflavor,1:nflavor)) !column major
    3100            0 :  ABI_MALLOC(u_mat_ijkl_tmp,(1:nflavor,1:nflavor,1:nflavor,1:nflavor)) !column major
    3101              : 
    3102            0 :  if ( leg_measure ) then !only if functionality is enabled
    3103            0 :    ABI_MALLOC(gl_nd,(1:nleg,1:nflavor,1:nflavor)) !column major !nl = 30 by default
    3104              :  end if
    3105              : 
    3106              :  !Conversion datas Ha -> eV (some duplications for test...)
    3107              :  !fw1_nd_tmp = fw1_nd(1:paw_dmft%dmftqmc_l,:,:) * Ha_eV !fw1_nd = fw1_nd * Ha_eV !Ok?
    3108              : 
    3109            0 :  do iflavor=1,nflavor
    3110            0 :    do iflavor1=1,nflavor
    3111            0 :      do ifreq=1,nfreq
    3112            0 :        fw1_nd_tmp(iflavor,iflavor1,ifreq) = fw1_nd(ifreq,iflavor,iflavor1) * Ha_eV
    3113              : !        WRITE(500,*) "[IN Fortran] F[ w= ",ifreq," l= ",iflavor," l_= ",iflavor1,"] = ",fw1_nd(ifreq,iflavor,iflavor1)
    3114              :      end do
    3115              :    end do
    3116              :  end do
    3117              : 
    3118              :     !Report test
    3119              : !    WRITE(502,*) hu(itypat)%udens
    3120              : !    do ifreq=1,paw_dmft%dmftqmc_l
    3121              : !      write(501,*) ((fw1_nd(ifreq,iflavor,iflavor1),iflavor=1,nflavor),iflavor1=1,nflavor)
    3122              : !    enddo
    3123              :     !write(866,*)paw_dmft%dmft_nwlo,paw_dmft%dmftqmc_l
    3124              :     !write(866,*) u_mat_ij
    3125              : !   do iflavor=1,nflavor+1
    3126              : !     do iflavor1=1,nflavor+1
    3127              : !       WRITE(502,*) "[OUT Fortran] U(i,j)[ l= ",iflavor," l_= ",iflavor1,"] = ",hu(itypat)%udens(iflavor,iflavor1)
    3128              : !     enddo
    3129              : !   enddo
    3130              : 
    3131              : !          if(paw_dmft%myproc==0) then
    3132              : !          do iflavor=1,nflavor
    3133              : !            do iflavor1=1,nflavor
    3134              : !               do iflavor2=1,nflavor
    3135              : !                  do iflavor3=1,nflavor
    3136              : !                    write(490,*), hu(itypat)%vee(iflavor,iflavor1,iflavor2,iflavor3)
    3137              : !                  enddo
    3138              : !                 enddo
    3139              : !                enddo
    3140              : !              enddo
    3141              : !          endif
    3142              : 
    3143              : !          if(paw_dmft%myproc==0) then
    3144              : !          do iflavor=1,nflavor
    3145              : !            do iflavor1=1,nflavor
    3146              : !            write(491,*), hu(itypat)%udens(iflavor,iflavor1) !(1,1,1,1)
    3147              : !            enddo
    3148              : !          enddo
    3149              : !          endif
    3150              : 
    3151              : !          do iflavor=1,nflavor
    3152              : !            do iflavor1=1,nflavor
    3153              : !          do iflavor2=1,nflavor
    3154              : !            do iflavor3=1,nflavor
    3155              :                  ! WRITE(552,*), hu(itypat)%vee!(iflavor,iflavor1,iflavor2,iflavor3)
    3156              : !            enddo
    3157              : !          enddo
    3158              : !            enddo
    3159              : !          enddo
    3160              : 
    3161            0 :  call vee_ndim2tndim_hu_r(paw_dmft%lpawu(iatom),dble(hu(itypat)%vee),u_mat_ijkl_tmp,1)
    3162            0 :  do iflavor=1,nflavor
    3163            0 :    do iflavor1=1,nflavor
    3164            0 :      do iflavor2=1,nflavor
    3165            0 :        do iflavor3=1,nflavor
    3166            0 :          u_mat_ijkl(iflavor,iflavor1,iflavor2,iflavor3)   =  Ha_eV * u_mat_ijkl_tmp(iflavor,iflavor1,iflavor2,iflavor3)
    3167              :        end do
    3168              :      end do
    3169              :    end do
    3170              :  end do
    3171              : 
    3172              :  !u_mat_ijkl   =  Ha_eV * reshape( u_mat_ijkl , [nflavor,nflavor,nflavor,nflavor] )  !column -> row major + conversion
    3173            0 :  u_mat_ij     = transpose( dble(hu(itypat)%udens) ) * Ha_eV !column -> row major + conversion
    3174            0 :  levels_ctqmc = levels_ctqmc * Ha_eV
    3175              : 
    3176              :  !Location array in memory for C++ pointer args to pass
    3177              :  !----------------------------------------------------
    3178            0 :  g_iw_ptr       = C_LOC( gw_tmp_nd ) !C_LOC( g_iw )
    3179            0 :  gtau_ptr       = C_LOC( gtmp_nd ) !C_LOC( gtau )
    3180            0 :  gl_ptr         = C_LOC( gl_nd )
    3181            0 :  fw1_nd_ptr     = C_LOC( fw1_nd_tmp )
    3182            0 :  u_mat_ij_ptr   = C_LOC( u_mat_ij )
    3183            0 :  u_mat_ijkl_ptr = C_LOC( u_mat_ijkl )
    3184            0 :  levels_ptr     = C_LOC( levels_ctqmc )
    3185              : 
    3186              :  !Calling interfaced TRIQS solver subroutine from src/67_triqs_ext package
    3187            0 :  if (paw_dmft%dmft_solv==9) then
    3188              : #ifndef HAVE_PYTHON_INVOCATION
    3189            0 :   write(message,'(23a)') ch10,' Python invocation flag requiered! You need to install ABINIT with ',&
    3190            0 :    'enable_python_invocation = yes" in your "configure.ac" file.'
    3191            0 :   call wrtout(std_out,message,'COLL')
    3192            0 :   ABI_ERROR(message)
    3193              : #else
    3194              :   ! Creating the NETCDF file
    3195              :   ! write(std_out, "(a)") trim(paw_dmft%filapp)
    3196              :   write(filename, '(a, a)') trim(paw_dmft%filnamei), "_abinit_output_for_py.nc"
    3197              :   write(std_out, '(3a)') ch10, "    Creating NETCDF file: ", trim(filename)
    3198              :   NCF_CHECK(nf90_create(filename, NF90_CLOBBER, ncid))
    3199              : 
    3200              :   ! Defining the dimensions of the variables to write in the NETCDF file
    3201              :   NCF_CHECK(nf90_def_dim(ncid, "one", 1, dim_one_id))
    3202              :   NCF_CHECK(nf90_def_dim(ncid, "nflavor", nflavor, dim_nflavor_id))
    3203              :   NCF_CHECK(nf90_def_dim(ncid, "nwlo", paw_dmft%dmft_nwlo, dim_nwlo_id))
    3204              :   NCF_CHECK(nf90_def_dim(ncid, "nwli", paw_dmft%dmft_nwli, dim_nwli_id))
    3205              :   NCF_CHECK(nf90_def_dim(ncid, "qmc_l", paw_dmft%dmftqmc_l, dim_qmc_l_id))
    3206              :   NCF_CHECK(nf90_def_dim(ncid, "nleg", nleg, dim_nleg_id))
    3207              : 
    3208              :   dim_u_mat_ij_id = (/ dim_nflavor_id, dim_nflavor_id /)
    3209              :   dim_u_mat_ijkl_id = (/ dim_nflavor_id, dim_nflavor_id, dim_nflavor_id, dim_nflavor_id /)
    3210              :   dim_fw1_id = (/ dim_nflavor_id, dim_nflavor_id, dim_nwli_id /)
    3211              :   dim_g_iw_id = (/ dim_nwli_id, dim_nflavor_id, dim_nflavor_id /)
    3212              :   dim_gtau_id = (/ dim_qmc_l_id, dim_nflavor_id, dim_nflavor_id /)
    3213              :   dim_gl_id = (/ dim_nleg_id, dim_nflavor_id, dim_nflavor_id /)
    3214              : 
    3215              :   ! Defining the variables
    3216              :   NCF_CHECK(nf90_def_var(ncid, "rot_inv",         NF90_INT, dim_one_id,           var_rot_inv_id))
    3217              :   NCF_CHECK(nf90_def_var(ncid, "leg_measure",     NF90_INT, dim_one_id,           var_leg_measure_id))
    3218              :   NCF_CHECK(nf90_def_var(ncid, "hist",            NF90_INT, dim_one_id,           var_hist_id))
    3219              :   NCF_CHECK(nf90_def_var(ncid, "wrt_files",       NF90_INT, dim_one_id,           var_wrt_files_id))
    3220              :   NCF_CHECK(nf90_def_var(ncid, "tot_not",         NF90_INT, dim_one_id,           var_tot_not_id))
    3221              :   NCF_CHECK(nf90_def_var(ncid, "n_orbitals",      NF90_INT, dim_one_id,           var_n_orbitals_id))
    3222              :   NCF_CHECK(nf90_def_var(ncid, "n_freq",          NF90_INT, dim_one_id,           var_n_freq_id))
    3223              :   NCF_CHECK(nf90_def_var(ncid, "n_tau",           NF90_INT, dim_one_id,           var_n_tau_id))
    3224              :   NCF_CHECK(nf90_def_var(ncid, "n_l",             NF90_INT, dim_one_id,           var_n_l_id))
    3225              :   NCF_CHECK(nf90_def_var(ncid, "n_cycles",        NF90_INT, dim_one_id,           var_n_cycles_id))
    3226              :   NCF_CHECK(nf90_def_var(ncid, "cycle_length",    NF90_INT, dim_one_id,           var_cycle_length_id))
    3227              :   NCF_CHECK(nf90_def_var(ncid, "ntherm",          NF90_INT, dim_one_id,           var_ntherm_id))
    3228              :   NCF_CHECK(nf90_def_var(ncid, "verbo",           NF90_INT, dim_one_id,           var_verbo_id))
    3229              :   NCF_CHECK(nf90_def_var(ncid, "seed",            NF90_INT, dim_one_id,           var_seed_id))
    3230              :   NCF_CHECK(nf90_def_var(ncid, "beta",            NF90_FLOAT, dim_one_id,         var_beta_id))
    3231              :   NCF_CHECK(nf90_def_var(ncid, "levels",          NF90_DOUBLE, dim_nflavor_id,    var_levels_id))
    3232              :   NCF_CHECK(nf90_def_var(ncid, "u_mat_ij",        NF90_DOUBLE, dim_u_mat_ij_id,   var_u_mat_ij_id))
    3233              :   NCF_CHECK(nf90_def_var(ncid, "u_mat_ijkl",      NF90_DOUBLE, dim_u_mat_ijkl_id, var_u_mat_ijkl_id))
    3234              :   NCF_CHECK(nf90_def_var(ncid, "real_fw1_nd",     NF90_DOUBLE, dim_fw1_id,        var_real_fw1_nd_id))
    3235              :   NCF_CHECK(nf90_def_var(ncid, "imag_fw1_nd",     NF90_DOUBLE, dim_fw1_id,        var_imag_fw1_nd_id))
    3236              :   NCF_CHECK(nf90_def_var(ncid, "real_g_iw",       NF90_DOUBLE, dim_g_iw_id,       var_real_g_iw_id))
    3237              :   NCF_CHECK(nf90_def_var(ncid, "imag_g_iw",       NF90_DOUBLE, dim_g_iw_id,       var_imag_g_iw_id))
    3238              :   NCF_CHECK(nf90_def_var(ncid, "gtau",            NF90_DOUBLE, dim_gtau_id,       var_gtau_id))
    3239              :   NCF_CHECK(nf90_def_var(ncid, "gl",              NF90_DOUBLE, dim_gl_id,         var_gl_id))
    3240              :   NCF_CHECK(nf90_def_var(ncid, "spacecomm",       NF90_INT, dim_one_id,           var_spacecomm_id))
    3241              :   NCF_CHECK(nf90_enddef(ncid))
    3242              : 
    3243              :   ! Filling the variables with actual data
    3244              :   if (rot_inv) then
    3245              :    NCF_CHECK(nf90_put_var(ncid, var_rot_inv_id,       1))
    3246              :   else
    3247              :    NCF_CHECK(nf90_put_var(ncid, var_rot_inv_id,       0))
    3248              :   end if
    3249              :   if (leg_measure) then
    3250              :    NCF_CHECK(nf90_put_var(ncid, var_leg_measure_id,   1))
    3251              :   else
    3252              :    NCF_CHECK(nf90_put_var(ncid, var_leg_measure_id,   0))
    3253              :   end if
    3254              :   if (hist) then
    3255              :    NCF_CHECK(nf90_put_var(ncid, var_hist_id,          1))
    3256              :   else
    3257              :    NCF_CHECK(nf90_put_var(ncid, var_hist_id,          0))
    3258              :   end if
    3259              :   if (wrt_files) then
    3260              :    NCF_CHECK(nf90_put_var(ncid, var_wrt_files_id,     1))
    3261              :   else
    3262              :    NCF_CHECK(nf90_put_var(ncid, var_wrt_files_id,     0))
    3263              :   end if
    3264              :   if (tot_not) then
    3265              :    NCF_CHECK(nf90_put_var(ncid, var_tot_not_id,       1))
    3266              :   else
    3267              :    NCF_CHECK(nf90_put_var(ncid, var_tot_not_id,       0))
    3268              :   end if
    3269              :   NCF_CHECK(nf90_put_var(ncid, var_n_orbitals_id,         nflavor))
    3270              :   NCF_CHECK(nf90_put_var(ncid, var_n_freq_id,             nfreq))
    3271              :   NCF_CHECK(nf90_put_var(ncid, var_n_tau_id,              ntau))
    3272              :   NCF_CHECK(nf90_put_var(ncid, var_n_l_id,                nleg))
    3273              :   NCF_CHECK(nf90_put_var(ncid, var_n_cycles_id,           int(paw_dmft%dmftqmc_n/paw_dmft%nproc)))
    3274              :   NCF_CHECK(nf90_put_var(ncid, var_cycle_length_id,       paw_dmft%dmftctqmc_meas*2*2*nflavor))
    3275              :   NCF_CHECK(nf90_put_var(ncid, var_ntherm_id,             paw_dmft%dmftqmc_therm))
    3276              :   NCF_CHECK(nf90_put_var(ncid, var_verbo_id,              verbosity_solver))
    3277              :   NCF_CHECK(nf90_put_var(ncid, var_seed_id,               paw_dmft%dmftqmc_seed))
    3278              :   NCF_CHECK(nf90_put_var(ncid, var_beta_id,               beta))
    3279              :   NCF_CHECK(nf90_put_var(ncid, var_levels_id,             levels_ctqmc))
    3280              :   NCF_CHECK(nf90_put_var(ncid, var_u_mat_ij_id,           u_mat_ij))
    3281              :   NCF_CHECK(nf90_put_var(ncid, var_u_mat_ijkl_id,         u_mat_ijkl))
    3282              :   NCF_CHECK(nf90_put_var(ncid, var_real_fw1_nd_id,        real(fw1_nd_tmp)))
    3283              :   NCF_CHECK(nf90_put_var(ncid, var_imag_fw1_nd_id,        aimag(fw1_nd_tmp)))
    3284              :   NCF_CHECK(nf90_put_var(ncid, var_real_g_iw_id,          real(gw_tmp_nd)))
    3285              :   NCF_CHECK(nf90_put_var(ncid, var_imag_g_iw_id,          aimag(gw_tmp_nd)))
    3286              :   NCF_CHECK(nf90_put_var(ncid, var_gtau_id,               gtmp_nd))
    3287              :   NCF_CHECK(nf90_put_var(ncid, var_gl_id,                 gl_nd))
    3288              :   NCF_CHECK(nf90_put_var(ncid, var_spacecomm_id,          paw_dmft%spacecomm))
    3289              :   NCF_CHECK(nf90_close(ncid))
    3290              : 
    3291              :   write(std_out, '(4a)') ch10, "    NETCDF file ", trim(filename), " written; Launching python invocation"
    3292              : 
    3293              :   ! Invoking python to execute the script
    3294              :   call invoke_python_run_script (0, paw_dmft%myproc, trim(paw_dmft%filnamei), paw_dmft%spacecomm)
    3295              :   ! call Invoke_python_triqs (paw_dmft%myproc, trim(paw_dmft%filnamei)//c_null_char)
    3296              :   call xmpi_barrier(paw_dmft%spacecomm)
    3297              :   call flush_unit(std_out)
    3298              : 
    3299              :   ! Allocating the fortran variables for the results
    3300              :   ABI_MALLOC(new_re_g_iw,(nflavor,nflavor, paw_dmft%dmft_nwli))
    3301              :   ABI_MALLOC(new_im_g_iw,(nflavor,nflavor, paw_dmft%dmft_nwli))
    3302              :   ABI_MALLOC(new_g_tau,(nflavor,nflavor, paw_dmft%dmftqmc_l))
    3303              :   ABI_MALLOC(new_gl,(nflavor,nflavor, nleg))
    3304              :   i = (0, 1)
    3305              : 
    3306              :   ! Check if file exists
    3307              :   write(filename, '(a, a)') trim(paw_dmft%filnamei), "_py_output_for_abinit.nc"
    3308              : 
    3309              :   INQUIRE(FILE=filename, EXIST=file_exists)
    3310              :   if(.not. file_exists) then
    3311              :    write(message,'(4a)') ch10,' Cannot find file ', trim(filename), '! Make sure the python script writes it with the right name and at the right place!'
    3312              :    call wrtout(std_out,message,'COLL')
    3313              :    ABI_ERROR(message)
    3314              :   endif
    3315              : 
    3316              :   write(std_out, '(3a)') ch10, "    Reading NETCDF file ", trim(filename)
    3317              : 
    3318              :   ! Opening the NETCDF file
    3319              :   NCF_CHECK(nf90_open(filename, nf90_nowrite, ncid))
    3320              : 
    3321              :   ! Read from the file
    3322              :   ! Re{G_iw}
    3323              :   write(std_out, '(2a)') ch10, "    -- Re[G(iw_n)]"
    3324              :   NCF_CHECK(nf90_inq_varid(ncid, "re_g_iw", varid))
    3325              :   NCF_CHECK(nf90_get_var(ncid, varid, new_re_g_iw))
    3326              :   ! Im{G_iw}
    3327              :   write(std_out, '(2a)') ch10, "    -- Im[G(iw_n)]"
    3328              :   NCF_CHECK(nf90_inq_varid(ncid, "im_g_iw", varid))
    3329              :   NCF_CHECK(nf90_get_var(ncid, varid, new_im_g_iw))
    3330              :   ! G_tau
    3331              :   write(std_out, '(2a)') ch10, "    -- G(tau)"
    3332              :   NCF_CHECK(nf90_inq_varid(ncid, "g_tau", varid))
    3333              :   NCF_CHECK(nf90_get_var(ncid, varid, new_g_tau))
    3334              :   ! G_l
    3335              :   write(std_out, '(2a)') ch10, "    -- G_l"
    3336              :   NCF_CHECK(nf90_inq_varid(ncid, "gl", varid))
    3337              :   NCF_CHECK(nf90_get_var(ncid, varid, new_gl))
    3338              : 
    3339              :   ! Assigning data
    3340              :   do iflavor1=1, nflavor
    3341              :    do iflavor2=1, nflavor
    3342              :     do ifreq=1, paw_dmft%dmft_nwli
    3343              :      gw_tmp_nd(ifreq, iflavor1, iflavor2) = new_re_g_iw(iflavor1, iflavor2, ifreq) &
    3344              : &               + i*new_im_g_iw(iflavor1, iflavor2, ifreq)
    3345              :     end do
    3346              :     do itau=1, paw_dmft%dmftqmc_l
    3347              :      gtmp_nd(itau, iflavor1, iflavor2) = new_g_tau(iflavor1, iflavor2, itau)
    3348              :     end do
    3349              :     do ileg=1, nleg
    3350              :      gl_nd(ileg, iflavor1, iflavor2) = new_gl(iflavor1, iflavor2, ileg)
    3351              :     end do
    3352              :    end do
    3353              :   end do
    3354              : 
    3355              :   ! Deallocating
    3356              :   ABI_FREE(new_re_g_iw)
    3357              :   ABI_FREE(new_im_g_iw)
    3358              :   ABI_FREE(new_g_tau)
    3359              :   ABI_FREE(new_gl)
    3360              : #endif
    3361              :  elseif(paw_dmft%dmft_solv == 6 .or. paw_dmft%dmft_solv == 7) then
    3362              :   !Calling interfaced TRIQS solver subroutine from src/01_triqs_ext package
    3363              :   !----------------------------------------------------
    3364              : #if defined HAVE_TRIQS_v2_0 || defined HAVE_TRIQS_v1_4
    3365              :  call Ctqmc_triqs_run (     rot_inv, leg_measure, hist, wrt_files, tot_not,   &
    3366              : &  nflavor, nfreq, ntau , nleg, int(paw_dmft%dmftqmc_n/paw_dmft%nproc),       &
    3367              : &  paw_dmft%dmftctqmc_meas*2*2*nflavor, paw_dmft%dmftqmc_therm,               &
    3368              : &  verbosity_solver, paw_dmft%dmftqmc_seed,beta,                              &
    3369              : &  levels_ptr,  u_mat_ij_ptr, u_mat_ijkl_ptr, fw1_nd_ptr,                     &
    3370              : !&  g_iw_ptr, gtau_ptr, gl_ptr, paw_dmft%spacecomm                             )
    3371              : &  g_iw_ptr, gtau_ptr, gl_ptr, paw_dmft%myproc                             )
    3372              : #endif
    3373              :  endif
    3374              : 
    3375              :   !WRITE(*,*) "Hello Debug"
    3376              :   !call xmpi_barrier(paw_dmft%spacecomm) !Resynch all processus after calling Impurity solver from TRIQS
    3377              : 
    3378              :   !Report output datas from TRIQS to Abinit
    3379              :   !Interacting G(iw)
    3380              :  ! OG Commented these loops because they are useless
    3381              :  !do ifreq=1,nfreq
    3382              :  !  do iflavor1=1,nflavor
    3383              :  !    do iflavor=1,nflavor
    3384              :  !   !   gw_tmp_nd(ifreq,iflavor,iflavor1) = g_iw(iflavor,iflavor1,ifreq) !* Ha_eV !because 1/ G0(eV)
    3385              :  !   !  WRITE(503,*) "[OUT Fortran] G(iw)[ w= ",ifreq," l= ",iflavor," l_= ",iflavor1,"] = ",gw_tmp_nd(ifreq,iflavor,iflavor1)!g_iw(iflavor,iflavor1,ifreq)
    3386              :  !    end do
    3387              :  !  end do
    3388              :  !end do
    3389              : 
    3390              : ! Convert in Ha
    3391            0 :  gw_tmp_nd = gw_tmp_nd*Ha_eV
    3392              : 
    3393              : !     do iflavor1=1,nflavor
    3394              : !       do iflavor=1,nflavor
    3395              : !
    3396              : !        WRITE(510,*) "[OUT Fortran] U[ l= ",iflavor," l_= ",iflavor1,"] = ",u_mat_ij(iflavor,iflavor1)
    3397              : !       enddo
    3398              : !     enddo
    3399              : 
    3400              : ! if(paw_dmft%myproc==0) write(6,*) "essai",paw_dmft%myproc, gw_tmp_nd(2,1,1)
    3401              : ! if(paw_dmft%myproc==1) write(6,*) "essai",paw_dmft%myproc,gw_tmp_nd(2,1,1)
    3402              : ! if(paw_dmft%myproc==0) write(621,*) "essai",paw_dmft%myproc, gw_tmp_nd(2,1,1)
    3403              : ! if(paw_dmft%myproc==1) write(622,*) "essai",paw_dmft%myproc,gw_tmp_nd(2,1,1)
    3404              : ! call flush_unit(621)
    3405              : ! call flush_unit(622)
    3406              : ! write(message,*) ch10, "essai",paw_dmft%myproc, paw_dmft%myproc,paw_dmft%dmftqmc_seed!gw_tmp_nd(2,1,1)
    3407              : ! call wrtout(555,message,'PERS',.true.)
    3408              : ! if(paw_dmft%myproc==0) write(499,*) "essai",paw_dmft%myproc, paw_dmft%dmftqmc_seed
    3409              : ! if(paw_dmft%myproc==1) write(498,*) "essai",paw_dmft%myproc,paw_dmft%dmftqmc_seed
    3410              : 
    3411              :   !Its associated G(tau): Problem of compatibility => paw_dmft%dmftqmc_l < (2*paw_dmft%dmftqmc_l)+1 => We report only  paw_dmft%dmftqmc_l =  first values of G(tau)...
    3412              : !   do iflavor=1,nflavor
    3413              : !     do iflavor1=1,nflavor
    3414              : !       do itau=1,ntau
    3415              : !         if ( modulo(itau,2) == 1 ) then !Problem of binding: paw_dmft%dmftqmc_l =! ntau => We take one value by 2 and Write in file all the G(tau) out function from TRIQS
    3416              :           !gtmp_nd(itau,iflavor,iflavor1) = gtau(iflavor,iflavor1,itau)
    3417              : !         endif
    3418              : !         if(paw_dmft%myproc==0) then
    3419              : !           WRITE(504,*) "[OUT Fortran] G[ tau= ",itau," l= ",iflavor," l_= ",iflavor1,"] = ",gtmp_nd(itau,iflavor,iflavor1) !gtmp_nd(itau,iflavor,iflavor1) !passage ok avec ntau/iflavor1/iflavor (iflavor,iflavor1,ntau)
    3420              : !         endif
    3421              : !       enddo
    3422              : !     enddo
    3423              : !   enddo
    3424              : 
    3425              :   ! Write Legendre Polynoms G(L) for extrapolation of Interacting G(iw) by FT, only if leg_measure == TRUE
    3426              :   ! -------------------------------------------------------------------------------------------
    3427            0 :  if (leg_measure) then
    3428            0 :    do ileg=1,nleg
    3429            0 :      WRITE(505,*) ileg,((gl_nd(ileg,iflavor,iflavor1),iflavor=1,nflavor),iflavor1=1,nflavor)
    3430              :    end do
    3431            0 :    close(505)
    3432              :  end if
    3433              : ! f(paw_dmft%myproc==0) then
    3434              : !  do itau=1,paw_dmft%dmftqmc_l
    3435              : !    write(490,*) ((gtmp_nd(itau,iflavor,iflavor1),iflavor=1,nflavor),iflavor1=1,nflavor)
    3436              : !  enddo
    3437              : ! ndif
    3438            0 :  ABI_FREE( fw1_nd_tmp )
    3439            0 :  ABI_FREE( g_iw )
    3440            0 :  ABI_FREE( u_mat_ijkl )
    3441            0 :  ABI_FREE( u_mat_ijkl_tmp )
    3442            0 :  ABI_FREE( u_mat_ij )
    3443              : 
    3444              : 
    3445              :   !  Compute Green's function in imaginary freq using Legendre coefficients
    3446              :   ! -----------------------------------------------------------------------
    3447            0 :  if (leg_measure) then
    3448            0 :    call xmpi_barrier(paw_dmft%spacecomm)
    3449            0 :    call flush_unit(std_out)
    3450            0 :    write(message,'(2a)') ch10,"    ==  Compute G(iw_n) from Legendre coefficients"
    3451            0 :    call wrtout(std_out,message,'COLL')
    3452            0 :    ABI_MALLOC( jbes, (nleg))
    3453            0 :    gw_tmp_nd=czero
    3454              : 
    3455              :   !   write(77,*) " TEST OF BESSEL S ROUTINES 0 0"
    3456              : 
    3457              :   !   xx=0_dp
    3458              :   !   ileg=0
    3459              :   !   call sbf8(ileg+1,xx,jbes)
    3460              :   !   write(77,*) "T0 A",jbes(ileg+1)
    3461              :   !   call jbessel(jbes(ileg+1),besp,bespp,ileg,1,xx)
    3462              :   !   write(77,*) "T0 B",jbes(ileg+1)
    3463              :   !   write(77,*) "T0 C",bessel_jn(ileg,xx)
    3464              : 
    3465              :   !   write(77,*) " TEST OF BESSEL S ROUTINES 1.5 0"
    3466              : 
    3467              :   !   xx=1.5_dp
    3468              :   !   ileg=0
    3469              :   !   call sbf8(ileg+1,xx,jbes)
    3470              :   !   write(77,*) "T1 A",jbes(ileg+1)
    3471              :   !   call jbessel(jbes(ileg+1),besp,bespp,ileg,1,xx)
    3472              :   !   write(77,*) "T1 B",jbes(ileg+1)
    3473              :   !   write(77,*) "T1 C",bessel_jn(ileg,xx)
    3474              : 
    3475              :   !   write(77,*) " TEST OF BESSEL S ROUTINES 1.5 1"
    3476              : 
    3477              :   !   xx=1.5_dp
    3478              :   !   ileg=1
    3479              :   !   call sbf8(ileg+1,xx,jbes)
    3480              :   !   write(77,*) "T2 A",jbes(ileg+1)
    3481              :   !   call jbessel(jbes(ileg+1),besp,bespp,ileg,1,xx)
    3482              :   !   write(77,*) "T2 B",jbes(ileg+1)
    3483              :   !   write(77,*) "T2 C",bessel_jn(ileg,xx)
    3484              : 
    3485              : 
    3486            0 :    do ifreq=1,paw_dmft%dmft_nwli
    3487            0 :      xx=real(2*ifreq-1,kind=dp)*pi/two
    3488            0 :      if(xx<=100_dp) call sbf8(nleg,xx,jbes)
    3489            0 :      do ileg=1,nleg
    3490              :     ! write(77,*) "A",ifreq,jbes(ileg),xx
    3491              : 
    3492            0 :        if(xx>=99) call jbessel(jbes(ileg),besp,bespp,ileg-1,1,xx)
    3493              :     ! write(77,*) "B",ifreq,jbes(ileg),xx
    3494              : 
    3495              :      !write(77,*) "C",ifreq,jbes(ileg),xx
    3496              : 
    3497            0 :        u_nl=sqrt(float(2*ileg-1))*(-1)**(ifreq-1)*cmplx(0_dp,one)**(ileg)*jbes(ileg)
    3498            0 :       write(77,*) "----------",ileg,jbes(ileg), u_nl,gl_nd(ileg,1,1)
    3499              : 
    3500            0 :        do iflavor=1,nflavor
    3501            0 :          do iflavor1=1,nflavor
    3502              :            gw_tmp_nd(ifreq,iflavor,iflavor1)= gw_tmp_nd(ifreq,iflavor,iflavor1) + &
    3503            0 : &           u_nl*gl_nd(ileg,iflavor,iflavor1)
    3504              :          end do
    3505              :        end do
    3506              : 
    3507              :   !    write(77,*) "------------------", gw_tmp_nd(ifreq,1,1)
    3508              : 
    3509              :      end do
    3510              :   !  write(77,*) "------------------ sum ", gw_tmp_nd(ifreq,1,1)
    3511              :    end do
    3512            0 :    ABI_FREE( jbes )
    3513            0 :    call xmpi_barrier(paw_dmft%spacecomm)
    3514            0 :    call flush_unit(std_out)
    3515              :  end if
    3516            0 :  gw_tmp_nd = gw_tmp_nd*Ha_eV
    3517              : 
    3518              : 
    3519            0 :  if ( leg_measure ) then !only if functionality is enabled
    3520            0 :    ABI_FREE(gl_nd)
    3521              :  end if
    3522              : 
    3523              : 
    3524            0 : end subroutine ctqmc_calltriqs
    3525              : !!***
    3526              : 
    3527              : !!****f* m_forctqmc/ctqmc_calltriqs_c
    3528              : !! NAME
    3529              : !! ctqmc_calltriqs_c
    3530              : !!
    3531              : !! FUNCTION
    3532              : !! This routines calls TRIQS/CTHYB using the C++ API in order
    3533              : !! to solve the impurity model.
    3534              : !!
    3535              : !! INPUTS
    3536              : !!  paw_dmft <type(paw_dmft_type)>= DMFT data structure
    3537              : !!  green <type(green_type)>= green's function
    3538              : !!  self <type(self_type)>= self-energy
    3539              : !!  hu <type(hu_type)>= U interaction
    3540              : !!  weiss <type(green_type)>= inverse of weiss function
    3541              : !!  self_new <type(self_type)>= impurity self-energy
    3542              : !!  pawprtvol = flag for printing
    3543              : !!
    3544              : !! OUTPUT
    3545              : !!
    3546              : !! SIDE EFFECTS
    3547              : !!
    3548              : !! NOTES
    3549              : !!
    3550              : !! SOURCE
    3551              : 
    3552            0 : subroutine ctqmc_calltriqs_c(paw_dmft,green,self,hu,weiss,self_new,pawprtvol)
    3553              : 
    3554              : #if defined HAVE_TRIQS_INTERNAL || defined HAVE_TRIQS_v3_2
    3555              :  use TRIQS_CTQMC
    3556              : #endif
    3557              :  use ISO_C_BINDING
    3558              : 
    3559              : !Arguments ------------------------------------
    3560              :  integer, intent(in) :: pawprtvol
    3561              :  type(paw_dmft_type), intent(in) :: paw_dmft
    3562              :  type(green_type), target, intent(inout) :: green,weiss
    3563              :  type(self_type), intent(inout) :: self,self_new
    3564              :  type(hu_type), intent(inout) :: hu(paw_dmft%ntypat)
    3565              : !Local variables ------------------------------
    3566              :  integer :: basis,i,iatom,iblock,iflavor,iflavor1,iflavor2,ifreq,ilam,ileg,im,im1,integral,isppol,isub
    3567              :  integer :: itau,itypat,iw,l,len_t,lpawu,myproc,natom,ncon,ndim,nflavor,nflavor_max,ngauss,nleg,nmoments
    3568              :  integer :: nspinor,nsppol,nsub,ntau,ntot,nwlo,p,pad_elam,pad_lambda,read_data,rot_type_vee,tndim,unt,verbo,wdlr_size
    3569              :  integer, target :: ndlr
    3570              :  logical :: debug,density_matrix,entropy,leg_measure,nondiag,off_diag,rot_inv
    3571              :  real(dp) :: besp,bespp,beta,dx,elam,emig_tot,err,err_,fact,fact2,shift_mu,tau,tol,xtau,xx
    3572              :  complex(dp) :: mself_1,mself_2,occ_tmp,u_nl
    3573              :  complex(dp), target :: eu
    3574            0 :  type(oper_type), target :: energy_level
    3575            0 :  type(self_type) :: hybmwdhyb
    3576              :  type(c_ptr) :: block_ptr,eu_ptr,flavor_ptr,fname_data_ptr,fname_dataw_ptr,fname_histo_ptr,ftau_ptr,gl_ptr,gtau_ptr
    3577              :  type(c_ptr) :: inner_ptr,levels_ptr,mself_1_ptr,mself_2_ptr,ndlr_ptr,occ_ptr,siz_ptr,udens_ptr,vee_ptr,wdlr_ptr
    3578              :  type(c_ptr) :: chiloc_ptr,magmom_ptr
    3579            0 :  integer, allocatable :: flavor_list(:,:,:),nblocks(:)
    3580            0 :  integer, target, allocatable :: block_list(:,:),flavor_tmp(:,:),inner_list(:,:),siz_block(:,:)
    3581            0 :  real(dp), allocatable :: adlr(:,:),bdlr(:),elam_list(:),emig(:),gl_dlr_re(:),gl_dlr_im(:),jbes(:),lam_list(:)
    3582            0 :  real(dp), allocatable :: leg_array(:,:),moment_fit(:),t_lp(:,:),tpoints(:),tweights(:),wdlr(:),wdlr_beta(:,:)
    3583            0 :   real(dp), target, allocatable :: wdlr_tmp(:), chiloc_tmp(:,:), magmom_array(:)
    3584            0 :  complex(dp), allocatable :: adlr_iw(:,:),gl_dlr(:,:,:,:),gl_tmp(:,:,:,:),gtau_dlr(:,:,:),gtau_leg(:,:,:),shift(:)
    3585            0 :  complex(dp), target, allocatable :: gl(:,:,:),gtau(:,:,:),levels_ctqmc(:,:),moments_self_1(:),moments_self_2(:),occ(:)
    3586            0 :  type(matlu_type), allocatable :: eigvectmatlu(:),matlu_tmp(:)
    3587            0 :  type(matlu_type), target, allocatable :: dmat_ctqmc(:),ftau(:),udens_rot(:)
    3588            0 :  type(matlu_type), pointer :: matlu_pt(:) => null()
    3589            0 :  type(vee_type), target, allocatable :: vee_rot(:)
    3590            0 :  type(coeff2c_type), allocatable :: magmom_tot(:)
    3591            0 :  type(matlu_type), allocatable :: matlumag_tot(:)
    3592              :  character(len=1) :: tag_block4
    3593              :  character(len=2) :: tag_block,tag_block3,tag_lam
    3594              :  character(len=4) :: tag_at
    3595              :  character(len=14) :: tag_elam,tag_lambda
    3596              :  character(len=500) :: stringfile,tag_block2,tag_lam2
    3597              :  character(len=10000) :: message
    3598              :  character(len=fnlen), target :: fname_data,fname_dataw,fname_histo
    3599              : ! ************************************************************************
    3600              : 
    3601            0 :  basis          = paw_dmft%dmftctqmc_basis
    3602            0 :  beta           = one / paw_dmft%temp
    3603            0 :  debug          = paw_dmft%dmft_triqs_prt_entropy
    3604            0 :  density_matrix = paw_dmft%dmft_triqs_measure_density_matrix
    3605            0 :  entropy        = (paw_dmft%dmft_triqs_entropy == 1)
    3606            0 :  integral       = paw_dmft%dmft_triqs_compute_integral
    3607            0 :  leg_measure    = paw_dmft%dmft_triqs_leg_measure
    3608            0 :  myproc         = paw_dmft%myproc
    3609            0 :  natom          = paw_dmft%natom
    3610            0 :  nflavor_max    = 2 * (2*paw_dmft%maxlpawu+1)
    3611            0 :  ngauss         = paw_dmft%dmft_triqs_gaussorder
    3612            0 :  nleg           = paw_dmft%dmft_triqs_nleg
    3613            0 :  nspinor        = paw_dmft%nspinor
    3614            0 :  nsppol         = paw_dmft%nsppol
    3615            0 :  nsub           = paw_dmft%dmft_triqs_nsubdivisions
    3616            0 :  ntau           = paw_dmft%dmftqmc_l
    3617            0 :  nwlo           = paw_dmft%dmft_nwlo
    3618            0 :  off_diag       = paw_dmft%dmft_triqs_off_diag
    3619            0 :  rot_inv        = (paw_dmft%dmft_solv == 7)
    3620            0 :  shift_mu       = paw_dmft%dmft_triqs_shift_mu
    3621            0 :  tol            = paw_dmft%dmft_triqs_tol_block
    3622              : 
    3623            0 :  if (rot_inv) then
    3624            0 :    write(message,'(a,3x,a)') ch10,"== Rotationally Invariant Terms Included"
    3625              :  else
    3626            0 :    write(message,'(a,3x,a)') ch10,"== Density-Density Terms Included"
    3627              :  end if
    3628            0 :  call wrtout(std_out,message,"COLL")
    3629              : 
    3630            0 :  ABI_MALLOC(block_list,(nflavor_max,natom))
    3631            0 :  ABI_MALLOC(dmat_ctqmc,(natom))
    3632            0 :  ABI_MALLOC(eigvectmatlu,(natom))
    3633            0 :  ABI_MALLOC(flavor_list,(nflavor_max,nflavor_max,natom))
    3634            0 :  ABI_MALLOC(ftau,(natom))
    3635            0 :  ABI_MALLOC(inner_list,(nflavor_max,natom))
    3636            0 :  ABI_MALLOC(matlu_tmp,(natom))
    3637            0 :  ABI_MALLOC(nblocks,(natom))
    3638            0 :  ABI_MALLOC(shift,(natom))
    3639            0 :  ABI_MALLOC(siz_block,(nflavor_max,natom))
    3640            0 :  ABI_MALLOC(udens_rot,(natom))
    3641            0 :  ABI_MALLOC(vee_rot,(natom))
    3642              : 
    3643            0 :  call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu(:),dmat_ctqmc(:))
    3644            0 :  call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu(:),eigvectmatlu(:))
    3645            0 :  call init_matlu(natom,2,ntau,paw_dmft%lpawu(:),ftau(:))
    3646            0 :  call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu(:),matlu_tmp(:))
    3647            0 :  call init_matlu(natom,2,1,paw_dmft%lpawu(:),udens_rot(:))
    3648              : 
    3649            0 :  call init_oper(paw_dmft,energy_level,opt_ksloc=2)
    3650              : 
    3651            0 :  call init_vee(paw_dmft,vee_rot(:))
    3652              : 
    3653            0 :  call compute_levels(energy_level,self%hdc,paw_dmft)
    3654              : 
    3655            0 :  write(message,'(a,3x,a)') ch10,"== Print Occupation matrix in cubic basis"
    3656            0 :  call wrtout(std_out,message,"COLL")
    3657            0 :  call print_matlu(green%occup%matlu(:),natom,1)
    3658              : 
    3659            0 :  call compute_moments_loc(green,self,energy_level,weiss,0)
    3660              : 
    3661              :  ! Build hybridization and remove spurious 0th order moment
    3662            0 :  do ifreq=1,nwlo
    3663            0 :    shift(:) = cmplx(zero,paw_dmft%omega_lo(ifreq),kind=dp)
    3664            0 :    call shift_matlu(weiss%oper(ifreq)%matlu(:),natom,shift(:))
    3665            0 :    call fac_matlu(weiss%oper(ifreq)%matlu(:),natom,-cone)
    3666            0 :    call add_matlu(weiss%oper(ifreq)%matlu(:),energy_level%matlu(:),matlu_tmp(:),natom,-1)
    3667            0 :    call add_matlu(matlu_tmp(:),weiss%moments(1)%matlu(:),weiss%oper(ifreq)%matlu(:),natom,-1)
    3668              :  end do ! ifreq
    3669              : 
    3670            0 :  call zero_matlu(weiss%moments(1)%matlu(:),natom)
    3671              : 
    3672            0 :  write(message,'(a,3x,a)') ch10,"== Print Delta(iw) for first frequency in cubic basis"
    3673            0 :  call wrtout(std_out,message,"COLL")
    3674            0 :  call print_matlu(weiss%oper(1)%matlu(:),natom,1)
    3675              : 
    3676              :  if (basis == 0) then
    3677            0 :    write(message,'(a,3x,a)') ch10,"== Switching to CTQMC basis: staying in cubic basis"
    3678              :  else if (basis == 1) then
    3679            0 :    write(message,'(a,3x,2a)') ch10,"== Switching to CTQMC basis: using basis that", &
    3680            0 :                                  & " diagonalizes the electronic levels"
    3681              :  else if (basis == 2) then
    3682            0 :    write(message,'(a,3x,2a)') ch10,"== Switching to CTQMC basis: using basis that", &
    3683            0 :                                  & " diagonalizes the occupation matrix"
    3684              :  else if (basis == 3) then
    3685            0 :    write(message,'(a,3x,a)') ch10,"== Switching to CTQMC basis: using Ylm basis"
    3686              :  else if (basis == 4) then
    3687            0 :    write(message,'(a,3x,a)') ch10,"== Switching to CTQMC basis: using JmJ basis"
    3688              :  end if
    3689            0 :  call wrtout(std_out,message,"COLL")
    3690              : 
    3691            0 :  if (basis == 1) then
    3692            0 :    call checkdiag_matlu(energy_level%matlu(:),natom,tol,nondiag)
    3693            0 :    if (.not. nondiag) then
    3694            0 :      basis = 0
    3695            0 :      write(message,'(a,3x,a)') ch10,"== Electronic levels are already diagonal: staying in the cubic basis"
    3696              :    else
    3697            0 :      write(message,'(a,3x,a)') ch10,"== Switching to Ylm basis first"
    3698              :    end if ! nondiag
    3699            0 :    call wrtout(std_out,message,"COLL")
    3700              :  end if ! basis=1
    3701              : 
    3702            0 :  if (basis == 2) then
    3703            0 :    call checkdiag_matlu(green%occup%matlu(:),natom,tol,nondiag)
    3704            0 :    if (.not. nondiag) then
    3705            0 :      basis = 0
    3706            0 :      write(message,'(a,3x,a)') ch10,"== Occupation matrix is already diagonal: staying in the cubic basis"
    3707              :    else
    3708            0 :      write(message,'(a,3x,a)') ch10,"== Switching to Ylm basis first"
    3709              :    end if ! not nondiag
    3710            0 :    call wrtout(std_out,message,"COLL")
    3711              :  end if ! basis=2
    3712              : 
    3713            0 :  call copy_matlu(green%occup%matlu(:),dmat_ctqmc(:),natom)
    3714              : 
    3715            0 :  if (basis > 0) then ! First switch to Ylm basis in every case
    3716            0 :    call slm2ylm_matlu(energy_level%matlu(:),natom,paw_dmft,1,0)
    3717            0 :    call slm2ylm_matlu(dmat_ctqmc(:),natom,paw_dmft,1,0)
    3718            0 :    do i=2,weiss%nmoments-1
    3719            0 :      call slm2ylm_matlu(weiss%moments(i)%matlu(:),natom,paw_dmft,1,0)
    3720              :    end do ! i
    3721            0 :    do ifreq=1,nwlo
    3722            0 :      if (weiss%distrib%procf(ifreq) /= myproc) cycle
    3723            0 :      call slm2ylm_matlu(weiss%oper(ifreq)%matlu(:),natom,paw_dmft,1,0)
    3724              :    end do ! ifreq
    3725              :  end if ! basis>0
    3726              : 
    3727            0 :  if (basis == 1 .or. basis == 2) then
    3728              :    ! Find block structure in Ylm basis and diagonalize for each block (extremely useful in the
    3729              :    ! case of degenerate levels ; this ensures minimal mixing of Ylm and thus maximal number of subspaces)
    3730            0 :    if (basis == 1) then
    3731            0 :      matlu_pt => energy_level%matlu(:)
    3732              :    else
    3733            0 :      matlu_pt => dmat_ctqmc(:)
    3734              :    end if ! basis
    3735              : 
    3736            0 :    if (pawprtvol >= 3) then
    3737            0 :      if (basis == 1) then
    3738            0 :        write(message,'(a,3x,a)') ch10,"== Print Energy levels in Ylm basis"
    3739              :      else
    3740            0 :        write(message,'(a,3x,a)') ch10,"== Print Occupation matrix in Ylm basis"
    3741              :      end if
    3742            0 :      call wrtout(std_out,message,"COLL")
    3743              : 
    3744            0 :      call print_matlu(matlu_pt(:),natom,1)
    3745              :    end if ! pawprtvol>=3
    3746              : 
    3747              :    call find_block_structure(paw_dmft,block_list(:,:),inner_list(:,:), &
    3748            0 :        & flavor_list(:,:,:),siz_block(:,:),nblocks(:),matlu_pt(:),natom,nflavor_max)
    3749            0 :    call diag_block(matlu_pt)
    3750            0 :    matlu_pt => null()
    3751              : 
    3752              :    ! Make sure every process has the same rotation matrix in case of degenerate levels
    3753            0 :    call xmpi_matlu(eigvectmatlu(:),natom,paw_dmft%spacecomm,master=0,option=2)
    3754              : 
    3755            0 :    if (basis == 1) then
    3756            0 :      call rotate_matlu(dmat_ctqmc(:),eigvectmatlu(:),natom,1)
    3757              :    else
    3758            0 :      call rotate_matlu(energy_level%matlu(:),eigvectmatlu(:),natom,1)
    3759              :    end if ! basis
    3760            0 :    do i=2,weiss%nmoments-1
    3761            0 :      call rotate_matlu(weiss%moments(i)%matlu(:),eigvectmatlu(:),natom,1)
    3762              :    end do ! i
    3763            0 :    do ifreq=1,nwlo
    3764            0 :      if (weiss%distrib%procf(ifreq) /= myproc) cycle
    3765            0 :      call rotate_matlu(weiss%oper(ifreq)%matlu(:),eigvectmatlu(:),natom,1)
    3766              :    end do ! ifreq
    3767              :  end if ! basis=1 or 2
    3768              : 
    3769            0 :  if (basis == 4) then
    3770            0 :    call ylm2jmj_matlu(energy_level%matlu(:),natom,1,paw_dmft)
    3771            0 :    call ylm2jmj_matlu(dmat_ctqmc(:),natom,1,paw_dmft)
    3772            0 :    do i=2,weiss%nmoments-1
    3773            0 :      call ylm2jmj_matlu(weiss%moments(i)%matlu(:),natom,1,paw_dmft)
    3774              :    end do
    3775            0 :    do ifreq=1,nwlo
    3776            0 :      if (weiss%distrib%procf(ifreq) /= myproc) cycle
    3777            0 :      call ylm2jmj_matlu(weiss%oper(ifreq)%matlu(:),natom,1,paw_dmft)
    3778              :    end do ! ifreq
    3779              :  end if ! basis=4
    3780              : 
    3781            0 :  if (basis == 0) then
    3782            0 :    do iatom=1,natom
    3783            0 :      lpawu = paw_dmft%lpawu(iatom)
    3784            0 :      if (lpawu == -1) cycle
    3785            0 :      itypat = paw_dmft%typat(iatom)
    3786            0 :      udens_rot(iatom)%mat(:,:,1) = hu(itypat)%udens(:,:)
    3787            0 :      vee_rot(iatom)%mat(:,:,:,:) = hu(itypat)%veeslm2(:,:,:,:)
    3788              :    end do ! iatom
    3789              :  else
    3790            0 :    call gather_oper(weiss%oper(:),weiss%distrib,paw_dmft,opt_ksloc=2)
    3791            0 :    rot_type_vee = 4
    3792            0 :    if (basis == 3) rot_type_vee = 2
    3793            0 :    if (basis == 4) rot_type_vee = 3
    3794            0 :    call rotatevee_hu(hu(:),paw_dmft,pawprtvol,eigvectmatlu(:),rot_type_vee,udens_rot(:),vee_rot(:))
    3795              :  end if ! basis
    3796              : 
    3797            0 :  write(message,'(a,3x,a)') ch10,"== Print Energy levels in CTQMC basis"
    3798            0 :  call wrtout(std_out,message,"COLL")
    3799            0 :  call print_matlu(energy_level%matlu(:),natom,1)
    3800              : 
    3801            0 :  write(message,'(a,3x,a)') ch10,"== Print Occupation matrix in CTQMC basis"
    3802            0 :  call wrtout(std_out,message,"COLL")
    3803            0 :  call print_matlu(dmat_ctqmc(:),natom,1)
    3804              : 
    3805            0 :  write(message,'(a,3x,a)') ch10,"== Print Delta(iw) for first frequency in CTQMC basis"
    3806            0 :  call wrtout(std_out,message,"COLL")
    3807            0 :  call print_matlu(weiss%oper(1)%matlu(:),natom,1)
    3808              : 
    3809              :  ! Possibly set the imaginary part and off-diagonal elements to 0 now that we
    3810              :  ! are in the CTQMC basis. This is extremely important to do it explicitly instead of
    3811              :  ! simply sending the real part or the diagonal elements to TRIQS since this modifies
    3812              :  ! the electronic levels and hybridization that are used in Dyson's equation later.
    3813              : 
    3814              : #ifndef HAVE_TRIQS_COMPLEX
    3815            0 :  write(message,'(a,3x,2a)') ch10,"== The imaginary part of Delta(tau) and the ", &
    3816            0 :                          & "electronic levels is now set to 0"
    3817            0 :  call wrtout(std_out,message,"COLL")
    3818              :  ! Symmetrizing Delta(iw) is equivalent to neglecting the imaginary part of Delta(tau)
    3819            0 :  err = zero
    3820            0 :  do ifreq=1,nwlo
    3821            0 :    call symmetrize_matlu(weiss%oper(ifreq)%matlu(:),natom,err=err_)
    3822            0 :    if (err_ > err) err = err_
    3823              :  end do ! ifreq
    3824            0 :  do i=2,weiss%nmoments-1
    3825            0 :    call symmetrize_matlu(weiss%moments(i)%matlu(:),natom,err=err_)
    3826            0 :    if (err_ > err) err = err_
    3827              :  end do ! i
    3828            0 :  call zero_matlu(energy_level%matlu(:),natom,onlyimag=1,err=err_)
    3829            0 :  if (err_ > err) err = err_
    3830            0 :  if (err > tol) then
    3831            0 :    write(message,'(2a)') "WARNING: This is not a good approximation ; the imaginary ", &
    3832            0 :                       & "part is non negligible !"
    3833            0 :    ABI_WARNING(message)
    3834              :  end if ! err>tol
    3835              : #endif
    3836              : 
    3837            0 :  err = zero
    3838            0 :  if ((.not. rot_inv) .or. (.not. off_diag)) then
    3839            0 :    call zero_matlu(energy_level%matlu(:),natom,onlynondiag=1,err=err_)
    3840            0 :    if (err_ > err) err = err_
    3841              :  end if
    3842              : 
    3843            0 :  if (.not. off_diag) then
    3844            0 :    write(message,'(a,3x,2a)') ch10,"== The off-diagonal elements of the hybridization ", &
    3845            0 :                             & "and the electronic levels are now set to 0"
    3846            0 :    call wrtout(std_out,message,"COLL")
    3847            0 :    do ifreq=1,nwlo
    3848            0 :      call zero_matlu(weiss%oper(ifreq)%matlu(:),natom,onlynondiag=1,err=err_)
    3849            0 :      if (err_ > err) err = err_
    3850              :    end do ! ifreq
    3851            0 :    do i=2,weiss%nmoments-1
    3852            0 :      call zero_matlu(weiss%moments(i)%matlu(:),natom,onlynondiag=1,err=err_)
    3853            0 :      if (err_ > err) err = err_
    3854              :    end do ! i
    3855            0 :    if (err > tol) then
    3856            0 :      write(message,'(2a)') "WARNING: This is not a good approximation ; the off-diagonal ", &
    3857            0 :                          & "elements are non negligible !"
    3858            0 :      ABI_WARNING(message)
    3859              :    end if ! err>tol
    3860              :  end if ! not off_diag
    3861              : 
    3862              :  ! Prepare DLR frequencies
    3863            0 :  if (.not. leg_measure) then
    3864            0 :    wdlr_size = 1000 ! make sure this is big enough
    3865            0 :    ABI_MALLOC(wdlr_tmp,(wdlr_size))
    3866            0 :    ndlr_ptr = C_LOC(ndlr)
    3867            0 :    wdlr_ptr = C_LOC(wdlr_tmp)
    3868              : #if defined HAVE_TRIQS_INTERNAL || defined HAVE_TRIQS_v3_2
    3869              :    call build_dlr(wdlr_size,ndlr_ptr,wdlr_ptr,paw_dmft%dmft_triqs_lambda,paw_dmft%dmft_triqs_epsilon)
    3870              : #endif
    3871            0 :    if (ndlr > wdlr_size) then
    3872            0 :      write(message,'(a,i4,2a)') "You have more than ",wdlr_size," DLR frequencies.", &
    3873            0 :                     & " Something is wrong here."
    3874            0 :      ABI_ERROR(message)
    3875              :    end if
    3876              : 
    3877            0 :    ABI_MALLOC(wdlr,(ndlr))
    3878            0 :    ABI_MALLOC(wdlr_beta,(ndlr,4))
    3879            0 :    wdlr(:) = wdlr_tmp(1:ndlr)
    3880            0 :    wdlr_beta(:,1) = wdlr(:) / beta
    3881            0 :    do i=2,4
    3882            0 :      wdlr_beta(:,i) = wdlr_beta(:,i-1) * wdlr_beta(:,1)
    3883              :    end do
    3884            0 :    ABI_FREE(wdlr_tmp)
    3885            0 :    ABI_MALLOC(adlr,(ndlr,ntau))
    3886            0 :    ABI_MALLOC(adlr_iw,(ndlr,nwlo))
    3887              : 
    3888            0 :    do ifreq=1,nwlo
    3889            0 :      do iw=1,ndlr
    3890            0 :        adlr_iw(iw,ifreq) = k_iw(paw_dmft%omega_lo(ifreq),wdlr_beta(iw,1))
    3891              :      end do ! iw
    3892              :    end do ! ifreq
    3893              : 
    3894            0 :    do itau=1,ntau
    3895            0 :      do iw=1,ndlr
    3896            0 :        adlr(iw,itau) = k_it(dble(itau-1)/dble(ntau-1),wdlr(iw))
    3897              :      end do ! iw
    3898              :    end do ! itau
    3899              : 
    3900            0 :    write(tag_at,'(i4)') ndlr
    3901            0 :    write(message,'(a,3x,3a)') ch10,"== There are ",trim(adjustl(tag_at))," DLR frequencies"
    3902            0 :    call wrtout(std_out,message,"COLL")
    3903            0 :    write(message,'(3x,1000(e10.3,2x))') wdlr_beta(:,1)
    3904            0 :    call wrtout(std_out,message,"COLL")
    3905            0 :    call identity_oper(green%moments(1),2)
    3906              :  end if ! not leg_measure
    3907              : 
    3908              :  ! ntot is total number of lambda pts, + 1 is because we add the case lambda = 1 (which has no reason to be included in the
    3909              :  ! Gauss-Legendre grid), since we need it for the rest of the SCF calculation
    3910            0 :  ntot = merge(ngauss*nsub+1,1,integral>0.and.entropy)
    3911              : 
    3912            0 :  ABI_MALLOC(elam_list,(ntot))
    3913            0 :  ABI_MALLOC(lam_list,(ntot)) ! scaling factors of U matrix for thermodynamic integration
    3914            0 :  lam_list(ntot) = one
    3915            0 :  green%integral = zero
    3916            0 :  green%ekin_imp = zero
    3917              : 
    3918              :  ! Prepare Gauss-Legendre quadrature for thermodynamic integration over U
    3919            0 :  if (integral > 0 .and. entropy) then
    3920              : 
    3921            0 :    ABI_MALLOC(tweights,(ngauss))
    3922            0 :    ABI_MALLOC(tpoints,(ngauss))
    3923              : 
    3924              :    ! Calculation of Gauss-Legendre grid (on [-1,1]) of size ngauss
    3925            0 :    call coeffs_gausslegint(-one,one,tpoints(:),tweights(:),ngauss)
    3926              : 
    3927            0 :    dx = one / dble(nsub)
    3928              : 
    3929              :    ! Split [0,1] into nsub intervals [x_i,x_{i+1}],i=1,nsub with x_i=(i-1)*dx
    3930            0 :    do isub=1,nsub
    3931              :      ! For each interval, the Gauss-Legendre grid of size ngauss is mapped from the
    3932              :      ! t-world where t in [-1,1] to the x-world where x in [x_{isub},x_{isub+1}]
    3933            0 :      lam_list((isub-1)*ngauss+1:isub*ngauss) = (dble(isub)*two+tpoints(:)-one) * dx * half
    3934              :    end do ! ilam
    3935              : 
    3936              :  end if ! integral and entropy
    3937              : 
    3938              :  ! Build most optimal block structure in CTQMC basis
    3939            0 :  write(message,'(a,3x,2a)') ch10,"== Searching for the most optimal block structure of", &
    3940            0 :                            & " the electronic levels and the hybridization"
    3941            0 :  call wrtout(std_out,message,"COLL")
    3942              : 
    3943              :  call find_block_structure(paw_dmft,block_list(:,:),inner_list(:,:),flavor_list(:,:,:), &
    3944            0 :                & siz_block(:,:),nblocks(:),energy_level%matlu(:),natom,nflavor_max,hyb=weiss)
    3945              : 
    3946            0 :  nmoments = weiss%nmoments - 2
    3947              : 
    3948              :   ! Inverse Fourier transform of the hybridization
    3949            0 :  call fourier_inv(paw_dmft,nmoments,ntau,ftau(:),weiss%oper(:),weiss%moments(2:nmoments+1))
    3950              : 
    3951            0 :  if (entropy) then
    3952            0 :    ABI_MALLOC(emig,(natom))
    3953              :    ! Cubic splines to compute the derivative of Delta(iw)
    3954            0 :    call initialize_self(hybmwdhyb,paw_dmft,opt_moments=1)
    3955            0 :    call cubic_spline()
    3956            0 :    call copy_matlu(energy_level%matlu(:),hybmwdhyb%moments(1)%matlu(:),natom)
    3957            0 :    do i=2,weiss%nmoments-1
    3958            0 :      call copy_matlu(weiss%moments(i)%matlu(:),hybmwdhyb%moments(i)%matlu(:),natom)
    3959            0 :      call fac_matlu(hybmwdhyb%moments(i)%matlu(:),natom,cmplx(dble(i),zero,kind=dp))
    3960              :    end do ! i
    3961              :  end if ! entropy
    3962              : 
    3963              :  ! Solve impurity model for each atom
    3964            0 :  do iatom=1,natom
    3965              : 
    3966            0 :    lpawu = paw_dmft%lpawu(iatom)
    3967            0 :    if (lpawu == -1) cycle
    3968            0 :    ndim    = 2*lpawu + 1
    3969            0 :    tndim   = nspinor * ndim
    3970            0 :    nflavor = 2 * ndim
    3971              : 
    3972              :    !Local Spin-Spin correlation function
    3973            0 :    if (paw_dmft%dmft_triqs_chiloc > 0) then
    3974              : 
    3975              :      ! == slm case : \hat{S_z} = n_up - n_down
    3976            0 :      ABI_MALLOC(chiloc_tmp,(1:ntau,1:ntau))
    3977            0 :      chiloc_ptr = C_LOC(chiloc_tmp)
    3978              : 
    3979              :      !  == Mj case : \hat{J_z} = n_mj * \mu_mjz
    3980            0 :      if(nspinor .eq. 2 .and. basis .eq. 4) then
    3981            0 :        magmom_ptr = C_NULL_PTR
    3982              : 
    3983            0 :        ABI_MALLOC(magmom_tot,(natom))
    3984            0 :        ABI_MALLOC(matlumag_tot,(natom))
    3985              : 
    3986            0 :        lpawu = paw_dmft%lpawu(iatom)
    3987            0 :        if (lpawu == -1) cycle
    3988            0 :          ABI_MALLOC(magmom_tot(iatom)%value,(2*(2*lpawu+1),2*(2*lpawu+1)))
    3989            0 :          magmom_tot(iatom)%value=czero
    3990              : 
    3991            0 :        call init_matlu(natom=1,nspinor=paw_dmft%nspinor,nsppol=paw_dmft%nsppol,lpawu_natom=paw_dmft%lpawu,matlu=matlumag_tot)    
    3992            0 :        call zero_matlu(matlumag_tot,natom=1)                                                                                     
    3993            0 :        call magmomjmj_matlu(matlumag_tot,natom=1)                                                                                
    3994            0 :        call gather_matlu(matlumag_tot,magmom_tot,natom=1,option=1,prtopt=0)                                                      
    3995            0 :        call destroy_matlu(matlumag_tot,natom=1)
    3996              :        !
    3997            0 :        ABI_MALLOC(magmom_array,(nflavor*nflavor))
    3998            0 :        magmom_array(:) = zero
    3999            0 :        magmom_array = reshape(real(magmom_tot(iatom)%value), (/nflavor*nflavor/))
    4000            0 :        magmom_ptr = C_LOC(magmom_array)
    4001              :      end if  
    4002              :    end if !end chiloc
    4003              : 
    4004            0 :    write(tag_at,'(i4)') iatom
    4005            0 :    write(tag_block,'(i2)') nblocks(iatom)
    4006            0 :    write(message,'(a,3x,6a)') ch10,"== Solving impurity model for atom ",trim(adjustl(tag_at)), &
    4007            0 :                             & ", where there are ",trim(adjustl(tag_block))," blocks",ch10
    4008            0 :    call wrtout(std_out,message,'COLL')
    4009              : 
    4010            0 :    do iblock=1,nblocks(iatom)
    4011            0 :      write(tag_block,'(i2)') iblock - 1
    4012            0 :      tag_block2 = ""
    4013            0 :      do iflavor=1,siz_block(iblock,iatom)
    4014            0 :        write(tag_block3,'(i2)') flavor_list(iflavor,iblock,iatom)
    4015            0 :        tag_block2 = trim(tag_block2) // " " // trim(adjustl(tag_block3))
    4016              :      end do ! iflavor
    4017            0 :      tag_block4 = ""
    4018            0 :      if (siz_block(iblock,iatom) > 1) tag_block4 = "s"
    4019            0 :      write(message,'(2x,4a,1x,a)') "--> Block ",trim(adjustl(tag_block))," contains flavor",trim(adjustl(tag_block4)),trim(adjustl(tag_block2))
    4020            0 :      call wrtout(std_out,message,'COLL')
    4021              :    end do ! iblock
    4022              : 
    4023            0 :    write(message,'(a,3x,2a)') ch10,"== Schematic of the block structure",ch10
    4024            0 :    call wrtout(std_out,message,'COLL')
    4025              : 
    4026            0 :    iflavor = 1
    4027            0 :    do iblock=1,nblocks(iatom)
    4028            0 :      do iflavor1=1,siz_block(iblock,iatom)
    4029            0 :        tag_block2 = ""
    4030            0 :        do iflavor2=1,iflavor-1
    4031            0 :          tag_block2 = trim(tag_block2) // "  ."
    4032              :        end do ! iflavor2
    4033            0 :        do iflavor2=1,iflavor1-1
    4034            0 :          tag_block2 = trim(tag_block2) // "  x"
    4035              :        end do ! iflavor2
    4036            0 :        write(tag_block,'(i2)') flavor_list(iflavor1,iblock,iatom)
    4037            0 :        i = merge(1,2,flavor_list(iflavor1,iblock,iatom)>=10)
    4038            0 :        tag_block2 = trim(tag_block2) // repeat(" ",i) // trim(adjustl(tag_block))
    4039            0 :        do iflavor2=iflavor1+1,siz_block(iblock,iatom)
    4040            0 :          tag_block2 = trim(tag_block2) // "  x"
    4041              :        end do ! iflavor2
    4042            0 :        do iflavor2=iflavor+siz_block(iblock,iatom),nflavor
    4043            0 :          tag_block2 = trim(tag_block2) // "  ."
    4044              :        end do ! iflavor2
    4045            0 :        write(message,'(4x,a)') tag_block2
    4046            0 :        call wrtout(std_out,message,'COLL')
    4047              :      end do ! iflavor1
    4048            0 :      iflavor = iflavor + siz_block(iblock,iatom)
    4049              :    end do ! iblock
    4050              : 
    4051            0 :    call int2char4(iatom,tag_at)
    4052            0 :    ABI_CHECK((tag_at(1:1)/='#'),'Bug: string length too short!')
    4053              : 
    4054            0 :    if (myproc == 0 .and. off_diag) then
    4055              : 
    4056            0 :      if (open_file(trim(paw_dmft%filapp)//"_Hybridization_offdiag_iatom"//tag_at//".dat",message,newunit=unt) /= 0) ABI_ERROR(message)
    4057            0 :      write(unt,'(6a)') "# Off-diagonal components of Delta(tau) in the CTQMC basis",ch10, &
    4058            0 :                      & "# Columns are ordered this way:",ch10, &
    4059            0 :                      & "# Imaginary Time     ((Re(Delta_{ij}) Im(Delta_{ij}),i=1,2*(2*l+1)),j=1,2*(2*l+1)) where the", &
    4060            0 :                      & " leftmost index varies first"
    4061              : 
    4062            0 :      do itau=1,ntau
    4063            0 :        write(unt,'(2x,393(e18.10e3,2x))') beta*dble(itau-1)/dble(ntau-1), &
    4064            0 :           & ((dble(ftau(iatom)%mat(im,im1,itau)),aimag(ftau(iatom)%mat(im,im1,itau)),im=1,nflavor),im1=1,nflavor)
    4065              :      end do ! itau
    4066            0 :      close(unt)
    4067              : 
    4068              :    end if ! myproc=0
    4069              : 
    4070            0 :    if (myproc == 0) then
    4071              : 
    4072            0 :      if (open_file(trim(paw_dmft%filapp)//"_Hybridization_diag_iatom"//tag_at//".dat",message,newunit=unt) /= 0) ABI_ERROR(message)
    4073            0 :      write(unt,'(5a)') "# Diagonal components of Delta(tau) in the CTQMC basis",ch10, &
    4074            0 :                      & "# Columns are ordered this way:",ch10, &
    4075            0 :                      & "# Imaginary Time     (Delta_{ii},i=1,2*(2*l+1))"
    4076              : 
    4077            0 :      do itau=1,ntau
    4078            0 :        write(unt,'(2x,393(e25.17e3,2x))') beta*dble(itau-1)/dble(ntau-1),(dble(ftau(iatom)%mat(im,im,itau)),im=1,nflavor)
    4079              :      end do ! itau
    4080            0 :      close(unt)
    4081              : 
    4082              :    end if ! myproc=0
    4083              : 
    4084            0 :    ABI_MALLOC(levels_ctqmc,(nflavor,nflavor))
    4085            0 :    ABI_MALLOC(gtau,(ntau,nflavor,nflavor))
    4086            0 :    gtau(:,:,:) = czero
    4087            0 :    if (density_matrix) then
    4088            0 :      ABI_MALLOC(occ,(nflavor))
    4089              :    end if
    4090            0 :    if ((.not. leg_measure) .and. density_matrix) then
    4091            0 :      ABI_MALLOC(moments_self_1,(nflavor))
    4092            0 :      ABI_MALLOC(moments_self_2,(nflavor))
    4093              :    end if
    4094              :    if (leg_measure) then
    4095            0 :      ABI_MALLOC(gl,(nleg,nflavor,nflavor))
    4096            0 :      gl(:,:,:) = czero
    4097              :    end if
    4098            0 :    ABI_MALLOC(flavor_tmp,(nflavor,nflavor))
    4099              : 
    4100            0 :    levels_ctqmc(:,:) = czero
    4101            0 :    do isppol=1,nsppol
    4102              :      levels_ctqmc(1+(isppol-1)*ndim:tndim+(isppol-1)*ndim,1+(isppol-1)*ndim:tndim+(isppol-1)*ndim) = &
    4103            0 :         & energy_level%matlu(iatom)%mat(:,:,isppol)
    4104            0 :      if (nsppol == 1 .and. nspinor == 1) levels_ctqmc(1+ndim:2*ndim,1+ndim:2*ndim) = levels_ctqmc(1:ndim,1:ndim)
    4105              :    end do ! isppol
    4106              : 
    4107              :    ! Need to slice flavor_list to make it size nflavor*nflavor instead of size nflavor_max*nflavor_max
    4108            0 :    flavor_tmp(:,:) = flavor_list(1:nflavor,1:nflavor,iatom)
    4109              : 
    4110            0 :    block_ptr       = C_LOC(block_list(:,iatom))
    4111            0 :    eu_ptr          = C_LOC(eu)
    4112            0 :    flavor_ptr      = C_LOC(flavor_tmp(:,:))
    4113            0 :    fname_data_ptr  = C_LOC(fname_data)
    4114            0 :    fname_dataw_ptr = C_LOC(fname_dataw)
    4115            0 :    fname_histo_ptr = C_LOC(fname_histo)
    4116            0 :    ftau_ptr        = C_LOC(ftau(iatom)%mat(:,:,:))
    4117            0 :    gl_ptr          = C_LOC(gl(:,:,:))
    4118            0 :    gtau_ptr        = C_LOC(gtau(:,:,:))
    4119            0 :    inner_ptr       = C_LOC(inner_list(:,iatom))
    4120            0 :    levels_ptr      = C_LOC(levels_ctqmc(:,:))
    4121            0 :    mself_1_ptr     = C_LOC(moments_self_1(:))
    4122            0 :    mself_2_ptr     = C_LOC(moments_self_2(:))
    4123            0 :    occ_ptr         = C_LOC(occ(:))
    4124            0 :    siz_ptr         = C_LOC(siz_block(:,iatom))
    4125            0 :    udens_ptr       = C_LOC(udens_rot(iatom)%mat(:,:,1))
    4126            0 :    vee_ptr         = C_LOC(vee_rot(iatom)%mat(:,:,:,:))
    4127              : 
    4128            0 :    verbo = 1
    4129              : 
    4130            0 :    do ilam=1,ntot
    4131              : 
    4132            0 :      if (ilam /= ntot) then
    4133            0 :        write(message,'(a,3x,a,f6.4,a)') ch10,"== Thermodynamic integration over interaction for lambda= ",lam_list(ilam),ch10
    4134            0 :        call wrtout(std_out,message,'COLL')
    4135              : 
    4136              :        ! Integrate over diagonal electronic levels
    4137            0 :        do isppol=1,nsppol
    4138            0 :          do im=1,tndim
    4139            0 :            iflavor = im + (isppol-1)*ndim
    4140            0 :            levels_ctqmc(iflavor,iflavor) = energy_level%matlu(iatom)%mat(im,im,isppol) + (lam_list(ilam)-one)*shift_mu
    4141            0 :            if (nsppol == 1 .and. nspinor == 1) levels_ctqmc(iflavor+ndim,iflavor+ndim) = levels_ctqmc(iflavor,iflavor)
    4142              :          end do ! im
    4143              :        end do ! isppol
    4144              : 
    4145              :      end if ! ilam/=ntot
    4146              : 
    4147            0 :      if (ilam == ntot .and. entropy .and. integral == 1) then
    4148            0 :        do isppol=1,nsppol
    4149            0 :          do im=1,tndim
    4150            0 :            iflavor = im + (isppol-1)*ndim
    4151            0 :            levels_ctqmc(iflavor,iflavor) = energy_level%matlu(iatom)%mat(im,im,isppol)
    4152            0 :            if (nsppol == 1 .and. nspinor == 1) levels_ctqmc(iflavor+ndim,iflavor+ndim) = levels_ctqmc(iflavor,iflavor)
    4153              :          end do ! im
    4154              :        end do ! isppol
    4155              :      end if
    4156              : 
    4157            0 :      if (ilam == 2) verbo = 0
    4158              : 
    4159            0 :      if (ilam < 10) then
    4160            0 :        write(tag_lam,'("0",i1)') ilam
    4161              :      else
    4162            0 :        write(tag_lam,'(i2)') ilam
    4163              :      end if
    4164              : 
    4165            0 :      tag_lam2 = ""
    4166            0 :      if (ilam /= ntot) tag_lam2 = "_ilam" // tag_lam
    4167              : 
    4168            0 :      read_data = paw_dmft%dmft_triqs_read_ctqmcdata
    4169            0 :      stringfile = "_iatom" // tag_at // trim(adjustl(tag_lam2)) // ".h5"
    4170              : 
    4171            0 :      if (paw_dmft%idmftloop == 1) then
    4172            0 :        read_data = 0
    4173              :        if (paw_dmft%dmft_triqs_read_ctqmcdata == 1 .and. paw_dmft%ireadctqmcdata == 1) read_data = 1
    4174            0 :        fname_data = trim(adjustl(paw_dmft%filctqmcdatain)) // stringfile
    4175              :      else
    4176            0 :        fname_data = trim(adjustl(paw_dmft%filapp)) // "_CTQMC_DATA" // stringfile
    4177              :      end if
    4178            0 :      len_t = len(trim(adjustl(fname_data))) + 1
    4179            0 :      fname_data(len_t:len_t) = c_null_char
    4180              : 
    4181            0 :      fname_dataw = trim(adjustl(paw_dmft%filapp)) // "_CTQMC_DATA" // stringfile
    4182            0 :      len_t = len(trim(adjustl(fname_dataw))) + 1
    4183            0 :      fname_dataw(len_t:len_t) = c_null_char
    4184              : 
    4185            0 :      fname_histo = trim(adjustl(paw_dmft%filapp)) // "_CTQMC_HISTOGRAM_iatom" // tag_at // trim(adjustl(tag_lam2)) // ".dat"
    4186            0 :      len_t = len(trim(adjustl(fname_histo))) + 1
    4187            0 :      fname_histo(len_t:len_t) = c_null_char
    4188              : 
    4189            0 :      call flush_unit(std_out)
    4190              : 
    4191              : #if defined HAVE_TRIQS_INTERNAL || defined HAVE_TRIQS_v3_2
    4192              :      call Ctqmc_triqs_run(rot_inv,leg_measure,paw_dmft%dmft_triqs_move_shift,paw_dmft%dmft_triqs_move_double, &
    4193              :                         & density_matrix,paw_dmft%dmft_triqs_time_invariance,paw_dmft%dmft_triqs_use_norm_as_weight, &
    4194              :                         & debug,merge(integral,0,ilam/=ntot),paw_dmft%dmft_triqs_loc_n_min,paw_dmft%dmft_triqs_loc_n_max, &
    4195              :                         & paw_dmft%dmft_triqs_seed_a,paw_dmft%dmft_triqs_seed_b,nflavor,ntau,nleg, &
    4196              :                         & paw_dmft%dmft_triqs_n_cycles,paw_dmft%dmftctqmc_meas,paw_dmft%dmftqmc_therm, &
    4197              :                         & paw_dmft%dmft_triqs_therm_restart,paw_dmft%dmft_triqs_det_init_size, &
    4198              :                         & paw_dmft%dmft_triqs_det_n_operations_before_check,myproc,nblocks(iatom),read_data,verbo, &
    4199              :                           & paw_dmft%dmft_triqs_chiloc,paw_dmft%dmft_triqs_chiloc_ins,beta,paw_dmft%dmft_triqs_imag_threshold, &
    4200              :                         & paw_dmft%dmft_triqs_det_precision_warning, &
    4201              :                         & paw_dmft%dmft_triqs_det_precision_error,paw_dmft%dmft_triqs_det_singular_threshold,lam_list(ilam), &
    4202              :                          & paw_dmft%dmft_triqs_pauli_prob,chiloc_ptr,magmom_ptr,block_ptr,flavor_ptr,inner_ptr,siz_ptr,ftau_ptr,gtau_ptr,gl_ptr, &
    4203              :                         & udens_ptr,vee_ptr,levels_ptr,mself_1_ptr,mself_2_ptr,occ_ptr,eu_ptr,fname_data_ptr,fname_dataw_ptr, &
    4204              :                         & fname_histo_ptr)
    4205              : #endif
    4206              : 
    4207            0 :      call flush_unit(std_out)
    4208              : 
    4209            0 :      if (ilam == ntot .or. debug) then
    4210              : 
    4211            0 :        do isppol=1,nsppol
    4212            0 :          if (nsppol == 1 .and. nspinor == 1) then
    4213            0 :            green%oper_tau(1)%matlu(iatom)%mat(:,:,isppol) = (gtau(1,1:ndim,1:ndim)+gtau(1,ndim+1:2*ndim,ndim+1:2*ndim)) * half
    4214              :          else
    4215            0 :            green%oper_tau(1)%matlu(iatom)%mat(:,:,isppol) = gtau(1,1+(isppol-1)*ndim:tndim+(isppol-1)*ndim,1+(isppol-1)*ndim:tndim+(isppol-1)*ndim)
    4216              :          end if
    4217              :        end do ! isppol
    4218              : 
    4219            0 :        if ((.not. leg_measure) .and. density_matrix .and. ilam == ntot) then
    4220              : 
    4221              :          ! Constrain the occupations and high-frequency moments with the more accurate values sampled from the CTQMC
    4222              : 
    4223            0 :          do isppol=1,nsppol
    4224            0 :            do im=1,tndim
    4225            0 :              iflavor = im + (isppol-1)*ndim
    4226              : 
    4227            0 :              if (nsppol == 1 .and. nspinor == 1) then
    4228            0 :                mself_1 = (moments_self_1(iflavor)+moments_self_1(iflavor+ndim)) * half
    4229            0 :                mself_2 = (moments_self_2(iflavor)+moments_self_2(iflavor+ndim)) * half
    4230              :              else
    4231            0 :                mself_1 = moments_self_1(iflavor)
    4232            0 :                mself_2 = moments_self_2(iflavor)
    4233              :              end if
    4234              : 
    4235            0 :              green%moments(2)%matlu(iatom)%mat(im,im,isppol) = energy_level%matlu(iatom)%mat(im,im,isppol) + mself_1
    4236            0 :              green%moments(3)%matlu(iatom)%mat(im,im,isppol) = weiss%moments(2)%matlu(iatom)%mat(im,im,isppol) + mself_2
    4237              : 
    4238              :            end do ! im
    4239              : 
    4240              :            ! Use matmul in prevision of the day where the off-diagonal density matrix will be available
    4241              :            green%moments(3)%matlu(iatom)%mat(:,:,isppol) = green%moments(3)%matlu(iatom)%mat(:,:,isppol) + &
    4242            0 :              & matmul(green%moments(2)%matlu(iatom)%mat(:,:,isppol),green%moments(2)%matlu(iatom)%mat(:,:,isppol))
    4243              : 
    4244              :          end do ! isppol
    4245              : 
    4246              :        end if ! not leg and density_matrix
    4247              : 
    4248            0 :        if (density_matrix) then
    4249              : 
    4250            0 :          green%ecorr_qmc(iatom) = dble(eu)
    4251              : 
    4252            0 :          do isppol=1,nsppol
    4253            0 :            do im=1,tndim
    4254            0 :              iflavor = im + (isppol-1)*ndim
    4255              : 
    4256            0 :              if (nsppol == 1 .and. nspinor == 1) then
    4257            0 :                occ_tmp = (occ(iflavor)+occ(iflavor+ndim)) * half
    4258              :              else
    4259            0 :                occ_tmp = occ(iflavor)
    4260              :              end if
    4261              : 
    4262            0 :              green%oper_tau(1)%matlu(iatom)%mat(im,im,isppol) = occ_tmp - cone
    4263              : 
    4264              :            end do ! im
    4265              :          end do ! isppol
    4266              : 
    4267              :        end if ! density_matrix
    4268              : 
    4269            0 :        if (ilam < ntot) then
    4270            0 :          call occup_green_tau(green)
    4271              : 
    4272            0 :          write(message,'(a,3x,a)') ch10,"== Print Occupation matrix in CTQMC basis"
    4273            0 :          call wrtout(std_out,message,"COLL")
    4274            0 :          call print_matlu(green%occup_tau%matlu(:),natom,1)
    4275              :        end if
    4276              : 
    4277            0 :        if (leg_measure) then
    4278              : 
    4279            0 :          ABI_MALLOC(gl_tmp,(nleg,tndim,tndim,nsppol))
    4280            0 :          ABI_MALLOC(jbes,(nleg))
    4281              : 
    4282            0 :          gl_tmp(:,:,:,:) = czero
    4283              : 
    4284            0 :          do ifreq=1,nwlo
    4285            0 :            green%oper(ifreq)%matlu(iatom)%mat(:,:,:) = czero
    4286            0 :            xx = dble(2*ifreq-1) * pi / two
    4287            0 :            if (xx <= dble(100)) then
    4288            0 :              call sbf8(nleg,xx,jbes(:))
    4289              :            end if
    4290            0 :            do isppol=1,nsppol
    4291            0 :              do im1=1,tndim
    4292            0 :                iflavor1 = im1 + (isppol-1)*ndim
    4293            0 :                do im=1,tndim
    4294            0 :                  iflavor = im + (isppol-1)*ndim
    4295            0 :                  do ileg=1,nleg
    4296            0 :                    if (xx >= dble(99)) then
    4297            0 :                      call jbessel(jbes(ileg),besp,bespp,ileg-1,1,xx)
    4298              :                    end if
    4299            0 :                    u_nl = sqrt(dble(2*ileg-1))*(-1)**(ifreq-1)*(j_dpc**(ileg))*jbes(ileg)
    4300            0 :                    if (nsppol == 1 .and. nspinor == 1) then
    4301              :                      gl_tmp(ileg,im,im1,isppol) = &
    4302            0 :                        & (gl(ileg,iflavor,iflavor1)+gl(ileg,iflavor+ndim,iflavor1+ndim))*half
    4303              :                    else
    4304            0 :                      gl_tmp(ileg,im,im1,isppol) = gl(ileg,iflavor,iflavor1)
    4305              :                    end if
    4306              :                    green%oper(ifreq)%matlu(iatom)%mat(im,im1,isppol) = &
    4307              :                      & green%oper(ifreq)%matlu(iatom)%mat(im,im1,isppol) + &
    4308            0 :                      & u_nl*gl_tmp(ileg,im,im1,isppol)
    4309              :                  end do ! ileg
    4310              :                end do ! im
    4311              :              end do ! im1
    4312              :            end do ! isppol
    4313              :          end do ! ifreq
    4314              : 
    4315            0 :          ABI_FREE(jbes)
    4316              : 
    4317            0 :          ABI_MALLOC(gtau_leg,(ntau,nflavor,nflavor))
    4318            0 :          ABI_MALLOC(leg_array,(nleg,ntau))
    4319              : 
    4320            0 :          do itau=1,ntau
    4321            0 :            tau  = dble(itau-1) * beta / (ntau-1)
    4322            0 :            xtau = two*tau/beta - one
    4323            0 :            leg_array(1,itau) = one
    4324            0 :            leg_array(2,itau) = xtau
    4325            0 :            do ileg=3,nleg
    4326              :              leg_array(ileg,itau) = (dble(2*(ileg-2)+1)*xtau*leg_array(ileg-1,itau)- &
    4327            0 :                & dble(ileg-2)*leg_array(ileg-2,itau)) / dble(ileg-1)
    4328              :            end do ! ileg
    4329              :          end do ! itau
    4330              : 
    4331            0 :          gtau_leg(:,:,:) = czero
    4332            0 :          do iflavor1=1,nflavor
    4333            0 :            do iflavor=1,nflavor
    4334            0 :              do itau=1,ntau
    4335            0 :                do ileg=1,nleg
    4336              :                  gtau_leg(itau,iflavor,iflavor1) = gtau_leg(itau,iflavor,iflavor1) + &
    4337            0 :                    & gl(ileg,iflavor,iflavor1)*leg_array(ileg,itau)*sqrt(dble(2*ileg-1))/beta
    4338              :                end do ! ileg
    4339              :              end do ! itau
    4340              :            end do ! iflavor
    4341              :          end do ! iflavor1
    4342              : 
    4343            0 :          if (myproc == 0 .and. off_diag) then
    4344              : 
    4345            0 :            if (open_file(trim(paw_dmft%filapp)//"_Gtau_offdiag_Leg_iatom"//tag_at//trim(adjustl(tag_lam2))//".dat",message,newunit=unt) /= 0) ABI_ERROR(message)
    4346            0 :            write(unt,'(6a)') "# Off-diagonal components of Legendre-sampled G(tau) in the CTQMC basis",ch10, &
    4347            0 :                            & "# Columns are ordered this way:",ch10, &
    4348            0 :                            & "# Imaginary Time     ((Re(G_{ij}) Im(G_{ij}),i=1,2*(2*l+1)),j=1,2*(2*l+1)) where the", &
    4349            0 :                            & " leftmost index varies first"
    4350            0 :            do itau=1,ntau
    4351            0 :              write(unt,'(2x,393(e18.10e3,2x))') beta*dble(itau-1)/dble(ntau-1), &
    4352            0 :                & ((dble(gtau_leg(itau,im,im1)),aimag(gtau_leg(itau,im,im1)),im=1,nflavor),im1=1,nflavor)
    4353              :            end do ! itau
    4354            0 :            close(unt)
    4355              : 
    4356              :          end if ! myproc=0
    4357              : 
    4358            0 :          if (myproc == 0) then
    4359              : 
    4360            0 :            if (open_file(trim(paw_dmft%filapp)//"_Gtau_diag_Leg_iatom"//tag_at//trim(adjustl(tag_lam2))//".dat",message,newunit=unt) /= 0) ABI_ERROR(message)
    4361            0 :            write(unt,'(5a)') "# Diagonal components of Legendre-sampled G(tau) in the CTQMC basis",ch10, &
    4362            0 :                            & "# Columns are ordered this way:",ch10, &
    4363            0 :                            & "# Imaginary Time     (G_{ii},i=1,2*(2*l+1))"
    4364            0 :            do itau=1,ntau
    4365            0 :              write(unt,'(2x,393(e25.17e3,2x))') beta*dble(itau-1)/dble(ntau-1),(dble(gtau_leg(itau,im,im)),im=1,nflavor)
    4366              :            end do ! itau
    4367            0 :            close(unt)
    4368              : 
    4369              :          end if ! myproc=0
    4370              : 
    4371            0 :          ABI_FREE(gtau_leg)
    4372            0 :          ABI_FREE(leg_array)
    4373              : 
    4374            0 :          ABI_MALLOC(t_lp,(nleg,green%nmoments))
    4375              : 
    4376            0 :          fact = one ! this is equal to (p-1)!
    4377              : 
    4378              :          ! Compute analytical moments of Fourier transform of Legendre polynomial
    4379              :          ! (equation (E2) of PRB, 84(7), 2011, Boehnke et al)
    4380            0 :          do p=1,green%nmoments
    4381            0 :            if (p > 1) fact = fact * dble(p-1)
    4382            0 :            fact2 = fact
    4383            0 :            do l=0,nleg-1
    4384            0 :              if (l > 0) fact2 = fact2 * dble(l+p-1)
    4385            0 :              if (p > l+1) then
    4386            0 :                t_lp(l+1,p) = zero
    4387              :              else
    4388            0 :                if (l-p+1 > 0) fact2 = fact2 / dble(l-p+1)  ! fact2 is now equal to (l+p-1)...(l-p+2)
    4389            0 :                if (mod(p+l,2) == 0) then
    4390            0 :                  t_lp(l+1,p) = zero
    4391              :                else
    4392            0 :                  t_lp(l+1,p) = (-1)**p * two * sqrt(dble(2*l+1)) * fact2 / fact
    4393              :                end if
    4394              :              end if ! p>l+1
    4395              :            end do ! l
    4396            0 :            do isppol=1,nsppol
    4397            0 :              do im1=1,tndim
    4398            0 :                do im=1,tndim
    4399              :                  ! Do not use DOT_PRODUCT
    4400            0 :                  green%moments(p)%matlu(iatom)%mat(im,im1,isppol) = sum(t_lp(:,p)*gl_tmp(:,im,im1,isppol)) / beta**p
    4401              :                end do ! im
    4402              :              end do ! im1
    4403              :            end do ! isppol
    4404              :          end do ! p
    4405              : 
    4406            0 :          ABI_FREE(gl_tmp)
    4407            0 :          ABI_FREE(t_lp)
    4408              : 
    4409            0 :        else if (ilam == ntot) then
    4410              : 
    4411            0 :          ABI_MALLOC(gl_dlr,(ndlr,tndim,tndim,nsppol))
    4412            0 :          ABI_MALLOC(gl_dlr_re,(ndlr))
    4413            0 :          ABI_MALLOC(gl_dlr_im,(ndlr))
    4414            0 :          ABI_MALLOC(bdlr,(ntau))
    4415            0 :          ABI_MALLOC(gtau_dlr,(ntau,nflavor,nflavor))
    4416            0 :          ABI_MALLOC(moment_fit,(green%nmoments))
    4417              : 
    4418            0 :          gtau_dlr(:,:,:) = czero
    4419              : 
    4420            0 :          call fit_dlr()
    4421              : 
    4422            0 :          if (myproc == 0 .and. off_diag) then
    4423              : 
    4424            0 :            if (open_file(trim(paw_dmft%filapp)//"_Gtau_offdiag_DLR_iatom"//tag_at//trim(adjustl(tag_lam2))//".dat",message,newunit=unt) /= 0) ABI_ERROR(message)
    4425            0 :            write(unt,'(6a)') "# Off-diagonal components of DLR fit of G(tau) in the CTQMC basis",ch10, &
    4426            0 :                            & "# Columns are ordered this way:",ch10, &
    4427            0 :                            & "# Imaginary Time     ((Re(G_{ij}) Im(G_{ij}),i=1,2*(2*l+1)),j=1,2*(2*l+1)) where the", &
    4428            0 :                            & " leftmost index varies first"
    4429              : 
    4430            0 :            do itau=1,ntau
    4431            0 :              write(unt,'(2x,393(e18.10e3,2x))') beta*dble(itau-1)/dble(ntau-1), &
    4432            0 :                 & ((dble(gtau_dlr(itau,im,im1)),aimag(gtau_dlr(itau,im,im1)),im=1,nflavor),im1=1,nflavor)
    4433              :            end do ! itau
    4434            0 :            close(unt)
    4435              : 
    4436              :          end if ! myproc=0 and off_diag
    4437              : 
    4438            0 :          if (myproc == 0) then
    4439              : 
    4440            0 :            if (open_file(trim(paw_dmft%filapp)//"_Gtau_diag_DLR_iatom"//tag_at//trim(adjustl(tag_lam2))//".dat",message,newunit=unt) /= 0) ABI_ERROR(message)
    4441            0 :            write(unt,'(5a)') "# Diagonal components of DLR fit of G(tau) in the CTQMC basis",ch10, &
    4442            0 :                            & "# Columns are ordered this way:",ch10, &
    4443            0 :                            & "# Imaginary Time     (G_{ii},i=1,2*(2*l+1))"
    4444            0 :            do itau=1,ntau
    4445            0 :              write(unt,'(2x,393(e25.17e3,2x))') beta*dble(itau-1)/dble(ntau-1),(dble(gtau_dlr(itau,im,im)),im=1,nflavor)
    4446              :            end do ! itau
    4447            0 :            close(unt)
    4448              : 
    4449              :          end if ! myproc
    4450              : 
    4451            0 :          ABI_FREE(gl_dlr)
    4452            0 :          ABI_FREE(gl_dlr_re)
    4453            0 :          ABI_FREE(gl_dlr_im)
    4454            0 :          ABI_FREE(bdlr)
    4455            0 :          ABI_FREE(gtau_dlr)
    4456            0 :          ABI_FREE(moment_fit)
    4457              : 
    4458              :        end if ! leg_measure
    4459              : 
    4460            0 :        if (myproc == 0 .and. paw_dmft%dmft_triqs_chiloc > 0) then
    4461            0 :          if (open_file(trim(paw_dmft%filapp)//"_LocalSusceptibility.dat",message,newunit=unt,status='unknown',form='formatted') /= 0) ABI_ERROR(message)
    4462            0 :          do itau=1,ntau
    4463            0 :            write(unt,*) beta * DBLE(itau-1) / DBLE(ntau), (chiloc_tmp(itau,1))
    4464              :          end do
    4465            0 :          close(unt)
    4466              :        end if
    4467              : 
    4468            0 :        if (myproc == 0 .and. off_diag) then
    4469              : 
    4470            0 :          if (open_file(trim(paw_dmft%filapp)//"_Gtau_offdiag_iatom"//tag_at//trim(adjustl(tag_lam2))//".dat",message,newunit=unt) /= 0) ABI_ERROR(message)
    4471            0 :          write(unt,'(6a)') "# Off-diagonal components of binned G(tau) in the CTQMC basis",ch10, &
    4472            0 :                          & "# Columns are ordered this way:",ch10, &
    4473            0 :                          & "# Imaginary Time     ((Re(G_{ij}) Im(G_{ij}),i=1,2*(2*l+1)),j=1,2*(2*l+1)) where the", &
    4474            0 :                          & " leftmost index varies first"
    4475              : 
    4476            0 :          do itau=1,ntau
    4477            0 :            write(unt,'(2x,393(e18.10e3,2x))') beta*dble(itau-1)/dble(ntau-1), &
    4478            0 :                 & ((dble(gtau(itau,im,im1)),aimag(gtau(itau,im,im1)),im=1,nflavor),im1=1,nflavor)
    4479              :          end do ! itau
    4480            0 :          close(unt)
    4481              : 
    4482              :        end if ! myproc
    4483              : 
    4484            0 :        if (myproc == 0) then
    4485              : 
    4486            0 :          if (open_file(trim(paw_dmft%filapp)//"_Gtau_diag_iatom"//tag_at//trim(adjustl(tag_lam2))//".dat",message,newunit=unt) /= 0) ABI_ERROR(message)
    4487            0 :          write(unt,'(5a)') "# Diagonal components of binned G(tau) in the CTQMC basis",ch10, &
    4488            0 :                          & "# Columns are ordered this way:",ch10, &
    4489            0 :                          & "# Imaginary Time     (G_{ii},i=1,2*(2*l+1))"
    4490            0 :          do itau=1,ntau
    4491            0 :            write(unt,'(2x,393(e25.17e3,2x))') beta*dble(itau-1)/dble(ntau-1),(dble(gtau(itau,im,im)),im=1,nflavor)
    4492              :          end do ! itau
    4493            0 :          close(unt)
    4494              : 
    4495              :        end if ! myproc
    4496              : 
    4497            0 :        if (entropy .and. ilam == ntot) then
    4498              : 
    4499            0 :          call compute_migdal_energy(emig(:),emig_tot,green,paw_dmft,hybmwdhyb,iatom=iatom)
    4500            0 :          green%ekin_imp = green%ekin_imp + two*emig_tot
    4501              : 
    4502              :        end if ! entropy
    4503              : 
    4504              :      end if ! ilam=ntot or debug
    4505              : 
    4506            0 :      if (integral > 0 .and. ilam < ntot .and. entropy) then
    4507              : 
    4508            0 :        elam = dble(eu)
    4509              : 
    4510            0 :        do isppol=1,nsppol
    4511            0 :          do im=1,tndim
    4512            0 :            iflavor = im + (isppol-1)*ndim
    4513              : 
    4514            0 :            if (nsppol == 1 .and. nspinor == 1) then
    4515            0 :              occ_tmp = occ(iflavor) + occ(iflavor+ndim)
    4516              :            else
    4517            0 :              occ_tmp = occ(iflavor)
    4518              :            end if
    4519            0 :            elam = elam + dble(shift_mu*occ_tmp)
    4520              :          end do ! im
    4521              :        end do ! isppol
    4522              : 
    4523            0 :        i = mod(ilam-1,ngauss) + 1
    4524            0 :        green%integral = green%integral + tweights(i)*elam*dx*half
    4525            0 :        elam_list(ilam) = elam
    4526              : 
    4527              :      end if ! integral and ilam<ntot and entropy
    4528              : 
    4529            0 :      if (integral > 0 .and. ilam == ntot-1 .and. entropy) then
    4530            0 :        write(message,'(a,3(3x,2a),a,12x,a,6x,2a,8x,a)') ch10,repeat("=",39),ch10,"== Summary of thermodynamic integration", &
    4531            0 :             & ch10,repeat("=",39),ch10,ch10,"Lambda","<dH/dlambda>",ch10,repeat("-",29)
    4532            0 :        call wrtout(std_out,message,'COLL')
    4533            0 :        do i=1,ntot-1
    4534            0 :          write(tag_lambda,'(f14.4)') lam_list(i)
    4535            0 :          write(tag_elam,'(f14.4)') elam_list(i)
    4536            0 :          tag_lambda = adjustl(tag_lambda)
    4537            0 :          tag_elam = adjustl(tag_elam)
    4538            0 :          pad_lambda = (14-len_trim(tag_lambda)) / 2
    4539            0 :          pad_elam = (14-len_trim(tag_elam)) / 2
    4540            0 :          write(message,'(8x,2(3a,1x),a,8x,a)') repeat(" ",pad_lambda),trim(tag_lambda),repeat(" ",14-pad_lambda-len_trim(tag_lambda)), &
    4541            0 :                                              & repeat(" ",pad_elam),trim(tag_elam),repeat(" ",14-pad_elam-len_trim(tag_elam)),ch10,repeat("-",29)
    4542            0 :          call wrtout(std_out,message,'COLL')
    4543              :        end do ! i
    4544            0 :        write(message,'(a,3x,a,f10.4,a)') ch10,"--> Integral is: ",green%integral,ch10
    4545            0 :        call wrtout(std_out,message,'COLL')
    4546              :      end if ! integral and ilam=ntot-1 and entropy
    4547              : 
    4548              :    end do ! ilam
    4549              : 
    4550            0 :    ABI_FREE(flavor_tmp)
    4551            0 :    ABI_FREE(gtau)
    4552            0 :    ABI_FREE(levels_ctqmc)
    4553            0 :    ABI_SFREE(gl)
    4554            0 :    ABI_SFREE(moments_self_1)
    4555            0 :    ABI_SFREE(moments_self_2)
    4556            0 :    ABI_SFREE(occ)
    4557              : 
    4558            0 :    if (paw_dmft%dmft_triqs_chiloc > 0) then
    4559            0 :      ABI_FREE(chiloc_tmp)
    4560              :      
    4561            0 :       if (basis .eq. 4) then
    4562              :         !do iatom=1,natom                             
    4563            0 :         lpawu = paw_dmft%lpawu(iatom)              
    4564            0 :         if (lpawu == -1) cycle                     
    4565            0 :           ABI_FREE(magmom_tot(iatom)%value)          
    4566              :         !end do                                       
    4567            0 :         ABI_FREE(magmom_tot)                         
    4568            0 :         ABI_FREE(magmom_array)                       
    4569            0 :         ABI_FREE(matlumag_tot)                       
    4570            0 :         magmom_ptr = C_NULL_PTR                      
    4571              :       end if
    4572              :    end if
    4573              : 
    4574              :  end do ! iatom
    4575              : 
    4576            0 :  ABI_FREE(elam_list)
    4577            0 :  ABI_FREE(lam_list)
    4578              : 
    4579            0 :  ABI_SFREE(tweights)
    4580            0 :  ABI_SFREE(tpoints)
    4581              : 
    4582            0 :  call occup_green_tau(green)
    4583              : 
    4584            0 :  write(message,'(a,3x,a)') ch10,"== Print Occupation matrix in CTQMC basis"
    4585            0 :  call wrtout(std_out,message,"COLL")
    4586            0 :  call print_matlu(green%occup_tau%matlu(:),natom,1)
    4587              : 
    4588            0 :  if (basis > 0) then
    4589            0 :    write(message,'(a,3x,a)') ch10,"== Rotating back to cubic basis"
    4590            0 :    call wrtout(std_out,message,"COLL")
    4591              :  end if
    4592              : 
    4593              :  ! Build back Weiss field
    4594            0 :  do ifreq=1,nwlo
    4595            0 :    shift(:) = cmplx(zero,paw_dmft%omega_lo(ifreq),kind=dp)
    4596            0 :    call add_matlu(weiss%oper(ifreq)%matlu(:),energy_level%matlu(:),matlu_tmp(:),natom,1)
    4597            0 :    call copy_matlu(matlu_tmp(:),weiss%oper(ifreq)%matlu(:),natom)
    4598            0 :    call shift_matlu(weiss%oper(ifreq)%matlu(:),natom,shift(:))
    4599            0 :    call fac_matlu(weiss%oper(ifreq)%matlu(:),natom,-cone)
    4600              :  end do ! ifreq
    4601              : 
    4602            0 :  if (basis > 0) then
    4603            0 :    if (basis == 1 .or. basis == 2) then
    4604            0 :      call rotate_matlu(energy_level%matlu(:),eigvectmatlu(:),natom,0)
    4605            0 :    else if (basis == 4) then
    4606            0 :      call ylm2jmj_matlu(energy_level%matlu(:),natom,2,paw_dmft)
    4607              :    end if ! basis /= 3
    4608            0 :    call slm2ylm_matlu(energy_level%matlu(:),natom,paw_dmft,2,0)
    4609            0 :    do i=2,weiss%nmoments-1
    4610            0 :      if (basis == 1 .or. basis == 2) then
    4611            0 :        call rotate_matlu(weiss%moments(i)%matlu(:),eigvectmatlu(:),natom,0)
    4612            0 :      else if (basis == 4) then
    4613            0 :        call ylm2jmj_matlu(weiss%moments(i)%matlu(:),natom,2,paw_dmft)
    4614              :      end if
    4615            0 :      call slm2ylm_matlu(weiss%moments(i)%matlu(:),natom,paw_dmft,2,0)
    4616              :    end do ! i
    4617            0 :    do i=1,green%nmoments
    4618            0 :      if (basis == 1 .or. basis == 2) then
    4619            0 :        call rotate_matlu(green%moments(i)%matlu(:),eigvectmatlu(:),natom,0)
    4620            0 :      else if (basis == 4) then
    4621            0 :        call ylm2jmj_matlu(green%moments(i)%matlu(:),natom,2,paw_dmft)
    4622              :      end if
    4623            0 :      call slm2ylm_matlu(green%moments(i)%matlu(:),natom,paw_dmft,2,0)
    4624              :    end do ! i
    4625            0 :    do ifreq=1,nwlo
    4626            0 :      if (green%distrib%procf(ifreq) /= myproc) cycle
    4627            0 :      if (basis == 1 .or. basis == 2) then
    4628            0 :        call rotate_matlu(weiss%oper(ifreq)%matlu(:),eigvectmatlu(:),natom,0)
    4629            0 :        call rotate_matlu(green%oper(ifreq)%matlu(:),eigvectmatlu(:),natom,0)
    4630            0 :      else if (basis == 4) then
    4631            0 :        call ylm2jmj_matlu(weiss%oper(ifreq)%matlu(:),natom,2,paw_dmft)
    4632            0 :        call ylm2jmj_matlu(green%oper(ifreq)%matlu(:),natom,2,paw_dmft)
    4633              :      end if
    4634            0 :      call slm2ylm_matlu(weiss%oper(ifreq)%matlu(:),natom,paw_dmft,2,0)
    4635            0 :      call slm2ylm_matlu(green%oper(ifreq)%matlu(:),natom,paw_dmft,2,0)
    4636              :    end do ! ifreq
    4637            0 :    if (basis == 1 .or. basis == 2) then
    4638            0 :      call rotate_matlu(green%occup_tau%matlu(:),eigvectmatlu(:),natom,0)
    4639            0 :    else if (basis == 4) then
    4640            0 :      call ylm2jmj_matlu(green%occup_tau%matlu(:),natom,2,paw_dmft)
    4641              :    end if
    4642            0 :    call slm2ylm_matlu(green%occup_tau%matlu(:),natom,paw_dmft,2,0)
    4643              :  end if! basis > 0
    4644              : 
    4645              :  ! Since we possibly neglected some off-diagonal elements and imaginary part,
    4646              :  ! the levels and hybridization might not be symmetrized anymore
    4647            0 :  call sym_matlu(energy_level%matlu(:),paw_dmft)
    4648            0 :  do i=2,weiss%nmoments-1
    4649            0 :    call sym_matlu(weiss%moments(i)%matlu(:),paw_dmft)
    4650              :  end do ! i
    4651            0 :  do i=1,green%nmoments
    4652            0 :    call sym_matlu(green%moments(i)%matlu(:),paw_dmft)
    4653              :  end do ! i
    4654            0 :  do ifreq=1,nwlo
    4655            0 :    if (green%distrib%procf(ifreq) /= myproc) cycle
    4656            0 :    call sym_matlu(weiss%oper(ifreq)%matlu(:),paw_dmft)
    4657            0 :    call sym_matlu(green%oper(ifreq)%matlu(:),paw_dmft)
    4658              :  end do ! ifreq
    4659            0 :  call copy_matlu(green%occup_tau%matlu(:),dmat_ctqmc(:),natom)
    4660            0 :  call sym_matlu(green%occup_tau%matlu(:),paw_dmft)
    4661              : 
    4662            0 :  call diff_matlu("CTQMC occupations","Symmetrized CTQMC occupations",dmat_ctqmc(:),green%occup_tau%matlu(:),natom,0,tol4)
    4663              : 
    4664            0 :  call gather_oper(weiss%oper(:),weiss%distrib,paw_dmft,opt_ksloc=2)
    4665            0 :  call gather_oper(green%oper(:),green%distrib,paw_dmft,opt_ksloc=2)
    4666              : 
    4667            0 :  call compute_moments_loc(green,self_new,energy_level,weiss,1,opt_log=paw_dmft%dmft_triqs_entropy,shift_mu=shift_mu)
    4668              : 
    4669            0 :  if (entropy .and. integral > 0) then
    4670            0 :    call compute_trace_log_loc(weiss,paw_dmft,green%fband_weiss,opt_inv=1)
    4671              :  end if
    4672              : 
    4673            0 :  call destroy_matlu(dmat_ctqmc(:),natom)
    4674            0 :  call destroy_matlu(eigvectmatlu(:),natom)
    4675            0 :  call destroy_matlu(ftau(:),natom)
    4676            0 :  call destroy_matlu(matlu_tmp(:),natom)
    4677            0 :  call destroy_matlu(udens_rot(:),natom)
    4678              : 
    4679            0 :  call destroy_oper(energy_level)
    4680              : 
    4681            0 :  call destroy_vee(paw_dmft,vee_rot(:))
    4682              : 
    4683            0 :  ABI_FREE(block_list)
    4684            0 :  ABI_FREE(dmat_ctqmc)
    4685            0 :  ABI_FREE(eigvectmatlu)
    4686            0 :  ABI_FREE(flavor_list)
    4687            0 :  ABI_FREE(ftau)
    4688            0 :  ABI_FREE(inner_list)
    4689            0 :  ABI_FREE(matlu_tmp)
    4690            0 :  ABI_FREE(nblocks)
    4691            0 :  ABI_FREE(shift)
    4692            0 :  ABI_FREE(siz_block)
    4693            0 :  ABI_FREE(udens_rot)
    4694            0 :  ABI_FREE(vee_rot)
    4695              : 
    4696            0 :  ABI_SFREE(adlr)
    4697            0 :  ABI_SFREE(adlr_iw)
    4698            0 :  ABI_SFREE(emig)
    4699            0 :  ABI_SFREE(wdlr)
    4700            0 :  ABI_SFREE(wdlr_beta)
    4701              : 
    4702            0 :  if (entropy) then
    4703            0 :    call destroy_self(hybmwdhyb)
    4704              :  end if
    4705              : 
    4706              : contains
    4707              : 
    4708            0 : subroutine cubic_spline()
    4709              : 
    4710              : !Arguments ------------------------------------
    4711              : !Local variables ------------------------------
    4712            0 :  complex(dp), allocatable :: y(:),yp(:)
    4713              : ! ************************************************************************
    4714              : 
    4715            0 :  ABI_MALLOC(y,(nwlo))
    4716            0 :  ABI_MALLOC(yp,(nwlo))
    4717              : 
    4718            0 :  do iatom=1,natom
    4719            0 :    lpawu = paw_dmft%lpawu(iatom)
    4720            0 :    if (lpawu == -1) cycle
    4721            0 :    tndim = nspinor * (2*lpawu+1)
    4722            0 :    do isppol=1,nsppol
    4723            0 :      do im1=1,tndim
    4724            0 :        do im=1,tndim
    4725            0 :          do ifreq=1,nwlo
    4726            0 :            y(ifreq) = weiss%oper(ifreq)%matlu(iatom)%mat(im,im1,isppol)
    4727              :          end do ! ifreq
    4728              :          ! Boundary condition not-a-knot seems to get the best results
    4729            0 :          call spline2_complex(paw_dmft%omega_lo(:),y(:),nwlo,yp(:),czero,czero,3,3)
    4730            0 :          do ifreq=1,nwlo
    4731              :            hybmwdhyb%oper(ifreq)%matlu(iatom)%mat(im,im1,isppol) = &
    4732              :             & energy_level%matlu(iatom)%mat(im,im1,isppol) + y(ifreq) - &
    4733            0 :             & paw_dmft%omega_lo(ifreq)*yp(ifreq)
    4734              :          end do ! ifreq
    4735              :        end do ! im
    4736              :      end do ! im1
    4737              :    end do ! isppol
    4738              :  end do ! iatom
    4739              : 
    4740            0 :  ABI_FREE(y)
    4741            0 :  ABI_FREE(yp)
    4742              : 
    4743            0 : end subroutine cubic_spline
    4744              : 
    4745            0 : subroutine fit_dlr()
    4746              : 
    4747              : !Arguments ------------------------------------
    4748              : !Local variables ------------------------------
    4749              : ! ************************************************************************
    4750              : 
    4751            0 :  do isppol=1,nsppol
    4752            0 :    do im1=1,tndim
    4753            0 :      iflavor1 = im1 + (isppol-1)*ndim
    4754            0 :      do im=1,tndim
    4755            0 :        iflavor = im + (isppol-1)*ndim
    4756              : 
    4757            0 :        ncon = merge(merge(4,3,iflavor==iflavor1),1,density_matrix)
    4758            0 :        nmoments = merge(3,1,density_matrix)
    4759            0 :        if (nsppol == 1 .and. nspinor == 1) gtau(:,iflavor,iflavor1) = &
    4760            0 :              & (gtau(:,iflavor,iflavor1)+gtau(:,iflavor+ndim,iflavor1+ndim)) * half
    4761            0 :        occ_tmp = green%oper_tau(1)%matlu(iatom)%mat(im,im1,isppol)
    4762              : 
    4763            0 :        bdlr(:) = dble(gtau(:,iflavor,iflavor1))
    4764              : 
    4765            0 :        do i=1,nmoments
    4766            0 :          moment_fit(i) = dble(green%moments(i)%matlu(iatom)%mat(im,im1,isppol))
    4767              :        end do ! i
    4768              : 
    4769            0 :        call slsqp_wrapper(ncon,ndlr,lsq_g,con_moments,jac_lsq_g,jac_con_moments,gl_dlr_re(:))
    4770              : 
    4771            0 :        if (density_matrix) ncon = 3
    4772              : 
    4773            0 :        bdlr(:) = aimag(gtau(:,iflavor,iflavor1))
    4774            0 :        do i=1,nmoments
    4775            0 :          moment_fit(i) = aimag(green%moments(i)%matlu(iatom)%mat(im,im1,isppol))
    4776              :        end do ! i
    4777              : 
    4778            0 :        call slsqp_wrapper(ncon,ndlr,lsq_g,con_moments,jac_lsq_g,jac_con_moments,gl_dlr_im(:))
    4779              : 
    4780            0 :        gl_dlr(:,im,im1,isppol) = cmplx(gl_dlr_re(:),gl_dlr_im(:),kind=dp)
    4781              : 
    4782              :        ! Do not use DOT_PRODUCT
    4783            0 :        green%moments(1)%matlu(iatom)%mat(im,im1,isppol) = sum(gl_dlr(:,im,im1,isppol))
    4784            0 :        do i=2,green%nmoments
    4785            0 :          green%moments(i)%matlu(iatom)%mat(im,im1,isppol) = sum(gl_dlr(:,im,im1,isppol)*wdlr_beta(:,i-1))
    4786              :        end do ! i
    4787              : 
    4788            0 :        do itau=1,ntau
    4789              :          ! Do not use DOT_PRODUCT
    4790            0 :          gtau_dlr(itau,iflavor,iflavor1) = sum(gl_dlr(:,im,im1,isppol)*adlr(:,itau))
    4791              :        end do ! itau
    4792            0 :        if (nsppol == 1 .and. nspinor == 1) gtau_dlr(:,iflavor+ndim,iflavor1+ndim) = gtau_dlr(:,iflavor,iflavor1)
    4793              : 
    4794              :      end do ! im
    4795              :    end do ! im1
    4796              :  end do ! isppol
    4797              : 
    4798            0 :  do ifreq=1,nwlo
    4799            0 :    do isppol=1,nsppol
    4800            0 :      do im1=1,tndim
    4801            0 :        do im=1,tndim
    4802              :          ! Do not use DOT_PRODUCT
    4803            0 :          green%oper(ifreq)%matlu(iatom)%mat(im,im1,isppol) = sum(gl_dlr(:,im,im1,isppol)*adlr_iw(:,ifreq))
    4804              :        end do ! im
    4805              :      end do ! im1
    4806              :    end do ! isppol
    4807              :  end do ! ifreq
    4808              : 
    4809            0 : end subroutine fit_dlr
    4810              : 
    4811            0 : subroutine diag_block(matlu)
    4812              : 
    4813              : !Arguments ------------------------------------
    4814              :  type(matlu_type), intent(inout) :: matlu(natom)
    4815              : !Local variables ------------------------------
    4816              :  integer :: i,iatom,iblock,iflavor,iflavor1,im,im1
    4817              :  integer :: info,is,j,lpawu,lwork,ndim,sizb,tndim
    4818            0 :  real(dp), allocatable :: eig(:),rwork(:)
    4819            0 :  complex(dp), allocatable :: mat_tmp(:,:),work(:)
    4820              : ! ************************************************************************
    4821              : 
    4822            0 :  is = 1
    4823            0 :  ABI_MALLOC(eig,(nflavor_max))
    4824            0 :  ABI_MALLOC(mat_tmp,(nflavor_max,nflavor_max))
    4825            0 :  ABI_MALLOC(rwork,(3*nflavor_max-2))
    4826            0 :  ABI_MALLOC(work,(2*nflavor_max-1))
    4827              : 
    4828            0 :  do iatom=1,natom
    4829            0 :    lpawu = paw_dmft%lpawu(iatom)
    4830            0 :    if (lpawu == -1) cycle
    4831            0 :    ndim  = 2*lpawu + 1
    4832            0 :    tndim = nspinor * ndim
    4833            0 :    do iblock=1,nblocks(iatom)
    4834            0 :      sizb = siz_block(iblock,iatom)
    4835            0 :      lwork = 2*sizb - 1
    4836            0 :      do j=1,sizb
    4837            0 :        iflavor1 = flavor_list(j,iblock,iatom) + 1
    4838            0 :        im1 = mod(iflavor1-1,tndim) + 1
    4839            0 :        if (nspinor == 1) then
    4840            0 :          is = (iflavor1-1)/ndim + 1
    4841            0 :          if (is > nsppol) exit
    4842              :        end if
    4843            0 :        do i=1,sizb
    4844            0 :          iflavor = flavor_list(i,iblock,iatom) + 1
    4845            0 :          im = mod(iflavor-1,tndim) + 1
    4846            0 :          mat_tmp(i,j) = matlu(iatom)%mat(im,im1,is)
    4847            0 :          matlu(iatom)%mat(im,im1,is) = czero
    4848              :        end do ! i
    4849              :      end do ! j
    4850              : 
    4851            0 :      if (is > nsppol) cycle
    4852              : 
    4853              :      call zheev('v','u',sizb,mat_tmp(:,1:sizb),nflavor_max,eig(1:sizb), &
    4854            0 :               & work(1:lwork),lwork,rwork(1:3*sizb-2),info)
    4855              : 
    4856            0 :      do j=1,sizb
    4857            0 :        iflavor1 = flavor_list(j,iblock,iatom) + 1
    4858            0 :        im1 = mod(iflavor1-1,tndim) + 1
    4859            0 :        matlu(iatom)%mat(im1,im1,is) = cmplx(eig(j),zero,kind=dp)
    4860            0 :        do i=1,sizb
    4861            0 :          iflavor = flavor_list(i,iblock,iatom) + 1
    4862            0 :          im = mod(iflavor-1,tndim) + 1
    4863            0 :          eigvectmatlu(iatom)%mat(im,im1,is) = mat_tmp(i,j)
    4864              :        end do ! i
    4865              :      end do ! j
    4866              :    end do ! iblock
    4867              : 
    4868            0 :    if (pawprtvol >= 3) then
    4869            0 :      write(tag_at,'(i4)') iatom
    4870            0 :      do isppol=1,nsppol
    4871            0 :        write(message,'(4a,i1)') ch10,"       EIGENVECTORS for atom ",trim(adjustl(tag_at))
    4872            0 :        if (nspinor == 1) then
    4873            0 :          write(tag_block4,'(i1)') isppol
    4874            0 :          message = trim(message) // " and isppol " // tag_block4
    4875              :        end if
    4876            0 :        call wrtout(std_out,message,'COLL')
    4877            0 :        do im=1,tndim
    4878              :          write(message,'(12(1x,18(1x,"(",f9.3,",",f9.3,")")))') &
    4879            0 :             & (eigvectmatlu(iatom)%mat(im,im1,isppol),im1=1,tndim)
    4880            0 :          call wrtout(std_out,message,'COLL')
    4881              :        end do ! im1
    4882              :      end do ! isppol
    4883              :    end if ! pawprtvol>=3
    4884              : 
    4885              :  end do ! iatom
    4886              : 
    4887            0 :  ABI_FREE(eig)
    4888            0 :  ABI_FREE(mat_tmp)
    4889            0 :  ABI_FREE(rwork)
    4890            0 :  ABI_FREE(work)
    4891              : 
    4892            0 : end subroutine diag_block
    4893              : 
    4894            0 : subroutine lsq_g(gl,err)
    4895              : 
    4896              : !Arguments ------------------------------------
    4897              :  real(dp), intent(in) :: gl(:)
    4898              :  real(dp), intent(out) :: err
    4899              : !Local variables ------------------------------
    4900              : ! ************************************************************************
    4901              : 
    4902            0 :  err = zero
    4903            0 :  do itau=1,ntau
    4904            0 :    err = err + (dot_product(gl(:),adlr(:,itau))-bdlr(itau))**2
    4905              :  end do
    4906              : 
    4907            0 : end subroutine lsq_g
    4908              : 
    4909            0 : subroutine jac_lsq_g(gl,jac)
    4910              : 
    4911              : !Arguments ------------------------------------
    4912              :  real(dp), intent(in) :: gl(:)
    4913              :  real(dp), intent(inout) :: jac(:)
    4914              : !Local variables ------------------------------
    4915              : ! ************************************************************************
    4916              : 
    4917            0 :  jac(:) = zero
    4918            0 :  do itau=1,ntau
    4919            0 :    jac(1:ndlr) = jac(1:ndlr) + (dot_product(gl(:),adlr(:,itau))-bdlr(itau))*adlr(:,itau)
    4920              :  end do
    4921            0 :  jac = jac * two
    4922              : 
    4923            0 : end subroutine jac_lsq_g
    4924              : 
    4925            0 : subroutine con_moments(gl,con)
    4926              : 
    4927              : !Arguments ------------------------------------
    4928              :  real(dp), intent(in) :: gl(:)
    4929              :  real(dp), intent(inout) :: con(:)
    4930              : !Local variables ------------------------------
    4931              : ! ************************************************************************
    4932              : 
    4933            0 :  con(1) = sum(gl(:)) - moment_fit(1)
    4934            0 :  if (ncon > 1) then
    4935            0 :    con(2) = dot_product(gl(:),wdlr_beta(:,1)) - moment_fit(2)
    4936            0 :    con(3) = dot_product(gl(:),wdlr_beta(:,2)) - moment_fit(3)
    4937            0 :    if (ncon == 4) con(4) = dot_product(gl(:),adlr(:,1)) - dble(occ_tmp)
    4938              :  end if ! ncon>1
    4939              : 
    4940            0 : end subroutine con_moments
    4941              : 
    4942            0 : subroutine jac_con_moments(gl,jac_con)
    4943              : 
    4944              : !Arguments ------------------------------------
    4945              :  real(dp), intent(in) :: gl(:)
    4946              :  real(dp), intent(inout) :: jac_con(:,:)
    4947              : !Local variables ------------------------------
    4948              : ! ************************************************************************
    4949              : 
    4950              :  ABI_UNUSED(gl(:))
    4951              : 
    4952            0 :  jac_con(1,1:ndlr) = one
    4953            0 :  if (ncon > 1) then
    4954            0 :    jac_con(2,1:ndlr) = wdlr_beta(:,1)
    4955            0 :    jac_con(3,1:ndlr) = wdlr_beta(:,2)
    4956            0 :    if (ncon == 4) jac_con(4,1:ndlr) = adlr(:,1)
    4957              :  end if ! ncon>1
    4958            0 :  jac_con(:,ndlr+1) = zero  ! not sure if this is necessary, but this is what they do in the SCIPY interface with SLSQP
    4959              : 
    4960            0 : end subroutine jac_con_moments
    4961              : 
    4962              : end subroutine ctqmc_calltriqs_c
    4963              : !!***
    4964              : 
    4965              : !!****f* m_forctqmc/k_it
    4966              : !! NAME
    4967              : !! k_it
    4968              : !!
    4969              : !! FUNCTION
    4970              : !! Computes the imaginary time kernel K(tau,omega).
    4971              : !!
    4972              : !! INPUTS
    4973              : !! tau = imaginary time divided by beta
    4974              : !! omega = real frequency multiplied by beta
    4975              : !!
    4976              : !! OUTPUT
    4977              : !!
    4978              : !! SOURCE
    4979              : 
    4980            0 : function k_it(tau,omega)
    4981              : 
    4982              : !Arguments ------------------------------------
    4983              :  real(dp), intent(in) :: tau, omega
    4984              :  real(dp) :: k_it
    4985              : ! *********************************************************************
    4986              : 
    4987            0 :  k_it = merge(-exp(-tau*omega)/(one+exp(-omega)),-exp((one-tau)*omega)/(one+exp(omega)),omega>=0)
    4988              : 
    4989            0 : end function k_it
    4990              : !!***
    4991              : 
    4992              : !!****f* m_forctqmc/k_iw
    4993              : !! NAME
    4994              : !! k_iw
    4995              : !!
    4996              : !! FUNCTION
    4997              : !! Computes the imaginary frequency kernel K(iom,omega)
    4998              : !!
    4999              : !! INPUTS
    5000              : !! iom = imaginary part of the Matsubara frequency
    5001              : !! omega = real frequency
    5002              : !!
    5003              : !! OUTPUT
    5004              : !!
    5005              : !! SOURCE
    5006              : 
    5007            0 : function k_iw(iom,omega)
    5008              : 
    5009              : !Arguments ------------------------------------
    5010              :  real(dp), intent(in) :: iom,omega
    5011              :  complex(dp) :: k_iw
    5012              : ! *********************************************************************
    5013              : 
    5014            0 :  k_iw = cone / (cmplx(zero,iom,kind=dp)-omega)
    5015              : 
    5016              : end function k_iw
    5017              : !!***
    5018              : 
    5019              : !!****f* m_forctqmc/slsqp_wrapper
    5020              : !! NAME
    5021              : !! slsqp_wrapper
    5022              : !!
    5023              : !! FUNCTION
    5024              : !! Optimizes a function with several variables
    5025              : !! under several constraints, using the SLSQP algorithm.
    5026              : !!
    5027              : !! INPUTS
    5028              : !! m = number of constraints
    5029              : !! n = number of variables
    5030              : !! fun = function to optimize
    5031              : !! con = constraints
    5032              : !! jac = jacobian of the function
    5033              : !! jac_con = jacobian of the constraints
    5034              : !!
    5035              : !! OUTPUT
    5036              : !! x(n) = minimizer
    5037              : !!
    5038              : !! SOURCE
    5039              : 
    5040            0 : subroutine slsqp_wrapper(m,n,fun,con,jac,jac_con,x)
    5041              : 
    5042              :  use m_slsqp, only : slsqp
    5043              : 
    5044              : !Arguments ------------------------------------
    5045              :  integer, intent(in) :: m,n
    5046              :  real(dp), intent(inout) :: x(n)
    5047              : 
    5048              :  interface
    5049              : 
    5050              :    subroutine fun(x,f)
    5051              :      use defs_basis
    5052              :      real(dp), intent(in) :: x(:)
    5053              :      real(dp), intent(out) :: f
    5054              :    end subroutine fun
    5055              : 
    5056              :    subroutine con(x,c)
    5057              :      use defs_basis
    5058              :      real(dp), intent(in) :: x(:)
    5059              :      real(dp), intent(inout) :: c(:)
    5060              :    end subroutine con
    5061              : 
    5062              :    subroutine jac(x,g)
    5063              :      use defs_basis
    5064              :      real(dp), intent(in) :: x(:)
    5065              :      real(dp), intent(inout) :: g(:)
    5066              :    end subroutine jac
    5067              : 
    5068              :    subroutine jac_con(x,a)
    5069              :      use defs_basis
    5070              :      real(dp), intent(in) :: x(:)
    5071              :      real(dp), intent(inout) :: a(:,:)
    5072              :    end subroutine jac_con
    5073              : 
    5074              :  end interface
    5075              : !Local variables ------------------------------
    5076              :  integer :: i,iexact,incons,ireset,iter,itermx,l_jw,l_w,la
    5077              :  integer :: line,maxiter,meq,mineq,mode,n1,n2,n3
    5078              :  real(dp) :: f,acc,alpha,f0,gs,h1,h2,h3,h4,t,t0,tol
    5079            0 :  real(dp) :: c(max(m,1)),g(n+1),xl(n),xu(n)
    5080            0 :  real(dp) :: a(max(m,1),n+1)
    5081            0 :  real(dp), allocatable :: w(:)
    5082            0 :  integer, allocatable :: jw(:)
    5083              : ! ************************************************************************
    5084              : 
    5085            0 :  maxiter = 10000
    5086            0 :  meq = m   ! all constraints are equality constraints here
    5087            0 :  la  = max(m,1)
    5088            0 :  x(:)  = zero ; xl(:) = zero ; xu(:) = zero
    5089            0 :  xl(:) = xl(:) / zero  ! set lower and upper bounds to NaN (very important, this is how slsqp recognizes that no bounds should be applied)
    5090            0 :  xu(:) = xu(:) / zero
    5091              : 
    5092            0 :  call fun(x(:),f)
    5093            0 :  call con(x(:),c(:))
    5094            0 :  call jac(x(:),g(:))
    5095            0 :  call jac_con(x(:),a(:,:))
    5096            0 :  acc = tol8  ! best not to overconverge the result, in order to avoid overfitting
    5097            0 :  iter = maxiter
    5098            0 :  mode = 0
    5099              :  n1 = n + 1
    5100            0 :  mineq = m - meq + 2*n1
    5101              :  l_w = (3*n1+m)*(n1+1) + (n1-meq+1)*(mineq+2) + 2*mineq &   ! as recommended
    5102            0 :       & +(n1+mineq)*(n1-meq) + 2*meq + n1 + n1*n/2 + 2*m + 3*n + 3*n1 + 1
    5103            0 :  ABI_MALLOC(w,(l_w))
    5104            0 :  w = zero
    5105            0 :  l_jw = mineq   ! as recommended
    5106            0 :  ABI_MALLOC(jw,(l_jw))
    5107            0 :  jw = 0 ; alpha = zero ; f0 = zero
    5108            0 :  gs = zero ; h1 = zero ; h2 = zero
    5109            0 :  h3 = zero ; h4 = zero ; t = zero
    5110            0 :  t0 = zero ; tol = zero ; iexact = 0
    5111            0 :  incons = 0 ; ireset = 0 ; itermx = 0
    5112            0 :  line = 0 ; n1 = 0 ; n2 = 0 ; n3 = 0
    5113              : 
    5114            0 :  do i=1,maxiter
    5115              : 
    5116              :    call slsqp(m,meq,la,n,x(:),xl(:),xu(:),f,c(:),g(:),a(:,:),acc,iter,mode,w(:),l_w, &
    5117              :             & jw(:),l_jw,alpha,f0,gs,h1,h2,h3,h4,t,t0,tol,iexact,incons,ireset,itermx, &
    5118            0 :             & line,n1,n2,n3)
    5119              : 
    5120            0 :    if (abs(mode) /= 1) exit
    5121            0 :    if (mode == -1) then
    5122            0 :      call jac(x(:),g(:))
    5123            0 :      call jac_con(x(:),a(:,:))
    5124              :    end if
    5125            0 :    if (mode == 1) then
    5126            0 :      call fun(x(:),f)
    5127            0 :      call con(x(:),c(:))
    5128              :    end if
    5129              :  end do ! i
    5130              : 
    5131            0 :  if (mode /= 0) ABI_ERROR("Error in the optimization procedure during the DLR fit")
    5132              : 
    5133            0 :  ABI_FREE(w)
    5134            0 :  ABI_FREE(jw)
    5135              : 
    5136            0 : end subroutine slsqp_wrapper
    5137              : !!***
    5138              : 
    5139              : !!****f* m_forctqmc/fourier_inv
    5140              : !! NAME
    5141              : !! fourier_inv
    5142              : !!
    5143              : !! FUNCTION
    5144              : !!  Computes the inverse Fourier transform of a frequency-dependent operator,
    5145              : !!  using analytical formulas for the asymptotic behavior. It is assumed the
    5146              : !!  asymptotic behavior is moments(1)/(iw_n) + moments(2)/(iwn)**2 + ...,
    5147              : !!  so if you want to use this routine for an operator with a 0th order moment,
    5148              : !!  you need to subtract it before calling this routine.
    5149              : !!
    5150              : !! INPUTS
    5151              : !!  paw_dmft <type(paw_dmft_type)>= DMFT data structure
    5152              : !!  nmoments = number of moments
    5153              : !!  ntau = number of (equidistant) imaginary time points on [0,beta]
    5154              : !!  oper_freq = operator for each Matsubara frequency
    5155              : !!  moments = high-frequency moments of the operator
    5156              : !!
    5157              : !! OUTPUT
    5158              : !!  matlu_tau(2*(2*lpawu+1),2*(2*lpawu+1),ntau) = operator for each tau point
    5159              : !!
    5160              : !! SIDE EFFECTS
    5161              : !!
    5162              : !! NOTES
    5163              : !!
    5164              : !! SOURCE
    5165              : 
    5166            0 : subroutine fourier_inv(paw_dmft,nmoments,ntau,matlu_tau,oper_freq,moments)
    5167              : 
    5168              : !Arguments ------------------------------------
    5169              :  integer, intent(in) :: nmoments,ntau
    5170              :  type(paw_dmft_type), intent(in) :: paw_dmft
    5171              :  type(oper_type), intent(in) :: oper_freq(paw_dmft%dmft_nwlo),moments(nmoments)
    5172              :  type(matlu_type), intent(inout) :: matlu_tau(paw_dmft%natom)
    5173              : !Local variables ------------------------------
    5174              :  integer :: i,iatom,ibuf,ibuf_tau,ierr,ifreq,im1,isppol
    5175              :  integer :: itau,itaub,itauf,lpawu,myproc,natom,ndim,nproc
    5176              :  integer :: nspinor,nsppol,ntau_proc,nwlo,ratio,residu,siz_buf,tndim
    5177              :  real(dp) :: beta,omegatau,tau
    5178              :  complex(dp) :: fac
    5179            0 :  integer, allocatable :: displs(:),recvcounts(:)
    5180            0 :  complex(dp), allocatable :: buffer(:),buffer_tot(:),omega_fac(:)
    5181              : ! ************************************************************************
    5182              : 
    5183            0 :  beta    = one / paw_dmft%temp
    5184            0 :  myproc  = paw_dmft%myproc
    5185            0 :  natom   = paw_dmft%natom
    5186            0 :  nspinor = paw_dmft%nspinor
    5187            0 :  nsppol  = paw_dmft%nsppol
    5188            0 :  nproc   = paw_dmft%nproc
    5189            0 :  nwlo    = paw_dmft%dmft_nwlo
    5190              : 
    5191            0 :  call zero_matlu(matlu_tau(:),natom)
    5192              : 
    5193            0 :  ABI_MALLOC(displs,(nproc))
    5194            0 :  ABI_MALLOC(recvcounts,(nproc))
    5195              : 
    5196            0 :  ratio  = ntau / nproc
    5197            0 :  residu = ntau - ratio*nproc
    5198              : 
    5199            0 :  itau = 1
    5200            0 :  do i=0,nproc-1
    5201            0 :    ntau_proc = merge(ratio+1,ratio,i<residu)
    5202            0 :    recvcounts(i+1) = ntau_proc
    5203            0 :    if (myproc == i) itaub = itau
    5204            0 :    itau = itau + ntau_proc
    5205              :  end do ! i
    5206            0 :  itauf = itaub + recvcounts(myproc+1) - 1
    5207              : 
    5208            0 :  siz_buf = 0
    5209            0 :  do iatom=1,natom
    5210            0 :    lpawu = paw_dmft%lpawu(iatom)
    5211            0 :    if (lpawu == -1) cycle
    5212            0 :    siz_buf = siz_buf + (2*lpawu+1)**2
    5213              :  end do ! iatom
    5214              : 
    5215            0 :  siz_buf = siz_buf * (nspinor**2) * nsppol
    5216              : 
    5217            0 :  recvcounts(:) = recvcounts(:) * siz_buf
    5218              : 
    5219            0 :  displs(1) = 0
    5220            0 :  do i=2,nproc
    5221            0 :    displs(i) = displs(i-1) + recvcounts(i-1)
    5222              :  end do ! i
    5223              : 
    5224            0 :  ABI_MALLOC(buffer,(recvcounts(myproc+1)))
    5225            0 :  ABI_MALLOC(buffer_tot,(recvcounts(nproc)+displs(nproc)))
    5226            0 :  ABI_MALLOC(omega_fac,(nmoments))
    5227              : 
    5228            0 :  buffer(:) = czero
    5229              : 
    5230              :  ibuf_tau = 0
    5231            0 :  do itau=itaub,itauf
    5232              : 
    5233            0 :    tau = dble(itau-1) * beta / dble(ntau-1)
    5234            0 :    omega_fac(:) = czero
    5235              : 
    5236            0 :    do ifreq=nwlo,1,-1 ! NEVER change this summation order and DON'T replace by the intrinsic SUM
    5237            0 :      omegatau = mod(paw_dmft%omega_lo(ifreq)*tau,two_pi)
    5238            0 :      fac = two * paw_dmft%temp * exp(-j_dpc*omegatau)
    5239            0 :      do i=1,nmoments
    5240            0 :        omega_fac(i) = omega_fac(i) - fac/(j_dpc*paw_dmft%omega_lo(ifreq))**i
    5241              :      end do
    5242              :      ibuf = 0
    5243            0 :      do iatom=1,natom
    5244            0 :        lpawu = paw_dmft%lpawu(iatom)
    5245            0 :        if (lpawu == -1) cycle
    5246            0 :        tndim = nspinor * (2*lpawu+1)
    5247            0 :        do isppol=1,nsppol
    5248            0 :          do im1=1,tndim
    5249              :            buffer(ibuf_tau+ibuf+1:ibuf_tau+ibuf+tndim) = buffer(ibuf_tau+ibuf+1:ibuf_tau+ibuf+tndim) + &
    5250            0 :                    fac*oper_freq(ifreq)%matlu(iatom)%mat(:,im1,isppol)
    5251            0 :            ibuf = ibuf + tndim
    5252              :          end do ! im
    5253              :        end do ! isppol
    5254              :      end do ! iatom
    5255              :    end do ! ifreq
    5256              : 
    5257            0 :    omega_fac(1) = omega_fac(1) - half
    5258            0 :    omega_fac(2) = omega_fac(2) + tau/two - beta/four
    5259            0 :    omega_fac(3) = omega_fac(3) - (tau**2)/four + tau*beta/four
    5260              : 
    5261            0 :    do i=1,nmoments
    5262              :      ibuf = 0
    5263            0 :      do iatom=1,natom
    5264            0 :        lpawu = paw_dmft%lpawu(iatom)
    5265            0 :        if (lpawu == -1) cycle
    5266            0 :        tndim = nspinor * (2*lpawu+1)
    5267            0 :        do isppol=1,nsppol
    5268            0 :          do im1=1,tndim
    5269              :            buffer(ibuf_tau+ibuf+1:ibuf_tau+ibuf+tndim) = buffer(ibuf_tau+ibuf+1:ibuf_tau+ibuf+tndim) + &
    5270            0 :                     & moments(i)%matlu(iatom)%mat(:,im1,isppol)*omega_fac(i)
    5271            0 :            ibuf = ibuf + tndim
    5272              :          end do ! im1
    5273              :        end do ! isppol
    5274              :      end do ! iatom
    5275              :    end do ! i
    5276              : 
    5277            0 :    ibuf_tau = ibuf_tau + siz_buf
    5278              : 
    5279              :  end do ! itau
    5280              : 
    5281            0 :  ABI_FREE(omega_fac)
    5282              : 
    5283            0 :  call xmpi_allgatherv(buffer(:),recvcounts(myproc+1),buffer_tot(:),recvcounts(:),displs(:),paw_dmft%spacecomm,ierr)
    5284              : 
    5285            0 :  ABI_FREE(displs)
    5286            0 :  ABI_FREE(recvcounts)
    5287              : 
    5288            0 :  ibuf = 0
    5289            0 :  do itau=1,ntau
    5290            0 :    do iatom=1,natom
    5291            0 :      lpawu = paw_dmft%lpawu(iatom)
    5292            0 :      if (lpawu == -1) cycle
    5293            0 :      ndim  = 2*lpawu + 1
    5294            0 :      tndim = ndim * nspinor
    5295            0 :      do isppol=1,nsppol
    5296            0 :        do im1=1,tndim
    5297            0 :          matlu_tau(iatom)%mat(1+(isppol-1)*ndim:tndim+(isppol-1)*ndim,im1+(isppol-1)*ndim,itau) = buffer_tot(ibuf+1:ibuf+tndim)
    5298            0 :          ibuf = ibuf + tndim
    5299              :        end do ! im1
    5300              :      end do ! isppol
    5301            0 :      if (nsppol == 1 .and. nspinor == 1) matlu_tau(iatom)%mat(ndim+1:2*ndim,ndim+1:2*ndim,itau) = &
    5302            0 :          & matlu_tau(iatom)%mat(1:ndim,1:ndim,itau)
    5303            0 :      ndim = 2 * ndim
    5304              :      matlu_tau(iatom)%mat(1:ndim,1:ndim,itau) = (matlu_tau(iatom)%mat(1:ndim,1:ndim,itau)+ &
    5305            0 :          & conjg(transpose(matlu_tau(iatom)%mat(1:ndim,1:ndim,itau)))) * half
    5306              :    end do ! iatom
    5307              :  end do ! itau
    5308              : 
    5309            0 :  ABI_FREE(buffer)
    5310            0 :  ABI_FREE(buffer_tot)
    5311              : 
    5312            0 : end subroutine fourier_inv
    5313              : !!***
    5314              : 
    5315              : !!****f* m_forctqmc/find_block_structure
    5316              : !! NAME
    5317              : !! find_block_structure
    5318              : !!
    5319              : !! FUNCTION
    5320              : !!  Find the most optimal block structure of a matlu
    5321              : !!
    5322              : !! INPUTS
    5323              : !!  paw_dmft <type(paw_dmft_type)>= DMFT data structure
    5324              : !!  matlu <type(oper_type)>= matrix for which the block structure is to be found
    5325              : !!  natom = number of atoms
    5326              : !!  nflavor_max = max number of orbitals
    5327              : !!  hyb <type(green_type)>= hybridization ; if present, the block structure will
    5328              : !!                          match both matlu and hyb
    5329              : !!
    5330              : !! OUTPUT
    5331              : !!  block_list(nflavor,natom) = block index for each flavor and atom
    5332              : !!  inner_list(nflavor,natom) = inner block index for each flavor and atom
    5333              : !!  flavor_list(nflavor,nflavor,natom) = flavor for each block and inner indexes
    5334              : !!  siz_block(nflavor,natom) = block size for each block and atom
    5335              : !!  nblocks = number of blocks for each atom
    5336              : !!
    5337              : !! SIDE EFFECTS
    5338              : !!
    5339              : !! NOTES
    5340              : !!
    5341              : !! SOURCE
    5342              : 
    5343            0 : subroutine find_block_structure(paw_dmft,block_list,inner_list,flavor_list, &
    5344            0 :                               & siz_block,nblocks,matlu,natom,nflavor_max,hyb)
    5345              : 
    5346              : !Arguments ------------------------------------
    5347              :  integer, intent(in) :: natom,nflavor_max
    5348              :  integer, intent(inout) :: block_list(nflavor_max,natom),inner_list(nflavor_max,natom)
    5349              :  integer, intent(inout) :: flavor_list(nflavor_max,nflavor_max,natom)
    5350              :  integer, intent(inout) :: siz_block(nflavor_max,natom),nblocks(natom)
    5351              :  type(paw_dmft_type), intent(in) :: paw_dmft
    5352              :  type(green_type), optional, intent(inout) :: hyb
    5353              :  type(matlu_type), intent(inout) :: matlu(natom)
    5354              : !Local variables ------------------------------
    5355              :  integer :: i,iatom,iblock,iblock1,iblock2,iflavor,ifreq,lpawu
    5356              :  integer :: nflavor,nspinor,nsppol,nwlo
    5357            0 :  integer, allocatable :: found_block(:),label_block(:)
    5358              : ! ************************************************************************
    5359              : 
    5360            0 :  nspinor = paw_dmft%nspinor
    5361            0 :  nsppol  = paw_dmft%nsppol
    5362            0 :  nwlo    = paw_dmft%dmft_nwlo
    5363              : 
    5364            0 :  do iflavor=1,nflavor_max
    5365            0 :    block_list(iflavor,:) = iflavor - 1
    5366              :  end do ! iflavor
    5367              : 
    5368            0 :  ABI_MALLOC(found_block,(nflavor_max))
    5369            0 :  ABI_MALLOC(label_block,(nflavor_max))
    5370              : 
    5371            0 :  call find_block_structure_mat(matlu(:))
    5372              : 
    5373            0 :  if (present(hyb)) then
    5374            0 :    do i=2,hyb%nmoments-1
    5375            0 :      call find_block_structure_mat(hyb%moments(i)%matlu(:))
    5376              :    end do ! i
    5377              : 
    5378            0 :    do ifreq=1,nwlo
    5379            0 :      call find_block_structure_mat(hyb%oper(ifreq)%matlu(:))
    5380              :    end do ! ifreq
    5381              :  end if ! present(hyb)
    5382              : 
    5383            0 :  siz_block(:,:) = 0
    5384              : 
    5385              :  ! Rename the blocks from 0 to nblocks-1 and build lists
    5386            0 :  do iatom=1,natom
    5387            0 :    lpawu = paw_dmft%lpawu(iatom)
    5388            0 :    if (lpawu == -1) cycle
    5389            0 :    nflavor = 2 * (2*lpawu+1)
    5390              : 
    5391            0 :    found_block(:) = 0
    5392              : 
    5393            0 :    iblock1 = 0 ! number of blocks
    5394            0 :    do iflavor=1,nflavor
    5395            0 :      iblock = block_list(iflavor,iatom)
    5396            0 :      if (found_block(iblock+1) == 0) then
    5397            0 :        label_block(iblock+1) = iblock1
    5398            0 :        iblock1 = iblock1 + 1 ! next block index
    5399              :      end if
    5400            0 :      iblock2 = label_block(iblock+1) ! new block index
    5401            0 :      block_list(iflavor,iatom) = iblock2
    5402            0 :      inner_list(iflavor,iatom) = found_block(iblock+1)
    5403            0 :      found_block(iblock+1) = found_block(iblock+1) + 1
    5404            0 :      siz_block(iblock2+1,iatom) = siz_block(iblock2+1,iatom) + 1
    5405            0 :      flavor_list(found_block(iblock+1),iblock2+1,iatom) = iflavor - 1
    5406              :    end do ! iflavor
    5407            0 :    nblocks(iatom) = iblock1
    5408              :  end do ! iatom
    5409              : 
    5410            0 :  ABI_FREE(found_block)
    5411            0 :  ABI_FREE(label_block)
    5412              : 
    5413              :  ! Set to 0 the off-diagonal elements that are not kept in a block
    5414            0 :  call apply_block_structure_mat(matlu(:))
    5415              : 
    5416            0 :  if (present(hyb)) then
    5417              : 
    5418            0 :    do i=2,hyb%nmoments-1
    5419            0 :      call apply_block_structure_mat(hyb%moments(i)%matlu(:))
    5420              :    end do ! i
    5421              : 
    5422            0 :    do ifreq=1,nwlo
    5423            0 :      call apply_block_structure_mat(hyb%oper(ifreq)%matlu(:))
    5424              :    end do ! ifreq
    5425              : 
    5426              :  end if ! present(hyb)
    5427              : 
    5428              : contains
    5429              : 
    5430            0 : subroutine find_block_structure_mat(mat)
    5431              : 
    5432              : !Arguments ------------------------------------
    5433              :  type(matlu_type), intent(inout) :: mat(natom)
    5434              : !Local variables ------------------------------
    5435              :  integer :: i,iflavor1,im,im1,isppol,ndim,tndim
    5436              : ! ************************************************************************
    5437              : 
    5438            0 :   do iatom=1,natom
    5439            0 :     lpawu = paw_dmft%lpawu(iatom)
    5440            0 :     if (lpawu == -1) cycle
    5441            0 :     ndim = 2*lpawu + 1
    5442            0 :     tndim = ndim * nspinor
    5443            0 :     nflavor = 2 * ndim
    5444            0 :     do isppol=1,nsppol
    5445            0 :       do im1=1,tndim
    5446            0 :         iflavor1 = im1 + (isppol-1)*ndim
    5447            0 :         iblock1  = block_list(iflavor1,iatom)
    5448            0 :         do im=1,tndim
    5449            0 :           iflavor = im + (isppol-1)*ndim
    5450            0 :           iblock  = block_list(iflavor,iatom)
    5451            0 :           if (iblock == iblock1) cycle
    5452            0 :           if (abs(mat(iatom)%mat(im,im1,isppol)) > paw_dmft%dmft_triqs_tol_block) then ! Merge the two blocks
    5453            0 :             do i=1,nflavor
    5454            0 :               if (block_list(i,iatom) == iblock) block_list(i,iatom) = iblock1
    5455              :             end do ! i
    5456              :           end if
    5457              :         end do ! im
    5458              :       end do ! im1
    5459              :     end do ! isppol
    5460            0 :     if (nsppol == 1 .and. nspinor == 1) block_list(ndim+1:nflavor,iatom) = block_list(1:ndim,iatom) + ndim
    5461              :   end do ! iatom
    5462              : 
    5463            0 :  end subroutine find_block_structure_mat
    5464              : 
    5465            0 :  subroutine apply_block_structure_mat(mat)
    5466              : 
    5467              : !Arguments ------------------------------------
    5468              :  type(matlu_type), intent(inout) :: mat(natom)
    5469              : !Local variables ------------------------------
    5470              :  integer :: iflavor1,im,im1,isppol,ndim,tndim
    5471              : ! ************************************************************************
    5472              : 
    5473            0 :  do iatom=1,natom
    5474            0 :    lpawu = paw_dmft%lpawu(iatom)
    5475            0 :    if (lpawu == -1) cycle
    5476            0 :    ndim  = 2*lpawu + 1
    5477            0 :    tndim = nspinor * ndim
    5478            0 :    do isppol=1,nsppol
    5479            0 :      do im1=1,tndim
    5480            0 :        iflavor1 = im1 + (isppol-1)*ndim
    5481            0 :        iblock1  = block_list(iflavor1,iatom)
    5482            0 :        do im=1,tndim
    5483            0 :          iflavor = im + (isppol-1)*ndim
    5484            0 :          iblock  = block_list(iflavor,iatom)
    5485            0 :          if (iblock == iblock1) cycle
    5486            0 :          mat(iatom)%mat(im,im1,isppol) = czero
    5487              :        end do ! im
    5488              :      end do ! im1
    5489              :    end do ! isppol
    5490              :  end do ! iatom
    5491              : 
    5492            0 :  end subroutine apply_block_structure_mat
    5493              : 
    5494              :  end subroutine find_block_structure
    5495              : !!***
    5496              : 
    5497            0 : END MODULE m_forctqmc
    5498              : !!***
        

Generated by: LCOV version 2.3-1