Line data Source code
1 : !!****m* ABINIT/m_dmft
2 : !! NAME
3 : !! m_dmft
4 : !!
5 : !! FUNCTION
6 : !!
7 : !! COPYRIGHT
8 : !! Copyright (C) 2006-2026 ABINIT group (BAmadon)
9 : !! This file is distributed under the terms of the
10 : !! GNU General Public License, see ~abinit/COPYING
11 : !! or http://www.gnu.org/copyleft/gpl.txt .
12 : !!
13 : !! INPUTS
14 : !!
15 : !! OUTPUT
16 : !!
17 : !! SOURCE
18 :
19 : #if defined HAVE_CONFIG_H
20 : #include "config.h"
21 : #endif
22 :
23 : #include "abi_common.h"
24 :
25 : ! nvtx related macro definition
26 : #include "nvtx_macros.h"
27 :
28 : MODULE m_dmft
29 :
30 : use defs_abitypes
31 : use defs_basis
32 : !use netcdf
33 : use m_xmpi
34 : use m_abicore
35 : use m_data4entropyDMFT
36 : use m_errors
37 :
38 : use m_crystal, only : crystal_t
39 : use m_datafordmft, only : chipsi_print,chipsi_renormalization,compute_wannier,print_wannier
40 : use m_dftu_self, only : dftu_self
41 : use m_energy, only : compute_dftu_energy,compute_energy,compute_free_energy,&
42 : & destroy_energy,energy_type,init_energy
43 : use m_forctqmc, only : ctqmc_calltriqs_c,qmc_prep_ctqmc
44 : use m_green, only : check_fourier_green,compute_green,copy_green,destroy_green,destroy_green_tau, &
45 : & fermi_green,fourier_green,green_type,icip_green,init_green,init_green_tau,integrate_green, &
46 : & local_ks_green,print_green,printocc_green
47 : use m_hu, only : destroy_hu,hu_type,init_hu
48 : use m_hubbard_one, only : hubbard_one
49 : use m_matlu, only : add_matlu,copy_matlu,destroy_matlu,diff_matlu,identity_matlu,init_matlu,inverse_matlu, &
50 : & matlu_type,print_matlu,sym_matlu,xmpi_matlu
51 : use m_oper, only : destroy_oper,diff_oper,downfold_oper,gather_oper,init_oper,inverse_oper,oper_type,trace_oper
52 : use m_paw_dmft, only : paw_dmft_type
53 : use m_pawang, only : pawang_type
54 : use m_pawtab, only : pawtab_type
55 : use m_self, only : dc_self,destroy_self,initialize_self,new_self,print_self,rw_self,self_type
56 : use m_time, only : timab
57 :
58 : #ifdef HAVE_GPU_MARKERS
59 : use m_nvtx_data
60 : #endif
61 :
62 : implicit none
63 :
64 : private
65 :
66 : public :: dmft_solve
67 : public :: impurity_solve
68 : public :: dyson
69 : public :: spectral_function
70 : !!***
71 :
72 : contains
73 :
74 : !!****f* ABINIT/dmft_solve
75 : !! NAME
76 : !! dmft_solve
77 : !!
78 : !! FUNCTION
79 : !! Solve the DMFT loop from PAW data.
80 : !!
81 : !! INPUTS
82 : !! cryst_struc <type(crystal_t)>=crystal structure data
83 : !! istep = iteration step of the DFT+DMFT self-consistent cycle.
84 : !! dft_occup <type(oper_type)> = DFT occupations numbers of the correlated orbitals
85 : !! mpi_enreg=information about MPI parallelization
86 : !! paw_dmft <type(paw_dmft_type)> = data for self-consistent DFT+DMFT calculations.
87 : !! pawang <type(pawang)>=paw angular mesh and related data
88 : !! pawtab(ntypat*usepaw) <type(pawtab_type)>=paw tabulated starting data
89 : !! pawprtvol = option for printing
90 : !!
91 : !! OUTPUT
92 : !! paw_dmft <type(paw_dmft_type)> = data for self-consistent DFT+DMFT calculations.
93 : !!
94 : !! NOTES
95 : !!
96 : !! SOURCE
97 :
98 93 : subroutine dmft_solve(cryst_struc,istep,dft_occup,mpi_enreg,paw_dmft,pawang,pawtab,pawprtvol)
99 :
100 : !Arguments ------------------------------------
101 : integer, intent(in) :: istep,pawprtvol
102 : type(MPI_type), intent(in) :: mpi_enreg
103 : type(pawang_type), intent(in) :: pawang
104 : type(crystal_t), intent(in) :: cryst_struc
105 : type(paw_dmft_type), intent(inout) :: paw_dmft
106 : type(pawtab_type), intent(inout) :: pawtab(paw_dmft%ntypat)
107 : type(oper_type), intent(in) :: dft_occup
108 : !Local variables ------------------------------
109 : integer :: check,dmft_iter,idmftloop,istep_iter,itypat,myproc,natom
110 : integer :: ntypat,opt_diff,opt_maxent,opt_moments,opt_renorm,prtopt
111 : !logical :: etot_var
112 : logical :: dmft_optim,t2g,x2my2d
113 : real(dp) :: tsec(2)
114 : character(len=200) :: char_enddmft
115 93 : type(green_type) :: green,greendft,weiss
116 93 : type(self_type) :: self,self_new
117 93 : type(energy_type) :: energies_dmft,energies_tmp
118 93 : type(oper_type) :: identity_oper,oper_tmp
119 93 : type(hu_type), allocatable :: hu(:)
120 : character(len=4) :: part2,part3
121 : !character(len=5) :: thdyn
122 : character(len=500) :: message
123 : !************************************************************************
124 :
125 : DBG_ENTER('COLL')
126 : ABI_NVTX_START_RANGE(NVTX_DMFT_SOLVE)
127 :
128 93 : myproc = paw_dmft%myproc
129 93 : check = paw_dmft%dmftcheck ! checks enabled
130 93 : t2g = (paw_dmft%dmft_t2g == 1)
131 93 : x2my2d = (paw_dmft%dmft_x2my2d == 1)
132 93 : natom = paw_dmft%natom
133 93 : ntypat = paw_dmft%ntypat
134 93 : dmft_iter = paw_dmft%dmft_iter
135 93 : opt_maxent = paw_dmft%dmft_prt_maxent
136 93 : dmft_optim = (paw_dmft%dmft_solv == 6 .or. paw_dmft%dmft_solv == 7) ! skip some unneeded calls to compute_green with TRIQS
137 : !paw_dmft%dmft_fermi_prec=tol5
138 : !paw_dmft%dmft_fermi_prec = paw_dmft%dmft_charge_prec * ten
139 : !paw_dmft%dmft_charge_prec=20_dp ! total number of electron.
140 : !paw_dmft%dmft_prgn=1
141 93 : paw_dmft%dmft_prgn = 0
142 : !etot_var = .true.
143 : !thdyn="fcalc"
144 : !thdyn = "ecalc"
145 : !if (thdyn == "ecalc") then ! valid
146 93 : part2 = "both"
147 93 : part3 = "none"
148 : !else if (thdyn == "fcalc") then ! not tested
149 : ! part2 = "corr"
150 : ! part3 = "band"
151 : !end if
152 :
153 93 : opt_moments = merge(1,0,paw_dmft%dmft_solv==6.or.paw_dmft%dmft_solv==7)
154 93 : prtopt = merge(2,0,dmft_optim)
155 93 : opt_diff = merge(1,0,dmft_optim)
156 :
157 93 : if (check == 1) then
158 1 : write(message,'(2a)') ch10,' DMFT Checks are enabled '
159 : else
160 92 : write(message,'(2a)') ch10,' DMFT Checks will not be performed'
161 : end if ! check
162 93 : call wrtout(std_out,message,'COLL')
163 :
164 93 : if (istep == 0) then
165 0 : message = ' istep should not be equal to zero'
166 0 : ABI_BUG(message)
167 : end if
168 :
169 : !spaceComm=paw_dmft%spacecomm
170 : !if(mpi_enreg%paral_kgb==1) spaceComm=mpi_enreg%comm_kpt
171 : !call xmpi_barrier(spaceComm)
172 :
173 93 : call initialize_self(self,paw_dmft,opt_moments=opt_moments)
174 93 : call init_energy(energies_dmft,natom)
175 :
176 : !===========================================================================
177 : !== First construct DFT green function (Init, Compute, Integrate, Print)
178 : !===========================================================================
179 93 : write(message,'(6a)') ch10," ==========================================================================", &
180 93 : & ch10," ===== Check: DFT Green's Function Calculation with unnormalized orbitals",&
181 186 : & ch10," =========================================================================="
182 93 : call wrtout(std_out,message,'COLL')
183 93 : call icip_green("DFT",greendft,paw_dmft,3,self,opt_moments=opt_moments)
184 : !call print_green('DFT_NOT_renormalized',greendft,1,paw_dmft,pawprtvol=1,opt_wt=1)
185 :
186 : !== Compare greendft%occup and dft_occup: check that DFT green function is fine
187 : !----------------------------------------------------------------------
188 93 : write(message,'(2a)') ch10," == Compare local occupations from DFT Green's function &
189 186 : &with the downfold of the Fermi-Dirac occupations =="
190 93 : call wrtout(std_out,message,'COLL')
191 :
192 93 : if(paw_dmft%dmft_magnfield .gt. 0) then
193 13 : write(message, '(2a,a)') ch10, 'Warning: Check in local occupation is removed due to applied magnetic field'
194 13 : call wrtout(std_out,message,'COLL')
195 : else
196 : call diff_oper("occupations from DFT Green's function","Fermi-Dirac occupations", &
197 80 : & greendft%occup,dft_occup,1,paw_dmft%dmft_tolfreq)
198 : endif
199 : ! write(message,'(2a)') ch10,&
200 : !& ' ***** => Warning : diff_oper is suppressed for test'
201 : ! call wrtout(std_out,message,'COLL')
202 93 : write(message,'(2a)') ch10," ***** => Calculation of DFT Green's function is thus correct ****"
203 93 : call wrtout(std_out,message,'COLL')
204 93 : call destroy_green(greendft)
205 :
206 : !== Orthonormalize chipsi
207 : !----------------------------------------------------------------------
208 93 : call timab(621,1,tsec(:))
209 : !natomcor=0
210 : !do iatom=1,paw_dmft%natom
211 : ! if(paw_dmft%lpawu(iatom).ne.-1) then
212 : ! natomcor=natomcor+1
213 : ! end if
214 : !end do
215 : opt_renorm = merge(2,paw_dmft%dmft_wanorthnorm,paw_dmft%nspinor==2.and. &
216 93 : &(paw_dmft%dmft_solv == 9 ))
217 : ! &(paw_dmft%dmft_solv == 8 .or. paw_dmft%dmft_solv == 9 )) !.or. paw_dmft%dmft_solv == 10))
218 :
219 93 : if (paw_dmft%dmft_solv /= -1) then
220 92 : call chipsi_renormalization(paw_dmft,opt=opt_renorm)
221 92 : if (paw_dmft%dmft_prtwan == 1) then
222 0 : call compute_wannier(paw_dmft,mpi_enreg)
223 0 : if (myproc == 0) then
224 0 : call print_wannier(paw_dmft,istep)
225 : end if
226 0 : ABI_FREE(paw_dmft%wannier)
227 : end if ! dmft_prtwan
228 :
229 92 : write(message,'(2a)') ch10,' == Check downfold(upfold)=identity =='
230 92 : call wrtout(std_out,message,'COLL')
231 :
232 : ! Check that downfold_oper(upfold_oper)=I
233 92 : call init_oper(paw_dmft,identity_oper,opt_ksloc=2)
234 92 : call init_oper(paw_dmft,oper_tmp,opt_ksloc=2)
235 92 : call identity_matlu(identity_oper%matlu(:),natom)
236 92 : call downfold_oper(oper_tmp,paw_dmft,procb=paw_dmft%distrib%procb(:),iproc=paw_dmft%distrib%me_kpt,option=4)
237 92 : call xmpi_matlu(oper_tmp%matlu(:),natom,paw_dmft%distrib%comm_kpt)
238 92 : call sym_matlu(oper_tmp%matlu(:),paw_dmft)
239 92 : call diff_matlu("Downfold(Upfold)","Identity",oper_tmp%matlu(:),identity_oper%matlu(:),natom,0,tol4)
240 92 : call destroy_oper(oper_tmp)
241 92 : call destroy_oper(identity_oper)
242 :
243 : ! ===========================================================================
244 : ! == re-construct DFT green function with new chipsis
245 : ! ===========================================================================
246 : write(message,'(6a)') &
247 92 : & ch10," ========================================================================", &
248 92 : & ch10," ===== Check: DFT Green's Function Calculation with normalized orbitals", &
249 184 : & ch10," ========================================================================"
250 : end if ! dmft_solv/=1
251 93 : call timab(621,2,tsec(:))
252 93 : call wrtout(std_out,message,'COLL')
253 :
254 93 : call icip_green("DFT renormalized",greendft,paw_dmft,pawprtvol,self,opt_moments=opt_moments,opt_log=paw_dmft%dmft_triqs_entropy)
255 : !call print_green('DFT_renormalized',greendft,1,paw_dmft,pawprtvol=1,opt_wt=1)
256 :
257 : !== Define Interaction from input upawu and jpawu
258 : !----------------------------------------------------------------------
259 482 : ABI_MALLOC(hu,(ntypat))
260 93 : call init_hu(hu(:),paw_dmft,pawtab(:))
261 :
262 93 : call dc_self(greendft%charge_matlu(:,:),self%hdc%matlu(:),hu(:),paw_dmft,pawtab(:),greendft%occup%matlu(:))
263 :
264 : ! Need to store idmftloop and set it to zero to avoid useless print_energy in ab_out
265 93 : idmftloop = paw_dmft%idmftloop
266 93 : paw_dmft%idmftloop = 0
267 93 : call compute_energy(energies_dmft,greendft,paw_dmft,pawprtvol,pawtab(:),self,occ_type=" lda",part='both')
268 93 : if (paw_dmft%dmft_triqs_entropy == 1) then
269 0 : call compute_free_energy(energies_dmft,paw_dmft,greendft,"band")
270 : end if
271 93 : paw_dmft%idmftloop = idmftloop
272 :
273 93 : if ((paw_dmft%dmft_prgn == 1) .and. (paw_dmft%lchipsiortho == 1)) then
274 0 : call local_ks_green(greendft,paw_dmft,prtopt=1)
275 : end if
276 : !call printocc_green(greendft,9,paw_dmft,3,chtype="DFT GREEN PSICHI")
277 :
278 : write(message,'(7a)') &
279 93 : & ch10,' =============================', &
280 93 : & ch10,' ===== Define self-energy', &
281 186 : & ch10,' =============================',ch10
282 93 : call wrtout(std_out,message,'COLL')
283 :
284 : ! Set Hu in density representation for calculation of entropy if needed...
285 93 : if (paw_dmft%dmft_entropy > 0) then
286 30 : do itypat=1,ntypat
287 21 : if (hu(itypat)%lpawu == -1) cycle
288 912 : call data4entropyDMFT_setHu(paw_dmft%forentropyDMFT,itypat,dble(hu(itypat)%udens(:,:)))
289 : end do ! itypat
290 : end if ! dmft_entropy=1
291 :
292 : !== define self from scratch or file and double counting
293 : !----------------------------------------------------------------------
294 : !- Self allocated
295 :
296 : !- Read self or do self=hdc
297 : !if(paw_dmft%dmft_solv==4) then
298 : ! write(std_out,*) "shift before rw_self",self%qmc_shift(1)
299 : ! call make_qmcshift_self(cryst_struc,hu,self)
300 : !end if
301 93 : call timab(627,1,tsec(:))
302 93 : call rw_self(self,paw_dmft,2,opt_rw=1,istep_iter=1000*istep)
303 93 : call timab(627,2,tsec(:))
304 :
305 : !== If QMC is used, and self energy is read for file, then
306 : !== one does NOT shifts the self-energy because it was already shifted when writed,
307 : !== and thus then weiss will be shifted
308 : !----------------------------------------------------------------------
309 : !if(paw_dmft%dmft_solv==4.and.paw_dmft%dmft_rslf==1) &
310 : !& call make_qmcshift_self(cryst_struc,hu,self)
311 : !if(paw_dmft%dmft_solv==4.and.paw_dmft%dmft_rslf/=1) &
312 : !& call make_qmcshift_self(cryst_struc,hu,self,apply=.true.)
313 :
314 93 : call destroy_green(greendft) ! destroy DFT green function
315 93 : call print_self(self,"print_dc",paw_dmft,2)
316 :
317 : !===========================================================================
318 : !== Construct green function with the self-energy.
319 : !===========================================================================
320 : write(message,'(6a)') &
321 93 : & ch10," ===================================================================", &
322 93 : & ch10," ===== Green's Function Calculation with input self-energy ========", &
323 186 : & ch10," ==================================================================="
324 93 : call wrtout(std_out,message,'COLL')
325 93 : if (dmft_optim) then
326 0 : call init_green(green,paw_dmft,opt_moments=opt_moments)
327 : else
328 93 : call icip_green("DFT+DMFT",green,paw_dmft,pawprtvol,self,opt_self=1,opt_moments=opt_moments)
329 : !call print_green('beforefermi_green',green,1,paw_dmft,pawprtvol=1,opt_wt=1)
330 : ! call abi_abort('COLL')
331 : end if
332 :
333 : !== Find fermi level
334 : !---------------------------------------------------------------------
335 : !write(message,'(2a,i3,13x,a)') ch10,' === Compute green function from self-energy'
336 :
337 93 : call fermi_green(green,paw_dmft,self)
338 93 : call compute_green(green,paw_dmft,0,self,opt_self=1,opt_nonxsum=1,opt_restart_moments=1)
339 93 : call integrate_green(green,paw_dmft,prtopt)
340 :
341 93 : if (dmft_optim) then
342 0 : call printocc_green(green,5,paw_dmft,3,chtype="DFT+DMFT")
343 : end if
344 :
345 : !== define weiss field only for the local quantities (opt_oper=2)
346 : !----------------------------------------------------------------------
347 : ! write(std_out,*) "nkpt befreo init_greenweiss",ifreq,paw_dmft%nkpt
348 93 : call init_green(weiss,paw_dmft,opt_oper_ksloc=2,opt_moments=opt_moments,opt_moments_ksloc=2,opt_occup_ksloc=2)
349 : ! do ifreq=1,weiss%nw
350 : ! write(std_out,*) "nkpt from weiss1",ifreq,weiss%oper(ifreq)%nkpt
351 : ! enddo
352 :
353 : !== Check fourier transforms
354 : !----------------------------------------------------------------------
355 93 : if (check == 1) then
356 1 : call check_fourier_green(cryst_struc,green,paw_dmft)
357 : end if
358 :
359 : !== If QMC is used, and self energy is not read for file, then
360 : !== one shifts the self-energy, and thus then weiss will be shifted
361 : !== after dyson, in a coherent way regarding qmc_shift and qmc_xmu.
362 : !----------------------------------------------------------------------
363 : !if(paw_dmft%dmft_solv==4.and.paw_dmft%dmft_rslf/=1) &
364 : !& call make_qmcshift_self(cryst_struc,hu,self,apply=.true.)
365 : !if(paw_dmft%dmft_solv==4) write(std_out,*) "shift after make_qmcshift_self",self%qmc_shift(1)
366 :
367 : write(message,'(6a)') &
368 93 : & ch10,' ======================================================', &
369 93 : & ch10,' ===== DMFT Loop starts here ========', &
370 186 : & ch10,' ======================================================'
371 93 : call wrtout(std_out,message,'COLL')
372 :
373 : ABI_NVTX_START_RANGE(NVTX_DMFT_SOLVE_LOOP)
374 : !=======================================================================
375 : !=== dmft loop =======================================================
376 199 : do idmftloop=1,dmft_iter
377 : !paw_dmft%idmftloop=idmftloop
378 106 : paw_dmft%idmftloop = paw_dmft%idmftloop + 1
379 : ! =======================================================================
380 106 : istep_iter = 1000*istep + idmftloop
381 :
382 106 : write(message,'(2a,i3,13x,a)') ch10,&
383 212 : & ' ===== DMFT Loop : ITER number',paw_dmft%idmftloop,'========'
384 106 : call wrtout(std_out,message,'COLL')
385 :
386 : ! == Dyson Equation G,self -> weiss(w)
387 : ! ---------------------------------------------------------------------
388 106 : call dyson(green,paw_dmft,self,weiss,opt_weissself=1)
389 : ! call print_green('afterDyson',green,1,paw_dmft,pawprtvol=1,opt_wt=1)
390 : ! call abi_abort('COLL')
391 :
392 : ! == Printout local "occupations" from weiss field (useless)
393 106 : if (abs(pawprtvol) > 3 .and. opt_moments == 0) then
394 0 : call integrate_green(weiss,paw_dmft,2,opt_ksloc=2)
395 0 : call printocc_green(weiss,5,paw_dmft,3,opt_weissgreen=1)
396 : end if
397 :
398 : ! === Prepare data, solve Impurity problem: weiss(w) -> G(w)
399 : ! ---------------------------------------------------------------------
400 106 : call initialize_self(self_new,paw_dmft,opt_moments=opt_moments)
401 :
402 106 : call impurity_solve(cryst_struc,green,hu(:),paw_dmft,pawang,pawtab(:),self,self_new,weiss,pawprtvol) ! weiss-> green, or self if dmft_solv=1
403 : ! if(paw_dmft%dmft_solv==4) write(std_out,*) "shift after impurity",self%qmc_shift(1)
404 :
405 : ! == Compute double counting from charge from green_solver
406 : ! ---------------------------------------------------------------------
407 130 : if (green%has_charge_matlu_solver /= 2) green%charge_matlu_solver(:,:) = green%charge_matlu(:,:)
408 :
409 106 : if (paw_dmft%dmft_solv >= 5) then
410 34 : call dc_self(green%charge_matlu_solver(:,:),self_new%hdc%matlu(:),hu(:),paw_dmft,pawtab(:),green%occup_tau%matlu(:))
411 : else
412 72 : call dc_self(green%charge_matlu_solver(:,:),self_new%hdc%matlu(:),hu(:),paw_dmft,pawtab(:),green%occup%matlu(:))
413 : end if
414 :
415 106 : if (abs(paw_dmft%dmft_solv) >= 5) then
416 34 : call destroy_green_tau(green)
417 : end if
418 :
419 : ! == Solve dyson equation. G_imp(w), weiss_imp(w) -> Self_imp(w)
420 : ! ---------------------------------------------------------------------
421 : ! if dmft_solv==1, self is computed previously
422 106 : if (abs(paw_dmft%dmft_solv) /= 1) then
423 104 : call dyson(green,paw_dmft,self_new,weiss,opt_weissself=2)
424 : end if
425 : ! do ifreq=1,green%nw
426 : ! call sym_matlu(cryst_struc,self%oper(ifreq)%matlu,pawang)
427 : ! enddo
428 :
429 : ! == Possibility if imposing self (opt_rw==3)
430 : ! ---------------------------------------------------------------------
431 106 : call timab(627,1,tsec(:))
432 106 : call rw_self(self_new,paw_dmft,prtopt=2,opt_rw=3,istep_iter=istep_iter)
433 106 : call timab(627,2,tsec(:))
434 :
435 : ! Print dc computed just before and self computed before in dyson or
436 : ! impurity_solve
437 106 : if (abs(pawprtvol) >= 3) then
438 70 : write(message,'(2a)') ch10," == Old self (before impurity solver)"
439 70 : call wrtout(std_out,message,'COLL')
440 70 : call print_self(self,"print_dc",paw_dmft,2)
441 70 : write(message,'(2a)') ch10," == New self (from impurity solver)"
442 70 : call wrtout(std_out,message,'COLL')
443 70 : call print_self(self_new,"print_dc",paw_dmft,2)
444 : end if ! abs(pawprtvol)>=3
445 :
446 : ! if(paw_dmft%dmft_solv==4) write(std_out,*) "shift before computeenergy ",self%qmc_shift(1)
447 : ! == Compute Energy with NEW self-energy and edc from green_solver,
448 : ! new local green function and old occupations for eband
449 : ! fermi level not optimized for this self_energy.
450 : ! ---------------------------------------------------------------------
451 : ! green= local green function and local charge comes directly from solver
452 : ! green= ks green function and occupations comes from old_self
453 106 : call compute_energy(energies_dmft,green,paw_dmft,pawprtvol,pawtab(:),self_new,occ_type="nlda",part=part2)
454 106 : if (paw_dmft%dmft_triqs_entropy == 1) then
455 0 : call compute_free_energy(energies_dmft,paw_dmft,green,"impu",self_new)
456 : end if
457 :
458 : ! == Mix new and old self_energies and double countings
459 : ! ---------------------------------------------------------------------
460 106 : write(message,'(3a)') ch10," == Linear mixing of old and new self-energy and double counting",ch10
461 106 : call wrtout(std_out,message,'COLL')
462 106 : call new_self(self,self_new,paw_dmft) ! self,self_new => self
463 106 : write(message,'(2a)') ch10," == After mixing,"
464 : !print *, " my_rank newself", my_rank,self%oper(1)%matlu(1)%mat(1,1,1,1,1)
465 106 : call wrtout(std_out,message,'COLL')
466 106 : call print_self(self,"print_dc",paw_dmft,2) ! print self and DC
467 106 : call destroy_self(self_new)
468 :
469 : ! == Compute green function self -> G(k)
470 : ! ---------------------------------------------------------------------
471 106 : if (.not. dmft_optim) then
472 106 : call compute_green(green,paw_dmft,1,self,opt_self=1,opt_nonxsum=1)
473 106 : call integrate_green(green,paw_dmft,3,opt_diff=1) !,opt_nonxsum=1)
474 :
475 106 : call printocc_green(green,5,paw_dmft,3,chtype="DFT+DMFT")
476 : ! call printocc_green(green,9,paw_dmft,3,chtype="DMFT FULL")
477 106 : if(paw_dmft%lchipsiortho == 1 .and. paw_dmft%dmft_prgn == 1) then
478 0 : call local_ks_green(green,paw_dmft,prtopt=1)
479 : end if
480 : end if ! dmft_optim=0
481 :
482 : ! == Find fermi level
483 : ! ---------------------------------------------------------------------
484 106 : call fermi_green(green,paw_dmft,self)
485 106 : call compute_green(green,paw_dmft,0,self,opt_self=1,opt_nonxsum=1,opt_log=paw_dmft%dmft_triqs_entropy,opt_restart_moments=1)
486 106 : call integrate_green(green,paw_dmft,prtopt,opt_diff=opt_diff,opt_ksloc=3,opt_fill_occnd=1)
487 :
488 106 : if (dmft_optim) then
489 0 : call printocc_green(green,5,paw_dmft,3,chtype="DFT+DMFT")
490 : end if
491 :
492 : ! call abi_abort('COLL')
493 :
494 : ! == Compute Energy with Mixed self-energy and green function recomputed with new self
495 : ! ---------------------------------------------------------------------
496 : ! green= lattice green function computed from self for a given chemical potential mu (self_mixed,mu)
497 : ! green= local green function is computed from lattice green function(self_mixed,mu)
498 : ! green= occupations are computed with lattice green function(self_mixed,mu)
499 106 : call compute_energy(energies_dmft,green,paw_dmft,pawprtvol,pawtab(:),self,occ_type="nlda",part=part3)
500 :
501 : ! == Save self on disk
502 : ! ---------------------------------------------------------------------
503 106 : call timab(627,1,tsec(:))
504 106 : call rw_self(self,paw_dmft,prtopt=2,opt_rw=2,opt_maxent=opt_maxent)
505 106 : call timab(627,2,tsec(:))
506 :
507 : ! == Test convergency
508 : ! ---------------------------------------------------------------------
509 106 : char_enddmft = "DFT+DMFT (end of DMFT loop)"
510 199 : if (green%ifermie_cv == 1 .and. self%iself_cv == 1 .and. green%ichargeloc_cv == 1 .and. paw_dmft%idmftloop > 1) then
511 0 : write(message,'(a,8x,a)') ch10,"DMFT Loop is converged !"
512 0 : call wrtout(std_out,message,'COLL')
513 0 : char_enddmft = "converged DMFT"
514 0 : exit
515 : end if
516 : ! =======================================================================
517 : ! === end dmft loop ====================================================
518 : end do ! idmftloop
519 : ABI_NVTX_END_RANGE()
520 : !=========================================================================
521 :
522 : !== Save self on disk
523 : !-------------------------------------------------------------------------
524 93 : if (.not. dmft_optim) then
525 93 : call timab(627,1,tsec(:))
526 93 : call rw_self(self,paw_dmft,prtopt=2,opt_rw=2)
527 93 : call timab(627,2,tsec(:))
528 : end if
529 :
530 : !paw_dmft%idmftloop=0
531 :
532 93 : write(message,'(2a,13x,a)') ch10,' ===== DMFT Loop : END ','========'
533 93 : call wrtout(std_out,message,'COLL')
534 :
535 93 : if (paw_dmft%dmft_entropy >= 1) then
536 : ! compute Edc for U=1 and J=U/J
537 9 : call init_energy(energies_tmp,natom)
538 : !call compute_dftu_energy(cryst_struc,energies_tmp,green,paw_dmft,pawtab)
539 9 : call compute_dftu_energy(energies_tmp,green,paw_dmft,pawtab(:),paw_dmft%forentropyDMFT%J_over_U)
540 9 : call data4entropyDMFT_setDc(paw_dmft%forentropyDMFT,energies_tmp%e_dc(:))
541 9 : call destroy_energy(energies_tmp,paw_dmft)
542 : end if ! dmft_entropy=1
543 :
544 : !== Compute final values for green functions, occupations, and spectral function
545 : !--------------------------------------------------------------------------------
546 : !Do not compute here, because, one want a energy computed after the
547 : !solver (for Hubbard I and DFT+U).
548 93 : if (.not. dmft_optim) then
549 93 : call compute_green(green,paw_dmft,1,self,opt_self=1,opt_nonxsum=1)
550 93 : call integrate_green(green,paw_dmft,2,opt_fill_occnd=1) !,opt_nonxsum=1)
551 : end if
552 : !call compute_energy(cryst_struc,energies_dmft,green,paw_dmft,pawprtvol,pawtab,self,opt=0)
553 93 : idmftloop = paw_dmft%idmftloop
554 93 : paw_dmft%idmftloop = 0
555 93 : call compute_energy(energies_dmft,green,paw_dmft,pawprtvol,pawtab(:),self,occ_type="nlda",part="band")
556 93 : paw_dmft%idmftloop = idmftloop
557 93 : if (paw_dmft%dmft_triqs_entropy == 1) then
558 0 : call compute_free_energy(energies_dmft,paw_dmft,green,"main",self)
559 : end if
560 :
561 : !write(message,'(2a,13x,a)') ch10,' ===== DMFT Loop is finished'
562 : !call wrtout(ab_out,message,'COLL')
563 : !write(std_out,*) "PRINTOCC INITIAL"
564 93 : call printocc_green(green,9,paw_dmft,3,chtype=char_enddmft)
565 : !write(std_out,*) "KS=czero"
566 : !green%occup%ks=czero
567 : !write(std_out,*) "PRINTOCC AFTER KS=0"
568 : !call printocc_green(green,9,paw_dmft,3,chtype="converged DMFT")
569 : !write(std_out,*) "UPFOLD_OPER"
570 : !call upfold_oper(green%occup,paw_dmft,1)
571 : !write(std_out,*) "PRINTOCC AFTER UPFOLD_OPER"
572 : !call printocc_green(green,9,paw_dmft,3,chtype="converged DMFT")
573 : !write(std_out,*) "MATLU=czero"
574 : !green%occup%matlu(1)%mat=czero
575 : !green%occup%ks(:,:,:,:)=cmplx(real(green%occup%ks(:,:,:,:)))
576 : !write(std_out,*) "PRINTOCC AFTER MATLU=0 AND IMAG KS=0"
577 : !call printocc_green(green,9,paw_dmft,3,chtype="converged DMFT")
578 : !write(std_out,*) "LOC_OPER"
579 : !call loc_oper(green%occup,paw_dmft,1)
580 : !write(std_out,*) "PRINTOCC AFTER LOC_OPER"
581 : !call printocc_green(green,9,paw_dmft,3,chtype="converged DMFT")
582 : !call flush_unit(std_out)
583 : !call abi_abort('COLL')
584 93 : if (paw_dmft%dmft_solv <= 2 .and. paw_dmft%prtdos >= 1) then
585 0 : call spectral_function(cryst_struc,green,hu(:),paw_dmft,pawtab(:),self,pawprtvol)
586 : end if
587 93 : call destroy_green(weiss)
588 93 : call destroy_green(green)
589 : !todo_ab rotate back density matrix into unnormalized basis just for
590 : !printout
591 93 : call destroy_hu(hu(:),ntypat)
592 93 : call destroy_self(self)
593 93 : call destroy_energy(energies_dmft,paw_dmft)
594 :
595 93 : write(message,'(2a,13x,a)') ch10,' ===== DMFT : END ','========'
596 93 : call wrtout(std_out,message,'COLL')
597 :
598 296 : ABI_FREE(hu)
599 :
600 : ABI_NVTX_END_RANGE()
601 : DBG_EXIT("COLL")
602 :
603 93 : end subroutine dmft_solve
604 : !!***
605 :
606 : !!****f* ABINIT/impurity_solve
607 : !! NAME
608 : !! impurity_solve
609 : !!
610 : !! FUNCTION
611 : !! Solve the Impurity problem
612 : !!
613 : !! INPUTS
614 : !! cryst_struc <type(crystal_t)>=crystal structure data
615 : !! green <type(green_type)>= green function data
616 : !! hu <type(hu_type)>= U interaction
617 : !! paw_dmft = data for self-consistent DFT+DMFT calculations.
618 : !! pawang <type(pawang)>=paw angular mesh and related data
619 : !! pawtab(ntypat*usepaw) <type(pawtab_type)>=paw tabulated starting data
620 : !! self_old,self_new <type(self_type)>= variables related to self-energy
621 : !! weiss <type(green_type)>= weiss function data
622 : !! pawprtvol = option for printing
623 : !!
624 : !! OUTPUT
625 : !! paw_dmft = data for self-consistent DFT+DMFT calculations.
626 : !!
627 : !! NOTES
628 : !!
629 : !! SOURCE
630 :
631 106 : subroutine impurity_solve(cryst_struc,green,hu,paw_dmft,pawang,pawtab,&
632 : & self_old,self_new,weiss,pawprtvol)
633 :
634 : !Arguments ------------------------------------
635 : !scalars
636 : ! type(pawang_type), intent(in) :: pawang
637 : type(crystal_t), intent(in) :: cryst_struc
638 : type(green_type), intent(inout) :: green,weiss
639 : type(paw_dmft_type), intent(inout) :: paw_dmft
640 : type(hu_type), intent(inout) :: hu(paw_dmft%ntypat)
641 : !type(MPI_type), intent(in) :: mpi_enreg
642 : type(pawang_type), intent(in) :: pawang
643 : type(pawtab_type), intent(in) :: pawtab(paw_dmft%ntypat)
644 : type(self_type), intent(inout) :: self_new,self_old
645 : integer, intent(in) :: pawprtvol
646 : !Local variables ------------------------------
647 : real(dp) :: tsec(2)
648 : character(len=500) :: message
649 : ! integer iatom,il,i_nd,isppol,lpawu,im,Nd,nrat,nsweeptot
650 : ! real(dp) :: acc,kx
651 : ! real(dp), allocatable :: correl(:,:),g0(:,:),gtmp(:,:)
652 : !scalars
653 : !************************************************************************
654 : !character(len=500) :: message
655 :
656 106 : call timab(622,1,tsec(:))
657 : ABI_NVTX_START_RANGE(NVTX_DMFT_IMPURITY_SOLVE)
658 : !=======================================================================
659 : !== Prepare data for Hirsch Fye QMC
660 : !== NB: for CTQMC, Fourier Transformation are done inside the CTQMC code
661 : !=======================================================================
662 : !if(abs(paw_dmft%dmft_solv)==4) then
663 : ! == Initialize weiss and green functions for fourier transformation
664 : ! -------------------------------------------------------------------
665 : ! write(message,'(2a,i3,13x,a)') ch10,' === Initialize Weiss field G_0(tau)'
666 : ! call wrtout(std_out,message,'COLL')
667 : ! call init_green_tau(weiss,paw_dmft)
668 : ! call init_green_tau(green,paw_dmft)
669 : ! in init_solver
670 :
671 : ! == Print weiss function G_0(tau=0-) before computation (really useless check)
672 : ! ------------------------------------------------------------------------------
673 : ! if(abs(pawprtvol)>3) then
674 : ! write(message,'(2a,i3,13x,a)') ch10,' === Check G_0(tau=0-) first'
675 : ! call wrtout(std_out,message,'COLL')
676 : ! call printocc_green(weiss,6,paw_dmft,3)
677 : ! end if
678 :
679 : ! == Fourier transform of weiss Field
680 : ! ------------------------------------
681 : ! for fourier of KS green functions
682 : ! call fourier_green(cryst_struc,weiss,mpi_enreg,paw_dmft,pawang,pawtab,1)
683 : ! write(message,'(2a,i3,13x,a)') ch10,' === Inverse Fourier Transform w->t of Weiss Field'
684 : ! call wrtout(std_out,message,'COLL')
685 : ! call fourier_green(cryst_struc,weiss,paw_dmft,pawang,opt_ksloc=2,opt_tw=-1)
686 :
687 : ! == Print weiss function G2_0(tau=0-)
688 : ! --------------------------------------
689 : ! call printocc_green(weiss,6,paw_dmft,3,opt_weissgreen=1)
690 :
691 : ! for fourier of KS green functions
692 : ! call fourier_green(cryst_struc,weiss,mpi_enreg,paw_dmft,pawang,pawtab,1)
693 : ! == Print G_0(tau) in files
694 : ! ---------------------------
695 : ! if(paw_dmft%dmft_prgn==1) then
696 : ! call print_green('weiss',weiss,1,paw_dmft,pawprtvol=1,opt_wt=2)
697 : ! end if
698 :
699 106 : if (abs(paw_dmft%dmft_solv) >= 5) then
700 : ! == Initialize green functions for imaginary times
701 : ! -------------------------------------------------------------------
702 34 : write(message,'(2a)') ch10," === Initialize Green's function G(tau)"
703 34 : call wrtout(std_out,message,'COLL')
704 34 : call init_green_tau(green,paw_dmft)
705 :
706 : end if
707 : !=======================================================================
708 : !== End preparation of QMC
709 : !=======================================================================
710 :
711 : !=======================================================================
712 : !== Solve impurity model =============================================
713 : !=======================================================================
714 106 : write(message,'(2a)') ch10,' === Solving impurity model'
715 106 : call wrtout(std_out,message,'COLL')
716 106 : if (abs(paw_dmft%dmft_solv) == 1) then
717 :
718 : ! == DFT+U for test -> self
719 : ! -------------------
720 2 : call dftu_self(cryst_struc,green,paw_dmft,pawtab(:),self_new,opt_dftu=1,prtopt=pawprtvol)
721 :
722 104 : else if (abs(paw_dmft%dmft_solv) == 2) then
723 :
724 : ! == Hubbard One -> green
725 : ! -------------------
726 69 : call hubbard_one(cryst_struc,green,hu(:),paw_dmft,pawprtvol,self_old%hdc,weiss)
727 :
728 : !else if(abs(paw_dmft%dmft_solv)==4) then
729 :
730 : ! == QMC
731 : ! -------------------
732 : ! call copy_green(weiss,green,opt_tw=1)
733 : ! call qmc_prep
734 : ! message = ' === QMC not yet distributed '
735 : ! ABI_ERROR(message)
736 : ! call qmc_prep(cryst_struc,green,hu,mpi_enreg,paw_dmft,pawang&
737 : !& ,pawprtvol,self_old%qmc_xmu,weiss)
738 :
739 35 : else if (paw_dmft%dmft_solv == 6 .or. paw_dmft%dmft_solv == 7) then
740 :
741 0 : call ctqmc_calltriqs_c(paw_dmft,green,self_old,hu(:),weiss,self_new,pawprtvol)
742 :
743 35 : else if (abs(paw_dmft%dmft_solv) >= 5) then
744 :
745 : ! == Nothing
746 : ! -------------------
747 : ! call copy_green(weiss,green,opt_tw=1)
748 : ! call copy_green(weiss,green,opt_tw=2)
749 :
750 34 : call qmc_prep_ctqmc(cryst_struc,green,self_old,hu(:),paw_dmft,pawang,pawprtvol,weiss)
751 :
752 :
753 1 : else if (abs(paw_dmft%dmft_solv) == 0) then
754 :
755 : ! == Nothing
756 : ! -------------------
757 : ! weiss%occup%has_operks=0 -> only local part is duplicated
758 1 : call copy_green(weiss,green,opt_tw=2)
759 : end if ! dmft_solv
760 : !call print_green("invWeiss",cryst_struc,weiss,3,paw_dmft,pawtab,2)
761 :
762 : !=======================================================================
763 : !== Treat data from HF QMC
764 : !=======================================================================
765 106 : if (abs(paw_dmft%dmft_solv) >= 4) then
766 : ! propagate qmc_shift (useful for compute_energy)
767 : !if(abs(paw_dmft%dmft_solv)==4) then
768 : ! self_new%qmc_shift(:)=self_old%qmc_shift(:)
769 : ! self_new%qmc_xmu(:)=self_old%qmc_xmu(:)
770 : !end if
771 :
772 : ! == Print local occupations from G(tau)
773 : ! ---------------------------------------
774 :
775 : ! == Fourier back transform of green function G(tau)->G(iw_n) and
776 : ! == compute occupations from g(tau)
777 : ! -------------------------------------------------------------------
778 : !if(abs(paw_dmft%dmft_solv)==4) then
779 : ! write(message,'(2a,i3,13x,a)') ch10,' === Direct Fourier Transform t->w of Green Function'
780 : ! call wrtout(std_out,message,'COLL')
781 : ! call fourier_green(cryst_struc,green,paw_dmft,&
782 : !& pawang,opt_ksloc=2,opt_tw=1)
783 : ! do ifreq=1,green%nw
784 : ! xx= green%oper(ifreq)%matlu(1)%mat(1,1,1,1,1)
785 : ! write(112,*) paw_dmft%omega_lo(ifreq),real(one/xx),aimag(one/xx)
786 : ! write(113,*) paw_dmft%omega_lo(ifreq),real(xx),aimag(xx)
787 : ! end do
788 : ! call flush_unit(112)
789 : ! call flush_unit(113)
790 : ! if(paw_dmft%dmft_solv==5) stop
791 : ! if(pawprtvol>=3) then
792 : ! write(message,'(a,2x,a,f13.5)') ch10,& ! debug
793 : !& " == Print green function for small freq after fourier " ! debug
794 : ! call wrtout(std_out,message,'COLL') ! debug
795 : ! call print_matlu(green%oper(1)%matlu,paw_dmft%natom,1) ! debug
796 : ! end if
797 :
798 : ! write(message,'(2a,i3,13x,a)') ch10,' INVERSE FOURIER OF G0 SUPPRESSED'
799 : ! call wrtout(std_out,message,'COLL')
800 : !end if
801 34 : if (abs(paw_dmft%dmft_solv) == 888) then
802 : ! == Back fourier transform of G_0(tau) for compensation (try or comment or improve FT).
803 : ! -------------------------------------------------------------------
804 0 : write(message,'(2a)') ch10,' === Direct Fourier transform t->w of Weiss'
805 0 : call wrtout(std_out,message,'COLL')
806 0 : call fourier_green(cryst_struc,weiss,paw_dmft,opt_ksloc=2,opt_tw=1)
807 :
808 0 : if (pawprtvol >= 3) then
809 0 : write(message,'(a,2x,a,f13.5)') ch10,& ! debug
810 0 : & " == Print weiss function for small freq after fourier " ! debug
811 0 : call wrtout(std_out,message,'COLL') ! debug
812 0 : call print_matlu(weiss%oper(1)%matlu(:),paw_dmft%natom,1) ! debug
813 : end if ! pawprtvol>=3
814 0 : call destroy_green_tau(weiss)
815 : end if ! dmft_solv=888
816 :
817 : ! == Destroy tau part of green
818 : ! -------------------------------------------------------------------
819 34 : call trace_oper(green%occup_tau,green%charge_ks,green%charge_matlu_solver(:,:),2)
820 34 : green%has_charge_matlu_solver = 2
821 :
822 : end if ! dmft_solv>=5
823 : !=======================================================================
824 : !== End Treat data for QMC
825 : !=======================================================================
826 :
827 : !=======================================================================
828 : !== Integrate green function and printout occupations
829 : !=======================================================================
830 : !For dmft_solv=-1,0,or 1, the green function was not yet computed: it
831 : !cannot be integrated
832 : !=======================================================================
833 106 : if (paw_dmft%dmft_solv >= 2 .and. green%w_type == "imag") then
834 : ! == Integrate G(iw_n)
835 : ! ---------------------
836 103 : write(message,'(2a)') ch10," === Integrate local part of Green's function"
837 103 : call wrtout(std_out,message,'COLL')
838 103 : call integrate_green(green,paw_dmft,2,opt_ksloc=2,opt_after_solver=1)
839 :
840 : ! == Print local occupations from integration of G(iw_n)
841 : ! --------------------------------------------------------
842 103 : call printocc_green(green,5,paw_dmft,3)
843 :
844 : ! == Print G_loc(w)
845 : ! --------------------------------------------------------
846 103 : if (paw_dmft%dmft_prgn == 1) then
847 0 : call print_green('DMFT_IMPURITY',green,1,paw_dmft,opt_wt=1)
848 : end if
849 : end if ! dmft_solv>=2 and w_type="imag"
850 : !stop
851 :
852 : !if(abs(pawprtvol)>0) then
853 : !end if
854 :
855 :
856 : ABI_NVTX_END_RANGE()
857 106 : call timab(622,2,tsec(:))
858 :
859 106 : end subroutine impurity_solve
860 : !!***
861 :
862 : !!****f* ABINIT/dyson
863 : !! NAME
864 : !! dyson
865 : !!
866 : !! FUNCTION
867 : !! Use the Dyson Equation to compute self-energy from green function
868 : !!
869 : !! INPUTS
870 : !! green <type(green_type)>= green function data
871 : !! paw_dmft = data for self-consistent DFT+DMFT calculations.
872 : !! self <type(self_type)>= variables related to self-energy
873 : !! weiss <type(green_type)>= Weiss field
874 : !! opt_weissself = 1: compute weiss from green and self
875 : !! = 2: compute self from green and weiss
876 : !!
877 : !! OUTPUT
878 : !!
879 : !! NOTES
880 : !!
881 : !! SOURCE
882 :
883 210 : subroutine dyson(green,paw_dmft,self,weiss,opt_weissself)
884 :
885 : !Arguments ------------------------------------
886 : !scalars
887 : type(green_type), intent(in) :: green
888 : type(paw_dmft_type), intent(in) :: paw_dmft
889 : type(self_type), intent(inout) :: self
890 : type(green_type), intent(inout) :: weiss
891 : integer, intent(in) :: opt_weissself
892 : ! type(paw_dmft_type), intent(inout) :: paw_dmft
893 : !Local variables ------------------------------
894 : integer :: ifreq,myproc,natom,nspinor,nsppol,weissinv
895 : logical :: triqs
896 : real(dp) :: tsec(2)
897 210 : type(matlu_type), allocatable :: greeninv(:)
898 : character(len=500) :: message
899 : ! type
900 : ! type(matlu_type), pointer :: matlutemp,matlu1,matlu2
901 : !************************************************************************
902 :
903 210 : call timab(623,1,tsec(:))
904 : DBG_ENTER("COLL")
905 :
906 210 : myproc = paw_dmft%myproc
907 210 : natom = paw_dmft%natom
908 210 : nsppol = paw_dmft%nsppol
909 210 : nspinor = paw_dmft%nspinor
910 210 : triqs = (paw_dmft%dmft_solv == 6 .or. paw_dmft%dmft_solv == 7)
911 210 : weissinv = merge(0,1,paw_dmft%dmft_solv==2.or.triqs)
912 :
913 210 : if (opt_weissself == 1) then
914 106 : write(message,'(2a)') ch10," === Use Dyson's Equation => weiss"
915 106 : call wrtout(std_out,message,'COLL')
916 104 : else if (opt_weissself == 2) then
917 104 : write(message,'(2a)') ch10," === Use Dyson's Equation => self"
918 104 : call wrtout(std_out,message,'COLL')
919 : end if ! opt_weisself
920 :
921 : !call xmpi_barrier(spaceComm)
922 :
923 1366 : ABI_MALLOC(greeninv,(natom))
924 210 : call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu(:),greeninv(:))
925 :
926 46324 : do ifreq=1,green%nw
927 :
928 46114 : if (green%distrib%procf(ifreq) /= myproc) cycle
929 :
930 16000 : call copy_matlu(green%oper(ifreq)%matlu(:),greeninv(:),natom)
931 16000 : call inverse_matlu(greeninv(:),natom)
932 :
933 16210 : if (opt_weissself == 1) then
934 :
935 : ! warning green is now inversed
936 8032 : call add_matlu(greeninv(:),self%oper(ifreq)%matlu(:),weiss%oper(ifreq)%matlu(:),natom,1)
937 8032 : if (.not. triqs) then
938 8032 : call inverse_oper(weiss%oper(ifreq),2)
939 : end if
940 :
941 7968 : else if (opt_weissself == 2) then
942 :
943 : ! write(59,*) paw_dmft%omega_lo(ifreq), real(green%oper(ifreq)%matlu(1)%mat(1,1,1,1,1)),aimag(green%oper(ifreq)%matlu(1)%mat(1,1,1,1,1))
944 : ! write(61,*) paw_dmft%omega_lo(ifreq), real(greeninv%oper(ifreq)%matlu(1)%mat(1,1,1,1,1)),aimag(greeninv%oper(ifreq)%matlu(1)%mat(1,1,1,1,1))
945 : ! write(60,*) paw_dmft%omega_lo(ifreq), real(weiss%oper(ifreq)%matlu(1)%mat(1,1,1,1,1)),aimag(weiss%oper(ifreq)%matlu(1)%mat(1,1,1,1,1))
946 : ! call inverse_oper(weiss%oper(ifreq),option=1,prtopt=1)
947 : ! write(62,*) paw_dmft%omega_lo(ifreq), real(weiss%oper(ifreq)%matlu(1)%mat(1,1,1,1,1)),aimag(weiss%oper(ifreq)%matlu(1)%mat(1,1,1,1,1))
948 : ! call inverse_oper(weiss%oper(ifreq),option=1,prtopt=1)
949 : ! write(63,*) paw_dmft%omega_lo(ifreq), real(self%oper(ifreq)%matlu(1)%mat(1,1,1,1,1)),aimag(self%oper(ifreq)%matlu(1)%mat(1,1,1,1,1))
950 :
951 : ! write(std_out,*) "-----------------------IFREQ",ifreq
952 : ! call print_matlu(greeninv%oper(ifreq)%matlu,paw_dmft%natom,1,opt_diag=-1)
953 : !call inverse_oper(greeninv%oper(ifreq),option=1,prtopt=1)
954 : ! call print_matlu(greeninv%oper(ifreq)%matlu,paw_dmft%natom,1,opt_diag=-1)
955 : ! If paw_dmft%dmft_solv==2, then inverse of weiss function is
956 : ! computed in m_hubbard_one.F90
957 7968 : if (weissinv /= 0) then
958 6288 : call inverse_oper(weiss%oper(ifreq),2)
959 : end if
960 :
961 : ! write(std_out,*) weiss%oper(1)%matlu(ifreq)%mat(1,1,1,1,1),"-",greeninv%oper(ifreq)
962 7968 : call add_matlu(weiss%oper(ifreq)%matlu(:),greeninv(:),self%oper(ifreq)%matlu(:),natom,-1)
963 :
964 : ! write(64,*) paw_dmft%omega_lo(ifreq), real(greeninv%oper(ifreq)%matlu(1)%mat(1,1,1,1,1)),aimag(greeninv%oper(ifreq)%matlu(1)%mat(1,1,1,1,1))
965 : ! write(65,*) paw_dmft%omega_lo(ifreq), real(weiss%oper(ifreq)%matlu(1)%mat(1,1,1,1,1)),aimag(weiss%oper(ifreq)%matlu(1)%mat(1,1,1,1,1))
966 : ! write(66,*) paw_dmft%omega_lo(ifreq), real(self%oper(ifreq)%matlu(1)%mat(1,1,1,1,1)),aimag(self%oper(ifreq)%matlu(1)%mat(1,1,1,1,1))
967 : else
968 0 : message = " BUG in dyson.F90"
969 0 : ABI_BUG(message)
970 : end if ! opt_weissself
971 : end do ! ifreq
972 :
973 210 : if (opt_weissself == 1) then
974 106 : call gather_oper(weiss%oper(:),weiss%distrib,paw_dmft,opt_ksloc=2)
975 104 : else if (opt_weissself == 2) then
976 104 : call gather_oper(self%oper(:),self%distrib,paw_dmft,opt_ksloc=2)
977 : end if ! opt_weisself
978 :
979 210 : call destroy_matlu(greeninv(:),natom)
980 946 : ABI_FREE(greeninv)
981 :
982 210 : call timab(623,2,tsec(:))
983 : DBG_EXIT("COLL")
984 :
985 210 : end subroutine dyson
986 : !!***
987 :
988 : !!****f* m_dmft/spectral_function
989 : !! NAME
990 : !! spectral_function
991 : !!
992 : !! FUNCTION
993 : !! Print the spectral function computed from Green function in real frequency
994 : !!
995 : !! INPUTS
996 : !! cryst_struc <type(crystal_t)>=crystal structure data
997 : !! green <type(green_type)>= green function data
998 : !! hu <type(hu_type)>= datatype of type hu
999 : !! paw_dmft = data for self-consistent DFT+DMFT calculations.
1000 : !! self <type(self_type)>= variables related to self-energy
1001 : !! prtopt= option for printing
1002 : !!
1003 : !! OUTPUT
1004 : !! paw_dmft = data for self-consistent DFT+DMFT calculations.
1005 : !!
1006 : !! NOTES
1007 : !!
1008 : !! SOURCE
1009 :
1010 0 : subroutine spectral_function(cryst_struc,green,hu,paw_dmft,&
1011 0 : & pawtab,self_old,prtopt)
1012 :
1013 : use m_dftu_self, only : dftu_self
1014 : use m_green, only : compute_green,copy_green,destroy_green,init_green,print_green
1015 : use m_hubbard_one, only : hubbard_one
1016 : use m_matlu, only : copy_matlu
1017 : use m_self, only : dc_self,destroy_self,initialize_self,rw_self
1018 :
1019 : !Arguments ------------------------------------
1020 : !scalars
1021 : type(crystal_t),intent(in) :: cryst_struc
1022 : type(green_type), intent(in) :: green
1023 : type(hu_type),intent(inout) :: hu(cryst_struc%ntypat)
1024 : !type(MPI_type), intent(inout) :: mpi_enreg
1025 : type(pawtab_type),intent(inout) :: pawtab(cryst_struc%ntypat)
1026 : type(self_type), intent(inout) :: self_old
1027 : type(paw_dmft_type), intent(inout) :: paw_dmft
1028 : integer, intent(in) :: prtopt
1029 :
1030 : !Local variables ------------------------------
1031 : character(len=500) :: message
1032 0 : type(green_type) :: greenr
1033 0 : type(green_type) :: weissr
1034 0 : type(self_type) :: selfr
1035 : !scalars
1036 : !************************************************************************
1037 : !character(len=500) :: message
1038 :
1039 : ! opt_oper_ksloc=3 to be able to compute spectral function.
1040 0 : call init_green(greenr,paw_dmft,opt_oper_ksloc=3,wtype="real")
1041 0 : call init_green(weissr,paw_dmft,wtype="real")
1042 0 : call copy_matlu(green%occup%matlu,greenr%occup%matlu,paw_dmft%natom)
1043 0 : call initialize_self(selfr,paw_dmft,wtype="real")
1044 : !=======================================================================
1045 : !== Solve impurity model with green function for real frequency
1046 : !=======================================================================
1047 0 : write(message,'(2a,i3,13x,a)') ch10,' === Write Spectral function'
1048 0 : call wrtout(std_out,message,'COLL')
1049 0 : if(abs(paw_dmft%dmft_solv)==1) then
1050 :
1051 : ! == DFT+U for test
1052 : ! -------------------
1053 : call dftu_self(cryst_struc,greenr,paw_dmft,&
1054 0 : & pawtab,selfr,opt_dftu=1,prtopt=prtopt)
1055 0 : else if(abs(paw_dmft%dmft_solv)==2) then
1056 :
1057 : ! == Hubbard One
1058 : ! -------------------
1059 : call hubbard_one(cryst_struc,greenr,hu,paw_dmft,&
1060 0 : & prtopt,self_old%hdc,weissr)
1061 :
1062 0 : else if(abs(paw_dmft%dmft_solv)==4) then
1063 :
1064 : ! == Nothing
1065 : ! -------------------
1066 0 : message = "spectral_function: This section of code is disabled!"
1067 0 : ABI_ERROR(message)
1068 0 : call copy_green(weissr,greenr,opt_tw=1)
1069 :
1070 0 : else if(abs(paw_dmft%dmft_solv)>=5) then
1071 :
1072 : ! == Nothing
1073 : ! -------------------
1074 0 : ABI_ERROR("Stopping before copy_green")
1075 0 : call copy_green(weissr,greenr,opt_tw=1)
1076 :
1077 0 : else if(abs(paw_dmft%dmft_solv)==0) then
1078 :
1079 : ! == Nothing
1080 : ! -------------------
1081 : ! weiss%occup%has_operks=0 -> only local part is duplicated
1082 0 : call copy_green(weissr,greenr,opt_tw=2)
1083 : end if
1084 :
1085 : !=======================================================================
1086 : !== Integrate green function and printout occupations
1087 : !For dmft_solv=-1,0,or 1 , the green function was not computed: it
1088 : !cannot be integrated
1089 : !=======================================================================
1090 0 : call dc_self(green%charge_matlu_solver,selfr%hdc%matlu,hu,paw_dmft,pawtab,green%occup%matlu)
1091 0 : if(abs(paw_dmft%dmft_solv)/=1.and.paw_dmft%dmft_solv/=0) then
1092 0 : call dyson(greenr,paw_dmft,selfr,weissr,opt_weissself=2)
1093 : end if
1094 0 : call compute_green(greenr,paw_dmft,1,selfr,opt_self=1)
1095 0 : call print_green("realw",greenr,4,paw_dmft)
1096 0 : call rw_self(selfr,paw_dmft,prtopt=2,opt_rw=2)
1097 :
1098 : if(abs(prtopt)>0) then
1099 : end if
1100 0 : call destroy_self(selfr)
1101 0 : call destroy_green(weissr)
1102 0 : call destroy_green(greenr)
1103 :
1104 0 : end subroutine spectral_function
1105 : !!***
1106 :
1107 : END MODULE m_dmft
1108 : !!***
|