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-11-12 07:43:35 Functions: 0.0 % 37 0
Branches: 0.0 % 2224 0

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