Line data Source code
1 : !!****m* ABINIT/m_hu
2 : !! NAME
3 : !! m_hu
4 : !!
5 : !! FUNCTION
6 : !!
7 : !! COPYRIGHT
8 : !! Copyright (C) 2006-2026 ABINIT group (BAmadon)
9 : !! This file is distributed under the terms of the
10 : !! GNU General Public License, see ~abinit/COPYING
11 : !! or http://www.gnu.org/copyleft/gpl.txt .
12 : !!
13 : !! INPUTS
14 : !!
15 : !! OUTPUT
16 : !!
17 : !! SOURCE
18 :
19 : #if defined HAVE_CONFIG_H
20 : #include "config.h"
21 : #endif
22 :
23 :
24 : #include "abi_common.h"
25 :
26 : MODULE m_hu
27 :
28 : use defs_basis
29 : use m_abicore
30 : use m_errors
31 :
32 : use m_abi_linalg, only : abi_xgemm
33 : use m_matlu, only : matlu_type
34 : use m_paw_dmft, only : paw_dmft_type
35 : use m_pawtab, only : pawtab_type
36 : use m_crystal, only : crystal_t
37 :
38 : implicit none
39 :
40 : private
41 :
42 : public :: init_vee
43 : public :: destroy_vee
44 : public :: init_hu
45 : public :: copy_hu
46 : public :: destroy_hu
47 : !public :: qmc_hu
48 : public :: print_hu
49 : public :: vee2udens_hu
50 : public :: rotatevee_hu
51 : public :: printvee_hu
52 : public :: vee2udensatom_hu
53 : public :: vee_slm2ylm_hu
54 : public :: vee_ndim2tndim_hu
55 : public :: vee_ndim2tndim_hu_r
56 : public :: udens_slatercondon_hu
57 : public :: udens_inglis_hu
58 :
59 : !!***
60 :
61 : !!****t* m_hu/vee_type
62 : !! NAME
63 : !! vee_type
64 : !!
65 : !! FUNCTION
66 : !! Structured datatype to store the U tensor
67 : !! for each atom.
68 : !!
69 : !! SOURCE
70 :
71 : type, public :: vee_type ! for each atom
72 :
73 : complex(dp), allocatable :: mat(:,:,:,:)
74 :
75 : end type vee_type
76 : !!***
77 :
78 : !----------------------------------------------------------------------
79 :
80 :
81 : !!****t* m_hu/hu_type
82 : !! NAME
83 : !! hu_type
84 : !!
85 : !! FUNCTION
86 : !! This structured datatype contains interaction matrices for the correlated subspace
87 : !!
88 : !! SOURCE
89 :
90 : type, public :: hu_type ! for each typat
91 :
92 : integer :: lpawu
93 :
94 : !logical :: jmjbasis
95 :
96 : real(dp) :: upawu ! => upaw
97 :
98 : real(dp) :: jpawu ! => jpaw
99 :
100 : logical :: jpawu_zero ! true if all jpawu are zero
101 : ! false if one of the jpaw is not zero
102 :
103 : real(dp), allocatable :: fk(:)
104 :
105 : complex(dp), allocatable :: udens(:,:)
106 :
107 : complex(dp), allocatable :: uqmc(:)
108 :
109 : complex(dp), allocatable :: vee(:,:,:,:)
110 :
111 : complex(dp), allocatable :: veeslm2(:,:,:,:)
112 :
113 : end type hu_type
114 :
115 : !----------------------------------------------------------------------
116 :
117 : CONTAINS !========================================================================================
118 : !!***
119 :
120 : !!****f* m_hu/init_vee
121 : !! NAME
122 : !! init_vee
123 : !!
124 : !! FUNCTION
125 : !! Allocate variables used in type vee_type.
126 : !!
127 : !! INPUTS
128 : !! paw_dmft <type(paw_dmft_type)>= paw+dmft related data
129 : !! vee = tensor for the interactions
130 : !!
131 : !! OUTPUTS
132 : !!
133 : !! SOURCE
134 :
135 103 : subroutine init_vee(paw_dmft,vee)
136 :
137 : !Arguments ------------------------------------
138 : type(paw_dmft_type), intent(in) :: paw_dmft
139 : type(vee_type), intent(inout) :: vee(paw_dmft%natom)
140 : !Local variables ------------------------------------
141 : integer :: iatom,lpawu,ndim
142 : !************************************************************************
143 :
144 467 : do iatom=1,paw_dmft%natom
145 364 : lpawu = paw_dmft%lpawu(iatom)
146 364 : if (lpawu == -1) cycle
147 127 : ndim = 2 * (2*lpawu+1)
148 762 : ABI_MALLOC(vee(iatom)%mat,(ndim,ndim,ndim,ndim))
149 1506985 : vee(iatom)%mat(:,:,:,:) = czero
150 : end do ! iatom
151 :
152 103 : end subroutine init_vee
153 : !!***
154 :
155 : !!****f* m_hu/destroy_vee
156 : !! NAME
157 : !! destroy_vee
158 : !!
159 : !! FUNCTION
160 : !! Destroy vee
161 : !!
162 : !! INPUTS
163 : !! paw_dmft <type(paw_dmft_type)>= paw+dmft related data
164 : !! vee = tensor for the interactions
165 : !!
166 : !! OUTPUTS
167 : !!
168 : !! SOURCE
169 :
170 103 : subroutine destroy_vee(paw_dmft,vee)
171 :
172 : !Arguments ------------------------------------
173 : type(paw_dmft_type), intent(in) :: paw_dmft
174 : type(vee_type), intent(inout) :: vee(paw_dmft%natom)
175 : !Local variables ------------------------------------
176 : integer :: iatom,lpawu
177 : !************************************************************************
178 :
179 467 : do iatom=1,paw_dmft%natom
180 364 : lpawu = paw_dmft%lpawu(iatom)
181 364 : if (lpawu == -1) cycle
182 467 : ABI_FREE(vee(iatom)%mat)
183 : end do ! iatom
184 :
185 103 : end subroutine destroy_vee
186 : !!***
187 :
188 : !!****f* m_hu/init_hu
189 : !! NAME
190 : !! init_hu
191 : !!
192 : !! FUNCTION
193 : !! Allocate variables used in type hu_type.
194 : !!
195 : !! INPUTS
196 : !! paw_dmft <type(paw_dmft_type)>= paw+dmft related data
197 : !! pawtab <type(pawtab)>=paw related data
198 : !!
199 : !! OUTPUTS
200 : !! hu <type(hu_type)>= U interaction
201 : !!
202 : !! SOURCE
203 :
204 93 : subroutine init_hu(hu,paw_dmft,pawtab)
205 :
206 : !Arguments ------------------------------------
207 : type(paw_dmft_type), intent(in) :: paw_dmft
208 : type(pawtab_type), intent(in) :: pawtab(paw_dmft%ntypat)
209 : type(hu_type), intent(inout) :: hu(paw_dmft%ntypat)
210 : !Local variables ------------------------------------
211 : integer :: i,ij,ij1,ij2,itypat,lpawu,m
212 : integer :: m1,ms,ms1,ndim,ntypat,tndim
213 : logical :: dmft_optim,t2g,x2my2d
214 : real(dp) :: jpawu,upawu,xtemp
215 : integer, parameter :: mt2g(3) = (/1,2,4/)
216 93 : integer, allocatable :: xij(:,:)
217 : character(len=4) :: tag
218 : character(len=500) :: message
219 : !************************************************************************
220 :
221 93 : ntypat = paw_dmft%ntypat
222 93 : t2g = (paw_dmft%dmft_t2g == 1)
223 93 : x2my2d = (paw_dmft%dmft_x2my2d == 1)
224 :
225 93 : dmft_optim = (paw_dmft%dmft_solv == 6 .or. paw_dmft%dmft_solv == 7)
226 :
227 93 : write(message,'(2a)') ch10," == Compute Interactions for DMFT"
228 93 : call wrtout(std_out,message,'COLL')
229 :
230 93 : xtemp = zero
231 :
232 : ! ====================================
233 : ! Compute hu(iatom)%uqmc from vee
234 : ! ====================================
235 93 : hu(1)%jpawu_zero = .true.
236 296 : do itypat=1,ntypat
237 203 : lpawu = pawtab(itypat)%lpawu
238 203 : hu(itypat)%upawu = zero
239 203 : hu(itypat)%jpawu = zero
240 : !hu(itypat)%jmjbasis = .false.
241 203 : if (t2g .and. lpawu == 2) lpawu = 1
242 203 : if (x2my2d .and. lpawu == 2) lpawu = 0
243 203 : hu(itypat)%lpawu = lpawu
244 203 : if (lpawu == -1) cycle
245 93 : ndim = 2*lpawu + 1
246 93 : tndim = 2 * ndim
247 93 : hu(itypat)%upawu = pawtab(itypat)%upawu
248 93 : hu(itypat)%jpawu = pawtab(itypat)%jpawu
249 :
250 93 : if (hu(itypat)%jpawu > tol4) hu(1)%jpawu_zero = .false.
251 : ! ndim1=2*hu(itypat)%lpawu+1
252 :
253 : ! allocate(hu(itypat)%vee(ndim,ndim,ndim,ndim))
254 :
255 558 : ABI_MALLOC(hu(itypat)%vee,(ndim,ndim,ndim,ndim))
256 :
257 : ! t2g case begin
258 93 : if (t2g) then
259 188 : do ms1=1,ndim
260 611 : do m1=1,ndim
261 1833 : do ms=1,ndim
262 5499 : do m=1,ndim
263 : hu(itypat)%vee(m,ms,m1,ms1) = &
264 5076 : & cmplx(pawtab(itypat)%vee(mt2g(m),mt2g(ms),mt2g(m1),mt2g(ms1)),zero,kind=dp)
265 : end do ! m
266 : end do ! ms
267 : end do ! m1
268 : end do ! ms1
269 : ! t2g case end
270 : ! x2my2d case begin
271 46 : else if (x2my2d) then
272 0 : hu(itypat)%vee(1,1,1,1) = cmplx(pawtab(itypat)%upawu,zero,kind=dp)
273 : ! x2my2d case end
274 : else
275 70266 : hu(itypat)%vee(:,:,:,:) = cmplx(pawtab(itypat)%vee(:,:,:,:),zero,kind=dp)
276 : end if ! t2g or xymy2d
277 : ! x2my2d case end
278 :
279 558 : ABI_MALLOC(hu(itypat)%veeslm2,(tndim,tndim,tndim,tndim))
280 93 : call vee_ndim2tndim_hu(lpawu,hu(itypat)%vee(:,:,:,:),hu(itypat)%veeslm2(:,:,:,:))
281 :
282 : ! This is copied from pawpuxinit: it would be better not to duplicate
283 : ! these lines.
284 279 : ABI_MALLOC(hu(itypat)%fk,(0:lpawu)) ! not used in the t2g and x2my2d cases
285 93 : hu(itypat)%fk(0) = hu(itypat)%upawu
286 93 : if (lpawu == 1) then
287 47 : hu(itypat)%fk(1) = hu(itypat)%jpawu * dble(5)
288 46 : else if (lpawu == 2) then
289 29 : hu(itypat)%fk(1) = hu(itypat)%jpawu * dble(14) / (one+pawtab(itypat)%f4of2_sla)
290 29 : hu(itypat)%fk(2) = hu(itypat)%fk(1) * pawtab(itypat)%f4of2_sla
291 17 : else if (lpawu == 3) then
292 : hu(itypat)%fk(1) = hu(itypat)%jpawu * dble(6435) / (dble(286)+&
293 17 : & dble(195)*pawtab(itypat)%f4of2_sla+dble(250)*pawtab(itypat)%f6of2_sla)
294 17 : hu(itypat)%fk(2) = hu(itypat)%fk(1) * pawtab(itypat)%f4of2_sla
295 17 : hu(itypat)%fk(3) = hu(itypat)%fk(1) * pawtab(itypat)%f6of2_sla
296 : end if ! lpawu
297 :
298 93 : write(tag,'(i4)') itypat
299 93 : write(message,'(3a)') ch10,' -------> For Correlated Species ',adjustl(tag)
300 93 : call wrtout(std_out,message,'COLL')
301 :
302 279 : ABI_MALLOC(hu(itypat)%uqmc,(ndim*(tndim-1)))
303 372 : ABI_MALLOC(hu(itypat)%udens,(tndim,tndim))
304 372 : ABI_MALLOC(xij,(tndim,tndim))
305 :
306 8827 : hu(itypat)%udens(:,:) = czero
307 : ij = 0
308 810 : do ms=1,tndim-1
309 717 : xij(ms,ms) = 0
310 717 : m = mod(ms-1,ndim) + 1
311 4367 : do ms1=ms+1,tndim
312 3557 : ij = ij + 1
313 3557 : xij(ms,ms1) = ij
314 3557 : xij(ms1,ms) = ij
315 3557 : m1 = mod(ms1-1,ndim) + 1
316 3557 : if ((ms <= ndim) .and. (ms1 > ndim)) then
317 1981 : hu(itypat)%uqmc(ij) = hu(itypat)%vee(m,m1,m,m1)
318 : else
319 1576 : hu(itypat)%uqmc(ij) = hu(itypat)%vee(m,m1,m,m1) - hu(itypat)%vee(m,m1,m1,m)
320 : end if
321 3557 : hu(itypat)%udens(ms,ms1) = hu(itypat)%uqmc(ij)
322 4274 : hu(itypat)%udens(ms1,ms) = hu(itypat)%udens(ms,ms1)
323 : end do ! ms1
324 : end do ! ms
325 :
326 93 : if (t2g .and. dmft_optim) then
327 : upawu = zero
328 : jpawu = zero
329 0 : do ms1=1,ndim
330 0 : do ms=1,ndim
331 0 : upawu = upawu + dble(hu(itypat)%vee(ms,ms1,ms,ms1))
332 0 : jpawu = jpawu + dble(hu(itypat)%vee(ms,ms1,ms,ms1)-hu(itypat)%vee(ms,ms1,ms1,ms))
333 : end do ! ms
334 : end do ! ms1
335 0 : upawu = upawu / dble(ndim**2)
336 0 : jpawu = upawu - jpawu/dble(2*lpawu*ndim)
337 0 : hu(itypat)%upawu = upawu
338 0 : hu(itypat)%jpawu = jpawu
339 : end if ! t2g and dmft_optim=1
340 :
341 93 : xij(tndim,tndim) = 0
342 93 : write(message,'(a,5x,a)') ch10,"-------- Interactions in the density-density representation, in the cubic basis "
343 93 : call wrtout(std_out,message,'COLL')
344 903 : write(message,'(1x,14(2x,i5))') (m,m=1,tndim)
345 93 : call wrtout(std_out,message,'COLL')
346 : ! xtemp1b=0.d0
347 : ! ====================================
348 : ! Print hu(iatom)%uqmc
349 : ! ====================================
350 93 : ij2 = 0
351 903 : do i=1,tndim
352 810 : if (i < tndim) then
353 717 : ij1 = ij2 + 1
354 717 : ij2 = ij2 + tndim - i
355 : end if
356 : ! write(std_out,*) itypat
357 : ! do m=1,i
358 : ! write(std_out,*) i,m
359 : ! write(std_out,*) xij(i,m)
360 : ! write(std_out,*) ij1,ij2
361 : ! enddo
362 1527 : if (i == 1) write(message,'(i3,14f7.3)') i,xtemp,(dble(hu(itypat)%uqmc(m)),m=ij1,ij2)
363 1434 : if (i /= tndim .and. i /= 1) write(message,'(i3,14f7.3)') i, &
364 6928 : & (dble(hu(itypat)%uqmc(xij(i,m))),m=1,i-1),xtemp,(dble(hu(itypat)%uqmc(m)),m=ij1,ij2)
365 1527 : if (i == tndim) write(message,'(i3,14f7.3)') i,(dble(hu(itypat)%uqmc(xij(i,m))),m=1,i-1),xtemp
366 903 : call wrtout(std_out,message,'COLL')
367 : end do ! i
368 93 : write(message,'(5x,a)') "--------------------------------------------------------"
369 93 : call wrtout(std_out,message,'COLL')
370 296 : ABI_FREE(xij)
371 :
372 : !imag part for debug
373 : ! ij2 = 0
374 : ! do i=1,tndim
375 : ! if (i < tndim) then
376 : ! ij1 = ij2 + 1
377 : ! ij2 = ij2 + tndim - i
378 : ! end if
379 : ! if (i == 1) write(message,'(i3,14f7.3)') i,xtemp,(aimag(hu(itypat)%uqmc(m)),m=ij1,ij2)
380 : ! if (i /= tndim .and. i /= 1) write(message,'(i3,14f7.3)') i, &
381 : ! & (aimag(hu(itypat)%uqmc(xij(i,m))),m=1,i-1),xtemp,(aimag(hu(itypat)%uqmc(m)),m=ij1,ij2)
382 : ! if (i == tndim) write(message,'(i3,14f7.3)') i,(aimag(hu(itypat)%uqmc(xij(i,m))),m=1,i-1),xtemp
383 : ! call wrtout(std_out,message,'COLL')
384 : ! end do ! i
385 : ! write(message,'(5x,a)') "--------------------------------------------------------"
386 : ! call wrtout(std_out,message,'COLL')
387 : ! ABI_FREE(xij)
388 :
389 :
390 : end do ! itypat
391 :
392 93 : end subroutine init_hu
393 : !!***
394 :
395 : !!****f* m_hu/copy_hu
396 : !! NAME
397 : !! copy_hu
398 : !!
399 : !! FUNCTION
400 : !! Copy hu into hu_new
401 : !!
402 : !! INPUTS
403 : !! hu <type(hu_type)>= U interaction
404 : !!
405 : !! OUTPUTS
406 : !! hu_new <type(hu_type)>= U interaction
407 : !!
408 : !! SOURCE
409 :
410 0 : subroutine copy_hu(ntypat,hu,hu_new)
411 :
412 : !Arguments ------------------------------------
413 : !type
414 : integer, intent(in) :: ntypat
415 : type(hu_type), intent(in) :: hu(ntypat)
416 : type(hu_type), intent(inout) :: hu_new(ntypat)
417 : !Local variables ------------------------------------
418 : integer :: itypat,ndim
419 : !************************************************************************
420 :
421 0 : do itypat=1,ntypat
422 0 : hu_new(itypat)%lpawu = hu(itypat)%lpawu
423 : !hu_new(itypat)%jmjbasis = hu(itypat)%jmjbasis
424 0 : hu_new(itypat)%upawu = hu(itypat)%upawu
425 0 : hu_new(itypat)%jpawu = hu(itypat)%jpawu
426 0 : hu_new(itypat)%jpawu_zero = hu(itypat)%jpawu_zero
427 0 : ndim=2*hu_new(itypat)%lpawu+1
428 0 : ABI_MALLOC(hu_new(itypat)%uqmc,(ndim*(2*ndim-1)))
429 0 : ABI_MALLOC(hu_new(itypat)%udens,(2*ndim,2*ndim))
430 0 : ABI_MALLOC(hu_new(itypat)%vee,(ndim,ndim,ndim,ndim))
431 0 : ABI_MALLOC(hu_new(itypat)%fk,(0:hu_new(itypat)%lpawu))
432 0 : hu_new(itypat)%vee = hu(itypat)%vee
433 0 : hu_new(itypat)%udens = hu(itypat)%udens
434 0 : hu_new(itypat)%uqmc = hu(itypat)%uqmc
435 0 : hu_new(itypat)%fk = hu(itypat)%fk
436 : end do ! itypat
437 :
438 0 : end subroutine copy_hu
439 : !!***
440 :
441 : !!****f* m_hu/destroy_hu
442 : !! NAME
443 : !! destroy_hu
444 : !!
445 : !! FUNCTION
446 : !! Deallocate hu
447 : !!
448 : !! INPUTS
449 : !! hu <type(hu_type)> = data for the interaction in DMFT.
450 : !! ntypat = number of species
451 : !!
452 : !! OUTPUT
453 : !!
454 : !! SOURCE
455 :
456 93 : subroutine destroy_hu(hu,ntypat)
457 :
458 : !Arguments ------------------------------------
459 : integer, intent(in) :: ntypat
460 : type(hu_type), intent(inout) :: hu(ntypat)
461 : !Local variables-------------------------------
462 : integer :: itypat
463 : ! *********************************************************************
464 :
465 296 : do itypat=1,ntypat
466 203 : ABI_SFREE(hu(itypat)%uqmc)
467 203 : ABI_SFREE(hu(itypat)%udens)
468 203 : ABI_SFREE(hu(itypat)%fk)
469 203 : ABI_SFREE(hu(itypat)%vee)
470 296 : ABI_SFREE(hu(itypat)%veeslm2)
471 : end do ! itypat
472 :
473 93 : end subroutine destroy_hu
474 : !!***
475 :
476 : !!****f* m_hu/print_hu
477 : !! NAME
478 : !! print_hu
479 : !!
480 : !! FUNCTION
481 : !! print density density interaction (used for DFT+DMFT)
482 : !!
483 : !! INPUTS
484 : !! ntypat = number of species
485 : !! prtopt = option for printing
486 : !! hu <type(hu_type)> = data for the interaction in DMFT.
487 : !!
488 : !! OUTPUT
489 : !!
490 : !! SOURCE
491 :
492 0 : subroutine print_hu(hu,ntypat,prtopt)
493 :
494 : !Arguments ------------------------------------
495 : !type
496 : integer, intent(in):: ntypat
497 : type(hu_type),intent(in) :: hu(ntypat)
498 : integer :: prtopt
499 :
500 : !Local variables-------------------------------
501 : integer :: itypat
502 : integer :: lpawu,ms,ms1,m,ndim
503 : character(len=500) :: message
504 : ! *********************************************************************
505 :
506 0 : do itypat = 1 , ntypat
507 0 : lpawu=hu(itypat)%lpawu
508 0 : if(lpawu/=-1) then
509 0 : ndim=2*lpawu+1
510 0 : write(message,'(2a,i4)') ch10,' -------> For Correlated species'
511 0 : call wrtout(std_out, message,'COLL')
512 0 : if(prtopt==0) then
513 0 : write(message,'(a,5x,a)') ch10,"-------- Interactions in the density matrix representation in cubic basis "
514 0 : else if(prtopt==1) then
515 0 : write(message,'(a,5x,a)') ch10,"-------- Interactions in the density matrix representation in diagonal basis"
516 0 : else if(prtopt==2) then
517 0 : write(message,'(a,5x,a)') ch10,"-------- Interactions in the density matrix representation in Ylm basis"
518 0 : else if(prtopt==3) then
519 0 : write(message,'(a,5x,a)') ch10,"-------- Interactions in the density matrix representation in JMJ basis"
520 : endif
521 0 : call wrtout(std_out, message,'COLL')
522 0 : write(message,'(1x,14(2x,i5))') (m,m=1,2*ndim)
523 0 : call wrtout(std_out, message,'COLL')
524 0 : do ms=1,2*ndim
525 : write(message,'(i3,14f7.3)') &
526 0 : & ms, (dble(hu(itypat)%udens(ms,ms1)),ms1=1,2*ndim)
527 0 : call wrtout(std_out, message,'COLL')
528 : enddo
529 0 : write(message,'(5x,a)') "--------------------------------------------------------"
530 0 : call wrtout(std_out, message,'COLL')
531 : endif ! lpawu/=1
532 : enddo ! ntypat
533 :
534 :
535 0 : end subroutine print_hu
536 : !!***
537 :
538 : !!****f* m_hu/vee2udens_hu
539 : !! NAME
540 : !! print_hu
541 : !!
542 : !! FUNCTION
543 : !! interaction udens in recomputed from new vee.
544 : !!
545 : !! INPUTS
546 : !! ntypat = number of species
547 : !! prtopt = option for printing
548 : !!
549 : !! OUTPUT
550 : !!
551 : !! SIDE EFFECT
552 : !! hu <type(hu_type)> = data for the interaction in DMFT.
553 : !!
554 : !! SOURCE
555 :
556 0 : subroutine vee2udens_hu(hu,ntypat,prtopt)
557 :
558 : !Arguments ------------------------------------
559 : !type
560 : integer, intent(in):: ntypat
561 : type(hu_type),intent(inout) :: hu(ntypat)
562 : integer :: prtopt
563 :
564 : !Local variables-------------------------------
565 : integer :: ij,itypat
566 : integer :: lpawu,m1,ms,ms1,m,ndim
567 : character(len=500) :: message
568 : ! *********************************************************************
569 0 : do itypat=1,ntypat
570 0 : lpawu=hu(itypat)%lpawu
571 0 : if(lpawu.ne.-1) then
572 0 : ndim=2*lpawu+1
573 0 : write(message,'(2a,i4)') ch10,' -------> For Correlated Species', itypat
574 0 : call wrtout(std_out, message,'COLL')
575 :
576 0 : hu(itypat)%udens=zero
577 0 : ij=0
578 0 : do ms=1,2*ndim-1
579 : ! xij(ms,ms)=0
580 0 : do ms1=ms+1,2*ndim
581 0 : ij=ij+1
582 : ! xij(ms,ms1)=ij
583 : ! xij(ms1,ms)=ij
584 0 : if(ms<=ndim.and.ms1>ndim) then
585 0 : m1 = ms1 - ndim
586 0 : m = ms
587 0 : hu(itypat)%uqmc(ij)=hu(itypat)%vee(m,m1,m,m1)
588 0 : hu(itypat)%udens(ms,ms1)= hu(itypat)%vee(m,m1,m,m1)
589 0 : hu(itypat)%udens(ms1,ms)= hu(itypat)%udens(ms,ms1)
590 0 : else if(ms<=ndim.and.ms1<=ndim) then
591 0 : m1 = ms1
592 0 : m = ms
593 0 : hu(itypat)%uqmc(ij)=hu(itypat)%vee(m,m1,m,m1)-hu(itypat)%vee(m,m1,m1,m)
594 0 : hu(itypat)%udens(ms,ms1)= hu(itypat)%uqmc(ij)
595 0 : hu(itypat)%udens(ms1,ms)= hu(itypat)%udens(ms,ms1)
596 : else
597 0 : m1 = ms1 - ndim
598 0 : m = ms - ndim
599 0 : hu(itypat)%uqmc(ij)=hu(itypat)%vee(m,m1,m,m1)-hu(itypat)%vee(m,m1,m1,m)
600 0 : hu(itypat)%udens(ms,ms1)= hu(itypat)%uqmc(ij)
601 0 : hu(itypat)%udens(ms1,ms)= hu(itypat)%udens(ms,ms1)
602 : endif
603 : enddo
604 : enddo
605 : ! xij(2*ndim,2*ndim)=0
606 : ! write(message,'(a,5x,a)') ch10,"-------- Interactions in the density matrix representation "
607 : ! call wrtout(std_out, message,'COLL')
608 : ! write(message,'(1x,14(2x,i5))') (m,m=1,2*ndim)
609 : ! call wrtout(std_out, message,'COLL')
610 : endif
611 : enddo ! itypat
612 0 : call print_hu(hu,ntypat,prtopt)
613 :
614 :
615 0 : end subroutine vee2udens_hu
616 : !!***
617 :
618 : !!****f* m_hu/rotatevee_hu
619 : !! NAME
620 : !! rotatevee_hu
621 : !!
622 : !! FUNCTION
623 : !! Rotate U matrix to new basis
624 : !!
625 : !! INPUTS
626 : !! hu <type(hu_type)>= U interaction
627 : !! paw_dmft <type(paw_dmft_type)>= paw+dmft related data
628 : !! pawprtvol >= 3 : print different quantities
629 : !! rot_mat = rotation matrix
630 : !! rot_type = 0 ! keep original Slm basis
631 : !! = 1 ! use the rotation matrix rot_mat from diago of dmat, green, levels..
632 : !! = 2 ! rotation to the Ylm basis
633 : !! = 3 ! rotation to the JmJ Basis
634 : !! = 4 ! same as 1 but rot_mat is applied from the Ylm basis instead of the Slm basis
635 : !!
636 : !! OUTPUT
637 : !! udens_atoms = rotated udens
638 : !! vee_rotated = rotated vee
639 : !!
640 : !! SIDE EFFECT
641 : !! hu <type(hu_type)> = data for the interaction in DMFT.
642 : !!
643 : !! SOURCE
644 :
645 83 : subroutine rotatevee_hu(hu,paw_dmft,pawprtvol,rot_mat,rot_type,udens_atoms,vee_rotated)
646 :
647 : !Arguments ------------------------------------
648 : type(paw_dmft_type), intent(in) :: paw_dmft
649 : integer, intent(in) :: pawprtvol,rot_type
650 : type(hu_type), target, intent(inout) :: hu(paw_dmft%ntypat)
651 : type(matlu_type), intent(in) :: rot_mat(paw_dmft%natom)
652 : type(matlu_type), intent(inout) :: udens_atoms(paw_dmft%natom)
653 : type(vee_type), target, intent(inout) :: vee_rotated(paw_dmft%natom)
654 : !Local variables-------------------------------
655 : integer :: iatom,itypat,lpawu,m,m1,m2,mi,ms,ms1,nat_correl
656 : integer :: natom,ndim,nflavor,nspinor,nsppol,nsppol_,prtonly,tndim,prtopt
657 : logical :: triqs
658 : real(dp) :: f2,jpawu,xsum,xsum2,xsum2new,xsumnew
659 : character(len=4) :: tag_at
660 : character(len=30) :: basis_vee
661 : character(len=500) :: message
662 83 : complex(dp), target, allocatable :: veeylm(:,:,:,:)
663 : complex(dp), pointer :: veeslm(:,:,:,:) => null(),veetemp(:,:,:,:) => null()
664 : complex(dp), pointer :: veetemp2(:,:,:,:) => null(),veetemp3(:,:,:,:) => null()
665 : complex(dp), pointer :: veeylm2(:,:,:,:) => null()
666 : ! *********************************************************************
667 :
668 83 : natom = paw_dmft%natom
669 83 : nspinor = paw_dmft%nspinor
670 83 : nsppol = paw_dmft%nsppol
671 :
672 83 : triqs = (paw_dmft%dmft_solv == 6 .or. paw_dmft%dmft_solv == 7 .or. paw_dmft%dmft_solv == 10)
673 :
674 83 : if(paw_dmft%dmft_solv .eq. 10) then
675 0 : prtopt = 4
676 : else
677 83 : prtopt = 1
678 : endif
679 :
680 83 : write(message,'(a,3x,a)') ch10,"== Rotate interaction to the CTQMC basis"
681 83 : call wrtout(std_out,message,"COLL")
682 :
683 : !================================================
684 : ! NSPINOR = 2
685 : !================================================
686 :
687 83 : if (nspinor == 2) then
688 :
689 4 : do iatom=1,natom
690 2 : lpawu = paw_dmft%lpawu(iatom)
691 2 : if (lpawu == -1) cycle
692 2 : itypat = paw_dmft%typat(iatom)
693 2 : jpawu = hu(itypat)%jpawu
694 2 : ndim = 2*lpawu + 1
695 2 : tndim = nspinor * ndim
696 : !if(pawprtvol>=3) then
697 : ! write(message,'(2a)') ch10," VEE INPUT AVANT TRANSFORMATION"
698 : ! call wrtout(std_out, message,'COLL')
699 : ! call printvee_hu(ndim,hu(itypat)%vee,4,'Slm')
700 : !endif
701 :
702 2 : write(tag_at,'(i4)') iatom
703 2 : write(message,'(3a)') ch10,' -------> For Correlated atom ',adjustl(tag_at)
704 2 : call wrtout(std_out,message,'COLL')
705 :
706 : ! ==================================
707 : ! First print veeslm
708 : ! ==================================
709 :
710 : ! Print udens in the Slm basis
711 2 : call vee2udensatom_hu(ndim,hu(itypat)%udens(:,:),hu(itypat)%vee(:,:,:,:),"cubic",prtonly=1)
712 :
713 2 : if (.not. paw_dmft%dmft_solv .eq. 10) then
714 2 : basis_vee = "cubic"
715 : ! First print veeslm
716 : !call printvee_hu(ndim,real(veeslm),1,basis_vee)
717 2 : call printvee_hu(tndim,hu(itypat)%veeslm2(:,:,:,:),prtopt,basis_vee)
718 : end if
719 :
720 : ! ==================================
721 : ! Then compute veerotated
722 : ! ==================================
723 :
724 : ! In the basis where levels/density matrix/green function is diagonal
725 : ! ================================================================================
726 :
727 : ! When J=0, vee(:,i,:,j) and vee(i,:,j,:) are homotheties for all i,j
728 : ! when using Slater parametrization ; so no need to rotate them
729 2 : if (rot_type == 1 .and. jpawu > tol10) then
730 : ! ---------------------
731 :
732 : !veerotated=czero
733 : !do m1=1,tndim
734 : ! do m2=1,tndim
735 : ! do m3=1,tndim
736 : ! do m4=1,tndim
737 : ! do mi=1,tndim
738 : ! do mj=1,tndim
739 : ! do mk=1,tndim
740 : ! do ml=1,tndim
741 : ! veerotated(m1,m2,m3,m4)= veerotated(m1,m2,m3,m4) + &
742 : !& conjg(rot_mat(iatom,1)%value(mi,m1))* &
743 : !& conjg(rot_mat(iatom,1)%value(mj,m2))* &
744 : !& rot_mat(iatom,1)%value(mk,m3)* &
745 : !& rot_mat(iatom,1)%value(ml,m4)* &
746 : !& veeslm2(mi,mj,mk,ml)
747 : ! enddo
748 : ! enddo
749 : ! enddo
750 : ! enddo
751 : ! enddo
752 : ! enddo
753 : ! enddo
754 : ! enddo
755 :
756 0 : call rotate_hu(rot_mat(iatom)%mat(:,:,:),1,tndim,hu(itypat)%veeslm2(:,:,:,:),vee_rotated(iatom)%mat(:,:,:,:))
757 0 : basis_vee = "CTQMC basis from cubic"
758 :
759 : ! In the Ylm basis
760 : ! ================================================================================
761 2 : else if ((rot_type == 2 .or. rot_type == 3 .or. rot_type == 4) .and. jpawu > tol10) then
762 : ! ---------------------------
763 :
764 0 : ABI_MALLOC(veeylm,(ndim,ndim,ndim,ndim))
765 0 : if (rot_type == 2) then
766 0 : veeylm2 => vee_rotated(iatom)%mat(:,:,:,:)
767 : else
768 0 : ABI_MALLOC(veeylm2,(tndim,tndim,tndim,tndim))
769 : end if
770 : ! Change basis from slm to ylm basis
771 : !if (triqs) then
772 0 : veeslm => hu(itypat)%vee(:,:,:,:)
773 : !else
774 : ! ABI_MALLOC(veeslm,(ndim,ndim,ndim,ndim))
775 : ! veeslm(:,:,:,:) = cmplx(real(hu(itypat)%vee(:,:,:,:)),zero,kind=sp)
776 : !end if
777 :
778 0 : call vee_slm2ylm_hu(lpawu,veeslm(:,:,:,:),veeylm(:,:,:,:),paw_dmft,1,2)
779 :
780 : !if (.not. triqs) then
781 : ! ABI_FREE(veeslm)
782 : !end if
783 :
784 0 : veeslm => null()
785 :
786 : ! The line below is not really useful
787 : !if (.not. triqs) veeylm(:,:,:,:) = cmplx(dble(veeylm(:,:,:,:)),zero,kind=dp)
788 :
789 0 : basis_vee = 'Ylm'
790 0 : if (.not. paw_dmft%dmft_solv .eq. 10) then
791 : ! Print interaction matrix in the ylm basis
792 0 : call printvee_hu(ndim,veeylm(:,:,:,:),prtopt,basis_vee,hu(itypat)%upawu)
793 :
794 : ! Print interaction matrix in the ylm basis from Slater tables
795 0 : if (pawprtvol >= 4) then
796 0 : call udens_slatercondon_hu(hu(itypat)%fk(:),lpawu)
797 : end if
798 : end if
799 :
800 : ! Build large matrix
801 0 : call vee_ndim2tndim_hu(lpawu,veeylm(:,:,:,:),veeylm2(:,:,:,:))
802 :
803 0 : if(.not. paw_dmft%dmft_solv .eq. 10) then
804 0 : if (rot_type == 3 .or. rot_type == 4) then
805 0 : call printvee_hu(tndim,veeylm2(:,:,:,:),prtopt,basis_vee)
806 : end if
807 : endif
808 :
809 : ! ---------------------------
810 : !
811 : ! In the JmJ basis
812 : ! ================================================================================
813 0 : if (rot_type == 3) then
814 :
815 : ! apply change of basis
816 0 : call vee_ylm2jmj_hu(lpawu,veeylm2(:,:,:,:),vee_rotated(iatom)%mat(:,:,:,:),1,paw_dmft)
817 :
818 : ! print interaction matrix in the JMJ basis from Inglis and Julien tables
819 0 : if (pawprtvol >= 3) then
820 0 : call udens_inglis_hu(hu(itypat)%fk(:),lpawu)
821 : end if
822 :
823 : ! new dimension
824 :
825 0 : basis_vee = "JmJ"
826 :
827 0 : else if (rot_type == 4) then
828 :
829 : !veerotated=czero
830 :
831 : !do m1=1,tndim
832 : ! do m2=1,tndim
833 : ! do m3=1,tndim
834 : ! do m4=1,tndim
835 : ! do mi=1,tndim
836 : ! do mj=1,tndim
837 : ! do mk=1,tndim
838 : ! do ml=1,tndim
839 : ! veerotated(m1,m2,m3,m4)= veerotated(m1,m2,m3,m4) +
840 : ! &
841 : !& conjg(rot_mat(iatom,1)%value(mi,m1))* &
842 : !& conjg(rot_mat(iatom,1)%value(mj,m2))* &
843 : !& rot_mat(iatom,1)%value(mk,m3)* &
844 : !& rot_mat(iatom,1)%value(ml,m4)* &
845 : !& veeylm2(mi,mj,mk,ml)
846 : ! enddo
847 : ! enddo
848 : ! enddo
849 : ! enddo
850 : ! enddo
851 : ! enddo
852 : ! enddo
853 : !enddo
854 0 : if (.not. paw_dmft%dmft_solv .eq. 10) then
855 0 : call udens_inglis_hu(hu(itypat)%fk(:),lpawu)
856 : endif
857 0 : call rotate_hu(rot_mat(iatom)%mat(:,:,:),1,tndim,veeylm2(:,:,:,:),vee_rotated(iatom)%mat(:,:,:,:))
858 0 : basis_vee = 'CTQMC basis from Ylm'
859 :
860 : end if ! rot_type
861 :
862 : end if ! rot_type
863 :
864 2 : if (rot_type == 0 .or. (jpawu <= tol10)) then
865 82742 : vee_rotated(iatom)%mat(:,:,:,:) = hu(itypat)%veeslm2(:,:,:,:)
866 422 : udens_atoms(iatom)%mat(:,:,1) = hu(itypat)%udens(:,:)
867 : end if ! rot_type
868 :
869 2 : ABI_SFREE(veeylm)
870 2 : if (rot_type >= 3 .and. jpawu > tol10) then
871 0 : ABI_FREE(veeylm2)
872 : end if
873 2 : veeylm2 => null()
874 :
875 2 : f2 = zero
876 2 : if (lpawu /= 0) f2 = hu(itypat)%fk(1)
877 :
878 2 : if (.not. paw_dmft%dmft_solv .eq. 10) then
879 2 : call printvee_hu(tndim,vee_rotated(iatom)%mat(:,:,:,:),prtopt,basis_vee,hu(itypat)%upawu,f2)
880 : ! call printvee_hu(dim_vee,real(veeylm),1,hu(itypat)%upawu)
881 : endif
882 :
883 : !uaver=zero
884 2 : if (rot_type /= 0 .and. jpawu > tol10) then
885 : ! Careful, since vee now has spin off-diagonal elements, this is wrong to
886 : ! use vee2udensatom_hu in order to compute udens
887 0 : do ms1=1,tndim
888 0 : do ms=1,tndim
889 0 : udens_atoms(iatom)%mat(ms,ms1,1) = vee_rotated(iatom)%mat(ms,ms1,ms,ms1) - vee_rotated(iatom)%mat(ms,ms1,ms1,ms)
890 : !uaver=uaver+udens_atoms(iatom)%value(ms,ms1)
891 : end do ! ms
892 : end do ! ms1
893 : end if ! rot_type /= 0 and jpawu /= zero
894 :
895 4 : if (paw_dmft%dmft_solv .eq. 10) then
896 0 : call vee2udensatom_hu(ndim,udens_atoms(iatom)%mat(:,:,1),vee_rotated(iatom)%mat(:,:,:,:),"CTQMC",prtonly=2)
897 :
898 : !xsum=0
899 : !xsum2=0
900 : !do m1=1,ndim
901 : ! do m2=1,ndim
902 : ! xsum = xsum + aimag(vee_rotated(iatom)%mat(m1,m2,m1,m2))
903 : ! xsum2 = xsum2 + aimag(udens_atoms(iatom)%mat(m1,m2,1))
904 : ! end do ! m2
905 : !end do ! m1
906 :
907 : !write(*,*)"Sum of Imag part of Rotated Interaction Vee",xsum
908 : !write(message,'(5a)') " == Sum of Imag part of Rotated Interaction Udens",xsum2
909 : !call wrtout(std_out,message,'COLL')
910 :
911 : else
912 2 : call vee2udensatom_hu(ndim,udens_atoms(iatom)%mat(:,:,1),vee_rotated(iatom)%mat(:,:,:,:),basis_vee,prtonly=1)
913 : endif
914 :
915 : end do ! iatom
916 : !ABI_ERROR("Aborting now!")
917 :
918 : !================================================
919 : ! NSPINOR = 1
920 : !================================================
921 :
922 81 : else if (nspinor == 1) then
923 :
924 81 : nat_correl = 0
925 395 : do iatom=1,natom
926 314 : lpawu = paw_dmft%lpawu(iatom)
927 314 : if (lpawu == -1) cycle
928 105 : itypat = paw_dmft%typat(iatom)
929 105 : jpawu = hu(itypat)%jpawu
930 105 : nat_correl = nat_correl + 1
931 105 : if (nat_correl > 1 .and. (hu(itypat)%jpawu > tol4)) then
932 0 : write(message,'(3a)') ch10,' -------> Warning: several atoms: ',' not extensively tested '
933 0 : ABI_WARNING(message)
934 : end if
935 :
936 105 : write(tag_at,'(i4)') iatom
937 105 : write(message,'(3a)') ch10,' -------> For Correlated atom ',adjustl(tag_at)
938 105 : call wrtout(std_out,message,'COLL')
939 :
940 : ! ! ================================================================
941 : ! ! If rotation for spin 2 and rotation for spin 1 are not equal
942 : ! ! then print a warning
943 : ! ! useful only for magnetic case
944 : ! ! ================================================================
945 105 : ndim = 2*lpawu + 1
946 105 : tndim = nspinor * ndim
947 105 : nflavor = 2 * ndim
948 105 : if (nsppol == 2 .and. pawprtvol >= 3 .and. (.not. triqs)) then
949 0 : do m2=1,tndim
950 0 : do m1=1,tndim
951 0 : if (abs(rot_mat(iatom)%mat(m1,m2,1)-rot_mat(iatom)%mat(m1,m2,2)) > tol4) then
952 0 : write(message,'(2a,i4)') ch10,' rot_mat differs for value of isppol but value for isppol=2 not used'
953 0 : call wrtout(std_out,message,'COLL')
954 0 : write(message,'(a,4e16.8)') ch10,rot_mat(iatom)%mat(m1,m2,1),rot_mat(iatom)%mat(m1,m2,2)
955 0 : call wrtout(std_out,message,'COLL',do_flush=.True.)
956 : end if
957 : end do ! m1
958 : end do ! m2
959 : end if ! nsppol=2 and pawprtvol>=3
960 :
961 : ! ! =================================================
962 : ! ! See if rotation is complex or real
963 : ! ! =================================================
964 105 : if (pawprtvol >= 3 .and. (.not. triqs)) then
965 272 : do m1=1,ndim
966 1318 : do mi=1,ndim
967 1264 : if (abs(aimag(rot_mat(iatom)%mat(mi,m1,1))) > tol8) then
968 163 : write(message,'(2a,2i6,2e14.3)') ch10,"rot_mat is complex for", &
969 326 : & mi,m1,rot_mat(iatom)%mat(mi,m1,1)
970 163 : call wrtout(std_out,message,'COLL')
971 : end if
972 : end do ! mi
973 : end do ! m1
974 : end if ! pawprtvol
975 :
976 : ! write vee for information with a classification.
977 105 : if (pawprtvol >= 3) then
978 54 : call printvee_hu(ndim,hu(itypat)%vee(:,:,:,:),2,'cubic')
979 : end if
980 :
981 105 : basis_vee = 'cubic'
982 105 : prtonly = 1
983 105 : if (jpawu > tol10 .and. rot_type /= 0) then
984 :
985 : ! ! Compute rotated vee.
986 : !veetemp=zero
987 : !do m1=1,ndim
988 : ! do m2=1,ndim
989 : ! do m3=1,ndim
990 : ! do m4=1,ndim
991 : ! do mi=1,ndim
992 : ! do mj=1,ndim
993 : ! do mk=1,ndim
994 : ! do ml=1,ndim
995 : ! ! if((mi==mk.and.mj==ml).or.(mi==ml.and.mj==mk)) then
996 : ! veetemp(m1,m2,m3,m4)= veetemp(m1,m2,m3,m4) + &
997 : !& real( &
998 : !& conjg(rot_mat(iatom,1)%value(mi,m1))* &
999 : !& conjg(rot_mat(iatom,1)%value(mj,m2))* &
1000 : !& rot_mat(iatom,1)%value(mk,m3)* &
1001 : !& rot_mat(iatom,1)%value(ml,m4)* &
1002 : !& hu(itypat)%vee(mi,mj,mk,ml)&
1003 : ! )
1004 : ! endif
1005 : ! enddo
1006 : ! enddo
1007 : ! enddo
1008 : ! enddo
1009 : ! enddo
1010 : ! enddo
1011 : ! enddo
1012 : ! enddo
1013 :
1014 40 : nsppol_ = 1
1015 40 : prtonly = 0
1016 :
1017 : ! Use different rotation matrices for each spin with TRIQS
1018 40 : if (triqs .and. rot_type /= 2) nsppol_ = nsppol
1019 :
1020 40 : if (rot_type == 2 .or. rot_type == 4) then
1021 0 : basis_vee = 'Ylm'
1022 0 : ABI_MALLOC(veeylm,(ndim,ndim,ndim,ndim))
1023 0 : call vee_slm2ylm_hu(lpawu,hu(itypat)%vee(:,:,:,:),veeylm(:,:,:,:),paw_dmft,1,2)
1024 0 : if (rot_type == 2 .or. nsppol_ == 2) then
1025 0 : if (rot_type == 2) then
1026 0 : veeylm2 => vee_rotated(iatom)%mat(:,:,:,:)
1027 0 : else if (nsppol_ == 2) then
1028 0 : ABI_MALLOC(veeylm2,(nflavor,nflavor,nflavor,nflavor))
1029 : end if
1030 0 : call vee_ndim2tndim_hu(lpawu,veeylm(:,:,:,:),veeylm2(:,:,:,:))
1031 : end if ! rot_type
1032 0 : veetemp3 => veeylm(:,:,:,:)
1033 : end if ! rot_type=2 or 4
1034 :
1035 40 : if (rot_type == 1 .or. rot_type == 4) then
1036 40 : basis_vee = 'CTQMC basis from cubic'
1037 40 : if (rot_type == 4) basis_vee = 'CTQMC basis from Ylm'
1038 40 : if (nsppol_ == 2) then
1039 0 : if (rot_type == 1) then
1040 0 : veetemp => hu(itypat)%veeslm2(:,:,:,:)
1041 : else
1042 0 : veetemp => veeylm2
1043 : end if ! rot_type
1044 0 : veetemp2 => vee_rotated(iatom)%mat(:,:,:,:)
1045 : else
1046 40 : if (rot_type == 1) then
1047 40 : veetemp => hu(itypat)%vee(:,:,:,:)
1048 : else
1049 0 : veetemp => veeylm(:,:,:,:)
1050 : end if ! rot_type
1051 240 : ABI_MALLOC(veetemp2,(ndim,ndim,ndim,ndim))
1052 : end if ! nsppol_
1053 40 : call rotate_hu(rot_mat(iatom)%mat(:,:,:),nsppol_,ndim,veetemp(:,:,:,:),veetemp2(:,:,:,:))
1054 4840 : if (.not. triqs) veetemp2(:,:,:,:) = cmplx(dble(veetemp2(:,:,:,:)),zero,kind=dp) ! neglect imaginary part in Abinit
1055 40 : if (nsppol_ == 1) then
1056 40 : call vee_ndim2tndim_hu(lpawu,veetemp2(:,:,:,:),vee_rotated(iatom)%mat(:,:,:,:))
1057 40 : veetemp3 => veetemp2(:,:,:,:)
1058 : end if
1059 : end if ! rot_type=1 or 4
1060 :
1061 40 : if (nsppol_ == 2) then
1062 0 : prtonly = 1
1063 : ! It is wrong to use vee2udensatom_hu to build udens_atoms here
1064 0 : do m=1,nflavor
1065 0 : do m1=1,nflavor
1066 0 : udens_atoms(iatom)%mat(m,m1,1) = vee_rotated(iatom)%mat(m,m1,m,m1) - vee_rotated(iatom)%mat(m,m1,m1,m)
1067 : end do ! m1
1068 : end do ! m
1069 : end if ! nsppol_=2
1070 : else
1071 : prtonly = 1
1072 8815 : udens_atoms(iatom)%mat(:,:,1) = hu(itypat)%udens(:,:)
1073 1206375 : vee_rotated(iatom)%mat(:,:,:,:) = hu(itypat)%veeslm2(:,:,:,:)
1074 : end if ! jpawu=zero
1075 :
1076 105 : xsum = zero
1077 105 : xsum2 = zero
1078 105 : xsumnew = zero
1079 105 : xsum2new = zero
1080 582 : do m1=1,ndim
1081 2951 : do m2=1,ndim
1082 2369 : xsum = xsum + dble(hu(itypat)%vee(m1,m2,m1,m2))
1083 2369 : xsum2 = xsum2 + dble(hu(itypat)%vee(m1,m2,m2,m1))
1084 2369 : xsumnew = xsumnew + dble(vee_rotated(iatom)%mat(m1,m2,m1,m2))
1085 2846 : xsum2new = xsum2new + dble(vee_rotated(iatom)%mat(m1,m2,m2,m1))
1086 : end do ! m2
1087 : end do ! m1
1088 105 : if (abs(xsum-xsumnew) > tol5 .or. abs(xsum2-xsum2new) > tol5) then
1089 0 : write(message,'(2a)') ch10," BUG: New interaction after rotation do not respect sum rules"
1090 0 : call wrtout(std_out,message,'COLL')
1091 0 : write(message,'(2a,2f14.3)') ch10,' Comparison of \sum_{m1,m3} vee(m1,m3,m1,m3) before and after rotation is',&
1092 0 : & xsum,xsumnew
1093 0 : call wrtout(std_out,message,'COLL')
1094 0 : write(message,'(2a,2f14.3)') ch10,' Comparison of \sum_{m1,m3} vee(m1,m3,m3,m1) before and after rotation is',&
1095 0 : & xsum2,xsum2new
1096 0 : call wrtout(std_out,message,'COLL')
1097 : end if ! abs(xsum-xsumnew)>tol5
1098 105 : if (pawprtvol >= 3) then
1099 54 : write(message,'(2a)') ch10," VEE ROTATED"
1100 54 : call wrtout(std_out,message,'COLL')
1101 54 : call printvee_hu(2*ndim,vee_rotated(iatom)%mat(:,:,:,:),2,'CTQMC')
1102 54 : write(message,'(a)') ch10
1103 54 : call wrtout(std_out,message,'COLL')
1104 : end if ! pawprtvol>=3
1105 :
1106 105 : call vee2udensatom_hu(ndim,udens_atoms(iatom)%mat(:,:,1),veetemp3(:,:,:,:),basis_vee,prtonly=prtonly)
1107 :
1108 105 : veetemp => null()
1109 105 : veetemp3 => null()
1110 :
1111 105 : ABI_SFREE(veeylm)
1112 :
1113 105 : if (jpawu > tol10 .and. rot_type /= 0) then
1114 40 : if (rot_type == 4 .and. nsppol_ == 2) then
1115 0 : ABI_FREE(veeylm2)
1116 : end if
1117 40 : if (rot_type /= 2 .and. nsppol_ == 1) then
1118 40 : ABI_FREE(veetemp2)
1119 : end if
1120 : end if ! jpawu>tol10 and rot_type/=0
1121 :
1122 105 : veetemp2 => null()
1123 395 : veeylm2 => null()
1124 :
1125 : ! udens_atoms(iatom)%value=zero
1126 : ! ij=0
1127 : ! do ms=1,2*ndim-1
1128 : ! do ms1=ms+1,2*ndim
1129 : ! ij=ij+1
1130 : ! if(ms<=ndim.and.ms1>ndim) then
1131 : ! m1 = ms1 - ndim
1132 : ! m = ms
1133 : ! hu(itypat)%uqmc(ij)=veetemp(m,m1,m,m1)
1134 : ! udens_atoms(iatom)%value(ms,ms1)= veetemp(m,m1,m,m1)
1135 : ! udens_atoms(iatom)%value(ms1,ms)= udens_atoms(iatom)%value(ms,ms1)
1136 : ! else if(ms<=ndim.and.ms1<=ndim) then
1137 : ! m1 = ms1
1138 : ! m = ms
1139 : ! hu(itypat)%uqmc(ij)=veetemp(m,m1,m,m1)-veetemp(m,m1,m1,m)
1140 : ! udens_atoms(iatom)%value(ms,ms1)= hu(itypat)%uqmc(ij)
1141 : ! udens_atoms(iatom)%value(ms1,ms)= udens_atoms(iatom)%value(ms,ms1)
1142 : ! else
1143 : ! m1 = ms1 - ndim
1144 : ! m = ms - ndim
1145 : ! hu(itypat)%uqmc(ij)=veetemp(m,m1,m,m1)-veetemp(m,m1,m1,m)
1146 : ! udens_atoms(iatom)%value(ms,ms1)= hu(itypat)%uqmc(ij)
1147 : ! udens_atoms(iatom)%value(ms1,ms)= udens_atoms(iatom)%value(ms,ms1)
1148 : ! endif
1149 : ! enddo
1150 : ! enddo
1151 : ! write(message,'(a,5x,a)') ch10,"-------- Interactions in the density matrix representation "
1152 : ! call wrtout(std_out, message,'COLL')
1153 : ! write(message,'(1x,14(2x,i5))') (m,m=1,2*ndim)
1154 : ! call wrtout(std_out, message,'COLL')
1155 : ! do ms=1,2*ndim
1156 : ! write(message,'(i3,14f7.3)') &
1157 : ! & ms, (udens_atoms(iatom)%value(ms,ms1),ms1=1,2*ndim)
1158 : ! call wrtout(std_out, message,'COLL')
1159 : ! enddo
1160 : ! write(message,'(5x,a)') "--------------------------------------------------------"
1161 : ! call wrtout(std_out, message,'COLL')
1162 : !ABI_FREE(veetemp)
1163 : ! endif ! lpawu/=1
1164 : ! call print_hu(hu,cryst_struc%ntypat,1)
1165 :
1166 : end do ! iatom
1167 : ! call print_hu(hu,cryst_struc%ntypat,1)
1168 : ! call vee2udens_hu(hu,cryst_struc%ntypat,2)
1169 : end if ! nspinor
1170 :
1171 83 : end subroutine rotatevee_hu
1172 : !!***
1173 :
1174 : !!****f* m_hu/rotate_hu
1175 : !! NAME
1176 : !! rotate_hu
1177 : !!
1178 : !! FUNCTION
1179 : !! Rotate an interaction tensor
1180 : !!
1181 : !! INPUTS
1182 : !! rot_mat = rotation matrix
1183 : !! tndim = dimension of tensor
1184 : !! vee = input tensor
1185 : !!
1186 : !! OUTPUT
1187 : !! vee_rotated = rotated tensor
1188 : !!
1189 : !! SOURCE
1190 :
1191 40 : subroutine rotate_hu(rot_mat,nsppol,tndim,vee,vee_rotated)
1192 :
1193 : !Arguments ------------------------------------
1194 : integer, intent(in) :: nsppol,tndim
1195 : complex(dp), intent(in) :: rot_mat(tndim,tndim,nsppol)
1196 : complex(dp), intent(in) :: vee(tndim*nsppol,tndim*nsppol,tndim*nsppol,tndim*nsppol)
1197 : complex(dp), intent(inout) :: vee_rotated(tndim*nsppol,tndim*nsppol,tndim*nsppol,tndim*nsppol)
1198 : !Local variables-------------------------------
1199 : integer :: is1,is2,loop,m1,m2,ms1,ms2
1200 40 : complex(dp), allocatable :: mat_tmp(:,:),vee_tmp(:,:)
1201 : ! *********************************************************************
1202 :
1203 160 : ABI_MALLOC(mat_tmp,(tndim,tndim))
1204 120 : ABI_MALLOC(vee_tmp,(tndim,tndim))
1205 :
1206 120 : do loop=1,2
1207 200 : do is2=1,nsppol
1208 400 : do m2=1,tndim
1209 240 : ms2 = m2 + (is2-1)*tndim
1210 1040 : do m1=1,tndim
1211 720 : ms1 = m1 + (is2-1)*tndim
1212 1680 : do is1=1,nsppol
1213 :
1214 : ! Make copy here to prevent creation of temporary when calling zgemm
1215 720 : if (loop == 1) then
1216 4680 : vee_tmp(:,:) = vee(1+(is1-1)*tndim:is1*tndim,ms1,1+(is1-1)*tndim:is1*tndim,ms2)
1217 : else
1218 4680 : vee_tmp(:,:) = vee_rotated(ms1,1+(is1-1)*tndim:is1*tndim,ms2,1+(is1-1)*tndim:is1*tndim)
1219 : end if ! loop
1220 :
1221 : call abi_xgemm("c","n",tndim,tndim,tndim,cone,rot_mat(:,:,is1),tndim, &
1222 720 : & vee_tmp(:,:),tndim,czero,mat_tmp(:,:),tndim)
1223 : call abi_xgemm("n","n",tndim,tndim,tndim,cone,mat_tmp(:,:),tndim, &
1224 720 : & rot_mat(:,:,is1),tndim,czero,vee_tmp(:,:),tndim)
1225 :
1226 1440 : if (loop == 1) then
1227 4680 : vee_rotated(1+(is1-1)*tndim:is1*tndim,ms1,1+(is1-1)*tndim:is1*tndim,ms2) = vee_tmp(:,:)
1228 : else
1229 4680 : vee_rotated(ms1,1+(is1-1)*tndim:is1*tndim,ms2,1+(is1-1)*tndim:is1*tndim) = vee_tmp(:,:)
1230 : end if ! loop
1231 :
1232 : end do ! is1
1233 : end do ! m1
1234 : end do ! ms2
1235 : end do ! is2
1236 : end do ! loop
1237 :
1238 40 : ABI_FREE(mat_tmp)
1239 40 : ABI_FREE(vee_tmp)
1240 :
1241 40 : end subroutine rotate_hu
1242 : !!***
1243 :
1244 : !!****f* m_hu/printvee_hu
1245 : !! NAME
1246 : !! printvee_hu
1247 : !!
1248 : !! FUNCTION
1249 : !! Print vee
1250 : !!
1251 : !! INPUTS
1252 : !! vee = tensor for Coulomb interactions
1253 : !!
1254 : !! OUTPUT
1255 : !!
1256 : !! SOURCE
1257 :
1258 112 : subroutine printvee_hu(ndim,vee,prtopt,basis,upawu,f2)
1259 :
1260 : !Arguments ------------------------------------
1261 : !type
1262 : integer, intent(in) :: ndim,prtopt
1263 : complex(dp), intent(in) :: vee(ndim,ndim,ndim,ndim)
1264 : real(dp), optional, intent(in) :: f2,upawu
1265 : character(len=*), intent(in) :: basis
1266 : !Local variables-------------------------------
1267 : integer :: abcomp,m1,m2,mi,mj,mk,ml
1268 112 : real(dp), allocatable :: a2pp(:,:),b0(:,:),b2pp(:,:)
1269 : character(len=2000) :: message
1270 : ! *********************************************************************
1271 :
1272 112 : write(message,'(5a)') ch10,&
1273 224 : & ' Coulomb interaction in the ',trim(basis),' basis'
1274 112 : call wrtout(std_out,message,'COLL')
1275 :
1276 112 : if (prtopt .eq. 2) then
1277 :
1278 108 : write(message,'(2a)') ch10," <mi,mi|vee|mi mi> : U1"
1279 108 : call wrtout(std_out,message,'COLL')
1280 762 : do mi=1,ndim
1281 654 : write(message,'(4i4,3x,e10.3)') mi,mi,mi,mi,dble(vee(mi,mi,mi,mi))
1282 762 : call wrtout(std_out,message,'COLL')
1283 : end do ! mi
1284 :
1285 108 : write(message,'(2a)') ch10," <mi,mj|vee|mi mj> : U2"
1286 108 : call wrtout(std_out,message,'COLL')
1287 762 : do mi=1,ndim
1288 3050 : do mj=mi+1,ndim
1289 2288 : write(message,'(4i4,3x,e10.3)') mi,mj,mi,mj,dble(vee(mi,mj,mi,mj))
1290 2942 : call wrtout(std_out,message,'COLL')
1291 : end do ! mj
1292 : end do ! mi
1293 :
1294 108 : write(message,'(2a)') ch10," <mi,mj|vee|mj mi> : J"
1295 108 : call wrtout(std_out,message,'COLL')
1296 762 : do mi=1,ndim
1297 3050 : do mj=mi+1,ndim
1298 2288 : write(message,'(4i4,3x,e10.3)') mi,mj,mj,mi,dble(vee(mi,mj,mj,mi))
1299 2942 : call wrtout(std_out,message,'COLL')
1300 : end do ! mj
1301 : end do ! mi
1302 :
1303 108 : write(message,'(2a)') ch10," <mi,mi|vee|mj mj> : J"
1304 108 : call wrtout(std_out,message,'COLL')
1305 762 : do mi=1,ndim
1306 3050 : do mj=mi+1,ndim
1307 2288 : write(message,'(4i4,3x,e10.3)') mi,mi,mj,mj,dble(vee(mi,mi,mj,mj))
1308 2942 : call wrtout(std_out,message,'COLL')
1309 : end do ! mj
1310 : end do ! mi
1311 :
1312 108 : write(message,'(2a)') ch10," vee is non zero also for"
1313 108 : call wrtout(std_out,message,'COLL')
1314 762 : do mi=1,ndim
1315 5992 : do mj=1,ndim
1316 58822 : do mk=1,ndim
1317 684686 : do ml=1,ndim
1318 626518 : if ((.not. (mi == mk .and. mj == ml)) .and. (.not. (mi == ml .and. mj == mk)) .and.&
1319 52938 : & .not. (mi == mj .and. mk == ml)) then
1320 612136 : if (dble(vee(mi,mj,mk,ml)) > tol8) then
1321 960 : write(message,'(4i4,3x,e10.3)') mi,mj,mk,ml,dble(vee(mi,mj,mk,ml))
1322 960 : call wrtout(std_out,message,'COLL')
1323 : end if
1324 : end if
1325 : end do ! ml
1326 : end do ! mk
1327 : end do ! mj
1328 : end do ! mi
1329 108 : write(message,'(a)') ch10
1330 108 : call wrtout(std_out,message,'COLL')
1331 :
1332 : end if ! prtopt>=2
1333 :
1334 112 : if (prtopt .eq. 1) then
1335 :
1336 4 : write(message,'(2x,a,3x,14f10.4)') "Um1m2=Vee(m1,m2,m1,m2)"
1337 4 : call wrtout(std_out,message,'COLL')
1338 60 : write(message,'(2x,4x,14(2x,i8))') (m1,m1=1,ndim)
1339 4 : call wrtout(std_out,message,'COLL')
1340 60 : do m1=1,ndim
1341 840 : write(message,'(2x,i4,3x,14f10.4)') m1,(dble(vee(m1,m2,m1,m2)),m2=1,ndim)
1342 60 : call wrtout(std_out,message,'COLL')
1343 : end do ! m1
1344 4 : write(message,'(a)') ch10
1345 4 : call wrtout(std_out,message,'COLL')
1346 :
1347 4 : write(message,'(2x,a,3x,14f10.4)') "Jm1m2=Vee(m1,m2,m2,m1)"
1348 4 : call wrtout(std_out,message,'COLL')
1349 60 : write(message,'(2x,4x,14(2x,i8))') (m1,m1=1,ndim)
1350 4 : call wrtout(std_out,message,'COLL')
1351 60 : do m1=1,ndim
1352 840 : write(message,'(2x,i4,3x,14f10.4)') m1,(dble(vee(m1,m2,m2,m1)),m2=1,ndim)
1353 60 : call wrtout(std_out,message,'COLL')
1354 : end do ! m1
1355 4 : write(message,'(a)') ch10
1356 4 : call wrtout(std_out,message,'COLL')
1357 :
1358 4 : write(message,'(2x,a,3x,14f10.4)') "Udens(m1,m2)"
1359 4 : call wrtout(std_out,message,'COLL')
1360 60 : write(message,'(2x,4x,14(2x,i8))') (m1,m1=1,ndim)
1361 4 : call wrtout(std_out,message,'COLL')
1362 60 : do m1=1,ndim
1363 840 : write(message,'(2x,i4,3x,14f10.4)') m1,(dble(vee(m1,m2,m1,m2)-vee(m1,m2,m2,m1)),m2=1,ndim)
1364 60 : call wrtout(std_out,message,'COLL')
1365 : end do ! m1
1366 4 : write(message,'(a)') ch10
1367 4 : call wrtout(std_out,message,'COLL')
1368 :
1369 : !if (prtopt >= 3) then
1370 : ! if(ndim==7) then
1371 : ! averu=zero
1372 : ! do m1=1,7
1373 : ! do m2=1,7
1374 : ! averu=vee(m1,m2,m1,m2)+averu
1375 : ! enddo
1376 : ! enddo
1377 : ! averu=averu/49.d0
1378 : ! averurestricted=zero
1379 : ! do m1=1,7
1380 : ! do m2=1,7
1381 : ! if(m1/=m2) averurestricted=vee(m1,m2,m1,m2)+averurestricted
1382 : ! enddo
1383 : ! enddo
1384 : ! averurestricted=averurestricted/42.d0
1385 : ! averj=zero
1386 : ! do m1=1,7
1387 : ! do m2=1,7
1388 : ! if(m1/=m2) averj=vee(m1,m2,m2,m1)+averj
1389 : ! enddo
1390 : ! enddo
1391 : ! averj=averj/42
1392 : ! averall=zero
1393 : ! do m1=1,7
1394 : ! do m2=1,7
1395 : ! if(m1/=m2) averall=vee(m1,m2,m1,m2)-vee(m1,m2,m2,m1)+averall
1396 : ! enddo
1397 : ! enddo
1398 : ! averall=averall/42
1399 : !write(6,*) "averages Ylm U, U restricted,J, U-J",averu,averurestricted,averj,averall
1400 :
1401 : ! endif
1402 :
1403 : ! if(ndim==14.and.trim(basis)=='jmj') then
1404 : ! aver52=zero
1405 : ! do m1=1,6
1406 : ! do m2=1,6
1407 : ! aver52=vee(m1,m2,m1,m2)+aver52
1408 : ! enddo
1409 : ! enddo
1410 : ! aver52=aver52/36.d0
1411 : ! aver72=zero
1412 : ! do m1=7,14
1413 : ! do m2=7,14
1414 : ! aver72=vee(m1,m2,m1,m2)+aver72
1415 : ! enddo
1416 : ! enddo
1417 : ! aver72=aver72/64.d0
1418 : ! avernondiag=zero
1419 : ! do m1=1,6
1420 : ! do m2=7,14
1421 : ! avernondiag=vee(m1,m2,m1,m2)+avernondiag
1422 : ! enddo
1423 : ! enddo
1424 : ! avernondiag=avernondiag/48.d0
1425 : ! averall=zero
1426 : ! do m1=1,14
1427 : ! do m2=1,14
1428 : ! averall=vee(m1,m2,m1,m2)+averall
1429 : ! enddo
1430 : ! enddo
1431 : ! averall=averall/196.d0
1432 : !write(6,*) "U averages",aver52,aver72,avernondiag,averall
1433 :
1434 :
1435 :
1436 : ! aver52=zero
1437 : ! do m1=1,6
1438 : ! do m2=1,6
1439 : ! if(m1/=m2) aver52=vee(m1,m2,m2,m1)+aver52
1440 : ! enddo
1441 : ! enddo
1442 : ! aver52=aver52/30.d0
1443 : ! aver72=zero
1444 : ! do m1=7,14
1445 : ! do m2=7,14
1446 : ! if(m1/=m2) aver72=vee(m1,m2,m2,m1)+aver72
1447 : ! enddo
1448 : ! enddo
1449 : ! aver72=aver72/56.d0
1450 : ! avernondiag=zero
1451 : ! do m1=1,6
1452 : ! do m2=7,14
1453 : ! avernondiag=vee(m1,m2,m2,m1)+avernondiag
1454 : ! enddo
1455 : ! enddo
1456 : ! avernondiag=avernondiag/48.d0
1457 : ! averall=zero
1458 : ! do m1=1,14
1459 : ! do m2=1,14
1460 : ! if(m1/=m2) averall=vee(m1,m2,m2,m1)+averall
1461 : ! enddo
1462 : ! enddo
1463 : ! averall=averall/182.d0
1464 : !write(6,*) "J averages",aver52,aver72,avernondiag,averall
1465 :
1466 :
1467 :
1468 :
1469 : ! aver52=zero
1470 : ! do m1=1,6
1471 : ! do m2=1,6
1472 : ! if(m1/=m2) aver52=vee(m1,m2,m1,m2)-vee(m1,m2,m2,m1)+aver52
1473 : ! enddo
1474 : ! enddo
1475 : ! aver52=aver52/30.d0
1476 : ! aver72=zero
1477 : ! do m1=7,14
1478 : ! do m2=7,14
1479 : ! if(m1/=m2) aver72=vee(m1,m2,m1,m2)-vee(m1,m2,m2,m1)+aver72
1480 : ! enddo
1481 : ! enddo
1482 : ! aver72=aver72/56.d0
1483 : ! avernondiag=zero
1484 : ! do m1=1,6
1485 : ! do m2=7,14
1486 : ! avernondiag=vee(m1,m2,m1,m2)-vee(m1,m2,m2,m1)+avernondiag
1487 : ! enddo
1488 : ! enddo
1489 : ! avernondiag=avernondiag/48.d0
1490 : ! averall=zero
1491 : ! do m1=1,14
1492 : ! do m2=1,14
1493 : ! if(m1/=m2) averall=vee(m1,m2,m1,m2)-vee(m1,m2,m2,m1)+averall
1494 : ! enddo
1495 : ! enddo
1496 : ! averall=averall/182.d0
1497 : !write(6,*) "U-J averages",aver52,aver72,avernondiag,averall
1498 :
1499 : ! endif
1500 : !endif
1501 :
1502 4 : if (present(upawu)) then
1503 :
1504 8 : ABI_MALLOC(a2pp,(ndim,ndim))
1505 6 : ABI_MALLOC(b2pp,(ndim,ndim))
1506 6 : ABI_MALLOC(b0,(ndim,ndim))
1507 :
1508 : ! write(message,'(2x,a,3x,14f10.4)') "For check with respect to Slater's paper"
1509 : ! call wrtout(std_out, message,'COLL')
1510 : ! ABI_MALLOC(f0,(ndim,ndim,ndim,ndim))
1511 : ! write(message,'(2x,a,3x,14f10.4)') "Vee(m1,m2,m1,m2)-F0*ao(m1,m2)"
1512 : ! call wrtout(std_out, message,'COLL')
1513 : ! write(message,'(2x,4x,14(2x,i8))') (m1,m1=1,ndim)
1514 : ! call wrtout(std_out, message,'COLL')
1515 : !
1516 : ! do m1=1,ndim
1517 : ! write(message,'(2x,i4,3x,14f10.4)') m1,(vee(m1,m2,m1,m2)-upawu,m2=1,ndim)
1518 : ! call wrtout(std_out, message,'COLL')
1519 : ! enddo
1520 : !
1521 : ! f0=zero
1522 : ! do m1=1,ndim
1523 : ! f0(m1,m1,m1,m1)=upawu
1524 : ! enddo
1525 : ! write(message,'(a)') ch10
1526 : ! call wrtout(std_out, message,'COLL')
1527 : ! write(message,'(2x,a,3x,14f10.4)') "Vee(m1,m2,m2,m1)-F0*b0(m1,m2)"
1528 : ! call wrtout(std_out, message,'COLL')
1529 : ! write(message,'(2x,4x,14(2x,i8))') (m1,m1=1,ndim)
1530 : ! call wrtout(std_out, message,'COLL')
1531 : ! do m1=1,ndim
1532 : ! write(message,'(2x,i4,3x,14f10.4)') m1,(vee(m1,m2,m2,m1)-f0(m1,m2,m2,m1),m2=1,ndim)
1533 : ! call wrtout(std_out, message,'COLL')
1534 : ! enddo
1535 : ! ABI_FREE(f0)
1536 :
1537 :
1538 422 : b0(:,:) = zero
1539 30 : do m1=1,ndim
1540 30 : b0(m1,m1) = upawu
1541 : end do
1542 2 : abcomp = 0
1543 2 : if (ndim == 3 .and. present(f2) .and. (trim(basis)=='slm')) then
1544 0 : a2pp(:,:) = RESHAPE((/1,-2,1,-2,4,-2,-1,-2,-1/),(/3,3/))
1545 0 : a2pp(:,:) = a2pp(:,:)/dble(25)*f2 + upawu
1546 0 : b2pp(:,:) = RESHAPE((/1,3,6,3,4,3,6,3,1/),(/3,3/))
1547 0 : b2pp(:,:) = b2pp(:,:)/dble(25)*f2 + b0(:,:)
1548 : abcomp = 1
1549 2 : else if (ndim == 6 .and. present(f2) .and. (trim(basis)=='jmj')) then
1550 0 : ABI_MALLOC(a2pp,(6,6))
1551 0 : ABI_MALLOC(b2pp,(6,6))
1552 : a2pp(:,:) = RESHAPE((/0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,-1,1,0,&
1553 0 : & 0,-1,1,1,-1,0,0,-1,1,1,-1,0,0,1,-1,-1,1/),(/6,6/))
1554 0 : a2pp(:,:) = a2pp(:,:)/dble(25)*f2 + upawu
1555 : b2pp(:,:) = RESHAPE((/0,0,1,2,3,4,0,0,4,3,2,1,1,4,1,2,2,0,2,3,&
1556 0 : & 2,1,0,2,3,2,2,0,1,2,4,1,0,2,2,1/),(/6,6/))
1557 0 : b2pp(:,:) = b2pp(:,:)/dble(25)*f2 + b0(:,:)
1558 : abcomp = 1
1559 : end if
1560 2 : if (mod(ndim,3) == 0 .and. present(f2) .and. abcomp == 1) then
1561 0 : write(message,'(2x,a)') "Exact result for Umm is"
1562 0 : call wrtout(std_out,message,'COLL')
1563 0 : do m1=1,ndim
1564 0 : write(message,'(2x,i4,3x,14f10.4)') m1,(a2pp(m1,m2),m2=1,ndim)
1565 0 : call wrtout(std_out,message,'COLL')
1566 : end do ! m1
1567 0 : write(message,'(a)') ch10
1568 0 : call wrtout(std_out,message,'COLL')
1569 0 : write(message,'(2x,a,3x,14f10.4)') "Exact result for Jmm is"
1570 0 : call wrtout(std_out,message,'COLL')
1571 0 : do m1=1,ndim
1572 0 : write(message,'(2x,i4,3x,14f10.4)') m1,(b2pp(m1,m2),m2=1,ndim)
1573 0 : call wrtout(std_out,message,'COLL')
1574 : end do ! m1
1575 0 : write(message,'(a)') ch10
1576 0 : call wrtout(std_out,message,'COLL')
1577 : end if
1578 2 : ABI_FREE(a2pp)
1579 2 : ABI_FREE(b2pp)
1580 2 : ABI_FREE(b0)
1581 : end if ! present(upawu)
1582 :
1583 : end if ! prtopt>=1
1584 :
1585 : if (prtopt .eq. 4 ) then
1586 : ! write(message,'(2x,a,3x,14f10.4)') "Real part of Um1m2=Vee(m1,m2,m1,m2)"
1587 : ! call wrtout(std_out,message,'COLL')
1588 : ! write(message,'(2x,4x,14(2x,i8))') (m1,m1=1,ndim)
1589 : ! call wrtout(std_out,message,'COLL')
1590 : ! do m1=1,ndim
1591 : ! write(message,'(2x,i4,3x,14f10.4)') m1,(dble(vee(m1,m2,m1,m2)),m2=1,ndim)
1592 : ! call wrtout(std_out,message,'COLL')
1593 : ! end do ! m1
1594 : ! write(message,'(a)') ch10
1595 : ! call wrtout(std_out,message,'COLL')
1596 :
1597 : !write(message,'(2x,a,3x,14f10.4)') "Imag part of Um1m2=Vee(m1,m2,m1,m2)"
1598 : !call wrtout(std_out,message,'COLL')
1599 : !write(message,'(2x,4x,14(2x,i8))') (m1,m1=1,ndim)
1600 : !call wrtout(std_out,message,'COLL')
1601 : !do m1=1,ndim
1602 : ! write(message,'(2x,i4,3x,14f10.6)') m1,(aimag(vee(m1,m2,m1,m2)),m2=1,ndim)
1603 : ! call wrtout(std_out,message,'COLL')
1604 : !end do ! m1
1605 : !write(message,'(a)') ch10
1606 : !call wrtout(std_out,message,'COLL')
1607 :
1608 : ! write(message,'(2x,a,3x,14f10.4)') "Real part of Jm1m2=Vee(m1,m2,m2,m1)"
1609 : ! call wrtout(std_out,message,'COLL')
1610 : ! write(message,'(2x,4x,14(2x,i8))') (m1,m1=1,ndim)
1611 : ! call wrtout(std_out,message,'COLL')
1612 : ! do m1=1,ndim
1613 : ! write(message,'(2x,i4,3x,14f10.4)') m1,(dble(vee(m1,m2,m2,m1)),m2=1,ndim)
1614 : ! call wrtout(std_out,message,'COLL')
1615 : ! end do ! m1
1616 : ! write(message,'(a)') ch10
1617 : ! call wrtout(std_out,message,'COLL')
1618 :
1619 : !write(message,'(2x,a,3x,14f10.4)') "Imag part of Jm1m2=Vee(m1,m2,m2,m1)"
1620 : !call wrtout(std_out,message,'COLL')
1621 : !write(message,'(2x,4x,14(2x,i8))') (m1,m1=1,ndim)
1622 : !call wrtout(std_out,message,'COLL')
1623 : !do m1=1,ndim
1624 : ! write(message,'(2x,i4,3x,14f10.6)') m1,(aimag(vee(m1,m2,m2,m1)),m2=1,ndim)
1625 : ! call wrtout(std_out,message,'COLL')
1626 : !end do ! m1
1627 : !write(message,'(a)') ch10
1628 : !call wrtout(std_out,message,'COLL')
1629 :
1630 : endif !prtopt == 4
1631 112 : end subroutine printvee_hu
1632 : !!***
1633 :
1634 : !!****f* m_hu/vee2udensatom_hu
1635 : !! NAME
1636 : !! vee2udensatom_hu
1637 : !!
1638 : !! FUNCTION
1639 : !! Compute and print density density interaction from full tensor (used for DFT+DMFT)
1640 : !!
1641 : !! INPUTS
1642 : !! ndim = number of orbitals (without counting the spin)
1643 : !! udens_atoms = density-density interactions
1644 : !! veetemp = full interaction tensor
1645 : !! basis = basis of the interaction tensor
1646 : !! prtonly = 0 (default) : compute and print udens_atoms
1647 : !! = 1 : only print udens_atoms
1648 : !! = 2 : print also complex part
1649 : !! OUTPUT
1650 : !!
1651 : !! SOURCE
1652 :
1653 109 : subroutine vee2udensatom_hu(ndim,udens_atoms,veetemp,basis,prtonly)
1654 :
1655 : !Arguments ------------------------------------
1656 : integer, intent(in) :: ndim
1657 : complex(dp), intent(inout) :: udens_atoms(2*ndim,2*ndim)
1658 : !real(dp), intent(in) :: veetemp(nspinor*ndim,nspinor*ndim,nspinor*ndim,nspinor*ndim)
1659 : complex(dp), intent(in) :: veetemp(ndim,ndim,ndim,ndim)
1660 : character(len=*), intent(in) :: basis
1661 : integer, intent(in), optional :: prtonly
1662 : !Local variables-------------------------------
1663 : integer :: m,m1,ms,ms1,prt_only,tndim
1664 : character(len=1000) :: message
1665 : ! *********************************************************************
1666 :
1667 109 : tndim = 2 * ndim
1668 109 : prt_only = 0
1669 109 : if (present(prtonly)) prt_only = prtonly
1670 109 : if (prt_only == 0) then
1671 1720 : udens_atoms(:,:) = czero
1672 : !ij = 0
1673 240 : do ms=1,tndim-1
1674 200 : m = mod(ms-1,ndim) + 1
1675 840 : do ms1=ms+1,tndim
1676 600 : m1 = mod(ms1-1,ndim) + 1
1677 : !ij = ij + 1
1678 600 : if (ms <= ndim .and. ms1 > ndim) then
1679 : ! hu(itypat)%uqmc(ij)=veetemp(m,m1,m,m1)
1680 360 : udens_atoms(ms,ms1) = veetemp(m,m1,m,m1)
1681 : ! write(6,*)"A", ms,ms1,udens_atoms(ms,ms1)
1682 : else
1683 : ! hu(itypat)%uqmc(ij)=veetemp(m,m1,m,m1)-veetemp(m,m1,m1,m)
1684 240 : udens_atoms(ms,ms1) = veetemp(m,m1,m,m1) - veetemp(m,m1,m1,m)
1685 : ! write(6,*)"B", ms,ms1,udens_atoms(ms,ms1)
1686 : end if
1687 800 : udens_atoms(ms1,ms) = udens_atoms(ms,ms1)
1688 : end do ! ms1
1689 : end do ! ms
1690 :
1691 : ! else if(nspinor==2) then
1692 : !
1693 : ! do ms=1,2*ndim
1694 : ! do ms1=1,2*ndim
1695 : ! udens_atoms(ms,ms1)=veetemp(ms,ms1,ms,ms1)-veetemp(ms,ms1,ms1,ms)
1696 : ! enddo
1697 : ! enddo
1698 :
1699 : end if ! prt_only=0
1700 :
1701 109 : message=''
1702 109 : write(message,'(4a)') ch10," -------- Interactions in the ",trim(basis)," basis "
1703 109 : call wrtout(std_out,message,'COLL')
1704 109 : if (prtonly .eq. 2) then
1705 0 : write(message,'(14(i14))') (m,m=1,tndim)
1706 0 : call wrtout(std_out,message,'COLL')
1707 0 : do ms=1,tndim
1708 0 : write(message,'(i3,14(2x,28f7.3))') ms,((udens_atoms(ms,ms1)),ms1=1,tndim)
1709 0 : call wrtout(std_out,message,'COLL')
1710 : enddo
1711 : else
1712 1119 : write(message,'(1x,14(2x,i5))') (m,m=1,tndim)
1713 109 : call wrtout(std_out,message,'COLL')
1714 1119 : do ms=1,tndim
1715 11270 : write(message,'(i3,14f7.3)') ms,(dble(udens_atoms(ms,ms1)),ms1=1,tndim)
1716 1119 : call wrtout(std_out,message,'COLL')
1717 : enddo !ms
1718 : endif
1719 109 : write(message,'(3a)') "--------------------------------------------------------"
1720 109 : call wrtout(std_out,message,'COLL')
1721 :
1722 109 : end subroutine vee2udensatom_hu
1723 : !!***
1724 :
1725 : !!****f* m_hu/reddd
1726 : !! NAME
1727 : !! reddd
1728 : !!
1729 : !! FUNCTION
1730 : !!
1731 : !! INPUTS
1732 : !!
1733 : !! OUTPUT
1734 : !!
1735 : !! SOURCE
1736 :
1737 : !function reddd(mi,ndim)
1738 :
1739 : ! use defs_basis
1740 :
1741 : !Arguments ------------------------------------
1742 : !scalars
1743 : ! integer,intent(in) :: mi,ndim
1744 : ! integer :: reddd
1745 : ! *************************************************************************
1746 :
1747 : ! if(mi<ndim+1) reddd=mi
1748 : ! if(mi>=ndim+1) reddd=mi-ndim
1749 :
1750 : !end function reddd
1751 : !!***
1752 :
1753 : !!****f* m_hu/vee_slm2ylm_hu
1754 : !! NAME
1755 : !! vee_slm2ylm_hu
1756 : !!
1757 : !! FUNCTION
1758 : !! For a given angular momentum lcor, change a matrix of interaction of dimension (2*lcor+1)
1759 : !! from the Slm to the Ylm basis if option==1 or from Ylm to Slm if !option==2
1760 : !!
1761 : !! COPYRIGHT
1762 : !! Copyright (C) 1998-2026 ABINIT group (BA)
1763 : !! This file is distributed under the terms of the
1764 : !! GNU General Public License, see ~abinit/COPYING
1765 : !! or http://www.gnu.org/copyleft/gpl.txt .
1766 : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt.
1767 : !!
1768 : !! INPUTS
1769 : !! lcor= angular momentum, size of the matrix is 2*lcor+1
1770 : !! mat_inp_c= Input matrix
1771 : !! paw_dmft <type(paw_dmft_type)>= paw+dmft related data
1772 : !! option= 1 Change matrix from Slm to Ylm basis
1773 : !! 2 Change matrix from Ylm to Slm basis
1774 : !! prtvol=printing volume
1775 : !!
1776 : !! OUTPUT
1777 : !! mat_out_c= Output matrix in Ylm or Slm basis according to option
1778 : !!
1779 : !! NOTES
1780 : !!
1781 : !! SOURCE
1782 :
1783 0 : subroutine vee_slm2ylm_hu(lcor,mat_inp_c,mat_out_c,paw_dmft,option,prtvol)
1784 :
1785 : !Arguments ---------------------------------------------
1786 : integer,intent(in) :: lcor,option,prtvol
1787 : complex(dp), intent(in) :: mat_inp_c(2*lcor+1,2*lcor+1,2*lcor+1,2*lcor+1)
1788 : complex(dp), intent(out) :: mat_out_c(2*lcor+1,2*lcor+1,2*lcor+1,2*lcor+1)
1789 : type(paw_dmft_type) , target, intent(in) :: paw_dmft
1790 : !Local variables ---------------------------------------
1791 : integer :: ndim
1792 0 : complex(dp), allocatable :: slm2ylm(:,:)
1793 : character(len=500) :: message
1794 : ! *********************************************************************
1795 :
1796 0 : if (option /= 1 .and. option /= 2) then
1797 0 : message = ' option=/1 or 2 !'
1798 0 : ABI_BUG(message)
1799 : end if
1800 :
1801 0 : if (abs(prtvol) > 2) then
1802 0 : write(message,'(3a)') ch10," vee_slm2ylm_hu"
1803 0 : call wrtout(std_out,message,'COLL')
1804 : end if
1805 :
1806 0 : if (abs(prtvol) > 2) then
1807 0 : if (option == 1) then
1808 0 : write(message,'(3a)') ch10,"matrix in cubic basis is changed into Ylm basis"
1809 0 : else if (option == 2) then
1810 0 : write(message,'(3a)') ch10,"matrix in Ylm basis is changed into cubic basis"
1811 : end if
1812 0 : call wrtout(std_out,message,'COLL')
1813 : end if ! prtvol>2
1814 :
1815 0 : ndim = 2*lcor + 1
1816 :
1817 0 : ABI_MALLOC(slm2ylm,(ndim,ndim))
1818 :
1819 0 : if (option == 1) then
1820 0 : slm2ylm(:,:) = conjg(transpose(paw_dmft%slm2ylm(1:ndim,1:ndim,lcor+1)))
1821 0 : else if (option == 2) then
1822 : ! Make copy here to prevent creation of temporary in case ndim /= ndim_max
1823 0 : slm2ylm(:,:) = paw_dmft%slm2ylm(1:ndim,1:ndim,lcor+1)
1824 : end if
1825 0 : call rotate_hu(slm2ylm(:,:),1,ndim,mat_inp_c(:,:,:,:),mat_out_c(:,:,:,:))
1826 :
1827 0 : ABI_FREE(slm2ylm)
1828 :
1829 : !ll=lcor
1830 : !ABI_MALLOC(slm2ylm,(2*ll+1,2*ll+1))
1831 : !slm2ylm=czero
1832 : !mat_out_c=czero
1833 :
1834 : ! ===== Definitions of slm2ylm
1835 : !do im=1,2*ll+1
1836 : ! mm=im-ll-1;jm=-mm+ll+1 ! mmj=-mm
1837 : !! im is in {1,....2*ll+1}
1838 : !! mm is in {-ll,....+ll}
1839 : !! jm is in {2*ll+1,....,1}
1840 : ! onem=dble((-1)**mm)
1841 : ! if (mm> 0) then ! im in {ll+1,2ll+1} and jm in {ll+1,1}
1842 : ! slm2ylm(im,im)= cmplx(onem*invsqrt2,zero,kind=dp)
1843 : ! slm2ylm(jm,im)= cmplx(invsqrt2, zero,kind=dp)
1844 : ! end if
1845 : ! if (mm==0) then
1846 : ! slm2ylm(im,im)=cone
1847 : ! end if
1848 : ! if (mm< 0) then
1849 : ! slm2ylm(im,im)= cmplx(zero, invsqrt2,kind=dp)
1850 : ! slm2ylm(jm,im)=-cmplx(zero,onem*invsqrt2,kind=dp)
1851 : ! end if
1852 : ! end do
1853 : ! do im=1,2*ll+1
1854 : ! write(message,'(7(2f14.5))') (slm2ylm(im,jm),jm=1,2*ll+1)
1855 : ! call wrtout(std_out,message,'COLL')
1856 : ! end do
1857 :
1858 : ! ===== Definitions of slm2ylm
1859 : !!!! pawtab(itypat)%vee(m11,m31,m21,m41)= <m11 m31| vee| m21 m41 >
1860 : !!!! pawtab(itypat)%vee(m11,m21,m31,m41)= <m11 m21| vee| m31 m41 >
1861 :
1862 : !do jm=1,2*ll+1
1863 : ! do im=1,2*ll+1
1864 : ! do hm=1,2*ll+1
1865 : ! do gm=1,2*ll+1
1866 : ! tmp2=czero
1867 : ! do gg=1,2*ll+1
1868 : ! do hh=1,2*ll+1
1869 : ! do ii=1,2*ll+1
1870 : ! do jj=1,2*ll+1
1871 : ! if(option==1) then
1872 : ! tmp2=tmp2+mat_inp_c(gg,ii,hh,jj)*(slm2ylm(im,ii))*CONJG(slm2ylm(jm,jj))&
1873 : !& *(slm2ylm(gm,gg))*CONJG(slm2ylm(hm,hh))
1874 : ! if(gm==1.and.hm==1.and.im==1.and.jm==1) then
1875 : ! write(6,'(4i4,2f10.5,2f10.5)') gg,hh,ii,jj,tmp2,mat_inp_c(gg,hh,ii,jj)
1876 : ! write(6,*) "i1"
1877 : ! endif
1878 : ! else if(option==2) then
1879 : ! tmp2=tmp2+mat_inp_c(gg,ii,hh,jj)*CONJG(slm2ylm(ii,im))*(slm2ylm(jj,jm))&
1880 : !& *CONJG(slm2ylm(gg,gm))*(slm2ylm(hh,hm))
1881 : ! end if
1882 : ! end do
1883 : ! end do
1884 : ! end do
1885 : ! end do
1886 : ! mat_out_c(gm,hm,im,jm)=tmp2
1887 : ! mat_out_c(gm,im,hm,jm)=tmp2
1888 : ! end do
1889 : ! end do
1890 : ! end do
1891 : !end do
1892 :
1893 : !ABI_FREE(slm2ylm)
1894 :
1895 0 : end subroutine vee_slm2ylm_hu
1896 : !!***
1897 :
1898 : !!****f* m_hu/vee_ndim2tndim_hu_r
1899 : !! NAME
1900 : !! vee_ndim2tndim_hu_r
1901 : !!
1902 : !! FUNCTION
1903 : !! Change a matrix of interaction of dimension [(2*lcor+1)]**2
1904 : !! into a full spin and orbital interaction matrix of dimension [2*(2l+1)]**4
1905 : !!
1906 : !! COPYRIGHT
1907 : !! Copyright (C) 1998-2026 ABINIT group (BA)
1908 : !! This file is distributed under the terms of the
1909 : !! GNU General Public License, see ~abinit/COPYING
1910 : !! or http://www.gnu.org/copyleft/gpl.txt .
1911 : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt.
1912 : !!
1913 : !! INPUTS
1914 : !! lcor= angular momentum, size of the matrix is 2(2*lcor+1)
1915 : !! mat_inp_c= real input matrix
1916 : !! prtvol=printing volume
1917 : !! option= 1 : Vout_(s1m1,s2m2,s3m3,s4m4)=Vinp_(m1,m2,m3,m4)*delta_s1s3*delta_s2s4
1918 : !!
1919 : !!
1920 : !! OUTPUT
1921 : !! mat_out_c= real output matrix
1922 : !!
1923 : !! NOTES
1924 : !!
1925 : !! SOURCE
1926 :
1927 0 : subroutine vee_ndim2tndim_hu_r(lcor,mat_inp_c,mat_out_c,option)
1928 :
1929 : !Arguments ---------------------------------------------
1930 : !scalars
1931 : integer,intent(in) :: lcor,option
1932 : !arrays
1933 : real(dp), intent(in) :: mat_inp_c(:,:,:,:) !real(dp), intent(inout) :: mat_inp_c(:,:,:,:) !(2*lcor+1,2*lcor+1,2*lcor+1,2*lcor+1) real(dp), intent(in), pointer :: mat_inp_c(:,:,:,:)
1934 : real(dp), intent(out) :: mat_out_c(:,:,:,:) !(2*(2*lcor+1),2*(2*lcor+1),2*(2*lcor+1),2*(2*lcor+1))
1935 :
1936 : !Local variables ---------------------------------------
1937 : !scalars
1938 : integer :: m1,m2,m3,m4,is1,is2,is3,is4,ndim,s1,s2,s3,s4
1939 :
1940 : ! *********************************************************************
1941 0 : ndim=2*lcor+1
1942 0 : mat_out_c=czero
1943 :
1944 0 : if(option==1) then
1945 0 : do m1=1,ndim
1946 0 : do m2=1,ndim
1947 0 : do m3=1,ndim
1948 0 : do m4=1,ndim
1949 0 : do is1=1,2
1950 0 : do is2=1,2
1951 :
1952 0 : is3=is1 ; is4=is2
1953 :
1954 0 : s1=(is1-1)*ndim ; s2=(is2-1)*ndim ; s3=(is3-1)*ndim ; s4=(is4-1)*ndim
1955 :
1956 0 : mat_out_c(m1+s1,m2+s2,m3+s3,m4+s4)= mat_inp_c(m1,m2,m3,m4)
1957 :
1958 : enddo
1959 : enddo
1960 : enddo
1961 : enddo
1962 : enddo
1963 : enddo
1964 : endif
1965 :
1966 :
1967 0 : end subroutine vee_ndim2tndim_hu_r
1968 : !!***
1969 :
1970 : !!****f* m_hu/vee_ndim2tndim_hu
1971 : !! NAME
1972 : !! vee_ndim2tndim_hu
1973 : !!
1974 : !! FUNCTION
1975 : !! Change a matrix of interaction of dimension [(2*lcor+1)]**4
1976 : !! into a full spin and orbital interaction matrix of dimension [2*(2l+1)]**4
1977 : !!
1978 : !! COPYRIGHT
1979 : !! Copyright (C) 1998-2026 ABINIT group (BA)
1980 : !! This file is distributed under the terms of the
1981 : !! GNU General Public License, see ~abinit/COPYING
1982 : !! or http://www.gnu.org/copyleft/gpl.txt .
1983 : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt.
1984 : !!
1985 : !! INPUTS
1986 : !! lcor= angular momentum, size of the matrix is 2(2*lcor+1)
1987 : !! mat_inp_c= input matrix
1988 : !!
1989 : !! OUTPUT
1990 : !! mat_out_c= Complex output matrix
1991 : !!
1992 : !! NOTES
1993 : !!
1994 : !! SOURCE
1995 :
1996 133 : subroutine vee_ndim2tndim_hu(lcor,mat_inp_c,mat_out_c)
1997 :
1998 : !Arguments ---------------------------------------------
1999 : !scalars
2000 : integer, intent(in) :: lcor
2001 : !arrays
2002 : complex(dp), intent(in) :: mat_inp_c(2*lcor+1,2*lcor+1,2*lcor+1,2*lcor+1)
2003 : complex(dp), intent(inout) :: mat_out_c(2*(2*lcor+1),2*(2*lcor+1),2*(2*lcor+1),2*(2*lcor+1))
2004 : !Local variables ---------------------------------------
2005 : !scalars
2006 : integer :: is1,is2,m1,m2,m3,m4,ndim,s1,s2
2007 : ! *********************************************************************
2008 :
2009 133 : ndim = 2*lcor + 1
2010 1160811 : mat_out_c(:,:,:,:) = czero
2011 :
2012 399 : do is2=1,2
2013 266 : s2 = (is2-1) * ndim
2014 1449 : do m4=1,ndim
2015 3416 : do is1=1,2
2016 2100 : s1 = (is1-1) * ndim
2017 12514 : do m3=1,ndim
2018 58684 : do m2=1,ndim
2019 320540 : do m1=1,ndim
2020 311176 : mat_out_c(m1+s1,m2+s2,m3+s1,m4+s2) = mat_inp_c(m1,m2,m3,m4)
2021 : end do ! m1
2022 : end do ! m2
2023 : end do ! m3
2024 : end do ! is1
2025 : end do ! m4
2026 : end do ! is2
2027 :
2028 133 : end subroutine vee_ndim2tndim_hu
2029 : !!***
2030 :
2031 : !!****f* ABINIT/vee_ylm2jmj_hu
2032 : !! NAME
2033 : !! vee_ylm2jmj_hu
2034 : !!
2035 : !! FUNCTION
2036 : !! For a given angular momentum lcor, change a matrix of dimension [2(2*lcor+1)]**4
2037 : !! from the Ylm basis to the J,M_J basis if option==1
2038 : !!
2039 : !! COPYRIGHT
2040 : !! Copyright (C) 1998-2026 ABINIT group (BA)
2041 : !! This file is distributed under the terms of the
2042 : !! GNU General Public License, see ~abinit/COPYING
2043 : !! or http://www.gnu.org/copyleft/gpl.txt .
2044 : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt.
2045 : !!
2046 : !! INPUTS
2047 : !! lcor= angular momentum
2048 : !! mat_inp_c = input tensor
2049 : !! mat_out_c = output tensor
2050 : !! option= 1 matrix in |l,s,m_l,m_s> basis is changed into |l,s,j,m_j> basis
2051 : !! 2 matrix in |l,s,j,m_j> basis is changed into |l,s,m_l,m_s> basis
2052 : !! paw_dmft <type(paw_dmft_type)>= paw+dmft related data
2053 : !!
2054 : !! SIDE EFFECTS
2055 : !!
2056 : !! NOTES
2057 : !! useful only in ndij==4
2058 : !!
2059 : !! SOURCE
2060 :
2061 0 : subroutine vee_ylm2jmj_hu(lcor,mat_inp_c,mat_out_c,option,paw_dmft)
2062 :
2063 : !Arguments ---------------------------------------------
2064 : integer, intent(in) :: lcor,option
2065 : complex(dp), intent(in) :: mat_inp_c(2*(2*lcor+1),2*(2*lcor+1),2*(2*lcor+1),2*(2*lcor+1))
2066 : complex(dp), intent(inout) :: mat_out_c(2*(2*lcor+1),2*(2*lcor+1),2*(2*lcor+1),2*(2*lcor+1))
2067 : type(paw_dmft_type), intent(in) :: paw_dmft
2068 : !Local variables ---------------------------------------
2069 : integer :: im,jm,tndim
2070 0 : complex(dp), allocatable :: jmj2ylm(:,:)
2071 : character(len=500) :: message
2072 : !*********************************************************************
2073 :
2074 0 : if (option /= 1 .and. option /= 2) then
2075 0 : message = ' option=/1 and =/2 !'
2076 0 : ABI_BUG(message)
2077 : end if
2078 :
2079 0 : if (lcor == 0) ABI_BUG("l should not be equal to 0")
2080 :
2081 0 : if (option == 1) then
2082 0 : write(message,'(3a)') ch10,"matrix in |l,s,m_l,m_s> basis is changed into |l,s,j,m_j> basis"
2083 0 : else if (option == 2) then
2084 0 : write(message,'(3a)') ch10,"matrix in |l,s,j,m_j> basis is changed into |l,s,m_l,m_s> basis"
2085 : end if
2086 0 : call wrtout(std_out,message,"COLL")
2087 :
2088 0 : tndim = 2 * (2*lcor+1)
2089 :
2090 : ! Make copy to prevent creation of temporary in the case ndim /= ndim_max
2091 0 : ABI_MALLOC(jmj2ylm,(tndim,tndim))
2092 :
2093 0 : if (option == 1) then
2094 0 : jmj2ylm(:,:) = paw_dmft%jmj2ylm(1:tndim,1:tndim,lcor+1)
2095 0 : else if (option == 2) then
2096 0 : jmj2ylm(:,:) = conjg(transpose(paw_dmft%jmj2ylm(1:tndim,1:tndim,lcor+1)))
2097 : end if
2098 :
2099 0 : write(message,'(3a)') ch10,"Matrix to go from |J,M_J> to |M_L,M_S>"
2100 0 : call wrtout(std_out,message,"COLL")
2101 0 : do im=1,tndim
2102 0 : write(message,'(12(1x,18(1x,"(",f7.3,",",f7.3,")")))') (jmj2ylm(im,jm),jm=1,tndim)
2103 0 : call wrtout(std_out,message,"COLL")
2104 : end do
2105 :
2106 0 : call rotate_hu(jmj2ylm(:,:),1,tndim,mat_inp_c(:,:,:,:),mat_out_c(:,:,:,:))
2107 :
2108 0 : ABI_FREE(jmj2ylm)
2109 :
2110 : !--------------- Built indices + allocations
2111 : !ll=lcor
2112 : !ABI_MALLOC(mlms2jmj,(2*(2*ll+1),2*(2*ll+1)))
2113 : !mlms2jmj=czero
2114 : !ABI_MALLOC(ind_msml,(2,-ll:ll))
2115 : !mlms2jmj=czero
2116 : !jc1=0
2117 : !do ms1=1,2
2118 : ! do ml1=-ll,ll
2119 : ! jc1=jc1+1
2120 : ! ind_msml(ms1,ml1)=jc1
2121 : ! end do
2122 : !end do
2123 :
2124 : !--------------- built mlms2jmj
2125 : !do jj=ll,ll+1 ! the physical value of j are ll-0.5,ll+0.5
2126 : !xj(jj)=jj-0.5
2127 : !if(ll==0)then
2128 : ! message=' ll should not be equal to zero !'
2129 : ! ABI_BUG(message)
2130 : !end if
2131 : !jc1=0
2132 : !invsqrt2lp1=one/sqrt(float(2*lcor+1))
2133 : !do jj=ll,ll+1
2134 : ! xj=float(jj)-half ! xj is in {ll-0.5, ll+0.5}
2135 : ! do jm=-jj,jj-1
2136 : ! xmj=float(jm)+half ! xmj is in {-xj,xj}
2137 : ! jc1=jc1+1 ! Global index for JMJ
2138 : ! if(nint(xj+0.5)==ll+1) then ! if xj=ll+0.5
2139 : ! if(nint(xmj+0.5)==ll+1) then
2140 : ! mlms2jmj(ind_msml(2,ll),jc1)=1.0 ! J=L+0.5 and m_J=L+0.5
2141 : ! else if(nint(xmj-0.5)==-ll-1) then
2142 : ! mlms2jmj(ind_msml(1,-ll),jc1)=1.0 ! J=L+0.5 and m_J=-L-0.5
2143 : ! else
2144 : ! mlms2jmj(ind_msml(2,nint(xmj-0.5)),jc1)=invsqrt2lp1*(sqrt(float(ll)+xmj+0.5))
2145 : ! mlms2jmj(ind_msml(1,nint(xmj+0.5)),jc1)=invsqrt2lp1*(sqrt(float(ll)-xmj+0.5))
2146 : ! end if
2147 : ! end if
2148 : ! if(nint(xj+0.5)==ll) then ! if xj=ll-0.5
2149 : ! mlms2jmj(ind_msml(1,nint(xmj+0.5)),jc1)=invsqrt2lp1*(sqrt(float(ll)+xmj+0.5))
2150 : ! mlms2jmj(ind_msml(2,nint(xmj-0.5)),jc1)=-invsqrt2lp1*(sqrt(float(ll)-xmj+0.5))
2151 : ! end if
2152 : ! end do
2153 : !end do
2154 : !write(message,'(3a)') ch10,"Matrix to go from |M_L,M_S> to |J,M_J>"
2155 : !call wrtout(std_out,message,"COLL")
2156 : !do im=1,2*(ll*2+1)
2157 : ! write(message,'(12(1x,18(1x,"(",f7.3,",",f7.3,")")))') (mlms2jmj(im,jm),jm=1,2*(ll*2+1))
2158 : ! call wrtout(std_out,message,"COLL")
2159 : !end do
2160 :
2161 : !--------------- compute change of basis
2162 : ! do jm=1,2*(2*ll+1)
2163 : ! do im=1,2*(2*ll+1)
2164 : ! do hm=1,2*(2*ll+1)
2165 : ! do gm=1,2*(2*ll+1)
2166 : ! tmp2=czero
2167 : ! do gg=1,2*(2*ll+1)
2168 : ! do hh=1,2*(2*ll+1)
2169 : ! do ii=1,2*(2*ll+1)
2170 : ! do jj=1,2*(2*ll+1)
2171 : ! if(option==1) then
2172 : ! tmp2=tmp2+mat_inp_c(gg,ii,hh,jj)*CONJG(mlms2jmj(ii,im))*(mlms2jmj(jj,jm))&
2173 : !& *CONJG(mlms2jmj(gg,gm))*(mlms2jmj(hh,hm))
2174 : ! else if(option==2) then
2175 : ! tmp2=tmp2+mat_inp_c(gg,ii,hh,jj)*CONJG(mlms2jmj(ii,im))*(mlms2jmj(jj,jm))& ! inv=t*
2176 : !& *CONJG(mlms2jmj(gg,gm))*(mlms2jmj(hh,hm)) ! inv=t*
2177 : ! tmp2=tmp2+mat_inp_c(gg,ii,hh,jj)*(mlms2jmj(im,ii))*CONJG(mlms2jmj(jm,jj))& ! inv=t*
2178 : !& *(mlms2jmj(gm,gg))*CONJG(mlms2jmj(hm,hh)) ! inv=t*
2179 : ! end if
2180 : ! end do
2181 : ! end do
2182 : ! end do
2183 : ! end do
2184 : ! mat_out_c(gm,im,hm,jm)=tmp2
2185 : ! end do
2186 : ! end do
2187 : ! end do
2188 : ! end do
2189 : ! ABI_FREE(mlms2jmj)
2190 : ! ABI_FREE(ind_msml)
2191 :
2192 0 : end subroutine vee_ylm2jmj_hu
2193 : !!***
2194 :
2195 : !!****f* ABINIT/udens_slatercondon_hu
2196 : !! NAME
2197 : !! udens_slatercondon_hu
2198 : !!
2199 : !! FUNCTION
2200 : !! For a given angular momentum l and Slater integrals, give the
2201 : !! density density interactions U(m,m') and J(m,m') from Slater and
2202 : !! Condon tables
2203 : !!
2204 : !! COPYRIGHT
2205 : !! Copyright (C) 1998-2026 ABINIT group (BA)
2206 : !! This file is distributed under the terms of the
2207 : !! GNU General Public License, see ~abinit/COPYING
2208 : !! or http://www.gnu.org/copyleft/gpl.txt .
2209 : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt.
2210 : !!
2211 : !! INPUTS
2212 : !! lcor= angular momentum
2213 : !! fk(lcor+1)= Slater integrals
2214 : !!
2215 : !! SIDE EFFECTS
2216 : !!
2217 : !! NOTES
2218 : !!
2219 : !! SOURCE
2220 :
2221 0 : subroutine udens_slatercondon_hu(fk,lcor)
2222 :
2223 : !Arguments ---------------------------------------------
2224 : !scalars
2225 : integer, intent(in) :: lcor
2226 : real(dp), intent(in) :: fk(0:lcor)
2227 : !Local variables ---------------------------------------
2228 : !scalars
2229 : character(len=500) :: message
2230 : integer :: m1,m2
2231 : !arrays
2232 0 : real(dp), allocatable :: aklmlmp(:,:,:),bklmlmp(:,:,:),jdens(:,:),udens(:,:)
2233 : !*********************************************************************
2234 :
2235 0 : ABI_MALLOC(aklmlmp,(0:lcor,-lcor:lcor,-lcor:lcor)) ! k,m,m'
2236 0 : ABI_MALLOC(bklmlmp,(0:lcor,-lcor:lcor,-lcor:lcor)) ! k,m,m'
2237 0 : ABI_MALLOC(udens,(-lcor:lcor,-lcor:lcor)) ! m,m'
2238 0 : ABI_MALLOC(jdens,(-lcor:lcor,-lcor:lcor)) ! m,m'
2239 : ! k=2*(lcor)
2240 0 : aklmlmp(:,:,:) = zero
2241 0 : bklmlmp(:,:,:) = zero
2242 0 : udens(:,:) = zero
2243 0 : jdens(:,:) = zero
2244 0 : if (lcor == 0) then
2245 0 : aklmlmp(0,0,0)=1
2246 : !
2247 0 : bklmlmp(0,0,0)=0
2248 0 : else if (lcor == 1) then
2249 0 : aklmlmp(0, :, :)=1
2250 0 : aklmlmp(1, 1, 1)= one/25._dp
2251 0 : aklmlmp(1,-1,-1)= one/25._dp
2252 0 : aklmlmp(1,-1, 1)= one/25._dp
2253 0 : aklmlmp(1, 1,-1)= one/25._dp
2254 0 : aklmlmp(1, 1, 0)=-two/25._dp
2255 0 : aklmlmp(1,-1, 0)=-two/25._dp
2256 0 : aklmlmp(1, 0,-1)=-two/25._dp
2257 0 : aklmlmp(1, 0, 1)=-two/25._dp
2258 0 : aklmlmp(1, 0, 0)= four/25._dp
2259 : !
2260 0 : bklmlmp(0, 1, 1)= one
2261 0 : bklmlmp(0,-1,-1)= one
2262 0 : bklmlmp(0, 0, 0)= one
2263 0 : bklmlmp(1, 1, 1)= one/25._dp
2264 0 : bklmlmp(1,-1,-1)= one/25._dp
2265 0 : bklmlmp(1,-1,+1)= six/25._dp
2266 0 : bklmlmp(1,+1,-1)= six/25._dp
2267 0 : bklmlmp(1,+1, 0)= three/25._dp
2268 0 : bklmlmp(1,-1, 0)= three/25._dp
2269 0 : bklmlmp(1, 0,-1)= three/25._dp
2270 0 : bklmlmp(1, 0, 1)= three/25._dp
2271 0 : bklmlmp(1, 0, 0)= four/25._dp
2272 0 : else if (lcor == 2) then
2273 0 : aklmlmp(0, :, :)=1
2274 0 : aklmlmp(1, 2, 2)= four / 49._dp
2275 0 : aklmlmp(1, 2, 1)= -two / 49._dp
2276 0 : aklmlmp(1, 2, 0)= -four / 49._dp
2277 0 : aklmlmp(1, 2,-1)= -two / 49._dp
2278 0 : aklmlmp(1, 2,-2)= four / 49._dp
2279 0 : aklmlmp(1, 1, 2)= -two / 49._dp
2280 0 : aklmlmp(1, 1, 1)= one / 49._dp
2281 0 : aklmlmp(1, 1, 0)= two / 49._dp
2282 0 : aklmlmp(1, 1,-1)= one / 49._dp
2283 0 : aklmlmp(1, 1,-2)= -two / 49._dp
2284 0 : aklmlmp(1, 0, 2)= -four / 49._dp
2285 0 : aklmlmp(1, 0, 1)= two / 49._dp
2286 0 : aklmlmp(1, 0, 0)= four / 49._dp
2287 0 : aklmlmp(1, 0,-1)= two / 49._dp
2288 0 : aklmlmp(1, 0,-2)= -four / 49._dp
2289 0 : aklmlmp(1,-1, 2)= -two / 49._dp
2290 0 : aklmlmp(1,-1, 1)= one / 49._dp
2291 0 : aklmlmp(1,-1, 0)= two / 49._dp
2292 0 : aklmlmp(1,-1,-1)= one / 49._dp
2293 0 : aklmlmp(1,-1,-2)= -two / 49._dp
2294 0 : aklmlmp(1,-2, 2)= four / 49._dp
2295 0 : aklmlmp(1,-2, 1)= -two / 49._dp
2296 0 : aklmlmp(1,-2, 0)= -four / 49._dp
2297 0 : aklmlmp(1,-2,-1)= -two / 49._dp
2298 0 : aklmlmp(1,-2,-2)= four / 49._dp
2299 :
2300 0 : aklmlmp(2, 2, 2)= one / 441._dp
2301 0 : aklmlmp(2, 2, 1)= -four / 441._dp
2302 0 : aklmlmp(2, 2, 0)= six / 441._dp
2303 0 : aklmlmp(2, 2,-1)= -four / 441._dp
2304 0 : aklmlmp(2, 2,-2)= one / 441._dp
2305 0 : aklmlmp(2, 1, 2)= -four / 441._dp
2306 0 : aklmlmp(2, 1, 1)= 16._dp / 441._dp
2307 0 : aklmlmp(2, 1, 0)= -24._dp / 441._dp
2308 0 : aklmlmp(2, 1,-1)= 16._dp / 441._dp
2309 0 : aklmlmp(2, 1,-2)= -four / 441._dp
2310 0 : aklmlmp(2, 0, 2)= six / 441._dp
2311 0 : aklmlmp(2, 0, 1)= -24._dp / 441._dp
2312 0 : aklmlmp(2, 0, 0)= 36._dp / 441._dp
2313 0 : aklmlmp(2, 0,-1)= -24._dp / 441._dp
2314 0 : aklmlmp(2, 0,-2)= six / 441._dp
2315 0 : aklmlmp(2,-1, 2)= -four / 441._dp
2316 0 : aklmlmp(2,-1, 1)= 16._dp / 441._dp
2317 0 : aklmlmp(2,-1, 0)= -24._dp / 441._dp
2318 0 : aklmlmp(2,-1,-1)= 16._dp / 441._dp
2319 0 : aklmlmp(2,-1,-2)= -four / 441._dp
2320 0 : aklmlmp(2,-2, 2)= one / 441._dp
2321 0 : aklmlmp(2,-2, 1)= -four / 441._dp
2322 0 : aklmlmp(2,-2, 0)= six / 441._dp
2323 0 : aklmlmp(2,-2,-1)= -four / 441._dp
2324 0 : aklmlmp(2,-2,-2)= one / 441._dp
2325 : !do m1=lcor,-lcor,-1
2326 : ! do m2=lcor,-lcor,-1
2327 : ! write(6,*) m1,m2,aklmlmp(2,m1,m2)
2328 : ! enddo
2329 : !enddo
2330 :
2331 : !write(message,'(2x,a,3x,14f10.4)') " Slater aklmlmp(2,:,:)"
2332 : !call wrtout(std_out, message,'COLL')
2333 : !write(message,'(2x,4x,14(2x,i8))') (m1,m1=-lcor,lcor,1)
2334 : !call wrtout(std_out, message,'COLL')
2335 : !do m1=-lcor,lcor,1
2336 : ! write(message,'(2x,i4,3x,14f10.4)') m1,(aklmlmp(2,m1,m2),m2=-lcor,lcor,1)
2337 : ! call wrtout(std_out, message,'COLL')
2338 : !enddo
2339 :
2340 0 : bklmlmp(0, 2, 2)=1
2341 0 : bklmlmp(0, 1, 1)=1
2342 0 : bklmlmp(0, 0, 0)=1
2343 0 : bklmlmp(0,-1,-1)=1
2344 0 : bklmlmp(0,-2,-2)=1
2345 0 : bklmlmp(1, 2, 2)= four / 49._dp
2346 0 : bklmlmp(1, 2, 1)= six / 49._dp
2347 0 : bklmlmp(1, 2, 0)= four / 49._dp
2348 0 : bklmlmp(1, 2,-1)= zero
2349 0 : bklmlmp(1, 2,-2)= zero
2350 0 : bklmlmp(1, 1, 2)= six / 49._dp
2351 0 : bklmlmp(1, 1, 1)= one / 49._dp
2352 0 : bklmlmp(1, 1, 0)= one / 49._dp
2353 0 : bklmlmp(1, 1,-1)= six / 49._dp
2354 0 : bklmlmp(1, 1,-2)= zero
2355 0 : bklmlmp(1, 0, 2)= four / 49._dp
2356 0 : bklmlmp(1, 0, 1)= one / 49._dp
2357 0 : bklmlmp(1, 0, 0)= four / 49._dp
2358 0 : bklmlmp(1, 0,-1)= one / 49._dp
2359 0 : bklmlmp(1, 0,-2)= four / 49._dp
2360 0 : bklmlmp(1,-1, 2)= zero
2361 0 : bklmlmp(1,-1, 1)= six / 49._dp
2362 0 : bklmlmp(1,-1, 0)= one / 49._dp
2363 0 : bklmlmp(1,-1,-1)= one / 49._dp
2364 0 : bklmlmp(1,-1,-2)= six / 49._dp
2365 0 : bklmlmp(1,-2, 2)= zero
2366 0 : bklmlmp(1,-2, 1)= zero
2367 0 : bklmlmp(1,-2, 0)= four / 49._dp
2368 0 : bklmlmp(1,-2,-1)= six / 49._dp
2369 0 : bklmlmp(1,-2,-2)= four / 49._dp
2370 :
2371 0 : bklmlmp(2, 2, 2)= one / 441._dp
2372 0 : bklmlmp(2, 2, 1)= five / 441._dp
2373 0 : bklmlmp(2, 2, 0)= 15._dp / 441._dp
2374 0 : bklmlmp(2, 2,-1)= 35._dp / 441._dp
2375 0 : bklmlmp(2, 2,-2)= 70._dp / 441._dp
2376 0 : bklmlmp(2, 1, 2)= five / 441._dp
2377 0 : bklmlmp(2, 1, 1)= 16._dp / 441._dp
2378 0 : bklmlmp(2, 1, 0)= 30._dp / 441._dp
2379 0 : bklmlmp(2, 1,-1)= 40._dp / 441._dp
2380 0 : bklmlmp(2, 1,-2)= 35._dp / 441._dp
2381 0 : bklmlmp(2, 0, 2)= 15._dp / 441._dp
2382 0 : bklmlmp(2, 0, 1)= 30._dp / 441._dp
2383 0 : bklmlmp(2, 0, 0)= 36._dp / 441._dp
2384 0 : bklmlmp(2, 0,-1)= 30._dp / 441._dp
2385 0 : bklmlmp(2, 0,-2)= 15._dp / 441._dp
2386 0 : bklmlmp(2,-1, 2)= 35._dp / 441._dp
2387 0 : bklmlmp(2,-1, 1)= 40._dp / 441._dp
2388 0 : bklmlmp(2,-1, 0)= 30._dp / 441._dp
2389 0 : bklmlmp(2,-1,-1)= 16._dp / 441._dp
2390 0 : bklmlmp(2,-1,-2)= five / 441._dp
2391 0 : bklmlmp(2,-2, 2)= 70._dp / 441._dp
2392 0 : bklmlmp(2,-2, 1)= 35._dp / 441._dp
2393 0 : bklmlmp(2,-2, 0)= 15._dp / 441._dp
2394 0 : bklmlmp(2,-2,-1)= five / 441._dp
2395 0 : bklmlmp(2,-2,-2)= one / 441._dp
2396 :
2397 : !write(message,'(2x,a,3x,14f10.4)') " Slater bklmlmp(2,:,:)"
2398 : !call wrtout(std_out, message,'COLL')
2399 : !write(message,'(2x,4x,14(2x,i8))') (m1,m1=-lcor,lcor,1)
2400 : !call wrtout(std_out, message,'COLL')
2401 : !do m1=-lcor,lcor,1
2402 : ! write(message,'(2x,i4,3x,14f10.4)') m1,(bklmlmp(2,m1,m2),m2=-lcor,lcor,1)
2403 : ! call wrtout(std_out, message,'COLL')
2404 : !enddo
2405 : ! if f4of2_sla: these data agree with the explicit calculation
2406 : !else if(lcor==3) then
2407 : end if ! lcor
2408 :
2409 0 : do m2=-lcor,lcor,1
2410 0 : do m1=-lcor,lcor,1
2411 0 : udens(m1,m2) = sum(fk(:)*aklmlmp(:,m1,m2))
2412 0 : jdens(m1,m2) = sum(fk(:)*bklmlmp(:,m1,m2))
2413 : !write(6,*) kk,m1,m2
2414 : !write(6,*) "--",fk(kk),aklmlmp(kk,m1,m2)
2415 : !write(6,*) "--",fk(kk),bklmlmp(kk,m1,m2)
2416 : !udens(m1,m2)=udens(m1,m2)+fk(kk)*aklmlmp(kk,m1,m2)
2417 : !jdens(m1,m2)=jdens(m1,m2)+fk(kk)*bklmlmp(kk,m1,m2)
2418 : end do ! m1
2419 : end do ! m2
2420 0 : write(message,'(2x,a,3x,14f10.4)') " Direct Interaction Matrix from Slater tables (in the Ylm basis) "
2421 0 : call wrtout(std_out,message,'COLL')
2422 0 : write(message,'(2x,4x,14(2x,i8))') (m1,m1=-lcor,lcor,1)
2423 0 : call wrtout(std_out,message,'COLL')
2424 0 : do m1=-lcor,lcor,1
2425 0 : write(message,'(2x,i4,3x,14f10.4)') m1,(udens(m1,m2),m2=-lcor,lcor,1)
2426 0 : call wrtout(std_out,message,'COLL')
2427 : end do ! m1
2428 :
2429 0 : write(message,'(a,2x,a,3x,14f10.4)') ch10," Exchange Interaction Matrix from Slater tables (in the Ylm basis) "
2430 0 : call wrtout(std_out,message,'COLL')
2431 0 : write(message,'(2x,4x,14(2x,i8))') (m1,m1=-lcor,lcor,1)
2432 0 : call wrtout(std_out,message,'COLL')
2433 0 : do m1=-lcor,lcor,1
2434 0 : write(message,'(2x,i4,3x,14f10.4)') m1,(jdens(m1,m2),m2=-lcor,lcor,1)
2435 0 : call wrtout(std_out,message,'COLL')
2436 : end do ! m1
2437 :
2438 0 : write(message,'(a,2x,a,3x,14f10.4)') ch10," Density density Interaction Matrix from Slater tables (in the Ylm basis) "
2439 0 : call wrtout(std_out,message,'COLL')
2440 0 : write(message,'(2x,4x,14(2x,i8))') (m1,m1=-lcor,lcor,1)
2441 0 : call wrtout(std_out,message,'COLL')
2442 0 : do m1=-lcor,lcor,1
2443 0 : write(message,'(2x,i4,3x,14f10.4)') m1,(udens(m1,m2)-jdens(m1,m2),m2=-lcor,lcor,1)
2444 0 : call wrtout(std_out,message,'COLL')
2445 : end do ! m1
2446 :
2447 0 : ABI_FREE(jdens)
2448 0 : ABI_FREE(udens)
2449 0 : ABI_FREE(aklmlmp)
2450 0 : ABI_FREE(bklmlmp)
2451 :
2452 0 : end subroutine udens_slatercondon_hu
2453 : !!***
2454 :
2455 : !!****f* ABINIT/udens_inglis_hu
2456 : !! NAME
2457 : !! udens_inglis_hu
2458 : !!
2459 : !! FUNCTION
2460 : !! For a given angular momentum l and Slater integrals, give the
2461 : !! density density interactions U(m,m') and J(m,m') from Inglis tables
2462 : !! in JMJ Basis
2463 : !!
2464 : !! COPYRIGHT
2465 : !! Copyright (C) 1998-2026 ABINIT group (BA)
2466 : !! This file is distributed under the terms of the
2467 : !! GNU General Public License, see ~abinit/COPYING
2468 : !! or http://www.gnu.org/copyleft/gpl.txt .
2469 : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt.
2470 : !!
2471 : !! INPUTS
2472 : !! lcor= angular momentum
2473 : !! fk(lcor+1)= Slater integrals
2474 : !!
2475 : !! SIDE EFFECTS
2476 : !!
2477 : !! NOTES
2478 : !!
2479 : !! SOURCE
2480 :
2481 0 : subroutine udens_inglis_hu(fk,lcor)
2482 :
2483 : !Arguments ---------------------------------------------
2484 : !scalars
2485 : integer, intent(in) :: lcor
2486 : real(dp), intent(in) :: fk(0:lcor)
2487 : !Local variables ---------------------------------------
2488 : !scalars
2489 : character(len=500) :: message
2490 : integer :: m1,m2,tndim
2491 : !arrays
2492 0 : real(dp), allocatable :: a2pp(:,:),app(:,:,:),b2pp(:,:),bpp(:,:,:),jdens(:,:),udens(:,:)
2493 : !*********************************************************************
2494 :
2495 0 : tndim = 2 * (2*lcor+1)
2496 0 : ABI_MALLOC(app,(0:lcor,tndim,tndim))
2497 0 : ABI_MALLOC(bpp,(0:lcor,tndim,tndim))
2498 0 : ABI_MALLOC(a2pp,(tndim,tndim))
2499 0 : ABI_MALLOC(b2pp,(tndim,tndim))
2500 :
2501 0 : ABI_MALLOC(udens,(tndim,tndim))
2502 0 : ABI_MALLOC(jdens,(tndim,tndim))
2503 :
2504 0 : udens(:,:) = zero
2505 0 : jdens(:,:) = zero
2506 0 : a2pp(:,:) = zero
2507 0 : b2pp(:,:) = zero
2508 0 : app(:,:,:) = zero
2509 0 : bpp(:,:,:) = zero
2510 0 : if (lcor == 1) then
2511 0 : app(0,:,:)=one
2512 : a2pp(:,:)=RESHAPE((/0._dp,0._dp, 0._dp, 0._dp, 0._dp, 0._dp,&
2513 : & 0._dp,0._dp, 0._dp, 0._dp, 0._dp, 0._dp,&
2514 : & 0._dp,0._dp, 1._dp,-1._dp,-1._dp, 1._dp,&
2515 : & 0._dp,0._dp,-1._dp, 1._dp, 1._dp,-1._dp,&
2516 : & 0._dp,0._dp,-1._dp, 1._dp, 1._dp,-1._dp,&
2517 0 : & 0._dp,0._dp, 1._dp,-1._dp,-1._dp, 1._dp/),(/6,6/))
2518 0 : app(1,:,:)=a2pp(:,:)
2519 0 : app(1,:,:)=app(1,:,:)/25._dp
2520 :
2521 : b2pp(:,:)=RESHAPE((/1._dp,0._dp,0._dp,0._dp,0._dp,0._dp,&
2522 : & 0._dp,1._dp,0._dp,0._dp,0._dp,0._dp,&
2523 : & 0._dp,0._dp,1._dp,0._dp,0._dp,0._dp,&
2524 : & 0._dp,0._dp,0._dp,1._dp,0._dp,0._dp,&
2525 : & 0._dp,0._dp,0._dp,0._dp,1._dp,0._dp,&
2526 0 : & 0._dp,0._dp,0._dp,0._dp,0._dp,1._dp /),(/6,6/))
2527 0 : bpp(0,:,:)=b2pp(:,:)
2528 : b2pp(:,:)=RESHAPE((/0._dp,0._dp,1._dp,2._dp,3._dp,4._dp,&
2529 : & 0._dp,0._dp,4._dp,3._dp,2._dp,1._dp,&
2530 : & 1._dp,4._dp,1._dp,2._dp,2._dp,0._dp,&
2531 : & 2._dp,3._dp,2._dp,1._dp,0._dp,2._dp,&
2532 : & 3._dp,2._dp,2._dp,0._dp,1._dp,2._dp,&
2533 0 : & 4._dp,1._dp,0._dp,2._dp,2._dp,1._dp /),(/6,6/))
2534 0 : bpp(1,:,:)=b2pp(:,:)
2535 0 : bpp(1,:,:)=bpp(1,:,:)/25._dp
2536 : end if ! lcor=1
2537 0 : if (lcor == 2) then
2538 0 : app(0,:,:)=one
2539 : a2pp(:,:)=RESHAPE((/ 49._dp,-49._dp,-49._dp, 49._dp, 70._dp,-14._dp,-56._dp,-56._dp,-14._dp, 70._dp,&
2540 : & -49._dp, 49._dp, 49._dp,-49._dp,-70._dp, 14._dp, 56._dp, 56._dp, 14._dp,-70._dp,&
2541 : & -49._dp, 49._dp, 49._dp,-49._dp,-70._dp, 14._dp, 56._dp, 56._dp, 14._dp,-70._dp,&
2542 : & 49._dp,-49._dp,-49._dp, 49._dp, 70._dp,-14._dp,-56._dp,-56._dp,-14._dp, 70._dp,&
2543 : & 70._dp,-70._dp,-70._dp, 70._dp,100._dp,-20._dp,-80._dp,-80._dp,-20._dp,100._dp,&
2544 : & -14._dp, 14._dp, 14._dp,-14._dp,-20._dp, 4._dp, 16._dp, 16._dp, 4._dp,-20._dp,&
2545 : & -56._dp, 56._dp, 56._dp,-56._dp,-80._dp, 16._dp, 64._dp, 64._dp, 16._dp,-80._dp,&
2546 : & -56._dp, 56._dp, 56._dp,-56._dp,-80._dp, 16._dp, 64._dp, 64._dp, 16._dp,-80._dp,&
2547 : & -14._dp, 14._dp, 14._dp,-14._dp,-20._dp, 4._dp, 16._dp, 16._dp, 4._dp,-20._dp,&
2548 0 : & 70._dp,-70._dp,-70._dp, 70._dp,100._dp,-20._dp,-80._dp,-80._dp,-20._dp,100._dp/),(/10,10/))
2549 0 : app(1,:,:)=a2pp(:,:)/1225._dp
2550 0 : app(2,:,:)=zero
2551 :
2552 : b2pp(:,:)=RESHAPE((/1._dp,0._dp,0._dp,0._dp,0._dp,0._dp,0._dp,0._dp,0._dp,0._dp,&
2553 : & 0._dp,1._dp,0._dp,0._dp,0._dp,0._dp,0._dp,0._dp,0._dp,0._dp,&
2554 : & 0._dp,0._dp,1._dp,0._dp,0._dp,0._dp,0._dp,0._dp,0._dp,0._dp,&
2555 : & 0._dp,0._dp,0._dp,1._dp,0._dp,0._dp,0._dp,0._dp,0._dp,0._dp,&
2556 : & 0._dp,0._dp,0._dp,0._dp,1._dp,0._dp,0._dp,0._dp,0._dp,0._dp,&
2557 : & 0._dp,0._dp,0._dp,0._dp,0._dp,1._dp,0._dp,0._dp,0._dp,0._dp,&
2558 : & 0._dp,0._dp,0._dp,0._dp,0._dp,0._dp,1._dp,0._dp,0._dp,0._dp,&
2559 : & 0._dp,0._dp,0._dp,0._dp,0._dp,0._dp,0._dp,1._dp,0._dp,0._dp,&
2560 : & 0._dp,0._dp,0._dp,0._dp,0._dp,0._dp,0._dp,0._dp,1._dp,0._dp,&
2561 0 : & 0._dp,0._dp,0._dp,0._dp,0._dp,0._dp,0._dp,0._dp,0._dp,1._dp/),(/10,10/))
2562 0 : bpp(0,:,:)=b2pp(:,:)
2563 : b2pp(:,:)=RESHAPE((/ 49._dp, 98._dp, 98._dp, 0._dp, 30._dp, 36._dp, 27._dp, 12._dp, 0._dp, 0._dp,&
2564 : & 98._dp, 49._dp, 0._dp, 98._dp, 40._dp, 2._dp, 6._dp, 25._dp, 32._dp, 0._dp,&
2565 : & 98._dp, 0._dp, 49._dp, 98._dp, 0._dp, 32._dp, 25._dp, 6._dp, 2._dp, 40._dp,&
2566 : & 0._dp, 98._dp, 98._dp, 49._dp, 0._dp, 0._dp, 12._dp, 27._dp, 36._dp, 30._dp,&
2567 : & 30._dp, 40._dp, 0._dp, 0._dp,100._dp,120._dp, 60._dp, 0._dp, 0._dp, 0._dp,&
2568 : & 36._dp, 2._dp, 32._dp, 0._dp,120._dp, 4._dp, 48._dp,108._dp, 0._dp, 0._dp,&
2569 : & 27._dp, 6._dp, 25._dp, 12._dp, 60._dp, 48._dp, 64._dp, 0._dp,108._dp, 0._dp,&
2570 : & 12._dp, 25._dp, 6._dp, 27._dp, 0._dp,108._dp, 0._dp, 64._dp, 48._dp, 60._dp,&
2571 : & 0._dp, 32._dp, 2._dp, 36._dp, 0._dp, 0._dp,108._dp, 48._dp, 4._dp,120._dp,&
2572 0 : & 0._dp, 0._dp, 40._dp, 30._dp, 0._dp, 0._dp, 0._dp, 60._dp,120._dp,100._dp/),(/10,10/))
2573 0 : bpp(1,:,:)=b2pp(:,:)/1225._dp
2574 0 : write(std_out,*) "warning: this test is only valid if f4of2_sla=0"
2575 : end if ! lcor=2
2576 0 : if (lcor == 3) then
2577 : ! app(0,:,:)=one
2578 : ! a2pp(:,:)=RESHAPE((/ 100.0/1225.0 ,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&
2579 : !& 0 ,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&
2580 : !& 0 ,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&
2581 : !& 0 ,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&
2582 : !& 0 ,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&
2583 : !& 0 ,0, 0, 0, 0, 100.0/1225.0, 0, 0, 0, 0, 0, 0, 0, 0,&
2584 : !& 0 ,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&
2585 : !& 0 ,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&
2586 : !& 0 ,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&
2587 : !& 0 ,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,&
2588 : !& 0 ,0, 1,-1,-1, 1, 0, 0, 0, 0, 0, 0, 0, 0,&
2589 : !& 0 ,0,-1, 1, 1,-1, 0, 0, 0, 0, 0, 0, 0, 0,&
2590 : !& 0 ,0,-1, 1, 1,-1, 0, 0, 0, 0, 0, 0, 0, 0,&
2591 : !& 0 ,0, 1,-1,-1, 1, 0, 0, 0, 0, 0, 0, 0, 0,&/),(/14,14/))
2592 : b2pp(:,:)=RESHAPE((/ 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,&
2593 : & 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,&
2594 : & 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,&
2595 : & 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,&
2596 : & 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,&
2597 : & 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,&
2598 : & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,&
2599 : & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,&
2600 : & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0,&
2601 : & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0,&
2602 : & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0,&
2603 : & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0,&
2604 : & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0,&
2605 0 : & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0/),(/14,14/))
2606 0 : bpp(0,:,:)=b2pp(:,:)
2607 : b2pp(:,:)=RESHAPE((/100.0, 120.0, 60.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,&
2608 : & 120.0, 4.0, 48.0, 108.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,&
2609 : & 60.0, 48.0, 64.0, 0.0, 108.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,&
2610 : & 0.0, 108.0, 0.0, 64.0, 48.0, 60.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,&
2611 : & 0.0, 0.0, 108.0, 48.0, 4.0, 120.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,&
2612 : & 0.0, 0.0, 0.0, 60.0, 120.0, 100.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,&
2613 : & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,&
2614 : & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,&
2615 : & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,&
2616 : & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,&
2617 : & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,&
2618 : & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,&
2619 : & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,&
2620 0 : & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0/),(/14,14/))
2621 0 : bpp(1,:,:)=b2pp(:,:)/1225._dp
2622 0 : write(std_out,*) "warning: only 5/2 5/2 elements are given and only for exchange and F2 !"
2623 : ! app(1,:,:)=a2pp(:,:)
2624 : ! app(1,:,:)=app(1,:,:)/25
2625 : !
2626 : ! bpp(0,:,:)=one
2627 : ! b2pp(:,:)=RESHAPE((/0,0,1,2,3,4,&
2628 : !& 0,0,4,3,2,1,&
2629 : !& 1,4,1,2,2,0,&
2630 : !& 2,3,2,1,0,2,&
2631 : !& 3,2,2,0,1,2,&
2632 : !& 4,1,0,2,2,1 /),(/6,6/))
2633 : ! bpp(1,:,:)=b2pp(:,:)
2634 : ! bpp(1,:,:)=bpp(1,:,:)/25
2635 : end if ! lcor=3
2636 :
2637 0 : do m2=1,tndim
2638 0 : do m1=1,tndim
2639 0 : udens(m1,m2) = sum(fk(:)*app(:,m1,m2))
2640 0 : jdens(m1,m2) = sum(fk(:)*bpp(:,m1,m2))
2641 : !write(6,*) kk,m1,m2
2642 : !write(6,*) "--",fk(kk),aklmlmp(kk,m1,m2)
2643 : !write(6,*) "--",fk(kk),bklmlmp(kk,m1,m2)
2644 : !udens(m1,m2)=udens(m1,m2)+fk(kk)*app(kk,m1,m2)
2645 : !jdens(m1,m2)=jdens(m1,m2)+fk(kk)*bpp(kk,m1,m2)
2646 : end do ! m1
2647 : end do ! m2
2648 0 : write(message,'(2x,a,3x,14f10.4)') " Direct Interaction Matrix from Inglis tables (in the JMJ basis) "
2649 0 : call wrtout(std_out,message,'COLL')
2650 0 : write(message,'(2x,4x,14(2x,i8))') (m1,m1=1,tndim,1)
2651 0 : call wrtout(std_out,message,'COLL')
2652 0 : do m1=1,tndim
2653 0 : write(message,'(2x,i4,3x,14f10.4)') m1,(udens(m1,m2),m2=1,tndim,1)
2654 0 : call wrtout(std_out,message,'COLL')
2655 : end do ! m1
2656 :
2657 0 : write(message,'(a,2x,a,3x,14f10.4)') ch10," Exchange Interaction Matrix from Inglis tables (in the JMJ basis) "
2658 0 : call wrtout(std_out,message,'COLL')
2659 0 : write(message,'(2x,4x,14(2x,i8))') (m1,m1=1,tndim,1)
2660 0 : call wrtout(std_out,message,'COLL')
2661 0 : do m1=1,tndim
2662 0 : write(message,'(2x,i4,3x,14f10.4)') m1,(jdens(m1,m2),m2=1,tndim,1)
2663 0 : call wrtout(std_out,message,'COLL')
2664 : end do ! m1
2665 :
2666 0 : write(message,'(a,2x,a,3x,14f10.4)') ch10, " Density Density interactions from Inglis tables (in the JMJ basis) "
2667 0 : call wrtout(std_out,message,'COLL')
2668 0 : write(message,'(2x,4x,14(2x,i8))') (m1,m1=1,tndim,1)
2669 0 : call wrtout(std_out,message,'COLL')
2670 0 : do m1=1,tndim
2671 0 : write(message,'(2x,i4,3x,14f10.4)') m1,(udens(m1,m2)-jdens(m1,m2),m2=1,tndim,1)
2672 0 : call wrtout(std_out,message,'COLL')
2673 : end do ! m1
2674 :
2675 :
2676 0 : ABI_FREE(jdens)
2677 0 : ABI_FREE(udens)
2678 0 : ABI_FREE(app)
2679 0 : ABI_FREE(bpp)
2680 0 : ABI_FREE(a2pp)
2681 0 : ABI_FREE(b2pp)
2682 :
2683 0 : end subroutine udens_inglis_hu
2684 : !!***
2685 :
2686 0 : END MODULE m_hu
2687 : !!***
|