LCOV - code coverage report
Current view: top level - src/62_ctqmc - m_Ctqmcoffdiag.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 0.0 % 1247 0
Test Date: 2026-09-19 17:42:43 Functions: 0.0 % 37 0

            Line data    Source code
       1              : 
       2              : #if defined HAVE_CONFIG_H
       3              : #include "config.h"
       4              : #endif
       5              : !!****m* ABINIT/m_Ctqmcoffdiag
       6              : !! NAME
       7              : !!  m_Ctqmcoffdiag
       8              : !!
       9              : !! FUNCTION
      10              : !!  Manage and drive all the CTQMC
      11              : !!  Should not be used if you don't know what you do
      12              : !!  Please use CtqmcoffdiagInterface
      13              : !!
      14              : !! COPYRIGHT
      15              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder, B. Amadon, J. Denier)
      16              : !!  This file is distributed under the terms of the
      17              : !!  GNU General Public License, see ~abinit/COPYING
      18              : !!  or http://www.gnu.org/copyleft/gpl.txt .
      19              : !!
      20              : !! NOTES
      21              : !!
      22              : !! SOURCE
      23              : 
      24              : #include "defs.h"
      25              : #define CTQMC_SLICE1 100
      26              : ! Coupe Sweeps en 100
      27              : #define CTQMC_SLICE2 100
      28              : ! Coupe modNoise1 en 2000
      29              : #define CTQMC_SEGME  1
      30              : #define CTQMC_ANTIS -2
      31              : #define CTQMC_ADDED  3
      32              : #define CTQMC_REMOV  4
      33              : #define CTQMC_DETSI  5
      34              : MODULE m_Ctqmcoffdiag
      35              : 
      36              :  USE m_Global
      37              :  USE m_GreenHyboffdiag
      38              :  USE m_BathOperatoroffdiag
      39              :  USE m_ImpurityOperator
      40              :  USE m_Stat
      41              :  USE m_FFTHyb
      42              :  USE m_OurRng
      43              :  use defs_basis
      44              :  USE_MPI
      45              : 
      46              :  IMPLICIT NONE
      47              : 
      48              :  public :: Ctqmcoffdiag_init
      49              :  public :: Ctqmcoffdiag_setParameters
      50              :  public :: Ctqmcoffdiag_setSweeps
      51              :  public :: Ctqmcoffdiag_setSeed
      52              :  public :: Ctqmcoffdiag_allocateAll
      53              :  public :: Ctqmcoffdiag_allocateOpt
      54              :  public :: Ctqmcoffdiag_setG0wTab
      55              :  public :: Ctqmcoffdiag_setU
      56              :  public :: Ctqmcoffdiag_clear
      57              :  public :: Ctqmcoffdiag_reset
      58              :  public :: Ctqmcoffdiag_setMu
      59              :  public :: Ctqmcoffdiag_computeF
      60              :  public :: Ctqmcoffdiag_run
      61              :  public :: Ctqmcoffdiag_tryAddRemove
      62              :  public :: Ctqmcoffdiag_trySwap
      63              :  public :: Ctqmcoffdiag_measN
      64              :  public :: Ctqmcoffdiag_measCorrelation
      65              :  public :: Ctqmcoffdiag_measPerturbation
      66              :  public :: Ctqmcoffdiag_getResult
      67              :  public :: Ctqmcoffdiag_symmetrizeGreen
      68              :  public :: Ctqmcoffdiag_getGreen
      69              :  public :: Ctqmcoffdiag_getD
      70              :  public :: Ctqmcoffdiag_getE
      71              :  public :: Ctqmcoffdiag_printAll
      72              :  public :: Ctqmcoffdiag_printQMC
      73              :  public :: Ctqmcoffdiag_printGreen
      74              :  public :: Ctqmcoffdiag_printD
      75              :  public :: Ctqmcoffdiag_printE
      76              :  public :: Ctqmcoffdiag_printPerturbation
      77              :  public :: Ctqmcoffdiag_printCorrelation
      78              :  public :: Ctqmcoffdiag_printSpectra
      79              :  public :: Ctqmcoffdiag_destroy
      80              :  public :: Ctqmcoffdiag_setMagmom
      81              : 
      82              : !!***
      83              : 
      84              : !!****t* m_Ctqmcoffdiag/Ctqmcoffdiag
      85              : !! NAME
      86              : !!  Ctqmcoffdiag
      87              : !!
      88              : !! FUNCTION
      89              : !!  This structured datatype contains the necessary data
      90              : !!
      91              : !! COPYRIGHT
      92              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
      93              : !!  This file is distributed under the terms of the
      94              : !!  GNU General Public License, see ~abinit/COPYING
      95              : !!  or http://www.gnu.org/copyleft/gpl.txt .
      96              : !!
      97              : !! SOURCE
      98              : 
      99              : TYPE Ctqmcoffdiag
     100              : 
     101              :   LOGICAL :: init = .FALSE.
     102              : ! Flag: is MC initialized
     103              : 
     104              :   LOGICAL :: set  = .FALSE.
     105              : ! Flag: ??
     106              : 
     107              :   LOGICAL :: setU = .FALSE.
     108              : ! Flag: is U Set ?
     109              : 
     110              :   LOGICAL :: inF  = .FALSE.
     111              : ! Flag: is hybridization fct in input ?
     112              : 
     113              :   LOGICAL :: done = .FALSE.
     114              : ! Flag: is MC terminated ?
     115              : 
     116              :   LOGICAL :: para = .FALSE.
     117              : ! Flag:  do we have parameters in input
     118              : 
     119              :   LOGICAL :: have_MPI = .FALSE.
     120              : ! Flag:
     121              : 
     122              :   INTEGER :: opt_movie = 0
     123              : !
     124              : 
     125              :   INTEGER :: opt_analysis = 0
     126              : ! correlations
     127              : 
     128              :   INTEGER :: opt_check = 0
     129              : ! various check 0
     130              : ! various check 1 impurity
     131              : ! various check 2 bath
     132              : ! various check 3 both
     133              : 
     134              :   INTEGER :: opt_order = 0
     135              : ! nb of segments max for analysis
     136              : 
     137              :   INTEGER :: opt_histo = 0
     138              : ! Enable histo calc.
     139              : 
     140              :   INTEGER :: opt_noise = 0
     141              : ! compute noise
     142              : 
     143              :   INTEGER :: opt_spectra = 0
     144              : ! markov chain FT (correlation time)
     145              : 
     146              :   INTEGER :: opt_levels = 0
     147              : ! do we have energy levels
     148              : 
     149              :   INTEGER :: opt_hybri_limit = 0
     150              : ! do we have limit of hybridization (yes=1)
     151              : 
     152              :   INTEGER :: opt_nondiag = 0
     153              : ! if opt_nondiag = 1 F is non diagonal.
     154              : 
     155              :   INTEGER :: prtopt = 1
     156              : ! printing
     157              : 
     158              :   INTEGER :: flavors
     159              : ! number of flavors
     160              : 
     161              :   INTEGER :: nspinor
     162              : ! number of spinor
     163              : 
     164              :   INTEGER :: measurements
     165              : !  The modulo used to measure the interaction energy and the number of electrons. Example : 2 means the measure is perform every two sweeps.
     166              : 
     167              :   INTEGER :: samples
     168              : ! nb of L points (dmftqmc_l)
     169              : 
     170              : ! INTEGER :: endDensity
     171              : ! second dimension of density allocatable array
     172              : 
     173              :   INTEGER(8) :: seed
     174              : !
     175              : 
     176              :   INTEGER :: sweeps
     177              : !
     178              : 
     179              :   INTEGER :: thermalization
     180              : !
     181              : 
     182              :   INTEGER :: ostream
     183              : ! output file
     184              : 
     185              :   INTEGER :: istream
     186              : ! input file
     187              : 
     188              :   INTEGER :: modNoise1
     189              : ! measure the noise each modNoise1
     190              : 
     191              :   INTEGER :: modNoise2
     192              : ! measure the noise each modNoise2
     193              : 
     194              :   INTEGER :: activeFlavor
     195              : ! orbital on which one do sth now
     196              : 
     197              :   INTEGER, DIMENSION(1:2) :: modGlobalMove
     198              : ! 1: global move each modglobalmove(1)
     199              : ! 2: we have done modglobalmove(2) for two different orbitals.
     200              : 
     201              :   INTEGER :: Wmax
     202              : ! Max freq for FT
     203              : 
     204              :   DOUBLE PRECISION, DIMENSION(1:6) :: stats
     205              : ! to now how many negative determinant, antisegments,seeme.e.twfs...j
     206              : 
     207              :   DOUBLE PRECISION :: swap
     208              : ! nb of successfull GM
     209              : 
     210              :   DOUBLE PRECISION :: signvalue
     211              : 
     212              :   INTEGER :: MY_COMM
     213              : !
     214              : 
     215              :   INTEGER :: rank
     216              : !
     217              : 
     218              :   INTEGER :: size
     219              : ! size of MY_COMM
     220              : 
     221              :   DOUBLE PRECISION :: runTime ! time for the run routine
     222              : !
     223              : 
     224              :   DOUBLE PRECISION :: beta
     225              : !
     226              : 
     227              :   DOUBLE PRECISION :: U
     228              : 
     229              :   DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: mu
     230              : ! levels
     231              : 
     232              :   COMPLEX(KIND=8), ALLOCATABLE, DIMENSION(:,:) :: hybri_limit
     233              : ! coeff A such that F=-A/(iwn)
     234              : 
     235              :   TYPE(GreenHyboffdiag)                        :: Greens
     236              : ! Green's function
     237              : 
     238              :   DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: measN
     239              : ! measure of occupations (3or4,flavor)
     240              : 
     241              :   DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:  ) :: measDE
     242              : !  (flavor,flavor) double occupancies
     243              : !  (1,1): total energy of correlation.
     244              : 
     245              :   DOUBLE PRECISION :: a_Noise
     246              : ! Noise a exp (-bx) for the  noise
     247              : 
     248              :   DOUBLE PRECISION :: b_Noise
     249              : ! Noise a exp (-bx) for the  noise
     250              : 
     251              :   DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:,:) :: abNoiseG   !(ab,tau,flavor)
     252              : ! Noise but for G
     253              : 
     254              :   TYPE(Vector)             , DIMENSION(1:2) :: measNoise
     255              :   TYPE(Vector), ALLOCATABLE, DIMENSION(:,:,:) :: measNoiseG       !(tau,flavor,mod)
     256              : ! accumulate each value relataed to measurenoise 1 2
     257              : 
     258              : !#ifdef CTCtqmcoffdiag_ANALYSIS
     259              : !  INTEGER                                     :: order
     260              :   DOUBLE PRECISION                            :: inv_dt
     261              : ! 1/(beta/L)
     262              : 
     263              :   DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:  ) :: measPerturbation
     264              : ! opt_order,nflavor
     265              : 
     266              :   DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: occup_histo_time
     267              : ! nflavor
     268              : 
     269              :   DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: occupconfig
     270              : ! 2**nflavor
     271              : 
     272              :   DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: suscep
     273              : ! samples
     274              : 
     275              :   DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: chi
     276              : ! samples
     277              : 
     278              :   DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: chicharge
     279              : ! samples
     280              : 
     281              :   DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: ntot
     282              : ! occupation total, t2g, eg
     283              : 
     284              :   DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:  ) :: meas_fullemptylines
     285              : ! opt_order,nflavor
     286              : 
     287              :   DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:,:) :: measCorrelation
     288              : ! segment,antisegment,nflavor,nflavor
     289              : 
     290              : !#endif
     291              : !#ifdef CTCtqmcoffdiag_CHECK
     292              :   DOUBLE PRECISION :: errorImpurity
     293              : ! check
     294              : 
     295              :   DOUBLE PRECISION :: errorBath
     296              : ! for check
     297              : 
     298              : !#endif
     299              :   TYPE(BathOperatoroffdiag)              :: Bath
     300              : 
     301              : 
     302              :   TYPE(ImpurityOperator)          :: Impurity
     303              : 
     304              :   DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: density
     305              : 
     306              : END TYPE Ctqmcoffdiag
     307              : !!***
     308              : 
     309              : !INTERFACE Ctqmcoffdiag_setG0w
     310              : !  MODULE PROCEDURE Ctqmcoffdiag_setG0wFile, Ctqmcoffdiag_setG0wTab
     311              : !END INTERFACE
     312              : 
     313              : CONTAINS
     314              : !!***
     315              : 
     316              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_init
     317              : !! NAME
     318              : !!  Ctqmcoffdiag_init
     319              : !!
     320              : !! FUNCTION
     321              : !!  Initialize the type Ctqmcoffdiag
     322              : !!  Allocate all the non optional variables
     323              : !!
     324              : !! COPYRIGHT
     325              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
     326              : !!  This file is distributed under the terms of the
     327              : !!  GNU General Public License, see ~abinit/COPYING
     328              : !!  or http://www.gnu.org/copyleft/gpl.txt .
     329              : !!
     330              : !! INPUTS
     331              : !!  op=ctqmc
     332              : !!  ostream=where to write
     333              : !!  istream=where to read the input parameters if so
     334              : !!  bFile=logical argument True if input is read from istream
     335              : !!  MY_COMM=mpi communicator for the CTQMC
     336              : !!  iBuffer=input parameters if bFile is false
     337              : !!
     338              : !! OUTPUT
     339              : !!
     340              : !! SIDE EFFECTS
     341              : !!
     342              : !! NOTES
     343              : !!
     344              : !! SOURCE
     345              : 
     346            0 : SUBROUTINE Ctqmcoffdiag_init(op, ostream, istream, bFile, MY_COMM, iBuffer)
     347              : 
     348              : 
     349              : #ifdef HAVE_MPI1
     350              : include 'mpif.h'
     351              : #endif
     352              : !Arguments ------------------------------------
     353              :   TYPE(Ctqmcoffdiag), INTENT(INOUT)                      :: op
     354              :   INTEGER  , INTENT(IN   )                      :: ostream
     355              :   INTEGER  , INTENT(IN   )                      :: istream
     356              :   LOGICAL  , INTENT(IN   )                      :: bFile
     357              :   DOUBLE PRECISION, DIMENSION(1:11), OPTIONAL, INTENT(IN) :: iBuffer
     358              :   INTEGER  , OPTIONAL, INTENT(IN   )                      :: MY_COMM
     359              : !Local variables ------------------------------
     360              : #ifdef HAVE_MPI
     361              :   INTEGER                                       :: ierr
     362              : #endif
     363              :   !INTEGER                                       :: iflavor
     364              : #ifdef __GFORTRAN__
     365              : !  INTEGER                                       :: pid
     366              : !  CHARACTER(LEN=5)                              :: Cpid
     367              : !
     368              : #endif
     369              :   DOUBLE PRECISION, DIMENSION(1:11)             :: buffer
     370              : 
     371            0 :   op%ostream = ostream
     372            0 :   op%istream = istream
     373              : 
     374              : ! --- RENICE ---
     375              : !#ifdef __GFORTRAN__
     376              : !  pid = GetPid()
     377              : !  WRITE(Cpid,'(I5)') pid
     378              : !  CALL SYSTEM('renice +19 '//TRIM(ADJUSTL(Cpid))//' > /dev/null')
     379              : !#endif
     380              : !! --- RENICE ---
     381              : 
     382            0 :   IF ( PRESENT(MY_COMM)) THEN
     383              : #ifdef HAVE_MPI
     384            0 :     op%have_MPI = .TRUE.
     385            0 :     op%MY_COMM = MY_COMM
     386            0 :     CALL MPI_Comm_rank(op%MY_COMM, op%rank, ierr)
     387            0 :     CALL MPI_Comm_size(op%MY_COMM, op%size, ierr)
     388              : #else
     389              :     CALL WARN("MPI is not used                                    ")
     390              :     op%have_MPI = .FALSE.
     391              :     op%MY_COMM = -1
     392              :     op%rank = 0
     393              :     op%size = 1
     394              : #endif
     395              :   ELSE
     396            0 :     op%have_MPI = .FALSE.
     397            0 :     op%MY_COMM = -1
     398            0 :     op%rank = 0
     399            0 :     op%size = 1
     400              :   END IF
     401              : 
     402              :   !IF ( op%rank .EQ. 0 ) THEN
     403              : !  WRITE(ostream,'(A20)') 'Job reniced with +19'
     404              :     !CALL FLUSH(ostream)
     405              :   !END IF
     406              : 
     407            0 :   IF ( bFile .EQV. .TRUE. ) THEN
     408            0 :     IF ( op%rank .EQ. 0 ) THEN
     409              : 
     410            0 :       READ(istream,*) buffer(1) !iseed
     411            0 :       READ(istream,*) buffer(2) !op%sweeps
     412            0 :       READ(istream,*) buffer(3) !op%thermalization
     413            0 :       READ(istream,*) buffer(4) !op%measurements
     414            0 :       READ(istream,*) buffer(5) !op%flavors
     415            0 :       READ(istream,*) buffer(6) !op%samples
     416            0 :       READ(istream,*) buffer(7) !op%beta
     417            0 :       READ(istream,*) buffer(8) !U
     418            0 :       READ(istream,*) buffer(9) !iTech
     419            0 :       READ(istream,*) buffer(11)!op%nspinor
     420              :       !READ(istream,*) buffer(9) !Wmax
     421              : !#ifdef CTCtqmcoffdiag_ANALYSIS
     422              :       !READ(istream,*) buffer(10) !order
     423              : !#endif
     424              :     END IF
     425              : 
     426              : #ifdef HAVE_MPI
     427            0 :     IF ( op%have_MPI .EQV. .TRUE. ) &
     428              :       CALL MPI_Bcast(buffer, 11, MPI_DOUBLE_PRECISION, 0,    &
     429            0 :                    op%MY_COMM, ierr)
     430              : #endif
     431            0 :   ELSE IF ( PRESENT(iBuffer) ) THEN
     432            0 :     buffer(1:11) = iBuffer(1:11)
     433              :   ELSE
     434            0 :     CALL ERROR("Ctqmcoffdiag_init : No input parameters                    ")
     435              :   END IF
     436              : 
     437            0 :   CALL Ctqmcoffdiag_setParameters(op, buffer)
     438              : 
     439            0 :   CALL Ctqmcoffdiag_allocateAll(op)
     440              : 
     441              :   CALL GreenHyboffdiag_init(op%Greens,op%samples, op%beta,INT(buffer(5)), &
     442            0 :   iTech=INT(buffer(9)),MY_COMM=op%MY_COMM)
     443              : 
     444              : 
     445              : !  op%seg_added    = 0.d0
     446              : !  op%anti_added   = 0.d0
     447              : !  op%seg_removed  = 0.d0
     448              : !  op%anti_removed = 0.d0
     449              : !  op%seg_sign     = 0.d0
     450              : !  op%anti_sign    = 0.d0
     451            0 :   op%stats(:)     = 0.d0
     452              :  ! write(std_out,*) "op%stats",op%stats
     453            0 :   op%signvalue    = 1.d0
     454              : !  op%signvaluecurrent    = 0.d0
     455              : !  op%signvaluemeas = 0.d0
     456            0 :   op%swap         = 0.d0
     457            0 :   op%runTime      = 0.d0
     458              : 
     459            0 :   CALL Vector_init(op%measNoise(1),op%sweeps/op%modNoise1)
     460            0 :   CALL Vector_init(op%measNoise(2),(op%sweeps/op%modNoise1+1)*CTQMC_SLICE2)
     461              :   !CALL Vector_init(op%measNoise(3),101)
     462              :   !CALL Vector_init(op%measNoise(4),101)
     463              : 
     464            0 :   op%set  = op%para .AND. op%inF
     465            0 :   op%done = .FALSE.
     466            0 :   op%init = .TRUE.
     467              : 
     468              : !#ifdef CTCtqmcoffdiag_CHECK
     469            0 :   op%errorImpurity = 0.d0
     470            0 :   op%errorBath     = 0.d0
     471              : !#endif
     472            0 : END SUBROUTINE Ctqmcoffdiag_init
     473              : !!***
     474              : 
     475              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_setParameters
     476              : !! NAME
     477              : !!  Ctqmcoffdiag_setParameters
     478              : !!
     479              : !! FUNCTION
     480              : !!  set all parameters and operators
     481              : !!
     482              : !! COPYRIGHT
     483              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
     484              : !!  This file is distributed under the terms of the
     485              : !!  GNU General Public License, see ~abinit/COPYING
     486              : !!  or http://www.gnu.org/copyleft/gpl.txt .
     487              : !!
     488              : !! INPUTS
     489              : !!  op=ctqmc
     490              : !!  buffer=input parameters
     491              : !!
     492              : !! OUTPUT
     493              : !!
     494              : !! SIDE EFFECTS
     495              : !!
     496              : !! NOTES
     497              : !!
     498              : !! SOURCE
     499              : 
     500            0 : SUBROUTINE Ctqmcoffdiag_setParameters(op,buffer)
     501              : 
     502              : !Arguments ------------------------------------
     503              :   TYPE(Ctqmcoffdiag), INTENT(INOUT)                         :: op
     504              :   DOUBLE PRECISION, DIMENSION(1:11), INTENT(IN   ) :: buffer
     505              : 
     506              : 
     507            0 :   op%thermalization = INT(buffer(3)) !op%thermalization
     508            0 :   CALL Ctqmcoffdiag_setSeed(op,INT(buffer(1)))
     509            0 :   CALL Ctqmcoffdiag_setSweeps(op,buffer(2))
     510              : 
     511            0 :   op%measurements   = INT(buffer(4)) !op%measurements
     512            0 :   op%flavors        = INT(buffer(5))
     513            0 :   op%samples        = INT(buffer(6)) !op%samples
     514            0 :   op%beta           = buffer(7)      !op%beta
     515            0 :   op%U              = buffer(8)      !U
     516            0 :   op%opt_nondiag    = INT(buffer(10))
     517            0 :   op%nspinor        = INT(buffer(11)) !op%nspinor
     518              : !  op%mu             = buffer(9)      !op%mu
     519              :   !op%Wmax           = INT(buffer(9)) !Freq
     520              : !#ifdef CTCtqmcoffdiag_ANALYSIS
     521              : !  op%order          = INT(buffer(10)) ! order
     522            0 :   op%inv_dt         = op%samples / op%beta
     523              : !#endif
     524              : 
     525              :   !CALL ImpurityOperator_init(op%Impurity,op%flavors,op%beta, op%samples)
     526            0 :   CALL ImpurityOperator_init(op%Impurity,op%flavors,op%beta)
     527            0 :   IF ( op%U .GE. 0.d0 ) THEN
     528            0 :     CALL ImpurityOperator_computeU(op%Impurity,op%U,0.d0)
     529            0 :     op%setU = .TRUE.
     530              :   END IF
     531              : !  op%mu = op%mu + op%Impurity%shift_mu
     532              : !sui!write(std_out,*) "op%opt_nondiag",op%opt_nondiag
     533            0 :   CALL BathOperatoroffdiag_init(op%Bath, op%flavors, op%samples, op%beta, INT(buffer(9)), op%opt_nondiag)
     534              : 
     535            0 :   op%para = .TRUE.
     536              : 
     537            0 : END SUBROUTINE Ctqmcoffdiag_setParameters
     538              : !!***
     539              : 
     540              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_setSweeps
     541              : !! NAME
     542              : !!  Ctqmcoffdiag_setSweeps
     543              : !!
     544              : !! FUNCTION
     545              : !!  set the number of sweeps
     546              : !!
     547              : !! COPYRIGHT
     548              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
     549              : !!  This file is distributed under the terms of the
     550              : !!  GNU General Public License, see ~abinit/COPYING
     551              : !!  or http://www.gnu.org/copyleft/gpl.txt .
     552              : !!
     553              : !! INPUTS
     554              : !!  op=ctqmc
     555              : !!  sweeps=asked sweeps
     556              : !!
     557              : !! OUTPUT
     558              : !!
     559              : !! SIDE EFFECTS
     560              : !!
     561              : !! NOTES
     562              : !!
     563              : !! SOURCE
     564              : 
     565            0 : SUBROUTINE Ctqmcoffdiag_setSweeps(op,sweeps)
     566              : 
     567              : !Arguments ------------------------------------
     568              :   TYPE(Ctqmcoffdiag)         , INTENT(INOUT) :: op
     569              :   DOUBLE PRECISION  , INTENT(IN   ) :: sweeps
     570              : 
     571            0 :   op%sweeps = NINT(sweeps / DBLE(op%size))
     572              : !  !write(std_out,*) op%sweeps,NINT(sweeps / DBLE(op%size)),ANINT(sweeps/DBLE(op%size))
     573            0 :   IF ( DBLE(op%sweeps) .NE. ANINT(sweeps/DBLE(op%size)) ) &
     574            0 :     CALL ERROR("Ctqmcoffdiag_setSweeps : sweeps is negative or too big     ")
     575            0 :   IF ( op%sweeps .LT. 2*CTQMC_SLICE1 ) THEN  !202
     576            0 :     CALL WARNALL("Ctqmcoffdiag_setSweeps : # sweeps automtically changed     ")
     577            0 :     op%sweeps = 2*CTQMC_SLICE1
     578              : !  ELSE IF ( op%sweeps .LT. op%thermalization ) THEN
     579              : !    CALL WARNALL("Ctqmcoffdiag_setSweeps : Thermalization > sweeps / cpu -> auto fix")
     580              : !    op%sweeps = op%thermalization
     581              :   END IF
     582            0 :   IF ( DBLE(NINT(DBLE(op%sweeps)*DBLE(op%size)/DBLE(CTQMC_SLICE1))) .NE.  &
     583            0 :   ANINT(DBLE(op%sweeps)*DBLE(op%size)/DBLE(CTQMC_SLICE1)) ) THEN
     584            0 :     op%modNoise1 = op%sweeps
     585              :   ELSE
     586            0 :     op%modNoise1    = MIN(op%sweeps,INT(DBLE(op%sweeps)*DBLE(op%size) / DBLE(CTQMC_SLICE1))) !101
     587              :   END IF
     588            0 :   op%modNoise2    = MAX(op%modNoise1 / CTQMC_SLICE2, 1)   ! 100
     589              : !  op%modGlobalMove(1) = op%thermalization / 10 + 1
     590              : !  op%modGlobalMove(2) = 0
     591              : 
     592            0 : END SUBROUTINE Ctqmcoffdiag_setSweeps
     593              : !!***
     594              : 
     595              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_setSeed
     596              : !! NAME
     597              : !!  Ctqmcoffdiag_setSeed
     598              : !!
     599              : !! FUNCTION
     600              : !!  initialize random number generator
     601              : !!
     602              : !! COPYRIGHT
     603              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
     604              : !!  This file is distributed under the terms of the
     605              : !!  GNU General Public License, see ~abinit/COPYING
     606              : !!  or http://www.gnu.org/copyleft/gpl.txt .
     607              : !!
     608              : !! INPUTS
     609              : !!  op=ctqmc
     610              : !!  iseed=seed from imput
     611              : !!
     612              : !! OUTPUT
     613              : !!
     614              : !! SIDE EFFECTS
     615              : !!
     616              : !! NOTES
     617              : !!
     618              : !! SOURCE
     619              : 
     620            0 : SUBROUTINE Ctqmcoffdiag_setSeed(op,iseed)
     621              : 
     622              : !Arguments ------------------------------------
     623              :   TYPE(Ctqmcoffdiag), INTENT(INOUT)           :: op
     624              :   INTEGER  , INTENT(IN   )           :: iseed
     625              : !Local variables ------------------------------
     626              :   !INTEGER                            :: n
     627              :   !INTEGER                            :: i
     628              :   !INTEGER, DIMENSION(:), ALLOCATABLE :: seed
     629              : 
     630              : 
     631              :   !CALL RANDOM_SEED(size = n)
     632              :   !MALLOC(seed,(n))
     633              :   !seed =  iseed + (/ (i - 1, i = 1, n) /)
     634              : 
     635              :   !CALL RANDOM_SEED(PUT = seed+op%rank)
     636              : 
     637              :   !FREE(seed)
     638              : 
     639            0 :   op%seed=INT(iseed+op%rank,8)
     640              : 
     641            0 : END SUBROUTINE Ctqmcoffdiag_setSeed
     642              : !!***
     643              : 
     644              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_allocateAll
     645              : !! NAME
     646              : !!  Ctqmcoffdiag_allocateAll
     647              : !!
     648              : !! FUNCTION
     649              : !!  Allocate all non option variables
     650              : !!
     651              : !! COPYRIGHT
     652              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
     653              : !!  This file is distributed under the terms of the
     654              : !!  GNU General Public License, see ~abinit/COPYING
     655              : !!  or http://www.gnu.org/copyleft/gpl.txt .
     656              : !!
     657              : !! INPUTS
     658              : !!  op=ctqmc
     659              : !!
     660              : !! OUTPUT
     661              : !!
     662              : !! SIDE EFFECTS
     663              : !!
     664              : !! NOTES
     665              : !!
     666              : !! SOURCE
     667              : 
     668            0 : SUBROUTINE Ctqmcoffdiag_allocateAll(op)
     669              : 
     670              : !Arguments ------------------------------------
     671              :   TYPE(Ctqmcoffdiag), INTENT(INOUT) :: op
     672              : !Local variables ------------------------------
     673              :   INTEGER                  :: flavors
     674              : 
     675            0 :   IF ( .NOT. op%para ) &
     676            0 :     CALL ERROR("Ctqmcoffdiag_allocateAll : Ctqmcoffdiag_setParameters never called  ")
     677              : 
     678            0 :   flavors = op%flavors
     679              : 
     680              : 
     681              : !  number of electrons
     682            0 :   FREEIF(op%measN)
     683            0 :   MALLOC(op%measN,(1:4,1:flavors))
     684            0 :   op%measN = 0.d0
     685              : 
     686              : !  double occupancies
     687            0 :   FREEIF(op%measDE)
     688            0 :   MALLOC(op%measDE,(1:flavors,1:flavors) )
     689            0 :   op%measDE = 0.d0
     690              : 
     691            0 :   FREEIF(op%mu)
     692              : #ifdef FC_LLVM
     693              :   ! LLVM 16 doesn't recognize this macro here
     694              :   MALLOC(op%mu, (1:flavors) )
     695              : #else
     696            0 :   MALLOC(op%mu, (1:flavors))
     697              : #endif
     698            0 :   op%mu = 0.d0
     699            0 :   FREEIF(op%hybri_limit)
     700              : #ifdef FC_LLVM
     701              :   ! LLVM 16 doesn't recognize this macro here
     702              :   MALLOC(op%hybri_limit, (flavors,flavors) )
     703              : #else
     704            0 :   MALLOC(op%hybri_limit, (flavors,flavors))
     705              : #endif
     706            0 :   op%hybri_limit = czero
     707            0 : END SUBROUTINE Ctqmcoffdiag_allocateAll
     708              : !!***
     709              : 
     710              : !#ifdef CTCtqmcoffdiag_ANALYSIS
     711              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_allocateOpt
     712              : !! NAME
     713              : !!  Ctqmcoffdiag_allocateOpt
     714              : !!
     715              : !! FUNCTION
     716              : !!  allocate all option variables
     717              : !!
     718              : !! COPYRIGHT
     719              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
     720              : !!  This file is distributed under the terms of the
     721              : !!  GNU General Public License, see ~abinit/COPYING
     722              : !!  or http://www.gnu.org/copyleft/gpl.txt .
     723              : !!
     724              : !! INPUTS
     725              : !!  op=ctqmc
     726              : !!
     727              : !! OUTPUT
     728              : !!
     729              : !! SIDE EFFECTS
     730              : !!
     731              : !! NOTES
     732              : !!
     733              : !! SOURCE
     734              : 
     735            0 : SUBROUTINE Ctqmcoffdiag_allocateOpt(op)
     736              : 
     737              : !Arguments ------------------------------------
     738              :   TYPE(Ctqmcoffdiag), INTENT(INOUT) :: op
     739              : !Local variables ------------------------------
     740              :   INTEGER :: i
     741              :   INTEGER :: j
     742              :   INTEGER :: k
     743              : 
     744            0 :   IF ( .NOT. op%para ) &
     745            0 :     CALL ERROR("Ctqmcoffdiag_allocateOpt : Ctqmcoffdiag_setParameters never called  ")
     746              : 
     747            0 :   IF ( op%opt_analysis .EQ. 1 ) THEN
     748            0 :     FREEIF(op%measCorrelation)
     749            0 :     MALLOC(op%measCorrelation,(1:op%samples+1,1:3,1:op%flavors))
     750            0 :     op%measCorrelation = 0.d0
     751              :   END IF
     752              : 
     753            0 :   IF ( op%opt_order .GT. 0 ) THEN
     754            0 :     FREEIF(op%measPerturbation)
     755            0 :     MALLOC(op%measPerturbation,(1:op%opt_order,1:op%flavors))
     756            0 :     op%measPerturbation = 0.d0
     757            0 :     FREEIF(op%meas_fullemptylines)
     758            0 :     MALLOC(op%meas_fullemptylines,(2,1:op%flavors))
     759            0 :     op%meas_fullemptylines = 0.d0
     760              :   END IF
     761              : 
     762            0 :   IF ( op%opt_histo .GT. 0 ) THEN
     763            0 :     FREEIF(op%occup_histo_time)
     764            0 :     MALLOC(op%occup_histo_time,(1:op%flavors+1))
     765            0 :     op%occup_histo_time= 0.d0
     766            0 :     FREEIF(op%occupconfig)
     767            0 :     MALLOC(op%occupconfig,(1:2**op%flavors))
     768            0 :     op%occupconfig= 0.d0
     769            0 :     FREEIF(op%suscep)
     770            0 :     MALLOC(op%suscep,(1:3,1:op%samples))
     771            0 :     op%suscep= 0.d0
     772            0 :     FREEIF(op%chi)
     773            0 :     MALLOC(op%chi,(1:3,1:op%samples))
     774            0 :     op%chi= 0.d0
     775            0 :     FREEIF(op%chicharge)
     776            0 :     MALLOC(op%chicharge,(1:3,1:op%samples))
     777            0 :     op%chicharge= 0.d0
     778            0 :     FREEIF(op%ntot)
     779            0 :     MALLOC(op%ntot,(1:3))
     780            0 :     op%ntot= 0.d0
     781              :   END IF
     782              : 
     783            0 :   IF ( op%opt_noise .EQ. 1 ) THEN
     784            0 :     IF ( ALLOCATED(op%measNoiseG) ) THEN
     785            0 :       DO i=1,2
     786            0 :         DO j = 1, op%flavors
     787            0 :           DO k= 1, op%samples+1
     788            0 :             CALL Vector_destroy(op%measNoiseG(k,j,i))
     789              :           END DO
     790              :         END DO
     791              :       END DO
     792            0 :       DT_FREE(op%measNoiseG)
     793              :     END IF
     794            0 :     DT_MALLOC(op%measNoiseG,(1:op%samples+1,1:op%flavors,1:2))
     795              :     !DO i=1,2
     796            0 :       DO j = 1, op%flavors
     797            0 :         DO k= 1, op%samples+1
     798            0 :           CALL Vector_init(op%measNoiseG(k,j,1),CTQMC_SLICE1)
     799              :         END DO
     800              :       END DO
     801            0 :       DO j = 1, op%flavors
     802            0 :         DO k= 1, op%samples+1
     803            0 :           CALL Vector_init(op%measNoiseG(k,j,2),CTQMC_SLICE1*CTQMC_SLICE2+1) ! +1 pour etre remplacer ceil
     804              :         END DO
     805              :       END DO
     806              :     !END DO
     807            0 :     FREEIF(op%abNoiseG)
     808            0 :     MALLOC(op%aBNoiseG,(1:2,1:op%samples+1,op%flavors))
     809            0 :     op%abNoiseG = 0.d0
     810              :   END IF
     811              : 
     812            0 :   IF (op%opt_spectra .GE. 1 ) THEN
     813            0 :     FREEIF(op%density)
     814              :     !MALLOC(op%density,(1:op%thermalization,1:op%flavors))
     815            0 :     i = CEILING(DBLE(op%thermalization+op%sweeps)/DBLE(op%measurements*op%opt_spectra))
     816            0 :     MALLOC(op%density,(1:op%flavors+1,1:i))
     817            0 :     op%density = 0.d0
     818              : !   op%endDensity=i
     819              : !ENDPROBLEM
     820              : 
     821              :   END IF
     822              : !#endif
     823            0 : END SUBROUTINE Ctqmcoffdiag_allocateOpt
     824              : !!***
     825              : 
     826              : !SUBROUTINE Ctqmcoffdiag_setG0wFile(op,istream,opt_fk)
     827              : !include 'mpif.h'
     828              : !#endif
     829              : !  TYPE(Ctqmcoffdiag), INTENT(INOUT)                      :: op
     830              : !  INTEGER  , INTENT(IN   )                      :: istream
     831              : !  INTEGER                         , INTENT(IN ) :: opt_fk
     832              : !!  DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE :: F
     833              : !  COMPLEX*16      , DIMENSION(:,:), ALLOCATABLE :: Gomega
     834              : !  INTEGER                                       :: flavors
     835              : !  INTEGER                                       :: iflavor
     836              : !  INTEGER                                       :: iomega
     837              : !  TYPE(GreenHyboffdiag) :: temp
     838              : !#ifdef HAVE_MPI
     839              : !  INTEGER                                       :: ierr
     840              : !#endif
     841              : !
     842              : !  IF ( .NOT. op%para ) &
     843              : !    CALL ERROR("Ctqmcoffdiag_setG0wFile : Ctqmcoffdiag_setParameters never called   ")
     844              : !
     845              : !  flavors = op%flavors
     846              : !
     847              : !!  MALLOC(F,(1:op%samples+1,1:flavors))
     848              : !  MALLOC(Gomega,(1:op%Wmax,1:flavors))
     849              : !  IF ( op%have_MPI .EQV. .TRUE. ) THEN
     850              : !    CALL GreenHyboffdiag_init(temp, op%samples, op%beta, op%MY_COMM)
     851              : !  ELSE
     852              : !    CALL GreenHyboffdiag_init(temp, op%samples, op%beta)
     853              : !  END IF
     854              : !
     855              : !  DO iflavor = 1, flavors
     856              : !    IF ( op%rank .EQ. 0 ) THEN
     857              : !      DO iomega=1, op%Wmax
     858              : !        READ(istream,*) Gomega(iomega,iflavor)
     859              : !      END DO
     860              : !    END IF
     861              : !  END DO
     862              : !
     863              : !#ifdef HAVE_MPI
     864              : !  CALL MPI_Bcast(Gomega, op%Wmax*flavors, MPI_DOUBLE_COMPLEX, 0,    &
     865              : !                 op%MY_COMM, ierr)
     866              : !#endif
     867              : !
     868              : !!  CALL GreenHyboffdiag_backFourier(temp,Gomega(:,1))
     869              : !!  WRITE(10,*) Gomega(:,1)
     870              : !!  CALL GreenHyboffdiag_print(temp)
     871              : !!  CALL GreenHyboffdiag_forFourier (temp,Gomega(:,1))
     872              : !!  WRITE(11,*) Gomega(:,1)
     873              : !  CALL Ctqmcoffdiag_setG0wTab(op,Gomega,opt_fk)
     874              : !!  CALL Ctqmcoffdiag_computeF(op,Gomega, op%Wmax, F) ! mu is changed
     875              : !  FREE(Gomega)
     876              : !!  CALL BathOperatoroffdiag_setF(op%Bath, F)
     877              : !!  CALL BathOperatoroffdiag_printF(op%Bath)
     878              : !!  FREE(F)
     879              : !
     880              : !!  stop
     881              : !!  op%inF = .TRUE.
     882              : !!  op%set = .TRUE.
     883              : !
     884              : !END SUBROUTINE Ctqmcoffdiag_setG0wFile
     885              : !!***
     886              : 
     887              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_setG0wTab
     888              : !! NAME
     889              : !!  Ctqmcoffdiag_setG0wTab
     890              : !!
     891              : !! FUNCTION
     892              : !!  Set Gow from input array
     893              : !!
     894              : !! COPYRIGHT
     895              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
     896              : !!  This file is distributed under the terms of the
     897              : !!  GNU General Public License, see ~abinit/COPYING
     898              : !!  or http://www.gnu.org/copyleft/gpl.txt .
     899              : !!
     900              : !! INPUTS
     901              : !!  op=ctqmc
     902              : !!  Gomega=G0w
     903              : !!  opt_fk=F is already inversed with out iwn
     904              : !!
     905              : !! OUTPUT
     906              : !!
     907              : !! SIDE EFFECTS
     908              : !!
     909              : !! NOTES
     910              : !!
     911              : !! SOURCE
     912              : 
     913            0 : SUBROUTINE Ctqmcoffdiag_setG0wTab(op,Gomega,opt_fk,fname)
     914              : 
     915              : !Arguments ------------------------------------
     916              :   TYPE(Ctqmcoffdiag), INTENT(INOUT)                      :: op
     917              :   COMPLEX(KIND=8), DIMENSION(:,:,:), INTENT(IN ) :: Gomega
     918              :   INTEGER                         , INTENT(IN ) :: opt_fk
     919              : !Local variable -------------------------------
     920              :   CHARACTER(LEN=fnlen), INTENT(INOUT)             :: fname
     921              :   DOUBLE PRECISION, DIMENSION(:,:,:), ALLOCATABLE :: F
     922              : 
     923            0 :   IF ( .NOT. op%para ) &
     924            0 :     CALL ERROR("Ctqmcoffdiag_setG0wTab : Ctqmcoffdiag_setParameters never called    ")
     925              : 
     926            0 :   MALLOC(F,(1:op%samples+1,1:op%flavors,1:op%flavors))
     927            0 :   CALL Ctqmcoffdiag_computeF(op,Gomega, F, opt_fk,fname)  ! mu is changed
     928              :  !write(6,*) "eee111"
     929            0 :   CALL BathOperatoroffdiag_setF(op%Bath, F)
     930              :  ! CALL BathOperatoroffdiag_printF(op%Bath,333)
     931              :  !write(6,*) "eee"
     932            0 :   FREE(F)
     933              : 
     934            0 :   op%inF = .TRUE.
     935            0 :   op%set = .TRUE.
     936              : 
     937            0 : END SUBROUTINE Ctqmcoffdiag_setG0wTab
     938              : !!***
     939              : 
     940              : !SUBROUTINE Ctqmcoffdiag_setFwK(op,Gomega)
     941              : !  COMPLEX*16      , DIMENSION(:,:), INTENT(IN ) :: Gomega
     942              : !  DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE :: F
     943              : !
     944              : !  IF ( .NOT. op%para ) &
     945              : !    CALL ERROR("Ctqmcoffdiag_setG0wTab : Ctqmcoffdiag_setParameters never called    ")
     946              : !
     947              : !  MALLOC(F,(1:op%samples+1,1:op%flavors))
     948              : !  CALL Ctqmcoffdiag_computeFK(op,Gomega, op%Wmax, F)  ! mu is changed
     949              : !  CALL BathOperatoroffdiag_setF(op%Bath, F)
     950              : !  CALL BathOperatoroffdiag_printF(op%Bath)
     951              : !  FREE(F)
     952              : !
     953              : !  op%inF = .TRUE.
     954              : !  op%set = .TRUE.
     955              : !
     956              : !END SUBROUTINE Ctqmcoffdiag_setFwK
     957              : !!***
     958              : 
     959              : !SUBROUTINE Ctqmcoffdiag_setBand(op, mu, U)
     960              : !  DOUBLE PRECISION, INTENT(IN   ) :: mu
     961              : !  DOUBLE PRECISION, INTENT(IN   ) :: U
     962              : !
     963              : !  IF ( .NOT. op%para ) &
     964              : !    CALL ERROR("Ctqmcoffdiag_setBand : Ctqmcoffdiag_setParameters never called      ")
     965              : !
     966              : !  CALL ImpurityOperator_setU(op%Impurity, U, 0.d0)
     967              : !  !op%mu = mu + op%Impurity%shift_mu
     968              : !END SUBROUTINE Ctqmcoffdiag_setBand
     969              : !!***
     970              : 
     971              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_setU
     972              : !! NAME
     973              : !!  Ctqmcoffdiag_setU
     974              : !!
     975              : !! FUNCTION
     976              : !!  set the interaction matrix
     977              : !!
     978              : !! COPYRIGHT
     979              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
     980              : !!  This file is distributed under the terms of the
     981              : !!  GNU General Public License, see ~abinit/COPYING
     982              : !!  or http://www.gnu.org/copyleft/gpl.txt .
     983              : !!
     984              : !! INPUTS
     985              : !!  op=ctqmc
     986              : !!  matU=interaction matrix
     987              : !!
     988              : !! OUTPUT
     989              : !!
     990              : !! SIDE EFFECTS
     991              : !!
     992              : !! NOTES
     993              : !!
     994              : !! SOURCE
     995              : 
     996            0 : SUBROUTINE Ctqmcoffdiag_setU(op,matU)
     997              : 
     998              : !Arguments ------------------------------------
     999              :   TYPE(Ctqmcoffdiag), INTENT(INOUT) ::op
    1000              : !Local variables ------------------------------
    1001              :   DOUBLE PRECISION, DIMENSION(:,:), INTENT(IN) :: matU
    1002              : 
    1003            0 :   IF ( SIZE(matU) .NE. op%flavors*op%flavors ) &
    1004            0 :     CALL ERROR("Ctqmcoffdiag_setU : Wrong interaction matrix (size)        ")
    1005              : 
    1006            0 :   CALL ImpurityOperator_setUmat(op%Impurity, matU)
    1007            0 :   op%setU = .TRUE.
    1008            0 : END SUBROUTINE Ctqmcoffdiag_setU
    1009              : !!***
    1010              : 
    1011              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_clear
    1012              : !! NAME
    1013              : !!  Ctqmcoffdiag_clear
    1014              : !!
    1015              : !! FUNCTION
    1016              : !!  clear a ctqmc run
    1017              : !!
    1018              : !! COPYRIGHT
    1019              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
    1020              : !!  This file is distributed under the terms of the
    1021              : !!  GNU General Public License, see ~abinit/COPYING
    1022              : !!  or http://www.gnu.org/copyleft/gpl.txt .
    1023              : !!
    1024              : !! INPUTS
    1025              : !!  op=ctqmc
    1026              : !!
    1027              : !! OUTPUT
    1028              : !!
    1029              : !! SIDE EFFECTS
    1030              : !!
    1031              : !! NOTES
    1032              : !!
    1033              : !! SOURCE
    1034              : 
    1035            0 : SUBROUTINE Ctqmcoffdiag_clear(op)
    1036              : 
    1037              : !Arguments ------------------------------------
    1038              :   TYPE(Ctqmcoffdiag), INTENT(INOUT) :: op
    1039              : !Local variables ------------------------------
    1040              :   INTEGER :: i
    1041              :   INTEGER :: j
    1042              :   INTEGER :: k
    1043              : 
    1044            0 :   op%measN(1,:) = 0.d0
    1045            0 :   op%measN(2,:) = 0.d0
    1046              :   !Do not set measN(3,:) to 0 to avoid erasing N between therm and ctqmc
    1047            0 :   op%measN(4,:) = 0.d0
    1048            0 :   op%measDE = 0.d0
    1049              : !  op%seg_added    = 0.d0
    1050              : !  op%anti_added   = 0.d0
    1051              : !  op%seg_removed  = 0.d0
    1052              : !  op%anti_removed = 0.d0
    1053              : !  op%seg_sign     = 0.d0
    1054              : !  op%anti_sign    = 0.d0
    1055            0 :   op%stats(:)     = 0.d0
    1056              : !  op%signvaluecurrent    = 0.d0
    1057              : !  op%signvaluemeas    = 0.d0
    1058            0 :   op%swap         = 0.d0
    1059            0 :   op%runTime      = 0.d0
    1060            0 :   op%modGlobalMove(2) = 0
    1061            0 :   CALL Vector_clear(op%measNoise(1))
    1062            0 :   CALL Vector_clear(op%measNoise(2))
    1063              : !#ifdef CTCtqmcoffdiag_CHECK
    1064            0 :   op%errorImpurity = 0.d0
    1065            0 :   op%errorBath     = 0.d0
    1066              : !#endif
    1067            0 :   CALL GreenHyboffdiag_clear(op%Greens)
    1068              : !#ifdef CTCtqmcoffdiag_ANALYSIS
    1069            0 :   IF ( op%opt_analysis .EQ. 1 .AND. ALLOCATED(op%measCorrelation) ) &
    1070            0 :     op%measCorrelation = 0.d0
    1071            0 :   IF ( op%opt_order .GT. 0 .AND. ALLOCATED(op%measPerturbation) ) &
    1072            0 :     op%measPerturbation = 0.d0
    1073            0 :   IF ( op%opt_order .GT. 0 .AND. ALLOCATED(op%meas_fullemptylines) ) &
    1074            0 :     op%meas_fullemptylines = 0.d0
    1075            0 :   IF ( op%opt_noise .EQ. 1 .AND. ALLOCATED(op%measNoiseG) ) THEN
    1076            0 :     DO i=1,2
    1077            0 :       DO j = 1, op%flavors
    1078            0 :         DO k= 1, op%samples+1
    1079            0 :           CALL Vector_clear(op%measNoiseG(k,j,i))
    1080              :         END DO
    1081              :       END DO
    1082              :     END DO
    1083              :     !DO j = 1, op%flavors
    1084              :     !  CALL GreenHyboffdiag_clear(op%Greens(j))
    1085              :     !END DO
    1086              :   END IF
    1087              : !#endif
    1088            0 : END SUBROUTINE Ctqmcoffdiag_clear
    1089              : !!***
    1090              : 
    1091              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_reset
    1092              : !! NAME
    1093              : !!  Ctqmcoffdiag_reset
    1094              : !!
    1095              : !! FUNCTION
    1096              : !!  reset a ctqmc simulation
    1097              : !!
    1098              : !! COPYRIGHT
    1099              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
    1100              : !!  This file is distributed under the terms of the
    1101              : !!  GNU General Public License, see ~abinit/COPYING
    1102              : !!  or http://www.gnu.org/copyleft/gpl.txt .
    1103              : !!
    1104              : !! INPUTS
    1105              : !!  op=ctqmc
    1106              : !!
    1107              : !! OUTPUT
    1108              : !!
    1109              : !! SIDE EFFECTS
    1110              : !!
    1111              : !! NOTES
    1112              : !!
    1113              : !! SOURCE
    1114              : 
    1115            0 : SUBROUTINE Ctqmcoffdiag_reset(op)
    1116              : 
    1117              : !Arguments ------------------------------------
    1118              :   TYPE(Ctqmcoffdiag), INTENT(INOUT) :: op
    1119              : !Local variables ------------------------------
    1120              :   !INTEGER                  :: iflavor
    1121              :   DOUBLE PRECISION         :: sweeps
    1122              : 
    1123            0 :   CALL GreenHyboffdiag_reset(op%Greens)
    1124            0 :   CALL Ctqmcoffdiag_clear(op)
    1125            0 :   CALL ImpurityOperator_reset(op%Impurity)
    1126            0 :   CALL BathOperatoroffdiag_reset    (op%Bath)
    1127            0 :   op%measN(3,:) = 0.d0
    1128              :   !complete restart -> measN=0
    1129            0 :   op%done = .FALSE.
    1130            0 :   op%set  = .FALSE.
    1131            0 :   op%inF  = .FALSE.
    1132            0 :   op%opt_movie = 0
    1133            0 :   op%opt_analysis = 0
    1134            0 :   op%opt_order = 0
    1135            0 :   op%opt_check = 0
    1136            0 :   op%opt_noise = 0
    1137            0 :   op%opt_spectra = 0
    1138            0 :   op%opt_levels = 0
    1139            0 :   sweeps = DBLE(op%sweeps)*DBLE(op%size)
    1140            0 :   CALL Ctqmcoffdiag_setSweeps(op, sweeps)
    1141              : !#ifdef HAVE_MPI
    1142              : !  CALL MPI_BARRIER(op%MY_COMM,iflavor)
    1143              : !  IF ( op%rank .EQ. 0 ) &
    1144              : !#endif
    1145              : !  WRITE(op%ostream,'(A9)') "QMC reset"
    1146              : !  CALL FLUSH(op%ostream)
    1147            0 : END SUBROUTINE Ctqmcoffdiag_reset
    1148              : !!***
    1149              : 
    1150              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_setMu
    1151              : !! NAME
    1152              : !!  Ctqmcoffdiag_setMu
    1153              : !!
    1154              : !! FUNCTION
    1155              : !!  impose energy levels
    1156              : !!
    1157              : !! COPYRIGHT
    1158              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
    1159              : !!  This file is distributed under the terms of the
    1160              : !!  GNU General Public License, see ~abinit/COPYING
    1161              : !!  or http://www.gnu.org/copyleft/gpl.txt .
    1162              : !!
    1163              : !! INPUTS
    1164              : !!  op=ctqmc
    1165              : !!  levels=energy levels vector
    1166              : !!
    1167              : !! OUTPUT
    1168              : !!  argout(sizeout)=description
    1169              : !!
    1170              : !! SIDE EFFECTS
    1171              : !!
    1172              : !! NOTES
    1173              : !!
    1174              : !! SOURCE
    1175              : 
    1176            0 : SUBROUTINE Ctqmcoffdiag_setMu(op, levels)
    1177              : 
    1178              : !Arguments ------------------------------------
    1179              :   TYPE(Ctqmcoffdiag)                     , INTENT(INOUT) :: op
    1180              :   DOUBLE PRECISION, DIMENSION(:), INTENT(IN   ) :: levels
    1181              : 
    1182            0 :   IF ( op%flavors .NE. SIZE(levels,1) ) &
    1183            0 :     CALL WARNALL("Ctqmcoffdiag_setMu : Taking energy levels from weiss G(iw)")
    1184              : 
    1185            0 :   op%mu(:)=-levels(:)  ! levels = \epsilon_j - \mu
    1186              :   !op%mu =\tilde{\mu} = \mu -\epsilon_j
    1187            0 :   op%opt_levels = 1
    1188            0 : END SUBROUTINE Ctqmcoffdiag_setMu
    1189              : !!***
    1190              : 
    1191              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_sethybri_limit
    1192              : !! NAME
    1193              : !!  Ctqmcoffdiag_sethybri_limit
    1194              : !!
    1195              : !! FUNCTION
    1196              : !!  use coefficient A such that F=-A/(iwn) given by DMFT code.
    1197              : !!
    1198              : !! COPYRIGHT
    1199              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
    1200              : !!  This file is distributed under the terms of the
    1201              : !!  GNU General Public License, see ~abinit/COPYING
    1202              : !!  or http://www.gnu.org/copyleft/gpl.txt .
    1203              : !!
    1204              : !! INPUTS
    1205              : !!  hybri_limit(nflavor,nflavor)=contains the limit for each couple of flavors
    1206              : !!
    1207              : !! OUTPUT
    1208              : !!  argout(sizeout)=description
    1209              : !!
    1210              : !! SIDE EFFECTS
    1211              : !!  op(Ctqmcoffdiag_type) = is the ctqmc main variable
    1212              : !!           op&limit is now filled
    1213              : !! NOTES
    1214              : !!
    1215              : !! SOURCE
    1216              : 
    1217            0 : SUBROUTINE Ctqmcoffdiag_sethybri_limit(op, hybri_limit)
    1218              : 
    1219              : !Arguments ------------------------------------
    1220              :   TYPE(Ctqmcoffdiag)                     , INTENT(INOUT) :: op
    1221              :   COMPLEX(KIND=8) , DIMENSION(:,:),  INTENT(IN ) :: hybri_limit
    1222              : 
    1223            0 :   IF ( op%flavors .NE. SIZE(hybri_limit,1) ) &
    1224            0 :     CALL ERROR("Error in sethybri_limit")
    1225              : 
    1226            0 :   op%hybri_limit(:,:)=hybri_limit(:,:)
    1227            0 :   op%opt_hybri_limit = 1
    1228            0 : END SUBROUTINE Ctqmcoffdiag_sethybri_limit
    1229              : !!***
    1230              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_computeF
    1231              : !! NAME
    1232              : !!  Ctqmcoffdiag_computeF
    1233              : !!
    1234              : !! FUNCTION
    1235              : !!  Compute the hybridization function
    1236              : !!
    1237              : !! COPYRIGHT
    1238              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
    1239              : !!  This file is distributed under the terms of the
    1240              : !!  GNU General Public License, see ~abinit/COPYING
    1241              : !!  or http://www.gnu.org/copyleft/gpl.txt .
    1242              : !!
    1243              : !! INPUTS
    1244              : !!  op=ctqmc
    1245              : !!  Gomega=G0 to compute F
    1246              : !!  opt_fk=What is Gomega
    1247              : !!
    1248              : !! OUTPUT
    1249              : !!  F=hybridization function
    1250              : !!
    1251              : !! SIDE EFFECTS
    1252              : !!
    1253              : !! NOTES
    1254              : !!
    1255              : !! SOURCE
    1256              : 
    1257            0 : SUBROUTINE Ctqmcoffdiag_computeF(op, Gomega, F, opt_fk,fname)
    1258              : 
    1259              :  use m_hide_lapack,  only : xginv
    1260              : !Arguments ------------------------------------
    1261              :   TYPE(Ctqmcoffdiag)                       , INTENT(INOUT) :: op
    1262              :   COMPLEX(KIND=8), DIMENSION(:,:,:), INTENT(IN   ) :: Gomega
    1263              :   !INTEGER                         , INTENT(IN   ) :: Wmax
    1264              :   DOUBLE PRECISION, DIMENSION(:,:,:), INTENT(INOUT) :: F
    1265              :   INTEGER                         , INTENT(IN   ) :: opt_fk
    1266              :   CHARACTER(LEN=fnlen), INTENT(INOUT)             :: fname
    1267              : !Local variables ------------------------------
    1268              :   INTEGER                                         :: flavors
    1269              :   INTEGER                                         :: samples
    1270              :   INTEGER                                         :: iflavor,ifl
    1271              :   INTEGER                                         :: iflavor2
    1272              :   INTEGER                                         :: iomega
    1273              :   INTEGER                                         :: itau
    1274              :   DOUBLE PRECISION                                :: pi_invBeta
    1275              :   DOUBLE PRECISION                                :: K
    1276              :   !DOUBLE PRECISION                                :: re
    1277              :   !DOUBLE PRECISION                                :: im
    1278              :   !DOUBLE PRECISION                                :: det
    1279            0 :   COMPLEX(KIND=8), DIMENSION(:,:,:), ALLOCATABLE   :: F_omega
    1280            0 :   COMPLEX(KIND=8), DIMENSION(:,:), ALLOCATABLE   :: F_omega_inv
    1281            0 :   COMPLEX(KIND=8), DIMENSION(:,:,:), ALLOCATABLE   :: Gomega_tmp
    1282            0 :   TYPE(GreenHyboffdiag)                                     :: F_tmp
    1283              :   !character(len=4) :: tag_proc
    1284              :   !character(len=30) :: tmpfil
    1285              :   !INTEGER :: unitnb
    1286              : 
    1287              :   ABI_UNUSED((/opt_fk/))
    1288              : 
    1289            0 :   flavors    = op%flavors
    1290              : 
    1291            0 :   samples    = op%samples
    1292            0 :   pi_invBeta = ACOS(-1.d0) / op%beta
    1293            0 :   op%Wmax=SIZE(Gomega,1)
    1294              : !sui!write(std_out,*) "op%Wmax",op%Wmax
    1295              :   !=================================
    1296              :   ! --- Initialize F_tmp
    1297              :   !=================================
    1298            0 :   IF ( op%have_MPI .EQV. .TRUE. ) THEN
    1299            0 :     CALL GreenHyboffdiag_init(F_tmp,samples,op%beta,flavors,MY_COMM=op%MY_COMM)
    1300              :   ELSE
    1301            0 :     CALL GreenHyboffdiag_init(F_tmp,samples,op%beta,flavors)
    1302              :   END IF
    1303              : !  K = op%mu
    1304              : 
    1305              :   !=================================
    1306              :   ! --- Allocate F_omega
    1307              :   !=================================
    1308            0 :   MALLOC(F_omega,(1:op%Wmax,1:flavors,1:flavors))
    1309            0 :   MALLOC(F_omega_inv,(1:flavors,1:flavors))
    1310            0 :   MALLOC(Gomega_tmp,(1:op%Wmax,1:flavors,1:flavors))
    1311              :   !op%hybri_limit(2,2)=op%hybri_limit(1,1)
    1312              :   !op%mu(1)=op%mu(1)/10
    1313              :   !op%mu(2)=op%mu(1)
    1314            0 :   DO iomega=1,op%Wmax
    1315            0 :     do iflavor=1,flavors
    1316            0 :       do iflavor2=1,flavors
    1317              :        ! Gomega_tmp(iomega,iflavor,iflavor2)=op%hybri_limit(iflavor,iflavor2)/(cmplx(0.d0,(2.d0*DBLE(iomega)-1.d0) * pi_invBeta))/3.d0
    1318              :       enddo
    1319              :     enddo
    1320              :   END DO
    1321            0 :   Gomega_tmp=Gomega
    1322              : 
    1323              :   !IF ( op%rank .EQ. 0 ) &
    1324              :     !OPEN(UNIT=9876,FILE="K.dat",POSITION="APPEND")
    1325              : 
    1326              :   !=============================================================================================
    1327              :   ! --- Compute Bath Green's function from Hybridization function in imaginary time
    1328              :   !=============================================================================================
    1329              :   !IF ( opt_fk .EQ. 0 ) THEN
    1330              :    IF ( op%rank .EQ. 0 ) THEN
    1331              :    !  DO iflavor = 1, flavors
    1332              :    !    DO iflavor2 = 1, flavors
    1333              :    !        write(330,*) "#",iflavor,iflavor2
    1334              :    !        write(331,*) "#",iflavor,iflavor2
    1335              :    !      do  iomega=1,op%Wmax
    1336              :    !        write(330,*)  (2.d0*DBLE(iomega)-1.d0) * pi_invBeta,real(Gomega_tmp(iomega,iflavor,iflavor2))
    1337              :    !        write(331,*)  (2.d0*DBLE(iomega)-1.d0) * pi_invBeta,imag(Gomega_tmp(iomega,iflavor,iflavor2))
    1338              :    !      enddo
    1339              :    !        write(330,*)
    1340              :    !        write(331,*)
    1341              :    !    END DO
    1342              :    !  END DO
    1343              :    ENDIF
    1344            0 :      DO iomega=1,op%Wmax
    1345              :      !  be careful...here
    1346              :      ! Gomega in input is Fomega and
    1347              :      ! F_omega is   Gomega.
    1348              :      ! COMPUTE G0 FROM F
    1349            0 :        do iflavor=1,flavors
    1350            0 :          do iflavor2=1,flavors
    1351            0 :            if (iflavor==iflavor2) then
    1352              :              F_omega_inv(iflavor,iflavor2)= (cmplx(0.d0,(2.d0*DBLE(iomega)-1.d0) * pi_invBeta,kind=8) &
    1353            0 : &             + op%mu(iflavor)- Gomega_tmp(iomega,iflavor,iflavor2))
    1354              :            else
    1355            0 :              F_omega_inv(iflavor,iflavor2)= (- Gomega_tmp(iomega,iflavor,iflavor2))
    1356              :            endif
    1357              :          enddo
    1358              :        enddo
    1359              :   !   END DO
    1360              :   ! IF ( op%rank .EQ. 0 ) THEN
    1361              :   !   DO iflavor = 1, flavors
    1362              :   !     DO iflavor2 = 1, flavors
    1363              :   !         write(334,*) "#",iflavor,iflavor2
    1364              :   !         write(335,*) "#",iflavor,iflavor2
    1365              :   !       do  iomega=1,op%Wmax
    1366              :   !         write(334,*)  (2.d0*DBLE(iomega)-1.d0) * pi_invBeta,real(F_omega(iomega,iflavor,iflavor2))
    1367              :   !         write(335,*)  (2.d0*DBLE(iomega)-1.d0) * pi_invBeta,imag(F_omega(iomega,iflavor,iflavor2))
    1368              :   !       enddo
    1369              :   !         write(334,*)
    1370              :   !         write(335,*)
    1371              :   !     END DO
    1372              :   !   END DO
    1373              :   ! ENDIF
    1374              : 
    1375              :   !   DO iomega=1,op%Wmax
    1376            0 :        call xginv(F_omega_inv,flavors)
    1377            0 :        do iflavor=1,flavors
    1378            0 :          do iflavor2=1,flavors
    1379            0 :            F_omega(iomega,iflavor,iflavor2) = F_omega_inv(iflavor,iflavor2)
    1380              :          enddo
    1381              :        enddo
    1382              :      END DO
    1383              : 
    1384              :    !IF ( op%rank .EQ. 0 ) THEN
    1385              :    !  DO iflavor = 1, flavors
    1386              :    !    DO iflavor2 = 1, flavors
    1387              :    !        write(332,*) "#",iflavor,iflavor2
    1388              :    !        write(333,*) "#",iflavor,iflavor2
    1389              :    !      do  iomega=1,op%Wmax
    1390              :    !        write(332,*)  (2.d0*DBLE(iomega)-1.d0) * pi_invBeta,real(F_omega(iomega,iflavor,iflavor2))
    1391              :    !        write(333,*)  (2.d0*DBLE(iomega)-1.d0) * pi_invBeta,imag(F_omega(iomega,iflavor,iflavor2))
    1392              :    !      enddo
    1393              :    !        write(332,*)
    1394              :    !        write(333,*)
    1395              :    !    END DO
    1396              :    !  END DO
    1397              :    !ENDIF
    1398              :      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    1399              :      !  for test: Fourier of G0(iwn)
    1400              :      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    1401              :    !sui!write(std_out,*) "opt_fk=0"
    1402            0 :      CALL GreenHyboffdiag_setOperW(F_tmp,F_omega)
    1403              :   ! IF ( op%rank .EQ. 0 ) THEN
    1404              :   !    DO iflavor = 1, flavors
    1405              :   !      DO iflavor2 = 1, flavors
    1406              :   !          write(336,*) "#",iflavor,iflavor2
    1407              :   !          write(337,*) "#",iflavor,iflavor2
    1408              :   !        do  iomega=1,op%Wmax
    1409              :   !          write(336,*)  (2.d0*DBLE(iomega)-1.d0) * pi_invBeta,real(F_tmp%oper_w(iomega,iflavor,iflavor2))
    1410              :   !          write(337,*)  (2.d0*DBLE(iomega)-1.d0) * pi_invBeta,imag(F_tmp%oper_w(iomega,iflavor,iflavor2))
    1411              :   !        enddo
    1412              :   !          write(336,*)
    1413              :   !          write(337,*)
    1414              :   !      END DO
    1415              :   !    END DO
    1416              :   !  ENDIF
    1417            0 :      CALL GreenHyboffdiag_backFourier(F_tmp,func="green")
    1418              :      ! --- Put the result in F
    1419            0 :      DO iflavor = 1, flavors
    1420            0 :        DO iflavor2 = 1, flavors
    1421            0 :          DO itau=1,samples+1
    1422            0 :          F(itau,iflavor,iflavor2) = F_tmp%oper(itau,iflavor,iflavor2)
    1423              :          END DO
    1424              :        END DO
    1425              :      END DO
    1426              :      !IF ( op%rank .EQ. 0 ) THEN
    1427              :      !  DO iflavor = 1, flavors
    1428              :      !    DO iflavor2 = 1, flavors
    1429              :      !        write(346,*) "#",iflavor,iflavor2
    1430              :      !      do  itau=1,op%samples+1
    1431              :      !        write(346,*) (itau-1)*op%beta/(op%samples),real(F(itau,iflavor,iflavor2))
    1432              :      !      enddo
    1433              :      !        write(346,*)
    1434              :      !    END DO
    1435              :      !  END DO
    1436              :      !ENDIF
    1437            0 :      DO iflavor = 1, flavors
    1438            0 :        DO iflavor2 = 1, flavors
    1439            0 :          DO itau=1,samples+1
    1440              : !         This symetrization is general and valid even with SOC
    1441              : !         Without SOC, it leads to zero.
    1442            0 :          F(itau,iflavor,iflavor2) = (F_tmp%oper(itau,iflavor,iflavor2)+F_tmp%oper(itau,iflavor2,iflavor))/2.d0
    1443              :          END DO
    1444              :        END DO
    1445              :      END DO
    1446            0 :      open (unit=4367,file='G0tau_fromF',status='unknown',form='formatted')
    1447            0 :      rewind(4367)
    1448            0 :      IF ( op%rank .EQ. 0 ) THEN
    1449            0 :        DO iflavor = 1, flavors
    1450            0 :          DO iflavor2 = 1, flavors
    1451            0 :              write(4367,*) "#",iflavor,iflavor2
    1452            0 :            do  itau=1,op%samples+1
    1453            0 :              write(4367,*) (itau-1)*op%beta/(op%samples),F(itau,iflavor,iflavor2)
    1454              :            enddo
    1455            0 :              write(4367,*)
    1456              :          END DO
    1457              :        !sui!write(std_out,'(5x,14(2f9.5,2x))') (F(op%samples+1,iflavor,iflavor2),iflavor2=1,flavors)
    1458              :        END DO
    1459              :      ENDIF
    1460              :      !call flush(437)
    1461            0 :      close(4367)
    1462              :      !call flush(6)
    1463              : 
    1464            0 :      call xmpi_barrier(op%MY_COMM)
    1465              :      !CALL ERROR("END OF CALCULATION")
    1466              :      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    1467              :      !  END OF TEST
    1468              :      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    1469              : 
    1470              :      !DO iomega=1,op%Wmax
    1471              :      !  call xginv(F_omega(iomega,:,:),flavors)
    1472              :      !END DO
    1473              :     !F_omega = CMPLX(-1.d0,0,8)/Gomega_tmp
    1474              :   !ELSE
    1475              :   !=============================================================================================
    1476              :   ! --- Restore Hybridization in F_omega
    1477              :   !=============================================================================================
    1478              : 
    1479              : !   Restore Hybridization in F_omega for the following operations
    1480            0 :   F_omega = Gomega_tmp
    1481              :   !END IF
    1482              : 
    1483              :   !==================================================================
    1484              :   ! --- Full double loop on flavors to compute F (remove levels)
    1485              :   !==================================================================
    1486            0 :   DO iflavor = 1, flavors
    1487            0 :     DO iflavor2 = 1, flavors
    1488              : 
    1489              :   ! --- Compute or use the levels for the diagonal hybridization (else K=0)
    1490            0 :       IF(iflavor==iflavor2) THEN
    1491            0 :         IF ( op%opt_levels .EQ. 1 ) THEN
    1492              :           K = op%mu(iflavor)
    1493              :         ELSE
    1494            0 :           K = -REAL(F_omega(op%Wmax, iflavor,iflavor))
    1495              : !        op%mu = K
    1496            0 :           op%mu(iflavor) = K
    1497              :         END IF
    1498              :       ELSE
    1499              :         K=0.d0
    1500              :       ENDIF
    1501              :       !IF ( op%rank .EQ. 0 ) &
    1502              :       !WRITE(9876,'(I4,2E22.14)') iflavor, K, REAL(-F_omega(op%Wmax, iflavor))
    1503              :      ! IF(op%rank .EQ.0) &
    1504              :      ! WRITE(op%ostream,*) "CTQMC K, op%mu = ",K,op%mu(iflavor)
    1505              :       !WRITE(op%ostream,*) "CTQMC beta     = ",op%beta
    1506              : 
    1507              :   ! --- Compute F (by removing the levels) if opt_fk==0
    1508              :     !  IF ( opt_fk .EQ. 0 ) THEN
    1509              :     !   ! DO iomega = 1, op%Wmax
    1510              :     !   !   re = REAL(F_omega(iomega,iflavor,iflavor2))
    1511              :     !   !   im = AIMAG(F_omega(iomega,iflavor,iflavor2))
    1512              :     !   !   if (iflavor==iflavor2) then
    1513              :     !   !     F_omega(iomega,iflavor,iflavor) = CMPLX(re + K, im + (2.d0*DBLE(iomega)-1.d0) * pi_invBeta, 8)
    1514              :     !   !   else
    1515              :     !   !     F_omega(iomega,iflavor,iflavor2) = CMPLX(re , im  , 8)
    1516              :     !   !   endif
    1517              :     !   !   !if(iflavor==1.and.op%rank==0) then
    1518              :     !   !     !write(224,*) (2.d0*DBLE(iomega)-1.d0) * pi_invBeta, real(F_omega(iomega,iflavor)),imag(F_omega(iomega,iflavor))
    1519              :     !   !     !write(225,*) (2.d0*DBLE(iomega)-1.d0) * pi_invBeta, real(Gomega_tmp(iomega, iflavor)),imag(Gomega_tmp(iomega, iflavor))
    1520              :     !   !   !end if
    1521              :     !   ! END DO
    1522              :     !  ELSE
    1523              :     !    DO iomega = 1, op%Wmax
    1524              :     !      !F_omega(iomega,iflavor,iflavor2) = F_omega(iomega,iflavor,iflavor2) + CMPLX(K, 0.d0, 8)
    1525              : 
    1526              : 
    1527              :     !      !if(iflavor==1.and.op%rank==0) then
    1528              :     !        !write(224,*) (2.d0*DBLE(iomega)-1.d0) * pi_invBeta, real(F_omega(iomega,iflavor)),imag(F_omega(iomega,iflavor))
    1529              :     !        !write(225,*) (2.d0*DBLE(iomega)-1.d0) * pi_invBeta, real(Gomega_tmp(iomega, iflavor)),imag(Gomega_tmp(iomega, iflavor))
    1530              :     !      !end if
    1531              :     !    END DO
    1532              :     !  END IF
    1533              :   ! --- compute residual K (?)
    1534            0 :       K = REAL(CMPLX(0,(2.d0*DBLE(op%Wmax)-1.d0)*pi_invBeta,8)*F_omega(op%Wmax,iflavor,iflavor2))
    1535            0 :       CALL GreenHyboffdiag_setMuD1(op%Greens,iflavor,iflavor2,op%mu(iflavor),K)
    1536              :     END DO
    1537              :   END DO
    1538              : 
    1539            0 :   do  iomega=1,op%Wmax
    1540              :    ! write(336,*) (2.d0*DBLE(iomega)-1.d0) * pi_invBeta,real(F_omega(iomega,1,1)),imag(F_omega(iomega,1,1))
    1541              :   enddo
    1542              : 
    1543              :   ! --- Creates F_tmp%oper_w
    1544            0 :   CALL GreenHyboffdiag_setOperW(F_tmp,F_omega)
    1545              :  ! do  iflavor=1, flavors ; do  iflavor2=1, flavors ; write(337,*) "#",iflavor,iflavor2 ; do  iomega=1,op%Wmax
    1546              :  !   write(337,*) (2.d0*DBLE(iomega)-1.d0) * pi_invBeta,real(F_tmp%oper_w(iomega,iflavor,iflavor2)),&
    1547              :  !&   imag(F_tmp%oper_w(iomega,iflavor,iflavor2))
    1548              :  ! enddo ; write(337,*) ; enddo ; enddo
    1549              : !  IF ( op%rank .EQ. 0 ) THEN
    1550              : !    DO iflavor = 1, flavors
    1551              : !      DO iflavor2 = 1, flavors
    1552              : !        write(336,*) "#",iflavor,iflavor2
    1553              : !        write(337,*) "#",iflavor,iflavor2
    1554              : !        do  iomega=1,op%Wmax
    1555              : !          write(336,*)  (2.d0*DBLE(iomega)-1.d0) * pi_invBeta,real(F_tmp%oper_w(iomega,iflavor,iflavor2))
    1556              : !          write(337,*)  (2.d0*DBLE(iomega)-1.d0) * pi_invBeta,imag(F_tmp%oper_w(iomega,iflavor,iflavor2))
    1557              : !        enddo
    1558              : !        write(336,*)
    1559              : !        write(337,*)
    1560              : !        write(136,*) "#",iflavor,iflavor2
    1561              : !        write(137,*) "#",iflavor,iflavor2
    1562              : !        do  iomega=1,op%Wmax
    1563              : !        write(136,*)  (2.d0*DBLE(iomega)-1.d0) * pi_invBeta,real(F_tmp%oper_w(iomega,iflavor,iflavor2)-op%hybri_limit(iflavor,iflavor2)/(cmplx(0.d0,(2.d0*DBLE(iomega)-1.d0) * pi_invBeta,kind=8)))
    1564              : !        write(137,*)  (2.d0*DBLE(iomega)-1.d0) * pi_invBeta,imag(F_tmp%oper_w(iomega,iflavor,iflavor2)-op%hybri_limit(iflavor,iflavor2)/(cmplx(0.d0,(2.d0*DBLE(iomega)-1.d0) * pi_invBeta,kind=8)))
    1565              : !        enddo
    1566              : !        write(136,*)
    1567              : !        write(137,*)
    1568              : !        write(836,*) "#",iflavor,iflavor2
    1569              : !        write(837,*) "#",iflavor,iflavor2
    1570              : !        do  iomega=1,op%Wmax
    1571              : !        write(836,*)  (2.d0*DBLE(iomega)-1.d0) * pi_invBeta,real(op%hybri_limit(iflavor,iflavor2)/(cmplx(0.d0,(2.d0*DBLE(iomega)-1.d0) * pi_invBeta)))
    1572              : !        write(837,*)  (2.d0*DBLE(iomega)-1.d0) * pi_invBeta,imag(op%hybri_limit(iflavor,iflavor2)/(cmplx(0.d0,(2.d0*DBLE(iomega)-1.d0) * pi_invBeta)))
    1573              : !        enddo
    1574              : !        write(836,*)
    1575              : !        write(837,*)
    1576              : !      END DO
    1577              : !    END DO
    1578              : !  ENDIF
    1579              :   !CALL GreenHyboffdiag_backFourier(F_tmp,F_omega(:,iflavor))
    1580              :    ! DO iflavor = 1, flavors
    1581              :    !   DO iflavor2 = 1, flavors
    1582              :    !   unitnb=80000+F_tmp%rank
    1583              :    !   call int2char4(F_tmp%rank,tag_proc)
    1584              :    !   tmpfil = 'oper_wavantFOURIER'//tag_proc
    1585              :    !   open (unit=unitnb,file=trim(tmpfil),status='unknown',form='formatted')
    1586              :    !   write(unitnb,*) "#",iflavor,iflavor2
    1587              :    !   ! C_omega et oper_w differents Domega identique. Est ce du a des
    1588              :    !   ! diago differentes   pour chaque procs dans qmc_prep_ctqmc
    1589              :    !   do  iomega=1,F_tmp%Wmax
    1590              :    !   write(unitnb,*)  (2.d0*DBLE(iomega)-1.d0) * pi_invBeta,real(F_tmp%oper_w(iomega,iflavor,iflavor2))
    1591              :    !   enddo
    1592              :    !   write(unitnb,*)
    1593              :    !   END DO
    1594              :    ! END DO
    1595              : 
    1596              :   ! --- For all iflavor and iflavor2, do the Fourier transformation to
    1597              :   ! --- have (F(\tau))
    1598              :   !CALL GreenHyboffdiag_backFourier(F_tmp,hybri_limit=op%hybri_limit,opt_hybri_limit=op%opt_hybri_limit)
    1599            0 :    write(std_out,*) "WARNING opt_hybri_limit==0"
    1600            0 :   CALL GreenHyboffdiag_backFourier(F_tmp,hybri_limit=op%hybri_limit,opt_hybri_limit=0)
    1601              : !  CALL GreenHyboffdiag_backFourier(F_tmp,hybri_limit=op%hybri_limit,opt_hybri_limit=1)
    1602              :  ! CALL GreenHyboffdiag_backFourier(F_tmp)
    1603              : 
    1604              :   ! --- Put the result in F
    1605            0 :   DO iflavor = 1, flavors
    1606            0 :     DO iflavor2 = 1, flavors
    1607            0 :       DO itau=1,samples+1
    1608            0 :       F(itau,iflavor,iflavor2) = -F_tmp%oper(samples+2-itau,iflavor,iflavor2)
    1609              :       END DO
    1610              :     END DO
    1611              :   END DO
    1612              : ! IF ( op%rank .EQ. 0 ) THEN
    1613              : !   ifl=0
    1614              : !   DO iflavor = 1, flavors
    1615              : !     DO iflavor2 = 1, flavors
    1616              : !       ifl=ifl+1
    1617              : !       write(346,*) "#",iflavor,iflavor2,ifl
    1618              : !       do  itau=1,op%samples+1
    1619              : !         write(346,*) itau,real(F(itau,iflavor,iflavor2))
    1620              : !       enddo
    1621              : !       write(346,*)
    1622              : !     END DO
    1623              : !   END DO
    1624              : ! ENDIF
    1625              : ! close(346)
    1626            0 :   DO iflavor = 1, flavors
    1627            0 :     DO iflavor2 = 1, flavors
    1628            0 :       DO itau=1,samples+1
    1629              : !      This symetrization is general and valid even with SOC
    1630              : !      Without SOC, it leads to zero.
    1631            0 :       F(itau,iflavor,iflavor2) = -(F_tmp%oper(samples+2-itau,iflavor,iflavor2)+F_tmp%oper(samples+2-itau,iflavor2,iflavor))/2.d0
    1632              :       END DO
    1633              :     END DO
    1634              :   END DO
    1635              :   !DO iflavor = 1, flavors
    1636              :   !  DO iflavor2 = 1, flavors
    1637              :   !    DO itau=1,samples+1
    1638              :   !    F(itau,iflavor,iflavor2) = F(samples/2,iflavor,iflavor2)
    1639              :   !    END DO
    1640              :   !  END DO
    1641              :   !END DO
    1642              : 
    1643              :  !  SOME TRY TO ADJUST F
    1644              :   !DO iflavor = 1, flavors
    1645              :   !  DO iflavor2 = 1, flavors
    1646              :   !    do  itau=1,op%samples+1
    1647              :   !    !if(iflavor/=iflavor2) F(itau,iflavor,iflavor2)=F((op%samples+1)/2,iflavor,iflavor2)
    1648              :   !    !if(iflavor==iflavor2) F(itau,iflavor,iflavor2)=F((op%samples+1)/2,iflavor,iflavor2)
    1649              :   !    enddo
    1650              :   !  END DO
    1651              :   !END DO
    1652              :   !write(6,*) "QQQQ1",op%rank
    1653              : 
    1654            0 :   open (unit=436,file='Hybridization.dat',status='unknown',form='formatted')
    1655            0 :   rewind(436)
    1656            0 :   IF ( op%rank .EQ. 0 ) THEN
    1657            0 :     ifl=0
    1658            0 :     DO iflavor = 1, flavors
    1659            0 :       DO iflavor2 = 1, flavors
    1660            0 :         ifl=ifl+1
    1661            0 :           write(436,*) "#",iflavor,iflavor2 !,ifl,op%hybri_limit(iflavor,iflavor2)
    1662            0 :         do  itau=1,op%samples+1
    1663            0 :           write(436,*) itau,F(itau,iflavor,iflavor2)
    1664              :         enddo
    1665            0 :           write(436,*)
    1666              :       END DO
    1667              :     END DO
    1668              :   ENDIF
    1669            0 :   close(436)
    1670              : 
    1671            0 :   IF (op%rank .eq. 0) then
    1672            0 :     open(unit=735,file=trim(fname)//'_Hybridization_iatom_01.dat',status='unknown',form='formatted')
    1673            0 :     write(735,'(6a)') " Real and Imaginary part of the Hybridization function Delta(tau) in the CTQMC basis"
    1674            0 :     do itau=1,op%samples+1
    1675            0 :       write(735,'(2x,393(e25.17e3,2x))') DBLE(itau-1)*(op%beta/op%samples),&
    1676            0 :       & ((-1*(F(op%samples+2-itau,iflavor,iflavor2)),0.d0,iflavor=1,flavors),iflavor2=1,flavors)
    1677              :    enddo
    1678            0 :    close(735)
    1679              :   ENDIF
    1680              : 
    1681              :   !   call xmpi_barrier(op%MY_COMM)
    1682              :   !write(6,*) "QQQQ3"
    1683            0 :   FREE(Gomega_tmp)
    1684            0 :   FREE(F_omega)
    1685            0 :   FREE(F_omega_inv)
    1686              :   !write(6,*) "QQQQ4"
    1687            0 :   CALL GreenHyboffdiag_destroy(F_tmp)
    1688              :   !write(6,*) "QQQQ2"
    1689              : 
    1690              : 
    1691            0 : END SUBROUTINE Ctqmcoffdiag_computeF
    1692              : !!***
    1693              : 
    1694              : !SUBROUTINE Ctqmcoffdiag_computeFK(op, Gomega, Wmax, F)
    1695              : !  COMPLEX*16      , DIMENSION(:,:), INTENT(IN   ) :: Gomega
    1696              : !  INTEGER                         , INTENT(IN   ) :: Wmax
    1697              : !  DOUBLE PRECISION, DIMENSION(:,:), INTENT(INOUT) :: F
    1698              : !  INTEGER                                         :: flavors
    1699              : !  INTEGER                                         :: samples
    1700              : !  INTEGER                                         :: iflavor
    1701              : !  INTEGER                                         :: iomega
    1702              : !  INTEGER                                         :: itau
    1703              : !  DOUBLE PRECISION                                :: pi_invBeta
    1704              : !  DOUBLE PRECISION                                :: K
    1705              : !  COMPLEX*16      , DIMENSION(:,:), ALLOCATABLE   :: F_omega
    1706              : !  TYPE(GreenHyboffdiag)                                     :: F_tmp
    1707              : !
    1708              : !  flavors    = op%flavors
    1709              : !
    1710              : !  samples    = op%samples
    1711              : !  pi_invBeta = ACOS(-1.d0) / op%beta
    1712              : !
    1713              : !  IF ( op%have_MPI .EQV. .TRUE. ) THEN
    1714              : !    CALL GreenHyboffdiag_init(F_tmp,samples,op%beta,op%MY_COMM)
    1715              : !  ELSE
    1716              : !    CALL GreenHyboffdiag_init(F_tmp,samples,op%beta)
    1717              : !  END IF
    1718              : !!  K = op%mu
    1719              : !
    1720              : !  MALLOC(F_omega,(1:Wmax,1:flavors))
    1721              : !
    1722              : !  DO iflavor = 1, flavors
    1723              : !    K = REAL(Gomega(Wmax, iflavor))
    1724              : !    WRITE(op%ostream,*) "CTQMC K, op%mu = ",K,op%mu
    1725              : !    WRITE(op%ostream,*) "CTQMC beta     = ",op%beta
    1726              : !    op%mu(iflavor) = K
    1727              : !    DO iomega = 1, Wmax
    1728              : !      F_omega(iomega,iflavor) = Gomega(iomega,iflavor) &
    1729              : !                  - CMPLX(K, 0.d0, 8)
    1730              : !      !if(iflavor==1.and.op%rank==0) then
    1731              : !        !write(224,*) (2.d0*DBLE(iomega)-1.d0) * pi_invBeta, real(F_omega(iomega,iflavor)),imag(F_omega(iomega,iflavor))
    1732              : !        !write(225,*) (2.d0*DBLE(iomega)-1.d0) * pi_invBeta, real(Gomega(iomega, iflavor)),imag(Gomega(iomega, iflavor))
    1733              : !      !end if
    1734              : !    END DO
    1735              : !    CALL GreenHyboffdiag_backFourier(F_tmp,F_omega(:,iflavor))
    1736              : !    F(1:samples+1,iflavor) = (/ (-F_tmp%oper(samples+1-itau),itau=0,samples) /)
    1737              : !  END DO
    1738              : !  FREE(F_omega)
    1739              : !  CALL GreenHyboffdiag_destroy(F_tmp)
    1740              : !END SUBROUTINE Ctqmcoffdiag_computeFK
    1741              : !!***
    1742              : 
    1743              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_run
    1744              : !! NAME
    1745              : !!  Ctqmcoffdiag_run
    1746              : !!
    1747              : !! FUNCTION
    1748              : !!  set all options and run a simulation
    1749              : !!
    1750              : !! COPYRIGHT
    1751              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
    1752              : !!  This file is distributed under the terms of the
    1753              : !!  GNU General Public License, see ~abinit/COPYING
    1754              : !!  or http://www.gnu.org/copyleft/gpl.txt .
    1755              : !!
    1756              : !! INPUTS
    1757              : !!  op=ctqmc
    1758              : !!  opt_order=maximal perturbation order to scope
    1759              : !!  opt_movie=draw a movie of the simulation
    1760              : !!  opt_analysis=compute correlation functions
    1761              : !!  opt_check=check fast calculations
    1762              : !!  opt_noise=compute noise for green function
    1763              : !!  opt_spectra=fourier transform of the time evolution of the number of electrons
    1764              : !!  opt_gMove=steps without global move
    1765              : !!
    1766              : !! OUTPUT
    1767              : !!
    1768              : !! SIDE EFFECTS
    1769              : !!
    1770              : !! NOTES
    1771              : !!
    1772              : !! SOURCE
    1773              : 
    1774            0 : SUBROUTINE Ctqmcoffdiag_run(op,opt_order,opt_histo,opt_movie,opt_analysis,opt_check,opt_noise,opt_spectra,opt_gMove)
    1775              : 
    1776              : 
    1777              : #ifdef HAVE_MPI1
    1778              : include 'mpif.h'
    1779              : #endif
    1780              : !Arguments ------------------------------------
    1781              :   TYPE(Ctqmcoffdiag), INTENT(INOUT)           :: op
    1782              :   INTEGER, OPTIONAL, INTENT(IN   )  :: opt_order
    1783              :   INTEGER, OPTIONAL, INTENT(IN   )  :: opt_histo
    1784              :   INTEGER, OPTIONAL, INTENT(IN   )  :: opt_movie
    1785              :   INTEGER, OPTIONAL, INTENT(IN   )  :: opt_analysis
    1786              :   INTEGER, OPTIONAL, INTENT(IN   )  :: opt_check
    1787              :   INTEGER, OPTIONAL, INTENT(IN   )  :: opt_noise
    1788              :   INTEGER, OPTIONAL, INTENT(IN   )  :: opt_spectra
    1789              :   INTEGER, OPTIONAL, INTENT(IN   )  :: opt_gMove
    1790              : !Local variables ------------------------------
    1791              : #ifdef HAVE_MPI
    1792              :   INTEGER                            :: ierr
    1793              :   DOUBLE PRECISION                   :: rtime(1)
    1794              : #endif
    1795              : !#ifdef CTCtqmcoffdiag_MOVIE
    1796              :   INTEGER                            :: ilatex
    1797              :   CHARACTER(LEN=4)                   :: Cchar
    1798              : !#endif
    1799              :   DOUBLE PRECISION                   :: estimatedTime
    1800              : 
    1801            0 :   IF ( .NOT. op%set  ) &
    1802            0 :     CALL ERROR("Ctqmcoffdiag_run : QMC not set up                          ")
    1803            0 :   IF ( .NOT. op%setU ) &
    1804            0 :     CALL ERROR("Ctqmcoffdiag_run : QMC does not have a U matrix            ")
    1805              : 
    1806              : 
    1807              : ! OPTIONS of the run
    1808            0 :   IF ( PRESENT( opt_check ) ) THEN
    1809            0 :     op%opt_check = opt_check
    1810            0 :     CALL ImpurityOperator_doCheck(op%Impurity,opt_check)
    1811            0 :     CALL BathOperatoroffdiag_doCheck(op%Bath,opt_check)
    1812              :   END IF
    1813            0 :   IF ( PRESENT( opt_movie ) ) &
    1814            0 :     op%opt_movie = opt_movie
    1815            0 :   IF ( PRESENT( opt_analysis ) ) &
    1816            0 :     op%opt_analysis = opt_analysis
    1817            0 :   IF ( PRESENT ( opt_order ) ) &
    1818            0 :     op%opt_order = opt_order
    1819            0 :   IF ( PRESENT ( opt_histo ) ) &
    1820            0 :     op%opt_histo = opt_histo
    1821            0 :   IF ( PRESENT ( opt_noise ) ) THEN
    1822            0 :     op%opt_noise = opt_noise
    1823              :   END IF
    1824            0 :   IF ( PRESENT ( opt_spectra ) ) &
    1825            0 :     op%opt_spectra = opt_spectra
    1826              : 
    1827            0 :   op%modGlobalMove(1) = max(op%sweeps,op%thermalization)+1 ! No Global Move
    1828              : !!sui!write(std_out,*) "op%sweeps",op%thermalization,op%sweeps,opt_gMove
    1829            0 :   op%modGlobalMove(2) = 0
    1830            0 :   IF ( PRESENT ( opt_gMove ) ) THEN
    1831            0 :     IF ( opt_gMove .LE. 0 .OR. opt_gMove .GT. op%sweeps ) THEN
    1832              :      ! op%modGlobalMove(1) = op%sweeps+1
    1833              :       op%modGlobalMove(1) = max(op%sweeps,op%thermalization)+1 ! No Global Move
    1834              :       !write(std_out,*) "op%sweeps",op%sweeps, op%modGlobalMove(1)
    1835            0 :       CALL WARNALL("Ctqmcoffdiag_run : global moves option is <= 0 or > sweeps/cpu -> No global Moves")
    1836              :     ELSE
    1837            0 :       op%modGlobalMove(1) = opt_gMove
    1838              :     END IF
    1839              :   END IF
    1840              : !sui!write(std_out,*) "op%sweeps",op%thermalization,op%sweeps
    1841              : 
    1842            0 :   CALL Ctqmcoffdiag_allocateOpt(op)
    1843              : 
    1844              : !#ifdef CTCtqmcoffdiag_MOVIE
    1845            0 :   ilatex = 0
    1846            0 :   IF ( op%opt_movie .EQ. 1 ) THEN
    1847            0 :     Cchar ="0000"
    1848            0 :     WRITE(Cchar,'(I4)') op%rank
    1849            0 :     ilatex = 87+op%rank
    1850            0 :     OPEN(UNIT=ilatex, FILE="Movie_"//TRIM(ADJUSTL(Cchar))//".tex")
    1851            0 :     WRITE(ilatex,'(A)') "\documentclass{beamer}"
    1852            0 :     WRITE(ilatex,'(A)') "\usepackage{color}"
    1853            0 :     WRITE(ilatex,'(A)') "\setbeamersize{sidebar width left=0pt}"
    1854            0 :     WRITE(ilatex,'(A)') "\setbeamersize{sidebar width right=0pt}"
    1855            0 :     WRITE(ilatex,'(A)') "\setbeamersize{text width left=0pt}"
    1856            0 :     WRITE(ilatex,'(A)') "\setbeamersize{text width right=0pt}"
    1857            0 :     WRITE(ilatex,*)
    1858            0 :     WRITE(ilatex,'(A)') "\begin{document}"
    1859            0 :     WRITE(ilatex,*)
    1860              :   END IF
    1861              : !#endif
    1862              : 
    1863            0 :   IF ( op%rank .EQ. 0 ) THEN
    1864            0 :     WRITE(op%ostream,'(A29)') "Starting QMC (Thermalization)"
    1865              :   END IF
    1866              : 
    1867              :   !=================================
    1868              :   ! STARTING THERMALIZATION
    1869              :   !=================================
    1870              :   !write(std_out,*) "sweeps before thermalization",op%sweeps
    1871              :   !write(std_out,*) "op%stats",op%stats
    1872            0 :   CALL Ctqmcoffdiag_loop(op,op%thermalization,ilatex)
    1873              :   !=================================
    1874              :   ! ENDING   THERMALIZATION
    1875              :   !=================================
    1876              : 
    1877            0 :   estimatedTime = op%runTime
    1878              : #ifdef HAVE_MPI
    1879            0 :   CALL MPI_REDUCE([op%runTime], rtime, 1, MPI_DOUBLE_PRECISION, MPI_MAX, 0, op%MY_COMM, ierr)
    1880            0 :   estimatedTime=rtime(1)
    1881              : #endif
    1882              : 
    1883            0 :   IF ( op%rank .EQ. 0 ) THEN
    1884            0 :     WRITE(op%ostream,'(A26,I6,A11)') "Thermalization done in    ", CEILING(estimatedTime), "    seconds"
    1885            0 :     WRITE(op%ostream,'(A25,I7,A15,I5,A5)') "The QMC should run in    ", &
    1886            0 :            CEILING(estimatedTime*DBLE(op%sweeps)/DBLE(op%thermalization)),&
    1887            0 :                         "    seconds on ", op%size, " CPUs"
    1888              :   END IF
    1889              : 
    1890              :   !=================================
    1891              :   ! CLEANING CTQMC
    1892              :   !=================================
    1893            0 :   CALL Ctqmcoffdiag_clear(op)
    1894              : 
    1895              :   !=================================
    1896              :   ! STARTING CTQMC
    1897              :   !=================================
    1898              :   !write(std_out,*) "sweeps before loop",op%sweeps
    1899              :   !write(std_out,*) "op%stats",op%stats
    1900            0 :   CALL Ctqmcoffdiag_loop(op,op%sweeps,ilatex)
    1901              :   !=================================
    1902              :   ! ENDING   CTQMC
    1903              :   !=================================
    1904              : 
    1905            0 :   IF ( op%opt_movie .EQ. 1 ) THEN
    1906            0 :     WRITE(ilatex,*) ""
    1907            0 :     WRITE(ilatex,'(A14)') "\end{document}"
    1908            0 :     CLOSE(ilatex)
    1909              :   END IF
    1910              : 
    1911            0 :   op%done     = .TRUE.
    1912              : !sui!write(std_out,*) "op%stats en of ctqmc_run",op%stats
    1913              : 
    1914            0 : END SUBROUTINE Ctqmcoffdiag_run
    1915              : !!***
    1916              : 
    1917              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_loop
    1918              : !! NAME
    1919              : !!  Ctqmcoffdiag_loop
    1920              : !!
    1921              : !! FUNCTION
    1922              : !!  Definition the main loop of the CT-QMC
    1923              : !!
    1924              : !! COPYRIGHT
    1925              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
    1926              : !!  This file is distributed under the terms of the
    1927              : !!  GNU General Public License, see ~abinit/COPYING
    1928              : !!  or http://www.gnu.org/copyleft/gpl.txt .
    1929              : !!
    1930              : !! INPUTS
    1931              : !!  op=ctqmc
    1932              : !!  itotal=number of sweeps to perform : thermalization or sweeps
    1933              : !!  ilatex=unit of file to write movie if so
    1934              : !!
    1935              : !! OUTPUT
    1936              : !!
    1937              : !! SIDE EFFECTS
    1938              : !!
    1939              : !! NOTES
    1940              : !!
    1941              : !! SOURCE
    1942              : 
    1943            0 : SUBROUTINE Ctqmcoffdiag_loop(op,itotal,ilatex)
    1944              : 
    1945              : !Arguments ------------------------------------
    1946              :   TYPE(Ctqmcoffdiag), INTENT(INOUT)         :: op
    1947              :   INTEGER    , INTENT(IN   )         :: itotal
    1948              :   INTEGER    , INTENT(IN   )         :: ilatex
    1949              : !Local variables ------------------------------
    1950              :   LOGICAL                            :: updated
    1951              :   LOGICAL                            :: updated_seg
    1952            0 :   LOGICAL, DIMENSION(:), ALLOCATABLE :: updated_swap
    1953              : 
    1954              :   INTEGER                            :: flavors
    1955              :   INTEGER                            :: measurements
    1956              :   INTEGER                            :: modNoise1
    1957              :   INTEGER                            :: modNoise2
    1958              :   INTEGER                            :: modGlobalMove
    1959              :   INTEGER                            :: sp1
    1960              :   INTEGER                            :: itau
    1961              :   INTEGER                            :: ind
    1962              :   INTEGER                            :: endDensity
    1963              :   INTEGER                            :: indDensity
    1964              :   INTEGER                            :: swapUpdate1
    1965              :   INTEGER                            :: swapUpdate2
    1966              :   INTEGER                            :: old_percent
    1967              :   INTEGER                            :: new_percent
    1968              :   INTEGER                            :: ipercent !,ii
    1969              :   INTEGER                            :: iflavor,ifl1,iflavor_d
    1970              :   INTEGER                            :: isweep
    1971              : 
    1972              :   DOUBLE PRECISION                   :: cpu_time1
    1973              :   DOUBLE PRECISION                   :: cpu_time2
    1974              :   DOUBLE PRECISION                   :: NRJ_old1
    1975              :   DOUBLE PRECISION                   :: NRJ_old2
    1976              :   DOUBLE PRECISION                   :: NRJ_new
    1977              :   DOUBLE PRECISION                   :: total
    1978            0 :   DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: gtmp_old1
    1979            0 :   DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: gtmp_old2
    1980            0 :   DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: gtmp_new
    1981              : 
    1982            0 :   CALL CPU_TIME(cpu_time1)
    1983              : 
    1984            0 :   flavors        = op%flavors
    1985            0 :   measurements   = op%measurements
    1986            0 :   modNoise1      = op%modNoise1
    1987            0 :   modNoise2      = op%modNoise2
    1988            0 :   modGlobalMove  = op%modGlobalMove(1)
    1989            0 :   sp1            = op%samples+1
    1990            0 :   IF ( op%opt_histo .GT. 0 ) THEN
    1991            0 :     op%occup_histo_time= 0.d0
    1992            0 :     op%occupconfig= 0.d0
    1993            0 :     op%suscep= 0.d0
    1994            0 :     op%chi= 0.d0
    1995            0 :     op%chicharge= 0.d0
    1996            0 :     op%ntot= 0.d0
    1997              :   END IF
    1998              : 
    1999            0 :   old_percent    = 0
    2000              : 
    2001            0 :   MALLOC(updated_swap,(1:flavors))
    2002            0 :   updated_swap(:) = .FALSE.
    2003              : 
    2004            0 :   NRJ_old1  = 0.d0
    2005            0 :   NRJ_old2  = 0.d0
    2006            0 :   NRJ_new   = 0.d0
    2007              : 
    2008            0 :   MALLOC(gtmp_new,(1,1))
    2009            0 :   gtmp_new  = 0.d0
    2010            0 :   MALLOC(gtmp_old1,(1,1))
    2011            0 :   gtmp_old1 = 0.d0
    2012            0 :   MALLOC(gtmp_old2,(1,1))
    2013            0 :   gtmp_old2 = 0.d0
    2014              : 
    2015              : !PROBLEM eos_gnu_13.2_mpich . %endDensity was introduced throughout
    2016            0 :   endDensity = SIZE(op%density,2)
    2017              : ! endDensity=op%endDensity
    2018              : !ENDPROBLEM
    2019              : 
    2020              : 
    2021            0 :   IF ( op%opt_noise .GT. 0 ) THEN
    2022            0 :     FREEIF(gtmp_new)
    2023            0 :     MALLOC(gtmp_new,(1:sp1,1:flavors))
    2024            0 :     FREEIF(gtmp_old1)
    2025            0 :     MALLOC(gtmp_old1,(1:sp1,1:flavors))
    2026            0 :     FREEIF(gtmp_old2)
    2027            0 :     MALLOC(gtmp_old2,(1:sp1,1:flavors))
    2028              :   END IF
    2029              : 
    2030            0 :   IF ( op%rank .EQ. 0 ) THEN
    2031              :     WRITE(op%ostream, '(1x,103A)') &
    2032            0 :     "|----------------------------------------------------------------------------------------------------|"
    2033            0 :     WRITE(op%ostream,'(1x,A)', ADVANCE="NO") "|"
    2034              :   END IF
    2035              : 
    2036            0 :   total = DBLE(itotal)
    2037              :   !write(std_out,*) "itotal",itotal
    2038            0 :   indDensity = 1
    2039              :   !write(std_out,*) "op%stats",op%stats
    2040            0 :   DO isweep = 1, itotal
    2041              :   !ii if(op%prtopt==1) write(std_out,*) "======== Isweep = ",isweep
    2042              :     !updated_seg=.FALSE.
    2043            0 :     DO iflavor = 1, flavors
    2044              :      ! if(isweep==itotal) write(std_out,*) "    Iflavor = ",iflavor,op%Impurity%Particles(iflavor)%tail
    2045              :    !ii if(op%prtopt==1)  write(std_out,*) "      ===Iflavor = ",iflavor
    2046            0 :       op%Impurity%activeFlavor=iflavor
    2047            0 :       op%Bath%activeFlavor=iflavor ; op%Bath%MAddFlag= .FALSE. ; op%Bath%MRemoveFlag = .FALSE.
    2048              : 
    2049              :       !write(std_out,*) "before tryaddremove"
    2050              : 
    2051              :       ! For iflavor, Try a move
    2052              :       !==========================
    2053            0 :       CALL Ctqmcoffdiag_tryAddRemove(op,updated_seg)
    2054              :     !sui!write(std_out,*) "after tryaddremove",updated_seg
    2055              : 
    2056            0 :       updated = updated_seg .OR.  updated_swap(iflavor).OR.(isweep==1)
    2057            0 :       updated_swap(iflavor) = .FALSE.
    2058            0 :       if ( op%opt_nondiag >0 )  iflavor_d=0
    2059            0 :       if ( op%opt_nondiag==0 )  iflavor_d=iflavor
    2060            0 :       CALL GreenHyboffdiag_measHybrid(op%Greens, op%Bath%M, op%Impurity%Particles, updated,op%signvalue,iflavor_d)
    2061              : 
    2062            0 :       CALL Ctqmcoffdiag_measN        (op, iflavor, updated)
    2063            0 :       IF ( op%opt_analysis .EQ. 1 ) &
    2064            0 :         CALL Ctqmcoffdiag_measCorrelation (op, iflavor)
    2065            0 :       IF ( op%opt_order .GT. 0 ) &
    2066            0 :         CALL Ctqmcoffdiag_measPerturbation(op, iflavor)
    2067              :     END DO
    2068              :     !CALL GreenHyboffdiag_measHybrid(op%Greens, op%Bath%M, op%Impurity%Particles, updated,op%signvalue,iflavor_d)
    2069              :     !DO iflavor = 1,flavors
    2070              :     !  CALL Ctqmcoffdiag_measN        (op, iflavor, updated)
    2071              :     !END DO
    2072              : 
    2073            0 :     IF ( MOD(isweep,modGlobalMove) .EQ. 0 ) THEN
    2074              :   ! !sui!write(std_out,*) "isweep,modGlobalMove,inside",isweep,modGlobalMove
    2075            0 :       CALL Ctqmcoffdiag_trySwap(op,swapUpdate1, swapUpdate2)
    2076              :      ! !write(std_out,*) "no global move yet for non diag hybridization"
    2077            0 :       IF ( swapUpdate1 .NE. 0 .AND. swapUpdate2 .NE. 0 ) THEN
    2078            0 :         updated_swap(swapUpdate1) = .TRUE.
    2079            0 :         updated_swap(swapUpdate2) = .TRUE.
    2080              :       END IF
    2081              :     END IF
    2082              : 
    2083            0 :     IF ( MOD(isweep,measurements) .EQ. 0 ) THEN ! default is always
    2084            0 :       CALL ImpurityOperator_measDE(op%Impurity,op%measDE)
    2085            0 :       IF ( op%opt_spectra .GE. 1 .AND. MOD(isweep,measurements*op%opt_spectra) .EQ. 0 ) THEN
    2086            0 :         op%density(1:flavors,indDensity) = op%measN(3,1:flavors)
    2087            0 :         indDensity = indDensity+1
    2088              :       END IF
    2089              :     END IF
    2090              : 
    2091            0 :     IF ( MOD(isweep,measurements) .EQ. 0 ) THEN
    2092            0 :       IF ( op%opt_histo .GT. 0 ) THEN
    2093              :         CALL ImpurityOperator_occup_histo_time(op%Impurity,op%occup_histo_time,op%occupconfig,op%suscep,op%samples,op%chi,&
    2094            0 : & op%chicharge,op%ntot,op%opt_histo,op%nspinor)
    2095              :       END IF
    2096              :     ENDIF
    2097              : 
    2098            0 :     IF ( MOD(isweep, modNoise1) .EQ. 0 ) THEN
    2099              :       !modNext = isweep + modNoise2
    2100            0 :       NRJ_new = op%measDE(1,1)
    2101            0 :       CALL Vector_pushBack(op%measNoise(1),NRJ_new - NRJ_old1)
    2102            0 :       NRJ_old1 = NRJ_new
    2103              : 
    2104              :       !! Try to limit accumulation error
    2105            0 :       CALL ImpurityOperator_cleanOverlaps(op%Impurity)
    2106              : 
    2107            0 :       IF ( op%opt_noise .EQ. 1 ) THEN
    2108            0 :         DO ifl1 = 1, flavors
    2109            0 :           DO ind = 1, op%Greens%map(ifl1,ifl1)%tail
    2110            0 :             itau = op%Greens%map(ifl1,ifl1)%listINT(ind)
    2111              :             gtmp_new(itau,ifl1) = op%Greens%oper(itau,ifl1,ifl1) &
    2112            0 :                      +op%Greens%map(ifl1,ifl1)%listDBLE(ind)*DBLE(op%Greens%factor)
    2113              :           END DO
    2114            0 :           DO itau = 1, sp1
    2115            0 :            CALL Vector_pushBack(op%measNoiseG(itau,ifl1,1), gtmp_new(itau,ifl1) - gtmp_old1(itau,ifl1))
    2116            0 :            gtmp_old1(itau,ifl1) = gtmp_new(itau,ifl1)
    2117              :           END DO
    2118              :         END DO
    2119              :       END IF
    2120              :     END IF
    2121              : 
    2122            0 :     IF ( MOD(isweep,modNoise2) .EQ. 0 ) THEN
    2123            0 :       NRJ_new = op%measDE(1,1)
    2124            0 :       CALL Vector_pushBack(op%measNoise(2),NRJ_new - NRJ_old2)
    2125            0 :       NRJ_old2 = NRJ_new
    2126            0 :       IF ( op%opt_noise .EQ. 1 ) THEN
    2127            0 :         DO ifl1 = 1, flavors
    2128            0 :           DO ind = 1, op%Greens%map(ifl1,ifl1)%tail
    2129            0 :             itau = op%Greens%map(ifl1,ifl1)%listINT(ind)
    2130              :             gtmp_new(itau,ifl1) = op%Greens%oper(itau,ifl1,ifl1) &
    2131            0 :                   +op%Greens%map(ifl1,ifl1)%listDBLE(ind)*op%Greens%factor
    2132              :           END DO
    2133            0 :           DO itau = 1, sp1
    2134            0 :             CALL Vector_pushBack(op%measNoiseG(itau,ifl1,2), gtmp_new(itau,ifl1) - gtmp_old2(itau,ifl1))
    2135            0 :             gtmp_old2(itau,ifl1) = gtmp_new(itau,ifl1)
    2136              :           END DO
    2137              :         END DO
    2138              :       END IF
    2139              : 
    2140            0 :       IF ( op%rank .EQ. 0 ) THEN
    2141            0 :         new_percent = CEILING(DBLE(isweep)*100.d0/DBLE(itotal))
    2142            0 :         DO ipercent = old_percent+1, new_percent
    2143            0 :           WRITE(op%ostream,'(A)',ADVANCE="NO") "-"
    2144              :         END DO
    2145              :         old_percent = new_percent
    2146              :       END IF
    2147              :     END IF
    2148              : 
    2149            0 :     IF ( op%opt_movie .EQ. 1 ) THEN
    2150            0 :       WRITE(ilatex,'(A11,I9)') "%iteration ", isweep
    2151            0 :       CALL ImpurityOperator_printLatex(op%Impurity,ilatex,isweep)
    2152              :     END IF
    2153              : 
    2154              :   END DO
    2155              : 
    2156            0 :   IF ( op%rank .EQ. 0 ) THEN
    2157            0 :     DO ipercent = old_percent+1, 100
    2158            0 :       WRITE(op%ostream,'(A)',ADVANCE="NO") "-"
    2159              :     END DO
    2160            0 :     WRITE(op%ostream,'(A)') "|"
    2161              :   END IF
    2162              : 
    2163            0 :   FREE(gtmp_new)
    2164            0 :   FREE(gtmp_old1)
    2165            0 :   FREE(gtmp_old2)
    2166            0 :   FREE(updated_swap)
    2167              : 
    2168            0 :   IF ( op%opt_spectra .GE. 1 .AND. itotal .EQ. op%sweeps ) THEN
    2169            0 :     IF ( endDensity .NE. indDensity-1 ) THEN
    2170            0 :       op%density(:,endDensity) = -1.d0
    2171              :     END IF
    2172              :   END IF
    2173              : 
    2174            0 :   CALL CPU_TIME(cpu_time2)
    2175              : 
    2176            0 :   op%runTime = (cpu_time2 - cpu_time1)*1.05d0 ! facteur arbitraire de correction
    2177            0 : END SUBROUTINE Ctqmcoffdiag_loop
    2178              : !!***
    2179              : 
    2180              : 
    2181              : 
    2182              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_tryAddRemove
    2183              : !! NAME
    2184              : !!  Ctqmcoffdiag_tryAddRemove
    2185              : !!
    2186              : !! FUNCTION
    2187              : !!  Try to add or remove a segment and an anti-segment
    2188              : !!
    2189              : !! COPYRIGHT
    2190              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
    2191              : !!  This file is distributed under the terms of the
    2192              : !!  GNU General Public License, see ~abinit/COPYING
    2193              : !!  or http://www.gnu.org/copyleft/gpl.txt .
    2194              : !!
    2195              : !! INPUTS
    2196              : !!  op=ctqmc
    2197              : !!
    2198              : !! OUTPUT
    2199              : !!  updated=something changed
    2200              : !!
    2201              : !! SIDE EFFECTS
    2202              : !!
    2203              : !! NOTES
    2204              : !!
    2205              : !! SOURCE
    2206              : 
    2207            0 : SUBROUTINE Ctqmcoffdiag_tryAddRemove(op,updated)
    2208              : 
    2209              : !Arguments ------------------------------------
    2210              :   TYPE(Ctqmcoffdiag)             , INTENT(INOUT) :: op
    2211              : !  TYPE(BathOperatoroffdiag)    , INTENT(INOUT) :: Bath
    2212              : !  TYPE(ImpurityOperator), INTENT(INOUT) :: Impurity
    2213              :   LOGICAL               , INTENT(  OUT) :: updated
    2214              : !Local variables ------------------------------
    2215              :   INTEGER                               :: position
    2216              :   INTEGER         , DIMENSION(1:2)     :: nature ! -2 for antiseg and 1 for seg
    2217              :   INTEGER                               :: i! -2 for antiseg and 1 for seg
    2218              :   !INTEGER                               :: it,it1 !ii,
    2219              :   DOUBLE PRECISION                      :: action
    2220              :   DOUBLE PRECISION                      :: beta
    2221              :   DOUBLE PRECISION                      :: time1
    2222              :   DOUBLE PRECISION                      :: time2
    2223              :   DOUBLE PRECISION                      :: time_avail
    2224              :   DOUBLE PRECISION                      :: det_ratio,sign_det_ratio
    2225              :   DOUBLE PRECISION                      :: overlap
    2226              :   DOUBLE PRECISION                      :: length
    2227              :   DOUBLE PRECISION                      :: signe
    2228              :   DOUBLE PRECISION                      :: tail
    2229              :   INTEGER                      :: tailint
    2230              :   DOUBLE PRECISION                      :: signdet, signdetprev
    2231              :   DOUBLE PRECISION, DIMENSION(1:2)      :: CdagC_1
    2232              : 
    2233            0 :   IF ( .NOT. op%set ) &
    2234            0 :     CALL ERROR("Ctqmcoffdiag_trySegment : QMC not set                       ")
    2235              : 
    2236              :         !write(std_out,*) "      TryAddRemove start"
    2237            0 :   nature(1) = CTQMC_SEGME
    2238            0 :   nature(2) = CTQMC_ANTIS
    2239            0 :   beta      = op%beta
    2240              : 
    2241            0 :   updated = .FALSE.
    2242            0 :   tailint  = (op%Impurity%particles(op%Impurity%activeFlavor)%tail)
    2243            0 :   tail  = DBLE(tailint)
    2244              :   !write(std_out,*) "op%Impurity%particles(op%Impurity%activeFlavor)%tail",op%Impurity%activeFlavor,tail
    2245              : 
    2246              : 
    2247              :   !=====================================
    2248              :   ! First choose segment or antisegment
    2249              :   !=====================================
    2250            0 :   DO i = 1, 2
    2251            0 :     signe = SIGN(1.d0,DBLE(nature(i)))
    2252              : !      -----  1: segment        signe= 1  ( CTQMC_SEGME =  1 )
    2253              : !      -----  2: antisegment    signe=-1  ( CTQMC_ANTIS = -2 )
    2254              : !    NB: Sign(a,b) = sign(b) * a
    2255              : 
    2256              :  !prt!if(op%prtopt==1) write(std_out,*) "       ==Starting configuration",i
    2257              :  !prt!if(op%prtopt==1) write(std_out,*) "        = Segments:"
    2258            0 :     tailint  = (op%Impurity%particles(op%Impurity%activeFlavor)%tail)
    2259              : !prt!    do ii=0, op%Impurity%Particles(op%Impurity%activeFlavor)%tail
    2260              :  !prt!if(op%prtopt==1)  write(std_out,*) ii, op%Impurity%Particles(op%Impurity%activeFlavor)%list(ii,1), &
    2261              : !prt!&                    op%Impurity%Particles(op%Impurity%activeFlavor)%list(ii,2)
    2262              : !prt!    enddo
    2263              :   !sui!write(std_out,*) "        = M Matrix",op%Bath%sumtails
    2264              : !prt!    do it=1,op%Bath%sumtails
    2265              :     !sui!write(std_out,'(a,3x,500e10.3)') "        M start",(op%Bath%M%mat(it,it1),it1=1,op%Bath%sumtails)
    2266              : !prt!    enddo
    2267            0 :     CALL OurRng(op%seed,action)
    2268              : 
    2269              :     !==========================
    2270              :     ! Add segment/antisegment
    2271              :     !==========================
    2272            0 :     IF ( action .LT. .5d0 ) THEN ! Add a segment or antisegment
    2273              :      !ii  write(std_out,*) "        =try: Segment added of type",i,op%prtopt
    2274              : 
    2275              :       ! Select time1 (>0) in [0,beta]
    2276              :       !==============================
    2277            0 :       CALL OurRng(op%seed,time1)
    2278            0 :       time1 = time1 * beta
    2279              : 
    2280              :       ! time_avail is the distance between between time1 and
    2281              :       !   - the next start of a segment for a segment addition
    2282              :       !   - the next end of a segment for an antisegment addition
    2283              :       ! ImpurityOperator_getAvailableTime > 0 for a segment      (signe>0) -> time_avail>0
    2284              :       ! ImpurityOperator_getAvailableTime < 0 for an antisegment (signe<0) -> time_avail>0
    2285              :       !====================================================================
    2286            0 :       time_avail = ImpurityOperator_getAvailableTime(op%Impurity,time1,position) * signe
    2287              :      !ii  write(std_out,*) "        =try: time_avail",time_avail,time1
    2288            0 :       IF ( time_avail .GT. 0.d0 ) THEN
    2289              : 
    2290              :         ! Time2 is  the length of the proposed new (anti)segment
    2291              :         !=======================================================
    2292            0 :         CALL OurRng(op%seed,time2)
    2293            0 :         IF ( time2 .EQ. 0.d0 ) CALL OurRng(op%seed,time2) ! Prevent null segment
    2294              : 
    2295              :         ! Now time2 is the time at the end of the proposed new (anti) segment
    2296              :         ! time2 > time1
    2297              :         !====================================================================
    2298            0 :         time2     = time1 + time2 * time_avail
    2299              :       !sui!write(std_out,*) tailint+1,time1,time2,position
    2300              : !        CALL CdagC_init(CdagC_1,time1,time2)
    2301              : 
    2302              :         ! CdagC_1 gives the stard/end times for the proposed new segment/antisegment
    2303              :         ! CdagC1(C_) can  be above beta.
    2304              :         !  For a      segment CdagC_1(Cdag_) = time1 < CdagC_1(C_) = time2, l=time2-time1 > 0
    2305              :         !  For a anti segment CdagC_1(Cdag_) = time2 > CdagC_1(C_) = time1, l=time1-time2 < 0
    2306              :         !  time2 can be above beta and thus for a      segment CdagC_1(C_   ) > beta
    2307              :         !  time2 can be above beta and thus for an antisegment CdagC_1(Cdag_) > beta
    2308              :         !  length > 0 for     segment
    2309              :         !  length < 0 for antisegment
    2310              :         !====================================================================================
    2311            0 :         CdagC_1(Cdag_) = ((1.d0+signe)*time1+(1.d0-signe)*time2)*0.5d0
    2312            0 :         CdagC_1(C_   ) = ((1.d0+signe)*time2+(1.d0-signe)*time1)*0.5d0
    2313              : !        length    = CdagC_length(CdagC_1)
    2314            0 :         length    = CdagC_1(C_   ) - CdagC_1(Cdag_)
    2315              :         !write(std_out,*) "      try : times", CdagC_1(C_   ),CdagC_1(Cdag_)
    2316              :         !write(std_out,*) "      length", length
    2317              : 
    2318              : !      -----  Computes the determinant ratio
    2319            0 :         det_ratio = BathOperatoroffdiag_getDetAdd(op%Bath,CdagC_1,position,op%Impurity%particles)
    2320              : 
    2321              : !      -----  Computes the overlap
    2322            0 :         overlap   = ImpurityOperator_getNewOverlap(op%Impurity,CdagC_1)
    2323            0 :         signdetprev  = ImpurityOperator_getsign(op%Impurity, time2, i, action, position)
    2324              : 
    2325              :         !write(std_out,*) "      overlap   ", overlap
    2326            0 :         CALL OurRng(op%seed,time1)
    2327              :         !write(std_out,*) "      Rnd", time1
    2328            0 :         signdet=1.d0
    2329            0 :         det_ratio=det_ratio*signdetprev
    2330              : 
    2331            0 :         IF ( det_ratio .LT. 0.d0 ) THEN
    2332              :         !sui!write(std_out,*) "         NEGATIVE DET",det_ratio,signdetprev
    2333            0 :           det_ratio   = - det_ratio
    2334            0 :           sign_det_ratio=-1
    2335            0 :           op%stats(nature(i)+CTQMC_DETSI) = op%stats(nature(i)+CTQMC_DETSI) + 1.d0
    2336              :        !  op%signvaluecurrent=-1.d0
    2337              :         ELSE
    2338              :           sign_det_ratio=1
    2339              :        !  op%signvaluecurrent=+1.d0
    2340              :          ! signdet=-1.d0
    2341              :         !sui!write(std_out,*) "                  DET",det_ratio,signdetprev
    2342              :         END IF
    2343              :       !ii  write(std_out,*) "                  DET",det_ratio
    2344              :        ! op%signvaluemeas=op%signvaluemeas+1.d0
    2345              :         !write(std_out,*) "        .................",(time1 * (tail + 1.d0 )),beta * time_avail * det_ratio * DEXP(op%mu(op%Impurity%activeFlavor)*length + overlap)
    2346              :         !write(std_out,*) "        .................",beta , time_avail , op%mu(op%Impurity%activeFlavor),op%Impurity%activeFlavor
    2347              : 
    2348            0 :         IF ( (time1 * (tail + 1.d0 )) &
    2349              :              .LT. (beta * time_avail * det_ratio * DEXP(op%mu(op%Impurity%activeFlavor)*length + overlap) ) ) THEN
    2350              : !          write(*,*) "before"
    2351              : !          CALL ListCdagCoffdiag_print(op%Impurity%particles(op%Impurity%activeFlavor),6)
    2352            0 :           CALL ImpurityOperator_add(op%Impurity,CdagC_1,position)
    2353              : !          write(*,*) "after "
    2354              : !          CALL ListCdagCoffdiag_print(op%Impurity%particles(op%Impurity%activeFlavor),6)
    2355            0 :           CALL BathOperatoroffdiag_setMAdd(op%bath,op%Impurity%particles)
    2356            0 :           op%stats(nature(i)+CTQMC_ADDED) = op%stats(nature(i)+CTQMC_ADDED)  + 1.d0
    2357            0 :           updated = .TRUE. .OR. updated
    2358            0 :           tail = tail + 1.d0
    2359            0 :           tailint = tailint + 1
    2360              : !          read(*,*) time1
    2361              :           !ii  write(6,*) "        Accepted addition, new conf is",time1
    2362              :          !prt! do ii=0, op%Impurity%Particles(op%Impurity%activeFlavor)%tail
    2363              :           !prt!if(op%prtopt==1)  write(6,*) ii, op%Impurity%Particles(op%Impurity%activeFlavor)%list(ii,1),&
    2364              : !prt!&                          op%Impurity%Particles(op%Impurity%activeFlavor)%list(ii,2)
    2365              :          !prt! enddo
    2366              :         !sui!write(6,*) "        = M Matrix"
    2367              :          !prt! do it=1,op%Bath%sumtails
    2368              :           !sui!write(6,*) "        M new",(op%Bath%M%mat(it,it1),it1=1,op%Bath%sumtails)
    2369              :          !prt! enddo
    2370              : 
    2371            0 :           IF ( sign_det_ratio .LT. 0.d0 ) op%signvalue=-op%signvalue
    2372              :         !sui!write(6,*) "                  signvalue",op%signvalue
    2373              :         ELSE
    2374              :      !ii  write(6,*) "        Refused      addition: proba",time1
    2375              :         END IF
    2376              :       ELSE
    2377              :     !sui!write(6,*) "        Refused      addition: time_avail <0"
    2378              :       END IF
    2379              : 
    2380              :     !========================================
    2381              :     ! Remove segment/antisegment
    2382              :     !========================================
    2383              :     ELSE ! Remove a segment among the segment of the flavor activeflavor
    2384              :       !ii if(op%prtopt==1)  write(6,*) "        =try: Segment removed of type",i
    2385            0 :       IF ( tail .GT. 0.d0 ) THEN
    2386            0 :         CALL OurRng(op%seed,time1)
    2387            0 :         position = INT(((time1 * tail) + 1.d0) * signe )
    2388              :         !prt!if(op%prtopt==1)  write(6,*) "         position",position
    2389            0 :         time_avail = ImpurityOperator_getAvailedTime(op%Impurity,position)
    2390            0 :         det_ratio  = BathOperatoroffdiag_getDetRemove(op%Bath,position)
    2391              :         !write(6,*) "        det_ratio", det_ratio
    2392            0 :         CdagC_1    = ImpurityOperator_getSegment(op%Impurity,position)
    2393              : !        length     = CdagC_length(CdagC_1)
    2394            0 :         length     = CdagC_1(C_) - CdagC_1(Cdag_)
    2395              :         !write(6,*) "        length   ", length
    2396            0 :         overlap    = ImpurityOperator_getNewOverlap(op%Impurity,CdagC_1)
    2397              :         !write(6,*) "        overlap  ", overlap
    2398            0 :         CALL OurRng(op%seed,time1)
    2399              :         !write(6,*) "        Random   ",time1
    2400            0 :         signdetprev = ImpurityOperator_getsign(op%Impurity, time2, i, action, position)
    2401            0 :         det_ratio=det_ratio*signdetprev
    2402            0 :         signdet=1.d0
    2403            0 :         IF ( det_ratio .LT. 0.d0 ) THEN
    2404              :         !sui!write(6,*) "         NEGATIVE DET",det_ratio,signdetprev
    2405            0 :           det_ratio   = -det_ratio
    2406            0 :           sign_det_ratio=-1
    2407              : !          op%seg_sign = op%seg_sign + 1.d0
    2408            0 :           op%stats(nature(i)+CTQMC_DETSI) = op%stats(nature(i)+CTQMC_DETSI) + 1.d0
    2409            0 :           signdet=-1.d0
    2410              :         ELSE
    2411              :           sign_det_ratio=1
    2412              :         !sui!write(6,*) "                  DET",det_ratio,signdetprev
    2413              :         END IF
    2414              :        !ii  write(6,*) "                  DET",det_ratio
    2415            0 :         IF ( (time1 * beta * time_avail * DEXP(op%mu(op%Impurity%activeFlavor)*length+overlap)) &
    2416              :              .LT. (tail * det_ratio ) ) THEN
    2417            0 :           CALL ImpurityOperator_remove(op%Impurity,position)
    2418            0 :           CALL BathOperatoroffdiag_setMRemove(op%Bath,op%Impurity%particles)
    2419              :           !op%seg_removed = op%seg_removed  + 1.d0
    2420            0 :           op%stats(nature(i)+CTQMC_REMOV) = op%stats(nature(i)+CTQMC_REMOV)  + 1.d0
    2421            0 :           updated = .TRUE. .OR. updated
    2422            0 :           tail = tail -1.d0
    2423            0 :           tailint = tailint -1
    2424              :           !ii  write(6,*) "        Accepted removal, new conf is:",time1
    2425              :       !prt!    do ii=0, op%Impurity%Particles(op%Impurity%activeFlavor)%tail
    2426              :           !prt!if(op%prtopt==1)  write(6,*) ii, op%Impurity%Particles(op%Impurity%activeFlavor)%list(ii,1),&
    2427              : !prt!&                          op%Impurity%Particles(op%Impurity%activeFlavor)%list(ii,2)
    2428              :       !prt!    enddo
    2429              :         !sui!write(6,*) "        = M Matrix"
    2430              :        !prt!   do it=1,op%Bath%sumtails
    2431              :           !sui!write(6,*) "        M new",(op%Bath%M%mat(it,it1),it1=1,op%Bath%sumtails)
    2432              :         !prt!  enddo
    2433            0 :           IF ( sign_det_ratio .LT. 0.d0 ) op%signvalue=-op%signvalue
    2434              :         !sui!write(6,*) "                  signvalue",op%signvalue
    2435              :         ELSE
    2436              :      !ii  write(6,*) "        Refused      removal",time1
    2437              :         END IF
    2438              :       ELSE
    2439              :       !sui!write(6,*) "        Refused      removal: no segment available"
    2440              :       END IF
    2441              :     END IF
    2442              :     !========================================
    2443              :     ! End Add/Remove Antisegment
    2444              :     !========================================
    2445              :   END DO
    2446            0 : END SUBROUTINE Ctqmcoffdiag_tryAddRemove
    2447              : !!***
    2448              : 
    2449              : !!SUBROUTINE Ctqmcoffdiag_trySegment(op,updated)
    2450              : !!!  TYPE(BathOperatoroffdiag)    , INTENT(INOUT) :: Bath
    2451              : !!!  TYPE(ImpurityOperator), INTENT(INOUT) :: Impurity
    2452              : !!  LOGICAL               , INTENT(INOUT) :: updated
    2453              : !!  INTEGER                               :: position
    2454              : !!  DOUBLE PRECISION                      :: action
    2455              : !!  DOUBLE PRECISION                      :: beta
    2456              : !!  DOUBLE PRECISION                      :: time1
    2457              : !!  DOUBLE PRECISION                      :: time2
    2458              : !!  DOUBLE PRECISION                      :: time_avail
    2459              : !!  DOUBLE PRECISION                      :: det_ratio
    2460              : !!  DOUBLE PRECISION                      :: overlap
    2461              : !!  DOUBLE PRECISION                      :: length
    2462              : !!  DOUBLE PRECISION                      :: tail
    2463              : !!  DOUBLE PRECISION, DIMENSION(1:2)      :: CdagC_1
    2464              : !!
    2465              : !!  IF ( .NOT. op%set ) &
    2466              : !!    CALL ERROR("Ctqmcoffdiag_trySegment : QMC not set                       ")
    2467              : !!
    2468              : !!  beta     =  op%beta
    2469              : !!  tail     = DBLE(op%Impurity%particles(op%Impurity%activeFlavor)%tail)
    2470              : !!
    2471              : !!  CALL RANDOM_NUMBER(action)
    2472              : !!
    2473              : !!  updated = .FALSE.
    2474              : !!
    2475              : !!  IF ( action .LT. .5d0 ) THEN ! Ajout de segment
    2476              : !!    CALL RANDOM_NUMBER(time1)
    2477              : !!    time1 = time1 * beta
    2478              : !!    time_avail = ImpurityOperator_getAvailableTime(op%Impurity,time1,position)
    2479              : !!    IF ( time_avail .GT. 0.d0 ) THEN
    2480              : !!      CALL RANDOM_NUMBER(time2)
    2481              : !!      time2     = time1 + time2 * time_avail
    2482              : !!!      CALL CdagC_init(CdagC_1,time1,time2)
    2483              : !!      CdagC_1(Cdag_) = time1
    2484              : !!      CdagC_1(C_   ) = time2
    2485              : !!!      length    = CdagC_length(CdagC_1)
    2486              : !!      length    = time2 - time1
    2487              : !!      det_ratio = BathOperatoroffdiag_getDetAdd(op%Bath,CdagC_1,position,op%Impurity%particles(op%Impurity%activeFlavor))
    2488              : !!      overlap   = ImpurityOperator_getNewOverlap(op%Impurity,CdagC_1)
    2489              : !!      CALL RANDOM_NUMBER(time1)
    2490              : !!      IF ( det_ratio .LT. 0.d0 ) THEN
    2491              : !!        det_ratio   = -det_ratio
    2492              : !!        op%stats(CTQMC_SEGME+CTQMC_DETSI) = op%stats(CTQMC_SEGME+CTQMC_DETSI) + SIGN(1.d0,det_ratio)
    2493              : !!      END IF
    2494              : !!      IF ( (time1 * (tail + 1.d0 )) &
    2495              : !!           .LT. (beta * time_avail * det_ratio * DEXP(op%mu(op%Impurity%activeFlavor)*length + overlap) ) ) THEN
    2496              : !!        write(*,*) position
    2497              : !!        CALL ImpurityOperator_add(op%Impurity,CdagC_1,position)
    2498              : !!        CALL BathOperatoroffdiag_setMAdd(op%bath,op%Impurity%particles(op%Impurity%activeFlavor))
    2499              : !!        op%stats(CTQMC_SEGME+CTQMC_ADDED) = op%stats(CTQMC_SEGME+CTQMC_ADDED)  + 1.d0
    2500              : !!        updated = .TRUE.
    2501              : !!      END IF
    2502              : !!    END IF
    2503              : !!
    2504              : !!  ELSE ! Supprimer un segment
    2505              : !!    IF ( tail .GT. 0.d0 ) THEN
    2506              : !!      CALL RANDOM_NUMBER(time1)
    2507              : !!      position = INT(time1 * tail) + 1
    2508              : !!      time_avail = ImpurityOperator_getAvailedTime(op%Impurity,position)
    2509              : !!      det_ratio  = BathOperatoroffdiag_getDetRemove(op%Bath,position)
    2510              : !!      CdagC_1    = ImpurityOperator_getSegment(op%Impurity,position)
    2511              : !!!      length     = CdagC_length(CdagC_1)
    2512              : !!      length     = CdagC_1(C_) - CdagC_1(Cdag_)
    2513              : !!      overlap    = ImpurityOperator_getNewOverlap(op%Impurity,CdagC_1)
    2514              : !!      CALL RANDOM_NUMBER(time1)
    2515              : !!      IF ( det_ratio .LT. 0.d0 ) THEN
    2516              : !!        det_ratio   = -det_ratio
    2517              : !!!        op%seg_sign = op%seg_sign + 1.d0
    2518              : !!        op%stats(CTQMC_SEGME+CTQMC_DETSI) = op%stats(CTQMC_SEGME+CTQMC_DETSI) + SIGN(1.d0,det_ratio)
    2519              : !!      END IF
    2520              : !!      IF ( (time1 * beta * time_avail * DEXP(op%mu(op%Impurity%activeFlavor)*length+overlap)) &
    2521              : !!           .LT. (tail * det_ratio ) ) THEN
    2522              : !!        write(*,*) position
    2523              : !!        CALL ImpurityOperator_remove(op%Impurity,position)
    2524              : !!        CALL BathOperatoroffdiag_setMRemove(op%Bath,op%Impurity%particles(op%Impurity%activeFlavor))
    2525              : !!        !op%seg_removed = op%seg_removed  + 1.d0
    2526              : !!        op%stats(CTQMC_SEGME+CTQMC_REMOV) = op%stats(CTQMC_SEGME+CTQMC_REMOV)  + 1.d0
    2527              : !!        updated = .TRUE.
    2528              : !!      END IF
    2529              : !!    END IF
    2530              : !!  END IF
    2531              : !!END SUBROUTINE Ctqmcoffdiag_trySegment
    2532              : !!***
    2533              : !!
    2534              : !!SUBROUTINE Ctqmcoffdiag_tryAntiSeg(op, updated)
    2535              : !!!  TYPE(BathOperatoroffdiag)    , INTENT(INOUT) :: Bath
    2536              : !!!  TYPE(ImpurityOperator), INTENT(INOUT) :: Impurity
    2537              : !!  LOGICAL               , INTENT(INOUT) :: updated
    2538              : !!  INTEGER                               :: position
    2539              : !!  DOUBLE PRECISION                      :: action
    2540              : !!  DOUBLE PRECISION                      :: beta
    2541              : !!  DOUBLE PRECISION                      :: time1
    2542              : !!  DOUBLE PRECISION                      :: time2
    2543              : !!  DOUBLE PRECISION                      :: time_avail
    2544              : !!  DOUBLE PRECISION                      :: det_ratio
    2545              : !!  DOUBLE PRECISION                      :: overlap
    2546              : !!  DOUBLE PRECISION                      :: length
    2547              : !!  DOUBLE PRECISION                      :: tail
    2548              : !!  DOUBLE PRECISION, DIMENSION(1:2)      :: CdagC_1
    2549              : !!
    2550              : !!  IF ( .NOT. op%set ) &
    2551              : !!    CALL ERROR("Ctqmcoffdiag_trySegment : QMC not set                       ")
    2552              : !!
    2553              : !!  beta     =  op%beta
    2554              : !!  tail     =  DBLE(op%Impurity%particles(op%Impurity%activeFlavor)%tail)
    2555              : !!
    2556              : !!  CALL RANDOM_NUMBER(action)
    2557              : !!
    2558              : !!  updated = .FALSE.
    2559              : !!
    2560              : !!  IF ( action .LT. .5d0 ) THEN ! Ajout d'un antiseg
    2561              : !!    CALL RANDOM_NUMBER(time1)
    2562              : !!    time1 = time1 * beta
    2563              : !!    time_avail = ImpurityOperator_getAvailableTime(op%Impurity,time1,position)
    2564              : !!    IF ( time_avail .LT. 0.d0 ) THEN
    2565              : !!      CALL RANDOM_NUMBER(time2)
    2566              : !!      time2     = time1 - time2 * time_avail
    2567              : !!!      CALL CdagC_init(CdagC_1,time2,time1)
    2568              : !!      CdagC_1(Cdag_) = time2
    2569              : !!      CdagC_1(C_   ) = time1
    2570              : !!!      length    = CdagC_length(CdagC_1) ! /!\ length is negative
    2571              : !!      length = time1 - time2
    2572              : !!      det_ratio = BathOperatoroffdiag_getDetAdd(op%Bath,CdagC_1,position,op%Impurity%particles(op%Impurity%activeFlavor))
    2573              : !!      overlap   = ImpurityOperator_getNewOverlap(op%Impurity,CdagC_1) ! OK
    2574              : !!      CALL RANDOM_NUMBER(time1)
    2575              : !!      IF ( det_ratio .LT. 0.d0 ) THEN
    2576              : !!        det_ratio    = -det_ratio
    2577              : !!!        op%anti_sign = op%anti_sign + 1.d0
    2578              : !!        op%stats(CTQMC_ANTIS+CTQMC_DETSI) = op%stats(CTQMC_ANTIS+CTQMC_DETSI) + SIGN(1.d0,det_ratio)
    2579              : !!      END IF
    2580              : !!      IF ( (time1 * (tail + 1.d0 )) &
    2581              : !!           .LT. (beta * ABS(time_avail) * det_ratio * DEXP(op%mu(op%Impurity%activeFlavor)*length + overlap) ) ) THEN
    2582              : !!        CALL ImpurityOperator_add(op%Impurity,CdagC_1,position)
    2583              : !!        !write(*,*) position
    2584              : !!        CALL BathOperatoroffdiag_setMAdd(op%bath,op%Impurity%particles(op%Impurity%activeFlavor))
    2585              : !!        !op%anti_added = op%anti_added  + 1.d0
    2586              : !!        op%stats(CTQMC_ANTIS+CTQMC_ADDED) = op%stats(CTQMC_ANTIS+CTQMC_ADDED)  + 1.d0
    2587              : !!        updated = .TRUE.
    2588              : !!      END IF
    2589              : !!    END IF
    2590              : !!  ELSE ! Supprimer un antiseg
    2591              : !!    IF ( tail .GT. 0.d0 ) THEN
    2592              : !!      CALL RANDOM_NUMBER(time1)
    2593              : !!      position = -(INT(time1 * tail) + 1)
    2594              : !!      time_avail = ImpurityOperator_getAvailedTime(op%Impurity,position)!OK
    2595              : !!      det_ratio  = BathOperatoroffdiag_getDetRemove(op%Bath,position)!OK
    2596              : !!      CdagC_1    = ImpurityOperator_getSegment(op%Impurity,position)!OK
    2597              : !!!      length     = CdagC_length(CdagC_1) ! /!\ length is negative
    2598              : !!      length = CdagC_1(C_) - CdagC_1(Cdag_)
    2599              : !!      overlap    = ImpurityOperator_getNewOverlap(op%Impurity,CdagC_1) !OK
    2600              : !!      CALL RANDOM_NUMBER(time1)
    2601              : !!      IF ( det_ratio .LT. 0.d0 ) THEN
    2602              : !!        det_ratio   = -det_ratio
    2603              : !!!        op%anti_sign = op%anti_sign + 1.d0
    2604              : !!        op%stats(CTQMC_ANTIS+CTQMC_DETSI) = op%stats(CTQMC_ANTIS+CTQMC_DETSI) + SIGN(1.d0,det_ratio)
    2605              : !!      END IF
    2606              : !!      IF ( (time1 * beta * time_avail * DEXP(op%mu(op%Impurity%activeFlavor)*length+overlap)) &
    2607              : !!           .LT. (tail * det_ratio ) ) THEN
    2608              : !!        CALL ImpurityOperator_remove(op%Impurity,position)
    2609              : !!        !write(*,*) position
    2610              : !!        CALL BathOperatoroffdiag_setMRemove(op%Bath,op%Impurity%particles(op%Impurity%activeFlavor))
    2611              : !!        !op%anti_removed = op%anti_removed  + 1.d0
    2612              : !!        op%stats(CTQMC_ANTIS+CTQMC_REMOV) = op%stats(CTQMC_ANTIS+CTQMC_REMOV)  + 1.d0
    2613              : !!        updated = .TRUE.
    2614              : !!      END IF
    2615              : !!    END IF
    2616              : !!  END IF
    2617              : !!END SUBROUTINE Ctqmcoffdiag_tryAntiSeg
    2618              : !!***
    2619              : 
    2620              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_trySwap
    2621              : !! NAME
    2622              : !!  Ctqmcoffdiag_trySwap
    2623              : !!
    2624              : !! FUNCTION
    2625              : !!  try a global move (swap to flavors)
    2626              : !!
    2627              : !! COPYRIGHT
    2628              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
    2629              : !!  This file is distributed under the terms of the
    2630              : !!  GNU General Public License, see ~abinit/COPYING
    2631              : !!  or http://www.gnu.org/copyleft/gpl.txt .
    2632              : !!
    2633              : !! INPUTS
    2634              : !!  op=ctqmc
    2635              : !!
    2636              : !! OUTPUT
    2637              : !!  flav_i=first flavor swaped
    2638              : !!  flav_j=second flavor swaped
    2639              : !!
    2640              : !! SIDE EFFECTS
    2641              : !!
    2642              : !! NOTES
    2643              : !!
    2644              : !! SOURCE
    2645              : 
    2646            0 : SUBROUTINE Ctqmcoffdiag_trySwap(op,flav_i,flav_j)
    2647              : 
    2648              : !Arguments ------------------------------------
    2649              :   TYPE(Ctqmcoffdiag)           , INTENT(INOUT) :: op
    2650              : !  TYPE(BathOperatoroffdiag)    , INTENT(INOUT) :: Bath
    2651              : !  TYPE(ImpurityOperator), INTENT(INOUT) :: Impurity
    2652              :   INTEGER               , INTENT(  OUT) :: flav_i
    2653              :   INTEGER               , INTENT(  OUT) :: flav_j
    2654              : !Local variables ------------------------------
    2655              :   INTEGER :: flavor_i
    2656              :   INTEGER :: flavor_j !,ii,it,it1 !,iflavor
    2657              :   DOUBLE PRECISION :: rnd
    2658              :   DOUBLE PRECISION :: lengthi
    2659              :   DOUBLE PRECISION :: lengthj
    2660              :   DOUBLE PRECISION :: overlapic1
    2661              :   DOUBLE PRECISION :: overlapjc1
    2662              :   DOUBLE PRECISION :: overlapic2
    2663              :   DOUBLE PRECISION :: overlapjc2
    2664              :   !DOUBLE PRECISION :: detic1
    2665              :   !DOUBLE PRECISION :: detjc1
    2666              :   !DOUBLE PRECISION :: detic2
    2667              :   !DOUBLE PRECISION :: detjc2
    2668              :   DOUBLE PRECISION :: det_ratio,detnew,detold
    2669              :   DOUBLE PRECISION :: local_ratio
    2670              :  ! TYPE(BathOperatoroffdiag)  :: Bathnew
    2671              : 
    2672              : 
    2673              :   !CALL RANDOM_NUMBER(rnd)
    2674            0 :   CALL OurRng(op%seed,rnd)
    2675            0 :   flavor_i = NINT(rnd*DBLE(op%flavors-1.d0))+1
    2676              :   !CALL RANDOM_NUMBER(rnd)
    2677            0 :   CALL OurRng(op%seed,rnd)
    2678            0 :   flavor_j = NINT(rnd*DBLE(op%flavors-1.d0))+1
    2679              :   !ii write(6,'(a,2i4)') "--------------- new swap --------------------------------",flavor_i,flavor_j
    2680              : 
    2681            0 :   flav_i = 0
    2682            0 :   flav_j = 0
    2683              :   !ii   do iflavor=1,op%flavors
    2684              :   !ii     write(6,*) "BEFORE  GMOVE For flavor", iflavor,"size is",op%Impurity%particles(iflavor)%tail," and  Conf is :"
    2685              :   !ii     do ii=1, op%Impurity%Particles(iflavor)%tail
    2686              :   !ii       write(6,'(i4,100f12.3)') ii, op%Impurity%Particles(iflavor)%list(ii,1),&
    2687              :   !ii  &                   op%Impurity%Particles(iflavor)%list(ii,2)
    2688              :   !ii     enddo
    2689              :   !ii   enddo
    2690              :   !ii   write(6,*) "        = M Matrix"
    2691              :   !ii   write(6,'(a,2x,100(i12))') "Flavor=",((iflavor,it=1,op%Impurity%particles(iflavor)%tail),iflavor=1,op%flavors)
    2692              :   !ii   write(6,'(i21,100i12)') ((it,it=1,op%Impurity%particles(iflavor)%tail),iflavor=1,op%flavors)
    2693              :   !ii   do it=1,op%Bath%sumtails
    2694              :   !ii     write(6,'(a,100f12.3)') "        M before",(op%Bath%M%mat(it,it1),it1=1,op%Bath%sumtails)
    2695              :   !ii   enddo
    2696              : 
    2697              :   ! todoba this part
    2698            0 :   IF ( flavor_i .NE. flavor_j ) THEN
    2699              :     !CALL BathOperatoroffdiag_init(Bathnew, op%flavors, op%samples, op%beta, 0, op%opt_nondiag)
    2700              :     ! On tente d'intervertir i et j
    2701              :     ! Configuration actuelle :
    2702              : 
    2703            0 :     op%modGlobalMove(2) = op%modGlobalMove(2)+1
    2704              :     ! ===========================================
    2705              :     ! First use M matrix to compute determinant
    2706              :     ! ===========================================
    2707            0 :     detold     = BathOperatoroffdiag_getDetF(op%Bath) ! use op%Bath%M
    2708              : 
    2709              :     ! ===========================================
    2710              :     ! Second build M_update matrix to compute determinant after.
    2711              :     ! ===========================================
    2712              :     !CALL ListCdagCoffdiag_print(particle)
    2713            0 :     call BathOperatoroffdiag_recomputeM(op%Bath,op%impurity%particles,flavor_i,flavor_j) ! compute op%Bath%M_update
    2714            0 :     detnew     = BathOperatoroffdiag_getDetF(op%Bath,option=1) ! use op%Bath%M_update
    2715              : 
    2716            0 :     lengthi    = ImpurityOperator_measN(op%Impurity,flavor_i)
    2717            0 :     lengthj    = ImpurityOperator_measN(op%Impurity,flavor_j)
    2718            0 :     overlapic1 = ImpurityOperator_overlapFlavor(op%Impurity,flavor_i)
    2719            0 :     overlapjc1 = ImpurityOperator_overlapFlavor(op%Impurity,flavor_j)
    2720              :     ! lengths unchanged
    2721            0 :     overlapic2 = ImpurityOperator_overlapSwap(op%Impurity,flavor_i,flavor_j)
    2722            0 :     overlapjc2 = ImpurityOperator_overlapSwap(op%Impurity,flavor_j,flavor_i)
    2723              : 
    2724              : !    IF ( detic1*detjc1 .EQ. detic2*detjc2 ) THEN
    2725              : !      det_ratio = 1.d0
    2726              : !    ELSE IF ( detic1*detjc1 .EQ. 0.d0 ) THEN
    2727              : !      det_ratio = detic2*detjc2 ! evite de diviser par 0 si pas de segment
    2728              : !    ELSE
    2729              : 
    2730            0 :     det_ratio = detnew/detold ! because the determinant is the determinant of F
    2731              :    !ii  write(6,*) "det_ratio, detold,detnew",det_ratio, detold,detnew, detold/detnew
    2732              : 
    2733              : !    END IF
    2734              :     local_ratio = DEXP(-overlapic2*overlapjc2+overlapic1*overlapjc1 &
    2735            0 :                       +(lengthj-lengthi)*(op%mu(flavor_i)-op%mu(flavor_j)))
    2736              :    !ii  write(6,*) "local_ratio",local_ratio
    2737              : 
    2738              :     ! Wloc = exp(muN-Uo)
    2739              :     !CALL RANDOM_NUMBER(rnd)
    2740            0 :     CALL OurRng(op%seed,rnd)
    2741            0 :     IF ( rnd .LT. local_ratio*det_ratio ) THEN ! swap accepted
    2742              :    !ii    write(6,*) "        = M Matrix before swap"
    2743              :    !ii    write(6,'(a,2x,100(i12))') "Flavor=",((iflavor,it=1,op%Impurity%particles(iflavor)%tail),iflavor=1,op%flavors)
    2744              :    !ii    write(6,'(i21,100i12)') ((it,it=1,op%Impurity%particles(iflavor)%tail),iflavor=1,op%flavors)
    2745              :    !ii    do it=1,op%Bath%sumtails
    2746              :    !ii      write(6,'(a,100f12.3)') "        M after ",(op%Bath%M%mat(it,it1),it1=1,op%Bath%sumtails)
    2747              :    !ii    enddo
    2748              :    !ii    do it=1,op%Bath%sumtails
    2749              :    !ii      write(6,'(a,100f12.3)') " update M after ",(op%Bath%M_update%mat(it,it1),it1=1,op%Bath%sumtails)
    2750              :    !ii    enddo
    2751              :    !ii    write(6,*) "Gmove accepted",rnd,local_ratio*det_ratio
    2752            0 :       CALL ImpurityOperator_swap(op%Impurity, flavor_i,flavor_j)
    2753            0 :       CALL BathOperatoroffdiag_swap    (op%Bath    , flavor_i,flavor_j) !  use op%Bath%M_update to built new op%Bath%M
    2754              : 
    2755            0 :       op%swap = op%swap + 1.d0
    2756            0 :       flav_i = flavor_i
    2757            0 :       flav_j = flavor_j
    2758              :     ELSE
    2759              :    !ii   write(6,*) "Gmove refused",rnd,local_ratio*det_ratio
    2760              : !      CALL WARN("Swap refused")
    2761              : !      WRITE(op%ostream,'(6E24.14)') local_ratio, det_ratio, detic1, detjc1, detic2, detjc2
    2762              :     END IF
    2763              :    ! CALL BathOperatoroffdiag_destroy(Bathnew)
    2764              :   END IF
    2765              :  !ii  do iflavor=1,op%flavors
    2766              :  !ii    write(6,*) "AFTER   GMOVE For flavor", iflavor,"size is",op%Impurity%particles(iflavor)%tail," and  Conf is :"
    2767              :  !ii    do ii=1, op%Impurity%Particles(iflavor)%tail
    2768              :  !ii      write(6,'(15x,i4,100f12.3)') ii, op%Impurity%Particles(iflavor)%list(ii,1),&
    2769              :  !ii &                   op%Impurity%Particles(iflavor)%list(ii,2)
    2770              :  !ii    enddo
    2771              :  !ii  enddo
    2772              :  !ii  write(6,*) "        = M Matrix"
    2773              :  !ii  write(6,'(a,2x,100(i12))') "Flavor=",((iflavor,it=1,op%Impurity%particles(iflavor)%tail),iflavor=1,op%flavors)
    2774              :  !ii  write(6,'(i21,100i12)') ((it,it=1,op%Impurity%particles(iflavor)%tail),iflavor=1,op%flavors)
    2775              :  !ii  do it=1,op%Bath%sumtails
    2776              :  !ii    write(6,'(a,100f12.3)') "        M after ",(op%Bath%M%mat(it,it1),it1=1,op%Bath%sumtails)
    2777              :  !ii  enddo
    2778              :  !ii  do it=1,op%Bath%sumtails
    2779              :  !ii    write(6,'(a,100f12.3)') " update M after ",(op%Bath%M_update%mat(it,it1),it1=1,op%Bath%sumtails)
    2780              :  !ii  enddo
    2781              : 
    2782            0 : END SUBROUTINE Ctqmcoffdiag_trySwap
    2783              : !!***
    2784              : 
    2785              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_measN
    2786              : !! NAME
    2787              : !!  Ctqmcoffdiag_measN
    2788              : !!
    2789              : !! FUNCTION
    2790              : !!  measures the number of electron
    2791              : !!  by taking into account the value for the move before before this one
    2792              : !!  with the correct weight.
    2793              : !!
    2794              : !! COPYRIGHT
    2795              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
    2796              : !!  This file is distributed under the terms of the
    2797              : !!  GNU General Public License, see ~abinit/COPYING
    2798              : !!  or http://www.gnu.org/copyleft/gpl.txt .
    2799              : !!
    2800              : !! INPUTS
    2801              : !!  op=ctqmc
    2802              : !!  iflavor=which flavor to measure
    2803              : !!  updated=something has changed since last time
    2804              : !!
    2805              : !! OUTPUT
    2806              : !!
    2807              : !! SIDE EFFECTS
    2808              : !!
    2809              : !! NOTES
    2810              : !!
    2811              : !! SOURCE
    2812              : 
    2813            0 : SUBROUTINE Ctqmcoffdiag_measN(op, iflavor, updated)
    2814              : 
    2815              : !Arguments ------------------------------------
    2816              :   TYPE(Ctqmcoffdiag)             , INTENT(INOUT)     :: op
    2817              :   !TYPE(ImpurityOperator), INTENT(IN   )     :: impurity
    2818              :   INTEGER               , INTENT(IN   )     :: iflavor
    2819              :   LOGICAL               , INTENT(IN   )     :: updated
    2820              : 
    2821              : !  IF ( .NOT. op%set ) &
    2822              : !    CALL ERROR("Ctqmcoffdiag_measN : QMC not set                           ")
    2823              : 
    2824              : 
    2825            0 :   IF ( updated .EQV. .TRUE. ) THEN
    2826              : !  --- accumulate occupations with values op%measN(3,iflavor) from the last measurements with the corresponding weight
    2827              : !  ---  op*measN(4,iflavor)
    2828            0 :     op%measN(1,iflavor) = op%measN(1,iflavor) + op%measN(3,iflavor)*op%measN(4,iflavor)
    2829              :    ! write(6,*) "Cllll42"
    2830              : 
    2831              : !  --- Compute total number of new measurements
    2832            0 :     op%measN(2,iflavor) = op%measN(2,iflavor) + op%measN(4,iflavor)
    2833              : 
    2834              :    ! write(6,*) "Allll42"
    2835              : !  --- Compute the occupation for this configuration (will be put in
    2836              : !  --- op%measN(1,iflavor) at the next occurence of updated=.true.), with
    2837              : !  --- the corresponding weight  op%measN(4,iflavor) (we do not now it yet)
    2838            0 :     op%measN(3,iflavor) = ImpurityOperator_measN(op%impurity)
    2839              : 
    2840              : !  --- set weight: as update=true, it is a new measurement , so put it to one
    2841            0 :     op%measN(4,iflavor) = 1.d0
    2842              : 
    2843              :   ELSE
    2844              : !  --- increased the count so that at new move, we will be able to update measN(1) correctly.
    2845            0 :     op%measN(4,iflavor) = op%measN(4,iflavor) + 1.d0
    2846              :    ! write(6,*) "Bllll42"
    2847              :   END IF
    2848            0 : END SUBROUTINE Ctqmcoffdiag_measN
    2849              : !!***
    2850              : 
    2851              : !#ifdef CTCtqmcoffdiag_ANALYSIS
    2852              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_measCorrelation
    2853              : !! NAME
    2854              : !!  Ctqmcoffdiag_measCorrelation
    2855              : !!
    2856              : !! FUNCTION
    2857              : !!  measure all correlations in times for a flavor
    2858              : !!
    2859              : !! COPYRIGHT
    2860              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
    2861              : !!  This file is distributed under the terms of the
    2862              : !!  GNU General Public License, see ~abinit/COPYING
    2863              : !!  or http://www.gnu.org/copyleft/gpl.txt .
    2864              : !!
    2865              : !! INPUTS
    2866              : !!  op=ctqmc
    2867              : !!  iflavor=the flavor to measure
    2868              : !!
    2869              : !! OUTPUT
    2870              : !!
    2871              : !! SIDE EFFECTS
    2872              : !!
    2873              : !! NOTES
    2874              : !!
    2875              : !! SOURCE
    2876              : 
    2877            0 : SUBROUTINE Ctqmcoffdiag_measCorrelation(op, iflavor)
    2878              : 
    2879              : !Arguments ------------------------------------
    2880              :   TYPE(Ctqmcoffdiag)             , INTENT(INOUT)       :: op
    2881              :   !TYPE(ImpurityOperator), INTENT(IN   )       :: impurity
    2882              :   INTEGER               , INTENT(IN   )       :: iflavor
    2883              : !Local variables ------------------------------
    2884              :   INTEGER                                     :: iCdag
    2885              :   INTEGER                                     :: iCdagBeta
    2886              :   INTEGER                                     :: iC
    2887              :   INTEGER                                     :: index
    2888              :   INTEGER                                     :: size
    2889              :   DOUBLE PRECISION                            :: tC
    2890              :   DOUBLE PRECISION                            :: tCdag
    2891              :   !DOUBLE PRECISION                            :: time
    2892              :   DOUBLE PRECISION                            :: inv_dt
    2893              :   DOUBLE PRECISION                            :: beta
    2894              : 
    2895            0 :   IF ( .NOT. op%set ) &
    2896            0 :     CALL ERROR("Ctqmcoffdiag_measCorrelation : QMC not set                 ")
    2897              :     !write(6,*) "not available"
    2898            0 :     stop
    2899              : 
    2900              :   size = op%impurity%particles(op%impurity%activeFlavor)%tail
    2901              :   beta = op%beta
    2902              : 
    2903              :   IF ( size .EQ. 0 ) RETURN
    2904              : 
    2905              :   inv_dt = op%inv_dt
    2906              : 
    2907              :   DO iCdag = 1, size ! first segments
    2908              :     tCdag  = op%impurity%particles(op%impurity%activeFlavor)%list(iCdag,Cdag_)
    2909              :     tC     = op%impurity%particles(op%impurity%activeFlavor)%list(iCdag,C_   )
    2910              :     index = INT( ( (tC - tCdag)  * inv_dt ) + .5d0 ) + 1
    2911              :     op%measCorrelation(index,1,iflavor) = op%measCorrelation(index,1,iflavor) + 1.d0
    2912              :     MODCYCLE(iCdag+1,size,iCdagBeta)
    2913              :     index = INT( ( ( &
    2914              :                     op%impurity%particles(op%impurity%activeFlavor)%list(iCdagBeta,Cdag_) - tC &
    2915              :                     + AINT(DBLE(iCdag)/DBLE(size))*beta &
    2916              :                    )  * inv_dt ) + .5d0 ) + 1
    2917              :     IF ( index .LT. 1 .OR. index .GT. op%samples+1 ) THEN
    2918              :       CALL WARN("Ctqmcoffdiag_measCorrelation : bad index line 1095         ")
    2919              :     ELSE
    2920              :       op%measCorrelation(index,2,iflavor) = op%measCorrelation(index,2,iflavor) + 1.d0
    2921              :     END IF
    2922              : !    DO iC = 1, size
    2923              : !      tC = impurity%particles(impurity%activeFlavor)%list(C_,iC)
    2924              : !      time = tC - tCdag
    2925              : !      IF ( time .LT. 0.d0 ) time = time + beta
    2926              : !      index = INT( ( time * inv_dt ) + .5d0 ) + 1
    2927              : !      op%measCorrelation(index,3,iflavor) = op%measCorrelation(index,3,iflavor) + 1.d0
    2928              : !    END DO
    2929              :     DO iC = 1, size!  op%Greens(iflavor)%index_old%tail
    2930              : !todoba        op%measCorrelation(op%Greens(iflavor)%map%listINT(iC+(iCdag-1)*size),3,iflavor) = &
    2931              : !todoba        op%measCorrelation(op%Greens(iflavor)%map%listINT(iC+(iCdag-1)*size),3,iflavor) + 1.d0
    2932              :     END DO
    2933              :   END DO
    2934              : 
    2935              : END SUBROUTINE Ctqmcoffdiag_measCorrelation
    2936              : !!***
    2937              : 
    2938              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_measPerturbation
    2939              : !! NAME
    2940              : !!  Ctqmcoffdiag_measPerturbation
    2941              : !!
    2942              : !! FUNCTION
    2943              : !!  measure perturbation order
    2944              : !!
    2945              : !! COPYRIGHT
    2946              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
    2947              : !!  This file is distributed under the terms of the
    2948              : !!  GNU General Public License, see ~abinit/COPYING
    2949              : !!  or http://www.gnu.org/copyleft/gpl.txt .
    2950              : !!
    2951              : !! INPUTS
    2952              : !!  op=ctqmc
    2953              : !!  iflavor=the flavor to measure
    2954              : !!
    2955              : !! OUTPUT
    2956              : !!
    2957              : !! SIDE EFFECTS
    2958              : !!
    2959              : !! NOTES
    2960              : !!
    2961              : !! SOURCE
    2962              : 
    2963            0 : SUBROUTINE Ctqmcoffdiag_measPerturbation(op, iflavor)
    2964              : 
    2965              : !Arguments ------------------------------------
    2966              :   TYPE(Ctqmcoffdiag)             , INTENT(INOUT)     :: op
    2967              :   !TYPE(ImpurityOperator), INTENT(IN   )     :: impurity
    2968              :   INTEGER               , INTENT(IN   )     :: iflavor
    2969              : !Local variables ------------------------------
    2970              :   INTEGER                                   :: index
    2971              : 
    2972            0 :   IF ( .NOT. op%set ) &
    2973            0 :     CALL ERROR("Ctqmcoffdiag_measiPerturbation : QMC not set               ")
    2974              : 
    2975            0 :   index = op%impurity%particles(op%impurity%activeFlavor)%tail + 1
    2976            0 :   IF ( index .LE. op%opt_order ) &
    2977            0 :     op%measPerturbation(index,iflavor) = op%measPerturbation(index,iflavor) + 1.d0
    2978            0 :   IF ( index == 1 ) THEN
    2979            0 :     IF (op%impurity%particles(iflavor)%list(0,C_) < op%impurity%particles(iflavor)%list(0,Cdag_) ) THEN
    2980            0 :       op%meas_fullemptylines(1,iflavor) = op%meas_fullemptylines(1,iflavor) + 1.d0
    2981              :     ELSE
    2982            0 :       op%meas_fullemptylines(2,iflavor) = op%meas_fullemptylines(2,iflavor) + 1.d0
    2983              :     ENDIF
    2984              :   ENDIF
    2985              : 
    2986            0 : END SUBROUTINE Ctqmcoffdiag_measPerturbation
    2987              : !!***
    2988              : !#endif
    2989              : 
    2990              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_getResult
    2991              : !! NAME
    2992              : !!  Ctqmcoffdiag_getResult
    2993              : !!
    2994              : !! FUNCTION
    2995              : !!  reduce everything to get the result of the simulation
    2996              : !!
    2997              : !! COPYRIGHT
    2998              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder,F. Gendron)
    2999              : !!  This file is distributed under the terms of the
    3000              : !!  GNU General Public License, see ~abinit/COPYING
    3001              : !!  or http://www.gnu.org/copyleft/gpl.txt .
    3002              : !!
    3003              : !! INPUTS
    3004              : !!  op=ctqmc
    3005              : !!
    3006              : !! OUTPUT
    3007              : !!
    3008              : !! SIDE EFFECTS
    3009              : !!
    3010              : !! NOTES
    3011              : !!
    3012              : !! SOURCE
    3013              : 
    3014            0 : SUBROUTINE Ctqmcoffdiag_getResult(op,Iatom,fname,jmjbasis)
    3015              : 
    3016              : 
    3017              : #ifdef HAVE_MPI1
    3018              : include 'mpif.h'
    3019              : #endif
    3020              : !Arguments ------------------------------------
    3021              :   TYPE(Ctqmcoffdiag)  , INTENT(INOUT)                    :: op
    3022              :   INTEGER, INTENT(IN ) :: Iatom
    3023              :   character(len=fnlen), INTENT(INOUT) :: fname
    3024              :   INTEGER, OPTIONAL, INTENT(IN )   :: jmjbasis
    3025              : !Local variables ------------------------------
    3026              :   INTEGER                                       :: iflavor
    3027              : !  INTEGER                                       :: iflavor1
    3028              : !  INTEGER                                       :: iflavor2
    3029              :   INTEGER                                       :: flavors
    3030              :   INTEGER                                       :: itau
    3031              :   INTEGER                                       :: endDensity
    3032              :   character(len=2)                              :: atomnb
    3033              :   DOUBLE PRECISION                              :: inv_flavors
    3034              :   DOUBLE PRECISION                              :: a
    3035              :   DOUBLE PRECISION                              :: b
    3036              :   DOUBLE PRECISION                              :: r
    3037            0 :   DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: alpha
    3038            0 :   DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: beta
    3039            0 :   DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:)   :: measN_1
    3040              :   DOUBLE PRECISION,              DIMENSION(1:2) :: TabX
    3041              :   DOUBLE PRECISION,              DIMENSION(1:2) :: TabY
    3042            0 :   DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:)   :: freqs
    3043            0 :   INTEGER, ALLOCATABLE, DIMENSION(:)   :: counts
    3044            0 :   INTEGER, ALLOCATABLE, DIMENSION(:)   :: displs
    3045            0 :   INTEGER, ALLOCATABLE, DIMENSION(:)   :: occtot
    3046            0 :   INTEGER, ALLOCATABLE, DIMENSION(:)   :: spintot
    3047            0 :   INTEGER, ALLOCATABLE, DIMENSION(:,:)   :: occ
    3048              :   INTEGER                                       :: sp1,spinmax,spinmin,dspin,nelec,spin
    3049              :   INTEGER                                       :: spAll
    3050              :   INTEGER                                       :: last
    3051              :   INTEGER                                       :: n1
    3052              :   INTEGER                                       :: n2,n3,quotient,remainder,signe
    3053              :   INTEGER                                       :: debut
    3054              :   DOUBLE PRECISION                                       :: signvaluemeassum
    3055              : !  INTEGER                                       :: fin
    3056              : #ifdef HAVE_MPI
    3057              :   INTEGER                                       :: ierr
    3058              :   DOUBLE PRECISION,              DIMENSION(1)   :: arr
    3059              : #endif
    3060              :   INTEGER                                       :: sizeoper,nbprocs,myrank
    3061              :   DOUBLE PRECISION                              :: inv_size,sumh,sumtot
    3062            0 :   DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: buffer
    3063            0 :   DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:,:) :: buffer2,buffer2s
    3064            0 :   DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: fullempty
    3065              :   DOUBLE PRECISION                              :: xsum
    3066            0 :   TYPE(FFTHyb) :: FFTmrka
    3067              : 
    3068              : #if defined HAVE_MPI && !defined HAVE_MPI2_INPLACE
    3069              :    DOUBLE PRECISION, ALLOCATABLE , DIMENSION(:)   :: buffer1_out,freqs_buf
    3070              :    DOUBLE PRECISION, ALLOCATABLE , DIMENSION(:,:) :: buffer2_out
    3071              : #endif
    3072              : 
    3073            0 :   IF ( .NOT. op%done ) &
    3074            0 :     CALL ERROR("Ctqmcoffdiag_getResult : Simulation not run                ")
    3075              : 
    3076            0 :   flavors     =  op%flavors
    3077            0 :   inv_flavors = 1.d0 / DBLE(flavors)
    3078              : 
    3079              : 
    3080            0 :   inv_size = 1.d0 / DBLE(op%size)
    3081            0 :   sp1 = 0
    3082            0 :   spAll = 0
    3083              : 
    3084              : !#ifdef CTCtqmcoffdiag_CHECK
    3085            0 :   IF ( op%opt_check .GT. 0 ) THEN
    3086            0 :     op%errorImpurity = ImpurityOperator_getError(op%Impurity) * inv_flavors
    3087            0 :     op%errorBath     = BathOperatoroffdiag_getError    (op%Bath    ) * inv_flavors
    3088              :   END IF
    3089              : !#endif
    3090              : 
    3091            0 :   MALLOC(alpha,(1,1))
    3092            0 :   MALLOC(beta,(1,1))
    3093            0 :   MALLOC(buffer,(1,1))
    3094            0 :   IF ( op%opt_noise .EQ. 1) THEN
    3095            0 :     FREEIF(alpha)
    3096            0 :     MALLOC(alpha,(1:op%samples+1,1:flavors))
    3097            0 :     FREEIF(beta)
    3098            0 :     MALLOC(beta,(1:op%samples+1,1:flavors))
    3099              :   END IF
    3100              : 
    3101            0 :   IF ( op%have_MPI .EQV. .TRUE.) THEN
    3102            0 :     sp1   = 0
    3103            0 :     spAll = sp1 + flavors + 6
    3104              : 
    3105              : !#ifdef CTCtqmcoffdiag_ANALYSIS
    3106              :     IF ( op%opt_analysis .EQ. 1 ) &
    3107              :       spAll = spAll + 3*sp1
    3108            0 :     IF ( op%opt_order .GT. 0 ) &
    3109            0 :       spAll = spAll + op%opt_order
    3110            0 :     IF ( op%opt_noise .EQ. 1 ) &
    3111            0 :       spAll = spAll + 2*(op%samples + 1)
    3112              : !#endif
    3113              : 
    3114            0 :     FREEIF(buffer)
    3115            0 :     MALLOC(buffer,(1:spAll,1:MAX(2,flavors)))
    3116              :   END IF
    3117              : 
    3118              : !  op%seg_added    = op%seg_added    * inv_flavors
    3119              : !  op%seg_removed  = op%seg_removed  * inv_flavors
    3120              : !  op%seg_sign     = op%seg_sign     * inv_flavors
    3121              : !  op%anti_added   = op%anti_added   * inv_flavors
    3122              : !  op%anti_removed = op%anti_removed * inv_flavors
    3123              : !  op%anti_sign    = op%anti_sign    * inv_flavors
    3124            0 :   op%stats(:) = op%stats(:) * inv_flavors
    3125              : 
    3126            0 :   DO iflavor = 1, flavors
    3127              :     ! Accumulate last values of  N (see also ctqmc_measn)
    3128            0 :     op%measN(1,iflavor) = op%measN(1,iflavor) + op%measN(3,iflavor)*op%measN(4,iflavor)
    3129            0 :     op%measN(2,iflavor) = op%measN(2,iflavor) + op%measN(4,iflavor)
    3130              :     ! Reduction
    3131            0 :     op%measN(1,iflavor)  = op%measN(1,iflavor) / ( op%measN(2,iflavor) * op%beta )
    3132              :     ! Correction
    3133              : !#ifdef CTCtqmcoffdiag_ANALYSIS
    3134            0 :     IF ( op%opt_order .GT. 0 ) &
    3135              :       op%measPerturbation(:   ,iflavor) = op%measPerturbation(:,iflavor) &
    3136            0 :                                     / SUM(op%measPerturbation(:,iflavor))
    3137              : 
    3138            0 :     IF ( op%opt_order .GT. 0 ) then
    3139            0 :       xsum = SUM(op%meas_fullemptylines(:,iflavor))
    3140            0 :       IF (xsum /= 0.0 ) then
    3141              :         op%meas_fullemptylines(:   ,iflavor) = op%meas_fullemptylines(:,iflavor) &
    3142            0 :                                       / SUM(op%meas_fullemptylines(:,iflavor))
    3143              :       else
    3144            0 :        op%meas_fullemptylines(:   ,iflavor) = zero
    3145              :       ENDIF
    3146              :       !write(6,*) "sum fullempty",iflavor,op%meas_fullemptylines(:,iflavor)
    3147              :     ENDIF
    3148              : 
    3149            0 :     IF ( op%opt_analysis .EQ. 1 ) THEN
    3150              :       op%measCorrelation (:,1,iflavor) = op%measCorrelation  (:,1,iflavor) &
    3151              :                                     / SUM(op%measCorrelation (:,1,iflavor)) &
    3152            0 :                                     * op%inv_dt
    3153              :       op%measCorrelation (:,2,iflavor) = op%measCorrelation  (:,2,iflavor) &
    3154              :                                     / SUM(op%measCorrelation (:,2,iflavor)) &
    3155            0 :                                     * op%inv_dt
    3156              :       op%measCorrelation (:,3,iflavor) = op%measCorrelation  (:,3,iflavor) &
    3157              :                                     / SUM(op%measCorrelation (:,3,iflavor)) &
    3158            0 :                                     * op%inv_dt
    3159              :     END IF
    3160              : !#endif
    3161            0 :     IF ( op%opt_noise .EQ. 1 ) THEN
    3162            0 :       TabX(1) = DBLE(op%modNoise2)
    3163            0 :       TabX(2) = DBLE(op%modNoise1)
    3164            0 :       DO itau = 1, op%samples+1
    3165              :         op%measNoiseG(itau,iflavor,2)%vec = -op%measNoiseG(itau,iflavor,2)%vec*op%inv_dt &
    3166            0 :                                            /(op%beta*DBLE(op%modNoise2))
    3167              :         op%measNoiseG(itau,iflavor,1)%vec = -op%measNoiseG(itau,iflavor,1)%vec*op%inv_dt &
    3168            0 :                                            /(op%beta*DBLE(op%modNoise1))
    3169            0 :         n2 = op%measNoiseG(itau,iflavor,2)%tail
    3170            0 :         TabY(1) = Stat_deviation(op%measNoiseG(itau,iflavor,2)%vec(1:n2))!*SQRT(n2/(n2-1))
    3171            0 :         n1 = op%measNoiseG(itau,iflavor,1)%tail
    3172            0 :         TabY(2) = Stat_deviation(op%measNoiseG(itau,iflavor,1)%vec(1:n1))!*SQRT(n1/(n1-1))
    3173            0 :         CALL Stat_powerReg(TabX,SQRT(2.d0*LOG(2.d0))*TabY,alpha(itau,iflavor),beta(itau,iflavor),r)
    3174              :         ! ecart type -> 60%
    3175              :         ! largeur a mi-hauteur d'une gaussienne -> sqrt(2*ln(2))*sigma
    3176              :       END DO
    3177              :     END IF
    3178              : 
    3179              :   END DO
    3180              : !sui!write(6,*) "getresults"
    3181            0 :   CALL GreenHyboffdiag_measHybrid(op%Greens, op%Bath%M, op%Impurity%Particles, .TRUE.,op%signvalue)
    3182            0 :   CALL GreenHyboffdiag_getHybrid(op%Greens)
    3183              :  ! write(6,*) "op%measN",op%measN(1,:)
    3184            0 :   MALLOC(measN_1,(flavors))
    3185            0 :   do iflavor=1,flavors
    3186            0 :     measN_1(iflavor)=op%measN(1,iflavor)
    3187              :   enddo
    3188            0 :   CALL GreenHyboffdiag_setN(op%Greens, measN_1(:))
    3189            0 :   FREE(measN_1)
    3190              : 
    3191              : ! todoab case _nd and _d are not completely described.
    3192              :   FREEIF(buffer2)
    3193              :   FREEIF(buffer2s)
    3194            0 :   sizeoper=size(op%Greens%oper,1)
    3195              :   !write(6,*) "sss",size(op%Greens%oper,1),sizeoper
    3196              :   !write(6,*) "sss",size(op%Greens%oper,2),flavors
    3197              :   !write(6,*) "sss",size(op%Greens%oper,3),flavors
    3198            0 :   MALLOC(buffer2,(1:sizeoper,flavors,flavors))
    3199            0 :   MALLOC(buffer2s,(1:sizeoper,flavors,flavors))
    3200            0 :   MALLOC(fullempty,(2,flavors))
    3201              :       !sui!write(6,*) "greens1"
    3202            0 :   IF ( op%have_MPI .EQV. .TRUE. ) THEN
    3203              :       !sui!write(6,*) "greens2"
    3204            0 :     fullempty=0.d0
    3205            0 :     buffer2 = op%Greens%oper
    3206              :     !write(6,*) "buffer2",(op%Greens%oper(1,n1,n1),n1=1,flavors)
    3207            0 :     buffer2s= 0.d0
    3208              :     do iflavor=1,flavors
    3209              :       do itau=1,sizeoper
    3210              :     !sui!write(6,*) "greens",iflavor,itau,op%Greens%oper(itau,iflavor,iflavor)
    3211              :       enddo
    3212              :     enddo
    3213              :    !write(6,*) "beforempi",op%Greens%oper(1,1,1) ,buffer2(1,1,1)
    3214              : #ifdef HAVE_MPI
    3215            0 :    CALL MPI_COMM_SIZE(op%MY_COMM,nbprocs,ierr)
    3216            0 :    CALL MPI_COMM_RANK(op%MY_COMM,myrank,ierr)
    3217              : #endif
    3218              :   !write(6,*) "procs",nbprocs,myrank
    3219              :   END IF
    3220            0 :   last = sp1
    3221              : 
    3222            0 :   op%measDE(:,:) = op%measDE(:,:) * DBLE(op%measurements) /(DBLE(op%sweeps)*op%beta)
    3223              : 
    3224            0 :   IF ( op%opt_histo .GT. 0 ) THEN
    3225            0 :     op%occup_histo_time(:) = op%occup_histo_time(:) / INT(op%sweeps/op%measurements)
    3226            0 :     op%occupconfig(:) = op%occupconfig(:) / INT(op%sweeps/op%measurements)
    3227            0 :     op%suscep(:,:) = op%suscep(:,:) / INT(op%sweeps/op%measurements)
    3228            0 :     op%chi(:,:) = op%chi(:,:) / INT(op%sweeps/op%measurements)
    3229            0 :     op%chicharge(:,:) = op%chicharge(:,:) / INT(op%sweeps/op%measurements)
    3230            0 :     op%ntot(:) = op%ntot(:) / INT(op%sweeps/op%measurements)
    3231              :   END IF
    3232              : ! HISTO before MPI_SUM
    3233              : !  write(6,*) "=== Histogram of occupations for complete simulation 3 ====",INT(op%sweeps/op%measurements)
    3234              : !  sumh=0
    3235              : !  do n1=1,op%flavors+1
    3236              : !     write(6,'(i4,f10.4)')  n1-1, op%occup_histo_time(n1)
    3237              : !     sumh=sumh+op%occup_histo_time(n1)
    3238              : !  enddo
    3239              : !  write(6,*) "=================================",sumh
    3240              : 
    3241            0 :   n1 = op%measNoise(1)%tail
    3242            0 :   n2 = op%measNoise(2)%tail
    3243              : 
    3244              :   ! On utilise freqs comme tableau de regroupement
    3245              :   ! Gather de Noise1
    3246            0 :   IF ( op%have_MPI .EQV. .TRUE. ) THEN
    3247            0 :     MALLOC(counts,(1:op%size))
    3248            0 :     MALLOC(displs,(1:op%size))
    3249              :     FREEIF(freqs)
    3250            0 :     MALLOC(freqs,(1:op%size*n1))
    3251            0 :     freqs = 0.d0
    3252            0 :     counts(:) = n1
    3253            0 :     displs(:) = (/ ( iflavor*n1, iflavor=0, op%size-1 ) /)
    3254              : #ifdef HAVE_MPI
    3255              : #if defined HAVE_MPI2_INPLACE
    3256            0 :     freqs(n1*op%rank+1:n1*(op%rank+1)) = op%measNoise(1)%vec(1:n1)
    3257              :     CALL MPI_ALLGATHERV(MPI_IN_PLACE, 0, MPI_DOUBLE_PRECISION, &
    3258              :                         freqs, counts, displs, &
    3259            0 :                         MPI_DOUBLE_PRECISION, op%MY_COMM, ierr)
    3260              : #else
    3261              :     MALLOC(freqs_buf,(n1))
    3262              :     freqs_buf(1:n2)=op%measNoise(2)%vec(1:n1)
    3263              :     CALL MPI_ALLGATHERV(freqs_buf, n1, MPI_DOUBLE_PRECISION, &
    3264              :                         freqs, counts, displs, &
    3265              :                         MPI_DOUBLE_PRECISION, op%MY_COMM, ierr)
    3266              :     FREE(freqs_buf)
    3267              : #endif
    3268              : #endif
    3269            0 :     n1 = op%size*n1
    3270            0 :     CALL Vector_setSize(op%measNoise(1),n1)
    3271            0 :     op%measNoise(1)%vec(1:n1) = freqs(:)
    3272              :     ! Gather de Noise2
    3273            0 :     FREE(freqs)
    3274            0 :     MALLOC(freqs,(1:op%size*n2))
    3275            0 :     freqs = 0.d0
    3276            0 :     counts(:) = n2
    3277            0 :     displs(:) = (/ ( iflavor*n2, iflavor=0, op%size-1 ) /)
    3278              : #ifdef HAVE_MPI
    3279              : #if defined HAVE_MPI2_INPLACE
    3280            0 :     freqs(n2*op%rank+1:n2*(op%rank+1)) = op%measNoise(2)%vec(1:n2)
    3281              :     CALL MPI_ALLGATHERV(MPI_IN_PLACE, 0, MPI_DOUBLE_PRECISION, &
    3282              :                         freqs, counts, displs, &
    3283            0 :                         MPI_DOUBLE_PRECISION, op%MY_COMM, ierr)
    3284              : #else
    3285              :     MALLOC(freqs_buf,(n2))
    3286              :     freqs_buf(1:n2)=op%measNoise(2)%vec(1:n2)
    3287              :     CALL MPI_ALLGATHERV(freqs_buf, n2, MPI_DOUBLE_PRECISION, &
    3288              :                         freqs, counts, displs, &
    3289              :                         MPI_DOUBLE_PRECISION, op%MY_COMM, ierr)
    3290              :     FREE(freqs_buf)
    3291              : #endif
    3292              : #endif
    3293            0 :     n2 = op%size*n2
    3294            0 :     CALL Vector_setSize(op%measNoise(2),n2)
    3295            0 :     op%measNoise(2)%vec(1:n2) = freqs(:)
    3296            0 :     FREE(counts)
    3297            0 :     FREE(displs)
    3298            0 :     FREE(freqs)
    3299              :   END IF
    3300              :   !n1 = op%measNoise(1)%tail
    3301              :   !n2 = op%measNoise(2)%tail
    3302              : 
    3303              :   ! Transformation des paquets pour que ca fit a CTQMC_SLICE(1|2)
    3304            0 :   IF ( n1 .GT. CTQMC_SLICE1 ) THEN
    3305            0 :     itau = n1/CTQMC_SLICE1
    3306            0 :     MALLOC(freqs,(1:n1/itau))
    3307            0 :     DO debut=1, n1/itau
    3308            0 :       freqs(debut)=SUM(op%measNoise(1)%vec((debut-1)*itau+1:itau*debut))
    3309              :     END DO
    3310            0 :     freqs(:) = freqs(:)/DBLE(itau)
    3311            0 :     op%modNoise1 = op%modNoise1*itau
    3312            0 :     n1 = n1/itau
    3313            0 :     CALL Vector_setSize(op%measNoise(1),n1)
    3314            0 :     op%measNoise(1)%vec(1:n1) = freqs(:)
    3315            0 :     FREE(freqs)
    3316              :   END IF
    3317            0 :   IF ( n2 .GT. CTQMC_SLICE1*CTQMC_SLICE2 ) THEN
    3318            0 :     itau = n2/(CTQMC_SLICE1*CTQMC_SLICE2)
    3319            0 :     MALLOC(freqs,(1:n2/itau))
    3320            0 :     DO debut=1, n2/itau
    3321            0 :       freqs(debut)=SUM(op%measNoise(2)%vec((debut-1)*itau+1:itau*debut))
    3322              :     END DO
    3323            0 :     freqs(:) = freqs(:)/DBLE(itau)
    3324            0 :     op%modNoise2 = op%modNoise2*itau
    3325            0 :     n2 = n2/itau
    3326            0 :     CALL Vector_setSize(op%measNoise(2),n2)
    3327            0 :     op%measNoise(2)%vec(1:n2) = freqs(:)
    3328            0 :     FREE(freqs)
    3329              :   END IF
    3330              :   ! On peut s'amuser avec nos valeur d'energies
    3331              :   !MALLOC(TabX,(1:20))
    3332              :   !MALLOC(TabY,(1:20))
    3333              : 
    3334            0 :   TabX(1) = DBLE(op%modNoise2)
    3335            0 :   TabX(2) = DBLE(op%modNoise1)
    3336              : 
    3337              :   ! Il faut calculer pour chaque modulo 10 ecarts type sur les donnes acquises
    3338            0 :   op%measNoise(1)%vec(1:n1) = op%measNoise(1)%vec(1:n1)/(op%beta*DBLE(op%modNoise1))*DBLE(op%measurements)
    3339            0 :   op%measNoise(2)%vec(1:n2) = op%measNoise(2)%vec(1:n2)/(op%beta*DBLE(op%modNoise2))*DBLE(op%measurements)
    3340              : !  CALL Vector_print(op%measNoise(1),op%rank+70)
    3341              : !  CALL Vector_print(op%measNoise(2),op%rank+50)
    3342              : !  DO iflavor=1,10
    3343              : !    debut = (iflavor-1)*n2/10+1
    3344              : !    fin   = iflavor*n2/10
    3345              : !    TabY(iflavor) = Stat_deviation(op%measNoise(2)%vec(debut:fin))
    3346              : !    debut = (iflavor-1)*n1/10+1
    3347              : !    fin   = iflavor*n1/10
    3348              : !    TabY(10+iflavor) = Stat_deviation(op%measNoise(1)%vec(debut:fin))
    3349              : !  END DO
    3350              : !!  TabY(1:n) = (op%measNoise(2)%vec(1:n)   &
    3351              : !!              )
    3352              : !!             !/(op%beta*DBLE(op%modNoise2))*DBLE(op%measurements) &
    3353              : !!             !- op%measDE(1,1))
    3354              : !!  TabY(op%measNoise(2)%tail+1:n+op%measNoise(2)%tail) = (op%measNoise(1)%vec(1:n)   &
    3355              : !!               )
    3356              : !!             ! /(op%beta*DBLE(op%modNoise1))*DBLE(op%measurements) &
    3357              : !!             ! - op%measDE(1,1))
    3358              : !  IF ( op%rank .EQ. 0 ) THEN
    3359              : !    DO iflavor=1,20
    3360              : !      write(45,*) TabX(iflavor), TabY(iflavor)
    3361              : !    END DO
    3362              : !  END IF
    3363              : !
    3364              : 
    3365              : 
    3366            0 :   TabY(1) = Stat_deviation(op%measNoise(2)%vec(1:n2))!*SQRT(n2/(n2-1))
    3367              : !!  write(op%rank+10,*) TabX(2)
    3368              : !!  write(op%rank+40,*) TabX(1)
    3369              : !!  CALL Vector_print(op%measNoise(1),op%rank+10)
    3370              : !!  CALL Vector_print(op%measNoise(2),op%rank+40)
    3371              : !!  CLOSE(op%rank+10)
    3372              : !!  CLOSE(op%rank+40)
    3373            0 :   TabY(2) = Stat_deviation(op%measNoise(1)%vec(1:n1))!*SQRT(n1/(n1-1))
    3374              : !!  ! Ecart carre moyen ~ ecart type mais non biaise. Serait moins precis. Aucun
    3375              :   ! impact sur la pente, juste sur l'ordonnee a l'origine.
    3376              : 
    3377            0 :   CALL Stat_powerReg(TabX,SQRT(2.d0*LOG(2.d0))*TabY,a,b,r)
    3378              : !  FREE(TabX)
    3379              : !  FREE(TabY)
    3380              :   ! ecart type -> 60%
    3381              :   ! largeur a mi-hauteur d'une gaussienne -> sqrt(2*ln(2))*sigma
    3382              : 
    3383              :   !op%measDE(1,1) = SUM(op%measNoise(1)%vec(1:op%measNoise(1)%tail))/(DBLE(op%measNoise(1)%tail*op%modNoise1)*op%beta)
    3384              :   !op%measDE(2:flavors,1:flavors) = op%measDE(2:flavors,1:flavors) /(DBLE(op%sweeps)*op%beta)
    3385            0 :   CALL ImpurityOperator_getErrorOverlap(op%Impurity,op%measDE)
    3386              :   ! Add the difference between true calculation and quick calculation of the
    3387              :   ! last sweep overlap to measDE(2,2)
    3388              :   !op%measDE = op%measDE * DBLE(op%measurements)
    3389            0 :   IF ( op%have_MPI .EQV. .TRUE. ) THEN
    3390            0 :     IF ( op%opt_analysis .EQ. 1 ) THEN
    3391            0 :       buffer(last+1:last+sp1,:) = op%measCorrelation(:,1,:)
    3392            0 :       last = last + sp1
    3393            0 :       buffer(last+1:last+sp1,:) = op%measCorrelation(:,2,:)
    3394            0 :       last = last + sp1
    3395            0 :       buffer(last+1:last+sp1,:) = op%measCorrelation(:,3,:)
    3396              :       last = last + sp1
    3397              :     END IF
    3398            0 :     IF ( op%opt_order .GT. 0 ) THEN
    3399            0 :       buffer(last+1:last+op%opt_order, :) = op%measPerturbation(:,:)
    3400              :       last = last + op%opt_order
    3401              :     END IF
    3402            0 :     IF ( op%opt_noise .EQ. 1 ) THEN
    3403            0 :       buffer(last+1:last+op%samples+1,:) = alpha(:,:)
    3404            0 :       last = last + op%samples + 1
    3405            0 :       buffer(last+1:last+op%samples+1,:) = beta(:,:)
    3406            0 :       last = last + op%samples + 1
    3407              :     END IF
    3408              : !  op%measDE(2,2) = a*EXP(b*LOG(DBLE(op%sweeps*op%size)))
    3409            0 :     buffer(spall-(flavors+5):spAll-6,:) = op%measDE(:,:)
    3410              : !    buffer(spAll  ,1) = op%seg_added
    3411              : !    buffer(spAll-1,1) = op%seg_removed
    3412              : !    buffer(spAll-2,1) = op%seg_sign
    3413              : !    buffer(spAll  ,2) = op%anti_added
    3414              : !    buffer(spAll-1,2) = op%anti_removed
    3415              : !    buffer(spAll-2,2) = op%anti_sign
    3416            0 :     buffer(spAll  ,1) = op%stats(1)
    3417            0 :     buffer(spAll-1,1) = op%stats(2)
    3418            0 :     buffer(spAll-2,1) = op%stats(3)
    3419            0 :     buffer(spAll  ,2) = op%stats(4)
    3420            0 :     buffer(spAll-1,2) = op%stats(5)
    3421            0 :     buffer(spAll-2,2) = op%stats(6)
    3422            0 :     buffer(spAll-3,1) = op%swap
    3423            0 :     buffer(spAll-3,2) = DBLE(op%modGlobalMove(2))
    3424            0 :     buffer(spAll-4,1) = a
    3425            0 :     buffer(spAll-4,2) = b
    3426              : !#ifdef CTCtqmcoffdiag_CHECK
    3427            0 :     buffer(spAll-5,1) = op%errorImpurity
    3428            0 :     buffer(spAll-5,2) = op%errorBath
    3429            0 :     signvaluemeassum = 0
    3430              : !#endif
    3431              : 
    3432              : #ifdef HAVE_MPI
    3433              : #if defined HAVE_MPI2_INPLACE
    3434              :     CALL MPI_ALLREDUCE(MPI_IN_PLACE, buffer, spAll*flavors, &
    3435            0 :                      MPI_DOUBLE_PRECISION, MPI_SUM, op%MY_COMM, ierr)
    3436              : #else
    3437              :     MALLOC(buffer2_out,(spAll,flavors))
    3438              :     CALL MPI_ALLREDUCE(buffer, buffer2_out, spAll*flavors, &
    3439              :                      MPI_DOUBLE_PRECISION, MPI_SUM, op%MY_COMM, ierr)
    3440              :     buffer(1:spAll,1:flavors)=buffer2_out(1:spAll,1:flavors)
    3441              :     FREE(buffer2_out)
    3442              : #endif
    3443              :     CALL MPI_ALLREDUCE(buffer2, buffer2s, sizeoper*flavors*flavors, &
    3444            0 :                      MPI_DOUBLE_PRECISION, MPI_SUM, op%MY_COMM, ierr)
    3445            0 :     CALL MPI_ALLREDUCE([op%runtime], arr, 1, MPI_DOUBLE_PRECISION, MPI_MAX, op%MY_COMM, ierr)
    3446            0 :     op%runtime=arr(1)
    3447            0 :     CALL MPI_ALLREDUCE([op%Greens%signvaluemeas], arr, 1, MPI_DOUBLE_PRECISION, MPI_SUM, op%MY_COMM, ierr)
    3448            0 :     signvaluemeassum=arr(1)
    3449              : #if defined HAVE_MPI2_INPLACE
    3450            0 :     IF ( op%opt_histo .GT. 0 ) THEN
    3451              :       CALL MPI_ALLREDUCE(MPI_IN_PLACE,op%occup_histo_time, flavors+1, MPI_DOUBLE_PRECISION, MPI_SUM, &
    3452            0 :              op%MY_COMM, ierr)
    3453              :       CALL MPI_ALLREDUCE(MPI_IN_PLACE, op%occupconfig, 2**flavors, MPI_DOUBLE_PRECISION, MPI_SUM, &
    3454            0 :                op%MY_COMM, ierr)
    3455              :       CALL MPI_ALLREDUCE(MPI_IN_PLACE, op%suscep, 3*op%samples, MPI_DOUBLE_PRECISION, MPI_SUM, &
    3456            0 :                op%MY_COMM, ierr)
    3457              :       CALL MPI_ALLREDUCE(MPI_IN_PLACE, op%chi, 3*op%samples, MPI_DOUBLE_PRECISION, MPI_SUM, &
    3458            0 :                op%MY_COMM, ierr)
    3459              :       CALL MPI_ALLREDUCE(MPI_IN_PLACE, op%chicharge, 3*op%samples, MPI_DOUBLE_PRECISION, MPI_SUM, &
    3460            0 :                op%MY_COMM, ierr)
    3461              :       CALL MPI_ALLREDUCE(MPI_IN_PLACE, op%ntot, 3, MPI_DOUBLE_PRECISION, MPI_SUM, &
    3462            0 :                op%MY_COMM, ierr)
    3463              :     END IF
    3464              :     CALL MPI_ALLREDUCE(MPI_IN_PLACE, sumh, 1, MPI_DOUBLE_PRECISION, MPI_SUM, &
    3465            0 :               op%MY_COMM, ierr)
    3466              : #else
    3467              :       MALLOC(buffer1_out,(flavors+1))
    3468              :       CALL MPI_ALLREDUCE(op%occup_histo_time, buffer1_out, flavors+1, MPI_DOUBLE_PRECISION, MPI_SUM, &
    3469              :              op%MY_COMM, ierr)
    3470              :       op%occup_histo_time(1:flavors+1) =buffer1_out(1:flavors+1)
    3471              :       FREE(buffer1_out)
    3472              : #endif
    3473            0 :     CALL MPI_ALLREDUCE([sumh], arr, 1, MPI_DOUBLE_PRECISION, MPI_SUM, op%MY_COMM, ierr)
    3474            0 :     sumh=arr(1)
    3475            0 :     IF ( op%opt_order .GT. 0 ) THEN
    3476              :       CALL MPI_ALLREDUCE(op%meas_fullemptylines, fullempty, 2*flavors, MPI_DOUBLE_PRECISION, MPI_SUM, &
    3477            0 :                op%MY_COMM, ierr)
    3478              :     ENDIF
    3479              : #endif
    3480              : 
    3481              : 
    3482            0 :     buffer          = buffer * inv_size
    3483            0 :     op%measDE(:,:)  = buffer(spall-(flavors+5):spAll-6,:)
    3484              : !    op%seg_added    = buffer(spAll  ,1)
    3485              : !    op%seg_removed  = buffer(spAll-1,1)
    3486              : !    op%seg_sign     = buffer(spAll-2,1)
    3487              : !    op%anti_added   = buffer(spAll  ,2)
    3488              : !    op%anti_removed = buffer(spAll-1,2)
    3489              : !    op%anti_sign    = buffer(spAll-2,2)
    3490            0 :     op%stats(1)    = buffer(spAll  ,1)
    3491            0 :     op%stats(2)    = buffer(spAll-1,1)
    3492            0 :     op%stats(3)    = buffer(spAll-2,1)
    3493            0 :     op%stats(4)    = buffer(spAll  ,2)
    3494            0 :     op%stats(5)    = buffer(spAll-1,2)
    3495            0 :     op%stats(6)    = buffer(spAll-2,2)
    3496            0 :     op%swap         = buffer(spAll-3,1)
    3497            0 :     op%modGlobalMove(2) = NINT(buffer(spAll-3,2))
    3498            0 :     a               = buffer(spAll-4,1)
    3499            0 :     b               = buffer(spAll-4,2)
    3500              : !!#ifdef CTCtqmcoffdiag_CHECK
    3501            0 :     op%errorImpurity= buffer(spAll-5,1)
    3502            0 :     op%errorBath    = buffer(spAll-5,2)
    3503              : !#endif
    3504              : 
    3505              :    ! DO iflavor = 1, flavors
    3506              :    !   op%Greens(iflavor)%oper          = buffer(1:sp1          , iflavor)
    3507              :    ! END DO
    3508            0 :     op%Greens%oper = buffer2s/float(nbprocs)
    3509              :    ! write(6,*) "buffer2s",(op%Greens%oper(1,n1,n1),n1=1,flavors)
    3510            0 :     op%Greens%signvaluemeas = signvaluemeassum/float(nbprocs)
    3511              :     !sui!write(6,*) "nbprocs",nbprocs,op%Greens%signvaluemeas
    3512            0 :     op%Greens%oper = op%Greens%oper / op%Greens%signvaluemeas
    3513              :    ! write(6,*) "buffer3s",(op%Greens%oper(1,n1,n1),n1=1,flavors)
    3514            0 :     IF ( op%opt_order .GT. 0 ) THEN
    3515            0 :       op%meas_fullemptylines= fullempty/float(nbprocs)
    3516              :     ENDIF
    3517            0 :     do iflavor=1,flavors
    3518              :       do itau=1,sizeoper
    3519              :     !sui!write(6,*) "greens_av",iflavor,itau,op%Greens%oper(itau,iflavor,iflavor)
    3520              :       enddo
    3521              :     enddo
    3522              :    !write(6,*) "aftermpi",op%Greens%oper(1,1,1) ,buffer2s(1,1,1)
    3523            0 :     last = sp1
    3524              :     IF ( op%opt_analysis .EQ. 1 ) THEN
    3525              :       op%measCorrelation(:,1,:) = buffer(last+1:last+sp1,:)
    3526              :       last = last + sp1
    3527              :       op%measCorrelation(:,2,:) = buffer(last+1:last+sp1,:)
    3528              :       last = last + sp1
    3529              :       op%measCorrelation(:,3,:) = buffer(last+1:last+sp1,:)
    3530              :       last = last + sp1
    3531              :     END IF
    3532            0 :     IF ( op%opt_order .GT. 0 ) THEN
    3533            0 :       op%measPerturbation(:,:) = buffer(last+1:last+op%opt_order, :)
    3534              :       last = last + op%opt_order
    3535              :     END IF
    3536            0 :     IF ( op%opt_noise .EQ. 1 ) THEN
    3537            0 :       alpha(:,:) = buffer(last+1:last+op%samples+1,:)
    3538            0 :       last = last + op%samples + 1
    3539            0 :       beta(:,:) = buffer(last+1:last+op%samples+1,:)
    3540            0 :       last = last + op%samples + 1
    3541              :     END IF
    3542              :   END IF
    3543            0 :   DO iflavor = 1, flavors
    3544              :     ! complete DE matrix
    3545            0 :     op%measDE(iflavor, iflavor+1:flavors) = op%measDE(iflavor+1:flavors,iflavor)
    3546              :   END DO
    3547            0 :   FREE(buffer)
    3548            0 :   FREE(buffer2)
    3549            0 :   FREE(buffer2s)
    3550            0 :   FREE(fullempty)
    3551              : 
    3552            0 :   IF ( op%opt_spectra .GE. 1 ) THEN
    3553              : !PROBLEM eos_gnu_13.2_mpich . %endDensity was introduced throughout
    3554            0 :     endDensity = SIZE(op%density,2)
    3555              : !   endDensity=op%endDensity
    3556              : !ENDPROBLEM
    3557              : 
    3558            0 :     IF ( op%density(1,endDensity) .EQ. -1.d0 ) &
    3559            0 :       endDensity = endDensity - 1
    3560            0 :     CALL FFTHyb_init(FFTmrka,endDensity,DBLE(op%thermalization)/DBLE(op%measurements*op%opt_spectra))
    3561              :     ! Not very Beauty
    3562            0 :     MALLOC(freqs,(1:FFTmrka%size/2))
    3563            0 :     DO iflavor = 1, flavors
    3564              :       ! mean value is removed to supress the continue composent
    3565            0 :       CALL FFTHyb_setData(FFTmrka,op%density(iflavor,1:endDensity)/op%beta+op%Greens%oper(op%samples+1,iflavor,iflavor))
    3566            0 :       CALL FFTHyb_run(FFTmrka,1)
    3567            0 :       CALL FFTHyb_getData(FFTmrka,endDensity,op%density(iflavor,:),freqs)
    3568              :     END DO
    3569            0 :     op%density(flavors+1,:) = -1.d0
    3570            0 :     op%density(flavors+1,1:FFTmrka%size/2) = freqs
    3571            0 :     CALL FFTHyb_destroy(FFTmrka)
    3572            0 :     FREE(freqs)
    3573              :   END IF
    3574              : 
    3575            0 :   op%a_Noise = a
    3576            0 :   op%b_Noise = b
    3577            0 :   IF ( op%opt_noise .EQ. 1 ) THEN
    3578            0 :     op%abNoiseG(1,:,:) = alpha
    3579            0 :     op%abNoiseG(2,:,:) = beta
    3580              :   END IF
    3581            0 :   FREE(alpha)
    3582            0 :   FREE(beta)
    3583            0 :   IF ( op%opt_histo .GT. 0 ) THEN
    3584            0 :     write(op%ostream,*) "=== Histogram of occupations for complete simulation  ===="
    3585              :  !   write(6,*) "sumh over procs", sumh
    3586            0 :     sumh=0
    3587            0 :     do n1=1,op%flavors+1
    3588            0 :        write(op%ostream,'(i4,f10.4)')  n1-1, op%occup_histo_time(n1)/float(nbprocs)
    3589            0 :        sumh=sumh+op%occup_histo_time(n1)/float(nbprocs)
    3590              :     enddo
    3591            0 :        write(op%ostream,'(a,f10.4)') " all" , sumh
    3592            0 :     write(op%ostream,*) "================================="
    3593              : 
    3594            0 :     MALLOC(occ,(2**op%flavors,1:flavors))
    3595              : #ifdef FC_LLVM
    3596              :     MALLOC(occtot,(2**op%flavors) )
    3597              :     MALLOC(spintot,(2**op%flavors) )
    3598              : #else
    3599            0 :     MALLOC(occtot,(2**op%flavors))
    3600            0 :     MALLOC(spintot,(2**op%flavors))
    3601              : #endif
    3602            0 :     do n1=1,2**op%flavors
    3603              :       ! Compute occupations of individual Orbitals
    3604            0 :       n3=n1-1
    3605            0 :       occtot(n1)=0
    3606            0 :       spintot(n1)=0
    3607            0 :       signe=1
    3608            0 :       do n2=1,op%flavors
    3609            0 :         remainder=modulo(n3,2)
    3610            0 :         quotient=(n3-remainder)/2
    3611            0 :         occ(n1,n2)=remainder
    3612            0 :         n3=quotient
    3613            0 :         occtot(n1)=occtot(n1)+occ(n1,n2)
    3614            0 :         if(n2>=7) signe =-1
    3615              :         !if(n2>=7) signe =0
    3616            0 :         spintot(n1)=spintot(n1)+occ(n1,n2)*signe
    3617              :       enddo
    3618            0 :       op%occupconfig(n1)=op%occupconfig(n1)/float(nbprocs)
    3619              :     enddo
    3620              : 
    3621            0 :     write(op%ostream,*) "=== Histogram of occupations of configurations for complete simulation  ===="
    3622            0 :     sumh=0
    3623            0 :     if(op%flavors==14) then
    3624            0 :       do n1=1,2**op%flavors
    3625            0 :          write(op%ostream,'(i4,14i2,f20.2)')  n1, (occ(n1,n2),n2=1,op%flavors),op%occupconfig(n1)
    3626            0 :          sumh=sumh+op%occupconfig(n1)
    3627              :       enddo
    3628            0 :     else if(op%flavors==10) then
    3629            0 :       do n1=1,2**op%flavors
    3630            0 :          write(op%ostream,'(i4,10i2,f20.2)')  n1, (occ(n1,n2),n2=1,op%flavors),op%occupconfig(n1)
    3631            0 :          sumh=sumh+op%occupconfig(n1)
    3632              :       enddo
    3633              :     end if
    3634            0 :     write(op%ostream,'(a,f10.4)') " all" , sumh
    3635              : 
    3636            0 :     sumtot=0
    3637            0 :     do nelec=0,10
    3638            0 :       spinmin=modulo(nelec,2)
    3639              :       if(nelec<=5) spinmax=nelec
    3640              :       if(nelec>=6) spinmax=10-nelec
    3641            0 :       spinmax=6
    3642            0 :       dspin=1
    3643            0 :       write(op%ostream,*) "=== Histogram of occupations of configurations for total number of electrons",nelec
    3644            0 :       do spin=spinmin,spinmax,dspin
    3645            0 :         sumh=0
    3646            0 :         do n1=1,2**op%flavors
    3647            0 :           if(occtot(n1)==nelec.and.abs(spintot(n1))==spin) then
    3648            0 :             sumh=sumh+op%occupconfig(n1)
    3649            0 :             if(op%flavors==14) then
    3650            0 :               write(op%ostream,'(i8,14i2,a,i2,i3,f10.4)')  n1,(occ(n1,n2),n2=1,op%flavors),"  ",occtot(n1),spintot(n1),&
    3651            0 : & op%occupconfig(n1)
    3652            0 :             else if(op%flavors==10) then
    3653            0 :               write(op%ostream,'(i8,10i2,a,i2,i3,f10.4)')  n1,(occ(n1,n2),n2=1,op%flavors),"  ",occtot(n1),spintot(n1),&
    3654            0 :  op%occupconfig(n1)
    3655              :             end if
    3656              :           endif
    3657              :         enddo
    3658            0 :         write(op%ostream,'(a,i4,a,i4,a,f10.4)') " === Sum of weights for",nelec," electrons and spin",spin," is ",sumh
    3659            0 :         sumtot=sumtot+sumh
    3660              :       enddo
    3661              :     enddo
    3662            0 :     write(op%ostream,'(a,f10.4)') "Full sum is",sumtot
    3663              : 
    3664            0 :    FREE(occ)
    3665            0 :     FREE(occtot)
    3666            0 :     FREE(spintot)
    3667              :   !END IF
    3668              : 
    3669              :     !==============================
    3670              :     ! Write Susceptibilities
    3671              :     !==============================
    3672            0 :     if(Iatom .lt. 10) then
    3673            0 :        write(atomnb, '("0",i1)') Iatom
    3674              :     else
    3675            0 :        write(atomnb, '(i2)') Iatom
    3676              :     end if
    3677              :     ! Local Magnetic Susceptibility
    3678            0 :     if(op%opt_histo .gt. 1) then
    3679              :       ! Scalar
    3680            0 :       if(op%nspinor .eq. 1) then
    3681            0 :         open (unit=735,file=trim(fname)//'_LocalSpinSuscept_atom_'//atomnb//'.dat',status='unknown',form='formatted')
    3682            0 :         write(735,*) '#Tau Total t2g eg'
    3683            0 :         do n1=1,op%samples
    3684            0 :           op%suscep(:,n1)=op%suscep(:,n1)/float(nbprocs)/float(op%samples)
    3685            0 :           write(735,'(1x,f14.8,2x,f12.8,2x,f12.8,2x,f12.8)') (n1-1)*op%beta/op%samples,(op%suscep(n2,n1),n2=1,3)
    3686              :         enddo
    3687              :         !add tau=beta
    3688            0 :         write(735,'(1x,f14.8,2x,f12.8,2x,f12.8,2x,f12.8)') (op%samples)*op%beta/op%samples,(op%suscep(n2,1),n2=1,3)
    3689              : 
    3690              :       else
    3691              :         ! SOC
    3692              :         ! In the jmj local basis
    3693            0 :         if (jmjbasis .eq. 1) then
    3694            0 :           open (unit=735,file=trim(fname)//'_LocalMagnSuscept_atom_'//atomnb//'.dat',status='unknown',form='formatted')
    3695            0 :           write(735,*) '#Tau <gjJz(tau).gjJz(0)>'
    3696            0 :           do n1=1,op%samples
    3697            0 :             op%chi(:,n1) = op%chi(:,n1)/float(nbprocs)/float(op%samples)
    3698            0 :             write(735,'(1x,f14.8,2x,f12.8,2x,f12.8,2x,f12.8)') (n1-1)*op%beta/op%samples,(op%chi(1,n1))
    3699              :           end do
    3700              :           !add tau=beta
    3701            0 :           write(735,'(1x,f14.8,2x,f12.8,2x,f12.8,2x,f12.8)') (op%samples)*op%beta/op%samples,(op%chi(1,1))
    3702              : 
    3703              :         else
    3704              :         ! SOC
    3705              :         ! In the Ylm or CTQMC basis
    3706            0 :           open (unit=735,file=trim(fname)//'_LocalMagnSuscept_atom_'//atomnb//'.dat',status='unknown',form='formatted')
    3707            0 :           write(735,*) '#Tau Total Orbital Spin'
    3708            0 :           do n1=1,op%samples
    3709            0 :             op%chi(:,n1) = op%chi(:,n1)/float(nbprocs)/float(op%samples)
    3710            0 :             write(735,'(1x,f14.8,2x,f12.8,2x,f12.8,2x,f12.8)') (n1-1)*op%beta/op%samples,(op%chi(n2,n1),n2=1,3)
    3711              :           end do
    3712              :           !add tau=beta
    3713            0 :           write(735,'(1x,f14.8,2x,f12.8,2x,f12.8,2x,f12.8)') (op%samples)*op%beta/op%samples,(op%chi(n2,1),n2=1,3)
    3714              :         endif
    3715              :       endif
    3716            0 :     close(unit=735)
    3717              :     endif
    3718              : 
    3719              :     ! Local Charge Susceptiblity
    3720            0 :     if(op%opt_histo .gt. 2) then
    3721            0 :       op%ntot(:) = op%ntot(:)/float(nbprocs)/float(op%samples)
    3722            0 :       open (unit=735,file=trim(fname)//'_LocalChargeSuscept_atom_'//atomnb//'.dat',status='unknown',form='formatted')
    3723            0 :       write(735,*) '#Tau Total <ntot>'
    3724            0 :       do n1=1,op%samples
    3725            0 :         op%chicharge(1,n1)=(op%chicharge(1,n1)/float(nbprocs)/float(op%samples))-(op%ntot(1)*op%ntot(1))
    3726              :         !op%chicharge(2,n1)=(op%chicharge(2,n1)/float(nbprocs)/float(op%samples))-(op%ntot(2)*op%ntot(2))
    3727              :         !op%chicharge(3,n1)=(op%chicharge(3,n1)/float(nbprocs)/float(op%samples))-(op%ntot(3)*op%ntot(3))
    3728            0 :         write(735,'(1x,f14.8,2x,f12.8,2x,f12.8,2x,f12.8)') (n1-1)*op%beta/op%samples,(op%chicharge(1,n1)),op%ntot(1)
    3729              :       enddo
    3730              :       !add tau=beta
    3731            0 :       write(735,'(1x,f14.8,2x,f12.8,2x,f12.8,2x,f12.8)') (op%samples)*op%beta/op%samples,(op%chicharge(1,1)),op%ntot(1)
    3732            0 :       close(unit=735)
    3733              :     endif
    3734              : 
    3735              :   END IF
    3736              : 
    3737              : 
    3738            0 : END SUBROUTINE Ctqmcoffdiag_getResult
    3739              : !!***
    3740              : 
    3741              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_symmetrizeGreen
    3742              : !! NAME
    3743              : !!  Ctqmcoffdiag_symmetrizeGreen
    3744              : !!
    3745              : !! FUNCTION
    3746              : !!  optionnaly symmetrize the green functions
    3747              : !!
    3748              : !! COPYRIGHT
    3749              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
    3750              : !!  This file is distributed under the terms of the
    3751              : !!  GNU General Public License, see ~abinit/COPYING
    3752              : !!  or http://www.gnu.org/copyleft/gpl.txt .
    3753              : !!
    3754              : !! INPUTS
    3755              : !!  op=ctqmc
    3756              : !!  syms=weight factors
    3757              : !!
    3758              : !! OUTPUT
    3759              : !!  argout(sizeout)=description
    3760              : !!
    3761              : !! SIDE EFFECTS
    3762              : !!
    3763              : !! NOTES
    3764              : !!
    3765              : !! SOURCE
    3766              : 
    3767            0 : SUBROUTINE Ctqmcoffdiag_symmetrizeGreen(op, syms)
    3768              : 
    3769              : !Arguments ------------------------------------
    3770              :   TYPE(Ctqmcoffdiag)                     , INTENT(INOUT) :: op
    3771              :   DOUBLE PRECISION, DIMENSION(:,:), INTENT(IN   ) :: syms
    3772              : !Local variables ------------------------------
    3773              :   !INTEGER :: iflavor1
    3774              :   !INTEGER :: iflavor2
    3775              :   !INTEGER :: flavors
    3776              :   !DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: green_tmp
    3777              :   !DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:  ) :: n_tmp
    3778              : 
    3779              :   ABI_UNUSED((/syms(1,1), op%swap/))
    3780              : 
    3781              : !  flavors = op%flavors
    3782              : !  IF ( SIZE(syms,1) .NE. flavors .OR. SIZE(syms,2) .NE. flavors ) THEN
    3783              : !    CALL WARNALL("Ctqmcoffdiag_symmetrizeGreen : wrong opt_sym -> not symmetrizing")
    3784              : !    RETURN
    3785              : !  END IF
    3786              : !
    3787              : !  MALLOC(green_tmp,(1:op%samples+1,flavors))
    3788              : !  green_tmp(:,:) = 0.d0
    3789              : !  MALLOC(n_tmp,(1:flavors))
    3790              : !  n_tmp(:) = 0.d0
    3791              : !  DO iflavor1=1, flavors
    3792              : !    DO iflavor2=1,flavors
    3793              : !      green_tmp(:,iflavor1) = green_tmp(:,iflavor1) &
    3794              : !                             + syms(iflavor2,iflavor1) * op%Greens(iflavor2)%oper(:)
    3795              : !      n_tmp(iflavor1) = n_tmp(iflavor1) &
    3796              : !                             + syms(iflavor2,iflavor1) * op%measN(1,iflavor2)
    3797              : !    END DO
    3798              : !  END DO
    3799              : !  DO iflavor1=1, flavors
    3800              : !    op%Greens(iflavor1)%oper(:) = green_tmp(:,iflavor1)
    3801              : !    op%measN(1,iflavor1)          = n_tmp(iflavor1)
    3802              : !  END DO
    3803              : !  FREE(green_tmp)
    3804              : !  FREE(n_tmp)
    3805            0 : END SUBROUTINE Ctqmcoffdiag_symmetrizeGreen
    3806              : !!***
    3807              : 
    3808              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_getGreen
    3809              : !! NAME
    3810              : !!  Ctqmcoffdiag_getGreen
    3811              : !!
    3812              : !! FUNCTION
    3813              : !!  Get the full green functions in time and/or frequency
    3814              : !!
    3815              : !! COPYRIGHT
    3816              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
    3817              : !!  This file is distributed under the terms of the
    3818              : !!  GNU General Public License, see ~abinit/COPYING
    3819              : !!  or http://www.gnu.org/copyleft/gpl.txt .
    3820              : !!
    3821              : !! INPUTS
    3822              : !!  op=ctqmc
    3823              : !!
    3824              : !! OUTPUT
    3825              : !!  Gtau=green function in time
    3826              : !!  Gw=green function in frequency
    3827              : !!
    3828              : !! SIDE EFFECTS
    3829              : !!
    3830              : !! NOTES
    3831              : !!
    3832              : !! SOURCE
    3833              : 
    3834            0 : SUBROUTINE Ctqmcoffdiag_getGreen(op, Gtau, Gw)
    3835              : 
    3836              : !Arguments ------------------------------------
    3837              :  USE m_GreenHyboffdiag
    3838              :   TYPE(Ctqmcoffdiag)          , INTENT(INOUT)    :: op
    3839              :   DOUBLE PRECISION, DIMENSION(:,:,:), OPTIONAL, INTENT(INOUT) :: Gtau
    3840              :   COMPLEX(KIND=8), DIMENSION(:,:,:), OPTIONAL, INTENT(INOUT) :: Gw
    3841              : !Local variables ------------------------------
    3842              :   !INTEGER                            :: itime
    3843              :   INTEGER                            :: iflavor1
    3844              :   INTEGER                            :: iflavor1b !,iflavor,iflavorbis
    3845              :   INTEGER                            :: iflavor2
    3846              :   INTEGER                            :: iflavor3
    3847              :   INTEGER                            :: flavors,tail
    3848              :   INTEGER                            :: ifreq,itime
    3849              :   DOUBLE PRECISION :: u1
    3850              :   DOUBLE PRECISION :: u2
    3851              :   DOUBLE PRECISION :: u3
    3852              :   DOUBLE PRECISION :: Un
    3853              :   DOUBLE PRECISION :: UUnn,iw !omega,
    3854              :   CHARACTER(LEN=4)                   :: cflavors
    3855              :   CHARACTER(LEN=50)                  :: string
    3856            0 :   TYPE(GreenHyboffdiag)                     :: F_tmp
    3857              : 
    3858            0 :   flavors = op%flavors
    3859            0 :   DO iflavor1 = 1, flavors
    3860            0 :     u1 = 0.d0
    3861            0 :     u2 = 0.d0
    3862            0 :     u3 = 0.d0
    3863            0 :     DO iflavor2 = 1, flavors
    3864            0 :       IF ( iflavor2 .EQ. iflavor1 ) CYCLE
    3865            0 :       Un = op%Impurity%mat_U(iflavor2,iflavor1) * op%measN(1,iflavor2)
    3866              : !      Un = op%Impurity%mat_U(iflavor2,iflavor1) * (op%Greens%oper(1,iflavor2,iflavor2) + 1.d0)
    3867              :       !write(6,*) "forsetmoments",iflavor1,iflavor2,(op%Greens%oper(1,iflavor2,iflavor2) + 1.d0), Un
    3868            0 :       u1 = u1 + Un
    3869            0 :       u2 = u2 + Un*op%Impurity%mat_U(iflavor2,iflavor1)
    3870            0 :       DO iflavor3 = 1, flavors
    3871            0 :         IF ( iflavor3 .EQ. iflavor2 .OR. iflavor3 .EQ. iflavor1 ) CYCLE
    3872              :         UUnn = (op%Impurity%mat_U(iflavor2,iflavor1)*op%Impurity%mat_U(iflavor3,iflavor1)) * &
    3873            0 : &                                                    op%measDE(iflavor2,iflavor3)
    3874            0 :         u2 = u2 + UUnn
    3875              :       END DO
    3876              :     END DO
    3877              :      ! write(6,*) "u1,u2",u1,u2
    3878              : 
    3879            0 :     DO iflavor1b = 1, flavors
    3880            0 :       u3 =-(op%Impurity%mat_U(iflavor1,iflavor1b))*op%Greens%oper(1,iflavor1,iflavor1b)
    3881              :       ! u3=U_{1,1b}*G_{1,1b}
    3882            0 :       CALL GreenHyboffdiag_setMoments(op%Greens,iflavor1,iflavor1b,u1,u2,u3)
    3883              :     END DO ! iflavor1b
    3884              : 
    3885              :   END DO ! iflavor1
    3886              : 
    3887            0 :   IF ( PRESENT( Gtau ) ) THEN
    3888            0 :     DO iflavor1 = 1, flavors
    3889            0 :       DO iflavor2 = 1, flavors
    3890            0 :         Gtau(1:op%samples,iflavor1,iflavor2) = op%Greens%oper(1:op%samples,iflavor1,iflavor2)
    3891              :       END DO
    3892              :     END DO ! iflavor1
    3893              :   END IF
    3894              : ! !--------- Write Occupation matrix before Gtau
    3895              : !  write(ostream,'(17x,a)') "Occupation matrix"
    3896              : !  write(ostream,'(17x,30i10)') (iflavorbis,iflavorbis=1,op%flavors)
    3897              : !  write(ostream,'(18x,30a)') ("----------",iflavorbis=1,op%flavors)
    3898              : !  do iflavor=1, op%flavors
    3899              : !    write(ostream,'(7x,i10,a,30f10.4)') iflavor,"|",(-op%Greens%oper(op%samples,iflavor,iflavorbis),iflavorbis=1,op%flavors)
    3900              : !  enddo
    3901              : !  write(ostream,'(18x,30a)') ("----------",iflavorbis=1,op%flavors),ch10
    3902              : ! !------------------------------------------------------------------------------------------
    3903              : ! !--------- Write Occupation matrix Gtau
    3904              : !  write(ostream,'(17x,a)') "Occupation matrix"
    3905              : !  write(ostream,'(17x,30i10)') (iflavorbis,iflavorbis=1,op%flavors)
    3906              : !  write(ostream,'(18x,30a)') ("----------",iflavorbis=1,op%flavors)
    3907              : !  do iflavor=1, op%flavors
    3908              : !    write(ostream,'(7x,i10,a,30f10.4)') iflavor,"|",(Gtau(op%samples,iflavor,iflavorbis),iflavorbis=1,op%flavors)
    3909              : !  enddo
    3910              : !  write(ostream,'(18x,30a)') ("----------",iflavorbis=1,op%flavors),ch10
    3911              : ! !------------------------------------------------------------------------------------------
    3912              : 
    3913              : !================================================
    3914              :   if(3==4) then
    3915              : !================================================
    3916              :     DO iflavor1 = 1, flavors
    3917              :       DO iflavor1b = 1, flavors
    3918              :        !call nfourier3(op%Greens%oper(1:op%samples,iflavor1,iflavor1b),Gw(1:op%samples,iflavor1,iflavor1b),iflavor1==iflavor1b,op%Greens%samples,op%Greens%samples-1,op%Greens%beta,1.d0,op%Greens%Mk(iflavor1,iflavor1b,1),op%Greens%Mk(iflavor1,iflavor1b,2),op%Greens%Mk(iflavor1,iflavor1b,3))
    3919              :       END DO
    3920              :     END DO ! iflavor1
    3921              : !    ============== write Gomega_nd.dat
    3922              :     if(op%rank==0) then
    3923              :     OPEN(UNIT=44, FILE="Gomega_nd_nfourier2.dat")
    3924              :     WRITE(cflavors,'(I4)') 2*(flavors*flavors+1)
    3925              :     string = '(1x,'//TRIM(ADJUSTL(cflavors))//'E15.5)'
    3926              :     !write(6,*) " op%Greens%Wmax", op%Greens%Wmax
    3927              :     do  iflavor1=1, flavors
    3928              :       do  iflavor1b=1, flavors
    3929              :     write(44,*) "#op%Greens%Mk(iflavor1,iflavor2,1",op%Greens%Mk(iflavor1,iflavor1b,:)
    3930              :         DO ifreq = 1, op%samples
    3931              : !      !write(6,string) (DBLE(ifreq)*2-1)*3.1415/op%Greens%beta, &
    3932              : !      (/ ((real(Gw(ifreq,iflavor1,iflavor1b)),imag(Gw(ifreq,iflavor1,iflavor1b)), iflavor1=1, flavors),iflavor1b=1,flavors) /)
    3933              : !      WRITE(44,string) (DBLE(ifreq)*2.d0-1.d0)*3.1415926/op%Greens%beta, &
    3934              :         iw=aimag(Gw(ifreq,op%flavors,op%flavors+1))
    3935              :          WRITE(44,string) aimag(Gw(ifreq,op%flavors,op%flavors+1)),&
    3936              :          real(Gw(ifreq,iflavor1,iflavor1b)),aimag(Gw(ifreq,iflavor1,iflavor1b)),&
    3937              :             ( -op%Greens%Mk(iflavor1,iflavor1b,2) )/(iw*iw) , (op%Greens%Mk(iflavor1,iflavor1b,1))/iw!-op%Greens%Mk(iflavor1,iflavor1b,3)/(iw*iw))/iw
    3938              :       !   WRITE(102,*) aimag(Gw(ifreq,op%flavors,op%flavors+1)), (op%Greens%Mk(iflavor1,iflavor1b,1))/iw,op%Greens%Mk(iflavor1,iflavor1b,1),iw
    3939              :         END DO
    3940              :          WRITE(44,*)
    3941              :       END DO
    3942              :     END DO
    3943              :     close(44)
    3944              :     endif
    3945              : !================================================
    3946              :   endif
    3947              : !================================================
    3948              :        !!write(6,*) "present gw", present(gw)
    3949            0 :   IF ( PRESENT( Gw ) ) THEN
    3950              :      !!write(6,*) "size gw",SIZE(Gw,DIM=2) ,flavors+1
    3951            0 :     IF ( SIZE(Gw,DIM=3) .EQ. flavors+1 ) THEN
    3952              :      ! CALL GreenHyboffdiag_forFourier(op%Greens, Gomega=Gw, omega=Gw(:,op%flavors,op%flavors+1))
    3953            0 :       CALL GreenHyboffdiag_forFourier(op%Greens, Gomega=Gw, omega=Gw(:,op%flavors,op%flavors+1))
    3954              :       !write(6,*) "1"
    3955              :       !IF ( op%rank .EQ. 0 ) write(20,*) Gw(:,iflavor1)
    3956            0 :     ELSE IF ( SIZE(Gw,DIM=3) .EQ. flavors ) THEN
    3957            0 :       CALL GreenHyboffdiag_forFourier(op%Greens,Gomega=Gw)
    3958              :       !write(6,*) "2"
    3959              :     ELSE
    3960            0 :       CALL WARNALL("Ctqmcoffdiag_getGreen : Gw is not valid                    ")
    3961            0 :       CALL GreenHyboffdiag_forFourier(op%Greens,Wmax=op%Wmax)
    3962              :       !write(6,*) "3"
    3963              :     END IF
    3964              :   ELSE
    3965            0 :     CALL GreenHyboffdiag_forFourier(op%Greens,Wmax=op%Wmax)
    3966              :   END IF
    3967              : !  ============== write Gomega_nd.dat
    3968              : !================================================
    3969              : !  if(3==4) then
    3970              : !================================================
    3971              :   if(op%rank==0.and.3==4) then
    3972              :   OPEN(UNIT=44, FILE="Gomega_nd.dat")
    3973              :   WRITE(cflavors,'(I4)') 2*(flavors*flavors+1)
    3974              :   string = '(1x,'//TRIM(ADJUSTL(cflavors))//'E15.5)'
    3975              :   !write(6,*) " op%Greens%Wmax", op%Greens%Wmax
    3976              :   do  iflavor1=1, flavors
    3977              :     do  iflavor1b=1, flavors
    3978              :   write(44,*) "#op%Greens%Mk(iflavor1,iflavor2,1",op%Greens%Mk(iflavor1,iflavor1b,:)
    3979              :       DO ifreq = 1, SIZE(Gw,1)
    3980              : !    !write(6,string) (DBLE(ifreq)*2-1)*3.1415/op%Greens%beta, &
    3981              : !    (/ ((real(Gw(ifreq,iflavor1,iflavor1b)),imag(Gw(ifreq,iflavor1,iflavor1b)), iflavor1=1, flavors),iflavor1b=1,flavors) /)
    3982              : !    WRITE(44,string) (DBLE(ifreq)*2.d0-1.d0)*3.1415926/op%Greens%beta, &
    3983              :       iw=aimag(Gw(ifreq,op%flavors,op%flavors+1))
    3984              :        WRITE(44,string) aimag(Gw(ifreq,op%flavors,op%flavors+1)),&
    3985              :        real(Gw(ifreq,iflavor1,iflavor1b)),aimag(Gw(ifreq,iflavor1,iflavor1b)),&
    3986              :           ( -op%Greens%Mk(iflavor1,iflavor1b,2) )/(iw*iw) , &
    3987              : &          (op%Greens%Mk(iflavor1,iflavor1b,1)-op%Greens%Mk(iflavor1,iflavor1b,3)/(iw*iw))/iw
    3988              :       END DO
    3989              :        WRITE(44,*)
    3990              :     END DO
    3991              :   END DO
    3992              :   endif
    3993              : !================================================
    3994              : !  endif
    3995              : !================================================
    3996              : 
    3997              : 
    3998              : !  ==============================
    3999              :   ! --- Initialize F_tmp
    4000              :   !write(6,*) "10"
    4001              : 
    4002            0 :   IF ( op%have_MPI .EQV. .TRUE. ) THEN
    4003              :     !CALL GreenHyboffdiag_init(F_tmp,op%samples,op%beta,op%flavors,MY_COMM=op%MY_COMM)
    4004            0 :     CALL GreenHyboffdiag_init(F_tmp,op%samples,op%beta,flavors)
    4005              :     !write(6,*) "10a"
    4006              :   ELSE
    4007            0 :     CALL GreenHyboffdiag_init(F_tmp,op%samples,op%beta,flavors)
    4008              :     !write(6,*) "10b"
    4009              :   END IF
    4010              : 
    4011              :   !write(6,*) "11"
    4012              : !  CALL GreenHyboffdiag_setOperW(F_tmp,Gw)
    4013              : 
    4014            0 :   tail = op%samples
    4015            0 :   F_tmp%Wmax=op%samples ! backFourier only works for linear freq: calculation of A and etc..
    4016            0 :   MALLOC(F_tmp%oper_w,(1:tail,op%flavors,op%flavors))
    4017            0 :   F_tmp%oper_w(1:tail,1:F_tmp%nflavors,1:F_tmp%nflavors) = Gw(1:tail,1:F_tmp%nflavors,1:F_tmp%nflavors)
    4018              :   !write(6,*) "example",F_tmp%oper_w(1,1,1)
    4019              :   !write(6,*) "example",Gw(1,1,1)
    4020            0 :   F_tmp%setW = .TRUE.
    4021              :   !write(6,*) size(F_tmp%oper_w,1)
    4022              :   !write(6,*) size(F_tmp%oper_w,2)
    4023              :   !write(6,*) size(F_tmp%oper_w,3)
    4024              :   !write(6,*) size(Gw,1)
    4025              :   !write(6,*) size(Gw,2)
    4026              :   !write(6,*) size(Gw,3)
    4027              : 
    4028              :   !write(6,*) "eee", (2.d0*DBLE(ifreq)-1.d0) * 3.1415/op%beta,real(F_tmp%oper_w(1,1,1)),imag(F_tmp%oper_w(1,1,1))
    4029              : !================================================
    4030              :   if(3==4) then
    4031              : !================================================
    4032              :     OPEN(UNIT=3337, FILE="Gomega_nd2.dat")
    4033              :     do  iflavor1=1, flavors
    4034              :       do  iflavor1b=1, flavors
    4035              :         do  ifreq=1, tail
    4036              : !         write(3337,*) (2.d0*DBLE(ifreq)-1.d0) * 3.1415/op%beta,real(F_tmp%oper_w(ifreq,iflavor1,iflavor1b)),&
    4037              : !   &     imag(F_tmp%oper_w(ifreq,iflavor1,iflavor1b))
    4038              :           write(3337,*) aimag(Gw(ifreq,op%flavors,op%flavors+1)), real(F_tmp%oper_w(ifreq,iflavor1,iflavor1b)),&
    4039              :  &        aimag(F_tmp%oper_w(ifreq,iflavor1,iflavor1b))
    4040              : 
    4041              :       !    omega=(2.d0*DBLE(ifreq)-1.d0) * 3.1415/op%beta
    4042              :  !        F_tmp%oper_w(ifreq,iflavor1,iflavor1b)=0.1**2/Gw(ifreq,op%flavors,op%flavors+1)
    4043              :         enddo
    4044              :         write(3337,*)
    4045              :       enddo
    4046              :     enddo
    4047              :     close(3337)
    4048              : !================================================
    4049              :   endif
    4050              : !================================================
    4051              : 
    4052              :   !write(6,*) "12",F_tmp%Wmax
    4053              : 
    4054              : !  CALL GreenHyboffdiag_backFourier(F_tmp,func="green")
    4055              : 
    4056              :   !write(6,*) "13"
    4057              : 
    4058              : !================================================
    4059              :   if(3==4) then
    4060              : !================================================
    4061              :     OPEN(UNIT=48, FILE="Gtau_nd_2.dat")
    4062              : !    --- Print full non diagonal Gtau in Gtau_nd.dat
    4063              :     WRITE(cflavors,'(I4)') flavors*flavors+1
    4064              :     string = '(1x,'//TRIM(ADJUSTL(cflavors))//'ES22.14)'
    4065              :     DO itime = 1, op%samples+1
    4066              :       WRITE(48,string) DBLE(itime-1)*op%beta/DBLE(op%samples), &
    4067              :  &    ((F_tmp%oper(itime,iflavor1,iflavor1b), iflavor1=1, flavors),iflavor1b=1,flavors)
    4068              :     END DO
    4069              : !================================================
    4070              :   endif
    4071              : !================================================
    4072              : 
    4073            0 :   CALL GreenHyboffdiag_destroy(F_tmp)
    4074              : 
    4075              :   !FREE(F_tmp%oper_w)
    4076              : !  ==============================
    4077            0 : END SUBROUTINE Ctqmcoffdiag_getGreen
    4078              : !!***
    4079              : 
    4080              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_getD
    4081              : !! NAME
    4082              : !!  Ctqmcoffdiag_getD
    4083              : !!
    4084              : !! FUNCTION
    4085              : !!  get double occupation
    4086              : !!
    4087              : !! COPYRIGHT
    4088              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
    4089              : !!  This file is distributed under the terms of the
    4090              : !!  GNU General Public License, see ~abinit/COPYING
    4091              : !!  or http://www.gnu.org/copyleft/gpl.txt .
    4092              : !!
    4093              : !! INPUTS
    4094              : !!  op=ctqmc
    4095              : !!
    4096              : !! OUTPUT
    4097              : !!  D=full double occupation
    4098              : !!
    4099              : !! SIDE EFFECTS
    4100              : !!
    4101              : !! NOTES
    4102              : !!
    4103              : !! SOURCE
    4104              : 
    4105            0 : SUBROUTINE Ctqmcoffdiag_getD(op, D)
    4106              : 
    4107              : !Arguments ------------------------------------
    4108              :   TYPE(Ctqmcoffdiag)       , INTENT(IN ) :: op
    4109              :   DOUBLE PRECISION, INTENT(OUT) :: D
    4110              : !Local variables ------------------------------
    4111              :   INTEGER                       :: iflavor1
    4112              :   INTEGER                       :: iflavor2
    4113              : 
    4114            0 :   D = 0.d0
    4115              : 
    4116            0 :   DO iflavor1 = 1, op%flavors
    4117            0 :     DO iflavor2 = iflavor1+1, op%flavors
    4118            0 :       D = D + op%measDE(iflavor2,iflavor1)
    4119              :     END DO
    4120              :   END DO
    4121              :   !IF ( op%rank .EQ. 0 ) THEN
    4122              :   !  DO iflavor1 = 1, op%flavors
    4123              :   !    DO iflavor2 = iflavor1+1, op%flavors
    4124              :   !     write(4533,*) op%measDE(iflavor2,iflavor1)k
    4125              :   !     write(4534,*) op%Impurity%mat_U(iflavor2,iflavor1)k
    4126              :   !    END DO
    4127              :   !  END DO
    4128              : 
    4129              :   !ENDIF
    4130              : 
    4131            0 : END SUBROUTINE Ctqmcoffdiag_getD
    4132              : !!***
    4133              : 
    4134              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_getE
    4135              : !! NAME
    4136              : !!  Ctqmcoffdiag_getE
    4137              : !!
    4138              : !! FUNCTION
    4139              : !!  get interaction energy and noise on it
    4140              : !!
    4141              : !! COPYRIGHT
    4142              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
    4143              : !!  This file is distributed under the terms of the
    4144              : !!  GNU General Public License, see ~abinit/COPYING
    4145              : !!  or http://www.gnu.org/copyleft/gpl.txt .
    4146              : !!
    4147              : !! INPUTS
    4148              : !!  op=ctqmc
    4149              : !!
    4150              : !! OUTPUT
    4151              : !!  E=interaction energy
    4152              : !!  noise=noise on this value
    4153              : !!
    4154              : !! SIDE EFFECTS
    4155              : !!
    4156              : !! NOTES
    4157              : !!
    4158              : !! SOURCE
    4159              : 
    4160            0 : SUBROUTINE Ctqmcoffdiag_getE(op,E,noise)
    4161              : 
    4162              : !Arguments ------------------------------------
    4163              :   TYPE(Ctqmcoffdiag)       , INTENT(IN ) :: op
    4164              :   DOUBLE PRECISION, INTENT(OUT) :: E
    4165              :   DOUBLE PRECISION, INTENT(OUT) :: Noise
    4166              : 
    4167            0 :   E = op%measDE(1,1)
    4168            0 :   Noise = op%a_Noise*(DBLE(op%sweeps)*DBLE(op%size))**op%b_Noise
    4169            0 : END SUBROUTINE Ctqmcoffdiag_getE
    4170              : !!***
    4171              : 
    4172              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_printAll
    4173              : !! NAME
    4174              : !!  Ctqmcoffdiag_printAll
    4175              : !!
    4176              : !! FUNCTION
    4177              : !!  print different functions computed during the simulation
    4178              : !!
    4179              : !! COPYRIGHT
    4180              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
    4181              : !!  This file is distributed under the terms of the
    4182              : !!  GNU General Public License, see ~abinit/COPYING
    4183              : !!  or http://www.gnu.org/copyleft/gpl.txt .
    4184              : !!
    4185              : !! INPUTS
    4186              : !!  op=ctqmc
    4187              : !!
    4188              : !! OUTPUT
    4189              : !!
    4190              : !! SIDE EFFECTS
    4191              : !!
    4192              : !! NOTES
    4193              : !!
    4194              : !! SOURCE
    4195              : 
    4196            0 : SUBROUTINE Ctqmcoffdiag_printAll(op)
    4197              : 
    4198              : !Arguments ------------------------------------
    4199              :   TYPE(Ctqmcoffdiag), INTENT(INOUT) :: op
    4200              : 
    4201            0 :   IF ( .NOT. op%done ) &
    4202            0 :     CALL WARNALL("Ctqmcoffdiag_printAll : Simulation not run                 ")
    4203              : 
    4204              : !sui!write(6,*) "op%stats",op%stats
    4205            0 :   CALL Ctqmcoffdiag_printQMC(op)
    4206              : 
    4207            0 :   CALL Ctqmcoffdiag_printGreen(op)
    4208              : 
    4209            0 :   CALL Ctqmcoffdiag_printD(op)
    4210              : 
    4211              : !  CALL Ctqmcoffdiag_printE(op)
    4212              : 
    4213              : !#ifdef CTCtqmcoffdiag_ANALYSIS
    4214            0 :   CALL Ctqmcoffdiag_printPerturbation(op)
    4215              : 
    4216            0 :   CALL Ctqmcoffdiag_printCorrelation(op)
    4217              : !#endif
    4218              : 
    4219            0 :   CALL Ctqmcoffdiag_printSpectra(op)
    4220              : 
    4221            0 : END SUBROUTINE Ctqmcoffdiag_printAll
    4222              : !!***
    4223              : 
    4224              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_printQMC
    4225              : !! NAME
    4226              : !!  Ctqmcoffdiag_printQMC
    4227              : !!
    4228              : !! FUNCTION
    4229              : !!  print ctqmc statistics
    4230              : !!
    4231              : !! COPYRIGHT
    4232              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
    4233              : !!  This file is distributed under the terms of the
    4234              : !!  GNU General Public License, see ~abinit/COPYING
    4235              : !!  or http://www.gnu.org/copyleft/gpl.txt .
    4236              : !!
    4237              : !! INPUTS
    4238              : !!  op=ctqmc
    4239              : !!
    4240              : !! OUTPUT
    4241              : !!
    4242              : !! SIDE EFFECTS
    4243              : !!
    4244              : !! NOTES
    4245              : !!
    4246              : !! SOURCE
    4247              : 
    4248            0 : SUBROUTINE Ctqmcoffdiag_printQMC(op)
    4249              : 
    4250              : !Arguments ------------------------------------
    4251              :   TYPE(Ctqmcoffdiag), INTENT(INOUT) :: op
    4252              : !Local variables ------------------------------
    4253              :   INTEGER                  :: ostream
    4254              :   INTEGER                  :: iflavor,iflavorbis,iorder
    4255              :   DOUBLE PRECISION         :: sweeps
    4256              :   DOUBLE PRECISION         :: invSweeps
    4257              :   CHARACTER(LEN=2)         :: a
    4258              :   CHARACTER(LEN=15)        :: string
    4259              : 
    4260              :   !IF ( op%rank .NE. 0) RETURN
    4261            0 :   IF ( op%rank .NE. MOD(op%size,op%size)) RETURN
    4262              : 
    4263            0 :   ostream   = op%ostream
    4264            0 :   sweeps    = DBLE(op%sweeps)
    4265            0 :   invSweeps = 1.d0/sweeps
    4266              : 
    4267            0 :   WRITE(ostream,'(1x,F13.0,A11,F10.2,A12,I5,A5)') sweeps*DBLE(op%size), " sweeps in ", op%runTime, &
    4268            0 :                  " seconds on ", op%size, " CPUs"
    4269            0 :   WRITE(ostream,'(A28,F6.2)') "Segments added        [%] : ", op%stats(4)*invSweeps*100.d0
    4270            0 :   WRITE(ostream,'(A28,F6.2)') "Segments removed      [%] : ", op%stats(5)*invSweeps*100.d0
    4271            0 :   WRITE(ostream,'(A28,F6.2)') "Segments <0 sign      [%] : ", op%stats(6)*invSweeps*100.d0
    4272              :   !WRITE(ostream,'(A28,F12.2)') "Number of meas        [%] : ", op%stats(6)
    4273            0 :   WRITE(ostream,'(A28,F6.2)') "Anti-segments added   [%] : ", op%stats(1)*invSweeps*100.d0
    4274            0 :   WRITE(ostream,'(A28,F6.2)') "Anti-segments removed [%] : ", op%stats(2)*invSweeps*100.d0
    4275            0 :   WRITE(ostream,'(A28,F6.2)') "Anti-segments <0 sign [%] : ", op%stats(3)*invSweeps*100.d0
    4276              :   !WRITE(ostream,'(A28,F12.2)') "Sum of sign       [%] : ", op%stats(3)
    4277            0 :   WRITE(ostream,'(A28,F13.2)') "Signe value               : ", op%Greens%signvaluemeas
    4278            0 :   IF ( op%modGlobalMove(1) .LT. op%sweeps + 1 ) THEN
    4279            0 :     WRITE(ostream,'(A28,F6.2)') "Global Move           [%] : ", op%swap         *invSweeps*100.d0*op%modGlobalMove(1)
    4280            0 :     WRITE(ostream,'(A28,F6.2)') "Global Move Reduced   [%] : ", op%swap         / DBLE(op%modGlobalMove(2))*100.d0
    4281              :   END IF
    4282              : !#ifdef CTCtqmcoffdiag_CHECK
    4283            0 :   IF ( op%opt_check .EQ. 1 .OR. op%opt_check .EQ. 3 ) &
    4284            0 :     WRITE(ostream,'(A28,E22.14)') "Impurity test         [%] : ", op%errorImpurity*100.d0
    4285            0 :   IF ( op%opt_check .GE. 2 ) &
    4286            0 :       WRITE(ostream,'(A28,E22.14)') "Bath     test         [%] : ", op%errorBath    *100.d0
    4287              : !#endif
    4288            0 :   WRITE(ostream,'(A28,ES22.14,A5,ES21.14)') "<Epot>                [U] : ", op%measDE(1,1), " +/- ",&
    4289              : !#ifdef HAVE_MPI
    4290            0 :                                                               op%a_Noise*(sweeps*DBLE(op%size))**op%b_Noise
    4291              : !#else
    4292              : !                                                              op%a_Noise*(sweeps)**op%b_Noise
    4293              : !#endif
    4294              :  !--------- Write double occupation between all pairs of orbitals --------------------------
    4295            0 :   write(ostream,'(17x,a)') "Double occupation between pairs of orbitals"
    4296            0 :   write(ostream,'(17x,30i10)') (iflavorbis,iflavorbis=1,op%flavors)
    4297            0 :   write(ostream,'(18x,30a)') ("----------",iflavorbis=1,op%flavors)
    4298            0 :   do iflavor=1, op%flavors
    4299            0 :     write(ostream,'(7x,i10,a,30f10.4)') iflavor,"|",(op%measDE(iflavor,iflavorbis),iflavorbis=1,op%flavors)
    4300              :   enddo
    4301            0 :   write(ostream,'(18x,30a)') ("----------",iflavorbis=1,op%flavors),ch10
    4302              :  !------------------------------------------------------------------------------------------
    4303              : 
    4304              :  !--------- Write number of segments for each orbitals
    4305              :  ! write(ostream,'(a)') "Number of segments for each orbitals"
    4306              :  ! write(ostream,'(17x,30i10)') (iflavorbis,iflavorbis=1,op%flavors)
    4307              :  ! write(ostream,'(17x,30a)') ("----------",iflavorbis=1,op%flavors)
    4308              :  ! do iflavor=1, op%flavors
    4309              :  !   write(ostream,'(i17,a,30f10.4)') iflavor,"|",(op%Impurity%particles(IT)%tail
    4310              :  ! enddo
    4311              :  ! write(ostream,'(17x,30a)') ("----------",iflavorbis=1,op%flavors)
    4312              :  !------------------------------------------------------------------------------------------
    4313              :  !--------- Write G(L)
    4314            0 :   write(ostream,'(17x,a)') "G(L)"
    4315            0 :   write(ostream,'(17x,30i10)') (iflavorbis,iflavorbis=1,op%flavors)
    4316            0 :   write(ostream,'(18x,30a)') ("----------",iflavorbis=1,op%flavors)
    4317            0 :   do iflavor=1, op%flavors
    4318            0 :     write(ostream,'(7x,i10,a,30f10.4)') iflavor,"|",(op%Greens%oper(op%samples,iflavor,iflavorbis),iflavorbis=1,op%flavors)
    4319              :   enddo
    4320            0 :   write(ostream,'(18x,30a)') ("----------",iflavorbis=1,op%flavors),ch10
    4321              :  !------------------------------------------------------------------------------------------
    4322              :  !--------- Write G(1)
    4323            0 :   write(ostream,'(17x,a)') "G(1)"
    4324            0 :   write(ostream,'(17x,30i10)') (iflavorbis,iflavorbis=1,op%flavors)
    4325            0 :   write(ostream,'(18x,30a)') ("----------",iflavorbis=1,op%flavors)
    4326            0 :   do iflavor=1, op%flavors
    4327            0 :     write(ostream,'(7x,i10,a,30f10.4)') iflavor,"|",(op%Greens%oper(1,iflavor,iflavorbis),iflavorbis=1,op%flavors)
    4328              :   enddo
    4329            0 :   write(ostream,'(18x,30a)') ("----------",iflavorbis=1,op%flavors),ch10
    4330              :  !------------------------------------------------------------------------------------------
    4331              : 
    4332            0 :   WRITE(ostream,'(A28,F8.4,A3,F7.4)') "Noise                 [U] : ", op%a_Noise, " x^", op%b_Noise
    4333            0 :   WRITE(ostream,'(A28,E10.2)')  "Niquist puls.     [/beta] : ", ACOS(-1.d0)*op%inv_dt
    4334            0 :   WRITE(ostream,'(A28,E22.14)') "Max Acc. Epot Error   [U] : ", op%measDE(2,2)/(op%beta*op%modNoise1*2.d0)*sweeps
    4335              : 
    4336              :   !WRITE(ostream,'(A28,F7.4,A3,F7.4,A4,E20.14)') "Noise            [G(tau)] : ", op%a_Noise(2), "x^", op%b_Noise(2), " -> ", &
    4337              :                                                               !op%a_Noise(2)*(sweeps*DBLE(op%size))**op%b_Noise(2)
    4338              :  !----- PERTURBATION ORDER------------------------------------------------------------------
    4339            0 :   IF ( op%opt_order .GT. 0 ) THEN
    4340            0 :     write(ostream,*)
    4341            0 :     WRITE(a,'(I2)') op%flavors
    4342            0 :     string = '(A28,'//TRIM(ADJUSTL(a))//'(1x,I3))'
    4343            0 :     WRITE(ostream,string) "Perturbation orders       : ",(/ (MAXLOC(op%measPerturbation(:, iflavor))-1, iflavor=1, op%flavors) /)
    4344            0 :     write(ostream,'(17x,a)') "order of Perturbation for flavors"
    4345            0 :     write(ostream,'(17x,30i10)') (iflavorbis,iflavorbis=1,op%flavors)
    4346            0 :     write(ostream,'(18x,30a)') ("----------",iflavorbis=1,op%flavors)
    4347            0 :     write(ostream,'(12x,a,30i10)') " max ",(/ (MAXLOC(op%measPerturbation(:, iflavor))-1, iflavor=1, op%flavors) /)
    4348            0 :     write(ostream,'(18x,30a)') ("----------",iflavorbis=1,op%flavors)
    4349            0 :     do iorder=0, op%opt_order-1
    4350            0 :       write(ostream,'(7x,i10,a,30f10.4)') iorder,"|",(op%measPerturbation(iorder+1,iflavor),iflavor=1,op%flavors)
    4351              :     enddo
    4352              :   END IF
    4353              :  !------------------------------------------------------------------------------------------
    4354              :  !----- PERTURBATION ORDER------------------------------------------------------------------
    4355            0 :   IF ( op%opt_order .GT. 0 ) THEN
    4356            0 :     write(ostream,*)
    4357            0 :     write(ostream,'(17x,a)') "Proportion of full and empty orbital for order 0"
    4358            0 :     write(ostream,'(17x,30i10)') (iflavorbis,iflavorbis=1,op%flavors)
    4359            0 :     write(ostream,'(18x,30a)') ("----------",iflavorbis=1,op%flavors)
    4360            0 :     write(ostream,'(2x,a,30f10.4)') " full  orbital |",(op%meas_fullemptylines(1,iflavor),iflavor=1,op%flavors)
    4361            0 :     write(ostream,'(2x,a,30f10.4)') " empty orbital |",(op%meas_fullemptylines(2,iflavor),iflavor=1,op%flavors)
    4362              :   END IF
    4363              :  !------------------------------------------------------------------------------------------
    4364              :   !CALL FLUSH(op%ostream)
    4365              :   IF ( ABS(((op%stats(4) *invSweeps*100.d0) / (op%stats(5) *invSweeps*100.d0) - 1.d0)) .GE. 0.02d0 &
    4366            0 :    .OR. ABS(((op%stats(1)*invSweeps*100.d0) / (op%stats(2)*invSweeps*100.d0) - 1.d0)) .GE. 0.02d0 ) &
    4367              :     THEN
    4368            0 :     CALL WARNALL("Ctqmcoffdiag_printQMC : bad statistic according to moves. Increase sweeps")
    4369              :   END IF
    4370            0 :   IF ( ABS(op%b_Noise+0.5)/0.5d0 .GE. 0.05d0 ) &
    4371            0 :     CALL WARNALL("Ctqmcoffdiag_printQMC : bad statistic according to Noise. Increase sweeps")
    4372              : !  IF ( ISNAN(op%a_Noise) .OR. ISNAN(op%a_Noise) ) &
    4373              : !    CALL WARNALL("Ctqmcoffdiag_printQMC : NaN appeared. Increase sweeps    ")
    4374              : 
    4375              : 
    4376              : END SUBROUTINE Ctqmcoffdiag_printQMC
    4377              : !!***
    4378              : 
    4379              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_printGreen
    4380              : !! NAME
    4381              : !!  Ctqmcoffdiag_printGreen
    4382              : !!
    4383              : !! FUNCTION
    4384              : !!  print green functions
    4385              : !!
    4386              : !! COPYRIGHT
    4387              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
    4388              : !!  This file is distributed under the terms of the
    4389              : !!  GNU General Public License, see ~abinit/COPYING
    4390              : !!  or http://www.gnu.org/copyleft/gpl.txt .
    4391              : !!
    4392              : !! INPUTS
    4393              : !!  op=ctqmc
    4394              : !!  oFileIn=file stream
    4395              : !!
    4396              : !! OUTPUT
    4397              : !!
    4398              : !! SIDE EFFECTS
    4399              : !!
    4400              : !! NOTES
    4401              : !!
    4402              : !! SOURCE
    4403              : 
    4404            0 : SUBROUTINE Ctqmcoffdiag_printGreen(op, oFileIn)
    4405              : 
    4406              : !Arguments ------------------------------------
    4407              :   use m_io_tools, only : flush_unit
    4408              :   TYPE(Ctqmcoffdiag)        , INTENT(IN)    :: op
    4409              :   INTEGER  , OPTIONAL, INTENT(IN)    :: oFileIn
    4410              : !Local variables ------------------------------
    4411              :   INTEGER                            :: oFile
    4412              :   INTEGER                            :: itime
    4413              :   INTEGER                            :: sp1
    4414              :   INTEGER                            :: iflavor,iflavorb
    4415              :   INTEGER                            :: flavors !, iflavor2 !,iflavor1,
    4416              :   CHARACTER(LEN=4)                   :: cflavors
    4417              :   CHARACTER(LEN=50)                  :: string
    4418              :   DOUBLE PRECISION                   :: dt
    4419              :   DOUBLE PRECISION                   :: sweeps
    4420              : 
    4421              :   !IF ( op%rank .NE. MOD(1,op%size)) RETURN
    4422            0 :   IF ( op%rank .NE. MOD(op%size+1,op%size)) RETURN
    4423              : 
    4424            0 :   oFile = 40
    4425            0 :   IF ( PRESENT(oFileIn) ) THEN
    4426            0 :     oFile = oFileIn
    4427              :   ELSE
    4428            0 :     OPEN(UNIT=oFile, FILE="Gtau.dat")
    4429              :   END IF
    4430            0 :   OPEN(UNIT=43, FILE="Gtau_nd.dat")
    4431            0 :   rewind(43)
    4432            0 :   sp1     =  op%samples
    4433            0 :   dt      =  op%beta / DBLE(sp1)
    4434            0 :   sp1     =  sp1 + 1
    4435            0 :   flavors =  op%flavors
    4436            0 :   sweeps = DBLE(op%sweeps)*DBLE(op%size)
    4437              : 
    4438            0 :   IF ( op%opt_noise .EQ. 1) THEN
    4439            0 :     WRITE(cflavors,'(I4)') (2*flavors+1)*2
    4440            0 :     string = '(1x,'//TRIM(ADJUSTL(cflavors))//'ES22.14)'
    4441            0 :     DO itime = 1, sp1
    4442            0 :       WRITE(oFile,string) DBLE(itime-1)*dt, &
    4443            0 :       (/ (op%Greens%oper(itime,iflavor,iflavor), iflavor=1, flavors) /), &
    4444            0 :       (/ (op%abNoiseG(1,itime,iflavor)*(sweeps)**op%abNoiseG(2,itime,iflavor), iflavor=1, flavors) /)
    4445              :     END DO
    4446              :   ELSE
    4447            0 :     WRITE(cflavors,'(I4)') (flavors+1)*2
    4448            0 :     string = '(1x,'//TRIM(ADJUSTL(cflavors))//'ES22.14)'
    4449            0 :     DO itime = 1, sp1
    4450              : !     WRITE(45,string) DBLE(itime-1)*dt, &
    4451              : !     (/ (op%Greens%oper(itime,iflavor,iflavor), iflavor=1, flavors) /)
    4452            0 :       WRITE(oFile,string) DBLE(itime-1)*dt, &
    4453            0 :       (/ (op%Greens%oper(itime,iflavor,iflavor), iflavor=1, flavors) /)
    4454              : !     WRITE(46,*) DBLE(itime-1)*dt, &
    4455              : !     & (/ ((op%Greens%oper(itime,iflavor,iflavorb), iflavor=1, flavors),iflavorb=1,flavors) /)
    4456              :     END DO
    4457              : !   DO itime = 1, sp1
    4458              : !     WRITE(47,*) DBLE(itime-1)*dt, &
    4459              : !     & (/ ((op%Greens%oper(itime,iflavor,iflavorb), iflavor=1, flavors),iflavorb=1,flavors) /)
    4460              : !   END DO
    4461              : !  --- Print full non diagonal Gtau in Gtau_nd.dat
    4462            0 :     WRITE(cflavors,'(I4)') (flavors*flavors+1)
    4463              : !   write(47,*) "cflavors",cflavors
    4464            0 :     string = '(1x,'//TRIM(ADJUSTL(cflavors))//'ES22.14)'
    4465              : !   write(47,*) string
    4466            0 :     DO itime = 1, sp1
    4467            0 :       WRITE(43,string) DBLE(itime-1)*dt, &
    4468            0 :       & (/ ((op%Greens%oper(itime,iflavor,iflavorb), iflavorb=1, flavors),iflavor=1,flavors) /)
    4469              : !     WRITE(44,*) DBLE(itime-1)*dt, &
    4470              : !     & (op%Greens%oper(itime,iflavor,iflavor), iflavor=1, flavors)
    4471              : !     WRITE(44,string) DBLE(itime-1)*dt, &
    4472              : !     & (op%Greens%oper(itime,iflavor,iflavor), iflavor=1, flavors)
    4473              :     END DO
    4474            0 :       WRITE(43,*)
    4475              :   END IF
    4476              : !    DO iflavor = 1, flavors
    4477              : !      DO iflavor2 = 1, flavors
    4478              : !          write(4436,*) "#",iflavor,iflavor2
    4479              : !        do  itime=1,sp1
    4480              : !          write(4436,*) DBLE(itime-1)*dt,real(op%Greens%oper(itime,iflavor,iflavor2))
    4481              : !        enddo
    4482              : !          write(4436,*)
    4483              : !      END DO
    4484              : !    END DO
    4485              : !    close(4436)
    4486              : 
    4487            0 :   IF ( .NOT. PRESENT(oFileIn) ) CLOSE(oFile)
    4488            0 :   CLOSE(43)
    4489              : ! CLOSE(44)
    4490              : ! CLOSE(45)
    4491              : ! CLOSE(46)
    4492              : ! CLOSE(47)
    4493              :   !call flush_unit(43)
    4494              : 
    4495              : END SUBROUTINE Ctqmcoffdiag_printGreen
    4496              : !!***
    4497              : 
    4498              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_printD
    4499              : !! NAME
    4500              : !!  Ctqmcoffdiag_printD
    4501              : !!
    4502              : !! FUNCTION
    4503              : !!  print individual double occupancy
    4504              : !!
    4505              : !! COPYRIGHT
    4506              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
    4507              : !!  This file is distributed under the terms of the
    4508              : !!  GNU General Public License, see ~abinit/COPYING
    4509              : !!  or http://www.gnu.org/copyleft/gpl.txt .
    4510              : !!
    4511              : !! INPUTS
    4512              : !!  op=ctqmc
    4513              : !!  oFileIn=file stream
    4514              : !!
    4515              : !! OUTPUT
    4516              : !!
    4517              : !! SIDE EFFECTS
    4518              : !!
    4519              : !! NOTES
    4520              : !!
    4521              : !! SOURCE
    4522              : 
    4523            0 : SUBROUTINE Ctqmcoffdiag_printD(op,oFileIn)
    4524              : 
    4525              : !Arguments ------------------------------------
    4526              :   TYPE(Ctqmcoffdiag)          , INTENT(IN)    :: op
    4527              :   INTEGER  , OPTIONAL, INTENT(IN)    :: oFileIn
    4528              : !Local variables ------------------------------
    4529              :   INTEGER                            :: oFile
    4530              :   INTEGER                            :: iflavor1
    4531              :   INTEGER                            :: iflavor2
    4532              : 
    4533              :   !IF ( op%rank .NE. MOD(2,op%size)) RETURN
    4534            0 :   IF ( op%rank .NE. MOD(op%size+2,op%size)) RETURN
    4535              : 
    4536            0 :   oFile = 41
    4537            0 :   IF ( PRESENT(oFileIn) ) THEN
    4538            0 :     oFile = oFileIn
    4539              :   ELSE
    4540            0 :     OPEN(UNIT=oFile, FILE="D.dat")
    4541              :   END IF
    4542              : 
    4543            0 :   DO iflavor1 = 1, op%flavors
    4544            0 :     DO iflavor2 = iflavor1+1, op%flavors
    4545            0 :       WRITE(oFile,'(1x,A8,I4,A1,I4,A3,ES21.14)') "Orbitals", iflavor1, "-", iflavor2, " : ", op%measDE(iflavor2,iflavor1)
    4546              :     END DO
    4547              :   END DO
    4548              : 
    4549            0 :   IF ( .NOT. PRESENT(oFileIn) ) CLOSE(oFile)
    4550              : 
    4551              : END SUBROUTINE Ctqmcoffdiag_printD
    4552              : !!***
    4553              : 
    4554              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_printE
    4555              : !! NAME
    4556              : !!  Ctqmcoffdiag_printE
    4557              : !!
    4558              : !! FUNCTION
    4559              : !!  print energy and noise
    4560              : !!
    4561              : !! COPYRIGHT
    4562              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
    4563              : !!  This file is distributed under the terms of the
    4564              : !!  GNU General Public License, see ~abinit/COPYING
    4565              : !!  or http://www.gnu.org/copyleft/gpl.txt .
    4566              : !!
    4567              : !! INPUTS
    4568              : !!  op=ctqmc
    4569              : !!  oFileIn=file stream
    4570              : !!
    4571              : !! OUTPUT
    4572              : !!
    4573              : !! SIDE EFFECTS
    4574              : !!
    4575              : !! NOTES
    4576              : !!
    4577              : !! SOURCE
    4578              : 
    4579            0 : SUBROUTINE Ctqmcoffdiag_printE(op,oFileIn)
    4580              : 
    4581              : !Arguments ------------------------------------
    4582              :   TYPE(Ctqmcoffdiag)          , INTENT(IN)    :: op
    4583              :   INTEGER  , OPTIONAL, INTENT(IN)    :: oFileIn
    4584              : !Local variables ------------------------------
    4585              :   INTEGER                            :: oFile
    4586              :   DOUBLE PRECISION                   :: E
    4587              :   DOUBLE PRECISION                   :: Noise
    4588              : 
    4589              :   !IF ( op%rank .NE. MOD(3,op%size)) RETURN
    4590            0 :   IF ( op%rank .NE. MOD(op%size+3,op%size)) RETURN
    4591              : 
    4592            0 :   oFile = 42
    4593            0 :   IF ( PRESENT(oFileIn) ) THEN
    4594            0 :     oFile = oFileIn
    4595              :   ELSE
    4596            0 :     OPEN(UNIT=oFile, FILE="BetaENoise.dat")
    4597              :   END IF
    4598              : 
    4599            0 :   CALL Ctqmcoffdiag_getE(op,E,Noise)
    4600              : 
    4601            0 :   WRITE(oFile,'(1x,F3.2,A2,ES21.14,A2,ES21.14)') op%beta, "  ", E, "  ",  Noise
    4602              : 
    4603            0 :   IF ( .NOT. PRESENT(oFileIn) ) CLOSE(oFile)
    4604              : 
    4605              : END SUBROUTINE Ctqmcoffdiag_printE
    4606              : !!***
    4607              : 
    4608              : !#ifdef CTCtqmcoffdiag_ANALYSIS
    4609              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_printPerturbation
    4610              : !! NAME
    4611              : !!  Ctqmcoffdiag_printPerturbation
    4612              : !!
    4613              : !! FUNCTION
    4614              : !!  print perturbation order
    4615              : !!
    4616              : !! COPYRIGHT
    4617              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
    4618              : !!  This file is distributed under the terms of the
    4619              : !!  GNU General Public License, see ~abinit/COPYING
    4620              : !!  or http://www.gnu.org/copyleft/gpl.txt .
    4621              : !!
    4622              : !! INPUTS
    4623              : !!  op=ctqmc
    4624              : !!  oFileIn=file stream
    4625              : !!
    4626              : !! OUTPUT
    4627              : !!  argout(sizeout)=description
    4628              : !!
    4629              : !! SIDE EFFECTS
    4630              : !!
    4631              : !! NOTES
    4632              : !!
    4633              : !! SOURCE
    4634              : 
    4635            0 : SUBROUTINE Ctqmcoffdiag_printPerturbation(op, oFileIn)
    4636              : 
    4637              : !Arguments ------------------------------------
    4638              :   TYPE(Ctqmcoffdiag)          , INTENT(IN)           :: op
    4639              :   INTEGER  , OPTIONAL,  INTENT(IN)          :: oFileIn
    4640              : !Local variables-------------------------------
    4641              :   INTEGER                                   :: oFile
    4642              :   INTEGER                                   :: iorder
    4643              :   INTEGER                                   :: order
    4644              :   INTEGER                                   :: iflavor
    4645              :   INTEGER                                   :: flavors
    4646              :   CHARACTER(LEN=2)                          :: a
    4647              :   CHARACTER(LEN=50)                         :: string
    4648              : 
    4649              :   !IF ( op%rank .NE. MOD(4,op%size)) RETURN
    4650            0 :   IF ( op%rank .NE. MOD(op%size+4,op%size)) RETURN
    4651            0 :   IF ( op%opt_order .LE. 0 ) RETURN
    4652              : 
    4653            0 :   oFile = 43
    4654            0 :   IF ( PRESENT(oFileIn) ) THEN
    4655            0 :     oFile = oFileIn
    4656              :   ELSE
    4657            0 :     OPEN(UNIT=oFile, FILE="Perturbation.dat")
    4658              :   END IF
    4659              : 
    4660            0 :   order        =  op%opt_order
    4661            0 :   flavors      =  op%flavors
    4662              : 
    4663            0 :   WRITE(a,'(I2)') flavors
    4664            0 :   string = '(I5,'//TRIM(ADJUSTL(a))//'F19.15)'
    4665            0 :   DO iorder = 1, order
    4666            0 :     WRITE(oFile,string) iorder-1, &
    4667            0 :                 (/ (op%measPerturbation(iorder, iflavor), iflavor=1, flavors) /)
    4668              :   END DO
    4669              : 
    4670            0 :   IF ( .NOT. PRESENT(oFileIn) ) CLOSE(oFile)
    4671              : END SUBROUTINE Ctqmcoffdiag_printPerturbation
    4672              : !!***
    4673              : 
    4674              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_printCorrelation
    4675              : !! NAME
    4676              : !!  Ctqmcoffdiag_printCorrelation
    4677              : !!
    4678              : !! FUNCTION
    4679              : !!  print correlation fonctions
    4680              : !!
    4681              : !! COPYRIGHT
    4682              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
    4683              : !!  This file is distributed under the terms of the
    4684              : !!  GNU General Public License, see ~abinit/COPYING
    4685              : !!  or http://www.gnu.org/copyleft/gpl.txt .
    4686              : !!
    4687              : !! INPUTS
    4688              : !!  op=ctqmc
    4689              : !!  oFileIn=file stream
    4690              : !!
    4691              : !! OUTPUT
    4692              : !!
    4693              : !! SIDE EFFECTS
    4694              : !!
    4695              : !! NOTES
    4696              : !!
    4697              : !! SOURCE
    4698              : 
    4699            0 : SUBROUTINE Ctqmcoffdiag_printCorrelation(op, oFileIn)
    4700              : 
    4701              : !Arguments ------------------------------------
    4702              :   TYPE(Ctqmcoffdiag)          , INTENT(IN)             :: op
    4703              :   INTEGER  , OPTIONAL, INTENT(IN)             :: oFileIn
    4704              : !Local variables ------------------------------
    4705              :   INTEGER                                     :: oFile
    4706              :   INTEGER                                     :: itime
    4707              :   INTEGER                                     :: sp1
    4708              :   INTEGER                                     :: iflavor
    4709              :   INTEGER                                     :: i
    4710              :   INTEGER                                     :: flavors
    4711              :   CHARACTER(LEN=2)                            :: a
    4712              :   CHARACTER(LEN=50)                           :: string
    4713              :   DOUBLE PRECISION                            :: dt
    4714              : 
    4715              :   !IF ( op%rank .NE. MOD(5,op%size)) RETURN
    4716            0 :   IF ( op%rank .NE. MOD(op%size+5,op%size)) RETURN
    4717            0 :   IF ( op%opt_analysis .NE. 1 ) RETURN
    4718              : 
    4719            0 :   oFile = 44
    4720            0 :   IF ( PRESENT(oFileIn) ) THEN
    4721            0 :     oFile = oFileIn
    4722              :   ELSE
    4723            0 :     OPEN(UNIT=oFile, FILE="Correlation.dat")
    4724              :   END IF
    4725              : 
    4726            0 :   sp1         =  op%samples
    4727            0 :   dt          =  op%beta / sp1
    4728            0 :   sp1         =  sp1 + 1
    4729            0 :   flavors     =  op%flavors
    4730              : 
    4731            0 :   i = 3*flavors + 1
    4732            0 :   WRITE(a,'(I2)') i
    4733            0 :   WRITE(oFile,*) "# time  (/ (segement, antiseg, correl), i=1, flavor/)"
    4734            0 :   string = '(1x,'//TRIM(ADJUSTL(a))//'F19.15)'
    4735            0 :   DO itime = 1, sp1
    4736            0 :     WRITE(oFile,string) DBLE(itime-1)*dt, &
    4737              :                    (/ ( &
    4738              :                    (/ ( op%measCorrelation(itime, i, iflavor), i=1,3) /) &
    4739            0 :                    , iflavor=1, flavors) /)
    4740              :   END DO
    4741              : 
    4742            0 :   IF ( .NOT. PRESENT(oFileIn) ) CLOSE(oFile)
    4743              : 
    4744              : END SUBROUTINE Ctqmcoffdiag_printCorrelation
    4745              : !!***
    4746              : !#endif
    4747              : 
    4748              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_printSpectra
    4749              : !! NAME
    4750              : !!  Ctqmcoffdiag_printSpectra
    4751              : !!
    4752              : !! FUNCTION
    4753              : !!  print fourier transform of time evolution of number of electrons
    4754              : !!
    4755              : !! COPYRIGHT
    4756              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
    4757              : !!  This file is distributed under the terms of the
    4758              : !!  GNU General Public License, see ~abinit/COPYING
    4759              : !!  or http://www.gnu.org/copyleft/gpl.txt .
    4760              : !!
    4761              : !! INPUTS
    4762              : !!  op=ctqmc
    4763              : !!  oFileIn=file stream
    4764              : !!
    4765              : !! OUTPUT
    4766              : !!
    4767              : !! SIDE EFFECTS
    4768              : !!
    4769              : !! NOTES
    4770              : !!
    4771              : !! SOURCE
    4772              : 
    4773            0 : SUBROUTINE Ctqmcoffdiag_printSpectra(op, oFileIn)
    4774              : 
    4775              : !Arguments ------------------------------------
    4776              :   TYPE(Ctqmcoffdiag)          , INTENT(IN)             :: op
    4777              :   INTEGER  , OPTIONAL, INTENT(IN)             :: oFileIn
    4778              : !Local variables ------------------------------
    4779              :   INTEGER                                     :: oFile
    4780              :   INTEGER                                     :: flavors
    4781              :   INTEGER                                     :: indDensity
    4782              :   INTEGER                                     :: endDensity
    4783              :   CHARACTER(LEN=4)                            :: a
    4784              :   CHARACTER(LEN=16)                           :: formatSpectra
    4785              : 
    4786              :   !IF ( op%rank .NE. MOD(6,op%size)) RETURN
    4787            0 :   IF ( op%opt_spectra .LT. 1 ) RETURN
    4788              : 
    4789            0 :   oFile = 45+op%rank
    4790            0 :   a ="0000"
    4791            0 :   WRITE(a,'(I4)') op%rank
    4792            0 :   IF ( PRESENT(oFileIn) ) THEN
    4793            0 :     oFile = oFileIn
    4794              :   ELSE
    4795            0 :     OPEN(UNIT=oFile, FILE="Markov_"//TRIM(ADJUSTL(a))//".dat")
    4796              :   END IF
    4797              : 
    4798            0 :   flavors     =  op%flavors
    4799            0 :   WRITE(a,'(I4)') flavors+1
    4800            0 :   formatSpectra ='(1x,'//TRIM(ADJUSTL(a))//'ES22.14)'
    4801            0 :   WRITE(oFile,*) "# freq[/hermalization] FFT"
    4802              : 
    4803              : !PROBLEM eos_gnu_13.2_mpich . %endDensity was introduced throughout
    4804            0 :   endDensity = SIZE(op%density,2)
    4805              : ! endDensity=op%endDensity
    4806              : !ENDPROBLEM
    4807            0 :   DO WHILE ( op%density(flavors+1,endDensity) .EQ. -1 )
    4808            0 :     endDensity = endDensity -1
    4809              :   END DO
    4810              : 
    4811            0 :   DO indDensity = 1, endDensity
    4812            0 :     WRITE(oFile,formatSpectra) op%density(flavors+1,indDensity), op%density(1:flavors,indDensity)
    4813              :   END DO
    4814              : 
    4815            0 :   IF ( .NOT. PRESENT(oFileIn) ) CLOSE(oFile)
    4816              : 
    4817              : END SUBROUTINE Ctqmcoffdiag_printSpectra
    4818              : !!***
    4819              : 
    4820              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_destroy
    4821              : !! NAME
    4822              : !!  Ctqmcoffdiag_destroy
    4823              : !!
    4824              : !! FUNCTION
    4825              : !!  destroy and deallocate all variables
    4826              : !!
    4827              : !! COPYRIGHT
    4828              : !!  Copyright (C) 2013-2026 ABINIT group (J. Bieder)
    4829              : !!  This file is distributed under the terms of the
    4830              : !!  GNU General Public License, see ~abinit/COPYING
    4831              : !!  or http://www.gnu.org/copyleft/gpl.txt .
    4832              : !!
    4833              : !! INPUTS
    4834              : !!  op=ctqmc
    4835              : !!
    4836              : !! OUTPUT
    4837              : !!
    4838              : !! SIDE EFFECTS
    4839              : !!
    4840              : !! NOTES
    4841              : !!
    4842              : !! SOURCE
    4843              : 
    4844            0 : SUBROUTINE Ctqmcoffdiag_destroy(op)
    4845              : 
    4846              : !Arguments ------------------------------------
    4847              :   TYPE(Ctqmcoffdiag), INTENT(INOUT) :: op
    4848              : !Local variables ------------------------------
    4849              :   !INTEGER                  :: iflavor
    4850              :   INTEGER                  :: flavors
    4851              :   INTEGER                  :: i
    4852              :   INTEGER                  :: j
    4853              :   INTEGER                  :: k
    4854              : 
    4855            0 :   flavors = op%flavors
    4856              : 
    4857            0 :   CALL ImpurityOperator_destroy(op%Impurity)
    4858            0 :   CALL BathOperatoroffdiag_destroy(op%Bath)
    4859            0 :   CALL Vector_destroy(op%measNoise(1))
    4860            0 :   CALL Vector_destroy(op%measNoise(2))
    4861              : 
    4862              : !sui!write(6,*) "before greenhyb_destroy in ctmqc_destroy"
    4863            0 :   CALL GreenHyboffdiag_destroy(op%Greens)
    4864              : !#ifdef CTCtqmcoffdiag_ANALYSIS
    4865            0 :   FREEIF(op%measCorrelation)
    4866            0 :   FREEIF(op%measPerturbation)
    4867            0 :   FREEIF(op%meas_fullemptylines)
    4868            0 :   FREEIF(op%measN)
    4869            0 :   IF ( op%opt_histo .GT. 0 ) THEN
    4870            0 :     FREEIF(op%occup_histo_time)
    4871            0 :     FREEIF(op%suscep)
    4872            0 :     FREEIF(op%occupconfig)
    4873            0 :     FREEIF(op%chi)
    4874            0 :     FREEIF(op%chicharge)
    4875            0 :     FREEIF(op%ntot)
    4876              :   END IF
    4877            0 :   FREEIF(op%measDE)
    4878            0 :   FREEIF(op%mu)
    4879            0 :   FREEIF(op%hybri_limit)
    4880            0 :   FREEIF(op%abNoiseG)
    4881            0 :   IF ( ALLOCATED(op%measNoiseG) ) THEN
    4882            0 :     DO i=1,2
    4883            0 :       DO j = 1, op%flavors
    4884            0 :         DO k= 1, op%samples+1
    4885            0 :           CALL Vector_destroy(op%measNoiseG(k,j,i))
    4886              :         END DO
    4887              :       END DO
    4888              :     END DO
    4889            0 :     DT_FREE(op%measNoiseG)
    4890              :   END IF
    4891            0 :   FREEIF(op%density)
    4892              : !#endif
    4893            0 :   op%ostream        = 0
    4894            0 :   op%istream        = 0
    4895              : 
    4896            0 :   op%sweeps         = 0
    4897            0 :   op%thermalization = 0
    4898            0 :   op%flavors        = 0
    4899              : ! op%endDensity     = 0
    4900            0 :   op%samples        = 0
    4901            0 :   op%beta           = 0.d0
    4902              : !  op%seg_added      = 0.d0
    4903              : !  op%anti_added     = 0.d0
    4904              : !  op%seg_removed    = 0.d0
    4905              : !  op%anti_removed   = 0.d0
    4906              : !  op%seg_sign       = 0.d0
    4907              : !  op%anti_sign      = 0.d0
    4908            0 :   op%stats          = 0.d0
    4909            0 :   op%swap           = 0.d0
    4910              : 
    4911              : 
    4912            0 :   op%set  = .FALSE.
    4913            0 :   op%done = .FALSE.
    4914            0 :   op%init = .FALSE.
    4915            0 : END SUBROUTINE Ctqmcoffdiag_destroy
    4916              : !!***
    4917              : 
    4918              : !!****f* ABINIT/m_Ctqmcoffdiag/Ctqmcoffdiag_setMagmom
    4919              : !! NAME
    4920              : !!  Ctqmcoffdiag_setMagmom
    4921              : !!
    4922              : !! FUNCTION
    4923              : !!  set the Magnetic moment matrix for susceptibility
    4924              : !!
    4925              : !! COPYRIGHT
    4926              : !!  Copyright (C) 2013-2026 ABINIT group (F. Gendron)
    4927              : !!  This file is distributed under the terms of the
    4928              : !!  GNU General Public License, see ~abinit/COPYING
    4929              : !!  or http://www.gnu.org/copyleft/gpl.txt .
    4930              : !!
    4931              : !! INPUTS
    4932              : !!
    4933              : !! OUTPUT
    4934              : !!
    4935              : !! SOURCE
    4936              : 
    4937            0 : SUBROUTINE Ctqmcoffdiag_setMagmom(op,Magmom_orb, Magmom_spin, Magmom_tot)
    4938              : 
    4939              : !Arguments ------------------------------------
    4940              :   TYPE(Ctqmcoffdiag), INTENT(INOUT) ::op
    4941              :   DOUBLE PRECISION, DIMENSION(:,:), INTENT(IN) :: Magmom_orb
    4942              :   DOUBLE PRECISION, DIMENSION(:,:), INTENT(IN) :: Magmom_spin
    4943              :   DOUBLE PRECISION, DIMENSION(:,:), INTENT(IN) :: Magmom_tot
    4944              : !Local variables ------------------------------
    4945              : !  INTEGER :: iflavor1,iflavor2
    4946              : 
    4947              :  ! do iflavor1=1,10
    4948              :  !   do iflavor2=1,10
    4949              :  !      if(iflavor1==iflavor2) THEN
    4950              :  !        write(6,*) iflavor1, iflavor2, Magmom(iflavor1,iflavor2)
    4951              :  !      end if
    4952              :  !   end do
    4953              :  ! end do
    4954              : 
    4955            0 :   IF ( SIZE(Magmom_orb) .NE. op%flavors*op%flavors ) &
    4956            0 :     CALL ERROR("Ctqmcoffdiag_setU : Wrong Magnetic Moment matrix (size)        ")
    4957              : 
    4958            0 :   CALL ImpurityOperator_setMagmommat(op%Impurity, Magmom_orb, Magmom_spin, Magmom_tot)
    4959              : 
    4960            0 : END SUBROUTINE Ctqmcoffdiag_setMagmom
    4961              : !!***
    4962              : 
    4963            0 : END MODULE m_Ctqmcoffdiag
    4964              : !!***
    4965              : 
    4966              : #undef CTQMC_SLICE1
    4967              : #undef CTQMC_SLICE2
    4968              : #undef CTQMC_SEGME
    4969              : #undef CTQMC_ANTIS
    4970              : #undef CTQMC_ADDED
    4971              : #undef CTQMC_REMOV
    4972              : #undef CTQMC_DETSI
        

Generated by: LCOV version 2.3-1