Line data Source code
1 :
2 : #if defined HAVE_CONFIG_H
3 : #include "config.h"
4 : #endif
5 : !!****m* ABINIT/m_ImpurityOperator
6 : !! NAME
7 : !! m_ImpurityOperator
8 : !!
9 : !! FUNCTION
10 : !! manage all related to Impurity
11 : !!
12 : !! COPYRIGHT
13 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
14 : !! This file is distributed under the terms of the
15 : !! GNU General Public License, see ~abinit/COPYING
16 : !! or http://www.gnu.org/copyleft/gpl.txt .
17 : !!
18 : !! NOTES
19 : !!
20 : !! SOURCE
21 :
22 : #include "defs.h"
23 : MODULE m_ImpurityOperator
24 : USE m_ListCdagC
25 : USE m_Global
26 : IMPLICIT NONE
27 :
28 : !!***
29 :
30 : PRIVATE
31 :
32 : !!****t* m_ImpurityOperator/ImpurityOperator
33 : !! NAME
34 : !! ImpurityOperator
35 : !!
36 : !! FUNCTION
37 : !! This structured datatype contains the necessary data
38 : !!
39 : !! COPYRIGHT
40 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
41 : !! This file is distributed under the terms of the
42 : !! GNU General Public License, see ~abinit/COPYING
43 : !! or http://www.gnu.org/copyleft/gpl.txt .
44 : !!
45 : !! SOURCE
46 :
47 : TYPE, PUBLIC :: ImpurityOperator
48 : LOGICAL _PRIVATE :: doCheck = .FALSE.
49 : INTEGER _PRIVATE :: flavors
50 : ! Number of flavors
51 : INTEGER :: activeFlavor
52 : ! Flavor considered e.g when a segment is added
53 :
54 :
55 : DOUBLE PRECISION _PRIVATE :: beta
56 : ! Inverse of temperature.
57 :
58 : DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: mat_U
59 : ! for iflavor1 and iflavor2, mat_U(iflavor1,iflavor2) is the
60 : ! coulomb interaction between iflavor1 and iflavor2.
61 :
62 : DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) _PRIVATE :: overlaps ! total overlaps
63 : ! for iflavor1 and iflavor2 overlaps(iflavor1,iflavor2) is the total
64 : ! overlap between segments of iflavor1 and segments of iflavor2.
65 :
66 : DOUBLE PRECISION, ALLOCATABLE, DIMENSION(: ) _PRIVATE :: updates ! new_(anti)seg
67 : ! For a given flavor (activeflavor), gives for each other flavors, the
68 : ! supplementary overlaps, called updates(otherflavor).
69 :
70 : TYPE(ListCdagC) _PRIVATE :: list_swap
71 : TYPE(ListCdagC) , ALLOCATABLE, DIMENSION(: ) :: particles
72 : ! for each flavor, particles(iflavor)%list(2,maxnbofsegment)
73 : ! gives the beginning and end of each segment.
74 :
75 : DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: Magmommat_orb
76 : ! for iflavor1 and iflavor2, Magmommat(iflavor1,iflavor2) is the
77 : ! orbital magnetic moments
78 :
79 : DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: Magmommat_spin
80 : ! for iflavor1 and iflavor2, Magmommat(iflavor1,iflavor2) is the
81 : ! spin magnetic moments
82 :
83 : DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: Magmommat_tot
84 : ! for iflavor1 and iflavor2, Magmommat(iflavor1,iflavor2) is the
85 : ! total magnetic moments
86 :
87 : DOUBLE PRECISION _PRIVATE :: checkNumber
88 : DOUBLE PRECISION _PRIVATE :: tolerance
89 : DOUBLE PRECISION _PRIVATE :: meanError
90 : END TYPE ImpurityOperator
91 : !!***
92 :
93 : PUBLIC :: ImpurityOperator_init
94 : PUBLIC :: ImpurityOperator_reset
95 : PUBLIC :: ImpurityOperator_computeU
96 : PUBLIC :: ImpurityOperator_setUmat
97 : PUBLIC :: ImpurityOperator_setUmatComplex
98 : PUBLIC :: ImpurityOperator_setMu
99 : PUBLIC :: ImpurityOperator_activateParticle
100 : PUBLIC :: ImpurityOperator_getAvailableTime
101 : PUBLIC :: ImpurityOperator_getAvailedTime
102 : PUBLIC :: ImpurityOperator_add
103 : PUBLIC :: ImpurityOperator_getSegment
104 : PUBLIC :: ImpurityOperator_getsign
105 : PUBLIC :: ImpurityOperator_remove
106 : PUBLIC :: ImpurityOperator_getNewOverlap
107 : PUBLIC :: ImpurityOperator_getTraceAdd
108 : PUBLIC :: ImpurityOperator_getTraceRemove
109 : PRIVATE :: ImpurityOperator_overlapSegFlav
110 : PUBLIC :: ImpurityOperator_overlapflavor
111 : PUBLIC :: ImpurityOperator_overlapSwap
112 : PUBLIC :: ImpurityOperator_swap
113 : PRIVATE :: ImpurityOperator_overlapIJ
114 : PUBLIC :: ImpurityOperator_measDE
115 : PUBLIC :: ImpurityOperator_measDEComplex
116 : PUBLIC :: ImpurityOperator_cleanOverlaps
117 : PUBLIC :: ImpurityOperator_measN
118 : PUBLIC :: ImpurityOperator_destroy
119 : PUBLIC :: ImpurityOperator_getErrorOverlap
120 : PUBLIC :: ImpurityOperator_doCheck
121 : PRIVATE :: ImpurityOperator_checkOverlap
122 : PUBLIC :: ImpurityOperator_getError
123 : PUBLIC :: ImpurityOperator_printLatex
124 : PUBLIC :: ImpurityOperator_occup_histo_time
125 : PUBLIC :: ImpurityOperator_setMagmommat
126 :
127 : CONTAINS
128 : !!***
129 :
130 : !SUBROUTINE ImpurityOperator_init(this, flavors, beta, N)
131 : !!****f* ABINIT/m_ImpurityOperator/ImpurityOperator_init
132 : !! NAME
133 : !! ImpurityOperator_init
134 : !!
135 : !! FUNCTION
136 : !! Initialize and allocate
137 : !!
138 : !! COPYRIGHT
139 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
140 : !! This file is distributed under the terms of the
141 : !! GNU General Public License, see ~abinit/COPYING
142 : !! or http://www.gnu.org/copyleft/gpl.txt .
143 : !!
144 : !! INPUTS
145 : !! this=ImpurtiyOperator
146 : !! flavors=number of flavors
147 : !! beta=inverse temperature
148 : !! opt_histo=opt_histo
149 : !!
150 : !! OUTPUT
151 : !!
152 : !! SIDE EFFECTS
153 : !!
154 : !! NOTES
155 : !!
156 : !! SOURCE
157 :
158 102 : SUBROUTINE ImpurityOperator_init(this, flavors, beta)
159 :
160 : !Arguments ------------------------------------
161 : TYPE(ImpurityOperator), INTENT(INOUT) :: this
162 : INTEGER , INTENT(IN ) :: flavors
163 : !DOUBLE PRECISION , INTENT(IN ) :: U
164 : !DOUBLE PRECISION , INTENT(IN ) :: J
165 : DOUBLE PRECISION , INTENT(IN ) :: beta
166 : !INTEGER , INTENT(IN ) :: N
167 : !Local variables ------------------------------
168 : INTEGER :: IT
169 :
170 102 : this%flavors = flavors
171 102 : this%activeFlavor = 0
172 102 : this%beta = beta
173 :
174 102 : IF ( MOD(flavors,2) .NE. 0 ) &
175 0 : CALL ERROR("ImpurityOperator_init : flavors is not even ")
176 :
177 : !#ifdef CTQMC_CHECK
178 102 : this%meanError = 0.d0
179 102 : this%checkNumber = 0.d0
180 102 : this%tolerance = 0.d0
181 102 : this%doCheck = .FALSE.
182 : !#endif
183 102 : DT_FREEIF(this%particles)
184 1382 : DT_MALLOC(this%particles,(1:flavors))
185 102 : FREEIF(this%mat_U)
186 408 : MALLOC(this%mat_U,(1:flavors,1:flavors))
187 102 : FREEIF(this%overlaps)
188 306 : MALLOC(this%overlaps,(1:flavors,1:flavors))
189 13170 : this%overlaps = 0.d0
190 102 : FREEIF(this%updates)
191 306 : MALLOC(this%updates,(1:flavors))
192 1178 : this%updates = 0.d0
193 102 : FREEIF(this%Magmommat_orb)
194 306 : MALLOC(this%Magmommat_orb,(1:flavors,1:flavors))
195 102 : FREEIF(this%Magmommat_spin)
196 306 : MALLOC(this%Magmommat_spin,(1:flavors,1:flavors))
197 102 : FREEIF(this%Magmommat_tot)
198 306 : MALLOC(this%Magmommat_tot,(1:flavors,1:flavors))
199 : !CALL ImpurityOperator_computeU(this, U, J)
200 : !this%mat_U = U
201 : !IF ( ASSOCIATED(this%mu) ) FREE(this%mu)
202 : !MALLOC(this%mu,(1:flavors))
203 :
204 : !this%shift_mu = SUM(this%mat_U(:,1)) * .5d0
205 1178 : DO IT = 1,flavors
206 : !CALL ListCdagC_init(this%particles(IT), DBLE(N)/beta,100) !FIXME size of the List
207 1076 : CALL ListCdagC_init(this%particles(IT),100) !FIXME size of the List
208 1076 : this%particles(IT)%list(0,C_ ) = beta ! Empty orbital
209 1178 : this%particles(IT)%list(0,Cdag_) = 0.d0
210 : ! this%particles(IT)%list(0)%Cdag = beta ! Full orbital
211 : ! this%particles(IT)%list(0)%C = 0.d0
212 : END DO
213 102 : this%activeFlavor = 0
214 102 : END SUBROUTINE ImpurityOperator_init
215 : !!***
216 :
217 : !!****f* ABINIT/m_ImpurityOperator/ImpurityOperator_reset
218 : !! NAME
219 : !! ImpurityOperator_reset
220 : !!
221 : !! FUNCTION
222 : !! reset operator
223 : !!
224 : !! COPYRIGHT
225 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
226 : !! This file is distributed under the terms of the
227 : !! GNU General Public License, see ~abinit/COPYING
228 : !! or http://www.gnu.org/copyleft/gpl.txt .
229 : !!
230 : !! INPUTS
231 : !! this=ImpurtiyOperator
232 : !!
233 : !! OUTPUT
234 : !!
235 : !! SIDE EFFECTS
236 : !!
237 : !! NOTES
238 : !!
239 : !! SOURCE
240 :
241 49 : SUBROUTINE ImpurityOperator_reset(this)
242 :
243 : !Arguments ------------------------------------
244 : TYPE(ImpurityOperator), INTENT(INOUT) :: this
245 : !Local variables ------------------------------
246 : INTEGER :: IT
247 :
248 49 : this%activeFlavor = 0
249 6363 : this%overlaps = 0.d0
250 567 : this%updates = 0.d0
251 : !#ifdef CTQMC_CHECK
252 49 : this%meanError = 0.d0
253 49 : this%checkNumber = 0.d0
254 49 : this%tolerance = 0.d0
255 49 : this%doCheck = .FALSE.
256 : !#endif
257 567 : DO IT = 1,this%flavors
258 518 : CALL ListCdagC_clear(this%particles(IT))
259 518 : this%particles(IT)%list(0,C_ ) = this%beta ! Empty orbital
260 567 : this%particles(IT)%list(0,Cdag_) = 0.d0
261 : ! this%particles(IT)%list(0)%Cdag = beta ! Full orbital
262 : ! this%particles(IT)%list(0)%C = 0.d0
263 : END DO
264 :
265 49 : END SUBROUTINE ImpurityOperator_reset
266 : !!***
267 :
268 : !!****f* ABINIT/m_ImpurityOperator/ImpurityOperator_computeU
269 : !! NAME
270 : !! ImpurityOperator_computeU
271 : !!
272 : !! FUNCTION
273 : !! Compute an interaction this for t2g like interaction
274 : !!
275 : !! COPYRIGHT
276 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
277 : !! This file is distributed under the terms of the
278 : !! GNU General Public License, see ~abinit/COPYING
279 : !! or http://www.gnu.org/copyleft/gpl.txt .
280 : !!
281 : !! INPUTS
282 : !! this=ImpurityOperator
283 : !! U=Coulomb scrren interaction
284 : !! J=Hund couplage
285 : !!
286 : !! OUTPUT
287 : !!
288 : !! SIDE EFFECTS
289 : !!
290 : !! NOTES
291 : !!
292 : !! SOURCE
293 :
294 102 : SUBROUTINE ImpurityOperator_computeU(this, U, J)
295 :
296 : !Arguments ------------------------------------
297 : TYPE(ImpurityOperator), INTENT(INOUT) :: this
298 : DOUBLE PRECISION , INTENT(IN ) :: U
299 : DOUBLE PRECISION , INTENT(IN ) :: J
300 : !Local variables ------------------------------
301 : INTEGER :: flavor11
302 : INTEGER :: flavor12
303 : INTEGER :: flavor21
304 : INTEGER :: flavor22
305 : INTEGER :: flavors
306 : INTEGER :: flavors_2
307 : DOUBLE PRECISION :: Uprime
308 :
309 102 : Uprime = U - 2.d0 * J
310 102 : flavors = this%flavors
311 102 : flavors_2 = flavors / 2
312 640 : DO flavor11 = 1, flavors_2
313 538 : flavor12 = flavors - flavor11 + 1
314 538 : this%mat_U(flavor11, flavor11) = 0.d0
315 538 : this%mat_U(flavor12, flavor12) = 0.d0
316 538 : this%mat_U(flavor11+flavors_2, flavor11) = U
317 538 : this%mat_U(flavor12-flavors_2, flavor12) = U
318 1768 : DO flavor21 = flavor11+1, flavors_2
319 1230 : flavor22 = flavors - flavor21 + 1
320 1230 : this%mat_U(flavor21, flavor11) = Uprime
321 1230 : this%mat_U(flavor22-flavors_2, flavor12-flavors_2) = Uprime
322 1230 : this%mat_U(flavor21+flavors_2, flavor11+flavors_2) = Uprime
323 1768 : this%mat_U(flavor22, flavor12) = Uprime
324 : END DO
325 1870 : DO flavor21 = flavor11+flavors_2+1, flavors
326 1230 : flavor22 = flavors - flavor21 + 1
327 1230 : this%mat_U(flavor21, flavor11) = Uprime - J
328 1230 : this%mat_U(flavor22+flavors_2, flavor12-flavors_2) = Uprime - J
329 1230 : this%mat_U(flavor21-flavors_2, flavor11+flavors_2) = Uprime - J
330 1768 : this%mat_U(flavor22, flavor12) = Uprime - J
331 : END DO
332 : END DO
333 102 : END SUBROUTINE ImpurityOperator_computeU
334 : !!***
335 :
336 : !!****f* ABINIT/m_ImpurityOperator/ImpurityOperator_setUmat
337 : !! NAME
338 : !! ImpurityOperator_setUmat
339 : !!
340 : !! FUNCTION
341 : !! Set directly the U interaction this
342 : !!
343 : !! COPYRIGHT
344 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
345 : !! This file is distributed under the terms of the
346 : !! GNU General Public License, see ~abinit/COPYING
347 : !! or http://www.gnu.org/copyleft/gpl.txt .
348 : !!
349 : !! INPUTS
350 : !! this=ImpurtityOperator
351 : !! matU=interaction this
352 : !!
353 : !! OUTPUT
354 : !!
355 : !! SIDE EFFECTS
356 : !!
357 : !! NOTES
358 : !!
359 : !! SOURCE
360 :
361 49 : SUBROUTINE ImpurityOperator_setUmat(this, matU)
362 :
363 : !Arguments ------------------------------------
364 : TYPE(ImpurityOperator), INTENT(INOUT) :: this
365 : DOUBLE PRECISION, DIMENSION(:,:), INTENT(IN ) :: matU
366 :
367 : INTEGER :: iflavor1
368 : INTEGER :: iflavor2
369 :
370 147 : IF ( SIZE(matU) .NE. this%flavors*this%flavors ) &
371 0 : CALL ERROR("ImpurityOperator_setUmat : Wrong interaction this")
372 :
373 567 : DO iflavor1 = 1, this%flavors
374 3206 : DO iflavor2 = iflavor1+1, this%flavors
375 2639 : this%mat_U(iflavor1,iflavor2) = matU(iflavor1,iflavor2)
376 3157 : this%mat_U(iflavor2,iflavor1) = matU(iflavor2,iflavor1)
377 : END DO
378 : END DO
379 49 : END SUBROUTINE ImpurityOperator_setUmat
380 : !!***
381 :
382 : !!****f* ABINIT/m_ImpurityOperator/ImpurityOperator_setUmatComplex
383 : !! NAME
384 : !! ImpurityOperator_setUmatComplex
385 : !!
386 : !! FUNCTION
387 : !! Set directly the complex U interaction
388 : !!
389 : !! COPYRIGHT
390 : !! Copyright (C) 2013-2025 ABINIT group (J. Bieder)
391 : !! This file is distributed under the terms of the
392 : !! GNU General Public License, see ~abinit/COPYING
393 : !! or http://www.gnu.org/copyleft/gpl.txt .
394 : !!
395 : !! INPUTS
396 : !! this=ImpurtityOperator
397 : !! matU=interaction this
398 : !!
399 : !! OUTPUT
400 : !!
401 : !! SIDE EFFECTS
402 : !!
403 : !! NOTES
404 : !!
405 : !! SOURCE
406 :
407 0 : SUBROUTINE ImpurityOperator_setUmatComplex(this, matU)
408 :
409 : !Arguments ------------------------------------
410 : TYPE(ImpurityOperator), INTENT(INOUT) :: this
411 : COMPLEX(KIND=8), DIMENSION(:,:), INTENT(IN ) :: matU
412 :
413 : INTEGER :: iflavor1
414 : INTEGER :: iflavor2
415 :
416 0 : IF ( SIZE(matU) .NE. this%flavors*this%flavors ) &
417 0 : CALL ERROR("ImpurityOperator_setUmatComplex : Wrong interaction this")
418 :
419 0 : DO iflavor1 = 1, this%flavors
420 0 : DO iflavor2 = iflavor1+1, this%flavors
421 0 : this%mat_U(iflavor1,iflavor2) = matU(iflavor1,iflavor2)
422 0 : this%mat_U(iflavor2,iflavor1) = matU(iflavor2,iflavor1)
423 : END DO
424 : END DO
425 0 : END SUBROUTINE ImpurityOperator_setUmatComplex
426 : !!***
427 :
428 : !!****f* ABINIT/m_ImpurityOperator/ImpurityOperator_setMu
429 : !! NAME
430 : !! ImpurityOperator_setMu
431 : !!
432 : !! FUNCTION
433 : !! Set directly the chemical potential
434 : !!
435 : !! COPYRIGHT
436 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
437 : !! This file is distributed under the terms of the
438 : !! GNU General Public License, see ~abinit/COPYING
439 : !! or http://www.gnu.org/copyleft/gpl.txt .
440 : !!
441 : !! INPUTS
442 : !! this=ImpurtityOperator
443 : !! mu=chimical potential
444 : !!
445 : !! OUTPUT
446 : !!
447 : !! SIDE EFFECTS
448 : !!
449 : !! NOTES
450 : !!
451 : !! SOURCE
452 :
453 49 : SUBROUTINE ImpurityOperator_setMu(this, mu)
454 :
455 : !Arguments ------------------------------------
456 : TYPE(ImpurityOperator), INTENT(INOUT) :: this
457 : DOUBLE PRECISION, DIMENSION(:), INTENT(IN ) :: mu
458 : INTEGER :: iflavor
459 :
460 49 : IF ( SIZE(mu) .NE. this%flavors ) &
461 0 : CALL ERROR("ImpurityOperator_setMu : Wrong chimical potentials")
462 :
463 567 : DO iflavor = 1, this%flavors
464 567 : this%mat_U(iflavor,iflavor) = mu(iflavor)
465 : END DO
466 49 : END SUBROUTINE ImpurityOperator_setMu
467 : !!***
468 :
469 : !!****f* ABINIT/m_ImpurityOperator/ImpurityOperator_activateParticle
470 : !! NAME
471 : !! ImpurityOperator_activateParticle
472 : !!
473 : !! FUNCTION
474 : !! active a flavor
475 : !!
476 : !! COPYRIGHT
477 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
478 : !! This file is distributed under the terms of the
479 : !! GNU General Public License, see ~abinit/COPYING
480 : !! or http://www.gnu.org/copyleft/gpl.txt .
481 : !!
482 : !! INPUTS
483 : !! this=ImpurityOperator
484 : !! flavor=the flavor
485 : !!
486 : !! OUTPUT
487 : !!
488 : !! SIDE EFFECTS
489 : !!
490 : !! NOTES
491 : !!
492 : !! SOURCE
493 :
494 0 : SUBROUTINE ImpurityOperator_activateParticle(this,flavor)
495 :
496 : !Arguments ------------------------------------
497 : TYPE(ImpurityOperator), INTENT(INOUT) :: this
498 : INTEGER , INTENT(IN ) :: flavor
499 :
500 0 : IF ( flavor .GT. this%flavors ) &
501 0 : CALL ERROR("ImpurityOperator_activateParticle : out of range ")
502 0 : IF ( ALLOCATED(this%particles) ) THEN
503 0 : this%activeFlavor = flavor
504 : ELSE
505 0 : CALL ERROR("ImpurityOperator_activateParticle : not allocated ")
506 : END IF
507 0 : END SUBROUTINE ImpurityOperator_activateParticle
508 : !!***
509 :
510 : !!****f* ABINIT/m_ImpurityOperator/ImpurityOperator_getAvailableTime
511 : !! NAME
512 : !! ImpurityOperator_getAvailableTime
513 : !!
514 : !! FUNCTION
515 : !! get the time available and the position of the segment to consider
516 : !! negative if on a segment
517 : !! positive if outside a segment
518 : !!
519 : !! COPYRIGHT
520 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
521 : !! This file is distributed under the terms of the
522 : !! GNU General Public License, see ~abinit/COPYING
523 : !! or http://www.gnu.org/copyleft/gpl.txt .
524 : !!
525 : !! INPUTS
526 : !! this=ImpurityOperator
527 : !! time=time to look for
528 : !!
529 : !! OUTPUT
530 : !! ImpurityOperator_getAvailableTime=Time available
531 : !! position=position of the next segment
532 : !!
533 : !! SIDE EFFECTS
534 : !!
535 : !! NOTES
536 : !!
537 : !! SOURCE
538 :
539 1022389057 : DOUBLE PRECISION FUNCTION ImpurityOperator_getAvailableTime(this, time, position)
540 :
541 : !Arguments ------------------------------------
542 : TYPE(ImpurityOperator), INTENT(IN ) :: this
543 : DOUBLE PRECISION , INTENT(IN ) :: time
544 : INTEGER , INTENT(OUT ) :: position
545 : !Local variables ------------------------------
546 : DOUBLE PRECISION :: t_avail
547 : INTEGER :: position_dwn
548 : INTEGER :: aF
549 : #include "ListCdagC_firstHigher.h"
550 1022389057 : aF = this%activeFlavor
551 1022389057 : IF ( aF .LE. 0 ) &
552 0 : CALL ERROR("ImpurityOperator_getAvailableTime : no active flav")
553 :
554 1022389057 : IF ( this%particles(aF)%tail .EQ. 0 ) THEN
555 448384430 : t_avail = this%particles(aF)%list(0,C_) - this%particles(aF)%list(0,Cdag_)
556 448384430 : position = SIGN(1,INT(t_avail))
557 : ELSE
558 : ! position = ListCdagC_firstHigher( this%particles(aF), time )
559 : #define list_1 this%particles(aF)
560 : #include "ListCdagC_firstHigher"
561 : #undef list_1
562 574004627 : position = firstHigher
563 574004627 : position_dwn = position - 1
564 574004627 : IF ( position_dwn .LE. 0) position_dwn = this%particles(aF)%tail
565 :
566 : ! t_avail = (time - this%particles(aF)%list(position_dwn)) .MOD. this%beta
567 574004627 : t_avail = time - this%particles(aF)%list(position_dwn,C_)
568 574004627 : IF ( this%particles(aF)%list(position_dwn,Cdag_) .GT. time ) &
569 208166099 : t_avail = t_avail + this%beta
570 :
571 574004627 : IF ( t_avail .GT. 0.d0 ) THEN !! We are outside the position_dwn segment
572 : ! t_avail = (this%particles(aF)%list(ABS(position)) - time ) .MOD. this%beta
573 483417801 : t_avail = this%particles(aF)%list(ABS(position),Cdag_) - time
574 483417801 : IF ( this%particles(aF)%list(ABS(position),Cdag_) .LT. time ) &
575 177302137 : t_avail = t_avail + this%beta
576 : ! ABS is used to prevent position to be -1 which is HERE the same as 1
577 : ELSE
578 90586826 : position = - position_dwn
579 : END IF
580 : END IF
581 :
582 1022389057 : ImpurityOperator_getAvailableTime = t_avail
583 :
584 1022389057 : END FUNCTION ImpurityOperator_getAvailableTime
585 : !!***
586 :
587 : !!****f* ABINIT/m_ImpurityOperator/ImpurityOperator_getAvailedTime
588 : !! NAME
589 : !! ImpurityOperator_getAvailedTime
590 : !!
591 : !! FUNCTION
592 : !! get the time available without the segment "position"
593 : !!
594 : !! COPYRIGHT
595 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
596 : !! This file is distributed under the terms of the
597 : !! GNU General Public License, see ~abinit/COPYING
598 : !! or http://www.gnu.org/copyleft/gpl.txt .
599 : !!
600 : !! INPUTS
601 : !! this=ImpurityOperator
602 : !! position=position of the segment
603 : !!
604 : !! OUTPUT
605 : !! ImpurityOperator_getAvailedTime=time available before ...
606 : !!
607 : !! SIDE EFFECTS
608 : !!
609 : !! NOTES
610 : !!
611 : !! SOURCE
612 :
613 573945019 : DOUBLE PRECISION FUNCTION ImpurityOperator_getAvailedTime(this, position)
614 :
615 : !Arguments ------------------------------------
616 : TYPE(ImpurityOperator), INTENT(IN ) :: this
617 : INTEGER , INTENT(IN ) :: position
618 : DOUBLE PRECISION :: T_avail
619 : INTEGER :: Pup
620 : INTEGER :: ABSp
621 : INTEGER :: tail
622 : INTEGER :: aF
623 :
624 573945019 : aF = this%activeFlavor
625 573945019 : IF ( aF .LE. 0 ) &
626 0 : CALL ERROR("ImpurityOperator_getAvailedTime : no active flavor")
627 573945019 : ABSp = ABS(position)
628 : ! position_up = (ABSposition+1).MOD.this%particles(aF)%tail
629 573945019 : tail = this%particles(aF)%tail
630 573945019 : MODCYCLE(ABSp+1,tail,Pup)
631 573945019 : IF ( position .GT. 0 ) THEN
632 : t_avail = this%particles(aF)%list(Pup, Cdag_) &
633 286970080 : - this%particles(aF)%list(ABSp,Cdag_)
634 : ELSE
635 : t_avail = this%particles(aF)%list(Pup ,C_) &
636 286974939 : - this%particles(aF)%list(ABSp,C_)
637 : END IF
638 573945019 : IF ( t_avail .LE. 0.d0 ) t_avail = t_avail + this%beta
639 573945019 : ImpurityOperator_getAvailedTime = t_avail
640 573945019 : END FUNCTION ImpurityOperator_getAvailedTime
641 : !!***
642 :
643 : !!****f* ABINIT/m_ImpurityOperator/ImpurityOperator_add
644 : !! NAME
645 : !! ImpurityOperator_add
646 : !!
647 : !! FUNCTION
648 : !! add a segment to the active flavor
649 : !!
650 : !! COPYRIGHT
651 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
652 : !! This file is distributed under the terms of the
653 : !! GNU General Public License, see ~abinit/COPYING
654 : !! or http://www.gnu.org/copyleft/gpl.txt .
655 : !!
656 : !! INPUTS
657 : !! this=ImpurityOperator
658 : !! CdagC_1=couple of times
659 : !! position_val=position of the CdagC_1 couple in the list
660 : !!
661 : !! OUTPUT
662 : !!
663 : !! SIDE EFFECTS
664 : !! this=ImpurityOperatoroffdiag
665 : !! this%particles(aF)%list is updated
666 : !! this%overlaps is updated
667 : !! NOTES
668 : !!
669 : !! SOURCE
670 :
671 85920850 : SUBROUTINE ImpurityOperator_add(this, CdagC_1, position_val)
672 :
673 : !Arguments ------------------------------------
674 : TYPE(ImpurityOperator), INTENT(INOUT) :: this
675 : DOUBLE PRECISION, DIMENSION(1:2), INTENT(IN ) :: CdagC_1
676 : INTEGER , INTENT(IN ) :: position_val
677 : !Local variables ------------------------------
678 : INTEGER :: position
679 : INTEGER :: aF
680 : INTEGER :: i
681 : DOUBLE PRECISION, DIMENSION(1:2) :: C2modify
682 : DOUBLE PRECISION, DIMENSION(1:2) :: C2add
683 : DOUBLE PRECISION :: TCdag
684 : DOUBLE PRECISION :: TC
685 :
686 85920850 : aF = this%activeFlavor
687 85920850 : IF ( aF .LE. 0 ) &
688 0 : CALL ERROR("ImpurityOperator_add : no active flavor ")
689 :
690 85920850 : position = position_val
691 :
692 85920850 : IF ( CdagC_1(C_) .GT. CdagC_1(Cdag_) ) THEN ! Ajout d'un segment
693 62352885 : C2add = CdagC_1
694 : ELSE ! Ajout d'un antisegment
695 23567965 : IF ( (this%particles(aF)%tail .EQ. 0) .AND. (this%particles(aF)%list(0,C_) .EQ. 0d0)) THEN ! should be full orbital
696 36539 : IF ( CdagC_1(Cdag_) .GT. this%beta ) THEN
697 : ! CALL CdagC_init(C2add,CdagC_1%Cdag-this%beta,CdagC_1%C)
698 : ! From the IF condition and the creation of CdagC in TryAddRemove, we have
699 : ! CdagC_1(Cdag_) > beta
700 : ! CdagC_1(C_) < beta
701 5786 : C2add(Cdag_) = CdagC_1(Cdag_)-this%beta
702 5786 : C2add(C_ ) = CdagC_1(C_)
703 : ! Now C2add(Cdag_) < beta
704 : ! still C2add(C_) < beta
705 : ELSE
706 : ! CALL CdagC_init(C2add,CdagC_1%Cdag,CdagC_1%C+this%beta)
707 : ! CdagC_1(Cdag_) < beta
708 : ! CdagC_1(C_) < beta
709 30753 : C2add(Cdag_) = CdagC_1(Cdag_)
710 30753 : C2add(C_ ) = CdagC_1(C_)+this%beta
711 : ! C2add(Cdag_) < beta
712 : ! C2ass(C_) > beta
713 : END IF
714 36539 : position = 0
715 : ! See impurityoperator_init to understand this. This is due to the
716 : ! convention for the full orbital case.
717 36539 : this%particles(aF)%list(0,C_ ) = this%beta
718 36539 : this%particles(aF)%list(0,Cdag_) = 0.d0
719 23531426 : ELSE IF ( this%particles(aF)%tail .GT. 0 ) THEN
720 23531426 : position = ABS(position)
721 23531426 : TCdag = this%particles(aF)%list(position,Cdag_)
722 23531426 : TC = CdagC_1(C_)
723 23531426 : IF ( TCdag .GT. TC ) TC = TC + this%beta
724 : ! CALL CdagC_init(C2modify,TCdag,TC)
725 23531426 : C2modify(Cdag_) = TCdag
726 23531426 : C2modify(C_ ) = TC
727 :
728 : ! TCdag = CdagC_1%Cdag.MOD.this%beta
729 23531426 : MODCYCLE(CdagC_1(Cdag_),this%beta,TCdag)
730 23531426 : TC = this%particles(aF)%list(position,C_)
731 : ! CALL CdagC_init(C2add,TCdag,TC)
732 23531426 : C2add(Cdag_) = TCdag
733 23531426 : C2add(C_ ) = TC
734 :
735 70594278 : this%particles(aF)%list(position,:) = C2modify
736 23531426 : IF ( C2modify(Cdag_) .GT. C2add(Cdag_) ) THEN
737 2859166 : position = 0
738 : ! C2add%C = C2add%C.MOD.this%beta
739 2859166 : MODCYCLE(C2add(C_),this%beta,C2add(C_))
740 : END IF
741 : ELSE
742 0 : CALL ERROR("ImpurityOperator_add : try to add an antisegment to an empty orbital")
743 : END IF
744 23567965 : position = position + 1
745 : END IF
746 85920850 : CALL ListCdagC_insert(this%particles(aF), c2add, position)
747 1141261694 : DO i = 1, this%flavors
748 1055340844 : this%overlaps(i,aF) = this%overlaps(i,aF) + this%updates(i)
749 1141261694 : this%overlaps(aF,i) = this%overlaps(i,aF)
750 : END DO
751 :
752 85920850 : END SUBROUTINE ImpurityOperator_add
753 : !!***
754 :
755 : !!****f* ABINIT/m_ImpurityOperator/ImpurityOperator_getSegment
756 : !! NAME
757 : !! ImpurityOperator_getSegment
758 : !!
759 : !! FUNCTION
760 : !! Return the segment at position_val
761 : !!
762 : !! COPYRIGHT
763 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
764 : !! This file is distributed under the terms of the
765 : !! GNU General Public License, see ~abinit/COPYING
766 : !! or http://www.gnu.org/copyleft/gpl.txt .
767 : !!
768 : !! INPUTS
769 : !! this=ImpurityOperator
770 : !! position_val=position of the asked segment
771 : !!
772 : !! OUTPUT
773 : !! ImpurityOperator_getSegment(2)=the couple of time
774 : !!
775 : !! SIDE EFFECTS
776 : !!
777 : !! NOTES
778 : !!
779 : !! SOURCE
780 :
781 573945019 : FUNCTION ImpurityOperator_getSegment(this,position_val)
782 :
783 : !Arguments ------------------------------------
784 : TYPE(ImpurityOperator), INTENT(INOUT) :: this
785 : INTEGER , INTENT(IN ) :: position_val
786 : !Local variables ------------------------------
787 : INTEGER :: position
788 : INTEGER :: tail
789 : INTEGER :: aF
790 : DOUBLE PRECISION :: beta
791 : DOUBLE PRECISION :: ImpurityOperator_getSegment(1:2)
792 :
793 573945019 : aF = this%activeFlavor
794 573945019 : IF ( aF .LE. 0 ) &
795 0 : CALL ERROR("ImpurityOperator_getSegment : no active flavor ")
796 :
797 573945019 : IF ( position_val .GT. 0 ) THEN
798 860910240 : ImpurityOperator_getSegment = this%particles(aF)%list(position_val,1:2)
799 : ELSE
800 286974939 : position = ABS(position_val)
801 286974939 : tail = this%particles(aF)%tail
802 286974939 : beta = this%beta
803 286974939 : ImpurityOperator_getSegment(C_) = this%particles(aF)%list(position,C_)
804 286974939 : position = position + 1
805 286974939 : IF ( position .GT. tail ) THEN
806 182719745 : IF ( ImpurityOperator_getSegment(C_) .LT. beta ) THEN
807 165235495 : ImpurityOperator_getSegment(Cdag_) = this%particles(aF)%list(1,Cdag_) + beta
808 : ELSE
809 17484250 : ImpurityOperator_getSegment(Cdag_) = this%particles(aF)%list(1,Cdag_)
810 17484250 : ImpurityOperator_getSegment(C_) = ImpurityOperator_getSegment(C_) -beta
811 : END IF
812 : ELSE
813 104255194 : ImpurityOperator_getSegment(Cdag_) = this%particles(aF)%list(position,Cdag_)
814 : END IF
815 :
816 : END IF
817 : END FUNCTION ImpurityOperator_getSegment
818 : !!***
819 :
820 : !!****f* ABINIT/m_ImpurityOperator/ImpurityOperator_remove
821 : !! NAME
822 : !! ImpurityOperator_remove
823 : !!
824 : !! FUNCTION
825 : !! Remove a segment for the active flavor
826 : !!
827 : !! COPYRIGHT
828 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
829 : !! This file is distributed under the terms of the
830 : !! GNU General Public License, see ~abinit/COPYING
831 : !! or http://www.gnu.org/copyleft/gpl.txt .
832 : !!
833 : !! INPUTS
834 : !! this=ImpurityOperator
835 : !! ieme=segment to remove
836 : !!
837 : !! OUTPUT
838 : !!
839 : !! SIDE EFFECTS
840 : !!
841 : !! NOTES
842 : !!
843 : !! SOURCE
844 :
845 85918401 : SUBROUTINE ImpurityOperator_remove(this,ieme)
846 :
847 : !Arguments ------------------------------------
848 : TYPE(ImpurityOperator), INTENT(INOUT) :: this
849 : INTEGER , INTENT(IN ) :: ieme
850 : !Local variables ------------------------------
851 : DOUBLE PRECISION, DIMENSION(1:2) :: CdagC_1
852 : INTEGER :: position
853 : INTEGER :: position_dwn
854 : INTEGER :: i
855 : INTEGER :: tail
856 : INTEGER :: aF
857 : ! DOUBLE PRECISION :: toRemove
858 :
859 85918401 : aF = this%activeFlavor
860 85918401 : IF ( aF .LE. 0 ) &
861 0 : CALL ERROR("ImpurityOperator_removeIeme : no active flavor ")
862 85918401 : position = ABS(ieme)
863 85918401 : IF ( position .GT. this%particles(aF)%tail ) &
864 0 : CALL ERROR("ImpurityOperator_removeIeme : out of range ")
865 :
866 85918401 : IF ( (ieme .LT. 0) .AND. (this%particles(aF)%tail .GT. 1) ) THEN
867 23532317 : position_dwn = position
868 : ! position = (position+1).MOD.this%particles(aF)%tail
869 23532317 : tail = this%particles(aF)%tail
870 23532317 : MODCYCLE((position+1),tail,position)
871 23532317 : CdagC_1(Cdag_) = this%particles(aF)%list(position_dwn,Cdag_)
872 23532317 : CdagC_1(C_ ) = this%particles(aF)%list(position,C_)
873 23532317 : IF (position_dwn .GT. position) CdagC_1(C_) = CdagC_1(C_) + this%beta
874 : ! toRemove = this%particles(aF)%list(position)%C - (CdagC_1%C.MOD.this%beta)
875 : ! CdagC_1%C = CdagC_1%C + toRemove
876 70596951 : this%particles(aF)%list(position_dwn,:) = CdagC_1
877 : END IF
878 :
879 85918401 : IF ( position .EQ. 1 ) THEN
880 33087724 : SELECT CASE (ieme)
881 : CASE (1)
882 33087724 : this%particles(aF)%list(0,C_ ) = this%beta
883 33087724 : this%particles(aF)%list(0,Cdag_) = 0.d0
884 : CASE (-1)
885 36539 : this%particles(aF)%list(0,C_ ) = 0.d0
886 35984060 : this%particles(aF)%list(0,Cdag_) = this%beta
887 : END SELECT
888 : END IF
889 85918401 : CALL ListCdagC_erase(this%particles(aF),position)
890 1141234195 : DO i = 1, this%flavors
891 1055315794 : this%overlaps(i,aF) = this%overlaps(i,aF) - this%updates(i)
892 1141234195 : this%overlaps(aF,i) = this%overlaps(i,aF)
893 : END DO
894 85918401 : END SUBROUTINE ImpurityOperator_remove
895 : !!***
896 :
897 : !!****f* ABINIT/m_ImpurityOperator/ImpurityOperator_getNewOverlap
898 : !! NAME
899 : !! ImpurityOperator_getNewOverlap
900 : !!
901 : !! FUNCTION
902 : !! Get the overlap induced by CdagC_1 in the current configuration
903 : !!
904 : !! COPYRIGHT
905 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
906 : !! This file is distributed under the terms of the
907 : !! GNU General Public License, see ~abinit/COPYING
908 : !! or http://www.gnu.org/copyleft/gpl.txt .
909 : !!
910 : !! INPUTS
911 : !! this=ImpurityOperator
912 : !! CdagC_1=the segment
913 : !!
914 : !! OUTPUT
915 : !! ImpurityOperator_getNewOverlap=overlap..
916 : !!
917 : !! SIDE EFFECTS
918 : !!
919 : !! NOTES
920 : !!
921 : !! SOURCE
922 :
923 1085148433 : DOUBLE PRECISION FUNCTION ImpurityOperator_getNewOverlap(this, CdagC_1)
924 :
925 : !Arguments ------------------------------------
926 : TYPE(ImpurityOperator), INTENT(INOUT) :: this
927 : DOUBLE PRECISION, DIMENSION(1:2), INTENT(IN) :: CdagC_1
928 : !Local variables ------------------------------
929 : DOUBLE PRECISION, DIMENSION(1:2) :: CdagC_2
930 : DOUBLE PRECISION :: overlap
931 : DOUBLE PRECISION :: totalOverlap
932 : DOUBLE PRECISION :: sign
933 : INTEGER :: flavor
934 : INTEGER :: otherFlavor
935 :
936 1085148433 : flavor = this%activeFlavor
937 1085148433 : IF ( flavor .LE. 0 ) &
938 0 : CALL ERROR("ImpurityOperator_getNewOverlap : no active flavor ")
939 1085148433 : IF ( CdagC_1(Cdag_) .LT. CdagC_1(C_) ) THEN ! segment C*C
940 752590856 : CdagC_2 = CdagC_1
941 752590856 : sign = -1.d0
942 : ELSE
943 332557577 : CdagC_2(C_) = CdagC_1(Cdag_)
944 332557577 : CdagC_2(Cdag_) = CdagC_1(C_)
945 332557577 : sign = 1.d0
946 : END IF
947 :
948 1085148433 : totalOverlap = 0.d0
949 :
950 15549099615 : DO otherFlavor = 1, this%flavors
951 14463951182 : IF ( otherFlavor .EQ. flavor ) CYCLE
952 13378802749 : overlap = ImpurityOperator_overlapSegFlav(this,CdagC_2(1:2),otherflavor)
953 : totalOverlap = totalOverlap &
954 13378802749 : + overlap * this%mat_U(otherFlavor,flavor)
955 15549099615 : this%updates(otherFlavor) = -sign * overlap
956 : END DO
957 :
958 1085148433 : totalOverlap = totalOverlap * sign
959 1085148433 : ImpurityOperator_getNewOverlap = totalOverlap
960 :
961 1085148433 : END FUNCTION ImpurityOperator_getNewOverlap
962 : !!***
963 :
964 : !!****f* ABINIT/m_ImpurityOperator/ImpurityOperator_getsign
965 : !! NAME
966 : !! ImpurityOperator_getsign
967 : !!
968 : !! FUNCTION
969 : !! Get the sign of the ratio of impurity traces
970 : !!
971 : !! COPYRIGHT
972 : !! Copyright (C) 2013-2026 ABINIT group (B. Amadon)
973 : !! This file is distributed under the terms of the
974 : !! GNU General Public License, see ~abinit/COPYING
975 : !! or http://www.gnu.org/copyleft/gpl.txt .
976 : !!
977 : !! INPUTS
978 : !! this = ImpurityOperator
979 : !! time2 = for segment/antisegment addition, end of segment
980 : !! position = for segment/antisegment removal, position of segment/antisegment removed
981 : !! action = > 0.5 addition
982 : !! < 0.5 removal
983 : !!
984 : !! OUTPUT
985 : !! ImpurityOperator_getsign = sign of ratio of impurity traces
986 : !!
987 : !! SIDE EFFECTS
988 : !!
989 : !! NOTES
990 : !!
991 : !! SOURCE
992 :
993 0 : DOUBLE PRECISION FUNCTION ImpurityOperator_getsign(this, time2, i, action, position)
994 :
995 : !Arguments ------------------------------------
996 : TYPE(ImpurityOperator), INTENT(IN) :: this
997 : DOUBLE PRECISION, INTENT(IN) :: time2, action
998 : INTEGER , INTENT(IN) :: i,position
999 : !Local variables ------------------------------
1000 : INTEGER :: tailint
1001 : DOUBLE PRECISION :: sign_imp
1002 : ! ************************************************************************
1003 0 : tailint=this%particles(this%activeflavor)%tail
1004 0 : if(action < 0.5d0) then
1005 0 : if(tailint>=1) then
1006 0 : if ( this%particles(this%activeFlavor)%list(tailint,2)>this%beta ) then ! segment winds around
1007 0 : if (i==1) then ! add segment do not change winding
1008 : sign_imp = 1
1009 0 : else if (i==2) then ! antisegment
1010 0 : if(time2>this%beta) then ! suppress winding around
1011 : sign_imp = -1
1012 : else ! winding around still here
1013 0 : sign_imp = 1
1014 : endif
1015 : endif
1016 : else ! segment do not wind around
1017 0 : if (i==1) then ! segment
1018 0 : if(time2>this%beta) then ! create winding
1019 : sign_imp = -1
1020 : else ! do not create winding
1021 0 : sign_imp = 1
1022 : endif
1023 0 : else if (i==2) then ! no winding in any case
1024 0 : sign_imp = 1
1025 : endif
1026 : endif
1027 0 : else if (tailint==0) then
1028 0 : if (i==1) then ! segment
1029 0 : if(time2>this%beta) then ! create winding
1030 : sign_imp = -1
1031 : else ! do not create winding
1032 0 : sign_imp = 1
1033 : endif
1034 0 : else if (i==2) then ! antisegment
1035 0 : if(time2>this%beta) then ! do not create winding
1036 : sign_imp = 1
1037 : else ! create winding
1038 0 : sign_imp = -1
1039 : endif
1040 : endif
1041 : endif
1042 : else
1043 0 : if ( this%particles(this%activeFlavor)%list(tailint,2)>this%beta ) then ! segment winds around
1044 0 : if (i==1) then ! remove segment
1045 0 : if(position==tailint) then ! suppress winding around
1046 : sign_imp = -1
1047 : else ! winding around still here
1048 0 : sign_imp = 1
1049 : endif
1050 0 : else if (i==2) then ! remove antisegment
1051 0 : if(tailint==1) then ! if tailint=1, create full orbital
1052 : sign_imp = -1
1053 : else ! if tailint >1 preserve winding
1054 0 : sign_imp = 1
1055 : endif
1056 : endif
1057 : else ! segments do not wind around
1058 0 : if (i==1) then ! suppress segment do not change winding
1059 : sign_imp = 1
1060 0 : else if (i==2) then ! antisegment
1061 0 : if(abs(position)==tailint) then ! create winding around only tailint >=1
1062 0 : if(tailint==1) then
1063 : sign_imp = 1
1064 : else
1065 0 : sign_imp = -1
1066 : endif
1067 : else !do not create winding around
1068 : sign_imp = 1
1069 : endif
1070 : endif
1071 : endif
1072 : endif
1073 :
1074 0 : ImpurityOperator_getsign=sign_imp
1075 :
1076 :
1077 0 : END FUNCTION ImpurityOperator_getsign
1078 : !!***
1079 :
1080 : !!****f* ABINIT/m_ImpurityOperator/ImpurityOperator_getTraceAdd
1081 : !! NAME
1082 : !! ImpurityOperator_getTraceAdd
1083 : !!
1084 : !! FUNCTION
1085 : !! Get the ratio of the traces of the impurity hamiltonien with and without the
1086 : !! new (anti-)segment.
1087 : !!
1088 : !! COPYRIGHT
1089 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
1090 : !! This file is distributed under the terms of the
1091 : !! GNU General Public License, see ~abinit/COPYING
1092 : !! or http://www.gnu.org/copyleft/gpl.txt .
1093 : !!
1094 : !! INPUTS
1095 : !! this=ImpurityOperator
1096 : !! CdagC_1=the segment
1097 : !!
1098 : !! OUTPUT
1099 : !! ImpurityOperator_getTraceAdd = Tr[exp(-beta !H_impurity)c(t1)cd(t1)c(t2)cd(t2)...]/Tr[..]
1100 : !!
1101 : !! SIDE EFFECTS
1102 : !!
1103 : !! NOTES
1104 : !!
1105 : !! SOURCE
1106 :
1107 511203414 : FUNCTION ImpurityOperator_getTraceAdd(this, CdagC_1) RESULT(trace)
1108 :
1109 : TYPE(ImpurityOperator) , INTENT(INOUT) :: this
1110 : DOUBLE PRECISION, DIMENSION(1:2), INTENT(IN ) :: CdagC_1
1111 : LOGICAL :: antiseg
1112 : DOUBLE PRECISION :: trace
1113 : DOUBLE PRECISION :: overlap
1114 : DOUBLE PRECISION :: length
1115 : DOUBLE PRECISION :: antisym_sign
1116 : DOUBLE PRECISION :: beta
1117 :
1118 511203414 : beta = this%beta
1119 511203414 : antisym_sign = 1.0d0
1120 511203414 : overlap = ImpurityOperator_getNewOverlap(this,CdagC_1)
1121 511203414 : length = CdagC_1(C_ ) - CdagC_1(Cdag_)
1122 511203414 : antiseg = length .LT. 0.d0
1123 : ! length > 0 if segment; < 0 if antisegment
1124 511203414 : if ( this%particles(this%activeFlavor)%tail .GT. 0 .AND. &
1125 : ( ( (.NOT. antiseg) .AND. CdagC_1(C_) .GT. beta ) .OR. &! for seg only
1126 : ( antiseg .AND. CdagC_1(C_) .LT. beta .AND. CdagC_1(Cdag_) .GT. beta ) & ! SIGN > 0 for antiseg only
1127 : ) &
1128 : ) THEN
1129 : antisym_sign = -1.d0
1130 464337415 : ELSE IF ( this%particles(this%activeFlavor)%tail .EQ. 0 .AND. &
1131 : ( ( (.NOT. antiseg) .AND. CdagC_1(C_) .GT. beta ) .OR. & ! >beta only possible for seg
1132 : ( antiseg .AND. CdagC_1(Cdag_) .LT. beta ) & ! antiseg cdag < beta
1133 : ) &
1134 : ) THEN
1135 511203414 : antisym_sign = -1.d0
1136 : END IF
1137 :
1138 511203414 : trace = antisym_sign * DEXP(this%mat_U(this%activeFlavor,this%activeFlavor)*length + overlap)
1139 :
1140 511203414 : END FUNCTION ImpurityOperator_getTraceAdd
1141 : !!***
1142 :
1143 : !!****f* ABINIT/m_ImpurityOperator/ImpurityOperator_getTraceRemove
1144 : !! NAME
1145 : !! ImpurityOperator_getTraceRemove
1146 : !!
1147 : !! FUNCTION
1148 : !! Get the ratio of the traces of the impurity hamiltonien without and with the
1149 : !! (anti-)segment.
1150 : !!
1151 : !! COPYRIGHT
1152 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
1153 : !! This file is distributed under the terms of the
1154 : !! GNU General Public License, see ~abinit/COPYING
1155 : !! or http://www.gnu.org/copyleft/gpl.txt .
1156 : !!
1157 : !! INPUTS
1158 : !! this=ImpurityOperator
1159 : !! position=position of the segment
1160 : !!
1161 : !! OUTPUT
1162 : !! ImpurityOperator_getTraceRemove = Tr[exp(-beta !H_impurity)c(t1)cd(t1)c(t2)cd(t2)...]/Tr[..]
1163 : !!
1164 : !! SIDE EFFECTS
1165 : !!
1166 : !! NOTES
1167 : !!
1168 : !! SOURCE
1169 :
1170 573945019 : FUNCTION ImpurityOperator_getTraceRemove(this, position) RESULT(trace)
1171 :
1172 : TYPE(ImpurityOperator), INTENT(INOUT) :: this
1173 : INTEGER , INTENT(IN ) :: position
1174 : INTEGER :: tail
1175 : DOUBLE PRECISION :: trace
1176 : DOUBLE PRECISION :: overlap
1177 : DOUBLE PRECISION :: length
1178 : DOUBLE PRECISION :: antisym_sign
1179 : DOUBLE PRECISION :: last_C
1180 : DOUBLE PRECISION :: beta
1181 : DOUBLE PRECISION, DIMENSION(1:2) :: CdagC_1
1182 :
1183 573945019 : beta = this%beta
1184 573945019 : antisym_sign = 1.0d0
1185 :
1186 573945019 : CdagC_1 = ImpurityOperator_getSegment(this,position)
1187 573945019 : length = CdagC_1(C_) - CdagC_1(Cdag_)
1188 : ! length > 0 if segment; < 0 if antisegment
1189 573945019 : overlap = ImpurityOperator_getNewOverlap(this,CdagC_1)
1190 :
1191 573945019 : tail = this%particles(this%activeFlavor)%tail
1192 573945019 : last_C = this%particles(this%activeFlavor)%list(tail,C_)
1193 573945019 : IF ( last_C .GT. beta ) THEN ! tail > 0 since if tail == 0 {0,beta}
1194 90558972 : IF ( ( position .EQ. tail ) .OR. & ! only possible for segment (<0 if antiseg)
1195 : ( length .LT. 0.d0 .AND. tail .EQ. 1 ) ) THEN
1196 573945019 : antisym_sign = -1.d0
1197 : END IF
1198 : ELSE
1199 483386047 : IF ( tail .GT. 1 .AND. position .EQ. -tail ) & !tail>1 and last antisegment
1200 573945019 : antisym_sign = -1.d0
1201 : END IF
1202 :
1203 573945019 : trace = antisym_sign * DEXP(-this%mat_U(this%activeFlavor,this%activeFlavor)*length-overlap)
1204 :
1205 573945019 : END FUNCTION ImpurityOperator_getTraceRemove
1206 : !!***
1207 :
1208 : !!****f* ABINIT/m_ImpurityOperator/ImpurityOperator_overlapSegFlav
1209 : !! NAME
1210 : !! ImpurityOperator_overlapSegFlav
1211 : !!
1212 : !! FUNCTION
1213 : !! Compute the overlap of a segment with a flavor
1214 : !!
1215 : !! COPYRIGHT
1216 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
1217 : !! This file is distributed under the terms of the
1218 : !! GNU General Public License, see ~abinit/COPYING
1219 : !! or http://www.gnu.org/copyleft/gpl.txt .
1220 : !!
1221 : !! INPUTS
1222 : !! this=ImpurityOperator
1223 : !! CdagC_1=segment
1224 : !! flavor=flavor to use
1225 : !!
1226 : !! OUTPUT
1227 : !! ImpurityOperator_overlapSegFlav=overlap between CdagC_1 and flavor
1228 : !!
1229 : !! SIDE EFFECTS
1230 : !!
1231 : !! NOTES
1232 : !!
1233 : !! SOURCE
1234 :
1235 13379075945 : DOUBLE PRECISION FUNCTION ImpurityOperator_overlapSegFlav(this,CdagC_1,flavor)
1236 :
1237 : !Arguments ------------------------------------
1238 : TYPE(ImpurityOperator), INTENT(INOUT) :: this
1239 : ! TYPE(CdagC) , INTENT(IN) :: CdagC_1
1240 : DOUBLE PRECISION, DIMENSION(1:2), INTENT(IN) :: CdagC_1
1241 : INTEGER , INTENT(IN) :: flavor
1242 : !Local variables ------------------------------
1243 : ! TYPE(CdagC), DIMENSION(:), POINTER :: list => NULL()
1244 : DOUBLE PRECISION :: totalCdag
1245 : DOUBLE PRECISION :: totalC
1246 : DOUBLE PRECISION :: beta
1247 : DOUBLE PRECISION :: Time
1248 : DOUBLE PRECISION :: Tmin
1249 : DOUBLE PRECISION :: Tmax
1250 : DOUBLE PRECISION :: TmaxBeta
1251 : DOUBLE PRECISION :: TscanMin
1252 : DOUBLE PRECISION :: TscanMax
1253 : ! DOUBLE PRECISION :: sign
1254 : DOUBLE PRECISION :: C
1255 : DOUBLE PRECISION :: Cdag
1256 : DOUBLE PRECISION :: loop
1257 : DOUBLE PRECISION :: itmin
1258 : DOUBLE PRECISION :: itmax
1259 : INTEGER :: tail
1260 : INTEGER :: tp1
1261 : INTEGER :: scanning
1262 : INTEGER :: imin
1263 : INTEGER :: imax
1264 : INTEGER :: loops
1265 : INTEGER :: iloop
1266 : #include "ListCdagC_firstHigher.h"
1267 :
1268 13379075945 : beta = this%beta
1269 13379075945 : Tmin = CdagC_1(Cdag_)
1270 13379075945 : Tmax = CdagC_1(C_)
1271 13379075945 : itmin= 0.d0
1272 :
1273 : ! TmaxBeta = Tmax.MOD.beta
1274 13379075945 : MODCYCLE(Tmax,beta,TmaxBeta)
1275 :
1276 13379075945 : tail = this%particles(flavor)%tail
1277 :
1278 13379075945 : totalC = 0.d0
1279 13379075945 : totalCdag = 0.d0
1280 13379075945 : IF ( tail .NE. 0 ) THEN
1281 7496007418 : tp1 = tail + 1
1282 7496007418 : loop = 0.d0
1283 : ! imin = ListCdagC_firstHigher( this%particles(flavor), Tmin ) - 1
1284 7496007418 : Time = Tmin
1285 : #define list_1 this%particles(flavor)
1286 : #include "ListCdagC_firstHigher"
1287 7496007418 : imin = firstHigher - 1
1288 :
1289 : SELECT CASE ( imin )
1290 : CASE(0)
1291 : scanning = tail
1292 2695371299 : loop = -1.d0
1293 : CASE(-2)
1294 2695371299 : scanning = tail
1295 : CASE DEFAULT
1296 4800636119 : scanning = imin
1297 : END SELECT
1298 : ! imax = ListCdagC_firstHigher( this%particles(flavor), TmaxBeta ) !- 1 Jamais atteint
1299 7496007418 : Time = TmaxBeta
1300 : #include "ListCdagC_firstHigher"
1301 : #undef list_1
1302 7496007418 : imax = firstHigher
1303 :
1304 7496007418 : TscanMin = Tmin
1305 7496007418 : TscanMax = Tmax
1306 :
1307 : ! Regarder avant
1308 7496007418 : IF ( (imin .EQ. 0) ) THEN
1309 2739387399 : C = this%particles(flavor)%list(scanning,C_) +loop* beta
1310 2739387399 : Cdag = this%particles(flavor)%list(scanning,Cdag_) +loop* beta
1311 2739387399 : itmax = MAX(TscanMin, Cdag)
1312 2739387399 : itmin = MIN(TscanMax, C )
1313 :
1314 2739387399 : IF ( itmin .GT. itmax ) THEN ! si egal alors overlap de 0
1315 110426425 : totalC = totalC + itmin
1316 110426425 : totalCdag = totalCdag + itmax
1317 : END IF
1318 2739387399 : scanning = scanning+1
1319 2739387399 : IF ( scanning .EQ. tp1 ) THEN
1320 2739387399 : scanning = 1
1321 : END IF
1322 : END IF
1323 :
1324 7496007418 : loops = imax - scanning
1325 7496007418 : IF ( TmaxBeta .NE. Tmax ) THEN
1326 2318179831 : loops = tail - loops
1327 5177827587 : ELSE IF ( imax .EQ. -1 ) THEN
1328 2122240439 : loops = tail - imin
1329 : END IF
1330 :
1331 : !Comparer betement 2 segments
1332 19895265686 : DO iloop =0, loops
1333 17705437139 : C = this%particles(flavor)%list(scanning,C_)
1334 17705437139 : Cdag = this%particles(flavor)%list(scanning,Cdag_)
1335 17705437139 : itmax = MAX(TscanMin, Cdag)
1336 17705437139 : itmin = MIN(TscanMax,C)
1337 :
1338 17705437139 : IF ( itmin .GT. itmax ) THEN ! si egal alors overla de 0
1339 5492571781 : totalC = totalC + itmin
1340 5492571781 : totalCdag = totalCdag + itmax
1341 : END IF
1342 17705437139 : scanning = scanning + 1
1343 25201444557 : IF ( scanning .EQ. tp1 ) THEN
1344 9903763964 : scanning = 1
1345 9903763964 : IF ( itmin .EQ. TScanMax ) EXIT
1346 4597585093 : TscanMin = TscanMin - beta
1347 4597585093 : TscanMax = TscanMax - beta
1348 : END IF
1349 : END DO
1350 :
1351 : ! Regarder apres le segment
1352 7496007418 : IF ( (itmin .NE. TscanMax) ) THEN
1353 410163046 : C = this%particles(flavor)%list(scanning,C_)
1354 410163046 : Cdag = this%particles(flavor)%list(scanning,Cdag_)
1355 410163046 : itmax = MAX(TscanMin, Cdag)
1356 410163046 : itmin = MIN(TscanMax,C)
1357 :
1358 410163046 : IF ( itmin .GT. itmax ) THEN ! si egal alors overla de 0
1359 268889390 : totalC = totalC + itmin
1360 268889390 : totalCdag = totalCdag + itmax
1361 : END IF
1362 : END IF
1363 5883068527 : ELSE IF ( this%particles(flavor)%list(0,C_) .EQ. 0.d0 ) THEN ! full orbital
1364 6336333 : totalC = Tmax
1365 6336333 : totalCdag = Tmin
1366 : END IF
1367 : !#ifdef CTQMC_CHECK
1368 13379075945 : IF ( this%doCheck .EQV. .TRUE. ) &
1369 0 : CALL ImpurityOperator_checkOverlap(this, Tmin, Tmax,totalC-totalCdag,flavor)
1370 : !#endif
1371 13379075945 : ImpurityOperator_overlapSegFlav = totalC - totalCdag
1372 :
1373 13379075945 : END FUNCTION ImpurityOperator_overlapSegFlav
1374 : !!***
1375 :
1376 : !!****f* ABINIT/m_ImpurityOperator/ImpurityOperator_overlapFlavor
1377 : !! NAME
1378 : !! ImpurityOperator_overlapFlavor
1379 : !!
1380 : !! FUNCTION
1381 : !! Returns the overlap of flavor with the others
1382 : !!
1383 : !! COPYRIGHT
1384 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
1385 : !! This file is distributed under the terms of the
1386 : !! GNU General Public License, see ~abinit/COPYING
1387 : !! or http://www.gnu.org/copyleft/gpl.txt .
1388 : !!
1389 : !! INPUTS
1390 : !! this=ImpurityOperator
1391 : !! flavor=the one we want
1392 : !!
1393 : !! OUTPUT
1394 : !! ImpurityOperator_overlapFlavor=result
1395 : !!
1396 : !! SIDE EFFECTS
1397 : !!
1398 : !! NOTES
1399 : !!
1400 : !! SOURCE
1401 :
1402 228580 : DOUBLE PRECISION FUNCTION ImpurityOperator_overlapFlavor(this,flavor)
1403 :
1404 : !Arguments ------------------------------------
1405 : TYPE(ImpurityOperator), INTENT(IN) :: this
1406 : INTEGER, OPTIONAL, INTENT(IN) :: flavor
1407 : !Local variables ------------------------------
1408 : INTEGER :: otherFlavor
1409 : DOUBLE PRECISION :: overlap
1410 : DOUBLE PRECISION :: totalOverlap
1411 :
1412 228580 : totalOverlap = 0.d0
1413 2498940 : DO otherFlavor = 1, this%flavors
1414 2270360 : IF ( otherFlavor .EQ. flavor ) CYCLE
1415 2041780 : overlap = this%overlaps(otherFlavor,flavor)
1416 : totalOverlap = totalOverlap &
1417 2498940 : + overlap * this%mat_U(otherFlavor,flavor)
1418 : END DO
1419 :
1420 228580 : ImpurityOperator_overlapFlavor = totalOverlap
1421 :
1422 228580 : END FUNCTION ImpurityOperator_overlapflavor
1423 : !!***
1424 :
1425 : !!****f* ABINIT/m_ImpurityOperator/ImpurityOperator_overlapSwap
1426 : !! NAME
1427 : !! ImpurityOperator_overlapSwap
1428 : !!
1429 : !! FUNCTION
1430 : !! compute the overlap of flavor1 with the configuration of flavor2
1431 : !!
1432 : !! COPYRIGHT
1433 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
1434 : !! This file is distributed under the terms of the
1435 : !! GNU General Public License, see ~abinit/COPYING
1436 : !! or http://www.gnu.org/copyleft/gpl.txt .
1437 : !!
1438 : !! INPUTS
1439 : !! this=ImpurityOperator
1440 : !! flavor1=interaction value
1441 : !! flavor2=configuration
1442 : !!
1443 : !! OUTPUT
1444 : !! ImpurityOperator_overlapSwap=new overlap
1445 : !!
1446 : !! SIDE EFFECTS
1447 : !!
1448 : !! NOTES
1449 : !!
1450 : !! SOURCE
1451 :
1452 228580 : DOUBLE PRECISION FUNCTION ImpurityOperator_overlapSwap(this,flavor1,flavor2)
1453 :
1454 : !Arguments ------------------------------------
1455 : TYPE(ImpurityOperator), INTENT(IN) :: this
1456 : INTEGER , INTENT(IN) :: flavor1
1457 : INTEGER , INTENT(IN) :: flavor2
1458 : !Local variables ------------------------------
1459 : INTEGER :: otherFlavor
1460 : DOUBLE PRECISION :: overlap
1461 : DOUBLE PRECISION :: totalOverlap
1462 :
1463 228580 : totalOverlap = 0.d0
1464 : ! Calcul l'overlap de flavor1 en utilisant la configuration de flavor2
1465 2498940 : DO otherFlavor = 1, this%flavors
1466 2498940 : IF ( otherFlavor .EQ. flavor2 ) THEN
1467 : CYCLE
1468 2041780 : ELSE IF ( otherFlavor .EQ. flavor1 ) THEN
1469 228580 : overlap = this%overlaps(otherFlavor,flavor2)
1470 : totalOverlap = totalOverlap &
1471 228580 : + overlap * this%mat_U(otherFlavor,flavor2)
1472 : ELSE
1473 1813200 : overlap = this%overlaps(otherFlavor,flavor2)
1474 : totalOverlap = totalOverlap &
1475 1813200 : + overlap * this%mat_U(otherFlavor,flavor1)
1476 : END IF
1477 : END DO
1478 :
1479 228580 : ImpurityOperator_overlapSwap = totalOverlap
1480 :
1481 228580 : END FUNCTION ImpurityOperator_overlapSwap
1482 : !!***
1483 :
1484 : !!****f* ABINIT/m_ImpurityOperator/ImpurityOperator_swap
1485 : !! NAME
1486 : !! ImpurityOperator_swap
1487 : !!
1488 : !! FUNCTION
1489 : !! Swap to flavors
1490 : !!
1491 : !! COPYRIGHT
1492 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
1493 : !! This file is distributed under the terms of the
1494 : !! GNU General Public License, see ~abinit/COPYING
1495 : !! or http://www.gnu.org/copyleft/gpl.txt .
1496 : !!
1497 : !! INPUTS
1498 : !! this=ImpurtiyOperator
1499 : !! flavor1=to swap
1500 : !! flavor2=to swap
1501 : !!
1502 : !! OUTPUT
1503 : !!
1504 : !! SIDE EFFECTS
1505 : !!
1506 : !! NOTES
1507 : !!
1508 : !! SOURCE
1509 :
1510 95797 : SUBROUTINE ImpurityOperator_swap(this,flavor1, flavor2)
1511 :
1512 : !Arguments ------------------------------------
1513 : TYPE(ImpurityOperator), INTENT(INOUT) :: this
1514 : INTEGER , INTENT(IN ) :: flavor1
1515 : INTEGER , INTENT(IN ) :: flavor2
1516 : !Local variables ------------------------------
1517 : INTEGER :: iflavor
1518 : DOUBLE PRECISION :: overlap_tmp
1519 :
1520 986059 : DO iflavor = 1, this%flavors
1521 986059 : IF ( iflavor .NE. flavor1 .AND. iflavor .NE. flavor2) THEN
1522 698668 : overlap_tmp = this%overlaps(iflavor,flavor1)
1523 698668 : this%overlaps(iflavor,flavor1) = this%overlaps(iflavor,flavor2)
1524 698668 : this%overlaps(flavor1,iflavor) = this%overlaps(iflavor,flavor2)
1525 698668 : this%overlaps(iflavor,flavor2) = overlap_tmp
1526 698668 : this%overlaps(flavor2,iflavor) = overlap_tmp
1527 : END IF
1528 : END DO
1529 :
1530 : !CALL ListCdagC_print(this%particles(flavor1),233)
1531 : !CALL ListCdagC_print(this%particles(flavor2),233)
1532 95797 : CALL ListCdagC_assign(this%list_swap, this%particles(flavor1)) !list_swap = particle
1533 95797 : this%particles(flavor1) = this%particles(flavor2)
1534 95797 : this%particles(flavor2) = this%list_swap
1535 : !CALL ListCdagC_swap(this%particles(flavor1),this%particles(flavor2))
1536 : !CALL ListCdagC_print(this%particles(flavor1),233)
1537 : !CALL ListCdagC_print(this%particles(flavor2),233)
1538 :
1539 95797 : END SUBROUTINE ImpurityOperator_swap
1540 : !!***
1541 :
1542 : !!****f* ABINIT/m_ImpurityOperator/ImpurityOperator_overlapIJ
1543 : !! NAME
1544 : !! ImpurityOperator_overlapIJ
1545 : !!
1546 : !! FUNCTION
1547 : !! Compute overlap between two flavors
1548 : !!
1549 : !! COPYRIGHT
1550 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
1551 : !! This file is distributed under the terms of the
1552 : !! GNU General Public License, see ~abinit/COPYING
1553 : !! or http://www.gnu.org/copyleft/gpl.txt .
1554 : !!
1555 : !! INPUTS
1556 : !! this=ImpurityOperator
1557 : !! i=first flavor
1558 : !! j=second flavor
1559 : !!
1560 : !! OUTPUT
1561 : !! ImpurityOperator_overlapIJ=result
1562 : !!
1563 : !! SIDE EFFECTS
1564 : !!
1565 : !! NOTES
1566 : !!
1567 : !! SOURCE
1568 :
1569 108071 : DOUBLE PRECISION FUNCTION ImpurityOperator_overlapIJ(this,i,j)
1570 :
1571 : !Arguments ------------------------------------
1572 : TYPE(ImpurityOperator), INTENT(INOUT) :: this
1573 : INTEGER , INTENT(IN) :: i
1574 : INTEGER , INTENT(IN) :: j
1575 : !Local variables ------------------------------
1576 : ! TYPE(ListCdagC) , POINTER :: particle1 => NULL()
1577 : ! DOUBLE PRECISION, DIMENSION(:,:), POINTER :: list1 => NULL()
1578 : INTEGER :: tail1
1579 : DOUBLE PRECISION, DIMENSION(1:2) :: CdagC_1
1580 : INTEGER :: isegment
1581 :
1582 : ! particle1 => this%particles(i)
1583 : ! list1 => particle1%list
1584 108071 : tail1 = this%particles(i)%tail
1585 :
1586 108071 : ImpurityOperator_overlapIJ = 0.d0
1587 108071 : IF ( tail1 .EQ. 0 .AND. this%particles(i)%list(0,C_) .EQ. 0.d0 ) THEN ! FULL
1588 : ! CALL CdagC_init(CdagC_1,0.d0,this%beta)
1589 36 : CdagC_1(Cdag_) = 0.d0
1590 36 : CdagC_1(C_ ) = this%beta
1591 :
1592 36 : ImpurityOperator_overlapIJ = ImpurityOperator_overlapSegFlav(this,CdagC_1,j)
1593 108035 : ELSE IF ( tail1 .GT. 0) THEN
1594 61242 : this%activeFlavor = i
1595 334402 : DO isegment = 1, tail1
1596 819480 : CdagC_1(:) = this%particles(i)%list(isegment,1:2)
1597 : ImpurityOperator_overlapIJ = ImpurityOperator_overlapIJ &
1598 334402 : + ImpurityOperator_overlapSegFlav(this,CdagC_1,j)
1599 : END DO
1600 : END IF
1601 :
1602 108071 : END FUNCTION ImpurityOperator_overlapIJ
1603 : !!***
1604 :
1605 : !!****f* ABINIT/m_ImpurityOperator/ImpurityOperator_measDE
1606 : !! NAME
1607 : !! ImpurityOperator_measDE
1608 : !!
1609 : !! FUNCTION
1610 : !! measure double occupancy and interaction energy
1611 : !!
1612 : !! COPYRIGHT
1613 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
1614 : !! This file is distributed under the terms of the
1615 : !! GNU General Public License, see ~abinit/COPYING
1616 : !! or http://www.gnu.org/copyleft/gpl.txt .
1617 : !!
1618 : !! INPUTS
1619 : !! this=ImpurityOperator
1620 : !!
1621 : !! OUTPUT
1622 : !! DE=array accumulating duoble occupancy and energy
1623 : !!
1624 : !! SIDE EFFECTS
1625 : !!
1626 : !! NOTES
1627 : !!
1628 : !! SOURCE
1629 :
1630 78610000 : SUBROUTINE ImpurityOperator_measDE(this,DE)
1631 :
1632 : !Arguments ------------------------------------
1633 : TYPE(ImpurityOperator), INTENT(IN) :: this
1634 : DOUBLE PRECISION, DIMENSION(:,:), INTENT(INOUT) :: DE
1635 : !Local variables ------------------------------
1636 : DOUBLE PRECISION :: localD
1637 : DOUBLE PRECISION :: totalE
1638 : INTEGER :: iflavor1
1639 : INTEGER :: iflavor2
1640 : INTEGER :: flavors
1641 :
1642 78610000 : IF ( .NOT. ALLOCATED(this%particles) ) &
1643 0 : CALL ERROR("ImpurityOperator_measD : no particle set ")
1644 :
1645 78610000 : totalE = 0.d0
1646 78610000 : flavors = this%flavors
1647 1100990000 : DO iflavor1 = 1, flavors
1648 7468780000 : DO iflavor2 = iflavor1+1, flavors
1649 : !localD = ImpurityOperator_overlapIJ(this,iflavor1,iflavor2)
1650 6367790000 : localD = this%overlaps(iflavor2,iflavor1)
1651 6367790000 : DE(iflavor2,iflavor1) = DE(iflavor2,iflavor1) + localD
1652 7390170000 : totalE = totalE + localD * real(this%mat_U(iflavor1,iflavor2))
1653 : END DO
1654 : END DO
1655 :
1656 78610000 : DE(1,1) = DE(1,1) + totalE
1657 :
1658 78610000 : END SUBROUTINE ImpurityOperator_measDE
1659 : !!***
1660 :
1661 : !!****f* ABINIT/m_ImpurityOperator/ImpurityOperator_measDEComplex
1662 : !! NAME
1663 : !! ImpurityOperator_measDEComplex
1664 : !!
1665 : !! FUNCTION
1666 : !! measure double occupancy and interaction energy
1667 : !!
1668 : !! COPYRIGHT
1669 : !! Copyright (C) 2013-2025 ABINIT group (J. Bieder)
1670 : !! This file is distributed under the terms of the
1671 : !! GNU General Public License, see ~abinit/COPYING
1672 : !! or http://www.gnu.org/copyleft/gpl.txt .
1673 : !!
1674 : !! INPUTS
1675 : !! this=ImpurityOperator
1676 : !!
1677 : !! OUTPUT
1678 : !! DE=array accumulating duoble occupancy and energy
1679 : !!
1680 : !! SIDE EFFECTS
1681 : !!
1682 : !! NOTES
1683 : !!
1684 : !! SOURCE
1685 :
1686 0 : SUBROUTINE ImpurityOperator_measDEComplex(this,DE)
1687 :
1688 : !Arguments ------------------------------------
1689 : TYPE(ImpurityOperator), INTENT(IN) :: this
1690 : COMPLEX(KIND=8), DIMENSION(:,:), INTENT(INOUT) :: DE
1691 : !Local variables ------------------------------
1692 : COMPLEX(KIND=8) :: localD
1693 : COMPLEX(KIND=8) :: totalE
1694 : INTEGER :: iflavor1
1695 : INTEGER :: iflavor2
1696 : INTEGER :: flavors
1697 :
1698 0 : IF ( .NOT. ALLOCATED(this%particles) ) &
1699 0 : CALL ERROR("ImpurityOperator_measD : no particle set ")
1700 :
1701 0 : totalE = 0.d0
1702 0 : flavors = this%flavors
1703 0 : DO iflavor1 = 1, flavors
1704 0 : DO iflavor2 = iflavor1+1, flavors
1705 : !localD = ImpurityOperator_overlapIJ(this,iflavor1,iflavor2)
1706 0 : localD = cmplx(this%overlaps(iflavor2,iflavor1),0.d0,kind=8)
1707 0 : DE(iflavor2,iflavor1) = DE(iflavor2,iflavor1) + localD
1708 0 : totalE = totalE + localD * this%mat_U(iflavor1,iflavor2)
1709 : END DO
1710 : END DO
1711 :
1712 0 : DE(1,1) = DE(1,1) + totalE
1713 :
1714 0 : END SUBROUTINE ImpurityOperator_measDEComplex
1715 : !!***
1716 :
1717 : !!****f* ABINIT/m_ImpurityOperator/ImpurityOperator_cleanOverlaps
1718 : !! NAME
1719 : !! ImpurityOperator_cleanOverlaps
1720 : !!
1721 : !! FUNCTION
1722 : !! Compute from scratch all overlaps
1723 : !!
1724 : !! COPYRIGHT
1725 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
1726 : !! This file is distributed under the terms of the
1727 : !! GNU General Public License, see ~abinit/COPYING
1728 : !! or http://www.gnu.org/copyleft/gpl.txt .
1729 : !!
1730 : !! INPUTS
1731 : !! this=ImpurityOperator
1732 : !!
1733 : !! OUTPUT
1734 : !!
1735 : !! SIDE EFFECTS
1736 : !!
1737 : !! NOTES
1738 : !!
1739 : !! SOURCE
1740 :
1741 2049 : SUBROUTINE ImpurityOperator_cleanOverlaps(this)
1742 :
1743 : !Arguments ------------------------------------
1744 : TYPE(ImpurityOperator), INTENT(INOUT) :: this
1745 : !Local variables ------------------------------
1746 : INTEGER :: iflavor1
1747 : INTEGER :: iflavor2
1748 : INTEGER :: flavors
1749 :
1750 2049 : IF ( .NOT. ALLOCATED(this%particles) ) &
1751 0 : CALL ERROR("ImpurityOperator_cleanOverlap : no particle set ")
1752 :
1753 2049 : flavors = this%flavors
1754 22935 : DO iflavor1 = 1, flavors
1755 131006 : DO iflavor2 = iflavor1+1, flavors
1756 128957 : this%overlaps(iflavor2,iflavor1) = ImpurityOperator_overlapIJ(this,iflavor1,iflavor2)
1757 : END DO
1758 : END DO
1759 :
1760 2049 : END SUBROUTINE ImpurityOperator_cleanOverlaps
1761 : !!***
1762 :
1763 : !!****f* ABINIT/m_ImpurityOperator/ImpurityOperator_measN
1764 : !! NAME
1765 : !! ImpurityOperator_measN
1766 : !!
1767 : !! FUNCTION
1768 : !! measure the number of electrons on flavor flavor
1769 : !!
1770 : !! COPYRIGHT
1771 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
1772 : !! This file is distributed under the terms of the
1773 : !! GNU General Public License, see ~abinit/COPYING
1774 : !! or http://www.gnu.org/copyleft/gpl.txt .
1775 : !!
1776 : !! INPUTS
1777 : !! this=ImpurityOperator
1778 : !! flavor=the flavor
1779 : !!
1780 : !! OUTPUT
1781 : !! ImpurityOperator_measN=number of electrons
1782 : !!
1783 : !! SIDE EFFECTS
1784 : !!
1785 : !! NOTES
1786 : !!
1787 : !! SOURCE
1788 :
1789 159198506 : DOUBLE PRECISION FUNCTION ImpurityOperator_measN(this,flavor)
1790 :
1791 : !Arguments ------------------------------------
1792 : TYPE(ImpurityOperator), INTENT(IN) :: this
1793 : INTEGER, OPTIONAL, INTENT(IN) :: flavor
1794 : !Local variables ------------------------------
1795 : DOUBLE PRECISION :: totalCdag
1796 : DOUBLE PRECISION :: totalC
1797 : INTEGER :: scanning
1798 : INTEGER :: aF
1799 :
1800 159198506 : IF ( PRESENT(flavor) ) THEN
1801 228580 : aF = flavor
1802 : ELSE
1803 158969926 : aF = this%activeFlavor
1804 : END IF
1805 :
1806 159198506 : IF ( aF .LE. 0 ) &
1807 0 : CALL ERROR("ImpurityOperator_measN : no active flavor ")
1808 :
1809 159198506 : totalC = (this%particles(aF)%list(0,Cdag_) - this%particles(aF)%list(0,C_) + this%beta) * .5d0
1810 159198506 : totalCdag = 0.d0
1811 :
1812 715683726 : DO scanning = 1, this%particles(aF)%tail
1813 556485220 : totalCdag = totalCdag + this%particles(aF)%list(scanning,Cdag_)
1814 715683726 : totalC = totalC + this%particles(aF)%list(scanning,C_ )
1815 : END DO
1816 :
1817 159198506 : ImpurityOperator_measN = totalC - totalCdag
1818 :
1819 159198506 : END FUNCTION ImpurityOperator_measN
1820 : !!***
1821 :
1822 : !!****f* ABINIT/m_ImpurityOperator/ImpurityOperator_destroy
1823 : !! NAME
1824 : !! ImpurityOperator_destroy
1825 : !!
1826 : !! FUNCTION
1827 : !! destroy and deallocate
1828 : !!
1829 : !! COPYRIGHT
1830 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
1831 : !! This file is distributed under the terms of the
1832 : !! GNU General Public License, see ~abinit/COPYING
1833 : !! or http://www.gnu.org/copyleft/gpl.txt .
1834 : !!
1835 : !! INPUTS
1836 : !! this=ImpurityOperator
1837 : !!
1838 : !! OUTPUT
1839 : !!
1840 : !! SIDE EFFECTS
1841 : !!
1842 : !! NOTES
1843 : !!
1844 : !! SOURCE
1845 :
1846 102 : SUBROUTINE ImpurityOperator_destroy(this)
1847 :
1848 : !Arguments ------------------------------------
1849 : TYPE(ImpurityOperator), INTENT(INOUT) :: this
1850 : !Local variables ------------------------------
1851 : INTEGER :: IT
1852 :
1853 102 : IF ( ALLOCATED(this%particles) ) THEN
1854 1178 : DO IT = 1, this%flavors
1855 1178 : CALL ListCdagC_destroy(this%particles(IT))
1856 : END DO
1857 1178 : DT_FREE(this%particles)
1858 : ENDIF
1859 102 : CALL ListCdagC_destroy(this%list_swap)
1860 102 : FREEIF(this%mat_U)
1861 102 : FREEIF(this%Magmommat_orb)
1862 102 : FREEIF(this%Magmommat_spin)
1863 102 : FREEIF(this%Magmommat_tot)
1864 102 : FREEIF(this%overlaps)
1865 102 : FREEIF(this%updates)
1866 102 : this%activeFlavor = 0
1867 102 : this%flavors = 0
1868 102 : this%beta = 0.d0
1869 102 : END SUBROUTINE ImpurityOperator_destroy
1870 : !!***
1871 :
1872 : !!****f* ABINIT/m_ImpurityOperator/ImpurityOperator_getErrorOverlap
1873 : !! NAME
1874 : !! ImpurityOperator_getErrorOverlap
1875 : !!
1876 : !! FUNCTION
1877 : !! compute error on the overlap (numerical accumulation)
1878 : !!
1879 : !! COPYRIGHT
1880 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
1881 : !! This file is distributed under the terms of the
1882 : !! GNU General Public License, see ~abinit/COPYING
1883 : !! or http://www.gnu.org/copyleft/gpl.txt .
1884 : !!
1885 : !! INPUTS
1886 : !! this=ImpurityOperator
1887 : !!
1888 : !! OUTPUT
1889 : !! DE=save the error
1890 : !!
1891 : !! SIDE EFFECTS
1892 : !!
1893 : !! NOTES
1894 : !!
1895 : !! SOURCE
1896 :
1897 0 : SUBROUTINE ImpurityOperator_getErrorOverlap(this,DE)
1898 :
1899 : !Arguments ------------------------------------
1900 : TYPE(ImpurityOperator), INTENT(INOUT) :: this
1901 : DOUBLE PRECISION, DIMENSION(:,:), INTENT(INOUT) :: DE
1902 : !Local variables ------------------------------
1903 : DOUBLE PRECISION :: localD1
1904 : DOUBLE PRECISION :: localD2
1905 : DOUBLE PRECISION :: totalE1
1906 : DOUBLE PRECISION :: totalE2
1907 : INTEGER :: iflavor1
1908 : INTEGER :: iflavor2
1909 : INTEGER :: flavors
1910 :
1911 0 : IF ( .NOT. ALLOCATED(this%particles) ) &
1912 0 : CALL ERROR("ImpurityOperator_getErrorOverlap : no particle set ")
1913 :
1914 0 : totalE1 = 0.d0
1915 0 : totalE2 = 0.d0
1916 0 : flavors = this%flavors
1917 0 : DO iflavor1 = 1, flavors
1918 0 : DO iflavor2 = iflavor1+1, flavors
1919 0 : localD1 = ImpurityOperator_overlapIJ(this,iflavor1,iflavor2)
1920 0 : localD2 = this%overlaps(iflavor2,iflavor1)
1921 0 : totalE1 = totalE1 + localD1 * this%mat_U(iflavor1,iflavor2)
1922 0 : totalE2 = totalE2 + localD2 * this%mat_U(iflavor1,iflavor2)
1923 : END DO
1924 : END DO
1925 :
1926 0 : DE(2,2) = ABS(totalE1 - totalE2)
1927 :
1928 0 : END SUBROUTINE ImpurityOperator_getErrorOverlap
1929 :
1930 : !!***
1931 : !#ifdef CTQMC_CHECK
1932 : !!****f* ABINIT/m_ImpurityOperator/ImpurityOperator_doCheck
1933 : !! NAME
1934 : !! ImpurityOperator_doCheck
1935 : !!
1936 : !! FUNCTION
1937 : !! set the check mechanism
1938 : !!
1939 : !! COPYRIGHT
1940 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
1941 : !! This file is distributed under the terms of the
1942 : !! GNU General Public License, see ~abinit/COPYING
1943 : !! or http://www.gnu.org/copyleft/gpl.txt .
1944 : !!
1945 : !! INPUTS
1946 : !! this=ImpurityOperator
1947 : !! opt_check=1||3 do check
1948 : !!
1949 : !! OUTPUT
1950 : !!
1951 : !! SIDE EFFECTS
1952 : !!
1953 : !! NOTES
1954 : !!
1955 : !! SOURCE
1956 :
1957 49 : SUBROUTINE ImpurityOperator_doCheck(this,opt_check)
1958 :
1959 : !Arguments ------------------------------------
1960 : TYPE(ImpurityOperator) , INTENT(INOUT) :: this
1961 : INTEGER , INTENT(IN ) :: opt_check
1962 :
1963 49 : IF ( opt_check .EQ. 1 .OR. opt_check .EQ. 3 ) &
1964 0 : this%doCheck = .TRUE.
1965 49 : END SUBROUTINE ImpurityOperator_doCheck
1966 : !!***
1967 :
1968 : !!****f* ABINIT/m_ImpurityOperator/ImpurityOperator_checkOverlap
1969 : !! NAME
1970 : !! ImpurityOperator_checkOverlap
1971 : !!
1972 : !! FUNCTION
1973 : !! check the calculation of the overlap (very very slow routine)
1974 : !! between Tmin and Tmax (c+ and c)
1975 : !!
1976 : !! COPYRIGHT
1977 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
1978 : !! This file is distributed under the terms of the
1979 : !! GNU General Public License, see ~abinit/COPYING
1980 : !! or http://www.gnu.org/copyleft/gpl.txt .
1981 : !!
1982 : !! INPUTS
1983 : !! this=ImpurityOperator
1984 : !! Tmin=c+
1985 : !! Tmax=c
1986 : !! iOverlap=input overlap (fast calculation)
1987 : !! iflavor=active flavor
1988 : !!
1989 : !! OUTPUT
1990 : !!
1991 : !! SIDE EFFECTS
1992 : !!
1993 : !! NOTES
1994 : !!
1995 : !! SOURCE
1996 :
1997 0 : SUBROUTINE ImpurityOperator_checkOverlap(this, Tmin, Tmax, iOverlap, iflavor)
1998 :
1999 : !Arguments ------------------------------------
2000 : TYPE(ImpurityOperator), INTENT(INOUT) :: this
2001 : DOUBLE PRECISION , INTENT(IN ) :: Tmin
2002 : DOUBLE PRECISION , INTENT(IN ) :: Tmax
2003 : DOUBLE PRECISION , INTENT(IN ) :: iOverlap
2004 : INTEGER , INTENT(IN ) :: iflavor
2005 : !Local variables ------------------------------
2006 : INTEGER, PARAMETER :: size=10000000
2007 : INTEGER :: imin
2008 : INTEGER :: imax
2009 : INTEGER :: imaxbeta
2010 : INTEGER :: isegment
2011 : INTEGER :: tail
2012 : INTEGER(1), DIMENSION(1:size,1:2) :: checktab
2013 : CHARACTER(LEN=4) :: a
2014 : DOUBLE PRECISION :: dt
2015 : DOUBLE PRECISION :: inv_dt
2016 : DOUBLE PRECISION :: overlap
2017 : DOUBLE PRECISION :: erreur
2018 : DOUBLE PRECISION :: weight
2019 : INTEGER :: try
2020 :
2021 0 : checktab = INT(0,1)
2022 0 : overlap = 0.d0
2023 :
2024 0 : dt = this%beta / DBLE((size-1))
2025 0 : inv_dt = 1.d0 / dt
2026 0 : imin = INT(Tmin / dt + 0.5d0) + 1
2027 0 : imax = INT(Tmax / dt + 0.5d0) + 1
2028 0 : MODCYCLE(imax, size, imaxbeta)
2029 :
2030 0 : tail = this%particles(iflavor)%tail
2031 :
2032 0 : DO try = imin, MIN(imax,size)
2033 0 : checktab(try,1)=INT(1,1)!IBSET(checktab(try,1),0)
2034 : END DO
2035 :
2036 0 : IF ( imax .NE. imaxbeta ) THEN
2037 0 : DO try = 1, imaxbeta
2038 0 : checktab(try,1)=INT(1,1)!IBSET(checktab(try,1),0)
2039 : END DO
2040 : END IF
2041 :
2042 0 : IF ( tail .NE. 0 ) THEN
2043 0 : DO isegment=1, tail
2044 0 : imin = INT(this%particles(iflavor)%list(isegment,Cdag_)* inv_dt + 0.5d0) + 1
2045 0 : imax = INT(this%particles(iflavor)%list(isegment,C_ )* inv_dt + 0.5d0) + 1
2046 0 : MODCYCLE(imax, size, imaxbeta)
2047 0 : DO try = imin, MIN(imax,size)
2048 0 : checktab(try,2)=INT(1,1)!IBSET(checktab(try,2),0)
2049 : END DO
2050 0 : IF ( imax .NE. imaxbeta ) THEN
2051 0 : DO try = 1, imaxbeta
2052 0 : checktab(try,2)=INT(1,1)!IBSET(checktab(try,2),0)
2053 : END DO
2054 : END IF
2055 : END DO
2056 0 : ELSE IF ( this%particles(iflavor)%list(0,C_) .EQ. 0.d0 ) THEN
2057 0 : DO try = 1, size
2058 0 : checktab(try,2)=INT(1,1)!IBSET(checktab(try,2),0)
2059 : END DO
2060 : END IF
2061 :
2062 0 : DO isegment = 1, size
2063 0 : IF ( IAND(checktab(isegment,1),checktab(isegment,2)) .EQ. INT(1,1) ) &
2064 0 : overlap = overlap + 1.d0
2065 : END DO
2066 :
2067 0 : overlap = overlap * dt
2068 :
2069 0 : IF ( iOverlap .EQ. 0.d0 ) THEN
2070 0 : erreur = ABS(overlap)
2071 : ELSE
2072 0 : erreur = ABS(overlap - iOverlap)
2073 : END IF
2074 0 : weight = ABS(2.d0 * DBLE(tail) * dt - iOverlap)
2075 0 : IF ( erreur .GT. weight ) THEN
2076 0 : WRITE(a,'(I4)') INT(erreur*100.d0)
2077 0 : CALL WARN("ImpurityOperator_checkOverlap : "//a//"% ")
2078 : END IF
2079 0 : IF ( iOverlap .LE. (2.d0 * DBLE(tail) * dt) ) &
2080 0 : this%meanError = this%meanError + 1.d0
2081 0 : this%checkNumber = this%checkNumber + 1.d0 !weight
2082 :
2083 0 : END SUBROUTINE ImpurityOperator_checkOverlap
2084 : !!***
2085 :
2086 : !!****f* ABINIT/m_ImpurityOperator/ImpurityOperator_getError
2087 : !! NAME
2088 : !! ImpurityOperator_getErro
2089 : !!
2090 : !! FUNCTION
2091 : !! get error on computing the overlap
2092 : !!
2093 : !! COPYRIGHT
2094 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
2095 : !! This file is distributed under the terms of the
2096 : !! GNU General Public License, see ~abinit/COPYING
2097 : !! or http://www.gnu.org/copyleft/gpl.txt .
2098 : !!
2099 : !! INPUTS
2100 : !! this=ImpurityOperator
2101 : !!
2102 : !! OUTPUT
2103 : !! ImpurityOperator_getError=percentage error
2104 : !!
2105 : !! SIDE EFFECTS
2106 : !!
2107 : !! NOTES
2108 : !!
2109 : !! SOURCE
2110 :
2111 0 : DOUBLE PRECISION FUNCTION ImpurityOperator_getError(this)
2112 :
2113 : !Arguments ------------------------------------
2114 : TYPE(ImpurityOperator), INTENT(IN) :: this
2115 : !Local variables ------------------------------
2116 : ! DOUBLE PRECISION :: tolerance
2117 : DOUBLE PRECISION :: error
2118 :
2119 0 : IF ( this%doCheck .EQV. .TRUE. ) THEN
2120 0 : error = ABS(this%meanError/this%checkNumber)
2121 : ! tolerance = ABS(this%tolerance/this%checkNumber)
2122 0 : ImpurityOperator_getError = error
2123 : ELSE
2124 : ImpurityOperator_getError = 0.d0
2125 : END IF
2126 0 : END FUNCTION ImpurityOperator_getError
2127 : !!***
2128 : !#endif
2129 :
2130 : !!****f* ABINIT/m_ImpurityOperator/ImpurityOperator_printLatex
2131 : !! NAME
2132 : !! ImpurityOperator_printLatex
2133 : !!
2134 : !! FUNCTION
2135 : !! print in a latex format all the configuration
2136 : !!
2137 : !! COPYRIGHT
2138 : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
2139 : !! This file is distributed under the terms of the
2140 : !! GNU General Public License, see ~abinit/COPYING
2141 : !! or http://www.gnu.org/copyleft/gpl.txt .
2142 : !!
2143 : !! INPUTS
2144 : !! this=ImpurityOperator
2145 : !! ostream=file stream
2146 : !! isweep=current sweep number
2147 : !!
2148 : !! OUTPUT
2149 : !!
2150 : !! SIDE EFFECTS
2151 : !!
2152 : !! NOTES
2153 : !!
2154 : !! SOURCE
2155 :
2156 0 : SUBROUTINE ImpurityOperator_printLatex(this, ostream, isweep)
2157 :
2158 : !Arguments ------------------------------------
2159 : TYPE(ImpurityOperator), INTENT(IN) :: this
2160 : INTEGER , INTENT(IN) :: ostream
2161 : INTEGER , INTENT(IN) :: isweep
2162 : !Local variables ------------------------------
2163 : INTEGER :: flavors
2164 : INTEGER :: iflavor
2165 : INTEGER :: tail
2166 : INTEGER :: it
2167 : DOUBLE PRECISION :: C
2168 : DOUBLE PRECISION :: Cdag
2169 : INTEGER :: ordo
2170 : INTEGER :: y
2171 : INTEGER :: lines
2172 : INTEGER :: letters
2173 : DOUBLE PRECISION :: length
2174 :
2175 0 : flavors = this%flavors
2176 :
2177 0 : WRITE(ostream,'(A13)') "\begin{frame}"
2178 0 : WRITE(ostream,'(2x,A14)') "\begin{figure}"
2179 0 : WRITE(ostream,'(4x,A28)') "\setlength{\unitlength}{1mm}"
2180 0 : WRITE(ostream,'(4x,A23)') "\begin{picture}(104,90)"
2181 0 : WRITE(ostream,'(6x,A29,I6,A2)') "\put(52,00){\makebox(0,0)[c]{",isweep,"}}"
2182 0 : y = INT(90.d0/DBLE(flavors+1))
2183 0 : DO iflavor = 1, flavors
2184 0 : tail = this%particles(iflavor)%tail
2185 0 : ordo = iflavor * y
2186 0 : lines = ordo - 1
2187 0 : letters = ordo - 5
2188 0 : WRITE(ostream,'(6x,A6,I2)') "%ligne", iflavor
2189 0 : WRITE(ostream,'(6x,A41,I2,A16)') "\linethickness{0.5pt}\color{black}\put(2,",lines,"){\line(0,1){2}}"
2190 0 : WRITE(ostream,'(6x,A7,I2,A24)') "\put(2,",letters,"){\makebox(0,0)[c]{$0$}}"
2191 0 : WRITE(ostream,'(6x,A7,I2,A18)') "\put(2,",ordo,"){\line(1,0){100}}"
2192 0 : WRITE(ostream,'(6x,A9,I2,A16)') "\put(102,",lines,"){\line(0,1){2}}"
2193 0 : WRITE(ostream,'(6x,A9,I2,A28)') "\put(102,",letters,"){\makebox(0,0)[c]{$\beta$}}"
2194 0 : DO it = 1, tail
2195 0 : Cdag = 2.d0+(this%particles(iflavor)%list(it,Cdag_)/this%beta*100.d0)
2196 0 : C = 2.d0+(this%particles(iflavor)%list(it,C_ )/this%beta*100.d0)
2197 0 : length = C - Cdag
2198 0 : IF ( this%particles(iflavor)%list(it,C_) .LE. this%beta ) THEN
2199 0 : WRITE(ostream,'(8x,A9,I2)') "%segments", it
2200 : WRITE(ostream,'(8x,A37,F5.1,A1,I2,A13,F5.1,A2)') &
2201 0 : "\linethickness{2pt}\color{black}\put(",Cdag,",",ordo,"){\line(1,0){",length,"}}"
2202 0 : WRITE(ostream,'(8x,A5)') "%Cdag"
2203 0 : WRITE(ostream,'(8x,A12)') "\color{blue}"
2204 0 : WRITE(ostream,'(8x,A5,F5.1,A1,I2,A14)') "\put(",Cdag,",",ordo,"){\circle*{1}}"
2205 0 : WRITE(ostream,'(8x,A2)') "%C"
2206 0 : WRITE(ostream,'(8x,A11)') "\color{red}"
2207 0 : WRITE(ostream,'(8x,A5,F5.1,A1,I2,A14)') "\put(",C,",",ordo,"){\circle*{1}}"
2208 : ELSE
2209 0 : WRITE(ostream,'(8x,A9,I2)') "%segments", it
2210 : WRITE(ostream,'(8x,A37,F5.1,A1,I2,A13,F5.1,A2)') &
2211 0 : "\linethickness{2pt}\color{black}\put(",Cdag,",",ordo,"){\line(1,0){",102.d0-Cdag,"}}"
2212 0 : WRITE(ostream,'(8x,A7,I2,A13,F5.1,A2)') "\put(2,",ordo,"){\line(1,0){",C-102.d0,"}}"
2213 0 : WRITE(ostream,'(8x,A5)') "%Cdag"
2214 0 : WRITE(ostream,'(8x,A12)') "\color{blue}"
2215 0 : WRITE(ostream,'(8x,A5,F5.1,A1,I2,A14)') "\put(",Cdag,",",ordo,"){\circle*{1}}"
2216 0 : WRITE(ostream,'(8x,A2)') "%C"
2217 0 : WRITE(ostream,'(8x,A11)') "\color{red}"
2218 0 : WRITE(ostream,'(8x,A5,F5.1,A1,I2,A14)') "\put(",C-100.d0,",",ordo,"){\circle*{1}}"
2219 : END IF
2220 : END DO
2221 0 : IF ( tail .EQ. 0 .AND. this%particles(iflavor)%list(0,C_) .EQ. 0.d0 ) THEN
2222 0 : WRITE(ostream,'(8x,A9,I2)') "%segments", it
2223 0 : WRITE(ostream,'(8x,A39,I2,A18)') "\linethickness{2pt}\color{black}\put(2,",ordo,"){\line(1,0){100}}"
2224 : END IF
2225 : END DO
2226 0 : WRITE(ostream,'(4x,A13)') "\end{picture}"
2227 0 : WRITE(ostream,'(2x,A12)') "\end{figure}"
2228 0 : WRITE(ostream,'(2x,A17)') "\transduration{0}"
2229 0 : WRITE(ostream,'(A11)') "\end{frame}"
2230 0 : END SUBROUTINE ImpurityOperator_printLatex
2231 : !!***
2232 :
2233 : !!****f* ABINIT/m_ImpurityOperator/ImpurityOperator_occup_histo_time
2234 : !! NAME
2235 : !! ImpurityOperator_occup_histo_time
2236 : !!
2237 : !! SUBROUTINE
2238 : !! Compute histogrammes of occupations.
2239 : !!
2240 : !! COPYRIGHT
2241 : !! Copyright (C) 2013-2026 ABINIT group (B. Amadon, F. Gendron)
2242 : !! This file is distributed under the terms of the
2243 : !! GNU General Public License, see ~abinit/COPYING
2244 : !! or http://www.gnu.org/copyleft/gpl.txt .
2245 : !!
2246 : !! INPUTS
2247 : !! this=ImpurityOperator
2248 : !! histo=histogramme of occupations
2249 : !!
2250 : !! OUTPUT
2251 : !! ImpurityOperator_occup_histo_time=number of electrons
2252 : !!
2253 : !! SIDE EFFECTS
2254 : !!
2255 : !! NOTES
2256 : !!
2257 : !! SOURCE
2258 :
2259 3030000 : SUBROUTINE ImpurityOperator_occup_histo_time(this,histo,occupconfig,suscep,ntau,chi,chicharge,ntot,opt_histo,nspinor)
2260 :
2261 : !Arguments ------------------------------------
2262 : TYPE(ImpurityOperator), INTENT(IN) :: this
2263 : DOUBLE PRECISION, DIMENSION(:), INTENT(OUT) :: histo
2264 : DOUBLE PRECISION, DIMENSION(:), INTENT(OUT) :: occupconfig
2265 : DOUBLE PRECISION, DIMENSION(:,:), INTENT(OUT) :: suscep
2266 : INTEGER, INTENT(IN) :: ntau
2267 : DOUBLE PRECISION, DIMENSION(:,:), INTENT(OUT) :: chi
2268 : DOUBLE PRECISION, DIMENSION(:,:), INTENT(OUT) :: chicharge
2269 : DOUBLE PRECISION, DIMENSION(:), INTENT(OUT) :: ntot
2270 : !Local variables ------------------------------
2271 : DOUBLE PRECISION :: tau
2272 : INTEGER :: scanning, opt_histo,nspinor
2273 : INTEGER :: iflavor, itau,jtau,kdeltatau,noccup,iconfig,sumh,nmeas
2274 : INTEGER :: iflavor1, iflavor2
2275 3030000 : INTEGER, ALLOCATABLE, DIMENSION(:,:) :: occup
2276 3030000 : INTEGER, ALLOCATABLE, DIMENSION(:) :: occuptot
2277 3030000 : INTEGER, ALLOCATABLE, DIMENSION(:,:) :: spinup,spindn
2278 3030000 : INTEGER, ALLOCATABLE, DIMENSION(:) :: occupconfig_loc
2279 3030000 : DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: histo_loc
2280 : ! DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: histo_loc_config
2281 3030000 : DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: magmommat_orb
2282 3030000 : DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: magmommat_spin
2283 3030000 : DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: magmommat_tot
2284 3030000 : DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: mu_tmp
2285 : !-------------------------------------------------------------
2286 :
2287 :
2288 9090000 : MALLOC(occuptot,(1:ntau))
2289 9090000 : MALLOC(spinup,(1:3,1:ntau))
2290 6060000 : MALLOC(spindn,(1:3,1:ntau))
2291 12120000 : MALLOC(occup,(1:this%flavors,1:ntau))
2292 9090000 : MALLOC(occupconfig_loc,(2**this%flavors))
2293 9090000 : MALLOC(histo_loc,(1:this%flavors+1))
2294 49646550000 : occupconfig_loc=0
2295 : nmeas=0
2296 :
2297 154530000 : do itau=1,ntau
2298 151500000 : tau=float(itau-1)/float(ntau)*this%beta
2299 151500000 : occuptot(itau)=0
2300 606000000 : spinup(:,itau)=0
2301 606000000 : spindn(:,itau)=0
2302 : ! write(6,*) "tau",tau
2303 : iconfig=0
2304 2272500000 : do iflavor = 1, this%flavors
2305 2121000000 : occup(iflavor,itau)=0
2306 3809123900 : do scanning = 1, this%particles(iflavor)%tail
2307 : ! write(6,*) itau,iflavor,scanning
2308 : ! write(6,*) "tau",tau,this%particles(iflavor)%list(scanning,Cdag_),this%particles(iflavor)%list(scanning,C_)
2309 : ! write(6,*) "Hello Fred 2",tau,iflavor,this%particles(iflavor)%list(scanning,C_)-this%particles(iflavor)%list(scanning,Cdag_),this%beta
2310 :
2311 3809123900 : if(this%particles(iflavor)%list(scanning,C_)>this%beta.and.tau<this%particles(iflavor)%list(scanning,Cdag_)) then
2312 :
2313 129001423 : if(tau<(this%particles(iflavor)%list(scanning,C_)-this%beta).and.&
2314 : & tau>(this%particles(iflavor)%list(scanning,Cdag_)-this%beta)) then
2315 25001657 : occup(iflavor,itau)=occup(iflavor,itau)+1
2316 : endif
2317 :
2318 : else
2319 :
2320 1559122477 : if(tau<this%particles(iflavor)%list(scanning,C_).and.tau>this%particles(iflavor)%list(scanning,Cdag_)) then
2321 125750275 : occup(iflavor,itau)=occup(iflavor,itau)+1
2322 : endif
2323 :
2324 : endif
2325 :
2326 : enddo
2327 :
2328 : !full orbital
2329 2121000000 : if ( this%particles(iflavor)%list(0,C_) .eq. 0.d0 ) then
2330 : !write(6,*) "Yes",this%particles(iflavor)%list(0,C_)
2331 690500 : occup(iflavor,itau)=occup(iflavor,itau)+1
2332 : endif
2333 :
2334 2121000000 : occuptot(itau)= occuptot(itau) + occup(iflavor,itau)
2335 2121000000 : if(nspinor .eq. 1) then
2336 2121000000 : if(iflavor<this%flavors/2+1) THEN
2337 1060500000 : spinup(1,itau)= spinup(1,itau) + occup(iflavor,itau)
2338 1060500000 : if(iflavor==1.or.iflavor==2.or.iflavor==4.or.iflavor==6.or.iflavor==7.or.iflavor==9) THEN
2339 757500000 : spinup(2,itau)= spinup(2,itau) + occup(iflavor,itau)
2340 : else
2341 303000000 : spinup(3,itau)= spinup(3,itau) + occup(iflavor,itau)
2342 : !if(spinup(3,itau)>4) THEN
2343 : ! write(6,*) "Error",spinup(:,itau),occup(:,itau)
2344 : ! if(iflavor==1.or.iflavor==2.or.iflavor==4) THEN
2345 : ! write(6,*) iflavor,occup(iflavor,itau)
2346 : ! endif
2347 : ! stop
2348 : !endif
2349 : endif
2350 : else
2351 1060500000 : spindn(1,itau)= spindn(1,itau) + occup(iflavor,itau)
2352 1060500000 : if(iflavor==1.or.iflavor==2.or.iflavor==4.or.iflavor==6.or.iflavor==7.or.iflavor==9) THEN
2353 151500000 : spindn(2,itau)= spindn(2,itau) + occup(iflavor,itau)
2354 : else
2355 909000000 : spindn(3,itau)= spindn(3,itau) + occup(iflavor,itau)
2356 : !if(spindn(3,itau)>4) THEN
2357 : ! write(6,*) "Error spin",spindn(:,itau),occup(:,itau)
2358 : ! write(6,*) "Error occup",occup(:,itau)
2359 : ! if(iflavor==1.or.iflavor==2.or.iflavor==4) THEN
2360 : ! write(6,*) iflavor,occup(iflavor,itau)
2361 : ! endif
2362 : ! stop
2363 : !endif
2364 : endif
2365 : endif
2366 : else
2367 : !spin-orbit case (here only useful for chi_charge and f-elements)
2368 0 : if(iflavor < 7) then
2369 : !mj=5/2
2370 0 : spinup(2,itau) = spinup(2,itau) + occup(iflavor,itau)
2371 : !if(iflavor ==1.or.iflavor==2.or.iflavor==3.or.iflavor==4) then
2372 : ! spinup(2,itau) = spinup(2,itau) + occup(iflavor,itau)
2373 : !else
2374 : ! spinup(3,itau) = spinup(3,itau) + occup(iflavor,itau)
2375 : !end if
2376 : else
2377 : !mj=7/2
2378 0 : spinup(3,itau) = spindn(3,itau) + occup(iflavor,itau)
2379 : end if
2380 : end if
2381 :
2382 : ! === Construct index of configuration in base 10
2383 2272500000 : iconfig=iconfig+2**(iflavor-1)*occup(iflavor,itau)
2384 :
2385 : enddo
2386 :
2387 : ! === After the loop over flavor, iconfig has a meaning and can be used
2388 151500000 : occupconfig_loc(iconfig+1)= occupconfig_loc(iconfig+1)+1
2389 3030000 : nmeas=nmeas+1
2390 :
2391 : enddo
2392 :
2393 48480000 : histo_loc=0
2394 154530000 : do itau=1,ntau
2395 154530000 : histo_loc(occuptot(itau)+1)=histo_loc(occuptot(itau)+1)+1
2396 : enddo
2397 :
2398 : ! write(6,*)
2399 : ! write(6,*) "=== Histogram of occupations ===="
2400 48480000 : do noccup=1,this%flavors+1
2401 45450000 : histo_loc(noccup)=histo_loc(noccup)/float(ntau)*100.0
2402 : ! write(6,*) noccup-1, histo_loc(noccup)
2403 48480000 : histo(noccup)= histo(noccup) + histo_loc(noccup)
2404 : enddo
2405 : ! write(6,*) "================================="
2406 : ! write(6,*)
2407 :
2408 : ! write(6,*) "================================="
2409 3030000 : sumh=zero
2410 49646550000 : do iconfig=1,2**(this%flavors)
2411 : ! occupconfig_loc(iconfig)=occupconfig_loc(iconfig)/float(ntau)*100.0
2412 49643520000 : occupconfig(iconfig)=occupconfig(iconfig)+float(occupconfig_loc(iconfig))/float(ntau)*100.0
2413 : ! write(6,*) "one step",float(occupconfig_loc(iconfig))/float(ntau)*100.0
2414 49646550000 : sumh=sumh+occupconfig_loc(iconfig)
2415 : enddo
2416 : ! write(6,*) "sumh",sumh,ntau,nmeas
2417 :
2418 : !============================================================
2419 : ! Susceptibility Section
2420 : !============================================================
2421 3030000 : if(opt_histo .gt. 1) then
2422 0 : if(nspinor .eq. 1) then
2423 : ! == Scalar Spin Susceptibility
2424 0 : do itau=1,ntau
2425 : !tau=float(itau-1)/float(ntau)*this%beta
2426 : ! write(7735,*) float(itau-1)/float(ntau)*this%beta,spinup(itau),spindn(itau),(spinup(itau)-spindn(itau))**2
2427 : ! write(7736,*) float(itau-1)/float(ntau)*this%beta,(spinup(1,itau)-spindn(1,itau)),(spinup(2,itau)-spindn(2,itau)),(spinup(3,itau)-spindn(3,itau))
2428 0 : do jtau=1,ntau
2429 : !tauj=float(jtau-1)/float(ntau)*this%beta
2430 0 : kdeltatau=jtau-itau+1
2431 0 : if(jtau<itau) kdeltatau=kdeltatau+ntau
2432 0 : if(kdeltatau> ntau) write(std_out,*) "Warning kdeltatau"
2433 0 : suscep(1,kdeltatau)=suscep(1,kdeltatau)+float((spinup(1,jtau)-spindn(1,jtau)))*float((spinup(1,itau)-spindn(1,itau)))
2434 0 : suscep(2,kdeltatau)=suscep(2,kdeltatau)+float((spinup(2,jtau)-spindn(2,jtau)))*float((spinup(2,itau)-spindn(2,itau)))
2435 0 : suscep(3,kdeltatau)=suscep(3,kdeltatau)+float((spinup(3,jtau)-spindn(3,jtau)))*float((spinup(3,itau)-spindn(3,itau)))
2436 : ! write(6,*) "Su",suscep(kdeltatau),spinup(tau)-spindn(jtau),spinup(itau)-spindn(itau)
2437 : ! write(6,*) "Su",itau,jtau,kdeltatau
2438 : enddo
2439 : !write(7735,*) float(itau-1)/float(ntau)*this%beta,spinup(itau),spindn(itau),(spinup(itau)-spindn(itau))**2
2440 : !write(7736,*) float(itau-1)/float(ntau)*this%beta,(spinup(itau)-spindn(itau))**2
2441 : !write(7737,*) float(itau-1)/float(ntau)*this%beta,suscep(1)
2442 : enddo
2443 :
2444 : else
2445 : ! == Spin Orbit Susceptibility
2446 0 : MALLOC(magmommat_orb,(1:this%flavors,1:this%flavors))
2447 0 : magmommat_orb=this%Magmommat_orb
2448 0 : MALLOC(magmommat_spin,(1:this%flavors,1:this%flavors))
2449 0 : magmommat_spin=this%Magmommat_spin
2450 0 : MALLOC(magmommat_tot,(1:this%flavors,1:this%flavors))
2451 0 : magmommat_tot=this%Magmommat_tot
2452 0 : MALLOC(mu_tmp,(1:3,1:ntau))
2453 :
2454 : ! == Product of occupation matrix with magnetic moment matrix
2455 0 : do itau=1,ntau
2456 0 : mu_tmp(:,itau)=0
2457 0 : do iflavor1=1,this%flavors
2458 0 : do iflavor2=1,this%flavors
2459 0 : if(iflavor1==iflavor2) then
2460 0 : mu_tmp(1,itau) = mu_tmp(1,itau) + magmommat_tot(iflavor1,iflavor2)*occup(iflavor1,itau)
2461 0 : mu_tmp(2,itau) = mu_tmp(2,itau) + magmommat_orb(iflavor1,iflavor2)*occup(iflavor1,itau)
2462 0 : mu_tmp(3,itau) = mu_tmp(3,itau) + magmommat_spin(iflavor1,iflavor2)*occup(iflavor1,itau)
2463 : !write(6,*) itau, magmommat(iflavor1,iflavor2), mu_tmp(:,itau)/ntau
2464 : end if
2465 : end do
2466 : end do
2467 : end do
2468 :
2469 : ! == Correlation function of mu_tmp for magnetic susceptibility with SOC (Approach 1)
2470 0 : do itau=1,ntau
2471 0 : do jtau=1,ntau
2472 0 : kdeltatau=jtau-itau+1
2473 0 : if(jtau<itau) kdeltatau=kdeltatau+ntau
2474 0 : if(kdeltatau> ntau) write(std_out,*) "Warning kdeltatau"
2475 0 : chi(1,kdeltatau) = chi(1,kdeltatau) + (mu_tmp(1,itau))*(mu_tmp(1,jtau))
2476 0 : chi(2,kdeltatau) = chi(2,kdeltatau) + (mu_tmp(2,itau))*(mu_tmp(2,jtau))
2477 0 : chi(3,kdeltatau) = chi(3,kdeltatau) + (mu_tmp(3,itau))*(mu_tmp(3,jtau))
2478 : end do
2479 : end do
2480 :
2481 0 : FREE(mu_tmp)
2482 0 : FREE(magmommat_orb)
2483 0 : FREE(magmommat_spin)
2484 0 : FREE(magmommat_tot)
2485 : endif
2486 : endif
2487 :
2488 3030000 : if(opt_histo .gt. 2) then
2489 0 : if(nspinor .eq. 1) then
2490 : ! == Scalar Charge Susceptibility
2491 :
2492 0 : do itau = 1,ntau
2493 0 : ntot(1) = ntot(1) + occuptot(itau)
2494 0 : ntot(2) = ntot(2) + float(spinup(2,itau)+spindn(2,itau))
2495 0 : ntot(3) = ntot(3) + float(spinup(3,itau)+spindn(3,itau))
2496 : enddo
2497 :
2498 0 : do itau=1,ntau
2499 0 : do jtau=1,ntau
2500 0 : kdeltatau=jtau-itau+1
2501 0 : if(jtau<itau) kdeltatau=kdeltatau+ntau
2502 0 : if(kdeltatau> ntau) write(std_out,*) "Warning kdeltatau"
2503 0 : chicharge(1,kdeltatau)=chicharge(1,kdeltatau)+float((spinup(1,jtau)+spindn(1,jtau)))*float((spinup(1,itau)+spindn(1,itau)))
2504 0 : chicharge(2,kdeltatau)=chicharge(2,kdeltatau)+float((spinup(2,jtau)+spindn(2,jtau)))*float((spinup(2,itau)+spindn(2,itau)))
2505 0 : chicharge(3,kdeltatau)=chicharge(3,kdeltatau)+float((spinup(3,jtau)+spindn(3,jtau)))*float((spinup(3,itau)+spindn(3,itau)))
2506 : enddo
2507 : enddo
2508 :
2509 : else
2510 : ! == Spin-orbit Charge Susceptibility
2511 : ! ntot(1) = Full occuptation, ntot(2) = mj_5/2, ntot(3) = mj_7/2
2512 0 : do itau = 1,ntau
2513 0 : ntot(1) = ntot(1) + occuptot(itau)
2514 0 : ntot(2) = ntot(2) + float(spinup(2,itau))
2515 0 : ntot(3) = ntot(3) + float(spinup(3,itau))
2516 : enddo
2517 :
2518 0 : do itau=1,ntau
2519 0 : do jtau=1,ntau
2520 0 : kdeltatau=jtau-itau+1
2521 0 : if(jtau<itau) kdeltatau=kdeltatau+ntau
2522 0 : if(kdeltatau> ntau) write(std_out,*) "Warning kdeltatau"
2523 0 : chicharge(1,kdeltatau)=chicharge(1,kdeltatau)+float(occuptot(jtau))*float(occuptot(itau))
2524 0 : chicharge(2,kdeltatau)=chicharge(2,kdeltatau)+float(spinup(2,jtau))*float(spindn(2,itau))
2525 0 : chicharge(3,kdeltatau)=chicharge(3,kdeltatau)+float(spinup(3,jtau))*float(spinup(3,itau))
2526 : enddo
2527 : enddo
2528 : end if
2529 : endif
2530 :
2531 3030000 : FREE(occup)
2532 3030000 : FREE(occupconfig_loc)
2533 3030000 : FREE(histo_loc)
2534 3030000 : FREE(occuptot)
2535 3030000 : FREE(spinup)
2536 3030000 : FREE(spindn)
2537 :
2538 :
2539 3030000 : END SUBROUTINE ImpurityOperator_occup_histo_time
2540 : !!***
2541 :
2542 : !!****f* ABINIT/m_ImpurityOperator/ImpurityOperator_setMagmommat
2543 : !! NAME
2544 : !! ImpurityOperator_setMagmommat
2545 : !!
2546 : !! FUNCTION
2547 : !! Set directly the Magnetic moment this
2548 : !!
2549 : !! COPYRIGHT
2550 : !! Copyright (C) 2013-2026 ABINIT group (F. Gendron)
2551 : !! This file is distributed under the terms of the
2552 : !! GNU General Public License, see ~abinit/COPYING
2553 : !! or http://www.gnu.org/copyleft/gpl.txt .
2554 : !!
2555 : !! INPUTS
2556 : !! this=ImpurtityOperator
2557 : !! matU=interaction this
2558 : !!
2559 : !! OUTPUT
2560 : !!
2561 : !! SIDE EFFECTS
2562 : !!
2563 : !! NOTES
2564 : !!
2565 : !! SOURCE
2566 :
2567 49 : SUBROUTINE ImpurityOperator_setMagmommat(this, Magmom_orb, Magmom_spin, Magmom_tot)
2568 :
2569 : !Arguments ------------------------------------
2570 : TYPE(ImpurityOperator), INTENT(INOUT) :: this
2571 : DOUBLE PRECISION, DIMENSION(:,:), INTENT(IN ) :: Magmom_orb
2572 : DOUBLE PRECISION, DIMENSION(:,:), INTENT(IN ) :: Magmom_spin
2573 : DOUBLE PRECISION, DIMENSION(:,:), INTENT(IN ) :: Magmom_tot
2574 : !Local-----------------------------------------
2575 : INTEGER :: iflavor1
2576 : INTEGER :: iflavor2
2577 :
2578 : !debug
2579 : ! write(6,*) "Inside Impurity_set Magmommat"
2580 : !
2581 : ! do iflavor1=1,10
2582 : ! do iflavor2=1,10
2583 : ! if(iflavor1==iflavor2) THEN
2584 : ! write(6,*) iflavor1, iflavor2, Magmom(iflavor1,iflavor2)
2585 : ! end if
2586 : ! end do
2587 : ! end do
2588 :
2589 567 : DO iflavor1 = 1, this%flavors
2590 6363 : DO iflavor2 = 1, this%flavors
2591 5796 : this%Magmommat_orb(iflavor1,iflavor2) = Magmom_orb(iflavor1,iflavor2)
2592 5796 : this%Magmommat_spin(iflavor1,iflavor2) = Magmom_spin(iflavor1,iflavor2)
2593 6314 : this%Magmommat_tot(iflavor1,iflavor2) = Magmom_tot(iflavor1,iflavor2)
2594 : END DO
2595 : END DO
2596 :
2597 49 : END SUBROUTINE ImpurityOperator_setMagmommat
2598 : !!***
2599 0 : END MODULE m_ImpurityOperator
2600 : !!***
|