Branch data Line data Source code
1 : : !!****m* ABINIT/m_hubbard_one
2 : : !! NAME
3 : : !! m_hubbard_one
4 : : !!
5 : : !! FUNCTION
6 : : !!
7 : : !! Solve Anderson model with the density/density Hubbard one approximation
8 : : !!
9 : : !! COPYRIGHT
10 : : !! Copyright (C) 2006-2026 ABINIT group (BAmadon)
11 : : !! This file is distributed under the terms of the
12 : : !! GNU General Public License, see ~abinit/COPYING
13 : : !! or http://www.gnu.org/copyleft/gpl.txt .
14 : : !!
15 : : !! INPUTS
16 : : !!
17 : : !! OUTPUT
18 : : !!
19 : : !! SOURCE
20 : :
21 : : #if defined HAVE_CONFIG_H
22 : : #include "config.h"
23 : : #endif
24 : :
25 : :
26 : : #include "abi_common.h"
27 : :
28 : : ! nvtx related macro definition
29 : : #include "nvtx_macros.h"
30 : :
31 : : MODULE m_hubbard_one
32 : :
33 : :
34 : : use defs_basis
35 : :
36 : : #ifdef HAVE_GPU_MARKERS
37 : : use m_nvtx_data
38 : : #endif
39 : :
40 : : implicit none
41 : :
42 : : private
43 : :
44 : : public :: hubbard_one
45 : : !!***
46 : :
47 : : contains
48 : :
49 : : !!****f* m_hubbard_one/hubbard_one
50 : : !! NAME
51 : : !! hubbard_one
52 : : !!
53 : : !! FUNCTION
54 : : !! Solve the hubbard one approximation
55 : : !!
56 : : !! COPYRIGHT
57 : : !! Copyright (C) 1999-2026 ABINIT group (BAmadon)
58 : : !! This file is distributed under the terms of the
59 : : !! GNU General Public License, see ~abinit/COPYING
60 : : !! or http://www.gnu.org/copyleft/gpl.txt .
61 : : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt .
62 : : !!
63 : : !! INPUTS
64 : : !! cryst_struc
65 : : !! istep = step of iteration for DFT.
66 : : !! dft_occup
67 : : !! mpi_enreg=information about MPI parallelization
68 : : !! paw_dmft = data for self-consistent DFT+DMFT calculations.
69 : : !!
70 : : !! OUTPUT
71 : : !! paw_dmft = data for self-consistent DFT+DMFT calculations.
72 : : !!
73 : : !! NOTES
74 : : !!
75 : : !! SOURCE
76 : :
77 : 138 : subroutine hubbard_one(cryst_struc,green,hu,paw_dmft,pawprtvol,hdc,weiss)
78 : :
79 : : use defs_basis
80 : : use m_errors
81 : : use m_abicore
82 : :
83 : : use m_crystal, only : crystal_t
84 : : use m_green, only : green_type,init_green,destroy_green
85 : : use m_paw_dmft, only : paw_dmft_type
86 : : use m_oper, only : oper_type,init_oper,destroy_oper,print_oper
87 : : use m_matlu, only : matlu_type,sym_matlu, print_matlu, gather_matlu,&
88 : : & diag_matlu,init_matlu,destroy_matlu,rotate_matlu,copy_matlu,slm2ylm_matlu
89 : : use m_hu, only : destroy_vee,hu_type,init_vee,rotatevee_hu,vee_type
90 : : use m_datafordmft, only : compute_levels
91 : :
92 : : !Arguments ------------------------------------
93 : : !scalars
94 : : ! type(pawang_type), intent(in) :: pawang
95 : : type(crystal_t),intent(in) :: cryst_struc
96 : : type(green_type), intent(inout) :: green
97 : : type(paw_dmft_type), intent(in) :: paw_dmft
98 : : type(hu_type), intent(inout) :: hu(cryst_struc%ntypat)
99 : : type(oper_type), intent(inout) :: hdc
100 : : integer, intent(in) :: pawprtvol
101 : : type(green_type), intent(inout) :: weiss
102 : :
103 : : !Local variables ------------------------------
104 : : type :: level2_type
105 : : integer, pointer :: repart(:,:) => null()
106 : : integer, contiguous, pointer :: ocp(:,:) => null()
107 : : integer, contiguous, pointer :: transition(:,:) => null()
108 : : integer, contiguous, pointer :: transition_m(:,:) => null()
109 : : end type level2_type
110 : : type :: level1_type
111 : : real(dp), pointer :: config(:) => null()
112 : : end type level1_type
113 : : ! scalars
114 : : character(len=500) :: message
115 : : integer :: iatom,ifreq,im,im1,isppol,ispinor,ispinor1
116 : : integer :: lpawu,mbandc,natom,ndim,nkpt,nspinor,nsppol,nsppol_imp,testblock,useylm
117 : : ! complex(dp) :: g,g0,w
118 : : ! arrays
119 : 69 : complex(dp), allocatable :: Id(:,:,:,:)
120 : 69 : type(matlu_type), allocatable :: eigvectmatlu(:)
121 : 69 : type(matlu_type), allocatable :: udens_atoms(:)
122 : 69 : type(oper_type) :: energy_level
123 : 69 : type(green_type) :: green_hubbard
124 : 69 : type(matlu_type), allocatable :: level_diag(:)
125 : : complex(dp) :: omega_current
126 : 69 : type(vee_type), allocatable :: vee_rotated(:)
127 : : ! ************************************************************************
128 : 69 : mbandc=paw_dmft%mbandc
129 : 69 : nkpt=paw_dmft%nkpt
130 : 69 : nsppol=paw_dmft%nsppol
131 : 69 : natom=paw_dmft%natom
132 : 69 : nspinor=paw_dmft%nspinor
133 : :
134 : :
135 : : !Initialise for compiler
136 : 69 : omega_current=czero
137 : :
138 : : !======================================
139 : : !Allocations: levels and eigenvectors
140 : : !======================================
141 [ - + + - : 509 : ABI_MALLOC(level_diag,(natom))
+ - + - -
+ - + +
+ ]
142 [ - + + - : 440 : ABI_MALLOC(eigvectmatlu,(natom))
- + - + +
+ ]
143 [ - + + - : 440 : ABI_MALLOC(udens_atoms,(natom))
- + - + +
+ ]
144 : 69 : call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu,level_diag)
145 : 69 : call init_matlu(natom,nspinor,nsppol,paw_dmft%lpawu,eigvectmatlu)
146 : 69 : call init_matlu(natom,2,1,paw_dmft%lpawu,udens_atoms)
147 [ + + ]: 371 : do iatom=1,cryst_struc%natom
148 : 302 : lpawu=paw_dmft%lpawu(iatom)
149 [ + + ]: 371 : if(lpawu/=-1) then
150 [ + + + + : 4301 : level_diag(iatom)%mat=czero
+ + ]
151 : : end if
152 : : end do
153 : :
154 : 69 : call init_oper(paw_dmft,energy_level,opt_ksloc=3)
155 : 69 : call compute_levels(energy_level,hdc,paw_dmft)
156 : : !!========================
157 : : !!Get KS eigenvalues
158 : : !!========================
159 : : ! call init_oper(paw_dmft,energy_level,opt_ksloc=3)
160 : : ! do iband=1,mbandc
161 : : ! do ikpt=1,nkpt
162 : : ! do isppol=1,nsppol
163 : : !! Take \epsilon_{nks}
164 : : !! ========================
165 : : ! energy_level%ks(isppol,ikpt,iband,iband)=paw_dmft%eigen_dft(isppol,ikpt,iband)
166 : : ! end do
167 : : ! end do
168 : : ! end do
169 : : !
170 : : !
171 : : !!======================================================================
172 : : !!Compute atomic levels from projection of \epsilon_{nks} and symetrize
173 : : !!======================================================================
174 : : ! call loc_oper(energy_level,paw_dmft,1)
175 : : ! write(message,'(a,2x,a,f13.5)') ch10," == Print Energy levels before sym and only DFT"
176 : : ! call wrtout(std_out,message,'COLL')
177 : : ! call print_matlu(energy_level%matlu,natom,1)
178 : : ! do iatom = 1 , natom
179 : : ! lpawu=paw_dmft%lpawu(iatom)
180 : : ! if(lpawu/=-1) then
181 : : ! do isppol=1,nsppol
182 : : ! do ispinor=1,nspinor
183 : : ! do im1=1,2*lpawu+1
184 : : ! energy_level%matlu(iatom)%mat(im1,im1,isppol,ispinor,ispinor)=&
185 : : !& energy_level%matlu(iatom)%mat(im1,im1,isppol,ispinor,ispinor)&
186 : : !& -hdc%matlu(iatom)%mat(im1,im1,isppol,ispinor,ispinor)-paw_dmft%fermie
187 : : ! end do
188 : : ! end do
189 : : ! end do
190 : : !! write(std_out,*) "DC,fermie",hdc%matlu(iatom)%mat(1,1,1,1,1),paw_dmft%fermie
191 : : ! end if
192 : : ! end do ! natom
193 : : ! call sym_matlu(cryst_struc,energy_level%matlu,pawang)
194 : : !
195 : : ! write(message,'(a,2x,a,f13.5)') ch10," == Print Energy levels for Fermi Level=",paw_dmft%fermie
196 : : ! call wrtout(std_out,message,'COLL')
197 : : !!call print_oper(energy_level,1,paw_dmft,1)
198 : : ! call print_matlu(energy_level%matlu,natom,1)
199 : :
200 : : !========================
201 : : !Compute Weiss function
202 : : !========================
203 [ - + + - : 276 : ABI_MALLOC(Id,(20,20,nspinor,nspinor))
- + + - +
- + - - +
- + ]
204 [ + + ]: 371 : do iatom = 1 , natom
205 : 302 : lpawu=paw_dmft%lpawu(iatom)
206 [ + + ]: 371 : if(lpawu/=-1) then
207 [ + + + + : 41867 : Id=czero
+ + + + ]
208 [ + + ]: 486 : do im=1,2*lpawu+1
209 [ + + ]: 893 : do ispinor=1,nspinor
210 : 800 : Id(im,im,ispinor,ispinor)=cone
211 : : end do
212 : : end do ! ib
213 : 93 : ndim = 2*lpawu+1
214 [ + + ]: 5925 : do ifreq=1,weiss%nw
215 [ + - ]: 5832 : if(weiss%w_type=="imag") then
216 : 5832 : omega_current=cmplx(zero,weiss%omega(ifreq),kind=dp)
217 [ # # ]: 0 : else if(green%w_type=="real") then
218 : 0 : omega_current=cmplx(weiss%omega(ifreq),zero,kind=dp)
219 : : end if
220 [ + + ]: 27613 : do im=1,2*lpawu+1
221 [ + + ]: 115656 : do im1=1,2*lpawu+1
222 [ + + ]: 240296 : do isppol=1,nsppol
223 [ + + ]: 358880 : do ispinor=1,nspinor
224 [ + + ]: 430616 : do ispinor1=1,nspinor
225 : : weiss%oper(ifreq)%matlu(iatom)%mat(im+(ispinor-1)*ndim,im1+(ispinor1-1)*ndim,isppol)=&
226 : : & ( omega_current*Id(im,im1,ispinor,ispinor1) - &
227 : 300144 : & energy_level%matlu(iatom)%mat(im+(ispinor-1)*ndim,im1+(ispinor1-1)*ndim,isppol))
228 : : end do ! ispinor1
229 : : end do ! ispinor
230 : : end do ! isppol
231 : : end do ! im1
232 : : end do ! im
233 : : end do ! ifreq
234 : : end if ! lpawu
235 : : end do ! natom
236 [ - + ]: 69 : ABI_FREE(Id)
237 : :
238 : : !=================================================================
239 : : !Diagonalizes atomic levels and keep eigenvectors in eigvectmatlu
240 : : !=================================================================
241 : : !if jpawu=0, rotatevee_hu will have no effect so it is not necessary to
242 : : !have a single rotation matrix for up and dn spins.
243 : :
244 [ + + + + ]: 69 : if(hu(1)%jpawu_zero.and.nsppol==2) nsppol_imp=2
245 [ + + + + ]: 69 : if(.not.hu(1)%jpawu_zero.or.nsppol/=2) nsppol_imp=1
246 : : ! Diagonalize energy levels
247 : 69 : useylm=paw_dmft%dmft_blockdiag
248 [ + - ]: 69 : if(useylm==1) call slm2ylm_matlu(energy_level%matlu,natom,paw_dmft,1,pawprtvol)
249 : 69 : testblock=1
250 : 0 : if(useylm==1) testblock=8
251 : : call diag_matlu(energy_level%matlu,level_diag,natom,prtopt=pawprtvol,eigvectmatlu=eigvectmatlu, &
252 : 69 : & nsppol_imp=nsppol_imp,opt_real=1,test=testblock)
253 : :
254 : : ! Use rotation matrix to rotate interaction
255 [ - + + - : 440 : ABI_MALLOC(vee_rotated,(natom))
- + - + +
+ ]
256 : 69 : call init_vee(paw_dmft,vee_rotated)
257 [ - + ]: 69 : if(useylm==1) then
258 : 0 : call rotatevee_hu(hu,paw_dmft,pawprtvol,eigvectmatlu,4,udens_atoms,vee_rotated)
259 : : else
260 : 69 : call rotatevee_hu(hu,paw_dmft,pawprtvol,eigvectmatlu,1,udens_atoms,vee_rotated)
261 : : endif
262 : 69 : call destroy_vee(paw_dmft,vee_rotated)
263 [ + - + + : 371 : ABI_FREE(vee_rotated)
- + - + ]
264 : : !write(std_out,*)"udens after rotatevee", udens_atoms(1)%value
265 : 69 : write(message,'(a,2x,a,f13.5)') ch10,&
266 : 138 : & " == Print Diagonalized Energy levels for Fermi Level=",paw_dmft%fermie
267 : 69 : call wrtout(std_out,message,'COLL')
268 : 69 : call print_matlu(level_diag,natom,1)
269 : :
270 : : ! Print out
271 [ + + ]: 69 : if(nspinor==2) then
272 : 2 : write(message,'(a,2x,a,f13.5)') ch10,&
273 : 4 : & " == Print weiss for small freq"
274 : 2 : call wrtout(std_out,message,'COLL')
275 : 2 : call print_matlu(weiss%oper(1)%matlu,natom,1)
276 : 2 : write(message,'(a,2x,a,f13.5)') ch10,&
277 : 4 : & " == Print weiss for large freq"
278 : 2 : call wrtout(std_out,message,'COLL')
279 : 2 : call print_matlu(weiss%oper(weiss%nw)%matlu,natom,1)
280 : : end if
281 : :
282 : : !========================
283 : : !Compute Green function
284 : : !========================
285 : 69 : call init_green(green_hubbard,paw_dmft,opt_oper_ksloc=2,wtype=green%w_type) ! initialize only matlu
286 : : !write(std_out,*)"udens", udens_atoms(1)%value
287 : : ! write(std_out,*)"levels", level_diag(1)%mat
288 : 69 : call green_atomic_hubbard(cryst_struc,green_hubbard,hu,level_diag,paw_dmft,udens_atoms)
289 : : !call rotate_matlu(energy_level%matlu,natom,pawprtvol=3)
290 : : !write(81,*) "I1",paw_dmft%omega_lo(1), real(green%oper(1)%matlu(1)%mat(1,1,1,1,1)),imag(green%oper(1)%matlu(1)%mat(1,1,1,1,1))
291 : : !========================================================================
292 : : !Rotate back Green function in the original basis before diagonalization
293 : : !========================================================================
294 : : !call print_matlu(level_diag,natom,1)
295 : : !test scall rotate_matlu(level_diag,eigvectmatlu,natom,3)
296 : : !todo_ab: add check here for back rotation
297 : : !call print_matlu(level_diag,natom,1)
298 : 69 : write(message,'(2a,f13.5)') ch10," == Green function before rotation"
299 : 69 : call wrtout(std_out,message,'COLL')
300 : 69 : call print_matlu(green_hubbard%oper(1)%matlu,natom,1)
301 [ + + ]: 5133 : do ifreq=1,green_hubbard%nw
302 : 5064 : call rotate_matlu(green_hubbard%oper(ifreq)%matlu,eigvectmatlu,natom,0)
303 [ - + ]: 5064 : if(useylm==1) call slm2ylm_matlu(green_hubbard%oper(ifreq)%matlu,natom,paw_dmft,2,0)
304 : 5133 : call copy_matlu(green_hubbard%oper(ifreq)%matlu,green%oper(ifreq)%matlu,natom)
305 : : end do
306 : 69 : write(message,'(2a,f13.5)') ch10," == Green function after rotation"
307 : 69 : call wrtout(std_out,message,'COLL')
308 : 69 : call print_matlu(green%oper(1)%matlu,natom,1)
309 [ + + ]: 69 : if(nspinor==2) then
310 : 2 : write(message,'(a,2x,a,f13.5)') ch10,&
311 : 4 : & " == Print green for small freq"
312 : 2 : call wrtout(std_out,message,'COLL')
313 : 2 : call print_matlu(green%oper(1)%matlu,natom,1)
314 : 2 : write(message,'(a,2x,a,f13.5)') ch10,&
315 : 4 : & " == Print green for large freq"
316 : 2 : call wrtout(std_out,message,'COLL')
317 : 2 : call print_matlu(green%oper(green%nw)%matlu,natom,1)
318 : : end if
319 : : !do ifreq=1,paw_dmft%dmft_nwlo
320 : : !g=green%oper(ifreq)%matlu(1)%mat(1,1,1,1,1)
321 : : !g0=cone/weiss%oper(ifreq)%matlu(1)%mat(1,1,1,1,1)
322 : : !w=cmplx(0.d0,paw_dmft%omega_lo(ifreq),kind=dp)
323 : : !write(160,*) paw_dmft%omega_lo(ifreq),real(weiss%oper(ifreq)%matlu(1)%mat(1,1,1,1,1)),imag(weiss%oper(ifreq)%matlu(1)%mat(1,1,1,1,1))
324 : : !write(161,*) paw_dmft%omega_lo(ifreq),real(green%oper(ifreq)%matlu(1)%mat(1,1,1,1,1) ),imag(green%oper(ifreq)%matlu(1)%mat(1,1,1,1,1) )
325 : : !write(164,*) paw_dmft%omega_lo(ifreq),real(one/green%oper(ifreq)%matlu(1)%mat(1,1,1,1,1) ),imag(one/green%oper(ifreq)%matlu(1)%mat(1,1,1,1,1))
326 : : !write(166,*) paw_dmft%omega_lo(ifreq),real(weiss%oper(ifreq)%matlu(1)%mat(1,1,1,1,1)-one/green%oper(ifreq)%matlu(1)%mat(1,1,1,1,1) ),imag(weiss%oper(ifreq)%matlu(1)%mat(1,1,1,1,1)-one/green%oper(ifreq)%matlu(1)%mat(1,1,1,1,1))
327 : : !write(167,*) paw_dmft%omega_lo(ifreq),real((g-g0)/(g0*g)),imag((g-g0)/(g0*g))
328 : : !write(168,*) paw_dmft%omega_lo(ifreq),real(1/g-w),imag(1/g-w)
329 : : !write(169,*) paw_dmft%omega_lo(ifreq),real(1/g0-w),imag(1/g0-w)
330 : : !write(170,*) paw_dmft%omega_lo(ifreq),w
331 : : !write(171,*) paw_dmft%omega_lo(ifreq),real(1/g),imag(1/g)
332 : : !write(172,*) paw_dmft%omega_lo(ifreq),real(w),imag(w)
333 : :
334 : : !! voir si en faisant GG0/(G-G0) cela reduit l'erreur
335 : : !enddo
336 : : !call abi_abort('COLL')
337 : :
338 : :
339 : : !write(message,'(2a,f13.5)') ch10," == Print Energy levels after diagonalisation"
340 : : !call wrtout(std_out,message,'COLL')
341 : : !call print_matlu(energy_level%matlu,natom,1)
342 : :
343 : : !======================================
344 : : !Deallocations and destroys
345 : : !======================================
346 : 69 : call destroy_green(green_hubbard)
347 : 69 : call destroy_oper(energy_level)
348 : 69 : call destroy_matlu(level_diag,natom)
349 : 69 : call destroy_matlu(udens_atoms,natom)
350 : 69 : call destroy_matlu(eigvectmatlu,natom)
351 [ + - + + : 371 : ABI_FREE(level_diag)
- + - + ]
352 [ + - + + : 371 : ABI_FREE(eigvectmatlu)
- + - + ]
353 [ + - + + : 371 : ABI_FREE(udens_atoms)
- + - + -
+ - - - -
- + - + -
- - - - +
- + - + -
+ - + - +
- + - + -
+ - - - -
- - - - -
- - + - -
- - - - -
- - - - +
- - - - -
- - - - -
- + - - -
- - + ]
354 : : !!***
355 : :
356 : : contains
357 : :
358 : : !!****f* m_hubbard_one/green_atomic_hubbard
359 : : !! NAME
360 : : !! green_atomic_hubbard
361 : : !!
362 : : !! FUNCTION
363 : : !!
364 : : !!
365 : : !! COPYRIGHT
366 : : !! Copyright (C) 1999-2026 ABINIT group (BAmadon)
367 : : !! This file is distributed under the terms of the
368 : : !! GNU General Public License, see ~abinit/COPYING
369 : : !! or http://www.gnu.org/copyleft/gpl.txt .
370 : : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt .
371 : : !!
372 : : !! INPUTS
373 : : !! cryst_struc
374 : : !! istep = step of iteration for DFT.
375 : : !! dft_occup
376 : : !! mpi_enreg=information about MPI parallelization
377 : : !! paw_dmft = data for self-consistent DFT+DMFT calculations.
378 : : !! pawang <type(pawang)>=paw angular mesh and related data
379 : : !!
380 : : !! OUTPUT
381 : : !! paw_dmft = data for self-consistent DFT+DMFT calculations.
382 : : !!
383 : : !! NOTES
384 : : !!
385 : : !! SOURCE
386 : :
387 : 138 : subroutine green_atomic_hubbard(cryst_struc,green_hubbard,hu,level_diag,paw_dmft,udens_atoms)
388 : :
389 : :
390 : 69 : use defs_basis
391 : : use m_errors
392 : : use m_abicore
393 : : use m_crystal, only : crystal_t
394 : : use m_special_funcs, only : factorial, permutations
395 : : use m_green, only : green_type,init_green,destroy_green
396 : : use m_hu, only : hu_type
397 : : use m_paw_dmft, only : paw_dmft_type
398 : :
399 : : !Arguments ------------------------------------
400 : : !scalars
401 : : ! type(pawang_type), intent(in) :: pawang
402 : : type(crystal_t),intent(in) :: cryst_struc
403 : : type(green_type), intent(inout) :: green_hubbard
404 : : type(paw_dmft_type), intent(in) :: paw_dmft
405 : : type(matlu_type),intent(in) :: level_diag(cryst_struc%natom)
406 : : type(hu_type), intent(inout) :: hu(cryst_struc%ntypat)
407 : : type(matlu_type),intent(in) :: udens_atoms(cryst_struc%natom)
408 : :
409 : : !Local variables ------------------------------
410 : : ! scalars
411 : : integer :: cnk,iacc,iatom,iconfig,ielec,ifreq,ilevel,im,im1,isppol,ispinor,itrans,jconfig,jelec
412 : : integer :: lpawu,m_temp,nconfig,ndim,nelec,nlevels,nspinor,nsppol,occupied_level,sum_test,gpu_option
413 : : integer :: nconfig_next
414 : 69 : integer, allocatable :: occup(:,:),nconfig_nelec(:)
415 : : character(len=500) :: message
416 : 69 : integer, contiguous, pointer :: ocp(:,:),ocp_next(:,:),transition(:,:),transition_m(:,:)
417 : : ! arrays
418 : 69 : type(green_type) :: green_hubbard_realw
419 : 69 : type(level2_type), allocatable :: occ_level(:)
420 : 69 : type(level1_type), allocatable :: e_nelec(:)
421 : 69 : complex(dp), allocatable :: green_temp(:,:)
422 : 69 : complex(dp), allocatable :: green_temp_realw(:,:)
423 : : complex(dp) :: Z_part
424 : 69 : real(dp), allocatable :: maxener(:),minener(:)
425 : 69 : real(dp), allocatable :: elevels(:)
426 : : real(dp) :: emax,emin,eshift,prtopt, Ej_np1, Ei_n,beta,maxarg_exp,tmp
427 : : !************************************************************************
428 : : ABI_NVTX_START_RANGE(NVTX_DMFT_HUBBARD_ONE)
429 : 69 : maxarg_exp=300
430 : :
431 : : ! hu is not used anymore.
432 : : if(hu(1)%lpawu==0) then
433 : : end if
434 : : ! ======================================
435 : : ! General loop over atoms
436 : : ! ======================================
437 : 69 : nsppol=paw_dmft%nsppol
438 : 69 : nspinor=paw_dmft%nspinor
439 : 69 : prtopt=1
440 : 69 : beta=one/paw_dmft%temp
441 : 69 : call init_green(green_hubbard_realw,paw_dmft,opt_oper_ksloc=2,wtype=green_hubbard%w_type) ! initialize only matlu
442 : 69 : gpu_option=paw_dmft%gpu_option
443 : :
444 [ + + ]: 371 : do iatom=1,cryst_struc%natom
445 : 302 : lpawu=paw_dmft%lpawu(iatom)
446 [ + + ]: 371 : if(lpawu/=-1) then
447 : 93 : nlevels=nsppol*nspinor*(2*lpawu+1)
448 [ + + ]: 93 : if(nsppol==1.and.nspinor==1) nlevels=2*nspinor*(2*lpawu+1)
449 : :
450 : : ! ===================================
451 : : ! Allocations
452 : : ! ===================================
453 [ - + + - : 1158 : ABI_MALLOC(occ_level,(0:nlevels))
+ - + - -
+ - + +
+ ]
454 [ - + + - : 279 : ABI_MALLOC(maxener,(0:nlevels))
+ - + - -
+ - + ]
455 [ - + + - : 186 : ABI_MALLOC(minener,(0:nlevels))
- + - + ]
456 [ - + + - : 279 : ABI_MALLOC(elevels,(nlevels))
+ - + - -
+ - + ]
457 [ - + + - : 1158 : ABI_MALLOC(e_nelec,(0:nlevels))
+ - + - -
+ - + +
+ ]
458 [ + + ]: 972 : do nelec=0,nlevels ! number of electrons
459 : 879 : cnk=nint(permutations(nlevels,nelec)/factorial(nelec))
460 [ - + + - : 3516 : ABI_MALLOC(occ_level(nelec)%repart ,(cnk,nelec))
+ + + - +
- + + - +
- + ]
461 [ - + + - : 3516 : ABI_MALLOC(occ_level(nelec)%ocp ,(cnk,nlevels))
- + + - +
- + - - +
- + ]
462 [ - + + - : 3516 : ABI_MALLOC(occ_level(nelec)%transition ,(cnk,nlevels-nelec))
+ + + - +
- + + - +
- + ]
463 [ - + + - : 2637 : ABI_MALLOC(occ_level(nelec)%transition_m,(cnk,nlevels))
- + + - -
+ - + ]
464 [ - + + - : 2637 : ABI_MALLOC(e_nelec (nelec)%config ,(cnk))
+ - + - -
+ - + ]
465 [ + + ]: 119244 : e_nelec(nelec)%config(:)=zero
466 : : ! write(std_out,*) "permutations",nint(permutations(nlevels,nelec)/factorial(nelec))
467 : : ! write(std_out,*) "size",size(occ_level),size(occ_level(nelec)%repart,1)
468 : : ! write(std_out,*) "size",size(occ_level),size(occ_level(nelec)%repart,2)
469 : : ! for a given nb of electrons nelec, gives for a given repartition
470 : : ! of electron, the position of the ielec electron inside atomic
471 : : ! levels
472 : : ! levels
473 : : end do
474 [ - + + - : 372 : ABI_MALLOC(occup,(0:nlevels,nlevels))
- + + - +
- + - - +
- + ]
475 [ - + + - : 279 : ABI_MALLOC(nconfig_nelec,(0:nlevels))
+ - + - -
+ - + ]
476 : :
477 : : ! ===================================
478 : : ! Initialization
479 : : ! ===================================
480 [ + + ]: 972 : nconfig_nelec=0
481 : 93 : nconfig=1
482 [ + + + + ]: 8789 : occup=0
483 : 93 : nconfig_nelec(0)=1
484 [ + + ]: 879 : occup(0,:)=0
485 : 879 : iacc=0
486 [ + + ]: 879 : elevels=zero
487 : : ndim=2*lpawu+1
488 [ + + ]: 237 : do isppol=1,nsppol
489 [ + + ]: 383 : do ispinor=1,nspinor
490 [ + + ]: 956 : do im1=1,(2*lpawu+1)
491 : 666 : iacc=iacc+1
492 : 666 : elevels(iacc)=level_diag(iatom)%mat(im1+(ispinor-1)*ndim,im1+(ispinor-1)*ndim,isppol)
493 [ - + ]: 666 : if(abs(aimag(level_diag(iatom)%mat(im1+(ispinor-1)*ndim,im1+(ispinor-1)*ndim,isppol)))>tol8) then
494 : 0 : message = " Hubbard I: levels are imaginary"
495 : 0 : write(std_out,*) level_diag(iatom)%mat(im1+(ispinor-1)*ndim,im1+(ispinor-1)*ndim,isppol)
496 : 0 : ABI_BUG(message)
497 : : end if
498 [ + + ]: 812 : if(nsppol==1.and.nspinor==1) then
499 : 120 : elevels(nspinor*(2*lpawu+1)+iacc)=level_diag(iatom)%mat(im1+(ispinor-1)*ndim,im1+(ispinor-1)*ndim,isppol)
500 : : end if
501 : : ! ! change it by: real(level_diag) with warning
502 : : end do
503 : : end do
504 : : end do
505 : :
506 : : ! ===================================
507 : : ! Compute possible occupations
508 : : ! ===================================
509 : : ! Value for nelec=0:
510 : : nconfig_nelec(0)=1
511 [ + + ]: 879 : occ_level(0)%ocp(1,:)=0
512 : : ! Loop on possible occupation of levels with nelec
513 [ + + ]: 879 : do nelec=1,nlevels ! number of electrons
514 : : ! write(message,'(2a,i3,a)') ch10," For number of electrons", &
515 : : ! & nelec," positions of electrons are:"
516 : : ! call wrtout(std_out,message,'COLL')
517 : : ! write(std_out,*) "nelec",nelec
518 : : ! write(std_out,*) "nlevels",nlevels
519 : 786 : call combin(1,nconfig,nconfig_nelec,nelec,nlevels,occ_level,occup)
520 [ - + ]: 786 : if(nconfig_nelec(nelec)/=nint(permutations(nlevels,nelec)/factorial(nelec))) then
521 : 0 : message = " BUG in hubbard_one/combin"
522 : 0 : ABI_BUG(message)
523 : : end if
524 [ + + + + ]: 1441748 : occ_level(nelec)%ocp=zero
525 [ + + ]: 119058 : do iconfig=1,nconfig_nelec(nelec)
526 [ + + ]: 836277 : do ielec=1,nelec
527 : : ! occ_level%repart: gives the place of electron ielec for the configuration iconfig (among the config for the total number of electron nelec
528 : 717312 : occupied_level=occ_level(nelec)%repart(iconfig,ielec)
529 : : ! occ_level%ocp: gives if level occupied_level is occupied or not
530 : 835491 : occ_level(nelec)%ocp(iconfig,occupied_level)=1
531 : : end do
532 : : end do
533 : : end do
534 : :
535 : : ! ===================================
536 : : ! Print possible occupations
537 : : ! ===================================
538 : : if(prtopt>3) then
539 : : do nelec=0,nlevels ! number of electrons f
540 : : write(message,'(2a,i3,2a,i5,a)') ch10," For",nelec," electrons, ", &
541 : : & "there are ",nconfig_nelec(nelec)," repartitions which are:"
542 : : call wrtout(std_out,message,'COLL')
543 : : do iconfig=1,nconfig_nelec(nelec)
544 : : write(message,'(40i4)') (occ_level(nelec)%ocp(iconfig,ilevel),ilevel=1,nlevels),&
545 : : & (occ_level(nelec)%repart(iconfig,ielec),ielec=1,nelec)
546 : : call wrtout(std_out,message,'COLL')
547 : : end do
548 : : end do
549 : : end if
550 : :
551 : : ! ============================================
552 : : ! Compute energy for each of the occupations
553 : : ! ============================================
554 [ + + ]: 972 : do nelec=0,nlevels !
555 [ + + ]: 119151 : e_nelec(nelec)%config=zero
556 [ + + ]: 119151 : do iconfig=1,nconfig_nelec(nelec)
557 : : ! First compute energy level contribution
558 [ + + ]: 835584 : do ielec=1,nelec
559 : : e_nelec(nelec)%config(iconfig)= e_nelec(nelec)%config(iconfig) &
560 : 835584 : & + elevels(occ_level(nelec)%repart(iconfig,ielec))
561 : : end do
562 : : ! write(std_out,*) "Nelec",nelec,"iconfig",iconfig,"eleve",e_nelec(nelec)%config(iconfig)
563 : :
564 : : ! Second: Compute interaction part
565 : : ! do ielec=1,nelec-1 ! compute interaction among the nelec electrons in the configuration iconfig
566 : : ! e_nelec(nelec)%config(iconfig)= e_nelec(nelec)%config(iconfig) &
567 : : ! & + hu(cryst_struc%typat(iatom))%udens(occ_level(nelec)%repart(iconfig,ielec), &
568 : : ! & occ_level(nelec)%repart(iconfig,ielec+1))
569 : : ! enddo
570 [ + + ]: 836463 : do ielec=1,nelec ! compute interaction among the nelec electrons in the configuration iconfig
571 [ + + ]: 5682944 : do jelec=1,nelec
572 : : e_nelec(nelec)%config(iconfig)= e_nelec(nelec)%config(iconfig) &
573 : : ! & + hu(cryst_struc%typat(iatom))%udens(occ_level(nelec)%repart(iconfig,ielec), &
574 : : & + dble(udens_atoms(iatom)%mat(occ_level(nelec)%repart(iconfig,ielec), &
575 : 5564672 : & occ_level(nelec)%repart(iconfig,jelec),1))/2.d0 ! udens(i,i)=0
576 : : ! write(std_out,*) ielec,occ_level(nelec)%repart(iconfig,ielec)
577 : : ! write(std_out,*) jelec,occ_level(nelec)%repart(iconfig,jelec)
578 : : ! write(std_out,*)hu(cryst_struc%typat(iatom))%udens(occ_level(nelec)%repart(iconfig,ielec), &
579 : : ! & occ_level(nelec)%repart(iconfig,jelec))/2.d0
580 : : end do ! jelec
581 : : end do ! ielec
582 : : ! write(std_out,*) "Nelec",nelec,"iconfig",iconfig,"ecorr",e_nelec(nelec)%config(iconfig)
583 : :
584 : : end do ! iconfig
585 [ + - - + : 120030 : maxener(nelec)=maxval(-e_nelec(nelec)%config(:))
- - + + ]
586 [ + - - + : 120123 : minener(nelec)=minval(-e_nelec(nelec)%config(:))
- - + + ]
587 : : end do
588 : : ! write(std_out,*) "maxener", maxener(:)
589 [ + - - + : 1065 : emax=maxval(maxener(:))
- - + + ]
590 : : emin=minval(minener(:))
591 : : eshift=zero
592 : 93 : eshift=emax/two
593 : 93 : eshift=emax-maxarg_exp/beta
594 : : ! eshift=emax
595 : : ! write(std_out,*)"emax",emax
596 : : ! write(std_out,*)"emin",emin
597 : : ! write(std_out,*)"eshift",eshift
598 : 93 : write(message,'(a,3x,3a,3x,a)') ch10," Hubbard I: Energies as a", &
599 : 93 : & " function of number of electrons",ch10,&
600 : 186 : & " Nelec Min. Ene. Max. Ener."
601 : 93 : call wrtout(std_out,message,'COLL')
602 [ + + ]: 972 : do nelec=0,nlevels
603 : 879 : write(message,'(3x,a,i4,2f17.7)') "HI", nelec,&
604 [ + - - + : 240060 : & minval(e_nelec(nelec)%config(:)),maxval(e_nelec(nelec)%config(:))
- - + + +
- - + - -
+ + ]
605 : 972 : call wrtout(std_out,message,'COLL')
606 : : end do
607 : :
608 : : ! ===================================
609 : : ! Print possibles occupations
610 : : ! ===================================
611 : : if(prtopt>3) then
612 : : do nelec=0,nlevels ! number of electrons
613 : : write(message,'(2a,i3,2a,i5,3a)') ch10," For",nelec," electrons, ", &
614 : : & "there are ",nconfig_nelec(nelec)," repartitions which are :", &
615 : : & ch10,"Energy and Occupations"
616 : : call wrtout(std_out,message,'COLL')
617 : : do iconfig=1,nconfig_nelec(nelec)
618 : : write(message,'(f12.6,20i4)') e_nelec(nelec)%config(iconfig),&
619 : : & (occ_level(nelec)%repart(iconfig,ielec),ielec=1,nelec)
620 : : call wrtout(std_out,message,'COLL')
621 : : end do
622 : : end do
623 : : end if
624 : :
625 : : ! sum_test=zero
626 : : ! do ielec=1,nelec+1
627 : : ! sum_test = sum_test + (occ_level(nelec)%repart(iconfig,ielec) &
628 : : ! & -occ_level(nelec)%repart(iconfig,ielec))
629 : : ! enddo
630 : : ! ===================================
631 : : ! Built transitions between configurations
632 : : ! ===================================
633 [ + + ]: 879 : do nelec=0,nlevels-1
634 : :
635 : :
636 : :
637 : 786 : nconfig = nconfig_nelec(nelec)
638 : 786 : nconfig_next = nconfig_nelec(nelec+1)
639 : 786 : transition => occ_level(nelec)%transition
640 : 786 : transition_m => occ_level(nelec)%transition_m
641 : 786 : ocp => occ_level(nelec)%ocp
642 : 786 : ocp_next => occ_level(nelec+1)%ocp
643 : :
644 [ + - ]: 786 : if(gpu_option==ABI_GPU_DISABLED) then
645 : : !$OMP PARALLEL DO PRIVATE(iconfig,jconfig,itrans,sum_test,m_temp)
646 [ + + ]: 118965 : do iconfig=1,nconfig
647 : : itrans=0 ! transition from iconfig
648 [ + + ]: 158149325 : do jconfig=1, nconfig_next
649 : 158030360 : sum_test=0
650 [ + + ]: 2337281800 : do ilevel=1,nlevels
651 : : ! test if their is one electron added to the starting configuration
652 : : sum_test=sum_test + &
653 : 2179251440 : & (ocp_next(jconfig,ilevel)-ocp(iconfig,ilevel))**2
654 : : ! save the level for the electron added
655 [ + + + + ]: 2337281800 : if(ocp_next(jconfig,ilevel)==1.and.ocp(iconfig,ilevel)==0) then
656 : 2179251440 : m_temp=ilevel
657 : : end if
658 : : end do ! ilevel
659 [ + + ]: 158148539 : if(sum_test==1) then
660 : 717312 : itrans=itrans+1
661 : : !if(itrans>nlevels-nelec) then
662 : : ! write(message,'(a,4i4)') "BUG: itrans is to big in hubbard_one",itrans,iconfig,jconfig,ilevel
663 : : ! call wrtout(std_out,message,'COLL')
664 : : !end if
665 : 717312 : transition(iconfig,itrans)=jconfig ! jconfig=config(n+1) obtained after transition
666 : 717312 : transition_m(iconfig,itrans)=m_temp ! level to fill to do the transition
667 : : end if
668 : : end do ! jconfig
669 : : end do ! iconfig
670 : : else if(gpu_option==ABI_GPU_OPENMP) then
671 : : #ifdef HAVE_OPENMP_OFFLOAD
672 : : !$OMP TARGET PARALLEL DO PRIVATE(iconfig,jconfig,itrans,sum_test,m_temp) &
673 : : !$OMP MAP(tofrom:transition,transition_m) MAP(to:ocp,ocp_next)
674 : : do iconfig=1,nconfig
675 : : itrans=0 ! transition from iconfig
676 : : do jconfig=1, nconfig_next
677 : : sum_test=0
678 : : do ilevel=1,nlevels
679 : : ! test if their is one electron added to the starting configuration
680 : : sum_test=sum_test + &
681 : : & (ocp_next(jconfig,ilevel)-ocp(iconfig,ilevel))**2
682 : : ! save the level for the electron added
683 : : if(ocp_next(jconfig,ilevel)==1.and.ocp(iconfig,ilevel)==0) then
684 : : m_temp=ilevel
685 : : end if
686 : : end do ! ilevel
687 : : if(sum_test==1) then
688 : : itrans=itrans+1
689 : : !if(itrans>nlevels-nelec) then
690 : : ! write(message,'(a,4i4)') "BUG: itrans is to big in hubbard_one",itrans,iconfig,jconfig,ilevel
691 : : ! call wrtout(std_out,message,'COLL')
692 : : !end if
693 : : transition(iconfig,itrans)=jconfig ! jconfig=config(n+1) obtained after transition
694 : : transition_m(iconfig,itrans)=m_temp ! level to fill to do the transition
695 : : end if
696 : : end do ! jconfig
697 : : end do ! iconfig
698 : : #endif
699 : : end if
700 : :
701 : :
702 : :
703 : 93 : if(prtopt>3) then
704 : : do iconfig=1,nconfig
705 : : write(std_out,'(a,2i5,a,18i5)') "occ_level", nelec,&
706 : : & iconfig," :",(transition(iconfig,itrans),itrans=1,nlevels-nelec)
707 : : write(std_out,'(a,2i5,a,18i5)') "electron added", nelec,iconfig,&
708 : : & " :",(transition_m(iconfig,itrans),itrans=1,nlevels-nelec)
709 : : end do
710 : : end if
711 : :
712 : : end do ! nelec
713 : :
714 : : ! ===================================
715 : : ! Built Partition Function
716 : : ! ===================================
717 : 93 : Z_part=czero
718 : : ! do nelec=1,nlevels-1
719 [ + + ]: 972 : do nelec=0,nlevels
720 [ + + ]: 119244 : do iconfig=1,nconfig_nelec(nelec)
721 : 118272 : Ei_n = e_nelec (nelec )%config(iconfig) + eshift
722 : 119151 : Z_part=Z_part+dexp(-Ei_n*beta)
723 : : ! write(std_out,*) "fonction de partition",nelec,iconfig, Z_part,Ei_n*beta,Ei_n,eshift
724 : : end do
725 : : end do
726 : : ! write(std_out,*) "Z_part",Z_part
727 : :
728 : : ! ===================================
729 : : ! Built Green Function
730 : : ! ===================================
731 [ - + + - : 372 : ABI_MALLOC(green_temp,(green_hubbard%nw,nlevels))
- + + - +
- + - - +
- + ]
732 [ - + + - : 279 : ABI_MALLOC(green_temp_realw,(green_hubbard%nw,nlevels))
- + + - -
+ - + ]
733 : : ! For each freq.
734 : :
735 [ + + + + ]: 44255 : green_temp=czero
736 [ + + + + ]: 44255 : green_temp_realw=czero
737 : 93 : tmp=zero
738 [ + + ]: 879 : do nelec=0,nlevels-1
739 : : ! write(std_out,*) "For nelec =",nelec
740 [ + + ]: 119058 : do iconfig=1,nconfig_nelec(nelec)
741 : : ! write(std_out,*) "The config nb:",iconfig
742 [ + + ]: 836277 : do itrans=1,nlevels-nelec
743 : 717312 : jconfig = occ_level(nelec )%transition(iconfig,itrans)
744 : 717312 : m_temp = occ_level(nelec )%transition_m(iconfig,itrans)
745 : 717312 : Ej_np1 = e_nelec (nelec+1)%config(jconfig) + eshift
746 : 717312 : Ei_n = e_nelec (nelec )%config(iconfig) + eshift
747 : : ! write(std_out,'(a,i4,a)') "Transition nb:",itrans,"involve"
748 : : ! write(std_out,'(a,i4,a)') " jconfig=",jconfig
749 : : ! write(std_out,'(a,i4,a)') " m_temp=",m_temp
750 [ + + ]: 39909283 : do ifreq=1,green_hubbard%nw
751 [ + - ]: 39073792 : if(green_hubbard%w_type=="imag") then
752 : 39073792 : omega_current=cmplx(zero,green_hubbard%omega(ifreq),kind=dp)
753 [ # # ]: 0 : else if(green_hubbard%w_type=="real") then
754 : 0 : omega_current=cmplx(green_hubbard%omega(ifreq),zero,kind=dp)
755 : : end if
756 : : green_temp(ifreq,m_temp)=green_temp(ifreq,m_temp)+ &
757 : : & (dexp(-Ej_np1*beta)+ dexp(-Ei_n*beta))/ &
758 : 39073792 : & ( omega_current +Ei_n-Ej_np1)
759 : : if(ifreq==1.and.m_temp==1) tmp=tmp+(dexp(-Ej_np1*beta)+ dexp(-Ei_n*beta))
760 : :
761 : : green_temp_realw(ifreq,m_temp)=green_temp_realw(ifreq,m_temp)+ &
762 : : & (dexp(-Ej_np1*beta)+ dexp(-Ei_n*beta))/ &
763 : 39791104 : & ( omega_current +Ei_n-Ej_np1)
764 : : end do
765 : : ! green_temp_realw(m_temp)=green_temp_realw(m_temp)+ &
766 : : ! & (dexp(-Ej_np1*beta)+ dexp(-Ei_n*beta)) -> will give one at the end
767 : : ! write(std_out,*) "green",-Ej_np1*beta,-Ei_n*beta,dexp(-Ej_np1*beta),dexp(-Ei_n*beta)
768 : : end do
769 : : end do
770 : : end do
771 : : ! write(std_out,*) "tmp",tmp
772 : : ilevel=0
773 [ + + ]: 188 : do ispinor=1,nspinor
774 [ + + ]: 334 : do isppol=1,nsppol
775 [ + + ]: 907 : do im=1,(2*lpawu+1)
776 : 666 : ilevel=ilevel+1
777 : : ! write(std_out,'(16e15.6)') paw_dmft%omega_lo(ifreq),(real(green_temp_realw(ilevel)/Z_part),ilevel=1,nlevels)
778 [ + + ]: 32188 : do ifreq=1,green_hubbard%nw
779 : 31376 : green_hubbard%oper(ifreq)%matlu(iatom)%mat(im+(ispinor-1)*ndim,im+(ispinor-1)*ndim,isppol)=green_temp(ifreq,ilevel)/Z_part
780 : 32042 : green_hubbard_realw%oper(ifreq)%matlu(iatom)%mat(im+(ispinor-1)*ndim,im+(ispinor-1)*ndim,isppol)=green_temp_realw(ifreq,ilevel)/Z_part
781 : : end do
782 : : end do
783 : : end do
784 : : end do
785 : :
786 : : ! End calculation for this frequency
787 [ - + ]: 93 : ABI_FREE(green_temp)
788 [ - + ]: 93 : ABI_FREE(green_temp_realw)
789 : :
790 : : ! ===================================
791 : : ! Deallocations
792 : : ! ===================================
793 [ + + ]: 972 : do nelec=0,nlevels
794 [ - + ]: 879 : ABI_FREE(occ_level(nelec)%repart)
795 [ - + ]: 879 : ABI_FREE(occ_level(nelec)%ocp)
796 [ - + ]: 879 : ABI_FREE(occ_level(nelec)%transition)
797 [ - + ]: 879 : ABI_FREE(occ_level(nelec)%transition_m)
798 [ - + ]: 972 : ABI_FREE(e_nelec(nelec)%config)
799 : : end do
800 : 93 : ABI_FREE(occ_level)
801 [ - + ]: 93 : ABI_FREE(occup)
802 : 93 : ABI_FREE(nconfig_nelec)
803 [ - + ]: 93 : ABI_FREE(e_nelec)
804 [ - + ]: 93 : ABI_FREE(elevels)
805 [ - + ]: 93 : ABI_FREE(maxener)
806 [ - + ]: 93 : ABI_FREE(minener)
807 : : end if
808 : : end do
809 : 69 : call destroy_green(green_hubbard_realw)
810 : :
811 : : ABI_NVTX_END_RANGE()
812 : :
813 [ - + - - : 138 : end subroutine green_atomic_hubbard
- - - + -
+ - - - -
- + - + -
+ - + - +
- + - + -
+ - + - -
- - - - -
- - - - +
- - - - -
- - - - -
- + - - -
- - - - -
- - ]
814 : : !!***
815 : :
816 : : !!****f* m_hubbard_one/combin
817 : : !! NAME
818 : : !! combin
819 : : !!
820 : : !! FUNCTION
821 : : !!
822 : : !!
823 : : !! COPYRIGHT
824 : : !! Copyright (C) 1999-2026 ABINIT group (BAmadon)
825 : : !! This file is distributed under the terms of the
826 : : !! GNU General Public License, see ~abinit/COPYING
827 : : !! or http://www.gnu.org/copyleft/gpl.txt .
828 : : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt .
829 : : !!
830 : : !! INPUTS
831 : : !!
832 : : !!
833 : : !! OUTPUT
834 : : !!
835 : : !! NOTES
836 : : !!
837 : : !! SOURCE
838 : :
839 : 118179 : recursive subroutine combin(ielec,nconfig,nconfig_nelec,nelec,nlevels,occ_level,occup)
840 : :
841 : : !Arguments ------------------------------------
842 : : !scalars
843 : : ! type(pawang_type), intent(in) :: pawang
844 : : integer, intent(in) :: ielec,nelec,nlevels
845 : : integer, intent(inout) :: nconfig,nconfig_nelec(0:nlevels)
846 : : integer, intent(inout) :: occup(0:nlevels,nlevels)
847 : : ! type :: level2_type
848 : : ! integer, pointer :: repart(:,:)
849 : : ! end type
850 : : type(level2_type), intent(inout) :: occ_level(0:nlevels)
851 : : ! integer, intent(in) :: prtopt
852 : :
853 : : !Local variables ------------------------------
854 : : ! scalars
855 : : integer :: max_ielec,pos,min_ielec,jelec,prtopt
856 : : character(len=500) :: message
857 : : ! arrays
858 : : !************************************************************************
859 : 118179 : prtopt=1
860 : 118179 : max_ielec=nlevels-nelec+ielec
861 : : ! write(std_out,*) "call to combin ielec,nelec,nlevels",ielec,nelec,nlevels
862 : : select case (ielec)
863 : : case (1)
864 : 117393 : min_ielec=1
865 : : case default
866 [ + + ]: 118179 : min_ielec=occup(nelec,ielec-1)+1
867 : : end select
868 : : ! write(std_out,*) "For ielec", ielec, "min_ielec,max_ielec",min_ielec,max_ielec
869 [ + + ]: 353751 : do pos = min_ielec, max_ielec
870 [ + + ]: 353751 : if(ielec==nelec) then
871 : 118179 : occup(nelec,ielec)=pos
872 : 118179 : nconfig=nconfig+1
873 : 118179 : nconfig_nelec(nelec)=nconfig_nelec(nelec)+1
874 : : ! write(std_out,*) "size",size(occ_level),size(occ_level(nelec)%repart,1)
875 : : ! write(std_out,*) "size",size(occ_level),size(occ_level(nelec)%repart,2)
876 [ + + ]: 835491 : do jelec=1,nelec
877 : : ! write(std_out,*) "nconfig",nconfig_nelec(nelec),nelec
878 : : ! write(std_out,*) "occup",occup(nelec,jelec)
879 : 835491 : occ_level(nelec)%repart(nconfig_nelec(nelec),jelec)=occup(nelec,jelec)
880 : : end do
881 : : ! write(std_out,*) "For ielec", ielec, "case nelec"
882 : : if(prtopt>=3) then
883 : : write(message,'(a,i3,a,30i5)') "For ielec",ielec," Occupf are", (occup(nelec,jelec),jelec=1,nelec)
884 : : call wrtout(std_out,message,'COLL')
885 : : end if
886 : : else
887 : 117393 : occup(nelec,ielec)=pos
888 : : ! write(std_out,*) "For ielec", ielec, "case 1 and default"
889 : 117393 : call combin(ielec+1,nconfig,nconfig_nelec,nelec,nlevels,occ_level,occup)
890 : : if(prtopt>=3) then
891 : : write(message,'(a,i3,a,30i5)') "For ielec",ielec," Occup are", (occup(nelec,jelec),jelec=1,nelec)
892 : : call wrtout(std_out,message,'COLL')
893 : : end if
894 : : end if
895 : : end do
896 : :
897 : 69 : end subroutine combin
898 : : !!***
899 : :
900 : : end subroutine hubbard_one
901 : : !!***
902 : :
903 : : END MODULE m_hubbard_one
904 : : !!***
|