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-11-10 15:53:16 Functions: 0.0 % 16 0
Branches: 0.0 % 810 0

             Branch data     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