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