Branch data Line data Source code
1 : :
2 : : #if defined HAVE_CONFIG_H
3 : : #include "config.h"
4 : : #endif
5 : : !!****m* ABINIT/m_CtqmcoffdiagInterface
6 : : !! NAME
7 : : !! m_CtqmcoffdiagInterface
8 : : !!
9 : : !! FUNCTION
10 : : !! Manage a ctqmc simulation.
11 : : !! friendly interface for the user
12 : : !!
13 : : !! COPYRIGHT
14 : : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder, B. Amadon, J. Denier)
15 : : !! This file is distributed under the terms of the
16 : : !! GNU General Public License, see ~abinit/COPYING
17 : : !! or http://www.gnu.org/copyleft/gpl.txt .
18 : : !!
19 : : !! NOTES
20 : : !!
21 : : !! SOURCE
22 : :
23 : : #include "defs.h"
24 : : MODULE m_CtqmcoffdiagInterface
25 : : USE m_Ctqmcoffdiag
26 : : use defs_basis
27 : :
28 : : IMPLICIT NONE
29 : :
30 : : !!***
31 : :
32 : : !!****t* m_CtqmcoffdiagInterface/CtqmcoffdiagInterface
33 : : !! NAME
34 : : !! CtqmcoffdiagInterface
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 CtqmcoffdiagInterface
48 : : TYPE(Ctqmcoffdiag) :: Hybrid
49 : : INTEGER :: opt_fk = 0
50 : : INTEGER :: opt_order = 0
51 : : INTEGER :: opt_histo = 0
52 : : INTEGER :: opt_movie = 0
53 : : INTEGER :: opt_analysis = 0
54 : : INTEGER :: opt_check = 0
55 : : INTEGER :: opt_spectra = 0
56 : : INTEGER :: opt_noise = 0
57 : : INTEGER :: opt_gMove = 0
58 : : END TYPE CtqmcoffdiagInterface
59 : : !!***
60 : :
61 : : CONTAINS
62 : : !!***
63 : :
64 : : !!****f* ABINIT/m_CtqmcoffdiagInterface/CtqmcoffdiagInterface_init
65 : : !! NAME
66 : : !! CtqmcoffdiagInterface_init
67 : : !!
68 : : !! FUNCTION
69 : : !! Initialize with permanent parameters
70 : : !!
71 : : !! COPYRIGHT
72 : : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
73 : : !! This file is distributed under the terms of the
74 : : !! GNU General Public License, see ~abinit/COPYING
75 : : !! or http://www.gnu.org/copyleft/gpl.txt .
76 : : !!
77 : : !! INPUTS
78 : : !! op=ctqmcinterface
79 : : !! iseed=seed for rng
80 : : !! sweeps=number of sweeps for the run
81 : : !! thermalization=number of sweeps to thermalize
82 : : !! measurements=how often we measure (modulo)
83 : : !! flavors=number of orbitals (spin degenerated)
84 : : !! samples=imaginary time slices
85 : : !! beta=inverse temperature
86 : : !! U=interaction parameter
87 : : !! ostream=where to write output
88 : : !! MPI_COMM=mpi communicator for the run
89 : : !! nspinor=number of spinor
90 : : !!
91 : : !! OUTPUT
92 : : !!
93 : : !! SIDE EFFECTS
94 : : !!
95 : : !! NOTES
96 : : !!
97 : : !! SOURCE
98 : :
99 : 0 : SUBROUTINE CtqmcoffdiagInterface_init(op,iseed,sweeps,thermalization,&
100 : : &measurements,flavors,samples,beta,U,ostream,MPI_COMM,opt_nondiag,nspinor)
101 : :
102 : : !Arguments ------------------------------------
103 : : TYPE(CtqmcoffdiagInterface), INTENT(INOUT) :: op
104 : : INTEGER, OPTIONAL, INTENT(IN) :: MPI_COMM
105 : : INTEGER, INTENT(IN) :: iseed
106 : : DOUBLE PRECISION, INTENT(IN) :: sweeps
107 : : INTEGER, INTENT(IN) :: thermalization
108 : : INTEGER, INTENT(IN) :: measurements
109 : : INTEGER, INTENT(IN) :: flavors
110 : : INTEGER, INTENT(IN) :: samples
111 : : !INTEGER, INTENT(IN) :: Wmax
112 : : INTEGER, INTENT(IN) :: ostream
113 : : INTEGER, INTENT(IN) :: opt_nondiag
114 : : DOUBLE PRECISION, INTENT(IN) :: beta
115 : : DOUBLE PRECISION, INTENT(IN) :: u
116 : : INTEGER, INTENT(IN) :: nspinor
117 : : !DOUBLE PRECISION, INTENT(IN) :: mu
118 : : !Local arguements -----------------------------
119 : : INTEGER :: ifstream
120 : : DOUBLE PRECISION, DIMENSION(1:11) :: buffer
121 : :
122 : 0 : ifstream = 42
123 : :
124 : 0 : buffer(1)=DBLE(iseed)
125 : 0 : buffer(2)=sweeps
126 : 0 : buffer(3)=DBLE(thermalization)
127 : 0 : buffer(4)=DBLE(measurements)
128 : 0 : buffer(5)=DBLE(flavors)
129 : 0 : buffer(6)=DBLE(samples)
130 : 0 : buffer(7)=beta
131 : 0 : buffer(8)=U
132 : 0 : buffer(9)=GREENHYB_TAU
133 : 0 : buffer(10)=DBLE(opt_nondiag)
134 : 0 : buffer(11)=nspinor
135 : : !buffer(9)=0.d0!mu
136 : : !buffer(9)=DBLE(Wmax)
137 : :
138 [ # # ]: 0 : IF ( PRESENT( MPI_COMM ) ) THEN
139 : 0 : CALL Ctqmcoffdiag_init(op%Hybrid, ostream, ifstream, .FALSE., MPI_COMM,buffer)
140 : : ELSE
141 : 0 : CALL Ctqmcoffdiag_init(op%Hybrid, ostream, ifstream, .FALSE.,iBuffer=buffer)
142 : : END IF
143 : 0 : op%opt_fk = 0
144 : 0 : op%opt_order = 0
145 : 0 : op%opt_histo = 0
146 : 0 : op%opt_movie = 0
147 : 0 : op%opt_analysis = 0
148 : 0 : op%opt_check = 0
149 : 0 : op%opt_noise = 0
150 : 0 : op%opt_spectra = 0
151 : 0 : END SUBROUTINE CtqmcoffdiagInterface_init
152 : : !!***
153 : :
154 : : !!****f* ABINIT/m_CtqmcoffdiagInterface/CtqmcoffdiagInterface_setOpts
155 : : !! NAME
156 : : !! CtqmcoffdiagInterface_setOpts
157 : : !!
158 : : !! FUNCTION
159 : : !! Set and save options for many runs
160 : : !!
161 : : !! COPYRIGHT
162 : : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
163 : : !! This file is distributed under the terms of the
164 : : !! GNU General Public License, see ~abinit/COPYING
165 : : !! or http://www.gnu.org/copyleft/gpl.txt .
166 : : !!
167 : : !! INPUTS
168 : : !! op=ctqmcinterface
169 : : !! opt_Fk=0 if we give us Gw0 and 1 if 1/Gw0+iwn
170 : : !! opt_order=maximal perturbation order to scope(>0)
171 : : !! opt_movie=print a latex file (0 or 1)
172 : : !! opt_analysis=measure correlations (0 or 1)
173 : : !! opt_check=check fast calculation :0 nothing
174 : : !! 1 Impurity
175 : : !! 2 Bath
176 : : !! 3 Both
177 : : !! opt_noise=calculate noise ofr green functions(0 ro 1)
178 : : !! opt_spectra=fourier transform of time evolution of number of electrons
179 : : !! (0 or 1)
180 : : !! opt_gMove=number of global moves (>0)
181 : : !!
182 : : !! OUTPUT
183 : : !!
184 : : !! SIDE EFFECTS
185 : : !!
186 : : !! NOTES
187 : : !!
188 : : !! SOURCE
189 : :
190 : 0 : SUBROUTINE CtqmcoffdiagInterface_setOpts(op,opt_Fk,opt_order,opt_histo,opt_movie,&
191 : : & opt_analysis,opt_check, opt_noise, opt_spectra, opt_gMove)
192 : :
193 : : !Arguments ------------------------------------
194 : : TYPE(CtqmcoffdiagInterface), INTENT(INOUT) :: op
195 : : INTEGER , OPTIONAL , INTENT(IN ) :: opt_Fk
196 : : INTEGER , OPTIONAL , INTENT(IN ) :: opt_order
197 : : INTEGER , OPTIONAL , INTENT(IN ) :: opt_histo
198 : : INTEGER , OPTIONAL , INTENT(IN ) :: opt_movie
199 : : INTEGER , OPTIONAL , INTENT(IN ) :: opt_analysis
200 : : INTEGER , OPTIONAL , INTENT(IN ) :: opt_check
201 : : INTEGER , OPTIONAL , INTENT(IN ) :: opt_noise
202 : : INTEGER , OPTIONAL , INTENT(IN ) :: opt_spectra
203 : : INTEGER , OPTIONAL , INTENT(IN ) :: opt_gMove
204 : :
205 [ # # ]: 0 : IF ( PRESENT(opt_Fk) ) &
206 : 0 : op%opt_Fk = opt_fk
207 [ # # ]: 0 : IF ( PRESENT(opt_order) ) &
208 : 0 : op%opt_order = opt_order
209 [ # # ]: 0 : IF ( PRESENT(opt_histo) ) &
210 : 0 : op%opt_histo = opt_histo
211 [ # # ]: 0 : IF ( PRESENT(opt_analysis) ) &
212 : 0 : op%opt_analysis = opt_analysis
213 [ # # ]: 0 : IF ( PRESENT(opt_check) ) &
214 : 0 : op%opt_check = opt_check
215 [ # # ]: 0 : IF ( PRESENT(opt_movie) ) &
216 : 0 : op%opt_movie = opt_movie
217 [ # # ]: 0 : IF ( PRESENT(opt_noise) ) &
218 : 0 : op%opt_noise = opt_noise
219 [ # # ]: 0 : IF ( PRESENT(opt_spectra) ) &
220 : 0 : op%opt_spectra = opt_spectra
221 [ # # ]: 0 : IF ( PRESENT(opt_gMove) ) &
222 : 0 : op%opt_gMove = opt_gMove
223 : :
224 : 0 : END SUBROUTINE CtqmcoffdiagInterface_setOpts
225 : : !!***
226 : :
227 : : !!****f* ABINIT/m_CtqmcoffdiagInterface/CtqmcoffdiagInterface_run
228 : : !! NAME
229 : : !! CtqmcoffdiagInterface_run
230 : : !!
231 : : !! FUNCTION
232 : : !! run a ctqmc simu and get results
233 : : !!
234 : : !! COPYRIGHT
235 : : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
236 : : !! This file is distributed under the terms of the
237 : : !! GNU General Public License, see ~abinit/COPYING
238 : : !! or http://www.gnu.org/copyleft/gpl.txt .
239 : : !!
240 : : !! INPUTS
241 : : !! op=ctqmcinterface
242 : : !! G0omega=Gw0 (according to opt_Fk)
243 : : !! matU=interaction matrice
244 : : !! opt_sym=weight factors to symmetrise G
245 : : !! opt_levels=energy for each level (with respect to fermi level)
246 : : !!
247 : : !! OUTPUT
248 : : !! Gtau=G(tau)
249 : : !! Gw=fourier transform of Gtau
250 : : !! D=full double occupancy
251 : : !! E=Interaction energy
252 : : !! Noise=Noise on E
253 : : !!
254 : : !! SIDE EFFECTS
255 : : !!
256 : : !! NOTES
257 : : !!
258 : : !! SOURCE
259 : :
260 [ # # # # : 0 : SUBROUTINE CtqmcoffdiagInterface_run(op,G0omega, Gtau, Gw, D,E,Noise,matU,Docc,opt_sym,opt_levels,hybri_limit,Magmom_orb,&
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# ]
261 [ # # # # : 0 : &Magmom_spin,Magmom_tot,Iatom,fname,jmjbasis)
# # # # #
# # # ]
262 : :
263 : : !Arguments ------------------------------------
264 : : TYPE(CtqmcoffdiagInterface), INTENT(INOUT) :: op
265 : : COMPLEX(KIND=8) , DIMENSION(:,:,:), INTENT(IN ) :: G0omega
266 : : DOUBLE PRECISION, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: Gtau
267 : : COMPLEX(KIND=8) , DIMENSION(:,:,:), OPTIONAL, INTENT(INOUT) :: Gw
268 : : DOUBLE PRECISION, OPTIONAL , INTENT(OUT) :: D
269 : : DOUBLE PRECISION, OPTIONAL , INTENT(OUT) :: E
270 : : DOUBLE PRECISION, OPTIONAL , INTENT(OUT) :: Noise
271 : : DOUBLE PRECISION, DIMENSION(:,:),OPTIONAL, INTENT(IN ) :: matU
272 : : DOUBLE PRECISION, DIMENSION(:,:),OPTIONAL, INTENT(OUT ) :: Docc
273 : : DOUBLE PRECISION, DIMENSION(:,:),OPTIONAL, INTENT(IN ) :: opt_sym
274 : : DOUBLE PRECISION, DIMENSION(:),OPTIONAL, INTENT(IN ) :: opt_levels
275 : : COMPLEX(KIND=8) , DIMENSION(:,:),OPTIONAL, INTENT(IN ) :: hybri_limit
276 : : DOUBLE PRECISION, DIMENSION(:,:),OPTIONAL, INTENT(IN ) :: Magmom_orb
277 : : DOUBLE PRECISION, DIMENSION(:,:),OPTIONAL, INTENT(IN ) :: Magmom_spin
278 : : DOUBLE PRECISION, DIMENSION(:,:),OPTIONAL, INTENT(IN ) :: Magmom_tot
279 : : INTEGER, INTENT(IN ) :: Iatom
280 : : INTEGER, OPTIONAL, INTENT(IN ) :: jmjbasis
281 : : character(len=fnlen), INTENT(INOUT) :: fname
282 : : !local variables--------------------------------
283 : : ! INTEGER :: iflavor1,iflavor2
284 : :
285 : : ! do iflavor1=1,10
286 : : ! do iflavor2=1,10
287 : : ! if(iflavor1==iflavor2) THEN
288 : : ! write(6,*) iflavor1, iflavor2, Magmom(iflavor1,iflavor2)
289 : : ! end if
290 : : ! end do
291 : : ! end do
292 : :
293 : 0 : CALL Ctqmcoffdiag_reset(op%Hybrid)
294 : :
295 : : ! ifstream = 42
296 : : !
297 : : ! OPEN(UNIT=ifstream, FILE="Gw.dat")
298 : : ! CALL Ctqmcoffdiag_setG0w(Hybrid, ifstream)
299 : : ! CLOSE(ifstream)
300 : : !
301 : :
302 [ # # ]: 0 : IF ( PRESENT(opt_levels)) &
303 : 0 : CALL Ctqmcoffdiag_setMu(op%Hybrid, opt_levels)
304 : :
305 [ # # ]: 0 : IF ( PRESENT(hybri_limit)) &
306 : 0 : CALL Ctqmcoffdiag_sethybri_limit(op%Hybrid, hybri_limit)
307 : :
308 : : !call xmpi_barrier(op%Hybrid%MY_COMM)
309 : 0 : CALL Ctqmcoffdiag_setG0wTab(op%Hybrid, G0omega,op%opt_fk,fname)
310 : : !call xmpi_barrier(op%Hybrid%MY_COMM)
311 : :
312 [ # # ]: 0 : IF ( PRESENT(matU) ) &
313 : 0 : CALL Ctqmcoffdiag_setU(op%Hybrid, matU)
314 : : !call xmpi_barrier(op%Hybrid%MY_COMM)
315 : :
316 [ # # ]: 0 : IF ( PRESENT(Magmom_orb) ) &
317 : 0 : CALL Ctqmcoffdiag_setMagmom(op%Hybrid, Magmom_orb, Magmom_spin, Magmom_tot)
318 : : !call xmpi_barrier(op%Hybrid%MY_COMM)
319 : :
320 : :
321 : : CALL Ctqmcoffdiag_run(op%Hybrid,opt_order=op%opt_order, &
322 : : opt_histo=op%opt_histo, &
323 : : opt_movie=op%opt_movie, &
324 : : opt_analysis=op%opt_analysis, &
325 : : opt_check=op%opt_check, &
326 : : opt_noise=op%opt_noise, &
327 : : opt_spectra=op%opt_spectra, &
328 : 0 : opt_gMove=op%opt_gMove)
329 : : !call xmpi_barrier(op%Hybrid%MY_COMM)
330 : :
331 : : ! write(6,*) "op%Hybrid%stats",op%Hybrid%stats
332 : : ! write(6,*) "opt_gMove",op%opt_gMove
333 : :
334 : 0 : CALL Ctqmcoffdiag_getResult(op%Hybrid,Iatom,fname,jmjbasis)
335 : :
336 [ # # ]: 0 : IF ( PRESENT(opt_sym) ) THEN
337 : 0 : CALL Ctqmcoffdiag_symmetrizeGreen(op%Hybrid,opt_sym)
338 : : END IF
339 : :
340 : : ! write(6,*) "op%Hybrid%stats",op%Hybrid%stats
341 : :
342 [ # # ]: 0 : IF ( PRESENT(Gtau) .AND. PRESENT(Gw) ) THEN
343 : 0 : CALL Ctqmcoffdiag_getGreen(op%Hybrid, Gtau=Gtau, Gw=Gw)
344 : : ! write(6,*) "size",size(Gw,dim=1),size(gw,dim=2)
345 : : ! IF ( hybrid%rank .EQ. 0 ) write(389,*) Gw(:,hybrid%flavors+1)
346 : : ! call flush(389)
347 [ # # ]: 0 : ELSE IF ( PRESENT(Gtau) .AND. .NOT. PRESENT(Gw) ) THEN
348 [ # # ]: 0 : CALL Ctqmcoffdiag_getGreen(op%Hybrid, Gtau=Gtau)
349 [ # # ]: 0 : ELSE IF ( .NOT. PRESENT(Gtau) .AND. PRESENT(Gw) ) THEN
350 [ # # ]: 0 : CALL Ctqmcoffdiag_getGreen(op%Hybrid, Gw=Gw)
351 : : END IF
352 : :
353 : : !write(6,*) "op%Hybrid%stats",op%Hybrid%stats
354 : :
355 [ # # ]: 0 : IF ( PRESENT(D) ) &
356 : 0 : CALL Ctqmcoffdiag_getD(op%Hybrid, D)
357 [ # # # # ]: 0 : Docc=op%Hybrid%measDE
358 : :
359 : : !write(6,*) "op%Hybrid%stats",op%Hybrid%stats
360 : :
361 [ # # ]: 0 : IF ( PRESENT(E) .AND. PRESENT(Noise) ) &
362 : 0 : CALL Ctqmcoffdiag_getE(op%Hybrid, E, Noise)
363 : :
364 : 0 : CALL Ctqmcoffdiag_printAll(op%Hybrid)
365 : : !CALL Ctqmcoffdiag_printQMC(op%Hybrid)
366 : :
367 : 0 : END SUBROUTINE CtqmcoffdiagInterface_run
368 : : !!***
369 : :
370 : : !!****f* ABINIT/m_CtqmcoffdiagInterface/CtqmcoffdiagInterface_setSweeps
371 : : !! NAME
372 : : !! CtqmcoffdiagInterface_setSweeps
373 : : !!
374 : : !! FUNCTION
375 : : !! change sweeps on the fly
376 : : !!
377 : : !! COPYRIGHT
378 : : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
379 : : !! This file is distributed under the terms of the
380 : : !! GNU General Public License, see ~abinit/COPYING
381 : : !! or http://www.gnu.org/copyleft/gpl.txt .
382 : : !!
383 : : !! INPUTS
384 : : !! op=ctqmcinterface
385 : : !! sweeps=new number of sweeps
386 : : !!
387 : : !! OUTPUT
388 : : !!
389 : : !! SIDE EFFECTS
390 : : !!
391 : : !! NOTES
392 : : !!
393 : : !! SOURCE
394 : :
395 : 0 : SUBROUTINE CtqmcoffdiagInterface_setSweeps(op, sweeps)
396 : :
397 : : !Arguments ------------------------------------
398 : : TYPE(CtqmcoffdiagInterface), INTENT(INOUT) :: op
399 : : DOUBLE PRECISION, INTENT(IN) :: sweeps
400 : :
401 : 0 : CALL Ctqmcoffdiag_setSweeps(op%Hybrid,sweeps)
402 : 0 : END SUBROUTINE CtqmcoffdiagInterface_setSweeps
403 : : !!***
404 : :
405 : : !!****f* ABINIT/m_CtqmcoffdiagInterface/CtqmcoffdiagInterface_finalize
406 : : !! NAME
407 : : !! CtqmcoffdiagInterface_finalize
408 : : !!
409 : : !! FUNCTION
410 : : !! Destroy simulation
411 : : !!
412 : : !! COPYRIGHT
413 : : !! Copyright (C) 2013-2026 ABINIT group (J. Bieder)
414 : : !! This file is distributed under the terms of the
415 : : !! GNU General Public License, see ~abinit/COPYING
416 : : !! or http://www.gnu.org/copyleft/gpl.txt .
417 : : !!
418 : : !! INPUTS
419 : : !! op=ctqmcinterface
420 : : !!
421 : : !! OUTPUT
422 : : !!
423 : : !! SIDE EFFECTS
424 : : !!
425 : : !! NOTES
426 : : !!
427 : : !! SOURCE
428 : :
429 : 0 : SUBROUTINE CtqmcoffdiagInterface_finalize(op)
430 : :
431 : : !Arguments ------------------------------------
432 : : TYPE(CtqmcoffdiagInterface), INTENT(INOUT) :: op
433 : :
434 : : !IF ( op%Hybrid%init .EQV. .TRUE. ) THEN
435 : : ! CALL Ctqmcoffdiag_printAll(op%Hybrid)
436 : : !write(6,*) "before ctqmc_destroy in Ctqmcoffdiaginterface_finalize"
437 : 0 : CALL Ctqmcoffdiag_destroy(op%Hybrid)
438 : : !END IF
439 : :
440 : 0 : END SUBROUTINE CtqmcoffdiagInterface_finalize
441 : : !!***
442 : :
443 [ # # # # : 0 : END MODULE m_CtqmcoffdiagInterface
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # ]
444 : : !!***
|