LCOV - code coverage report
Current view: top level - src/62_ctqmc - m_GreenHyb.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 80.6 % 377 304
Test Date: 2026-11-09 22:30:52 Functions: 80.0 % 15 12
Branches: 43.6 % 587 256

             Branch data     Line data    Source code
       1                 :             : 
       2                 :             : #if defined HAVE_CONFIG_H
       3                 :             : #include "config.h"
       4                 :             : #endif
       5                 :             : !!****m* ABINIT/m_GreenHyb
       6                 :             : !! NAME
       7                 :             : !!  m_GreenHyb
       8                 :             : !!
       9                 :             : !! FUNCTION
      10                 :             : !!  Manage a green function for one orbital
      11                 :             : !!
      12                 :             : !! COPYRIGHT
      13                 :             : !!  Copyright (C) 2013-2026 ABINIT group (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_GreenHyb
      24                 :             : USE m_Global
      25                 :             : USE m_MatrixHyb
      26                 :             : USE m_Vector
      27                 :             : USE m_VectorInt
      28                 :             : USE m_ListCdagC
      29                 :             : USE m_MapHyb
      30                 :             : USE_MPI
      31                 :             : 
      32                 :             : IMPLICIT NONE
      33                 :             : 
      34                 :             : !!***
      35                 :             : 
      36                 :             : PRIVATE
      37                 :             : 
      38                 :             : !!****t* m_GreenHyb/GreenHyb
      39                 :             : !! NAME
      40                 :             : !!  GreenHyb
      41                 :             : !!
      42                 :             : !! FUNCTION
      43                 :             : !!  This structured datatype contains the necessary data
      44                 :             : !!
      45                 :             : !! COPYRIGHT
      46                 :             : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
      47                 :             : !!  This file is distributed under the terms of the
      48                 :             : !!  GNU General Public License, see ~abinit/COPYING
      49                 :             : !!  or http://www.gnu.org/copyleft/gpl.txt .
      50                 :             : !!
      51                 :             : !! SOURCE
      52                 :             : 
      53                 :             : TYPE, PUBLIC :: GreenHyb
      54                 :             :   LOGICAL _PRIVATE :: set = .FALSE.
      55                 :             :   LOGICAL _PRIVATE :: setT = .FALSE.
      56                 :             :   LOGICAL _PRIVATE :: setW = .FALSE.
      57                 :             :   LOGICAL _PRIVATE :: have_MPI = .FALSE.
      58                 :             :   INTEGER _PRIVATE :: setMk = 0
      59                 :             :   INTEGER _PRIVATE :: samples
      60                 :             :   INTEGER _PRIVATE :: measurements
      61                 :             :   INTEGER          :: factor
      62                 :             :   INTEGER _PRIVATE :: MY_COMM
      63                 :             :   INTEGER _PRIVATE :: size
      64                 :             :   INTEGER _PRIVATE :: rank
      65                 :             :   INTEGER _PRIVATE :: Wmax
      66                 :             :   INTEGER _PRIVATE :: iTech
      67                 :             :   DOUBLE PRECISION _PRIVATE :: beta
      68                 :             :   DOUBLE PRECISION _PRIVATE :: inv_beta
      69                 :             :   DOUBLE PRECISION _PRIVATE :: delta_t
      70                 :             :   DOUBLE PRECISION _PRIVATE :: inv_dt
      71                 :             :   DOUBLE PRECISION, ALLOCATABLE , DIMENSION(:)            :: oper
      72                 :             :   DOUBLE PRECISION, ALLOCATABLE , DIMENSION(:)   _PRIVATE :: omega
      73                 :             :   DOUBLE PRECISION              , DIMENSION(1:3) _PRIVATE :: Mk
      74                 :             :   COMPLEX(KIND=8)  , ALLOCATABLE, DIMENSION(:)   _PRIVATE :: oper_w
      75                 :             :   COMPLEX(KIND=8)  , ALLOCATABLE, DIMENSION(:)   _PRIVATE :: oper_w_old
      76                 :             :   TYPE(MapHyb)          :: this
      77                 :             : END TYPE GreenHyb
      78                 :             : !!***
      79                 :             : 
      80                 :             : PUBLIC :: GreenHyb_init
      81                 :             : PUBLIC :: GreenHyb_clear
      82                 :             : PUBLIC :: GreenHyb_reset
      83                 :             : PUBLIC :: GreenHyb_setOperW
      84                 :             : PUBLIC :: GreenHyb_measHybrid
      85                 :             : PUBLIC :: GreenHyb_getHybrid
      86                 :             : PUBLIC :: GreenHyb_setN
      87                 :             : PUBLIC :: GreenHyb_setMuD1
      88                 :             : PUBLIC :: GreenHyb_setMoments
      89                 :             : PUBLIC :: GreenHyb_backFourier
      90                 :             : PUBLIC :: GreenHyb_forFourier
      91                 :             : PUBLIC :: GreenHyb_print
      92                 :             : PUBLIC :: GreenHyb_destroy
      93                 :             : 
      94                 :             : CONTAINS
      95                 :             : !!***
      96                 :             : 
      97                 :             : !!****f* ABINIT/m_GreenHyb/GreenHyb_init
      98                 :             : !! NAME
      99                 :             : !!  GreenHyb_init
     100                 :             : !!
     101                 :             : !! FUNCTION
     102                 :             : !!  Initialize and allocate
     103                 :             : !!
     104                 :             : !! COPYRIGHT
     105                 :             : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
     106                 :             : !!  This file is distributed under the terms of the
     107                 :             : !!  GNU General Public License, see ~abinit/COPYING
     108                 :             : !!  or http://www.gnu.org/copyleft/gpl.txt .
     109                 :             : !!
     110                 :             : !! INPUTS
     111                 :             : !!  this=Green
     112                 :             : !!  samples=imaginary time slices
     113                 :             : !!  beta=inverse temperature
     114                 :             : !!  iTech=SHOULD NOT BE USED => BUGGY
     115                 :             : !!  MY_COMM=mpi_communicator
     116                 :             : !!
     117                 :             : !! OUTPUT
     118                 :             : !!
     119                 :             : !! SIDE EFFECTS
     120                 :             : !!
     121                 :             : !! NOTES
     122                 :             : !!
     123                 :             : !! SOURCE
     124                 :             : 
     125                 :        1125 : SUBROUTINE GreenHyb_init(this, samples, beta,iTech,MY_COMM)
     126                 :             : 
     127                 :             : 
     128                 :             : #ifdef HAVE_MPI1
     129                 :             : include 'mpif.h'
     130                 :             : #endif
     131                 :             : !Arguments ------------------------------------
     132                 :             :   TYPE(GreenHyb)     , INTENT(INOUT) :: this
     133                 :             :   INTEGER         , INTENT(IN   ) :: samples
     134                 :             :   DOUBLE PRECISION, INTENT(IN   ) :: beta
     135                 :             :   !INTEGER          , INTENT(IN   ) :: Wmax
     136                 :             :   INTEGER, OPTIONAL, INTENT(IN   ) :: iTech
     137                 :             :   INTEGER, OPTIONAL, INTENT(IN   ) :: MY_COMM
     138                 :             : !Local variables ------------------------------
     139                 :             :   INTEGER                         :: sp1
     140                 :             :   DOUBLE PRECISION                :: dt
     141                 :             : #ifdef HAVE_MPI
     142                 :             :   INTEGER          :: ierr
     143                 :             : #endif
     144                 :             : 
     145         [ +  - ]:        1125 :   IF ( PRESENT(MY_COMM)) THEN
     146                 :             : #ifdef HAVE_MPI
     147                 :        1125 :     this%have_MPI = .TRUE.
     148                 :        1125 :     this%MY_COMM = MY_COMM
     149                 :        1125 :     CALL MPI_Comm_rank(this%MY_COMM, this%rank, ierr)
     150                 :        1125 :     CALL MPI_Comm_size(this%MY_COMM, this%size, ierr)
     151                 :             : #else
     152                 :             :     CALL WARN("GreenHyb_init : MPI is not used                                    ")
     153                 :             :     this%have_MPI = .FALSE.
     154                 :             :     this%MY_COMM = -1
     155                 :             :     this%rank = 0
     156                 :             :     this%size = 1
     157                 :             : #endif
     158                 :             :   ELSE
     159                 :           0 :     this%have_MPI = .FALSE.
     160                 :           0 :     this%MY_COMM = -1
     161                 :           0 :     this%rank = 0
     162                 :           0 :     this%size = 1
     163                 :             :   END IF
     164                 :             : 
     165                 :        1125 :   sp1             = samples + 1
     166                 :        1125 :   this%samples      = sp1
     167                 :        1125 :   this%measurements = 0
     168                 :        1125 :   this%beta         = beta
     169                 :        1125 :   this%inv_beta     = 1.d0 / beta
     170                 :        1125 :   this%inv_dt       = DBLE(samples) * this%inv_beta
     171                 :        1125 :   dt              = 1.d0 / this%inv_dt
     172                 :        1125 :   this%delta_t      = dt
     173                 :             :   !this%Wmax         = Wmax
     174                 :        1125 :   this%Wmax         = -1
     175         [ -  + ]:        1125 :   FREEIF(this%oper)
     176   [ -  +  +  -  :        3375 :   MALLOC(this%oper,(1:sp1))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     177                 :             :   ! If we want to measure in frequences
     178                 :             :   ! let assume we first have "samples" frequences
     179         [ +  + ]:        1125 :   IF ( PRESENT(iTech) ) THEN
     180                 :        1076 :     this%iTech = iTech
     181                 :        1076 :     SELECT CASE (this%iTech)
     182                 :             :     CASE (GREENHYB_TAU)  ! omega
     183                 :        1076 :       this%iTech = GREENHYB_TAU
     184                 :             :     CASE (GREENHYB_OMEGA)  ! omega
     185                 :           0 :       this%Wmax = samples
     186         [ #  # ]:           0 :       FREEIF(this%oper_w)
     187   [ #  #  #  #  :           0 :       MALLOC(this%oper_w,(1:this%Wmax))
          #  #  #  #  #  
             #  #  #  #  
                      # ]
     188         [ #  # ]:           0 :       FREEIF(this%oper_w_old)
     189   [ #  #  #  #  :           0 :       MALLOC(this%oper_w_old,(1:this%Wmax))
          #  #  #  #  #  
             #  #  #  #  
                      # ]
     190         [ #  # ]:           0 :       this%oper_w     = CMPLX(0.d0,0.d0,8)
     191         [ #  # ]:           0 :       this%oper_w_old = CMPLX(0.d0,0.d0,8)
     192         [ #  # ]:           0 :       FREEIF(this%omega)
     193   [ #  #  #  #  :           0 :       MALLOC(this%omega,(1:this%Wmax))
          #  #  #  #  #  
             #  #  #  #  
                      # ]
     194   [ +  -  -  -  :        1076 :       this%omega = (/ ((2.d0 * DBLE(sp1) - 1.d0)*ACOS(-1.d0)*this%inv_beta, sp1=1, this%Wmax) /)
          -  -  -  -  -  
          -  -  -  -  -  
             -  -  -  -  
                      - ]
     195                 :             :     END SELECT
     196                 :             :   ELSE
     197                 :          49 :     this%iTech = GREENHYB_TAU
     198                 :             :   END IF
     199                 :             :   ! end if
     200                 :             :   !CALL Vector_init(this%oper_old,10000)
     201                 :             :   !CALL VectorInt_init(this%index_old,10000)
     202                 :        1125 :   CALL MapHyb_init(this%this,10000)
     203                 :             : 
     204         [ +  + ]:      341100 :   this%oper       = 0.d0
     205                 :        1125 :   this%set        = .TRUE.
     206                 :        1125 :   this%factor     = 1
     207                 :        1125 :   this%setMk      = 0
     208         [ +  + ]:        4500 :   this%Mk         = 0.d0
     209                 :        1125 : END SUBROUTINE GreenHyb_init
     210                 :             : !!***
     211                 :             : 
     212                 :             : !!****f* ABINIT/m_GreenHyb/GreenHyb_clear
     213                 :             : !! NAME
     214                 :             : !!  GreenHyb_clear
     215                 :             : !!
     216                 :             : !! FUNCTION
     217                 :             : !!  clear green function
     218                 :             : !!
     219                 :             : !! COPYRIGHT
     220                 :             : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
     221                 :             : !!  This file is distributed under the terms of the
     222                 :             : !!  GNU General Public License, see ~abinit/COPYING
     223                 :             : !!  or http://www.gnu.org/copyleft/gpl.txt .
     224                 :             : !!
     225                 :             : !! INPUTS
     226                 :             : !!  this=Green
     227                 :             : !!
     228                 :             : !! OUTPUT
     229                 :             : !!
     230                 :             : !! SIDE EFFECTS
     231                 :             : !!
     232                 :             : !! NOTES
     233                 :             : !!
     234                 :             : !! SOURCE
     235                 :             : 
     236                 :        1554 : SUBROUTINE GreenHyb_clear(this)
     237                 :             : 
     238                 :             : !Arguments ------------------------------------
     239                 :             :   TYPE(GreenHyb)     , INTENT(INOUT) :: this
     240                 :             : 
     241                 :             :   !CALL Vector_clear(this%oper_old)
     242                 :             :   !CALL VectorInt_clear(this%index_old)
     243                 :        1554 :   CALL MapHyb_clear(this%this)
     244                 :        1554 :   this%measurements = 0
     245         [ +  - ]:        1554 :   IF ( ALLOCATED(this%oper) ) &
     246         [ +  + ]:      458808 :   this%oper         = 0.d0
     247         [ -  + ]:        1554 :   IF ( this%iTech .EQ. GREENHYB_OMEGA ) THEN
     248         [ #  # ]:           0 :     IF ( ALLOCATED(this%oper_w) ) &
     249         [ #  # ]:           0 :     this%oper_w       = CMPLX(0.d0,0.d0,8)
     250         [ #  # ]:           0 :     IF ( ALLOCATED(this%oper_w_old) ) &
     251         [ #  # ]:           0 :     this%oper_w_old   = CMPLX(0.d0,0.d0,8)
     252                 :             :   END IF
     253                 :        1554 :   this%factor       = 0
     254                 :        1554 : END SUBROUTINE GreenHyb_clear
     255                 :             : !!***
     256                 :             : 
     257                 :             : !!****f* ABINIT/m_GreenHyb/GreenHyb_reset
     258                 :             : !! NAME
     259                 :             : !!  GreenHyb_reset
     260                 :             : !!
     261                 :             : !! FUNCTION
     262                 :             : !!  reset green function
     263                 :             : !!
     264                 :             : !! COPYRIGHT
     265                 :             : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
     266                 :             : !!  This file is distributed under the terms of the
     267                 :             : !!  GNU General Public License, see ~abinit/COPYING
     268                 :             : !!  or http://www.gnu.org/copyleft/gpl.txt .
     269                 :             : !!
     270                 :             : !! INPUTS
     271                 :             : !!  this=Green
     272                 :             : !!
     273                 :             : !! OUTPUT
     274                 :             : !!
     275                 :             : !! SIDE EFFECTS
     276                 :             : !!
     277                 :             : !! NOTES
     278                 :             : !!
     279                 :             : !! SOURCE
     280                 :             : 
     281                 :         518 : SUBROUTINE GreenHyb_reset(this)
     282                 :             : 
     283                 :             : !Arguments ------------------------------------
     284                 :             :   TYPE(GreenHyb)     , INTENT(INOUT) :: this
     285                 :             : 
     286                 :         518 :   CALL GreenHyb_clear(this)
     287                 :         518 :   this%setMk        = 0
     288         [ +  + ]:        2072 :   this%Mk           = 0.d0
     289                 :         518 :   this%setT         = .FALSE.
     290                 :         518 :   this%setW         = .FALSE.
     291                 :         518 : END SUBROUTINE GreenHyb_reset
     292                 :             : !!***
     293                 :             : 
     294                 :             : !!****f* ABINIT/m_GreenHyb/GreenHyb_setOperW
     295                 :             : !! NAME
     296                 :             : !!  GreenHyb_setOperW
     297                 :             : !!
     298                 :             : !! FUNCTION
     299                 :             : !!  set Green function in frequencies
     300                 :             : !!
     301                 :             : !! COPYRIGHT
     302                 :             : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
     303                 :             : !!  This file is distributed under the terms of the
     304                 :             : !!  GNU General Public License, see ~abinit/COPYING
     305                 :             : !!  or http://www.gnu.org/copyleft/gpl.txt .
     306                 :             : !!
     307                 :             : !! INPUTS
     308                 :             : !!  this=Green
     309                 :             : !!  Gomega=Input values
     310                 :             : !!
     311                 :             : !! OUTPUT
     312                 :             : !!
     313                 :             : !! SIDE EFFECTS
     314                 :             : !!
     315                 :             : !! NOTES
     316                 :             : !!
     317                 :             : !! SOURCE
     318                 :             : 
     319         [ -  + ]:         518 : SUBROUTINE GreenHyb_setOperW(this, Gomega)
     320                 :             : 
     321                 :             : !Arguments ------------------------------------
     322                 :             :   TYPE(GreenHyb)          , INTENT(INOUT) :: this
     323                 :             :   COMPLEX(KIND=8), DIMENSION(:), INTENT(IN   ) :: Gomega
     324                 :             : !Loval variables ------------------------------
     325                 :             :   INTEGER :: tail
     326                 :             : 
     327                 :         518 :   tail = SIZE(Gomega)
     328         [ -  + ]:         518 :   IF ( .NOT. this%set ) &
     329                 :           0 :     CALL ERROR("GreenHyb_setOperW : Uninitialized GreenHyb structure")
     330         [ +  + ]:         518 :   IF ( ALLOCATED(this%oper_w) ) THEN
     331         [ -  + ]:         469 :     IF ( SIZE(this%oper_w) .NE. tail ) THEN
     332                 :           0 :       FREE(this%oper_w)
     333   [ #  #  #  #  :           0 :       MALLOC(this%oper_w,(1:tail))
          #  #  #  #  #  
                #  #  # ]
     334                 :             :     END IF
     335                 :             :   ELSE
     336   [ -  +  +  -  :         147 :     MALLOC(this%oper_w,(1:tail))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     337                 :             :   END IF
     338         [ +  + ]:      152418 :   this%oper_w(:) = Gomega(:)
     339                 :         518 :   this%Wmax = tail
     340                 :         518 :   this%setW = .TRUE.
     341                 :         518 : END SUBROUTINE GreenHyb_setOperW
     342                 :             : !!***
     343                 :             : 
     344                 :             : !!****f* ABINIT/m_GreenHyb/GreenHyb_measHybrid
     345                 :             : !! NAME
     346                 :             : !!  GreenHyb_measHybrid
     347                 :             : !!
     348                 :             : !! FUNCTION
     349                 :             : !!  Measure Green function
     350                 :             : !!
     351                 :             : !! COPYRIGHT
     352                 :             : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
     353                 :             : !!  This file is distributed under the terms of the
     354                 :             : !!  GNU General Public License, see ~abinit/COPYING
     355                 :             : !!  or http://www.gnu.org/copyleft/gpl.txt .
     356                 :             : !!
     357                 :             : !! INPUTS
     358                 :             : !!  this=Green
     359                 :             : !!  Mthis=M this for the current flavor
     360                 :             : !!  ListCdagC_1=list of all creator and annhilator operators
     361                 :             : !!  updated=should we accumulate or not
     362                 :             : !!
     363                 :             : !! OUTPUT
     364                 :             : !!
     365                 :             : !! SIDE EFFECTS
     366                 :             : !!
     367                 :             : !! NOTES
     368                 :             : !!
     369                 :             : !! SOURCE
     370                 :             : 
     371                 :  1022380518 : SUBROUTINE GreenHyb_measHybrid(this, Mthis, ListCdagC_1, updated)
     372                 :             : 
     373                 :             : !Arguments ------------------------------------
     374                 :             :   TYPE(GreenHyb)    , INTENT(INOUT) :: this
     375                 :             :   TYPE(MatrixHyb)   , INTENT(IN   ) :: Mthis
     376                 :             :   TYPE(ListcdagC), INTENT(IN   ) :: ListCdagC_1
     377                 :             :   LOGICAL        , INTENT(IN   ) :: updated
     378                 :             : !Local variables ------------------------------
     379                 :             :   INTEGER                        :: iC
     380                 :             :   INTEGER                        :: iCdag
     381                 :             :   INTEGER                        :: tail
     382                 :             :   !INTEGER                        :: index
     383                 :             :   INTEGER                        :: idx_old
     384                 :             :   INTEGER                        :: old_size
     385                 :             :   INTEGER                        :: omegaSamples
     386                 :             :   INTEGER                        :: iomega
     387                 :             :   DOUBLE PRECISION               :: pi_invBeta
     388                 :             :   DOUBLE PRECISION               :: mbeta_two
     389                 :             :   DOUBLE PRECISION               :: beta
     390                 :             :   DOUBLE PRECISION               :: beta_tc
     391                 :             :   DOUBLE PRECISION               :: tcbeta_tc
     392                 :             :   DOUBLE PRECISION               :: inv_dt
     393                 :             :   DOUBLE PRECISION               :: tC
     394                 :             :   DOUBLE PRECISION               :: tCdag
     395                 :             :   DOUBLE PRECISION               :: time
     396                 :             :   DOUBLE PRECISION               :: signe
     397                 :             :   DOUBLE PRECISION               :: argument
     398                 :             :   !DOUBLE PRECISION               :: taupi_invbeta
     399                 :             :   !COMPLEX(KIND=8)                   :: cargument
     400                 :             :   !COMPLEX(2*8)                   :: base_exp
     401                 :             :   !COMPLEX(2*8)                   :: increm_exp
     402                 :             : 
     403         [ -  + ]:  1022380518 :   IF ( this%set .EQV. .FALSE. ) &
     404                 :           0 :     CALL ERROR("GreenHyb_measHybrid : green operator not set         ")
     405                 :             : 
     406                 :  1022380518 :   tail = ListCdagC_1%tail
     407         [ -  + ]:  1022380518 :   IF ( tail .NE. Mthis%tail ) &
     408                 :           0 :     CALL ERROR("GreenHyb_measHybrid : ListCdagC & M unconsistent     ")
     409                 :             : 
     410         [ +  + ]:  1022380518 :   IF ( updated .EQV. .TRUE. ) THEN ! NEW change in the configuration
     411                 :             :     ! FIXME SHOULD be much more faster
     412                 :             : 
     413                 :   158970444 :       old_size = this%this%tail
     414                 :   317940888 :     SELECT CASE(this%iTech)
     415                 :             :     CASE (GREENHYB_TAU)
     416                 :   158970444 :       argument = DBLE(this%factor)
     417         [ +  + ]:  3591438449 :       DO iC = 1, old_size
     418                 :  3591438449 :         this%oper(this%this%listINT(iC)) = this%oper(this%this%listINT(iC)) + this%this%listDBLE(iC) * argument
     419                 :             :       END DO
     420                 :   158970444 :       this%measurements = this%measurements + this%factor
     421                 :             : 
     422                 :   158970444 :       CALL MapHyb_setSize(this%this,tail*tail)
     423                 :   158970444 :       this%factor = 1
     424                 :   158970444 :       idx_old = 0
     425                 :   158970444 :       beta   =  this%beta
     426                 :   158970444 :       mbeta_two = -(beta*0.5d0)
     427                 :   158970444 :       inv_dt =  this%inv_dt
     428                 :             :       ! WARNING time is not the time but just a temporary variable.
     429                 :             :       ! Index Time has been calculated previously and is in mat_tau
     430         [ +  + ]:   715187494 :       DO iC  = 1, tail
     431                 :   556217050 :         tC   = ListCdagC_1%list(iC,C_)
     432                 :   556217050 :         beta_tc = beta - tC
     433                 :   556217050 :         tcbeta_tc = tC * beta_tc
     434         [ +  + ]:  4147695554 :         DO iCdag = 1, tail
     435                 :  3432508060 :           tCdag  = ListCdagC_1%list(iCdag,Cdag_)
     436                 :  3432508060 :           time = tcbeta_tc - tCdag*beta_tc
     437                 :             : 
     438                 :             :           !signe = SIGN(1.d0,time)
     439                 :             :           !time = time + (signe-1.d0)*mbeta_two
     440                 :             : 
     441                 :             :           !signe = signe * SIGN(1.d0,beta-tC)
     442                 :             : 
     443                 :             :           !signe = SIGN(1.d0,time) * SIGN(1.d0,beta-tC)
     444                 :  3432508060 :           signe = SIGN(1.d0,time)
     445                 :             : 
     446                 :  3432508060 :           argument = signe*Mthis%mat(iCdag,iC)
     447                 :             : 
     448                 :             :           !index = INT( ( time * inv_dt ) + 1.5d0 )
     449                 :             :           !IF (index .NE. Mthis%mat_tau(iCdag,iC)) THEN
     450                 :             :           !  WRITE(*,*) index, Mthis%mat_tau(iCdag,iC)
     451                 :             :           !!  CALL ERROR("Plantage")
     452                 :             :           !END IF
     453                 :             : 
     454                 :  3432508060 :           idx_old = idx_old + 1
     455                 :  3432508060 :           this%this%listDBLE(idx_old) = argument
     456                 :             :           !this%this%listINT(idx_old)  = index
     457                 :  3988725110 :           this%this%listINT(idx_old)  = Mthis%mat_tau(iCdag,iC)
     458                 :             :         END DO
     459                 :             :       END DO
     460                 :             :     CASE (GREENHYB_OMEGA)
     461                 :           0 :       omegaSamples = this%Wmax
     462                 :           0 :       argument = DBLE(this%factor)
     463         [ #  # ]:           0 :       DO iomega = 1, omegaSamples
     464                 :           0 :         this%oper_w(iomega) = this%oper_w(iomega) + this%oper_w_old(iomega) * argument
     465                 :             :       END DO
     466                 :           0 :       this%measurements = this%measurements + this%factor
     467                 :             : 
     468                 :           0 :       this%factor = 1
     469                 :           0 :       beta   =  this%beta
     470                 :           0 :       mbeta_two = -(beta*0.5d0)
     471                 :           0 :       pi_invBeta = ACOS(-1.d0)/beta
     472   [ +  -  -  -  :   158970444 :       DO iC  = 1, tail
                      - ]
     473                 :           0 :         tC   = ListCdagC_1%list(iC,C_)
     474         [ #  # ]:           0 :         DO iCdag = 1, tail
     475                 :           0 :           tCdag  = ListCdagC_1%list(iCdag,Cdag_)
     476                 :           0 :           time = tC - tCdag
     477                 :             : 
     478                 :           0 :           signe = SIGN(1.d0,time)
     479                 :           0 :           time = time + (signe-1.d0)*mbeta_two
     480                 :           0 :           signe = signe * SIGN(1.d0,beta-tC)
     481                 :           0 :           argument = signe*Mthis%mat(iCdag,iC)
     482                 :             : 
     483         [ #  # ]:           0 :           DO iomega = 1, omegaSamples
     484                 :             :             !this%oper_w_old(iomega) = Mthis%mat_tau(iCdag,iC)*CMPLX(0.d0,argument)
     485                 :           0 :             this%oper_w_old(iomega) = EXP(CMPLX(0.d0,this%omega(iomega)*time,8))*CMPLX(0.d0,argument,8)
     486                 :             :           END DO
     487                 :             :         END DO
     488                 :             :       END DO
     489                 :             :     END SELECT
     490                 :             :   ELSE
     491                 :   863410074 :     this%factor = this%factor + 1
     492                 :             :   END IF
     493                 :  1022380518 : END SUBROUTINE GreenHyb_measHybrid
     494                 :             : !!***
     495                 :             : 
     496                 :             : !!****f* ABINIT/m_GreenHyb/GreenHyb_getHybrid
     497                 :             : !! NAME
     498                 :             : !!  GreenHyb_getHybrid
     499                 :             : !!
     500                 :             : !! FUNCTION
     501                 :             : !!  reduce green function
     502                 :             : !!
     503                 :             : !! COPYRIGHT
     504                 :             : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
     505                 :             : !!  This file is distributed under the terms of the
     506                 :             : !!  GNU General Public License, see ~abinit/COPYING
     507                 :             : !!  or http://www.gnu.org/copyleft/gpl.txt .
     508                 :             : !!
     509                 :             : !! INPUTS
     510                 :             : !!  this=Green
     511                 :             : !!
     512                 :             : !! OUTPUT
     513                 :             : !!
     514                 :             : !! SIDE EFFECTS
     515                 :             : !!
     516                 :             : !! NOTES
     517                 :             : !!
     518                 :             : !! SOURCE
     519                 :             : 
     520                 :         518 : SUBROUTINE GreenHyb_getHybrid(this)
     521                 :             : 
     522                 :             : !Arguments ------------------------------------
     523                 :             :   TYPE(GreenHyb), INTENT(INOUT) :: this
     524                 :             : 
     525         [ -  + ]:         518 :   IF ( this%set .EQV. .FALSE. ) &
     526                 :           0 :     CALL ERROR("GreenHyb_getHybrid : green operator not set          ")
     527                 :             : 
     528                 :        1036 :   SELECT CASE(this%iTech)
     529                 :             :   CASE (GREENHYB_TAU)
     530         [ +  + ]:      152936 :     this%oper = -(this%oper * this%inv_beta) / (DBLE(this%measurements) * this%delta_t)
     531                 :         518 :     this%setT = .TRUE.
     532                 :             :   CASE (GREENHYB_OMEGA)
     533         [ #  # ]:           0 :     this%oper_w = -(this%oper_w * this%inv_beta) / (DBLE(this%measurements) * this%delta_t)
     534                 :           0 :     this%setW = .TRUE.
     535      [ +  -  - ]:         518 :     CALL GreenHyb_backFourier(this)
     536                 :             :   END SELECT
     537                 :             : 
     538                 :         518 : END SUBROUTINE GreenHyb_getHybrid
     539                 :             : !!***
     540                 :             : 
     541                 :             : !!****f* ABINIT/m_GreenHyb/GreenHyb_setN
     542                 :             : !! NAME
     543                 :             : !!  GreenHyb_setN
     544                 :             : !!
     545                 :             : !! FUNCTION
     546                 :             : !!  impose number of electrons for this flavor
     547                 :             : !!
     548                 :             : !! COPYRIGHT
     549                 :             : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
     550                 :             : !!  This file is distributed under the terms of the
     551                 :             : !!  GNU General Public License, see ~abinit/COPYING
     552                 :             : !!  or http://www.gnu.org/copyleft/gpl.txt .
     553                 :             : !!
     554                 :             : !! INPUTS
     555                 :             : !!  this=Green
     556                 :             : !!  N=number of electrons
     557                 :             : !!
     558                 :             : !! OUTPUT
     559                 :             : !!
     560                 :             : !! SIDE EFFECTS
     561                 :             : !!
     562                 :             : !! NOTES
     563                 :             : !!
     564                 :             : !! SOURCE
     565                 :             : 
     566                 :         518 : SUBROUTINE GreenHyb_setN(this,N)
     567                 :             : 
     568                 :             : !Arguments ------------------------------------
     569                 :             :   TYPE(GreenHyb)     , INTENT(INOUT) :: this
     570                 :             :   DOUBLE PRECISION, INTENT(IN   ) :: N
     571                 :             : 
     572         [ -  + ]:         518 :   IF ( this%set .EQV. .FALSE. ) &
     573                 :           0 :     CALL ERROR("GreenHyb_setN: green this%operator not set                ")
     574                 :         518 :   this%oper(1) = N - 1.d0
     575                 :         518 :   this%oper(this%samples) = - N
     576                 :         518 : END SUBROUTINE GreenHyb_setN
     577                 :             : !!***
     578                 :             : 
     579                 :             : !!****f* ABINIT/m_GreenHyb/GreenHyb_setMuD1
     580                 :             : !! NAME
     581                 :             : !!  GreenHyb_setMuD1
     582                 :             : !!
     583                 :             : !! FUNCTION
     584                 :             : !!  Set first moments for G
     585                 :             : !!
     586                 :             : !! COPYRIGHT
     587                 :             : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
     588                 :             : !!  This file is distributed under the terms of the
     589                 :             : !!  GNU General Public License, see ~abinit/COPYING
     590                 :             : !!  or http://www.gnu.org/copyleft/gpl.txt .
     591                 :             : !!
     592                 :             : !! INPUTS
     593                 :             : !!  this=Green
     594                 :             : !!  mu=energy level (irrespectige with fermi level)
     595                 :             : !!  d1=firt moment of hybridization function
     596                 :             : !!
     597                 :             : !! OUTPUT
     598                 :             : !!  argout(sizeout)=description
     599                 :             : !!
     600                 :             : !! SIDE EFFECTS
     601                 :             : !!
     602                 :             : !! NOTES
     603                 :             : !!
     604                 :             : !! SOURCE
     605                 :             : 
     606                 :         518 : SUBROUTINE GreenHyb_setMuD1(this,mu,d1)
     607                 :             : 
     608                 :             : !Arguments ------------------------------------
     609                 :             :   TYPE(GreenHyb)  , INTENT(INOUT) :: this
     610                 :             :   DOUBLE PRECISION, INTENT(IN   ) :: mu
     611                 :             :   DOUBLE PRECISION, INTENT(IN   ) :: d1
     612                 :             : 
     613                 :         518 :   this%Mk(3) = -d1-(mu*mu)
     614                 :         518 :   this%Mk(2) = -mu
     615                 :         518 :   this%setMk = this%setMk + 1
     616                 :         518 : END SUBROUTINE GreenHyb_setMuD1
     617                 :             : !!***
     618                 :             : 
     619                 :             : !!****f* ABINIT/m_GreenHyb/GreenHyb_setMoments
     620                 :             : !! NAME
     621                 :             : !!  GreenHyb_setMoments
     622                 :             : !!
     623                 :             : !! FUNCTION
     624                 :             : !!  Compute full moments
     625                 :             : !!
     626                 :             : !! COPYRIGHT
     627                 :             : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
     628                 :             : !!  This file is distributed under the terms of the
     629                 :             : !!  GNU General Public License, see ~abinit/COPYING
     630                 :             : !!  or http://www.gnu.org/copyleft/gpl.txt .
     631                 :             : !!
     632                 :             : !! INPUTS
     633                 :             : !!  this=Green
     634                 :             : !!  u1=interaction energi like
     635                 :             : !!  u2=idem order2
     636                 :             : !!
     637                 :             : !! OUTPUT
     638                 :             : !!
     639                 :             : !! SIDE EFFECTS
     640                 :             : !!
     641                 :             : !! NOTES
     642                 :             : !!
     643                 :             : !! SOURCE
     644                 :             : 
     645                 :         368 : SUBROUTINE GreenHyb_setMoments(this,u1,u2)
     646                 :             : 
     647                 :             : !Arguments ------------------------------------
     648                 :             :   TYPE(GreenHyb)  , INTENT(INOUT) :: this
     649                 :             :   DOUBLE PRECISION, INTENT(IN   ) :: u1
     650                 :             :   DOUBLE PRECISION, INTENT(IN   ) :: u2
     651                 :             : 
     652                 :         368 :   this%Mk(1) = -1.d0
     653                 :         368 :   this%Mk(3) = this%Mk(3) - 2.d0*(this%Mk(2)*u1)
     654                 :         368 :   this%Mk(2) = this%Mk(2) + u1
     655                 :         368 :   this%Mk(3) = this%Mk(3) - u2
     656                 :             : 
     657                 :         368 :   this%setMk = this%setMk + 1
     658                 :             : 
     659                 :         368 : END SUBROUTINE GreenHyb_setMoments
     660                 :             : !!***
     661                 :             : 
     662                 :             : !!****f* ABINIT/m_GreenHyb/GreenHyb_backFourier
     663                 :             : !! NAME
     664                 :             : !!  GreenHyb_backFourier
     665                 :             : !!
     666                 :             : !! FUNCTION
     667                 :             : !!  perform back fourier transform
     668                 :             : !!
     669                 :             : !! COPYRIGHT
     670                 :             : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
     671                 :             : !!  This file is distributed under the terms of the
     672                 :             : !!  GNU General Public License, see ~abinit/COPYING
     673                 :             : !!  or http://www.gnu.org/copyleft/gpl.txt .
     674                 :             : !!
     675                 :             : !! INPUTS
     676                 :             : !!  this=Green
     677                 :             : !!  dvgc=divergence parameter
     678                 :             : !!
     679                 :             : !! OUTPUT
     680                 :             : !!
     681                 :             : !! SIDE EFFECTS
     682                 :             : !!
     683                 :             : !! NOTES
     684                 :             : !!
     685                 :             : !! SOURCE
     686                 :             : 
     687                 :         518 : SUBROUTINE GreenHyb_backFourier(this,dvgc)
     688                 :             : 
     689                 :             : 
     690                 :             : #ifdef HAVE_MPI1
     691                 :             : include 'mpif.h'
     692                 :             : #endif
     693                 :             : !Arguments ------------------------------------
     694                 :             :   TYPE(GreenHyb)            , INTENT(INOUT) :: this
     695                 :             :   DOUBLE PRECISION, OPTIONAL, INTENT(IN   ) :: dvgc
     696                 :             : !Local variables ------------------------------
     697                 :             :   INTEGER :: itau
     698                 :             :   INTEGER :: iomega
     699                 :             :   INTEGER :: omegaSamples
     700                 :             :   INTEGER :: tauSamples
     701                 :             :   INTEGER :: tauBegin
     702                 :             :   INTEGER :: tauEnd
     703                 :             :   INTEGER :: delta
     704                 :             :   INTEGER :: residu
     705                 :         518 :   INTEGER, ALLOCATABLE, DIMENSION(:) :: counts
     706                 :         518 :   INTEGER, ALLOCATABLE, DIMENSION(:) :: displs
     707                 :             :   DOUBLE PRECISION :: A ! Correction factor
     708                 :             :   DOUBLE PRECISION :: inv_beta
     709                 :             :   DOUBLE PRECISION :: pi_invBeta
     710                 :             :   DOUBLE PRECISION :: two_invBeta
     711                 :             :   DOUBLE PRECISION :: minusDt
     712                 :             :   DOUBLE PRECISION :: minusOmegaTau
     713                 :             :   DOUBLE PRECISION :: omega
     714                 :             :   DOUBLE PRECISION :: minusTau
     715                 :             :   DOUBLE PRECISION :: sumTerm
     716                 :             :   DOUBLE PRECISION :: pi
     717                 :             :   DOUBLE PRECISION :: twoPi
     718                 :             :   DOUBLE PRECISION :: correction
     719                 :         518 :   DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: Domega
     720                 :         518 :   DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: A_omega
     721                 :             : 
     722                 :             : #if defined HAVE_MPI && !defined HAVE_MPI2_INPLACE
     723                 :             :   INTEGER :: my_count
     724                 :             :   DOUBLE PRECISION, ALLOCATABLE , DIMENSION(:) :: oper_buf
     725                 :             : #endif
     726                 :             : 
     727         [ -  + ]:         518 :   IF ( this%set .EQV. .FALSE. ) &
     728                 :           0 :     CALL ERROR("GreenHyb_backFourier : Uninitialized GreenHyb structure")
     729         [ -  + ]:         518 :   IF ( this%setW .EQV. .FALSE. ) &
     730                 :           0 :     CALL ERROR("GreenHyb_backFourier : no G(iw)")
     731                 :             : 
     732                 :         518 :   inv_beta     = this%inv_beta
     733                 :         518 :   two_invBeta  = 2.d0 * inv_beta
     734                 :         518 :   minusDt      = - this%delta_t
     735                 :         518 :   omegaSamples = this%Wmax
     736                 :         518 :   tauSamples   = this%samples-1
     737                 :             : 
     738         [ +  + ]:      152936 :   this%oper = 0.d0
     739                 :             : 
     740                 :         518 :   pi         = ACOS(-1.d0)
     741                 :         518 :   twoPi        = 2.d0 * pi
     742                 :         518 :   pi_invBeta = pi * inv_beta
     743                 :             : 
     744         [ -  + ]:         518 :   IF ( PRESENT(dvgc) ) THEN
     745                 :           0 :     A = dvgc
     746                 :             :   ELSE
     747                 :             :     A = AIMAG(this%oper_w(omegaSamples)) &  ! A = \lim_\infty G(w)
     748                 :         518 :              *(2.d0*DBLE(omegaSamples)-1.d0) * pi_invBeta
     749                 :             :   END IF
     750                 :             : 
     751                 :         518 :   correction = A*0.5d0
     752                 :             : 
     753   [ -  +  +  -  :        1554 :   MALLOC(Domega,(1:omegaSamples))
          +  -  +  -  -  
                +  -  + ]
     754   [ -  +  +  -  :        1036 :   MALLOC(A_omega,(1:omegaSamples))
             -  +  -  + ]
     755   [ -  +  +  +  :      456736 :   Domega = (/ ((2.d0 * DBLE(iomega) - 1.d0)*pi_invbeta, iomega=1, omegaSamples) /)
          +  -  +  +  +  
          -  -  +  -  -  
                   +  + ]
     756   [ +  -  -  +  :      152936 :   A_omega = A / Domega
             -  -  +  + ]
     757         [ +  - ]:         518 :   IF (this%have_MPI .EQV. .TRUE.) THEN
     758                 :         518 :     delta = tauSamples / this%size
     759                 :         518 :     residu = tauSamples - this%size*delta
     760         [ +  + ]:         518 :     IF ( this%rank .LT. this%size - residu ) THEN
     761                 :         462 :       tauBegin = 1 + this%rank*delta
     762                 :         462 :       tauEnd   = (this%rank + 1)*delta
     763                 :             :     ELSE
     764                 :             : !      tauBegin = (this%size-residu)*delta + 1 + (this%rank-this%size+residu)*(delta+1)
     765                 :          56 :       tauBegin = 1 + this%rank*(delta + 1) -this%size + residu
     766                 :          56 :       tauEnd = tauBegin + delta
     767                 :             :     END IF
     768   [ -  +  +  -  :        1554 :     MALLOC(counts,(1:this%size))
          +  -  +  -  -  
                +  -  + ]
     769   [ -  +  +  -  :        1036 :     MALLOC(displs,(1:this%size))
             -  +  -  + ]
     770                 :             :     counts = (/ (delta, iTau=1, this%size-residu), &
     771   [ -  +  +  +  :        5758 :                 (delta+1, iTau=this%size-residu+1, this%size) /)
          -  +  +  +  +  
          -  +  +  +  -  
          -  +  -  -  +  
                      + ]
     772                 :         518 :     displs(1)=0
     773         [ +  + ]:        1574 :     DO iTau = 2, this%size
     774                 :        1574 :       displs(iTau) = displs(iTau-1) + counts (iTau-1)
     775                 :             :     END DO
     776                 :             :   ELSE
     777                 :             :     tauBegin = 1
     778                 :             :     tauEnd   = tauSamples
     779                 :             :   END IF
     780         [ +  + ]:       58218 :   DO iTau = tauBegin, tauEnd
     781                 :       57700 :     minusTau = DBLE(itau -1) * minusDt
     782         [ +  + ]:    25442700 :     DO iomega = 1, omegaSamples
     783                 :    25385000 :       omega         = Domega(iomega)
     784                 :    25385000 :       minusOmegaTau = MOD(omega*minusTau, TwoPi)
     785                 :             :       sumTerm       = REAL(( this%oper_w(iomega) - CMPLX(0.d0, A_omega(iomega),8) ) &
     786                 :    25385000 :                       * EXP( CMPLX(0.d0, minusOmegaTau, 8)))
     787                 :    25442700 :       this%oper(itau)    = this%oper(itau) + sumTerm
     788                 :             :     END DO
     789                 :       58218 :     this%oper(itau) = correction + two_invBeta*this%oper(itau)
     790                 :             :   END DO
     791         [ +  - ]:         518 :   IF ( this%have_MPI .EQV. .TRUE. ) THEN
     792                 :             : ! rassembler les resultats
     793                 :             : #ifdef HAVE_MPI
     794                 :             : #if defined HAVE_MPI2_INPLACE
     795                 :             :     CALL MPI_ALLGATHERV(MPI_IN_PLACE, 0, MPI_DOUBLE_PRECISION, &
     796                 :             :                       this%oper, counts, displs, &
     797                 :         518 :                       MPI_DOUBLE_PRECISION, this%MY_COMM, residu)
     798                 :             : #else
     799                 :             :     my_count=tauBegin-tauEnd+1
     800                 :             :     MALLOC(oper_buf,(my_count))
     801                 :             :     oper_buf(1:my_count)=this%oper(tauBegin:tauEnd)
     802                 :             :     CALL MPI_ALLGATHERV(oper_buf, my_count, MPI_DOUBLE_PRECISION, &
     803                 :             :                       this%oper, counts, displs, &
     804                 :             :                       MPI_DOUBLE_PRECISION, this%MY_COMM, residu)
     805                 :             :     FREE(oper_buf)
     806                 :             : #endif
     807                 :             : #endif
     808         [ -  + ]:         518 :     FREE(counts)
     809         [ -  + ]:         518 :     FREE(displs)
     810                 :             :   END IF
     811                 :         518 :   this%oper(tauSamples+1) = A - this%oper(1) !G(0+)-G(0-)=G(0+)+G(beta-)=A
     812                 :         518 :   this%setT = .TRUE.
     813         [ -  + ]:         518 :   FREE(Domega)
     814         [ -  + ]:         518 :   FREE(A_omega)
     815                 :             : 
     816   [ -  +  -  + ]:         518 : END SUBROUTINE GreenHyb_backFourier
     817                 :             : !!***
     818                 :             : 
     819                 :             : !!****f* ABINIT/m_GreenHyb/GreenHyb_forFourier
     820                 :             : !! NAME
     821                 :             : !!  GreenHyb_forFourier
     822                 :             : !!
     823                 :             : !! FUNCTION
     824                 :             : !!  perform forward fourier transform
     825                 :             : !!
     826                 :             : !! COPYRIGHT
     827                 :             : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
     828                 :             : !!  This file is distributed under the terms of the
     829                 :             : !!  GNU General Public License, see ~abinit/COPYING
     830                 :             : !!  or http://www.gnu.org/copyleft/gpl.txt .
     831                 :             : !!
     832                 :             : !! INPUTS
     833                 :             : !!  this=Green
     834                 :             : !!  Wmax=linear maximum frequency
     835                 :             : !!
     836                 :             : !! OUTPUT
     837                 :             : !!  Gomega=Results for omega frequencies
     838                 :             : !!  omega=ask frequencies
     839                 :             : !!
     840                 :             : !! SIDE EFFECTS
     841                 :             : !!
     842                 :             : !! NOTES
     843                 :             : !!
     844                 :             : !! SOURCE
     845                 :             : 
     846   [ +  -  +  -  :         368 : SUBROUTINE GreenHyb_forFourier(this, Gomega, omega, Wmax)
          -  +  +  -  +  
                -  -  + ]
     847                 :             : !Arguments ------------------------------------
     848                 :             : 
     849                 :             : #ifdef HAVE_MPI1
     850                 :             : include 'mpif.h'
     851                 :             : #endif
     852                 :             :   TYPE(GreenHyb)             , INTENT(INOUT) :: this
     853                 :             :   COMPLEX(KIND=8), DIMENSION(:), OPTIONAL, INTENT(INOUT) :: Gomega  ! INOUT for MPI
     854                 :             :   COMPLEX(KIND=8), DIMENSION(:), OPTIONAL, INTENT(IN   ) :: omega
     855                 :             :   INTEGER                 , OPTIONAL, INTENT(IN   ) :: Wmax
     856                 :             :   INTEGER :: i
     857                 :             :   INTEGER :: j
     858                 :             :   INTEGER :: L
     859                 :             :   INTEGER :: Lspline
     860                 :             :   INTEGER :: Nom
     861                 :             :   INTEGER :: omegaBegin
     862                 :             :   INTEGER :: omegaEnd
     863                 :             :   INTEGER :: deltaw
     864                 :             :   INTEGER :: residu
     865                 :         368 :   INTEGER, ALLOCATABLE, DIMENSION(:) :: counts
     866                 :         368 :   INTEGER, ALLOCATABLE, DIMENSION(:) :: displs
     867                 :             :   DOUBLE PRECISION :: beta
     868                 :             :   DOUBLE PRECISION :: tau
     869                 :             :   DOUBLE PRECISION :: delta
     870                 :             :   DOUBLE PRECISION :: deltabis
     871                 :             :   DOUBLE PRECISION :: inv_delta
     872                 :             :   DOUBLE PRECISION :: inv_delta2
     873                 :             :   DOUBLE PRECISION :: omdeltabis
     874                 :             :   DOUBLE PRECISION :: tmp
     875                 :             :   DOUBLE PRECISION :: xpi
     876                 :         368 :   DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  diag
     877                 :         368 :   DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  diagL
     878                 :         368 :   DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  lastR
     879                 :         368 :   DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  lastC
     880                 :         368 :   DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  XM
     881                 :         368 :   DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE ::  X2
     882                 :             :   DOUBLE PRECISION :: iw
     883                 :             :   COMPLEX(KIND=8) :: iwtau
     884                 :         368 :   COMPLEX(KIND=8), ALLOCATABLE, DIMENSION(:) :: Gwtmp
     885                 :         368 :   DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: omegatmp
     886                 :             : 
     887                 :             : #if defined HAVE_MPI && !defined HAVE_MPI2_INPLACE
     888                 :             :   INTEGER :: my_count
     889                 :             :   COMPLEX(KIND=8), ALLOCATABLE , DIMENSION(:) :: Gwtmp_buf
     890                 :             : #endif
     891                 :             : 
     892         [ -  + ]:         368 :   IF ( this%set .EQV. .FALSE. ) &
     893                 :           0 :     CALL ERROR("GreenHyb_forFourier : Uninitialized GreenHyb structure")
     894         [ -  + ]:         368 :   IF ( this%setT .EQV. .FALSE. ) &
     895                 :           0 :     CALL ERROR("GreenHyb_forFourier : no G(tau)")
     896         [ -  + ]:         368 :   IF ( this%setMk .NE. 2 ) &
     897                 :           0 :     CALL WARNALL("GreenHyb_forFourier : green does not have moments    ")
     898                 :             : 
     899                 :         368 :   L  = this%samples
     900                 :             : 
     901                 :         368 :   xpi=acos(-1.d0)                !!! XPI=PI
     902                 :         368 :   beta = this%beta
     903                 :         368 :   Nom  = this%Wmax
     904         [ +  - ]:         368 :   IF ( PRESENT(Gomega) ) THEN
     905                 :         368 :     Nom = SIZE(Gomega)
     906                 :             :     !IF ( this%rank .EQ. 0 ) &
     907                 :             :       !write(6,*) "size Gomega", Nom
     908                 :             :   END IF
     909         [ +  - ]:         368 :   IF ( PRESENT(omega) ) THEN
     910   [ +  -  -  + ]:         368 :     IF ( PRESENT(Gomega) .AND. SIZE(omega) .NE. Nom ) THEN
     911                 :           0 :       CALL ERROR("GreenHyb_forFourier : sizes mismatch              ")
     912                 :             :     !ELSE
     913                 :             :       !Nom = SIZE(omega)
     914                 :             :     END IF
     915                 :             :   END IF
     916         [ +  - ]:         368 :   IF ( .NOT. PRESENT(Gomega) .AND. .NOT. PRESENT(omega) ) THEN
     917         [ #  # ]:           0 :     IF ( PRESENT(Wmax) ) THEN
     918                 :           0 :       Nom=Wmax
     919                 :             :     ELSE
     920                 :           0 :       CALL ERROR("GreenHyb_forFourier : Missing argument Wmax")
     921                 :             :     END IF
     922                 :             :   END IF
     923                 :             : 
     924         [ -  + ]:         368 :   IF ( ALLOCATED(this%oper_w) ) THEN
     925         [ #  # ]:           0 :     IF ( SIZE(this%oper_w) .NE. Nom ) THEN
     926                 :           0 :       FREE(this%oper_w)
     927   [ #  #  #  #  :           0 :       MALLOC(this%oper_w,(1:Nom))
          #  #  #  #  #  
                #  #  # ]
     928                 :             :     END IF
     929                 :             :   ELSE
     930   [ -  +  +  -  :        1104 :     MALLOC(this%oper_w,(1:Nom))
          +  -  +  -  -  
             +  -  +  -  
                      + ]
     931                 :             :   END IF
     932                 :             : 
     933                 :             :   !write(6,*) "PRESENT(GOMEGA)", PRESENT(GOMEGA)
     934                 :             :   !write(6,*) "PRESENT(OMEGA)", PRESENT(OMEGA)
     935                 :             :   !call flush(6)
     936                 :             : 
     937                 :         368 :   delta=this%delta_t
     938                 :         368 :   inv_delta = this%inv_dt
     939                 :         368 :   inv_delta2 = inv_delta*inv_delta
     940                 :             : 
     941   [ +  -  -  +  :        1104 :   MALLOC(diagL,(L-1))
          +  -  +  -  +  
             -  -  +  -  
                      + ]
     942   [ -  +  +  -  :         736 :   MALLOC(lastR,(L-1))
             -  +  -  + ]
     943   [ -  +  +  -  :        1104 :   MALLOC(diag,(L))
          +  -  +  -  -  
                +  -  + ]
     944   [ -  +  +  -  :         736 :   MALLOC(lastC,(L-1))
             -  +  -  + ]
     945                 :             : 
     946                 :             : !(cf Stoer) for the spline interpolation :
     947                 :             : ! second derivatives XM solution of A*XM=B.
     948                 :             : !A=(2.4.2.11) of Stoer&Bulirsch + 2 limit conditions
     949                 :             : !The LU decomposition of A is known explicitly;
     950                 :             : 
     951                 :         368 :   diag (1) = 4.d0 ! 1.d0 *4.d0 factor 4 added for conditionning
     952                 :         368 :   diagL(1) = 0.25d0 !1.d0/4.d0
     953                 :         368 :   lastR(1) = -0.5d0 ! -2.d0/4.d0
     954                 :         368 :   lastC(1) = 4.d0 ! 1.d0*4.d0
     955                 :         368 :   diag (2) = 4.d0
     956                 :         368 :   diagL(2) = 0.25d0
     957                 :         368 :   lastR(2) = -0.25d0
     958                 :         368 :   lastC(2) = -1.d0
     959                 :             : 
     960         [ +  + ]:       76164 :   DO i = 3, L-2
     961                 :       75796 :     tmp = 4.d0 - diagL(i-1)
     962                 :       76164 :     diagL(i) = 1.d0 / tmp
     963                 :             :   END DO
     964         [ +  + ]:       76164 :   DO i = 3, L-2
     965                 :       75796 :     diag (i) = 1.d0 / diagL(i)
     966                 :       75796 :     lastR(i) = -(lastR(i-1)*diagL(i))
     967                 :       76164 :     lastC(i) = -(lastC(i-1)*diagL(i-1))
     968                 :             :   END DO
     969                 :             : 
     970                 :         368 :   tmp = 1.d0/diag(L-2)
     971                 :         368 :   diag (L-1) = 4.d0 - tmp
     972                 :         368 :   lastR(L-1) = (1.d0 - lastR(L-2))/ diag(L-1)
     973                 :             :   !diagL(L-1) = lastR(L-1)
     974                 :         368 :   diagL(L-1) = 0.d0 ! for the Lq=B resolution
     975                 :             :   !lastC(L-1) = 1.d0 - lastC(L-2)*diagL(L-1) ! equivalent to the next line
     976                 :         368 :   lastC(L-1) = 1.d0 - (lastC(L-2)*lastR(L-1)) ! True value
     977                 :         368 :   diag (L  ) = 2.d0! - DOT_PRODUCT( lastR , lastC )
     978                 :         368 :   tmp = 0.d0
     979         [ +  + ]:       77268 :   DO i = 1, L-1
     980                 :       77268 :     tmp = tmp + lastR(i)*lastC(i)
     981                 :             :   END DO
     982                 :         368 :   diag (L  ) = diag (L  ) - tmp
     983                 :         368 :   lastC(L-1) = lastC(L-1)-1.d0 ! 1 is removed for the u.XM=q resolution
     984                 :             : 
     985                 :             : ! construct the B vector from A.Xm=B
     986   [ -  +  +  -  :         736 :   MALLOC(XM,(L))
             -  +  -  + ]
     987                 :         368 :   XM(1) = 4.d0*this%Mk(3)
     988                 :             :   XM(L) = (6.d0 * inv_delta) * ( this%Mk(2) - ( &
     989                 :             :           (this%oper(2)-this%oper(1)) + &
     990                 :         368 :           (this%oper(L)-this%oper(L-1)) ) * inv_delta )
     991         [ +  + ]:       76900 :   DO i = 2, L-1
     992                 :             :     XM(i) = (6.d0 * inv_delta2) * ( (this%oper(i+1) &
     993                 :             :                           - 2.d0 * this%oper(i)) &
     994                 :       76900 :                           +        this%oper(i-1) )
     995                 :             :   END DO
     996                 :             : 
     997                 :             : ! Find second derivatives XM: Solve the system
     998                 :             : ! SOLVING Lq= XM
     999                 :             : !  q = XM
    1000         [ +  + ]:       77268 :   do j=1,L-1
    1001                 :       76900 :       XM(j+1)=XM(j+1)-(diagL(j)*XM(j))
    1002                 :       77268 :       XM(L)  =XM(L)  -(lastR(j)*XM(j))
    1003                 :             :   end do
    1004                 :         368 :   FREE(diagL)
    1005                 :         368 :   FREE(lastR)
    1006                 :             : 
    1007                 :             : ! SOLVING U.XM=q
    1008                 :             : !  XM = q
    1009         [ +  + ]:       76900 :   do j=L-1,2,-1
    1010                 :       76532 :    XM(j+1)  = XM(j+1) / diag(j+1)
    1011                 :       76900 :    XM(j)= (XM(j)-(XM(L)*lastC(j)))-XM(j+1)
    1012                 :             :   end do
    1013                 :         368 :   XM(2)  = XM(2) / diag(2)
    1014                 :         368 :   XM(1) = (XM(1)-XM(L)*lastC(1)) / diag(1)
    1015                 :             : 
    1016                 :         368 :   FREE(diag)
    1017                 :         368 :   FREE(lastC)
    1018                 :             : 
    1019                 :         368 :   Lspline = L-1
    1020   [ -  +  +  -  :        1104 :   MALLOC(X2,(1:Lspline+1)) ! We impose L = Nom
          +  -  +  -  -  
                +  -  + ]
    1021                 :             :   !Construct L2 second derivative from known derivatives XM
    1022                 :         368 :   deltabis = beta / DBLE(Lspline)
    1023         [ +  + ]:       77268 :   DO i = 1, Lspline
    1024                 :       76900 :     tau = deltabis * DBLE(i-1)
    1025                 :       76900 :     j = ((L-1)*(i-1))/Lspline + 1!INT(tau * inv_delta) + 1
    1026                 :       77268 :     X2(i) = inv_delta * ( XM(j)*(DBLE(j)*delta - tau ) + XM(j+1)*(tau - DBLE(j-1)*delta) )
    1027                 :             :   END DO
    1028                 :         368 :   X2(Lspline+1) = XM(L)
    1029                 :         368 :   FREE(XM)
    1030                 :             : 
    1031         [ +  - ]:         368 :   IF ( this%have_MPI .EQV. .TRUE. ) THEN
    1032                 :         368 :     deltaw = Nom / this%size
    1033                 :         368 :     residu = Nom - this%size*deltaw
    1034         [ +  + ]:         368 :     IF ( this%rank .LT. this%size - residu ) THEN
    1035                 :         282 :       omegaBegin = 1 + this%rank*deltaw
    1036                 :         282 :       omegaEnd   = (this%rank + 1)*deltaw
    1037                 :             :     ELSE
    1038                 :             :   !    tauBegin = (this%size-residu)*deltaw + 1 + (this%rank-this%size+residu)*(deltaw+1)
    1039                 :          86 :       omegaBegin = 1 + this%rank*(deltaw + 1) -this%size + residu
    1040                 :          86 :       omegaEnd = omegaBegin + deltaw
    1041                 :             :     END IF
    1042   [ -  +  +  -  :        1104 :     MALLOC(counts,(1:this%size))
          +  -  +  -  -  
                +  -  + ]
    1043   [ -  +  +  -  :         736 :     MALLOC(displs,(1:this%size))
             -  +  -  + ]
    1044                 :             :     counts = (/ (deltaw, i=1, this%size-residu), &
    1045   [ -  +  +  +  :        3928 :                 (deltaw+1, i=this%size-residu+1, this%size) /)
          -  +  +  +  +  
          -  +  +  +  -  
          -  +  -  -  +  
                      + ]
    1046                 :         368 :     displs(1)=0
    1047         [ +  + ]:        1064 :     DO i = 2, this%size
    1048                 :        1064 :       displs(i) = displs(i-1) + counts (i-1)
    1049                 :             :     END DO
    1050                 :             :   ELSE
    1051                 :             :     omegaBegin = 1
    1052                 :             :     omegaEnd   = Nom
    1053                 :             :   END IF
    1054                 :             : 
    1055                 :         368 :   this%Mk(1) = -1.d0
    1056   [ -  +  +  -  :        1104 :   MALLOC(omegatmp,(omegaBegin:omegaEnd))
          +  -  +  -  -  
                +  -  + ]
    1057         [ +  - ]:         368 :   IF ( PRESENT(omega) ) THEN
    1058   [ +  -  +  +  :      126544 :     omegatmp(omegaBegin:omegaEnd) = (/ (AIMAG(omega(i)),i=omegaBegin,omegaEnd) /)
                   +  + ]
    1059                 :             :   ELSE
    1060   [ #  #  #  #  :           0 :     omegatmp(omegaBegin:omegaEnd) = (/ ((((2.d0*DBLE(i)-1.d0)*xpi)/Beta), i=omegaBegin,omegaEnd) /)
                   #  # ]
    1061                 :             :   END IF
    1062   [ -  +  +  -  :        1104 :   MALLOC(Gwtmp,(1:Nom))
          +  -  +  -  -  
                +  -  + ]
    1063         [ +  + ]:       63456 :   DO i = omegaBegin, omegaEnd
    1064                 :       63088 :     iw = omegatmp(i)
    1065                 :       63088 :     omdeltabis = iw*deltabis
    1066                 :       63088 :     Gwtmp(i)=CMPLX(0.d0,0.d0,8)
    1067         [ +  + ]:    25420400 :     DO j=2, Lspline ! We impose  L+1 = Nom
    1068                 :    25357312 :       iwtau = CMPLX(0.d0,omdeltabis*DBLE(j-1),8)
    1069                 :    25420400 :       Gwtmp(i) = Gwtmp(i) + EXP(iwtau) * CMPLX((X2(j+1) + X2(j-1))-2.d0*X2(j),0.d0,8)
    1070                 :             :     END DO
    1071                 :             :     Gwtmp(i) = Gwtmp(i)/CMPLX(((iw*iw)*(iw*iw)*deltabis),0.d0,8) &
    1072                 :             : 
    1073                 :             :               + CMPLX( &
    1074                 :             :                 ( ((X2(2)-X2(1))+(X2(Lspline+1)-X2(Lspline)))/((iw*iw)*deltabis) -this%Mk(2) ) &
    1075                 :             :                 /(iw*iw) &
    1076                 :             :                , &
    1077                 :             :                 (this%Mk(1)-this%Mk(3)/(iw*iw))/iw &
    1078                 :       63456 :                , 8)
    1079                 :             :               !+ CMPLX( (X2(2)-X2(1))+(X2(Lspline+1)-X2(Lspline)), 0.d0, 8 ) ) &
    1080                 :             :               !   / (((iw*iw)*(iw*iw))*CMPLX(deltabis,0.d0,8)) &
    1081                 :             :               !- CMPLX(this%Mk(1),0.d0,8)/iw  &
    1082                 :             :               !+ CMPLX(this%Mk(2),0.d0,8)/(iw*iw) &
    1083                 :             :               !- CMPLX(this%Mk(3),0.d0,8)/((iw*iw)*iw)
    1084                 :             :     !IF ( this%rank .EQ. 0 )  write(12819,*) iw,gwtmp(i)
    1085                 :             :   END DO
    1086         [ -  + ]:         368 :   FREE(omegatmp)
    1087                 :             :   !call flush(12819)
    1088                 :         368 :   FREE(X2)
    1089         [ +  - ]:         368 :   IF ( this%have_MPI .EQV. .TRUE. ) THEN
    1090                 :             : #ifdef HAVE_MPI
    1091                 :             : #if defined HAVE_MPI2_INPLACE
    1092                 :             :     CALL MPI_ALLGATHERV(MPI_IN_PLACE, 0, MPI_DOUBLE_COMPLEX, &
    1093                 :             :                       Gwtmp  , counts, displs, &
    1094                 :         368 :                       MPI_DOUBLE_COMPLEX, this%MY_COMM, residu)
    1095                 :             : #else
    1096                 :             :     my_count=omegaBegin-omegaEnd+1
    1097                 :             :     MALLOC(Gwtmp_buf,(my_count))
    1098                 :             :     Gwtmp_buf(1:my_count)=Gwtmp(omegaBegin:omegaEnd)
    1099                 :             :     CALL MPI_ALLGATHERV(Gwtmp_buf, my_count, MPI_DOUBLE_COMPLEX, &
    1100                 :             :                       Gwtmp  , counts, displs, &
    1101                 :             :                       MPI_DOUBLE_COMPLEX, this%MY_COMM, residu)
    1102                 :             :     FREE(Gwtmp_buf)
    1103                 :             : #endif
    1104                 :             : #endif
    1105         [ -  + ]:         368 :     FREE(counts)
    1106         [ -  + ]:         368 :     FREE(displs)
    1107                 :             :   END IF
    1108         [ +  - ]:         368 :   IF ( PRESENT(Gomega) ) THEN
    1109         [ +  + ]:      182346 :     Gomega = Gwtmp
    1110                 :             :   END IF
    1111   [ +  -  -  +  :      182714 :   this%oper_w = Gwtmp
             -  -  +  + ]
    1112                 :         368 :   this%setW = .TRUE.
    1113         [ -  + ]:         368 :   FREE(Gwtmp)
    1114   [ -  +  -  + ]:         368 : END SUBROUTINE GreenHyb_forFourier
    1115                 :             : !!***
    1116                 :             : 
    1117                 :             : !!****f* ABINIT/m_GreenHyb/GreenHyb_print
    1118                 :             : !! NAME
    1119                 :             : !!  GreenHyb_print
    1120                 :             : !!
    1121                 :             : !! FUNCTION
    1122                 :             : !!  print Green function
    1123                 :             : !!
    1124                 :             : !! COPYRIGHT
    1125                 :             : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
    1126                 :             : !!  This file is distributed under the terms of the
    1127                 :             : !!  GNU General Public License, see ~abinit/COPYING
    1128                 :             : !!  or http://www.gnu.org/copyleft/gpl.txt .
    1129                 :             : !!
    1130                 :             : !! INPUTS
    1131                 :             : !!  this=Green
    1132                 :             : !!  ostream=file stream
    1133                 :             : !!
    1134                 :             : !! OUTPUT
    1135                 :             : !!
    1136                 :             : !! SIDE EFFECTS
    1137                 :             : !!
    1138                 :             : !! NOTES
    1139                 :             : !!
    1140                 :             : !! SOURCE
    1141                 :             : 
    1142                 :           0 : SUBROUTINE GreenHyb_print(this, ostream)
    1143                 :             : 
    1144                 :             : !Arguments ------------------------------------
    1145                 :             :   TYPE(GreenHyb), INTENT(IN) :: this
    1146                 :             :   INTEGER, OPTIONAL , INTENT(IN) :: ostream
    1147                 :             : !Local variables ------------------------------
    1148                 :             :   INTEGER                        :: ostream_val
    1149                 :             :   INTEGER                        :: i
    1150                 :             :   INTEGER                        :: samples
    1151                 :             : 
    1152                 :             : 
    1153         [ #  # ]:           0 :   IF ( this%set .EQV. .FALSE. ) &
    1154                 :           0 :     CALL ERROR("GreenHyb_print : green this%operator not set              ")
    1155                 :             : 
    1156         [ #  # ]:           0 :   IF ( PRESENT(ostream) ) THEN
    1157                 :           0 :     ostream_val = ostream
    1158                 :             :   ELSE
    1159                 :           0 :     ostream_val = 66
    1160                 :           0 :     OPEN(UNIT=ostream_val,FILE="Green.dat")
    1161                 :             :   END IF
    1162                 :             : 
    1163                 :           0 :   samples =  this%samples
    1164                 :             : 
    1165         [ #  # ]:           0 :   DO i = 1, samples
    1166                 :           0 :     WRITE(ostream_val,*) DBLE(i-1)*this%delta_t, this%oper(i)
    1167                 :             :   END DO
    1168                 :             : 
    1169         [ #  # ]:           0 :   IF ( .NOT. PRESENT(ostream) ) &
    1170                 :           0 :     CLOSE(ostream_val)
    1171                 :           0 : END SUBROUTINE GreenHyb_print
    1172                 :             : !!***
    1173                 :             : 
    1174                 :             : !!****f* ABINIT/m_GreenHyb/GreenHyb_destroy
    1175                 :             : !! NAME
    1176                 :             : !!  GreenHyb_destroy
    1177                 :             : !!
    1178                 :             : !! FUNCTION
    1179                 :             : !!  destroy green function
    1180                 :             : !!
    1181                 :             : !! COPYRIGHT
    1182                 :             : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
    1183                 :             : !!  This file is distributed under the terms of the
    1184                 :             : !!  GNU General Public License, see ~abinit/COPYING
    1185                 :             : !!  or http://www.gnu.org/copyleft/gpl.txt .
    1186                 :             : !!
    1187                 :             : !! INPUTS
    1188                 :             : !!  this=Green
    1189                 :             : !!
    1190                 :             : !! OUTPUT
    1191                 :             : !!
    1192                 :             : !! SIDE EFFECTS
    1193                 :             : !!
    1194                 :             : !! NOTES
    1195                 :             : !!
    1196                 :             : !! SOURCE
    1197                 :             : 
    1198                 :        1125 : SUBROUTINE GreenHyb_destroy(this)
    1199                 :             : 
    1200                 :             : !Arguments ------------------------------------
    1201                 :             :   TYPE(GreenHyb), INTENT(INOUT) :: this
    1202                 :             : 
    1203                 :        1125 :   this%set          = .FALSE.
    1204                 :        1125 :   this%setT         = .FALSE.
    1205                 :        1125 :   this%setW         = .FALSE.
    1206                 :        1125 :   this%samples      = 0
    1207                 :        1125 :   this%measurements = 0
    1208                 :        1125 :   this%beta         = 0.d0
    1209                 :        1125 :   this%inv_beta     = 0.d0
    1210                 :        1125 :   this%inv_dt       = 0.d0
    1211                 :        1125 :   this%delta_t      = 0.d0
    1212                 :             :   !CALL VectorInt_destroy(this%index_old)
    1213                 :             :   !CALL Vector_destroy(this%oper_old)
    1214                 :        1125 :   CALL MapHyb_destroy(this%this)
    1215         [ +  - ]:        1125 :   FREEIF(this%oper)
    1216         [ +  + ]:        1125 :   FREEIF(this%oper_w)
    1217         [ -  + ]:        1125 :   FREEIF(this%oper_w_old)
    1218         [ -  + ]:        1125 :   FREEIF(this%omega)
    1219                 :        1125 : END SUBROUTINE GreenHyb_destroy
    1220                 :             : !!***
    1221                 :             : 
    1222   [ #  #  #  #  :           0 : END MODULE m_GreenHyb
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  #  
                      # ]
    1223                 :             : !!***
        

Generated by: LCOV version 2.3-1