Line data Source code
1 :
2 : #if defined HAVE_CONFIG_H
3 : #include "config.h"
4 : #endif
5 : !!****m* ABINIT/m_CtqmcoffdiagInterfaceComplex
6 : !! NAME
7 : !! m_CtqmcoffdiagInterfaceComplex
8 : !!
9 : !! FUNCTION
10 : !! Manage a ctqmc simulation.
11 : !! friendly interface for the user
12 : !!
13 : !! COPYRIGHT
14 : !! Copyright (C) 2013-2025 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_CtqmcoffdiagInterfaceComplex
25 : USE m_CtqmcoffdiagComplex
26 : use defs_basis
27 :
28 : IMPLICIT NONE
29 :
30 : !!***
31 :
32 : !!****t* m_CtqmcoffdiagInterfaceComplex/CtqmcoffdiagInterfaceComplex
33 : !! NAME
34 : !! CtqmcoffdiagInterfaceComplex
35 : !!
36 : !! FUNCTION
37 : !! This structured datatype contains the necessary data
38 : !!
39 : !! COPYRIGHT
40 : !! Copyright (C) 2013-2025 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 CtqmcoffdiagInterfaceComplex
48 : TYPE(CtqmcoffdiagComplex) :: 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 CtqmcoffdiagInterfaceComplex
59 : !!***
60 :
61 : CONTAINS
62 : !!***
63 :
64 : !!****f* ABINIT/m_CtqmcoffdiagInterfaceComplex/CtqmcoffdiagInterfaceComplex_init
65 : !! NAME
66 : !! CtqmcoffdiagInterfaceComplex_init
67 : !!
68 : !! FUNCTION
69 : !! Initialize with permanent parameters
70 : !!
71 : !! COPYRIGHT
72 : !! Copyright (C) 2013-2025 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 CtqmcoffdiagInterfaceComplex_init(op,iseed,sweeps,thermalization,&
100 : &measurements,flavors,samples,beta,U,ostream,MPI_COMM,opt_nondiag,nspinor)
101 :
102 : !Arguments ------------------------------------
103 : TYPE(CtqmcoffdiagInterfaceComplex), 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 CtqmcoffdiagComplex_init(op%Hybrid, ostream, ifstream, .FALSE., MPI_COMM,buffer)
140 : ELSE
141 0 : CALL CtqmcoffdiagComplex_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 CtqmcoffdiagInterfaceComplex_init
152 : !!***
153 :
154 : !!****f* ABINIT/m_CtqmcoffdiagInterfaceComplex/CtqmcoffdiagInterfaceComplex_setOpts
155 : !! NAME
156 : !! CtqmcoffdiagInterfaceComplex_setOpts
157 : !!
158 : !! FUNCTION
159 : !! Set and save options for many runs
160 : !!
161 : !! COPYRIGHT
162 : !! Copyright (C) 2013-2025 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 CtqmcoffdiagInterfaceComplex_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(CtqmcoffdiagInterfaceComplex), 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 CtqmcoffdiagInterfaceComplex_setOpts
225 : !!***
226 :
227 : !!****f* ABINIT/m_CtqmcoffdiagInterfaceComplex/CtqmcoffdiagInterfaceComplex_run
228 : !! NAME
229 : !! CtqmcoffdiagInterfaceComplex_run
230 : !!
231 : !! FUNCTION
232 : !! run a ctqmc simu and get results
233 : !!
234 : !! COPYRIGHT
235 : !! Copyright (C) 2013-2025 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 CtqmcoffdiagInterfaceComplex_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,opthybri)
262 :
263 : !Arguments ------------------------------------
264 : TYPE(CtqmcoffdiagInterfaceComplex), INTENT(INOUT) :: op
265 : COMPLEX(KIND=8) , DIMENSION(:,:,:), INTENT(IN ) :: G0omega
266 : COMPLEX(KIND=8), 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 : COMPLEX(KIND=8), DIMENSION(:,:), OPTIONAL, INTENT(IN ) :: matU
272 : DOUBLE PRECISION, DIMENSION(:,:),OPTIONAL, INTENT(OUT ) :: Docc
273 : DOUBLE PRECISION, DIMENSION(:,:),OPTIONAL, INTENT(IN ) :: opt_sym
274 : COMPLEX(KIND=8), 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, INTENT(IN ) :: opthybri
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 CtqmcoffdiagComplex_reset(op%Hybrid)
294 :
295 0 : IF ( PRESENT(opt_levels)) &
296 0 : CALL CtqmcoffdiagComplex_setMu(op%Hybrid, opt_levels)
297 :
298 0 : IF ( PRESENT(hybri_limit)) &
299 0 : CALL CtqmcoffdiagComplex_sethybri_limit(op%Hybrid, hybri_limit,opthybri)
300 :
301 : !call xmpi_barrier(op%Hybrid%MY_COMM)
302 0 : CALL CtqmcoffdiagComplex_setG0wTab(op%Hybrid, G0omega,op%opt_fk,Iatom,fname)
303 : !call xmpi_barrier(op%Hybrid%MY_COMM)
304 :
305 0 : IF ( PRESENT(matU) ) &
306 0 : CALL CtqmcoffdiagComplex_setU(op%Hybrid, matU)
307 : !call xmpi_barrier(op%Hybrid%MY_COMM)
308 :
309 0 : IF ( PRESENT(Magmom_orb) ) &
310 0 : CALL CtqmcoffdiagComplex_setMagmom(op%Hybrid, Magmom_orb, Magmom_spin, Magmom_tot)
311 : !call xmpi_barrier(op%Hybrid%MY_COMM)
312 :
313 :
314 : CALL CtqmcoffdiagComplex_run(op%Hybrid,opt_order=op%opt_order, &
315 : opt_histo=op%opt_histo, &
316 : opt_movie=op%opt_movie, &
317 : opt_analysis=op%opt_analysis, &
318 : opt_check=op%opt_check, &
319 : opt_noise=op%opt_noise, &
320 : opt_spectra=op%opt_spectra, &
321 0 : opt_gMove=op%opt_gMove)
322 : !call xmpi_barrier(op%Hybrid%MY_COMM)
323 :
324 : ! write(6,*) "op%Hybrid%stats",op%Hybrid%stats
325 : ! write(6,*) "opt_gMove",op%opt_gMove
326 :
327 0 : CALL CtqmcoffdiagComplex_getResult(op%Hybrid,Iatom,fname)
328 :
329 0 : IF ( PRESENT(opt_sym) ) THEN
330 0 : CALL CtqmcoffdiagComplex_symmetrizeGreen(op%Hybrid,opt_sym)
331 : END IF
332 :
333 : ! write(6,*) "op%Hybrid%stats",op%Hybrid%stats
334 :
335 0 : IF ( PRESENT(Gtau) .AND. PRESENT(Gw) ) THEN
336 0 : CALL CtqmcoffdiagComplex_getGreen(op%Hybrid, Gtau=Gtau, Gw=Gw)
337 : ! write(6,*) "size",size(Gw,dim=1),size(gw,dim=2)
338 : ! IF ( hybrid%rank .EQ. 0 ) write(389,*) Gw(:,hybrid%flavors+1)
339 : ! call flush(389)
340 0 : ELSE IF ( PRESENT(Gtau) .AND. .NOT. PRESENT(Gw) ) THEN
341 0 : CALL CtqmcoffdiagComplex_getGreen(op%Hybrid, Gtau=Gtau)
342 0 : ELSE IF ( .NOT. PRESENT(Gtau) .AND. PRESENT(Gw) ) THEN
343 0 : CALL CtqmcoffdiagComplex_getGreen(op%Hybrid, Gw=Gw)
344 : END IF
345 :
346 : !write(6,*) "op%Hybrid%stats",op%Hybrid%stats
347 :
348 0 : IF ( PRESENT(D) ) &
349 0 : CALL CtqmcoffdiagComplex_getD(op%Hybrid, D)
350 0 : Docc=op%Hybrid%measDE
351 :
352 : !write(6,*) "op%Hybrid%stats",op%Hybrid%stats
353 :
354 0 : IF ( PRESENT(E) .AND. PRESENT(Noise) ) &
355 0 : CALL CtqmcoffdiagComplex_getE(op%Hybrid, E, Noise)
356 :
357 0 : CALL CtqmcoffdiagComplex_printAll(op%Hybrid)
358 : !CALL CtqmcoffdiagComplex_printQMC(op%Hybrid)
359 :
360 0 : END SUBROUTINE CtqmcoffdiagInterfaceComplex_run
361 : !!***
362 :
363 : !!****f* ABINIT/m_CtqmcoffdiagInterfaceComplex/CtqmcoffdiagInterfaceComplex_setSweeps
364 : !! NAME
365 : !! CtqmcoffdiagInterfaceComplex_setSweeps
366 : !!
367 : !! FUNCTION
368 : !! change sweeps on the fly
369 : !!
370 : !! COPYRIGHT
371 : !! Copyright (C) 2013-2025 ABINIT group (J. Bieder)
372 : !! This file is distributed under the terms of the
373 : !! GNU General Public License, see ~abinit/COPYING
374 : !! or http://www.gnu.org/copyleft/gpl.txt .
375 : !!
376 : !! INPUTS
377 : !! op=ctqmcinterface
378 : !! sweeps=new number of sweeps
379 : !!
380 : !! OUTPUT
381 : !!
382 : !! SIDE EFFECTS
383 : !!
384 : !! NOTES
385 : !!
386 : !! SOURCE
387 :
388 0 : SUBROUTINE CtqmcoffdiagInterfaceComplex_setSweeps(op, sweeps)
389 :
390 : !Arguments ------------------------------------
391 : TYPE(CtqmcoffdiagInterfaceComplex), INTENT(INOUT) :: op
392 : DOUBLE PRECISION, INTENT(IN) :: sweeps
393 :
394 0 : CALL CtqmcoffdiagComplex_setSweeps(op%Hybrid,sweeps)
395 0 : END SUBROUTINE CtqmcoffdiagInterfaceComplex_setSweeps
396 : !!***
397 :
398 : !!****f* ABINIT/m_CtqmcoffdiagInterfaceComplex/CtqmcoffdiagInterfaceComplex_finalize
399 : !! NAME
400 : !! CtqmcoffdiagInterfaceComplex_finalize
401 : !!
402 : !! FUNCTION
403 : !! Destroy simulation
404 : !!
405 : !! COPYRIGHT
406 : !! Copyright (C) 2013-2025 ABINIT group (J. Bieder)
407 : !! This file is distributed under the terms of the
408 : !! GNU General Public License, see ~abinit/COPYING
409 : !! or http://www.gnu.org/copyleft/gpl.txt .
410 : !!
411 : !! INPUTS
412 : !! op=ctqmcinterface
413 : !!
414 : !! OUTPUT
415 : !!
416 : !! SIDE EFFECTS
417 : !!
418 : !! NOTES
419 : !!
420 : !! SOURCE
421 :
422 0 : SUBROUTINE CtqmcoffdiagInterfaceComplex_finalize(op)
423 :
424 : !Arguments ------------------------------------
425 : TYPE(CtqmcoffdiagInterfaceComplex), INTENT(INOUT) :: op
426 :
427 : !IF ( op%Hybrid%init .EQV. .TRUE. ) THEN
428 : ! CALL CtqmcoffdiagComplex_printAll(op%Hybrid)
429 : !write(6,*) "before ctqmc_destroy in CtqmcoffdiagComplexinterface_finalize"
430 0 : CALL CtqmcoffdiagComplex_destroy(op%Hybrid)
431 : !END IF
432 :
433 0 : END SUBROUTINE CtqmcoffdiagInterfaceComplex_finalize
434 : !!***
435 :
436 0 : END MODULE m_CtqmcoffdiagInterfaceComplex
437 : !!***
|