Branch data 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 : : !!***
|