LCOV - code coverage report
Current view: top level - src/65_paw - m_paw_dmft.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 75.8 % 972 737
Test Date: 2026-09-19 15:24:51 Functions: 77.8 % 18 14

            Line data    Source code
       1              : !****m* ABINIT/m_paw_dmft
       2              : !! NAME
       3              : !!  m_paw_dmft
       4              : !!
       5              : !! FUNCTION
       6              : !!
       7              : !! COPYRIGHT
       8              : !! Copyright (C) 2006-2026 ABINIT group (BAmadon)
       9              : !! This file is distributed under the terms of the
      10              : !! GNU General Public License, see ~abinit/COPYING
      11              : !! or http://www.gnu.org/copyleft/gpl.txt .
      12              : !!
      13              : !! INPUTS
      14              : !!
      15              : !! OUTPUT
      16              : !!
      17              : !! SOURCE
      18              : 
      19              : #if defined HAVE_CONFIG_H
      20              : #include "config.h"
      21              : #endif
      22              : 
      23              : #include "abi_common.h"
      24              : 
      25              : MODULE m_paw_dmft
      26              : 
      27              :  use defs_basis
      28              :  use m_abicore
      29              :  use m_CtqmcInterface
      30              :  use m_data4entropyDMFT
      31              :  use m_dtset
      32              :  use m_errors
      33              :  use m_xmpi
      34              : 
      35              :  use defs_abitypes, only : MPI_type
      36              :  use m_crystal, only : crystal_t
      37              :  use m_fstrings, only : int2char4
      38              :  use m_geometry, only : symredcart
      39              :  use m_io_tools, only : open_file
      40              :  use m_mpinfo, only : proc_distrb_cycle
      41              :  use m_paw_numeric, only : paw_jbessel_4spline
      42              :  use m_pawang, only : pawang_type
      43              :  use m_pawrad, only : pawrad_free,pawrad_init,pawrad_type,simp_gen
      44              :  use m_pawtab, only : pawtab_type
      45              : 
      46              :  implicit none
      47              : 
      48              :  private
      49              : 
      50              :  public :: init_dmft
      51              :  public :: init_sc_dmft
      52              :  public :: construct_nwli_dmft
      53              :  public :: destroy_dmft
      54              :  public :: destroy_sc_dmft
      55              :  public :: print_dmft
      56              :  public :: print_sc_dmft
      57              :  public :: saveocc_dmft
      58              :  public :: readocc_dmft
      59              : 
      60              : !!***
      61              : 
      62              : !----------------------------------------------------------------------
      63              : 
      64              : !!****t* m_paw_dmft/mpi_distrib_dmft_type
      65              : !! NAME
      66              : !!  mpi_distrib_dmft_type
      67              : !!
      68              : !! FUNCTION
      69              : !!  This structured datatype contains the necessary data for the MPI
      70              : !!  parallelization over frequencies and kpts in DFT+DMFT.
      71              : !!
      72              : !! SOURCE
      73              : 
      74              :  type, public :: mpi_distrib_dmft_type
      75              : 
      76              :    ! Two types of parallelization
      77              :    ! Type 1: parallelization over kpt and then frequencies
      78              :    ! Type 2: parallelization over frequencies only
      79              : 
      80              :    integer :: comm_freq
      81              :    ! Frequency communicator (type 1)
      82              : 
      83              :    integer :: comm_kpt
      84              :    ! Kpt communicator (type 1)
      85              : 
      86              :    integer :: me_freq
      87              :    ! Rank in comm_freq (type 1)
      88              : 
      89              :    integer :: me_kpt
      90              :    ! Rank in comm_kpt (type 1)
      91              : 
      92              :    integer :: nw
      93              :    ! Number of frequencies (either nwlo or nwr, same for both types)
      94              : 
      95              :    integer :: shiftk
      96              :    ! Shift from kpt index on the current CPU to the physical index (type 1)
      97              : 
      98              :    integer, allocatable :: nkpt_mem(:)
      99              :    ! Number of kpt handled by each CPU of the kpt communicator (type 1)
     100              : 
     101              :    integer, allocatable :: nw_mem(:)
     102              :    ! Number of frequencies handled by each CPU of the global communicator (type 2)
     103              : 
     104              :    integer, allocatable :: nw_mem_kptparal(:)
     105              :    ! Number of frequencies handled by each CPU of the frequency communicator (type 1)
     106              : 
     107              :    integer, allocatable :: procb(:)
     108              :    ! Rank in comm_kpt of the CPU handling each kpt (type 1)
     109              : 
     110              :    integer, allocatable :: procf(:)
     111              :    ! Rank in the global communicator of the CPU handling each frequency (type 2)
     112              : 
     113              :    integer, allocatable :: proct(:)
     114              :    ! Rank in comm_freq of the CPU handling each frequency (type 1)
     115              : 
     116              :  end type mpi_distrib_dmft_type
     117              : !!***
     118              : 
     119              : !----------------------------------------------------------------------
     120              : 
     121              : !!****t* m_paw_dmft/paw_dmft_type
     122              : !! NAME
     123              : !!  paw_dmft_type
     124              : !!
     125              : !! FUNCTION
     126              : !!  This structured datatype contains the necessary data for the link
     127              : !!  between dmft and paw.
     128              : !!  occnd(non-diagonal band occupations for self-consistency), band_in
     129              : !!  (say which band are taken into account in the calculation), and the
     130              : !   dimensions of these arrays.
     131              : !!
     132              : !! SOURCE
     133              : 
     134              :  type, public :: paw_dmft_type
     135              : 
     136              :   integer :: dmft_blockdiag
     137              :   ! Block diagonalize Hamiltonian in the local basis
     138              : 
     139              :   integer :: dmft_dc
     140              :   ! Type of double counting used in DMFT
     141              : 
     142              :   integer :: dmft_entropy
     143              :   ! = 0: do not compute entropy
     144              :   ! >= 1: compute entropy with an integration over self-consistent calculations
     145              : 
     146              :   integer :: dmft_hybri_limit
     147              :   ! = 1 : Use asymptotic limit to build hybridization function
     148              : 
     149              :   integer :: dmft_iter
     150              :   ! Nb of iterations for DMFT self-consistent cycle.
     151              : 
     152              :   integer :: dmft_kspectralfunc
     153              :   ! =0 Default
     154              :   ! =1 Activate calculation of k-resolved spectral function
     155              : 
     156              :   integer :: dmft_log_freq
     157              :   ! = 0: do not use log frequencies
     158              :   ! = 1: use log frequencies
     159              : 
     160              :   integer :: dmft_magnfield
     161              :   ! = 0: do nothing
     162              :   ! = 1: apply a magnetic field Bz via Zeeman Hamiltonian on Kohn-Sham energies
     163              :   ! = 2: apply a magnetic field Bz via Zeeman Hamiltonian on local impurity Hamiltonian
     164              : 
     165              :   integer :: dmft_nwli
     166              :   ! Physical index of the last imaginary frequency (/=dmft_nwlo when dmft_log_freq=1)
     167              : 
     168              :   integer :: dmft_nwlo
     169              :   ! Number of imaginary frequencies
     170              : 
     171              :   integer :: dmft_nwr
     172              :   ! Number of real frequencies
     173              : 
     174              :   integer :: dmft_prgn
     175              :   ! Specify the way of printing the green function.
     176              :   !  =1   print green
     177              :   !  =2   print self
     178              : 
     179              :   integer :: dmft_prt_maxent
     180              :   ! =1 to print Maxent files
     181              : 
     182              :   integer :: dmft_prtself
     183              :   ! =1 to keep self-energy files of all previous iterations
     184              : 
     185              :   integer :: dmft_prtwan
     186              :   ! =1 to print Wannier functions
     187              : 
     188              :   integer :: dmft_read_occnd
     189              :   ! Flag to read/write DMFT occupations
     190              :   ! =0 : Occupations are written but not read
     191              :   ! =1 : Occupations are read from I_DMFTOCCND, with I the root for input file
     192              :   ! =2 : Occupations are read from O_DMFTOCCND, with O the root for input file
     193              : 
     194              :   integer :: dmft_rslf
     195              :   ! Flag to read the self-energy at each iteration
     196              :   ! =-1 : Self-energy is set to 0
     197              :   ! =0 : Self-energy is set to double counting
     198              :   ! =1 : Self-energy is read from file
     199              : 
     200              :   integer :: dmft_solv
     201              :   ! Choice of solver for DMFT
     202              : 
     203              :   integer :: dmft_t2g
     204              :   ! Only use t2g orbitals
     205              : 
     206              :   integer :: dmft_triqs_chiloc
     207              :   ! Activate measurements for local spin-spin correlation function with triqs cthyb
     208              :   ! only relevant without spin-orbit coupling (nspinor = 1)
     209              : 
     210              :   integer :: dmft_triqs_chiloc_ins
     211              :   ! Option for local spin-spin correlation function measurements
     212              :   ! default value is 10
     213              : 
     214              :   integer :: dmft_triqs_compute_integral
     215              :   ! Only relevant when dmft_triqs_entropy=1.
     216              :   ! =1: Compute the impurity entropy by thermodynamic integration over interaction strength.
     217              :   ! =0: Do not compute the impurity entropy. All the other contributions to the free
     218              :   ! energy are still computed.
     219              : 
     220              :   integer :: dmft_triqs_det_init_size
     221              :   ! TRIQS CTQMC: Initial size of the hybridization matrix. If it is too low,
     222              :   ! the matrix will be resized very often, which can be slow.
     223              : 
     224              :   integer :: dmft_triqs_det_n_operations_before_check
     225              :   ! TRIQS CTQMC: Number of operations before check of the hybridization matrix.
     226              :   ! If it is low, the matrix will be checked too often, which can be slow.
     227              : 
     228              :   integer :: dmft_triqs_entropy
     229              :   ! TRIQS CTQMC: Compute the DMFT entropy.
     230              : 
     231              :   integer :: dmft_triqs_gaussorder
     232              :   ! Order of the Gauss-Legendre quadrature for each subdivision of the thermodynamic integration.
     233              : 
     234              :   integer :: dmft_triqs_loc_n_min
     235              :   ! TRIQS CTQMC: Only configurations with a number of electrons in
     236              :   ! [nlocmin,nlocmax] are taken into account.
     237              : 
     238              :   integer :: dmft_triqs_loc_n_max
     239              :   ! TRIQS CTQMC: Only configurations with a number of electrons in
     240              :   ! [nlocmin,nlocmax] are taken into account.
     241              : 
     242              :   integer :: dmft_triqs_n_cycles
     243              :   ! TRIQS CTQMC: Number of measurement cycles.
     244              : 
     245              :   integer :: dmft_triqs_nleg
     246              :   ! TRIQS CTQMC: Nb of Legendre polynomials used for the
     247              :   ! Green's function (Phys. Rev. B 84, 075145) [[cite:Boehnke2011]].
     248              : 
     249              :   integer :: dmft_triqs_nsubdivisions
     250              :   ! Number of regular subdivisions of the interval [0,U], each of which
     251              :   ! containing dmft_triqs_gaussorder points
     252              : 
     253              :   integer :: dmft_triqs_read_ctqmcdata
     254              :   ! TRIQS CTQMC: Read CTQMC data of the previous iteration
     255              : 
     256              :   integer :: dmft_triqs_seed_a
     257              :   ! TRIQS CTQMC: The CTQMC seed is seed_a + rank * seed_b.
     258              : 
     259              :   integer :: dmft_triqs_seed_b
     260              :   ! TRIQS CTQMC: The CTQMC seed is seed_a + rank * seed_b.
     261              : 
     262              :   integer :: dmft_triqs_therm_restart
     263              :   ! TRIQS CTQMC: Number of thermalization steps when we restart from a previous configuration.
     264              : 
     265              :   integer :: dmft_full_chipsi
     266              :   ! =0 do not use
     267              :   ! =1 build Wannier functions
     268              : 
     269              :   integer :: dmft_wanorthnorm
     270              :   ! =2 orthonormalization of Wannier functions for each k-point
     271              :   ! =3 orthonormalization over the sum over k-points
     272              : 
     273              :   integer :: dmft_x2my2d
     274              :   ! Only use x2my2d orbital
     275              : 
     276              :   integer :: dmftbandf
     277              :   ! Highest correlated band
     278              : 
     279              :   integer :: dmftbandi
     280              :   ! Lowest correlated band
     281              : 
     282              :   integer :: dmftcheck
     283              :   ! Check various part of the implementation
     284              : 
     285              :   integer :: dmftctqmc_basis
     286              :   ! Basis in which to perform the CTQMC calculation
     287              :   ! 0 : Slm basis, 1 : diagonalize local Hamiltonian, 2: diagonalize the density matrix
     288              :   ! Only for TRIQS: 3: Ylm, 4: JmJ
     289              : 
     290              :   integer :: dmftctqmc_check
     291              :   ! ABINIT CTQMC: perform a check on the impurity and/or bath operator
     292              :   ! only for debug
     293              :   ! 0 : nothing, 1 : impurity, 2 : bath, 3 : both
     294              : 
     295              :   integer :: dmftctqmc_correl
     296              :   ! ABINIT CTQMC: Gives analysis for CTQMC
     297              :   ! 0 : nothing, 1 : activated Correlations.dat
     298              : 
     299              :   integer :: dmftctqmc_gmove
     300              :   ! ABINIT CTQMC: add global move every dmftctqmc_gmove sweeps
     301              :   ! >= 0 ; done inside CT-QMC with warning
     302              :   ! == 0 ; no global moves
     303              : 
     304              :   integer :: dmftctqmc_grnns
     305              :   ! ABINIT CTQMC: compute green function noise for each imaginary time
     306              :   ! 0 : nothing, 1 : activated
     307              : 
     308              :   integer :: dmftctqmc_localprop
     309              :   ! ABINIT CTQMC: local properties calculations
     310              :   ! 0 : nothing, 1 : Histogram, 2 : magnetic susceptibility, 3 : charge susceptibility
     311              : 
     312              :   integer :: dmftctqmc_meas
     313              :   ! ABINIT/TRIQS CTQMC: measurements are done every dmftctqmc_meas step
     314              : 
     315              :   integer :: dmftctqmc_mov
     316              :   ! ABINIT CTQMC: Gives movie for CTQMC
     317              :   ! 0 : nothing, 1 : 1 file Movie_RANK.tex for each cpu
     318              : 
     319              :   integer :: dmftctqmc_chains
     320              :   ! ABINIT CTQMC: Number of chains per MPI-tasks
     321              : 
     322              :   integer :: dmftctqmc_mrka
     323              :   ! ABINIT CTQMC: Write a temporary file Spectra_RANK.dat with the sweep evolution of
     324              :   ! the number of electron for each flavor
     325              :   ! The measurement is done every dmftctqmc_meas*dmftctqmc_mrka sweep
     326              :   ! e.g. : meas=2 mrka=10 -> every 20 sweeps sum_i c+(ti)c(t'i) is measured
     327              : 
     328              :   integer :: dmftctqmc_order
     329              :   ! ABINIT CTQMC: Gives perturbation order of CTQMC solver
     330              :   ! 0 : nothing, >=1 max order evaluated in Perturbation.dat
     331              : 
     332              :   integer :: dmftqmc_l
     333              :   ! Number of points on the imaginary time grid for G(tau) and Delta(tau)
     334              : 
     335              : !  integer :: dmft_mag
     336              : !  ! 0 if non magnetic calculation, 1 if magnetic calculation
     337              : 
     338              :   integer :: dmftqmc_seed
     339              :   ! Seed for CTQMC (only for ABINIT)
     340              : 
     341              :   integer :: dmftqmc_therm
     342              :   ! Number of thermalization steps for CTQMC (only for ABINIT, and for TRIQS when we don't restart from a previous configuration)
     343              : 
     344              :   integer :: gpu_option
     345              :   ! Wether to use GPU implementation (expected values: ABI_GPU_DISABLED, ABI_GPU_OPENMP)
     346              : 
     347              :   integer :: idmftloop
     348              :   ! Current iteration in the DFT+DMFT loop
     349              : 
     350              :   integer :: ientropy
     351              :   ! activate evaluation of terms for alternative calculation of entropy in DMFT
     352              : 
     353              :   integer :: ireadctqmcdata
     354              :   ! Internal flag to indicate if an input CTQMC_DATA file must be read
     355              : 
     356              :   integer :: ireadself
     357              :   ! Internal flag to indicate if an input self file must be read
     358              : 
     359              :   integer :: ixc
     360              :   ! Index of the XC functional
     361              : 
     362              :   integer :: kptopt
     363              :   ! Option to generate kpts
     364              : 
     365              :   integer :: lchipsiortho
     366              :   ! Internal flag
     367              :   ! =0 <Chi|Psi> is not orthonormalized
     368              :   ! =1 <Chi|Psi> is orthonormalized
     369              : 
     370              :   integer :: maxlpawu
     371              :   ! Maximal correlated l over all atoms
     372              : 
     373              :   integer :: maxmeshsize
     374              :   ! Maximal size of the radial mesh over all atoms
     375              : 
     376              :   integer :: maxnproju
     377              :   ! Maximal number of correlated projectors over all atoms
     378              : 
     379              :   integer :: mband
     380              :   ! Total number of bands
     381              : 
     382              :   integer :: mbandc
     383              :   ! Total number of correlated bands
     384              : 
     385              :   integer :: mkmem
     386              :   ! Number of k-points handled by the current process within the DFT
     387              :   ! parallelization scheme
     388              : 
     389              :   integer :: myproc
     390              :   ! Rank in the global communicator
     391              : 
     392              :   integer :: natom
     393              :   ! Number of atoms
     394              : 
     395              :   integer :: natpawu
     396              :   ! Number of correlated atoms
     397              : 
     398              :   integer :: nkpt
     399              :   ! Number of k-points in the IBZ.
     400              : 
     401              :   !integer :: nspden
     402              :   ! Number of spin densities
     403              : 
     404              :   integer :: nproc
     405              :   ! Total number of MPI processes
     406              : 
     407              :   integer :: nspinor
     408              :   ! Number of spinor components
     409              : 
     410              :   integer :: nsppol
     411              :   ! Number of spin polarizations
     412              : 
     413              :   integer :: nsym
     414              :   ! Number of symmetries
     415              : 
     416              :   integer :: ntypat
     417              :   ! Number of atom types
     418              : 
     419              :   integer :: prtdos
     420              :   ! Print DOS when >=1
     421              : 
     422              :   integer :: prtvol
     423              :   ! Flag for different print options
     424              : 
     425              :   integer :: spacecomm
     426              :   ! MPI_COMM_WORLD
     427              : 
     428              :   integer :: unpaw
     429              :   ! File number for cprj
     430              : 
     431              :   integer :: use_dmft
     432              :   ! 1 if non diagonal occupations are used, else 0
     433              : 
     434              :   integer :: use_fixed_self
     435              :   ! Impose a fixed self-energy during the first use_fixed_self iterations
     436              : 
     437              :   integer :: use_sc_dmft
     438              :   ! 1 for charge-self consistent calculations
     439              : 
     440              :   logical :: dmft_triqs_leg_measure
     441              :   ! TRIQS CTQMC: Flag to activate Legendre measurement
     442              : 
     443              :   logical :: dmft_triqs_measure_density_matrix
     444              :   ! TRIQS CTQMC: Flag to activate the measurement of the density matrix
     445              : 
     446              :   logical :: dmft_triqs_move_double
     447              :   ! TRIQS CTQMC: Flag to activate the double moves
     448              : 
     449              :   logical :: dmft_triqs_move_shift
     450              :   ! TRIQS CTQMC: Flag to activate the shift move
     451              : 
     452              :   logical :: dmft_triqs_off_diag
     453              :   ! TRIQS CTQMC: Flag to sample the off-diagonal elements of the Green's function
     454              : 
     455              :   logical :: dmft_triqs_prt_entropy
     456              :   ! TRIQS CTQMC: Flag to print more information during entropy calculation
     457              : 
     458              :   logical :: dmft_triqs_time_invariance
     459              :   ! TRIQS CTQMC: Flag to activate the use of time invariance for the sampling
     460              :   ! of the density matrix
     461              : 
     462              :   logical :: dmft_triqs_use_norm_as_weight
     463              :   ! TRIQS CTQMC: Flag to activate the use of the norm of the matrix as weight
     464              :   ! instead of the trace
     465              : 
     466              :   real(dp) :: dmft_charge_prec
     467              :   ! Precision on charge required for determination of fermi level (fermi_green)
     468              : 
     469              :   real(dp) :: dmft_fermi_prec
     470              :   ! Required precision on Fermi level (fermi_green) during the DMFT SCF cycle, (=> ifermie_cv)
     471              :   ! used also for self (new_self)  (=> iself_cv).
     472              : 
     473              :   real(dp) :: dmft_fermi_step
     474              :   ! When dmft_optim = 0, step increment to find the upper and lower bounds of the Fermi level
     475              :   ! When dmft_optim = 1, maximal step size in the Fermi level search
     476              : 
     477              :   real(dp) :: dmft_lcpr
     478              :   ! Required precision on local correlated charge in order to stop SCF
     479              :   ! DMFT cycle (integrate_green) => ichargeloc_cv
     480              : 
     481              :   real(dp) :: dmft_magnfield_b
     482              :   ! Value of the applied magnetic field in Tesla
     483              : 
     484              :   real(dp) :: dmft_mxsf
     485              :   ! Mixing coefficient for Self-Energy during the SCF DMFT cycle.
     486              : 
     487              :   real(dp) :: dmft_tolfreq
     488              :   ! Required precision on local correlated density matrix (depends on
     489              :   ! frequency mesh), used in m_dmft/dmft_solve
     490              : 
     491              :   real(dp) :: dmft_triqs_det_precision_error
     492              :   ! TRIQS CTQMC: Error threshold for the deviation of the determinant when a check is performed.
     493              : 
     494              :   real(dp) :: dmft_triqs_det_precision_warning
     495              :   ! TRIQS CTQMC: Warning threshold for the deviation of the determinant when a check is performed.
     496              : 
     497              :   real(dp) :: dmft_triqs_det_singular_threshold
     498              :   ! TRIQS CTQMC: Threshold when checking if the determinant is singular.
     499              : 
     500              :   real(dp) :: dmft_triqs_epsilon
     501              :   ! TRIQS CTQMC: Threshold for singular values of the kernel matrix for the DLR fit
     502              : 
     503              :   real(dp) :: dmft_triqs_imag_threshold
     504              :   ! TRIQS CTQMC: Threshold for the imaginary part of Delta(tau)
     505              : 
     506              :   real(dp) :: dmft_triqs_lambda
     507              :   ! TRIQS CTQMC: Cutoff for the real frequency grid for the DLR fit
     508              : 
     509              :   real(dp) :: dmft_triqs_pauli_prob
     510              :   ! TRIQS CTQMC: Probability for proposing Pauli-aware insert and remove
     511              : 
     512              :   real(dp) :: dmft_triqs_shift_mu
     513              :   ! TRIQS CTQMC: Shift of the chemical potential for thermodynamic integration
     514              : 
     515              :   real(dp) :: dmft_triqs_tol_block
     516              :   ! TRIQS CTQMC: Off-diagonal elements below this threshold are set to 0
     517              : 
     518              :   real(dp) :: dmft_wanrad
     519              :   ! Maximal radius for print of the Wannier functions
     520              : 
     521              :   real(dp) :: dmftqmc_n
     522              :   ! ABINIT CTQMC: Nb of sweeps
     523              : 
     524              :   real(dp) :: e_dc
     525              :   ! Double counting energy
     526              : 
     527              :   real(dp) :: e_hu
     528              :   ! Interaction energy
     529              : 
     530              :   real(dp) :: fermie
     531              :   ! DMFT Fermi level
     532              : 
     533              :   real(dp) :: fermie_dft
     534              :   ! DFT Fermi level
     535              : 
     536              :   real(dp) :: j_for_s
     537              :   ! Variable for evaluation of correlation energy for U=0 in the entropic
     538              :   ! calculation
     539              : 
     540              :   real(dp) :: nelectval
     541              :   ! Number of valence electrons
     542              : 
     543              :   real(dp) :: sdmft
     544              :   ! DFT+DMFT total entropy
     545              : 
     546              :   real(dp) :: simp
     547              :   ! DFT+DMFT entropy of the impurity electrons
     548              : 
     549              :   real(dp) :: temp
     550              :   ! Temperature (Ha)
     551              : 
     552              :   real(dp) :: u_for_s
     553              :   ! Variable for evaluation of correlation energy for U=0 in the entropic
     554              :   ! calculation
     555              : 
     556              :   character(len=fnlen) :: filapp
     557              :   ! Output file name
     558              : 
     559              :   character(len=fnlen) :: filctqmcdatain
     560              :   ! Input file name for CTQMC_DATA file
     561              : 
     562              :   character(len=fnlen) :: filnamei
     563              :   ! Input file name
     564              : 
     565              :   character(len=fnlen) :: filselfin
     566              :   ! Input file name for self file
     567              : 
     568              :   integer, allocatable :: bandc_proc(:)
     569              :   ! Proc index (on comm_band) for each correlated band in DMFT (for kgb paral)
     570              : 
     571              :   integer, allocatable :: exclude_bands(:)
     572              :   ! Gives the bands than are not in the DMFT calculations.
     573              : 
     574              :   integer, allocatable :: include_bands(:)
     575              :   ! For each bands included in the calculation (1..mbandc), include_bands
     576              :   ! gives the index in the full band index  (1...mband)
     577              : 
     578              :   integer, allocatable :: lpawu(:)
     579              :   ! Correlated l for each atom (set to -1 if not correlated)
     580              : 
     581              :   integer, allocatable :: siz_proj(:)
     582              :   ! Size of the radial mesh for the DMFT orbital, for each atom type.
     583              : 
     584              :   logical, allocatable :: band_in(:)
     585              :   ! True for each band included in the calculation
     586              : 
     587              :   logical, allocatable :: use_bandc(:)
     588              :   ! True for each proc wich has at least one band involved in DMFT non diagonal
     589              :   ! occupations on band parallelism
     590              : 
     591              :   real(dp), allocatable :: edc(:)
     592              :   ! Double counting energy for each atom (only used as a temporary for dmft_dc=8)
     593              : 
     594              :   real(dp), allocatable :: edcdc(:)
     595              :   ! Integral of Vdc * rho for each atom (only used as a temporary for dmft_dc=8)
     596              : 
     597              :   real(dp), allocatable :: eigen_dft(:,:,:)
     598              :   ! DFT eigenvalues for each correlated band, k-point, polarization
     599              : 
     600              :   real(dp), allocatable :: occnd(:,:,:,:,:)
     601              :   ! Non diagonal band-occupation for each k-point, polarization.
     602              : 
     603              :   real(dp), allocatable :: omega_lo(:)
     604              :   ! Imaginary frequencies
     605              : 
     606              :   real(dp), allocatable :: omega_r(:)
     607              :   ! Real frequencies
     608              : 
     609              :   real(dp), allocatable :: phi_int(:,:)
     610              :   ! Integral of <Chi|Phi> for every correlated projector and atom type
     611              : 
     612              :   real(dp), allocatable :: phimtphi(:,:,:)
     613              :   ! Phi-Phi_tilde for every r,correlated projector and atom type
     614              : 
     615              :   real(dp), allocatable :: phimtphi_int(:,:)
     616              :   ! Integral of <Chi|Phi-Phi_tilde> for every correlated projector and atom type
     617              : 
     618              :   real(dp), allocatable :: symrec_cart(:,:,:)
     619              :   ! Symmetries in cartesian coordinates
     620              : 
     621              :   real(dp), allocatable :: wgt_wlo(:)
     622              :   ! Weight of the imaginary frequencies
     623              : 
     624              :   real(dp), allocatable :: ylm(:,:,:,:)
     625              :   ! Ylm(k+G) for each G,m,l,k
     626              : 
     627              : !  real(dp), allocatable :: phi0phiiint(:)
     628              : !  ! non diagonal band-occupation for each k-point, polarisation.
     629              : 
     630              :   complex(dp), allocatable :: bessel(:,:,:,:)
     631              :   ! 4*pi*(i**l)*jl(|k+G|r)*r/sqrt(ucvol) for each G,r,atom type and kpt
     632              : 
     633              :   complex(dp), allocatable :: bessel_int(:,:,:)
     634              :   ! Integral over r of bessel(ig,:,iat,ikpt)
     635              : 
     636              :   complex(dp), allocatable :: buf_psi(:)
     637              :   ! Temporary buffer for the computation of Wannier function
     638              : 
     639              :   complex(dp), allocatable :: chipsi(:,:,:,:,:)
     640              :   ! Hermitian product <Chi|Psi> for each flavor, correlated band,
     641              :   ! k-point, polarization and atom
     642              : 
     643              :   complex(dp), allocatable :: dpro(:,:,:)
     644              :   ! Exp(i(k+G).xred(iatom)) for each G,correlated atom and k
     645              : 
     646              :   complex(dp), allocatable :: jmj2ylm(:,:,:)
     647              :   ! Transformation matrix from JmJ to Ylm basis for each lpawu
     648              : 
     649              :   complex(dp), allocatable :: slm2ylm(:,:,:)
     650              :   ! Transformation matrix from real to complex harmonics for each lpawu
     651              : 
     652              :   complex(dp), allocatable :: wannier(:,:,:)
     653              :   ! Wannier functions for each r,flavor and atom
     654              : 
     655              :   complex(dp), allocatable :: zarot(:,:,:,:)
     656              :   !  Coeffs of the transformation of real spherical
     657              :   !  harmonics under the symmetry operations symrec.
     658              : 
     659              :   integer, ABI_CONTIGUOUS pointer :: dmft_nominal(:) => null()
     660              :   ! Only relevant when dmft_dc=7. Nominal occupancies for each atom.
     661              : 
     662              :   integer, pointer :: indsym(:,:) => null()
     663              :   ! Label of atom into which iatom is sent by the INVERSE of the
     664              :   ! symmetry operation symrel(isym)
     665              : 
     666              :   integer, pointer :: int_meshsz(:) => null()
     667              :   ! PAW integration radius for each atom type
     668              : 
     669              :   integer, ABI_CONTIGUOUS pointer :: nband(:) => null()
     670              :   ! Number of bands for each k-point and polarization
     671              : 
     672              :   integer, ABI_CONTIGUOUS pointer :: npwarr(:) => null()
     673              :   ! Number of plane waves on current process for each k-point
     674              : 
     675              :   integer, ABI_CONTIGUOUS pointer :: typat(:) => null()
     676              :   ! Type of each atom
     677              : 
     678              :   real(dp), ABI_CONTIGUOUS pointer :: dmft_shiftself(:) => null()
     679              :   ! Initial shift of the self-energy for each atom
     680              : 
     681              :   real(dp), ABI_CONTIGUOUS pointer :: eigen(:) => null()
     682              :   ! DFT eigenvalues
     683              : 
     684              :   real(dp), pointer :: fixed_self(:,:,:,:) => null()
     685              :   ! Fixed self-energy (only used when use_fixed_self > 0)
     686              : 
     687              :   real(dp), ABI_CONTIGUOUS pointer :: wtk(:) => null()
     688              :   ! Weights for each k-point
     689              : 
     690              :   type(CtqmcInterface), allocatable :: hybrid(:)
     691              : 
     692              :   type(data4entropyDMFT_t) :: forentropyDMFT
     693              : 
     694              :   type(pawrad_type), allocatable :: radgrid(:)
     695              :   ! Radial grid for each type of atom
     696              : 
     697              :   type(mpi_distrib_dmft_type) :: distrib
     698              :   ! MPI parallelization for imaginary frequencies
     699              : 
     700              :   type(mpi_distrib_dmft_type) :: distrib_r
     701              :   ! MPI parallelization for real frequencies
     702              : 
     703              :  end type paw_dmft_type
     704              : !!***
     705              : 
     706              : !----------------------------------------------------------------------
     707              : 
     708              : CONTAINS  !========================================================================================
     709              : !!***
     710              : 
     711              : !!****f* m_paw_dmft/init_sc_dmft
     712              : !! NAME
     713              : !! init_sc_dmft
     714              : !!
     715              : !! FUNCTION
     716              : !!  Allocate variables used in type paw_dmft_type.
     717              : !!
     718              : !! INPUTS
     719              : !! dtset <type(dataset_type)>=all input variables for this dataset
     720              : !! mpsang = highest angular momentum + 1
     721              : !! paw_dmft <type(paw_dmft_type)>= paw+dmft related data
     722              : !! gprimd(3,3) = dimensional reciprocal space primitive translations
     723              : !! kg(3,mpw*mkmem) = reduced planewave coordinates.
     724              : !! mpi_enreg = information about MPI parallelization
     725              : !! npwarr(nkpt) = number of planewaves in basis at this k point
     726              : !! occ = DFT occupations
     727              : !! pawang <type(pawang)>=paw angular mesh and related data
     728              : !! pawrad <type(pawrad_type)>=paw radial mesh and related data
     729              : !! pawtab(ntypat*usepaw) <type(pawtab_type)>=paw tabulated starting data
     730              : !! rprimd(3,3) = dimensional primitive vectors
     731              : !! ucvol = unit cell volume in bohr**3.
     732              : !! unpaw = unit number for temporary PAW data
     733              : !! use_sc_dmft = for charge self-consistent calculations
     734              : !! xred(3,natom) = reduced dimensionless atomic coordinates
     735              : !! ylm(mpw*mkmem,mpsang*mpsang*useylm) = real spherical harmonics for each G and k point
     736              : !!
     737              : !! OUTPUTS
     738              : !! paw_dmft = datastructure for dmft
     739              : !!
     740              : !! SOURCE
     741              : 
     742         5629 : subroutine init_sc_dmft(dtset,mpsang,paw_dmft,gprimd,kg,mpi_enreg,npwarr,occ,pawang, &
     743        11258 :                       & pawrad,pawtab,rprimd,ucvol,unpaw,use_sc_dmft,xred,ylm)
     744              : 
     745              : !Arguments ------------------------------------
     746              : !scalars
     747              :  integer, intent(in) :: mpsang
     748              :  integer, optional, intent(in) :: unpaw,use_sc_dmft
     749              :  real(dp), optional, intent(in) :: ucvol
     750              : !type
     751              :  type(paw_dmft_type), intent(inout) :: paw_dmft
     752              :  type(MPI_type), optional, intent(in) :: mpi_enreg
     753              :  type(dataset_type), target, intent(in) :: dtset
     754              :  type(pawtab_type), optional, intent(in) :: pawtab(dtset%ntypat)
     755              :  type(pawang_type), optional, intent(in) :: pawang
     756              :  type(pawrad_type), target, optional, intent(in) :: pawrad(dtset%ntypat)
     757              : ! arrays
     758              :  real(dp), optional, intent(in) :: occ(dtset%mband*dtset%nkpt*dtset%nsppol)
     759              :  integer, target, optional, intent(in) :: npwarr(dtset%nkpt)
     760              :  integer, optional, intent(in) :: kg(3,dtset%mpw*dtset%mkmem)
     761              :  real(dp), optional, intent(in) :: gprimd(3,3),rprimd(3,3),xred(3,dtset%natom)
     762              :  real(dp), optional, intent(in) :: ylm(dtset%mpw*dtset%mkmem,mpsang*mpsang)
     763              : !Local variables ------------------------------------
     764              :  integer :: bdtot_index,dmft_dc,dmft_solv,dmftbandi,dmftbandf,fac,i,iatom
     765              :  integer :: iatom1,iband,icb,ig,ik,ikg,ikpt,im,im1,indproj,iproj,ir,isppol
     766              :  integer :: itypat,jc1,jj,jm,ll,lpawu,lpawu1,maxlpawu,mband,mbandc,mesh_size,mesh_type
     767              :  integer :: mkmem,ml1,mm,mpw,ms1,myproc,natom,nband_k,ndim,nkpt,nproc,nproju,npw
     768              :  integer :: nspinor,nsppol,nsym,ntypat,nwli,off_diag,siz_paw,siz_proj,siz_wan,use_dmft
     769              :  logical :: t2g,use_full_chipsi,verif,x2my2d
     770              :  real(dp) :: bes,besp,fac_bessel,invsqrt2lp1,lstep,norm,onem,rad,rint,rstep,sumwtk,xj,xmj
     771              :  complex(dpc) :: j_l
     772              :  integer, parameter :: mt2g(3) = (/1,2,4/)
     773         5679 :  integer, allocatable :: ind_msml(:,:)
     774         5679 :  logical, allocatable :: lcycle(:),typcycle(:)
     775         5679 :  real(dp), allocatable :: rmax(:),kpg(:,:),kpg_norm(:)
     776              :  character(len=500) :: dc_string,lda_string,message
     777              : !************************************************************************
     778              : 
     779         5679 :  mband   = dtset%mband
     780         5679 :  mkmem   = dtset%mkmem
     781         5679 :  natom   = dtset%natom
     782         5679 :  nkpt    = dtset%nkpt
     783         5679 :  nspinor = dtset%nspinor
     784         5679 :  nsppol  = dtset%nsppol
     785         5679 :  nsym    = dtset%nsym
     786         5679 :  ntypat  = dtset%ntypat
     787              : 
     788         5679 :  dmftbandi = dtset%dmftbandi
     789         5679 :  dmftbandf = dtset%dmftbandf
     790         5679 :  dmft_dc   = dtset%dmft_dc
     791         5679 :  dmft_solv = dtset%dmft_solv
     792         5679 :  off_diag  = dtset%dmft_triqs_off_diag
     793         5679 :  use_dmft  = abs(dtset%usedmft)
     794         5679 :  paw_dmft%use_dmft = use_dmft
     795         5679 :  paw_dmft%use_sc_dmft = 0
     796              : 
     797         5679 :  paw_dmft%dmftbandf = dmftbandf
     798         5679 :  paw_dmft%dmftbandi = dmftbandi
     799         5679 :  paw_dmft%mband     = mband
     800         5679 :  paw_dmft%mkmem     = mkmem
     801         5679 :  paw_dmft%nkpt      = nkpt
     802         5679 :  paw_dmft%nsym      = nsym
     803         5679 :  paw_dmft%ntypat    = ntypat
     804              : 
     805              :  ! Spin related variables
     806         5679 :  paw_dmft%nsppol    = nsppol
     807         5679 :  paw_dmft%nspinor   = nspinor
     808         5679 :  paw_dmft%idmftloop = 0
     809         5679 :  paw_dmft%mbandc    = 0
     810              :  !paw_dmft%nspden      = nspden
     811              : 
     812         5679 :  paw_dmft%dmft_read_occnd = dtset%dmft_read_occnd
     813              : 
     814         5679 :  if(use_dmft == 10) then
     815            0 :    ABI_MALLOC(paw_dmft%occnd,(2,mband,mband,nkpt,nsppol*1))
     816            0 :    ABI_MALLOC(paw_dmft%band_in,(mband*1))
     817            0 :    ABI_MALLOC(paw_dmft%include_bands,((dmftbandf-dmftbandi+1)*1))
     818            0 :    ABI_MALLOC(paw_dmft%exclude_bands,(mband*1))
     819              :  else
     820        34074 :    ABI_MALLOC(paw_dmft%occnd,(2,mband,mband,nkpt,nsppol*use_dmft))
     821        17037 :    ABI_MALLOC(paw_dmft%band_in,(mband*use_dmft))
     822        17037 :    ABI_MALLOC(paw_dmft%include_bands,((dmftbandf-dmftbandi+1)*use_dmft))
     823        11358 :    ABI_MALLOC(paw_dmft%exclude_bands,(mband*use_dmft))
     824              :  endif
     825              : 
     826         5679 :  if (use_dmft == 0) return
     827              : 
     828              :  ! In the case where no kpt is treated by the current CPU (ie sum(isppoltab)=0),
     829              :  ! dtset%mkmem is set to nkpt by convention in Abinit. We set it to its true value 0.
     830          114 :  if (sum(mpi_enreg%my_isppoltab(1:nsppol)) == 0) mkmem = 0
     831              : 
     832              :  ! Check processors for DMFT
     833              :  ! Initialize spaceComm, myproc, and nproc
     834              :  !spacecomm=mpi_enreg%comm_cell
     835              :  !myproc=mpi_enreg%me_cell
     836              :  !nproc=mpi_enreg%nproc_cell
     837              :  !spacecomm = mpi_enreg%comm_world
     838           43 :  myproc = mpi_enreg%me
     839           43 :  nproc  = mpi_enreg%nproc
     840              :  !print *, " spacecomm,myproc,nproc",spacecomm,myproc,nproc
     841           43 :  paw_dmft%spacecomm = mpi_enreg%comm_world
     842           43 :  paw_dmft%myproc    = myproc
     843           43 :  paw_dmft%nproc     = nproc
     844              : 
     845           43 :  paw_dmft%unpaw = unpaw
     846              : 
     847           43 :  if (dtset%nbandkss == 0) paw_dmft%use_sc_dmft = use_sc_dmft
     848              : 
     849              :  ! Do not comment these lines: it guarantees the parallelism in DMFT/QMC will work.
     850           43 :  if (xmpi_comm_size(xmpi_world) /= xmpi_comm_size(mpi_enreg%comm_world)) &
     851            0 :    & ABI_ERROR("Someone changed the k-point parallelism again")
     852              : 
     853           43 :  if (dmft_solv == 0) then
     854            3 :    do itypat=1,ntypat
     855            2 :      if (pawtab(itypat)%lpawu == -1) cycle
     856            2 :      if ((pawtab(itypat)%upawu > tol5) .or. (pawtab(itypat)%jpawu > tol5)) then
     857            0 :        write(message,'(2a,i5,2a,2e15.6)') ch10,&
     858            0 :          & ' option dmft_solv=0 requires upaw=jpaw=0 for species',itypat,ch10,&
     859            0 :          & ' Value of upawu and jpawu are here',pawtab(itypat)%upawu,pawtab(itypat)%jpawu
     860            0 :        ABI_ERROR(message)
     861              :      end if
     862              :    end do ! itypat
     863              :  end if ! dmft_solv=0
     864              : 
     865              : ! todo_ab: why upaw and jpawu are not zero (on bigmac) if lpawu==-1 ?
     866              : ! if(paw_dmft%dmft_solv==0.and.&
     867              : !& (maxval(abs(pawtab(:)%upawu))>tol5.or.maxval(abs(pawtab(:)%jpawu))>tol5))
     868              : !then
     869              : !   write(message, '(a,a,2f12.3)' )ch10,&
     870              : !&   ' option dmft_solv=0 requires
     871              : !upaw=jpaw=0',maxval(abs(pawtab(:)%upawu)),maxval(abs(pawtab(:)%jpawu))
     872              : !    ABI_WARNING(message)
     873              : ! endif
     874              : 
     875           43 :  paw_dmft%dmftcheck = dtset%dmftcheck
     876              : 
     877           43 :  write(message,'(2a,i4)') ch10,'-       ( number of procs used in dmft ) = ',nproc
     878          129 :  call wrtout([std_out,ab_out],message,'COLL')
     879           43 :  write(std_out_default,'(2a,i4)') ch10,'       ( current proc is        ) = ',myproc
     880              :   ! write(ab_out_default,'(2a,i3)') ch10,'       ( current proc is        ) =', myproc
     881           43 :  if (myproc == nproc-1) write(std_out_default,'(2a,i4)') ch10,'      ( last proc            ) = ',myproc
     882              :   !   write(ab_out_default,'(2a,i3)') ch10,'       ( last proc            ) =', myproc
     883              : 
     884              : !#ifdef HAVE_MPI
     885              : ! call MPI_COMM_SIZE(MPI_COMM_WORLD,nb_procs,ie)
     886              : ! write(6,*) "nprocs,nb_procs",nproc,nb_procs
     887              : ! if(nb_procs/=nproc)  then
     888              : !   message = ' Number of procs used in DMFT is erroneously computed '
     889              : !   ABI_ERROR(message)
     890              : ! endif
     891              : !#endif
     892              : 
     893              : !=============================
     894              : !==  Associate pointers
     895              : !=============================
     896              : 
     897           43 :  paw_dmft%nband => dtset%nband(:)
     898           43 :  paw_dmft%dmft_shiftself => dtset%dmft_shiftself(:)
     899           43 :  paw_dmft%dmft_nominal => dtset%dmft_nominal(:)
     900           43 :  paw_dmft%npwarr => npwarr(:)
     901              : 
     902              : ! TODO: Make it work for usedmdft = -1 (interface with Wannier90 needs spinor
     903              : ! generalization)
     904           43 :  if(nspinor==2.and.dtset%nspden==1.and.use_dmft==10) then
     905            0 :    message = ' nspinor==2 and nspden=1 and usedmft=10 is not implemented yet'
     906            0 :    ABI_ERROR(message)
     907              :  endif
     908              : 
     909         1042 :  paw_dmft%band_in(:) = .false.
     910      1051880 :  paw_dmft%occnd(:,:,:,:,:) = zero
     911           43 :  paw_dmft%use_dmft    = use_dmft
     912              : 
     913              :  ! if (bandkss/=0) then
     914              :  !   paw_dmft%use_sc_dmft = 0
     915              :  ! else
     916              :  !   paw_dmft%use_sc_dmft = use_sc_dmft
     917              :  ! endif
     918              :  ! paw_dmft%dmft_read_occnd = dmft_read_occnd
     919              :  ! paw_dmft%idmftloop=0
     920              :  ! paw_dmft%mbandc  = 0
     921              : 
     922           43 :  icb = 0
     923           43 :  mbandc = 0
     924         1042 :  do iband=1,mband
     925         1042 :   if (iband >= dmftbandi .and. iband <= dmftbandf) then
     926          547 :    paw_dmft%band_in(iband)=.true.
     927          547 :    mbandc = mbandc + 1
     928          547 :    paw_dmft%include_bands(mbandc) = iband
     929              :   else
     930          452 :     icb = icb + 1
     931          452 :     paw_dmft%exclude_bands(icb) = iband
     932              :   end if ! band>=bandi and band<=bandf
     933              :  end do ! iband
     934           43 :  paw_dmft%mbandc = mbandc
     935              : 
     936           43 :  bdtot_index = 1
     937          114 :  do isppol=1,nsppol
     938          868 :    do ikpt=1,nkpt
     939          754 :      nband_k = paw_dmft%nband(ikpt+(isppol-1)*nkpt)
     940        16705 :      do iband=1,nband_k
     941        15880 :        paw_dmft%occnd(1,iband,iband,ikpt,isppol) = occ(bdtot_index)
     942        16634 :        bdtot_index = bdtot_index + 1
     943              :      end do ! iband
     944              :    end do ! ikpt
     945              :  end do ! isppol
     946              : 
     947           43 :  if (paw_dmft%use_sc_dmft /= 0 .and. mpi_enreg%paral_kgb /= 0) then
     948            4 :    call init_sc_dmft_paralkgb(paw_dmft,mpi_enreg)
     949              :  end if
     950              : 
     951           43 :  if (mbandc /= dmftbandf-dmftbandi+1 .and. paw_dmft%use_dmft /= 10) then
     952            0 :    write(message,'(5a)') ' BUG init_sc_dmft',ch10,&
     953            0 :     & '  number of bands in dmft is not correctly computed ',ch10, &
     954            0 :     & '  Action : check the code'
     955            0 :    ABI_BUG(message)
     956              :  end if
     957              : 
     958           43 :  if (dmft_solv == 6 .or. dmft_solv == 7) then
     959              : 
     960            0 :    if (off_diag == 1) then
     961            0 :      write(message,'(3a)') "WARNING: You have activated the sampling of the off-diagonal elements ", &
     962            0 :                          & "in TRIQS/CTHYB. Some features are not available, and you will not be ", &
     963            0 :                          & "able to compute an energy."
     964            0 :      ABI_WARNING(message)
     965              :    end if
     966              : #ifdef HAVE_TRIQS_COMPLEX
     967              :    if (off_diag == 0) then
     968              :      write(message,'(2a)') "WARNING: You have compiled with the complex version of TRIQS/CTHYB, yet you do not", &
     969              :                      & " sample any off-diagonal element. This is a waste of computation time."
     970              :      ABI_WARNING(message)
     971              :    end if
     972              : #else
     973              :    if (off_diag == 1) then
     974            0 :      write(message,'(3a)') "WARNING: You have compiled with the real version of TRIQS/CTHYB, yet you have", &
     975            0 :                 & " activated the sampling of the off-diagonal elements. Thus their imaginary part will be", &
     976            0 :                 & " neglected. You'll have to check that this is a valid approximation."
     977            0 :      ABI_WARNING(message)
     978              :    end if
     979              : #endif
     980              :  end if ! dmft_solv=6 or 7
     981              : 
     982           43 :  write(message,'(7a)') ch10, &
     983           43 :   & ch10," ******************************************", &
     984           43 :   & ch10," DFT+DMFT Method is used", &
     985           86 :   & ch10," ******************************************"
     986          129 :  call wrtout([std_out,ab_out],message,'COLL')
     987              : 
     988           43 :  if (use_dmft /= 10) then
     989              :    if (dmft_solv == 0) then
     990            1 :      write(message,'(2a)') ch10,' DMFT check: no solver and U=J=0'
     991              :    else if (dmft_solv == 1) then
     992            1 :      write(message,'(2a)') ch10,' DMFT check: static solver'
     993              :    else if (dmft_solv == -1) then
     994            1 :      write(message,'(2a)') ch10,' DMFT check: static solver without renormalization of projectors: should recover DFT+U'
     995              :    else if (dmft_solv == 2) then
     996           14 :      write(message,'(2a)') ch10,' DMFT uses the Hubbard one solver'
     997              :    else if (dmft_solv == 4) then
     998            0 :      write(message,'(2a)') ch10,' DMFT uses the Hirsch Fye solver'
     999              :    else if (dmft_solv == 5) then
    1000           26 :      write(message,'(2a)') ch10,' DMFT uses the Continuous Time Quantum Monte Carlo solver of ABINIT'
    1001              :    else if (dmft_solv == 6) then
    1002            0 :      write(message,'(2a)') ch10,' DMFT uses the Continuous Time Quantum Monte Carlo solver of TRIQS &
    1003            0 :        &(with density density interactions)'
    1004              :    else if (dmft_solv == 7) then
    1005            0 :      write(message,'(2a)') ch10,' DMFT uses the Continuous Time Quantum Monte Carlo solver of TRIQS &
    1006            0 :        &(with rotationally invariant interactions)'
    1007              :    else if (dmft_solv == 8) then
    1008            0 :       write(message,'(2a)') ch10,' DMFT uses the Continuous Time Quantum Monte Carlo solver of ABINIT'
    1009              :    else if (dmft_solv == 9) then
    1010            0 :      write(message,'(2a)') ch10,' DMFT uses the python invocation of TRIQS, for which you need to &
    1011            0 :        & give your personal script'
    1012              :     else if (dmft_solv == 10) then
    1013            0 :       write(message,'(2a)') ch10,' DMFT uses the Complex Continuous Time Quantum Monte Carlo solver of ABINIT'
    1014              :    end if ! dmft_solv
    1015              :  else if(use_dmft == 10) then
    1016            0 :    write(message, '(a,a)') ch10,' DMFT uses the python invocation and orbitals constructed using Wannier90 '
    1017              :  endif
    1018          129 :  call wrtout([std_out,ab_out],message,'COLL')
    1019              : 
    1020              :  ! OG: What is all that? Something as moved? START
    1021           43 :  if (use_dmft /= 10) then
    1022              :  if (dmft_dc == 1) then
    1023           26 :    dc_string = "Magnetic FLL (Full Localized Limit)"
    1024              :  else if (dmft_dc == 2) then
    1025            0 :    dc_string = "Magnetic AMF (Around Mean Field)"
    1026              :  else if (dmft_dc == 5) then
    1027           17 :    dc_string = "Non-Magnetic FLL (Full Localized Limit)"
    1028              :  else if (dmft_dc == 6) then
    1029            0 :    dc_string = "Non-Magnetic AMF (Around Mean Field)"
    1030              :  else if (dmft_dc == 7) then
    1031            0 :    dc_string = "Non-Magnetic nominal"
    1032              :  else if (dmft_dc == 8) then
    1033            0 :    dc_string = "Non-Magnetic exact"
    1034              :  end if
    1035           43 :  dc_string = trim(dc_string) // " double counting"
    1036              : 
    1037           43 :  lda_string = "Magnetic DFT, with "
    1038           43 :  if (dtset%usepawu == 14) lda_string = "Non " // trim(adjustl(lda_string))
    1039           43 :  write(message,'(2(a,1x),a)') ch10,trim(adjustl(lda_string)),trim(adjustl(dc_string))
    1040          129 :  call wrtout([std_out,ab_out],message,'COLL')
    1041              : 
    1042           43 :  if (dtset%dmft_entropy == 0 .and. ((dmft_solv /= 6 .and. dmft_solv /= 7)  &
    1043              :     & .or. (dtset%dmft_triqs_entropy == 0 .or. &
    1044              :     & dtset%dmft_triqs_compute_integral == 0))) then
    1045           40 :    write(message,'(a,1x,a)') ch10,"Entropy is not computed, only the internal energy is printed"
    1046          120 :    call wrtout([std_out,ab_out],message,'COLL')
    1047              :  end if
    1048              : 
    1049           43 :  if ((dmft_solv == 6 .or. dmft_solv == 7) .and. off_diag == 1)  then
    1050              : #ifndef HAVE_TRIQS_COMPLEX
    1051            0 :    write(message,'(a,1x,a)') ch10,"The imaginary part of the Green's function is neglected"
    1052            0 :    call wrtout([std_out,ab_out],message,'COLL')
    1053              : #endif
    1054           43 :  else if (dmft_solv /= 6 .and. dmft_solv /= 7 .and. dmft_solv /= 10) then
    1055           43 :    write(message,'(a,1x,a)') ch10,"The imaginary part of the Green's function is neglected"
    1056          129 :    call wrtout([std_out,ab_out],message,'COLL')
    1057              :  end if
    1058           43 :  if (dmft_solv == 5 .or. ((dmft_solv == 6 .or. dmft_solv == 7) .and. off_diag == 0)) then
    1059           26 :    write(message,'(a,1x,a)') ch10,"The off-diagonal elements of the Green's function are neglected"
    1060           78 :    call wrtout([std_out,ab_out],message,'COLL')
    1061              :  end if
    1062              : 
    1063              : !=============================
    1064              : !==  Define integers and reals
    1065              : !=============================
    1066              : 
    1067           43 :  paw_dmft%nelectval = dble(dtset%nelect)
    1068              : 
    1069           43 :  if (dmft_solv /= 6 .and. dmft_solv /= 7) then
    1070           43 :    fac = merge(2,1,nsppol==1.and.nspinor==1)
    1071           43 :    paw_dmft%nelectval = dble(dtset%nelect-(dmftbandi-1)*nsppol*fac)
    1072              :  end if ! not use_all_bands
    1073              : 
    1074           43 :  paw_dmft%natpawu              = dtset%natpawu
    1075           43 :  paw_dmft%natom                = natom
    1076           43 :  paw_dmft%temp                 = dtset%tsmear!*unit_e
    1077           43 :  paw_dmft%dmft_hybri_limit     = dtset%dmft_hybri_limit
    1078           43 :  paw_dmft%dmft_iter            = dtset%dmft_iter
    1079           43 :  paw_dmft%dmft_entropy         = dtset%dmft_entropy
    1080           43 :  paw_dmft%dmft_kspectralfunc   = dtset%dmft_kspectralfunc
    1081           43 :  paw_dmft%dmft_magnfield       = dtset%dmft_magnfield
    1082           43 :  paw_dmft%dmft_magnfield_b     = dtset%dmft_magnfield_b
    1083           43 :  paw_dmft%dmft_dc              = dmft_dc
    1084           43 :  paw_dmft%dmft_full_chipsi     = dtset%dmft_full_chipsi
    1085           43 :  paw_dmft%dmft_wanorthnorm     = dtset%dmft_wanorthnorm
    1086           43 :  paw_dmft%prtvol               = dtset%prtvol
    1087           43 :  paw_dmft%prtdos               = dtset%prtdos
    1088           43 :  paw_dmft%dmft_tolfreq         = dtset%dmft_tolfreq
    1089           43 :  paw_dmft%dmft_lcpr            = dtset%dmft_tollc
    1090           43 :  paw_dmft%dmft_charge_prec     = dtset%dmft_charge_prec
    1091           43 :  paw_dmft%dmft_fermi_prec      = dtset%dmft_charge_prec * ten
    1092           43 :  paw_dmft%dmft_fermi_step      = dtset%dmft_fermi_step
    1093           43 :  paw_dmft%dmft_prt_maxent      = dtset%dmft_prt_maxent
    1094           43 :  paw_dmft%dmft_prtself         = dtset%dmft_prtself
    1095           43 :  paw_dmft%dmft_prtwan          = dtset%dmft_prtwan
    1096           43 :  paw_dmft%dmft_wanrad          = dtset%dmft_wanrad
    1097           43 :  paw_dmft%dmft_t2g             = dtset%dmft_t2g
    1098           43 :  paw_dmft%dmft_x2my2d          = dtset%dmft_x2my2d
    1099           43 :  paw_dmft%ixc                  = dtset%ixc
    1100              : 
    1101              :  ! for entropy (alternate external calculation)
    1102           43 :  paw_dmft%ientropy = 0
    1103           43 :  paw_dmft%u_for_s  = 4.1_dp
    1104           43 :  paw_dmft%j_for_s  = 0.5_dp
    1105              : 
    1106           43 :  paw_dmft%kptopt = dtset%kptopt
    1107              : 
    1108              : !=======================
    1109              : !==  Choose solver
    1110              : !=======================
    1111              : 
    1112           43 :  paw_dmft%dmft_solv = merge(2,dmft_solv,dmft_solv==-2)
    1113           43 :  paw_dmft%dmft_blockdiag = merge(1,0,dmft_solv==-2)
    1114              : 
    1115              : !  0: DFT, no solver
    1116              : !  1: DFT+U
    1117              : ! -1: DFT+U but DFT values are not renormalized !
    1118              : ! if((paw_dmft%dmft_solv==0.and.paw_dmft%prtvol>4).or.&
    1119              : !&   (paw_dmft%dmft_solv>=-1.and.paw_dmft%dmft_solv<=2)) then
    1120              : !   call wrtout(std_out,message,'COLL')
    1121              : !   call wrtout(ab_out,message,'COLL')
    1122              : ! endif
    1123              : 
    1124              : !=======================
    1125              : !==  Frequencies
    1126              : !=======================
    1127              : 
    1128           43 :  paw_dmft%dmft_log_freq = merge(0,1,dmft_solv==6.or.dmft_solv==7.or.dmft_solv==9)
    1129           43 :  nwli = merge(dtset%dmft_triqs_n_iw,dtset%dmft_nwli,dmft_solv==6.or.dmft_solv==7)
    1130              : 
    1131           43 :  paw_dmft%dmft_nwli = nwli
    1132           43 :  paw_dmft%dmft_nwlo = merge(dtset%dmft_nwlo,nwli,paw_dmft%dmft_log_freq==1)
    1133           43 :  paw_dmft%dmft_nwr = 800
    1134              : 
    1135           43 :  paw_dmft%dmft_rslf = dtset%dmft_rslf
    1136           43 :  paw_dmft%dmft_mxsf = dtset%dmft_mxsf
    1137              : 
    1138              : !=======================
    1139              : !==  CTQMC
    1140              : !=======================
    1141              : 
    1142           43 :  paw_dmft%dmftqmc_l     = merge(dtset%dmft_triqs_n_tau,dtset%dmftqmc_l,dmft_solv==6.or.dmft_solv==7)
    1143           43 :  paw_dmft%dmftqmc_n     = dtset%dmftqmc_n
    1144           43 :  paw_dmft%dmftqmc_seed  = dtset%dmftqmc_seed
    1145           43 :  paw_dmft%dmftqmc_therm = merge(dtset%dmft_triqs_n_warmup_cycles_init,dtset%dmftqmc_therm,dmft_solv==6.or.dmft_solv==7)
    1146              : 
    1147           43 :  paw_dmft%dmftctqmc_basis  = merge(dtset%dmft_triqs_basis,dtset%dmftctqmc_basis,dmft_solv==6.or.dmft_solv==7)
    1148           43 :  paw_dmft%dmftctqmc_check  = dtset%dmftctqmc_check
    1149           43 :  paw_dmft%dmftctqmc_correl = dtset%dmftctqmc_correl
    1150           43 :  paw_dmft%dmftctqmc_gmove  = dtset%dmftctqmc_gmove
    1151           43 :  paw_dmft%dmftctqmc_grnns  = dtset%dmftctqmc_grnns
    1152           43 :  paw_dmft%dmftctqmc_meas   = merge(dtset%dmft_triqs_length_cycle,dtset%dmftctqmc_meas,dmft_solv==6.or.dmft_solv==7)
    1153           43 :  paw_dmft%dmftctqmc_mrka   = dtset%dmftctqmc_mrka
    1154           43 :  paw_dmft%dmftctqmc_mov    = dtset%dmftctqmc_mov
    1155           43 :  paw_dmft%dmftctqmc_order  = dtset%dmftctqmc_order
    1156           43 :  paw_dmft%dmftctqmc_chains = dtset%dmftctqmc_chains
    1157           43 :  paw_dmft%dmftctqmc_localprop = dtset%dmftctqmc_localprop
    1158              : 
    1159           43 :  if (dmft_solv == 5 .or. dmft_solv >= 8) then
    1160           26 :    write(message,'(2a,i6)') ch10,&
    1161           52 :      & '=> Seed for CT-QMC inside DMFT is dmftqmc_seed=',paw_dmft%dmftqmc_seed
    1162           26 :    call wrtout(std_out,message,'COLL')
    1163              :  end if
    1164              : 
    1165              : !=======================
    1166              : !==  TRIQS CTQMC
    1167              : !=======================
    1168              : 
    1169           43 :  paw_dmft%dmft_triqs_nleg                          = dtset%dmft_triqs_n_l
    1170           43 :  paw_dmft%dmft_triqs_therm_restart                 = dtset%dmft_triqs_n_warmup_cycles_restart
    1171           43 :  paw_dmft%dmft_triqs_det_init_size                 = dtset%dmft_triqs_det_init_size
    1172           43 :  paw_dmft%dmft_triqs_det_n_operations_before_check = dtset%dmft_triqs_det_n_operations_before_check
    1173           43 :  paw_dmft%dmft_triqs_move_shift                    = (dtset%dmft_triqs_move_shift == 1)
    1174           43 :  paw_dmft%dmft_triqs_move_double                   = (dtset%dmft_triqs_move_double == 1)
    1175           43 :  paw_dmft%dmft_triqs_loc_n_min                     = dtset%dmft_triqs_loc_n_min
    1176           43 :  paw_dmft%dmft_triqs_loc_n_max                     = dtset%dmft_triqs_loc_n_max
    1177           43 :  paw_dmft%dmft_triqs_seed_a                        = dtset%dmft_triqs_random_seed_a
    1178           43 :  paw_dmft%dmft_triqs_seed_b                        = dtset%dmft_triqs_random_seed_b
    1179           43 :  paw_dmft%dmft_triqs_measure_density_matrix        = (dtset%dmft_triqs_measure_density_matrix == 1)
    1180           43 :  paw_dmft%dmft_triqs_time_invariance               = (dtset%dmft_triqs_time_invariance == 1)
    1181           43 :  paw_dmft%dmft_triqs_use_norm_as_weight            = (dtset%dmft_triqs_use_norm_as_weight == 1)
    1182           43 :  paw_dmft%dmft_triqs_leg_measure                   = (dtset%dmft_triqs_measure_g_l == 1)
    1183           43 :  paw_dmft%dmft_triqs_off_diag                      = (off_diag == 1)
    1184           43 :  paw_dmft%dmft_triqs_imag_threshold                = dtset%dmft_triqs_imag_threshold
    1185           43 :  paw_dmft%dmft_triqs_det_precision_warning         = dtset%dmft_triqs_det_precision_warning
    1186           43 :  paw_dmft%dmft_triqs_det_precision_error           = dtset%dmft_triqs_det_precision_error
    1187           43 :  paw_dmft%dmft_triqs_det_singular_threshold        = dtset%dmft_triqs_det_singular_threshold
    1188           43 :  paw_dmft%dmft_triqs_epsilon                       = dtset%dmft_triqs_dlr_epsilon
    1189           43 :  paw_dmft%dmft_triqs_lambda                        = dtset%dmft_triqs_dlr_wmax / dtset%tsmear
    1190           43 :  paw_dmft%dmft_triqs_entropy                       = dtset%dmft_triqs_entropy
    1191           43 :  paw_dmft%dmft_triqs_compute_integral              = dtset%dmft_triqs_compute_integral
    1192           43 :  paw_dmft%dmft_triqs_gaussorder                    = dtset%dmft_triqs_gaussorder
    1193           43 :  paw_dmft%dmft_triqs_nsubdivisions                 = dtset%dmft_triqs_nsubdivisions
    1194           43 :  paw_dmft%dmft_triqs_tol_block                     = dtset%dmft_triqs_tol_block
    1195           43 :  paw_dmft%dmft_triqs_read_ctqmcdata                = dtset%dmft_triqs_read_ctqmcdata
    1196           43 :  paw_dmft%dmft_triqs_pauli_prob                    = dtset%dmft_triqs_pauli_prob
    1197           43 :  paw_dmft%dmft_triqs_n_cycles                      = dtset%dmft_triqs_n_cycles
    1198           43 :  paw_dmft%dmft_triqs_prt_entropy                   = (dtset%dmft_triqs_prt_entropy == 1)
    1199           43 :  paw_dmft%dmft_triqs_shift_mu                      = dtset%dmft_triqs_shift_mu
    1200           43 :  paw_dmft%dmft_triqs_chiloc                        = dtset%dmft_triqs_chiloc
    1201           43 :  paw_dmft%dmft_triqs_chiloc_ins                    = dtset%dmft_triqs_chiloc_ins
    1202              : 
    1203              : !==============================
    1204              : !==  Variables for DMFT itself
    1205              : !==============================
    1206              : 
    1207           43 :  paw_dmft%wtk => dtset%wtk(:)
    1208              :  ! In the case where we sample the full BZ, don't overwrite the wtk with 1/nkpt when we use TRIQS
    1209           43 :  if (dtset%iscf < 0 .and. (dtset%kptopt < 0 .or. &
    1210           87 :    & (paw_dmft%dmft_solv /= 6 .and. paw_dmft%dmft_solv /= 7))) paw_dmft%wtk(:) = one / dble(nkpt)
    1211          483 :  sumwtk = sum(paw_dmft%wtk(1:nkpt))
    1212           43 :  if (abs(sumwtk-one) > tol11) then
    1213            0 :    write(message,'(a,f15.11)') ' sum of k-point is incorrect',sumwtk
    1214            0 :    ABI_BUG(message)
    1215              :  end if
    1216              : 
    1217           43 :  t2g = (paw_dmft%dmft_t2g == 1)
    1218           43 :  x2my2d = (paw_dmft%dmft_x2my2d == 1)
    1219              : 
    1220           43 :  paw_dmft%typat => dtset%typat(:)
    1221              : 
    1222          129 :  ABI_MALLOC(paw_dmft%lpawu,(natom))
    1223              : 
    1224           43 :  maxlpawu = 0
    1225          139 :  do iatom=1,natom
    1226           96 :    lpawu = pawtab(paw_dmft%typat(iatom))%lpawu
    1227           96 :    if (t2g .and. lpawu /= -1) lpawu = 1
    1228           96 :    if (x2my2d .and. lpawu /= -1) lpawu = 0
    1229           96 :    if (lpawu > maxlpawu) maxlpawu = lpawu
    1230          139 :    paw_dmft%lpawu(iatom) = lpawu
    1231              :  end do ! iatom
    1232           43 :  paw_dmft%maxlpawu = maxlpawu
    1233           43 :  ndim = 2*maxlpawu + 1
    1234              : 
    1235           43 :  paw_dmft%maxnproju = 0
    1236          129 :  ABI_MALLOC(paw_dmft%siz_proj,(ntypat))
    1237          129 :  ABI_MALLOC(lcycle,(maxlpawu+1))
    1238              : 
    1239          173 :  lcycle(:) = .true.
    1240              : 
    1241          111 :  do itypat=1,ntypat
    1242           68 :    lpawu = pawtab(itypat)%lpawu
    1243           68 :    if (lpawu == -1) cycle
    1244           43 :    if (t2g) lpawu = 1
    1245           43 :    if (x2my2d) lpawu = 0
    1246           43 :    paw_dmft%siz_proj(itypat) = size(pawtab(itypat)%proj(:))
    1247           43 :    lcycle(lpawu+1) = .false.
    1248           86 :    if (pawtab(itypat)%nproju > paw_dmft%maxnproju) paw_dmft%maxnproju = pawtab(itypat)%nproju
    1249              :  end do ! itypat
    1250              : 
    1251          215 :  ABI_MALLOC(paw_dmft%slm2ylm,(ndim,ndim,maxlpawu+1))
    1252          215 :  ABI_MALLOC(paw_dmft%jmj2ylm,(2*ndim,2*ndim,maxlpawu+1))
    1253          258 :  ABI_MALLOC(paw_dmft%zarot,(ndim,ndim,nsym,maxlpawu+1))
    1254              : 
    1255         4653 :  paw_dmft%slm2ylm(:,:,:) = czero
    1256          173 :  do lpawu=0,maxlpawu
    1257          130 :    if (lcycle(lpawu+1)) cycle
    1258           43 :    ndim = 2*lpawu + 1
    1259          303 :    do im=1,ndim
    1260          217 :      mm = im - lpawu - 1 ; jm = - mm + lpawu + 1
    1261          217 :      onem = (-1)**mm
    1262          217 :      if (mm > 0) then
    1263           87 :        paw_dmft%slm2ylm(im,im,lpawu+1) = cmplx(onem/sqrt2,zero,kind=dp)
    1264           87 :        paw_dmft%slm2ylm(jm,im,lpawu+1) = cmplx(one/sqrt2,zero,kind=dp)
    1265              :      end if
    1266          217 :      if (mm == 0) paw_dmft%slm2ylm(im,im,lpawu+1) = cone
    1267          347 :      if (mm < 0) then
    1268           87 :        paw_dmft%slm2ylm(im,im,lpawu+1) =  cmplx(zero,one/sqrt2,kind=dp)
    1269           87 :        paw_dmft%slm2ylm(jm,im,lpawu+1) = -cmplx(zero,onem/sqrt2,kind=dp)
    1270              :      end if
    1271              :    end do ! im
    1272              :  end do ! lpawu
    1273              : 
    1274        16721 :  paw_dmft%jmj2ylm(:,:,:) = czero
    1275          130 :  do ll=1,maxlpawu
    1276           87 :    if (lcycle(ll+1)) cycle
    1277          129 :    ABI_MALLOC(ind_msml,(2,-ll:ll))
    1278          129 :    jc1 = 0
    1279          129 :    do ms1=1,2
    1280          563 :      do ml1=-ll,ll
    1281          434 :        jc1 = jc1 + 1
    1282          520 :        ind_msml(ms1,ml1) = jc1
    1283              :      end do ! ml1
    1284              :    end do ! ms1
    1285           43 :    invsqrt2lp1 = one / sqrt(dble(2*ll+1))
    1286           43 :    jc1 = 0
    1287          129 :    do jj=ll,ll+1
    1288           86 :      xj = dble(jj) - half ! xj is in {ll-0.5,ll+0.5}
    1289          563 :      do jm=-jj,jj-1
    1290          434 :        xmj = dble(jm) + half ! xmj is in {-xj,xj}
    1291          434 :        jc1 = jc1 + 1 ! Global index for JMJ
    1292          434 :        if (nint(xj+half) == ll+1) then ! if xj=ll+0.5
    1293          260 :          if (nint(xmj+half) == ll+1) then
    1294           43 :            paw_dmft%jmj2ylm(ind_msml(1,ll),jc1,ll+1) = cone   !  J=L+0.5 and m_J=L+0.5
    1295          217 :          else if (nint(xmj-half) == -ll-1) then
    1296           43 :            paw_dmft%jmj2ylm(ind_msml(2,-ll),jc1,ll+1) = cone   !  J=L+0.5 and m_J=-L-0.5
    1297              :          else
    1298          174 :            paw_dmft%jmj2ylm(ind_msml(1,nint(xmj-half)),jc1,ll+1) = cmplx(invsqrt2lp1*(sqrt(dble(ll)+xmj+half)),zero,kind=dp)
    1299          174 :            paw_dmft%jmj2ylm(ind_msml(2,nint(xmj+half)),jc1,ll+1) = cmplx(invsqrt2lp1*(sqrt(dble(ll)-xmj+half)),zero,kind=dp)
    1300              :          end if
    1301              :        end if
    1302          520 :        if (nint(xj+half) == ll) then  ! if xj=ll-0.5
    1303          174 :          paw_dmft%jmj2ylm(ind_msml(2,nint(xmj+half)),jc1,ll+1) = cmplx(invsqrt2lp1*(sqrt(dble(ll)+xmj+half)),zero,kind=dp)
    1304          174 :          paw_dmft%jmj2ylm(ind_msml(1,nint(xmj-half)),jc1,ll+1) = cmplx(-invsqrt2lp1*(sqrt(dble(ll)-xmj+half)),zero,kind=dp)
    1305              :        end if
    1306              :      end do ! jm
    1307              :    end do ! jj
    1308          130 :    ABI_FREE(ind_msml)
    1309              :  end do ! ll
    1310              : 
    1311          173 :  do lpawu=0,maxlpawu
    1312          130 :    if (lcycle(lpawu+1)) cycle
    1313           43 :    ndim = 2*lpawu + 1
    1314           86 :    if (t2g) then
    1315           28 :      do im1=1,ndim
    1316           91 :        do im=1,ndim
    1317         3108 :          paw_dmft%zarot(im,im1,:,lpawu+1) = cmplx(pawang%zarot(mt2g(im),mt2g(im1),3,1:nsym),zero,kind=dp)
    1318              :        end do ! im
    1319              :      end do ! im1
    1320           36 :    else if (x2my2d) then
    1321            0 :      paw_dmft%zarot(1,1,:,lpawu+1) = cmplx(pawang%zarot(5,5,3,1:nsym),zero,kind=dp)
    1322              :    else
    1323        56727 :      paw_dmft%zarot(1:ndim,1:ndim,:,lpawu+1) = cmplx(pawang%zarot(1:ndim,1:ndim,lpawu+1,1:nsym),zero,kind=dp)
    1324              :    end if
    1325              :  end do ! lpawu
    1326              : 
    1327              : !=======================
    1328              : ! Imaginary frequencies
    1329              : !=======================
    1330              : ! Set up log frequencies
    1331           43 :  if (dtset%ucrpa == 0 .and. paw_dmft%dmft_nwlo > 0) then
    1332           42 :    call construct_nwlo_dmft(paw_dmft)
    1333              :  end if
    1334              : 
    1335           43 :  if (paw_dmft%dmftcheck == 1 .and. dmft_solv < 4) paw_dmft%dmftqmc_l = 64
    1336              : 
    1337              : !==============
    1338              : ! Radial grid
    1339              : !==============
    1340              : 
    1341           43 :  if (paw_dmft%dmft_prtwan == 1) then
    1342              : 
    1343              :    ! Initialize rmax (maximum radius for print of Wannier functions)
    1344            0 :    ABI_MALLOC(rmax,(maxlpawu+1))
    1345            0 :    rmax(:) = paw_dmft%dmft_wanrad
    1346              : 
    1347            0 :    if (paw_dmft%dmft_wanrad < 0) then  ! default
    1348              : 
    1349              :      ! Set rmax to half the distance from the current atom
    1350              :      ! to the nearest atom with the same lpawu
    1351              : 
    1352              :      ! First take half * min(|Ri|)
    1353            0 :      rmax(:) = zero
    1354              :      verif = .true.
    1355            0 :      do i=1,3
    1356            0 :        norm = norm2(rprimd(1:3,i)) * half
    1357            0 :        if (verif .or. norm < rmax(1)) then
    1358            0 :          rmax(:) = norm
    1359              :          verif = .false.
    1360              :        end if
    1361              :      end do ! i
    1362              : 
    1363              :      ! Now look at the atoms in the same unit cell
    1364            0 :      do iatom=1,natom
    1365            0 :        lpawu = paw_dmft%lpawu(iatom)
    1366            0 :        if (lpawu == -1) cycle
    1367            0 :        do iatom1=1,natom
    1368            0 :          lpawu1 = paw_dmft%lpawu(iatom1)
    1369            0 :          if (lpawu1 == -1) cycle
    1370            0 :          if (lpawu /= lpawu1 .or. iatom == iatom1) cycle
    1371              :          norm = zero
    1372            0 :          do i=1,3
    1373            0 :            norm = norm + dot_product(xred(1:3,iatom)-xred(1:3,iatom1),rprimd(i,1:3))**2
    1374              :          end do
    1375            0 :          norm = sqrt(norm) * half
    1376            0 :          if (norm < rmax(lpawu+1)) rmax(lpawu+1) = norm
    1377              :        end do ! iatom1
    1378              :      end do ! iatom
    1379              : 
    1380              :    end if ! dmft_wanrad < 0
    1381              : 
    1382              :  end if ! prtwan=1
    1383              : 
    1384              :  ! Now build radial grid by extending the PAW mesh up to max(rmax,size(proj))
    1385              :  ! The mesh inside the PAW sphere is still exactly the same.
    1386              :  !use_full_chipsi = (paw_dmft%dmft_solv == 6 .or. paw_dmft%dmft_solv == 7)
    1387           43 :  if (paw_dmft%dmft_solv == 6 .or. paw_dmft%dmft_solv == 7) then
    1388              :    use_full_chipsi = .true.
    1389              :  else
    1390           43 :    use_full_chipsi = (paw_dmft%dmft_full_chipsi /= 0)
    1391              :  endif
    1392           43 :  paw_dmft%int_meshsz => pawrad(:)%int_meshsz
    1393              : 
    1394           43 :  if (use_full_chipsi) then
    1395            0 :    ABI_MALLOC(paw_dmft%phimtphi,(maxval(pawrad(1:ntypat)%int_meshsz),paw_dmft%maxnproju,ntypat))
    1396            0 :    ABI_MALLOC(paw_dmft%phimtphi_int,(paw_dmft%maxnproju,ntypat))
    1397              :  else
    1398          172 :    ABI_MALLOC(paw_dmft%phi_int,(paw_dmft%maxnproju,ntypat))
    1399              :  end if
    1400              : 
    1401          197 :  ABI_MALLOC(paw_dmft%radgrid,(ntypat))
    1402              : 
    1403           43 :  paw_dmft%maxmeshsize = 0
    1404          111 :  do itypat=1,ntypat
    1405           68 :    lpawu = pawtab(itypat)%lpawu
    1406           68 :    if (lpawu == -1) cycle
    1407           43 :    if (t2g) lpawu = 1
    1408           43 :    if (x2my2d) lpawu = 0
    1409           43 :    mesh_type = pawrad(itypat)%mesh_type
    1410           43 :    lstep = pawrad(itypat)%lstep
    1411           43 :    rstep = pawrad(itypat)%rstep
    1412           43 :    siz_proj = paw_dmft%siz_proj(itypat)
    1413           43 :    mesh_size = siz_proj
    1414           43 :    if (paw_dmft%dmft_prtwan == 1) then
    1415            0 :      if (mesh_type == 1) mesh_size = int(rmax(lpawu+1)/rstep) + 1
    1416            0 :      if (mesh_type == 2) mesh_size = int(log(rmax(lpawu+1)/rstep+1)/lstep) + 1
    1417            0 :      if (mesh_type == 3) mesh_size = int(log(rmax(lpawu+1)/rstep)/lstep) + 2
    1418            0 :      if (mesh_size < siz_proj) then
    1419            0 :        message = "Please set wanrad to a value greater than the radius of your DMFT orbital"
    1420            0 :        ABI_ERROR(message)
    1421              :      end if
    1422              :    end if ! prtwan=1
    1423              :    ! mesh_type > 3 cannot be extended outside the PAW sphere while keeping the
    1424              :    ! mesh inside the sphere unchanged.
    1425           43 :    if ((mesh_size /= pawrad(itypat)%mesh_size) .and. mesh_type > 3) then
    1426            0 :      message = "mesh_type > 3 is only compatible with dmft_orbital=1 and dmft_prtwan=0"
    1427            0 :      ABI_ERROR(message)
    1428              :    end if
    1429           43 :    if (mesh_size > pawrad(itypat)%int_meshsz .and. (.not. use_full_chipsi)) then
    1430            0 :      message = "You need to activate dmft_full_chipsi if you use an orbital that extends outside the PAW sphere"
    1431            0 :      ABI_ERROR(message)
    1432              :    end if
    1433           43 :    call pawrad_init(paw_dmft%radgrid(itypat),mesh_size,mesh_type,rstep,lstep)
    1434           43 :    if (mesh_size > paw_dmft%maxmeshsize) paw_dmft%maxmeshsize = mesh_size
    1435           43 :    siz_paw  = min(mesh_size,pawrad(itypat)%int_meshsz)
    1436           43 :    siz_proj = min(siz_proj,pawrad(itypat)%int_meshsz)
    1437           43 :    rint   = paw_dmft%radgrid(itypat)%rad(siz_proj)
    1438           43 :    nproju = pawtab(itypat)%nproju
    1439          161 :    do iproj=1,nproju
    1440           75 :      indproj = pawtab(itypat)%lnproju(iproj)
    1441          143 :      if (use_full_chipsi) then
    1442              :        ! Precompute <Chi|Phi-Phi_tilde>
    1443              :        paw_dmft%phimtphi(1:siz_paw,iproj,itypat) = pawtab(itypat)%phi(1:siz_paw,indproj) - &
    1444            0 :                                                  & pawtab(itypat)%tphi(1:siz_paw,indproj)
    1445              :        call simp_gen(paw_dmft%phimtphi_int(iproj,itypat),pawtab(itypat)%proj(1:siz_proj)* &
    1446            0 :                    & paw_dmft%phimtphi(1:siz_proj,iproj,itypat),paw_dmft%radgrid(itypat),r_for_intg=rint)
    1447              :      else
    1448              :        ! Precompute <Chi|Phi>
    1449              :        call simp_gen(paw_dmft%phi_int(iproj,itypat),pawtab(itypat)%proj(1:siz_proj)* &
    1450        56739 :                    & pawtab(itypat)%phi(1:siz_proj,indproj),paw_dmft%radgrid(itypat),r_for_intg=rint)
    1451              :      end if ! use_full_chipsi
    1452              :    end do ! iproj
    1453              :  end do ! itypat
    1454              : 
    1455           43 :  if (paw_dmft%dmft_prtwan /= 1 .and. use_full_chipsi) then
    1456            0 :    ABI_FREE(paw_dmft%phimtphi)
    1457              :  end if
    1458           43 :  ABI_SFREE(rmax)
    1459              : 
    1460              : !==============
    1461              : ! Plane waves
    1462              : !==============
    1463              : 
    1464           43 :  if (use_full_chipsi) then
    1465              : 
    1466              :    ! Compute ylm(k+G),exp(j*(k+G).R(iat)) and Bessel functions
    1467            0 :    mpw = dtset%mpw
    1468            0 :    ABI_MALLOC(paw_dmft%ylm,(mpw,2*maxlpawu+1,maxlpawu+1,mkmem))
    1469            0 :    ABI_MALLOC(paw_dmft%dpro,(mpw,natom,mkmem))
    1470            0 :    ABI_MALLOC(paw_dmft%bessel,(mpw,paw_dmft%maxmeshsize,ntypat,mkmem))
    1471            0 :    ABI_MALLOC(paw_dmft%bessel_int,(mpw,ntypat,mkmem))
    1472            0 :    ABI_MALLOC(typcycle,(ntypat))
    1473            0 :    ABI_MALLOC(kpg,(3,mpw))
    1474            0 :    ABI_MALLOC(kpg_norm,(mpw))
    1475              : 
    1476            0 :    ik  = 0 ! kpt index on current CPU
    1477            0 :    ikg = 0
    1478            0 :    fac_bessel = four_pi / sqrt(ucvol)
    1479              : 
    1480            0 :    do ikpt=1,nkpt
    1481              : 
    1482            0 :      if (proc_distrb_cycle(mpi_enreg%proc_distrb,ikpt,1,1,-1,mpi_enreg%me_kpt)) cycle
    1483              : 
    1484            0 :      ik  = ik + 1
    1485            0 :      npw = npwarr(ikpt)
    1486              : 
    1487            0 :      do ig=1,npw
    1488              : 
    1489            0 :        kpg(:,ig) = dtset%kptns(1:3,ikpt) + dble(kg(1:3,ikg+ig))
    1490              : 
    1491              :        norm = zero
    1492            0 :        do i=1,3
    1493            0 :          norm = norm + dot_product(kpg(:,ig),gprimd(i,1:3))**2
    1494              :        end do ! i
    1495              : 
    1496            0 :        kpg_norm(ig) = sqrt(norm)
    1497              : 
    1498              :      end do ! ig
    1499              : 
    1500            0 :      lcycle(:)   = .false.
    1501            0 :      typcycle(:) = .false.
    1502              : 
    1503            0 :      do iatom=1,natom
    1504              : 
    1505            0 :        lpawu = paw_dmft%lpawu(iatom)
    1506            0 :        if (lpawu == -1) cycle
    1507            0 :        itypat = paw_dmft%typat(iatom)
    1508            0 :        ndim   = 2*lpawu + 1
    1509              : 
    1510            0 :        if (.not. lcycle(lpawu+1)) then  ! if this l has not been visited
    1511            0 :          if (t2g) then
    1512            0 :            do im=1,ndim
    1513            0 :              paw_dmft%ylm(1:npw,im,lpawu+1,ik) = ylm(ikg+1:ikg+npw,4+mt2g(im))
    1514              :            end do ! im
    1515            0 :          else if (x2my2d) then
    1516            0 :            paw_dmft%ylm(1:npw,1,lpawu+1,ik) = ylm(ikg+1:ikg+npw,9)
    1517              :          else
    1518            0 :            paw_dmft%ylm(1:npw,1:ndim,lpawu+1,ik) = ylm(ikg+1:ikg+npw,lpawu**2+1:lpawu**2+ndim)
    1519              :          end if
    1520            0 :          lcycle(lpawu+1) = .true.
    1521              :        end if ! not lcycle
    1522              : 
    1523            0 :        do ig=1,npw
    1524            0 :          paw_dmft%dpro(ig,iatom,ik) = exp(j_dpc*two_pi*dot_product(kpg(:,ig),xred(1:3,iatom)))
    1525              :        end do ! ig
    1526              : 
    1527            0 :        if (.not. typcycle(itypat)) then   ! if this type has not been visited
    1528            0 :          lpawu1 = lpawu ! physical l
    1529            0 :          if (t2g .or. x2my2d) lpawu1 = 2
    1530            0 :          j_l = j_dpc**lpawu1
    1531            0 :          siz_proj = paw_dmft%siz_proj(itypat)
    1532            0 :          rint = paw_dmft%radgrid(itypat)%rad(siz_proj)
    1533            0 :          siz_wan = paw_dmft%radgrid(itypat)%mesh_size
    1534            0 :          do ir=1,siz_wan
    1535            0 :            rad = paw_dmft%radgrid(itypat)%rad(ir)
    1536            0 :            do ig=1,npw
    1537            0 :              call paw_jbessel_4spline(bes,besp,lpawu1,0,two_pi*kpg_norm(ig)*rad,tol3)
    1538              :              ! Multiply by r since we want to compute Psi(r) * r, for radial integration
    1539            0 :              paw_dmft%bessel(ig,ir,itypat,ik) = fac_bessel * bes * rad
    1540              :            end do ! ig
    1541              :          end do ! ir
    1542            0 :          do ig=1,npw
    1543              :            call simp_gen(bes,pawtab(itypat)%proj(1:siz_proj)*dble(paw_dmft%bessel(ig,1:siz_proj,itypat,ik)), &
    1544            0 :                        & paw_dmft%radgrid(itypat),r_for_intg=rint)
    1545            0 :            paw_dmft%bessel_int(ig,itypat,ik) = bes * j_l ! CAREFUL: we multiply by j^l AFTER simp_gen since simp_gen doesn_t handle complex
    1546              :          end do ! ig
    1547            0 :          paw_dmft%bessel(1:npw,1:siz_wan,itypat,ik) = paw_dmft%bessel(1:npw,1:siz_wan,itypat,ik) * j_l
    1548            0 :          typcycle(itypat) = .true.
    1549              :        end if ! not typcycle
    1550              : 
    1551              :      end do ! iatom
    1552              : 
    1553            0 :      ikg = ikg + npw
    1554              : 
    1555              :    end do ! ikpt
    1556              : 
    1557            0 :    ABI_FREE(kpg)
    1558            0 :    ABI_FREE(kpg_norm)
    1559            0 :    ABI_FREE(typcycle)
    1560              : 
    1561            0 :    if (paw_dmft%dmft_prtwan /= 1) then
    1562            0 :      ABI_FREE(paw_dmft%bessel)
    1563              :    end if
    1564              : 
    1565              :  end if ! use_full_chipsi
    1566              : 
    1567           43 :  ABI_FREE(lcycle)
    1568              : 
    1569           43 :  call init_paral_dmft(paw_dmft,paw_dmft%distrib,paw_dmft%dmft_nwlo)
    1570              : 
    1571              :  ! OG: What is all that? Something as moved? START
    1572              :  endif
    1573              : 
    1574        16937 : end subroutine init_sc_dmft
    1575              : !!***
    1576              : 
    1577              : !!****f* m_paw_dmft/init_dmft
    1578              : !! NAME
    1579              : !! init_dmft
    1580              : !!
    1581              : !! FUNCTION
    1582              : !!  Allocate variables and setup DFT hamiltonian and related data
    1583              : !!  (init_sc_dmft has to been called before)
    1584              : !!
    1585              : !! INPUTS
    1586              : !!  cryst_struc <type(crystal_t)> = crystal structure data
    1587              : !!  dmatpawu = fixed occupation matrix of correlated orbitals
    1588              : !!  dtset <type(dataset_type)> = all input variables for this dataset
    1589              : !!  fermie_dft = DFT Fermi level
    1590              : !!  filctqmcdatain = input file name for CTQMC_DATA file
    1591              : !!  filselfin = input file name for self file
    1592              : !!  fnamei = input file name
    1593              : !!  fnametmp_app = header for the output filename
    1594              : !!  ireadctqmcdata = flag to read CTQMC_DATA input file at first iteration
    1595              : !!  ireadself = flag to read self input file at first iteration
    1596              : !!  paw_dmft <type(paw_dmft_type)>= paw+dmft related data
    1597              : !! pawtab(ntypat*usepaw) <type(pawtab_type)>=paw tabulated starting data
    1598              : !!
    1599              : !! SOURCE
    1600              : !!
    1601              : !! NOTE
    1602              : !! The part of the code which deals
    1603              : !! with the use of logarithmic frequencies
    1604              : !! is a modification of the GNU GPL
    1605              : !! code available on http://dmft.rutgers.edu/ and
    1606              : !! described in the  RMP paper written by
    1607              : !! G.Kotliar,  S.Y.Savrasov, K.Haule, V.S.Oudovenko, O.Parcollet, C.A.Marianetti.
    1608              : 
    1609           97 : subroutine init_dmft(cryst_struc,dmatpawu,dtset,fermie_dft,filctqmcdatain,filselfin,fnamei,fnametmp_app,ireadctqmcdata,ireadself,paw_dmft,pawtab)
    1610              : 
    1611              : !Arguments ------------------------------------
    1612              :  real(dp), intent(in) :: fermie_dft
    1613              :  type(dataset_type), intent(in) :: dtset
    1614              :  type(paw_dmft_type), intent(inout) :: paw_dmft
    1615              :  type(crystal_t), target, intent(in) :: cryst_struc
    1616              :  character(len=fnlen), intent(in) :: filctqmcdatain,filselfin,fnamei,fnametmp_app
    1617              :  integer, intent(in) :: ireadctqmcdata,ireadself
    1618              :  real(dp), target, intent(in) :: dmatpawu(:,:,:,:)
    1619              :  type(pawtab_type), intent(in) :: pawtab(dtset%ntypat)
    1620              : !Local variables ------------------------------------
    1621              :  integer :: iatom,ierr,ifreq,ioerr,ir,irot,isym
    1622              :  integer :: itypat,lpawu,meshsz,nflavor,ngrid,nsym,unt
    1623              :  real(dp) :: int1,step
    1624              :  logical :: lexist
    1625              :  character(len=4) :: tag_at
    1626              :  character(len=500) :: message
    1627              :  character(len=fnlen) :: tmpfil
    1628              :  integer, parameter :: grid_unt = 2000
    1629              : ! *********************************************************************
    1630              : 
    1631           97 :  if (dtset%ucrpa == 0) then
    1632           97 :    write(message,'(7a)') ch10,' ====================================', &
    1633           97 :                        & ch10,' =====  Start of DMFT calculation', &
    1634          194 :                        & ch10,' ====================================',ch10
    1635            0 :  else if (dtset%ucrpa > 0) then
    1636            0 :    write(message,'(6a)') ch10,' ============================================================', &
    1637            0 :                        & ch10,' =====  Initialize construction of Wannier in DMFT routines',&
    1638            0 :                        & ch10,' ============================================================'
    1639              :  end if ! ucrpa
    1640           97 :  call wrtout(std_out,message,'COLL')
    1641              : 
    1642           97 :  if (paw_dmft%dmft_dc == 8) then
    1643            0 :    ABI_MALLOC(paw_dmft%edc,(paw_dmft%natom))
    1644            0 :    ABI_MALLOC(paw_dmft%edcdc,(paw_dmft%natom))
    1645              :  end if
    1646              : 
    1647           97 :  nsym = paw_dmft%nsym
    1648              : 
    1649              : !=======================
    1650              : !==  Check sym
    1651              : !=======================
    1652              : 
    1653         4417 :  do isym=1,nsym
    1654         4417 :    if (dtset%symafm(isym) < 0) then
    1655            0 :      message = 'symafm negative is not implemented in DMFT'
    1656            0 :      ABI_ERROR(message)
    1657              :    end if
    1658              :  end do ! isym
    1659              : 
    1660           97 :  paw_dmft%nsym = cryst_struc%nsym ! very important to update it here
    1661           97 :  nsym = paw_dmft%nsym
    1662              : 
    1663              :  ! TODO: this really should be done in init_sc_dmft
    1664           97 :  paw_dmft%indsym => cryst_struc%indsym(4,1:nsym,1:paw_dmft%natom)
    1665           97 :  if (paw_dmft%nspinor == 2) then
    1666            3 :    ABI_MALLOC(paw_dmft%symrec_cart,(3,3,nsym))
    1667           25 :    do irot=1,nsym
    1668              :      call symredcart(cryst_struc%gprimd(:,:),cryst_struc%rprimd(:,:),&
    1669           25 :                    & paw_dmft%symrec_cart(:,:,irot),cryst_struc%symrec(:,:,irot))
    1670              :    end do ! irot
    1671              :  end if ! nspinor=2
    1672              : 
    1673           97 :  paw_dmft%filapp         = fnametmp_app
    1674           97 :  paw_dmft%filnamei       = fnamei
    1675           97 :  paw_dmft%filselfin      = filselfin
    1676           97 :  paw_dmft%filctqmcdatain = filctqmcdatain
    1677           97 :  paw_dmft%ireadctqmcdata = ireadctqmcdata
    1678           97 :  paw_dmft%ireadself      = ireadself
    1679              : 
    1680              :  ! Write orbital on file
    1681           97 :  if (paw_dmft%myproc == 0) then
    1682          130 :    do itypat=1,paw_dmft%ntypat
    1683           87 :      lpawu = pawtab(itypat)%lpawu
    1684           87 :      if (lpawu == -1) cycle
    1685           43 :      meshsz = paw_dmft%siz_proj(itypat)
    1686              : 
    1687              :      call simp_gen(int1,pawtab(itypat)%proj(1:meshsz)**2,paw_dmft%radgrid(itypat), &
    1688        38019 :                  & r_for_intg=paw_dmft%radgrid(itypat)%rad(meshsz))
    1689           43 :      int1 = sqrt(int1)
    1690              : 
    1691           43 :      call int2char4(itypat,tag_at)
    1692           43 :      ABI_CHECK((tag_at(1:1)/='#'),'Bug: string length too short!')
    1693           43 :      if (open_file(trim(paw_dmft%filapp)//"_DMFTORBITAL_itypat"//tag_at//".dat",message,newunit=unt) /= 0) ABI_ERROR(message)
    1694              : 
    1695           43 :      write(unt,'(4a)') "# Correlated normalized radial orbital for DMFT. This", &
    1696           43 :         & " is not projected on any energy window (you need to use dmft_prtwan for that).",ch10, &
    1697           86 :         & "#       Radius (Bohr)           u_l(r) = R_l * r"
    1698              : 
    1699        38019 :      do ir=1,meshsz
    1700        38019 :        write(unt,*) paw_dmft%radgrid(itypat)%rad(ir),pawtab(itypat)%proj(ir)/int1
    1701              :      end do ! ir
    1702              : 
    1703          130 :      close(unt)
    1704              :    end do ! itypat
    1705              :  end if ! myproc=0
    1706              : 
    1707              : !==================
    1708              : ! Real frequencies
    1709              : !==================
    1710              : 
    1711           97 :  if (dtset%iscf < 0 .and. paw_dmft%dmft_solv >= 5 .and. paw_dmft%dmft_solv <= 8) then
    1712            4 :    tmpfil = trim(paw_dmft%filapp)//'_spectralfunction_realgrid'
    1713            4 :    inquire(file=trim(tmpfil),exist=lexist)!,recl=nrecl)
    1714            4 :    if (.not. lexist) then
    1715            0 :      write(message,'(4x,a,i5,3a)') "File number",grid_unt," called ",trim(tmpfil)," does not exist"
    1716            0 :      call wrtout(std_out,message,'COLL')
    1717            0 :      message = "Cannot continue: the missing file coming from Maxent code is needed"
    1718            0 :      ABI_ERROR(message)
    1719              :    end if ! not lexist
    1720              : 
    1721            4 :    if (paw_dmft%myproc == 0) then
    1722              : #ifdef FC_NAG
    1723              :      open(unit=grid_unt,file=trim(tmpfil),status='unknown',form='formatted',recl=ABI_RECL)
    1724              : #else
    1725            1 :      open(unit=grid_unt,file=trim(tmpfil),status='unknown',form='formatted')
    1726              : #endif
    1727            1 :      rewind(grid_unt)
    1728            1 :      write(message,'(3a)') ch10,"  == Read real frequency grid from file ",trim(tmpfil)
    1729            1 :      call wrtout(std_out,message,'COLL')
    1730            1 :      write(message,'(5x,3a,i4)') 'Opened file : ',trim(tmpfil),' on unit ',grid_unt
    1731            1 :      call wrtout(std_out,message,'COLL')
    1732            1 :      read(grid_unt,*,iostat=ioerr) ngrid
    1733            3 :      ABI_MALLOC(paw_dmft%omega_r,(ngrid))
    1734         3001 :      do ifreq=1,ngrid
    1735         3001 :        read(grid_unt,*,iostat=ioerr) paw_dmft%omega_r(ifreq)
    1736              :      end do ! ifreq
    1737            1 :      close(grid_unt)
    1738              :    end if ! myproc=0
    1739            4 :    call xmpi_bcast(ioerr,0,xmpi_world,ierr)
    1740            4 :    if (ioerr /= 0) ABI_ERROR("Error when reading grid file")
    1741            4 :    call xmpi_bcast(ngrid,0,xmpi_world,ierr)
    1742            4 :    if (paw_dmft%myproc /= 0) then
    1743            9 :      ABI_MALLOC(paw_dmft%omega_r,(ngrid))
    1744              :    end if
    1745            4 :    call xmpi_bcast(paw_dmft%omega_r(:),0,xmpi_world,ierr)
    1746              :  else
    1747          279 :    ABI_MALLOC(paw_dmft%omega_r,(2*paw_dmft%dmft_nwr))
    1748              :    ! Set up real frequencies for spectral function in Hubbard one.
    1749           93 :    step = 0.00005_dp
    1750           93 :    paw_dmft%omega_r(2*paw_dmft%dmft_nwr) = pi * step * (two*dble(paw_dmft%dmft_nwr-1)+one)
    1751       148800 :    do ifreq=1,2*paw_dmft%dmft_nwr-1
    1752       148800 :      paw_dmft%omega_r(ifreq) = pi*step*(two*dble(ifreq-1)+one) - paw_dmft%omega_r(2*paw_dmft%dmft_nwr)
    1753              :   !  write(std_out,*) ifreq,paw_dmft%omega_r(ifreq)
    1754              :    end do ! ifreq
    1755              : 
    1756              :  end if ! iscf<0 and dmft_solv>=5 and dmft_solv<=8
    1757              : 
    1758           97 :  call init_paral_dmft(paw_dmft,paw_dmft%distrib_r,size(paw_dmft%omega_r(:)))
    1759              : 
    1760              :  !unit_e=2_dp
    1761              : 
    1762              : ! paw_dmft%dmft_mag=0
    1763              : ! do iatom=1,dtset%natom
    1764              : !   do  ii=1,3
    1765              : !     if ( dtset(ii,iatom) > 0.001 ) paw_dmft%dmft_mag=1
    1766              : !   enddo
    1767              : ! enddo
    1768              : 
    1769           97 :  paw_dmft%gpu_option = dtset%gpu_option
    1770           97 :  paw_dmft%fermie_dft = fermie_dft ! in Ha
    1771           97 :  paw_dmft%fermie = fermie_dft
    1772              : 
    1773              : !========================
    1774              : !==  Fixed self as input
    1775              : !========================
    1776           97 :  paw_dmft%use_fixed_self = dtset%usedmatpu
    1777           97 :  paw_dmft%fixed_self => dmatpawu(:,:,:,:)
    1778              : 
    1779           97 :  if (paw_dmft%dmftcheck == -1) then
    1780            0 :    message = ' init_dmft: dmftcheck=-1 should not happen here'
    1781            0 :    ABI_BUG(message)
    1782              :  end if
    1783              : 
    1784          485 :  ABI_MALLOC(paw_dmft%eigen_dft,(paw_dmft%mbandc,paw_dmft%nkpt,paw_dmft%nsppol))
    1785          679 :  ABI_MALLOC(paw_dmft%chipsi,(paw_dmft%nspinor*(2*paw_dmft%maxlpawu+1),paw_dmft%mbandc,paw_dmft%nkpt,paw_dmft%nsppol,paw_dmft%natom))
    1786              : 
    1787           97 :  paw_dmft%lchipsiortho = 0
    1788              : 
    1789              :  !=========================================================
    1790              :  !== if we use ctqmc impurity solver
    1791              :  !=========================================================
    1792              :  ! IMPORTANT : paw_dmft%hybrid is corrupted somewhere in DMFT routines on
    1793              :  ! tikal_psc and max2_open64. Use a local hybrid in qmc_prep even if not optimal.
    1794              :  ! Anyway initializing ctqmc here is not good and produce the same result for
    1795              :  ! dmft_iter=1 which speed up the convergence ...
    1796              :  ! FIXME : Move this to init_sc_dmft and find bug
    1797           97 :  if (paw_dmft%dmft_solv == 5) then ! CTQMC initialisation
    1798              :  !  write(message,'(a,2x,a,f13.5)') ch10," == Initializing CTQMC"
    1799              :  !   call wrtout(std_out,message,'COLL')
    1800              : 
    1801          180 :    ABI_MALLOC(paw_dmft%hybrid,(paw_dmft%natom))
    1802          104 :    do iatom=1,paw_dmft%natom
    1803           66 :      if (paw_dmft%lpawu(iatom) == -1) cycle
    1804           38 :      nflavor = 2 * (2*paw_dmft%lpawu(iatom)+1)
    1805              : #ifdef HAVE_MPI
    1806              :      call CtqmcInterface_init(paw_dmft%hybrid(iatom),paw_dmft%dmftqmc_seed,paw_dmft%dmftqmc_n, &
    1807              :         & paw_dmft%dmftqmc_therm,paw_dmft%dmftctqmc_meas,nflavor,paw_dmft%dmftqmc_l,one/paw_dmft%temp,zero,&
    1808           38 :         & std_out,paw_dmft%dmftctqmc_chains,paw_dmft%spacecomm,nspinor=paw_dmft%nspinor)
    1809              : #else
    1810              :      call CtqmcInterface_init(paw_dmft%hybrid(iatom),paw_dmft%dmftqmc_seed,paw_dmft%dmftqmc_n, &
    1811              :         & paw_dmft%dmftqmc_therm,paw_dmft%dmftctqmc_meas,nflavor,paw_dmft%dmftqmc_l,one/paw_dmft%temp,zero,&
    1812              :         & std_out,paw_dmft%dmftctqmc_chains,nspinor=paw_dmft%nspinor)
    1813              : #endif
    1814              :      call CtqmcInterface_setOpts(paw_dmft%hybrid(iatom),&
    1815              :                                 &  opt_Fk       = 1,&
    1816              :                                 &  opt_order    = paw_dmft%dmftctqmc_order, &
    1817              :                                 &  opt_histo    = paw_dmft%dmftctqmc_localprop,&
    1818              :                                 &  opt_movie    = paw_dmft%dmftctqmc_mov,   &
    1819              :                                 &  opt_analysis = paw_dmft%dmftctqmc_correl,&
    1820              :                                 &  opt_check    = paw_dmft%dmftctqmc_check, &
    1821              :                                 &  opt_noise    = paw_dmft%dmftctqmc_grnns, &
    1822              :                                 &  opt_spectra  = paw_dmft%dmftctqmc_mrka,  &
    1823          104 :                                 &  opt_gmove    = paw_dmft%dmftctqmc_gmove )
    1824              :    end do ! iatom
    1825              :    ! write(message,'(a,2x,a,f13.5)') ch10,&
    1826              :    !&  " == Initialization CTQMC done"
    1827              :    !call wrtout(std_out,message,'COLL')
    1828              :  end if ! dmft_solv=5
    1829              : 
    1830              : !************************************************************************
    1831           97 : end subroutine init_dmft
    1832              : !!***
    1833              : 
    1834              : !!****f* m_paw_dmft/construct_nwli_dmft
    1835              : !! NAME
    1836              : !! construct_nwli_dmft
    1837              : !!
    1838              : !! FUNCTION
    1839              : !!  Compute linear frequencies
    1840              : !!
    1841              : !! INPUTS
    1842              : !!  paw_dmft=structure for dmft
    1843              : !!  nwli=number of linear frequencies
    1844              : !!
    1845              : !! OUTPUTS
    1846              : !!  omegali(1:nwli)=computed frequencies
    1847              : !!
    1848              : !! SOURCE
    1849              : !!
    1850              : 
    1851          134 : subroutine construct_nwli_dmft(paw_dmft,nwli,omega_li)
    1852              : 
    1853              : !Arguments ------------------------------------
    1854              :  type(paw_dmft_type), intent(in) :: paw_dmft
    1855              :  integer, intent(in) :: nwli
    1856              :  real(dp), intent(inout) :: omega_li(:)
    1857              : !Local variables-------------------------------
    1858              :  !fortran2003 ?
    1859              :  !real(dp), allocatable, intent(inout) :: omega_li(:)
    1860              :  integer :: ifreq
    1861              :  real(dp) :: factor
    1862              :  character(len=100) :: message
    1863              : ! *********************************************************************
    1864              : 
    1865              : ! if (allocated(omega_li)) then
    1866          134 :  if (size(omega_li(:)) /= nwli) then
    1867            0 :    write(message,'(2a,i8,a,i8)') ch10,"Number of linear frequencies asked is", &
    1868            0 :        & nwli,"whereas dimension of array omega_li is",size(omega_li(:))
    1869            0 :    ABI_BUG(message)
    1870              : !     ABI_FREE(omega_li)
    1871              : !     ABI_MALLOC(omega_li,(nwli))
    1872              : !     write(*,*) "RESIZE"
    1873              : !     call flush(6)
    1874              :  end if
    1875              : !     write(*,*) "NOTHING"
    1876              : !     call flush(6)
    1877              : ! else
    1878              : !     write(*,*) "ALLOCATE"
    1879              : !     call flush(6)
    1880              : !   ABI_MALLOC(omega_li,(nwli))
    1881              : ! endif
    1882              : 
    1883              : ! Set up linear frequencies
    1884          134 :  factor = pi * paw_dmft%temp
    1885     19189084 :  do ifreq=1,nwli
    1886     19189084 :    omega_li(ifreq) = factor * dble(2*ifreq-1)
    1887              :    ! (2(ifreq-1)+1 = 2ifreq-1
    1888              :  end do ! ifreq
    1889              : 
    1890          134 : end subroutine construct_nwli_dmft
    1891              : !!***
    1892              : 
    1893              : !!****f* m_paw_dmft/construct_nwlo_dmft
    1894              : !! NAME
    1895              : !! construct_nwlo_dmft
    1896              : !!
    1897              : !! FUNCTION
    1898              : !!  Allocate log frequencies if used and compute them as well as their weight
    1899              : !!
    1900              : !! INPUTS
    1901              : !!  paw_dmft=structure for dmft calculation
    1902              : !!
    1903              : !!
    1904              : !! SOURCE
    1905              : !!
    1906              : !! NOTE
    1907              : !! The part of the code which deals
    1908              : !! with the use of logarithmic frequencies
    1909              : !! is a modification of the GNU GPL
    1910              : !! code available on http://dmft.rutgers.edu/ and
    1911              : !! described in the  RMP paper written by
    1912              : !! G.Kotliar,  S.Y.Savrasov, K.Haule, V.S.Oudovenko, O.Parcollet, C.A.Marianetti.
    1913              : !!
    1914              : 
    1915           42 : subroutine construct_nwlo_dmft(paw_dmft)
    1916              : 
    1917              :  use m_splines
    1918              : 
    1919              : !Arguments ------------------------------------
    1920              :  type(paw_dmft_type), intent(inout) :: paw_dmft
    1921              : !Local variables-------------------------------
    1922              :  integer :: deltaw,ifreq,ifreq2,myproc,nlin,nproc,nwli
    1923              :  integer :: nwlo,omegaBegin,omegaEnd,residu,spacecomm
    1924              :  character(len=10) :: tag
    1925              :  character(len=500) :: message
    1926              :  real(dp) :: deltaomega,expfac,omegamaxmin,prefacexp,temp,wl
    1927              :  complex(dp):: ybcbeg,ybcend
    1928           42 :  integer, allocatable :: select_log(:)
    1929           42 :  real(dp), allocatable :: omega_li(:),omega_lo_tmp(:),wgt_wlo(:)
    1930           42 :  complex(dp), allocatable :: splined_li(:),tospline_lo(:),ysplin2_lo(:)
    1931              : ! *********************************************************************
    1932              : 
    1933           42 :  nwlo = paw_dmft%dmft_nwlo
    1934           42 :  nwli = paw_dmft%dmft_nwli
    1935           42 :  temp = paw_dmft%temp
    1936              : 
    1937              : !==  Variables for DMFT related to frequencies
    1938              : ! the part of the code which deals
    1939              : ! with the use of logarithmic frequencies
    1940              : ! is a modification of the GNU GPL
    1941              : ! code available on http://dmft.rutgers.edu/ and
    1942              : ! described in the  RMP paper written by
    1943              : ! G.Kotliar, S.Y.Savrasov, K.Haule, V.S.Oudovenko, O.Parcollet, C.A.Marianetti
    1944              : 
    1945              : !========================================
    1946              : !== construct log. freq.
    1947           42 :  if (paw_dmft%dmft_log_freq == 1) then
    1948              : !=======================================
    1949              : 
    1950          126 :    ABI_MALLOC(omega_lo_tmp,(nwlo))
    1951           84 :    ABI_MALLOC(wgt_wlo,(nwlo))
    1952              :    !cubic_freq=0
    1953              :    !omegamaxmin=paw_dmft%omega_li(paw_dmft%dmft_nwli)-paw_dmft%omega_li(paw_dmft%dmftqmc_l+1)
    1954           42 :    nlin = paw_dmft%dmftqmc_l ! number of linear frequencies
    1955           42 :    if (paw_dmft%dmft_solv == 6 .or. paw_dmft%dmft_solv == 7) nlin = int(nwlo*half)
    1956           42 :    omegamaxmin = pi * temp * two * dble(nwli-nlin-1)
    1957              : 
    1958              :    !if(cubic_freq==1) then
    1959              : 
    1960              :     ! if (paw_dmft%dmft_solv .eq. 5 ) then
    1961              :     !   write(message, '(2a)') ch10, "Warning : Cubish Mesh not tested with CT-QMC"
    1962              :     !   ABI_WARNING(message)
    1963              :     ! end if
    1964              : !  ------------  CUBIC MESH MESH
    1965              : !    useless
    1966              :      !nlin=dble(paw_dmft%dmft_nwli)
    1967              :      !nlog=dble(paw_dmft%dmft_nwlo)
    1968              :      !AA=((nlin-one)/nlin/(nlog**2-one)-one/(three*nlin))/((nlog**3-one)/(nlog**2-one)-seven/three)
    1969              :      !BB=(one/nlin - seven*AA)/three
    1970              :      !CC=-AA-BB
    1971              : !    AA=((nlin-one)/nlin/(nlog-one)-one/(nlin))/((nlog**2-one)/(nlog-one)-three)
    1972              : !    BB=(one/nlin - three*AA)
    1973              : !    CC=-AA-BB
    1974              :      !write(message, '(a,16x,2(2x,a))') ch10,"  Cubic Mesh Parameters are"
    1975              :      !call wrtout(std_out,message,'COLL')
    1976              :      !write(message, '(3x,a,3(2x,e13.5))') "AA,BB,CC",AA,BB,CC
    1977              :      !call wrtout(std_out,message,'COLL')
    1978              :      !do ifreq=1,paw_dmft%dmft_nwlo
    1979              :       ! t1=dble(ifreq)
    1980              :        !omega_lo_tmp(ifreq)=(AA*t1**3+BB*t1**2+CC)*omegamaxmin+paw_dmft%omega_li(1)
    1981              :       ! omega_lo_tmp(ifreq)=(AA*t1**3+BB*t1**2+CC)*omegamaxmin+paw_dmft%temp*pi
    1982              : !       paw_dmft%omega_lo(ifreq)=(AA*t1**2+BB*t1+CC)*omegamaxmin+paw_dmft%omega_li(1)
    1983              : !     write(69,*) paw_dmft%omega_lo(ifreq),0.5
    1984              :      !enddo
    1985              :    !else
    1986           42 :    if (paw_dmft%dmft_solv < 4) then
    1987           16 :      paw_dmft%dmftqmc_l = 0
    1988           16 :      nlin = 0
    1989              :    end if
    1990              : 
    1991              : !  ------------  LOGARITHMIC MESH
    1992           42 :    deltaomega = half
    1993           42 :    expfac     = log(omegamaxmin/deltaomega) / (dble(nwlo-nlin-1)*half)
    1994           42 :    prefacexp  = omegamaxmin / (exp(expfac*dble(nwlo-nlin-1))-one)
    1995          126 :    ABI_MALLOC(select_log,(nwlo))
    1996              : 
    1997              : !  ------------ IMPOSE LINEAR MESH for w < 2*w_n=(2*l-1)pi/beta
    1998              : !         Check variables (Already done in chkinp if dmft_solv==5)
    1999           42 :    if (nlin > nwlo) then
    2000            0 :      write(message,'(2a,i6)') ch10, &
    2001            0 :        & ' ERROR: dmft_nwlo has to be at least equal to 2xdmftqmc_l :',2*paw_dmft%dmftqmc_l
    2002            0 :      ABI_ERROR(message)
    2003              :    end if
    2004              : !         End Check
    2005              : 
    2006           42 :    call construct_nwli_dmft(paw_dmft,nlin,omega_lo_tmp(1:nlin))
    2007        17942 :    select_log(1:nlin) = (/ (ifreq,ifreq=1,nlin) /)
    2008              : 
    2009              :      !do ifreq=1,paw_dmft%dmftqmc_l
    2010              :      !  omega_lo_tmp(ifreq)=(two*DBLE(ifreq-1)+one)*pi*paw_dmft%temp
    2011              :      !  select_log(ifreq)=ifreq
    2012              :      !enddo
    2013              : 
    2014              : !  ------------ COMPLETE FREQUENCIES WITH LOG MESH
    2015           42 :    wl = temp * pi * dble(2*nlin+1)
    2016        26861 :    do ifreq=1,nwlo-nlin
    2017              :        !omega_lo_tmp(ifreq+paw_dmft%dmftqmc_l)=prefacexp*(exp(expfac*float(ifreq-1))-one)+paw_dmft%omega_li(paw_dmft%dmftqmc_l+1)
    2018        26819 :      omega_lo_tmp(ifreq+nlin) = prefacexp*(exp(expfac*dble(ifreq-1))-one) + wl
    2019              : !    -------- Impose that each frequency of the logarithmic mesh is on a Matsubara frequency
    2020              : ! FIXME : This may be done for all solver, not only for QMCs
    2021        26861 :      if (paw_dmft%dmft_solv >= 4) then
    2022              :        ! Compute the index "n" of iwn
    2023        25967 :        ifreq2 = nint((omega_lo_tmp(ifreq+nlin)/(temp*pi)-one)*half)
    2024              :        ! Compute freq
    2025        25967 :        omega_lo_tmp(ifreq+nlin) = (dble(ifreq2)*two+one) * pi * temp
    2026              : 
    2027        25967 :        if ((ifreq2+1) > nwli) then
    2028            0 :          write(message,'(2a,i8)') ch10,&
    2029            0 :           & ' BUG: init_dmft, dimension of array select_log is about to be overflown',(ifreq2+1)
    2030            0 :          ABI_BUG(message)
    2031              :        end if
    2032        25967 :        select_log(nlin+ifreq) = ifreq2 + 1
    2033              :      end if ! dmft_solv>=4
    2034              :    end do ! ifreq
    2035              : 
    2036              : !  -------- Suppress duplicate frequencies
    2037              : ! FIXME : So this also should be done for all solver and remove useless
    2038              : ! frequencies
    2039           42 :   if (paw_dmft%dmft_solv >= 4) then
    2040           26 :     ifreq2 = 1
    2041        34891 :     do ifreq=2,nwlo-1
    2042        34865 :       if (select_log(ifreq2) == select_log(ifreq)) cycle
    2043        21813 :       ifreq2 = ifreq2 + 1
    2044        21813 :       omega_lo_tmp(ifreq2) = omega_lo_tmp(ifreq)
    2045        34891 :       select_log(ifreq2) = select_log(ifreq)
    2046              :     end do ! ifreq
    2047           26 :     paw_dmft%dmft_nwlo = ifreq2 + 1
    2048           26 :     nwlo = paw_dmft%dmft_nwlo
    2049              :   end if ! dmft_solv>=4
    2050              : 
    2051           42 :   omega_lo_tmp(1) = temp * pi
    2052           42 :   omega_lo_tmp(nwlo) = temp * pi * dble(2*nwli-1)
    2053              : 
    2054              :   !==================================
    2055              :   !== Construct weight for log. freq.
    2056              :   !==================================
    2057              : 
    2058          126 :   ABI_MALLOC(tospline_lo,(nwlo))
    2059          126 :   ABI_MALLOC(splined_li,(nwli))
    2060           84 :   ABI_MALLOC(ysplin2_lo,(nwlo))
    2061          126 :   ABI_MALLOC(omega_li,(nwli))
    2062           42 :   call construct_nwli_dmft(paw_dmft,nwli,omega_li(:))
    2063              : 
    2064              :   !Parallelization over frequencies!
    2065              :   ! ============= Set up =============
    2066           42 :   myproc = paw_dmft%myproc
    2067           42 :   nproc  = paw_dmft%nproc
    2068           42 :   spacecomm = paw_dmft%spacecomm
    2069           42 :   deltaw = nwlo / nproc
    2070           42 :   residu = nwlo - nproc*deltaw
    2071           42 :   if (myproc < nproc-residu) then
    2072           37 :     omegaBegin = 1 + myproc*deltaw
    2073           37 :     omegaEnd   = (myproc+1) * deltaw
    2074              :   else
    2075            5 :     omegaBegin = 1 + myproc*(deltaw+1) - nproc + residu
    2076            5 :     omegaEnd   = omegaBegin + deltaw
    2077              :   end if
    2078              : 
    2079        22759 :   wgt_wlo(1:nwlo) = zero ! very important for xmpi_sum
    2080           42 :   ybcbeg = czero
    2081           42 :   ybcend = czero
    2082              :   ! ============= END Set up =============
    2083              : 
    2084        22759 :   tospline_lo(:) = czero
    2085              : 
    2086         7216 :   do ifreq=omegaBegin,omegaEnd
    2087              :   ! do ifreq1=1,paw_dmft%dmft_nwlo
    2088         7174 :     tospline_lo(ifreq) = cone
    2089              :     ! tospline_lo(ifreq1)=ifreq1**2-ifreq1
    2090              :     ! enddo
    2091              :     ! ybcbeg=cmplx(one/tol16**2,zero)
    2092              :     ! ybcend=cmplx(one/tol16**2,zero)
    2093              : 
    2094              :     !==  spline delta function
    2095              :     call spline_complex(omega_lo_tmp(:),tospline_lo(:),nwlo, &
    2096         7174 :                       & ybcbeg,ybcend,ysplin2_lo(:))
    2097              :     ! do ifreq1=1,paw_dmft%dmft_nwlo
    2098              :     !  write(6588,*) paw_dmft%omega_lo(ifreq1),ysplin2_lo(ifreq1)
    2099              :     ! enddo
    2100              : 
    2101              :     call splint_complex(nwlo,omega_lo_tmp(:),tospline_lo(:), &
    2102         7174 :                       & ysplin2_lo(:),nwli,omega_li(:),splined_li(:))
    2103              : 
    2104         7174 :     tospline_lo(ifreq) = czero
    2105              : 
    2106              :     !==         accumulate weights
    2107   6259027216 :     wgt_wlo(ifreq) = sum(dble(splined_li(:)))
    2108              :     ! do ifreq1=1,paw_dmft%dmft_nwlo
    2109              :     !  write(6688,*) paw_dmft%omega_lo(ifreq1),tospline_lo(ifreq1)
    2110              :     ! enddo
    2111              : 
    2112              :     ! do ifreq1=1,paw_dmft%dmft_nwli
    2113              :     !  write(6788,*) paw_dmft%omega_li(ifreq1),splined_li(ifreq1)
    2114              : 
    2115              :   end do ! ifreq
    2116              :   ! ============= Gatherall  =============
    2117           42 :   call xmpi_sum(wgt_wlo(1:nwlo),spacecomm,residu)
    2118              :   ! ============= END Gatherall ==========
    2119              :   ! end parallelisation over frequencies
    2120              : 
    2121           42 :   ABI_FREE(tospline_lo)
    2122           42 :   ABI_FREE(splined_li)
    2123           42 :   ABI_FREE(ysplin2_lo)
    2124              :   ! if(abs(dtset%pawprtvol)>=3) then
    2125           42 :   write(message,'(a,18x,2(2x,a21))') ch10,"Log. Freq","weight"
    2126           42 :   call wrtout(std_out,message,'COLL')
    2127        22759 :   do ifreq=1,nwlo
    2128        22717 :     write(message,'(3x,a9,i6,2(2x,e21.14))') "--ifreq--",ifreq,omega_lo_tmp(ifreq),wgt_wlo(ifreq)
    2129        22759 :     call wrtout(std_out,message,'COLL')
    2130              :   end do ! ifreq
    2131           42 :   write(message,'(3x,a,i6)') "  Total number of log frequencies is",nwlo
    2132           42 :   call wrtout(std_out,message,'COLL')
    2133           42 :   ifreq2 = 1
    2134         1302 :   do ifreq=1,min(30,nwlo)
    2135         1260 :     write(message,'(3x,a9,i6,2(2x,e21.14))') "--ifreq--",ifreq,omega_li(ifreq)
    2136         1260 :     call wrtout(std_out,message,'COLL')
    2137         1260 :     if (select_log(ifreq2) == ifreq) then
    2138          780 :       write(message,'(3x,a,i4,2(2x,i5))') "--sel_log",1
    2139          780 :       ifreq2 = ifreq + 1
    2140              :     else
    2141          480 :       write(message,'(3x,a,i4,2(2x,i5))') "--sel_log",0
    2142              :     end if
    2143         1302 :     call wrtout(std_out,message,'COLL')
    2144              :   end do ! ifreq
    2145           42 :   write(message,'(3x,2a)') "--ifreq--","..."
    2146           42 :   call wrtout(std_out,message,'COLL')
    2147           42 :   write(message,'(3x,a,i6,2(2x,e13.5))') "--ifreq--",nwli,omega_li(nwli)
    2148           42 :   call wrtout(std_out,message,'COLL')
    2149              :   ! endif
    2150           42 :   ABI_FREE(select_log)
    2151           42 :   ABI_FREE(omega_li)
    2152          126 :   ABI_MALLOC(paw_dmft%omega_lo,(nwlo))
    2153           84 :   ABI_MALLOC(paw_dmft%wgt_wlo,(nwlo))
    2154        22759 :   paw_dmft%omega_lo(1:nwlo) = omega_lo_tmp(1:nwlo)
    2155        22759 :   paw_dmft%wgt_wlo(1:nwlo) = wgt_wlo(1:nwlo)
    2156           42 :   ABI_FREE(omega_lo_tmp)
    2157           42 :   ABI_FREE(wgt_wlo)
    2158              : 
    2159              : !=========================================================
    2160              : !== do not construct log. freq. and use linear frequencies
    2161              : !=========================================================
    2162              :  else
    2163              : 
    2164            0 :    ABI_MALLOC(paw_dmft%omega_lo,(nwlo))
    2165            0 :    ABI_MALLOC(paw_dmft%wgt_wlo,(nwlo))
    2166            0 :    write(tag,'(i10)') nwlo
    2167            0 :    write(message,'(4a)') ch10," Use of ",trim(adjustl(tag))," linear Matsubara frequencies for DMFT calculation"
    2168            0 :    call wrtout(std_out,message,'COLL')
    2169            0 :    call construct_nwli_dmft(paw_dmft,nwli,paw_dmft%omega_lo(:))
    2170            0 :    paw_dmft%wgt_wlo(:) = one
    2171              :  end if ! dmft_log_freq
    2172              : 
    2173              :  ! Should be check but since type definition does not initialize pointer with
    2174              :  ! =>null() (fortran95 and later) it produces conditional jump in valgrind
    2175              :  !if ( associated(paw_dmft%omega_lo) ) then
    2176              :  !  ABI_FREE(paw_dmft%omega_lo)
    2177              :  !endif
    2178              :  !if ( associated(paw_dmft%wgt_wlo) ) then
    2179              :  !  ABI_FREE(paw_dmft%wgt_wlo)
    2180              :  !endif
    2181              : 
    2182           42 : end subroutine construct_nwlo_dmft
    2183              : !!***
    2184              : 
    2185              : !!****f* m_paw_dmft/destroy_dmft
    2186              : !! NAME
    2187              : !! destroy_dmft
    2188              : !!
    2189              : !! FUNCTION
    2190              : !!  deallocate some variables related to paw_dmft
    2191              : !!
    2192              : !! INPUTS
    2193              : !!  paw_dmft=structure for dmft calculation
    2194              : !!
    2195              : !! OUTPUT
    2196              : !!
    2197              : !! SOURCE
    2198              : 
    2199           97 : subroutine destroy_dmft(paw_dmft)
    2200              : 
    2201              : !Arguments ------------------------------------
    2202              :  type(paw_dmft_type), intent(inout) :: paw_dmft
    2203              : !Local variables-------------------------------
    2204              :  integer :: iatom
    2205              : ! *********************************************************************
    2206              : 
    2207           97 :  if (paw_dmft%dmft_solv == 5 .and. allocated(paw_dmft%hybrid)) then
    2208          104 :    do iatom=1,size(paw_dmft%hybrid) !paw_dmft%natom
    2209              :        !if(paw_dmft%lpawu(iatom)/=-1) then
    2210          104 :      call ctqmcinterface_finalize(paw_dmft%hybrid(iatom))
    2211              :        !endif
    2212              :    end do ! iatom
    2213          104 :    ABI_FREE(paw_dmft%hybrid)
    2214              :  end if
    2215           97 :  ABI_SFREE(paw_dmft%chipsi)
    2216           97 :  ABI_SFREE(paw_dmft%edc)
    2217           97 :  ABI_SFREE(paw_dmft%edcdc)
    2218           97 :  ABI_SFREE(paw_dmft%eigen_dft)
    2219           97 :  ABI_SFREE(paw_dmft%omega_r)
    2220           97 :  ABI_SFREE(paw_dmft%symrec_cart)
    2221           97 :  paw_dmft%eigen => null()
    2222           97 :  paw_dmft%fixed_self => null()
    2223           97 :  paw_dmft%indsym => null()
    2224           97 :  call destroy_paral_dmft(paw_dmft%distrib_r)
    2225              : 
    2226           97 : end subroutine destroy_dmft
    2227              : !!***
    2228              : 
    2229              : !!****f* m_paw_dmft/destroy_sc_dmft
    2230              : !! NAME
    2231              : !! destroy_sc_dmft
    2232              : !!
    2233              : !! FUNCTION
    2234              : !!  deallocate paw_dmft
    2235              : !!
    2236              : !! INPUTS
    2237              : !!  paw_dmft=structure for dmft calculation
    2238              : !!
    2239              : !! OUTPUT
    2240              : !!
    2241              : !! SOURCE
    2242              : 
    2243         5678 : subroutine destroy_sc_dmft(paw_dmft)
    2244              : 
    2245              : !Arguments ------------------------------------
    2246              :  type(paw_dmft_type), intent(inout) :: paw_dmft
    2247              : !Local variables-------------------------------
    2248              :  character(len=500) :: message
    2249              : ! *********************************************************************
    2250              : 
    2251              :  if ((.not. allocated(paw_dmft%occnd) .or. .not. allocated(paw_dmft%band_in) &
    2252              :    & .or. .not. allocated(paw_dmft%include_bands) .or. .not. allocated(paw_dmft%exclude_bands)) &
    2253         5678 :    & .and. paw_dmft%use_dmft == 1) then
    2254              :    write(message,'(3a)') &
    2255            0 :      & '  an array is not allocated and is not deallocated with use_dmft==1 ',ch10, &
    2256            0 :      & '  Action : check the code'
    2257            0 :    ABI_WARNING(message)
    2258              :  end if
    2259         5678 :  ABI_SFREE(paw_dmft%occnd)
    2260         5678 :  ABI_SFREE(paw_dmft%band_in)
    2261         5678 :  ABI_SFREE(paw_dmft%include_bands)
    2262         5678 :  ABI_SFREE(paw_dmft%exclude_bands)
    2263         5678 :  ABI_SFREE(paw_dmft%siz_proj)
    2264         5678 :  ABI_SFREE(paw_dmft%zarot)
    2265         5678 :  ABI_SFREE(paw_dmft%phimtphi)
    2266         5678 :  ABI_SFREE(paw_dmft%phimtphi_int)
    2267         5678 :  ABI_SFREE(paw_dmft%phi_int)
    2268         5678 :  ABI_SFREE(paw_dmft%ylm)
    2269         5678 :  ABI_SFREE(paw_dmft%dpro)
    2270         5678 :  ABI_SFREE(paw_dmft%bessel)
    2271         5678 :  ABI_SFREE(paw_dmft%bessel_int)
    2272         5678 :  ABI_SFREE(paw_dmft%lpawu)
    2273         5678 :  ABI_SFREE(paw_dmft%omega_lo)
    2274         5678 :  ABI_SFREE(paw_dmft%wgt_wlo)
    2275         5678 :  ABI_SFREE(paw_dmft%slm2ylm)
    2276         5678 :  ABI_SFREE(paw_dmft%jmj2ylm)
    2277              : 
    2278         5678 :  paw_dmft%nband => null()
    2279         5678 :  paw_dmft%dmft_shiftself => null()
    2280         5678 :  paw_dmft%dmft_nominal => null()
    2281         5678 :  paw_dmft%npwarr => null()
    2282              : !   paw_dmft%wtk is only an explicit pointer =>dtset%wtk
    2283              : !   if (associated(paw_dmft%wtk)) deallocate(paw_dmft%wtk)
    2284         5678 :  paw_dmft%wtk => null()
    2285         5678 :  paw_dmft%typat => null()
    2286         5678 :  paw_dmft%int_meshsz => null()
    2287              : 
    2288         5678 :  if (allocated(paw_dmft%radgrid)) then
    2289           43 :    call pawrad_free(paw_dmft%radgrid(:))
    2290          111 :    ABI_FREE(paw_dmft%radgrid)
    2291              :  end if
    2292         5678 :  call destroy_sc_dmft_paralkgb(paw_dmft)
    2293         5678 :  if (paw_dmft%use_dmft == 1) then
    2294           43 :    call destroy_paral_dmft(paw_dmft%distrib)
    2295              :  end if
    2296              : 
    2297         5678 : end subroutine destroy_sc_dmft
    2298              : !!***
    2299              : 
    2300              : !!****f* m_paw_dmft/print_dmft
    2301              : !! NAME
    2302              : !! print_dmft
    2303              : !!
    2304              : !! FUNCTION
    2305              : !!  Print relevant data for DMFT cycle.
    2306              : !!
    2307              : !! INPUTS
    2308              : !!  paw_dmft=structure for dmft calculation
    2309              : !!  pawprtvol=flag for print
    2310              : !!
    2311              : !! OUTPUT
    2312              : !!
    2313              : !! SOURCE
    2314              : 
    2315           97 : subroutine print_dmft(paw_dmft,pawprtvol)
    2316              : 
    2317              : !Arguments ------------------------------------
    2318              :  integer, intent(in) :: pawprtvol
    2319              :  type(paw_dmft_type), intent(in) :: paw_dmft
    2320              : !Local variables-------------------------------
    2321              :  integer :: iband,ifreq,ikpt,isppol
    2322              :  character(len=500) :: message
    2323              : ! *********************************************************************
    2324              : 
    2325           97 :  if (abs(pawprtvol) >= 3 ) then
    2326              :    write(message,'(4a,3(a,2x,e21.14,a))') &
    2327           73 :      & "  -------------------------------------------------",ch10,&
    2328           73 :      & "  --- Data for DMFT ",ch10,&
    2329           73 :      & "  --- fermie     = ",paw_dmft%fermie    ,ch10,&
    2330           73 :      & "  --- fermie_dft = ",paw_dmft%fermie_dft,ch10,&
    2331          146 :      & "  --- temp       = ",paw_dmft%temp      ,ch10
    2332           73 :    call wrtout(std_out,message,'COLL')
    2333           73 :    if (paw_dmft%dmft_solv /= 6 .and. paw_dmft%dmft_solv /= 7) then
    2334              :      write(message,'(7(a,15x,i8,a),a,2x,e21.14,3a)') &
    2335           73 :        & "  --- natpawu    = ",paw_dmft%natpawu   ,ch10,&
    2336           73 :        & "  --- dmft_iter  = ",paw_dmft%dmft_iter ,ch10,&
    2337           73 :        & "  --- dmft_solv  = ",paw_dmft%dmft_solv ,ch10,&
    2338           73 :        & "  --- dmft_nwlo  = ",paw_dmft%dmft_nwlo ,ch10,&
    2339           73 :        & "  --- dmft_nwli  = ",paw_dmft%dmft_nwli ,ch10,&
    2340           73 :        & "  --- dmft_dc    = ",paw_dmft%dmft_dc   ,ch10,&
    2341           73 :        & "  --- dmftqmc_l  = ",paw_dmft%dmftqmc_l ,ch10,&
    2342           73 :        & "  --- dmftqmc_n  = ",paw_dmft%dmftqmc_n ,ch10,&
    2343          146 :        & "  -------------------------------------------------",ch10
    2344              :    else
    2345              :      write(message,'(7(a,15x,i8,a),2a)') &
    2346            0 :        & "  --- natpawu    = ",paw_dmft%natpawu   ,ch10,&
    2347            0 :        & "  --- dmft_iter  = ",paw_dmft%dmft_iter ,ch10,&
    2348            0 :        & "  --- dmft_solv  = ",paw_dmft%dmft_solv ,ch10,&
    2349            0 :        & "  --- n_iw       = ",paw_dmft%dmft_nwli ,ch10,&
    2350            0 :        & "  --- dmft_dc    = ",paw_dmft%dmft_dc   ,ch10,&
    2351            0 :        & "  --- n_tau      = ",paw_dmft%dmftqmc_l ,ch10,&
    2352            0 :        & "  --- n_cycles   = ",paw_dmft%dmft_triqs_n_cycles ,ch10,&
    2353            0 :        & "  -------------------------------------------------",ch10
    2354              :    end if
    2355           73 :    call wrtout(std_out,message,'COLL')
    2356              : 
    2357              : !  write(message,'(4a,3(a,2x,f8.3,a),8(a,2x,i8,a),a)') "-----------------------------------------------",ch10,&
    2358              : !&   "--- Data for DMFT ",ch10,&
    2359              : !&   "--- paw_dmft%fermie     = ",paw_dmft%fermie    ,ch10,&
    2360              : !&   "--- paw_dmft%fermie_dft = ",paw_dmft%fermie_dft,ch10,&
    2361              : !&   "--- paw_dmft%temp       = ",paw_dmft%temp      ,ch10,&
    2362              : !&   "--- paw_dmft%natpawu    = ",paw_dmft%natpawu   ,ch10,&
    2363              : !&   "--- paw_dmft%dmft_iter  = ",paw_dmft%dmft_iter ,ch10,&
    2364              : !&   "--- paw_dmft%dmft_solv  = ",paw_dmft%dmft_solv ,ch10,&
    2365              : !&   "--- paw_dmft%dmft_nwlo  = ",paw_dmft%dmft_nwlo ,ch10,&
    2366              : !&   "--- paw_dmft%dmft_nwli  = ",paw_dmft%dmft_nwli ,ch10,&
    2367              : !&   "--- paw_dmft%dmft_dc    = ",paw_dmft%dmft_dc   ,ch10,&
    2368              : !&   "--- paw_dmft%dmftqmc_l  = ",paw_dmft%dmftqmc_l ,ch10,&
    2369              : !&   "--- paw_dmft%dmftqmc_n  = ",paw_dmft%dmftqmc_n ,ch10,&
    2370              : !&   "-----------------------------------------------"
    2371           73 :    if (abs(pawprtvol) > 10) then
    2372            0 :      call wrtout(std_out,message,'COLL')
    2373            0 :      write(message,'(a)') " DFT Eigenvalues "
    2374            0 :      do isppol=1,paw_dmft%nsppol
    2375            0 :        write(message,'(a,i4)') "--isppol--",isppol
    2376            0 :        call wrtout(std_out,message,'COLL')
    2377            0 :        do ikpt=1,paw_dmft%nkpt
    2378            0 :          write(message,'(a,i4,2x,f14.5,a)') "  -k-pt--",ikpt,paw_dmft%wtk(ikpt),"(<-weight(k-pt))"
    2379            0 :          call wrtout(std_out,message,'COLL')
    2380            0 :          do iband=1,paw_dmft%mbandc
    2381            0 :            write(message,'(a,i4,f10.5)') "   -iband--",iband,paw_dmft%eigen_dft(iband,ikpt,isppol)
    2382            0 :            call wrtout(std_out,message,'COLL')
    2383              :          end do ! iband
    2384              :        end do ! ikpt
    2385              :      end do ! isppol
    2386            0 :      write(message,'(3x,a)') "Log. Freq"
    2387            0 :      call wrtout(std_out,message,'COLL')
    2388            0 :      do ifreq=1,paw_dmft%dmft_nwlo
    2389            0 :        write(message,'(3x,a,i4,2(2x,e13.5))') "--ifreq--",ifreq,paw_dmft%omega_lo(ifreq),paw_dmft%wgt_wlo(ifreq)
    2390            0 :        call wrtout(std_out,message,'COLL')
    2391              :      end do ! ifreq
    2392              :    end if ! abs(pawprtvol)>10
    2393              :  end if ! abs(pawprtvol)>=3
    2394              : 
    2395           97 : end subroutine print_dmft
    2396              : !!***
    2397              : 
    2398              : !!****f* m_paw_dmft/print_sc_dmft
    2399              : !! NAME
    2400              : !! print_sc_dmft
    2401              : !!
    2402              : !! FUNCTION
    2403              : !!  Print relevant data for self-consistent
    2404              : !!  DFT+DMFT cycle.
    2405              : !!
    2406              : !! INPUTS
    2407              : !!  paw_dmft=structure for dmft calculation
    2408              : !!  pawprtvol=flag for print
    2409              : !!
    2410              : !! OUTPUT
    2411              : !!
    2412              : !! SOURCE
    2413              : 
    2414           43 : subroutine print_sc_dmft(paw_dmft,pawprtvol)
    2415              : 
    2416              : !Arguments ------------------------------------
    2417              :  integer, intent(in) :: pawprtvol
    2418              :  type(paw_dmft_type), intent(in) :: paw_dmft
    2419              : !Local variables-------------------------------
    2420              :  integer :: iband
    2421              :  character(len=500) :: message
    2422              : ! *********************************************************************
    2423              : 
    2424           43 :  if (abs(pawprtvol) >= 3) then
    2425           29 :    write(message,'(5a,7(a,2x,i5,a),a)') ch10, &
    2426           29 :      & " -----------------------------------------------",ch10,&
    2427           29 :      & " --- Data for self-consistent DFT+DMFT cycle",ch10,&
    2428           29 :      & " --- mband             = ",paw_dmft%mband,ch10,&
    2429           29 :      & " --- dmftbandi         = ",paw_dmft%dmftbandi,ch10,&
    2430           29 :      & " --- dmftbandf         = ",paw_dmft%dmftbandf,ch10,&
    2431           29 :      & " --- nb of corr. bands = ",paw_dmft%mbandc,ch10,&
    2432           29 :      & " --- nkpt              = ",paw_dmft%nkpt,ch10,&
    2433           29 :      & " --- nsppol            = ",paw_dmft%nsppol,ch10,&
    2434           29 :      & " --- usedmft           = ",paw_dmft%use_dmft,ch10,&
    2435              :      !& " --- use_sc_dmft = ",paw_dmft%use_sc_dmft,ch10,&
    2436           58 :      & " -----------------------------------------------"
    2437           29 :    call wrtout(std_out,message,'COLL')
    2438           29 :    write(message,'(2a)') ch10," Indicating correlated bands"
    2439           29 :    call wrtout(std_out,message,'COLL')
    2440          670 :    write(message,'(100i5)') (iband,iband=1,min(paw_dmft%mband,100))
    2441           29 :    call wrtout(std_out,message,'COLL')
    2442          670 :    write(message,'(100L5)') (paw_dmft%band_in(iband),iband=1,min(paw_dmft%mband,100))
    2443           29 :    call wrtout(std_out,message,'COLL')
    2444           29 :    write(message,'(2a)') ch10," Correlated index   Band index"
    2445           29 :    call wrtout(std_out,message,'COLL')
    2446          310 :    do iband=1,paw_dmft%mbandc
    2447          281 :      write(message,'(5x,i5,10x,i5)') iband,paw_dmft%include_bands(iband)
    2448          310 :      call wrtout(std_out,message,'COLL')
    2449              :    end do ! iband
    2450           29 :    if (paw_dmft%dmft_solv /= 6 .and. paw_dmft%dmft_solv /= 7) then
    2451           29 :      write(message,'(2a,i4,a)') ch10,&
    2452           29 :         & 'The',paw_dmft%mband-paw_dmft%dmftbandf+paw_dmft%dmftbandi-1,&
    2453           58 :         & '  Following bands are excluded from the DMFT calculation'
    2454           29 :      call wrtout(std_out,message,'COLL')
    2455          389 :      write(message,'(100i5)') (paw_dmft%exclude_bands(iband),iband=1,min(paw_dmft%mband-paw_dmft%dmftbandf+paw_dmft%dmftbandi-1,100))
    2456           29 :      call wrtout(std_out,message,'COLL')
    2457              :    end if
    2458           29 :    write(message,*)
    2459           29 :    call wrtout(std_out,message,'COLL')
    2460              :  end if ! abs(pawprtvol)>=3
    2461              : 
    2462           43 : end subroutine print_sc_dmft
    2463              : !!***
    2464              : 
    2465              : !!****f* m_paw_dmft/saveocc_dmft
    2466              : !! NAME
    2467              : !! saveocc_dmft
    2468              : !!
    2469              : !! FUNCTION
    2470              : !!  save occnd on disk
    2471              : !!
    2472              : !! INPUTS
    2473              : !!  paw_dmft=structure for dmft calculation
    2474              : !!
    2475              : !! OUTPUT
    2476              : !!
    2477              : !! SOURCE
    2478              : 
    2479           42 : subroutine saveocc_dmft(paw_dmft)
    2480              : 
    2481              : !Arguments ------------------------------------
    2482              :  type(paw_dmft_type), intent(in) :: paw_dmft
    2483              : !Local variables-------------------------------
    2484              :  integer :: ib,ib1,ikpt,is,nband_k,nkpt,unitsaveocc
    2485              :  character(len=500) :: message
    2486              :  character(len=fnlen) :: tmpfil
    2487              : ! ********************************************************************
    2488              : 
    2489           42 :  tmpfil = trim(paw_dmft%filapp)//'_DMFTOCCND'
    2490           42 :  if (open_file(tmpfil,message,newunit=unitsaveocc,status='unknown',form='formatted') /= 0) ABI_ERROR(message)
    2491              : 
    2492           42 :  rewind(unitsaveocc)
    2493           42 :  write(message,'(2a)') ch10,"  == Print DFT+DMFT non diagonal occupations on disk"
    2494           42 :  call wrtout(std_out,message,'COLL')
    2495           42 :  write(message,'(5a,2x,4i5,2a)') "# DFT+DMFT off-diagonal occupations f_{ib,ib1} = <Psi^{dagger}_{ib1}|Psi_{ib}>", &
    2496           42 :          & ch10,"# natom,nsppol,mbandc,nkpt",ch10, &
    2497           42 :          & "####",paw_dmft%natom,paw_dmft%nsppol,paw_dmft%mbandc,paw_dmft%nkpt,ch10, &
    2498           84 :          & "#        isppol      ikpt         ib          ib1         Re                        Imag"
    2499              : 
    2500           42 :  call wrtout(unitsaveocc,message,'COLL')
    2501           42 :  nkpt = paw_dmft%nkpt
    2502          107 :  do is=1,paw_dmft%nsppol
    2503          579 :    do ikpt=1,nkpt
    2504          472 :      nband_k = paw_dmft%nband(ikpt+(is-1)*nkpt)
    2505        11333 :      do ib=1,nband_k
    2506        10796 :        if ((.not. paw_dmft%band_in(ib)) .and. (paw_dmft%dmft_solv /= 6 .and. paw_dmft%dmft_solv /= 7)) cycle
    2507       106592 :        do ib1=1,nband_k
    2508       101944 :          if ((.not. paw_dmft%band_in(ib1)) .and. (paw_dmft%dmft_solv /= 6 .and. paw_dmft%dmft_solv /= 7)) cycle
    2509        56568 :          write(unitsaveocc,*) is,ikpt,ib,ib1,paw_dmft%occnd(1,ib,ib1,ikpt,is),&
    2510       169308 :                                            & paw_dmft%occnd(2,ib,ib1,ikpt,is)
    2511              :        end do ! ib1
    2512              :      end do ! ib
    2513              :    end do ! ikpt
    2514              :  end do ! is
    2515           42 :  write(message,'(3a)') "# end of record",ch10,"####  1234 "
    2516           42 :  call wrtout(unitsaveocc,message,'COLL')
    2517           42 :  close(unitsaveocc)
    2518              : 
    2519           42 : end subroutine saveocc_dmft
    2520              : !!***
    2521              : 
    2522              : !!****f* m_paw_dmft/readocc_dmft
    2523              : !! NAME
    2524              : !! readocc_dmft
    2525              : !!
    2526              : !! FUNCTION
    2527              : !!  read occnd on disk
    2528              : !!
    2529              : !! INPUTS
    2530              : !!  paw_dmft=structure for dmft calculation
    2531              : !!  filnam_ds3 = root for filname to read (input)
    2532              : !!  filnam_ds4 = root for filname to read (output)
    2533              : !!
    2534              : !! OUTPUT
    2535              : !!  paw_dmft: occnd
    2536              : !!
    2537              : !! SOURCE
    2538              : 
    2539           22 : subroutine readocc_dmft(paw_dmft,filnam_ds3,filnam_ds4)
    2540              : 
    2541              : !Arguments ------------------------------------
    2542              :  type(paw_dmft_type), intent(inout) :: paw_dmft
    2543              :  character(len=fnlen), intent(in) :: filnam_ds3,filnam_ds4
    2544              : !Local variables-------------------------------
    2545              :  integer :: dum1,dum2,dum3,dum4,ib,ib1,ikpt,ioerr,is,nband_k,nkpt,unitsaveocc
    2546              :  logical :: lexist
    2547              :  character(len=4) :: chtemp
    2548              :  character(len=500) :: message
    2549              :  character(len=fnlen) :: tmpfil
    2550              : ! *********************************************************************
    2551              : 
    2552           22 :  if (paw_dmft%dmft_read_occnd == 0) return
    2553            2 :  if (paw_dmft%dmft_read_occnd == 1) tmpfil = trim(filnam_ds3)//'_DMFTOCCND'
    2554            2 :  if (paw_dmft%dmft_read_occnd == 2) tmpfil = trim(filnam_ds4)//'_DMFTOCCND'
    2555            2 :  inquire(file=trim(tmpfil),exist=lexist)!,recl=nrecl)
    2556            2 :  unitsaveocc = 679
    2557            2 :  if (lexist) then
    2558            0 :    if (open_file(tmpfil,message,unit=unitsaveocc,status='unknown',form='formatted') /= 0) ABI_ERROR(message)
    2559            0 :    rewind(unitsaveocc)
    2560            0 :    write(message,'(3a)') ch10,"  == Read DMFT non diagonal occupations on disk"
    2561            0 :    call wrtout(std_out,message,'COLL')
    2562            0 :    read(unitsaveocc,*)
    2563            0 :    read(unitsaveocc,*)
    2564            0 :    read(unitsaveocc,*,iostat=ioerr) chtemp,dum1,dum2,dum3,dum4
    2565            0 :    read(unitsaveocc,*)
    2566            0 :    if (ioerr < 0) write(std_out,*) "read",dum1,dum2,dum3,dum4
    2567            0 :    write(message,'(2a,4i4)') ch10,"  == natom, nsppol, nbandc, nkpt read are",dum1,dum2,dum3,dum4
    2568            0 :    call wrtout(std_out,message,'COLL')
    2569            0 :    nkpt = paw_dmft%nkpt
    2570            0 :    do is=1,paw_dmft%nsppol
    2571            0 :      do ikpt=1,nkpt
    2572            0 :        nband_k = paw_dmft%nband(ikpt+(is-1)*nkpt)
    2573            0 :        do ib=1,nband_k
    2574            0 :          if ((.not. paw_dmft%band_in(ib)) .and. (paw_dmft%dmft_solv /= 6 .and. paw_dmft%dmft_solv /= 7)) cycle
    2575            0 :          do ib1=1,nband_k
    2576            0 :            if ((.not. paw_dmft%band_in(ib1)) .and. (paw_dmft%dmft_solv /= 6 .and. paw_dmft%dmft_solv /= 7)) cycle
    2577            0 :            read(unitsaveocc,*) dum1,dum2,dum3,dum4,&
    2578            0 :                & paw_dmft%occnd(1,ib,ib1,ikpt,is),paw_dmft%occnd(2,ib,ib1,ikpt,is)
    2579              :          end do ! ib1
    2580              :        end do ! ib
    2581              :      end do ! ikpt
    2582              :    end do ! is
    2583              : !   write(read,'(3a)') "# end of record",ch10&
    2584              : !&                ,"####  1234 "
    2585              : !   call wrtout(unitsaveocc,message,'COLL')
    2586              :  else
    2587            2 :    write(message,'(2a,2x,2a)') ch10,"   File",trim(tmpfil),"is not available"
    2588            2 :    call wrtout(std_out,message,'COLL')
    2589            2 :    write(message,'(4a)') ch10,"  ==> DMFT Occupations not available for restart", ch10, &
    2590            4 :        & "      -> The calculation is started with Fermi Dirac scheme for occupations"
    2591            2 :    call wrtout(std_out,message,'COLL')
    2592              :  end if ! lexist
    2593              : 
    2594              : end subroutine readocc_dmft
    2595              : !!***
    2596              : 
    2597              : !!****f* m_paw_dmft/init_sc_dmft_paralkgb
    2598              : !! NAME
    2599              : !! init_sc_dmft_paralkgb
    2600              : !!
    2601              : !! FUNCTION
    2602              : !!  Init some values used with KGB parallelism in self consistent DMFT
    2603              : !!  calculation.
    2604              : !!
    2605              : !! INPUTS
    2606              : !!  paw_dmft=structure for dmft calculation
    2607              : !! mpi_enreg = information about MPI parallelization
    2608              : !!
    2609              : !! OUTPUT
    2610              : !!  paw_dmft: bandc_proc, use_bandc
    2611              : !!
    2612              : !! SOURCE
    2613              : 
    2614            4 : subroutine init_sc_dmft_paralkgb(paw_dmft,mpi_enreg)
    2615              : 
    2616              : !Arguments ------------------------------------
    2617              :  type(paw_dmft_type), intent(inout) :: paw_dmft
    2618              :  type(MPI_type), intent(in) :: mpi_enreg
    2619              : !Local variables-------------------------------
    2620              :  integer :: ib,ibc,mbandc,nproc,proc
    2621              : ! *********************************************************************
    2622              : 
    2623            4 :  mbandc = paw_dmft%mbandc
    2624            4 :  nproc  = mpi_enreg%nproc_band
    2625              : 
    2626           12 :  ABI_MALLOC(paw_dmft%bandc_proc,(mbandc))
    2627           12 :  ABI_MALLOC(paw_dmft%use_bandc,(nproc))
    2628           52 :  paw_dmft%bandc_proc(:) = 0
    2629           20 :  paw_dmft%use_bandc(:)  = .false.
    2630              : 
    2631           52 :  do ibc=1,mbandc
    2632           48 :    ib = paw_dmft%include_bands(ibc)
    2633           48 :    proc = mod((ib-1)/mpi_enreg%bandpp,nproc)
    2634           48 :    paw_dmft%bandc_proc(ibc) = proc
    2635           52 :    paw_dmft%use_bandc(proc+1) = .true.
    2636              :  end do ! ibc
    2637              : 
    2638            4 : end subroutine init_sc_dmft_paralkgb
    2639              : 
    2640              : !!***
    2641              : 
    2642              : !!****f* m_paw_dmft/destroy_sc_dmft_paralkgb
    2643              : !! NAME
    2644              : !! destroy_sc_dmft_paralkgb
    2645              : !!
    2646              : !! FUNCTION
    2647              : !!   deallocate bandc_proc and use_bandc
    2648              : !!
    2649              : !! INPUTS
    2650              : !!  paw_dmft=structure for dmft calculation
    2651              : !!
    2652              : !! OUTPUT
    2653              : !!
    2654              : !! SOURCE
    2655              : 
    2656         5678 : subroutine destroy_sc_dmft_paralkgb(paw_dmft)
    2657              : 
    2658              : !Arguments ------------------------------------
    2659              :  type(paw_dmft_type), intent(inout) :: paw_dmft
    2660              : ! *********************************************************************
    2661              : 
    2662         5678 :  ABI_SFREE(paw_dmft%bandc_proc)
    2663         5678 :  ABI_SFREE(paw_dmft%use_bandc)
    2664              : 
    2665         5678 : end subroutine destroy_sc_dmft_paralkgb
    2666              : !!***
    2667              : 
    2668              : !!****f* m_paw_dmft/init_paral_dmft
    2669              : !! NAME
    2670              : !! init_paral_dmft
    2671              : !!
    2672              : !! FUNCTION
    2673              : !!  Initialize MPI distribution
    2674              : !!
    2675              : !! INPUTS
    2676              : !!  paw_dmft=structure for dmft calculation
    2677              : !!  distrib <type(mpi_distrib_dmft_type)> = mpi related data
    2678              : !!  nfreq=number of frequencies over which to parallelize
    2679              : !!
    2680              : !! OUTPUT
    2681              : !!
    2682              : !! SOURCE
    2683              : 
    2684          140 : subroutine init_paral_dmft(paw_dmft,distrib,nfreq)
    2685              : 
    2686              : !Arguments ------------------------------------
    2687              :  type(paw_dmft_type), intent(in) :: paw_dmft
    2688              :  type(mpi_distrib_dmft_type), intent(inout) :: distrib
    2689              :  integer, intent(in) :: nfreq
    2690              : !Local variables-------------------------------
    2691              :  integer :: deltakpt,deltaw,ierr,ifreq,ikpt,irank,myproc,nfreq_proc
    2692              :  integer :: nkpt,nkpt_proc,nproc,nproc_freq,nproc_kpt,residu,spacecomm
    2693              : ! *********************************************************************
    2694              : 
    2695          140 :  myproc = paw_dmft%myproc
    2696          140 :  nkpt   = paw_dmft%nkpt
    2697          140 :  nproc  = paw_dmft%nproc
    2698          140 :  spacecomm = paw_dmft%spacecomm
    2699              : 
    2700          140 :  distrib%nw = nfreq
    2701          140 :  distrib%shiftk = 0
    2702              : 
    2703          420 :  ABI_MALLOC(distrib%nw_mem,(nproc))
    2704          420 :  ABI_MALLOC(distrib%procb,(nkpt))
    2705          420 :  ABI_MALLOC(distrib%procf,(nfreq))
    2706          280 :  ABI_MALLOC(distrib%proct,(nfreq))
    2707              : 
    2708              :  ! First initialize parallelization over frequencies only
    2709              : 
    2710          140 :  deltaw = nfreq / nproc
    2711          140 :  residu = nfreq - deltaw*nproc
    2712              : 
    2713          140 :  nproc_freq = min(nfreq,nproc)
    2714              : 
    2715          141 :  if (nproc_freq < nproc) distrib%nw_mem(nproc_freq+1:nproc) = 0
    2716              :  ifreq = 1
    2717          579 :  do irank=0,nproc_freq-1
    2718          439 :    nfreq_proc = merge(deltaw+1,deltaw,irank<residu)
    2719          439 :    distrib%nw_mem(irank+1) = nfreq_proc
    2720       183956 :    distrib%procf(ifreq:ifreq+nfreq_proc-1) = irank
    2721          140 :    ifreq = ifreq + nfreq_proc
    2722              :  end do ! irank
    2723              : 
    2724              :  ! Next initialize parallelization on kpt and then frequencies
    2725              : 
    2726          140 :  nproc_kpt  = min(nkpt,nproc)
    2727          140 :  nproc_freq = nproc / nkpt
    2728              : 
    2729          280 :  ABI_MALLOC(distrib%nkpt_mem,(nproc))
    2730          420 :  ABI_MALLOC(distrib%nw_mem_kptparal,(nproc_freq+1))
    2731              : 
    2732          152 :  if (nproc > nproc_kpt) distrib%nkpt_mem(nproc_kpt+1:nproc) = 0
    2733          140 :  distrib%nw_mem_kptparal(nproc_freq+1) = 0
    2734              : 
    2735          140 :  if (nproc_freq <= 1) then ! parallelization on kpt only
    2736              : 
    2737          140 :    deltakpt = nkpt / nproc
    2738          140 :    residu   = nkpt - deltakpt*nproc
    2739              : 
    2740          140 :    distrib%nw_mem_kptparal(1) = nfreq
    2741       183657 :    distrib%proct(:) = 0
    2742              : 
    2743              :    ikpt = 1
    2744          568 :    do irank=0,nproc_kpt-1
    2745          428 :      nkpt_proc = merge(deltakpt+1,deltakpt,irank<residu)
    2746          428 :      distrib%nkpt_mem(irank+1) = nkpt_proc
    2747         1622 :      distrib%procb(ikpt:ikpt+nkpt_proc-1) = irank
    2748          428 :      if (myproc == irank) distrib%shiftk = ikpt - 1
    2749          140 :      ikpt = ikpt + nkpt_proc
    2750              :    end do ! irank
    2751              : 
    2752          140 :    distrib%comm_kpt = spacecomm
    2753          140 :    distrib%me_kpt   = mod(myproc,nproc_kpt)
    2754          140 :    distrib%me_freq  = myproc / nproc_kpt
    2755              : 
    2756          140 :    call xmpi_comm_split(spacecomm,distrib%me_kpt,distrib%me_freq,distrib%comm_freq,ierr)
    2757              : 
    2758          140 :    distrib%me_kpt = myproc
    2759              : 
    2760              :  else ! parallelization on both kpt and frequencies
    2761              : 
    2762            0 :    deltaw = nfreq / nproc_freq
    2763            0 :    residu = nfreq - deltaw*nproc_freq
    2764              : 
    2765            0 :    distrib%nkpt_mem(1:nkpt) = 1
    2766              : 
    2767            0 :    do ikpt=1,nkpt
    2768            0 :      distrib%procb(ikpt) = ikpt - 1
    2769              :    end do ! ikpt
    2770              : 
    2771              :    ifreq = 1
    2772            0 :    do irank=0,nproc_freq-1
    2773            0 :      nfreq_proc = merge(deltaw+1,deltaw,irank<residu)
    2774            0 :      if (nfreq_proc > 0) distrib%proct(ifreq:ifreq+nfreq_proc-1) = irank
    2775            0 :      ifreq = ifreq + nfreq_proc
    2776            0 :      distrib%nw_mem_kptparal(irank+1) = nfreq_proc
    2777              :    end do ! irank
    2778              : 
    2779            0 :    distrib%me_kpt  = myproc / nproc_freq
    2780            0 :    distrib%me_freq = mod(myproc,nproc_freq)
    2781            0 :    distrib%shiftk  = distrib%me_kpt
    2782              : 
    2783            0 :    call xmpi_comm_split(spacecomm,distrib%me_freq,distrib%me_kpt,distrib%comm_kpt,ierr)
    2784              : 
    2785            0 :    if (myproc >= nkpt*nproc_freq) then
    2786            0 :      distrib%me_kpt  = myproc - nkpt*nproc_freq
    2787            0 :      distrib%me_freq = nproc_freq
    2788              :    end if
    2789              : 
    2790            0 :    call xmpi_comm_split(spacecomm,distrib%me_kpt,distrib%me_freq,distrib%comm_freq,ierr)
    2791              : 
    2792            0 :    if (myproc >= nkpt*nproc_freq) distrib%me_kpt = myproc / nproc_freq
    2793              : 
    2794              :  end if ! nproc_freq<=1
    2795              : 
    2796          140 : end subroutine init_paral_dmft
    2797              : !!***
    2798              : 
    2799              : !!****f* m_paw_dmft/destroy_paral_dmft
    2800              : !! NAME
    2801              : !! destroy_paral_dmft
    2802              : !!
    2803              : !! FUNCTION
    2804              : !!  Deallocate MPI distribution
    2805              : !!
    2806              : !! INPUTS
    2807              : !!  paw_dmft=structure for dmft calculation
    2808              : !!  distrib <type(mpi_distrib_dmft_type)> = mpi related data
    2809              : !!
    2810              : !! OUTPUT
    2811              : !!
    2812              : !! SOURCE
    2813              : 
    2814          140 : subroutine destroy_paral_dmft(distrib)
    2815              : 
    2816              : !Arguments ------------------------------------
    2817              :  type(mpi_distrib_dmft_type), intent(inout) :: distrib
    2818              : !Local variables-------------------------------
    2819              : ! *********************************************************************
    2820              : 
    2821          140 :  ABI_FREE(distrib%nkpt_mem)
    2822          140 :  ABI_FREE(distrib%nw_mem)
    2823          140 :  ABI_FREE(distrib%nw_mem_kptparal)
    2824          140 :  ABI_FREE(distrib%procb)
    2825          140 :  ABI_FREE(distrib%procf)
    2826          140 :  ABI_FREE(distrib%proct)
    2827              : 
    2828          140 :  call xmpi_comm_free(distrib%comm_freq)
    2829          140 :  call xmpi_comm_free(distrib%comm_kpt)
    2830              : 
    2831          140 : end subroutine destroy_paral_dmft
    2832              : !!***
    2833              : 
    2834            0 : END MODULE m_paw_dmft
    2835              : !!***
        

Generated by: LCOV version 2.3-1