LCOV - code coverage report
Current view: top level - src/62_ctqmc - m_GreenHyboffdiag.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 0.0 % 491 0
Test Date: 2026-09-19 15:24:51 Functions: 0.0 % 16 0

            Line data    Source code
       1              : 
       2              : #if defined HAVE_CONFIG_H
       3              : #include "config.h"
       4              : #endif
       5              : !!****m* ABINIT/m_GreenHyboffdiag
       6              : !! NAME
       7              : !!  m_GreenHyboffdiag
       8              : !!
       9              : !! FUNCTION
      10              : !!  Manage a green function for one orbital
      11              : !!
      12              : !! COPYRIGHT
      13              : !!  Copyright (C) 2013-2026 ABINIT group (B.Amadon, J. Denier and J. Bieder)
      14              : !!  This file is distributed under the terms of the
      15              : !!  GNU General Public License, see ~abinit/COPYING
      16              : !!  or http://www.gnu.org/copyleft/gpl.txt .
      17              : !!
      18              : !! NOTES
      19              : !!
      20              : !! SOURCE
      21              : 
      22              : #include "defs.h"
      23              : MODULE m_GreenHyboffdiag
      24              : 
      25              :  USE m_global
      26              :  USE m_MatrixHyb
      27              :  USE m_Vector
      28              :  USE m_VectorInt
      29              :  USE m_ListCdagC
      30              :  USE m_MapHyb
      31              :  USE_MPI
      32              : 
      33              :  IMPLICIT NONE
      34              : 
      35              :  public ::  GreenHyboffdiag_init
      36              :  public ::  GreenHyboffdiag_reset
      37              :  public ::  GreenHyboffdiag_clear
      38              :  public ::  GreenHyboffdiag_setOperW
      39              :  public ::  GreenHyboffdiag_measHybrid
      40              :  public ::  GreenHyboffdiag_getHybrid
      41              :  public ::  GreenHyboffdiag_setN
      42              :  public ::  GreenHyboffdiag_setMuD1
      43              :  public ::  GreenHyboffdiag_setMoments
      44              :  public ::  GreenHyboffdiag_backFourier
      45              :  public ::  GreenHyboffdiag_forFourier
      46              :  public ::  GreenHyboffdiag_print
      47              :  public ::  GreenHyboffdiag_destroy
      48              :  public ::  nfourier3
      49              : 
      50              : !!***
      51              : 
      52              : !!****t* m_GreenHyboffdiag/GreenHyboffdiag
      53              : !! NAME
      54              : !!  GreenHyboffdiag
      55              : !!
      56              : !! FUNCTION
      57              : !!  This structured datatype contains the necessary data
      58              : !!
      59              : !! COPYRIGHT
      60              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
      61              : !!  This file is distributed under the terms of the
      62              : !!  GNU General Public License, see ~abinit/COPYING
      63              : !!  or http://www.gnu.org/copyleft/gpl.txt .
      64              : !!
      65              : !! SOURCE
      66              : 
      67              :  TYPE GreenHyboffdiag
      68              : 
      69              :   LOGICAL :: set = .FALSE.
      70              :    ! True if variable of type GreenHyboffdiag is initialized
      71              : 
      72              :   LOGICAL :: setT = .FALSE.
      73              :    ! True if variable oper contains data
      74              : 
      75              :   LOGICAL :: setW = .FALSE.
      76              :    ! True if variable oper_w contains data
      77              : 
      78              :   LOGICAL :: have_MPI = .FALSE.
      79              :    ! True if MPI is used.
      80              : 
      81              :   INTEGER :: setMk = 0
      82              :    ! setMk=0 is moments for Fourier transform are not computed
      83              : 
      84              :   INTEGER :: samples
      85              :    ! samples=imaginary time slices (dmftqmc_l+1)
      86              : 
      87              :   INTEGER :: measurements
      88              :    ! number of measurements for the Green's function
      89              : 
      90              :   INTEGER :: factor
      91              :    ! if the move is not accepted, the statistic weight has to be
      92              :    ! increased for the current configuration.
      93              : 
      94              :   INTEGER :: MY_COMM
      95              :    ! MPI Communicator
      96              : 
      97              :   INTEGER :: size
      98              :    ! size=1
      99              : 
     100              :   INTEGER :: rank
     101              :    ! rank=0
     102              : 
     103              :   INTEGER :: Wmax
     104              :    ! samples-1 if frequency Green's function
     105              : 
     106              :   INTEGER :: iTech
     107              :    ! Precise if Frequency Green's function is computed or not
     108              : 
     109              :   INTEGER :: nflavors
     110              :    ! Number of flavors
     111              : 
     112              :   DOUBLE PRECISION :: beta
     113              :    ! Inverse of temperature
     114              : 
     115              :   DOUBLE PRECISION :: inv_beta
     116              :    ! Temperature
     117              : 
     118              :   DOUBLE PRECISION :: delta_t
     119              :    ! 1/inv_dt
     120              : 
     121              :   DOUBLE PRECISION :: inv_dt
     122              :    ! (samples-1)/beta
     123              :   DOUBLE PRECISION :: signvaluemeas
     124              : 
     125              :   DOUBLE PRECISION :: signvalueold
     126              : 
     127              :   DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:,:) :: oper
     128              :    ! oper(samples)
     129              : 
     130              :   DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: omega
     131              :    ! omega(Wmax)
     132              : 
     133              :   DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:,:) :: Mk
     134              :    ! Moments for FT
     135              : 
     136              :   COMPLEX(KIND=8)  , ALLOCATABLE, DIMENSION(:,:,:) :: oper_w
     137              :    ! Frequency Green's function
     138              : 
     139              :   COMPLEX(KIND=8)  , ALLOCATABLE, DIMENSION(:) :: oper_w_old
     140              :    ! Old frequency Green's function (not used)
     141              : 
     142              :   TYPE(Vector)                            :: oper_old
     143              :    ! useless data
     144              : 
     145              :   TYPE(VectorInt)                         :: index_old
     146              :    ! useless data
     147              : 
     148              :   TYPE(MapHyb), ALLOCATABLE, DIMENSION(:,:)  :: map
     149              :    ! value of time and Green's functions computed in GreenHyboffdiag_measHybrid
     150              :    ! These values are used to fill op%oper in the same routine.
     151              : 
     152              :  END TYPE GreenHyboffdiag
     153              : !!***
     154              : 
     155              : CONTAINS
     156              : !!***
     157              : 
     158              : !!****f* ABINIT/m_GreenHyboffdiag/GreenHyboffdiag_init
     159              : !! NAME
     160              : !!  GreenHyboffdiag_init
     161              : !!
     162              : !! FUNCTION
     163              : !!  Initialize and allocate
     164              : !!
     165              : !! COPYRIGHT
     166              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
     167              : !!  This file is distributed under the terms of the
     168              : !!  GNU General Public License, see ~abinit/COPYING
     169              : !!  or http://www.gnu.org/copyleft/gpl.txt .
     170              : !!
     171              : !! INPUTS
     172              : !!  op=Green
     173              : !!  samples=imaginary time slices
     174              : !!  beta=inverse temperature
     175              : !!  iTech=SHOULD NOT BE USED => BUGGY
     176              : !!  MY_COMM=mpi_communicator
     177              : !!
     178              : !! OUTPUT
     179              : !!
     180              : !! SIDE EFFECTS
     181              : !!
     182              : !! NOTES
     183              : !!
     184              : !! SOURCE
     185              : 
     186            0 : SUBROUTINE GreenHyboffdiag_init(op, samples, beta,nflavors,iTech,MY_COMM)
     187              : 
     188              : 
     189              : #ifdef HAVE_MPI1
     190              : include 'mpif.h'
     191              : #endif
     192              : !Arguments ------------------------------------
     193              :   TYPE(GreenHyboffdiag)     , INTENT(INOUT) :: op
     194              :   INTEGER         , INTENT(IN   ) :: samples
     195              :   DOUBLE PRECISION, INTENT(IN   ) :: beta
     196              :   INTEGER , INTENT(IN   ) :: nflavors
     197              :   !INTEGER          , INTENT(IN   ) :: Wmax
     198              :   INTEGER, OPTIONAL, INTENT(IN   ) :: iTech
     199              :   INTEGER, OPTIONAL, INTENT(IN   ) :: MY_COMM
     200              : !Local variables ------------------------------
     201              :   INTEGER                         :: iflavor,iflavorbis,sp1
     202              :   DOUBLE PRECISION                :: dt
     203              : #ifdef HAVE_MPI
     204              :   INTEGER          :: ierr
     205              : #endif
     206              : 
     207            0 :   IF ( PRESENT(MY_COMM)) THEN
     208              : #ifdef HAVE_MPI
     209            0 :     op%have_MPI = .TRUE.
     210            0 :     op%MY_COMM = MY_COMM
     211            0 :     CALL MPI_Comm_rank(op%MY_COMM, op%rank, ierr)
     212            0 :     CALL MPI_Comm_size(op%MY_COMM, op%size, ierr)
     213              : #else
     214              :     CALL WARN("GreenHyboffdiag_init : MPI is not used                                    ")
     215              :     op%have_MPI = .FALSE.
     216              :     op%MY_COMM = -1
     217              :     op%rank = 0
     218              :     op%size = 1
     219              : #endif
     220              :   ELSE
     221            0 :     op%have_MPI = .FALSE.
     222            0 :     op%MY_COMM = -1
     223            0 :     op%rank = 0
     224            0 :     op%size = 1
     225              :   END IF
     226              : 
     227            0 :   sp1             = samples + 1
     228            0 :   op%samples      = sp1
     229            0 :   op%measurements = 0
     230            0 :   op%nflavors     = nflavors
     231            0 :   op%beta         = beta
     232            0 :   op%inv_beta     = 1.d0 / beta
     233            0 :   op%inv_dt       = DBLE(samples) * op%inv_beta
     234            0 :   dt              = 1.d0 / op%inv_dt
     235            0 :   op%delta_t      = dt
     236              :   !op%Wmax         = Wmax
     237            0 :   op%Wmax         = -1
     238            0 :   FREEIF(op%Mk)
     239            0 :   MALLOC(op%Mk,(nflavors,nflavors,3))
     240            0 :   FREEIF(op%oper)
     241            0 :   MALLOC(op%oper,(sp1,nflavors,nflavors))
     242              :   ! If we want to measure in frequences
     243              :   ! let assume we first have "samples" frequences
     244            0 :   IF ( PRESENT(iTech) ) THEN
     245            0 :     op%iTech = iTech
     246            0 :     SELECT CASE (op%iTech)
     247              :     CASE (GREENHYB_TAU)  ! omega
     248            0 :       op%iTech = GREENHYB_TAU
     249              :     CASE (GREENHYB_OMEGA)  ! omega
     250            0 :       op%Wmax = samples
     251            0 :       FREEIF(op%oper_w)
     252            0 :       MALLOC(op%oper_w,(1:op%Wmax,nflavors,nflavors))
     253            0 :       FREEIF(op%oper_w_old)
     254            0 :       MALLOC(op%oper_w_old,(1:op%Wmax))
     255            0 :       op%oper_w     = CMPLX(0.d0,0.d0,8)
     256            0 :       op%oper_w_old = CMPLX(0.d0,0.d0,8)
     257            0 :       FREEIF(op%omega)
     258            0 :       MALLOC(op%omega,(1:op%Wmax))
     259            0 :       op%omega = (/ ((2.d0 * DBLE(sp1) - 1.d0)*ACOS(-1.d0)*op%inv_beta, sp1=1, op%Wmax) /)
     260              :     END SELECT
     261              :   ELSE
     262            0 :     op%iTech = GREENHYB_TAU
     263              :   END IF
     264              :   ! end if
     265            0 :   CALL Vector_init(op%oper_old,10000)
     266            0 :   CALL VectorInt_init(op%index_old,10000)
     267            0 :   DT_FREEIF(op%map)
     268            0 :   MALLOC(op%map,(nflavors,nflavors))
     269            0 :   do iflavor=1,nflavors
     270            0 :     do iflavorbis=1,nflavors
     271            0 :       CALL MapHyb_init(op%map(iflavor,iflavorbis),10000)
     272              :     enddo
     273              :   enddo
     274              : 
     275            0 :   op%oper       = 0.d0
     276            0 :   op%signvaluemeas = 0.d0
     277            0 :   op%signvalueold = 0.d0
     278            0 :   op%set        = .TRUE.
     279            0 :   op%factor     = 1
     280            0 :   op%setMk      = 0
     281            0 :   op%Mk         = 0.d0
     282            0 : END SUBROUTINE GreenHyboffdiag_init
     283              : !!***
     284              : 
     285              : !!****f* ABINIT/m_GreenHyboffdiag/GreenHyboffdiag_reset
     286              : !! NAME
     287              : !!  GreenHyboffdiag_reset
     288              : !!
     289              : !! FUNCTION
     290              : !!  reset green function
     291              : !!
     292              : !! COPYRIGHT
     293              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
     294              : !!  This file is distributed under the terms of the
     295              : !!  GNU General Public License, see ~abinit/COPYING
     296              : !!  or http://www.gnu.org/copyleft/gpl.txt .
     297              : !!
     298              : !! INPUTS
     299              : !!  op=Green
     300              : !!
     301              : !! OUTPUT
     302              : !!
     303              : !! SIDE EFFECTS
     304              : !!
     305              : !! NOTES
     306              : !!
     307              : !! SOURCE
     308              : 
     309            0 : SUBROUTINE GreenHyboffdiag_reset(op)
     310              : 
     311              : !Arguments ------------------------------------
     312              :   TYPE(GreenHyboffdiag)     , INTENT(INOUT) :: op
     313              : 
     314            0 :   CALL GreenHyboffdiag_clear(op)
     315            0 :   op%setMk        = 0
     316            0 :   op%Mk           = 0.d0
     317            0 :   op%setT         = .FALSE.
     318            0 :   op%setW         = .FALSE.
     319            0 : END SUBROUTINE GreenHyboffdiag_reset
     320              : !!***
     321              : 
     322              : 
     323              : !!****f* ABINIT/m_GreenHyboffdiag/GreenHyboffdiag_clear
     324              : !! NAME
     325              : !!  GreenHyboffdiag_clear
     326              : !!
     327              : !! FUNCTION
     328              : !!  clear green function
     329              : !!
     330              : !! COPYRIGHT
     331              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
     332              : !!  This file is distributed under the terms of the
     333              : !!  GNU General Public License, see ~abinit/COPYING
     334              : !!  or http://www.gnu.org/copyleft/gpl.txt .
     335              : !!
     336              : !! INPUTS
     337              : !!  op=Green
     338              : !!
     339              : !! OUTPUT
     340              : !!
     341              : !! SIDE EFFECTS
     342              : !!
     343              : !! NOTES
     344              : !!
     345              : !! SOURCE
     346              : 
     347            0 : SUBROUTINE GreenHyboffdiag_clear(op)
     348              : 
     349              : !Arguments ------------------------------------
     350              :   TYPE(GreenHyboffdiag)     , INTENT(INOUT) :: op
     351              :   INTEGER :: iflavor,iflavorbis
     352              : 
     353              :   !CALL Vector_clear(op%oper_old)
     354              :   !CALL VectorInt_clear(op%index_old)
     355            0 :   do iflavor=1,op%nflavors
     356            0 :     do iflavorbis=1,op%nflavors
     357            0 :       CALL MapHyb_clear(op%map(iflavor,iflavorbis))
     358              :     enddo
     359              :   enddo
     360            0 :   op%measurements = 0
     361            0 :   IF ( ALLOCATED(op%oper) ) &
     362            0 :   op%oper         = 0.d0
     363            0 :   op%signvaluemeas = 0.d0
     364            0 :   op%signvalueold = 1.d0
     365            0 :   IF ( op%iTech .EQ. GREENHYB_OMEGA ) THEN
     366            0 :     IF ( ALLOCATED(op%oper_w) ) &
     367            0 :     op%oper_w       = CMPLX(0.d0,0.d0,8)
     368            0 :     IF ( ALLOCATED(op%oper_w_old) ) &
     369            0 :     op%oper_w_old   = CMPLX(0.d0,0.d0,8)
     370              :   END IF
     371            0 :   op%factor       = 0
     372            0 : END SUBROUTINE GreenHyboffdiag_clear
     373              : !!***
     374              : 
     375              : !!****f* ABINIT/m_GreenHyboffdiag/GreenHyboffdiag_setOperW
     376              : !! NAME
     377              : !!  GreenHyboffdiag_setOperW
     378              : !!
     379              : !! FUNCTION
     380              : !!  set Green function in frequencies
     381              : !!
     382              : !! COPYRIGHT
     383              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
     384              : !!  This file is distributed under the terms of the
     385              : !!  GNU General Public License, see ~abinit/COPYING
     386              : !!  or http://www.gnu.org/copyleft/gpl.txt .
     387              : !!
     388              : !! INPUTS
     389              : !!  op=Green
     390              : !!  Gomega=Input values
     391              : !!
     392              : !! OUTPUT
     393              : !!
     394              : !! SIDE EFFECTS
     395              : !!
     396              : !! NOTES
     397              : !!
     398              : !! SOURCE
     399              : 
     400            0 : SUBROUTINE GreenHyboffdiag_setOperW(op, Gomega)
     401              : 
     402              : !Arguments ------------------------------------
     403              :   TYPE(GreenHyboffdiag)          , INTENT(INOUT) :: op
     404              :   COMPLEX(KIND=8), DIMENSION(:,:,:), INTENT(IN   ) :: Gomega
     405              : !Loval variables ------------------------------
     406              :   INTEGER :: tail
     407              : 
     408            0 :   tail = SIZE(Gomega,1)
     409            0 :   IF ( .NOT. op%set ) &
     410            0 :     CALL ERROR("GreenHyboffdiag_setOperW : Uninitialized GreenHyboffdiag structure")
     411            0 :   IF ( ALLOCATED(op%oper_w) ) THEN
     412            0 :     IF ( SIZE(op%oper_w) .NE. tail ) THEN
     413            0 :       FREE(op%oper_w)
     414            0 :       MALLOC(op%oper_w,(1:tail,op%nflavors,op%nflavors))
     415              :     END IF
     416              :   ELSE
     417            0 :     MALLOC(op%oper_w,(1:tail,op%nflavors,op%nflavors))
     418              :   END IF
     419            0 :   op%oper_w(:,:,:) = Gomega(:,:,:)
     420            0 :   op%Wmax = tail
     421            0 :   op%setW = .TRUE.
     422            0 : END SUBROUTINE GreenHyboffdiag_setOperW
     423              : !!***
     424              : 
     425              : !!****f* ABINIT/m_GreenHyboffdiag/GreenHyboffdiag_measHybrid
     426              : !! NAME
     427              : !!  GreenHyboffdiag_measHybrid
     428              : !!
     429              : !! FUNCTION
     430              : !!  Measure Green's function
     431              : !!
     432              : !! COPYRIGHT
     433              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
     434              : !!  This file is distributed under the terms of the
     435              : !!  GNU General Public License, see ~abinit/COPYING
     436              : !!  or http://www.gnu.org/copyleft/gpl.txt .
     437              : !!
     438              : !! INPUTS
     439              : !!  op=Green
     440              : !!  Mmatrix=M matrix for the current flavor
     441              : !!  ListCdagC_1=list of all creator and annhilator operators
     442              : !!  updated=should we accumulate or not
     443              : !!
     444              : !! OUTPUT
     445              : !!
     446              : !! SIDE EFFECTS
     447              : !!
     448              : !! NOTES
     449              : !!
     450              : !! SOURCE
     451              : 
     452            0 : SUBROUTINE GreenHyboffdiag_measHybrid(op, Mmatrix, ListCdagC_1, updated,signvalue,activeflavor)
     453              : 
     454              : !Arguments ------------------------------------
     455              :   TYPE(GreenHyboffdiag)    , INTENT(INOUT) :: op
     456              :   TYPE(MatrixHyb)   , INTENT(IN   ) :: Mmatrix
     457              :   TYPE(ListCdagC)   , INTENT(IN   ) :: ListCdagC_1(op%nflavors)
     458              :   DOUBLE PRECISION  , INTENT(IN   ) :: signvalue
     459              :   LOGICAL        , INTENT(IN   ) :: updated
     460              :   INTEGER, OPTIONAL  , INTENT(IN  ) :: activeflavor
     461              : !Local variables ------------------------------
     462              :   INTEGER                        :: iC
     463              :   INTEGER                        :: iCdag
     464              :   INTEGER                        :: tail
     465              :   INTEGER                        :: tailbis
     466              :   !INTEGER                        :: index
     467              :   INTEGER                        :: idx_old
     468              :   INTEGER                        :: old_size
     469              : !  INTEGER                        :: omegaSamples
     470              : !  INTEGER                        :: iomega
     471              :   INTEGER                        :: iflavor
     472              :   INTEGER                        :: iflavorbis
     473              :   INTEGER                        :: iC_m,iC_m_add
     474              :   INTEGER                        :: iCdag_m,iCdag_m_add
     475              :   INTEGER                        :: stail !,ii
     476              : !  DOUBLE PRECISION               :: pi_invBeta
     477              :   DOUBLE PRECISION               :: mbeta_two
     478              :   DOUBLE PRECISION               :: beta
     479              :   DOUBLE PRECISION               :: beta_tc
     480              :   DOUBLE PRECISION               :: tcbeta_tc
     481              :   DOUBLE PRECISION               :: inv_dt
     482              :   DOUBLE PRECISION               :: tC,tc_phys
     483              :   DOUBLE PRECISION               :: tCdag
     484              :   DOUBLE PRECISION               :: time
     485              :   DOUBLE PRECISION               :: signe,signe2
     486              :   DOUBLE PRECISION               :: argument
     487              :   INTEGER                        :: iflavorbegin,iflavorend,prtopt
     488              :   !DOUBLE PRECISION               :: taupi_invbeta
     489              :   !COMPLEX(KIND=8)                   :: cargument
     490              :   !COMPLEX(2*8)                   :: base_exp
     491              :   !COMPLEX(2*8)                   :: increm_exp
     492              :   !write(6,*) "measHybrid"
     493            0 :   prtopt=0
     494            0 :   IF ( op%set .EQV. .FALSE. ) &
     495            0 :     CALL ERROR("GreenHyboffdiag_measHybrid : green operator not set         ")
     496            0 :   stail=0
     497            0 :   do iflavor=1,op%nflavors
     498            0 :     stail=stail + ListCdagC_1(iflavor)%tail
     499              :   enddo
     500            0 :   iflavorbegin = 1
     501            0 :   iflavorend   = op%nflavors
     502              : 
     503              :   if(present(activeflavor)) then
     504              :     if(activeflavor.ne.0) then
     505              : !sui!write(6,*) "measHybrid activeflavor",activeflavor
     506              :       iflavorbegin = activeflavor
     507              :       iflavorend   = activeflavor
     508              :     endif
     509              :   endif
     510              : 
     511            0 :   IF ( stail .NE. Mmatrix%tail ) &
     512            0 :       CALL ERROR("GreenHyboffdiag_measHybrid : ListCdagC & M unconsistent     ")
     513              : 
     514            0 :   IF ( updated .EQV. .TRUE. ) THEN ! NEW change in the configuration
     515              :     ! FIXME SHOULD be much more faster
     516              : 
     517              : 
     518              :    ! write(6,*) "LKLLL2b"
     519            0 :     SELECT CASE(op%iTech)
     520              :     CASE (GREENHYB_TAU)
     521            0 :       argument = DBLE(op%factor)
     522              : !     At the beginning old_size=0, then it increases
     523              : !     until
     524              : !     for all values of iC, increment green%oper with the value of the
     525              : !     Green's function in listDBLE(iC) obtained from previous iteration
     526              : !     (below)
     527              :       ! ===============================================================
     528              :       ! An update has been done. So the Green's function will change
     529              :       ! It is thus the good moment to store the previous Green's
     530              :       ! function with argument, the number of times this Green's
     531              :       ! function has been constant
     532              :       ! ===============================================================
     533            0 :       DO iflavor=1, op%nflavors
     534            0 :         DO iflavorbis=1, op%nflavors
     535            0 :           old_size = op%map(iflavor,iflavorbis)%tail
     536              :           !write(6,*) "size listDBLE",size(op%map(iflavor,iflavorbis)%listDBLE)
     537              :           !write(6,*) " measHybrid",old_size,iflavor,iflavorbis
     538            0 :           DO iC = 1, old_size
     539              :             if(op%map(iflavor,iflavorbis)%listINT(iC)==0) then
     540              :               !write(6,*) "listINT(iC)=",iC,op%map(iflavor,iflavorbis)%listINT(iC)
     541              :             endif
     542              :             !write(6,*) " measHybrid  iflavor,iflavorbis,iC listINT ",iflavor,iflavorbis,iC,op%map(iflavor,iflavorbis)%listINT(iC)
     543              :             !write(6,*) " measHybrid  listDBLE ",iflavor,iflavorbis,iC,op%map(iflavor,iflavorbis)%listDBLE(iC),argument
     544              :             !write(6,*) "measHybrid ic iflavor1 iflavor2 oper",ic,iflavor,iflavorbis,op%map(iflavor,iflavorbis)%listDBLE(iC) * op%signvalueold *  argument
     545              :             op%oper(op%map(iflavor,iflavorbis)%listINT(iC),iflavor,iflavorbis) =                &
     546              :                            op%oper(op%map(iflavor,iflavorbis)%listINT(iC),iflavor,iflavorbis) &
     547            0 :                          + op%map(iflavor,iflavorbis)%listDBLE(iC) * op%signvalueold *  argument
     548              :            !if(op%map(iflavor,iflavorbis)%listINT(iC)==1.and.iflavor==iflavorbis) then
     549              :           !  if(iflavor==iflavorbis) then
     550              :           !   !sui!write(6,*) "G(0)", op%map(iflavor,iflavorbis)%listINT(iC),op%map(iflavor,iflavorbis)%listDBLE(iC) * op%signvalueold,op%oper(op%map(iflavor,iflavorbis)%listINT(iC),iflavor,iflavorbis),iflavor
     551              :           !  endif
     552              :           !  if(iflavor==1.and.iflavorbis==6.and.op%map(iflavor,iflavorbis)%listINT(iC)==1) then
     553              :           !          !prt!if(prtopt==1) write(6,*) "G16(0)", op%map(iflavor,iflavorbis)%listDBLE(iC) * op%signvalueold*argument,op%oper(op%map(iflavor,iflavorbis)%listINT(iC),iflavor,iflavorbis),op%signvalueold
     554              :           !  endif
     555              :           !  if(iflavor==6.and.iflavorbis==1.and.op%map(iflavor,iflavorbis)%listINT(iC)==1) then
     556              :           !          !prt!if(prtopt==1) write(6,*) "G61(0)", op%map(iflavor,iflavorbis)%listDBLE(iC) * op%signvalueold*argument,op%oper(op%map(iflavor,iflavorbis)%listINT(iC),iflavor,iflavorbis),op%signvalueold
     557              :           !  endif
     558              :           END DO
     559              :       ! tail**2 is the number of possible t-t'
     560              :       ! MapHyb_setSize with resize map tail*tail will thus be the new
     561              :       ! op%map%tail
     562              :       ! update size of map and map%tail
     563              :           CALL MapHyb_setSize(op%map(iflavor,iflavorbis),&
     564            0 : &          ListCdagC_1(iflavor)%tail*ListCdagC_1(iflavorbis)%tail)
     565              :         END DO
     566              :       END DO
     567            0 :       op%signvaluemeas = op%signvaluemeas + op%signvalueold * argument
     568            0 :       op%measurements = op%measurements + op%factor
     569              :     !sui!write(6,*) "   measurements", op%measurements
     570              :          !sui! write(6,*) "                  signvaluemeas",op%signvaluemeas,op%signvalueold*argument
     571              :          !sui! write(6,*) "                  signvaluemeas/measurements",op%signvaluemeas/op%measurements
     572              : 
     573              :       ! This is new measurement, thus op%factor should be put to one
     574            0 :       op%factor = 1
     575              :    ! write(6,*) "LKLLL2C"
     576              : 
     577              : 
     578              :       ! initialized index idx_old for the doubles loops over flavors and segments.
     579              : 
     580              :       ! setup usefull quantities
     581            0 :       beta   =  op%beta
     582            0 :       mbeta_two = -(beta*0.5d0)
     583            0 :       inv_dt =  op%inv_dt
     584              : 
     585              :       ! WARNING time is not the time but just a temporary variable.
     586              :       ! Index Time has been calculated previously and is in mat_tau
     587              : 
     588              :       ! initialized index for each annihilation time of a segment for a given flavor
     589              : 
     590              :       ! initialized index for each creation time of a segment for another  flavor
     591              : 
     592            0 :       iC_m=0
     593            0 :       iC_m_add=0
     594            0 :       DO iflavor=1,op%nflavors
     595            0 :         tail=ListCdagC_1(iflavor)%tail
     596              :         !write(6,*) " measHybrid  iflavor",iflavor,tail
     597              : 
     598            0 :         iCdag_m=0
     599            0 :         iCdag_m_add=0
     600            0 :         DO iflavorbis=1,op%nflavors
     601            0 :           tailbis=ListCdagC_1(iflavorbis)%tail
     602              :           !write(6,*) " measHybrid  iflavorbis",iflavorbis,tailbis
     603            0 :           idx_old = 0
     604              : 
     605            0 :           DO iC  = 1, tail
     606              :             ! tC is the annihilation (C_) time for segment iC and flavor iflavor
     607              :             !-------------------------------------------------------------------
     608            0 :             tC   = ListCdagC_1(iflavor)%list(iC,C_)
     609              : 
     610              :             !iC_m=iC_m+1  ! for Mmatrix%mat
     611              :             ! For each flavor iflavor, iC start at \sum_{iflavor1<iflavor} tail(iflavor1)
     612              :             ! It thus explains the presence of iC_m_add (same below for iCdag_m_add)
     613              :             ! ---------------------------------------------------------------------------------
     614            0 :             iC_m=iC_m_add+iC
     615            0 :             beta_tc = beta - tC
     616            0 :             tcbeta_tc = tC * beta_tc
     617              : 
     618              :              !write(6,*) " measHybrid  iC_m",iC_m
     619              :              !write(6,*) " measHybrid  tailbis",tailbis
     620            0 :             DO iCdag = 1, tailbis
     621              :               !iCdag_m=iCdag_m+1
     622            0 :               iCdag_m=iCdag_m_add+iCdag
     623              :              !write(6,*) " measHybrid  iCdag_m",iCdag_m
     624              : 
     625              :               ! tCdag is the creation time for segment iCdag and flavor iflavorbis
     626            0 :               tCdag  = ListCdagC_1(iflavorbis)%list(iCdag,Cdag_)
     627              : 
     628              : !  ---        time is equivalent to  time=(tc-tcdag)*(beta-tc) and is only
     629              : !  ---        useful for signe
     630            0 :               time = tcbeta_tc - tCdag*beta_tc
     631              : 
     632              :               !signe = SIGN(1.d0,time)
     633              :               !time = time + (signe-1.d0)*mbeta_two
     634              :               !signe = signe * SIGN(1.d0,beta-tC)
     635              :               !signe = SIGN(1.d0,time) * SIGN(1.d0,beta-tC)
     636            0 :               tc_phys=tc
     637            0 :               if(tc>beta) tc_phys=tc-beta
     638            0 :               signe2=SIGN(1.d0,tc_phys-tcdag)
     639              : 
     640            0 :               if(iflavor==iflavorbis) signe = SIGN(1.d0,time)
     641            0 :               if(iflavor/=iflavorbis) signe = signe2
     642              :              ! signe = SIGN(1.d0,tc-tcdag)
     643              :               ! --- tc>tcdag and beta>tc signe=1  ! segment in the middle or antisegment at the edge
     644              :               !                                   ! tc-tcdag  > 0
     645              :               ! --- tc<tcdag and beta<tc signe=1  ! never
     646              :               ! --- tc>tcdag and beta<tc signe=-1 ! segment  at the edges
     647              :               !                                   ! tc'-tcdag < 0 (with tc'=tc-beta)  -> signe < 0
     648              :               ! --- tc<tcdag and beta>tc signe=-1 ! antisegment in the middle
     649              :               !                                   ! tc-tcdag  < 0 (with tc'=tc-beta)  -> signe < 0
     650              :               ! 22/09/14:
     651              :               ! ListCdagC_1 is the list of segment, so we are dealing
     652              :               ! only with segment here. However all combination of Cdag
     653              :               ! and C are taken, this it is possible that tc<tcdag
     654              : 
     655              :               ! 21/10/14: Wagt is important are the true times (between
     656              :               ! 0 and beta). If tauC>tauCdag signe=+1
     657              :               !              If tauC<tauCdag signe=-1
     658              :               ! if(tc<tcdag.and.(iflavor==iflavorbis)) then
     659              :               !   write(6,*)  ListCdagC_1(iflavorbis)%tail
     660              :               !   do ii=1, ListCdagC_1(iflavorbis)%tail
     661              :               !     write(6,*)  ListCdagC_1(iflavorbis)%list(ii,1), ListCdagC_1(iflavorbis)%list(ii,2)
     662              :               !   enddo
     663              :               !   write(6,*) "tc<tcdag", tc,tcdag,beta,iflavor,iflavorbis
     664              :               !   stop
     665              :               ! endif
     666              : 
     667              :               if(tc-tcdag>beta) then
     668              :              !   write(6,*) " tc-tcdag > beta ", tcdag-tc,beta
     669              :               endif
     670              :               !if(tc>beta) then
     671              :               !  write(6,*) " TC>BETA"
     672              :               !  write(6,*) " iflavor,iflavorbis",iflavor,iflavorbis
     673              :               !  write(6,*) " ic,icdag          ",ic,icdag
     674              :               !  write(6,*) " signe             ",signe
     675              :               !  write(6,*) " tc,tcdag          ",tc,tcdag
     676              :               !  write(6,*) " Mmatrix%mat       ",Mmatrix%mat(iCdag_m,iC_m)
     677              :               !  write(6,*) " Mmatrix%mat_tau   ",Mmatrix%mat_tau(iCdag_m,iC_m)
     678              :               !endif
     679              :               ! Si iflavor/=iflavorbis, tc-tcdag can be negative..so in
     680              :               ! this case, on should add beta to tc-tcdag with the minus
     681              :               ! sign. NOT DONE HERE??
     682              : 
     683              : !             ----- Compute the Green's function as the value of the matrix M for times iCdag and iC.
     684            0 :               argument = signe*Mmatrix%mat(iCdag_m,iC_m)
     685              : 
     686              :               !index = INT( ( time * inv_dt ) + 1.5d0 )
     687              :               !IF (index .NE. Mmatrix%mat_tau(iCdag,iC)) THEN
     688              :               !  WRITE(*,*) index, Mmatrix%mat_tau(iCdag,iC)
     689              :               !!  CALL ERROR("Plantage")
     690              :               !END IF
     691              : 
     692            0 :               idx_old = idx_old + 1
     693              : 
     694              :               ! --- define the  value of listDBLE as a function of idx_old
     695            0 :               op%map(iflavor,iflavorbis)%listDBLE(idx_old) = argument
     696              :               !write(6,*) " measHybrid  listDBLE2 ",iflavor,iflavorbis,idx_old,argument
     697              :               !op%map%listINT(idx_old)  = index
     698              : 
     699              :               ! --- define the new corresponding value of listINT(idx_old) from mat_tau (integers)
     700              :               ! --- idx_old has no meaning but listINT(idx_old) has.
     701            0 :               op%map(iflavor,iflavorbis)%listINT(idx_old)  = Mmatrix%mat_tau(iCdag_m,iC_m)
     702              :               !write(6,*) " measHybrid  idx_old listINT ",idx_old,op%map(iflavor,iflavorbis)%listINT(idx_old)
     703              :               !write(6,*) " measHybrid  iCdag_m, iC_m, mat_tau",iCdag_m,iC_m,Mmatrix%mat_tau(iCdag_m,iC_m)
     704              :             !  if(iflavor==1.and.iflavorbis==2.and.op%map(iflavor,iflavorbis)%listINT(idx_old)==1) then
     705              :             !    !prt!if(prtopt==1) write(6,*) "---------------------------"
     706              :             !    !prt!if(prtopt==1) write(6,*) "GG12(0)", op%map(iflavor,iflavorbis)%listINT(idx_old),op%map(iflavor,iflavorbis)%listDBLE(idx_old),tcdag,tc,signe,signe2
     707              :             !    !prt!if(prtopt==1) write(6,*) "       ", tc-tcdag,tc_phys-tcdag
     708              :             !    do ii=1, tail
     709              :             !      !prt!if(prtopt==1)  write(6,*) ii, ListCdagC_1(iflavor)%list(ii,1), ListCdagC_1(iflavor)%list(ii,2)
     710              :             !    enddo
     711              :             !    do ii=1, tailbis
     712              :             !      !prt!if(prtopt==1)  write(6,*) ii, ListCdagC_1(iflavorbis)%list(ii,1), ListCdagC_1(iflavorbis)%list(ii,2)
     713              :             !    enddo
     714              :             !    !prt!if(prtopt==1) write(6,*) "---------------------------"
     715              :             !  endif
     716              :             !  if(iflavor==1.and.iflavorbis==2.and.op%map(iflavor,iflavorbis)%listINT(idx_old)==999) then
     717              :             !    !prt!if(prtopt==1) write(66,*) "---------------------------"
     718              :             !    !prt!if(prtopt==1) write(66,*) "GG12(0)", op%map(iflavor,iflavorbis)%listINT(idx_old),op%map(iflavor,iflavorbis)%listDBLE(idx_old),tcdag,tc,signe,signe2
     719              :             !    !prt!if(prtopt==1) write(66,*) "       ", tc-tcdag,tc_phys-tcdag
     720              :             !    do ii=1, tail
     721              :             !      !prt!if(prtopt==1)  write(66,*) ii, ListCdagC_1(iflavor)%list(ii,1), ListCdagC_1(iflavor)%list(ii,2)
     722              :             !    enddo
     723              :             !    do ii=1, tailbis
     724              :             !      !prt!if(prtopt==1)  write(66,*) ii, ListCdagC_1(iflavorbis)%list(ii,1), ListCdagC_1(iflavorbis)%list(ii,2)
     725              :             !    enddo
     726              :             !    !prt!if(prtopt==1) write(66,*) "---------------------------"
     727              :             !  endif
     728              :             !  !if(iflavor==2.and.iflavorbis==1.and.op%map(iflavor,iflavorbis)%listINT(idx_old)==1) then
     729              :               !   !prt!if(prtopt==1) write(6,*) "GG21(0)", op%map(iflavor,iflavorbis)%listINT(idx_old),op%map(iflavor,iflavorbis)%listDBLE(idx_old),tcdag,tc,signe
     730              :               !endif
     731              : 
     732              : 
     733              :             END DO
     734              :           END DO
     735              :         !  do ii=1,tail*tailbis
     736              :         !   !write(6,*) " measHybrid  ii,op%map(iflavor,iflavorbis)%listINT(ii)", ii,op%map(iflavor,iflavorbis)%listINT(ii)
     737              :         !  enddo
     738            0 :           iCdag_m_add=iCdag_m_add+tailbis
     739              :         END DO ! iflavorbis
     740            0 :        iC_m_add=iC_m_add+tail
     741              :       END DO ! iflavor
     742            0 :       op%signvalueold = signvalue
     743              :    ! write(6,*) "LKLLL2D"
     744              :     CASE (GREENHYB_OMEGA)
     745              :     !  argument = DBLE(op%factor)
     746              :     !  DO iomega = 1, omegaSamples
     747              :     !    op%oper_w(iomega) = op%oper_w(iomega) + op%oper_w_old(iomega) * argument
     748              :     !  END DO
     749              :     !  op%measurements = op%measurements + op%factor
     750              : 
     751              :     !  op%factor = 1
     752              :     !  beta   =  op%beta
     753              :     !  mbeta_two = -(beta*0.5d0)
     754              :     !  pi_invBeta = ACOS(-1.d0)/beta
     755              :     !  omegaSamples = op%samples-1
     756              :     !  DO iC  = 1, tail
     757              :     !    tC   = ListCdagC_1%list(iC,C_)
     758              :     !    DO iCdag = 1, tail
     759              :     !      tCdag  = ListCdagC_1%list(iCdag,Cdag_)
     760              :     !      time = tC - tCdag
     761              : 
     762              :     !      signe = SIGN(1.d0,time)
     763              :     !      time = time + (signe-1.d0)*mbeta_two
     764              :     !      signe = signe * SIGN(1.d0,beta-tC)
     765              :     !      argument = signe*Mmatrix%mat(iCdag,iC)
     766              : 
     767              :     !      DO iomega = 1, omegaSamples
     768              :     !        !op%oper_w_old(iomega) = Mmatrix%mat_tau(iCdag,iC)*CMPLX(0.d0,argument)
     769              :     !        op%oper_w_old(iomega) = EXP(CMPLX(0.d0,op%omega(iomega)*time))*CMPLX(0.d0,argument)
     770              :     !      END DO
     771              :     !    END DO
     772              :     !  END DO
     773              :     END SELECT
     774              :   ELSE
     775            0 :     op%factor = op%factor + 1
     776              :   END IF
     777            0 : END SUBROUTINE GreenHyboffdiag_measHybrid
     778              : !!***
     779              : 
     780              : !!****f* ABINIT/m_GreenHyboffdiag/GreenHyboffdiag_getHybrid
     781              : !! NAME
     782              : !!  GreenHyboffdiag_getHybrid
     783              : !!
     784              : !! FUNCTION
     785              : !!  reduce green function
     786              : !!
     787              : !! COPYRIGHT
     788              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
     789              : !!  This file is distributed under the terms of the
     790              : !!  GNU General Public License, see ~abinit/COPYING
     791              : !!  or http://www.gnu.org/copyleft/gpl.txt .
     792              : !!
     793              : !! INPUTS
     794              : !!  op=Green
     795              : !!
     796              : !! OUTPUT
     797              : !!
     798              : !! SIDE EFFECTS
     799              : !!
     800              : !! NOTES
     801              : !!
     802              : !! SOURCE
     803              : 
     804            0 : SUBROUTINE GreenHyboffdiag_getHybrid(op)
     805              : 
     806              : !Arguments ------------------------------------
     807              :   TYPE(GreenHyboffdiag), INTENT(INOUT) :: op
     808              : 
     809            0 :   IF ( op%set .EQV. .FALSE. ) &
     810            0 :     CALL ERROR("GreenHyboffdiag_getHybrid : green operator not set          ")
     811              : 
     812            0 :   SELECT CASE(op%iTech)
     813              :   CASE (GREENHYB_TAU)
     814            0 :     op%oper = -(op%oper * op%inv_beta) / (DBLE(op%measurements) * op%delta_t)
     815              :   !sui!write(6,*) "measurements",op%measurements,op%delta_t,op%inv_beta
     816              :   !sui!write(6,*) "signevaluemeas meas",op%signvaluemeas,op%measurements
     817            0 :     op%signvaluemeas = op%signvaluemeas / DBLE(op%measurements)
     818              :    ! print*, "op%oper",op%oper(1,1,1)
     819              :   !sui!write(6,*) "signevaluemeas/meas",op%signvaluemeas
     820              :    ! print*, "signevaluemeas/meas",op%signvaluemeas
     821            0 :     op%setT = .TRUE.
     822              :   CASE (GREENHYB_OMEGA)
     823            0 :     op%oper_w = -(op%oper_w * op%inv_beta) / (DBLE(op%measurements) * op%delta_t)
     824            0 :     op%setW = .TRUE.
     825            0 :     CALL GreenHyboffdiag_backFourier(op)
     826              :   END SELECT
     827              : 
     828            0 : END SUBROUTINE GreenHyboffdiag_getHybrid
     829              : !!***
     830              : 
     831              : !!****f* ABINIT/m_GreenHyboffdiag/GreenHyboffdiag_setN
     832              : !! NAME
     833              : !!  GreenHyboffdiag_setN
     834              : !!
     835              : !! FUNCTION
     836              : !!  impose number of electrons for this flavor
     837              : !!
     838              : !! COPYRIGHT
     839              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
     840              : !!  This file is distributed under the terms of the
     841              : !!  GNU General Public License, see ~abinit/COPYING
     842              : !!  or http://www.gnu.org/copyleft/gpl.txt .
     843              : !!
     844              : !! INPUTS
     845              : !!  op=Green
     846              : !!  N=number of electrons
     847              : !!
     848              : !! OUTPUT
     849              : !!
     850              : !! SIDE EFFECTS
     851              : !!
     852              : !! NOTES
     853              : !!
     854              : !! SOURCE
     855              : 
     856            0 : SUBROUTINE GreenHyboffdiag_setN(op,N)
     857              : 
     858              : !Arguments ------------------------------------
     859              :   TYPE(GreenHyboffdiag)    , INTENT(INOUT)    :: op
     860              :   DOUBLE PRECISION  , INTENT(IN   )    :: N(op%nflavors)
     861              :   INTEGER :: iflavor,iflavor2
     862              :   !COMPLEX(KIND=8) :: tmpoper
     863              : 
     864            0 :   IF ( op%set .EQV. .FALSE. ) &
     865            0 :     CALL ERROR("GreenHyboffdiag_setN: green op%operator not set                ")
     866            0 :   DO iflavor=1, op%nflavors
     867              :    ! write(6,*) "iflavor",-N(iflavor)*op%signvaluemeas ,2*op%oper(op%samples,iflavor,iflavor),(N(iflavor)-1.d0)*op%signvaluemeas
     868              :     ! the mulplication by signvaluemeas is necessary because N is
     869              :     ! exactly the number of electrons in the flavor iflavor whereas
     870              :     ! op%oper is not exact, because it still has to be divided by
     871              :     ! signvaluemeas after the MPIREDUCE
     872            0 :     op%oper(1,iflavor,iflavor) = (N(iflavor) - 1.d0)*op%signvaluemeas
     873            0 :     op%oper(op%samples,iflavor,iflavor) = - N(iflavor)*op%signvaluemeas
     874              :     !op%oper(op%samples,iflavor,iflavor) = 2*op%oper(op%samples,iflavor,iflavor)
     875              :     !op%oper(1,iflavor,iflavor) = 2*op%oper(1,iflavor,iflavor)
     876            0 :     DO iflavor2=1, op%nflavors
     877            0 :       if(iflavor/=iflavor2) then
     878              :               ! UNEXPLAINED but MANDATORY to have exact results for U=0 nspinor=4 with pawspnorb=0
     879              :               ! Correction: The fact 2 is necessary for edge points because the points are at the
     880              :               ! edges.
     881              :               ! It is of course necessary to fulfill exact results (U=0).
     882              :     !tmpoper=(op%oper(op%samples,iflavor,iflavor2)-op%oper(1,iflavor,iflavor2))
     883              :     !op%oper(op%samples,iflavor,iflavor2) = tmpoper
     884              :     !op%oper(1,iflavor,iflavor2) = -tmpoper
     885              :     !op%oper(op%samples,iflavor,iflavor2) = 2*op%oper(op%samples,iflavor,iflavor2)
     886              :     !op%oper(1,iflavor,iflavor2) = 2*op%oper(1,iflavor,iflavor2)
     887            0 :         op%oper(op%samples,iflavor,iflavor2) = 2*op%oper(op%samples,iflavor,iflavor2)
     888            0 :         op%oper(1,iflavor,iflavor2) = 2*op%oper(1,iflavor,iflavor2)
     889              :       endif
     890              :     ENDDO
     891              :   ENDDO
     892            0 : END SUBROUTINE GreenHyboffdiag_setN
     893              : !!***
     894              : 
     895              : !!****f* ABINIT/m_GreenHyboffdiag/GreenHyboffdiag_setMuD1
     896              : !! NAME
     897              : !!  GreenHyboffdiag_setMuD1
     898              : !!
     899              : !! FUNCTION
     900              : !!  Set first moments for G
     901              : !!
     902              : !! COPYRIGHT
     903              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
     904              : !!  This file is distributed under the terms of the
     905              : !!  GNU General Public License, see ~abinit/COPYING
     906              : !!  or http://www.gnu.org/copyleft/gpl.txt .
     907              : !!
     908              : !! INPUTS
     909              : !!  op=Green
     910              : !!  mu=energy level (irrespectige with fermi level)
     911              : !!  d1=first moment of hybridization function ("K")
     912              : !!
     913              : !! OUTPUT
     914              : !!  argout(sizeout)=description
     915              : !!
     916              : !! SIDE EFFECTS
     917              : !!
     918              : !! NOTES
     919              : !!
     920              : !! SOURCE
     921              : 
     922            0 : SUBROUTINE GreenHyboffdiag_setMuD1(op,iflavor,iflavor2,mu,d1)
     923              : 
     924              : !Arguments ------------------------------------
     925              : !Arguments ------------------------------------
     926              : !scalars
     927              :   DOUBLE PRECISION, INTENT(IN   ) :: mu
     928              :   DOUBLE PRECISION, INTENT(IN   ) :: d1
     929              :   INTEGER         , INTENT(IN   ) :: iflavor
     930              :   INTEGER         , INTENT(IN   ) :: iflavor2
     931              : !type
     932              :   TYPE(GreenHyboffdiag)  , INTENT(INOUT) :: op
     933              : !Local variables ------------------------------------
     934              :   DOUBLE PRECISION                :: mu2
     935              : !*********************************************************************
     936              : 
     937              :   ABI_UNUSED((/d1/))
     938              : 
     939            0 :   mu2=0
     940            0 :   if(iflavor==iflavor2) mu2=mu
     941              : 
     942            0 :   if(iflavor==iflavor2) then
     943            0 :     op%Mk(iflavor,iflavor2,3) = -d1-(mu*mu)
     944              :     !op%Mk(iflavor,iflavor2,3) = -(mu*mu)
     945            0 :     op%Mk(iflavor,iflavor2,2) = -mu
     946              :  !sui!write(6,*) "setmud1",iflavor,iflavor2, op%Mk(iflavor,iflavor2,2), op%Mk(iflavor,iflavor2,3)
     947              :   else
     948            0 :     op%Mk(iflavor,iflavor2,3) = 0.d0
     949            0 :     op%Mk(iflavor,iflavor2,2) = 0.d0
     950              :   endif
     951            0 :   op%setMk = op%setMk + 1
     952              : !write(6,*) "mom1",op%Mk(iflavor,iflavor2,:)
     953            0 : END SUBROUTINE GreenHyboffdiag_setMuD1
     954              : !!***
     955              : 
     956              : !!****f* ABINIT/m_GreenHyboffdiag/GreenHyboffdiag_setMoments
     957              : !! NAME
     958              : !!  GreenHyboffdiag_setMoments
     959              : !!
     960              : !! FUNCTION
     961              : !!  Compute full moments
     962              : !!
     963              : !! COPYRIGHT
     964              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
     965              : !!  This file is distributed under the terms of the
     966              : !!  GNU General Public License, see ~abinit/COPYING
     967              : !!  or http://www.gnu.org/copyleft/gpl.txt .
     968              : !!
     969              : !! INPUTS
     970              : !!  op=Greenb
     971              : !!  u1_iflavor1=\sum_{iflavor2} U_{iflavor2,iflavor1} N_iflavor2
     972              : !!    (useful for first moment)
     973              : !!  u2=\sum_{iflavor1,iflavor2,iflavor3} U_{iflavor1,iflavor2} N_iflavor2
     974              : !!
     975              : !! OUTPUT
     976              : !!
     977              : !! SIDE EFFECTS
     978              : !!
     979              : !! NOTES
     980              : !!
     981              : !! CHI
     982              : !!  Will be filled automatically by the parent script
     983              : !!
     984              : !! SOURCE
     985              : 
     986            0 : SUBROUTINE GreenHyboffdiag_setMoments(op,iflavor1,iflavor1b,u1,u2,u3)
     987              : 
     988              : !Arguments ------------------------------------
     989              :   TYPE(GreenHyboffdiag)  , INTENT(INOUT) :: op
     990              :   DOUBLE PRECISION, INTENT(IN   ) :: u1
     991              :   DOUBLE PRECISION, INTENT(IN   ) :: u2
     992              :   DOUBLE PRECISION, INTENT(IN   ) :: u3
     993              :   INTEGER         , INTENT(IN   ) :: iflavor1
     994              :   INTEGER         , INTENT(IN   ) :: iflavor1b
     995              : 
     996            0 :   if(iflavor1==iflavor1b) then
     997            0 :     op%Mk(iflavor1,iflavor1b,1) = -1.d0
     998              : !   c_a(3)=-d1-mu*mu-2(-mu)(\sum_{b.ne.a} Uab nb)
     999            0 :     op%Mk(iflavor1,iflavor1b,3) = op%Mk(iflavor1,iflavor1b,3) - 2.d0*(op%Mk(iflavor1,iflavor1b,2)*u1)
    1000              : 
    1001              : !   c_a(2)=-mu+\sum_{b.ne.a} Uab n_b
    1002            0 :     op%Mk(iflavor1,iflavor1b,2) = op%Mk(iflavor1,iflavor1b,2) + u1
    1003              :  !sui!write(6,*) "setmiments",iflavor1,iflavor1b,u1
    1004              : 
    1005              : !   c_a(3)=c_a(3) + \sum Uab^2 nb + \sum Uba Uca <nbnc>
    1006              : !   ie c_a(3)=-d1+mu*mu-2mu*\sumb Uab nb + \sum Uab^2 nb + \sum Uba Uca <nbnc>
    1007            0 :     op%Mk(iflavor1,iflavor1b,3) = op%Mk(iflavor1,iflavor1b,3) - u2
    1008              :   else
    1009            0 :     op%Mk(iflavor1,iflavor1b,1) = 0.d0
    1010            0 :     op%Mk(iflavor1,iflavor1b,2) = u3
    1011            0 :     op%Mk(iflavor1,iflavor1b,3) = 0.d0
    1012              :   endif
    1013              : !write(6,*) "mom",iflavor1,iflavor1b, op%Mk(iflavor1,iflavor1b,:)
    1014              : 
    1015            0 :   op%setMk = op%setMk + 1
    1016              : 
    1017            0 : END SUBROUTINE GreenHyboffdiag_setMoments
    1018              : !!***
    1019              : 
    1020              : !!****f* ABINIT/m_GreenHyboffdiag/GreenHyboffdiag_backFourier
    1021              : !! NAME
    1022              : !!  GreenHyboffdiag_backFourier
    1023              : !!
    1024              : !! FUNCTION
    1025              : !!  perform back fourier transform
    1026              : !!
    1027              : !! COPYRIGHT
    1028              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
    1029              : !!  This file is distributed under the terms of the
    1030              : !!  GNU General Public License, see ~abinit/COPYING
    1031              : !!  or http://www.gnu.org/copyleft/gpl.txt .
    1032              : !!
    1033              : !! INPUTS
    1034              : !!  op=Green
    1035              : !!  dvgc=divergence parameter
    1036              : !!
    1037              : !! OUTPUT
    1038              : !!
    1039              : !! SIDE EFFECTS
    1040              : !!
    1041              : !! NOTES
    1042              : !!
    1043              : !! SOURCE
    1044              : 
    1045            0 : SUBROUTINE GreenHyboffdiag_backFourier(op,dvgc,func,hybri_limit,opt_hybri_limit)
    1046              : 
    1047              :  use m_fstrings,       only : int2char4
    1048              : 
    1049              : #ifdef HAVE_MPI1
    1050              : include 'mpif.h'
    1051              : #endif
    1052              : !Arguments ------------------------------------
    1053              :   TYPE(GreenHyboffdiag)            , INTENT(INOUT) :: op
    1054              :   DOUBLE PRECISION, OPTIONAL, INTENT(IN   ) :: dvgc
    1055              :   CHARACTER(len=5)  ,OPTIONAL, INTENT(IN) :: func
    1056              :   COMPLEX(KIND=8), DIMENSION(op%nflavors,op%nflavors), OPTIONAL, INTENT(IN) :: hybri_limit
    1057              :   INTEGER, OPTIONAL, INTENT(IN) :: opt_hybri_limit
    1058              : !Local variables ------------------------------
    1059              :   INTEGER :: itau
    1060              :   INTEGER :: iomega
    1061              :   INTEGER :: omegaSamples
    1062              :   INTEGER :: tauSamples
    1063              :   INTEGER :: tauBegin
    1064              :   INTEGER :: tauEnd
    1065              :   INTEGER :: delta
    1066              :   INTEGER :: residu
    1067              :   INTEGER :: iflavor1
    1068              :   INTEGER :: iflavor2,unitnb !,unitnb1
    1069            0 :   INTEGER, ALLOCATABLE, DIMENSION(:) :: counts
    1070            0 :   INTEGER, ALLOCATABLE, DIMENSION(:) :: displs
    1071              :   DOUBLE PRECISION :: A,AA ! Correction factor
    1072              :   COMPLEX(KIND=8) :: B,BB ! Correction factor
    1073              :   COMPLEX(KIND=8) :: C !,CC ! Correction factor
    1074              :   DOUBLE PRECISION :: inv_beta
    1075              :   DOUBLE PRECISION :: pi_invBeta
    1076              :   DOUBLE PRECISION :: two_invBeta
    1077              :   DOUBLE PRECISION :: minusDt
    1078              :   DOUBLE PRECISION :: minusOmegaTau
    1079              :   DOUBLE PRECISION :: omegaa
    1080              :   DOUBLE PRECISION :: minusTau
    1081              :   DOUBLE PRECISION :: sumTerm
    1082              :   DOUBLE PRECISION :: pi
    1083              :   DOUBLE PRECISION :: twoPi
    1084              :   DOUBLE PRECISION :: correction
    1085            0 :   DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: Domega
    1086            0 :   DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: A_omega
    1087            0 :   COMPLEX(KIND=8) , ALLOCATABLE, DIMENSION(:) :: C_omega
    1088            0 :   DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: opertau
    1089              :   CHARACTER(len=5) :: funct
    1090              :   character(len=4) :: tag_proc
    1091              :   character(len=30) :: tmpfil
    1092              : 
    1093              : #if defined HAVE_MPI && !defined HAVE_MPI2_INPLACE
    1094              :   INTEGER :: my_count
    1095              :   DOUBLE PRECISION, ALLOCATABLE , DIMENSION(:) :: opertau_buf
    1096              : #endif
    1097              : 
    1098            0 :   IF ( op%set .EQV. .FALSE. ) &
    1099            0 :     CALL ERROR("GreenHyboffdiag_backFourier : Uninitialized GreenHyboffdiag structure")
    1100            0 :   IF ( op%setW .EQV. .FALSE. ) &
    1101            0 :     CALL ERROR("GreenHyboffdiag_backFourier : no G(iw)")
    1102              : 
    1103            0 :   funct="hybri"
    1104            0 :   if(present(func)) funct=func
    1105              : !sui!write(6,*) funct
    1106            0 :   inv_beta     = op%inv_beta
    1107            0 :   two_invBeta  = 2.d0 * inv_beta
    1108            0 :   minusDt      = - op%delta_t
    1109            0 :   omegaSamples = op%Wmax
    1110            0 :   tauSamples   = op%samples-1
    1111            0 :   pi         = ACOS(-1.d0)
    1112            0 :   twoPi        = 2.d0 * pi
    1113            0 :   pi_invBeta = pi * inv_beta
    1114              : !sui!write(6,*) "omegaSamples",omegaSamples
    1115            0 :   MALLOC(Domega,(1:omegaSamples))
    1116            0 :   MALLOC(A_omega,(1:omegaSamples))
    1117            0 :   MALLOC(C_omega,(1:omegaSamples))
    1118              :   IF ( op%rank .EQ. 0 ) THEN
    1119              :     !DO iflavor1 = 1, op%nflavors
    1120              :     !  DO iflavor2 = 1, op%nflavors
    1121              :     !    write(22236,*) "#",iflavor1,iflavor2
    1122              :     !    do  iomega=1,op%Wmax
    1123              :     !      write(22236,*)  (2.d0*DBLE(iomega)-1.d0) * pi_invBeta,real(op%oper_w(iomega,iflavor1,iflavor2))
    1124              :     !    enddo
    1125              :     !    write(22236,*)
    1126              :     !  ENDDO
    1127              :     !ENDDO
    1128              :   ENDIF
    1129              : 
    1130            0 :   op%oper = 0.d0
    1131              : 
    1132            0 :   DO iflavor1 = 1, op%nflavors
    1133            0 :     DO iflavor2 = 1, op%nflavors
    1134              :   ! --  compute limit of function G*(i\omega_n)
    1135            0 :       if(funct=="hybri") then
    1136            0 :         IF ( PRESENT(dvgc) ) THEN
    1137            0 :           A = dvgc
    1138              :         ELSE
    1139              :           A = AIMAG(op%oper_w(omegaSamples,iflavor1,iflavor2))&! A = \lim_\infty Imag(G(iwn))*(wn)
    1140            0 :             *(2.d0*DBLE(omegaSamples)-1.d0) * pi_invBeta
    1141              :           AA = AIMAG(op%oper_w(omegaSamples-10,iflavor1,iflavor2))&! A = \lim_\infty Imag(G(iwn))*(wn)
    1142            0 :             *(2.d0*DBLE(omegaSamples-10)-1.d0) * pi_invBeta
    1143              :           B = op%oper_w(omegaSamples,iflavor1,iflavor2)&! A = \lim_\infty (G(iwn))*(iwn)
    1144            0 :             *(2.d0*DBLE(omegaSamples)-1.d0) *pi_invBeta*cmplx(0.d0,1.d0,kind=8)
    1145              :           BB = op%oper_w(omegaSamples-10,iflavor1,iflavor2)&! A = \lim_\infty (G(iwn))*(iwn)
    1146            0 :             *(2.d0*DBLE(omegaSamples-10)-1.d0) *pi_invBeta*cmplx(0.d0,1.d0,kind=8)
    1147              :         !sui!write(6,*) "B=",iflavor1,iflavor2,B,BB
    1148              :         END IF
    1149            0 :       else if(iflavor1==iflavor2.and.funct=="green") then
    1150              :         A = -1.d0
    1151            0 :       else if(iflavor1/=iflavor2.and.funct=="green") then
    1152            0 :         A = 0.d0
    1153              :       endif
    1154              :     !sui!write(6,*) "A=",iflavor1,iflavor2,A,AA
    1155            0 :       C=cmplx(-A,0.d0,kind=8)
    1156            0 :       if(present(hybri_limit)) then
    1157            0 :         if(present(opt_hybri_limit)) then
    1158            0 :           if(opt_hybri_limit==1) C= (hybri_limit(iflavor1,iflavor2))
    1159              :         !sui!write(6,*) "C=                         ",C
    1160              :         endif
    1161              :       endif
    1162              : 
    1163              : 
    1164              : 
    1165              :   ! --  correction on G(tau=0) is thus
    1166            0 :       correction = -C*0.5d0
    1167              : 
    1168              :   ! --  built frequency mesh
    1169            0 :       Domega = (/ ((2.d0 * DBLE(iomega) - 1.d0)*pi_invbeta, iomega=1, omegaSamples) /)
    1170              : 
    1171              :   ! --  built asymptotic function
    1172              :       !if(present(hybri_limit)) then
    1173            0 :       C_omega = C / (Domega*cmplx(0.d0,1.d0,kind=8))
    1174              :       !else
    1175              :       !  A_omega = A / Domega
    1176              :       !  C_omega=cmplx(0.d0,A_omega,kind=8)
    1177              :       !endif
    1178              :       !write(6,*) "AC 1",A_omega(2),C_omega(2)
    1179              : 
    1180              :       IF ( op%rank .EQ. 0 ) THEN
    1181              :        ! write(236,*) "#",iflavor1,iflavor2
    1182              :        ! write(237,*) "#",iflavor1,iflavor2
    1183              :        ! write(2236,*) "#",iflavor1,iflavor2
    1184              :        ! write(2237,*) "#",iflavor1,iflavor2
    1185              :        ! write(238,*) "#",iflavor1,iflavor2
    1186              :        ! do  iomega=1,op%Wmax
    1187              :        !   write(2236,*)  (2.d0*DBLE(iomega)-1.d0) * pi_invBeta,real(op%oper_w(iomega,iflavor1,iflavor2))
    1188              :        !   write(2237,*)  (2.d0*DBLE(iomega)-1.d0) * pi_invBeta,imag(op%oper_w(iomega,iflavor1,iflavor2))
    1189              :        !   write(236,*)  (2.d0*DBLE(iomega)-1.d0) * pi_invBeta,real(op%oper_w(iomega,iflavor1,iflavor2)-C_omega(iomega))
    1190              :        !   write(237,*)  (2.d0*DBLE(iomega)-1.d0) * pi_invBeta,imag(op%oper_w(iomega,iflavor1,iflavor2)-C_omega(iomega))
    1191              :        !   write(238,*)  (2.d0*DBLE(iomega)-1.d0) * pi_invBeta,C_omega(iomega)
    1192              :        ! enddo
    1193              :        ! write(236,*)
    1194              :        ! write(237,*)
    1195              :        ! write(2236,*)
    1196              :        ! write(2237,*)
    1197              :        ! write(238,*)
    1198              :       ENDIF
    1199              :       IF ( op%rank .EQ. 1 ) THEN
    1200              :        ! write(22360,*) "#",iflavor1,iflavor2
    1201              :        ! do  iomega=1,op%Wmax
    1202              :        !   write(22360,*)  (2.d0*DBLE(iomega)-1.d0) * pi_invBeta,real(op%oper_w(iomega,iflavor1,iflavor2))
    1203              :        ! enddo
    1204              :        ! write(22360,*)
    1205              :       ENDIF
    1206              :       !open (unit=unitnb,file=trim(tmpfil),status='unknown',form='formatted')
    1207              :       !write(unitnb,*) "#",iflavor1,iflavor2
    1208              :       !do  iomega=1,op%Wmax
    1209              :       !  write(unitnb,*)  (2.d0*DBLE(iomega)-1.d0) * pi_invBeta,real(op%oper_w(iomega,iflavor1,iflavor2))
    1210              :       !enddo
    1211              :       !write(unitnb,*)
    1212              :   ! --  built time mesh
    1213            0 :       IF (op%have_MPI .EQV. .TRUE.) THEN
    1214            0 :         delta = tauSamples / op%size
    1215            0 :         residu = tauSamples - op%size*delta
    1216            0 :         IF ( op%rank .LT. op%size - residu ) THEN
    1217            0 :           tauBegin = 1 + op%rank*delta
    1218            0 :           tauEnd   = (op%rank + 1)*delta
    1219              :         ELSE
    1220              : !          tauBegin = (op%size-residu)*delta + 1 + (op%rank-op%size+residu)*(delta+1)
    1221            0 :           tauBegin = 1 + op%rank*(delta + 1) -op%size + residu
    1222            0 :           tauEnd = tauBegin + delta
    1223              :         END IF
    1224            0 :         MALLOC(counts,(1:op%size))
    1225            0 :         MALLOC(displs,(1:op%size))
    1226              :         counts = (/ (delta, iTau=1, op%size-residu), &
    1227            0 :                     (delta+1, iTau=op%size-residu+1, op%size) /)
    1228            0 :         displs(1)=0
    1229            0 :         DO iTau = 2, op%size
    1230            0 :           displs(iTau) = displs(iTau-1) + counts (iTau-1)
    1231              :         END DO
    1232              :       ELSE
    1233              :         tauBegin = 1
    1234              :         tauEnd   = tauSamples
    1235              :       END IF
    1236            0 :       MALLOC(opertau,(1:tauSamples+1))
    1237            0 :       do iomega=1,omegaSamples
    1238              :        ! write(6,*) iomega, imag(op%oper_w(iomega,iflavor1,iflavor2)), A_omega(iomega) ,"#diff"
    1239              :       enddo
    1240            0 :       unitnb=70000+op%rank
    1241            0 :       call int2char4(op%rank,tag_proc)
    1242            0 :       tmpfil = 'counts'//tag_proc
    1243              :      ! open (unit=unitnb,file=trim(tmpfil),status='unknown',form='formatted')
    1244              :      ! write(unitnb,*) "#",iflavor1,iflavor2
    1245              :      ! do  itau=1,op%size
    1246              :      ! write(unitnb,*)  itau,counts(itau),displs(itau)
    1247              :      ! enddo
    1248              :      ! write(unitnb,*)
    1249              : 
    1250            0 :       unitnb=10000+op%rank
    1251            0 :       call int2char4(op%rank,tag_proc)
    1252            0 :       tmpfil = 'oper_w'//tag_proc
    1253              :      ! open (unit=unitnb,file=trim(tmpfil),status='unknown',form='formatted')
    1254              :      ! write(unitnb,*) "#",iflavor1,iflavor2,C
    1255              :      ! ! C_omega et oper_w differents Domega identique. Est ce du a des
    1256              :      !! ! diago differentes   pour chaque procs dans qmc_prep_ctqmc
    1257              :      !! do  iomega=1,op%Wmax
    1258              :      !! write(unitnb,*)  (2.d0*DBLE(iomega)-1.d0) * pi_invBeta,real(op%oper_w(iomega,iflavor1,iflavor2)),C_omega(iomega),Domega(iomega)
    1259              :      ! enddo
    1260              :      ! write(unitnb,*)
    1261              : 
    1262              :      ! unitnb=40000+op%rank
    1263              :      ! unitnb1=50000+op%rank
    1264              :      ! call int2char4(op%rank,tag_proc)
    1265              :      ! tmpfil = 'tauend'//tag_proc
    1266              :      ! open (unit=unitnb,file=trim(tmpfil),status='unknown',form='formatted')
    1267              :      ! tmpfil = 'taubegin'//tag_proc
    1268              :      ! open (unit=unitnb1,file=trim(tmpfil),status='unknown',form='formatted')
    1269              :      ! write(unitnb,*) "#",iflavor1,iflavor2
    1270              :      ! write(unitnb1,*) "#",iflavor1,iflavor2
    1271              : 
    1272              :   ! -- compute Fourier transformation
    1273            0 :       opertau=0.d0
    1274            0 :       DO itau = tauBegin, tauEnd
    1275              :       !DO itau = max(tauBegin-1,1), tauEnd
    1276            0 :         minusTau = DBLE(itau -1) * minusDt
    1277            0 :         DO iomega = 1, omegaSamples
    1278            0 :           omegaa         = Domega(iomega)
    1279            0 :           minusOmegaTau = MOD(omegaa*minusTau, TwoPi)
    1280              :           sumTerm       = REAL(( op%oper_w(iomega,iflavor1,iflavor2) &
    1281              :                           -  C_omega(iomega) ) &
    1282              :                           !- CMPLX(0.d0, A_omega(iomega),8) ) &
    1283            0 :                           * EXP( CMPLX(0.d0, minusOmegaTau, 8)))
    1284            0 :           opertau(itau)  = opertau(itau) + sumTerm
    1285              : !         Domega et minusomegatau identique MAIS oper_w different
    1286              :             !write(unitnb,*) iomega,Domega(iomega),real(C_omega(iomega)),imag(C_omega(iomega))
    1287              :           !if(itau==tauend) then
    1288              :           !  write(unitnb,*) iomega, sumTerm,opertau(itau),minusOmegaTau,op%oper_w(iomega,iflavor1,iflavor2),Domega(iomega)
    1289              :           !endif
    1290              :           !if(itau==max(tauBegin-1,1)) then
    1291              :           !  write(unitnb1,*) iomega, sumTerm,opertau(itau),minusOmegaTau,op%oper_w(iomega,iflavor1,iflavor2),Domega(iomega)
    1292              :           !endif
    1293              : 
    1294              :         END DO
    1295              :          ! if(itau==tauEnd) write(unitnb,*)
    1296              :          ! if(itau==max(tauBegin-1,1)) write(unitnb1,*)
    1297              : !        if(iflavor1==iflavor2) then
    1298            0 :           opertau(itau) = correction + two_invBeta*opertau(itau)
    1299              :          ! if(itau==tauend) then
    1300              :          !   write(unitnb,*) "final", opertau(itau),correction
    1301              :          ! endif
    1302              :          ! if(itau==max(tauBegin-1,1)) then
    1303              :          !   write(unitnb1,*) "final",opertau(itau),correction
    1304              :          ! endif
    1305              :              !write(66666,*) itau, opertau(itau),correction
    1306              : !        else
    1307              : !          opertau(itau) =              &
    1308              : !             two_invBeta*opertau(itau)
    1309              : !        endif
    1310              :       END DO
    1311              :       !unitnb=20000+op%rank
    1312              :       !call int2char4(op%rank,tag_proc)
    1313              :       !tmpfil = 'opertau'//tag_proc
    1314              :       !open (unit=unitnb,file=trim(tmpfil),status='unknown',form='formatted')
    1315              :       !write(unitnb,*) "#",iflavor1,iflavor2,tauBegin,tauEnd
    1316              :       !!do  itau=tauBegin, tauEnd
    1317              :       !do  itau=1,tauSamples
    1318              :       !  write(unitnb,*)    itau,opertau(itau)
    1319              :       !enddo
    1320              :       !write(unitnb,*)
    1321              :       !opertau(tauBegin-1)=0.d0
    1322              :       !opertau(tauEnd+1)=0.d0
    1323              :              !write(66666,*)
    1324              : 
    1325              :   ! -- Gather
    1326            0 :       IF ( op%have_MPI .EQV. .TRUE. ) THEN
    1327              : ! rassembler les resultats
    1328              : #ifdef HAVE_MPI
    1329              : #if defined HAVE_MPI2_INPLACE
    1330              :         CALL MPI_ALLGATHERV(MPI_IN_PLACE, 0, MPI_DOUBLE_PRECISION, &
    1331              :                           opertau, counts, displs, &
    1332            0 :                           MPI_DOUBLE_PRECISION, op%MY_COMM, residu)
    1333              : #else
    1334              :     my_count=tauBegin-tauEnd+1
    1335              :     MALLOC(opertau_buf,(my_count))
    1336              :     opertau_buf(1:my_count)=opertau(tauBegin:tauEnd)
    1337              :     CALL MPI_ALLGATHERV(opertau_buf, my_count, MPI_DOUBLE_PRECISION, &
    1338              :                       opertau, counts, displs, &
    1339              :                       MPI_DOUBLE_PRECISION, op%MY_COMM, residu)
    1340              :     FREE(opertau_buf)
    1341              : #endif
    1342              : #endif
    1343            0 :         FREE(counts)
    1344            0 :         FREE(displs)
    1345              :       END IF
    1346              :      ! unitnb=30000+op%rank
    1347              :      ! call int2char4(op%rank,tag_proc)
    1348              :      ! tmpfil = 'opertau_MPI_'//tag_proc
    1349              :      ! open (unit=unitnb,file=trim(tmpfil),status='unknown',form='formatted')
    1350              :      ! write(unitnb,*) "#",iflavor1,iflavor2
    1351              :      ! do  itau=tauBegin, tauEnd
    1352              :      !   write(unitnb,*)    itau,opertau(itau)
    1353              :      ! enddo
    1354              :      ! write(unitnb,*)
    1355              : 
    1356              :   ! -- Add correction for discontinuity.
    1357              : !      if(iflavor1==iflavor2) then
    1358              :         !G(0+)-G(0-)=G(0+)+G(beta-)=A
    1359            0 :         opertau(tauSamples+1) = -real(C) - opertau(1)
    1360              :       !sui!write(6,*) "BackFourier",opertau(tauSamples+1),opertau(1),real(C)
    1361              : 
    1362            0 :         op%setT = .TRUE.
    1363              : !      endif
    1364            0 :       op%oper(:,iflavor1,iflavor2)=opertau(:)
    1365            0 :       FREE(opertau)
    1366              :     END DO ! iflavor2
    1367              :   END DO ! iflavor1
    1368              :   ! -- End loop over flavors.
    1369              : 
    1370            0 :   FREE(Domega)
    1371            0 :   FREE(A_omega)
    1372            0 :   FREE(C_omega)
    1373            0 :   close(236)
    1374            0 :   close(237)
    1375              : 
    1376            0 : END SUBROUTINE GreenHyboffdiag_backFourier
    1377              : !!***
    1378              : 
    1379              : !!****f* ABINIT/m_GreenHyboffdiag/GreenHyboffdiag_forFourier
    1380              : !! NAME
    1381              : !!  GreenHyboffdiag_forFourier
    1382              : !!
    1383              : !! FUNCTION
    1384              : !!  perform forward fourier transform
    1385              : !!
    1386              : !! COPYRIGHT
    1387              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
    1388              : !!  This file is distributed under the terms of the
    1389              : !!  GNU General Public License, see ~abinit/COPYING
    1390              : !!  or http://www.gnu.org/copyleft/gpl.txt .
    1391              : !!
    1392              : !! INPUTS
    1393              : !!  op=Green
    1394              : !!  Wmax=linear maximum frequency
    1395              : !!
    1396              : !! OUTPUT
    1397              : !!  Gomega=Results for omega frequencies
    1398              : !!  omega=ask frequencies
    1399              : !!
    1400              : !! SIDE EFFECTS
    1401              : !!
    1402              : !! NOTES
    1403              : !!
    1404              : !! SOURCE
    1405              : 
    1406            0 : SUBROUTINE GreenHyboffdiag_forFourier(op, Gomega, omega, Wmax)
    1407              : !Arguments ------------------------------------
    1408              : 
    1409              : #ifdef HAVE_MPI1
    1410              : include 'mpif.h'
    1411              : #endif
    1412              :   TYPE(GreenHyboffdiag)             , INTENT(INOUT) :: op
    1413              :   COMPLEX(KIND=8), DIMENSION(:,:,:), OPTIONAL, INTENT(INOUT) :: Gomega  ! INOUT for MPI
    1414              :   COMPLEX(KIND=8), DIMENSION(:), OPTIONAL, INTENT(IN   ) :: omega
    1415              :   INTEGER                 , OPTIONAL, INTENT(IN   ) :: Wmax
    1416              :   INTEGER :: i
    1417              :   INTEGER :: j
    1418              :   INTEGER :: iflavor1
    1419              :   INTEGER :: iflavor2
    1420              :   INTEGER :: nflavors
    1421              :   INTEGER :: L
    1422              :   INTEGER :: Lspline
    1423              :   INTEGER :: Nom
    1424              :   INTEGER :: omegaBegin
    1425              :   INTEGER :: omegaEnd
    1426              :   INTEGER :: deltaw
    1427              :   INTEGER :: residu
    1428            0 :   INTEGER, ALLOCATABLE, DIMENSION(:) :: counts
    1429            0 :   INTEGER, ALLOCATABLE, DIMENSION(:) :: displs
    1430              :   DOUBLE PRECISION :: beta
    1431              :   DOUBLE PRECISION :: tau
    1432              :   DOUBLE PRECISION :: delta
    1433              :   DOUBLE PRECISION :: deltabis
    1434              :   DOUBLE PRECISION :: inv_delta
    1435              :   DOUBLE PRECISION :: inv_delta2
    1436              :   DOUBLE PRECISION :: omdeltabis
    1437              :   DOUBLE PRECISION :: tmp
    1438              :   DOUBLE PRECISION :: xpi
    1439            0 :   DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  diag
    1440            0 :   DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  diagL
    1441            0 :   DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  lastR
    1442            0 :   DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  lastC
    1443            0 :   DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  XM
    1444            0 :   DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  X2
    1445              :   DOUBLE PRECISION :: iw
    1446              :   COMPLEX(KIND=8) :: iwtau
    1447            0 :   COMPLEX(KIND=8), ALLOCATABLE, DIMENSION(:) :: Gwtmp
    1448            0 :   DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: omegatmp
    1449              : #if defined HAVE_MPI && !defined HAVE_MPI2_INPLACE
    1450              :   INTEGER :: my_count
    1451              :   COMPLEX(KIND=8), ALLOCATABLE , DIMENSION(:) :: Gwtmp_buf
    1452              : #endif
    1453              : 
    1454            0 :   nflavors=op%nflavors
    1455              : 
    1456              : !sui!write(6,*) " Fourier transformation begin"
    1457              : 
    1458            0 :   IF ( op%set .EQV. .FALSE. ) &
    1459            0 :     CALL ERROR("GreenHyboffdiag_forFourier : Uninitialized GreenHyboffdiag structure")
    1460            0 :   IF ( op%setT .EQV. .FALSE. ) &
    1461            0 :     CALL ERROR("GreenHyboffdiag_forFourier : no G(tau)")
    1462              :   !write(6,*) "op%setMk=", op%setMk
    1463            0 :   IF ( op%setMk .NE. 2*nflavors*nflavors ) &
    1464            0 :     CALL WARNALL("GreenHyboffdiag_forFourier : green does not have moments    ")
    1465              : 
    1466            0 :   L  = op%samples
    1467              : 
    1468            0 :   xpi=acos(-1.d0)                !!! XPI=PI
    1469            0 :   beta = op%beta
    1470            0 :   Nom  = op%Wmax
    1471            0 :   IF ( PRESENT(Gomega) ) THEN
    1472            0 :     Nom = SIZE(Gomega,1)
    1473              :     !IF ( op%rank .EQ. 0 ) &
    1474              :       !!write(6,*) "size Gomega", Nom
    1475              :   END IF
    1476            0 :   IF ( PRESENT(omega) ) THEN
    1477            0 :     IF ( PRESENT(Gomega) .AND. SIZE(omega) .NE. Nom ) THEN
    1478            0 :       CALL ERROR("GreenHyboffdiag_forFourier : sizes mismatch              ")
    1479              :     !ELSE
    1480              :       !Nom = SIZE(omega)
    1481              :     END IF
    1482              :   END IF
    1483            0 :   IF ( .NOT. PRESENT(Gomega) .AND. .NOT. PRESENT(omega) ) THEN
    1484            0 :     IF ( PRESENT(Wmax) ) THEN
    1485            0 :       Nom=Wmax
    1486              :     ELSE
    1487            0 :       CALL ERROR("GreenHyboffdiag_forFourier : Missing argument Wmax")
    1488              :     END IF
    1489              :   END IF
    1490              : 
    1491              :   !!IF ( ALLOCATED(op%oper_w) ) THEN
    1492              :   !!  IF ( SIZE(op%oper_w,1) .NE. Nom ) THEN
    1493              :   !!    FREE(op%oper_w)
    1494              :   !!    MALLOC(op%oper_w,(1:Nom,nflavors,nflavors))
    1495              :   !!  END IF
    1496              :   !!ELSE
    1497              :   !!  MALLOC(op%oper_w,(1:Nom,nflavors,nflavors))
    1498              :   !!END IF
    1499              : 
    1500              :   !!write(6,*) "PRESENT(GOMEGA)", PRESENT(GOMEGA)
    1501              :   !!write(6,*) "PRESENT(OMEGA)", PRESENT(OMEGA)
    1502              :   !call flush(6)
    1503              : 
    1504            0 :   delta=op%delta_t
    1505            0 :   inv_delta = op%inv_dt
    1506            0 :   inv_delta2 = inv_delta*inv_delta
    1507              : 
    1508            0 :   MALLOC(diagL,(L-1))
    1509            0 :   MALLOC(lastR,(L-1))
    1510            0 :   MALLOC(diag,(L))
    1511            0 :   MALLOC(lastC,(L-1))
    1512              : 
    1513              : !(cf Stoer) for the spline interpolation :
    1514              : ! second derivatives XM solution of A*XM=B.
    1515              : !A=(2.4.2.11) of Stoer&Bulirsch + 2 limit conditions
    1516              : !The LU decomposition of A is known explicitly;
    1517              : 
    1518            0 :   diag (1) = 4.d0 ! 1.d0 *4.d0 factor 4 added for conditionning
    1519            0 :   diagL(1) = 0.25d0 !1.d0/4.d0
    1520            0 :   lastR(1) = -0.5d0 ! -2.d0/4.d0
    1521            0 :   lastC(1) = 4.d0 ! 1.d0*4.d0
    1522            0 :   diag (2) = 4.d0
    1523            0 :   diagL(2) = 0.25d0
    1524            0 :   lastR(2) = -0.25d0
    1525            0 :   lastC(2) = -1.d0
    1526              : 
    1527            0 :   DO i = 3, L-2
    1528            0 :     tmp = 4.d0 - diagL(i-1)
    1529            0 :     diagL(i) = 1.d0 / tmp
    1530              :   END DO
    1531            0 :   DO i = 3, L-2
    1532            0 :     diag (i) = 1.d0 / diagL(i)
    1533            0 :     lastR(i) = -(lastR(i-1)*diagL(i))
    1534            0 :     lastC(i) = -(lastC(i-1)*diagL(i-1))
    1535              :   END DO
    1536              : 
    1537            0 :   tmp = 1.d0/diag(L-2)
    1538            0 :   diag (L-1) = 4.d0 - tmp
    1539            0 :   lastR(L-1) = (1.d0 - lastR(L-2))/ diag(L-1)
    1540              :   !diagL(L-1) = lastR(L-1)
    1541            0 :   diagL(L-1) = 0.d0 ! for the Lq=B resolution
    1542              :   !lastC(L-1) = 1.d0 - lastC(L-2)*diagL(L-1) ! equivalent to the next line
    1543            0 :   lastC(L-1) = 1.d0 - (lastC(L-2)*lastR(L-1)) ! True value
    1544            0 :   diag (L  ) = 2.d0! - DOT_PRODUCT( lastR , lastC )
    1545            0 :   tmp = 0.d0
    1546            0 :   DO i = 1, L-1
    1547            0 :     tmp = tmp + lastR(i)*lastC(i)
    1548              :   END DO
    1549            0 :   diag (L  ) = diag (L  ) - tmp
    1550            0 :   lastC(L-1) = lastC(L-1)-1.d0 ! 1 is removed for the u.XM=q resolution
    1551              : 
    1552            0 :   MALLOC(XM,(L))
    1553            0 :   MALLOC(Gwtmp,(1:Nom))
    1554              : 
    1555            0 :   Lspline = L-1
    1556            0 :   MALLOC(X2,(1:Lspline+1)) ! We impose L = Nom
    1557              : 
    1558            0 :   IF ( op%have_MPI .EQV. .TRUE. ) THEN
    1559            0 :     deltaw = Nom / op%size
    1560            0 :     residu = Nom - op%size*deltaw
    1561            0 :     IF ( op%rank .LT. op%size - residu ) THEN
    1562            0 :       omegaBegin = 1 + op%rank*deltaw
    1563            0 :       omegaEnd   = (op%rank + 1)*deltaw
    1564              :     ELSE
    1565              :   !    tauBegin = (op%size-residu)*deltaw + 1 + (op%rank-op%size+residu)*(deltaw+1)
    1566            0 :       omegaBegin = 1 + op%rank*(deltaw + 1) -op%size + residu
    1567            0 :       omegaEnd = omegaBegin + deltaw
    1568              :     END IF
    1569            0 :     MALLOC(counts,(1:op%size))
    1570            0 :     MALLOC(displs,(1:op%size))
    1571              :     counts = (/ (deltaw, i=1, op%size-residu), &
    1572            0 :                 (deltaw+1, i=op%size-residu+1, op%size) /)
    1573            0 :     displs(1)=0
    1574            0 :     DO i = 2, op%size
    1575            0 :       displs(i) = displs(i-1) + counts (i-1)
    1576              :     END DO
    1577              :   ELSE
    1578              :     omegaBegin = 1
    1579              :     omegaEnd   = Nom
    1580              :   END IF
    1581              : 
    1582              : !  op%Mk(iflavor1,iflavor2,1) = 0.d0
    1583              : !  DO iflavor1 = 1, nflavors
    1584              : !    op%Mk(iflavor1,iflavor1,1) = -1.d0
    1585              : !  ENDDO
    1586              : !  op%Mk(:,:,3) = 0.d0
    1587              : 
    1588            0 :   MALLOC(omegatmp,(omegaBegin:omegaEnd))
    1589            0 :   IF ( PRESENT(omega) ) THEN
    1590            0 :     omegatmp(omegaBegin:omegaEnd) = (/ (AIMAG(omega(i)),i=omegaBegin,omegaEnd) /)
    1591              :   ELSE
    1592            0 :     omegatmp(omegaBegin:omegaEnd) = (/ ((((2.d0*DBLE(i)-1.d0)*xpi)/Beta), i=omegaBegin,omegaEnd) /)
    1593              :   END IF
    1594              : 
    1595            0 :   DO iflavor1 = 1, nflavors
    1596            0 :     DO iflavor2 = 1, nflavors
    1597              :    ! write(6,*) "   Moments:",op%Mk(iflavor1,iflavor2,:),iflavor1,iflavor2
    1598              : 
    1599              : ! construct the B vector from A.Xm=B
    1600            0 :       XM(1) = 4.d0*op%Mk(iflavor1,iflavor2,3)
    1601              :       XM(L) = (6.d0 * inv_delta) * ( op%Mk(iflavor1,iflavor2,2) - ( &
    1602              :         (op%oper(2,iflavor1,iflavor2)-op%oper(1,iflavor1,iflavor2)) + &
    1603            0 :         (op%oper(L,iflavor1,iflavor2)-op%oper(L-1,iflavor1,iflavor2)) ) * inv_delta )
    1604              : !    built generic second derivative of oper
    1605              : !sui!write(6,*)  "XM 1 L",XM(1),XM(L),op%Mk(iflavor1,iflavor2,2),op%Mk(iflavor1,iflavor2,3)
    1606            0 :       DO i = 2, L-1
    1607              :         XM(i) = (6.d0 * inv_delta2) * ( (op%oper(i+1,iflavor1,iflavor2) &
    1608              :           - 2.d0 * op%oper(i,iflavor1,iflavor2)) &
    1609            0 :           +        op%oper(i-1,iflavor1,iflavor2) )
    1610              :     !sui!write(6,*) "XM",i,XM(i),op%oper(i,iflavor1,iflavor2)
    1611              :       END DO
    1612              : 
    1613              : ! Find second derivatives XM: Solve the system
    1614              : ! SOLVING Lq= XM
    1615              : !  q = XM
    1616            0 :       do j=1,L-1
    1617            0 :           XM(j+1)=XM(j+1)-(diagL(j)*XM(j))
    1618            0 :           XM(L)  =XM(L)  -(lastR(j)*XM(j))
    1619              :       end do
    1620              : 
    1621              : 
    1622              : ! SOLVING U.XM=q
    1623              : !  XM = q
    1624            0 :       do j=L-1,2,-1
    1625            0 :        XM(j+1)  = XM(j+1) / diag(j+1)
    1626            0 :        XM(j)= (XM(j)-(XM(L)*lastC(j)))-XM(j+1)
    1627              :       end do
    1628            0 :       XM(2)  = XM(2) / diag(2)
    1629            0 :       XM(1) = (XM(1)-XM(L)*lastC(1)) / diag(1)
    1630              : 
    1631              : 
    1632              : 
    1633              :       !Construct L2 second derivative from known derivatives XM
    1634            0 :       deltabis = beta / DBLE(Lspline)
    1635            0 :       DO i = 1, Lspline
    1636            0 :         tau = deltabis * DBLE(i-1)
    1637            0 :         j = ((L-1)*(i-1))/Lspline + 1!INT(tau * inv_delta) + 1
    1638            0 :         X2(i) = inv_delta * ( XM(j)*(DBLE(j)*delta - tau ) + XM(j+1)*(tau - DBLE(j-1)*delta) )
    1639              :       END DO
    1640            0 :       X2(Lspline+1) = XM(L)
    1641              : 
    1642              : 
    1643            0 :        DO i = omegaBegin, omegaEnd
    1644            0 :          iw = omegatmp(i)
    1645            0 :          omdeltabis = iw*deltabis
    1646            0 :          Gwtmp(i)=CMPLX(0.d0,0.d0,8)
    1647            0 :          DO j=2, Lspline ! We impose  L+1 = Nom
    1648            0 :            iwtau = CMPLX(0.d0,omdeltabis*DBLE(j-1),8)
    1649            0 :            Gwtmp(i) = Gwtmp(i) + EXP(iwtau) * CMPLX((X2(j+1) + X2(j-1))-2.d0*X2(j),0.d0,8)
    1650              :            !write(6,*) "ww",i,j,Gwtmp(i),X2(j),iwtau
    1651              :          END DO
    1652              :          Gwtmp(i) = Gwtmp(i)/CMPLX(((iw*iw)*(iw*iw)*deltabis),0.d0,8) &
    1653              :          + CMPLX( ( ((X2(2)-X2(1))+(X2(Lspline+1)-X2(Lspline)))/((iw*iw)*deltabis) -op%Mk(iflavor1,iflavor2,2) ) &
    1654            0 :          /(iw*iw) , (op%Mk(iflavor1,iflavor2,1)-op%Mk(iflavor1,iflavor2,3)/(iw*iw))/iw , 8)
    1655              :                    !+ CMPLX( (X2(2)-X2(1))+(X2(Lspline+1)-X2(Lspline)), 0.d0, 8 ) ) &
    1656              :                    !   / (((iw*iw)*(iw*iw))*CMPLX(deltabis,0.d0,8)) &
    1657              :                    !- CMPLX(op%Mk(1),0.d0,8)/iw  &
    1658              :                    !+ CMPLX(op%Mk(2),0.d0,8)/(iw*iw) &
    1659              :                    !- CMPLX(op%Mk(3),0.d0,8)/((iw*iw)*iw)
    1660              :          !IF ( op%rank .EQ. 0 )  write(12819,*) iw,gwtmp(i)
    1661              :        END DO
    1662              :        !call flush(12819)
    1663            0 :        IF ( op%have_MPI .EQV. .TRUE. ) THEN
    1664              : #ifdef HAVE_MPI
    1665              : #if defined HAVE_MPI2_INPLACE
    1666              :         CALL MPI_ALLGATHERV(MPI_IN_PLACE, 0, MPI_DOUBLE_COMPLEX, &
    1667              :                           Gwtmp  , counts, displs, &
    1668            0 :                           MPI_DOUBLE_COMPLEX, op%MY_COMM, residu)
    1669              : #else
    1670              :         my_count=omegaBegin-omegaEnd+1
    1671              :         MALLOC(Gwtmp_buf,(my_count))
    1672              :         Gwtmp_buf(1:my_count)=Gwtmp(omegaBegin:omegaEnd)
    1673              :         CALL MPI_ALLGATHERV(Gwtmp_buf, my_count, MPI_DOUBLE_COMPLEX, &
    1674              :                           Gwtmp  , counts, displs, &
    1675              :                           MPI_DOUBLE_COMPLEX, op%MY_COMM, residu)
    1676              :         FREE(Gwtmp_buf)
    1677              : #endif
    1678              : #endif
    1679              :       END IF
    1680            0 :       IF ( PRESENT(Gomega) ) THEN
    1681            0 :         Gomega(:,iflavor1,iflavor2) = Gwtmp(:)
    1682              :       END IF
    1683            0 :       op%setW = .TRUE.
    1684              :     ENDDO ! iflavor1
    1685              :   ENDDO ! iflavor2
    1686              :   !!op%oper_w=Gomega
    1687              :   do iflavor1=1,nflavors
    1688              :     !sui!write(6,*)  iflavor1
    1689              :       do i=1,Nom
    1690              :       !write(6,*) "w",i,op%oper_w(i,iflavor1,iflavor1)
    1691              :       enddo
    1692              :   enddo
    1693              : 
    1694            0 :   FREE(Gwtmp)
    1695            0 :   FREE(diagL)
    1696            0 :   FREE(lastR)
    1697            0 :   FREE(diag)
    1698            0 :   FREE(lastC)
    1699            0 :   FREE(XM)
    1700            0 :   FREE(omegatmp)
    1701            0 :   FREE(X2)
    1702            0 :   FREE(counts)
    1703            0 :   FREE(displs)
    1704              : 
    1705            0 : END SUBROUTINE GreenHyboffdiag_forFourier
    1706              : !!***
    1707              : 
    1708              : !!****f* ABINIT/m_GreenHyboffdiag/GreenHyboffdiag_print
    1709              : !! NAME
    1710              : !!  GreenHyboffdiag_print
    1711              : !!
    1712              : !! FUNCTION
    1713              : !!  print Green function
    1714              : !!
    1715              : !! COPYRIGHT
    1716              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
    1717              : !!  This file is distributed under the terms of the
    1718              : !!  GNU General Public License, see ~abinit/COPYING
    1719              : !!  or http://www.gnu.org/copyleft/gpl.txt .
    1720              : !!
    1721              : !! INPUTS
    1722              : !!  op=Green
    1723              : !!  ostream=file stream
    1724              : !!
    1725              : !! OUTPUT
    1726              : !!
    1727              : !! SIDE EFFECTS
    1728              : !!
    1729              : !! NOTES
    1730              : !!
    1731              : !! SOURCE
    1732              : 
    1733            0 : SUBROUTINE GreenHyboffdiag_print(op, ostream)
    1734              : 
    1735              : !Arguments ------------------------------------
    1736              :   TYPE(GreenHyboffdiag), INTENT(IN) :: op
    1737              :   INTEGER, OPTIONAL , INTENT(IN) :: ostream
    1738              : !Local variables ------------------------------
    1739              :   INTEGER                        :: ostream_val
    1740              :   INTEGER                        :: isample
    1741              :   INTEGER                        :: samples
    1742              :   INTEGER                        :: iflavor1
    1743              :   INTEGER                        :: iflavor2
    1744              : 
    1745              : 
    1746            0 :   IF ( op%set .EQV. .FALSE. ) &
    1747            0 :     CALL ERROR("GreenHyboffdiag_print : green op%operator not set              ")
    1748              : 
    1749            0 :   IF ( PRESENT(ostream) ) THEN
    1750            0 :     ostream_val = ostream
    1751              :   ELSE
    1752            0 :     ostream_val = 66
    1753            0 :     OPEN(UNIT=ostream_val,FILE="Green.dat")
    1754              :   END IF
    1755              : 
    1756            0 :   samples =  op%samples
    1757              : 
    1758            0 :   DO iflavor1=1,op%nflavors
    1759            0 :     DO iflavor2=1,op%nflavors
    1760            0 :     WRITE(ostream_val,'(a,i3,a,i3,a)')  "## (iflavor1,iflavor2)= (", iflavor1,",",iflavor2,")"
    1761            0 :       DO isample = 1, samples
    1762            0 :       WRITE(ostream_val,*) DBLE(isample-1)*op%delta_t, op%oper(isample,iflavor1,iflavor2)
    1763              :       END DO
    1764            0 :       WRITE(ostream_val,*)
    1765              :     END DO
    1766              :   END DO
    1767              : 
    1768            0 :   IF ( .NOT. PRESENT(ostream) ) &
    1769            0 :     CLOSE(ostream_val)
    1770            0 : END SUBROUTINE GreenHyboffdiag_print
    1771              : !!***
    1772              : 
    1773              : !!****f* ABINIT/m_GreenHyboffdiag/GreenHyboffdiag_destroy
    1774              : !! NAME
    1775              : !!  GreenHyboffdiag_destroy
    1776              : !!
    1777              : !! FUNCTION
    1778              : !!  destroy green function
    1779              : !!
    1780              : !! COPYRIGHT
    1781              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
    1782              : !!  This file is distributed under the terms of the
    1783              : !!  GNU General Public License, see ~abinit/COPYING
    1784              : !!  or http://www.gnu.org/copyleft/gpl.txt .
    1785              : !!
    1786              : !! INPUTS
    1787              : !!  op=Green
    1788              : !!
    1789              : !! OUTPUT
    1790              : !!
    1791              : !! SIDE EFFECTS
    1792              : !!
    1793              : !! NOTES
    1794              : !!
    1795              : !! SOURCE
    1796              : 
    1797            0 : SUBROUTINE GreenHyboffdiag_destroy(op)
    1798              : 
    1799              : !Arguments ------------------------------------
    1800              :   TYPE(GreenHyboffdiag), INTENT(INOUT) :: op
    1801              :   INTEGER :: iflavor,iflavorbis
    1802              : 
    1803            0 :   op%set          = .FALSE.
    1804            0 :   op%setT         = .FALSE.
    1805            0 :   op%setW         = .FALSE.
    1806            0 :   op%samples      = 0
    1807            0 :   op%measurements = 0
    1808            0 :   op%beta         = 0.d0
    1809            0 :   op%inv_beta     = 0.d0
    1810            0 :   op%inv_dt       = 0.d0
    1811            0 :   op%delta_t      = 0.d0
    1812            0 :   CALL VectorInt_destroy(op%index_old)
    1813            0 :   CALL Vector_destroy(op%oper_old)
    1814            0 :   do iflavor=1,op%nflavors
    1815            0 :     do iflavorbis=1,op%nflavors
    1816              :      !sui!write(6,*) "test",iflavor,iflavorbis
    1817            0 :       CALL MapHyb_destroy(op%map(iflavor,iflavorbis))
    1818              :     enddo
    1819              :   enddo
    1820            0 :   DT_FREEIF(op%map)
    1821            0 :   FREEIF(op%oper)
    1822            0 :   FREEIF(op%Mk)
    1823            0 :   FREEIF(op%oper_w)
    1824            0 :   FREEIF(op%oper_w_old)
    1825            0 :   FREEIF(op%omega)
    1826            0 : END SUBROUTINE GreenHyboffdiag_destroy
    1827              : 
    1828              : !!***
    1829              : ! This routine contains direct and inverse fourier transformation
    1830              : ! It is a modification of a routine of the GNU GPL
    1831              : ! code available on http://dmft.rutgers.edu/ and
    1832              : ! described in the RMP 2006 paper written by
    1833              : ! G.Kotliar, S.Y.Savrasov, K.Haule, V.S.Oudovenko, O.Parcollet, C.A.Marianetti
    1834              : !=======+=========+=========+=========+=========+=========+=========+=$
    1835              : !       TYPE   : SUBROUTINE
    1836              : !       PROGRAM: nfourier3
    1837              : !       PURPOSE: fourier-transform the natural-spline interpolation
    1838              : !                of function Green(tau)
    1839              : !                calculate function Green(omega)
    1840              : !       I/O    :
    1841              : !       VERSION: 2-16-92
    1842              : !                29-Nov-95 removal of minimal bug concerning
    1843              : !                          DIMENSION of rindata
    1844              : !       COMMENT: cf J. Stoer R. Bulirsch, Introduction to numerical
    1845              : !                analysis (Springer, New York, 1980)
    1846              : !=======+=========+=========+=========+=========+=========+=========+=$
    1847              : !
    1848            0 :       SUBROUTINE nfourier3(rindata,coutdata,lflag,Iwmax,L,Beta,AA,c1,c2,c3)
    1849              : 
    1850              : ! use m_profiling
    1851              : !       include 'param.dat'
    1852              : !       use defs_basis
    1853              : !Arguments ------------------------------------
    1854              :        integer, intent(in) :: Iwmax,L
    1855              :        logical, intent(in)  :: lflag
    1856              :        real*8, intent(in) :: beta,AA,c1,c2,c3
    1857              :        real*8, intent(in) :: rindata(L)
    1858              :        complex*16, intent(out) :: coutdata(Iwmax+1)
    1859              : !Local variables ------------------------------
    1860              :        integer    :: i,j,k,p
    1861            0 :        real*8     :: rincopy(L+1),a(L),b(L),c(L),d(L),u(L+1), q(L+1),XM(L+1)
    1862              :        complex*16 :: cdummy,explus,ex,j_dpc
    1863              :        real*8     :: one,two,zero,three,six,tau,xpi,delta,om !wn,
    1864              :        complex*16     :: czero
    1865              : !***********************************************
    1866              : 
    1867              :        ABI_UNUSED((/aa, c3/))
    1868              :        ABI_UNUSED((/lflag/))
    1869            0 :        czero=cmplx(0.d0,0.d0)
    1870            0 :        zero=0.d0
    1871            0 :        one=1.d0
    1872            0 :        two=2.d0
    1873            0 :        three=3.d0
    1874            0 :        six=6.d0
    1875            0 :        j_dpc=dcmplx(0.d0,1.d0)
    1876            0 :        xpi = ACOS(-One)
    1877            0 :        delta = beta/float(L)
    1878              :        ! c2 devrait etre nul en symetrie particule trou.
    1879            0 :        DO i = 1,L
    1880            0 :           tau=beta/dble(L)*dble(i-1)
    1881              :           !worksrincopy(i) = rindata(i)-c1/two!-c2/4.d0*(-Beta+2*tau)+c3/4.d0*(beta*tau-tau*tau)
    1882            0 :           rincopy(i) = rindata(i)-c1/two-c2/4.d0*(-Beta+2.d0*tau)!+c3/4.d0*(beta*tau-tau*tau)
    1883              :          ! rincopy(i) = -c2/4.d0*(-Beta+2*tau)
    1884              :        !   write(99,*) i,rindata(i)
    1885              :        !   write(98,*) i,tau,rincopy(i),rindata(i),rindata(i)-c1/two,-c1/two,-c2/4.d0*(-Beta+2.d0*tau)
    1886              :        !   write(97,*) i,(-Beta+two*tau),c2/4.d0,2.d0*tau,-c2/4.d0*(-Beta+2.d0*tau)
    1887              :        ENDDO
    1888              :        !   write(99,*)
    1889              :        !   write(98,*)
    1890              : !       if(lflag) then
    1891              : !         rincopy(L+1) = AA-rindata(1)
    1892              : !       else
    1893            0 :          rincopy(L+1) = -rindata(1)
    1894              : !       endif
    1895              :        !DO i = 1,L+1
    1896              :        !   write(999,*) i,rincopy(i)
    1897              :        !ENDDO
    1898              :        !write(6,*) lflag,Iwmax,L,Beta,delta
    1899              : !       Three = Two+One
    1900              : !       six = Two*Three
    1901              : 
    1902              : !c
    1903              : !c     spline interpolation:  the spline is given by
    1904              : !c     G(tau) = a(i) + b(i) (tau-tau_i) + c(i) ( )^2 + d(i) ( )^3
    1905              : !c     The following formulas are taken directly from  Stoer and
    1906              : !c     Bulirsch p. 102
    1907              : !c
    1908            0 :        q(1) = Zero
    1909            0 :        u(1) = Zero
    1910            0 :        DO k = 2,L
    1911            0 :           p = q(k-1)/Two+Two
    1912            0 :           q(k)=-One/Two/p
    1913              : !     this is equation 2.4.2.10 or Bulirsch for dn. here uk=dn
    1914            0 :           u(k)=Three/delta**2*(rincopy(k+1)+rincopy(k-1)-Two*rincopy(k))
    1915            0 :           u(k)=(u(k)-u(k-1)/Two)/p
    1916              :        ENDDO
    1917            0 :        XM(L+1) = 0
    1918            0 :        DO k = L,1,-1
    1919            0 :           XM(k) = q(k)*XM(k+1)+u(k)
    1920              :        ENDDO
    1921              : !c
    1922              : !c     The following formulas are taken directly from  Stoer and
    1923              : !c     Bulirsch p. 98 second edition.
    1924              : !c     a b c d are the spline coefficients.
    1925              : !c     XM(j) is the second derivative at node j
    1926              : !c
    1927              : 
    1928            0 :        DO j = 1, L
    1929            0 :           a(j) = rincopy(j)
    1930            0 :           c(j) = XM(j)/Two
    1931              :           b(j) = (rincopy(j+1)-rincopy(j))/delta - &
    1932            0 :      &       (Two*XM(j)+XM(j+1))*delta/6.
    1933            0 :           d(j) = (XM(j+1)-XM(j))/(6.*delta)
    1934              :        ENDDO
    1935              : 
    1936              : !c
    1937              : !c     The Spline multiplied by the exponential can now be exlicitely
    1938              : !c     integrated. The following formulas were obtained using
    1939              : !c     MATHEMATICA
    1940              : !c
    1941            0 :         DO i = 0,Iwmax
    1942            0 :            om = (Two*(i)+One)*xpi/Beta
    1943            0 :            coutdata(i+1) = czero
    1944            0 :            DO j = 1,L
    1945            0 :               cdummy = j_dpc*om*delta*j
    1946            0 :               explus = exp(cdummy)
    1947            0 :               cdummy = j_dpc*om*delta*(j-1)
    1948            0 :               ex = exp(cdummy)
    1949              :               coutdata(i+1) = coutdata(i+1) + explus*(&
    1950              :      &         ( -six* d(j) )/om**4 + &
    1951              :      &         ( Two*j_dpc*c(j) + six*delta*j_dpc*d(j)  )/om**3 +&
    1952              :      &         ( b(j)+ Two*delta*c(j)+ three*delta**2*d(j) )/om**2 +&
    1953              :      &         (- j_dpc*a(j) - delta*j_dpc*b(j) - delta**2*j_dpc*c(j) -&
    1954            0 :      &         delta**3*j_dpc*d(j))/om)
    1955              : 
    1956              :               coutdata(i+1) = coutdata(i+1) + ex*(&
    1957              :      &        six*d(j)/om**4 - Two*j_dpc*c(j)/om**3 &
    1958            0 :      &        -b(j)/om**2 + j_dpc*a(j)/om)
    1959              :            ENDDO
    1960              :           !write(100,*) i,real(coutdata(i+1)),imag(coutdata(i+1))
    1961              :         ENDDO
    1962              : !        DO i = 0,Iwmax
    1963              : !          wn=3.1415926/beta*dble(2*i+1)
    1964              : !          write(101,*) wn,real(coutdata(i+1)),imag(coutdata(i+1)),c1/wn,-c2/(wn*wn),-c3/(wn*wn*wn)
    1965              : !          coutdata(i+1)=coutdata(i+1)+cmplx(-c2/(wn*wn),c1/(wn))!-c3/(wn*wn*wn))
    1966              : ! !works         coutdata(i+1)=coutdata(i+1)+cmplx(0.d0,c1/(wn))
    1967              : !          write(103,*) wn,real(coutdata(i+1)),imag(coutdata(i+1)),c1/wn,-c2/(wn*wn),-c3/(wn*wn*wn)
    1968              : !        ENDDO
    1969              : !          write(101,*)
    1970              : !          write(103,*)
    1971            0 :         end subroutine nfourier3
    1972              : 
    1973            0 : END MODULE m_GreenHyboffdiag
    1974              : !!***
        

Generated by: LCOV version 2.3-1