Branch data Line data Source code
1 : :
2 : : #if defined HAVE_CONFIG_H
3 : : #include "config.h"
4 : : #endif
5 : :
6 : : !!****m* ABINIT/m_BathOperatoroffdiagComplex
7 : : !! NAME
8 : : !! m_BathOperatoroffdiagComplex
9 : : !!
10 : : !! FUNCTION
11 : : !! Manage all stuff related to the bath for the
12 : : !! simgle Anderson Impurity Model
13 : : !!
14 : : !! COPYRIGHT
15 : : !! Copyright (C) 2013-2025 ABINIT group (J. Bieder, J. Denier, B. Amadon)
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 : : MODULE m_BathOperatoroffdiagComplex
26 : : USE m_MatrixHybComplex
27 : : USE m_VectorComplex
28 : : USE m_Vector
29 : : USE m_VectorInt
30 : : USE m_Global
31 : : USE m_ListCdagC
32 : : IMPLICIT NONE
33 : :
34 : : ! subroutines
35 : : public :: BathOperatoroffdiagComplex_init
36 : : public :: BathOperatoroffdiagComplex_reset
37 : : public :: BathOperatoroffdiagComplex_activateParticle
38 : : public :: BathOperatoroffdiagComplex_setMAdd
39 : : public :: BathOperatoroffdiagComplex_setMRemove
40 : : public :: BathOperatoroffdiagComplex_swap
41 : : public :: BathOperatoroffdiagComplex_initF
42 : : public :: BathOperatoroffdiagComplex_setF
43 : : public :: BathOperatoroffdiagComplex_printF
44 : : public :: BathOperatoroffdiagComplex_printM
45 : : public :: BathOperatoroffdiagComplex_destroy
46 : : public :: BathOperatoroffdiagComplex_doCheck
47 : : public :: BathOperatoroffdiagComplex_checkM
48 : :
49 : : ! functions
50 : : ! public :: BathOperatoroffdiagComplex_hybrid
51 : : public :: BathOperatoroffdiagComplex_getDetAdd
52 : : public :: BathOperatoroffdiagComplex_getDetRemove
53 : : public :: BathOperatoroffdiagComplex_getDetF
54 : : public :: BathOperatoroffdiagComplex_getError
55 : : !!***
56 : :
57 : : !!****t* m_BathOperatoroffdiagComplex/BathOperatoroffdiagComplex
58 : : !! NAME
59 : : !! BathOperatoroffdiagComplex
60 : : !!
61 : : !! FUNCTION
62 : : !! This structured datatype contains the necessary data
63 : : !!
64 : : !! COPYRIGHT
65 : : !! Copyright (C) 2013-2025 ABINIT group (J. Bieder)
66 : : !! This file is distributed under the terms of the
67 : : !! GNU General Public License, see ~abinit/COPYING
68 : : !! or http://www.gnu.org/copyleft/gpl.txt .
69 : : !!
70 : : !! SOURCE
71 : :
72 : : TYPE BathOperatoroffdiagComplex
73 : : LOGICAL :: set = .FALSE.
74 : : ! True if the BathOperatoroffdiagComplex is initialized in BathOperatoroffdiagComplex_init
75 : :
76 : : LOGICAL :: MAddFlag = .FALSE.
77 : : ! Set to true if we can compute a new M (see updateDetXX) (ie in
78 : : ! BathOperatoroffdiagComplex_getDetAdd)
79 : :
80 : : LOGICAL :: MRemoveFlag = .FALSE.
81 : : ! Set to true if we can compute a new M (see updateDetXX) (ie in
82 : : ! BathOperatoroffdiagComplex_getDetRemove)
83 : :
84 : : LOGICAL :: antiShift = .FALSE.
85 : : ! shift when M is updated with antiseg
86 : :
87 : : LOGICAL :: doCheck = .FALSE.
88 : : ! TRUE is checks are activated
89 : :
90 : : INTEGER :: opt_nondiag = 0
91 : : ! if opt_nondiag = 1 F is non diagonal.
92 : :
93 : : INTEGER :: flavors
94 : : ! number of flavors
95 : : ! if opt_nondiag = 0 , flavors= number of flavor
96 : : ! if opt_nondiag = 1 , flavors= 1
97 : :
98 : : INTEGER :: activeFlavor
99 : : ! Active flavor on which a segment is added/suppressed...
100 : :
101 : : INTEGER :: samples
102 : : ! Number of time slices (given in the input file)
103 : :
104 : : INTEGER :: sizeHybrid
105 : : ! Number of time slices (given in the input file) + 1 (=qmc_l+1)
106 : :
107 : : INTEGER :: updatePosRow
108 : : ! Gives the position of new Row to add
109 : : ! Modified in BathOperatoroffdiagComplex_getDetAdd and BathOperatoroffdiagComplex_getDetRemove
110 : : ! could be the Row in the Full matrix for the non diag implementation
111 : :
112 : : INTEGER :: updatePosCol
113 : : ! Gives the position of new Col to add
114 : : ! Modified in BathOperatoroffdiagComplex_getDetAdd and BathOperatoroffdiagComplex_getDetRemove
115 : :
116 : : INTEGER :: iTech
117 : : ! iTech is an integer which precise the technics used to compute the
118 : : ! Green's function (in time or frequency)
119 : :
120 : : INTEGER :: sumtails
121 : : ! size of the full F matrix (sums of tails(iflavor) over iflavor)
122 : :
123 : : INTEGER, ALLOCATABLE, DIMENSION(:) :: tails
124 : : ! tails(iflavor) is the current number of segments for the flavor iflavor
125 : :
126 : : INTEGER, ALLOCATABLE, DIMENSION(:) :: Fshift
127 : : ! Fshift(iflavor) is the sum of number of segments for all flavors iflavor2
128 : : ! such that iflavor< iflavor
129 : : ! It is thus the shift in the F matrix to have the first segment of the flavor
130 : : ! iflavor
131 : : ! Fshift(nflavor+1) is the total nb of tails (=sumtails)
132 : :
133 : : DOUBLE PRECISION :: beta
134 : : ! Inverse of Temperature
135 : : !
136 : :
137 : : DOUBLE PRECISION :: dt
138 : : ! dt=beta/samples
139 : :
140 : : DOUBLE PRECISION :: inv_dt
141 : : ! inv_dt=1/dt
142 : :
143 : : COMPLEX(KIND=8), ALLOCATABLE, DIMENSION(:,:,:) :: F ! qmc_l+2,Flavors
144 : : ! Hybridization function F(1:op%sizeHybrid+1,1:flavors,1:flavors)
145 : :
146 : : COMPLEX(KIND=8) :: S
147 : : ! Sherman Morrison notations
148 : :
149 : : COMPLEX(KIND=8) :: Stau
150 : : ! Sherman Morrison notations
151 : :
152 : : COMPLEX(KIND=8) :: Stilde
153 : : ! Sherman Morrison notations
154 : :
155 : : TYPE(VectorComplex) :: R
156 : : ! Sherman Morrison notations R%vec(size).
157 : : ! computed for each flavor (As matrices are made of Blocks for each
158 : : ! flavor because the code is restricted to diagonal F matrices)
159 : :
160 : : TYPE(VectorComplex) :: Q
161 : : ! Sherman Morrison notations
162 : : ! computed for each flavor (As matrices are made of Blocks for each
163 : : ! flavor because the code is restricted to diagonal F matrices)
164 : :
165 : : TYPE(Vector) :: Rtau
166 : : ! Sherman Morrison notations
167 : : ! Rtau gives the time length for each elements of R
168 : : ! computed for each flavor (As matrices are made of Blocks for each
169 : : ! flavor because the code is restricted to diagonal F matrices)
170 : :
171 : : TYPE(Vector) :: Qtau
172 : : ! Sherman Morrison notations
173 : : ! Qtau gives the time length for each elements of Q
174 : : ! computed for each flavor (As matrices are made of Blocks for each
175 : : ! flavor because the code is restricted to diagonal F matrices)
176 : :
177 : : TYPE(MatrixHybComplex) :: M ! Flavors
178 : : ! inverse of Hybridization matrix M%mat(global_size,global_size)
179 : : ! contains the value of the hybridization for all flavor and segments times,
180 : : ! the times (mat_tau), and possibly the
181 : : ! frequency
182 : :
183 : : TYPE(MatrixHybComplex) :: M_update ! Flavors
184 : : ! used in BathOperatoroffdiagComplex_getdetF and in BathOperatoroffdiagComplex_checkM
185 : : ! for checks
186 : :
187 : : !#ifdef CTQMC_CHECK
188 : : INTEGER :: checkNumber
189 : : DOUBLE PRECISION :: meanError
190 : : ! TYPE(ListCdagC) :: ListCdagC
191 : : !#endif
192 : : END TYPE BathOperatoroffdiagComplex
193 : : !!***
194 : :
195 : : CONTAINS
196 : : !!***
197 : :
198 : : !!****f* ABINIT/m_BathOperatoroffdiagComplex/BathOperatoroffdiagComplex_init
199 : : !! NAME
200 : : !! BathOperatoroffdiagComplex_init
201 : : !!
202 : : !! FUNCTION
203 : : !! Initialize and allocate data
204 : : !!
205 : : !! COPYRIGHT
206 : : !! Copyright (C) 2013-2025 ABINIT group (J. Bieder)
207 : : !! This file is distributed under the terms of the
208 : : !! GNU General Public License, see ~abinit/COPYING
209 : : !! or http://www.gnu.org/copyleft/gpl.txt .
210 : : !!
211 : : !! INPUTS
212 : : !! op=bath object
213 : : !! flavors=numbers of flavors we have (including spin)
214 : : !! samples=Time slices in the input file
215 : : !! beta=inverse temperature
216 : : !! iTech=imaginary time or frequencies
217 : : !! It is imposes to imaginary time
218 : : !!
219 : : !! OUTPUT
220 : : !!
221 : : !! SIDE EFFECTS
222 : : !!
223 : : !! NOTES
224 : : !!
225 : : !! SOURCE
226 : :
227 : 0 : SUBROUTINE BathOperatoroffdiagComplex_init(op, flavors, samples, beta, iTech,opt_nondiag)
228 : :
229 : : !Arguments ------------------------------------
230 : : TYPE(BathOperatoroffdiagComplex), INTENT(INOUT) :: op
231 : : INTEGER , INTENT(IN ) :: flavors
232 : : INTEGER , INTENT(IN ) :: samples
233 : : INTEGER , INTENT(IN ) :: opt_nondiag
234 : : DOUBLE PRECISION , INTENT(IN ) :: beta
235 : : !Local variables ------------------------------
236 : : INTEGER , INTENT(IN ) :: iTech
237 : : !INTEGER :: it
238 : :
239 : 0 : op%MAddFlag = .FALSE.
240 : 0 : op%MRemoveFlag = .FALSE.
241 : 0 : op%flavors = flavors
242 : 0 : op%opt_nondiag = opt_nondiag
243 : 0 : op%beta = beta
244 : 0 : op%samples = samples
245 : 0 : op%sizeHybrid = samples + 1
246 : 0 : op%dt = beta / DBLE(samples)
247 : 0 : op%inv_dt = DBLE(samples) / beta
248 : 0 : op%activeFlavor= 0
249 : 0 : op%updatePosRow = 0
250 : 0 : op%updatePosCol = 0
251 : 0 : op%iTech = iTech
252 : : !#ifdef CTQMC_CHECK
253 : 0 : op%checkNumber = 0
254 : 0 : op%meanError = 0.d0
255 : 0 : op%doCheck = .FALSE.
256 : : !#endif
257 : :
258 [ # # ]: 0 : FREEIF(op%F)
259 [ # # # # : 0 : MALLOC(op%F,(1:op%sizeHybrid+1,1:flavors,1:flavors))
# # # # #
# # # # #
# # # # #
# # # ]
260 [ # # ]: 0 : DT_FREEIF(op%tails)
261 : : #ifdef FC_LLVM
262 : : ! LLVM 16 doesn't recognize this macro here
263 : : DT_MALLOC(op%tails, (1:op%flavors))
264 : : #else
265 [ # # # # : 0 : DT_MALLOC(op%tails,(1:op%flavors))
# # # # #
# # # #
# ]
266 : : #endif
267 [ # # ]: 0 : op%tails=0
268 [ # # ]: 0 : DT_FREEIF(op%Fshift)
269 : : #ifdef FC_LLVM
270 : : ! LLVM 16 doesn't recognize this macro here
271 : : DT_MALLOC(op%Fshift, (1:op%flavors+1))
272 : : #else
273 [ # # # # : 0 : DT_MALLOC(op%Fshift,(1:op%flavors+1))
# # # # #
# # # #
# ]
274 : : #endif
275 [ # # ]: 0 : op%Fshift=0
276 : :
277 : 0 : CALL VectorComplex_init(op%R,100*op%flavors)
278 : 0 : CALL VectorComplex_init(op%Q,100*op%flavors)
279 : 0 : CALL Vector_init(op%Rtau,100*op%flavors)
280 : 0 : CALL Vector_init(op%Qtau,100*op%flavors)
281 : :
282 : 0 : CALL MatrixHybComplex_init(op%M,op%iTech,size=Global_SIZE*op%flavors,Wmax=samples) !FIXME Should be consistent with ListCagC
283 : 0 : CALL MatrixHybComplex_init(op%M_update,op%iTech,size=Global_SIZE*op%flavors,Wmax=samples) !FIXME Should be consistent with ListCagC
284 [ # # # # : 0 : op%F = cmplx(0.d0,0.d0,kind=8)
# # ]
285 : 0 : op%set = .TRUE.
286 : :
287 : 0 : END SUBROUTINE BathOperatoroffdiagComplex_init
288 : : !!***
289 : :
290 : : !!****f* ABINIT/m_BathOperatoroffdiagComplex/BathOperatoroffdiagComplex_reset
291 : : !! NAME
292 : : !! BathOperatoroffdiagComplex_reset
293 : : !!
294 : : !! FUNCTION
295 : : !! Reset all internal variables
296 : : !!
297 : : !! COPYRIGHT
298 : : !! Copyright (C) 2013-2025 ABINIT group (J. Bieder)
299 : : !! This file is distributed under the terms of the
300 : : !! GNU General Public License, see ~abinit/COPYING
301 : : !! or http://www.gnu.org/copyleft/gpl.txt .
302 : : !!
303 : : !! INPUTS
304 : : !! op=bath operator to reset
305 : : !!
306 : : !! OUTPUT
307 : : !!
308 : : !! SIDE EFFECTS
309 : : !!
310 : : !! NOTES
311 : : !!
312 : : !! SOURCE
313 : :
314 : 0 : SUBROUTINE BathOperatoroffdiagComplex_reset(op)
315 : :
316 : : !Arguments ------------------------------------
317 : : TYPE(BathOperatoroffdiagComplex), INTENT(INOUT) :: op
318 : : !Local variables ------------------------------
319 : : INTEGER :: iflavor
320 : 0 : op%MAddFlag = .FALSE.
321 : 0 : op%MRemoveFlag = .FALSE.
322 : 0 : op%activeFlavor = 0
323 : 0 : op%updatePosRow = 0
324 : 0 : op%updatePosCol = 0
325 : : !#ifdef CTQMC_CHECK
326 : 0 : op%checkNumber = 0
327 : 0 : op%meanError = 0.d0
328 : 0 : op%sumtails = 0
329 : : !#endif
330 : 0 : op%doCheck = .FALSE.
331 : 0 : CALL VectorComplex_clear(op%R)
332 : 0 : CALL VectorComplex_clear(op%Q)
333 : 0 : CALL Vector_clear(op%Rtau)
334 : 0 : CALL Vector_clear(op%Qtau)
335 : :
336 : 0 : CALL MatrixHybComplex_clear(op%M) !FIXME Should be consistent with ListCagC
337 [ # # # # : 0 : op%F = cmplx(0.d0,0.d0,kind=8)
# # ]
338 [ # # ]: 0 : do iflavor=1,op%flavors
339 : 0 : op%tails(iflavor)=0
340 : 0 : op%Fshift(iflavor)=0
341 : : enddo
342 : :
343 : 0 : END SUBROUTINE BathOperatoroffdiagComplex_reset
344 : : !!***
345 : :
346 : : !!****f* ABINIT/m_BathOperatoroffdiagComplex/BathOperatoroffdiagComplex_activateParticle
347 : : !! NAME
348 : : !! BathOperatoroffdiagComplex_activateParticle
349 : : !!
350 : : !! FUNCTION
351 : : !! Just save on wicht flavor we are working
352 : : !! It is better to use the macro defined in defs.h
353 : : !!
354 : : !! COPYRIGHT
355 : : !! Copyright (C) 2013-2025 ABINIT group (J. Bieder)
356 : : !! This file is distributed under the terms of the
357 : : !! GNU General Public License, see ~abinit/COPYING
358 : : !! or http://www.gnu.org/copyleft/gpl.txt .
359 : : !!
360 : : !! INPUTS
361 : : !! op=bath operator
362 : : !! flavor=the flavor to activate
363 : : !!
364 : : !! OUTPUT
365 : : !!
366 : : !! SIDE EFFECTS
367 : : !!
368 : : !! NOTES
369 : : !!
370 : : !! SOURCE
371 : :
372 : 0 : SUBROUTINE BathOperatoroffdiagComplex_activateParticle(op,flavor)
373 : :
374 : : !Arguments ------------------------------------
375 : : TYPE(BathOperatoroffdiagComplex), INTENT(INOUT) :: op
376 : : !Local variables ------------------------------
377 : : INTEGER , INTENT(IN ) :: flavor
378 : :
379 [ # # ]: 0 : IF ( flavor .GT. op%flavors ) &
380 : 0 : CALL ERROR("BathOperatoroffdiagComplex_activateParticle : out of range ")
381 [ # # ]: 0 : IF ( op%set .EQV. .TRUE. ) THEN
382 : 0 : op%activeFlavor = flavor
383 : 0 : op%MAddFlag = .FALSE.
384 : 0 : op%MRemoveFlag = .FALSE.
385 : : ELSE
386 : 0 : CALL ERROR("BathOperatoroffdiagComplex_activateParticle : not allocated ")
387 : : END IF
388 : 0 : END SUBROUTINE BathOperatoroffdiagComplex_activateParticle
389 : : !!***
390 : :
391 : : !!****f* ABINIT/m_BathOperatoroffdiagComplex/BathOperatoroffdiagComplex_getDetAdd
392 : : !! NAME
393 : : !! BathOperatoroffdiagComplex_getDetAdd
394 : : !!
395 : : !! FUNCTION
396 : : !! Compute the determinant ratio when a (anti)segment
397 : : !! is trying to be added and store some array for setMAdd
398 : : !!
399 : : !! COPYRIGHT
400 : : !! Copyright (C) 2013-2025 ABINIT group (J. Bieder)
401 : : !! This file is distributed under the terms of the
402 : : !! GNU General Public License, see ~abinit/COPYING
403 : : !! or http://www.gnu.org/copyleft/gpl.txt .
404 : : !!
405 : : !! INPUTS
406 : : !! op=bath operator
407 : : !! CdagC_1=segment to be added
408 : : !! position=ordered position of the Cdag time
409 : : !! particle=full list of CdagC for activeFlavor
410 : : !!
411 : : !! OUTPUT
412 : : !! BathOperatoroffdiagComplex_getDetAdd=the det
413 : : !!
414 : : !! SIDE EFFECTS
415 : : !!
416 : : !! NOTES
417 : : !!
418 : : !! SOURCE
419 [ # # # # ]: 0 : COMPLEX(KIND=8) FUNCTION BathOperatoroffdiagComplex_getDetAdd(op,CdagC_1, position, particle)
420 : :
421 : : !Arguments ------------------------------------
422 : : TYPE(BathOperatoroffdiagComplex) , INTENT(INOUT) :: op
423 : : DOUBLE PRECISION, DIMENSION(1:2), INTENT(IN ) :: CdagC_1
424 : : INTEGER , INTENT(IN ) :: position
425 : : TYPE(ListCdagC), INTENT(IN ) :: particle(:)
426 : : !Local variables-------------------------------
427 : : INTEGER :: it1
428 : : INTEGER :: it2
429 : : INTEGER :: it3,iflavor,iflavora,iflavorb
430 : : INTEGER :: iflavorbegin,iflavorend
431 : : INTEGER :: tail,tailbegin,tailend
432 : : INTEGER :: tcheck
433 : : INTEGER :: new_tail
434 : : DOUBLE PRECISION :: C
435 : : DOUBLE PRECISION :: Cbeta
436 : : DOUBLE PRECISION :: Cibeta
437 : : DOUBLE PRECISION :: Cdag
438 : : DOUBLE PRECISION :: Cdagbeta
439 : : DOUBLE PRECISION :: beta
440 : : COMPLEX(KIND=8) :: ratio
441 : : DOUBLE PRECISION :: time
442 : : COMPLEX(KIND=8) :: timec
443 : : ! TYPE(CdagC) , POINTER, DIMENSION(:) :: list => NULL()
444 : : #include "BathOperatoroffdiagComplex_hybrid.h"
445 : :
446 : 0 : op%antiShift = .FALSE.
447 : 0 : beta = op%beta
448 : 0 : C = CdagC_1(C_)
449 : : ! Cbeta = C.MOD.beta
450 [ # # ]: 0 : MODCYCLE(C,beta,Cbeta)
451 : 0 : Cdag = CdagC_1(Cdag_)
452 : : ! cdagbeta = Cdag.MOD.beta
453 [ # # ]: 0 : MODCYCLE(Cdag,beta,Cdagbeta)
454 : : ! IF ( Cdag .GE. beta ) &
455 : : ! CALL ERROR("BathOperatoroffdiagComplex_getDetAdd : bad case ... ")
456 [ # # ]: 0 : IF ( op%activeFlavor .LE. 0 ) &
457 : 0 : CALL ERROR("BathOperatoroffdiagComplex_getDetAdd : no active hybrid function ")
458 : :
459 [ # # ]: 0 : IF ( size(particle)/=op%flavors ) &
460 : 0 : CALL ERROR("BathOperatoroffdiagComplex_getDetAdd : size of particle is erroneous ")
461 : :
462 : : ! tail is now the complete size of the F matrix Fshift(nflavors+1)
463 : 0 : tail = op%sumtails
464 : 0 : new_tail = tail+1
465 : : ! list => particle%list
466 : :
467 [ # # ]: 0 : if(op%opt_nondiag==1) then
468 : 0 : iflavorbegin = 1
469 : 0 : iflavorend = op%flavors
470 : 0 : tailbegin = 1
471 : 0 : tailend = tail
472 : : else
473 : : !sui!write(6,*) "Bathoperator opt_nondiag=0"
474 : 0 : iflavorbegin = op%activeflavor
475 : 0 : iflavorend = op%activeflavor
476 : 0 : tailbegin = op%Fshift(op%activeflavor)+1
477 : 0 : tailend = op%Fshift(op%activeflavor)+op%tails(op%activeflavor)
478 : : endif
479 : :
480 : : IF ( ((C .GT. Cdag) .AND. (position .EQ. -1)) & ! Segment added at the end of the segment
481 [ # # # # : 0 : .OR. ((C .LT. Cdag) .AND. (tail .EQ. 0))) THEN ! empty orbital case: only adding a segment is possible
# # # # ]
482 : : ! If ones add a segment to an empty orbital or a segment at the end
483 : : ! of a segment, then:
484 : 0 : op%updatePosRow = op%tails(op%activeFlavor) + 1
485 : 0 : op%updatePosCol = op%tails(op%activeFlavor) + 1
486 : : ELSE
487 : : ! For all the other cases, ABS(position) is the true position.
488 : 0 : op%updatePosRow = ABS(position)
489 : 0 : op%updatePosCol = ABS(position)
490 : : END IF
491 : : !write(6,*) " BathOperatoroffdiagComplex_getDetAdd : op%updatePosRow",op%updatePosRow
492 : : !write(6,*) " BathOperatoroffdiagComplex_getDetAdd : op%updatePosCol",op%updatePosCol
493 : : !write(6,*) " BathOperatoroffdiagComplex_getDetAdd : C,Cdag",C,Cdag
494 : :
495 [ # # # # ]: 0 : IF ( C .LT. Cdag .AND. op%tails(op%activeFlavor) .GT. 0) THEN ! only if an antisegment is added
496 : : ! ratio = -ratio
497 : 0 : op%updatePosRow = (op%updatePosRow + 1) !position in [1;tail]
498 : : ! If the antisegment created is such that a segment with tcdagger> tc
499 : : ! is suppressed
500 : : !write(6,*) " BathOperatoroffdiagComplex_getDetAdd : op%updatePosRow",op%updatePosRow
501 : : !write(6,*) " BathOperatoroffdiagComplex_getDetAdd : op%updatePosCol",op%updatePosCol
502 [ # # ]: 0 : IF ( Cdagbeta .LT. particle(op%activeFlavor)%list(op%updatePosCol,Cdag_) ) op%antiShift = .TRUE.
503 : : END IF
504 : :
505 : : ! CALL VectorComplex_setSize(op%R,tail)
506 : : ! CALL VectorComplex_setSize(op%Q,tail)
507 [ # # ]: 0 : VectorComplex_QuickResize(op%R,new_tail)
508 [ # # ]: 0 : VectorComplex_QuickResize(op%Q,new_tail)
509 [ # # ]: 0 : Vector_QuickResize(op%Rtau,new_tail)
510 [ # # ]: 0 : Vector_QuickResize(op%Qtau,new_tail)
511 : :
512 : : ! This loop compute all Row and Col except op%updatePosRow
513 : 0 : tcheck=0
514 [ # # ]: 0 : DO iflavor = iflavorbegin,iflavorend
515 : : !write(6,*) " BathOperatoroffdiagComplex_getDetAdd : tails(iflavor)",iflavor,op%tails(iflavor)
516 [ # # ]: 0 : DO it1 = 1, op%tails(iflavor)
517 : 0 : tcheck=tcheck+1
518 : 0 : it2 = it1
519 : 0 : it3 = it1
520 [ # # ]: 0 : IF ( iflavor .GE. op%activeFlavor ) THEN
521 : 0 : it2 = it1 + 1
522 : 0 : it3 = it1 + 1
523 [ # # # # ]: 0 : IF ( iflavor .EQ. op%activeFlavor .AND. it1 .LT. op%updatePosRow ) it2 = it1
524 [ # # # # ]: 0 : IF ( iflavor .EQ. op%activeFlavor .AND. it1 .LT. op%updatePosCol ) it3 = it1
525 : : !it2 = it1 + ( 1+SIGN(1,it1-op%updatePosRow) )/2
526 : : !it3 = it1 + ( 1+SIGN(1,it1-op%updatePoscol) )/2
527 : : ! if it1>=op%updatePosRow and iflavor> activeflavor, then it2=it1+1
528 : : ! if it1< op%updatePosRow and iflavor> activeflavor, then it2=it1
529 : : END IF
530 : :
531 : : !!write(6,*) size(op%Rtau%vec)
532 : : !!write(6,*) size(particle(iflavor)%list,1)
533 : : !!write(6,*) size(particle(iflavor)%list,2)
534 : : !!write(6,*) size(op%Fshift)
535 : : !!write(6,*) it1,Cdag_,op%Fshift(iflavor)+it2
536 : 0 : op%Rtau%vec(op%Fshift(iflavor)+it2)= C - particle(iflavor)%list(it1,Cdag_)
537 : : ! the following line happend only for nondiag case
538 [ # # ]: 0 : IF(op%Rtau%vec(op%Fshift(iflavor)+it2) .GT. beta) op%Rtau%vec(op%Fshift(iflavor)+it2)=op%Rtau%vec(op%Fshift(iflavor)+it2)-beta
539 : : !op%Rtau%vec(it1)= C - particle%list(it1,Cdag_)
540 : 0 : time = Cbeta - particle(iflavor)%list(it1,Cdag_)
541 [ # # ]: 0 : if(op%Rtau%vec(op%Fshift(iflavor)+it2)>beta) then
542 : : !write(6,*) "Rtau sup beta",op%Rtau%vec(op%Fshift(iflavor)+it2),C,particle(iflavor)%list(it1,Cdag_)
543 : : !write(6,*) time
544 : 0 : stop
545 : : endif
546 : :
547 : : ! "BathOperatoroffdiagComplex_hybrid" interpolates between known values of F for the
548 : : ! selected time.
549 : 0 : iflavora=iflavor
550 [ # # ]: 0 : iflavorb=op%activeFlavor
551 : : #include "BathOperatoroffdiagComplex_hybrid"
552 : :
553 : 0 : op%R%vec(op%Fshift(iflavor)+it1) = hybrid
554 : : ! op%R%vec(it) = BathOperatoroffdiagComplex_hybrid(op, Cbeta - list(it)%Cdag)
555 : : ! Cibeta = list(it)%C.MOD.beta
556 [ # # ]: 0 : MODCYCLE(particle(iflavor)%list(it1,C_),beta,Cibeta)
557 : 0 : time = Cibeta - Cdagbeta
558 : 0 : op%Qtau%vec(op%Fshift(iflavor)+it3)= time
559 : : !op%Qtau%vec(it1)= time
560 : :
561 : 0 : iflavora=op%activeFlavor
562 [ # # ]: 0 : iflavorb=iflavor
563 : : #include "BathOperatoroffdiagComplex_hybrid"
564 : 0 : op%Q%vec(op%Fshift(iflavor)+it1) = hybrid
565 : :
566 : : !op%Q%vec(it3) = hybrid
567 : : ! Q(it) = BathOperatoroffdiagComplex_hybrid(op, Cibeta - Cdagbeta)
568 : : END DO
569 : : END DO
570 [ # # ]: 0 : if(tcheck.ne.tail) then
571 : : !write(6,*) " PRB in the loop tail tcheck",tail,tcheck
572 : 0 : stop
573 : : endif
574 : :
575 : : ! Compute S
576 : 0 : op%Stau = C - Cdagbeta
577 : 0 : op%Rtau%vec(op%Fshift(op%activeFlavor)+op%updatePosRow) = op%Stau
578 [ # # ]: 0 : if(op%Rtau%vec(op%Fshift(op%activeFlavor)+op%updatePosRow)>beta) then
579 : : !write(6,*) "Rtau sup beta", op%Stau,C,Cdagbeta
580 : 0 : stop
581 : : endif
582 : 0 : op%Qtau%vec(op%Fshift(op%activeFlavor)+op%updatePosCol) = op%Rtau%vec(op%Fshift(op%activeFlavor)+op%updatePosRow)
583 : : !write(6,*) " getdetAdd op%Stau",op%Stau
584 : :
585 : 0 : time = Cbeta-Cdagbeta
586 : : !write(6,*) " getdetAdd time",time
587 : 0 : iflavora=op%activeFlavor
588 [ # # ]: 0 : iflavorb=op%activeFlavor
589 : : !write(6,*) "time",time
590 : : #include "BathOperatoroffdiagComplex_hybrid"
591 : : !write(6,*) "hybrid",hybrid
592 : 0 : op%S = hybrid
593 : : !write(6,*) " getdetAdd hybrid=op%S",hybrid
594 : :
595 : : !ratio = op%S - DOT_PRODUCT(MATMUL(op%R%vec(1:tail),op%M(op%activeFlavor)%mat(1:tail,1:tail)),op%Q%vec(1:tail))
596 : :
597 : : ! product of matrix R and M(k) is computed now:
598 : 0 : ratio = cmplx(0.d0,0.d0,kind=8)
599 [ # # ]: 0 : DO it1 = tailbegin, tailend
600 : : timec = cmplx(0.d0,0.d0,kind=8)
601 [ # # ]: 0 : DO it2 = tailbegin, tailend
602 : 0 : timec = timec + op%R%vec(it2) * op%M%mat(it2,it1)
603 : : END DO
604 : 0 : ratio = ratio + op%Q%vec(it1) * timec
605 : : END DO
606 : : !sui!write(6,*) " = R Matrix",tail
607 : : !sui!write(6,*) " R ",(op%R%vec(it1),it1=1,tail)
608 : : !sui!write(6,*) " = Q Matrix",tail
609 : : !sui!do it1=1,tail
610 : : !sui!write(6,*) " Q ",op%Q%vec(it1)
611 : : !sui!enddo
612 : : !sui!write(6,*) " = M Matrix",tail
613 : : !sui!do it2=1,tail
614 : : !sui!write(6,*) " M ",(op%M%mat(it2,it1),it1=1,tail)
615 : : !sui!enddo
616 : : !sui!write(6,*) " RMQ =", ratio
617 : : !sui!write(6,*) " S =", op%S
618 : 0 : ratio = op%S - ratio
619 : : !sui!write(6,*) " S-RMQ =", ratio
620 : : !sui!write(6,*) " getdetAdd ratio",ratio
621 : :
622 : 0 : op%Stilde = 1.d0 / ratio
623 : : ! If antisegment, the det ratio has to be multiplied by -1 ( sign of the signature of one
624 : : ! permutation line in the matrix)
625 [ # # # # ]: 0 : IF ( C .LT. Cdag .AND. op%tails(op%activeFlavor) .GT. 0) THEN ! only if an antisegment is added
626 : 0 : ratio=-ratio
627 : : ENDIF
628 : :
629 : : ! This IF is the LAST "NON CORRECTION" in my opinion this should not appears.
630 : : ! IF ( MAX(C,Cdag) .GT. op%beta ) THEN
631 : : ! WRITE(*,*) op%Stilde
632 : : ! op%Stilde = - ABS(op%Stilde)
633 : : ! END IF
634 : 0 : BathOperatoroffdiagComplex_getDetAdd = ratio
635 : : !write(6,*) " getdetAdd",ratio,BathOperatoroffdiagComplex_getDetAdd
636 : 0 : op%MAddFlag = .TRUE.
637 : : !#ifdef CTQMC_CHECK
638 : : ! op%ListCdagC = particle
639 : : !!write(*,*) op%Stilde
640 : : !!write(*,*) op%antishift
641 : : !!write(*,*) op%updatePosRow
642 : : !!write(*,*) op%updatePosCol
643 : : !#endif
644 : :
645 : 0 : END FUNCTION BathOperatoroffdiagComplex_getDetAdd
646 : : !!***
647 : :
648 : : !!****f* ABINIT/m_BathOperatoroffdiagComplex/BathOperatoroffdiagComplex_getDetRemove
649 : : !! NAME
650 : : !! BathOperatoroffdiagComplex_getDetRemove
651 : : !!
652 : : !! FUNCTION
653 : : !! Compute the determinant ratio when a (anti)segment
654 : : !! is trying to be removed
655 : : !!
656 : : !! COPYRIGHT
657 : : !! Copyright (C) 2013-2025 ABINIT group (J. Bieder)
658 : : !! This file is distributed under the terms of the
659 : : !! GNU General Public License, see ~abinit/COPYING
660 : : !! or http://www.gnu.org/copyleft/gpl.txt .
661 : : !!
662 : : !! INPUTS
663 : : !! op=bath operator
664 : : !! position=position of segment to be removed
665 : : !!
666 : : !! OUTPUT
667 : : !! BathOperatoroffdiagComplex_getDetRemove=the det
668 : : !!
669 : : !! SIDE EFFECTS
670 : : !!
671 : : !! NOTES
672 : : !!
673 : : !! SOURCE
674 : :
675 : 0 : COMPLEX(KIND=8) FUNCTION BathOperatoroffdiagComplex_getDetRemove(op,position)
676 : :
677 : : !Arguments ------------------------------------
678 : : TYPE(BathOperatoroffdiagComplex), INTENT(INOUT) :: op
679 : : !Local arguments-------------------------------
680 : : INTEGER , INTENT(IN ) :: position
681 : : INTEGER :: ABSposition
682 : : INTEGER :: tail !,it,it1
683 : :
684 [ # # ]: 0 : IF ( op%activeFlavor .LE. 0 ) &
685 : 0 : CALL ERROR("BathOperatoroffdiagComplex_getDetRemove : no active hybrid fun ")
686 : :
687 : 0 : op%antiShift = .FALSE.
688 : 0 : tail = op%sumtails
689 : 0 : ABSposition = ABS(position)
690 [ # # ]: 0 : IF ( ABSposition .GT. op%tails(op%activeFlavor) ) &
691 : 0 : CALL ERROR("BathOperatoroffdiagComplex_getDetRemove : position > M size ")
692 : 0 : op%updatePosCol = ABSposition
693 : 0 : op%antiShift = .FALSE.
694 [ # # ]: 0 : IF ( position .GT. 0 ) THEN
695 : 0 : op%updatePosRow = ABSposition
696 : : ELSE
697 : 0 : op%updatePosRow = ABSposition+1
698 [ # # ]: 0 : IF ( ABSposition .EQ. op%tails(op%activeFlavor) ) THEN
699 : 0 : op%antiShift = .TRUE.
700 : 0 : op%updatePosRow = 1 !ABSposition - 1
701 : : ! op%updatePosRow = ABSposition
702 : : ! IF ( op%updatePosCol .EQ. 0) op%updatePosCol = tail
703 : : END IF
704 : : ENDIF
705 : : op%Stilde = op%M%mat(op%Fshift(op%activeFlavor)+&
706 : 0 : & op%updatePosRow,op%Fshift(op%activeFlavor)+op%updatePosCol)
707 : : !sui!write(6,*) "Fshift",op%Fshift(op%activeFlavor)
708 : : !sui!write(6,*) "updatepos",op%updatePosRow,op%updatePosCol
709 : :
710 : :
711 : 0 : op%MRemoveFlag = .TRUE.
712 : : !write(6,*) " getdetRemove",op%Stilde
713 : 0 : BathOperatoroffdiagComplex_getDetRemove = op%Stilde
714 [ # # # # ]: 0 : if(position<0.and.op%tails(op%activeFlavor)>1) then
715 : 0 : BathOperatoroffdiagComplex_getDetRemove = -op%Stilde
716 : : endif
717 : : !do it=1,op%sumtails
718 : : !!sui!write(6,*) " getdetRemove M",(op%M%mat(it,it1),it1=1,op%sumtails)
719 : : !enddo
720 : : !#ifdef CTQMC_CHECK
721 : : ! op%ListCdagC = particle
722 : : !!write(*,*) op%updatePosRow, op%updatePosCol, position
723 : : !!CALL ListCdagC_print(particle)
724 : : !#endif
725 : :
726 : 0 : END FUNCTION BathOperatoroffdiagComplex_getDetRemove
727 : : !!***
728 : :
729 : : !!****f* ABINIT/m_BathOperatoroffdiagComplex/BathOperatoroffdiagComplex_getDetF
730 : : !! NAME
731 : : !! BathOperatoroffdiagComplex_getDetF
732 : : !!
733 : : !! FUNCTION
734 : : !! Compute the determinant of the F matrix
735 : : !! using the hybridization of flavor and the
736 : : !! segments of particle
737 : : !! used for Gloval moves only
738 : : !!
739 : : !! COPYRIGHT
740 : : !! Copyright (C) 2013-2025 ABINIT group (J. Bieder)
741 : : !! This file is distributed under the terms of the
742 : : !! GNU General Public License, see ~abinit/COPYING
743 : : !! or http://www.gnu.org/copyleft/gpl.txt .
744 : : !!
745 : : !! INPUTS
746 : : !! op=bath operator
747 : : !! flavor=hybridization function to take
748 : : !! particles=segments to use
749 : : !!
750 : : !! OUTPUT
751 : : !! BathOperatoroffdiagComplex_getDetF=the det
752 : : !!
753 : : !! SIDE EFFECTS
754 : : !!
755 : : !! NOTES
756 : : !!
757 : : !! SOURCE
758 : :
759 [ # # # # : 0 : COMPLEX(KIND=8) FUNCTION BathOperatoroffdiagComplex_getDetF(op,particle,option)
# # ]
760 : :
761 : : !Arguments ------------------------------------
762 : : TYPE(BathOperatoroffdiagComplex) , INTENT(INOUT) :: op
763 : : TYPE(ListCdagC), OPTIONAL, INTENT(IN ) :: particle(:)
764 : : INTEGER , optional :: option
765 : : !Local arguments-------------------------------
766 : : INTEGER :: iCdag
767 : : INTEGER :: iC
768 : : INTEGER :: tail
769 : : DOUBLE PRECISION :: time
770 : : DOUBLE PRECISION :: tC
771 : : DOUBLE PRECISION :: tCdag
772 : : DOUBLE PRECISION :: beta
773 : : DOUBLE PRECISION :: mbeta_two
774 : : DOUBLE PRECISION :: signe
775 : : DOUBLE PRECISION :: inv_dt
776 : : INTEGER :: iflavor,iflavora
777 : : INTEGER :: iflavordag,iflavorb
778 : : #include "BathOperatoroffdiagComplex_hybrid.h"
779 : :
780 : 0 : BathOperatoroffdiagComplex_getDetF = cmplx(1.d0,0.d0,kind=8) ! pour eviter des divisions par 0
781 [ # # ]: 0 : IF ( PRESENT( particle ) ) THEN
782 : 0 : tail = op%sumtails
783 : 0 : beta = op%beta
784 : 0 : mbeta_two = -beta*0.5d0
785 : 0 : inv_dt = op%inv_dt
786 : 0 : CALL MatrixHybComplex_setSize(op%M_update,tail)
787 [ # # ]: 0 : DO iflavordag=1,op%flavors
788 [ # # ]: 0 : DO iCdag = 1, op%tails(iflavordag)
789 : 0 : tCdag = particle(iflavordag)%list(iCdag,Cdag_)
790 [ # # ]: 0 : DO iflavor=1,op%flavors
791 [ # # ]: 0 : DO iC = 1, op%tails(iflavor)
792 : : !tC = particle%list(C_,iC).MOD.beta
793 [ # # ]: 0 : MODCYCLE(particle(iflavor)%list(iC,C_),beta,tC)
794 : 0 : time = tC - tCdag
795 : 0 : iflavora=iflavordag
796 [ # # ]: 0 : iflavorb=iflavor
797 : : #include "BathOperatoroffdiagComplex_hybrid"
798 : 0 : op%M_update%mat(op%Fshift(iflavor)+iC,op%Fshift(iflavordag)+iCdag) = hybrid
799 : : END DO
800 : : END DO
801 : : END DO
802 : : END DO
803 : : ! mat_tau needs to be transpose of ordered time mat (way of measuring
804 : : ! G(tau))
805 [ # # ]: 0 : DO iflavor=1,op%flavors
806 [ # # ]: 0 : DO iC = 1, tail
807 : 0 : tC = particle(iflavor)%list(iC,C_)
808 [ # # ]: 0 : DO iflavordag=1,op%flavors
809 [ # # ]: 0 : DO iCdag = 1, tail
810 : : !sui!write(6,*) iCdag,Cdag_,size(particle(iflavordag)%list,1)
811 : : !stop
812 : 0 : tCdag = particle(iflavordag)%list(iCdag,Cdag_)
813 : 0 : time = tC - tCdag
814 : 0 : signe = SIGN(1.d0,time)
815 : 0 : time = time + (signe-1.d0)*mbeta_two
816 : 0 : op%M_update%mat_tau(op%Fshift(iflavordag)+iCdag,op%Fshift(iflavor)+iC) = INT( ( time * inv_dt ) + 1.5d0 )
817 : : END DO
818 : : END DO
819 : : END DO
820 : : END DO
821 : 0 : CALL MatrixHybComplex_inverse(op%M_update,BathOperatoroffdiagComplex_getDetF) ! calcul le det de la matrice et l'inverse
822 : : ELSE
823 [ # # ]: 0 : if(present(option)) then
824 : 0 : CALL MatrixHybComplex_getDet(op%M_update,BathOperatoroffdiagComplex_getDetF) ! det M = 1/detF !
825 : : else
826 : 0 : CALL MatrixHybComplex_getDet(op%M,BathOperatoroffdiagComplex_getDetF) ! det M = 1/detF !
827 : : endif
828 : 0 : BathOperatoroffdiagComplex_getDetF = 1.d0 / BathOperatoroffdiagComplex_getDetF
829 : : ENDIF
830 : 0 : END FUNCTION BathOperatoroffdiagComplex_getDetF
831 : : !!***
832 : :
833 : : !!****f* ABINIT/m_BathOperatoroffdiagComplex/BathOperatoroffdiagComplex_setMAdd
834 : : !! NAME
835 : : !! BathOperatoroffdiagComplex_setMAdd
836 : : !!
837 : : !! FUNCTION
838 : : !! Update de M matrix inserting a row and a column
839 : : !!
840 : : !! COPYRIGHT
841 : : !! Copyright (C) 2013-2025 ABINIT group (J. Bieder)
842 : : !! This file is distributed under the terms of the
843 : : !! GNU General Public License, see ~abinit/COPYING
844 : : !! or http://www.gnu.org/copyleft/gpl.txt .
845 : : !!
846 : : !! INPUTS
847 : : !! op=bath operator
848 : : !! particle=segments of active flavor
849 : : !!
850 : : !! OUTPUT
851 : : !!
852 : : !! SIDE EFFECTS
853 : : !!
854 : : !! NOTES
855 : : !!
856 : : !! SOURCE
857 : :
858 [ # # ]: 0 : SUBROUTINE BathOperatoroffdiagComplex_setMAdd(op,particle)
859 : :
860 : : !Arguments ------------------------------------
861 : : TYPE(BathOperatoroffdiagComplex), INTENT(INOUT) :: op
862 : : TYPE(ListCdagC) , INTENT(IN ) :: particle(:)
863 : : !Local variables ------------------------------
864 : : INTEGER :: tail
865 : : INTEGER :: new_tail
866 : : INTEGER :: col
867 : : INTEGER :: col_move
868 : : INTEGER :: row_move
869 : : INTEGER :: row
870 : : INTEGER :: positionRow
871 : : INTEGER :: positionCol
872 : : INTEGER :: aF,indice
873 : : INTEGER :: tailb,taile
874 : : COMPLEX(KIND=8) :: Stilde
875 : : DOUBLE PRECISION :: time
876 : : DOUBLE PRECISION :: mbeta_two
877 : : DOUBLE PRECISION :: inv_dt
878 : 0 : TYPE(VectorComplex) :: vec_tmp
879 : 0 : TYPE(VectorInt) :: vecI_tmp
880 : : INTEGER :: m
881 : : INTEGER :: count
882 : : INTEGER :: i
883 : : INTEGER :: j
884 : : INTEGER :: p,it !,it1
885 : :
886 : :
887 : :
888 : : ! --- op%MAddFlag is put to .TRUE. in BathOperatoroffdiagComplex_getDetAdd.
889 [ # # ]: 0 : IF ( op%MAddFlag .EQV. .FALSE. ) &
890 : 0 : CALL ERROR("BathOperatoroffdiagComplex_setMAdd : MAddFlag turn off ")
891 : :
892 : : ! --- op%activeFlavor is put in ctqmc_loop
893 : 0 : aF = op%activeFlavor
894 [ # # ]: 0 : IF ( aF .LE. 0 ) &
895 : 0 : CALL ERROR("BathOperatoroffdiagComplex_setMAdd : no active hybrid function ")
896 : :
897 : : !! do it=1,op%sumtails
898 : : !write(6,*) " setMAdd begin M",(op%M%mat(it,it1),it1=1,op%sumtails)
899 : : !! enddo
900 : : !! do it=1,op%sumtails
901 : : !write(6,*) " setMAdd begin M%mat_tau",(op%M%mat_tau(it,it1),it1=1,op%sumtails)
902 : : !! enddo
903 : : ! old tail
904 : : !write(6,*) " BathOperatoroffdiagComplex_setMAdd op%sumtails",op%sumtails
905 : 0 : tail = op%sumtails
906 : 0 : new_tail = tail + 1
907 : 0 : op%tails(aF)= op%tails(aF) + 1
908 [ # # ]: 0 : DO indice = aF +1, op%flavors+1
909 : 0 : op%Fshift(indice) = op%Fshift(indice) + 1
910 : : END DO
911 : 0 : op%sumtails = op%Fshift(op%flavors) + op%tails(op%flavors) !last slot of Fshift is the tail of full matrix
912 : : !write(6,*) " BathOperatoroffdiagComplex_setMAdd op%sumtails",op%sumtails
913 : : !write(6,*) " setMAdd actualized Fshift",(op%Fshift(it),it=1,op%flavors+1)
914 : : !write(6,*) " setMAdd actualized tails",(op%tails(it),it=1,op%flavors)
915 : : !CALL matrix_print(M)
916 : :
917 [ # # ]: 0 : if(op%opt_nondiag==1) then
918 : : tailb = 1
919 : : taile = tail
920 : : else
921 : : !sui!write(6,*) "Bathoperator a opt_nondiag=0"
922 : 0 : tailb = op%Fshift(aF)+1
923 : 0 : taile = op%Fshift(aF)+op%tails(aF)
924 : : endif
925 : :
926 : : ! --- data obtained from BathOperatoroffdiagComplex_getDetAdd
927 : 0 : PositionRow = op%updatePosRow + op%Fshift(aF) ! position in the full matrix
928 : 0 : PositionCol = op%updatePosCol + op%Fshift(aF) ! position in the full matrix
929 : 0 : Stilde = op%Stilde
930 : :
931 : : ! !write(6,*) "before", positionRow, positionCol
932 : : !CALL MatrixHybComplex_print(op%M(aF),opt_print=1)
933 : : ! --- MatrixHybComplex_setSize
934 : : !write(6,*) " BathOperatoroffdiagComplex_setMAdd before setsize",size(op%M%mat,1)
935 : 0 : CALL MatrixHybComplex_setSize(op%M,new_tail)
936 : : !write(6,*) " BathOperatoroffdiagComplex_setMAdd after setsize",size(op%M%mat,1)
937 : :
938 : : ! Compute Qtilde with Q
939 : : !op%Q%vec(1:tail) = (-1.d0) * MATMUL(op%M(aF)%mat(1:tail,1:tail),op%Q%vec(1:tail)) * Stilde
940 : :
941 : : ! --- M*Q => Q
942 [ # # # # : 0 : op%Q%vec(tailb:taile) = MATMUL(op%M%mat(tailb:taile,tailb:taile),op%Q%vec(tailb:taile))
# # # # #
# ]
943 : :
944 : : !op%Q%vec(PositionRow:new_tail) = EOSHIFT(op%Q%vec(PositionRow:new_tail), SHIFT=-1, BOUNDARY=-1.d0, DIM=1)
945 : : ! op%Qtau%vec(PositionCol:new_tail) = EOSHIFT(op%Qtau%vec(PositionCol:new_tail), SHIFT=-1, BOUNDARY=1.d0, DIM=1)
946 : : ! op%Qtau%vec(PositionCol) = op%Stau
947 : :
948 : : !Compute Rtilde with R and without multiplying by Stilde
949 : : !op%R%vec(1:tail) = (-1.d0) * MATMUL(op%R%vec(1:tail),op%M(aF)%mat(1:tail,1:tail))
950 : :
951 : : ! --- R*M => R
952 [ # # # # : 0 : op%R%vec(tailb:taile) = MATMUL(op%R%vec(tailb:taile),op%M%mat(tailb:taile,tailb:taile))
# # # # #
# # # #
# ]
953 : :
954 : : !op%R%vec(PositionCol:new_tail) = EOSHIFT(op%R%vec(PositionCol:new_tail), SHIFT=-1, BOUNDARY=-1.d0, DIM=1)
955 : : ! op%Rtau%vec(PositionRow:new_tail) = EOSHIFT(op%Rtau%vec(PositionRow:new_tail), SHIFT=-1, BOUNDARY=1.d0, DIM=1)
956 : : ! op%Rtau%vec(PositionRow) = op%Stau
957 : :
958 : : !Compute the new M matrix
959 : : !op%M(aF)%mat(PositionRow:new_tail,1:new_tail) = &
960 : : ! EOSHIFT(op%M(aF)%mat(PositionRow:new_tail,1:new_tail),SHIFT=-1, BOUNDARY=0.d0, DIM=1)
961 : : !op%M(aF)%mat(1:n12 characters (ABI_MALLOC) instead of 4 (FREE)ew_tail,PositionCol:new_tail) = &
962 : : ! EOSHIFT(op%M(aF)%mat(1:new_tail,PositionCol:new_tail),SHIFT=-1, BOUNDARY=0.d0, DIM=2)
963 : : ! ! op%M(aF)%mat(1:new_tail,1:new_tail) = op%M(aF)%mat(1:new_tail,1:new_tail) + &
964 : : ! ! Stilde * MATMUL(RESHAPE(op%Q%vec(1:new_tail),(/ new_tail,1 /)),RESHAPE(op%R%vec(1:new_tail),(/ 1,new_tail /)))
965 : :
966 : : !op%M(aF)%mat_tau(PositionRow:new_tail,1:new_tail) = &
967 : : ! EOSHIFT(op%M(aF)%mat_tau(PositionRow:new_tail,1:new_tail),SHIFT=-1, BOUNDARY=0, DIM=1)
968 : : !op%M(aF)%mat_tau(1:new_tail,PositionCol:new_tail) = &
969 : : ! EOSHIFT(op%M(aF)%mat_tau(1:new_tail,PositionCol:new_tail),SHIFT=-1, BOUNDARY=0, DIM=2)
970 : :
971 : 0 : mbeta_two = -op%beta*0.5d0
972 : 0 : inv_dt = op%inv_dt
973 : :
974 : : ! ------ Shift mat_tau and update old M=Ptilde
975 [ # # ]: 0 : DO col=tail,1,-1 ! decreasing order to avoid overwrite of data
976 : 0 : col_move = col + ( 1+SIGN(1,col-PositionCol) )/2
977 : : ! if col>= PositionCol col_move=col+1
978 : : ! if col< PositionCol col_move=col
979 [ # # ]: 0 : DO row=tail,1,-1
980 : 0 : row_move = row + ( 1+SIGN(1,row-PositionRow) )/2
981 : : ! --- times for Ptilde are kept unchanged. But we have to copy it at the right place
982 : : op%M%mat_tau(row_move,col_move) = &
983 : 0 : op%M%mat_tau(row,col)
984 : : ! --- Update Ptilde with the same indices as mat_tau
985 : : ! --- M + M*Q Stilde R*M => Ptilde => M
986 : : !if(row>=tailb.and.row<=taile.and.col>=tailb.and.col<=taile) then
987 : : op%M%mat(row_move,col_move) = &
988 : 0 : op%M%mat(row,col) + op%Q%vec(row)*op%R%vec(col) * Stilde
989 : : !else
990 : : ! op%M%mat(row_move,col_move) = op%M%mat(row,col)
991 : : !endif
992 : : END DO
993 : : END DO
994 : :
995 : : ! ------ Add new stuff for new row
996 [ # # ]: 0 : DO row = 1, tail
997 : 0 : row_move = row + ( 1+SIGN(1,row-PositionRow) )/2
998 : : ! --- M*Q Stilde => Qtilde => M with the good indices
999 : : !if(row>=tailb.and.row<=taile) then
1000 : 0 : op%M%mat(row_move,PositionCol) = -op%Q%vec(row)*Stilde
1001 : : !else
1002 : : ! op%M%mat(row_move,PositionCol) = op%M%mat(row,PositionCol)
1003 : : !endif
1004 : :
1005 : 0 : time = op%Rtau%vec(row) ! pourquoi Rtau et pas Qtau ici ?
1006 : 0 : time = time + ( SIGN(1.d0,time) - 1.d0 )*mbeta_two
1007 : : ! if time>=0 time=time
1008 : : ! if time< 0 time=time + beta
1009 : : ! --- mat_tau=int(time*L/beta+1.5)
1010 : 0 : op%M%mat_tau(row,PositionCol) = INT ( (time*inv_dt) +1.5d0 )
1011 : : !write(6,*) " setMadd new row", op%Rtau%vec(row),op%M%mat_tau(row,PositionCol)
1012 : : ! if(op%M%mat_tau(row,PositionCol)>301) then
1013 : : ! !write(6,*) ">301 a", time,inv_dt, op%M%mat_tau(row,PositionCol)
1014 : : ! time = op%Rtau%vec(row) ! pourquoi Rtau et pas Qtau ici ?
1015 : : ! !write(6,*) time,mbeta_two
1016 : : ! time = time + ( SIGN(1.d0,time) - 1.d0 )*mbeta_two
1017 : : ! !write(6,*) time
1018 : : ! !write(6,*) INT ( (time*inv_dt) +1.5d0 )
1019 : : ! stop
1020 : : ! endif
1021 : : END DO
1022 : : ! Add last time missing in the loops
1023 : 0 : time = op%Rtau%vec(new_tail)
1024 : 0 : time = time + ( SIGN(1.d0,time) - 1.d0 )*mbeta_two
1025 : 0 : op%M%mat_tau(new_tail,PositionCol) = INT ( (time*inv_dt) +1.5d0 )
1026 : : !write(6,*) " setMadd last time", op%Rtau%vec(new_tail),op%M%mat_tau(new_tail,PositionCol)
1027 : : ! if(op%M%mat_tau(new_tail,PositionCol)>301) then
1028 : : ! !write(6,*) ">301 b", time,inv_dt, op%M%mat_tau(new_tail,PositionCol)
1029 : : ! time = op%Rtau%vec(new_tail) ! pourquoi Rtau et pas Qtau ici ?
1030 : : ! !write(6,*) time,mbeta_two
1031 : : ! time = time + ( SIGN(1.d0,time) - 1.d0 )*mbeta_two
1032 : : ! !write(6,*) time
1033 : : ! !write(6,*) INT ( (time*inv_dt) +1.5d0 )
1034 : : ! stop
1035 : : ! endif
1036 : :
1037 : : ! Add new stuff for new col
1038 [ # # ]: 0 : DO col = 1, tail
1039 : 0 : col_move = col + ( 1+SIGN(1,col-PositionCol) )/2
1040 : : ! --- Stilde RN => Rtilde => M
1041 : : !if(col>=tailb.and.col<=taile) then
1042 : 0 : op%M%mat(PositionRow,col_move) = -op%R%vec(col)*Stilde
1043 : : !else
1044 : : ! op%M%mat(PositionRow,col_move) = op%M%mat(PositionRow,col)
1045 : : !endif
1046 : 0 : time = op%Qtau%vec(col)
1047 : 0 : time = time + ( SIGN(1.d0,time) - 1.d0 )*mbeta_two
1048 : 0 : op%M%mat_tau(PositionRow,col) = INT ( (time*inv_dt) +1.5d0 )
1049 : : !write(6,*) " setMadd new col", op%Qtau%vec(col),op%M%mat_tau(PositionRow,col)
1050 : : ! if(op%M%mat_tau(PositionRow,col)>301) then
1051 : : ! !write(6,*) ">301 c", time,inv_dt, op%M%mat_tau(PositionRow,col)
1052 : : ! time = op%Qtau%vec(col) ! pourquoi Rtau et pas Qtau ici ?
1053 : : ! !write(6,*) time,mbeta_two
1054 : : ! time = time + ( SIGN(1.d0,time) - 1.d0 )*mbeta_two
1055 : : ! !write(6,*) time
1056 : : ! !write(6,*) INT ( (time*inv_dt) +1.5d0 )
1057 : : ! stop
1058 : : ! endif
1059 : : END DO
1060 : : ! Add last time missing in the loops
1061 : 0 : time = op%Qtau%vec(new_tail)
1062 : 0 : time = time + ( SIGN(1.d0,time) - 1.d0 )*mbeta_two
1063 : 0 : op%M%mat_tau(PositionRow,new_tail) = INT ( (time*inv_dt) +1.5d0 )
1064 : : !write(6,*) " setMadd last time", op%Qtau%vec(new_tail),op%M%mat_tau(PositionRow,new_tail)
1065 : : ! if(op%M%mat_tau(PositionRow,new_tail)>301) then
1066 : : ! !write(6,*) ">301 d", time,inv_dt, op%M%mat_tau(PositionRow,new_tail)
1067 : : ! time = op%Qtau%vec(new_tail) ! pourquoi Rtau et pas Qtau ici ?
1068 : : ! !write(6,*) time,mbeta_two
1069 : : ! time = time + ( SIGN(1.d0,time) - 1.d0 )*mbeta_two
1070 : : ! !write(6,*) time
1071 : : ! !write(6,*) INT ( (time*inv_dt) +1.5d0 )
1072 : : ! stop
1073 : : ! endif
1074 : :
1075 : 0 : op%M%mat(PositionRow,PositionCol) = Stilde
1076 : :
1077 : : !CALL MatrixHybComplex_print(op%M,opt_print=1)
1078 : :
1079 : : ! DO col = 1, new_tail
1080 : : ! time = op%Rtau%vec(col)
1081 : : ! time = time + ( SIGN(1.d0,time) - 1.d0 )*mbeta_two
1082 : : ! op%M(aF)%mat_tau(col,PositionCol) = INT ( (time*inv_dt) +1.5d0 )
1083 : : ! time = op%Qtau%vec(col)
1084 : : ! time = time + ( SIGN(1.d0,time) - 1.d0 )*mbeta_two
1085 : : ! op%M(aF)%mat_tau(PositionRow,Col) = INT ( (time*inv_dt) +1.5d0 )
1086 : : ! time = op%R%vec(col)*Stilde
1087 : : ! DO row = 1, new_tail
1088 : : ! op%M(aF)%mat(row,col) = op%M(aF)%mat(row,col) + op%Q%vec(row)*time
1089 : : ! END DO
1090 : : ! END DO
1091 : :
1092 : : !col_move = new_tail
1093 : : !col = tail
1094 : : !DO col_move = new_tail, 1, -1
1095 : : ! IF ( col_move .EQ. positionCol ) THEN
1096 : : ! ! on calcule rajoute Q tilde
1097 : : ! !row_move = new_tail
1098 : : ! row = tail
1099 : : ! DO row_move = new_tail, 1, -1
1100 : : ! ! calcul itau
1101 : : ! IF ( row_move .EQ. positionRow ) THEN
1102 : : ! op%M(aF)%mat(row_move,col_move) = Stilde
1103 : : ! !time = op%Stau
1104 : : ! ELSE
1105 : : ! op%M(aF)%mat(row_move,col_move) = -op%Q%vec(row)*Stilde
1106 : : ! !time = op%Rtau%vec(row_move)
1107 : : ! row = row - 1
1108 : : ! END IF
1109 : : ! !time = time + ( SIGN(1.d0,time) - 1.d0 )*mbeta_two
1110 : : ! !op%M(aF)%mat_tau(row_move,col_move) = INT ( (time*inv_dt) +1.5d0 )
1111 : : ! END DO
1112 : : ! ! realignement des indices
1113 : : ! ELSE
1114 : : ! ! on calcule Ptilde
1115 : : ! !row_move = new_tail
1116 : : ! row = tail
1117 : : ! DO row_move = new_tail, 1, -1
1118 : : ! IF ( row_move .EQ. positionRow ) THEN
1119 : : ! op%M(aF)%mat(row_move,col_move) = -op%R%vec(col) * Stilde
1120 : : ! ! calcul itau
1121 : : ! !time = op%Qtau%vec(col_move)
1122 : : ! !time = time + ( SIGN(1.d0,time) - 1.d0 )*mbeta_two
1123 : : ! !op%M(aF)%mat_tau(row_move,col_move) = INT ( (time*inv_dt) +1.5d0 )
1124 : : ! ELSE
1125 : : ! op%M(aF)%mat(row_move,col_move) = op%M(aF)%mat(row,col) + op%Q%vec(row)*op%R%vec(col)*Stilde
1126 : : ! ! copy itau
1127 : : ! !op%M(aF)%mat_tau(row_move,col_move) = op%M(aF)%mat_tau(row,col)
1128 : : ! row = row - 1
1129 : : ! END IF
1130 : : ! END DO
1131 : : ! col = col - 1
1132 : : ! END IF
1133 : : !END DO
1134 : : ! !write(6,*) "after"
1135 : : ! CALL MatrixHybComplex_print(op%M(aF),opt_print=1)
1136 : : !CALL matrix_inverse(M)
1137 : : !CALL MatrixHybComplex_print(M)
1138 : : !CALL matrix_inverse(M)
1139 : :
1140 [ # # ]: 0 : IF ( op%antiShift .EQV. .TRUE. ) THEN ! antisegment
1141 : : if(3==4) then
1142 : : CALL VectorComplex_init(vec_tmp,new_tail)
1143 : : CALL VectorInt_init(vecI_tmp,new_tail)
1144 : : ! Shift if necessary according to op%antishift
1145 : : ! shift DIM=2 (col)
1146 : :
1147 : : ! For new_tail=4, the following lines transform
1148 : : ! M=(a,b,c,d) vith a,b,c,d column vectors into
1149 : : ! M=(d,a,b,c)
1150 : : p = new_tail - 1 ! = tail
1151 : : m = 1
1152 : : ! count increases in the loop from 0 to new_tail-1
1153 : : count = 0
1154 : : DO WHILE ( count .NE. new_tail )
1155 : : ! put column b in vec_tmp
1156 : : vec_tmp%vec(1:new_tail) = op%M%mat(1:new_tail,m)
1157 : : vecI_tmp%vec(1:new_tail) = op%M%mat_tau(1:new_tail,m)
1158 : : i = m
1159 : : !j = m+p
1160 : : MODCYCLE(m+p, new_tail, j) ! j=m+p modulo new_tail
1161 : : DO WHILE (j .NE. m)
1162 : : op%M%mat(1:new_tail,i) = op%M%mat(1:new_tail,j)
1163 : : op%M%mat_tau(1:new_tail,i) = op%M%mat_tau(1:new_tail,j)
1164 : : i = j
1165 : : MODCYCLE(j+p, new_tail, j)
1166 : : count = count+1
1167 : : END DO
1168 : : op%M%mat(1:new_tail,i) = vec_tmp%vec(1:new_tail)
1169 : : op%M%mat_tau(1:new_tail,i) = vecI_tmp%vec(1:new_tail)
1170 : : count = count+1
1171 : : m = m+1
1172 : : END DO
1173 : : ! shift DIM=1 (row)
1174 : :
1175 : : ! below is similar to above but for rows instead of columns.
1176 : : p = new_tail - 1
1177 : : m = 1
1178 : : count = 0
1179 : : DO WHILE ( count .NE. new_tail)
1180 : : vec_tmp%vec(1:new_tail) = op%M%mat(m,1:new_tail)
1181 : : vecI_tmp%vec(1:new_tail) = op%M%mat_tau(m,1:new_tail)
1182 : : i = m
1183 : : !j = m+p
1184 : : MODCYCLE(m+p, new_tail, j)
1185 : : DO WHILE ( j .NE. m )
1186 : : op%M%mat(i,1:new_tail) = op%M%mat(j,1:new_tail)
1187 : : op%M%mat_tau(i,1:new_tail) = op%M%mat_tau(j,1:new_tail)
1188 : : i = j
1189 : : MODCYCLE(j+p, new_tail, j)
1190 : : count = count+1
1191 : : END DO
1192 : : op%M%mat(i,1:new_tail) = vec_tmp%vec(1:new_tail)
1193 : : op%M%mat_tau(i,1:new_tail) = vecI_tmp%vec(1:new_tail)
1194 : : count = count+1
1195 : : m = m+1
1196 : : END DO
1197 : : CALL VectorComplex_destroy(vec_tmp)
1198 : : CALL VectorInt_destroy(vecI_tmp)
1199 : : endif
1200 : : !op%M(aF)%mat(1:new_tail,1:new_tail) = CSHIFT(op%M(aF)%mat(1:new_tail,1:new_tail), SHIFT=-1, DIM=1) ! Shift to the bottom
1201 : : !op%M(aF)%mat(1:new_tail,1:new_tail) = CSHIFT(op%M(aF)%mat(1:new_tail,1:new_tail), SHIFT=-1, DIM=2) ! Shift to the right
1202 : : !op%M(aF)%mat_tau(1:new_tail,1:new_tail) = CSHIFT(op%M(aF)%mat_tau(1:new_tail,1:new_tail), SHIFT=-1, DIM=1) ! Shift to the bottom
1203 : : !op%M(aF)%mat_tau(1:new_tail,1:new_tail) = CSHIFT(op%M(aF)%mat_tau(1:new_tail,1:new_tail), SHIFT=-1, DIM=2) ! Shift to the right
1204 : : !write(6,*) " setMAdd size M%mat",size(op%M%mat,1),size(op%M%mat,2),new_tail
1205 : : !write(6,*) " setMAdd arguement M%mat",aF,op%Fshift(aF)
1206 : : !write(6,*) " setMAdd arguement M%mat",aF,op%Fshift(aF),op%Fshift(aF+1)
1207 : 0 : do it=1,op%sumtails
1208 : : !write(6,*) " setMAdd before antishift M%mat_tau",(op%M%mat_tau(it,it1),it1=1,op%sumtails)
1209 : : enddo
1210 [ # # # # ]: 0 : if (new_tail>0.and.op%Fshift(aF+1)>op%Fshift(aF)) then
1211 : : op%M%mat(op%Fshift(aF)+1:op%Fshift(aF+1) , 1:new_tail) = &
1212 [ # # # # ]: 0 : CSHIFT( op%M%mat(op%Fshift(aF)+1:op%Fshift(aF+1) , 1:new_tail) , SHIFT=-1 , DIM=1) ! Shift to the bottom
1213 : :
1214 : : op%M%mat(1:new_tail , op%Fshift(aF)+1:op%Fshift(aF+1)) = &
1215 [ # # # # ]: 0 : CSHIFT( op%M%mat(1:new_tail , op%Fshift(aF)+1:op%Fshift(aF+1)) , SHIFT=-1 , DIM=2) ! Shift to the right
1216 : :
1217 : : op%M%mat_tau(op%Fshift(aF)+1:op%Fshift(aF+1) , 1:new_tail) = &
1218 [ # # # # ]: 0 : CSHIFT( op%M%mat_tau(op%Fshift(aF)+1:op%Fshift(aF+1) , 1:new_tail) , SHIFT=-1 , DIM=1) ! Shift to the bottom
1219 : :
1220 : : op%M%mat_tau(1:new_tail , op%Fshift(aF)+1:op%Fshift(aF+1)) = &
1221 [ # # # # ]: 0 : CSHIFT( op%M%mat_tau(1:new_tail , op%Fshift(aF)+1:op%Fshift(aF+1)) , SHIFT=-1 , DIM=2) ! Shift to the right
1222 : : end if
1223 : : !CALL matrix_print(M)
1224 : : END IF
1225 : :
1226 : : !! do it=1,op%sumtails
1227 : : !write(6,*) " setMAdd end M",(op%M%mat(it,it1),it1=1,op%sumtails)
1228 : : !! enddo
1229 : : !! do it=1,op%sumtails
1230 : : !! !write(6,*) " setMAdd end M%mat_tau",(op%M%mat_tau(it,it1),it1=1,op%sumtails)
1231 : : !! enddo
1232 [ # # ]: 0 : IF ( op%doCheck .EQV. .TRUE.) THEN
1233 : : !#ifdef CTQMC_CHECK
1234 : 0 : CALL BathOperatoroffdiagComplex_checkM(op,particle)
1235 : : !#endif
1236 : : END IF
1237 : :
1238 : 0 : op%MAddFlag = .FALSE.
1239 : :
1240 : 0 : END SUBROUTINE BathOperatoroffdiagComplex_setMAdd
1241 : : !!***
1242 : :
1243 : : !!****f* ABINIT/m_BathOperatoroffdiagComplex/BathOperatoroffdiagComplex_setMRemove
1244 : : !! NAME
1245 : : !! BathOperatoroffdiagComplex_setMRemove
1246 : : !!
1247 : : !! FUNCTION
1248 : : !! delete one row and one column of the M matrix
1249 : : !!
1250 : : !! COPYRIGHT
1251 : : !! Copyright (C) 2013-2025 ABINIT group (J. Bieder)
1252 : : !! This file is distributed under the terms of the
1253 : : !! GNU General Public License, see ~abinit/COPYING
1254 : : !! or http://www.gnu.org/copyleft/gpl.txt .
1255 : : !!
1256 : : !! INPUTS
1257 : : !! op=bath operator
1258 : : !! particle=segments of the active flavor
1259 : : !!
1260 : : !! OUTPUT
1261 : : !!
1262 : : !! SIDE EFFECTS
1263 : : !!
1264 : : !! NOTES
1265 : : !!
1266 : : !! SOURCE
1267 : :
1268 [ # # ]: 0 : SUBROUTINE BathOperatoroffdiagComplex_setMRemove(op,particle)
1269 : :
1270 : : !Arguments ------------------------------------
1271 : : TYPE(BathOperatoroffdiagComplex), INTENT(INOUT) :: op
1272 : : TYPE(ListCdagC) , INTENT(IN ) :: particle(:)
1273 : : !Local variables ------------------------------
1274 : : INTEGER :: tail,tailb,taile
1275 : : INTEGER :: new_tail
1276 : : INTEGER :: col
1277 : : INTEGER :: col_move
1278 : : INTEGER :: row_move
1279 : : INTEGER :: row
1280 : : INTEGER :: positionCol
1281 : : INTEGER :: positionRow
1282 : : INTEGER :: aF,iaf
1283 : : INTEGER :: m
1284 : : INTEGER :: count
1285 : : INTEGER :: i
1286 : : INTEGER :: j,it !,it1
1287 : : INTEGER :: p
1288 : : COMPLEX(KIND=8) :: invStilde
1289 : : COMPLEX(KIND=8) :: invStilde2
1290 : 0 : TYPE(VectorInt) :: vecI_tmp
1291 : 0 : TYPE(VectorComplex) :: vec_tmp
1292 : :
1293 [ # # ]: 0 : IF ( op%MRemoveFlag .EQV. .FALSE. ) &
1294 : 0 : CALL ERROR("BathOperatoroffdiagComplex_setMRemove : MRemoveFlag turn off ")
1295 : 0 : aF = op%activeFlavor
1296 [ # # ]: 0 : IF ( aF .LE. 0 ) &
1297 : 0 : CALL ERROR("BathOperatoroffdiagComplex_setMRemove : no active hybrid func ")
1298 : 0 : do it=1,op%sumtails
1299 : : !write(6,*) " setMRemove begin M",(op%M%mat(it,it1),it1=1,op%sumtails)
1300 : : enddo
1301 : 0 : tail = op%sumtails
1302 : 0 : new_tail = tail - 1
1303 : 0 : op%tails(af)= op%tails(af) - 1
1304 [ # # ]: 0 : DO iaf=af+1 , op%flavors+1
1305 : 0 : op%Fshift(iaf) = op%Fshift(iaf) - 1
1306 : : END DO
1307 : 0 : op%sumtails = op%Fshift(op%flavors) + op%tails(op%flavors)
1308 : 0 : positionCol = op%updatePosCol + op%Fshift(af)
1309 : 0 : positionRow = op%updatePosRow + op%Fshift(af)
1310 : 0 : invStilde = 1.d0 / op%Stilde
1311 : : if(op%opt_nondiag==1) then
1312 : : tailb = 1
1313 : : taile = new_tail
1314 : : else
1315 : : !sui!write(6,*) "Bathoperator c opt_nondiag=0"
1316 : : tailb = op%Fshift(aF)+1
1317 : : taile = op%Fshift(aF)+op%tails(aF)
1318 : : endif
1319 : :
1320 : : ! !write(6,*) "before", positionRow, positionCol
1321 : : ! CALL MatrixHybComplex_print(op%M(aF),opt_print=1)
1322 : :
1323 : : ! IF ( new_tail .EQ. 0 ) THEN
1324 : : !! IF ( op%antiShift .EQV. .TRUE. ) THEN
1325 : : !! op%M(aF)%mat(1,1) = 1.d0/BathOperatoroffdiagComplex_Hybrid(op, op%beta)
1326 : : !! op%MRemoveFlag = .FALSE.
1327 : : !! RETURN
1328 : : !! END IF
1329 : : ! CALL MatrixHybComplex_clear(op%M(aF))
1330 : : ! op%MRemoveFlag = .FALSE.
1331 : : ! RETURN
1332 : : ! END IF
1333 : :
1334 : : ! CALL VectorComplex_setSize(op%Q,new_tail)
1335 : : ! CALL VectorComplex_setSize(op%R,new_tail)
1336 [ # # ]: 0 : VectorComplex_QuickResize(op%Q,new_tail)
1337 [ # # ]: 0 : VectorComplex_QuickResize(op%R,new_tail)
1338 : :
1339 : : ! We use R and Q as op%R%vec and op%Q%vec
1340 : : ! op%R%vec => op%R
1341 : : ! op%Q%vec => op%Q
1342 : :
1343 : 0 : row = 1
1344 : : !row_move = 1
1345 : 0 : col = 1
1346 : : !col_move = 1
1347 [ # # ]: 0 : DO row_move = 1, new_tail
1348 [ # # ]: 0 : IF ( row .EQ. positionRow ) row = row + 1
1349 [ # # ]: 0 : IF ( col .EQ. positionCol ) col = col + 1
1350 : : !col = row_move + (1+SIGN(1,row_move-positionCol))/2
1351 : : !row = row_move + (1+SIGN(1,row_move-positionRow))/2
1352 : 0 : op%R%vec(row_move) = op%M%mat(positionRow,col)
1353 : 0 : op%Q%vec(row_move) = op%M%mat(row,positionCol)
1354 : 0 : row = row + 1
1355 : 0 : col = col + 1
1356 : : END DO
1357 : : !! op%R%vec(1:positionCol-1) = op%M(aF)%mat(positionRow,1:positionCol-1)
1358 : : !! op%R%vec(positionCol:new_tail) = op%M(aF)%mat(positionRow,positionCol+1:tail)
1359 : : !! op%Q%vec(1:positionRow-1) = op%M(aF)%mat(1:positionRow-1,positionCol)
1360 : : !! op%Q%vec(positionRow:new_tail) = op%M(aF)%mat(positionRow+1:tail,positionCol)
1361 : : !write(*,*) positionRow, positionCol
1362 : : !CALL MatrixHybComplex_print(M)
1363 : : !CALL VectorComplex_print(op%R)
1364 : : !CALL VectorComplex_print(op%Q)
1365 : : !CALL ListCdagC_print(op%ListCdagC)
1366 : :
1367 : : col = 1
1368 [ # # ]: 0 : DO col_move = 1, new_tail
1369 [ # # ]: 0 : IF ( col_move .EQ. positionCol ) col = col + 1
1370 : : !col = col_move + (1+SIGN(1,col_move-positionCol))/2
1371 : 0 : row = 1
1372 : 0 : invStilde2 = invStilde * op%R%vec(col_move)
1373 [ # # ]: 0 : DO row_move = 1, new_tail
1374 [ # # ]: 0 : IF ( row_move .EQ. positionRow ) row = row + 1
1375 : : !row = row_move + (1+SIGN(1,row_move-positionRow))/2
1376 : : ! Compute for all rows and cols M <= M - Q 1/S R
1377 : : !if(row_move>=tailb.and.row_move<=taile.and.col_move>=tailb.and.col_move<=taile) then
1378 : : op%M%mat(row_move,col_move) = op%M%mat(row,col) &
1379 : 0 : - op%Q%vec(row_move)*invStilde2
1380 : : !else
1381 : : ! op%M%mat(row_move,col_move) = op%M%mat(row,col)
1382 : : !endif
1383 : 0 : op%M%mat_tau(row_move,col_move) = op%M%mat_tau(row,col)
1384 : 0 : row = row + 1
1385 : : END DO
1386 : 0 : col = col + 1
1387 : : END DO
1388 : 0 : CALL MatrixHybComplex_setSize(op%M,new_tail)
1389 : :
1390 [ # # ]: 0 : IF ( op%antiShift .EQV. .TRUE. ) THEN ! antisegment
1391 : : if(3==4) then
1392 : : ! Shift if necessary according to op%antishift
1393 : : ! shift DIM=2 (col)
1394 : : CALL VectorComplex_init(vec_tmp,new_tail)
1395 : : CALL VectorInt_init(vecI_tmp,new_tail)
1396 : : p = 1
1397 : : m = 1
1398 : : count = 0
1399 : : DO WHILE ( count .NE. new_tail )
1400 : : vec_tmp%vec(1:new_tail) = op%M%mat(1:new_tail,m)
1401 : : vecI_tmp%vec(1:new_tail) = op%M%mat_tau(1:new_tail,m)
1402 : : i = m
1403 : : !j = m+p
1404 : : MODCYCLE(m+p, new_tail, j)
1405 : : DO WHILE (j .NE. m)
1406 : : op%M%mat(1:new_tail,i) = op%M%mat(1:new_tail,j)
1407 : : op%M%mat_tau(1:new_tail,i) = op%M%mat_tau(1:new_tail,j)
1408 : : i = j
1409 : : MODCYCLE(j+p, new_tail, j)
1410 : : count = count+1
1411 : : END DO
1412 : : op%M%mat(1:new_tail,i) = vec_tmp%vec(1:new_tail)
1413 : : op%M%mat_tau(1:new_tail,i) = vecI_tmp%vec(1:new_tail)
1414 : : count = count+1
1415 : : m = m+1
1416 : : END DO
1417 : : CALL VectorComplex_destroy(vec_tmp)
1418 : : CALL VectorInt_destroy(vecI_tmp)
1419 : : !op%M(aF)%mat(1:new_tail,1:new_tail) = &
1420 : : ! CSHIFT(op%M(aF)%mat(1:new_tail,1:new_tail), SHIFT=1, DIM=2) ! Shift to the top
1421 : : !op%M(aF)%mat_tau(1:new_tail,1:new_tail) = &
1422 : : ! CSHIFT(op%M(aF)%mat_tau(1:new_tail,1:new_tail), SHIFT=1, DIM=2) ! Shift to the top
1423 : : endif
1424 [ # # # # ]: 0 : if (new_tail>0.and.op%Fshift(af+1)>op%Fshift(af)) then
1425 : : op%M%mat(1:new_tail,op%Fshift(af)+1:op%Fshift(af+1)) = &
1426 [ # # # # ]: 0 : CSHIFT(op%M%mat(1:new_tail,op%Fshift(af)+1:op%Fshift(af+1)), SHIFT=1, DIM=2) ! Shift to the top
1427 : : op%M%mat_tau(1:new_tail,op%Fshift(af)+1:op%Fshift(af+1)) = &
1428 [ # # # # ]: 0 : CSHIFT(op%M%mat_tau(1:new_tail,op%Fshift(af)+1:op%Fshift(af+1)), SHIFT=1, DIM=2) ! Shift to the top
1429 : : end if
1430 : : END IF
1431 : : ! !write(6,*) "after "
1432 : : ! CALL MatrixHybComplex_print(op%M(aF),opt_print=1)
1433 : :
1434 [ # # ]: 0 : IF ( op%doCheck .EQV. .TRUE. ) THEN
1435 : : !#ifdef CTQMC_CHECK
1436 : 0 : CALL BathOperatoroffdiagComplex_checkM(op,particle)
1437 : : !#endif
1438 : : END IF
1439 : 0 : do it=1,op%sumtails
1440 : : !write(6,*) " setMRemove end M",(op%M%mat(it,it1),it1=1,op%sumtails)
1441 : : enddo
1442 : :
1443 : 0 : op%MRemoveFlag = .FALSE.
1444 : :
1445 : 0 : END SUBROUTINE BathOperatoroffdiagComplex_setMRemove
1446 : : !!***
1447 : :
1448 : : !!****f* ABINIT/m_BathOperatoroffdiagComplex/BathOperatoroffdiagComplex_swap
1449 : : !! NAME
1450 : : !! BathOperatoroffdiagComplex_swap
1451 : : !!
1452 : : !! FUNCTION
1453 : : !! Recompute 2 M matrix swaping the segments (used for Global moves)
1454 : : !!
1455 : : !! COPYRIGHT
1456 : : !! Copyright (C) 2013-2025 ABINIT group (J. Bieder)
1457 : : !! This file is distributed under the terms of the
1458 : : !! GNU General Public License, see ~abinit/COPYING
1459 : : !! or http://www.gnu.org/copyleft/gpl.txt .
1460 : : !!
1461 : : !! INPUTS
1462 : : !! op=bath operator
1463 : : !! iflavor1=flavor to swap with the next one
1464 : : !! iflavor2=favor to swap with the previous one
1465 : : !!
1466 : : !! OUTPUT
1467 : : !!
1468 : : !! SIDE EFFECTS
1469 : : !!
1470 : : !! NOTES
1471 : : !!
1472 : : !! SOURCE
1473 : :
1474 : 0 : SUBROUTINE BathOperatoroffdiagComplex_swap(op, flavor1, flavor2)
1475 : :
1476 : : !Arguments ------------------------------------
1477 : : TYPE(BathOperatoroffdiagComplex), INTENT(INOUT) :: op
1478 : : INTEGER , INTENT(IN ) :: flavor1
1479 : : INTEGER , INTENT(IN ) :: flavor2
1480 : : INTEGER :: ii,iflavort,itmptail,flavora,flavorb
1481 : 0 : COMPLEX(KIND=8), ALLOCATABLE, DIMENSION(:,:) :: mat_temp
1482 : 0 : INTEGER , ALLOCATABLE, DIMENSION(:,:) :: mat_tau_temp
1483 : :
1484 [ # # ]: 0 : if(flavor1>flavor2) then
1485 : : flavora=flavor2
1486 : : flavorb=flavor1
1487 : : else
1488 : 0 : flavora=flavor1
1489 : 0 : flavorb=flavor2
1490 : : endif
1491 [ # # # # : 0 : MALLOC(mat_temp,(1:op%sumtails,1:op%sumtails))
# # # # #
# # # # #
# # ]
1492 [ # # # # : 0 : MALLOC(mat_tau_temp,(1:op%sumtails,1:op%sumtails))
# # # # #
# # # # #
# # ]
1493 : : !mat_temp= op%M%mat
1494 : : !mat_tau_temp= op%M%mat_tau
1495 : : !it1=0
1496 : : !do iflav1=1,op%flavors
1497 : : ! do ii1=1,op%tails(iflav1)
1498 : : ! it1=it1+1
1499 : : ! it2=0
1500 : : ! do iflav2=1,op%flavors
1501 : : ! do ii2=1,op%tails(iflav1)
1502 : : ! it2=it2+1
1503 : : ! op%M%mat(it1,it2)=
1504 : : ! enddo
1505 : : ! enddo
1506 : : ! enddo
1507 : : !enddo
1508 : : if(3==3) then
1509 [ # # # # : 0 : op%M=op%M_update
# # # # #
# # # ]
1510 [ # # ]: 0 : if (op%sumtails>0) then
1511 : : ! shift block flavorb at the place of flavora (column)
1512 [ # # ]: 0 : if (op%Fshift(flavorb+1)>op%Fshift(flavora)) then
1513 [ # # ]: 0 : do ii=1, op%tails(flavorb)
1514 : : op%M%mat(op%Fshift(flavora)+1:op%Fshift(flavorb+1) , 1:op%sumtails) = &
1515 [ # # # # ]: 0 : CSHIFT( op%M%mat(op%Fshift(flavora)+1:op%Fshift(flavorb+1) , 1:op%sumtails) , SHIFT=-1 , DIM=1)
1516 : : op%M%mat_tau(op%Fshift(flavora)+1:op%Fshift(flavorb+1) , 1:op%sumtails) = &
1517 [ # # # # ]: 0 : CSHIFT( op%M%mat_tau(op%Fshift(flavora)+1:op%Fshift(flavorb+1) , 1:op%sumtails) , SHIFT=-1 , DIM=1)
1518 : : enddo
1519 : : end if
1520 : :
1521 : : ! shift block flavora at the place of flavorb (column)
1522 [ # # ]: 0 : if (op%Fshift(flavorb)>op%Fshift(flavora)) then
1523 [ # # ]: 0 : do ii=1, op%tails(flavora)
1524 : : op%M%mat(op%Fshift(flavora)+op%tails(flavorb)+&
1525 : : & 1:op%Fshift(flavorb)+op%tails(flavorb) , 1:op%sumtails) = &
1526 : : CSHIFT( op%M%mat( op%Fshift(flavora)+op%tails(flavorb)&
1527 [ # # # # ]: 0 : & +1:op%Fshift(flavorb)+op%tails(flavorb) , 1:op%sumtails) , SHIFT=1 , DIM=1)
1528 : : op%M%mat_tau(op%Fshift(flavora)+op%tails(flavorb)+1:op%Fshift(flavorb)+&
1529 : : & op%tails(flavorb) , 1:op%sumtails) = &
1530 : : CSHIFT( op%M%mat_tau( op%Fshift(flavora)+op%tails(flavorb)+&
1531 [ # # # # ]: 0 : & 1:op%Fshift(flavorb)+op%tails(flavorb) , 1:op%sumtails) , SHIFT=1 , DIM=1)
1532 : : enddo
1533 : : end if
1534 : :
1535 : : ! shift block flavorb at the place of flavora (row)
1536 [ # # ]: 0 : if (op%Fshift(flavorb+1)>op%Fshift(flavora)) then
1537 [ # # ]: 0 : do ii=1, op%tails(flavorb)
1538 : : op%M%mat(1:op%sumtails , op%Fshift(flavora)+1:op%Fshift(flavorb+1)) = &
1539 [ # # # # ]: 0 : CSHIFT( op%M%mat(1:op%sumtails , op%Fshift(flavora)+1:op%Fshift(flavorb+1)) , SHIFT=-1 , DIM=2)
1540 : : op%M%mat_tau(1:op%sumtails , op%Fshift(flavora)+1:op%Fshift(flavorb+1)) = &
1541 [ # # # # ]: 0 : CSHIFT( op%M%mat_tau(1:op%sumtails , op%Fshift(flavora)+1:op%Fshift(flavorb+1)) , SHIFT=-1 , DIM=2)
1542 : : enddo
1543 : : end if
1544 : :
1545 : : ! shift block flavora at the place of flavorb (row)
1546 [ # # ]: 0 : if (op%Fshift(flavorb)>op%Fshift(flavora)) then
1547 [ # # ]: 0 : do ii=1, op%tails(flavora)
1548 : : op%M%mat(1:op%sumtails , op%Fshift(flavora)+op%tails(flavorb)+1:op%Fshift(flavorb)+op%tails(flavorb)) = &
1549 : : CSHIFT( op%M%mat(1:op%sumtails ,op%Fshift(flavora)+op%tails(flavorb)&
1550 [ # # # # ]: 0 : & +1:op%Fshift(flavorb)+op%tails(flavorb)) , SHIFT=1 , DIM=2)
1551 : : op%M%mat_tau(1:op%sumtails ,op%Fshift(flavora)+op%tails(flavorb)+&
1552 : : & 1:op%Fshift(flavorb)+op%tails(flavorb) ) = &
1553 : : CSHIFT( op%M%mat_tau(1:op%sumtails ,op%Fshift(flavora)+&
1554 [ # # # # ]: 0 : & op%tails(flavorb)+1:op%Fshift(flavorb)+op%tails(flavorb) ) , SHIFT=1 , DIM=2)
1555 : : enddo
1556 : : end if
1557 : : end if
1558 : : endif
1559 : : if(3==4) then
1560 : : op%M=op%M_update
1561 : : endif
1562 : :
1563 : :
1564 [ # # ]: 0 : do iflavort=flavora+1,flavorb
1565 : 0 : op%Fshift(iflavort)=op%Fshift(iflavort)+op%tails(flavorb)-op%tails(flavora)
1566 : : enddo
1567 : :
1568 : 0 : itmptail=op%tails(flavora)
1569 : 0 : op%tails(flavora)=op%tails(flavorb)
1570 : 0 : op%tails(flavorb)=itmptail
1571 [ # # ]: 0 : FREE(mat_temp)
1572 [ # # ]: 0 : FREE(mat_tau_temp)
1573 : :
1574 : 0 : END SUBROUTINE BathOperatoroffdiagComplex_swap
1575 : : !!***
1576 : :
1577 : : !!****f* ABINIT/m_BathOperatoroffdiagComplex/BathOperatoroffdiagComplex_initF
1578 : : !! NAME
1579 : : !! BathOperatoroffdiagComplex_initF
1580 : : !!
1581 : : !! FUNCTION
1582 : : !! Copy input hybridization functions from a file
1583 : : !!
1584 : : !! COPYRIGHT
1585 : : !! Copyright (C) 2013-2025 ABINIT group (J. Bieder)
1586 : : !! This file is distributed under the terms of the
1587 : : !! GNU General Public License, see ~abinit/COPYING
1588 : : !! or http://www.gnu.org/copyleft/gpl.txt .
1589 : : !!
1590 : : !! INPUTS
1591 : : !! op=bath operator
1592 : : !! ifstream=file stream to read F
1593 : : !!
1594 : : !! OUTPUT
1595 : : !! argout(sizeout)=description
1596 : : !!
1597 : : !! SIDE EFFECTS
1598 : : !!
1599 : : !! NOTES
1600 : : !!
1601 : : !! SOURCE
1602 : :
1603 : 0 : SUBROUTINE BathOperatoroffdiagComplex_initF(op,ifstream)
1604 : :
1605 : : !Arguments ----------------------
1606 : : TYPE(BathOperatoroffdiagComplex), INTENT(INOUT) :: op
1607 : : INTEGER , INTENT(IN ) :: ifstream
1608 : : !Local variables ----------------
1609 : : INTEGER :: iflavor1
1610 : : INTEGER :: iflavor2
1611 : : INTEGER :: sample
1612 : :
1613 [ # # ]: 0 : IF ( op%set .EQV. .FALSE. ) &
1614 : 0 : CALL ERROR("BathOperatoroffdiagComplex_initF : BathOperatoroffdiagComplex not set ")
1615 : :
1616 [ # # ]: 0 : DO iflavor1=1,op%flavors
1617 [ # # ]: 0 : DO iflavor2=2,op%flavors
1618 [ # # ]: 0 : DO sample = 1, op%sizeHybrid
1619 : 0 : READ(ifstream,*) op%F(sample,iflavor1,iflavor2)
1620 : : END DO
1621 : : END DO
1622 : : END DO
1623 : 0 : END SUBROUTINE BathOperatoroffdiagComplex_initF
1624 : : !!***
1625 : :
1626 : : !!****f* ABINIT/m_BathOperatoroffdiagComplex/BathOperatoroffdiagComplex_setF
1627 : : !! NAME
1628 : : !! BathOperatoroffdiagComplex_setF
1629 : : !!
1630 : : !! FUNCTION
1631 : : !! Copy F from input array
1632 : : !!
1633 : : !! COPYRIGHT
1634 : : !! Copyright (C) 2013-2025 ABINIT group (J. Bieder)
1635 : : !! This file is distributed under the terms of the
1636 : : !! GNU General Public License, see ~abinit/COPYING
1637 : : !! or http://www.gnu.org/copyleft/gpl.txt .
1638 : : !!
1639 : : !! INPUTS
1640 : : !! op=bath operator
1641 : : !! F=array of the hybridization function
1642 : : !!
1643 : : !! OUTPUT
1644 : : !!
1645 : : !! SIDE EFFECTS
1646 : : !!
1647 : : !! NOTES
1648 : : !!
1649 : : !! SOURCE
1650 : :
1651 [ # # ]: 0 : SUBROUTINE BathOperatoroffdiagComplex_setF(op,F)
1652 : :
1653 : : !Arguments ------------------------------------
1654 : : TYPE(BathOperatoroffdiagComplex) , INTENT(INOUT) :: op
1655 : : COMPLEX(KIND=8), DIMENSION(:,:,:) , INTENT(IN ) :: F
1656 : : !Arguments ------------------------------------
1657 : : INTEGER :: iflavor1
1658 : : INTEGER :: iflavor2
1659 : : INTEGER :: sample
1660 : : INTEGER :: length
1661 : :
1662 [ # # ]: 0 : IF ( op%set .EQV. .FALSE. ) &
1663 : 0 : CALL ERROR("BathOperatoroffdiagComplex_setF : BathOperatoroffdiagComplex not set ")
1664 : :
1665 [ # # ]: 0 : length = SIZE(F)
1666 [ # # ]: 0 : IF ( length .NE. (op%flavors * op%flavors * op%sizeHybrid) ) &
1667 : 0 : CALL ERROR("BathOperatoroffdiagComplex_setF : wrong input F ")
1668 : :
1669 [ # # ]: 0 : DO iflavor1=1,op%flavors
1670 [ # # ]: 0 : DO iflavor2=1,op%flavors
1671 [ # # ]: 0 : DO sample = 1, op%sizeHybrid
1672 : 0 : op%F(sample,iflavor1,iflavor2) = F(sample,iflavor1,iflavor2)
1673 : : END DO
1674 : : END DO
1675 : : END DO
1676 : 0 : END SUBROUTINE BathOperatoroffdiagComplex_setF
1677 : : !!***
1678 : :
1679 : : !!****f* ABINIT/m_BathOperatoroffdiagComplex/BathOperatoroffdiagComplex_printF
1680 : : !! NAME
1681 : : !! BathOperatoroffdiagComplex_printF
1682 : : !!
1683 : : !! FUNCTION
1684 : : !! print F function
1685 : : !!
1686 : : !! COPYRIGHT
1687 : : !! Copyright (C) 2013-2025 ABINIT group (J. Bieder)
1688 : : !! This file is distributed under the terms of the
1689 : : !! GNU General Public License, see ~abinit/COPYING
1690 : : !! or http://www.gnu.org/copyleft/gpl.txt .
1691 : : !!
1692 : : !! INPUTS
1693 : : !! op=bath operator
1694 : : !! ostream=file stream to write in
1695 : : !!
1696 : : !! OUTPUT
1697 : : !!
1698 : : !! SIDE EFFECTS
1699 : : !!
1700 : : !! NOTES
1701 : : !!
1702 : : !! SOURCE
1703 : :
1704 : 0 : SUBROUTINE BathOperatoroffdiagComplex_printF(op,ostream)
1705 : :
1706 : : !Arguments ------------------------------------
1707 : : TYPE(BathOperatoroffdiagComplex), INTENT(INOUT) :: op
1708 : : INTEGER,OPTIONAL , INTENT(IN ) :: ostream
1709 : : !Local variables ------------------------------
1710 : : CHARACTER(LEN=4) :: aflavor
1711 : : CHARACTER(LEN=50) :: string
1712 : : INTEGER :: iflavor1
1713 : : INTEGER :: iflavor2
1714 : : INTEGER :: sample
1715 : : INTEGER :: ostream_val
1716 : :
1717 [ # # ]: 0 : IF ( PRESENT(ostream) ) THEN
1718 : 0 : ostream_val = ostream
1719 : : ELSE
1720 : 0 : ostream_val = 65
1721 : 0 : OPEN(UNIT=ostream_val, FILE="F.dat")
1722 : : END IF
1723 : :
1724 : 0 : WRITE(aflavor,'(I4)') (op%flavors*op%flavors+1)
1725 [ # # # # ]: 0 : string = '(1x,'//TRIM(ADJUSTL(aflavor))//'E22.14)'
1726 [ # # ]: 0 : DO sample = 1, op%sizeHybrid
1727 : 0 : WRITE(ostream_val,string) (sample-1)*op%dt, ((op%F(sample,iflavor1,iflavor2),&
1728 [ # # # # : 0 : iflavor1=1,op%flavors),iflavor2=1,op%flavors)
# # # # ]
1729 : : END DO
1730 : : !CALL FLUSH(ostream_val)
1731 : :
1732 [ # # ]: 0 : IF ( .NOT. PRESENT(ostream) ) &
1733 : 0 : CLOSE(ostream_val)
1734 : :
1735 : 0 : END SUBROUTINE BathOperatoroffdiagComplex_printF
1736 : : !!***
1737 : :
1738 : : !!****f* ABINIT/m_BathOperatoroffdiagComplex/BathOperatoroffdiagComplex_printM
1739 : : !! NAME
1740 : : !! BathOperatoroffdiagComplex_printM
1741 : : !!
1742 : : !! FUNCTION
1743 : : !! print M =F^{-1} matrix
1744 : : !!
1745 : : !! COPYRIGHT
1746 : : !! Copyright (C) 2013-2025 ABINIT group (J. Bieder)
1747 : : !! This file is distributed under the terms of the
1748 : : !! GNU General Public License, see ~abinit/COPYING
1749 : : !! or http://www.gnu.org/copyleft/gpl.txt .
1750 : : !!
1751 : : !! INPUTS
1752 : : !! op=bath operator
1753 : : !! ostream=file stream to write in
1754 : : !!
1755 : : !! OUTPUT
1756 : : !! argout(sizeout)=description
1757 : : !!
1758 : : !! SIDE EFFECTS
1759 : : !!
1760 : : !! NOTES
1761 : : !!
1762 : : !! SOURCE
1763 : :
1764 : 0 : SUBROUTINE BathOperatoroffdiagComplex_printM(op,ostream)
1765 : :
1766 : : !Arguments ------------------------------------
1767 : : TYPE(BathOperatoroffdiagComplex), INTENT(IN) :: op
1768 : : INTEGER, OPTIONAL , INTENT(IN) :: ostream
1769 : : !Local variables ------------------------------
1770 : : INTEGER :: ostream_val
1771 : :
1772 [ # # ]: 0 : IF ( op%activeFlavor .LE. 0 ) &
1773 : 0 : CALL ERROR("BathOperatoroffdiagComplex_printM : no active hybrid function ")
1774 : 0 : ostream_val = 6
1775 [ # # ]: 0 : IF ( PRESENT(ostream) ) ostream_val = ostream
1776 : 0 : CALL MatrixHybComplex_print(op%M,ostream_val)
1777 : 0 : END SUBROUTINE BathOperatoroffdiagComplex_printM
1778 : : !!***
1779 : :
1780 : : !!****f* ABINIT/m_BathOperatoroffdiagComplex/BathOperatoroffdiagComplex_printM_matrix
1781 : : !! NAME
1782 : : !! BathOperatoroffdiagComplex_printM_matrix
1783 : : !!
1784 : : !! FUNCTION
1785 : : !! print M =F^{-1} matrix
1786 : : !!
1787 : : !! COPYRIGHT
1788 : : !! Copyright (C) 2013-2025 ABINIT group (J. Bieder)
1789 : : !! This file is distributed under the terms of the
1790 : : !! GNU General Public License, see ~abinit/COPYING
1791 : : !! or http://www.gnu.org/copyleft/gpl.txt .
1792 : : !!
1793 : : !! INPUTS
1794 : : !! op=bath operator
1795 : : !! ostream=file stream to write in
1796 : : !!
1797 : : !! OUTPUT
1798 : : !! argout(sizeout)=description
1799 : : !!
1800 : : !! SIDE EFFECTS
1801 : : !!
1802 : : !! NOTES
1803 : : !!
1804 : : !! SOURCE
1805 : :
1806 : 0 : SUBROUTINE BathOperatoroffdiagComplex_printM_matrix(op,ostream)
1807 : :
1808 : : !Arguments ------------------------------------
1809 : : TYPE(BathOperatoroffdiagComplex), INTENT(IN) :: op
1810 : : INTEGER, OPTIONAL , INTENT(IN) :: ostream
1811 : : !Local variables ------------------------------
1812 : : INTEGER :: iflavor1
1813 : : INTEGER :: i1,it1,it2
1814 : : CHARACTER(LEN=22) :: string
1815 : : CHARACTER(LEN=22) :: string2
1816 : : CHARACTER(LEN=4 ) :: size
1817 : :
1818 : : ABI_UNUSED(ostream)
1819 : :
1820 : 0 : WRITE(size,'(I4)') op%sumtails
1821 [ # # # # ]: 0 : string ='(i2,x,i3,a,'//TRIM(ADJUSTL(size))//'(E5.2,1x))'
1822 [ # # # # ]: 0 : string2 ='(6x,'//TRIM(ADJUSTL(size))//'(i6))'
1823 : 0 : open(unit=222, file="M_matrix.dat")
1824 : 0 : open(unit=223, file="M_matrix_tau.dat")
1825 : 0 : it1=0
1826 [ # # # # : 0 : write(222,string2) ((i1,i1=1,op%tails(iflavor1)),iflavor1=1,op%flavors)
# # # # ]
1827 [ # # ]: 0 : do iflavor1=1, op%flavors
1828 [ # # ]: 0 : do i1=1, op%tails(iflavor1)
1829 : 0 : it1=it1+1
1830 [ # # # # ]: 0 : write(222,string) iflavor1,i1,'|',(op%M%mat(it1,it2),it2=1,op%sumtails)
1831 : : enddo
1832 : : enddo
1833 : :
1834 : :
1835 : 0 : END SUBROUTINE BathOperatoroffdiagComplex_printM_matrix
1836 : : !!***
1837 : :
1838 : : !!****f* ABINIT/m_BathOperatoroffdiagComplex/ BathOperatoroffdiagComplex_destroy
1839 : : !! NAME
1840 : : !! BathOperatoroffdiagComplex_destroy
1841 : : !!
1842 : : !! FUNCTION
1843 : : !! Deallocate and reset every thing
1844 : : !!
1845 : : !! COPYRIGHT
1846 : : !! Copyright (C) 2013-2025 ABINIT group (J. Bieder)
1847 : : !! This file is distributed under the terms of the
1848 : : !! GNU General Public License, see ~abinit/COPYING
1849 : : !! or http://www.gnu.org/copyleft/gpl.txt .
1850 : : !!
1851 : : !! INPUTS
1852 : : !! op=bath operator
1853 : : !!
1854 : : !! OUTPUT
1855 : : !!
1856 : : !! SIDE EFFECTS
1857 : : !!
1858 : : !! NOTES
1859 : : !!
1860 : : !! SOURCE
1861 : :
1862 : 0 : SUBROUTINE BathOperatoroffdiagComplex_destroy(op)
1863 : :
1864 : : TYPE(BathOperatoroffdiagComplex), INTENT(INOUT) :: op
1865 : :
1866 : 0 : CALL MatrixHybComplex_destroy(op%M)
1867 : 0 : CALL MatrixHybComplex_destroy(op%M_update)
1868 : :
1869 : 0 : CALL VectorComplex_destroy(op%R)
1870 : 0 : CALL VectorComplex_destroy(op%Q)
1871 : 0 : CALL Vector_destroy(op%Rtau)
1872 : 0 : CALL Vector_destroy(op%Qtau)
1873 [ # # ]: 0 : FREEIF(op%F)
1874 [ # # ]: 0 : FREEIF(op%Fshift)
1875 [ # # ]: 0 : FREEIF(op%tails)
1876 : :
1877 : 0 : op%MAddFlag = .FALSE.
1878 : 0 : op%MRemoveFlag = .FALSE.
1879 : 0 : op%flavors = 0
1880 : 0 : op%beta = 0.d0
1881 : 0 : op%dt = 0.d0
1882 : 0 : op%inv_dt = 0.d0
1883 : 0 : op%samples = 0
1884 : 0 : op%sizeHybrid = 0
1885 : 0 : op%activeFlavor = 0
1886 : 0 : op%updatePosRow = 0
1887 : 0 : op%updatePosCol = 0
1888 : :
1889 : 0 : END SUBROUTINE BathOperatoroffdiagComplex_destroy
1890 : : !!***
1891 : :
1892 : : !!****f* ABINIT/m_BathOperatoroffdiagComplex/BathOperatoroffdiagComplex_doCheck
1893 : : !! NAME
1894 : : !! BathOperatoroffdiagComplex_doCheck
1895 : : !!
1896 : : !! FUNCTION
1897 : : !! Just store if we perfom check for updates of M
1898 : : !!
1899 : : !! COPYRIGHT
1900 : : !! Copyright (C) 2013-2025 ABINIT group (J. Bieder)
1901 : : !! This file is distributed under the terms of the
1902 : : !! GNU General Public License, see ~abinit/COPYING
1903 : : !! or http://www.gnu.org/copyleft/gpl.txt .
1904 : : !!
1905 : : !! INPUTS
1906 : : !! op=bath operator
1907 : : !! opt_check=second bit should be one
1908 : : !!
1909 : : !! OUTPUT
1910 : : !!
1911 : : !! SIDE EFFECTS
1912 : : !!
1913 : : !! NOTES
1914 : : !!
1915 : : !! SOURCE
1916 : :
1917 : 0 : SUBROUTINE BathOperatoroffdiagComplex_doCheck(op,opt_check)
1918 : :
1919 : : !Arguments ------------------------------------
1920 : : TYPE(BathOperatoroffdiagComplex) , INTENT(INOUT) :: op
1921 : : INTEGER , INTENT(IN ) :: opt_check
1922 : :
1923 [ # # ]: 0 : IF ( opt_check .GE. 2 ) &
1924 : 0 : op%doCheck = .TRUE.
1925 : 0 : END SUBROUTINE BathOperatoroffdiagComplex_doCheck
1926 : : !!***
1927 : :
1928 : : !!****f* ABINIT/m_BathOperatoroffdiagComplex/BathOperatoroffdiagComplex_checkM
1929 : : !! NAME
1930 : : !! BathOperatoroffdiagComplex_checkM
1931 : : !!
1932 : : !! FUNCTION
1933 : : !! compute from scratch the M matrix and compare it
1934 : : !! with the already computed M matrix
1935 : : !!
1936 : : !! COPYRIGHT
1937 : : !! Copyright (C) 2013-2025 ABINIT group (J. Bieder)
1938 : : !! This file is distributed under the terms of the
1939 : : !! GNU General Public License, see ~abinit/COPYING
1940 : : !! or http://www.gnu.org/copyleft/gpl.txt .
1941 : : !!
1942 : : !! INPUTS
1943 : : !! op=bath operator
1944 : : !! particle=list of all segments of the active flavor
1945 : : !!
1946 : : !! OUTPUT
1947 : : !!
1948 : : !! SIDE EFFECTS
1949 : : !!
1950 : : !! NOTES
1951 : : !!
1952 : : !! SOURCE
1953 : :
1954 [ # # ]: 0 : SUBROUTINE BathOperatoroffdiagComplex_checkM(op,particle)
1955 : :
1956 : : !Arguments ------------------------------------
1957 : : TYPE(BathOperatoroffdiagComplex) , INTENT(INOUT) :: op
1958 : : TYPE(ListCdagC) , INTENT(IN ) :: particle(:)
1959 : : !Local variables ------------------------------
1960 : : ! TYPE(MatrixHybComplex) :: checkMatrix
1961 : : LOGICAL :: checkTau
1962 : : INTEGER :: tail
1963 : : INTEGER :: iC
1964 : : INTEGER :: iCdag
1965 : : INTEGER :: aF
1966 : : INTEGER :: iflavora
1967 : : INTEGER :: iflavorb,it !,it1
1968 : : CHARACTER(LEN=6) :: a
1969 : : DOUBLE PRECISION :: time
1970 : : DOUBLE PRECISION :: beta
1971 : : DOUBLE PRECISION :: mbeta_two
1972 : : DOUBLE PRECISION :: errorabs
1973 : : DOUBLE PRECISION :: errormax
1974 : : DOUBLE PRECISION :: error1
1975 : : DOUBLE PRECISION :: errorrel
1976 : : DOUBLE PRECISION :: tc
1977 : : DOUBLE PRECISION :: tCdag
1978 : : COMPLEX(KIND=8) :: sumMmat
1979 : : COMPLEX(KIND=8) :: sumCheck
1980 : : #include "BathOperatoroffdiagComplex_hybrid.h"
1981 : :
1982 : 0 : aF = op%activeFlavor
1983 : : !Construction de la matrix
1984 : 0 : tail = op%sumtails
1985 : : ! CALL MatrixHybComplex_init(checkMatrix,op%iTech,size=tail,Wmax=op%samples)
1986 : : ! CALL MatrixHybComplex_setSize(checkMatrix,tail)
1987 : :
1988 : : ! --- set size of the matrix
1989 : 0 : CALL MatrixHybComplex_setSize(op%M_update,tail)
1990 : :
1991 : : ! --- compute useful quantities
1992 : 0 : beta = op%beta
1993 : 0 : mbeta_two = -beta*0.5d0
1994 : 0 : op%checkNumber = op%checkNumber + 1
1995 [ # # ]: 0 : IF ( tail .NE. op%M%tail ) THEN
1996 : 0 : CALL WARN("BathOperatoroffdiagComplex_checkM : tails are different ")
1997 : 0 : RETURN
1998 : : END IF
1999 : :
2000 : 0 : do it=1,op%sumtails
2001 : : !write(6,*) " checkM begin M_update%mat_tau",(op%M_update%mat_tau(it,it1),it1=1,op%sumtails)
2002 : : enddo
2003 : : ! --- build matrix
2004 : : !CALL ListCdagC_print(particle)
2005 [ # # ]: 0 : DO iflavora = 1, op%flavors
2006 [ # # ]: 0 : DO iCdag = 1, op%tails(iflavora)
2007 : 0 : tCdag = particle(iflavora)%list(iCdag,Cdag_)
2008 : : !write(6,*) " checkM a",iflavora,tCdag
2009 [ # # ]: 0 : DO iflavorb = 1, op%flavors
2010 [ # # ]: 0 : DO iC = 1, op%tails(iflavorb)
2011 : : !tC = particle%list(C_,iC).MOD.beta
2012 [ # # ]: 0 : MODCYCLE(particle(iflavorb)%list(iC,C_),beta,tC) ! tC is tC, or Tc-Beta if tc>beta
2013 : : !write(6,*) " checkM b",iflavorb,tC
2014 [ # # ]: 0 : time = tC - tCdag ! time is positive or negative but lower than beta
2015 : : !write(6,*) " checkM time",time
2016 : :
2017 : : #include "BathOperatoroffdiagComplex_hybrid"
2018 : :
2019 : 0 : op%M_update%mat(op%Fshift(iflavorb)+iC,op%Fshift(iflavora)+iCdag) = hybrid
2020 : :
2021 : 0 : time = time + ( SIGN(1.d0,time) - 1.d0 )*mbeta_two
2022 : 0 : op%M_update%mat_tau(op%Fshift(iflavora)+iCdag,op%Fshift(iflavorb)+iC) = INT ( (time*op%inv_dt) +1.5d0 )
2023 : : !write(6,*) " checkM mat_tau",INT ( (time*op%inv_dt) +1.5d0 )
2024 : : !write(6,*) " checkM shifts",op%Fshift(iflavorb),iCdag,op%Fshift(iflavora),iC
2025 : : END DO ! iC
2026 : : END DO ! iflavorb
2027 : : END DO ! iCdag
2028 : : END DO ! iflavora
2029 : :
2030 : : ! CALL MatrixHybComplex_Print(checkMatrix)
2031 : : ! --- Inverse matrix
2032 : 0 : CALL MatrixHybComplex_inverse(op%M_update)
2033 : :
2034 : : ! CALL MatrixHybComplex_Print(checkMatrix)
2035 : 0 : do it=1,op%sumtails
2036 : : !write(6,*) " checkM end M_update%mat_tau",(op%M_update%mat_tau(it,it1),it1=1,op%sumtails)
2037 : : enddo
2038 : : do it=1,op%sumtails
2039 : : !write(6,*) " checkM end M_update",(op%M%mat(it,it1),it1=1,op%sumtails)
2040 : : enddo
2041 : :
2042 : : ! --- Compare M_update and M to check if calculation of M is correct
2043 : : sumMmat =cmplx(0.d0,0.d0,kind=8)
2044 : : sumCheck=cmplx(0.d0,0.d0,kind=8)
2045 : : error1 = 0.d0
2046 : : errormax = 0.d0
2047 : : checkTau = .FALSE.
2048 [ # # ]: 0 : DO iCdag = 1, tail
2049 [ # # ]: 0 : Do iC =1, tail
2050 : : errorrel= ABS((op%M_update%mat(iC, iCdag) - &
2051 : 0 : op%M%mat(iC,iCdag))/op%M_update%mat(iC,iCdag))
2052 : : errorabs= ABS(op%M_update%mat(iC, iCdag) - &
2053 : 0 : op%M%mat(iC,iCdag))
2054 [ # # # # ]: 0 : IF ( errorrel .gt. errormax .and. errorabs .gt. 0.001d0 ) errormax = errorrel
2055 : : ! write(6,*) " checkM ", errorrel,errorabs
2056 [ # # ]: 0 : IF ( op%M_update%mat_tau(iC,iCdag) .NE. op%M%mat_tau(iC,iCdag) ) then
2057 : 0 : checkTau = .TRUE.
2058 : : !write(6,*) "op%M_update%mat_tau(iC,iCdag), op%M%mat_tau(iC,iCdag)",op%M_update%mat_tau(iC,iCdag), op%M%mat_tau(iC,iCdag)
2059 : : !call flush(6)
2060 : 0 : CALL ERROR("BathOperatoroffdiagComplex_checkM : "//a//"% ")
2061 : : ENDIF
2062 : :
2063 : : END DO
2064 : : END DO
2065 : :
2066 [ # # ]: 0 : IF ( checkTau .EQV. .TRUE. ) THEN
2067 : 0 : CALL WARN("BathOperatoroffdiagComplex_checkM : mat_tau differs should be")
2068 : 0 : CALL MatrixHybComplex_print(op%M_update,opt_print=1)
2069 : 0 : CALL WARN("BathOperatoroffdiagComplex_checkM : whereas it is")
2070 : 0 : CALL MatrixHybComplex_print(op%M,opt_print=1)
2071 : : END IF
2072 : 0 : op%meanError = op%meanError + errormax
2073 [ # # ]: 0 : IF ( errormax .GT. 1.d0 ) THEN
2074 : 0 : WRITE(a,'(I4)') INT(error1*100.d0)
2075 : : !write(6,'(I4)') INT(error1*100.d0)
2076 : : ! CALL MatrixHybComplex_Print(op%M)
2077 : 0 : CALL WARN("BathOperatoroffdiagComplex_checkM")
2078 : : END IF
2079 : : ! CALL MatrixHybComplex_destroy(checkMatrix)
2080 : : END SUBROUTINE BathOperatoroffdiagComplex_checkM
2081 : : !!***
2082 : :
2083 : : !!****f* ABINIT/m_BathOperatoroffdiagComplex/BathOperatoroffdiagComplex_recomputeM
2084 : : !! NAME
2085 : : !! BathOperatoroffdiagComplex_recomputeM
2086 : : !!
2087 : : !! FUNCTION
2088 : : !! compute from scratch the M matrix
2089 : : !!
2090 : : !! COPYRIGHT
2091 : : !! Copyright (C) 2013-2025 ABINIT group (B. Amadon)
2092 : : !! This file is distributed under the terms of the
2093 : : !! GNU General Public License, see ~abinit/COPYING
2094 : : !! or http://www.gnu.org/copyleft/gpl.txt .
2095 : : !!
2096 : : !! INPUTS
2097 : : !! op=bath operator
2098 : : !! particle=list of all segments of the active flavor
2099 : : !!
2100 : : !! OUTPUT
2101 : : !!
2102 : : !! SIDE EFFECTS
2103 : : !!
2104 : : !! NOTES
2105 : : !!
2106 : : !! SOURCE
2107 : :
2108 [ # # ]: 0 : SUBROUTINE BathOperatoroffdiagComplex_recomputeM(op,particle,flav_i,flav_j)
2109 : :
2110 : : !Arguments ------------------------------------
2111 : : TYPE(BathOperatoroffdiagComplex) , INTENT(INOUT) :: op
2112 : : TYPE(ListCdagC) , INTENT(IN ) :: particle(:)
2113 : : INTEGER :: flav_i,flav_j
2114 : : !Local variables ------------------------------
2115 : : ! TYPE(MatrixHybComplex) :: checkMatrix
2116 : : INTEGER :: tail
2117 : : INTEGER :: iC
2118 : : INTEGER :: iCdag
2119 : : INTEGER :: aF
2120 : : INTEGER :: iflavora
2121 : : INTEGER :: iflavorb,it !,it1
2122 : : INTEGER :: iflavora_imp
2123 : : INTEGER :: iflavorb_imp
2124 : : !CHARACTER(LEN=6) :: a
2125 : : DOUBLE PRECISION :: time
2126 : : DOUBLE PRECISION :: beta
2127 : : DOUBLE PRECISION :: mbeta_two
2128 : : DOUBLE PRECISION :: tc
2129 : : DOUBLE PRECISION :: tCdag
2130 : : !DOUBLE PRECISION :: sumMmat
2131 : : !DOUBLE PRECISION :: sumCheck
2132 : : #include "BathOperatoroffdiagComplex_hybrid.h"
2133 : :
2134 : 0 : aF = op%activeFlavor
2135 : : !Construction de la matrix
2136 : 0 : tail = op%sumtails
2137 : : ! CALL MatrixHybComplex_init(checkMatrix,op%iTech,size=tail,Wmax=op%samples)
2138 : : ! CALL MatrixHybComplex_setSize(checkMatrix,tail)
2139 : :
2140 : : ! --- set size of the matrix
2141 : 0 : CALL MatrixHybComplex_setSize(op%M_update,tail)
2142 : :
2143 : : ! --- compute useful quantities
2144 : 0 : beta = op%beta
2145 : 0 : mbeta_two = -beta*0.5d0
2146 : 0 : op%checkNumber = op%checkNumber + 1
2147 [ # # ]: 0 : IF ( tail .NE. op%M%tail ) THEN
2148 : 0 : CALL WARN("BathOperatoroffdiagComplex_checkM : tails are different ")
2149 : 0 : RETURN
2150 : : END IF
2151 : :
2152 : 0 : do it=1,op%sumtails
2153 : : !write(6,*) " checkM begin M_update%mat_tau",(op%M_update%mat_tau(it,it1),it1=1,op%sumtails)
2154 : : enddo
2155 : : ! --- build matrix
2156 : : !CALL ListCdagC_print(particle)
2157 [ # # ]: 0 : DO iflavora = 1, op%flavors
2158 : 0 : iflavora_imp=iflavora
2159 [ # # ]: 0 : if(iflavora==flav_i) iflavora_imp=flav_j
2160 [ # # ]: 0 : if(iflavora==flav_j) iflavora_imp=flav_i
2161 [ # # ]: 0 : DO iCdag = 1, op%tails(iflavora_imp)
2162 : 0 : tCdag = particle(iflavora_imp)%list(iCdag,Cdag_)
2163 : : !write(6,*) " checkM a",iflavora,tCdag
2164 [ # # ]: 0 : DO iflavorb = 1, op%flavors
2165 : 0 : iflavorb_imp=iflavorb
2166 [ # # ]: 0 : if(iflavorb==flav_j) iflavorb_imp=flav_i
2167 [ # # ]: 0 : if(iflavorb==flav_i) iflavorb_imp=flav_j
2168 [ # # ]: 0 : DO iC = 1, op%tails(iflavorb_imp)
2169 : : !tC = particle%list(C_,iC).MOD.beta
2170 [ # # ]: 0 : MODCYCLE(particle(iflavorb_imp)%list(iC,C_),beta,tC) ! tC is tC, or Tc-Beta if tc>beta
2171 : : !write(6,*) " checkM b",iflavorb,tC
2172 [ # # ]: 0 : time = tC - tCdag ! time is positive or negative but lower than beta
2173 : : !write(6,*) " checkM time",time
2174 : :
2175 : : #include "BathOperatoroffdiagComplex_hybrid"
2176 : :
2177 : 0 : op%M_update%mat(op%Fshift(iflavorb_imp)+iC,op%Fshift(iflavora_imp)+iCdag) = hybrid
2178 : :
2179 : 0 : time = time + ( SIGN(1.d0,time) - 1.d0 )*mbeta_two
2180 : 0 : op%M_update%mat_tau(op%Fshift(iflavora_imp)+iCdag,op%Fshift(iflavorb_imp)+iC) = INT ( (time*op%inv_dt) +1.5d0 )
2181 : : !write(6,*) " checkM mat_tau",INT ( (time*op%inv_dt) +1.5d0 )
2182 : : !write(6,*) " checkM shifts",op%Fshift(iflavorb),iCdag,op%Fshift(iflavora),iC
2183 : : END DO ! iC
2184 : : END DO ! iflavorb
2185 : : END DO ! iCdag
2186 : : END DO ! iflavora
2187 : :
2188 : : ! CALL MatrixHybComplex_Print(checkMatrix)
2189 : : ! --- Inverse matrix
2190 : 0 : CALL MatrixHybComplex_inverse(op%M_update)
2191 : :
2192 : : ! CALL MatrixHybComplex_Print(checkMatrix)
2193 : 0 : do it=1,op%sumtails
2194 : : !write(6,*) " checkM end M_update%mat_tau",(op%M_update%mat_tau(it,it1),it1=1,op%sumtails)
2195 : : enddo
2196 : : do it=1,op%sumtails
2197 : : !write(6,*) " checkM end M_update",(op%M%mat(it,it1),it1=1,op%sumtails)
2198 : : enddo
2199 : :
2200 : : ! --- Compare M_update and M to check if calculation of M is correct
2201 : : END SUBROUTINE BathOperatoroffdiagComplex_recomputeM
2202 : : !!***
2203 : :
2204 : : !!****f* ABINIT/m_BathOperatoroffdiagComplex/BathOperatoroffdiagComplex_getError
2205 : : !! NAME
2206 : : !! BathOperatoroffdiagComplex_getError
2207 : : !!
2208 : : !! FUNCTION
2209 : : !! compute a percentage error / checkM
2210 : : !!
2211 : : !! COPYRIGHT
2212 : : !! Copyright (C) 2013-2025 ABINIT group (J. Bieder)
2213 : : !! This file is distributed under the terms of the
2214 : : !! GNU General Public License, see ~abinit/COPYING
2215 : : !! or http://www.gnu.org/copyleft/gpl.txt .
2216 : : !!
2217 : : !! INPUTS
2218 : : !! op=bath operator
2219 : : !!
2220 : : !! OUTPUT
2221 : : !! BathOperatoroffdiagComplex_getError=Error in percent
2222 : : !!
2223 : : !! SIDE EFFECTS
2224 : : !!
2225 : : !! NOTES
2226 : : !!
2227 : : !! SOURCE
2228 : :
2229 : 0 : DOUBLE PRECISION FUNCTION BathOperatoroffdiagComplex_getError(op)
2230 : :
2231 : : TYPE(BathOperatoroffdiagComplex), INTENT(IN) :: op
2232 : :
2233 [ # # ]: 0 : IF ( op%doCheck .EQV. .TRUE. ) THEN
2234 : 0 : BathOperatoroffdiagComplex_getError = op%meanError / DBLE(op%checkNumber)
2235 : : ELSE
2236 : : BathOperatoroffdiagComplex_getError = 0.d0
2237 : : END IF
2238 : 0 : END FUNCTION BathOperatoroffdiagComplex_getError
2239 : : !!***
2240 : : !#endif
2241 : :
2242 [ # # # # : 0 : END MODULE m_BathOperatoroffdiagComplex
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # ]
2243 : : !!***
|