Line data Source code
1 : !!****m* ABINIT/m_forctqmc
2 : !! NAME
3 : !! m_forctqmc
4 : !!
5 : !! FUNCTION
6 : !! Prepare CTQMC and call CTQMC
7 : !!
8 : !! COPYRIGHT
9 : !! Copyright (C) 2006-2026 ABINIT group (BAmadon, VPlanes)
10 : !! This file is distributed under the terms of the
11 : !! GNU General Public License, see ~abinit/COPYING
12 : !! or http://www.gnu.org/copyleft/gpl.txt .
13 : !!
14 : !! INPUTS
15 : !!
16 : !! OUTPUT
17 : !!
18 : !! SOURCE
19 :
20 : #if defined HAVE_CONFIG_H
21 : #include "config.h"
22 : #endif
23 :
24 : #include "abi_common.h"
25 :
26 : MODULE m_forctqmc
27 :
28 : use defs_basis
29 : use m_abicore
30 : use m_Ctqmc
31 : use m_CtqmcInterface
32 : use m_Ctqmcoffdiag
33 : use m_CtqmcoffdiagInterface
34 : use m_CtqmcoffdiagComplex
35 : use m_CtqmcoffdiagInterfaceComplex
36 : use m_data4entropyDMFT
37 : use m_errors
38 : use m_GreenHyb
39 : use m_time
40 :
41 : use m_crystal, only : crystal_t
42 : use m_datafordmft, only : compute_levels,hybridization_asymptotic_coefficient
43 : use m_energy, only : compute_migdal_energy,compute_trace_log_loc
44 : use m_fstrings, only : int2char4
45 : use m_green, only : compute_moments_loc,copy_green,destroy_green,green_type, &
46 : & init_green,int_fct,occup_green_tau,print_green
47 : use m_hide_lapack, only : matrginv,xginv
48 : use m_hu, only : copy_hu,destroy_hu,destroy_vee,hu_type,init_vee, &
49 : & rotatevee_hu,vee_type,vee_ndim2tndim_hu_r
50 : use m_io_tools, only : flush_unit,open_file
51 : use m_matlu, only : add_matlu,checkdiag_matlu,checkreal_matlu,chi_matlu,copy_matlu,destroy_matlu, &
52 : & diag_matlu,diff_matlu,fac_matlu,gather_matlu,init_matlu,magmomforb_matlu,magmomfspin_matlu, &
53 : & magmomfzeeman_matlu,matlu_type,print_matlu,printplot_matlu,prod_matlu,rotate_matlu,shift_matlu, &
54 : & slm2ylm_matlu,sym_matlu,symmetrize_matlu,xmpi_matlu,ylm2jmj_matlu,zero_matlu,magnfield_matlu,magmomjmj_matlu
55 : use m_numeric_tools, only : coeffs_gausslegint
56 : use m_oper, only : destroy_oper,gather_oper,identity_oper,init_oper,inverse_oper,oper_type, &
57 : & init_oper_ndat,copy_oper_to_ndat,copy_oper_from_ndat
58 : use m_paw_correlations, only : calc_vee
59 : use m_paw_dmft, only : paw_dmft_type
60 : use m_paw_numeric, only : jbessel => paw_jbessel
61 : use m_pawang, only : pawang_type
62 : use m_self, only : destroy_self,initialize_self,self_type
63 : use m_special_funcs, only : sbf8
64 : use m_splines, only : spline2_complex
65 :
66 : use netcdf !If calling TRIQS via python invocation, write a .nc file
67 :
68 : implicit none
69 :
70 : private
71 :
72 : public :: qmc_prep_ctqmc
73 : public :: testcode_ctqmc
74 : public :: testcode_ctqmc_b
75 : public :: ctqmcoutput_to_green
76 : public :: ctqmcoutput_printgreen
77 : public :: ctqmc_calltriqs
78 : public :: ctqmc_calltriqs_c
79 : !!***
80 :
81 : contains
82 : !!****f* m_forctqmc/qmc_prep_ctqmc
83 : !! NAME
84 : !! qmc_prep_ctqmc
85 : !!
86 : !! FUNCTION
87 : !! Prepare and call the qmc subroutines
88 : !!
89 : !! INPUTS
90 : !! cryst_struc <type(crystal_t)>=crystal structure data
91 : !! self <type(self_type)>= self-energy
92 : !! hu <type(hu_type)>= U interaction
93 : !! paw_dmft <type(paw_dmft_type)>= DMFT data structure
94 : !! pawang <type(pawang)>=paw angular mesh and related data
95 : !! pawprtvol = drive the amount of writed data.
96 : !! weiss <type(green_type)>= weiss function
97 : !!
98 : !! OUTPUT
99 : !! green <type(green_type)>= green function
100 : !!
101 : !! NOTES
102 : !!
103 : !! SOURCE
104 :
105 34 : subroutine qmc_prep_ctqmc(cryst_struc,green,self,hu,paw_dmft,pawang,pawprtvol,weiss)
106 :
107 : !Arguments ------------------------------------
108 : !scalars
109 : ! type(pawang_type), intent(in) :: pawang
110 : type(crystal_t), intent(in) :: cryst_struc
111 : type(green_type), intent(inout) :: green ! MGNAG: This fix the problem with v7[27:29] on nag@petrus
112 : type(hu_type), intent(inout) :: hu(cryst_struc%ntypat)
113 : type(paw_dmft_type), intent(inout) :: paw_dmft
114 : type(pawang_type), intent(in) :: pawang
115 : integer, intent(in) :: pawprtvol
116 : type(green_type), target, intent(inout) :: weiss
117 : type(self_type), intent(inout) :: self
118 : !Local variables ------------------------------
119 : integer :: iatom,icomp,ierr,if1,if2,iflavor1,iflavor2,ifreq,im1,im2,ima,imb,ispa,ispb,ispinor
120 : integer :: ispinor1,ispinor2,isppol,itau,itypat,lpawu,myproc,natom,ndim,nflavor,nomega,nproc
121 : integer :: nspinor,nsppol,nsppol_imp,ntypat,nwlo,opt_diag,opt_fk,opt_nondiag,opt_complex
122 : integer :: opt_rot,rot_type_vee,testcode,testrot,tndim,unt,unt2,useylm,basis,usejmj,opt_hybri
123 : integer, parameter :: optdb = 0
124 : logical :: nondiaglevels
125 : logical(kind=1) :: leg_measure = .true.
126 : real(dp) :: doccsum,EE,f4of2_sla,f6of2_sla,noise,omega
127 34 : type(green_type) :: weiss_for_rot
128 68 : type(oper_type) :: energy_level,level_diag
129 34 : type(CtqmcInterface) :: hybrid
130 102 : type(CtqmcoffdiagInterface) :: hybridoffdiag
131 102 : type(CtqmcoffdiagInterfaceComplex) :: hybridoffdiagComplex
132 : real(dp) :: umod(2,2)
133 : complex(dp) :: integral(2,2)
134 68 : real(dp), allocatable :: docc(:,:),gtmp(:,:),gtmp_nd(:,:,:),levels_ctqmc(:),vee(:,:,:,:)
135 68 : complex(dpc), allocatable :: muorb(:),muspin(:),muzeem(:),levels_ctqmc_complex(:),gtmp_ndc(:,:,:)
136 34 : complex(dpc), allocatable :: fw1(:,:),fw1_nd(:,:,:),gw_tmp(:,:),gw_tmp_nd(:,:,:)
137 68 : complex(dpc), allocatable :: gw1_nd(:,:,:),hybri_limit(:,:),levels_ctqmc_nd(:,:),shift(:)
138 34 : type(coeff2c_type), allocatable :: magmom_orb(:),magmom_spin(:),magmom_tot(:)
139 34 : type(hu_type), allocatable :: hu_for_s(:)
140 34 : type(matlu_type), allocatable :: dmat_diag(:),eigvectmatlu(:),hybri_coeff(:),matlu1(:),matlu2(:),matlu3(:)
141 34 : type(matlu_type), allocatable :: matlu4(:),matlumag(:),matlumag_orb(:),matlumag_spin(:),matlumag_tot(:)
142 34 : type(matlu_type), allocatable :: udens_atoms(:),udens_atoms_for_s(:)
143 34 : type(matlu_type), allocatable :: levels_temp(:),magnfield(:)
144 34 : type(vee_type), allocatable :: vee_for_s(:),vee_rotated(:)
145 : character(len=13) :: tag
146 : character(len=2) :: tag_atom
147 : character(len=500) :: message
148 : real(dp) :: tsec(2)
149 : #ifdef HAVE_OPENMP_OFFLOAD
150 : type(oper_type) :: green_oper_ndat
151 : #endif
152 : ! ************************************************************************
153 :
154 34 : call timab(701,1,tsec(:))
155 34 : call timab(702,1,tsec(:))
156 : !mbandc=paw_dmft%mbandc
157 : !nkpt=paw_dmft%nkpt
158 34 : natom = paw_dmft%natom
159 34 : nspinor = paw_dmft%nspinor
160 34 : nsppol = paw_dmft%nsppol
161 34 : ntypat = paw_dmft%ntypat
162 34 : nwlo = paw_dmft%dmft_nwlo
163 34 : basis = paw_dmft%dmftctqmc_basis
164 : !greendft%whichgreen="DFT"
165 :
166 34 : call init_green(weiss_for_rot,paw_dmft,opt_oper_ksloc=2)
167 : ! call init_green(gw_loc,paw_dmft)
168 34 : call copy_green(weiss,weiss_for_rot,opt_tw=2)
169 : !=======================================================================
170 : !== Use one QMC solver ===============================================
171 : !=======================================================================
172 34 : write(message,'(3a)') ch10,' === CT-QMC solver === '
173 34 : call wrtout(std_out,message,'COLL')
174 :
175 : ! Initialise for compiler
176 : ! omega_current=czero
177 :
178 : ! Initialise nproc
179 34 : nproc=paw_dmft%nproc
180 34 : myproc = paw_dmft%myproc
181 :
182 : ! ======================================
183 : ! Allocations: diagonalization and eigenvectors
184 : ! ======================================
185 164 : ABI_MALLOC(udens_atoms,(natom))
186 130 : ABI_MALLOC(eigvectmatlu,(natom))
187 164 : ABI_MALLOC(magmom_orb,(natom))
188 130 : ABI_MALLOC(matlumag_orb,(natom))
189 130 : ABI_MALLOC(magmom_spin,(natom))
190 130 : ABI_MALLOC(matlumag_spin,(natom))
191 130 : ABI_MALLOC(magmom_tot,(natom))
192 130 : ABI_MALLOC(matlumag_tot,(natom))
193 34 : if (paw_dmft%ientropy == 1) then
194 0 : ABI_MALLOC(udens_atoms_for_s,(natom))
195 : end if
196 130 : ABI_MALLOC(dmat_diag,(natom))
197 34 : call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu(:),dmat_diag(:))
198 34 : call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu(:),eigvectmatlu(:))
199 34 : call init_matlu(natom,2,1,paw_dmft%lpawu(:),udens_atoms(:))
200 34 : if (paw_dmft%ientropy == 1) then
201 0 : call init_matlu(natom,2,1,paw_dmft%lpawu(:),udens_atoms_for_s(:))
202 : end if
203 96 : do iatom=1,natom
204 62 : lpawu = paw_dmft%lpawu(iatom)
205 62 : if (lpawu == -1) cycle
206 136 : ABI_MALLOC(magmom_orb(iatom)%value,(2*(2*lpawu+1),2*(2*lpawu+1)))
207 4698 : magmom_orb(iatom)%value=czero
208 102 : ABI_MALLOC(magmom_spin(iatom)%value,(2*(2*lpawu+1),2*(2*lpawu+1)))
209 4698 : magmom_spin(iatom)%value=czero
210 102 : ABI_MALLOC(magmom_tot(iatom)%value,(2*(2*lpawu+1),2*(2*lpawu+1)))
211 4760 : magmom_tot(iatom)%value=czero
212 : end do ! iatom
213 :
214 : ! =================================================================
215 : ! Impose diago of density matrix
216 : ! =================================================================
217 :
218 : ! =================================================================
219 : ! Impose diago of levels and Ylm basis if opt_nondiag=1
220 : ! =================================================================
221 : ! opt_diag=1 ! 1: diago the levels (The best choice).
222 : ! opt_diag=2 ! 2: diago density matrix (can be used for historical reasons)
223 :
224 : ! Need in the general case of two input variable for opt_diag and
225 : ! opt_nondiag!
226 : ! opt_nondiag should be 0 by default
227 34 : opt_diag = 1
228 34 : opt_nondiag = 0
229 34 : if (paw_dmft%dmft_solv >= 6) opt_nondiag = 1 ! Use ctqmc in abinit with offdiag terms in F
230 : !else
231 : ! opt_nondiag = 0 ! use fast ctqmc in ABINIT without off diagonal terms in F
232 : !end if
233 :
234 34 : useylm = 0
235 34 : if (nspinor == 2) useylm = 1 ! to avoid complex G(tau)
236 34 : if (basis .eq. 4) then
237 0 : useylm = 1 ! first step before rotation to jmj
238 0 : usejmj = 1 ! jmj local basis
239 0 : opt_diag = 0 ! no diagonalization of local Hamiltonian
240 0 : opt_nondiag = 1 ! off_diag element taken into account
241 : else
242 34 : usejmj = 0
243 : endif
244 :
245 34 : opt_complex = 0
246 34 : if (paw_dmft%dmft_solv .eq. 10) then
247 0 : opt_complex = 1 !Complex G(tau)
248 0 : opt_hybri = paw_dmft%dmft_hybri_limit
249 : endif
250 :
251 : !write(6,*) "nspinor,useylm",nspinor,useylm
252 34 : if (useylm == 0) then
253 34 : write(std_out,*) " Slm (real spherical harmonics) basis is used (before a possible rotation)"
254 34 : rot_type_vee = 1 ! for rotatevee_hu
255 : ! else if (useylm == 1) then
256 : ! !write(std_out,*) " Ylm (complex spherical harmonics) basis is used (before rotation)"
257 : ! write(message,'(3a)') ch10," == Only Density-Density Terms Included"
258 : ! call wrtout(std_out,message,'COLL')
259 0 : else if (useylm == 1 .and. usejmj == 0) then
260 0 : write(message,'(3a)') ch10," == Only Density-Density Terms Included"
261 0 : call wrtout(std_out,message,'COLL')
262 : !write(std_out,*) " Ylm (complex spherical harmonics) basis is used (before rotation)"
263 0 : rot_type_vee = 4 ! for rotatevee_hu
264 0 : else if (useylm == 1 .and. usejmj == 1) then
265 0 : write(message,'(3a)') ch10,' == Jmj local basis is used without diagonalization of local Hamiltonian ',ch10
266 0 : call wrtout(std_out,message,'COLL')
267 0 : rot_type_vee = 3 !
268 : end if ! useylm
269 :
270 : ! if(useylm==1.and.opt_diag/=1) ABI_ERROR("useylm==1 and opt_diag/=0 is not possible")
271 34 : if (hu(1)%jpawu_zero .and. nsppol == 2) nsppol_imp = 2 ! J=0 and nsppol=2
272 34 : if (.not. hu(1)%jpawu_zero .or. nsppol /= 2) nsppol_imp = 1 ! J/=0 ou nsppol=1
273 : ! =================================================================
274 : ! Compute DFT Green's function to compare to weiss_for_rot (check)
275 : ! =================================================================
276 : ! call init_green(greendft,paw_dmft,opt_oper_ksloc=3)
277 : ! call greendftcompute_green(cryst_struc,greendft,pawang,paw_dmft)
278 : !! call copy_green(greendft,weiss_for_rot,2)
279 :
280 : ! =================================================================
281 : ! Compute atomic levels
282 : ! =================================================================
283 34 : call init_oper(paw_dmft,energy_level,opt_ksloc=2)
284 :
285 : ! ----------------------------------
286 : ! Compute atomic levels in Slm basis
287 : ! ----------------------------------
288 34 : call compute_levels(energy_level,self%hdc,paw_dmft,nondiag=nondiaglevels)
289 :
290 : ! ------------------------------------------------
291 : ! If levels are not diagonal, then diagonalize it (according to
292 : ! dmftctqmc_basis)
293 : ! dmftctqmc_basis = 0 : Slm
294 : ! dmftctqmc_basis = 1 : diagonalize hamiltonian
295 : ! dmftctqmc_basis = 2 : Ylm
296 : ! dmftctqmc_basis = 3 : digonalize occupation matrix
297 : ! dmftctqmc_basis = 4 : JmJ
298 : ! ------------------------------------------------
299 34 : if (paw_dmft%dmftctqmc_basis == 1) then
300 20 : if (nondiaglevels .or. useylm == 1) then
301 0 : opt_diag = 1
302 0 : write(message,'(3a)') ch10," == Hamiltonian in local basis is not diagonal: diagonalize it",ch10
303 : else
304 20 : opt_diag = 0
305 20 : write(message,'(5a)') ch10," == Hamiltonian in local basis is diagonal in the Slm basis ",ch10, &
306 40 : & " CTQMC will use this basis",ch10
307 : end if ! nondiaglevels or useylm
308 14 : else if (paw_dmft%dmftctqmc_basis == 2) then
309 14 : if (nondiaglevels .or. useylm == 1) then
310 14 : write(message,'(7a)') ch10," == Hamiltonian in local basis is not diagonal",ch10, &
311 14 : & " == According to dmftctqmc_basis: diagonalize density matrix",ch10, &
312 28 : & " == Warning : Check that the Hamiltonian is diagonal !",ch10
313 14 : opt_diag = 2
314 : else
315 0 : write(message,'(5a)') ch10," == Hamiltonian in local basis is diagonal in the Slm basis ",ch10, &
316 0 : & " CTQMC will use this basis",ch10
317 0 : opt_diag = 0
318 : end if ! nondiaglevels or useylm
319 0 : else if (paw_dmft%dmftctqmc_basis == 0) then
320 0 : if (nondiaglevels) then
321 0 : write(message,'(4a)') ch10," == Hamiltonian in local basis is not diagonal",ch10, &
322 0 : & " == According to dmftctqmc_basis: keep this non diagonal basis for the calculation"
323 : else
324 0 : write(message,'(5a)') ch10," == Hamiltonian in local basis is diagonal in the Slm basis ",ch10, &
325 0 : & " CTQMC will use this basis",ch10
326 : end if ! nondiaglevels
327 0 : opt_diag = 0
328 : end if ! dmftctqmc_basis
329 34 : call wrtout(std_out,message,'COLL')
330 34 : if (opt_diag == 1) then
331 0 : write(message,'(5a)') " == Switching to CTQMC basis: using basis that diagonalizes the electronic levels"
332 0 : call wrtout(std_out,message,'COLL')
333 34 : else if (opt_diag == 2) then
334 14 : write(message,'(5a)') " == The correlated occupation matrix is diagonalized"
335 14 : call wrtout(std_out,message,'COLL')
336 : end if ! opt_diag
337 :
338 : ! =================================================================
339 : ! Now, check if diagonalisation is necessary
340 : ! =================================================================
341 :
342 :
343 : ! =================================================================
344 : ! First rotate to Ylm basis the atomic levels
345 : ! =================================================================
346 :
347 34 : if (useylm == 1) then
348 :
349 0 : write(message,'(2a)') ch10, " == Switching to Ylm basis first"
350 0 : call wrtout(std_out,message,'COLL')
351 :
352 : ! Rotate from Slm to Ylm the atomic levels
353 : ! ----------------------------------------
354 0 : call slm2ylm_matlu(energy_level%matlu(:),natom,paw_dmft,1,0)
355 :
356 : ! Print atomic energy levels in Ylm basis
357 : ! --------------------------------
358 0 : if (pawprtvol >= 3) then
359 0 : write(message,'(2a)') ch10," == Print Energy levels in Ylm basis"
360 0 : call wrtout(std_out,message,'COLL')
361 0 : call print_matlu(energy_level%matlu(:),natom,1)
362 : end if ! pawprtvol>=3
363 :
364 : !==================================================================
365 : ! Add Zeeman contributions to local energy levels when nspinor = 2
366 : !==================================================================
367 0 : if(paw_dmft%dmft_magnfield .eq. 2 .and. nspinor .eq. 2) then
368 :
369 0 : ABI_MALLOC(magnfield,(natom))
370 0 : ABI_MALLOC(levels_temp,(natom))
371 :
372 0 : write(message,'(a,2x,a)') ch10, " == Add Zeeman contributions to local energy levels in Ylm"
373 0 : call wrtout(std_out,message,'COLL')
374 :
375 0 : call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu,magnfield)
376 0 : call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu,levels_temp)
377 0 : call copy_matlu(energy_level%matlu,levels_temp,natom)
378 :
379 : !Spin-Orbit case, not much tested so far (need to remove AFM sym)
380 0 : call magnfield_matlu(magnfield,natom,paw_dmft%dmft_magnfield_b,2)
381 : !call print_matlu(magnfield,natom,1)
382 0 : call add_matlu(levels_temp,magnfield,energy_level%matlu,natom,-1)
383 0 : call print_matlu(energy_level%matlu,natom,1)
384 0 : call destroy_matlu(magnfield,natom)
385 0 : call destroy_matlu(levels_temp,natom)
386 :
387 0 : ABI_FREE(magnfield)
388 0 : ABI_FREE(levels_temp)
389 : endif !dmft_magnfield
390 : end if ! useylm
391 :
392 34 : if (usejmj .eq. 1) then
393 : !rotate form Ylm to jmj the atomic levels
394 0 : call ylm2jmj_matlu(energy_level%matlu(:),natom,1,paw_dmft)
395 :
396 : ! Print atomic energy levels in Ylm basis
397 : ! --------------------------------
398 0 : if (pawprtvol >= 3) then
399 0 : write(message,'(2a)') ch10," == Print Energy levels in jmj basis"
400 0 : call wrtout(std_out,message,'COLL')
401 0 : call print_matlu(energy_level%matlu(:),natom,1)
402 : end if ! pawprtvol>=3
403 : endif
404 :
405 130 : ABI_MALLOC(vee_rotated,(natom))
406 34 : call init_vee(paw_dmft,vee_rotated(:))
407 :
408 : ! ===========================================================================================
409 : ! Start for diagonalization of levels/density matrix according to opt_diag
410 : ! ===========================================================================================
411 :
412 : !opt_rot=2 ! do it one time before CTQMC
413 34 : opt_rot = 1 ! do all the rotations successively on all different quantities.
414 34 : if (opt_diag == 1 .or. opt_diag == 0) then
415 :
416 20 : if (opt_diag == 1) then
417 : ! =================================================================
418 : ! Diagonalize atomic levels
419 : ! =================================================================
420 0 : call init_oper(paw_dmft,level_diag,opt_ksloc=2)
421 :
422 : ! Diagonalize atomic levels (opt_real is necessary, because
423 : ! rotation must be real in order for the occupations and Green's
424 : ! function to be real)
425 : ! ---------------------------------------------------------------
426 0 : write(message,'(2a)') ch10, " == Diagonalization of local Hamiltonian"
427 0 : call wrtout(std_out,message,'COLL')
428 :
429 : call diag_matlu(energy_level%matlu(:),level_diag%matlu(:),natom,pawprtvol,eigvectmatlu(:),&
430 0 : & nsppol_imp=nsppol_imp,opt_real=1,test=paw_dmft%dmft_solv) ! temporary: test should be extended to all cases.
431 :
432 : ! call rotate_matlu(energy_level%matlu,eigvectmatlu,natom,3,1)
433 : ! write(message,'(a,2x,a,f13.5)') ch10,&
434 : !& " == Print first Diagonalized Energy levels for Fermi Level=",paw_dmft%fermie
435 : ! call wrtout(std_out,message,'COLL')
436 : ! call print_matlu(energy_level%matlu,natom,1,compl=1,opt_exp=1)
437 :
438 : if (opt_rot == 1) then
439 0 : call copy_matlu(level_diag%matlu(:),energy_level%matlu(:),natom)
440 : end if
441 :
442 0 : call destroy_oper(level_diag)
443 :
444 : ! Print diagonalized levels
445 : ! --------------------------
446 0 : write(tag,'(f13.5)') paw_dmft%fermie
447 0 : if (pawprtvol >= 3) then
448 0 : write(message,'(a,2x,2a)') ch10,&
449 0 : & " == Print Energy levels in CTQMC basis"
450 0 : call wrtout(std_out,message,'COLL')
451 0 : call print_matlu(energy_level%matlu(:),natom,1,compl=0)
452 : else
453 0 : write(message,'(a,2x,2a)') ch10,&
454 0 : & " == Energy levels Diagonalized for Fermi Level=",adjustl(tag)
455 0 : call wrtout(std_out,message,'COLL')
456 : end if ! pawprtvol>=3
457 :
458 : else if (opt_diag == 0) then
459 68 : do iatom = 1, natom
460 48 : lpawu = paw_dmft%lpawu(iatom)
461 48 : if (lpawu == -1) cycle
462 20 : itypat = paw_dmft%typat(iatom)
463 : ! write(6,*) size(udens_atoms(iatom)%value)
464 : ! write(6,*) size(hu(itypat)%udens)
465 : ! write(6,*) udens_atoms(iatom)%value
466 : ! write(6,*) hu(itypat)%udens
467 : !udens_atoms(iatom)%mat(:,:,1)=hu(itypat)%udens(:,:)
468 155328 : vee_rotated(iatom)%mat(:,:,:,:) = hu(itypat)%veeslm2(:,:,:,:)
469 :
470 40 : if (usejmj == 1) then
471 0 : do iflavor1=1,tndim
472 0 : do iflavor2=1,tndim
473 0 : if(iflavor1==iflavor2) then
474 0 : eigvectmatlu(iatom)%mat(iflavor1,iflavor2,1)=cone
475 : else
476 0 : eigvectmatlu(iatom)%mat(iflavor1,iflavor2,1)=czero
477 : end if
478 : end do
479 : end do
480 :
481 0 : call rotatevee_hu(hu(:),paw_dmft,pawprtvol,eigvectmatlu(:),rot_type_vee,udens_atoms(:),vee_rotated(:))
482 :
483 : else
484 1744 : udens_atoms(iatom)%mat(:,:,1)=hu(itypat)%udens(:,:)
485 : endif
486 : end do ! iatom
487 : end if ! opt_diag=0 or 1
488 : ! call rotatevee_hu(cryst_struc,hu,nspinor,nsppol,pawprtvol,eigvectmatlu,udens_atoms)
489 :
490 14 : else if (opt_diag == 2) then
491 : ! =================================================================
492 : ! Diagonalizes density matrix and keep eigenvectors in eigvectmatlu
493 : ! =================================================================
494 :
495 : ! Print density matrix before diagonalization
496 : ! -------------------------------------------
497 14 : if (pawprtvol >= 3) then
498 14 : write(message,'(a,2x,a)') ch10," == Density Matrix before diagonalization ="
499 14 : call wrtout(std_out,message,'COLL')
500 : !MGNAG: This call is wrong if green has intent(out), now we use intent(inout)
501 14 : call print_matlu(green%occup%matlu(:),natom,1)
502 : end if ! pawprtvol>=3
503 :
504 : !! checkstop: we can have two different diagonalisation basis for the up and dn
505 : !! but one use the same basis, unless the error is really to large(>0.1)
506 :
507 : ! Diagonalize density matrix
508 : ! ---------------------------
509 : call diag_matlu(green%occup%matlu(:),dmat_diag(:),natom,4,eigvectmatlu(:), &
510 14 : & nsppol_imp=nsppol_imp,checkstop=.false.)
511 :
512 : ! Print diagonalized density matrix
513 : ! ----------------------------------
514 14 : if (pawprtvol >= 3) then
515 14 : write(message,'(a,2x,a)') ch10,&
516 28 : & " == Diagonalized Density Matrix in the basis used for QMC ="
517 14 : call wrtout(std_out,message,'COLL')
518 14 : call print_matlu(dmat_diag(:),natom,1)
519 :
520 : !write(message,'(2a,i3,13x,a)') ch10,' == Rotation of interaction matrix =='
521 : !call wrtout(std_out,message,'COLL')
522 : end if ! pawprtvol>=3
523 :
524 : !if (.not.hu(1)%jpawu_zero) &
525 : !ABI_WARNING("In qmc_prep_ctqmc J/=0 and rotation matrix not rotated")
526 : ! Rotate interaction.
527 : ! call rotatevee_hu(cryst_struc,hu,nspinor,nsppol,pawprtvol,eigvectmatlu,udens_atoms)
528 : ! call rotatevee_hu(cryst_struc,hu,nspinor,nsppol,pawprtvol,eigvectmatlu,udens_atoms,rot_type_vee)
529 : end if
530 : ! ===========================================================================================
531 : ! END Of diagonalization
532 : ! ===========================================================================================
533 :
534 34 : if (paw_dmft%ientropy == 1) then
535 0 : ABI_MALLOC(hu_for_s,(ntypat))
536 : ! Usefull to compute interaction energy for U=1 J=J/U when U=0.
537 0 : call copy_hu(ntypat,hu(:),hu_for_s(:))
538 0 : f4of2_sla = - one
539 0 : f6of2_sla = - one
540 0 : do itypat=1,ntypat
541 0 : ndim = 2*hu(itypat)%lpawu + 1
542 0 : ABI_MALLOC(vee,(ndim,ndim,ndim,ndim))
543 : call calc_vee(f4of2_sla,f6of2_sla,paw_dmft%j_for_s/paw_dmft%u_for_s, &
544 0 : & hu_for_s(itypat)%lpawu,pawang,one,vee(:,:,:,:))
545 0 : hu_for_s(itypat)%vee(:,:,:,:) = cmplx(vee(:,:,:,:),zero,kind=dp)
546 0 : ABI_FREE(vee)
547 : end do
548 0 : ABI_MALLOC(vee_for_s,(natom))
549 0 : call init_vee(paw_dmft,vee_for_s(:))
550 : call rotatevee_hu(hu_for_s(:),paw_dmft,pawprtvol,eigvectmatlu(:), &
551 0 : & rot_type_vee,udens_atoms_for_s(:),vee_for_s(:))
552 0 : call destroy_hu(hu_for_s(:),ntypat)
553 : ! udens_atoms_for_s will be used later.
554 0 : ABI_FREE(hu_for_s)
555 0 : call destroy_vee(paw_dmft,vee_for_s(:))
556 0 : ABI_FREE(vee_for_s)
557 : end if ! ientropy=1
558 :
559 34 : call flush_unit(std_out)
560 :
561 : ! ===========================================================================================
562 : ! Broadcast matrix of rotation from processor 0 to the other
563 : ! In case of degenerate levels, severals rotations are possible. Here we
564 : ! choose the rotation of proc 0. It is arbitrary.
565 : ! ===========================================================================================
566 34 : call xmpi_matlu(eigvectmatlu(:),natom,paw_dmft%spacecomm,master=0,option=2)
567 :
568 34 : if (opt_diag /= 0 ) then
569 : call rotatevee_hu(hu(:),paw_dmft,pawprtvol,eigvectmatlu(:), &
570 14 : & rot_type_vee,udens_atoms(:),vee_rotated(:))
571 : end if
572 :
573 : !unitnb=300000+paw_dmft%myproc
574 : !call int2char4(paw_dmft%myproc,tag_proc)
575 : !tmpfil = 'eigvectmatluaftermpi'//tag_proc
576 : !open (unit=unitnb,file=trim(tmpfil),status='unknown',form='formatted')
577 : !do iflavor1=1,14
578 : ! do iflavor2=1,14
579 : ! write(unitnb,*) iflavor1,iflavor2,eigvectmatlu(1,1)%value(iflavor1,iflavor2)
580 : ! enddo
581 : !enddo
582 :
583 : ! ===========================================================================================
584 : ! Now rotate various quantities in the new basis
585 : ! ===========================================================================================
586 :
587 : !=======================================================
588 : ! Allocate, Compute, and Rotate atomic levels for CTQMC
589 : !=======================================================
590 :
591 : ! If levels not rotated, rotate them
592 : ! -----------------------------------
593 34 : if (opt_diag == 2 .and. opt_rot == 1) then
594 14 : call rotate_matlu(energy_level%matlu(:),eigvectmatlu(:),natom,1)
595 : end if
596 :
597 : ! Print atomic levels
598 : ! -------------------
599 34 : if (pawprtvol >= 3 .and. opt_diag == 2 .and. opt_rot == 1) then
600 14 : write(message,'(a,2x,a)') ch10," == Print Energy levels in CTQMC basis"
601 14 : call wrtout(std_out,message,'COLL')
602 14 : call print_matlu(energy_level%matlu(:),natom,1)
603 20 : else if (opt_diag == 2 .and. opt_rot == 1) then
604 0 : write(message,'(a,2x,a)') ch10," == CT-QMC Energy levels rotated"
605 0 : call wrtout(std_out,message,'COLL')
606 : end if ! pawprtvol>=3
607 :
608 : !====================================================================
609 : ! If levels were diagonalized before, then rotate density matrix for
610 : ! information.
611 : !====================================================================
612 34 : if (opt_diag == 1) then
613 :
614 0 : ABI_MALLOC(matlu1,(natom))
615 0 : call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu(:),matlu1(:))
616 0 : call copy_matlu(green%occup%matlu(:),matlu1(:),natom)
617 0 : if (pawprtvol >= 3) then
618 0 : write(message,'(a,2x,a)') ch10," == Print occupations in cubic basis"
619 0 : call wrtout(std_out,message,'COLL')
620 0 : call print_matlu(green%occup%matlu(:),natom,1)
621 : end if ! pawprtvol>=3
622 :
623 : ! 1) rotate density matrix to Ylm basis
624 : ! --------------------------------------
625 0 : if (useylm == 1) then
626 0 : call slm2ylm_matlu(matlu1(:),natom,paw_dmft,1,0)
627 : ! if (pawprtvol >= 3 ) then
628 : ! write(message,'(2a)') ch10," == Print occupations in Ylm basis"
629 : ! call wrtout(std_out,message,'COLL')
630 : ! call print_matlu(matlu1(:),natom,1)
631 : ! end if
632 : end if ! useylm
633 :
634 : ! 2) rotate density matrix to rotated basis
635 : ! -------------------------------------------
636 : if (opt_rot == 1 .or. opt_rot == 2) then
637 0 : call rotate_matlu(matlu1(:),eigvectmatlu(:),natom,1)
638 : end if
639 0 : write(message,'(a,2x,a)') ch10," == Print occupations in CTQMC basis"
640 0 : call wrtout(std_out,message,'COLL')
641 0 : call print_matlu(matlu1(:),natom,1,compl=1)
642 0 : if (paw_dmft%dmft_solv .eq. 10) then
643 0 : write(message,'(a,2x,a)') ch10," The potential complex off diagonal occupation matrix elements are &
644 0 : &taken into account in the CT-QMC with dmft_solv = 10."
645 0 : call wrtout(std_out,message,'COLL')
646 : else
647 0 : call checkreal_matlu(matlu1(:),natom,tol10)
648 : endif
649 0 : call destroy_matlu(matlu1(:),natom)
650 0 : ABI_FREE(matlu1)
651 :
652 : end if ! opt_diag=1
653 :
654 34 : call flush_unit(std_out)
655 :
656 : ! =================================================================
657 : ! Rotate weiss function according to eigenvectors.
658 : ! =================================================================
659 : !!!stop
660 : ! Rotate Weiss function first in Ylm basis
661 : ! -----------------------------------------------------------------
662 34 : if (pawprtvol >= 3) then
663 28 : write(message,'(a,2x,a)') ch10, " == Print Weiss-field for first frequency in Cubic basis"
664 28 : call wrtout(std_out,message,'COLL')
665 28 : call print_matlu(weiss_for_rot%oper(1)%matlu(:),natom,1,compl=1) !
666 : endif
667 :
668 34 : if(useylm==1) then
669 : !write(message,'(a,2x,a)') ch10, " == Rotation of weiss and greendft in the Ylm Basis="
670 : !call wrtout(std_out,message,'COLL')
671 0 : do ifreq=1,nwlo
672 0 : call slm2ylm_matlu(weiss_for_rot%oper(ifreq)%matlu(:),natom,paw_dmft,1,0)
673 0 : call slm2ylm_matlu(weiss%oper(ifreq)%matlu(:),natom,paw_dmft,1,0)
674 : ! call slm2ylm_matlu(greendft%oper(ifreq)%matlu,natom,1,0)
675 : end do
676 : end if
677 :
678 34 : if(usejmj==1) then
679 0 : write(message,'(a,2x,a)') ch10, " == Rotation of weiss and greendft in the jmj Basis="
680 0 : call wrtout(std_out,message,'COLL')
681 0 : do ifreq=1,nwlo
682 0 : call ylm2jmj_matlu(weiss_for_rot%oper(ifreq)%matlu(:),natom,1,paw_dmft)
683 0 : call ylm2jmj_matlu(weiss%oper(ifreq)%matlu(:),natom,1,paw_dmft)
684 : end do
685 : end if
686 :
687 :
688 : if (pawprtvol >= 3) then
689 : ! write(message,'(a,2x,a,f13.5)') ch10,& ! debug
690 : ! " == Print weiss for small freq 1 before rot" ! debug
691 : ! call wrtout(std_out,message,'COLL') ! debug
692 : ! call print_matlu(weiss_for_rot%oper(1)%matlu,natom,1) ! debug
693 :
694 : ! Print Weiss function
695 : ! --------------------
696 : ! write(message,'(a,2x,a)') ch10," == Print weiss for 1st freq before rot" ! debug
697 : ! call wrtout(std_out,message,'COLL') ! debug
698 : ! call print_matlu(weiss_for_rot%oper(1)%matlu(:),natom,1,compl=1) ! debug
699 : ! write(message,'(a,2x,a)') ch10," == Print weiss for last freq before rot" ! debug
700 : ! call wrtout(std_out,message,'COLL') ! debug
701 : ! call print_matlu(weiss_for_rot%oper(nwlo)%matlu(:),natom,1,compl=1) ! debug
702 : ! write(message,'(a,2x,a,f13.5)') ch10,& ! debug
703 : !& " == Print DFT G for 1st freq before rot" ! debug
704 : ! call wrtout(std_out,message,'COLL') ! debug
705 : ! call print_matlu(greendft%oper(1)%matlu,natom,1,compl=1,opt_exp=2) ! debug
706 : ! write(message,'(a,2x,a,f13.5)') ch10,& ! debug
707 : !& " == Print DFT G for last freq before rot" ! debug
708 : ! call wrtout(std_out,message,'COLL') ! debug
709 : ! call print_matlu(greendft%oper(paw_dmft%dmft_nwlo)%matlu,natom,1,compl=1,opt_exp=2) ! debug
710 : end if ! pawprtvol>=3
711 :
712 34 : if (opt_diag /= 0) then
713 : ! Rotate Weiss function from the Slm (or Ylm) to the basis of diagonalisation
714 : ! -------------------------------------------------------------------
715 : !write(message,'(a,2x,a)') ch10, " == Rotation of weiss ="
716 : !call wrtout(std_out,message,'COLL')
717 :
718 1274 : do ifreq=1,nwlo
719 14 : if (opt_rot == 1) then
720 1260 : call rotate_matlu(weiss_for_rot%oper(ifreq)%matlu(:),eigvectmatlu(:),natom,1)
721 1260 : call rotate_matlu(weiss%oper(ifreq)%matlu(:),eigvectmatlu(:),natom,1)
722 : end if ! opt_rot=1
723 : ! call checkdiag_matlu(weiss_for_rot%oper(ifreq)%matlu,natom,tol6)
724 : end do ! ifreq
725 :
726 28 : do iatom=1,natom
727 :
728 14 : if (iatom < 10) then
729 14 : write(tag_atom,'("0",I1)') iatom
730 : else
731 0 : write(tag_atom,'(I2)') iatom
732 : endif
733 :
734 : !print Weiss field for correlated atoms
735 14 : lpawu = paw_dmft%lpawu(iatom)
736 14 : if (lpawu == -1) cycle
737 :
738 28 : if (myproc == mod(nproc+1,nproc)) then
739 8 : if (open_file(trim(paw_dmft%filapp)//"_atom_"//tag_atom//"_G0w.dat",message,newunit=unt) /= 0) ABI_ERROR(message)
740 8 : ndim = 2*paw_dmft%lpawu(iatom) + 1
741 728 : do ifreq=1,nwlo
742 720 : write(unt,'(29f21.14)') paw_dmft%omega_lo(ifreq),&
743 2880 : & (((weiss_for_rot%oper(ifreq)%matlu(iatom)%mat(im1+(ispinor-1)*ndim,im1+(ispinor-1)*ndim,isppol),&
744 5048 : & im1=1,3),ispinor=1,nspinor),isppol=1,nsppol)
745 : end do ! ifreq
746 8 : close(unit=unt)
747 : end if ! myproc=master
748 : enddo
749 :
750 14 : call flush_unit(std_out)
751 14 : if (pawprtvol >= 3) then
752 14 : write(message,'(a,2x,a)') ch10," == Print Weiss-field for first frequency in CTQMC basis" ! debug
753 14 : call wrtout(std_out,message,'COLL') ! debug
754 14 : call print_matlu(weiss_for_rot%oper(1)%matlu(:),natom,1,compl=1) ! debug
755 : ! write(message,'(a,2x,a)') ch10," == Print weiss for last freq after rot" ! debug
756 : ! call wrtout(std_out,message,'COLL') ! debug
757 : ! call print_matlu(weiss_for_rot%oper(nwlo)%matlu(:),natom,1,compl=1) ! debug
758 : end if ! pawprtvol>=3
759 :
760 : ! ! Rotate DFT Green's function first in Ylm basis then in the rotated basis and compare to weiss_for_rot
761 : ! ! -----------------------------------------------------------------------------------------------------
762 : ! write(message,'(a,2x,a)') ch10, " == Rotation of greendft ="
763 : ! call wrtout(std_out,message,'COLL')
764 : ! do ifreq=1,paw_dmft%dmft_nwlo
765 : ! if(opt_rot==1) call rotate_matlu(greendft%oper(ifreq)%matlu,eigvectmatlu,natom,3,1)
766 : ! call diff_matlu("Weiss_for_rot","greendft",weiss_for_rot%oper(ifreq)%matlu,greendft%oper(ifreq)%matlu,natom,1,tol14)
767 : !! call checkdiag_matlu(weiss_for_rot%oper(ifreq)%matlu,natom,tol6)
768 : ! end do
769 : ! if(pawprtvol>=3) then
770 : ! write(message,'(a,2x,a,f13.5)') ch10,& ! debug
771 : !& " == Print greendft for small freq 1 after rot" ! debug
772 : ! call wrtout(std_out,message,'COLL') ! debug
773 : ! call print_matlu(greendft%oper(1)%matlu,natom,1,compl=1,opt_exp=2) ! debug
774 : ! write(message,'(a,2x,a,f13.5)') ch10,& ! debug
775 : !& " == Print greendft for last freq after rot" ! debug
776 : ! call wrtout(std_out,message,'COLL') ! debug
777 : ! call print_matlu(greendft%oper(paw_dmft%dmft_nwlo)%matlu,natom,1,compl=1,opt_exp=2) ! debug
778 : ! end if
779 : ! call flush_unit(std_out)
780 : end if
781 :
782 : ! =================================================================
783 : ! Compute analytic limit of hybridization and rotate it
784 : ! =================================================================
785 164 : ABI_MALLOC(hybri_coeff,(natom))
786 34 : call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu(:),hybri_coeff(:))
787 : !write(6,*)"hybri1",hybri_coeff(1)%mat(1,1,1,1,1),paw_dmft%natom,cryst_struc%natom
788 :
789 : ! Compute analytical C_ij such that F_ij -> C_ij/iw_n
790 : ! ---------------------------------------
791 34 : call hybridization_asymptotic_coefficient(cryst_struc,paw_dmft,hybri_coeff(:))
792 :
793 : ! Print analytical C_ij (not rotated)
794 : ! ---------------------------------------
795 34 : if (paw_dmft%dmft_solv /= 10) then
796 34 : write(message,'(a,2x,a)') ch10," == Coeff analytical C_ij such that F -> C_ij/iw_n for large frequency"
797 34 : call wrtout(std_out,message,'COLL')
798 34 : call print_matlu(hybri_coeff(:),natom,1)
799 : endif
800 :
801 : ! Rotate analytical C_ij in Ylm basis
802 : ! ---------------------------------------
803 34 : if (useylm == 1) then
804 0 : call slm2ylm_matlu(hybri_coeff(:),natom,paw_dmft,1,0)
805 : end if
806 : !rotate in jmj basis
807 34 : if (usejmj == 1) then
808 0 : call ylm2jmj_matlu(hybri_coeff(:),natom,1,paw_dmft)
809 : end if
810 :
811 34 : if (opt_diag /= 0) then
812 : ! Rotate analytical C_ij in rotated basis
813 : ! ---------------------------------------
814 : if (opt_rot == 1 .or. opt_rot == 2) then
815 14 : call rotate_matlu(hybri_coeff(:),eigvectmatlu(:),natom,1)
816 : end if
817 :
818 : ! Print analytical C_ij (rotated)
819 : ! ---------------------------------------
820 14 : if (paw_dmft%dmft_solv /= 10) then
821 14 : write(message,'(a,2x,a)') ch10," == Coeff analytical C_ij such that F -> C_ij/iw_n after rotation"
822 14 : call wrtout(std_out,message,'COLL')
823 14 : call print_matlu(hybri_coeff(:),natom,1,compl=1,opt_exp=0)
824 : endif
825 : end if
826 :
827 : ! =================================================================
828 : ! Check if rotation is properly done.
829 : ! =================================================================
830 : if(3 == 4) then
831 : write(message,'(a,2x,a)') ch10, " == Print dmat before rot"
832 : call wrtout(std_out,message,'COLL')
833 : call print_matlu(green%occup%matlu(:),natom,1)
834 : if (useylm == 1) then
835 : call slm2ylm_matlu(green%occup%matlu(:),natom,paw_dmft,1,0)
836 : end if
837 : if (opt_rot == 1) then
838 : call rotate_matlu(green%occup%matlu(:),eigvectmatlu(:),natom,1)
839 : end if
840 : write(message,'(a,2x,a)') ch10," == Print dmat after rot"
841 : call wrtout(std_out,message,'COLL')
842 : call print_matlu(green%occup%matlu(:),natom,1)
843 :
844 : write(message,'(2a)') ch10,' QMC STOP: DEBUG'
845 : call wrtout(std_out,message,'COLL')
846 : ABI_ERROR(message)
847 : end if
848 : ! =================================================================
849 : ! Check
850 : ! =================================================================
851 :
852 : ! write(message,'(a,2x,a,f13.5)') ch10,&
853 : !& " == Print weiss for small tau"
854 : ! call wrtout(std_out,message,'COLL')
855 : ! call print_matlu(weiss%oper(1)%matlu,natom,1)
856 : ! write(message,'(a,2x,a,f13.5)') ch10,&
857 : !& " == Print weiss for large tau"
858 : ! call wrtout(std_out,message,'COLL')
859 : ! call print_matlu(weiss%oper(paw_dmft%dmft_nwlo)%matlu,natom,1)
860 : ! call flush_unit(std_out)
861 : ! write(message,'(2a)') ch10,' Check weiss_for_rot(last freq)'
862 : ! call wrtout(std_out,message,'COLL')
863 : ! call checkdiag_matlu(weiss_for_rot%oper(paw_dmft%dmft_nwlo)%matlu,natom,tol6,opt=nspinor)
864 : ! call flush_unit(std_out)
865 : ! write(message,'(2a)') ch10,' Check weiss_for_rot(ifreq=1)'
866 : ! call wrtout(std_out,message,'COLL')
867 : ! call checkdiag_matlu(weiss_for_rot%oper(1)%matlu,natom,tol6,opt=nspinor)
868 : ! call flush_unit(std_out)
869 :
870 : !master = 0
871 :
872 : ! =================================================================
873 : ! Print out
874 : ! =================================================================
875 :
876 : ! Print Weiss
877 : ! -------------
878 34 : if (paw_dmft%dmft_prgn == 1) then
879 0 : call print_green('Weiss_diag',weiss_for_rot,1,paw_dmft,opt_wt=1,opt_decim=1)
880 : end if
881 :
882 34 : if (paw_dmft%dmft_solv /= 10) then
883 34 : write(message,'(a,2x,a)') ch10," == Preparing data for CTQMC"
884 34 : call wrtout(std_out,message,'COLL')
885 :
886 : ! Print Rotate Weiss for 1st and last frequencies (a second time ? why ?)
887 : ! ------------------------------------------------
888 34 : if (pawprtvol >= 3) then
889 28 : write(message,'(a,2x,a)') ch10," == Print rotated weiss function for small freq in the rotated basis" ! debug
890 28 : call wrtout(std_out,message,'COLL') ! debug
891 28 : call print_matlu(weiss_for_rot%oper(1)%matlu(:),natom,1,compl=1) ! debug
892 28 : write(message,'(a,2x,a)') ch10," == Print rotated weiss function for largest freq in the rotated basis" ! debug
893 28 : call wrtout(std_out,message,'COLL') ! debug
894 28 : call print_matlu(weiss_for_rot%oper(nwlo)%matlu(:),natom,1,compl=1) ! debug
895 : end if ! pawprtvol>=3
896 : endif
897 : ! =================================================================
898 : ! VARIABLES FOR CTQMC TESTS
899 34 : testcode = 0
900 34 : testrot = 0
901 : ! opt_fk = 0 ! for developpers to check Fourier transform and computes G0(tau)
902 34 : opt_fk = 1 ! usual case: for real calculations
903 : ! =================================================================
904 :
905 : ! _________________________________________________________________
906 : !
907 : ! SECOND PART : BUILT HYBRIDIZATION FROM G0
908 : ! _________________________________________________________________
909 : !
910 : ! =================================================================
911 : ! Compute inverse of weiss and compute hybridization
912 : ! =================================================================
913 :
914 : ! Compute inverse of weiss for each Frequency
915 : ! -----------------------------------------------------------------
916 :
917 17963 : do ifreq=1,nwlo
918 56139 : ABI_MALLOC(matlu1,(natom))
919 56139 : ABI_MALLOC(matlu2,(natom))
920 17929 : call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu(:),matlu1(:))
921 17929 : call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu(:),matlu2(:))
922 :
923 17929 : call copy_matlu(weiss_for_rot%oper(ifreq)%matlu(:),matlu1(:),natom)
924 :
925 : ! Print G_0(iw_n)
926 : ! ----------------
927 : if (optdb == 1) then
928 : call printplot_matlu(weiss_for_rot%oper(ifreq)%matlu(:),natom,paw_dmft%omega_lo(ifreq),"go",60000,imre=1)
929 : end if
930 :
931 : ! Compute G_0^-1
932 : ! -------------------------------------------
933 : ! if opt_fk=1 or testcode/=0 Do the inversion
934 : ! if opt_fk=0 Do not inverse.
935 : ! If testcode=2 and opt_fk=0 Do the inversion
936 : ! If testcode=1 and opt_fk=0 Do the inversion but no effect, because it will nevertheless be erased
937 : ! If opt_fk=1 Do the inversion
938 : ! -------------------------------------------
939 : if (optdb == 1) then
940 : call printplot_matlu(matlu1(:),natom,paw_dmft%omega_lo(ifreq),"weiss",12000,imre=1)
941 : end if
942 : if (opt_fk == 1 .or. testcode /= 0) then
943 17929 : call inverse_oper(weiss_for_rot%oper(ifreq),2)
944 : end if
945 :
946 : ! Print G_0^-1(iw_n)
947 : ! ----------------
948 : if (optdb == 1) then
949 : call printplot_matlu(weiss_for_rot%oper(ifreq)%matlu(:),natom,paw_dmft%omega_lo(ifreq),"goinv",70000,imre=1)
950 : end if
951 :
952 17929 : if (paw_dmft%dmft_solv /= 10) then
953 17929 : if (pawprtvol >= 4 .or. ifreq == nwlo) then
954 : if (opt_fk == 1 .or. testcode /= 0) then
955 : ! Check inversion : do the product
956 : ! ----------------------------------------------
957 34 : call prod_matlu(weiss_for_rot%oper(ifreq)%matlu(:),matlu1(:),matlu2(:),natom)
958 34 : write(message,'(a,2x,a,i7)') ch10," == Print product of weiss times invers for freq",ifreq
959 34 : call wrtout(std_out,message,'COLL') ! debug
960 34 : call print_matlu(matlu2(:),natom,1) ! debug
961 : end if
962 : end if
963 : endif
964 :
965 17929 : call destroy_matlu(matlu1(:),natom)
966 17929 : call destroy_matlu(matlu2(:),natom)
967 38210 : ABI_FREE(matlu1)
968 38244 : ABI_FREE(matlu2)
969 :
970 : end do ! ifreq
971 :
972 : ! Copy weiss_for_rot into weiss
973 : ! -------------------------------
974 : !call copy_matlu(weiss_for_rot%oper(ifreq)%matlu,weiss%oper(ifreq)%matlu,natom)
975 :
976 :
977 : ! Print G_0^-1 for 1st and last frequencies.
978 : ! -----------------------------------------
979 34 : if (paw_dmft%dmft_solv /= 10) then
980 34 : if (pawprtvol >= 3) then
981 28 : write(message,'(a,2x,a)') ch10," == Print G_0^-1 for small freq in the rotated basis" ! debug
982 28 : call wrtout(std_out,message,'COLL') ! debug
983 28 : call print_matlu(weiss_for_rot%oper(1)%matlu(:),natom,1) ! debug
984 28 : write(message,'(a,2x,a,e18.10,a)') ch10,& ! debug
985 56 : & " == Print G_0^-1 for last freq in the rotated basis (last freq=",paw_dmft%omega_lo(nwlo),")" ! debug
986 28 : call wrtout(std_out,message,'COLL') ! debug
987 28 : call print_matlu(weiss_for_rot%oper(paw_dmft%dmft_nwlo)%matlu(:),natom,1,compl=1) ! debug
988 : end if ! pawprtvol>=3
989 : endif
990 : ! Substract frequency from diagonal part
991 : ! ======================================
992 :
993 102 : ABI_MALLOC(shift,(natom))
994 17963 : do ifreq=1,nwlo
995 :
996 38210 : shift(:) = cmplx(zero,paw_dmft%omega_lo(ifreq),kind=dp)
997 :
998 : ! write(5555,'(400e17.4)') paw_dmft%omega_lo(ifreq),((((((weiss_for_rot%oper(ifreq)%matlu(1)%mat&
999 : ! & (im,im1,isppol,ispinor,ispinor1)-cmplx(0.d0,paw_dmft%omega_lo(ifreq),kind=dp)),im=1,2*3+1),&
1000 : !& im1=1,2*3+1),isppol=1,nsppol),ispinor=1,nspinor),ispinor1=1,nspinor)
1001 :
1002 : if (opt_fk == 1) then
1003 : ! Compute G_0^-1-iw_n
1004 : ! --------------------
1005 17929 : call shift_matlu(weiss_for_rot%oper(ifreq)%matlu(:),natom,shift(:))
1006 :
1007 : ! Compute -G_0^-1+iw_n
1008 : ! --------------------
1009 17929 : call fac_matlu(weiss_for_rot%oper(ifreq)%matlu(:),natom,-cone)
1010 : end if
1011 :
1012 : ! Print -G_0^-1+iw_n
1013 : ! --------------------
1014 34 : if (optdb == 1) then
1015 : call printplot_matlu(weiss_for_rot%oper(ifreq)%matlu(:),natom,paw_dmft%omega_lo(ifreq), &
1016 : & "G0inv_minus_omega",20000,imre=1)
1017 : end if
1018 : end do ! ifreq
1019 :
1020 : ! Print -G_0^+1-iw_n=(F-levels) for last freq in the rotated basis"
1021 : ! ------------------------------------------------------------------
1022 34 : ABI_FREE(shift)
1023 34 : if (pawprtvol >= 3) then
1024 28 : if (paw_dmft%dmft_solv .eq. 10) then
1025 0 : write(message,'(a,2x,a)') ch10,&
1026 0 : & " == Print G_0^-1-iw_n=-(F-levels) for first frequency in CTQMC basis"
1027 0 : call wrtout(std_out,message,'COLL')
1028 0 : call print_matlu(weiss_for_rot%oper(1)%matlu(:),natom,1)
1029 : end if !dmft_solv=10
1030 : else
1031 6 : write(message,'(a,2x,a)') ch10,& ! debug
1032 12 : & " == Print G_0^-1-iw_n=-(F-levels) for last freq in the rotated basis" ! debug
1033 6 : call wrtout(std_out,message,'COLL') ! debug
1034 6 : call print_matlu(weiss_for_rot%oper(nwlo)%matlu(:),natom,1,compl=1) ! debug
1035 : end if ! pawprtvol>=3
1036 :
1037 : ! Check numerical limit of F(i_wn)*iw_n (can be used also to compute F )
1038 : ! ======================================
1039 :
1040 34 : if (opt_nondiag == 1) then
1041 :
1042 0 : ABI_MALLOC(matlu1,(natom))
1043 0 : ABI_MALLOC(matlu2,(natom))
1044 0 : ABI_MALLOC(matlu3,(natom))
1045 0 : ABI_MALLOC(matlu4,(natom))
1046 0 : call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu(:),matlu1(:))
1047 0 : call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu(:),matlu2(:))
1048 0 : call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu(:),matlu3(:))
1049 0 : call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu(:),matlu4(:))
1050 :
1051 : !write(message,'(a,2x,a)') ch10," == energy_levels"
1052 : !call wrtout(std_out,message,'COLL')
1053 : !call print_matlu(energy_level%matlu(:),natom,1,opt_exp=2,compl=0)
1054 :
1055 0 : do ifreq=nwlo,1,-1 ! necessary to have matlu4 computed for the max frequency and available for all frequency.
1056 : ! do ifreq=paw_dmft%dmftqmc_l,1,-1 ! necessary to have matlu4 computed for the max frequency and available for all frequency.
1057 :
1058 : ! Compute F (substract levels) for max frequency
1059 : ! -----------------------------------------------
1060 0 : call add_matlu(weiss_for_rot%oper(ifreq)%matlu(:),energy_level%matlu(:),matlu1(:),natom,-1)
1061 :
1062 : ! Print F(iw_n)=-(G_0^-1-iw_n+levels) for last frequency.
1063 : ! --------------------------------------------------------
1064 0 : if ((ifreq == nwlo .or. ifreq == paw_dmft%dmftqmc_l) .and. paw_dmft%dmft_solv /= 10) then
1065 0 : write(message,'(a,2x,a,i4,a,f13.5,a)') ch10, &
1066 0 : & " == Print F(iw_n)=-(G_0^-1-iw_n+levels) for freq nb",ifreq," (=",paw_dmft%omega_lo(ifreq),")"
1067 0 : call wrtout(std_out,message,'COLL')
1068 0 : call print_matlu(matlu1(:),natom,1,opt_exp=1,compl=1)
1069 : end if
1070 : if (optdb == 1) then
1071 : call printplot_matlu(matlu1(:),natom,paw_dmft%omega_lo(ifreq),"Hybridization",10000,imre=1)
1072 : end if
1073 :
1074 : ! Put F in weiss_for_rot -> CTQMC
1075 : ! -------------------------------
1076 : if (opt_rot == 2) then
1077 : call rotate_matlu(weiss_for_rot%oper(ifreq)%matlu(:),eigvectmatlu(:),natom,1)
1078 : end if
1079 : ! The following line will produce directly the weiss function for the CTQMC code
1080 : if (opt_fk == 1) then
1081 0 : call copy_matlu(matlu1(:),weiss_for_rot%oper(ifreq)%matlu(:),natom)
1082 : end if
1083 :
1084 : ! Multiply F by frequency
1085 : ! ------------------------
1086 0 : call copy_matlu(matlu1(:),matlu2(:),natom)
1087 0 : call fac_matlu(matlu1(:),natom,cmplx(zero,paw_dmft%omega_lo(ifreq),kind=dp))
1088 0 : if ((ifreq == nwlo .or. ifreq == paw_dmft%dmftqmc_l) .and. paw_dmft%dmft_solv /= 10) then
1089 0 : write(message,'(a,2x,a,i4,a,f13.5,a)') ch10, &
1090 0 : & " == Print numerical C_ij = F(iw_n)*iw_n for freq nb",ifreq," (=",paw_dmft%omega_lo(ifreq),")"
1091 0 : call wrtout(std_out,message,'COLL')
1092 0 : call print_matlu(matlu1(:),natom,1,opt_exp=1,compl=1)
1093 : end if
1094 : if (optdb == 1) then
1095 : call printplot_matlu(matlu1(:),natom,paw_dmft%omega_lo(ifreq),"cij",72800,imre=1)
1096 : end if
1097 : ! call rotate_matlu(matlu1,eigvectmatlu,natom,3,1)
1098 :
1099 0 : if ((ifreq == nwlo .or. ifreq == paw_dmft%dmftqmc_l) .and. paw_dmft%dmft_solv /= 10) then
1100 0 : write(message,'(a,2x,a,i4,a,f13.5,a)') ch10, &
1101 0 : & " == Print numerical after back rotation C_ij = F(iw_n)*iw_n for freq nb",ifreq," (=",paw_dmft%omega_lo(ifreq),")"
1102 0 : call wrtout(std_out,message,'COLL')
1103 0 : call print_matlu(matlu1(:),natom,1,opt_exp=1,compl=1)
1104 : end if
1105 : if (optdb == 1) then
1106 : call printplot_matlu(matlu1(:),natom,paw_dmft%omega_lo(ifreq),"cij_rotated",72900,imre=1)
1107 : end if
1108 :
1109 : ! Built C_ij/iw_n
1110 : ! ------------------------
1111 0 : call copy_matlu(hybri_coeff(:),matlu1(:),natom)
1112 0 : call fac_matlu(matlu1(:),natom,cone/cmplx(zero,paw_dmft%omega_lo(ifreq),kind=dp))
1113 : if (optdb == 1) then
1114 : call printplot_matlu(matlu1(:),natom,paw_dmft%omega_lo(ifreq),"cij_over_omega",72000)
1115 : end if
1116 : ! if(ifreq==paw_dmft%dmft_nwlo) then
1117 : ! write(message,'(a,2x,a,f13.5)') ch10, " == Print numerical C_ij/iw_n for frequency",paw_dmft%omega_lo(ifreq)
1118 : ! call wrtout(std_out,message,'COLL')
1119 : ! call print_matlu(matlu1,natom,1,opt_exp=1,compl=1)
1120 : ! endif
1121 :
1122 : ! For test: put C_ij/i_wn into weiss_for_rot
1123 : ! --------------------------------------------
1124 : ! call copy_matlu(matlu1,weiss_for_rot%oper(ifreq)%matlu,natom,opt_non_diag=1)
1125 :
1126 : ! Compute Hybri - C_ij/iw_n
1127 : ! ------------------------
1128 0 : call add_matlu(matlu2(:),matlu1(:),matlu3(:),natom,-1)
1129 :
1130 : ! Print Hybri - C_ij/iw_n
1131 : ! ------------------------
1132 : if (optdb == 1) then
1133 : call printplot_matlu(matlu3(:),natom,paw_dmft%omega_lo(ifreq),"hybri_minus_asymp",74000,imre=1)
1134 : end if
1135 :
1136 : ! Multiply (F-C_ij/i_wn) by (iw_n)**2 to find D_ij such that (F-C_ij/i_wn) -> D_ij/(iw_n)^2 only for last frequency.
1137 : ! ------------------------------------------------------------------------------------------------------------------
1138 0 : call copy_matlu(matlu3(:),matlu2(:),natom)
1139 0 : call fac_matlu(matlu2(:),natom,cmplx(zero,paw_dmft%omega_lo(ifreq),kind=dp)**2)
1140 : if (optdb == 1) then
1141 : call printplot_matlu(matlu2(:),natom,paw_dmft%omega_lo(ifreq),"fminuscijtimesw2",75000,imre=1)
1142 : end if
1143 0 : if ((ifreq == nwlo .or. ifreq == paw_dmft%dmftqmc_l) .and. paw_dmft%dmft_solv /= 10) then
1144 0 : call copy_matlu(matlu2(:),matlu4(:),natom)
1145 0 : write(message,'(a,2x,a,i4,a,f13.5,a)') ch10, &
1146 0 : & " == Print numerical (F(iw_n)-C_ij/iw_n)%iw_n^2 for freq nb",ifreq," (=",paw_dmft%omega_lo(ifreq),")"
1147 0 : call wrtout(std_out,message,'COLL')
1148 0 : call print_matlu(matlu4(:),natom,1)
1149 : end if
1150 :
1151 : ! Built C_ij/iw_n+D_ij/(iw_n)^2
1152 : ! ------------------------
1153 0 : call copy_matlu(matlu4(:),matlu3(:),natom,opt_re=1)
1154 0 : call fac_matlu(matlu3(:),natom,cone/cmplx(zero,paw_dmft%omega_lo(ifreq),kind=dp)**2)
1155 0 : call add_matlu(matlu1(:),matlu3(:),matlu2(:),natom,1)
1156 0 : if (optdb == 1) then
1157 : call printplot_matlu(matlu2(:),natom,paw_dmft%omega_lo(ifreq),"cij_w_plus_dij_w2",72700,imre=1)
1158 : end if
1159 : ! For test: put C_ij/i_wn +D_ij/(iw_n)^2 into weiss_for_rot
1160 : ! --------------------------------------------
1161 : ! call copy_matlu(matlu2,weiss_for_rot%oper(ifreq)%matlu,natom,opt_non_diag=1)
1162 :
1163 :
1164 : end do ! ifreq
1165 :
1166 : ! Print F(iw_n) used by CTQMC for first frequency
1167 : ! -----------------------------
1168 0 : if(paw_dmft%dmft_solv .eq. 10) then
1169 0 : write(message,'(a,2x,a)') ch10," == Print F(iw_n)=-(G_0^-1-iw_n+levels) for first frequency in CTQMC basis"
1170 0 : call wrtout(std_out,message,'COLL')
1171 0 : call print_matlu(weiss_for_rot%oper(1)%matlu(:),natom,1)
1172 : endif
1173 :
1174 :
1175 0 : call destroy_matlu(matlu1(:),natom)
1176 0 : call destroy_matlu(matlu2(:),natom)
1177 0 : call destroy_matlu(matlu3(:),natom)
1178 0 : call destroy_matlu(matlu4(:),natom)
1179 0 : ABI_FREE(matlu1)
1180 0 : ABI_FREE(matlu2)
1181 0 : ABI_FREE(matlu3)
1182 0 : ABI_FREE(matlu4)
1183 : end if ! if opt_nondiag=1
1184 :
1185 : ! =======================
1186 : !
1187 : ! Rotation of Magnetic moment for CT-QMC
1188 : !
1189 : ! =======================
1190 34 : if(nspinor .eq. 2 .and. paw_dmft%dmftctqmc_localprop .gt. 1) then
1191 0 : write(message,'(a,2x,2a)') ch10, " == Making rotation for magnetic moments", ch10
1192 0 : call wrtout(std_out,message,'COLL')
1193 :
1194 0 : if(usejmj .eq. 1) then
1195 : ! == Mj values
1196 0 : call init_matlu(natom=1,nspinor=paw_dmft%nspinor,nsppol=paw_dmft%nsppol,lpawu_natom=paw_dmft%lpawu,matlu=matlumag_tot)
1197 0 : call zero_matlu(matlumag_tot,natom=1)
1198 0 : call magmomjmj_matlu(matlumag_tot,natom=1)
1199 : !call print_matlu(matlumag_tot,natom=1,prtopt=1)
1200 0 : call gather_matlu(matlumag_tot,magmom_tot,natom=1,option=1,prtopt=0)
1201 0 : call destroy_matlu(matlumag_tot,natom=1)
1202 :
1203 : else
1204 : !create a rotation matrix for diagonal Hamiltonian
1205 0 : if(opt_diag == 0) then
1206 0 : write(message,'(a,2x,2a)') ch10, " --> Hamiltonian is already diagonal in Slm", ch10
1207 0 : call wrtout(std_out,message,'COLL')
1208 0 : do iatom = 1,paw_dmft%natom
1209 0 : if(paw_dmft%lpawu(iatom) /= -1) then
1210 0 : do iflavor1=1,tndim
1211 0 : do iflavor2=1,tndim
1212 0 : if(iflavor1==iflavor2) then
1213 0 : eigvectmatlu(iatom)%mat(iflavor1,iflavor2,1)=cone
1214 : else
1215 0 : eigvectmatlu(iatom)%mat(iflavor1,iflavor2,1)=czero
1216 : end if
1217 : end do
1218 : end do
1219 : end if
1220 : end do
1221 : end if !end opt_diag=0
1222 :
1223 : ! == orbital angular momentum
1224 0 : call init_matlu(natom=natom,nspinor=paw_dmft%nspinor,nsppol=paw_dmft%nsppol,lpawu_natom=paw_dmft%lpawu,matlu=matlumag_orb)
1225 0 : call zero_matlu(matlumag_orb,natom=natom)
1226 0 : call chi_matlu(matlumag_orb,natom=natom,option=1,optprt=0)
1227 0 : call rotate_matlu(matlumag_orb,eigvectmatlu,natom=natom,inverse=1)
1228 : !call print_matlu(matlumag_orb,iatom,prtopt=1)
1229 0 : call gather_matlu(matlumag_orb,magmom_orb,natom=natom,option=1,prtopt=0)
1230 0 : call destroy_matlu(matlumag_orb,natom=natom)
1231 :
1232 : ! == spin angular momentum
1233 0 : call init_matlu(natom=natom,nspinor=paw_dmft%nspinor,nsppol=paw_dmft%nsppol,lpawu_natom=paw_dmft%lpawu,matlu=matlumag_spin)
1234 0 : call zero_matlu(matlumag_spin,natom=natom)
1235 0 : call chi_matlu(matlumag_spin,natom=natom,option=2,optprt=0)
1236 0 : call rotate_matlu(matlumag_spin,eigvectmatlu,natom=natom,inverse=1)
1237 : !call print_matlu(matlumag_spin,natom,prtopt=1)
1238 0 : call gather_matlu(matlumag_spin,magmom_spin,natom=natom,option=1,prtopt=0)
1239 0 : call destroy_matlu(matlumag_spin,natom=natom)
1240 :
1241 : ! == total angular momentum
1242 0 : call init_matlu(natom=natom,nspinor=paw_dmft%nspinor,nsppol=paw_dmft%nsppol,lpawu_natom=paw_dmft%lpawu,matlu=matlumag_tot)
1243 0 : call zero_matlu(matlumag_tot,natom=natom)
1244 0 : call chi_matlu(matlumag_tot,natom=natom,option=3,optprt=0)
1245 0 : call rotate_matlu(matlumag_tot,eigvectmatlu,natom=natom,inverse=1)
1246 : !call print_matlu(matlumag_tot,natom=1,prtopt=1)
1247 0 : call gather_matlu(matlumag_tot,magmom_tot,natom=natom,option=1,prtopt=0)
1248 0 : call destroy_matlu(matlumag_tot,natom=natom)
1249 : endif !usejmj
1250 0 : write(message,'(a,2x,2a)') ch10, " ==> Rotation done", ch10
1251 0 : call wrtout(std_out,message,'COLL')
1252 :
1253 : end if ! dmftctqmc_localprop
1254 : !======================
1255 :
1256 34 : call timab(702,2,tsec(:))
1257 : ! =========================================================================================
1258 : ! Start big loop over atoms to compute hybridization and do the CTQMC
1259 : ! =========================================================================================
1260 :
1261 34 : call timab(703,1,tsec(:))
1262 96 : do iatom=1,natom
1263 :
1264 62 : lpawu = paw_dmft%lpawu(iatom)
1265 62 : if (lpawu == -1) cycle
1266 :
1267 34 : green%ecorr_qmc(iatom) = zero
1268 34 : itypat = paw_dmft%typat(iatom)
1269 34 : tndim = 2*lpawu + 1
1270 : ! if(lpawu/=-1) then
1271 :
1272 34 : nflavor = 2 * tndim
1273 :
1274 34 : if (testcode >= 1) then
1275 0 : nflavor = 2
1276 : if (testcode == 2) then
1277 : ispa = 1
1278 : ispb = 2
1279 : if (nspinor == 1) ispb = 1
1280 : ima = 1
1281 : imb = 1
1282 : if (tndim > 4) then
1283 : ima = 5 ! row
1284 : imb = 4 ! column
1285 : end if
1286 : end if ! testcode=2
1287 : end if ! testcode >=1
1288 :
1289 136 : ABI_MALLOC(fw1,(nwlo,nflavor))
1290 170 : ABI_MALLOC(fw1_nd,(nwlo,nflavor,nflavor))
1291 102 : ABI_MALLOC(levels_ctqmc,(nflavor))
1292 136 : ABI_MALLOC(levels_ctqmc_nd,(nflavor,nflavor))
1293 4698 : levels_ctqmc_nd(:,:) = czero
1294 102 : ABI_MALLOC(levels_ctqmc_complex,(nflavor))
1295 402 : levels_ctqmc_complex(:) = czero
1296 102 : ABI_MALLOC(hybri_limit,(nflavor,nflavor))
1297 4698 : hybri_limit(:,:) = czero
1298 1880926 : fw1_nd(:,:,:) = czero
1299 182380 : fw1(:,:) = czero
1300 :
1301 : ! =================================================================
1302 : ! Put hybridization in new arrays for CTQMC
1303 : ! =================================================================
1304 34 : if (testcode == 0) then
1305 34 : iflavor1 = 0
1306 34 : iflavor2 = 0
1307 :
1308 88 : do isppol=1,nsppol
1309 142 : do ispinor1=1,nspinor
1310 162 : do ispinor2=1,nspinor
1311 378 : do im1=1,tndim
1312 1786 : do im2=1,tndim
1313 :
1314 : ! first diagonal terms whatever opt_nondiag
1315 1462 : iflavor1 = im1 + tndim*(ispinor1-1) + tndim*(isppol-1)
1316 1462 : iflavor2 = im2 + tndim*(ispinor2-1) + tndim*(isppol-1)
1317 :
1318 1732 : if (iflavor1 == iflavor2 ) then
1319 :
1320 : ! Put weiss_for_rot in fw1
1321 173428 : do ifreq=1,nwlo
1322 173158 : if (opt_fk == 1 .or. opt_fk == 0) fw1(ifreq,iflavor1) = &
1323 173428 : & weiss_for_rot%oper(ifreq)%matlu(iatom)%mat(im1+(ispinor1-1)*tndim,im1+(ispinor1-1)*tndim,isppol)
1324 : end do ! ifreq
1325 173428 : fw1_nd(:,iflavor1,iflavor1) = fw1(:,iflavor1)
1326 :
1327 270 : if(paw_dmft%dmft_solv .eq. 10) then
1328 : !off diag levels are always null beceause of diagonalisation
1329 : levels_ctqmc_complex(iflavor1) = &
1330 0 : & energy_level%matlu(iatom)%mat(im1+(ispinor1-1)*tndim,im1+(ispinor1-1)*tndim,isppol)
1331 0 : hybri_limit(iflavor1,iflavor1) = hybri_coeff(iatom)%mat(im1+(ispinor1-1)*tndim,im1+(ispinor1-1)*tndim,isppol)
1332 : else
1333 : levels_ctqmc(iflavor1) = &
1334 270 : & dble(energy_level%matlu(iatom)%mat(im1+(ispinor1-1)*tndim,im1+(ispinor1-1)*tndim,isppol))
1335 270 : hybri_limit(iflavor1,iflavor1) = hybri_coeff(iatom)%mat(im1+(ispinor1-1)*tndim,im1+(ispinor1-1)*tndim,isppol)
1336 : endif
1337 :
1338 : ! case nsppol=nspinor=1
1339 270 : if (nsppol == 1 .and. nspinor == 1) then
1340 8918 : fw1(:,iflavor1+tndim) = fw1(:,iflavor1)
1341 8918 : fw1_nd(:,iflavor1+tndim,iflavor1+tndim) = fw1(:,iflavor1)
1342 98 : if(paw_dmft%dmft_solv .eq. 10) then
1343 0 : levels_ctqmc_complex(iflavor1+tndim) = levels_ctqmc_complex(iflavor1)
1344 : else
1345 98 : levels_ctqmc(iflavor1+tndim) = levels_ctqmc(iflavor1)
1346 98 : hybri_limit(iflavor1+tndim,iflavor1+tndim) = hybri_limit(iflavor1,iflavor1)
1347 : endif
1348 : end if
1349 :
1350 : ! off diagonal terms
1351 : else
1352 :
1353 : ! Put weiss_for_rot in fw1_nd
1354 704408 : do ifreq=1,nwlo
1355 703216 : if (opt_fk == 1 .or. opt_fk == 0) fw1_nd(ifreq,iflavor1,iflavor2) = &
1356 704408 : & weiss_for_rot%oper(ifreq)%matlu(iatom)%mat(im1+(ispinor1-1)*tndim,im2+(ispinor2-1)*tndim,isppol)
1357 : end do ! ifreq
1358 1192 : hybri_limit(iflavor1,iflavor2) = hybri_coeff(iatom)%mat(im1+(ispinor1-1)*tndim,im2+(ispinor2-1)*tndim,isppol)
1359 :
1360 : ! case nsppol=nspinor=1
1361 1192 : if (nsppol == 1 .and. nspinor == 1) then
1362 53508 : fw1_nd(:,iflavor1+tndim,iflavor2+tndim) = fw1_nd(:,iflavor1,iflavor2)
1363 588 : hybri_limit(iflavor1+tndim,iflavor2+tndim) = hybri_limit(iflavor1,iflavor2)
1364 : end if
1365 :
1366 : end if ! iflavor1=iflavor2
1367 :
1368 : ! < / HACK >
1369 : end do ! im2
1370 : end do ! im1
1371 : end do ! ispinor2
1372 : end do ! ispinor1
1373 : end do ! isppol
1374 : ! < HACK >
1375 : ! JB. On 1000 cpus this can not work since all CPU try to open/write the files
1376 : ! Action : Don't print it or check only one cpu does it.
1377 :
1378 34 : if (pawprtvol >= 10000000) then
1379 0 : write(message,'(a,2x,a)') ch10, " == Hybri for all flavors for CTQMC "
1380 0 : call wrtout(std_out,message,'COLL')
1381 0 : do iflavor1=1,nflavor
1382 0 : write(message,'(4x,14(2e14.5,2x))') (hybri_limit(iflavor1,iflavor2),iflavor2=1,nflavor)
1383 0 : call wrtout(std_out,message,'COLL')
1384 : end do ! iflavor1
1385 :
1386 0 : if (open_file('Hybri_cijoveromega',message,newunit=unt,status='unknown',form='formatted') /= 0) &
1387 0 : & ABI_ERROR(message)
1388 0 : if (open_file('Hybri',message,newunit=unt2,status='unknown',form='formatted') /= 0) ABI_ERROR(message)
1389 0 : do ifreq=1,nwlo
1390 : ! weiss_for_rot is G_0^-1-iw_n=-(F-levels)
1391 0 : if (optdb == 1) then
1392 : call printplot_matlu(weiss_for_rot%oper(ifreq)%matlu(:),natom,paw_dmft%omega_lo(ifreq),"weissbefore112",30000)
1393 : end if
1394 : end do
1395 0 : do iflavor1=1,nflavor
1396 0 : do iflavor2=1,nflavor
1397 0 : do ifreq=1,nwlo
1398 0 : omega = pi * paw_dmft%temp * (two*float(ifreq)-1)
1399 : ! fw1_nd is -G_0^+1-iw_n=(F-levels)
1400 0 : write(unt,'(300e16.5)') paw_dmft%omega_lo(ifreq), &
1401 0 : & fw1_nd(ifreq,iflavor1,iflavor2)-hybri_limit(iflavor1,iflavor2)/cmplx(zero,paw_dmft%omega_lo(ifreq),kind=dp)
1402 0 : write(unt2,'(300e16.5)') paw_dmft%omega_lo(ifreq),fw1_nd(ifreq,iflavor1,iflavor2)
1403 : end do ! ifreq
1404 0 : write(unt,*)
1405 0 : write(unt2,*)
1406 : end do ! iflavor2
1407 : end do ! iflavor1
1408 0 : close(unt)
1409 0 : close(unt2)
1410 : end if ! pawprtvol>=10000000
1411 : end if ! testcode
1412 : ! </ HACK >
1413 :
1414 :
1415 :
1416 :
1417 : ! ====================================================================================
1418 : ! TEST
1419 : ! For testing purpose, built ultra simple hybridization (constant in
1420 : ! imaginary time or very simple) or extract some part of the calculated hybridization
1421 : ! ====================================================================================
1422 34 : if (testcode >= 1) then
1423 : !dmft_nwlo = paw_dmft%dmft_nwlo
1424 0 : paw_dmft%dmft_nwlo = paw_dmft%dmftqmc_l
1425 0 : ABI_MALLOC(gw1_nd,(paw_dmft%dmft_nwlo,nflavor,nflavor))
1426 0 : gw1_nd(:,:,:) = czero
1427 :
1428 : ! Call testcode_ctqmc: built simple hybridization
1429 : !--------------------------------------------------
1430 0 : if (testcode == 1) then
1431 : call testcode_ctqmc(paw_dmft%dmftqmc_l,fw1_nd(:,:,:),fw1(:,:),gtmp_nd(:,:,:),gw_tmp_nd(:,:,:),&
1432 0 : & levels_ctqmc(:),hybri_limit(:,:),nflavor,1,paw_dmft%temp,testrot,testcode,umod(:,:))
1433 : ! Select 2x2 hybridization matrix from the current larger matrix
1434 : ! ima and imb are defined above.
1435 : !----------------------------------------------------------------
1436 0 : else if (testcode == 2) then
1437 : !close(unt)
1438 : !close(unt2)
1439 : call testcode_ctqmc_b(energy_level,hybri_coeff,weiss_for_rot,paw_dmft%dmftqmc_l,fw1_nd(:,:,:),&
1440 0 : & levels_ctqmc(:),levels_ctqmc_nd(:,:),hybri_limit(:,:),paw_dmft%temp,umod(:,:),opt_diag,opt_fk)
1441 : end if
1442 :
1443 : ! Calculation of Inverse Green's function from hybridization
1444 : !-------------------------------------------------------------
1445 0 : do if1=1,2
1446 0 : do if2=1,2
1447 0 : do ifreq=1,paw_dmft%dmftqmc_l
1448 0 : omega = pi * paw_dmft%temp * (two*dble(ifreq)-1)
1449 0 : if (if1 == if2) then
1450 0 : gw1_nd(ifreq,if1,if2) = (cmplx(zero,omega,kind=dp)-fw1_nd(ifreq,if1,if2))
1451 : else
1452 0 : gw1_nd(ifreq,if1,if2) = -fw1_nd(ifreq,if1,if2)
1453 : end if
1454 : end do ! ifreq
1455 : end do ! if2
1456 : end do ! if1
1457 : ! Calculation of Green's function (call inverse)
1458 : !-------------------------------------------------------------
1459 0 : do ifreq=1,paw_dmft%dmftqmc_l
1460 0 : call xginv(gw1_nd(ifreq,:,:),2)
1461 : end do
1462 0 : write(std_out,*) " testctqmc high frequency limit of hybridization",fw1_nd(paw_dmft%dmftqmc_l,:,:)
1463 :
1464 : ! Integrate Green's function
1465 : !-------------------------------------------------------------
1466 0 : do if1=1,2
1467 0 : do if2=1,2
1468 0 : call int_fct(gw1_nd(:,if1,if2),(if1==if2),2,paw_dmft,integral(if1,if2)) ! test_1
1469 : end do
1470 : end do
1471 : ! Write Occupations
1472 0 : write(std_out,*) "Occupation of model in matrix form"
1473 0 : do if1=1,2
1474 0 : write(std_out,'(2(2f13.5,3x))') ((integral(if1,if2)+conjg(integral(if2,if1)))/two,if2=1,2)
1475 : end do
1476 0 : write(std_out,*) "Limit of hybridization "
1477 0 : do if1=1,2
1478 0 : write(std_out,'(2(2f13.5,3x))') (hybri_limit(if1,if2),if2=1,2)
1479 : end do
1480 :
1481 : ! If opt_fk=0, give Green's function to CTQMC code instead of
1482 : ! hybridization
1483 : !-------------------------------------------------------------
1484 0 : if (opt_fk == 0) fw1_nd(:,:,:) = gw1_nd(:,:,:)
1485 :
1486 0 : ABI_FREE(gw1_nd)
1487 0 : paw_dmft%dmft_nwlo = nwlo
1488 :
1489 : ! and testcode>1
1490 : end if ! testcode>=1
1491 :
1492 :
1493 34 : call flush_unit(std_out)
1494 : ! =================================================================
1495 :
1496 : ! ___________________________________________________________________________________
1497 : !
1498 : ! THIRD PART : CALL CTQMC
1499 : ! ___________________________________________________________________________________
1500 :
1501 : ! ==================================================================
1502 : ! Main calls to CTQMC code in ABINIT (INITIALIZATION and OPTIONS)
1503 : ! ==================================================================
1504 34 : if (paw_dmft%dmft_solv == 5 .or. paw_dmft%dmft_solv == 8 .or. paw_dmft%dmft_solv == 10) then
1505 34 : write(message,'(a,2x,a)') ch10," == Initializing CTQMC"
1506 34 : call wrtout(std_out,message,'COLL')
1507 :
1508 : ! Initialisation
1509 : ! =================================================================
1510 34 : if (paw_dmft%dmft_solv == 5) then
1511 34 : nomega = paw_dmft%dmftqmc_l
1512 : call CtqmcInterface_init(hybrid,paw_dmft%dmftqmc_seed,paw_dmft%dmftqmc_n, &
1513 : & paw_dmft%dmftqmc_therm,paw_dmft%dmftctqmc_meas,nflavor,paw_dmft%dmftqmc_l,&
1514 34 : & one/paw_dmft%temp,zero,std_out,paw_dmft%dmftctqmc_chains,paw_dmft%spacecomm,paw_dmft%nspinor)
1515 : ! options
1516 : ! =================================================================
1517 : call CtqmcInterface_setOpts(hybrid, &
1518 : & opt_Fk = opt_fk, &
1519 : & opt_order = paw_dmft%dmftctqmc_order, &
1520 : & opt_histo = paw_dmft%dmftctqmc_localprop, &
1521 : & opt_movie = paw_dmft%dmftctqmc_mov, &
1522 : & opt_analysis = paw_dmft%dmftctqmc_correl, &
1523 : & opt_check = paw_dmft%dmftctqmc_check, &
1524 : & opt_noise = paw_dmft%dmftctqmc_grnns, &
1525 : & opt_spectra = paw_dmft%dmftctqmc_mrka, &
1526 34 : & opt_gmove = paw_dmft%dmftctqmc_gmove)
1527 : end if
1528 :
1529 34 : if (paw_dmft%dmft_solv == 8) then
1530 0 : nomega = paw_dmft%dmftqmc_l
1531 : call CtqmcoffdiagInterface_init(hybridoffdiag,paw_dmft%dmftqmc_seed,&
1532 : & paw_dmft%dmftqmc_n,paw_dmft%dmftqmc_therm,paw_dmft%dmftctqmc_meas,&
1533 : & nflavor,paw_dmft%dmftqmc_l,one/paw_dmft%temp,zero,std_out,&
1534 0 : & paw_dmft%spacecomm,opt_nondiag,paw_dmft%nspinor)
1535 : ! options
1536 : ! =================================================================
1537 : call CtqmcoffdiagInterface_setOpts(hybridoffdiag,opt_Fk=opt_fk, &
1538 : & opt_order = paw_dmft%dmftctqmc_order, &
1539 : & opt_histo = paw_dmft%dmftctqmc_localprop, &
1540 : & opt_movie = paw_dmft%dmftctqmc_mov, &
1541 : & opt_analysis = paw_dmft%dmftctqmc_correl, &
1542 : & opt_check = paw_dmft%dmftctqmc_check, &
1543 : & opt_noise = paw_dmft%dmftctqmc_grnns, &
1544 : & opt_spectra = paw_dmft%dmftctqmc_mrka, &
1545 0 : & opt_gmove = paw_dmft%dmftctqmc_gmove)
1546 : end if
1547 :
1548 34 : if (paw_dmft%dmft_solv == 10) then
1549 0 : nomega = paw_dmft%dmftqmc_l
1550 : call CtqmcoffdiagInterfaceComplex_init(hybridoffdiagComplex,paw_dmft%dmftqmc_seed,&
1551 : & paw_dmft%dmftqmc_n,paw_dmft%dmftqmc_therm,paw_dmft%dmftctqmc_meas,&
1552 : & nflavor,paw_dmft%dmftqmc_l,one/paw_dmft%temp,zero,std_out,&
1553 0 : & paw_dmft%spacecomm,opt_nondiag,paw_dmft%nspinor)
1554 : ! options
1555 : ! =================================================================
1556 : call CtqmcoffdiagInterfaceComplex_setOpts(hybridoffdiagComplex,opt_Fk=opt_fk, &
1557 : & opt_order = paw_dmft%dmftctqmc_order, &
1558 : & opt_histo = paw_dmft%dmftctqmc_localprop, &
1559 : & opt_movie = paw_dmft%dmftctqmc_mov, &
1560 : & opt_analysis = paw_dmft%dmftctqmc_correl, &
1561 : & opt_check = paw_dmft%dmftctqmc_check, &
1562 : & opt_noise = paw_dmft%dmftctqmc_grnns, &
1563 : & opt_spectra = paw_dmft%dmftctqmc_mrka, &
1564 0 : & opt_gmove = paw_dmft%dmftctqmc_gmove)
1565 : end if
1566 :
1567 34 : write(message,'(a,2x,2a)') ch10, " == Initialization CTQMC done", ch10
1568 34 : call wrtout(std_out,message,'COLL')
1569 :
1570 : end if ! dmft_solv=5 or dmft_solv=8
1571 :
1572 34 : if (paw_dmft%dmft_solv == 9) then
1573 0 : ABI_MALLOC(gw_tmp_nd,(paw_dmft%dmft_nwli,nflavor,nflavor))
1574 : ! because size allocation problem with TRIQS paw_dmft%dmft_nwlo must be >= paw_dmft%dmft_nwli
1575 0 : open(unit=505,file=trim(paw_dmft%filapp)//"_Legendre_coefficients.dat",status='unknown',form='formatted')
1576 : else
1577 34 : if (paw_dmft%dmft_solv == 5) then
1578 136 : ABI_MALLOC(gw_tmp,(paw_dmft%dmft_nwlo,nflavor+1))
1579 : end if
1580 170 : ABI_MALLOC(gw_tmp_nd,(paw_dmft%dmft_nwlo,nflavor,nflavor+1))
1581 : !use gw_tmp to put freq
1582 17963 : do ifreq=1,paw_dmft%dmft_nwlo
1583 17929 : if (paw_dmft%dmft_solv == 5) gw_tmp(ifreq,nflavor+1) = cmplx(zero,paw_dmft%omega_lo(ifreq),kind=dp)
1584 17963 : gw_tmp_nd(ifreq,nflavor,nflavor+1) = cmplx(zero,paw_dmft%omega_lo(ifreq),kind=dp)
1585 : end do
1586 : end if ! dmft_solv=9
1587 :
1588 136 : ABI_MALLOC(gtmp,(paw_dmft%dmftqmc_l,nflavor))
1589 : ! THIS IS A BACKUP PLAN. USING paw_dmft%hybrid makes a segfault on TIKAL
1590 : ! PSC with MPI only (and max2_open64). paw_dmf%hybrid is corrupted
1591 : ! somewhere but I could not find the place in all DMFT routines
1592 170 : ABI_MALLOC(gtmp_nd,(paw_dmft%dmftqmc_l,nflavor,nflavor))
1593 34 : if(paw_dmft%dmft_solv .eq. 10) then
1594 0 : ABI_MALLOC(gtmp_ndc,(paw_dmft%dmftqmc_l,nflavor,nflavor))
1595 : endif
1596 34 : call flush_unit(std_out)
1597 :
1598 34 : call timab(704,1,tsec(:))
1599 : ! =================================================================
1600 : ! BEGIN CALL TO CTQMC SOLVERS
1601 : ! =================================================================
1602 :
1603 34 : if (testcode == 0) then
1604 :
1605 : ! =================================================================
1606 : ! CTQMC run Abinit
1607 : ! =================================================================
1608 34 : if (paw_dmft%dmft_solv == 5) then
1609 :
1610 136 : ABI_MALLOC(docc,(nflavor,nflavor))
1611 4698 : docc(:,:) = zero
1612 : call CtqmcInterface_run(hybrid,fw1(1:paw_dmft%dmftqmc_l,:),Gtau=gtmp(:,:),Gw=gw_tmp(:,:),D=docc(:,:),E=green%ecorr_qmc(iatom),&
1613 : ! & matU=hu(itypat)%udens,opt_levels=levels_ctqmc)
1614 : & matU=dble(udens_atoms(iatom)%mat(:,:,1)),opt_levels=levels_ctqmc(:),Magmom_orb=REAL(magmom_orb(iatom)%value),&
1615 18690 : & Magmom_spin=REAL(magmom_spin(iatom)%value),Magmom_tot=REAL(magmom_tot(iatom)%value),Iatom=iatom,fname=paw_dmft%filapp)
1616 34 : if (paw_dmft%dmft_entropy > 0) then
1617 9 : call data4entropyDMFT_setDocc(paw_dmft%forentropyDMFT,iatom,docc(:,:))
1618 : end if
1619 34 : ABI_FREE(docc)
1620 : !DO iflavor = 1, nflavor
1621 : ! hybrid%Hybrid%Greens(iflavor)%oper(1:this%samples) = gtmp(1:this%samples,iflavor)
1622 : ! CALL GreenHyb_forFourier(this%Greens(iflavor), Gomega=Gw(:,iflavor), omega=Gw(:,this%flavors+1))
1623 : !END DO
1624 :
1625 : ! =================================================================
1626 : ! CTQMC run Abinit off diagonal terms in hybridization
1627 : ! =================================================================
1628 0 : else if (paw_dmft%dmft_solv == 8) then
1629 : ! =================================================================
1630 :
1631 0 : ABI_MALLOC(docc,(nflavor,nflavor))
1632 0 : docc(:,:) = zero
1633 :
1634 : call CtqmcoffdiagInterface_run(hybridoffdiag,fw1_nd(1:paw_dmft%dmftqmc_l,:,:),Gtau=gtmp_nd(:,:,:),&
1635 : & Gw=gw_tmp_nd(:,:,:),D=doccsum,E=green%ecorr_qmc(iatom),Noise=noise,matU=dble(udens_atoms(iatom)%mat(:,:,1)),&
1636 : & Docc=docc(:,:),opt_levels=levels_ctqmc(:),hybri_limit=hybri_limit(:,:),Magmom_orb=REAL(magmom_orb(iatom)%value),&
1637 : & Magmom_spin=REAL(magmom_spin(iatom)%value),Magmom_tot=REAL(magmom_tot(iatom)%value),Iatom=iatom,&
1638 0 : & fname=paw_dmft%filapp,jmjbasis=usejmj)
1639 :
1640 : ! For entropy (alternative formulation)
1641 0 : if (paw_dmft%ientropy == 1) then
1642 0 : EE = zero
1643 0 : do if1=1,nflavor
1644 0 : do if2=if1+1,nflavor
1645 0 : EE = EE + docc(if1,if2)*dble(udens_atoms_for_s(iatom)%mat(if1,if2,1))
1646 : ! write(std_out,*) udens_atoms_for_s(iatom)%value(if1,if2),docc(if1,if2)
1647 : end do
1648 : end do
1649 : ! Here in udens U=1, J=J/U, so we need to multiply bu U/Ha_eV
1650 0 : write(message,'(a,3(f14.10,3x))') "For entropy calculation E_corr_qmc, u_for_s, j_for,s", &
1651 0 : & paw_dmft%u_for_s*EE/Ha_eV,paw_dmft%u_for_s,paw_dmft%j_for_s
1652 0 : call wrtout(std_out,message,'COLL')
1653 0 : EE = zero
1654 0 : do if1=1,nflavor
1655 0 : do if2=if1+1,nflavor
1656 0 : EE = EE + dble(docc(if1,if2)*udens_atoms(iatom)%mat(if1,if2,1))
1657 : ! write(std_out,*) udens_atoms(iatom)%value(if1,if2),docc(if1,if2)
1658 : end do
1659 : end do
1660 : ! Here in udens U=U, J=J, so we obtain directly the results
1661 0 : write(message,'(a,3(f14.10,3x))') "Reference calculation E_corr_qmc, upawu , jpawu ", &
1662 0 : & EE,hu(itypat)%upawu*Ha_eV,hu(itypat)%jpawu*Ha_eV
1663 0 : call wrtout(std_out,message,'COLL')
1664 : end if
1665 0 : ABI_FREE(docc)
1666 : ! TODO: Handle de luj0 case for entropy
1667 :
1668 : ! =================================================================
1669 : ! CTQMC run Abinit Complex off diagonal terms in hybridization
1670 : ! =================================================================
1671 0 : else if (paw_dmft%dmft_solv == 10) then
1672 : ! =================================================================
1673 :
1674 0 : ABI_MALLOC(docc,(nflavor,nflavor))
1675 0 : docc(:,:) = zero
1676 :
1677 : call CtqmcoffdiagInterfaceComplex_run(hybridoffdiagComplex,fw1_nd(1:paw_dmft%dmftqmc_l,:,:),Gtau=gtmp_ndc(:,:,:),&
1678 : & Gw=gw_tmp_nd(:,:,:),D=doccsum,E=green%ecorr_qmc(iatom),Noise=noise,matU=udens_atoms(iatom)%mat(:,:,1),&
1679 : & Docc=docc(:,:),opt_levels=levels_ctqmc_complex(:),hybri_limit=hybri_limit(:,:),Magmom_orb=REAL(magmom_orb(iatom)%value),&
1680 : & Magmom_spin=REAL(magmom_spin(iatom)%value),Magmom_tot=REAL(magmom_tot(iatom)%value),&
1681 0 : & Iatom=iatom,fname=paw_dmft%filapp,opthybri=opt_hybri)
1682 :
1683 0 : ABI_FREE(docc)
1684 : ! =================================================================
1685 : ! CTQMC run TRIQS
1686 : ! =================================================================
1687 0 : else if (paw_dmft%dmft_solv == 9) then
1688 : ! =================================================================
1689 :
1690 0 : call ctqmc_calltriqs(paw_dmft,cryst_struc,hu(:),levels_ctqmc,gtmp_nd,gw_tmp_nd,fw1_nd,leg_measure,iatom)
1691 :
1692 : end if
1693 :
1694 : ! =================================================================
1695 : ! CTQMC run for tests
1696 : ! =================================================================
1697 0 : else if (testcode >= 1) then
1698 : call CtqmcInterface_run(hybrid,fw1(1:nomega,:),Gtau=gtmp(:,:),Gw=gw_tmp(:,:),E=green%ecorr_qmc(iatom),&
1699 0 : & matU=umod(:,:),opt_levels=levels_ctqmc(:),Iatom=iatom,fname=paw_dmft%filapp)
1700 :
1701 : ! for non diagonal code
1702 : ! call CtqmcInterface_run(hybrid,fw1_nd(1:nomega,:,:),Gtau=gtmp_nd,&
1703 : !& Gw=gw_tmp_nd,D=Doccsum,E=green%ecorr_qmc(iatom),&
1704 : !& Noise=Noise,matU=umod,opt_levels=levels_ctqmc,hybri_limit=hybri_limit)
1705 :
1706 : ! If test of the code is activated, and testrot =1 rotate back green's function and stop the code.
1707 : ! --------------------------------------------------------------------------------------------------
1708 0 : if (testcode == 1) then
1709 :
1710 : call testcode_ctqmc(paw_dmft%dmftqmc_l,fw1_nd(:,:,:),fw1(:,:),gtmp_nd(:,:,:),gw_tmp_nd(:,:,:), &
1711 0 : & levels_ctqmc(:),hybri_limit(:,:),nflavor,2,paw_dmft%temp,testrot,testcode,umod(:,:))
1712 :
1713 0 : write(message,'(2a)') ch10,' testcode end of test calculation'
1714 0 : ABI_ERROR(message)
1715 : end if
1716 :
1717 0 : if (testcode == 2) then
1718 0 : write(message,'(2a)') ch10,' testcode 2 end of test calculation'
1719 0 : ABI_ERROR(message)
1720 : end if
1721 :
1722 : end if
1723 34 : call timab(704,2,tsec(:))
1724 : ! =================================================================
1725 : ! END CALL TO CTQMC SOLVERS
1726 : ! =================================================================
1727 :
1728 :
1729 : ! Print green function is files directly from CTQMC
1730 : ! --------------------------------------------------
1731 34 : call ctqmcoutput_printgreen(paw_dmft,gtmp_nd,gtmp_ndc,gw_tmp_nd,gtmp,gw_tmp,iatom)
1732 :
1733 :
1734 : ! If the CTQMC code in ABINIT was used, then destroy it and deallocate arrays
1735 : ! ----------------------------------------------------------------------------
1736 : ! if(paw_dmft%dmft_solv<6.and.paw_dmft%dmft_solv>7) then
1737 : ! Nothing just hybrid var problem
1738 : ! else
1739 34 : write(message,'(a,2x,a)') ch10," == Destroy CTQMC"
1740 34 : call wrtout(std_out,message,'COLL')
1741 34 : if (paw_dmft%dmft_solv == 5) then
1742 34 : call CtqmcInterface_finalize(hybrid)
1743 : end if
1744 34 : if (paw_dmft%dmft_solv == 8) then
1745 0 : call CtqmcoffdiagInterface_finalize(hybridoffdiag)
1746 : end if
1747 34 : if (paw_dmft%dmft_solv == 10) then
1748 0 : call CtqmcoffdiagInterfaceComplex_finalize(hybridoffdiagComplex)
1749 : end if
1750 34 : write(message,'(a,2x,a)') ch10," == Destroy CTQMC done"
1751 34 : call wrtout(std_out,message,'COLL')
1752 34 : ABI_FREE(hybri_limit)
1753 34 : ABI_FREE(levels_ctqmc_nd)
1754 34 : ABI_FREE(levels_ctqmc)
1755 34 : ABI_FREE(levels_ctqmc_complex)
1756 34 : ABI_FREE(fw1)
1757 34 : ABI_FREE(fw1_nd)
1758 :
1759 : ! ____________________________________________________________
1760 : !
1761 : ! FOURTH PART : USE OUTPUT OF CTQMC AND THEN DO BACK ROTATION
1762 : ! ____________________________________________________________
1763 : !
1764 :
1765 : ! Put green's function values from CTQMC into green structure
1766 : !------------------------------------------------------------
1767 34 : call ctqmcoutput_to_green(green,paw_dmft,gtmp_nd,gtmp_ndc,gw_tmp_nd,gtmp,gw_tmp,iatom,leg_measure,opt_nondiag,opt_complex)
1768 :
1769 : ! Deallocate arrays for CTQMC
1770 : !----------------------------
1771 34 : if (paw_dmft%dmft_solv < 6) then
1772 34 : ABI_FREE(gw_tmp)
1773 : end if
1774 34 : ABI_FREE(gw_tmp_nd)
1775 34 : ABI_FREE(gtmp)
1776 34 : ABI_FREE(gtmp_nd)
1777 68 : if(paw_dmft%dmft_solv .eq. 10) then
1778 0 : ABI_FREE(gtmp_ndc)
1779 : endif
1780 :
1781 : ! Do Fourier transform if it was not done (ie if TRIQS is used without legendre measurement)
1782 : !-------------------------------------------------------------------------------------------
1783 : ! if(opt_nondiag==1) then ! (As leg_measure is activated by defautl, this fourier is never done).
1784 : ! if(paw_dmft%dmft_solv>=6.and..not.leg_measure.and.paw_dmft%dmft_solv<=7) then
1785 : ! write(message,'(2a,i3,13x,a)') ch10,' === Direct Fourier Transform t->w of Weiss Field'
1786 : ! call wrtout(std_out,message,'COLL')
1787 : ! call fourier_green(cryst_struc,green,paw_dmft,&
1788 : ! & pawang,opt_ksloc=2,opt_tw=1)
1789 : ! end if
1790 : ! endif
1791 :
1792 : ! end if
1793 :
1794 : end do ! iatom
1795 34 : call timab(703,2,tsec(:))
1796 : ! ==================================================================
1797 : ! End big loop over atoms to compute hybridization and do the CTQMC
1798 : ! ==================================================================
1799 :
1800 34 : call timab(705,1,tsec(:))
1801 34 : if (paw_dmft%dmft_prgn == 1) then
1802 0 : call print_green('QMC_diag_notsym',green,1,paw_dmft,opt_wt=2)
1803 0 : call print_green('QMC_diag_notsym',green,1,paw_dmft,opt_wt=1)
1804 : end if
1805 : ! write(message,'(i3,4x,2e21.14)') 6,weiss_for_rot%oper(1)%matlu(1)%mat(1,1,1,1,1)
1806 : ! call wrtout(std_out,message,'COLL') ! debug
1807 : ! =================================================================
1808 : ! Inverse Weiss, then
1809 : ! Copy Weiss_for_rot into weiss and rotate back weiss to the original basis
1810 : ! =================================================================
1811 :
1812 : ! ABI_MALLOC(shift,(natom))
1813 : ! do ifreq=1,paw_dmft%dmft_nwlo
1814 : ! ! First weiss_for_rot contains -G_0^-1+iw_n
1815 : ! ! -------------------------------------------
1816 : ! ! Compute G_0^-1-iw_n
1817 : ! ! --------------------
1818 : ! write(6,*) "1"
1819 : ! if(opt_fk==1) call fac_matlu(weiss_for_rot%oper(ifreq)%matlu,natom,-cone)
1820 : !
1821 : !
1822 : ! write(6,*) "2"
1823 : ! ! Compute G_0^-1
1824 : ! ! --------------------
1825 : ! shift(:)=cmplx(zero,paw_dmft%omega_lo(ifreq),kind=dp)
1826 : ! if(opt_fk==1) call shift_matlu(weiss_for_rot%oper(ifreq)%matlu,natom,shift,signe=1)
1827 : !
1828 : ! write(6,*) "3"
1829 : ! ! Compute G_0
1830 : ! ! --------------------
1831 : ! call inverse_oper(weiss_for_rot%oper(ifreq),option=1,prtopt=1)
1832 : ! ! No need to copy if weiss_for_rot is a pointer to weiss ...
1833 : !! if(useylm==1) call slm2ylm_matlu(weiss%oper(ifreq)%matlu,natom,2,0)
1834 : !! if(opt_diag/=0) call rotate_matlu(weiss%oper(ifreq)%matlu,eigvectmatlu,natom,3,0)
1835 : !
1836 : ! ! Compute G_0 in the original basis
1837 : ! ! --------------------
1838 : ! call rotate_matlu(weiss_for_rot%oper(ifreq)%matlu,eigvectmatlu,natom,3,0)
1839 : ! end do
1840 : ! ABI_FREE(shift)
1841 :
1842 : ! =================================================================
1843 : ! Here compute Self energy from Dyson and print it
1844 : ! Warning : Weiss_for_rot is inversed inside dyson
1845 : ! =================================================================
1846 : ! call initialize_self(self,paw_dmft)
1847 : ! call dyson(green,paw_dmft,self,weiss_for_rot,opt_weissself=2)
1848 : ! call rw_self(self,mpi_enreg,paw_dmft,prtopt=2,opt_rw=2,opt_char="diag")
1849 : ! call destroy_self(self)
1850 : !write(message,'(i3,4x,2e21.14)') 7,weiss%oper(1)%matlu(1)%mat(1,1,1,1,1)
1851 : !call wrtout(std_out,message,'COLL') ! debug
1852 :
1853 : ! =================================================================
1854 : ! Rotate back green function to original basis (non-diagonal)
1855 : ! (and Weiss for further use: might be useful if an back Fourier
1856 : ! transformation is done).
1857 : ! =================================================================
1858 34 : if (pawprtvol >= 3) then
1859 28 : write(message,'(a,2x,a)') ch10, & ! debug
1860 56 : & " == Print Green's function for tau=0+ in the CTQMC basis" ! debug
1861 28 : call wrtout(std_out,message,'COLL') ! debug
1862 28 : call print_matlu(green%oper_tau(1)%matlu(:),natom,1,compl=1) ! debug
1863 28 : write(message,'(a,2x,a)') ch10,& ! debug
1864 56 : & " == Print Green's function for smallest freq in the CTQMC basis" ! debug
1865 28 : call wrtout(std_out,message,'COLL') ! debug
1866 28 : call print_matlu(green%oper(1)%matlu(:),natom,1) ! debug
1867 : end if ! pawprtvol>=3
1868 :
1869 : ! === Compute rotated Occupations in green%occup_tau
1870 34 : call occup_green_tau(green)
1871 :
1872 34 : if (pawprtvol >= 3) then
1873 : ! === Compute non rotated Occupations in green%occup_tau
1874 28 : write(message,'(a,2x,a)') ch10," == Occupations from G(tau=0-) in the CTQMC basis"
1875 28 : call wrtout(std_out,message,'COLL')
1876 28 : call print_matlu(green%occup_tau%matlu(:),natom,1)
1877 : end if ! pawprtvol>=3
1878 :
1879 : ! =================================================================
1880 : !
1881 : ! === Compute magnetic moments from CT-QMC occupations for
1882 : ! the x,y and z axes when SOC is activated
1883 : !
1884 : ! =================================================================
1885 34 : if (paw_dmft%nspinor .eq. 2) then
1886 0 : ABI_MALLOC(matlumag,(natom))
1887 0 : ABI_MALLOC(muzeem,(natom))
1888 0 : ABI_MALLOC(muspin,(natom))
1889 0 : ABI_MALLOC(muorb,(natom))
1890 0 : write(message,'(a,2x,a)') ch10,"== Magnetic moments from CT-QMC occupation matrix "
1891 0 : call wrtout(std_out,message,'COLL')
1892 :
1893 0 : do iatom=1,cryst_struc%natom
1894 0 : lpawu=paw_dmft%lpawu(iatom)
1895 0 : if(lpawu .ne. -1) then
1896 0 : write(message,'(a,3x,a,i4)') ch10,"-------> For Correlated Atom",iatom
1897 0 : call wrtout(std_out,message,'COLL')
1898 :
1899 : ! == orbital angular momentum
1900 0 : do icomp=1,3 !x,y,z components
1901 0 : muorb(iatom)=czero
1902 0 : call init_matlu(natom=natom,nspinor=paw_dmft%nspinor,nsppol=paw_dmft%nsppol,lpawu_natom=paw_dmft%lpawu,matlu=matlumag)
1903 0 : call copy_matlu(green%occup_tau%matlu,matlumag,natom)
1904 0 : if (usejmj == 1) then
1905 0 : call ylm2jmj_matlu(matlumag,natom,2,paw_dmft)
1906 : else
1907 0 : call rotate_matlu(matlumag,eigvectmatlu,natom=natom,inverse=0)
1908 : endif
1909 0 : call magmomforb_matlu(matlumag,muorb,natom=natom,option=icomp,optprt=0)
1910 0 : write(message,'(a,2x,a,i4,a,f8.4)') ch10," Orbital angular momentum for axis ", icomp, " is ", REAL(muorb(iatom))
1911 0 : call wrtout(std_out,message,'COLL')
1912 0 : call destroy_matlu(matlumag,(natom))
1913 : end do
1914 :
1915 : ! == spin angular momentum
1916 0 : do icomp=1,3 !x,y,z components
1917 0 : muspin(iatom)=czero
1918 0 : call init_matlu(natom=natom,nspinor=paw_dmft%nspinor,nsppol=paw_dmft%nsppol,lpawu_natom=paw_dmft%lpawu,matlu=matlumag)
1919 0 : call copy_matlu(green%occup_tau%matlu,matlumag,natom=natom)
1920 0 : if (usejmj == 1) then
1921 0 : call ylm2jmj_matlu(matlumag,natom,2,paw_dmft)
1922 : else
1923 0 : call rotate_matlu(matlumag,eigvectmatlu,natom=natom,inverse=0)
1924 : endif
1925 0 : call magmomfspin_matlu(matlumag,muspin,natom=natom,option=icomp,optprt=0)
1926 0 : write(message,'(a,2x,a,i4,a,f8.4)') ch10," Spin angular momentum for axis ", icomp, " is ", REAL(muspin(iatom))
1927 0 : call wrtout(std_out,message,'COLL')
1928 0 : call destroy_matlu(matlumag,(natom))
1929 : end do
1930 :
1931 : ! == total angular momentum (L_u + 2*S_u)
1932 0 : do icomp=1,3 !x,y,z components
1933 0 : muzeem(iatom)=czero
1934 0 : call init_matlu(natom=natom,nspinor=paw_dmft%nspinor,nsppol=paw_dmft%nsppol,lpawu_natom=paw_dmft%lpawu,matlu=matlumag)
1935 0 : call copy_matlu(green%occup_tau%matlu,matlumag,natom=natom)
1936 0 : if (usejmj == 1) then
1937 0 : call ylm2jmj_matlu(matlumag,natom,2,paw_dmft)
1938 : else
1939 0 : call rotate_matlu(matlumag,eigvectmatlu,natom=natom,inverse=0)
1940 : endif
1941 0 : call magmomfzeeman_matlu(matlumag,muzeem,natom=natom,option=icomp,optprt=0)
1942 0 : write(message,'(a,2x,a,i4,a,f8.4)') ch10," Zeeman angular momentum for axis ", icomp, " is ", REAL(muzeem(iatom))
1943 0 : call wrtout(std_out,message,'COLL')
1944 0 : call destroy_matlu(matlumag,(natom))
1945 : end do
1946 : endif !lpawu
1947 : end do !iatom
1948 0 : ABI_FREE(matlumag)
1949 0 : ABI_FREE(muzeem)
1950 0 : ABI_FREE(muspin)
1951 0 : ABI_FREE(muorb)
1952 : end if !nspinor
1953 : ! =================================================================
1954 :
1955 34 : if (opt_diag /= 0) then
1956 14 : write(message,'(a,2x,a)') ch10," == Rotate Green's function back to original basis "
1957 14 : call wrtout(std_out,message,'COLL')
1958 : end if
1959 : ! write(message,'(i3,4x,2e21.14)') 8,weiss%oper(1)%matlu(1)%mat(1,1,1,1,1)
1960 : ! call wrtout(std_out,message,'COLL') ! debug
1961 :
1962 : ! Rotate oper_tau into Ylm basis and then Slm basis
1963 : ! -------------------------------------------------------------
1964 : ! do itau=1,paw_dmft%dmftqmc_l
1965 : ! if (opt_diag /= 0) call rotate_matlu(green%oper_tau(itau)%matlu(:),eigvectmatlu(:),natom,3,0)
1966 : ! if (useylm == 1) call slm2ylm_matlu(green%oper_tau(itau)%matlu(:),natom,2,0)
1967 : ! end do
1968 7584 : do itau=1,paw_dmft%dmftqmc_l
1969 7550 : if (opt_diag /= 0) then
1970 700 : call rotate_matlu(green%oper_tau(itau)%matlu(:),eigvectmatlu(:),natom,0)
1971 : end if
1972 7550 : if (usejmj == 1) then
1973 0 : call ylm2jmj_matlu(green%oper_tau(itau)%matlu(:),natom,2,paw_dmft)
1974 : endif
1975 7584 : if (useylm == 1) then
1976 0 : call slm2ylm_matlu(green%oper_tau(itau)%matlu(:),natom,paw_dmft,2,0)
1977 : end if
1978 : end do ! itau
1979 :
1980 : ! Rotate occup_tau into Ylm basis and then Slm basis
1981 :
1982 : ! Rotate occup_tau into Ylm basis and then Slm basis
1983 : !-------------------------------------------------------------
1984 34 : if (opt_diag /= 0) then
1985 14 : call rotate_matlu(green%occup_tau%matlu(:),eigvectmatlu(:),natom,0)
1986 : end if
1987 34 : if (usejmj == 1) then
1988 0 : write(message,'(a,2x,a)') ch10," == Occupations from G(tau=0-) in the jmj basis"
1989 0 : call wrtout(std_out,message,'COLL')
1990 0 : call ylm2jmj_matlu(green%occup_tau%matlu(:),natom,2,paw_dmft)
1991 0 : call print_matlu(green%occup_tau%matlu(:),natom,1)
1992 : endif
1993 34 : if (useylm == 1) then
1994 0 : write(message,'(a,2x,a)') ch10," == Occupations from G(tau=0-) in the Ylm basis"
1995 0 : call wrtout(std_out,message,'COLL')
1996 0 : call print_matlu(green%occup_tau%matlu(:),natom,1)
1997 0 : call slm2ylm_matlu(green%occup_tau%matlu(:),natom,paw_dmft,2,0)
1998 : end if
1999 : ! write(message,'(a,2x,a)') ch10," == Occupations from G(tau=0-) in the Slm basis"
2000 : ! call wrtout(std_out,message,'COLL')
2001 : ! call print_matlu(green%occup_tau%matlu(:),natom,1)
2002 :
2003 : ! Put Weiss off diagonal terms to zero because Green function will not have any offdiag terms
2004 : ! ------------------------------------------------------------------------------
2005 : ! (if opt_nondiag=0 ie dmft_solv=5)
2006 34 : if (opt_nondiag == 0) then
2007 17963 : do ifreq=1,nwlo
2008 17963 : call zero_matlu(weiss%oper(ifreq)%matlu(:),natom,onlynondiag=1)
2009 : end do ! ifreq
2010 : end if ! opt_nondiag=0
2011 : ! ( if opt_nondiag=0, then:
2012 : ! As Green's function is diagonal, one suppress off diag terms in Weiss, if any.
2013 : ! (If off diag are non zero in the density matrix and thus in the Green's function,
2014 : ! there is a warning in checkreal_matlu above).)
2015 :
2016 : ! Rotate Green's and Weiss functions into Ylm basis and then Slm basis
2017 : !-------------------------------------------------------------
2018 :
2019 17963 : do ifreq=1,nwlo
2020 17929 : if (opt_diag /= 0) then
2021 1260 : call rotate_matlu(green%oper(ifreq)%matlu(:),eigvectmatlu(:),natom,0)
2022 1260 : call rotate_matlu(weiss%oper(ifreq)%matlu(:),eigvectmatlu(:),natom,0)
2023 : end if
2024 17929 : if (usejmj == 1) then
2025 0 : call ylm2jmj_matlu(green%oper(ifreq)%matlu(:),natom,2,paw_dmft)
2026 0 : call ylm2jmj_matlu(weiss%oper(ifreq)%matlu(:),natom,2,paw_dmft)
2027 : endif
2028 17963 : if (useylm == 1) then
2029 0 : call slm2ylm_matlu(green%oper(ifreq)%matlu(:),natom,paw_dmft,2,0)
2030 0 : call slm2ylm_matlu(weiss%oper(ifreq)%matlu(:),natom,paw_dmft,2,0)
2031 : end if
2032 : end do ! ifreq
2033 :
2034 : !write(message,'(i3,4x,2e21.14)') 10,weiss%oper(1)%matlu(1)%mat(1,1,1,1,1)
2035 : !call wrtout(std_out,message,'COLL') ! debug
2036 :
2037 34 : if (pawprtvol >= 3) then
2038 : !< HACK >
2039 28 : write(message,'(a,2x,a)') ch10,& ! debug
2040 56 : & " == Print diagonalized weiss_for_rot function after rotation for small freq in the ctqmc basis" ! debug
2041 28 : call wrtout(std_out,message,'COLL') ! debug
2042 28 : call print_matlu(weiss_for_rot%oper(1)%matlu(:),natom,1) ! debug
2043 :
2044 : !</ HACK >
2045 28 : write(message,'(a,2x,a)') ch10,& ! debug
2046 56 : & " == Print Weiss function for smallest freq in the Slm basis" ! debug
2047 28 : call wrtout(std_out,message,'COLL') ! debug
2048 28 : call print_matlu(weiss%oper(1)%matlu(:),natom,1) ! debug
2049 :
2050 17453 : do ifreq=1,nwlo
2051 17453 : call sym_matlu(weiss%oper(ifreq)%matlu(:),paw_dmft)
2052 : end do
2053 28 : write(message,'(a,2x,a)') ch10,& ! debug
2054 56 : & " == Print symmetrized Weiss function for smallest freq in the Slm basis" ! debug
2055 28 : call wrtout(std_out,message,'COLL') ! debug
2056 28 : call print_matlu(weiss%oper(1)%matlu(:),natom,1) ! debug
2057 28 : write(message,'(a,2x,a)') ch10, & ! debug
2058 56 : & " == Print Green's function for tau=0+ in the Slm basis" ! debug
2059 28 : call wrtout(std_out,message,'COLL') ! debug
2060 28 : call print_matlu(green%oper_tau(1)%matlu(:),natom,1) ! debug
2061 28 : write(message,'(a,2x,a)') ch10,& ! debug
2062 56 : & " == Print Green's function for smallest freq in the Slm basis" ! debug
2063 28 : call wrtout(std_out,message,'COLL') ! debug
2064 28 : call print_matlu(green%oper(1)%matlu(:),natom,1) ! debug
2065 : end if ! pawprtvol>=3
2066 :
2067 164 : ABI_MALLOC(matlu1,(natom))
2068 34 : call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu(:),matlu1(:))
2069 34 : call copy_matlu(green%occup_tau%matlu(:),matlu1(:),natom)
2070 34 : call sym_matlu(matlu1(:),paw_dmft)
2071 :
2072 34 : write(message,'(a,2x,a)') ch10," == Occupations from G(tau=0-) in the Slm basis"
2073 34 : call wrtout(std_out,message,'COLL')
2074 34 : call print_matlu(green%occup_tau%matlu(:),natom,1)
2075 :
2076 34 : write(message,'(a,2x,a)') ch10," == Symmetrized occupations"
2077 34 : call wrtout(std_out,message,'COLL')
2078 34 : call print_matlu(matlu1(:),natom,1)
2079 :
2080 34 : call diff_matlu("CTQMC occupations","Symmetrized CTQMC occupations",green%occup_tau%matlu(:),matlu1(:),natom,0,tol4,ierr=ierr)
2081 34 : call destroy_matlu(matlu1(:),natom)
2082 96 : ABI_FREE(matlu1)
2083 :
2084 : ! =================================================================
2085 : ! Symmetrize green function G(tau) and G(ifreq) to recover symmetry
2086 : ! artificially broken by QMC
2087 : ! =================================================================
2088 34 : write(message,'(a,2x,a)') ch10," == Symmetrize Green's function after CTQMC "
2089 34 : call wrtout(std_out,message,'COLL')
2090 :
2091 68 : do itau=1,1 !paw_dmft%dmftqmc_l
2092 68 : call sym_matlu(green%oper_tau(itau)%matlu(:),paw_dmft)
2093 : end do ! itau
2094 :
2095 : ! Perform symetry on GPU if requested
2096 34 : if (paw_dmft%gpu_option == ABI_GPU_OPENMP) then
2097 : #ifdef HAVE_OPENMP_OFFLOAD
2098 : ! 1) Init green_oper_ndat
2099 : call init_oper_ndat(paw_dmft,green_oper_ndat,nwlo,nkpt=green%oper(1)%nkpt,opt_ksloc=2,gpu_option=paw_dmft%gpu_option)
2100 : if (green%oper(1)%has_operks == 0) then
2101 : green_oper_ndat%paral = 1
2102 : green_oper_ndat%shiftk = green%distrib%shiftk
2103 : end if
2104 : ! 2) Copy green%oper(:)%matlu into green_oper_ndat (CPU->GPU transfer)
2105 : call copy_oper_to_ndat(green%oper,green_oper_ndat,nwlo,green%nw,green%distrib%proct,green%distrib%me_freq,.false.)
2106 :
2107 : ! 3) Perform sym_matlu on green_oper_ndat (GPU enabled)
2108 : call sym_matlu(green_oper_ndat%matlu(:),paw_dmft)
2109 :
2110 : ! 4) Copy back green%oper(:)%matlu from green_oper_ndat (GPU->CPU transfer)
2111 : call copy_oper_from_ndat(green_oper_ndat,green%oper,nwlo,green%nw,green%distrib%proct,&
2112 : & green%distrib%me_freq,.false.)
2113 : ! 5) Destroy green_oper_ndat
2114 : call destroy_oper(green_oper_ndat)
2115 : #endif
2116 : else
2117 17963 : do ifreq=1,paw_dmft%dmft_nwlo
2118 17963 : call sym_matlu(green%oper(ifreq)%matlu(:),paw_dmft)
2119 : end do ! ifreq
2120 : end if
2121 :
2122 :
2123 34 : if (pawprtvol >= 3) then
2124 28 : write(message,'(a,2x,a)') ch10, & ! debug
2125 56 : & " == Print Green's function for tau=0+ after symmetrization" ! debug
2126 28 : call wrtout(std_out,message,'COLL') ! debug
2127 28 : call print_matlu(green%oper_tau(1)%matlu(:),natom,1) ! debug
2128 28 : write(message,'(a,2x,a)') ch10, & ! debug
2129 56 : & " == Print Green's function for smallest freq after symmetrization" ! debug
2130 28 : call wrtout(std_out,message,'COLL') ! debug
2131 28 : call print_matlu(green%oper(1)%matlu(:),natom,1) ! debug
2132 : end if ! pawprtvol>=3
2133 34 : if (paw_dmft%dmft_prgn == 1) then
2134 0 : call print_green('QMC_sym',green,1,paw_dmft,opt_wt=2)
2135 0 : call print_green('QMC_sym',green,1,paw_dmft,opt_wt=1)
2136 : end if
2137 :
2138 : ! === Compute Occupations (Symmetrized from oper_tau)
2139 34 : call occup_green_tau(green)
2140 :
2141 : ! === Print occupations
2142 : ! call printocc_green(green,6,paw_dmft,3)
2143 :
2144 34 : call destroy_oper(energy_level)
2145 34 : call destroy_matlu(dmat_diag(:),natom)
2146 34 : call destroy_matlu(eigvectmatlu(:),natom)
2147 34 : call destroy_matlu(udens_atoms(:),natom)
2148 96 : ABI_FREE(dmat_diag)
2149 96 : do iatom=1,natom
2150 62 : lpawu = paw_dmft%lpawu(iatom)
2151 62 : if (lpawu == -1) cycle
2152 34 : ABI_FREE(magmom_orb(iatom)%value)
2153 34 : ABI_FREE(magmom_spin(iatom)%value)
2154 96 : ABI_FREE(magmom_tot(iatom)%value)
2155 : end do
2156 96 : ABI_FREE(udens_atoms)
2157 96 : ABI_FREE(eigvectmatlu)
2158 96 : ABI_FREE(magmom_orb)
2159 96 : ABI_FREE(magmom_spin)
2160 96 : ABI_FREE(magmom_tot)
2161 96 : ABI_FREE(matlumag_orb)
2162 96 : ABI_FREE(matlumag_spin)
2163 96 : ABI_FREE(matlumag_tot)
2164 34 : call destroy_green(weiss_for_rot)
2165 : ! call destroy_green(gw_loc)
2166 : ! call destroy_green(greendft)
2167 :
2168 : ! destroy limit of hybridization
2169 34 : call destroy_matlu(hybri_coeff(:),paw_dmft%natom)
2170 96 : ABI_FREE(hybri_coeff)
2171 :
2172 34 : call destroy_vee(paw_dmft,vee_rotated(:))
2173 96 : ABI_FREE(vee_rotated)
2174 34 : call timab(705,2,tsec(:))
2175 34 : call timab(701,2,tsec(:))
2176 :
2177 272 : end subroutine qmc_prep_ctqmc
2178 : !!***
2179 :
2180 : !!****f* m_forctqmc/testcode_ctqmc_b
2181 : !! NAME
2182 : !! testcode_ctqmc_b
2183 : !!
2184 : !! FUNCTION
2185 : !! Setup ultra simple hybridization to test CTQMC in simple situations.
2186 : !!
2187 : !! INPUTS
2188 : !! temp = temperature
2189 : !! dmftqmc_l = number of times slices
2190 : !! levels_ctqmc_nd=level matrix
2191 : !!
2192 : !! OUTPUT
2193 : !! fw1_nd=hybridization matrix
2194 : !! umod = value of U
2195 : !! hybri_limit= limit of F
2196 : !! weiss_for_rot= weiss function
2197 : !! hybri_coeff
2198 : !!
2199 : !! SIDE EFFECTS
2200 : !!
2201 : !! NOTES
2202 : !!
2203 : !! SOURCE
2204 :
2205 0 : subroutine testcode_ctqmc_b(energy_level,hybri_coeff,weiss_for_rot,dmftqmc_l,fw1_nd,levels_ctqmc,&
2206 0 : & levels_ctqmc_nd,hybri_limit,temp,umod,opt_diag,opt_fk)
2207 :
2208 : !Arguments ------------------------------------
2209 : !scalars
2210 : integer, intent(in) :: dmftqmc_l,opt_diag,opt_fk
2211 : real(dp), intent(in) :: temp
2212 : real(dp), intent(out) :: umod(2,2)
2213 : real(dp), intent(inout) :: levels_ctqmc(:)
2214 : complex(dp), intent(out) :: fw1_nd(:,:,:)
2215 : complex(dp), intent(inout) :: levels_ctqmc_nd(:,:)
2216 : complex(dp), intent(inout) :: hybri_limit(:,:)
2217 : type(oper_type) :: energy_level
2218 : type(matlu_type), allocatable :: hybri_coeff(:)
2219 : type(green_type) :: weiss_for_rot
2220 :
2221 : !Local variables ------------------------------
2222 : integer :: ifreq,iatom,ima,imb,ispa,ispb,ndim
2223 : real(dp) :: omega
2224 : real(dp) :: facnd, facd
2225 : character(len=30) :: tmpfil
2226 : ! ************************************************************************
2227 0 : facnd=0.8d0
2228 0 : facd=1.0d0
2229 0 : ndim=2*energy_level%matlu(iatom)%lpawu+1
2230 : !write(6,*) "fac",facnd,facd
2231 0 : levels_ctqmc_nd(2,2) = energy_level%matlu(iatom)%mat(imb+(ispb-1)*ndim,imb+(ispb-1)*ndim,1)
2232 0 : levels_ctqmc_nd(1,1) = energy_level%matlu(iatom)%mat(ima+(ispa-1)*ndim,ima+(ispa-1)*ndim,1)
2233 0 : levels_ctqmc(2) = real(energy_level%matlu(iatom)%mat(imb+(ispb-1)*ndim,imb+(ispb-1)*ndim,1),kind=dp)
2234 0 : levels_ctqmc(1) = real(energy_level%matlu(iatom)%mat(ima+(ispa-1)*ndim,ima+(ispa-1)*ndim,1),kind=dp)
2235 0 : if(opt_diag/=1) then
2236 0 : levels_ctqmc_nd(1,2) = energy_level%matlu(iatom)%mat(ima+(ispa-1)*ndim,imb+(ispb-1)*ndim,1)
2237 0 : levels_ctqmc_nd(2,1) = energy_level%matlu(iatom)%mat(imb+(ispb-1)*ndim,ima+(ispa-1)*ndim,1)
2238 : end if
2239 0 : hybri_limit(1,1) = facd*hybri_coeff(iatom)%mat(ima+(ispa-1)*ndim,ima+(ispa-1)*ndim,1)
2240 0 : hybri_limit(2,2) = facd*hybri_coeff(iatom)%mat(imb+(ispb-1)*ndim,imb+(ispb-1)*ndim,1)
2241 0 : hybri_limit(1,2) = facnd*hybri_coeff(iatom)%mat(ima+(ispa-1)*ndim,imb+(ispb-1)*ndim,1)
2242 0 : hybri_limit(2,1) = facnd*hybri_coeff(iatom)%mat(imb+(ispb-1)*ndim,ima+(ispa-1)*ndim,1)
2243 : !write(6,*) "hybri_limit",hybri_limit
2244 : !write(6,*) "levels_ctqmc",levels_ctqmc
2245 0 : umod=zero
2246 :
2247 : tmpfil = 'fw1_nd_re'
2248 : !if (open_file(newunit=unt,message,file=trim(tmpfil),status='unknown',form='formatted')/=0) then
2249 : ! ABI_ERROR(message)
2250 : !end if
2251 0 : tmpfil = 'fw1_nd_im'
2252 : !if (open_file(newunit=unt2,message,file=trim(tmpfil),status='unknown',form='formatted')/=0) then
2253 : ! ABI_ERROR(message)
2254 : !end if
2255 0 : write(std_out,*) "testcode==2",ispa,ispb,ima,imb
2256 0 : write(std_out,*) "opt_fk==",opt_fk
2257 0 : do ifreq=1,dmftqmc_l
2258 0 : if (opt_fk==1) then
2259 0 : fw1_nd(ifreq,1,1) = facd*weiss_for_rot%oper(ifreq)%matlu(iatom)%mat(ima+(ispa-1)*ndim,ima+(ispa-1)*ndim,1)
2260 0 : fw1_nd(ifreq,2,2) = facd*weiss_for_rot%oper(ifreq)%matlu(iatom)%mat(imb+(ispb-1)*ndim,imb+(ispb-1)*ndim,1)
2261 : !fw1_nd(ifreq,1,2) = weiss_for_rot%oper(ifreq)%matlu(iatom)%mat(ima,imb,1,ispa,ispb)
2262 : !fw1_nd(ifreq,2,1) = weiss_for_rot%oper(ifreq)%matlu(iatom)%mat(imb,ima,1,ispb,ispa)
2263 0 : fw1_nd(ifreq,1,2) = facnd*weiss_for_rot%oper(ifreq)%matlu(iatom)%mat(ima+(ispa-1)*ndim,imb+(ispb-1)*ndim,1)
2264 0 : fw1_nd(ifreq,2,1) = facnd*weiss_for_rot%oper(ifreq)%matlu(iatom)%mat(imb+(ispb-1)*ndim,ima+(ispa-1)*ndim,1)
2265 0 : omega=pi*temp*(two*float(ifreq)-1)
2266 0 : else if (opt_fk==0) then
2267 0 : fw1_nd(ifreq,1,1) = facd*weiss_for_rot%oper(ifreq)%matlu(iatom)%mat(ima+(ispa-1)*ndim,ima+(ispa-1)*ndim,1)
2268 0 : fw1_nd(ifreq,2,2) = facd*weiss_for_rot%oper(ifreq)%matlu(iatom)%mat(imb+(ispb-1)*ndim,imb+(ispb-1)*ndim,1)
2269 0 : fw1_nd(ifreq,1,2) = facnd*weiss_for_rot%oper(ifreq)%matlu(iatom)%mat(ima+(ispa-1)*ndim,imb+(ispb-1)*ndim,1)
2270 0 : fw1_nd(ifreq,2,1) = facnd*weiss_for_rot%oper(ifreq)%matlu(iatom)%mat(imb+(ispb-1)*ndim,ima+(ispa-1)*ndim,1)
2271 0 : call xginv(fw1_nd(ifreq,:,:),2)
2272 : end if
2273 : end do
2274 0 : end subroutine testcode_ctqmc_b
2275 : !!***
2276 :
2277 :
2278 : !!****f* m_forctqmc/testcode_ctqmc
2279 : !! NAME
2280 : !! testcode_ctqmc
2281 : !!
2282 : !! FUNCTION
2283 : !! Setup ultra simple hybridization to test CTQMC in simple situations.
2284 : !!
2285 : !! INPUTS
2286 : !! gtmp_nd
2287 : !! gw_tmp_nd
2288 : !! temp = temperature
2289 : !! dmftqmc_l = number of times slices
2290 : !! nflavor = number of flavor
2291 : !! testrot = 0/1 if rotation of hybridization is tested or not
2292 : !! testcode = 1 if tests are activated.
2293 : !! opt = 1/2 if pre or postprocessing of CTQMC data.
2294 : !!
2295 : !! OUTPUT
2296 : !! fw1_nd = non diagonal hybridization
2297 : !! fw1 = hybridization
2298 : !! umod = value of U
2299 : !!
2300 : !!
2301 : !! SIDE EFFECTS
2302 : !! gtmp_nd
2303 : !! gw_tmp_nd
2304 : !!
2305 : !! NOTES
2306 : !!
2307 : !! SOURCE
2308 :
2309 0 : subroutine testcode_ctqmc(dmftqmc_l,fw1_nd,fw1,gtmp_nd,gw_tmp_nd,levels_ctqmc,hybri_limit,&
2310 : & nflavor,opt,temp,testrot,testcode,umod)
2311 :
2312 :
2313 : !Arguments ------------------------------------
2314 : !scalars
2315 : integer, intent(in) :: dmftqmc_l,nflavor,testrot,testcode,opt
2316 : real(dp), intent(in) :: temp
2317 : real(dp), intent(out) :: umod(2,2)
2318 : complex(dp), intent(inout) :: gw_tmp_nd(:,:,:)
2319 : real(dp), intent(inout) :: gtmp_nd(:,:,:)
2320 : complex(dp), intent(out) :: fw1(:,:)
2321 : complex(dp), intent(out) :: fw1_nd(:,:,:)
2322 : real(dp), intent(inout) :: levels_ctqmc(:)
2323 : complex(dp), intent(inout) :: hybri_limit(:,:)
2324 :
2325 : !Local variables ------------------------------
2326 : character(len=500) :: message
2327 : integer :: ifreq, itau,realrot,simplehyb
2328 : real(dp) :: omega
2329 : real(dp) :: tbi1,tbi2,e2,tbi3,tbi4,e3,e4,tbi21,tbi12,e3b,e4b,tbi21b,tbi12b
2330 : complex(dp) :: e1
2331 : ! arrays
2332 : complex(dp) :: RR(2,2)
2333 : complex(dp) :: RR1(2,2)
2334 : complex(dp) :: RRi(2,2)
2335 : complex(dp) :: RRt(2,2)
2336 : ! ************************************************************************
2337 0 : if (testcode==0) return
2338 0 : if (nflavor/=2) then
2339 0 : write(message,'(2a)') ch10,' testcode nflavor.ne.2'
2340 0 : ABI_ERROR(message)
2341 : end if
2342 :
2343 : simplehyb=2
2344 : simplehyb=1
2345 0 : simplehyb=3
2346 : !=========================
2347 : ! Built rotation matrix
2348 : !=========================
2349 : realrot=0
2350 0 : realrot=2
2351 : if (realrot==1) then
2352 : ! Real rotation
2353 : !=========================
2354 : RR(1,1) = SQRT(3.d0)/2.d0
2355 : RR(1,2) = -1.d0/2.d0
2356 : RR(2,1) = 1.d0/2.d0
2357 : RR(2,2) = SQRT(3.d0)/2.d0
2358 : else if (realrot==2) then
2359 : ! Real rotation
2360 : !=========================
2361 0 : RR(1,1) = SQRT(1.d0/2.d0)
2362 0 : RR(1,2) = -SQRT(1.d0/2.d0)
2363 0 : RR(2,1) = SQRT(1.d0/2.d0)
2364 0 : RR(2,2) = SQRT(1.d0/2.d0)
2365 : else
2366 : ! Complex rotation
2367 : !=========================
2368 : RR(1,1) = CMPLX(one,two)
2369 : RR(1,2) = CMPLX(one,one)
2370 : RR(2,1) = CMPLX(one,-one)
2371 : RR(2,2) = CMPLX(-one,two)
2372 : RR=RR/sqrt(seven)
2373 : end if
2374 : ! Check rotation is unitary
2375 : !==========================
2376 0 : RRi(1,1) = conjg(RR(1,1))
2377 0 : RRi(1,2) = conjg(RR(2,1))
2378 0 : RRi(2,1) = conjg(RR(1,2))
2379 0 : RRi(2,2) = conjg(RR(2,2))
2380 0 : RR1(:,:) = MATMUL ( RR(:,:) , RRi(:,:) )
2381 : !write(6,*) "RR1",RR1
2382 0 : if(abs(RR1(1,1)-one).gt.tol7.or.abs(RR1(1,2)).gt.tol7.or.abs(RR1(2,2)-one).gt.tol7.or.abs(RR1(2,1)).gt.tol7) then
2383 0 : write(message,'(2a)') ch10,' testcode error in rotation matrix'
2384 0 : ABI_ERROR(message)
2385 : end if
2386 :
2387 :
2388 : !=================================
2389 : ! Built hybridization for CTQMC
2390 : !=================================
2391 0 : if (opt==1) then
2392 :
2393 : ! Parameters: tight-binding + U
2394 : ! firt test of the code try umod=0, and (tbi1,tbi2,e1,e2)=(2,1,0.5,0.0) testrot=1
2395 : ! second test of the code try umod=four, and (tbi1,tbi2,e1,e2)=(2,1,0.0,0.0) testrot=1
2396 : !=======================================================================================
2397 0 : fw1_nd(:,:,:)= czero
2398 0 : tbi1=2.0_dp
2399 0 : tbi2=1.0_dp
2400 0 : tbi3=1.0_dp
2401 0 : tbi4=1.0_dp
2402 0 : tbi12=2.5_dp
2403 0 : tbi12b=2.5_dp
2404 0 : tbi21=2.5_dp
2405 0 : tbi21b=2.5_dp
2406 0 : e1=cmplx(0.0,0.0,8)
2407 0 : e2=zero
2408 0 : e3=0.2
2409 0 : e4=0.3
2410 0 : e3b=0.3
2411 0 : e4b=-0.2
2412 0 : umod(:,:)=0.d0
2413 :
2414 : if(testrot==1.and.(abs(tbi1-tbi2)<tol6)) then
2415 : write(message,'(3a)') ch10,' testrot=1 with tbi1=tbi2 is equivalent' &
2416 : ,'to testrot=0: change testrot'
2417 : ABI_WARNING(message)
2418 : end if
2419 : ! Built fw1_nd
2420 : !==============
2421 0 : do ifreq=1,dmftqmc_l
2422 :
2423 0 : omega=pi*temp*(two*float(ifreq)-1)
2424 :
2425 : if(simplehyb==1) then
2426 : fw1_nd(ifreq,1,1) = -umod(1,1)/two+tbi1**2/(dcmplx(0.d0,omega)-e1)
2427 : fw1_nd(ifreq,2,2) = -umod(1,1)/two+tbi2**2/(dcmplx(0.d0,omega)-e2)
2428 : fw1(ifreq,1) = -umod(1,1)/two+tbi1**2/(dcmplx(0.d0,omega)-e1)
2429 : fw1(ifreq,2) = -umod(1,1)/two+tbi2**2/(dcmplx(0.d0,omega)-e2)
2430 : hybri_limit(1,1)=tbi1**2
2431 : hybri_limit(2,2)=tbi2**2
2432 : hybri_limit(1,2)=0.d0
2433 : hybri_limit(2,1)=0.d0
2434 : else if(simplehyb==2) then
2435 : fw1_nd(ifreq,1,1) = -umod(1,1)/two+tbi1**2/(dcmplx(0.d0,omega)-e1)+tbi3**2/(dcmplx(0.d0,omega)-e3)
2436 : fw1_nd(ifreq,2,2) = -umod(1,1)/two+tbi2**2/(dcmplx(0.d0,omega)-e2)+tbi4**2/(dcmplx(0.d0,omega)-e4)
2437 : fw1(ifreq,1) = -umod(1,1)/two+tbi1**2/(dcmplx(0.d0,omega)-e1)
2438 : fw1(ifreq,2) = -umod(1,1)/two+tbi2**2/(dcmplx(0.d0,omega)-e2)
2439 : else if(simplehyb==3) then
2440 0 : fw1_nd(ifreq,1,1) = -umod(1,1)/two+tbi1**2/(dcmplx(0.d0,omega)-e1)
2441 0 : fw1_nd(ifreq,2,2) = -umod(1,1)/two+tbi2**2/(dcmplx(0.d0,omega)-e2)
2442 0 : fw1_nd(ifreq,1,2) = tbi12**2/(dcmplx(0.d0,omega)-e3)+tbi12b**2/(dcmplx(0.d0,omega)-e3b)
2443 0 : fw1_nd(ifreq,2,1) = tbi21**2/(dcmplx(0.d0,omega)-e4)+tbi21b**2/(dcmplx(0.d0,omega)-e4b)
2444 0 : fw1(ifreq,1) = -umod(1,1)/two+tbi1**2/(dcmplx(0.d0,omega)-e1)
2445 0 : fw1(ifreq,2) = -umod(1,1)/two+tbi2**2/(dcmplx(0.d0,omega)-e2)
2446 0 : hybri_limit(1,1)=tbi1**2
2447 0 : hybri_limit(2,2)=tbi2**2
2448 0 : hybri_limit(1,2)=tbi12**2+tbi12b**2
2449 0 : hybri_limit(2,1)=tbi21**2+tbi21b**2
2450 : end if
2451 0 : write(132,*) omega,real(fw1_nd(ifreq,1,1)),aimag(fw1_nd(ifreq,1,1))
2452 0 : write(133,*) omega,real(fw1_nd(ifreq,1,2)),aimag(fw1_nd(ifreq,1,2))
2453 0 : write(134,*) omega,real(fw1_nd(ifreq,2,1)),aimag(fw1_nd(ifreq,2,1))
2454 0 : write(135,*) omega,real(fw1_nd(ifreq,2,2)),aimag(fw1_nd(ifreq,2,2))
2455 0 : write(1234,*) omega, real(fw1(ifreq,1)),aimag(fw1(ifreq,1))
2456 : end do
2457 : ! Built level and limit of hybridization
2458 : !=======================================
2459 0 : levels_ctqmc(1:nflavor)=-umod(1,1)/two
2460 :
2461 0 : write(std_out,*) "fw1_nd"
2462 0 : write(std_out,*) fw1_nd(1,1,1), fw1_nd(1,1,2)
2463 0 : write(std_out,*) fw1_nd(1,2,1), fw1_nd(1,2,2)
2464 0 : write(std_out,*) "fw1"
2465 0 : write(std_out,*) fw1(1,1), fw1(1,2)
2466 0 : write(std_out,*) fw1(2,1), fw1(2,2)
2467 :
2468 : ! Rotate hybridization if testrot=1
2469 : !==================================
2470 0 : if(testrot==1) then
2471 :
2472 0 : do ifreq=1,dmftqmc_l
2473 0 : RRt(:,:) = MATMUL ( RR(:,:) , fw1_nd(ifreq,:,:) )
2474 : !write(6,*) "RRt"
2475 : !write(6,*) RRt(1,1), RRt(1,2)
2476 : !write(6,*) RRt(2,1), RRt(2,2)
2477 0 : RR1(:,:) = MATMUL ( RRt(:,:) , RRi(:,:) )
2478 : !write(6,*) "RR1"
2479 : !write(6,*) RR1(1,1), RR1(1,2)
2480 : !write(6,*) RR1(2,1), RR1(2,2)
2481 0 : fw1_nd(ifreq,:,:)=RR1(:,:)
2482 0 : omega=pi*temp*(two*float(ifreq)+1)
2483 0 : write(3322,*) omega,real(fw1_nd(ifreq,1,1)),aimag(fw1_nd(ifreq,1,1))
2484 0 : write(232,*) omega,real(fw1_nd(ifreq,1,1)),aimag(fw1_nd(ifreq,1,1))
2485 0 : write(233,*) omega,real(fw1_nd(ifreq,1,2)),aimag(fw1_nd(ifreq,1,2))
2486 0 : write(234,*) omega,real(fw1_nd(ifreq,2,1)),aimag(fw1_nd(ifreq,2,1))
2487 0 : write(235,*) omega,real(fw1_nd(ifreq,2,2)),aimag(fw1_nd(ifreq,2,2))
2488 : end do
2489 :
2490 : ! Rotate limit of hybridization
2491 : !=======================================
2492 0 : RRt(:,:) = MATMUL ( RR(:,:) , hybri_limit(:,:) )
2493 0 : RR1(:,:) = MATMUL ( RRt(:,:) , RRi(:,:) )
2494 0 : hybri_limit(:,:)=RR1(:,:)
2495 :
2496 : end if
2497 : ! rajouter test real(fw1_nd(1,:,:)) doit etre diagonale
2498 :
2499 : !======================================
2500 : ! Rotate Green's function from CTQMC
2501 : !======================================
2502 0 : else if(opt==2) then
2503 :
2504 0 : write(std_out,*) "gw_tmp_nd"
2505 0 : write(std_out,*) gw_tmp_nd(1,1,1), gw_tmp_nd(1,1,2)
2506 0 : write(std_out,*) gw_tmp_nd(1,2,1), gw_tmp_nd(1,2,2)
2507 : ! Rotate Green's function back
2508 : !==============================
2509 0 : if(testrot==1) then
2510 0 : do ifreq=1,dmftqmc_l
2511 0 : RRt(1:nflavor,1:nflavor) = MATMUL ( RRi(1:nflavor,1:nflavor),gw_tmp_nd(ifreq,1:nflavor,1:nflavor) )
2512 0 : RR1(1:nflavor,1:nflavor) = MATMUL ( RRt(1:nflavor,1:nflavor),RR(1:nflavor,1:nflavor) )
2513 0 : gw_tmp_nd(ifreq,1:nflavor,1:nflavor)=RR1(1:nflavor,1:nflavor)
2514 : end do
2515 :
2516 0 : write(std_out,*) "gw_tmp_nd after rotation"
2517 0 : write(std_out,*) gw_tmp_nd(1,1,1), gw_tmp_nd(1,1,2)
2518 0 : write(std_out,*) gw_tmp_nd(1,2,1), gw_tmp_nd(1,2,2)
2519 :
2520 0 : do itau=1,dmftqmc_l
2521 0 : RRt(1:nflavor,1:nflavor) = MATMUL ( RRi(1:nflavor,1:nflavor),gtmp_nd(itau,1:nflavor,1:nflavor) )
2522 0 : RR1(1:nflavor,1:nflavor) = MATMUL ( RRt(1:nflavor,1:nflavor),RR(1:nflavor,1:nflavor) )
2523 0 : gtmp_nd(itau,1:nflavor,1:nflavor)=real(RR1(1:nflavor,1:nflavor))
2524 : end do
2525 :
2526 : ! Rotate Green's function for comparison with testrot=1
2527 : !======================================================
2528 0 : else if (testrot==0) then ! produce rotated green's function to compare to testrot=1 case
2529 :
2530 0 : do itau=1,dmftqmc_l
2531 0 : RRt(1:nflavor,1:nflavor) = MATMUL ( RR(1:nflavor,1:nflavor),gtmp_nd(itau,1:nflavor,1:nflavor) )
2532 0 : RR1(1:nflavor,1:nflavor) = MATMUL ( RRt(1:nflavor,1:nflavor),RRi(1:nflavor,1:nflavor) )
2533 0 : write(444,*) real(itau-1)/(temp*real(dmftqmc_l)),real(RR1(1,1)),real(RR1(2,2)),real(RR1(1,2)),real(RR1(2,1))
2534 : end do
2535 :
2536 : end if
2537 :
2538 : ! Print out rotated Green's function
2539 : !=====================================
2540 0 : do itau=1,dmftqmc_l
2541 0 : write(555,'(e14.5,4(2e14.5,3x))') real(itau-1)/(temp*real(dmftqmc_l)),gtmp_nd(itau,1,1),&
2542 0 : & gtmp_nd(itau,2,2),gtmp_nd(itau,1,2),gtmp_nd(itau,2,1)
2543 : end do
2544 :
2545 0 : write(message,'(2a)') ch10,' testcode end of test calculation'
2546 0 : ABI_ERROR(message)
2547 :
2548 : end if
2549 0 : close(444)
2550 0 : close(555)
2551 :
2552 : end subroutine testcode_ctqmc
2553 : !!***
2554 :
2555 : !!****f* m_forctqmc/ctqmcoutput_to_green
2556 : !! NAME
2557 : !! ctqmcoutput_to_green
2558 : !!
2559 : !! FUNCTION
2560 : !! Put values of green function from ctqmc into green datatype
2561 : !! Symetrize over spin if calculation is non magnetic
2562 : !!
2563 : !! INPUTS
2564 : !! paw_dmft <type(paw_dmft_type)>= DMFT data structure
2565 : !! gtmp_nd(dmftqmc_l,nflavor,nflavor) = Green's fct in imag time (with off diag terms)
2566 : !! gtmp_ndc(dmftqmc_l,nflavor,nflavor) = Complex Green's fct in imag time (with off diag terms)
2567 : !! gw_tmp_nd(nb_of_frequency,nflavor,nflavor) = Green's fct in imag freq (with off diag terms)
2568 : !! gtmp(dmftqmc_l,nflavor) = Green's fct in imag time (diag)
2569 : !! gw_tmp(nb_of_frequency,nflavor+1) =Green's fct in imag freq (diag)
2570 : !! iatom = atoms on which the calculation has been done
2571 : !! leg_measure = logical, to Legendre Measurement or not (if done Green function is frequency is computed)
2572 : !! opt_nondiag = integer, it activated, then
2573 : !! opt_complex = integer, 1 activate complex Gtau
2574 : !!
2575 : !! OUTPUT
2576 : !! green <type(green_type)>= green's function
2577 : !!
2578 : !!
2579 : !! SIDE EFFECTS
2580 : !!
2581 : !! NOTES
2582 : !!
2583 : !! SOURCE
2584 :
2585 34 : subroutine ctqmcoutput_to_green(green,paw_dmft,gtmp_nd,gtmp_ndc,gw_tmp_nd,gtmp,gw_tmp,iatom,leg_measure,opt_nondiag,opt_complex)
2586 :
2587 : !Arguments ------------------------------------
2588 : !scalars
2589 : type(paw_dmft_type), intent(in) :: paw_dmft
2590 : type(green_type), intent(inout) :: green
2591 : real(dp), allocatable, intent(in) :: gtmp_nd(:,:,:)
2592 : complex(dpc), allocatable, intent(in) :: gtmp_ndc(:,:,:)
2593 : complex(dpc), allocatable, intent(in) :: gw_tmp(:,:)
2594 : complex(dpc), allocatable, intent(in) :: gw_tmp_nd(:,:,:)
2595 : real(dp), allocatable, intent(in) :: gtmp(:,:)
2596 : integer, intent(in) :: iatom,opt_nondiag,opt_complex
2597 : logical(kind=1), intent(in) :: leg_measure
2598 : character(len=500) :: message
2599 :
2600 : !Local variables ------------------------------
2601 : integer :: ifreq, itau,im1,im2,isppol,ispinor1,ispinor2,iflavor1
2602 : integer :: iflavor2,tndim,ispinor,iflavor,im,nflavor
2603 : ! ************************************************************************
2604 34 : tndim=2*paw_dmft%lpawu(iatom)+1
2605 34 : nflavor=2*(tndim)
2606 :
2607 7584 : do itau=1,paw_dmft%dmftqmc_l
2608 459584 : green%oper_tau(itau)%matlu(iatom)%mat(:,:,:)=czero
2609 : end do
2610 358 : green%occup_tau%matlu(iatom)%mat(nflavor:,:,:)=czero
2611 :
2612 17963 : do ifreq=1,paw_dmft%dmft_nwlo
2613 1102093 : green%oper(ifreq)%matlu(iatom)%mat(:,:,:)=czero
2614 : end do
2615 1820 : green%occup%matlu(iatom)%mat(:,:,:)=czero
2616 :
2617 : ! built time and frequency green's function from output of CTQMC
2618 : ! =================================================================
2619 34 : if(opt_nondiag==1 .and. opt_complex==0) then
2620 0 : do isppol=1,paw_dmft%nsppol
2621 0 : do ispinor1=1,paw_dmft%nspinor
2622 0 : do im1=1,tndim
2623 0 : iflavor1=im1+tndim*(ispinor1-1)+tndim*(isppol-1)
2624 0 : do ispinor2=1,paw_dmft%nspinor
2625 0 : do im2=1,tndim
2626 0 : iflavor2=im2+tndim*(ispinor2-1)+tndim*(isppol-1)
2627 0 : do itau=1,paw_dmft%dmftqmc_l
2628 : green%oper_tau(itau)%matlu(iatom)%mat(im1+(ispinor1-1)*tndim,im2+(ispinor2-1)*tndim,isppol)=&
2629 0 : & gtmp_nd(itau,iflavor1,iflavor2)
2630 : ! symetrize over spin if nsppol=nspinor=1
2631 0 : if(paw_dmft%nsppol==1.and.paw_dmft%nspinor==1) then
2632 : green%oper_tau(itau)%matlu(iatom)%mat(im1+(ispinor1-1)*tndim,im2+(ispinor2-1)*tndim,isppol)=&
2633 0 : & (gtmp_nd(itau,iflavor1,iflavor2)+gtmp_nd(itau,iflavor1+tndim,iflavor2+tndim))/two
2634 : end if
2635 : end do !itau
2636 0 : if(paw_dmft%dmft_solv<6.or.leg_measure) then
2637 0 : do ifreq=1,paw_dmft%dmft_nwlo
2638 : green%oper(ifreq)%matlu(iatom)%mat(im1+(ispinor1-1)*tndim,im2+(ispinor2-1)*tndim,isppol)=&
2639 0 : & gw_tmp_nd(ifreq,iflavor1,iflavor2)
2640 : ! symetrize over spin if nsppol=nspinor=1
2641 0 : if(paw_dmft%nsppol==1.and.paw_dmft%nspinor==1) then
2642 : green%oper(ifreq)%matlu(iatom)%mat(im1+(ispinor1-1)*tndim,im2+(ispinor2-1)*tndim,isppol)=&
2643 : & (gw_tmp_nd(ifreq,iflavor1,iflavor2)+&
2644 0 : & gw_tmp_nd(ifreq,iflavor1+tndim,iflavor2+tndim))/two
2645 : end if
2646 : end do ! ifreq
2647 : end if
2648 : end do ! im2
2649 : end do ! ispinor2
2650 : end do ! im1
2651 : end do ! ispinor
2652 : end do ! isppol
2653 : != Complex case
2654 34 : elseif(opt_nondiag==1 .and. opt_complex==1) then
2655 0 : do isppol=1,paw_dmft%nsppol
2656 0 : do ispinor1=1,paw_dmft%nspinor
2657 0 : do im1=1,tndim
2658 0 : iflavor1=im1+tndim*(ispinor1-1)+tndim*(isppol-1)
2659 0 : do ispinor2=1,paw_dmft%nspinor
2660 0 : do im2=1,tndim
2661 0 : iflavor2=im2+tndim*(ispinor2-1)+tndim*(isppol-1)
2662 0 : do itau=1,paw_dmft%dmftqmc_l
2663 : green%oper_tau(itau)%matlu(iatom)%mat(im1+(ispinor1-1)*tndim,im2+(ispinor2-1)*tndim,isppol)=&
2664 0 : & gtmp_ndc(itau,iflavor1,iflavor2)
2665 : ! symetrize over spin if nsppol=nspinor=1
2666 0 : if(paw_dmft%nsppol==1.and.paw_dmft%nspinor==1) then
2667 : green%oper_tau(itau)%matlu(iatom)%mat(im1+(ispinor1-1)*tndim,im2+(ispinor2-1)*tndim,isppol)=&
2668 0 : & (gtmp_ndc(itau,iflavor1,iflavor2)+gtmp_ndc(itau,iflavor1+tndim,iflavor2+tndim))/two
2669 : end if
2670 : end do !itau
2671 0 : do ifreq=1,paw_dmft%dmft_nwlo
2672 : green%oper(ifreq)%matlu(iatom)%mat(im1+(ispinor1-1)*tndim,im2+(ispinor2-1)*tndim,isppol)=&
2673 0 : & gw_tmp_nd(ifreq,iflavor1,iflavor2)
2674 : ! symetrize over spin if nsppol=nspinor=1
2675 0 : if(paw_dmft%nsppol==1.and.paw_dmft%nspinor==1) then
2676 : green%oper(ifreq)%matlu(iatom)%mat(im1+(ispinor1-1)*tndim,im2+(ispinor2-1)*tndim,isppol)=&
2677 : & (gw_tmp_nd(ifreq,iflavor1,iflavor2)+&
2678 0 : & gw_tmp_nd(ifreq,iflavor1+tndim,iflavor2+tndim))/two
2679 : end if
2680 : end do ! ifreq
2681 : end do ! im2
2682 : end do ! ispinor2
2683 : end do ! im1
2684 : end do ! ispinor
2685 : end do ! isppol
2686 : else
2687 34 : iflavor=0
2688 88 : do isppol=1,paw_dmft%nsppol
2689 142 : do ispinor=1,paw_dmft%nspinor
2690 378 : do im=1,tndim
2691 270 : iflavor=iflavor+1
2692 72270 : do itau=1,paw_dmft%dmftqmc_l
2693 72000 : green%oper_tau(itau)%matlu(iatom)%mat(im+(ispinor-1)*tndim,im+(ispinor-1)*tndim,isppol)=gtmp(itau,iflavor)
2694 : ! symetrize over spin if nsppol=paw_dmft%nspinor=1
2695 72270 : if(paw_dmft%nsppol==1.and.paw_dmft%nspinor==1) then
2696 : green%oper_tau(itau)%matlu(iatom)%mat(im+(ispinor-1)*tndim,im+(ispinor-1)*tndim,isppol)=&
2697 4900 : & (gtmp(itau,iflavor)+gtmp(itau,iflavor+tndim))/two
2698 : end if
2699 : end do
2700 : ! ifreq2=0
2701 173482 : do ifreq=1,paw_dmft%dmft_nwlo
2702 : ! if(paw_dmft%select_log(ifreq)==1) then
2703 : ! ifreq2=ifreq2+1
2704 173158 : green%oper(ifreq)%matlu(iatom)%mat(im+(ispinor-1)*tndim,im+(ispinor-1)*tndim,isppol)=gw_tmp(ifreq,iflavor)
2705 : ! symetrize over spin if nsppol=paw_dmft%nspinor=1
2706 173428 : if(paw_dmft%nsppol==1.and.paw_dmft%nspinor==1) then
2707 : green%oper(ifreq)%matlu(iatom)%mat(im+(ispinor-1)*tndim,im+(ispinor-1)*tndim,isppol)=&
2708 8820 : & (gw_tmp(ifreq,iflavor)+gw_tmp(ifreq,iflavor+tndim))/two
2709 : end if
2710 : end do
2711 : end do
2712 : end do
2713 : end do
2714 : end if
2715 34 : if(paw_dmft%nsppol==1.and.paw_dmft%nspinor==1) then
2716 14 : write(message,'(a,2x,a,f13.5)') ch10,&
2717 28 : & " == nsppol==1 and nspden==1: Green functions from CTQMC have been symetrized over spin"
2718 14 : call wrtout(std_out,message,'COLL')
2719 : end if
2720 :
2721 34 : end subroutine ctqmcoutput_to_green
2722 : !!***
2723 :
2724 : !!****f* m_forctqmc/ctqmcoutput_printgreen
2725 : !! NAME
2726 : !! ctqmcoutput_printgreen
2727 : !!
2728 : !! FUNCTION
2729 : !! Print values of green function in files.
2730 : !! Symetrize imaginary time Green's function in a peculiar case
2731 : !! (dmft_solv=8 and natom=1). Should be moved later.
2732 : !!
2733 : !! INPUTS
2734 : !! paw_dmft <type(paw_dmft_type)>= DMFT data structure
2735 : !! gtmp_nd(dmftqmc_l,nflavor,nflavor) = Green's fct in imag time (with off diag terms)
2736 : !! gtmp_ndc(dmftqmc_l,nflavor,nflavor) = Complex Green's fct in imag time (with off diag terms)
2737 : !! gw_tmp_nd(nb_of_frequency,nflavor,nflavor) = Green's fct in imag freq (with off diag terms)
2738 : !! gtmp(dmftqmc_l,nflavor) = Green's fct in imag time (diag)
2739 : !! gw_tmp(nb_of_frequency,nflavor+1) =Green's fct in imag freq (diag)
2740 : !! iatom = atoms on which the calculation has been done
2741 : !!
2742 : !! OUTPUT
2743 : !!
2744 : !!
2745 : !! SIDE EFFECTS
2746 : !!
2747 : !! NOTES
2748 : !!
2749 : !! SOURCE
2750 :
2751 34 : subroutine ctqmcoutput_printgreen(paw_dmft,gtmp_nd,gtmp_ndc,gw_tmp_nd,gtmp,gw_tmp,iatom)
2752 :
2753 : !Arguments ------------------------------------
2754 : !scalars
2755 : type(paw_dmft_type), intent(in) :: paw_dmft
2756 : real(dp), allocatable, intent(inout) :: gtmp_nd(:,:,:)
2757 : complex(dpc), allocatable, intent(in) :: gtmp_ndc(:,:,:)
2758 : complex(dpc), allocatable, intent(in) :: gw_tmp(:,:)
2759 : complex(dpc), allocatable, intent(in) :: gw_tmp_nd(:,:,:)
2760 : real(dp), allocatable, intent(in) :: gtmp(:,:)
2761 : integer, intent(in) :: iatom
2762 :
2763 : !Local variables ------------------------------
2764 : character(len=500) :: message
2765 : integer :: ifreq, itau,iflavor1
2766 : integer :: tndim,iflavor,nflavor
2767 : character(len=2) :: gtau_iter,iatomnb
2768 : integer :: unt
2769 : ! ************************************************************************
2770 34 : tndim=2*paw_dmft%lpawu(iatom)+1
2771 34 : nflavor=2*(tndim)
2772 : !----------------------------------------
2773 : ! <DEBUG>
2774 : !----------------------------------------
2775 : ! Construct UNIT
2776 34 : if(paw_dmft%idmftloop < 10) then
2777 34 : write(gtau_iter,'("0",i1)') paw_dmft%idmftloop
2778 0 : elseif(paw_dmft%idmftloop >= 10 .and. paw_dmft%idmftloop < 100) then
2779 0 : write(gtau_iter,'(i2)') paw_dmft%idmftloop
2780 : else
2781 0 : gtau_iter="xx"
2782 : end if
2783 34 : if(iatom < 10) then
2784 34 : write(iatomnb,'("0",i1)') iatom
2785 0 : elseif(iatom >= 10 .and. iatom < 100) then
2786 0 : write(iatomnb,'(i2)') iatom
2787 : else
2788 0 : iatomnb='xx'
2789 : end if
2790 :
2791 34 : if(paw_dmft%myproc .eq. mod(paw_dmft%nproc+1,paw_dmft%nproc)) then
2792 : ! < HACK >
2793 19 : if(paw_dmft%dmft_solv==6.or.paw_dmft%dmft_solv==7) then
2794 0 : if (open_file(trim(paw_dmft%filapp)//"_atom_"//iatomnb//"_Gw_"//gtau_iter//".dat", message, newunit=unt) /=0) then
2795 0 : ABI_ERROR(message)
2796 : end if
2797 0 : do ifreq=1,paw_dmft%dmft_nwli
2798 0 : write(unt,'(29f21.14)') paw_dmft%omega_lo(ifreq),((gw_tmp_nd(ifreq,iflavor,iflavor)), iflavor=1, nflavor)
2799 : end do
2800 0 : close(unt)
2801 : else
2802 19 : if(paw_dmft%dmft_solv==5) then
2803 19 : if (open_file(trim(paw_dmft%filapp)//"_atom_"//iatomnb//"_Gtau_"//gtau_iter//".dat", message, newunit=unt) /= 0) then
2804 0 : ABI_ERROR(message)
2805 : end if
2806 2769 : do itau=1,paw_dmft%dmftqmc_l
2807 2750 : write(unt,'(29f21.14)') float(itau-1)/float(paw_dmft%dmftqmc_l)/paw_dmft%temp,&
2808 5519 : (gtmp(itau,iflavor), iflavor=1, nflavor)
2809 : end do
2810 213 : write(unt,'(29f21.14)') 1/paw_dmft%temp, (-1_dp-gtmp(1,iflavor), iflavor=1, nflavor)
2811 19 : close(unt)
2812 : endif
2813 : ! if(paw_dmft%dmft_solv==8 ) then
2814 : ! if (open_file(trim(paw_dmft%filapp)//"_atom_"//iatomnb//"_Gtau_offdiag_unsym_"//gtau_iter//".dat",&
2815 : !& message, newunit=unt) /= 0) then
2816 : ! ABI_ERROR(message)
2817 : ! end if
2818 : ! do itau=1,paw_dmft%dmftqmc_l
2819 : ! write(unt,'(196f21.14)') float(itau-1)/float(paw_dmft%dmftqmc_l)/paw_dmft%temp,&
2820 : ! ((gtmp_nd(itau,iflavor,iflavor1), iflavor=1, nflavor),iflavor1=1, nflavor)
2821 : ! end do
2822 : ! close(unt)
2823 : ! endif
2824 19 : if(paw_dmft%dmft_solv .eq. 8) then
2825 0 : if (open_file(trim(paw_dmft%filapp)//"_atom_"//iatomnb//"_Gtau_diag_CTQMC_"//gtau_iter//".dat",&
2826 : & message, newunit=unt) /= 0) then
2827 0 : ABI_ERROR(message)
2828 : end if
2829 0 : do itau=1,paw_dmft%dmftqmc_l
2830 0 : write(unt,'(196f21.14)') float(itau-1)/float(paw_dmft%dmftqmc_l)/paw_dmft%temp,&
2831 0 : & (gtmp_nd(itau,iflavor,iflavor), iflavor=1,nflavor)
2832 : end do
2833 0 : close(unt)
2834 0 : if (open_file(trim(paw_dmft%filapp)//"_atom_"//iatomnb//"_Gtau_full_CTQMC_"//gtau_iter//".dat",&
2835 : & message, newunit=unt) /= 0) then
2836 0 : ABI_ERROR(message)
2837 : end if
2838 0 : do itau=1, paw_dmft%dmftqmc_l
2839 0 : write(unt,'(392f21.14)') float(itau-1)/float(paw_dmft%dmftqmc_l)/paw_dmft%temp,&
2840 0 : & ((gtmp_nd(itau,iflavor,iflavor1),iflavor=1,nflavor), iflavor1=1, nflavor)
2841 : end do
2842 0 : close(unt)
2843 : endif
2844 : !complex solver
2845 19 : if(paw_dmft%dmft_solv .eq. 10) then
2846 0 : if (open_file(trim(paw_dmft%filapp)//"_atom_"//iatomnb//"_Gtau_diag_CTQMC_"//gtau_iter//".dat",&
2847 : & message, newunit=unt) /= 0) then
2848 0 : ABI_ERROR(message)
2849 : end if
2850 0 : do itau=1,paw_dmft%dmftqmc_l
2851 0 : write(unt,'(196f21.14)') float(itau-1)/float(paw_dmft%dmftqmc_l)/paw_dmft%temp,&
2852 0 : & (gtmp_ndc(itau,iflavor,iflavor), iflavor=1,nflavor)
2853 : end do
2854 0 : close(unt)
2855 0 : if (open_file(trim(paw_dmft%filapp)//"_atom_"//iatomnb//"_Gtau_full_CTQMC_"//gtau_iter//".dat",&
2856 : & message, newunit=unt) /= 0) then
2857 0 : ABI_ERROR(message)
2858 : end if
2859 0 : do itau=1, paw_dmft%dmftqmc_l
2860 0 : write(unt,'(2x,393(e18.10e3,2x))') float(itau-1)/float(paw_dmft%dmftqmc_l)/paw_dmft%temp,&
2861 0 : & ((dble(gtmp_ndc(itau,iflavor,iflavor1)),aimag(gtmp_ndc(itau,iflavor,iflavor1)),iflavor=1,nflavor), iflavor1=1, nflavor)
2862 : end do
2863 0 : close(unt)
2864 : endif
2865 : ! if(paw_dmft%natom==1) then ! If natom>1, it should be moved outside the loop over atoms
2866 : ! ABI_MALLOC(matlu1,(paw_dmft%natom))
2867 : ! call init_matlu(paw_dmft%natom,paw_dmft%nspinor,paw_dmft%nsppol,paw_dmft%lpawu,matlu1)
2868 : ! do itau=1,paw_dmft%dmftqmc_l
2869 : ! do isppol=1,paw_dmft%nsppol
2870 : ! do ispinor1=1,paw_dmft%nspinor
2871 : ! do im1=1,tndim
2872 : ! iflavor1=im1+tndim*(ispinor1-1)+tndim*(isppol-1)
2873 : ! do ispinor2=1,paw_dmft%nspinor
2874 : ! do im2=1,tndim
2875 : ! iflavor2=im2+tndim*(ispinor2-1)+tndim*(isppol-1)
2876 : ! matlu1(iatom)%mat(im1,im2,isppol,ispinor1,ispinor2)=&
2877 : !& gtmp_nd(itau,iflavor1,iflavor2)
2878 : ! end do ! im2
2879 : ! end do ! ispinor2
2880 : ! end do ! im1
2881 : ! end do ! ispinor
2882 : ! end do ! isppol
2883 : ! call rotate_matlu(matlu1,eigvectmatlu,paw_dmft%natom,3,0)
2884 : ! call slm2ylm_matlu(matlu1,paw_dmft%natom,2,0)
2885 : ! call sym_matlu(cryst_struc,matlu1,pawang,paw_dmft)
2886 : ! call slm2ylm_matlu(matlu1,paw_dmft%natom,1,0)
2887 : ! call rotate_matlu(matlu1,eigvectmatlu,paw_dmft%natom,3,1)
2888 : ! do isppol=1,paw_dmft%nsppol
2889 : ! do ispinor1=1,paw_dmft%nspinor
2890 : ! do im1=1,tndim
2891 : ! iflavor1=im1+tndim*(ispinor1-1)+tndim*(isppol-1)
2892 : ! do ispinor2=1,paw_dmft%nspinor
2893 : ! do im2=1,tndim
2894 : ! iflavor2=im2+tndim*(ispinor2-1)+tndim*(isppol-1)
2895 : ! gtmp_nd(itau,iflavor1,iflavor2)=&
2896 : ! matlu1(iatom)%mat(im1,im2,isppol,ispinor1,ispinor2)
2897 : ! end do ! im2
2898 : ! end do ! ispinor2
2899 : ! end do ! im1
2900 : ! end do ! ispinor
2901 : ! end do ! isppol
2902 : ! end do !itau
2903 : ! call destroy_matlu(matlu1,paw_dmft%natom)
2904 : ! ABI_FREE(matlu1)
2905 : ! endif ! if natom=1
2906 : ! if (open_file(trim(paw_dmft%filapp)//"_atom_"//iatomnb//"_Gtau_offdiag_"//gtau_iter//".dat",&
2907 : !& message, newunit=unt) /= 0) then
2908 : ! ABI_ERROR(message)
2909 : ! end if
2910 : ! do itau=1,paw_dmft%dmftqmc_l
2911 : ! write(unt,'(196f21.14)') float(itau-1)/float(paw_dmft%dmftqmc_l)/paw_dmft%temp,&
2912 : ! ((gtmp_nd(itau,iflavor,iflavor1), iflavor=1, nflavor),iflavor1=1, nflavor)
2913 : ! end do
2914 : ! close(unt)
2915 : ! endif
2916 : !open(unit=4243, file=trim(paw_dmft%filapp)//"_atom_"//iatomnb//"_F_"//gtau_iter//".dat")
2917 : !call BathOperator_printF(paw_dmft%hybrid(iatom)%hybrid%bath,4243) !Already comment here
2918 : !close(4243)
2919 19 : if(paw_dmft%dmft_solv==5) then
2920 19 : if (open_file(trim(paw_dmft%filapp)//"_atom_"//iatomnb//"_Gw_"//gtau_iter//".dat", message, newunit=unt) /= 0) then
2921 0 : ABI_ERROR(message)
2922 : end if
2923 6275 : do ifreq=1,paw_dmft%dmft_nwlo
2924 6256 : write(unt,'(29f21.14)') paw_dmft%omega_lo(ifreq), &
2925 12531 : & (gw_tmp(ifreq,iflavor), iflavor=1, nflavor)
2926 : end do
2927 : endif
2928 19 : close(unt)
2929 :
2930 19 : if(paw_dmft%dmft_solv==8 .or. paw_dmft%dmft_solv==10) then
2931 0 : if (open_file(trim(paw_dmft%filapp)//"_atom_"//iatomnb//"_Gw_diag_"//gtau_iter//".dat", message, newunit=unt) /= 0) then
2932 0 : ABI_ERROR(message)
2933 : end if
2934 0 : do ifreq=1,paw_dmft%dmft_nwlo
2935 0 : write(unt,'(29f21.14)') paw_dmft%omega_lo(ifreq), &
2936 0 : & (gw_tmp_nd(ifreq,iflavor,iflavor), iflavor=1, nflavor)
2937 : end do
2938 : endif
2939 19 : close(unt)
2940 :
2941 19 : if(paw_dmft%dmft_solv==8 .or. paw_dmft%dmft_solv==10) then
2942 0 : if (open_file(trim(paw_dmft%filapp)//"_atom_"//iatomnb//"_Gw_Offdiag_"//gtau_iter//".dat", message, newunit=unt) /= 0) then
2943 0 : ABI_ERROR(message)
2944 : end if
2945 0 : do ifreq=1,paw_dmft%dmft_nwlo
2946 0 : write(unt,'(296f21.14)') paw_dmft%omega_lo(ifreq), &
2947 0 : & ((gw_tmp_nd(ifreq,iflavor,iflavor1), iflavor=iflavor1, nflavor),iflavor1=1, nflavor)
2948 : end do
2949 : endif
2950 19 : close(unt)
2951 :
2952 : end if
2953 : ! </ HACK >
2954 : end if
2955 :
2956 :
2957 34 : end subroutine ctqmcoutput_printgreen
2958 : !!***
2959 :
2960 : !!****f* m_forctqmc/ctqmc_calltriqs
2961 : !! NAME
2962 : !! ctqmc_calltriqs
2963 : !!
2964 : !! FUNCTION
2965 : !! Call TRIQS solver and perform calculation of Green's function using
2966 : !! Legendre coefficients.
2967 : !!
2968 : !! INPUTS
2969 : !! paw_dmft <type(paw_dmft_type)>= DMFT data structure
2970 : !! cryst_struc <type(crystal_t)>=crystal structure data
2971 : !! hu <type(hu_type)>= U interaction
2972 : !! levels_ctqmc(nflavor) = atomic levels
2973 : !! gw_tmp_nd(nb_of_frequency,nflavor,nflavor) = Green's fct in imag freq (with off diag terms)
2974 : !! gtmp_nd(dmftqmc_l,nflavor,nflavor) = Green's fct in imag time (with off diag terms)
2975 : !! fw1_nd(dmft_nwlo,nflavor,nflavor) = Hybridization fct in imag time (with off diag terms)
2976 : !! leg_measure = logical, true is legendre measurement is activated
2977 : !! iatom= index of atom
2978 : !!
2979 : !! OUTPUT
2980 : !!
2981 : !!
2982 : !! SIDE EFFECTS
2983 : !!
2984 : !! NOTES
2985 : !!
2986 : !! SOURCE
2987 :
2988 0 : subroutine ctqmc_calltriqs(paw_dmft,cryst_struc,hu,levels_ctqmc,gtmp_nd,gw_tmp_nd,fw1_nd,leg_measure,iatom)
2989 :
2990 : #if defined HAVE_TRIQS_v3_2 || defined HAVE_TRIQS_v2_0 || defined HAVE_TRIQS_v1_4
2991 : use TRIQS_CTQMC !Triqs module
2992 : #endif
2993 : #if defined HAVE_PYTHON_INVOCATION
2994 : use m_invoke_python
2995 : #endif
2996 : use, intrinsic :: iso_c_binding
2997 :
2998 : !Arguments ------------------------------------
2999 : !scalars
3000 : type(paw_dmft_type), intent(in) :: paw_dmft
3001 : type(crystal_t),intent(in) :: cryst_struc
3002 : type(hu_type), intent(in) :: hu(cryst_struc%ntypat)
3003 : real(dp), allocatable, target, intent(inout) :: gtmp_nd(:,:,:)
3004 : complex(dp), allocatable, target, intent(inout) :: gw_tmp_nd(:,:,:)
3005 : complex(dp), allocatable, target, intent(in) :: fw1_nd(:,:,:)
3006 : real(dp), allocatable, target, intent(inout) :: levels_ctqmc(:)
3007 : logical(kind=1), intent(in) :: leg_measure
3008 : integer, intent(in) :: iatom
3009 :
3010 : !Local variables ------------------------------
3011 0 : complex(dp), allocatable, target ::fw1_nd_tmp(:,:,:)
3012 0 : complex(dp), allocatable, target :: g_iw(:,:,:)
3013 0 : real(dp), allocatable, target :: u_mat_ij(:,:)
3014 0 : real(dp), allocatable, target :: u_mat_ijkl(:,:,:,:)
3015 0 : real(dp), allocatable, target :: u_mat_ijkl_tmp(:,:,:,:)
3016 0 : real(dp), allocatable, target :: gl_nd(:,:,:)
3017 : type(c_ptr) :: levels_ptr, fw1_nd_ptr, u_mat_ij_ptr, u_mat_ijkl_ptr, g_iw_ptr, gtau_ptr, gl_ptr
3018 0 : real(dp), allocatable :: jbes(:)
3019 : character(len=500) :: message
3020 : integer :: ifreq, iflavor1
3021 : integer :: iflavor2,iflavor,nflavor,iflavor3,itypat
3022 : integer :: nfreq,ntau,nleg,ileg
3023 : integer :: verbosity_solver ! min 0 -> max 3
3024 : logical(kind=1) :: rot_inv = .false.
3025 : #if defined HAVE_TRIQS_v2_0 || defined HAVE_TRIQS_v1_4 || defined HAVE_PYTHON_INVOCATION
3026 : logical(kind=1) :: hist = .false.
3027 : logical(kind=1) :: wrt_files = .true.
3028 : logical(kind=1) :: tot_not = .true.
3029 : #endif
3030 : real(dp) :: beta,besp,bespp,xx
3031 : complex(dp) :: u_nl
3032 :
3033 : #if defined HAVE_PYTHON_INVOCATION
3034 : !----------
3035 : !Variables for writing out the NETCDF file when calling PYTHON_INVOCATION
3036 : !----------
3037 : integer(kind=4) :: ncid
3038 : integer(kind=4) :: dim_one_id, dim_nflavor_id, dim_nwlo_id, dim_nwli_id
3039 : integer(kind=4) :: dim_qmc_l_id, dim_nleg_id
3040 : integer(kind=4), dimension(2) :: dim_u_mat_ij_id
3041 : integer(kind=4), dimension(3) :: dim_fw1_id, dim_g_iw_id, dim_gl_id, dim_gtau_id
3042 : integer(kind=4), dimension(4) :: dim_u_mat_ijkl_id
3043 : integer(kind=4) :: var_rot_inv_id, var_leg_measure_id, var_hist_id, var_wrt_files_id
3044 : integer(kind=4) :: var_tot_not_id, var_n_orbitals_id, var_n_freq_id, var_n_tau_id, var_n_l_id, var_n_cycles_id
3045 : integer(kind=4) :: var_cycle_length_id, var_ntherm_id, var_verbo_id, var_seed_id, var_beta_id
3046 : integer(kind=4) :: var_levels_id, var_u_mat_ij_id, var_u_mat_ijkl_id, var_real_fw1_nd_id, var_imag_fw1_nd_id
3047 : integer(kind=4) :: var_real_g_iw_id, var_imag_g_iw_id, var_gtau_id, var_gl_id, var_spacecomm_id
3048 :
3049 : integer :: itau
3050 :
3051 : integer(kind=4) :: varid
3052 : logical :: file_exists
3053 : complex :: i
3054 : character(len=100) :: filename
3055 :
3056 : real(dp), allocatable, target :: new_re_g_iw(:,:,:), new_im_g_iw(:,:,:)
3057 : real(dp), allocatable, target :: new_g_tau(:,:,:), new_gl(:,:,:)
3058 : !----------
3059 : #endif
3060 : ! ************************************************************************
3061 :
3062 : ! fw1_nd: Hybridation
3063 : ! levels_ctqmc: niveaux
3064 : ! hu(itypat)%udens(:,:) : U_ij
3065 : ! hu(itypat)%u(:,:,:,:) : uijkl
3066 : ! temperature : paw_dmft%temp
3067 : ! paw_dmft%dmftqmc_l: nombre de points en temps -1
3068 : ! paw_dmft%dmftqmc_n: nombre de cycles
3069 : ! ?? Quelles sorties: Les fonctions de Green
3070 : ! frequence/temps/Legendre.
3071 : ! Double occupations ?? <n_i n_j>
3072 : ! test n_tau > 2*nfreq => ntau = 2*nfreq + 1
3073 : ! for non diagonal code:
3074 : ! call CtqmcInterface_run(hybrid,fw1_nd(1:paw_dmft%dmftqmc_l,:,:),Gtau=gtmp_nd,&
3075 : !& Gw=gw_tmp_nd,D=Doccsum,E=green%ecorr_qmc(iatom),&
3076 : !& Noise=Noise,matU=hu(itypat)%udens,opt_levels=levels_ctqmc,hybri_limit=hybri_limit)
3077 : !Check choice of user to fix model bool var for the solver
3078 0 : if (paw_dmft%dmft_solv==6) then
3079 0 : rot_inv = .false.
3080 : else !obviously paw_dmft%dmft_solv==7 with rot invariant terms
3081 0 : rot_inv = .true.
3082 : end if
3083 :
3084 0 : nfreq = paw_dmft%dmft_nwli
3085 : !paw_dmft%dmft_nwlo = paw_dmft%dmft_nwli !transparent for user
3086 0 : ntau = paw_dmft%dmftqmc_l !(2*paw_dmft%dmftqmc_l)+1 !nfreq=paw_dmft%dmft_nwli
3087 0 : nleg = paw_dmft%dmft_triqs_nleg
3088 0 : nflavor=2*(2*paw_dmft%lpawu(iatom)+1)
3089 0 : itypat=cryst_struc%typat(iatom)
3090 :
3091 :
3092 0 : verbosity_solver = paw_dmft%prtvol
3093 0 : beta = 1.0/(paw_dmft%temp*Ha_eV)
3094 :
3095 : !Allocation in/output array phase:
3096 0 : ABI_MALLOC(fw1_nd_tmp,(1:nflavor,1:nflavor,1:nfreq)) !column major
3097 0 : ABI_MALLOC(g_iw,(1:nflavor,1:nflavor,1:nfreq)) !column major
3098 0 : ABI_MALLOC(u_mat_ij,(1:nflavor,1:nflavor)) !column major
3099 0 : ABI_MALLOC(u_mat_ijkl,(1:nflavor,1:nflavor,1:nflavor,1:nflavor)) !column major
3100 0 : ABI_MALLOC(u_mat_ijkl_tmp,(1:nflavor,1:nflavor,1:nflavor,1:nflavor)) !column major
3101 :
3102 0 : if ( leg_measure ) then !only if functionality is enabled
3103 0 : ABI_MALLOC(gl_nd,(1:nleg,1:nflavor,1:nflavor)) !column major !nl = 30 by default
3104 : end if
3105 :
3106 : !Conversion datas Ha -> eV (some duplications for test...)
3107 : !fw1_nd_tmp = fw1_nd(1:paw_dmft%dmftqmc_l,:,:) * Ha_eV !fw1_nd = fw1_nd * Ha_eV !Ok?
3108 :
3109 0 : do iflavor=1,nflavor
3110 0 : do iflavor1=1,nflavor
3111 0 : do ifreq=1,nfreq
3112 0 : fw1_nd_tmp(iflavor,iflavor1,ifreq) = fw1_nd(ifreq,iflavor,iflavor1) * Ha_eV
3113 : ! WRITE(500,*) "[IN Fortran] F[ w= ",ifreq," l= ",iflavor," l_= ",iflavor1,"] = ",fw1_nd(ifreq,iflavor,iflavor1)
3114 : end do
3115 : end do
3116 : end do
3117 :
3118 : !Report test
3119 : ! WRITE(502,*) hu(itypat)%udens
3120 : ! do ifreq=1,paw_dmft%dmftqmc_l
3121 : ! write(501,*) ((fw1_nd(ifreq,iflavor,iflavor1),iflavor=1,nflavor),iflavor1=1,nflavor)
3122 : ! enddo
3123 : !write(866,*)paw_dmft%dmft_nwlo,paw_dmft%dmftqmc_l
3124 : !write(866,*) u_mat_ij
3125 : ! do iflavor=1,nflavor+1
3126 : ! do iflavor1=1,nflavor+1
3127 : ! WRITE(502,*) "[OUT Fortran] U(i,j)[ l= ",iflavor," l_= ",iflavor1,"] = ",hu(itypat)%udens(iflavor,iflavor1)
3128 : ! enddo
3129 : ! enddo
3130 :
3131 : ! if(paw_dmft%myproc==0) then
3132 : ! do iflavor=1,nflavor
3133 : ! do iflavor1=1,nflavor
3134 : ! do iflavor2=1,nflavor
3135 : ! do iflavor3=1,nflavor
3136 : ! write(490,*), hu(itypat)%vee(iflavor,iflavor1,iflavor2,iflavor3)
3137 : ! enddo
3138 : ! enddo
3139 : ! enddo
3140 : ! enddo
3141 : ! endif
3142 :
3143 : ! if(paw_dmft%myproc==0) then
3144 : ! do iflavor=1,nflavor
3145 : ! do iflavor1=1,nflavor
3146 : ! write(491,*), hu(itypat)%udens(iflavor,iflavor1) !(1,1,1,1)
3147 : ! enddo
3148 : ! enddo
3149 : ! endif
3150 :
3151 : ! do iflavor=1,nflavor
3152 : ! do iflavor1=1,nflavor
3153 : ! do iflavor2=1,nflavor
3154 : ! do iflavor3=1,nflavor
3155 : ! WRITE(552,*), hu(itypat)%vee!(iflavor,iflavor1,iflavor2,iflavor3)
3156 : ! enddo
3157 : ! enddo
3158 : ! enddo
3159 : ! enddo
3160 :
3161 0 : call vee_ndim2tndim_hu_r(paw_dmft%lpawu(iatom),dble(hu(itypat)%vee),u_mat_ijkl_tmp,1)
3162 0 : do iflavor=1,nflavor
3163 0 : do iflavor1=1,nflavor
3164 0 : do iflavor2=1,nflavor
3165 0 : do iflavor3=1,nflavor
3166 0 : u_mat_ijkl(iflavor,iflavor1,iflavor2,iflavor3) = Ha_eV * u_mat_ijkl_tmp(iflavor,iflavor1,iflavor2,iflavor3)
3167 : end do
3168 : end do
3169 : end do
3170 : end do
3171 :
3172 : !u_mat_ijkl = Ha_eV * reshape( u_mat_ijkl , [nflavor,nflavor,nflavor,nflavor] ) !column -> row major + conversion
3173 0 : u_mat_ij = transpose( dble(hu(itypat)%udens) ) * Ha_eV !column -> row major + conversion
3174 0 : levels_ctqmc = levels_ctqmc * Ha_eV
3175 :
3176 : !Location array in memory for C++ pointer args to pass
3177 : !----------------------------------------------------
3178 0 : g_iw_ptr = C_LOC( gw_tmp_nd ) !C_LOC( g_iw )
3179 0 : gtau_ptr = C_LOC( gtmp_nd ) !C_LOC( gtau )
3180 0 : gl_ptr = C_LOC( gl_nd )
3181 0 : fw1_nd_ptr = C_LOC( fw1_nd_tmp )
3182 0 : u_mat_ij_ptr = C_LOC( u_mat_ij )
3183 0 : u_mat_ijkl_ptr = C_LOC( u_mat_ijkl )
3184 0 : levels_ptr = C_LOC( levels_ctqmc )
3185 :
3186 : !Calling interfaced TRIQS solver subroutine from src/67_triqs_ext package
3187 0 : if (paw_dmft%dmft_solv==9) then
3188 : #ifndef HAVE_PYTHON_INVOCATION
3189 0 : write(message,'(23a)') ch10,' Python invocation flag requiered! You need to install ABINIT with ',&
3190 0 : 'enable_python_invocation = yes" in your "configure.ac" file.'
3191 0 : call wrtout(std_out,message,'COLL')
3192 0 : ABI_ERROR(message)
3193 : #else
3194 : ! Creating the NETCDF file
3195 : ! write(std_out, "(a)") trim(paw_dmft%filapp)
3196 : write(filename, '(a, a)') trim(paw_dmft%filnamei), "_abinit_output_for_py.nc"
3197 : write(std_out, '(3a)') ch10, " Creating NETCDF file: ", trim(filename)
3198 : NCF_CHECK(nf90_create(filename, NF90_CLOBBER, ncid))
3199 :
3200 : ! Defining the dimensions of the variables to write in the NETCDF file
3201 : NCF_CHECK(nf90_def_dim(ncid, "one", 1, dim_one_id))
3202 : NCF_CHECK(nf90_def_dim(ncid, "nflavor", nflavor, dim_nflavor_id))
3203 : NCF_CHECK(nf90_def_dim(ncid, "nwlo", paw_dmft%dmft_nwlo, dim_nwlo_id))
3204 : NCF_CHECK(nf90_def_dim(ncid, "nwli", paw_dmft%dmft_nwli, dim_nwli_id))
3205 : NCF_CHECK(nf90_def_dim(ncid, "qmc_l", paw_dmft%dmftqmc_l, dim_qmc_l_id))
3206 : NCF_CHECK(nf90_def_dim(ncid, "nleg", nleg, dim_nleg_id))
3207 :
3208 : dim_u_mat_ij_id = (/ dim_nflavor_id, dim_nflavor_id /)
3209 : dim_u_mat_ijkl_id = (/ dim_nflavor_id, dim_nflavor_id, dim_nflavor_id, dim_nflavor_id /)
3210 : dim_fw1_id = (/ dim_nflavor_id, dim_nflavor_id, dim_nwli_id /)
3211 : dim_g_iw_id = (/ dim_nwli_id, dim_nflavor_id, dim_nflavor_id /)
3212 : dim_gtau_id = (/ dim_qmc_l_id, dim_nflavor_id, dim_nflavor_id /)
3213 : dim_gl_id = (/ dim_nleg_id, dim_nflavor_id, dim_nflavor_id /)
3214 :
3215 : ! Defining the variables
3216 : NCF_CHECK(nf90_def_var(ncid, "rot_inv", NF90_INT, dim_one_id, var_rot_inv_id))
3217 : NCF_CHECK(nf90_def_var(ncid, "leg_measure", NF90_INT, dim_one_id, var_leg_measure_id))
3218 : NCF_CHECK(nf90_def_var(ncid, "hist", NF90_INT, dim_one_id, var_hist_id))
3219 : NCF_CHECK(nf90_def_var(ncid, "wrt_files", NF90_INT, dim_one_id, var_wrt_files_id))
3220 : NCF_CHECK(nf90_def_var(ncid, "tot_not", NF90_INT, dim_one_id, var_tot_not_id))
3221 : NCF_CHECK(nf90_def_var(ncid, "n_orbitals", NF90_INT, dim_one_id, var_n_orbitals_id))
3222 : NCF_CHECK(nf90_def_var(ncid, "n_freq", NF90_INT, dim_one_id, var_n_freq_id))
3223 : NCF_CHECK(nf90_def_var(ncid, "n_tau", NF90_INT, dim_one_id, var_n_tau_id))
3224 : NCF_CHECK(nf90_def_var(ncid, "n_l", NF90_INT, dim_one_id, var_n_l_id))
3225 : NCF_CHECK(nf90_def_var(ncid, "n_cycles", NF90_INT, dim_one_id, var_n_cycles_id))
3226 : NCF_CHECK(nf90_def_var(ncid, "cycle_length", NF90_INT, dim_one_id, var_cycle_length_id))
3227 : NCF_CHECK(nf90_def_var(ncid, "ntherm", NF90_INT, dim_one_id, var_ntherm_id))
3228 : NCF_CHECK(nf90_def_var(ncid, "verbo", NF90_INT, dim_one_id, var_verbo_id))
3229 : NCF_CHECK(nf90_def_var(ncid, "seed", NF90_INT, dim_one_id, var_seed_id))
3230 : NCF_CHECK(nf90_def_var(ncid, "beta", NF90_FLOAT, dim_one_id, var_beta_id))
3231 : NCF_CHECK(nf90_def_var(ncid, "levels", NF90_DOUBLE, dim_nflavor_id, var_levels_id))
3232 : NCF_CHECK(nf90_def_var(ncid, "u_mat_ij", NF90_DOUBLE, dim_u_mat_ij_id, var_u_mat_ij_id))
3233 : NCF_CHECK(nf90_def_var(ncid, "u_mat_ijkl", NF90_DOUBLE, dim_u_mat_ijkl_id, var_u_mat_ijkl_id))
3234 : NCF_CHECK(nf90_def_var(ncid, "real_fw1_nd", NF90_DOUBLE, dim_fw1_id, var_real_fw1_nd_id))
3235 : NCF_CHECK(nf90_def_var(ncid, "imag_fw1_nd", NF90_DOUBLE, dim_fw1_id, var_imag_fw1_nd_id))
3236 : NCF_CHECK(nf90_def_var(ncid, "real_g_iw", NF90_DOUBLE, dim_g_iw_id, var_real_g_iw_id))
3237 : NCF_CHECK(nf90_def_var(ncid, "imag_g_iw", NF90_DOUBLE, dim_g_iw_id, var_imag_g_iw_id))
3238 : NCF_CHECK(nf90_def_var(ncid, "gtau", NF90_DOUBLE, dim_gtau_id, var_gtau_id))
3239 : NCF_CHECK(nf90_def_var(ncid, "gl", NF90_DOUBLE, dim_gl_id, var_gl_id))
3240 : NCF_CHECK(nf90_def_var(ncid, "spacecomm", NF90_INT, dim_one_id, var_spacecomm_id))
3241 : NCF_CHECK(nf90_enddef(ncid))
3242 :
3243 : ! Filling the variables with actual data
3244 : if (rot_inv) then
3245 : NCF_CHECK(nf90_put_var(ncid, var_rot_inv_id, 1))
3246 : else
3247 : NCF_CHECK(nf90_put_var(ncid, var_rot_inv_id, 0))
3248 : end if
3249 : if (leg_measure) then
3250 : NCF_CHECK(nf90_put_var(ncid, var_leg_measure_id, 1))
3251 : else
3252 : NCF_CHECK(nf90_put_var(ncid, var_leg_measure_id, 0))
3253 : end if
3254 : if (hist) then
3255 : NCF_CHECK(nf90_put_var(ncid, var_hist_id, 1))
3256 : else
3257 : NCF_CHECK(nf90_put_var(ncid, var_hist_id, 0))
3258 : end if
3259 : if (wrt_files) then
3260 : NCF_CHECK(nf90_put_var(ncid, var_wrt_files_id, 1))
3261 : else
3262 : NCF_CHECK(nf90_put_var(ncid, var_wrt_files_id, 0))
3263 : end if
3264 : if (tot_not) then
3265 : NCF_CHECK(nf90_put_var(ncid, var_tot_not_id, 1))
3266 : else
3267 : NCF_CHECK(nf90_put_var(ncid, var_tot_not_id, 0))
3268 : end if
3269 : NCF_CHECK(nf90_put_var(ncid, var_n_orbitals_id, nflavor))
3270 : NCF_CHECK(nf90_put_var(ncid, var_n_freq_id, nfreq))
3271 : NCF_CHECK(nf90_put_var(ncid, var_n_tau_id, ntau))
3272 : NCF_CHECK(nf90_put_var(ncid, var_n_l_id, nleg))
3273 : NCF_CHECK(nf90_put_var(ncid, var_n_cycles_id, int(paw_dmft%dmftqmc_n/paw_dmft%nproc)))
3274 : NCF_CHECK(nf90_put_var(ncid, var_cycle_length_id, paw_dmft%dmftctqmc_meas*2*2*nflavor))
3275 : NCF_CHECK(nf90_put_var(ncid, var_ntherm_id, paw_dmft%dmftqmc_therm))
3276 : NCF_CHECK(nf90_put_var(ncid, var_verbo_id, verbosity_solver))
3277 : NCF_CHECK(nf90_put_var(ncid, var_seed_id, paw_dmft%dmftqmc_seed))
3278 : NCF_CHECK(nf90_put_var(ncid, var_beta_id, beta))
3279 : NCF_CHECK(nf90_put_var(ncid, var_levels_id, levels_ctqmc))
3280 : NCF_CHECK(nf90_put_var(ncid, var_u_mat_ij_id, u_mat_ij))
3281 : NCF_CHECK(nf90_put_var(ncid, var_u_mat_ijkl_id, u_mat_ijkl))
3282 : NCF_CHECK(nf90_put_var(ncid, var_real_fw1_nd_id, real(fw1_nd_tmp)))
3283 : NCF_CHECK(nf90_put_var(ncid, var_imag_fw1_nd_id, aimag(fw1_nd_tmp)))
3284 : NCF_CHECK(nf90_put_var(ncid, var_real_g_iw_id, real(gw_tmp_nd)))
3285 : NCF_CHECK(nf90_put_var(ncid, var_imag_g_iw_id, aimag(gw_tmp_nd)))
3286 : NCF_CHECK(nf90_put_var(ncid, var_gtau_id, gtmp_nd))
3287 : NCF_CHECK(nf90_put_var(ncid, var_gl_id, gl_nd))
3288 : NCF_CHECK(nf90_put_var(ncid, var_spacecomm_id, paw_dmft%spacecomm))
3289 : NCF_CHECK(nf90_close(ncid))
3290 :
3291 : write(std_out, '(4a)') ch10, " NETCDF file ", trim(filename), " written; Launching python invocation"
3292 :
3293 : ! Invoking python to execute the script
3294 : call invoke_python_run_script (0, paw_dmft%myproc, trim(paw_dmft%filnamei), paw_dmft%spacecomm)
3295 : ! call Invoke_python_triqs (paw_dmft%myproc, trim(paw_dmft%filnamei)//c_null_char)
3296 : call xmpi_barrier(paw_dmft%spacecomm)
3297 : call flush_unit(std_out)
3298 :
3299 : ! Allocating the fortran variables for the results
3300 : ABI_MALLOC(new_re_g_iw,(nflavor,nflavor, paw_dmft%dmft_nwli))
3301 : ABI_MALLOC(new_im_g_iw,(nflavor,nflavor, paw_dmft%dmft_nwli))
3302 : ABI_MALLOC(new_g_tau,(nflavor,nflavor, paw_dmft%dmftqmc_l))
3303 : ABI_MALLOC(new_gl,(nflavor,nflavor, nleg))
3304 : i = (0, 1)
3305 :
3306 : ! Check if file exists
3307 : write(filename, '(a, a)') trim(paw_dmft%filnamei), "_py_output_for_abinit.nc"
3308 :
3309 : INQUIRE(FILE=filename, EXIST=file_exists)
3310 : if(.not. file_exists) then
3311 : write(message,'(4a)') ch10,' Cannot find file ', trim(filename), '! Make sure the python script writes it with the right name and at the right place!'
3312 : call wrtout(std_out,message,'COLL')
3313 : ABI_ERROR(message)
3314 : endif
3315 :
3316 : write(std_out, '(3a)') ch10, " Reading NETCDF file ", trim(filename)
3317 :
3318 : ! Opening the NETCDF file
3319 : NCF_CHECK(nf90_open(filename, nf90_nowrite, ncid))
3320 :
3321 : ! Read from the file
3322 : ! Re{G_iw}
3323 : write(std_out, '(2a)') ch10, " -- Re[G(iw_n)]"
3324 : NCF_CHECK(nf90_inq_varid(ncid, "re_g_iw", varid))
3325 : NCF_CHECK(nf90_get_var(ncid, varid, new_re_g_iw))
3326 : ! Im{G_iw}
3327 : write(std_out, '(2a)') ch10, " -- Im[G(iw_n)]"
3328 : NCF_CHECK(nf90_inq_varid(ncid, "im_g_iw", varid))
3329 : NCF_CHECK(nf90_get_var(ncid, varid, new_im_g_iw))
3330 : ! G_tau
3331 : write(std_out, '(2a)') ch10, " -- G(tau)"
3332 : NCF_CHECK(nf90_inq_varid(ncid, "g_tau", varid))
3333 : NCF_CHECK(nf90_get_var(ncid, varid, new_g_tau))
3334 : ! G_l
3335 : write(std_out, '(2a)') ch10, " -- G_l"
3336 : NCF_CHECK(nf90_inq_varid(ncid, "gl", varid))
3337 : NCF_CHECK(nf90_get_var(ncid, varid, new_gl))
3338 :
3339 : ! Assigning data
3340 : do iflavor1=1, nflavor
3341 : do iflavor2=1, nflavor
3342 : do ifreq=1, paw_dmft%dmft_nwli
3343 : gw_tmp_nd(ifreq, iflavor1, iflavor2) = new_re_g_iw(iflavor1, iflavor2, ifreq) &
3344 : & + i*new_im_g_iw(iflavor1, iflavor2, ifreq)
3345 : end do
3346 : do itau=1, paw_dmft%dmftqmc_l
3347 : gtmp_nd(itau, iflavor1, iflavor2) = new_g_tau(iflavor1, iflavor2, itau)
3348 : end do
3349 : do ileg=1, nleg
3350 : gl_nd(ileg, iflavor1, iflavor2) = new_gl(iflavor1, iflavor2, ileg)
3351 : end do
3352 : end do
3353 : end do
3354 :
3355 : ! Deallocating
3356 : ABI_FREE(new_re_g_iw)
3357 : ABI_FREE(new_im_g_iw)
3358 : ABI_FREE(new_g_tau)
3359 : ABI_FREE(new_gl)
3360 : #endif
3361 : elseif(paw_dmft%dmft_solv == 6 .or. paw_dmft%dmft_solv == 7) then
3362 : !Calling interfaced TRIQS solver subroutine from src/01_triqs_ext package
3363 : !----------------------------------------------------
3364 : #if defined HAVE_TRIQS_v2_0 || defined HAVE_TRIQS_v1_4
3365 : call Ctqmc_triqs_run ( rot_inv, leg_measure, hist, wrt_files, tot_not, &
3366 : & nflavor, nfreq, ntau , nleg, int(paw_dmft%dmftqmc_n/paw_dmft%nproc), &
3367 : & paw_dmft%dmftctqmc_meas*2*2*nflavor, paw_dmft%dmftqmc_therm, &
3368 : & verbosity_solver, paw_dmft%dmftqmc_seed,beta, &
3369 : & levels_ptr, u_mat_ij_ptr, u_mat_ijkl_ptr, fw1_nd_ptr, &
3370 : !& g_iw_ptr, gtau_ptr, gl_ptr, paw_dmft%spacecomm )
3371 : & g_iw_ptr, gtau_ptr, gl_ptr, paw_dmft%myproc )
3372 : #endif
3373 : endif
3374 :
3375 : !WRITE(*,*) "Hello Debug"
3376 : !call xmpi_barrier(paw_dmft%spacecomm) !Resynch all processus after calling Impurity solver from TRIQS
3377 :
3378 : !Report output datas from TRIQS to Abinit
3379 : !Interacting G(iw)
3380 : ! OG Commented these loops because they are useless
3381 : !do ifreq=1,nfreq
3382 : ! do iflavor1=1,nflavor
3383 : ! do iflavor=1,nflavor
3384 : ! ! gw_tmp_nd(ifreq,iflavor,iflavor1) = g_iw(iflavor,iflavor1,ifreq) !* Ha_eV !because 1/ G0(eV)
3385 : ! ! WRITE(503,*) "[OUT Fortran] G(iw)[ w= ",ifreq," l= ",iflavor," l_= ",iflavor1,"] = ",gw_tmp_nd(ifreq,iflavor,iflavor1)!g_iw(iflavor,iflavor1,ifreq)
3386 : ! end do
3387 : ! end do
3388 : !end do
3389 :
3390 : ! Convert in Ha
3391 0 : gw_tmp_nd = gw_tmp_nd*Ha_eV
3392 :
3393 : ! do iflavor1=1,nflavor
3394 : ! do iflavor=1,nflavor
3395 : !
3396 : ! WRITE(510,*) "[OUT Fortran] U[ l= ",iflavor," l_= ",iflavor1,"] = ",u_mat_ij(iflavor,iflavor1)
3397 : ! enddo
3398 : ! enddo
3399 :
3400 : ! if(paw_dmft%myproc==0) write(6,*) "essai",paw_dmft%myproc, gw_tmp_nd(2,1,1)
3401 : ! if(paw_dmft%myproc==1) write(6,*) "essai",paw_dmft%myproc,gw_tmp_nd(2,1,1)
3402 : ! if(paw_dmft%myproc==0) write(621,*) "essai",paw_dmft%myproc, gw_tmp_nd(2,1,1)
3403 : ! if(paw_dmft%myproc==1) write(622,*) "essai",paw_dmft%myproc,gw_tmp_nd(2,1,1)
3404 : ! call flush_unit(621)
3405 : ! call flush_unit(622)
3406 : ! write(message,*) ch10, "essai",paw_dmft%myproc, paw_dmft%myproc,paw_dmft%dmftqmc_seed!gw_tmp_nd(2,1,1)
3407 : ! call wrtout(555,message,'PERS',.true.)
3408 : ! if(paw_dmft%myproc==0) write(499,*) "essai",paw_dmft%myproc, paw_dmft%dmftqmc_seed
3409 : ! if(paw_dmft%myproc==1) write(498,*) "essai",paw_dmft%myproc,paw_dmft%dmftqmc_seed
3410 :
3411 : !Its associated G(tau): Problem of compatibility => paw_dmft%dmftqmc_l < (2*paw_dmft%dmftqmc_l)+1 => We report only paw_dmft%dmftqmc_l = first values of G(tau)...
3412 : ! do iflavor=1,nflavor
3413 : ! do iflavor1=1,nflavor
3414 : ! do itau=1,ntau
3415 : ! if ( modulo(itau,2) == 1 ) then !Problem of binding: paw_dmft%dmftqmc_l =! ntau => We take one value by 2 and Write in file all the G(tau) out function from TRIQS
3416 : !gtmp_nd(itau,iflavor,iflavor1) = gtau(iflavor,iflavor1,itau)
3417 : ! endif
3418 : ! if(paw_dmft%myproc==0) then
3419 : ! WRITE(504,*) "[OUT Fortran] G[ tau= ",itau," l= ",iflavor," l_= ",iflavor1,"] = ",gtmp_nd(itau,iflavor,iflavor1) !gtmp_nd(itau,iflavor,iflavor1) !passage ok avec ntau/iflavor1/iflavor (iflavor,iflavor1,ntau)
3420 : ! endif
3421 : ! enddo
3422 : ! enddo
3423 : ! enddo
3424 :
3425 : ! Write Legendre Polynoms G(L) for extrapolation of Interacting G(iw) by FT, only if leg_measure == TRUE
3426 : ! -------------------------------------------------------------------------------------------
3427 0 : if (leg_measure) then
3428 0 : do ileg=1,nleg
3429 0 : WRITE(505,*) ileg,((gl_nd(ileg,iflavor,iflavor1),iflavor=1,nflavor),iflavor1=1,nflavor)
3430 : end do
3431 0 : close(505)
3432 : end if
3433 : ! f(paw_dmft%myproc==0) then
3434 : ! do itau=1,paw_dmft%dmftqmc_l
3435 : ! write(490,*) ((gtmp_nd(itau,iflavor,iflavor1),iflavor=1,nflavor),iflavor1=1,nflavor)
3436 : ! enddo
3437 : ! ndif
3438 0 : ABI_FREE( fw1_nd_tmp )
3439 0 : ABI_FREE( g_iw )
3440 0 : ABI_FREE( u_mat_ijkl )
3441 0 : ABI_FREE( u_mat_ijkl_tmp )
3442 0 : ABI_FREE( u_mat_ij )
3443 :
3444 :
3445 : ! Compute Green's function in imaginary freq using Legendre coefficients
3446 : ! -----------------------------------------------------------------------
3447 0 : if (leg_measure) then
3448 0 : call xmpi_barrier(paw_dmft%spacecomm)
3449 0 : call flush_unit(std_out)
3450 0 : write(message,'(2a)') ch10," == Compute G(iw_n) from Legendre coefficients"
3451 0 : call wrtout(std_out,message,'COLL')
3452 0 : ABI_MALLOC( jbes, (nleg))
3453 0 : gw_tmp_nd=czero
3454 :
3455 : ! write(77,*) " TEST OF BESSEL S ROUTINES 0 0"
3456 :
3457 : ! xx=0_dp
3458 : ! ileg=0
3459 : ! call sbf8(ileg+1,xx,jbes)
3460 : ! write(77,*) "T0 A",jbes(ileg+1)
3461 : ! call jbessel(jbes(ileg+1),besp,bespp,ileg,1,xx)
3462 : ! write(77,*) "T0 B",jbes(ileg+1)
3463 : ! write(77,*) "T0 C",bessel_jn(ileg,xx)
3464 :
3465 : ! write(77,*) " TEST OF BESSEL S ROUTINES 1.5 0"
3466 :
3467 : ! xx=1.5_dp
3468 : ! ileg=0
3469 : ! call sbf8(ileg+1,xx,jbes)
3470 : ! write(77,*) "T1 A",jbes(ileg+1)
3471 : ! call jbessel(jbes(ileg+1),besp,bespp,ileg,1,xx)
3472 : ! write(77,*) "T1 B",jbes(ileg+1)
3473 : ! write(77,*) "T1 C",bessel_jn(ileg,xx)
3474 :
3475 : ! write(77,*) " TEST OF BESSEL S ROUTINES 1.5 1"
3476 :
3477 : ! xx=1.5_dp
3478 : ! ileg=1
3479 : ! call sbf8(ileg+1,xx,jbes)
3480 : ! write(77,*) "T2 A",jbes(ileg+1)
3481 : ! call jbessel(jbes(ileg+1),besp,bespp,ileg,1,xx)
3482 : ! write(77,*) "T2 B",jbes(ileg+1)
3483 : ! write(77,*) "T2 C",bessel_jn(ileg,xx)
3484 :
3485 :
3486 0 : do ifreq=1,paw_dmft%dmft_nwli
3487 0 : xx=real(2*ifreq-1,kind=dp)*pi/two
3488 0 : if(xx<=100_dp) call sbf8(nleg,xx,jbes)
3489 0 : do ileg=1,nleg
3490 : ! write(77,*) "A",ifreq,jbes(ileg),xx
3491 :
3492 0 : if(xx>=99) call jbessel(jbes(ileg),besp,bespp,ileg-1,1,xx)
3493 : ! write(77,*) "B",ifreq,jbes(ileg),xx
3494 :
3495 : !write(77,*) "C",ifreq,jbes(ileg),xx
3496 :
3497 0 : u_nl=sqrt(float(2*ileg-1))*(-1)**(ifreq-1)*cmplx(0_dp,one)**(ileg)*jbes(ileg)
3498 0 : write(77,*) "----------",ileg,jbes(ileg), u_nl,gl_nd(ileg,1,1)
3499 :
3500 0 : do iflavor=1,nflavor
3501 0 : do iflavor1=1,nflavor
3502 : gw_tmp_nd(ifreq,iflavor,iflavor1)= gw_tmp_nd(ifreq,iflavor,iflavor1) + &
3503 0 : & u_nl*gl_nd(ileg,iflavor,iflavor1)
3504 : end do
3505 : end do
3506 :
3507 : ! write(77,*) "------------------", gw_tmp_nd(ifreq,1,1)
3508 :
3509 : end do
3510 : ! write(77,*) "------------------ sum ", gw_tmp_nd(ifreq,1,1)
3511 : end do
3512 0 : ABI_FREE( jbes )
3513 0 : call xmpi_barrier(paw_dmft%spacecomm)
3514 0 : call flush_unit(std_out)
3515 : end if
3516 0 : gw_tmp_nd = gw_tmp_nd*Ha_eV
3517 :
3518 :
3519 0 : if ( leg_measure ) then !only if functionality is enabled
3520 0 : ABI_FREE(gl_nd)
3521 : end if
3522 :
3523 :
3524 0 : end subroutine ctqmc_calltriqs
3525 : !!***
3526 :
3527 : !!****f* m_forctqmc/ctqmc_calltriqs_c
3528 : !! NAME
3529 : !! ctqmc_calltriqs_c
3530 : !!
3531 : !! FUNCTION
3532 : !! This routines calls TRIQS/CTHYB using the C++ API in order
3533 : !! to solve the impurity model.
3534 : !!
3535 : !! INPUTS
3536 : !! paw_dmft <type(paw_dmft_type)>= DMFT data structure
3537 : !! green <type(green_type)>= green's function
3538 : !! self <type(self_type)>= self-energy
3539 : !! hu <type(hu_type)>= U interaction
3540 : !! weiss <type(green_type)>= inverse of weiss function
3541 : !! self_new <type(self_type)>= impurity self-energy
3542 : !! pawprtvol = flag for printing
3543 : !!
3544 : !! OUTPUT
3545 : !!
3546 : !! SIDE EFFECTS
3547 : !!
3548 : !! NOTES
3549 : !!
3550 : !! SOURCE
3551 :
3552 0 : subroutine ctqmc_calltriqs_c(paw_dmft,green,self,hu,weiss,self_new,pawprtvol)
3553 :
3554 : #if defined HAVE_TRIQS_INTERNAL || defined HAVE_TRIQS_v3_2
3555 : use TRIQS_CTQMC
3556 : #endif
3557 : use ISO_C_BINDING
3558 :
3559 : !Arguments ------------------------------------
3560 : integer, intent(in) :: pawprtvol
3561 : type(paw_dmft_type), intent(in) :: paw_dmft
3562 : type(green_type), target, intent(inout) :: green,weiss
3563 : type(self_type), intent(inout) :: self,self_new
3564 : type(hu_type), intent(inout) :: hu(paw_dmft%ntypat)
3565 : !Local variables ------------------------------
3566 : integer :: basis,i,iatom,iblock,iflavor,iflavor1,iflavor2,ifreq,ilam,ileg,im,im1,integral,isppol,isub
3567 : integer :: itau,itypat,iw,l,len_t,lpawu,myproc,natom,ncon,ndim,nflavor,nflavor_max,ngauss,nleg,nmoments
3568 : integer :: nspinor,nsppol,nsub,ntau,ntot,nwlo,p,pad_elam,pad_lambda,read_data,rot_type_vee,tndim,unt,verbo,wdlr_size
3569 : integer, target :: ndlr
3570 : logical :: debug,density_matrix,entropy,leg_measure,nondiag,off_diag,rot_inv
3571 : real(dp) :: besp,bespp,beta,dx,elam,emig_tot,err,err_,fact,fact2,shift_mu,tau,tol,xtau,xx
3572 : complex(dp) :: mself_1,mself_2,occ_tmp,u_nl
3573 : complex(dp), target :: eu
3574 0 : type(oper_type), target :: energy_level
3575 0 : type(self_type) :: hybmwdhyb
3576 : type(c_ptr) :: block_ptr,eu_ptr,flavor_ptr,fname_data_ptr,fname_dataw_ptr,fname_histo_ptr,ftau_ptr,gl_ptr,gtau_ptr
3577 : type(c_ptr) :: inner_ptr,levels_ptr,mself_1_ptr,mself_2_ptr,ndlr_ptr,occ_ptr,siz_ptr,udens_ptr,vee_ptr,wdlr_ptr
3578 : type(c_ptr) :: chiloc_ptr,magmom_ptr
3579 0 : integer, allocatable :: flavor_list(:,:,:),nblocks(:)
3580 0 : integer, target, allocatable :: block_list(:,:),flavor_tmp(:,:),inner_list(:,:),siz_block(:,:)
3581 0 : real(dp), allocatable :: adlr(:,:),bdlr(:),elam_list(:),emig(:),gl_dlr_re(:),gl_dlr_im(:),jbes(:),lam_list(:)
3582 0 : real(dp), allocatable :: leg_array(:,:),moment_fit(:),t_lp(:,:),tpoints(:),tweights(:),wdlr(:),wdlr_beta(:,:)
3583 0 : real(dp), target, allocatable :: wdlr_tmp(:), chiloc_tmp(:,:), magmom_array(:)
3584 0 : complex(dp), allocatable :: adlr_iw(:,:),gl_dlr(:,:,:,:),gl_tmp(:,:,:,:),gtau_dlr(:,:,:),gtau_leg(:,:,:),shift(:)
3585 0 : complex(dp), target, allocatable :: gl(:,:,:),gtau(:,:,:),levels_ctqmc(:,:),moments_self_1(:),moments_self_2(:),occ(:)
3586 0 : type(matlu_type), allocatable :: eigvectmatlu(:),matlu_tmp(:)
3587 0 : type(matlu_type), target, allocatable :: dmat_ctqmc(:),ftau(:),udens_rot(:)
3588 0 : type(matlu_type), pointer :: matlu_pt(:) => null()
3589 0 : type(vee_type), target, allocatable :: vee_rot(:)
3590 0 : type(coeff2c_type), allocatable :: magmom_tot(:)
3591 0 : type(matlu_type), allocatable :: matlumag_tot(:)
3592 : character(len=1) :: tag_block4
3593 : character(len=2) :: tag_block,tag_block3,tag_lam
3594 : character(len=4) :: tag_at
3595 : character(len=14) :: tag_elam,tag_lambda
3596 : character(len=500) :: stringfile,tag_block2,tag_lam2
3597 : character(len=10000) :: message
3598 : character(len=fnlen), target :: fname_data,fname_dataw,fname_histo
3599 : ! ************************************************************************
3600 :
3601 0 : basis = paw_dmft%dmftctqmc_basis
3602 0 : beta = one / paw_dmft%temp
3603 0 : debug = paw_dmft%dmft_triqs_prt_entropy
3604 0 : density_matrix = paw_dmft%dmft_triqs_measure_density_matrix
3605 0 : entropy = (paw_dmft%dmft_triqs_entropy == 1)
3606 0 : integral = paw_dmft%dmft_triqs_compute_integral
3607 0 : leg_measure = paw_dmft%dmft_triqs_leg_measure
3608 0 : myproc = paw_dmft%myproc
3609 0 : natom = paw_dmft%natom
3610 0 : nflavor_max = 2 * (2*paw_dmft%maxlpawu+1)
3611 0 : ngauss = paw_dmft%dmft_triqs_gaussorder
3612 0 : nleg = paw_dmft%dmft_triqs_nleg
3613 0 : nspinor = paw_dmft%nspinor
3614 0 : nsppol = paw_dmft%nsppol
3615 0 : nsub = paw_dmft%dmft_triqs_nsubdivisions
3616 0 : ntau = paw_dmft%dmftqmc_l
3617 0 : nwlo = paw_dmft%dmft_nwlo
3618 0 : off_diag = paw_dmft%dmft_triqs_off_diag
3619 0 : rot_inv = (paw_dmft%dmft_solv == 7)
3620 0 : shift_mu = paw_dmft%dmft_triqs_shift_mu
3621 0 : tol = paw_dmft%dmft_triqs_tol_block
3622 :
3623 0 : if (rot_inv) then
3624 0 : write(message,'(a,3x,a)') ch10,"== Rotationally Invariant Terms Included"
3625 : else
3626 0 : write(message,'(a,3x,a)') ch10,"== Density-Density Terms Included"
3627 : end if
3628 0 : call wrtout(std_out,message,"COLL")
3629 :
3630 0 : ABI_MALLOC(block_list,(nflavor_max,natom))
3631 0 : ABI_MALLOC(dmat_ctqmc,(natom))
3632 0 : ABI_MALLOC(eigvectmatlu,(natom))
3633 0 : ABI_MALLOC(flavor_list,(nflavor_max,nflavor_max,natom))
3634 0 : ABI_MALLOC(ftau,(natom))
3635 0 : ABI_MALLOC(inner_list,(nflavor_max,natom))
3636 0 : ABI_MALLOC(matlu_tmp,(natom))
3637 0 : ABI_MALLOC(nblocks,(natom))
3638 0 : ABI_MALLOC(shift,(natom))
3639 0 : ABI_MALLOC(siz_block,(nflavor_max,natom))
3640 0 : ABI_MALLOC(udens_rot,(natom))
3641 0 : ABI_MALLOC(vee_rot,(natom))
3642 :
3643 0 : call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu(:),dmat_ctqmc(:))
3644 0 : call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu(:),eigvectmatlu(:))
3645 0 : call init_matlu(natom,2,ntau,paw_dmft%lpawu(:),ftau(:))
3646 0 : call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu(:),matlu_tmp(:))
3647 0 : call init_matlu(natom,2,1,paw_dmft%lpawu(:),udens_rot(:))
3648 :
3649 0 : call init_oper(paw_dmft,energy_level,opt_ksloc=2)
3650 :
3651 0 : call init_vee(paw_dmft,vee_rot(:))
3652 :
3653 0 : call compute_levels(energy_level,self%hdc,paw_dmft)
3654 :
3655 0 : write(message,'(a,3x,a)') ch10,"== Print Occupation matrix in cubic basis"
3656 0 : call wrtout(std_out,message,"COLL")
3657 0 : call print_matlu(green%occup%matlu(:),natom,1)
3658 :
3659 0 : call compute_moments_loc(green,self,energy_level,weiss,0)
3660 :
3661 : ! Build hybridization and remove spurious 0th order moment
3662 0 : do ifreq=1,nwlo
3663 0 : shift(:) = cmplx(zero,paw_dmft%omega_lo(ifreq),kind=dp)
3664 0 : call shift_matlu(weiss%oper(ifreq)%matlu(:),natom,shift(:))
3665 0 : call fac_matlu(weiss%oper(ifreq)%matlu(:),natom,-cone)
3666 0 : call add_matlu(weiss%oper(ifreq)%matlu(:),energy_level%matlu(:),matlu_tmp(:),natom,-1)
3667 0 : call add_matlu(matlu_tmp(:),weiss%moments(1)%matlu(:),weiss%oper(ifreq)%matlu(:),natom,-1)
3668 : end do ! ifreq
3669 :
3670 0 : call zero_matlu(weiss%moments(1)%matlu(:),natom)
3671 :
3672 0 : write(message,'(a,3x,a)') ch10,"== Print Delta(iw) for first frequency in cubic basis"
3673 0 : call wrtout(std_out,message,"COLL")
3674 0 : call print_matlu(weiss%oper(1)%matlu(:),natom,1)
3675 :
3676 : if (basis == 0) then
3677 0 : write(message,'(a,3x,a)') ch10,"== Switching to CTQMC basis: staying in cubic basis"
3678 : else if (basis == 1) then
3679 0 : write(message,'(a,3x,2a)') ch10,"== Switching to CTQMC basis: using basis that", &
3680 0 : & " diagonalizes the electronic levels"
3681 : else if (basis == 2) then
3682 0 : write(message,'(a,3x,2a)') ch10,"== Switching to CTQMC basis: using basis that", &
3683 0 : & " diagonalizes the occupation matrix"
3684 : else if (basis == 3) then
3685 0 : write(message,'(a,3x,a)') ch10,"== Switching to CTQMC basis: using Ylm basis"
3686 : else if (basis == 4) then
3687 0 : write(message,'(a,3x,a)') ch10,"== Switching to CTQMC basis: using JmJ basis"
3688 : end if
3689 0 : call wrtout(std_out,message,"COLL")
3690 :
3691 0 : if (basis == 1) then
3692 0 : call checkdiag_matlu(energy_level%matlu(:),natom,tol,nondiag)
3693 0 : if (.not. nondiag) then
3694 0 : basis = 0
3695 0 : write(message,'(a,3x,a)') ch10,"== Electronic levels are already diagonal: staying in the cubic basis"
3696 : else
3697 0 : write(message,'(a,3x,a)') ch10,"== Switching to Ylm basis first"
3698 : end if ! nondiag
3699 0 : call wrtout(std_out,message,"COLL")
3700 : end if ! basis=1
3701 :
3702 0 : if (basis == 2) then
3703 0 : call checkdiag_matlu(green%occup%matlu(:),natom,tol,nondiag)
3704 0 : if (.not. nondiag) then
3705 0 : basis = 0
3706 0 : write(message,'(a,3x,a)') ch10,"== Occupation matrix is already diagonal: staying in the cubic basis"
3707 : else
3708 0 : write(message,'(a,3x,a)') ch10,"== Switching to Ylm basis first"
3709 : end if ! not nondiag
3710 0 : call wrtout(std_out,message,"COLL")
3711 : end if ! basis=2
3712 :
3713 0 : call copy_matlu(green%occup%matlu(:),dmat_ctqmc(:),natom)
3714 :
3715 0 : if (basis > 0) then ! First switch to Ylm basis in every case
3716 0 : call slm2ylm_matlu(energy_level%matlu(:),natom,paw_dmft,1,0)
3717 0 : call slm2ylm_matlu(dmat_ctqmc(:),natom,paw_dmft,1,0)
3718 0 : do i=2,weiss%nmoments-1
3719 0 : call slm2ylm_matlu(weiss%moments(i)%matlu(:),natom,paw_dmft,1,0)
3720 : end do ! i
3721 0 : do ifreq=1,nwlo
3722 0 : if (weiss%distrib%procf(ifreq) /= myproc) cycle
3723 0 : call slm2ylm_matlu(weiss%oper(ifreq)%matlu(:),natom,paw_dmft,1,0)
3724 : end do ! ifreq
3725 : end if ! basis>0
3726 :
3727 0 : if (basis == 1 .or. basis == 2) then
3728 : ! Find block structure in Ylm basis and diagonalize for each block (extremely useful in the
3729 : ! case of degenerate levels ; this ensures minimal mixing of Ylm and thus maximal number of subspaces)
3730 0 : if (basis == 1) then
3731 0 : matlu_pt => energy_level%matlu(:)
3732 : else
3733 0 : matlu_pt => dmat_ctqmc(:)
3734 : end if ! basis
3735 :
3736 0 : if (pawprtvol >= 3) then
3737 0 : if (basis == 1) then
3738 0 : write(message,'(a,3x,a)') ch10,"== Print Energy levels in Ylm basis"
3739 : else
3740 0 : write(message,'(a,3x,a)') ch10,"== Print Occupation matrix in Ylm basis"
3741 : end if
3742 0 : call wrtout(std_out,message,"COLL")
3743 :
3744 0 : call print_matlu(matlu_pt(:),natom,1)
3745 : end if ! pawprtvol>=3
3746 :
3747 : call find_block_structure(paw_dmft,block_list(:,:),inner_list(:,:), &
3748 0 : & flavor_list(:,:,:),siz_block(:,:),nblocks(:),matlu_pt(:),natom,nflavor_max)
3749 0 : call diag_block(matlu_pt)
3750 0 : matlu_pt => null()
3751 :
3752 : ! Make sure every process has the same rotation matrix in case of degenerate levels
3753 0 : call xmpi_matlu(eigvectmatlu(:),natom,paw_dmft%spacecomm,master=0,option=2)
3754 :
3755 0 : if (basis == 1) then
3756 0 : call rotate_matlu(dmat_ctqmc(:),eigvectmatlu(:),natom,1)
3757 : else
3758 0 : call rotate_matlu(energy_level%matlu(:),eigvectmatlu(:),natom,1)
3759 : end if ! basis
3760 0 : do i=2,weiss%nmoments-1
3761 0 : call rotate_matlu(weiss%moments(i)%matlu(:),eigvectmatlu(:),natom,1)
3762 : end do ! i
3763 0 : do ifreq=1,nwlo
3764 0 : if (weiss%distrib%procf(ifreq) /= myproc) cycle
3765 0 : call rotate_matlu(weiss%oper(ifreq)%matlu(:),eigvectmatlu(:),natom,1)
3766 : end do ! ifreq
3767 : end if ! basis=1 or 2
3768 :
3769 0 : if (basis == 4) then
3770 0 : call ylm2jmj_matlu(energy_level%matlu(:),natom,1,paw_dmft)
3771 0 : call ylm2jmj_matlu(dmat_ctqmc(:),natom,1,paw_dmft)
3772 0 : do i=2,weiss%nmoments-1
3773 0 : call ylm2jmj_matlu(weiss%moments(i)%matlu(:),natom,1,paw_dmft)
3774 : end do
3775 0 : do ifreq=1,nwlo
3776 0 : if (weiss%distrib%procf(ifreq) /= myproc) cycle
3777 0 : call ylm2jmj_matlu(weiss%oper(ifreq)%matlu(:),natom,1,paw_dmft)
3778 : end do ! ifreq
3779 : end if ! basis=4
3780 :
3781 0 : if (basis == 0) then
3782 0 : do iatom=1,natom
3783 0 : lpawu = paw_dmft%lpawu(iatom)
3784 0 : if (lpawu == -1) cycle
3785 0 : itypat = paw_dmft%typat(iatom)
3786 0 : udens_rot(iatom)%mat(:,:,1) = hu(itypat)%udens(:,:)
3787 0 : vee_rot(iatom)%mat(:,:,:,:) = hu(itypat)%veeslm2(:,:,:,:)
3788 : end do ! iatom
3789 : else
3790 0 : call gather_oper(weiss%oper(:),weiss%distrib,paw_dmft,opt_ksloc=2)
3791 0 : rot_type_vee = 4
3792 0 : if (basis == 3) rot_type_vee = 2
3793 0 : if (basis == 4) rot_type_vee = 3
3794 0 : call rotatevee_hu(hu(:),paw_dmft,pawprtvol,eigvectmatlu(:),rot_type_vee,udens_rot(:),vee_rot(:))
3795 : end if ! basis
3796 :
3797 0 : write(message,'(a,3x,a)') ch10,"== Print Energy levels in CTQMC basis"
3798 0 : call wrtout(std_out,message,"COLL")
3799 0 : call print_matlu(energy_level%matlu(:),natom,1)
3800 :
3801 0 : write(message,'(a,3x,a)') ch10,"== Print Occupation matrix in CTQMC basis"
3802 0 : call wrtout(std_out,message,"COLL")
3803 0 : call print_matlu(dmat_ctqmc(:),natom,1)
3804 :
3805 0 : write(message,'(a,3x,a)') ch10,"== Print Delta(iw) for first frequency in CTQMC basis"
3806 0 : call wrtout(std_out,message,"COLL")
3807 0 : call print_matlu(weiss%oper(1)%matlu(:),natom,1)
3808 :
3809 : ! Possibly set the imaginary part and off-diagonal elements to 0 now that we
3810 : ! are in the CTQMC basis. This is extremely important to do it explicitly instead of
3811 : ! simply sending the real part or the diagonal elements to TRIQS since this modifies
3812 : ! the electronic levels and hybridization that are used in Dyson's equation later.
3813 :
3814 : #ifndef HAVE_TRIQS_COMPLEX
3815 0 : write(message,'(a,3x,2a)') ch10,"== The imaginary part of Delta(tau) and the ", &
3816 0 : & "electronic levels is now set to 0"
3817 0 : call wrtout(std_out,message,"COLL")
3818 : ! Symmetrizing Delta(iw) is equivalent to neglecting the imaginary part of Delta(tau)
3819 0 : err = zero
3820 0 : do ifreq=1,nwlo
3821 0 : call symmetrize_matlu(weiss%oper(ifreq)%matlu(:),natom,err=err_)
3822 0 : if (err_ > err) err = err_
3823 : end do ! ifreq
3824 0 : do i=2,weiss%nmoments-1
3825 0 : call symmetrize_matlu(weiss%moments(i)%matlu(:),natom,err=err_)
3826 0 : if (err_ > err) err = err_
3827 : end do ! i
3828 0 : call zero_matlu(energy_level%matlu(:),natom,onlyimag=1,err=err_)
3829 0 : if (err_ > err) err = err_
3830 0 : if (err > tol) then
3831 0 : write(message,'(2a)') "WARNING: This is not a good approximation ; the imaginary ", &
3832 0 : & "part is non negligible !"
3833 0 : ABI_WARNING(message)
3834 : end if ! err>tol
3835 : #endif
3836 :
3837 0 : err = zero
3838 0 : if ((.not. rot_inv) .or. (.not. off_diag)) then
3839 0 : call zero_matlu(energy_level%matlu(:),natom,onlynondiag=1,err=err_)
3840 0 : if (err_ > err) err = err_
3841 : end if
3842 :
3843 0 : if (.not. off_diag) then
3844 0 : write(message,'(a,3x,2a)') ch10,"== The off-diagonal elements of the hybridization ", &
3845 0 : & "and the electronic levels are now set to 0"
3846 0 : call wrtout(std_out,message,"COLL")
3847 0 : do ifreq=1,nwlo
3848 0 : call zero_matlu(weiss%oper(ifreq)%matlu(:),natom,onlynondiag=1,err=err_)
3849 0 : if (err_ > err) err = err_
3850 : end do ! ifreq
3851 0 : do i=2,weiss%nmoments-1
3852 0 : call zero_matlu(weiss%moments(i)%matlu(:),natom,onlynondiag=1,err=err_)
3853 0 : if (err_ > err) err = err_
3854 : end do ! i
3855 0 : if (err > tol) then
3856 0 : write(message,'(2a)') "WARNING: This is not a good approximation ; the off-diagonal ", &
3857 0 : & "elements are non negligible !"
3858 0 : ABI_WARNING(message)
3859 : end if ! err>tol
3860 : end if ! not off_diag
3861 :
3862 : ! Prepare DLR frequencies
3863 0 : if (.not. leg_measure) then
3864 0 : wdlr_size = 1000 ! make sure this is big enough
3865 0 : ABI_MALLOC(wdlr_tmp,(wdlr_size))
3866 0 : ndlr_ptr = C_LOC(ndlr)
3867 0 : wdlr_ptr = C_LOC(wdlr_tmp)
3868 : #if defined HAVE_TRIQS_INTERNAL || defined HAVE_TRIQS_v3_2
3869 : call build_dlr(wdlr_size,ndlr_ptr,wdlr_ptr,paw_dmft%dmft_triqs_lambda,paw_dmft%dmft_triqs_epsilon)
3870 : #endif
3871 0 : if (ndlr > wdlr_size) then
3872 0 : write(message,'(a,i4,2a)') "You have more than ",wdlr_size," DLR frequencies.", &
3873 0 : & " Something is wrong here."
3874 0 : ABI_ERROR(message)
3875 : end if
3876 :
3877 0 : ABI_MALLOC(wdlr,(ndlr))
3878 0 : ABI_MALLOC(wdlr_beta,(ndlr,4))
3879 0 : wdlr(:) = wdlr_tmp(1:ndlr)
3880 0 : wdlr_beta(:,1) = wdlr(:) / beta
3881 0 : do i=2,4
3882 0 : wdlr_beta(:,i) = wdlr_beta(:,i-1) * wdlr_beta(:,1)
3883 : end do
3884 0 : ABI_FREE(wdlr_tmp)
3885 0 : ABI_MALLOC(adlr,(ndlr,ntau))
3886 0 : ABI_MALLOC(adlr_iw,(ndlr,nwlo))
3887 :
3888 0 : do ifreq=1,nwlo
3889 0 : do iw=1,ndlr
3890 0 : adlr_iw(iw,ifreq) = k_iw(paw_dmft%omega_lo(ifreq),wdlr_beta(iw,1))
3891 : end do ! iw
3892 : end do ! ifreq
3893 :
3894 0 : do itau=1,ntau
3895 0 : do iw=1,ndlr
3896 0 : adlr(iw,itau) = k_it(dble(itau-1)/dble(ntau-1),wdlr(iw))
3897 : end do ! iw
3898 : end do ! itau
3899 :
3900 0 : write(tag_at,'(i4)') ndlr
3901 0 : write(message,'(a,3x,3a)') ch10,"== There are ",trim(adjustl(tag_at))," DLR frequencies"
3902 0 : call wrtout(std_out,message,"COLL")
3903 0 : write(message,'(3x,1000(e10.3,2x))') wdlr_beta(:,1)
3904 0 : call wrtout(std_out,message,"COLL")
3905 0 : call identity_oper(green%moments(1),2)
3906 : end if ! not leg_measure
3907 :
3908 : ! ntot is total number of lambda pts, + 1 is because we add the case lambda = 1 (which has no reason to be included in the
3909 : ! Gauss-Legendre grid), since we need it for the rest of the SCF calculation
3910 0 : ntot = merge(ngauss*nsub+1,1,integral>0.and.entropy)
3911 :
3912 0 : ABI_MALLOC(elam_list,(ntot))
3913 0 : ABI_MALLOC(lam_list,(ntot)) ! scaling factors of U matrix for thermodynamic integration
3914 0 : lam_list(ntot) = one
3915 0 : green%integral = zero
3916 0 : green%ekin_imp = zero
3917 :
3918 : ! Prepare Gauss-Legendre quadrature for thermodynamic integration over U
3919 0 : if (integral > 0 .and. entropy) then
3920 :
3921 0 : ABI_MALLOC(tweights,(ngauss))
3922 0 : ABI_MALLOC(tpoints,(ngauss))
3923 :
3924 : ! Calculation of Gauss-Legendre grid (on [-1,1]) of size ngauss
3925 0 : call coeffs_gausslegint(-one,one,tpoints(:),tweights(:),ngauss)
3926 :
3927 0 : dx = one / dble(nsub)
3928 :
3929 : ! Split [0,1] into nsub intervals [x_i,x_{i+1}],i=1,nsub with x_i=(i-1)*dx
3930 0 : do isub=1,nsub
3931 : ! For each interval, the Gauss-Legendre grid of size ngauss is mapped from the
3932 : ! t-world where t in [-1,1] to the x-world where x in [x_{isub},x_{isub+1}]
3933 0 : lam_list((isub-1)*ngauss+1:isub*ngauss) = (dble(isub)*two+tpoints(:)-one) * dx * half
3934 : end do ! ilam
3935 :
3936 : end if ! integral and entropy
3937 :
3938 : ! Build most optimal block structure in CTQMC basis
3939 0 : write(message,'(a,3x,2a)') ch10,"== Searching for the most optimal block structure of", &
3940 0 : & " the electronic levels and the hybridization"
3941 0 : call wrtout(std_out,message,"COLL")
3942 :
3943 : call find_block_structure(paw_dmft,block_list(:,:),inner_list(:,:),flavor_list(:,:,:), &
3944 0 : & siz_block(:,:),nblocks(:),energy_level%matlu(:),natom,nflavor_max,hyb=weiss)
3945 :
3946 0 : nmoments = weiss%nmoments - 2
3947 :
3948 : ! Inverse Fourier transform of the hybridization
3949 0 : call fourier_inv(paw_dmft,nmoments,ntau,ftau(:),weiss%oper(:),weiss%moments(2:nmoments+1))
3950 :
3951 0 : if (entropy) then
3952 0 : ABI_MALLOC(emig,(natom))
3953 : ! Cubic splines to compute the derivative of Delta(iw)
3954 0 : call initialize_self(hybmwdhyb,paw_dmft,opt_moments=1)
3955 0 : call cubic_spline()
3956 0 : call copy_matlu(energy_level%matlu(:),hybmwdhyb%moments(1)%matlu(:),natom)
3957 0 : do i=2,weiss%nmoments-1
3958 0 : call copy_matlu(weiss%moments(i)%matlu(:),hybmwdhyb%moments(i)%matlu(:),natom)
3959 0 : call fac_matlu(hybmwdhyb%moments(i)%matlu(:),natom,cmplx(dble(i),zero,kind=dp))
3960 : end do ! i
3961 : end if ! entropy
3962 :
3963 : ! Solve impurity model for each atom
3964 0 : do iatom=1,natom
3965 :
3966 0 : lpawu = paw_dmft%lpawu(iatom)
3967 0 : if (lpawu == -1) cycle
3968 0 : ndim = 2*lpawu + 1
3969 0 : tndim = nspinor * ndim
3970 0 : nflavor = 2 * ndim
3971 :
3972 : !Local Spin-Spin correlation function
3973 0 : if (paw_dmft%dmft_triqs_chiloc > 0) then
3974 :
3975 : ! == slm case : \hat{S_z} = n_up - n_down
3976 0 : ABI_MALLOC(chiloc_tmp,(1:ntau,1:ntau))
3977 0 : chiloc_ptr = C_LOC(chiloc_tmp)
3978 :
3979 : ! == Mj case : \hat{J_z} = n_mj * \mu_mjz
3980 0 : if(nspinor .eq. 2 .and. basis .eq. 4) then
3981 0 : magmom_ptr = C_NULL_PTR
3982 :
3983 0 : ABI_MALLOC(magmom_tot,(natom))
3984 0 : ABI_MALLOC(matlumag_tot,(natom))
3985 :
3986 0 : lpawu = paw_dmft%lpawu(iatom)
3987 0 : if (lpawu == -1) cycle
3988 0 : ABI_MALLOC(magmom_tot(iatom)%value,(2*(2*lpawu+1),2*(2*lpawu+1)))
3989 0 : magmom_tot(iatom)%value=czero
3990 :
3991 0 : call init_matlu(natom=1,nspinor=paw_dmft%nspinor,nsppol=paw_dmft%nsppol,lpawu_natom=paw_dmft%lpawu,matlu=matlumag_tot)
3992 0 : call zero_matlu(matlumag_tot,natom=1)
3993 0 : call magmomjmj_matlu(matlumag_tot,natom=1)
3994 0 : call gather_matlu(matlumag_tot,magmom_tot,natom=1,option=1,prtopt=0)
3995 0 : call destroy_matlu(matlumag_tot,natom=1)
3996 : !
3997 0 : ABI_MALLOC(magmom_array,(nflavor*nflavor))
3998 0 : magmom_array(:) = zero
3999 0 : magmom_array = reshape(real(magmom_tot(iatom)%value), (/nflavor*nflavor/))
4000 0 : magmom_ptr = C_LOC(magmom_array)
4001 : end if
4002 : end if !end chiloc
4003 :
4004 0 : write(tag_at,'(i4)') iatom
4005 0 : write(tag_block,'(i2)') nblocks(iatom)
4006 0 : write(message,'(a,3x,6a)') ch10,"== Solving impurity model for atom ",trim(adjustl(tag_at)), &
4007 0 : & ", where there are ",trim(adjustl(tag_block))," blocks",ch10
4008 0 : call wrtout(std_out,message,'COLL')
4009 :
4010 0 : do iblock=1,nblocks(iatom)
4011 0 : write(tag_block,'(i2)') iblock - 1
4012 0 : tag_block2 = ""
4013 0 : do iflavor=1,siz_block(iblock,iatom)
4014 0 : write(tag_block3,'(i2)') flavor_list(iflavor,iblock,iatom)
4015 0 : tag_block2 = trim(tag_block2) // " " // trim(adjustl(tag_block3))
4016 : end do ! iflavor
4017 0 : tag_block4 = ""
4018 0 : if (siz_block(iblock,iatom) > 1) tag_block4 = "s"
4019 0 : write(message,'(2x,4a,1x,a)') "--> Block ",trim(adjustl(tag_block))," contains flavor",trim(adjustl(tag_block4)),trim(adjustl(tag_block2))
4020 0 : call wrtout(std_out,message,'COLL')
4021 : end do ! iblock
4022 :
4023 0 : write(message,'(a,3x,2a)') ch10,"== Schematic of the block structure",ch10
4024 0 : call wrtout(std_out,message,'COLL')
4025 :
4026 0 : iflavor = 1
4027 0 : do iblock=1,nblocks(iatom)
4028 0 : do iflavor1=1,siz_block(iblock,iatom)
4029 0 : tag_block2 = ""
4030 0 : do iflavor2=1,iflavor-1
4031 0 : tag_block2 = trim(tag_block2) // " ."
4032 : end do ! iflavor2
4033 0 : do iflavor2=1,iflavor1-1
4034 0 : tag_block2 = trim(tag_block2) // " x"
4035 : end do ! iflavor2
4036 0 : write(tag_block,'(i2)') flavor_list(iflavor1,iblock,iatom)
4037 0 : i = merge(1,2,flavor_list(iflavor1,iblock,iatom)>=10)
4038 0 : tag_block2 = trim(tag_block2) // repeat(" ",i) // trim(adjustl(tag_block))
4039 0 : do iflavor2=iflavor1+1,siz_block(iblock,iatom)
4040 0 : tag_block2 = trim(tag_block2) // " x"
4041 : end do ! iflavor2
4042 0 : do iflavor2=iflavor+siz_block(iblock,iatom),nflavor
4043 0 : tag_block2 = trim(tag_block2) // " ."
4044 : end do ! iflavor2
4045 0 : write(message,'(4x,a)') tag_block2
4046 0 : call wrtout(std_out,message,'COLL')
4047 : end do ! iflavor1
4048 0 : iflavor = iflavor + siz_block(iblock,iatom)
4049 : end do ! iblock
4050 :
4051 0 : call int2char4(iatom,tag_at)
4052 0 : ABI_CHECK((tag_at(1:1)/='#'),'Bug: string length too short!')
4053 :
4054 0 : if (myproc == 0 .and. off_diag) then
4055 :
4056 0 : if (open_file(trim(paw_dmft%filapp)//"_Hybridization_offdiag_iatom"//tag_at//".dat",message,newunit=unt) /= 0) ABI_ERROR(message)
4057 0 : write(unt,'(6a)') "# Off-diagonal components of Delta(tau) in the CTQMC basis",ch10, &
4058 0 : & "# Columns are ordered this way:",ch10, &
4059 0 : & "# Imaginary Time ((Re(Delta_{ij}) Im(Delta_{ij}),i=1,2*(2*l+1)),j=1,2*(2*l+1)) where the", &
4060 0 : & " leftmost index varies first"
4061 :
4062 0 : do itau=1,ntau
4063 0 : write(unt,'(2x,393(e18.10e3,2x))') beta*dble(itau-1)/dble(ntau-1), &
4064 0 : & ((dble(ftau(iatom)%mat(im,im1,itau)),aimag(ftau(iatom)%mat(im,im1,itau)),im=1,nflavor),im1=1,nflavor)
4065 : end do ! itau
4066 0 : close(unt)
4067 :
4068 : end if ! myproc=0
4069 :
4070 0 : if (myproc == 0) then
4071 :
4072 0 : if (open_file(trim(paw_dmft%filapp)//"_Hybridization_diag_iatom"//tag_at//".dat",message,newunit=unt) /= 0) ABI_ERROR(message)
4073 0 : write(unt,'(5a)') "# Diagonal components of Delta(tau) in the CTQMC basis",ch10, &
4074 0 : & "# Columns are ordered this way:",ch10, &
4075 0 : & "# Imaginary Time (Delta_{ii},i=1,2*(2*l+1))"
4076 :
4077 0 : do itau=1,ntau
4078 0 : write(unt,'(2x,393(e25.17e3,2x))') beta*dble(itau-1)/dble(ntau-1),(dble(ftau(iatom)%mat(im,im,itau)),im=1,nflavor)
4079 : end do ! itau
4080 0 : close(unt)
4081 :
4082 : end if ! myproc=0
4083 :
4084 0 : ABI_MALLOC(levels_ctqmc,(nflavor,nflavor))
4085 0 : ABI_MALLOC(gtau,(ntau,nflavor,nflavor))
4086 0 : gtau(:,:,:) = czero
4087 0 : if (density_matrix) then
4088 0 : ABI_MALLOC(occ,(nflavor))
4089 : end if
4090 0 : if ((.not. leg_measure) .and. density_matrix) then
4091 0 : ABI_MALLOC(moments_self_1,(nflavor))
4092 0 : ABI_MALLOC(moments_self_2,(nflavor))
4093 : end if
4094 : if (leg_measure) then
4095 0 : ABI_MALLOC(gl,(nleg,nflavor,nflavor))
4096 0 : gl(:,:,:) = czero
4097 : end if
4098 0 : ABI_MALLOC(flavor_tmp,(nflavor,nflavor))
4099 :
4100 0 : levels_ctqmc(:,:) = czero
4101 0 : do isppol=1,nsppol
4102 : levels_ctqmc(1+(isppol-1)*ndim:tndim+(isppol-1)*ndim,1+(isppol-1)*ndim:tndim+(isppol-1)*ndim) = &
4103 0 : & energy_level%matlu(iatom)%mat(:,:,isppol)
4104 0 : if (nsppol == 1 .and. nspinor == 1) levels_ctqmc(1+ndim:2*ndim,1+ndim:2*ndim) = levels_ctqmc(1:ndim,1:ndim)
4105 : end do ! isppol
4106 :
4107 : ! Need to slice flavor_list to make it size nflavor*nflavor instead of size nflavor_max*nflavor_max
4108 0 : flavor_tmp(:,:) = flavor_list(1:nflavor,1:nflavor,iatom)
4109 :
4110 0 : block_ptr = C_LOC(block_list(:,iatom))
4111 0 : eu_ptr = C_LOC(eu)
4112 0 : flavor_ptr = C_LOC(flavor_tmp(:,:))
4113 0 : fname_data_ptr = C_LOC(fname_data)
4114 0 : fname_dataw_ptr = C_LOC(fname_dataw)
4115 0 : fname_histo_ptr = C_LOC(fname_histo)
4116 0 : ftau_ptr = C_LOC(ftau(iatom)%mat(:,:,:))
4117 0 : gl_ptr = C_LOC(gl(:,:,:))
4118 0 : gtau_ptr = C_LOC(gtau(:,:,:))
4119 0 : inner_ptr = C_LOC(inner_list(:,iatom))
4120 0 : levels_ptr = C_LOC(levels_ctqmc(:,:))
4121 0 : mself_1_ptr = C_LOC(moments_self_1(:))
4122 0 : mself_2_ptr = C_LOC(moments_self_2(:))
4123 0 : occ_ptr = C_LOC(occ(:))
4124 0 : siz_ptr = C_LOC(siz_block(:,iatom))
4125 0 : udens_ptr = C_LOC(udens_rot(iatom)%mat(:,:,1))
4126 0 : vee_ptr = C_LOC(vee_rot(iatom)%mat(:,:,:,:))
4127 :
4128 0 : verbo = 1
4129 :
4130 0 : do ilam=1,ntot
4131 :
4132 0 : if (ilam /= ntot) then
4133 0 : write(message,'(a,3x,a,f6.4,a)') ch10,"== Thermodynamic integration over interaction for lambda= ",lam_list(ilam),ch10
4134 0 : call wrtout(std_out,message,'COLL')
4135 :
4136 : ! Integrate over diagonal electronic levels
4137 0 : do isppol=1,nsppol
4138 0 : do im=1,tndim
4139 0 : iflavor = im + (isppol-1)*ndim
4140 0 : levels_ctqmc(iflavor,iflavor) = energy_level%matlu(iatom)%mat(im,im,isppol) + (lam_list(ilam)-one)*shift_mu
4141 0 : if (nsppol == 1 .and. nspinor == 1) levels_ctqmc(iflavor+ndim,iflavor+ndim) = levels_ctqmc(iflavor,iflavor)
4142 : end do ! im
4143 : end do ! isppol
4144 :
4145 : end if ! ilam/=ntot
4146 :
4147 0 : if (ilam == ntot .and. entropy .and. integral == 1) then
4148 0 : do isppol=1,nsppol
4149 0 : do im=1,tndim
4150 0 : iflavor = im + (isppol-1)*ndim
4151 0 : levels_ctqmc(iflavor,iflavor) = energy_level%matlu(iatom)%mat(im,im,isppol)
4152 0 : if (nsppol == 1 .and. nspinor == 1) levels_ctqmc(iflavor+ndim,iflavor+ndim) = levels_ctqmc(iflavor,iflavor)
4153 : end do ! im
4154 : end do ! isppol
4155 : end if
4156 :
4157 0 : if (ilam == 2) verbo = 0
4158 :
4159 0 : if (ilam < 10) then
4160 0 : write(tag_lam,'("0",i1)') ilam
4161 : else
4162 0 : write(tag_lam,'(i2)') ilam
4163 : end if
4164 :
4165 0 : tag_lam2 = ""
4166 0 : if (ilam /= ntot) tag_lam2 = "_ilam" // tag_lam
4167 :
4168 0 : read_data = paw_dmft%dmft_triqs_read_ctqmcdata
4169 0 : stringfile = "_iatom" // tag_at // trim(adjustl(tag_lam2)) // ".h5"
4170 :
4171 0 : if (paw_dmft%idmftloop == 1) then
4172 0 : read_data = 0
4173 : if (paw_dmft%dmft_triqs_read_ctqmcdata == 1 .and. paw_dmft%ireadctqmcdata == 1) read_data = 1
4174 0 : fname_data = trim(adjustl(paw_dmft%filctqmcdatain)) // stringfile
4175 : else
4176 0 : fname_data = trim(adjustl(paw_dmft%filapp)) // "_CTQMC_DATA" // stringfile
4177 : end if
4178 0 : len_t = len(trim(adjustl(fname_data))) + 1
4179 0 : fname_data(len_t:len_t) = c_null_char
4180 :
4181 0 : fname_dataw = trim(adjustl(paw_dmft%filapp)) // "_CTQMC_DATA" // stringfile
4182 0 : len_t = len(trim(adjustl(fname_dataw))) + 1
4183 0 : fname_dataw(len_t:len_t) = c_null_char
4184 :
4185 0 : fname_histo = trim(adjustl(paw_dmft%filapp)) // "_CTQMC_HISTOGRAM_iatom" // tag_at // trim(adjustl(tag_lam2)) // ".dat"
4186 0 : len_t = len(trim(adjustl(fname_histo))) + 1
4187 0 : fname_histo(len_t:len_t) = c_null_char
4188 :
4189 0 : call flush_unit(std_out)
4190 :
4191 : #if defined HAVE_TRIQS_INTERNAL || defined HAVE_TRIQS_v3_2
4192 : call Ctqmc_triqs_run(rot_inv,leg_measure,paw_dmft%dmft_triqs_move_shift,paw_dmft%dmft_triqs_move_double, &
4193 : & density_matrix,paw_dmft%dmft_triqs_time_invariance,paw_dmft%dmft_triqs_use_norm_as_weight, &
4194 : & debug,merge(integral,0,ilam/=ntot),paw_dmft%dmft_triqs_loc_n_min,paw_dmft%dmft_triqs_loc_n_max, &
4195 : & paw_dmft%dmft_triqs_seed_a,paw_dmft%dmft_triqs_seed_b,nflavor,ntau,nleg, &
4196 : & paw_dmft%dmft_triqs_n_cycles,paw_dmft%dmftctqmc_meas,paw_dmft%dmftqmc_therm, &
4197 : & paw_dmft%dmft_triqs_therm_restart,paw_dmft%dmft_triqs_det_init_size, &
4198 : & paw_dmft%dmft_triqs_det_n_operations_before_check,myproc,nblocks(iatom),read_data,verbo, &
4199 : & paw_dmft%dmft_triqs_chiloc,paw_dmft%dmft_triqs_chiloc_ins,beta,paw_dmft%dmft_triqs_imag_threshold, &
4200 : & paw_dmft%dmft_triqs_det_precision_warning, &
4201 : & paw_dmft%dmft_triqs_det_precision_error,paw_dmft%dmft_triqs_det_singular_threshold,lam_list(ilam), &
4202 : & paw_dmft%dmft_triqs_pauli_prob,chiloc_ptr,magmom_ptr,block_ptr,flavor_ptr,inner_ptr,siz_ptr,ftau_ptr,gtau_ptr,gl_ptr, &
4203 : & udens_ptr,vee_ptr,levels_ptr,mself_1_ptr,mself_2_ptr,occ_ptr,eu_ptr,fname_data_ptr,fname_dataw_ptr, &
4204 : & fname_histo_ptr)
4205 : #endif
4206 :
4207 0 : call flush_unit(std_out)
4208 :
4209 0 : if (ilam == ntot .or. debug) then
4210 :
4211 0 : do isppol=1,nsppol
4212 0 : if (nsppol == 1 .and. nspinor == 1) then
4213 0 : green%oper_tau(1)%matlu(iatom)%mat(:,:,isppol) = (gtau(1,1:ndim,1:ndim)+gtau(1,ndim+1:2*ndim,ndim+1:2*ndim)) * half
4214 : else
4215 0 : green%oper_tau(1)%matlu(iatom)%mat(:,:,isppol) = gtau(1,1+(isppol-1)*ndim:tndim+(isppol-1)*ndim,1+(isppol-1)*ndim:tndim+(isppol-1)*ndim)
4216 : end if
4217 : end do ! isppol
4218 :
4219 0 : if ((.not. leg_measure) .and. density_matrix .and. ilam == ntot) then
4220 :
4221 : ! Constrain the occupations and high-frequency moments with the more accurate values sampled from the CTQMC
4222 :
4223 0 : do isppol=1,nsppol
4224 0 : do im=1,tndim
4225 0 : iflavor = im + (isppol-1)*ndim
4226 :
4227 0 : if (nsppol == 1 .and. nspinor == 1) then
4228 0 : mself_1 = (moments_self_1(iflavor)+moments_self_1(iflavor+ndim)) * half
4229 0 : mself_2 = (moments_self_2(iflavor)+moments_self_2(iflavor+ndim)) * half
4230 : else
4231 0 : mself_1 = moments_self_1(iflavor)
4232 0 : mself_2 = moments_self_2(iflavor)
4233 : end if
4234 :
4235 0 : green%moments(2)%matlu(iatom)%mat(im,im,isppol) = energy_level%matlu(iatom)%mat(im,im,isppol) + mself_1
4236 0 : green%moments(3)%matlu(iatom)%mat(im,im,isppol) = weiss%moments(2)%matlu(iatom)%mat(im,im,isppol) + mself_2
4237 :
4238 : end do ! im
4239 :
4240 : ! Use matmul in prevision of the day where the off-diagonal density matrix will be available
4241 : green%moments(3)%matlu(iatom)%mat(:,:,isppol) = green%moments(3)%matlu(iatom)%mat(:,:,isppol) + &
4242 0 : & matmul(green%moments(2)%matlu(iatom)%mat(:,:,isppol),green%moments(2)%matlu(iatom)%mat(:,:,isppol))
4243 :
4244 : end do ! isppol
4245 :
4246 : end if ! not leg and density_matrix
4247 :
4248 0 : if (density_matrix) then
4249 :
4250 0 : green%ecorr_qmc(iatom) = dble(eu)
4251 :
4252 0 : do isppol=1,nsppol
4253 0 : do im=1,tndim
4254 0 : iflavor = im + (isppol-1)*ndim
4255 :
4256 0 : if (nsppol == 1 .and. nspinor == 1) then
4257 0 : occ_tmp = (occ(iflavor)+occ(iflavor+ndim)) * half
4258 : else
4259 0 : occ_tmp = occ(iflavor)
4260 : end if
4261 :
4262 0 : green%oper_tau(1)%matlu(iatom)%mat(im,im,isppol) = occ_tmp - cone
4263 :
4264 : end do ! im
4265 : end do ! isppol
4266 :
4267 : end if ! density_matrix
4268 :
4269 0 : if (ilam < ntot) then
4270 0 : call occup_green_tau(green)
4271 :
4272 0 : write(message,'(a,3x,a)') ch10,"== Print Occupation matrix in CTQMC basis"
4273 0 : call wrtout(std_out,message,"COLL")
4274 0 : call print_matlu(green%occup_tau%matlu(:),natom,1)
4275 : end if
4276 :
4277 0 : if (leg_measure) then
4278 :
4279 0 : ABI_MALLOC(gl_tmp,(nleg,tndim,tndim,nsppol))
4280 0 : ABI_MALLOC(jbes,(nleg))
4281 :
4282 0 : gl_tmp(:,:,:,:) = czero
4283 :
4284 0 : do ifreq=1,nwlo
4285 0 : green%oper(ifreq)%matlu(iatom)%mat(:,:,:) = czero
4286 0 : xx = dble(2*ifreq-1) * pi / two
4287 0 : if (xx <= dble(100)) then
4288 0 : call sbf8(nleg,xx,jbes(:))
4289 : end if
4290 0 : do isppol=1,nsppol
4291 0 : do im1=1,tndim
4292 0 : iflavor1 = im1 + (isppol-1)*ndim
4293 0 : do im=1,tndim
4294 0 : iflavor = im + (isppol-1)*ndim
4295 0 : do ileg=1,nleg
4296 0 : if (xx >= dble(99)) then
4297 0 : call jbessel(jbes(ileg),besp,bespp,ileg-1,1,xx)
4298 : end if
4299 0 : u_nl = sqrt(dble(2*ileg-1))*(-1)**(ifreq-1)*(j_dpc**(ileg))*jbes(ileg)
4300 0 : if (nsppol == 1 .and. nspinor == 1) then
4301 : gl_tmp(ileg,im,im1,isppol) = &
4302 0 : & (gl(ileg,iflavor,iflavor1)+gl(ileg,iflavor+ndim,iflavor1+ndim))*half
4303 : else
4304 0 : gl_tmp(ileg,im,im1,isppol) = gl(ileg,iflavor,iflavor1)
4305 : end if
4306 : green%oper(ifreq)%matlu(iatom)%mat(im,im1,isppol) = &
4307 : & green%oper(ifreq)%matlu(iatom)%mat(im,im1,isppol) + &
4308 0 : & u_nl*gl_tmp(ileg,im,im1,isppol)
4309 : end do ! ileg
4310 : end do ! im
4311 : end do ! im1
4312 : end do ! isppol
4313 : end do ! ifreq
4314 :
4315 0 : ABI_FREE(jbes)
4316 :
4317 0 : ABI_MALLOC(gtau_leg,(ntau,nflavor,nflavor))
4318 0 : ABI_MALLOC(leg_array,(nleg,ntau))
4319 :
4320 0 : do itau=1,ntau
4321 0 : tau = dble(itau-1) * beta / (ntau-1)
4322 0 : xtau = two*tau/beta - one
4323 0 : leg_array(1,itau) = one
4324 0 : leg_array(2,itau) = xtau
4325 0 : do ileg=3,nleg
4326 : leg_array(ileg,itau) = (dble(2*(ileg-2)+1)*xtau*leg_array(ileg-1,itau)- &
4327 0 : & dble(ileg-2)*leg_array(ileg-2,itau)) / dble(ileg-1)
4328 : end do ! ileg
4329 : end do ! itau
4330 :
4331 0 : gtau_leg(:,:,:) = czero
4332 0 : do iflavor1=1,nflavor
4333 0 : do iflavor=1,nflavor
4334 0 : do itau=1,ntau
4335 0 : do ileg=1,nleg
4336 : gtau_leg(itau,iflavor,iflavor1) = gtau_leg(itau,iflavor,iflavor1) + &
4337 0 : & gl(ileg,iflavor,iflavor1)*leg_array(ileg,itau)*sqrt(dble(2*ileg-1))/beta
4338 : end do ! ileg
4339 : end do ! itau
4340 : end do ! iflavor
4341 : end do ! iflavor1
4342 :
4343 0 : if (myproc == 0 .and. off_diag) then
4344 :
4345 0 : if (open_file(trim(paw_dmft%filapp)//"_Gtau_offdiag_Leg_iatom"//tag_at//trim(adjustl(tag_lam2))//".dat",message,newunit=unt) /= 0) ABI_ERROR(message)
4346 0 : write(unt,'(6a)') "# Off-diagonal components of Legendre-sampled G(tau) in the CTQMC basis",ch10, &
4347 0 : & "# Columns are ordered this way:",ch10, &
4348 0 : & "# Imaginary Time ((Re(G_{ij}) Im(G_{ij}),i=1,2*(2*l+1)),j=1,2*(2*l+1)) where the", &
4349 0 : & " leftmost index varies first"
4350 0 : do itau=1,ntau
4351 0 : write(unt,'(2x,393(e18.10e3,2x))') beta*dble(itau-1)/dble(ntau-1), &
4352 0 : & ((dble(gtau_leg(itau,im,im1)),aimag(gtau_leg(itau,im,im1)),im=1,nflavor),im1=1,nflavor)
4353 : end do ! itau
4354 0 : close(unt)
4355 :
4356 : end if ! myproc=0
4357 :
4358 0 : if (myproc == 0) then
4359 :
4360 0 : if (open_file(trim(paw_dmft%filapp)//"_Gtau_diag_Leg_iatom"//tag_at//trim(adjustl(tag_lam2))//".dat",message,newunit=unt) /= 0) ABI_ERROR(message)
4361 0 : write(unt,'(5a)') "# Diagonal components of Legendre-sampled G(tau) in the CTQMC basis",ch10, &
4362 0 : & "# Columns are ordered this way:",ch10, &
4363 0 : & "# Imaginary Time (G_{ii},i=1,2*(2*l+1))"
4364 0 : do itau=1,ntau
4365 0 : write(unt,'(2x,393(e25.17e3,2x))') beta*dble(itau-1)/dble(ntau-1),(dble(gtau_leg(itau,im,im)),im=1,nflavor)
4366 : end do ! itau
4367 0 : close(unt)
4368 :
4369 : end if ! myproc=0
4370 :
4371 0 : ABI_FREE(gtau_leg)
4372 0 : ABI_FREE(leg_array)
4373 :
4374 0 : ABI_MALLOC(t_lp,(nleg,green%nmoments))
4375 :
4376 0 : fact = one ! this is equal to (p-1)!
4377 :
4378 : ! Compute analytical moments of Fourier transform of Legendre polynomial
4379 : ! (equation (E2) of PRB, 84(7), 2011, Boehnke et al)
4380 0 : do p=1,green%nmoments
4381 0 : if (p > 1) fact = fact * dble(p-1)
4382 0 : fact2 = fact
4383 0 : do l=0,nleg-1
4384 0 : if (l > 0) fact2 = fact2 * dble(l+p-1)
4385 0 : if (p > l+1) then
4386 0 : t_lp(l+1,p) = zero
4387 : else
4388 0 : if (l-p+1 > 0) fact2 = fact2 / dble(l-p+1) ! fact2 is now equal to (l+p-1)...(l-p+2)
4389 0 : if (mod(p+l,2) == 0) then
4390 0 : t_lp(l+1,p) = zero
4391 : else
4392 0 : t_lp(l+1,p) = (-1)**p * two * sqrt(dble(2*l+1)) * fact2 / fact
4393 : end if
4394 : end if ! p>l+1
4395 : end do ! l
4396 0 : do isppol=1,nsppol
4397 0 : do im1=1,tndim
4398 0 : do im=1,tndim
4399 : ! Do not use DOT_PRODUCT
4400 0 : green%moments(p)%matlu(iatom)%mat(im,im1,isppol) = sum(t_lp(:,p)*gl_tmp(:,im,im1,isppol)) / beta**p
4401 : end do ! im
4402 : end do ! im1
4403 : end do ! isppol
4404 : end do ! p
4405 :
4406 0 : ABI_FREE(gl_tmp)
4407 0 : ABI_FREE(t_lp)
4408 :
4409 0 : else if (ilam == ntot) then
4410 :
4411 0 : ABI_MALLOC(gl_dlr,(ndlr,tndim,tndim,nsppol))
4412 0 : ABI_MALLOC(gl_dlr_re,(ndlr))
4413 0 : ABI_MALLOC(gl_dlr_im,(ndlr))
4414 0 : ABI_MALLOC(bdlr,(ntau))
4415 0 : ABI_MALLOC(gtau_dlr,(ntau,nflavor,nflavor))
4416 0 : ABI_MALLOC(moment_fit,(green%nmoments))
4417 :
4418 0 : gtau_dlr(:,:,:) = czero
4419 :
4420 0 : call fit_dlr()
4421 :
4422 0 : if (myproc == 0 .and. off_diag) then
4423 :
4424 0 : if (open_file(trim(paw_dmft%filapp)//"_Gtau_offdiag_DLR_iatom"//tag_at//trim(adjustl(tag_lam2))//".dat",message,newunit=unt) /= 0) ABI_ERROR(message)
4425 0 : write(unt,'(6a)') "# Off-diagonal components of DLR fit of G(tau) in the CTQMC basis",ch10, &
4426 0 : & "# Columns are ordered this way:",ch10, &
4427 0 : & "# Imaginary Time ((Re(G_{ij}) Im(G_{ij}),i=1,2*(2*l+1)),j=1,2*(2*l+1)) where the", &
4428 0 : & " leftmost index varies first"
4429 :
4430 0 : do itau=1,ntau
4431 0 : write(unt,'(2x,393(e18.10e3,2x))') beta*dble(itau-1)/dble(ntau-1), &
4432 0 : & ((dble(gtau_dlr(itau,im,im1)),aimag(gtau_dlr(itau,im,im1)),im=1,nflavor),im1=1,nflavor)
4433 : end do ! itau
4434 0 : close(unt)
4435 :
4436 : end if ! myproc=0 and off_diag
4437 :
4438 0 : if (myproc == 0) then
4439 :
4440 0 : if (open_file(trim(paw_dmft%filapp)//"_Gtau_diag_DLR_iatom"//tag_at//trim(adjustl(tag_lam2))//".dat",message,newunit=unt) /= 0) ABI_ERROR(message)
4441 0 : write(unt,'(5a)') "# Diagonal components of DLR fit of G(tau) in the CTQMC basis",ch10, &
4442 0 : & "# Columns are ordered this way:",ch10, &
4443 0 : & "# Imaginary Time (G_{ii},i=1,2*(2*l+1))"
4444 0 : do itau=1,ntau
4445 0 : write(unt,'(2x,393(e25.17e3,2x))') beta*dble(itau-1)/dble(ntau-1),(dble(gtau_dlr(itau,im,im)),im=1,nflavor)
4446 : end do ! itau
4447 0 : close(unt)
4448 :
4449 : end if ! myproc
4450 :
4451 0 : ABI_FREE(gl_dlr)
4452 0 : ABI_FREE(gl_dlr_re)
4453 0 : ABI_FREE(gl_dlr_im)
4454 0 : ABI_FREE(bdlr)
4455 0 : ABI_FREE(gtau_dlr)
4456 0 : ABI_FREE(moment_fit)
4457 :
4458 : end if ! leg_measure
4459 :
4460 0 : if (myproc == 0 .and. paw_dmft%dmft_triqs_chiloc > 0) then
4461 0 : if (open_file(trim(paw_dmft%filapp)//"_LocalSusceptibility.dat",message,newunit=unt,status='unknown',form='formatted') /= 0) ABI_ERROR(message)
4462 0 : do itau=1,ntau
4463 0 : write(unt,*) beta * DBLE(itau-1) / DBLE(ntau), (chiloc_tmp(itau,1))
4464 : end do
4465 0 : close(unt)
4466 : end if
4467 :
4468 0 : if (myproc == 0 .and. off_diag) then
4469 :
4470 0 : if (open_file(trim(paw_dmft%filapp)//"_Gtau_offdiag_iatom"//tag_at//trim(adjustl(tag_lam2))//".dat",message,newunit=unt) /= 0) ABI_ERROR(message)
4471 0 : write(unt,'(6a)') "# Off-diagonal components of binned G(tau) in the CTQMC basis",ch10, &
4472 0 : & "# Columns are ordered this way:",ch10, &
4473 0 : & "# Imaginary Time ((Re(G_{ij}) Im(G_{ij}),i=1,2*(2*l+1)),j=1,2*(2*l+1)) where the", &
4474 0 : & " leftmost index varies first"
4475 :
4476 0 : do itau=1,ntau
4477 0 : write(unt,'(2x,393(e18.10e3,2x))') beta*dble(itau-1)/dble(ntau-1), &
4478 0 : & ((dble(gtau(itau,im,im1)),aimag(gtau(itau,im,im1)),im=1,nflavor),im1=1,nflavor)
4479 : end do ! itau
4480 0 : close(unt)
4481 :
4482 : end if ! myproc
4483 :
4484 0 : if (myproc == 0) then
4485 :
4486 0 : if (open_file(trim(paw_dmft%filapp)//"_Gtau_diag_iatom"//tag_at//trim(adjustl(tag_lam2))//".dat",message,newunit=unt) /= 0) ABI_ERROR(message)
4487 0 : write(unt,'(5a)') "# Diagonal components of binned G(tau) in the CTQMC basis",ch10, &
4488 0 : & "# Columns are ordered this way:",ch10, &
4489 0 : & "# Imaginary Time (G_{ii},i=1,2*(2*l+1))"
4490 0 : do itau=1,ntau
4491 0 : write(unt,'(2x,393(e25.17e3,2x))') beta*dble(itau-1)/dble(ntau-1),(dble(gtau(itau,im,im)),im=1,nflavor)
4492 : end do ! itau
4493 0 : close(unt)
4494 :
4495 : end if ! myproc
4496 :
4497 0 : if (entropy .and. ilam == ntot) then
4498 :
4499 0 : call compute_migdal_energy(emig(:),emig_tot,green,paw_dmft,hybmwdhyb,iatom=iatom)
4500 0 : green%ekin_imp = green%ekin_imp + two*emig_tot
4501 :
4502 : end if ! entropy
4503 :
4504 : end if ! ilam=ntot or debug
4505 :
4506 0 : if (integral > 0 .and. ilam < ntot .and. entropy) then
4507 :
4508 0 : elam = dble(eu)
4509 :
4510 0 : do isppol=1,nsppol
4511 0 : do im=1,tndim
4512 0 : iflavor = im + (isppol-1)*ndim
4513 :
4514 0 : if (nsppol == 1 .and. nspinor == 1) then
4515 0 : occ_tmp = occ(iflavor) + occ(iflavor+ndim)
4516 : else
4517 0 : occ_tmp = occ(iflavor)
4518 : end if
4519 0 : elam = elam + dble(shift_mu*occ_tmp)
4520 : end do ! im
4521 : end do ! isppol
4522 :
4523 0 : i = mod(ilam-1,ngauss) + 1
4524 0 : green%integral = green%integral + tweights(i)*elam*dx*half
4525 0 : elam_list(ilam) = elam
4526 :
4527 : end if ! integral and ilam<ntot and entropy
4528 :
4529 0 : if (integral > 0 .and. ilam == ntot-1 .and. entropy) then
4530 0 : write(message,'(a,3(3x,2a),a,12x,a,6x,2a,8x,a)') ch10,repeat("=",39),ch10,"== Summary of thermodynamic integration", &
4531 0 : & ch10,repeat("=",39),ch10,ch10,"Lambda","<dH/dlambda>",ch10,repeat("-",29)
4532 0 : call wrtout(std_out,message,'COLL')
4533 0 : do i=1,ntot-1
4534 0 : write(tag_lambda,'(f14.4)') lam_list(i)
4535 0 : write(tag_elam,'(f14.4)') elam_list(i)
4536 0 : tag_lambda = adjustl(tag_lambda)
4537 0 : tag_elam = adjustl(tag_elam)
4538 0 : pad_lambda = (14-len_trim(tag_lambda)) / 2
4539 0 : pad_elam = (14-len_trim(tag_elam)) / 2
4540 0 : write(message,'(8x,2(3a,1x),a,8x,a)') repeat(" ",pad_lambda),trim(tag_lambda),repeat(" ",14-pad_lambda-len_trim(tag_lambda)), &
4541 0 : & repeat(" ",pad_elam),trim(tag_elam),repeat(" ",14-pad_elam-len_trim(tag_elam)),ch10,repeat("-",29)
4542 0 : call wrtout(std_out,message,'COLL')
4543 : end do ! i
4544 0 : write(message,'(a,3x,a,f10.4,a)') ch10,"--> Integral is: ",green%integral,ch10
4545 0 : call wrtout(std_out,message,'COLL')
4546 : end if ! integral and ilam=ntot-1 and entropy
4547 :
4548 : end do ! ilam
4549 :
4550 0 : ABI_FREE(flavor_tmp)
4551 0 : ABI_FREE(gtau)
4552 0 : ABI_FREE(levels_ctqmc)
4553 0 : ABI_SFREE(gl)
4554 0 : ABI_SFREE(moments_self_1)
4555 0 : ABI_SFREE(moments_self_2)
4556 0 : ABI_SFREE(occ)
4557 :
4558 0 : if (paw_dmft%dmft_triqs_chiloc > 0) then
4559 0 : ABI_FREE(chiloc_tmp)
4560 :
4561 0 : if (basis .eq. 4) then
4562 : !do iatom=1,natom
4563 0 : lpawu = paw_dmft%lpawu(iatom)
4564 0 : if (lpawu == -1) cycle
4565 0 : ABI_FREE(magmom_tot(iatom)%value)
4566 : !end do
4567 0 : ABI_FREE(magmom_tot)
4568 0 : ABI_FREE(magmom_array)
4569 0 : ABI_FREE(matlumag_tot)
4570 0 : magmom_ptr = C_NULL_PTR
4571 : end if
4572 : end if
4573 :
4574 : end do ! iatom
4575 :
4576 0 : ABI_FREE(elam_list)
4577 0 : ABI_FREE(lam_list)
4578 :
4579 0 : ABI_SFREE(tweights)
4580 0 : ABI_SFREE(tpoints)
4581 :
4582 0 : call occup_green_tau(green)
4583 :
4584 0 : write(message,'(a,3x,a)') ch10,"== Print Occupation matrix in CTQMC basis"
4585 0 : call wrtout(std_out,message,"COLL")
4586 0 : call print_matlu(green%occup_tau%matlu(:),natom,1)
4587 :
4588 0 : if (basis > 0) then
4589 0 : write(message,'(a,3x,a)') ch10,"== Rotating back to cubic basis"
4590 0 : call wrtout(std_out,message,"COLL")
4591 : end if
4592 :
4593 : ! Build back Weiss field
4594 0 : do ifreq=1,nwlo
4595 0 : shift(:) = cmplx(zero,paw_dmft%omega_lo(ifreq),kind=dp)
4596 0 : call add_matlu(weiss%oper(ifreq)%matlu(:),energy_level%matlu(:),matlu_tmp(:),natom,1)
4597 0 : call copy_matlu(matlu_tmp(:),weiss%oper(ifreq)%matlu(:),natom)
4598 0 : call shift_matlu(weiss%oper(ifreq)%matlu(:),natom,shift(:))
4599 0 : call fac_matlu(weiss%oper(ifreq)%matlu(:),natom,-cone)
4600 : end do ! ifreq
4601 :
4602 0 : if (basis > 0) then
4603 0 : if (basis == 1 .or. basis == 2) then
4604 0 : call rotate_matlu(energy_level%matlu(:),eigvectmatlu(:),natom,0)
4605 0 : else if (basis == 4) then
4606 0 : call ylm2jmj_matlu(energy_level%matlu(:),natom,2,paw_dmft)
4607 : end if ! basis /= 3
4608 0 : call slm2ylm_matlu(energy_level%matlu(:),natom,paw_dmft,2,0)
4609 0 : do i=2,weiss%nmoments-1
4610 0 : if (basis == 1 .or. basis == 2) then
4611 0 : call rotate_matlu(weiss%moments(i)%matlu(:),eigvectmatlu(:),natom,0)
4612 0 : else if (basis == 4) then
4613 0 : call ylm2jmj_matlu(weiss%moments(i)%matlu(:),natom,2,paw_dmft)
4614 : end if
4615 0 : call slm2ylm_matlu(weiss%moments(i)%matlu(:),natom,paw_dmft,2,0)
4616 : end do ! i
4617 0 : do i=1,green%nmoments
4618 0 : if (basis == 1 .or. basis == 2) then
4619 0 : call rotate_matlu(green%moments(i)%matlu(:),eigvectmatlu(:),natom,0)
4620 0 : else if (basis == 4) then
4621 0 : call ylm2jmj_matlu(green%moments(i)%matlu(:),natom,2,paw_dmft)
4622 : end if
4623 0 : call slm2ylm_matlu(green%moments(i)%matlu(:),natom,paw_dmft,2,0)
4624 : end do ! i
4625 0 : do ifreq=1,nwlo
4626 0 : if (green%distrib%procf(ifreq) /= myproc) cycle
4627 0 : if (basis == 1 .or. basis == 2) then
4628 0 : call rotate_matlu(weiss%oper(ifreq)%matlu(:),eigvectmatlu(:),natom,0)
4629 0 : call rotate_matlu(green%oper(ifreq)%matlu(:),eigvectmatlu(:),natom,0)
4630 0 : else if (basis == 4) then
4631 0 : call ylm2jmj_matlu(weiss%oper(ifreq)%matlu(:),natom,2,paw_dmft)
4632 0 : call ylm2jmj_matlu(green%oper(ifreq)%matlu(:),natom,2,paw_dmft)
4633 : end if
4634 0 : call slm2ylm_matlu(weiss%oper(ifreq)%matlu(:),natom,paw_dmft,2,0)
4635 0 : call slm2ylm_matlu(green%oper(ifreq)%matlu(:),natom,paw_dmft,2,0)
4636 : end do ! ifreq
4637 0 : if (basis == 1 .or. basis == 2) then
4638 0 : call rotate_matlu(green%occup_tau%matlu(:),eigvectmatlu(:),natom,0)
4639 0 : else if (basis == 4) then
4640 0 : call ylm2jmj_matlu(green%occup_tau%matlu(:),natom,2,paw_dmft)
4641 : end if
4642 0 : call slm2ylm_matlu(green%occup_tau%matlu(:),natom,paw_dmft,2,0)
4643 : end if! basis > 0
4644 :
4645 : ! Since we possibly neglected some off-diagonal elements and imaginary part,
4646 : ! the levels and hybridization might not be symmetrized anymore
4647 0 : call sym_matlu(energy_level%matlu(:),paw_dmft)
4648 0 : do i=2,weiss%nmoments-1
4649 0 : call sym_matlu(weiss%moments(i)%matlu(:),paw_dmft)
4650 : end do ! i
4651 0 : do i=1,green%nmoments
4652 0 : call sym_matlu(green%moments(i)%matlu(:),paw_dmft)
4653 : end do ! i
4654 0 : do ifreq=1,nwlo
4655 0 : if (green%distrib%procf(ifreq) /= myproc) cycle
4656 0 : call sym_matlu(weiss%oper(ifreq)%matlu(:),paw_dmft)
4657 0 : call sym_matlu(green%oper(ifreq)%matlu(:),paw_dmft)
4658 : end do ! ifreq
4659 0 : call copy_matlu(green%occup_tau%matlu(:),dmat_ctqmc(:),natom)
4660 0 : call sym_matlu(green%occup_tau%matlu(:),paw_dmft)
4661 :
4662 0 : call diff_matlu("CTQMC occupations","Symmetrized CTQMC occupations",dmat_ctqmc(:),green%occup_tau%matlu(:),natom,0,tol4)
4663 :
4664 0 : call gather_oper(weiss%oper(:),weiss%distrib,paw_dmft,opt_ksloc=2)
4665 0 : call gather_oper(green%oper(:),green%distrib,paw_dmft,opt_ksloc=2)
4666 :
4667 0 : call compute_moments_loc(green,self_new,energy_level,weiss,1,opt_log=paw_dmft%dmft_triqs_entropy,shift_mu=shift_mu)
4668 :
4669 0 : if (entropy .and. integral > 0) then
4670 0 : call compute_trace_log_loc(weiss,paw_dmft,green%fband_weiss,opt_inv=1)
4671 : end if
4672 :
4673 0 : call destroy_matlu(dmat_ctqmc(:),natom)
4674 0 : call destroy_matlu(eigvectmatlu(:),natom)
4675 0 : call destroy_matlu(ftau(:),natom)
4676 0 : call destroy_matlu(matlu_tmp(:),natom)
4677 0 : call destroy_matlu(udens_rot(:),natom)
4678 :
4679 0 : call destroy_oper(energy_level)
4680 :
4681 0 : call destroy_vee(paw_dmft,vee_rot(:))
4682 :
4683 0 : ABI_FREE(block_list)
4684 0 : ABI_FREE(dmat_ctqmc)
4685 0 : ABI_FREE(eigvectmatlu)
4686 0 : ABI_FREE(flavor_list)
4687 0 : ABI_FREE(ftau)
4688 0 : ABI_FREE(inner_list)
4689 0 : ABI_FREE(matlu_tmp)
4690 0 : ABI_FREE(nblocks)
4691 0 : ABI_FREE(shift)
4692 0 : ABI_FREE(siz_block)
4693 0 : ABI_FREE(udens_rot)
4694 0 : ABI_FREE(vee_rot)
4695 :
4696 0 : ABI_SFREE(adlr)
4697 0 : ABI_SFREE(adlr_iw)
4698 0 : ABI_SFREE(emig)
4699 0 : ABI_SFREE(wdlr)
4700 0 : ABI_SFREE(wdlr_beta)
4701 :
4702 0 : if (entropy) then
4703 0 : call destroy_self(hybmwdhyb)
4704 : end if
4705 :
4706 : contains
4707 :
4708 0 : subroutine cubic_spline()
4709 :
4710 : !Arguments ------------------------------------
4711 : !Local variables ------------------------------
4712 0 : complex(dp), allocatable :: y(:),yp(:)
4713 : ! ************************************************************************
4714 :
4715 0 : ABI_MALLOC(y,(nwlo))
4716 0 : ABI_MALLOC(yp,(nwlo))
4717 :
4718 0 : do iatom=1,natom
4719 0 : lpawu = paw_dmft%lpawu(iatom)
4720 0 : if (lpawu == -1) cycle
4721 0 : tndim = nspinor * (2*lpawu+1)
4722 0 : do isppol=1,nsppol
4723 0 : do im1=1,tndim
4724 0 : do im=1,tndim
4725 0 : do ifreq=1,nwlo
4726 0 : y(ifreq) = weiss%oper(ifreq)%matlu(iatom)%mat(im,im1,isppol)
4727 : end do ! ifreq
4728 : ! Boundary condition not-a-knot seems to get the best results
4729 0 : call spline2_complex(paw_dmft%omega_lo(:),y(:),nwlo,yp(:),czero,czero,3,3)
4730 0 : do ifreq=1,nwlo
4731 : hybmwdhyb%oper(ifreq)%matlu(iatom)%mat(im,im1,isppol) = &
4732 : & energy_level%matlu(iatom)%mat(im,im1,isppol) + y(ifreq) - &
4733 0 : & paw_dmft%omega_lo(ifreq)*yp(ifreq)
4734 : end do ! ifreq
4735 : end do ! im
4736 : end do ! im1
4737 : end do ! isppol
4738 : end do ! iatom
4739 :
4740 0 : ABI_FREE(y)
4741 0 : ABI_FREE(yp)
4742 :
4743 0 : end subroutine cubic_spline
4744 :
4745 0 : subroutine fit_dlr()
4746 :
4747 : !Arguments ------------------------------------
4748 : !Local variables ------------------------------
4749 : ! ************************************************************************
4750 :
4751 0 : do isppol=1,nsppol
4752 0 : do im1=1,tndim
4753 0 : iflavor1 = im1 + (isppol-1)*ndim
4754 0 : do im=1,tndim
4755 0 : iflavor = im + (isppol-1)*ndim
4756 :
4757 0 : ncon = merge(merge(4,3,iflavor==iflavor1),1,density_matrix)
4758 0 : nmoments = merge(3,1,density_matrix)
4759 0 : if (nsppol == 1 .and. nspinor == 1) gtau(:,iflavor,iflavor1) = &
4760 0 : & (gtau(:,iflavor,iflavor1)+gtau(:,iflavor+ndim,iflavor1+ndim)) * half
4761 0 : occ_tmp = green%oper_tau(1)%matlu(iatom)%mat(im,im1,isppol)
4762 :
4763 0 : bdlr(:) = dble(gtau(:,iflavor,iflavor1))
4764 :
4765 0 : do i=1,nmoments
4766 0 : moment_fit(i) = dble(green%moments(i)%matlu(iatom)%mat(im,im1,isppol))
4767 : end do ! i
4768 :
4769 0 : call slsqp_wrapper(ncon,ndlr,lsq_g,con_moments,jac_lsq_g,jac_con_moments,gl_dlr_re(:))
4770 :
4771 0 : if (density_matrix) ncon = 3
4772 :
4773 0 : bdlr(:) = aimag(gtau(:,iflavor,iflavor1))
4774 0 : do i=1,nmoments
4775 0 : moment_fit(i) = aimag(green%moments(i)%matlu(iatom)%mat(im,im1,isppol))
4776 : end do ! i
4777 :
4778 0 : call slsqp_wrapper(ncon,ndlr,lsq_g,con_moments,jac_lsq_g,jac_con_moments,gl_dlr_im(:))
4779 :
4780 0 : gl_dlr(:,im,im1,isppol) = cmplx(gl_dlr_re(:),gl_dlr_im(:),kind=dp)
4781 :
4782 : ! Do not use DOT_PRODUCT
4783 0 : green%moments(1)%matlu(iatom)%mat(im,im1,isppol) = sum(gl_dlr(:,im,im1,isppol))
4784 0 : do i=2,green%nmoments
4785 0 : green%moments(i)%matlu(iatom)%mat(im,im1,isppol) = sum(gl_dlr(:,im,im1,isppol)*wdlr_beta(:,i-1))
4786 : end do ! i
4787 :
4788 0 : do itau=1,ntau
4789 : ! Do not use DOT_PRODUCT
4790 0 : gtau_dlr(itau,iflavor,iflavor1) = sum(gl_dlr(:,im,im1,isppol)*adlr(:,itau))
4791 : end do ! itau
4792 0 : if (nsppol == 1 .and. nspinor == 1) gtau_dlr(:,iflavor+ndim,iflavor1+ndim) = gtau_dlr(:,iflavor,iflavor1)
4793 :
4794 : end do ! im
4795 : end do ! im1
4796 : end do ! isppol
4797 :
4798 0 : do ifreq=1,nwlo
4799 0 : do isppol=1,nsppol
4800 0 : do im1=1,tndim
4801 0 : do im=1,tndim
4802 : ! Do not use DOT_PRODUCT
4803 0 : green%oper(ifreq)%matlu(iatom)%mat(im,im1,isppol) = sum(gl_dlr(:,im,im1,isppol)*adlr_iw(:,ifreq))
4804 : end do ! im
4805 : end do ! im1
4806 : end do ! isppol
4807 : end do ! ifreq
4808 :
4809 0 : end subroutine fit_dlr
4810 :
4811 0 : subroutine diag_block(matlu)
4812 :
4813 : !Arguments ------------------------------------
4814 : type(matlu_type), intent(inout) :: matlu(natom)
4815 : !Local variables ------------------------------
4816 : integer :: i,iatom,iblock,iflavor,iflavor1,im,im1
4817 : integer :: info,is,j,lpawu,lwork,ndim,sizb,tndim
4818 0 : real(dp), allocatable :: eig(:),rwork(:)
4819 0 : complex(dp), allocatable :: mat_tmp(:,:),work(:)
4820 : ! ************************************************************************
4821 :
4822 0 : is = 1
4823 0 : ABI_MALLOC(eig,(nflavor_max))
4824 0 : ABI_MALLOC(mat_tmp,(nflavor_max,nflavor_max))
4825 0 : ABI_MALLOC(rwork,(3*nflavor_max-2))
4826 0 : ABI_MALLOC(work,(2*nflavor_max-1))
4827 :
4828 0 : do iatom=1,natom
4829 0 : lpawu = paw_dmft%lpawu(iatom)
4830 0 : if (lpawu == -1) cycle
4831 0 : ndim = 2*lpawu + 1
4832 0 : tndim = nspinor * ndim
4833 0 : do iblock=1,nblocks(iatom)
4834 0 : sizb = siz_block(iblock,iatom)
4835 0 : lwork = 2*sizb - 1
4836 0 : do j=1,sizb
4837 0 : iflavor1 = flavor_list(j,iblock,iatom) + 1
4838 0 : im1 = mod(iflavor1-1,tndim) + 1
4839 0 : if (nspinor == 1) then
4840 0 : is = (iflavor1-1)/ndim + 1
4841 0 : if (is > nsppol) exit
4842 : end if
4843 0 : do i=1,sizb
4844 0 : iflavor = flavor_list(i,iblock,iatom) + 1
4845 0 : im = mod(iflavor-1,tndim) + 1
4846 0 : mat_tmp(i,j) = matlu(iatom)%mat(im,im1,is)
4847 0 : matlu(iatom)%mat(im,im1,is) = czero
4848 : end do ! i
4849 : end do ! j
4850 :
4851 0 : if (is > nsppol) cycle
4852 :
4853 : call zheev('v','u',sizb,mat_tmp(:,1:sizb),nflavor_max,eig(1:sizb), &
4854 0 : & work(1:lwork),lwork,rwork(1:3*sizb-2),info)
4855 :
4856 0 : do j=1,sizb
4857 0 : iflavor1 = flavor_list(j,iblock,iatom) + 1
4858 0 : im1 = mod(iflavor1-1,tndim) + 1
4859 0 : matlu(iatom)%mat(im1,im1,is) = cmplx(eig(j),zero,kind=dp)
4860 0 : do i=1,sizb
4861 0 : iflavor = flavor_list(i,iblock,iatom) + 1
4862 0 : im = mod(iflavor-1,tndim) + 1
4863 0 : eigvectmatlu(iatom)%mat(im,im1,is) = mat_tmp(i,j)
4864 : end do ! i
4865 : end do ! j
4866 : end do ! iblock
4867 :
4868 0 : if (pawprtvol >= 3) then
4869 0 : write(tag_at,'(i4)') iatom
4870 0 : do isppol=1,nsppol
4871 0 : write(message,'(4a,i1)') ch10," EIGENVECTORS for atom ",trim(adjustl(tag_at))
4872 0 : if (nspinor == 1) then
4873 0 : write(tag_block4,'(i1)') isppol
4874 0 : message = trim(message) // " and isppol " // tag_block4
4875 : end if
4876 0 : call wrtout(std_out,message,'COLL')
4877 0 : do im=1,tndim
4878 : write(message,'(12(1x,18(1x,"(",f9.3,",",f9.3,")")))') &
4879 0 : & (eigvectmatlu(iatom)%mat(im,im1,isppol),im1=1,tndim)
4880 0 : call wrtout(std_out,message,'COLL')
4881 : end do ! im1
4882 : end do ! isppol
4883 : end if ! pawprtvol>=3
4884 :
4885 : end do ! iatom
4886 :
4887 0 : ABI_FREE(eig)
4888 0 : ABI_FREE(mat_tmp)
4889 0 : ABI_FREE(rwork)
4890 0 : ABI_FREE(work)
4891 :
4892 0 : end subroutine diag_block
4893 :
4894 0 : subroutine lsq_g(gl,err)
4895 :
4896 : !Arguments ------------------------------------
4897 : real(dp), intent(in) :: gl(:)
4898 : real(dp), intent(out) :: err
4899 : !Local variables ------------------------------
4900 : ! ************************************************************************
4901 :
4902 0 : err = zero
4903 0 : do itau=1,ntau
4904 0 : err = err + (dot_product(gl(:),adlr(:,itau))-bdlr(itau))**2
4905 : end do
4906 :
4907 0 : end subroutine lsq_g
4908 :
4909 0 : subroutine jac_lsq_g(gl,jac)
4910 :
4911 : !Arguments ------------------------------------
4912 : real(dp), intent(in) :: gl(:)
4913 : real(dp), intent(inout) :: jac(:)
4914 : !Local variables ------------------------------
4915 : ! ************************************************************************
4916 :
4917 0 : jac(:) = zero
4918 0 : do itau=1,ntau
4919 0 : jac(1:ndlr) = jac(1:ndlr) + (dot_product(gl(:),adlr(:,itau))-bdlr(itau))*adlr(:,itau)
4920 : end do
4921 0 : jac = jac * two
4922 :
4923 0 : end subroutine jac_lsq_g
4924 :
4925 0 : subroutine con_moments(gl,con)
4926 :
4927 : !Arguments ------------------------------------
4928 : real(dp), intent(in) :: gl(:)
4929 : real(dp), intent(inout) :: con(:)
4930 : !Local variables ------------------------------
4931 : ! ************************************************************************
4932 :
4933 0 : con(1) = sum(gl(:)) - moment_fit(1)
4934 0 : if (ncon > 1) then
4935 0 : con(2) = dot_product(gl(:),wdlr_beta(:,1)) - moment_fit(2)
4936 0 : con(3) = dot_product(gl(:),wdlr_beta(:,2)) - moment_fit(3)
4937 0 : if (ncon == 4) con(4) = dot_product(gl(:),adlr(:,1)) - dble(occ_tmp)
4938 : end if ! ncon>1
4939 :
4940 0 : end subroutine con_moments
4941 :
4942 0 : subroutine jac_con_moments(gl,jac_con)
4943 :
4944 : !Arguments ------------------------------------
4945 : real(dp), intent(in) :: gl(:)
4946 : real(dp), intent(inout) :: jac_con(:,:)
4947 : !Local variables ------------------------------
4948 : ! ************************************************************************
4949 :
4950 : ABI_UNUSED(gl(:))
4951 :
4952 0 : jac_con(1,1:ndlr) = one
4953 0 : if (ncon > 1) then
4954 0 : jac_con(2,1:ndlr) = wdlr_beta(:,1)
4955 0 : jac_con(3,1:ndlr) = wdlr_beta(:,2)
4956 0 : if (ncon == 4) jac_con(4,1:ndlr) = adlr(:,1)
4957 : end if ! ncon>1
4958 0 : jac_con(:,ndlr+1) = zero ! not sure if this is necessary, but this is what they do in the SCIPY interface with SLSQP
4959 :
4960 0 : end subroutine jac_con_moments
4961 :
4962 : end subroutine ctqmc_calltriqs_c
4963 : !!***
4964 :
4965 : !!****f* m_forctqmc/k_it
4966 : !! NAME
4967 : !! k_it
4968 : !!
4969 : !! FUNCTION
4970 : !! Computes the imaginary time kernel K(tau,omega).
4971 : !!
4972 : !! INPUTS
4973 : !! tau = imaginary time divided by beta
4974 : !! omega = real frequency multiplied by beta
4975 : !!
4976 : !! OUTPUT
4977 : !!
4978 : !! SOURCE
4979 :
4980 0 : function k_it(tau,omega)
4981 :
4982 : !Arguments ------------------------------------
4983 : real(dp), intent(in) :: tau, omega
4984 : real(dp) :: k_it
4985 : ! *********************************************************************
4986 :
4987 0 : k_it = merge(-exp(-tau*omega)/(one+exp(-omega)),-exp((one-tau)*omega)/(one+exp(omega)),omega>=0)
4988 :
4989 0 : end function k_it
4990 : !!***
4991 :
4992 : !!****f* m_forctqmc/k_iw
4993 : !! NAME
4994 : !! k_iw
4995 : !!
4996 : !! FUNCTION
4997 : !! Computes the imaginary frequency kernel K(iom,omega)
4998 : !!
4999 : !! INPUTS
5000 : !! iom = imaginary part of the Matsubara frequency
5001 : !! omega = real frequency
5002 : !!
5003 : !! OUTPUT
5004 : !!
5005 : !! SOURCE
5006 :
5007 0 : function k_iw(iom,omega)
5008 :
5009 : !Arguments ------------------------------------
5010 : real(dp), intent(in) :: iom,omega
5011 : complex(dp) :: k_iw
5012 : ! *********************************************************************
5013 :
5014 0 : k_iw = cone / (cmplx(zero,iom,kind=dp)-omega)
5015 :
5016 : end function k_iw
5017 : !!***
5018 :
5019 : !!****f* m_forctqmc/slsqp_wrapper
5020 : !! NAME
5021 : !! slsqp_wrapper
5022 : !!
5023 : !! FUNCTION
5024 : !! Optimizes a function with several variables
5025 : !! under several constraints, using the SLSQP algorithm.
5026 : !!
5027 : !! INPUTS
5028 : !! m = number of constraints
5029 : !! n = number of variables
5030 : !! fun = function to optimize
5031 : !! con = constraints
5032 : !! jac = jacobian of the function
5033 : !! jac_con = jacobian of the constraints
5034 : !!
5035 : !! OUTPUT
5036 : !! x(n) = minimizer
5037 : !!
5038 : !! SOURCE
5039 :
5040 0 : subroutine slsqp_wrapper(m,n,fun,con,jac,jac_con,x)
5041 :
5042 : use m_slsqp, only : slsqp
5043 :
5044 : !Arguments ------------------------------------
5045 : integer, intent(in) :: m,n
5046 : real(dp), intent(inout) :: x(n)
5047 :
5048 : interface
5049 :
5050 : subroutine fun(x,f)
5051 : use defs_basis
5052 : real(dp), intent(in) :: x(:)
5053 : real(dp), intent(out) :: f
5054 : end subroutine fun
5055 :
5056 : subroutine con(x,c)
5057 : use defs_basis
5058 : real(dp), intent(in) :: x(:)
5059 : real(dp), intent(inout) :: c(:)
5060 : end subroutine con
5061 :
5062 : subroutine jac(x,g)
5063 : use defs_basis
5064 : real(dp), intent(in) :: x(:)
5065 : real(dp), intent(inout) :: g(:)
5066 : end subroutine jac
5067 :
5068 : subroutine jac_con(x,a)
5069 : use defs_basis
5070 : real(dp), intent(in) :: x(:)
5071 : real(dp), intent(inout) :: a(:,:)
5072 : end subroutine jac_con
5073 :
5074 : end interface
5075 : !Local variables ------------------------------
5076 : integer :: i,iexact,incons,ireset,iter,itermx,l_jw,l_w,la
5077 : integer :: line,maxiter,meq,mineq,mode,n1,n2,n3
5078 : real(dp) :: f,acc,alpha,f0,gs,h1,h2,h3,h4,t,t0,tol
5079 0 : real(dp) :: c(max(m,1)),g(n+1),xl(n),xu(n)
5080 0 : real(dp) :: a(max(m,1),n+1)
5081 0 : real(dp), allocatable :: w(:)
5082 0 : integer, allocatable :: jw(:)
5083 : ! ************************************************************************
5084 :
5085 0 : maxiter = 10000
5086 0 : meq = m ! all constraints are equality constraints here
5087 0 : la = max(m,1)
5088 0 : x(:) = zero ; xl(:) = zero ; xu(:) = zero
5089 0 : xl(:) = xl(:) / zero ! set lower and upper bounds to NaN (very important, this is how slsqp recognizes that no bounds should be applied)
5090 0 : xu(:) = xu(:) / zero
5091 :
5092 0 : call fun(x(:),f)
5093 0 : call con(x(:),c(:))
5094 0 : call jac(x(:),g(:))
5095 0 : call jac_con(x(:),a(:,:))
5096 0 : acc = tol8 ! best not to overconverge the result, in order to avoid overfitting
5097 0 : iter = maxiter
5098 0 : mode = 0
5099 : n1 = n + 1
5100 0 : mineq = m - meq + 2*n1
5101 : l_w = (3*n1+m)*(n1+1) + (n1-meq+1)*(mineq+2) + 2*mineq & ! as recommended
5102 0 : & +(n1+mineq)*(n1-meq) + 2*meq + n1 + n1*n/2 + 2*m + 3*n + 3*n1 + 1
5103 0 : ABI_MALLOC(w,(l_w))
5104 0 : w = zero
5105 0 : l_jw = mineq ! as recommended
5106 0 : ABI_MALLOC(jw,(l_jw))
5107 0 : jw = 0 ; alpha = zero ; f0 = zero
5108 0 : gs = zero ; h1 = zero ; h2 = zero
5109 0 : h3 = zero ; h4 = zero ; t = zero
5110 0 : t0 = zero ; tol = zero ; iexact = 0
5111 0 : incons = 0 ; ireset = 0 ; itermx = 0
5112 0 : line = 0 ; n1 = 0 ; n2 = 0 ; n3 = 0
5113 :
5114 0 : do i=1,maxiter
5115 :
5116 : call slsqp(m,meq,la,n,x(:),xl(:),xu(:),f,c(:),g(:),a(:,:),acc,iter,mode,w(:),l_w, &
5117 : & jw(:),l_jw,alpha,f0,gs,h1,h2,h3,h4,t,t0,tol,iexact,incons,ireset,itermx, &
5118 0 : & line,n1,n2,n3)
5119 :
5120 0 : if (abs(mode) /= 1) exit
5121 0 : if (mode == -1) then
5122 0 : call jac(x(:),g(:))
5123 0 : call jac_con(x(:),a(:,:))
5124 : end if
5125 0 : if (mode == 1) then
5126 0 : call fun(x(:),f)
5127 0 : call con(x(:),c(:))
5128 : end if
5129 : end do ! i
5130 :
5131 0 : if (mode /= 0) ABI_ERROR("Error in the optimization procedure during the DLR fit")
5132 :
5133 0 : ABI_FREE(w)
5134 0 : ABI_FREE(jw)
5135 :
5136 0 : end subroutine slsqp_wrapper
5137 : !!***
5138 :
5139 : !!****f* m_forctqmc/fourier_inv
5140 : !! NAME
5141 : !! fourier_inv
5142 : !!
5143 : !! FUNCTION
5144 : !! Computes the inverse Fourier transform of a frequency-dependent operator,
5145 : !! using analytical formulas for the asymptotic behavior. It is assumed the
5146 : !! asymptotic behavior is moments(1)/(iw_n) + moments(2)/(iwn)**2 + ...,
5147 : !! so if you want to use this routine for an operator with a 0th order moment,
5148 : !! you need to subtract it before calling this routine.
5149 : !!
5150 : !! INPUTS
5151 : !! paw_dmft <type(paw_dmft_type)>= DMFT data structure
5152 : !! nmoments = number of moments
5153 : !! ntau = number of (equidistant) imaginary time points on [0,beta]
5154 : !! oper_freq = operator for each Matsubara frequency
5155 : !! moments = high-frequency moments of the operator
5156 : !!
5157 : !! OUTPUT
5158 : !! matlu_tau(2*(2*lpawu+1),2*(2*lpawu+1),ntau) = operator for each tau point
5159 : !!
5160 : !! SIDE EFFECTS
5161 : !!
5162 : !! NOTES
5163 : !!
5164 : !! SOURCE
5165 :
5166 0 : subroutine fourier_inv(paw_dmft,nmoments,ntau,matlu_tau,oper_freq,moments)
5167 :
5168 : !Arguments ------------------------------------
5169 : integer, intent(in) :: nmoments,ntau
5170 : type(paw_dmft_type), intent(in) :: paw_dmft
5171 : type(oper_type), intent(in) :: oper_freq(paw_dmft%dmft_nwlo),moments(nmoments)
5172 : type(matlu_type), intent(inout) :: matlu_tau(paw_dmft%natom)
5173 : !Local variables ------------------------------
5174 : integer :: i,iatom,ibuf,ibuf_tau,ierr,ifreq,im1,isppol
5175 : integer :: itau,itaub,itauf,lpawu,myproc,natom,ndim,nproc
5176 : integer :: nspinor,nsppol,ntau_proc,nwlo,ratio,residu,siz_buf,tndim
5177 : real(dp) :: beta,omegatau,tau
5178 : complex(dp) :: fac
5179 0 : integer, allocatable :: displs(:),recvcounts(:)
5180 0 : complex(dp), allocatable :: buffer(:),buffer_tot(:),omega_fac(:)
5181 : ! ************************************************************************
5182 :
5183 0 : beta = one / paw_dmft%temp
5184 0 : myproc = paw_dmft%myproc
5185 0 : natom = paw_dmft%natom
5186 0 : nspinor = paw_dmft%nspinor
5187 0 : nsppol = paw_dmft%nsppol
5188 0 : nproc = paw_dmft%nproc
5189 0 : nwlo = paw_dmft%dmft_nwlo
5190 :
5191 0 : call zero_matlu(matlu_tau(:),natom)
5192 :
5193 0 : ABI_MALLOC(displs,(nproc))
5194 0 : ABI_MALLOC(recvcounts,(nproc))
5195 :
5196 0 : ratio = ntau / nproc
5197 0 : residu = ntau - ratio*nproc
5198 :
5199 0 : itau = 1
5200 0 : do i=0,nproc-1
5201 0 : ntau_proc = merge(ratio+1,ratio,i<residu)
5202 0 : recvcounts(i+1) = ntau_proc
5203 0 : if (myproc == i) itaub = itau
5204 0 : itau = itau + ntau_proc
5205 : end do ! i
5206 0 : itauf = itaub + recvcounts(myproc+1) - 1
5207 :
5208 0 : siz_buf = 0
5209 0 : do iatom=1,natom
5210 0 : lpawu = paw_dmft%lpawu(iatom)
5211 0 : if (lpawu == -1) cycle
5212 0 : siz_buf = siz_buf + (2*lpawu+1)**2
5213 : end do ! iatom
5214 :
5215 0 : siz_buf = siz_buf * (nspinor**2) * nsppol
5216 :
5217 0 : recvcounts(:) = recvcounts(:) * siz_buf
5218 :
5219 0 : displs(1) = 0
5220 0 : do i=2,nproc
5221 0 : displs(i) = displs(i-1) + recvcounts(i-1)
5222 : end do ! i
5223 :
5224 0 : ABI_MALLOC(buffer,(recvcounts(myproc+1)))
5225 0 : ABI_MALLOC(buffer_tot,(recvcounts(nproc)+displs(nproc)))
5226 0 : ABI_MALLOC(omega_fac,(nmoments))
5227 :
5228 0 : buffer(:) = czero
5229 :
5230 : ibuf_tau = 0
5231 0 : do itau=itaub,itauf
5232 :
5233 0 : tau = dble(itau-1) * beta / dble(ntau-1)
5234 0 : omega_fac(:) = czero
5235 :
5236 0 : do ifreq=nwlo,1,-1 ! NEVER change this summation order and DON'T replace by the intrinsic SUM
5237 0 : omegatau = mod(paw_dmft%omega_lo(ifreq)*tau,two_pi)
5238 0 : fac = two * paw_dmft%temp * exp(-j_dpc*omegatau)
5239 0 : do i=1,nmoments
5240 0 : omega_fac(i) = omega_fac(i) - fac/(j_dpc*paw_dmft%omega_lo(ifreq))**i
5241 : end do
5242 : ibuf = 0
5243 0 : do iatom=1,natom
5244 0 : lpawu = paw_dmft%lpawu(iatom)
5245 0 : if (lpawu == -1) cycle
5246 0 : tndim = nspinor * (2*lpawu+1)
5247 0 : do isppol=1,nsppol
5248 0 : do im1=1,tndim
5249 : buffer(ibuf_tau+ibuf+1:ibuf_tau+ibuf+tndim) = buffer(ibuf_tau+ibuf+1:ibuf_tau+ibuf+tndim) + &
5250 0 : fac*oper_freq(ifreq)%matlu(iatom)%mat(:,im1,isppol)
5251 0 : ibuf = ibuf + tndim
5252 : end do ! im
5253 : end do ! isppol
5254 : end do ! iatom
5255 : end do ! ifreq
5256 :
5257 0 : omega_fac(1) = omega_fac(1) - half
5258 0 : omega_fac(2) = omega_fac(2) + tau/two - beta/four
5259 0 : omega_fac(3) = omega_fac(3) - (tau**2)/four + tau*beta/four
5260 :
5261 0 : do i=1,nmoments
5262 : ibuf = 0
5263 0 : do iatom=1,natom
5264 0 : lpawu = paw_dmft%lpawu(iatom)
5265 0 : if (lpawu == -1) cycle
5266 0 : tndim = nspinor * (2*lpawu+1)
5267 0 : do isppol=1,nsppol
5268 0 : do im1=1,tndim
5269 : buffer(ibuf_tau+ibuf+1:ibuf_tau+ibuf+tndim) = buffer(ibuf_tau+ibuf+1:ibuf_tau+ibuf+tndim) + &
5270 0 : & moments(i)%matlu(iatom)%mat(:,im1,isppol)*omega_fac(i)
5271 0 : ibuf = ibuf + tndim
5272 : end do ! im1
5273 : end do ! isppol
5274 : end do ! iatom
5275 : end do ! i
5276 :
5277 0 : ibuf_tau = ibuf_tau + siz_buf
5278 :
5279 : end do ! itau
5280 :
5281 0 : ABI_FREE(omega_fac)
5282 :
5283 0 : call xmpi_allgatherv(buffer(:),recvcounts(myproc+1),buffer_tot(:),recvcounts(:),displs(:),paw_dmft%spacecomm,ierr)
5284 :
5285 0 : ABI_FREE(displs)
5286 0 : ABI_FREE(recvcounts)
5287 :
5288 0 : ibuf = 0
5289 0 : do itau=1,ntau
5290 0 : do iatom=1,natom
5291 0 : lpawu = paw_dmft%lpawu(iatom)
5292 0 : if (lpawu == -1) cycle
5293 0 : ndim = 2*lpawu + 1
5294 0 : tndim = ndim * nspinor
5295 0 : do isppol=1,nsppol
5296 0 : do im1=1,tndim
5297 0 : matlu_tau(iatom)%mat(1+(isppol-1)*ndim:tndim+(isppol-1)*ndim,im1+(isppol-1)*ndim,itau) = buffer_tot(ibuf+1:ibuf+tndim)
5298 0 : ibuf = ibuf + tndim
5299 : end do ! im1
5300 : end do ! isppol
5301 0 : if (nsppol == 1 .and. nspinor == 1) matlu_tau(iatom)%mat(ndim+1:2*ndim,ndim+1:2*ndim,itau) = &
5302 0 : & matlu_tau(iatom)%mat(1:ndim,1:ndim,itau)
5303 0 : ndim = 2 * ndim
5304 : matlu_tau(iatom)%mat(1:ndim,1:ndim,itau) = (matlu_tau(iatom)%mat(1:ndim,1:ndim,itau)+ &
5305 0 : & conjg(transpose(matlu_tau(iatom)%mat(1:ndim,1:ndim,itau)))) * half
5306 : end do ! iatom
5307 : end do ! itau
5308 :
5309 0 : ABI_FREE(buffer)
5310 0 : ABI_FREE(buffer_tot)
5311 :
5312 0 : end subroutine fourier_inv
5313 : !!***
5314 :
5315 : !!****f* m_forctqmc/find_block_structure
5316 : !! NAME
5317 : !! find_block_structure
5318 : !!
5319 : !! FUNCTION
5320 : !! Find the most optimal block structure of a matlu
5321 : !!
5322 : !! INPUTS
5323 : !! paw_dmft <type(paw_dmft_type)>= DMFT data structure
5324 : !! matlu <type(oper_type)>= matrix for which the block structure is to be found
5325 : !! natom = number of atoms
5326 : !! nflavor_max = max number of orbitals
5327 : !! hyb <type(green_type)>= hybridization ; if present, the block structure will
5328 : !! match both matlu and hyb
5329 : !!
5330 : !! OUTPUT
5331 : !! block_list(nflavor,natom) = block index for each flavor and atom
5332 : !! inner_list(nflavor,natom) = inner block index for each flavor and atom
5333 : !! flavor_list(nflavor,nflavor,natom) = flavor for each block and inner indexes
5334 : !! siz_block(nflavor,natom) = block size for each block and atom
5335 : !! nblocks = number of blocks for each atom
5336 : !!
5337 : !! SIDE EFFECTS
5338 : !!
5339 : !! NOTES
5340 : !!
5341 : !! SOURCE
5342 :
5343 0 : subroutine find_block_structure(paw_dmft,block_list,inner_list,flavor_list, &
5344 0 : & siz_block,nblocks,matlu,natom,nflavor_max,hyb)
5345 :
5346 : !Arguments ------------------------------------
5347 : integer, intent(in) :: natom,nflavor_max
5348 : integer, intent(inout) :: block_list(nflavor_max,natom),inner_list(nflavor_max,natom)
5349 : integer, intent(inout) :: flavor_list(nflavor_max,nflavor_max,natom)
5350 : integer, intent(inout) :: siz_block(nflavor_max,natom),nblocks(natom)
5351 : type(paw_dmft_type), intent(in) :: paw_dmft
5352 : type(green_type), optional, intent(inout) :: hyb
5353 : type(matlu_type), intent(inout) :: matlu(natom)
5354 : !Local variables ------------------------------
5355 : integer :: i,iatom,iblock,iblock1,iblock2,iflavor,ifreq,lpawu
5356 : integer :: nflavor,nspinor,nsppol,nwlo
5357 0 : integer, allocatable :: found_block(:),label_block(:)
5358 : ! ************************************************************************
5359 :
5360 0 : nspinor = paw_dmft%nspinor
5361 0 : nsppol = paw_dmft%nsppol
5362 0 : nwlo = paw_dmft%dmft_nwlo
5363 :
5364 0 : do iflavor=1,nflavor_max
5365 0 : block_list(iflavor,:) = iflavor - 1
5366 : end do ! iflavor
5367 :
5368 0 : ABI_MALLOC(found_block,(nflavor_max))
5369 0 : ABI_MALLOC(label_block,(nflavor_max))
5370 :
5371 0 : call find_block_structure_mat(matlu(:))
5372 :
5373 0 : if (present(hyb)) then
5374 0 : do i=2,hyb%nmoments-1
5375 0 : call find_block_structure_mat(hyb%moments(i)%matlu(:))
5376 : end do ! i
5377 :
5378 0 : do ifreq=1,nwlo
5379 0 : call find_block_structure_mat(hyb%oper(ifreq)%matlu(:))
5380 : end do ! ifreq
5381 : end if ! present(hyb)
5382 :
5383 0 : siz_block(:,:) = 0
5384 :
5385 : ! Rename the blocks from 0 to nblocks-1 and build lists
5386 0 : do iatom=1,natom
5387 0 : lpawu = paw_dmft%lpawu(iatom)
5388 0 : if (lpawu == -1) cycle
5389 0 : nflavor = 2 * (2*lpawu+1)
5390 :
5391 0 : found_block(:) = 0
5392 :
5393 0 : iblock1 = 0 ! number of blocks
5394 0 : do iflavor=1,nflavor
5395 0 : iblock = block_list(iflavor,iatom)
5396 0 : if (found_block(iblock+1) == 0) then
5397 0 : label_block(iblock+1) = iblock1
5398 0 : iblock1 = iblock1 + 1 ! next block index
5399 : end if
5400 0 : iblock2 = label_block(iblock+1) ! new block index
5401 0 : block_list(iflavor,iatom) = iblock2
5402 0 : inner_list(iflavor,iatom) = found_block(iblock+1)
5403 0 : found_block(iblock+1) = found_block(iblock+1) + 1
5404 0 : siz_block(iblock2+1,iatom) = siz_block(iblock2+1,iatom) + 1
5405 0 : flavor_list(found_block(iblock+1),iblock2+1,iatom) = iflavor - 1
5406 : end do ! iflavor
5407 0 : nblocks(iatom) = iblock1
5408 : end do ! iatom
5409 :
5410 0 : ABI_FREE(found_block)
5411 0 : ABI_FREE(label_block)
5412 :
5413 : ! Set to 0 the off-diagonal elements that are not kept in a block
5414 0 : call apply_block_structure_mat(matlu(:))
5415 :
5416 0 : if (present(hyb)) then
5417 :
5418 0 : do i=2,hyb%nmoments-1
5419 0 : call apply_block_structure_mat(hyb%moments(i)%matlu(:))
5420 : end do ! i
5421 :
5422 0 : do ifreq=1,nwlo
5423 0 : call apply_block_structure_mat(hyb%oper(ifreq)%matlu(:))
5424 : end do ! ifreq
5425 :
5426 : end if ! present(hyb)
5427 :
5428 : contains
5429 :
5430 0 : subroutine find_block_structure_mat(mat)
5431 :
5432 : !Arguments ------------------------------------
5433 : type(matlu_type), intent(inout) :: mat(natom)
5434 : !Local variables ------------------------------
5435 : integer :: i,iflavor1,im,im1,isppol,ndim,tndim
5436 : ! ************************************************************************
5437 :
5438 0 : do iatom=1,natom
5439 0 : lpawu = paw_dmft%lpawu(iatom)
5440 0 : if (lpawu == -1) cycle
5441 0 : ndim = 2*lpawu + 1
5442 0 : tndim = ndim * nspinor
5443 0 : nflavor = 2 * ndim
5444 0 : do isppol=1,nsppol
5445 0 : do im1=1,tndim
5446 0 : iflavor1 = im1 + (isppol-1)*ndim
5447 0 : iblock1 = block_list(iflavor1,iatom)
5448 0 : do im=1,tndim
5449 0 : iflavor = im + (isppol-1)*ndim
5450 0 : iblock = block_list(iflavor,iatom)
5451 0 : if (iblock == iblock1) cycle
5452 0 : if (abs(mat(iatom)%mat(im,im1,isppol)) > paw_dmft%dmft_triqs_tol_block) then ! Merge the two blocks
5453 0 : do i=1,nflavor
5454 0 : if (block_list(i,iatom) == iblock) block_list(i,iatom) = iblock1
5455 : end do ! i
5456 : end if
5457 : end do ! im
5458 : end do ! im1
5459 : end do ! isppol
5460 0 : if (nsppol == 1 .and. nspinor == 1) block_list(ndim+1:nflavor,iatom) = block_list(1:ndim,iatom) + ndim
5461 : end do ! iatom
5462 :
5463 0 : end subroutine find_block_structure_mat
5464 :
5465 0 : subroutine apply_block_structure_mat(mat)
5466 :
5467 : !Arguments ------------------------------------
5468 : type(matlu_type), intent(inout) :: mat(natom)
5469 : !Local variables ------------------------------
5470 : integer :: iflavor1,im,im1,isppol,ndim,tndim
5471 : ! ************************************************************************
5472 :
5473 0 : do iatom=1,natom
5474 0 : lpawu = paw_dmft%lpawu(iatom)
5475 0 : if (lpawu == -1) cycle
5476 0 : ndim = 2*lpawu + 1
5477 0 : tndim = nspinor * ndim
5478 0 : do isppol=1,nsppol
5479 0 : do im1=1,tndim
5480 0 : iflavor1 = im1 + (isppol-1)*ndim
5481 0 : iblock1 = block_list(iflavor1,iatom)
5482 0 : do im=1,tndim
5483 0 : iflavor = im + (isppol-1)*ndim
5484 0 : iblock = block_list(iflavor,iatom)
5485 0 : if (iblock == iblock1) cycle
5486 0 : mat(iatom)%mat(im,im1,isppol) = czero
5487 : end do ! im
5488 : end do ! im1
5489 : end do ! isppol
5490 : end do ! iatom
5491 :
5492 0 : end subroutine apply_block_structure_mat
5493 :
5494 : end subroutine find_block_structure
5495 : !!***
5496 :
5497 0 : END MODULE m_forctqmc
5498 : !!***
|