Line data Source code
1 : !!****m* ABINIT/m_calc_ucrpa
2 : !! NAME
3 : !! m_calc_ucrpa
4 : !!
5 : !! FUNCTION
6 : !! Calculate the effective interaction in the correlated orbitals
7 : !!
8 : !! COPYRIGHT
9 : !! Copyright (C) 2006-2026 ABINIT group (BAmadon,ROuterovitch)
10 : !! This file is distributed under the terms of the
11 : !! GNU General Public License, see ~abinit/COPYING
12 : !! or http://www.gnu.org/copyleft/gpl.txt .
13 : !!
14 : !! INPUTS
15 : !!
16 : !! OUTPUT
17 : !!
18 : !! SOURCE
19 :
20 : #if defined HAVE_CONFIG_H
21 : #include "config.h"
22 : #endif
23 :
24 :
25 : #include "abi_common.h"
26 :
27 : MODULE m_calc_ucrpa
28 :
29 : #ifndef HAVE_CRPA_OPTIM
30 : #ifdef FC_INTEL
31 : #warning "optimization of m_calc_ucrpa is deactivated on intel fortran"
32 : !DEC$ NOOPTIMIZE
33 : #endif
34 : #endif
35 :
36 : use defs_basis
37 : implicit none
38 :
39 : private
40 :
41 : public :: calc_ucrpa
42 : !!***
43 :
44 : contains
45 : !!****f* ABINIT/calc_ucrpa
46 : !! NAME
47 : !! calc_ucrpa
48 : !!
49 : !! FUNCTION
50 : !! Calculate the effective interaction in the correlated orbitals
51 : !!
52 : !! COPYRIGHT
53 : !! Copyright (C) 1999-2026 ABINIT group (TApplencourt,BA)
54 : !! This file is distributed under the terms of the
55 : !! GNU General Public License, see ~abinit/COPYING
56 : !! or http://www.gnu.org/copyleft/gpl.txt .
57 : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt .
58 : !!
59 : !! INPUTS
60 : !! npwe : number of plane wave for the dielectric constant
61 : !! npw : number of plane wave
62 : !! nomega : number of frequencis
63 : !! bandinf,bandsup : kohn sham band
64 : !! optimisation : string for the optimisation
65 : !! Wfd:: MPI communicator
66 : !! mesh <kmesh_t>
67 : !! %nbz=Number of points in the BZ
68 : !! %nibz=Number of points in IBZ
69 : !! %kibz(,nibz)=k-point coordinates, irreducible Brillouin zone
70 : !! %kbz(3,nbz)=k-point coordinates, full Brillouin zone
71 : !! %ktab(nbz)= table giving for each k-point in the BZ (kBZ), the corresponding
72 : !! %ktabi(nbz)= for each k-point in the BZ defines whether inversion has to be considered
73 : !! %ktabp(nbz)= phase factor associated to tnons
74 : !! M1_q_m(bandinf:bandsup,bandinf:bandsup,npw,Qmesh%nibz): Oscillator strengh in Wannier basis
75 : !! rhot1_q_m(bandinf:bandsup,bandinf:bandsup,npw,Qmesh%nibz): Oscillator strengh
76 : !! multiplied by coulomb potential in Wannier basis
77 : !! OUTPUT
78 : !!
79 : !! NOTES
80 : !!
81 : !! SOURCE
82 :
83 0 : subroutine calc_ucrpa(itypatcor,cryst,Kmesh,lpawu,M1_q_m,Qmesh,npwe,&
84 0 : & npw,nsym,nomega,omegamin,omegamax,bandinf,bandsup,optimisation,ucvol,Wfd,fname,plowan_compute,rhot1,wanbz)
85 :
86 : use defs_basis
87 : use m_abicore
88 : use m_xmpi
89 : use m_errors
90 :
91 : use m_io_tools, only : open_file
92 : use m_wfd, only : wfd_t
93 : use m_io_screening, only : read_screening, em1_ncname
94 : use m_bz_mesh, only : kmesh_t
95 : use m_crystal, only : crystal_t
96 : use m_plowannier, only : operwan_realspace_type,plowannier_type
97 : ! _____ _
98 : ! |_ _| | |
99 : ! | | _ __ _ __ _ _| |_
100 : ! | | | '_ \| '_ \| | | | __|
101 : ! _| |_| | | | |_) | |_| | |_
102 : ! |_____|_| |_| .__/ \__,_|\__|
103 : ! | |
104 : ! |_|
105 :
106 : !Arguments ------------------------------------
107 : integer, intent(in) :: itypatcor,lpawu,npw,npwe,nsym
108 : integer, intent(in) :: nomega
109 : integer, intent(in) :: bandinf
110 : integer, intent(in) :: bandsup
111 : integer, intent(in) :: plowan_compute
112 : character(len=fnlen), intent(in) :: fname
113 : character(len=*), intent(in) :: optimisation
114 : real(dp), intent(in) :: ucvol,omegamin,omegamax
115 :
116 : class(wfd_t),intent(inout) :: Wfd
117 : type(kmesh_t),intent(in) :: Kmesh,Qmesh
118 : type(crystal_t),intent(in) :: Cryst
119 : type(operwan_realspace_type),intent(in) :: rhot1(npw,Qmesh%nibz)
120 : type(plowannier_type),intent(in) :: wanbz
121 : complex(dp), intent(in) :: M1_q_m(cryst%nattyp(itypatcor),Wfd%nspinor,Wfd%nspinor,2*lpawu+1,2*lpawu+1,npw,Qmesh%nibz)
122 :
123 : !Local variables ------------------------------
124 : !scalars
125 : real(dp) :: x
126 : real(dp) :: t1,t2
127 : real(dp):: tol
128 : complex(dp) :: uu,jj
129 :
130 : complex :: nC,ualter
131 :
132 : integer :: iatom1,iatom2,iatom3,iatom4,pos1,pos2,pos3,pos4,il1,il2,il3,il4,ispin,one_orbital
133 : integer :: im_paral,iqalloc,ib1,ib2,m1,m2,m3,m4,iqibz,mbband1,mbband2,mbband3,mbband4,spin1,spin2
134 : integer :: ierr,ik_bz,ik_ibz,iq_ibz,i,iG1,iG2,iG,iiG,iomega,iomega1,ispinor1,ispinor2,ispinor3,ispinor4
135 : integer :: lpawu_read,nkibz,nbband,nkbz,nprocs,nqalloc,nqibz,ms1,ms2,ms3,ms4,mbband,nspinor
136 : integer :: isym_kgw,iik,unt, cp_paral
137 : complex(dp) ::ph_mkt,cplx1,cplx2
138 :
139 : logical :: wannier=.TRUE.
140 : logical :: verbose=.FALSE.
141 : logical :: bug=.FALSE.
142 : logical :: lscr_one
143 :
144 : character(len=500) :: message
145 :
146 : !arrays
147 0 : complex(dp), allocatable :: V_m(:,:,:,:)
148 0 : complex(dp), allocatable :: U_m(:,:,:,:)
149 0 : complex(dp),allocatable :: uspin(:,:),jspin(:,:)
150 : ! complex(dp), allocatable :: coeffW_BZ(:,:,:),coeffW_IBZ(:,:,:)
151 0 : complex(dp), allocatable :: rhot_q_m1m3(:,:,:,:,:,:),rhot_q_m2m4(:,:,:,:,:,:)
152 0 : complex(dp), allocatable :: rhot_q_m1m3_npwe(:,:,:,:,:,:),rhot_q_m2m4_npwe(:,:,:,:,:,:)
153 0 : complex(dp),allocatable :: trrho(:,:),sumrhorhoeps(:)
154 0 : complex(gwp), allocatable :: scr(:,:,:,:)
155 :
156 0 : real(dp),allocatable :: k_coord(:,:)!,k_coordIBZ(:,:)
157 0 : real(dp),allocatable :: q_coord(:,:)
158 0 : real(dp),allocatable:: normG(:)
159 0 : complex(dp),allocatable:: uomega(:),jomega(:)
160 0 : real(dp),allocatable:: omega(:)
161 0 : complex(dp),allocatable:: eiqr(:)
162 :
163 0 : integer,allocatable:: ikmq_bz_t(:,:)
164 :
165 0 : logical,allocatable :: bijection(:)
166 : !************************************************************************
167 :
168 0 : write(message,*) ch10, '==== Calculation of the screened interaction ===='
169 0 : call wrtout(std_out,message,'COLL')
170 0 : call wrtout(ab_out,message,'COLL')
171 0 : write(message,*) ""
172 0 : call wrtout(std_out,message,'COLL')
173 0 : call wrtout(ab_out,message,'COLL')
174 0 : nkbz = Kmesh%nbz
175 0 : nqibz= Qmesh%nibz
176 0 : nspinor=Wfd%nspinor
177 :
178 0 : nbband=1+bandsup-bandinf
179 : ! _ __ ____
180 : ! | |/ / ___ / __ \
181 : ! | ' / ( _ ) | | | |
182 : ! | < / _ \/\ | | | |
183 : ! | . \ | (_> < | |__| |
184 : ! |_|\_\ \___/\/ \___\_\
185 :
186 0 : write(message,*) "Read K and Q mesh"
187 0 : call wrtout(std_out,message,'COLL')
188 0 : call wrtout(ab_out,message,'COLL')
189 :
190 0 : ABI_MALLOC(k_coord,(nkbz,3))
191 0 : ABI_MALLOC(q_coord,(nqibz,4))
192 0 : ABI_MALLOC(eiqr,(nqibz))
193 0 : eiqr=czero
194 : !==Read k and q==!
195 : !open(unit=2012,file='ikbz_COORD',form='formatted',status='unknown')
196 : !read(2012,*) (ik_bz,k_coord(ik_bz,:),i=1,nkbz)
197 : !close(2012)
198 :
199 0 : do ik_bz=1,nkbz
200 0 : call kmesh%get_BZ_item(ik_bz,k_coord(ik_bz,:),ik_ibz,isym_kgw,iik,ph_mkt)
201 : end do
202 :
203 : ! open(unit=2012,file='iqbz_COORD',form='formatted',status='unknown')
204 : ! read(2012,*)
205 0 : do i=1,nqibz
206 : ! read(2012,*) iq_ibz,q_coord(iq_ibz,:)
207 0 : q_coord(i,1)=Qmesh%ibz(1,i)
208 0 : q_coord(i,2)=Qmesh%ibz(2,i)
209 0 : q_coord(i,3)=Qmesh%ibz(3,i)
210 0 : q_coord(i,4)=Qmesh%wt(i)
211 : ! if (iq_ibz > nqibz) then
212 : ! write(message,*) iq_ibz,nqibz," Error on line",i,"Are you in iBZ ?"
213 : ! call wrtout(std_out,message,'COLL')
214 : ! end if
215 : end do
216 : ! close(2012)
217 :
218 : !==Bijection and array for k-q==!
219 0 : ABI_MALLOC(bijection,(nkbz))
220 0 : ABI_MALLOC(ikmq_bz_t,(nkbz,nqibz))
221 0 : bijection(:)=.FALSE.
222 0 : if (nsym==1) then
223 0 : do ik_bz=1,nkbz
224 0 : do iq_ibz=1,nqibz
225 0 : ikmq_bz_t(ik_bz,iq_ibz)=findkmq(ik_bz,k_coord,q_coord(iq_ibz,:),nkbz)
226 0 : if (ikmq_bz_t(ik_bz,iq_ibz)>nkbz.and.nsym==1) then
227 0 : BUG=.TRUE.
228 0 : write(message,*) "No K-Q for K/Q =",ik_bz,iq_ibz
229 0 : ABI_ERROR(message)
230 : end if
231 0 : bijection(ikmq_bz_t(ik_bz,iq_ibz))=.TRUE.
232 : end do
233 :
234 0 : if (count(bijection).NE.nqibz.and.nsym==1) then
235 0 : BUG=.TRUE.
236 0 : write(message,*) 'No bijection ',ik_bz
237 0 : ABI_ERROR(message)
238 : end if
239 :
240 0 : bijection(:)=.FALSE.
241 : end do
242 :
243 0 : if (.NOT.BUG.and.nsym==1) then
244 0 : write(message,*) "Bijection Ok."
245 0 : call wrtout(std_out,message,'COLL')
246 : end if
247 : endif
248 : ! _____
249 : ! / ____|
250 : ! _ __ ___ _ __ _ __ ___ ___ | | __
251 : ! | '_ \ / _ \| '__| '_ ` _ \ / _ \ | | |_ |
252 : ! | | | | (_) | | | | | | | | __/ | |__| |
253 : ! |_| |_|\___/|_| |_| |_| |_|\___| \_____|
254 :
255 0 : ABI_MALLOC(normG,(npw))
256 0 : if (verbose) then
257 0 : write(message,*) 'Read the potential and G norm'
258 0 : call wrtout(std_out,message,'COLL')
259 0 : if (open_file('normeG',message,newunit=unt,form='formatted',status='unknown') /= 0) then
260 0 : ABI_ERROR(message)
261 : end if
262 0 : read(unt,*) (iiG,x,normG(iiG),iG=1,npw)
263 0 : close(unt)
264 : !!False norme for G=0 idd G is the inverse of the potential inverse du potentiel (q=0)
265 0 : normG(1)=0
266 : end if
267 :
268 : !========================================================================
269 : !------------------------------------------------------------------------
270 :
271 : ! FIRST PART OF THE ROUTINE: USE M_G^(nn')(q,k) to do formal checks.
272 : ! USE rhot_q_n to do compute bare interaction
273 :
274 : !------------------------------------------------------------------------
275 : !========================================================================
276 :
277 : ! _
278 : ! ( )
279 : ! _ __ ___ _ __ _ __ |/
280 : ! | '_ ` _ \ | '_ \| '_ \
281 : ! | | | | | | | | | | | | |
282 : ! |_| |_| |_| |_| |_|_| |_|
283 :
284 : !==========================================================
285 : !==========================================================
286 : ! tol=1E-1
287 : ! tolerance for the normalization of wfc: should be around 0.01.
288 0 : tol = 1 ! very large for test.
289 0 : write(message,*) 'Check the norm of M'
290 0 : call wrtout(std_out,message,'COLL')
291 0 : write(message,*) 'Tolerance :',tol
292 0 : call wrtout(std_out,message,'COLL')
293 : ! __ __
294 : ! \ \ / /
295 : ! \ \ / / _ __
296 : ! \ \/ / | '_ \
297 : ! \ / | | | |
298 : ! \/ |_| |_|
299 : !==========================================================================
300 : !==Compute V_{n,n'}: bare interaction in the KS basis <- rhot_q_n -> V_n
301 : !==========================================================================
302 : !==========================================================
303 : !==Compute V_{n,n'}
304 : !==========================================================
305 0 : if(verbose) then
306 0 : write(message,*) ""
307 0 : call wrtout(std_out,message,'COLL')
308 0 : call wrtout(ab_out,message,'COLL')
309 0 : write(message,*) "==Calcul of the bare kohn-sham interaction V n=="
310 0 : call wrtout(std_out,message,'COLL')
311 : endif
312 0 : tol=1E+1
313 :
314 0 : if (.NOT.wannier) RETURN
315 :
316 : !========================================================================
317 : !------------------------------------------------------------------------
318 :
319 : ! SECOND PART OF THE ROUTINE: Read Wannier projections
320 :
321 : !------------------------------------------------------------------------
322 : !========================================================================
323 : !
324 : ! \ \ / / (_)
325 : ! \ \ /\ / /_ _ _ __ _ __ _ ___ _ __
326 : ! \ \/ \/ / _` | '_ \| '_ \| |/ _ \ '__|
327 : ! \ /\ / (_| | | | | | | | | __/ |
328 : ! \/ \/ \__,_|_| |_|_| |_|_|\___|_|
329 :
330 : !==========================================================
331 : !==========================================================
332 : !== Read Wannier coefficient in forlb.ovlp
333 : !==========================================================
334 0 : nkibz=Kmesh%nibz
335 :
336 : !Read "l"
337 0 : if (plowan_compute<10) then
338 0 : write(message,*) ""
339 0 : call wrtout(std_out,message,'COLL')
340 0 : call wrtout(ab_out,message,'COLL')
341 0 : write(message,*) "Read wannier in iBZ"
342 0 : call wrtout(ab_out,message,'COLL')
343 0 : call wrtout(std_out,message,'COLL')
344 0 : if (open_file('forlb.ovlp',message,newunit=unt,form='formatted',status='unknown') /= 0) then
345 0 : ABI_ERROR(message)
346 : end if
347 0 : rewind(unt)
348 0 : read(unt,*) message
349 0 : read(unt,*) message, lpawu_read
350 0 : read(unt,*) message, ib1, ib2
351 0 : close(unt)
352 0 : mbband=2*lpawu_read+1
353 : else
354 0 : ib1=wanbz%bandi_wan
355 0 : ib2=wanbz%bandf_wan
356 0 : mbband=2*wanbz%latom_wan(1)%lcalc(1)+1
357 0 : write(message,*)"Read l and bands from wanbz",ib1,ib2,mbband
358 0 : call wrtout(ab_out,message,'COLL')
359 0 : call wrtout(std_out,message,'COLL')
360 : endif
361 0 : if(ib1/=bandinf.and.ib2/=bandsup) then
362 0 : write(message,*) "Error with bands",ib1,bandinf,ib2,bandsup
363 0 : ABI_ERROR(message)
364 : endif
365 : !!Read the bandinf, bandinf redondance information
366 :
367 :
368 : !*******************************************************
369 : !if (3==4) then
370 : !! USELESS START
371 : !!*******************************************************
372 : ! ABI_MALLOC(coeffW_IBZ,(bandinf:bandsup,nkibz,mbband))
373 : ! coeffW_IBZ=czero
374 : !
375 : !
376 : ! if(Wfd%my_rank==0) then
377 : ! do ik_ibz=1,nkibz
378 : ! !read k
379 : ! read(2012,*)
380 : ! do iband=bandinf,bandsup
381 : ! !read band
382 : ! read(2012,*)
383 : ! !read projection
384 : ! do m1=1,mbband
385 : ! read(2012,*) binR,binR,binR,x,y
386 : ! !write(message,*) binR,binR,binR,x,y
387 : ! coeffW_IBZ(iband,ik_ibz,m1)=cmplx(x,y)
388 : ! end do
389 : ! end do
390 : ! end do
391 : ! endif
392 : ! call xmpi_barrier(Wfd%comm)
393 : ! call xcast_mpi(coeffW_IBZ,0,Wfd%comm,ierr)
394 : ! call xmpi_barrier(Wfd%comm)
395 : ! close(2012)
396 : !
397 : ! ABI_MALLOC(coeffW_BZ,(bandinf:bandsup,nkbz,mbband))
398 : !
399 : ! if (nkbz==nkibz) then
400 : ! coeffW_BZ=coeffW_IBZ
401 : ! else
402 : ! write(message,*) "Reconstruct in full BZ"
403 : ! call wrtout(std_out,message,'COLL')
404 : ! call wrtout(ab_out,message,'COLL')
405 : ! ABI_MALLOC(k_coordIBZ,(nkibz,3))
406 : !
407 : !! k_coordIBZ(:,:)=q_coord(:,1:3)
408 : !
409 : ! bijection(:)=.FALSE.
410 : ! write(message,*) "Indice in iBZ | Indice in BZ | Inverse in BZ"
411 : ! call wrtout(std_out,message,'COLL')
412 : ! do ik_bz=1,Kmesh%nbz
413 : ! write(6,*) "ik",ik_bz,Kmesh%tab(ik_bz),Kmesh%tabi(ik_bz),Kmesh%tabo(ik_bz)
414 : ! if(Kmesh%tabi(ik_bz)==1) then
415 : ! coeffW_BZ(:,ik_bz,:)=coeffW_IBZ(:,Kmesh%tab(ik_bz),:)
416 : ! bijection(ik_bz)=.TRUE.
417 : ! else if(Kmesh%tabi(ik_bz)==-1) then
418 : ! coeffW_BZ(:,ik_bz,:)=conjg(coeffW_IBZ(:,Kmesh%tab(ik_bz),:))
419 : ! write(message,*) Kmesh%tab(ik_bz),ik_bz
420 : ! inverse_ik_bz=Kmesh%tab(ik_bz)
421 : ! bijection(ik_bz)=.TRUE.
422 : !! bijection(inverse_ik_bz)=.TRUE.
423 : ! endif
424 : ! enddo
425 : !
426 : ! if (count(bijection).NE.nkbz) then
427 : ! BUG=.TRUE.
428 : ! write(message,*) 'Miss somme K point for the Wannier',count(bijection),"/",nkbz
429 : ! ABI_ERROR(message)
430 : ! end if
431 : !
432 : ! if (.NOT.BUG) then
433 : ! write(message,*) "Reconstruction Success"
434 : ! call wrtout(std_out,message,'COLL')
435 : ! call wrtout(ab_out,message,'COLL')
436 : ! end if
437 : ! ABI_FREE(k_coordIBZ)
438 : ! end if
439 : !
440 : ! ABI_FREE(coeffW_IBZ)
441 : !
442 : ! wk=1.0/nkbz
443 : !
444 : ! write(message,*) 'Orthogonality check'
445 : ! call wrtout(std_out,message,'COLL')
446 : ! write(message,*) 'Sum on all the k point ,on all the Kohn-Sham band of C_(m1)*C_m(2)'
447 : ! call wrtout(std_out,message,'COLL')
448 : !
449 : !! tolerance for the sum over k-points of the Wannier functions (orthogonality)
450 : ! tol=1E-5
451 : !
452 : !! Sum for one k-point (should be around 0.1).
453 : ! tol2=10E0
454 : !
455 : ! write(message,*) 'Tolerance : k',tol2,'m',tol
456 : ! call wrtout(std_out,message,'COLL')
457 : !
458 : !
459 : ! ! Here checks on Wannier coeff are done (ortho, norm..)
460 : ! nC=cmplx(0,0)
461 : ! BUG=.FALSE.
462 : !
463 : ! do m1=1,mbband
464 : ! do m2=1,mbband
465 : ! do ik_bz=1,nkbz
466 : ! nCt=sum(conjg(coeffW_BZ(:,ik_bz,m1))*coeffW_BZ(:,ik_bz,m2))
467 : ! if ( ((m1==m2).and.(abs(abs(ncT)-1)>tol2)).OR.&
468 : ! ((m1.NE.m2).and.(abs(ncT)>tol2)) ) then
469 : ! BUG=.TRUE.
470 : ! write(message,*) "No orthogonality for m1,m2",m1,m2,"kpt",ik_bz,abs(nCt)
471 : ! ABI_ERROR(message)
472 : ! end if
473 : ! nC=nC+wk*nCt
474 : ! end do
475 : !
476 : ! if ( ((m1==m2).and.(abs(abs(nC)-1)>tol)).OR.&
477 : ! ((m1.NE.m2).and.(abs(nC)>tol)) ) then
478 : ! bug=.TRUE.
479 : ! write(message,*) "No orthogonality for",m1,m2,abs(nC)
480 : ! ABI_ERROR(message)
481 : ! end if
482 : ! write(message,*) m1,m2,abs(nC)
483 : ! nC=cmplx(0,0)
484 : ! end do
485 : ! end do
486 : ! if (.NOT.bug) then
487 : ! write(message,*) "Orthogonality check"
488 : ! call wrtout(std_out,message,'COLL')
489 : ! end if
490 : !
491 : !!*******************************************************
492 : !end if
493 : ! USELESS END
494 : !*******************************************************
495 :
496 : ! do iq_ibz=1,nqibz
497 : ! do m1=1,mbband
498 : ! do m2=1,mbband
499 : ! write(6,*) "M1_q_m",M1_q_m(m1,m2,1,iq_ibz)
500 : ! end do
501 : ! end do
502 : ! end do
503 :
504 : if(real(M1_q_m(1,1,1,1,1,1,1))>0) then
505 : endif
506 :
507 : ! _
508 : ! ( )
509 : ! _ __ ___ _ __ ___ _ __ ___ |/
510 : ! | '_ ` _ \ | '_ ` _ \| '_ ` _ \
511 : ! | | | | | | | | | | | | | | | | |
512 : ! |_| |_| |_| |_| |_| |_|_| |_| |_|
513 :
514 :
515 : !!!==Calculation of M_G^(mm')(q)==!
516 :
517 0 : write(message,*) 'Calculation of M m'
518 0 : call wrtout(std_out,message,'COLL')
519 :
520 : !=================================================================!
521 : !==Compute V_{m,m'}(q,z): Oscillator strengh in the Wannier basis
522 : !=================================================================!
523 :
524 : ! Sum over k-points for the oscillator strengh in the Wannier basis
525 :
526 : if (verbose) then
527 : ! call Sauvegarde_M_q_m(M1_q_m,normG,nqibz,npw,mbband)
528 : end if
529 :
530 : ! write(message,*) "M1_q_m,m for iG=53 and iq=8"
531 : ! call wrtout(std_out,message,'COLL')
532 :
533 : ! _ _
534 : ! | | ( )
535 : ! _ __| |__ ___ _ __ ___ _ __ ___ |/
536 : ! | '__| '_ \ / _ \ | '_ ` _ \| '_ ` _ \
537 : ! | | | | | | (_) | | | | | | | | | | | |
538 : ! |_| |_| |_|\___/ |_| |_| |_|_| |_| |_|
539 :
540 0 : write(message,*) ""
541 0 : call wrtout(std_out,message,'COLL')
542 0 : call wrtout(ab_out,message,'COLL')
543 : !==Calcul de Ro_G^(mm')(q)==!
544 0 : write(message,*) 'Calculation of rhotwilde m'
545 0 : call wrtout(std_out,message,'COLL')
546 :
547 : !===============================================================!
548 : !===============================================================!
549 : !==Compute V_{m,m'}(q,z): bare interaction in the Wannier basis
550 : !===============================================================!
551 : !===============================================================!
552 0 : ABI_FREE(ikmq_bz_t)
553 :
554 : !ABI_MALLOC(rhot_q_m,(nspinor,nspinor,mbband,mbband,npw,nqibz))
555 :
556 : ! if (plowan_compute>=10)then
557 : ! write(message,*)" cRPA calculation using plowan module"
558 : ! call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
559 : ! do iG=1,npw
560 : ! do iqibz=1,nqibz
561 : ! do ispinor1=1,nspinor
562 : ! do ispinor2=1,nspinor
563 : ! do m1=1,2*wanbz%latom_wan(1)%lcalc(1)+1
564 : ! do m2=1,2*wanbz%latom_wan(1)%lcalc(1)+1
565 : ! rhot_q_m(ispinor1,ispinor2,m1,m2,iG,iqibz)=&
566 : ! &rhot1(iG,iqibz)%atom_index(1,1)%position(1,1)%atom(1,1)%matl(m1,m2,1,ispinor1,ispinor2)
567 : ! !write(6,*) rhot_q_m(ispinor1,ispinor2,m1,m2,iG,iqbz)
568 : ! enddo
569 : ! enddo
570 : ! enddo
571 : ! enddo
572 : ! enddo
573 : ! enddo
574 : ! endif
575 0 : do iatom1=1,wanbz%natom_wan
576 0 : do iatom2=1,wanbz%natom_wan
577 0 : do iatom3=1,wanbz%natom_wan
578 0 : do iatom4=1,wanbz%natom_wan
579 0 : if (iatom1/=iatom3 .or. iatom2/=iatom4)cycle
580 0 : do pos1=1,size(wanbz%nposition(iatom1)%pos,1)
581 0 : do pos2=1,size(wanbz%nposition(iatom2)%pos,1)
582 0 : do pos3=1,size(wanbz%nposition(iatom3)%pos,1)
583 0 : do pos4=1,size(wanbz%nposition(iatom4)%pos,1)
584 0 : if (pos1/=pos3 .or. pos2/=pos4)cycle
585 0 : do il1=1,wanbz%nbl_atom_wan(iatom1)
586 0 : do il2=1,wanbz%nbl_atom_wan(iatom2)
587 0 : do il3=1,wanbz%nbl_atom_wan(iatom3)
588 0 : do il4=1,wanbz%nbl_atom_wan(iatom4)
589 0 : if(il1/=il3 .or. il2/=il4)cycle
590 0 : if (wanbz%nsppol/=1)then
591 0 : ABI_MALLOC(uspin,(4,nomega))
592 0 : ABI_MALLOC(jspin,(4,nomega))
593 : endif
594 0 : if (iatom1==iatom2 .and. pos1==pos2 .and. il1 == il2)then
595 0 : one_orbital=1
596 : else
597 0 : one_orbital=0
598 : endif
599 0 : ABI_MALLOC(omega,(nomega))
600 0 : do spin1=1,wanbz%nsppol
601 0 : do spin2=1,wanbz%nsppol
602 0 : cp_paral=0
603 0 : mbband1=2*wanbz%latom_wan(iatom1)%lcalc(il1)+1
604 0 : mbband2=2*wanbz%latom_wan(iatom2)%lcalc(il2)+1
605 0 : mbband3=2*wanbz%latom_wan(iatom3)%lcalc(il3)+1
606 0 : mbband4=2*wanbz%latom_wan(iatom4)%lcalc(il4)+1
607 0 : ABI_MALLOC(rhot_q_m1m3,(npw,nqibz,mbband1,mbband3,nspinor,nspinor))
608 0 : ABI_MALLOC(rhot_q_m2m4,(npw,nqibz,mbband2,mbband4,nspinor,nspinor))
609 0 : rhot_q_m1m3=czero
610 0 : rhot_q_m2m4=czero
611 0 : do ispinor1=1,wanbz%nspinor
612 0 : do ispinor2=1,wanbz%nspinor
613 0 : do ispinor3=1,wanbz%nspinor
614 0 : do ispinor4=1,wanbz%nspinor
615 0 : do m1=1,mbband1
616 0 : do m2=1,mbband2
617 0 : do m3=1,mbband3
618 0 : do m4=1,mbband4
619 0 : do iqibz=1,nqibz
620 : !Loig Vaugier PhD eq. 5.15
621 : eiqr(iqibz)=exp(cmplx(0.0, 1.0 ) * two_pi * ( &
622 : q_coord(iqibz,1)* ( cryst%xred(1,wanbz%iatom_wan(iatom3)) - cryst%xred(1,wanbz%iatom_wan(iatom2)) )+ &
623 : q_coord(iqibz,2)* ( cryst%xred(2,wanbz%iatom_wan(iatom3)) - cryst%xred(2,wanbz%iatom_wan(iatom2)) )+ &
624 0 : q_coord(iqibz,3)* ( cryst%xred(3,wanbz%iatom_wan(iatom3)) - cryst%xred(3,wanbz%iatom_wan(iatom2)) )))
625 0 : do iG=1,npw
626 : ! cp_paral=cp_paral+1
627 : ! if(mod(cp_paral-1,nprocs)==Wfd%my_rank) then
628 0 : cplx1=rhot1(iG,iqibz)%atom_index(iatom1,iatom3)%position(pos1,pos3)%atom(il1,il3)%matl(m1,m3,spin1,ispinor1,ispinor3)
629 0 : rhot_q_m1m3(iG,iqibz,m1,m3,ispinor1,ispinor3)=cplx1
630 :
631 0 : cplx2=rhot1(iG,iqibz)%atom_index(iatom2,iatom4)%position(pos2,pos4)%atom(il2,il4)%matl(m2,m4,spin2,ispinor2,ispinor4)
632 0 : rhot_q_m2m4(iG,iqibz,m2,m4,ispinor2,ispinor4)=cplx2
633 :
634 : !endif
635 : enddo!iG
636 : enddo!iqibz
637 : enddo!m4
638 : enddo!m3
639 : enddo!m2
640 : enddo!m1
641 : enddo!ispinor4
642 : enddo!ispinor3
643 : enddo!ispinor2
644 : enddo!ispinor1
645 : ! call xmpi_barrier(Wfd%comm) ! First make sure that all processors are here
646 : ! call xmpi_sum(rhot_q_m1m3,Wfd%comm,ierr)
647 : ! call xmpi_sum(rhot_q_m2m4,Wfd%comm,ierr)
648 : ! call xmpi_barrier(Wfd%comm) ! First make sure that all processors are here
649 :
650 : ! __ __
651 : ! \ \ / /
652 : ! \ \ / / _ __ ___
653 : ! \ \/ / | '_ ` _ \
654 : ! \ / | | | | | |
655 : ! \/ |_| |_| |_|
656 :
657 :
658 0 : ABI_MALLOC(V_m,(mbband1*nspinor,mbband2*nspinor,mbband3*nspinor,mbband4*nspinor))
659 0 : write(message,*) "";call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
660 0 : write(message,*) "==Calculation of the bare interaction V m=="
661 0 : call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
662 :
663 0 : call print_orbitals(spin1,spin2,iatom1,iatom2,iatom3,iatom4,pos1,pos2,pos3,pos4,il1,il2,il3,il4,wanbz,1)
664 0 : V_m=czero
665 0 : call cpu_time ( t1 )
666 0 : im_paral=0
667 0 : nprocs = xmpi_comm_size(Wfd%comm)
668 :
669 :
670 :
671 :
672 :
673 :
674 0 : do ispinor1=1,nspinor
675 0 : do ispinor2=1,nspinor
676 0 : do ispinor3=1,nspinor
677 0 : do ispinor4=1,nspinor
678 0 : do m1=1,mbband1
679 0 : do m2=1,mbband2
680 0 : do m3=1,mbband3
681 0 : do m4=1,mbband4
682 0 : ms1=m1+(ispinor1-1)*mbband1
683 0 : ms2=m2+(ispinor2-1)*mbband2
684 0 : ms3=m3+(ispinor3-1)*mbband3
685 0 : ms4=m4+(ispinor4-1)*mbband4
686 0 : im_paral=im_paral+1
687 0 : if(mod(im_paral-1,nprocs)==Wfd%my_rank) then
688 : !!somme interne sur iG, puis somme externe sur iq_ibz
689 : !! Sum_(iq_ibz) wi(iq_ibz)*Sum_ig Rho(m3,m1,iG,iq)cong*Rho(m2,m4,ig,iq)
690 : V_m(ms1,ms2,ms3,ms4)=sum(eiqr(:)*q_coord(:,4)*sum(conjg(rhot_q_m1m3(:,:,m3,m1,ispinor3,ispinor1))* &
691 0 : &rhot_q_m2m4(:,:,m2,m4,ispinor2,ispinor4),dim = 1))*Ha_eV/(ucvol)
692 : !end do
693 : endif!paral
694 : end do!m4
695 : end do!m3
696 : end do!m2
697 : end do!m1
698 : end do!ispinor4
699 : end do!ispinor3
700 : end do!ispinor2
701 : end do!ispinor1
702 0 : call xmpi_barrier(Wfd%comm) ! First make sure that all processors are here
703 0 : call xmpi_sum(V_m,Wfd%comm,ierr)
704 0 : call xmpi_barrier(Wfd%comm) ! First make sure that all processors are here
705 0 : call cpu_time ( t2 )
706 0 : write(message,*) "in ",t2-t1,"sec"
707 0 : call wrtout(std_out,message,'COLL')
708 : ! !==Check if calculation is correct
709 0 : tol=1E-2
710 :
711 0 : write(message,*) "BARE INTERACTION"
712 0 : call wrtout(std_out,message,'COLL')
713 0 : call checkk(V_m,1,mbband*nspinor,1,0,uu,jj,"bare interaction",mbband1,mbband2,mbband3,mbband4,nspinor,one_orbital)
714 : !call print_U(mbband1,mbband2,mbband3,mbband4,nspinor,V_m)
715 : ! ========================================================================
716 : ! ------------------------------------------------------------------------
717 :
718 : ! THIRD PART OF THE ROUTINE: Read dielectric function
719 :
720 : ! ------------------------------------------------------------------------
721 : ! ========================================================================
722 :
723 : ! _____ _
724 : ! / ____| (_)
725 : ! | (___ ___ _ __ ___ ___ _ __ _ _ __ __ _
726 : ! \___ \ / __| '__/ _ \/ _ \ '_ \| | '_ \ / _` |
727 : ! ____) | (__| | | __/ __/ | | | | | | | (_| |
728 : ! |_____/ \___|_| \___|\___|_| |_|_|_| |_|\__, |
729 : ! __/ |
730 : ! |___/
731 : ! ==========================================================
732 : ! == Read Dielectric Matrix for _SCR file
733 : ! ==========================================================
734 0 : write(message,*) "";call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
735 0 : call wrtout(std_out,message,'COLL')
736 0 : call wrtout(ab_out,message,'COLL')
737 : ! write(message,*) "==Read the dielectric matrix=="
738 : ! call wrtout(ab_out,message,'COLL'); call wrtout(std_out,message,'COLL')
739 :
740 0 : lscr_one=.true.
741 :
742 : ! if symetry is not enabled then a large number of q-point are used
743 : ! and they are read with direct access to avoid having too large
744 : ! memory.
745 : !-------------------------------------------------------------------
746 : if(nsym>1.and..not.lscr_one) nqalloc=nqibz
747 : if(nsym==1.or.lscr_one) nqalloc=1
748 :
749 0 : ABI_MALLOC(scr,(npwe,npwe,nomega,nqalloc))
750 0 : scr=czero
751 : if(nsym>1.and..not.lscr_one) then
752 : write(message,*) "==Read the dielectric matrix=="
753 : call wrtout(ab_out,message,'COLL'); call wrtout(std_out,message,'COLL')
754 : call read_screening(em1_ncname,fname,npwe,nqibz,nomega,scr,IO_MODE_MPI,Wfd%comm)
755 : endif
756 :
757 : ! if (verbose) then
758 : ! open(unit=2211,file='Screening',form='formatted',status='unknown')
759 : ! do iG1=1,npwe
760 : ! do iG2=1,npwe
761 : ! write(2211,*) iG1,iG2,normG(iG1),normG(iG2),abs(scr(iG1,iG2,1,1)),abs(scr(iG1,iG2,2,1))
762 : ! end do
763 : ! end do
764 : ! close(2211)
765 : ! end if
766 : !
767 : if(nsym>1.and..not.lscr_one) then
768 : write(message,*) "Check the hermiticity"
769 : call wrtout(ab_out,message,'COLL')
770 : call wrtout(std_out,message,'COLL')
771 : tol = 1E-2
772 : do iG1=1,npwe
773 : if (modulo(iG1,100).EQ.1) then
774 : write(message,*) iG1,"/",npw
775 : call wrtout(std_out,message,'COLL')
776 : end if
777 : do iG2=iG1,npwe
778 : if (ANY(abs(scr(iG1,iG2,:,:)-scr(iG2,iG1,:,:))>tol)) then
779 : write(message,*) iG1,iG2,"False"
780 : ABI_ERROR(message)
781 : do iomega1=1,nomega
782 : if(abs(scr(iG1,iG2,iomega1,1)-scr(iG2,iG1,iomega1,1))>tol) then
783 : write(message,*) iG1,iG2,"False",scr(iG1,iG2,iomega1,1),scr(iG2,iG1,iomega1,1)
784 : call wrtout(std_out,message,'COLL')
785 : endif
786 : enddo
787 : end if
788 : if(iG1==iG2) then
789 : scr(iG1,iG1,:,:)=scr(iG1,iG1,:,:)-one ! unscreened part of
790 : endif
791 : end do
792 : end do
793 : write(message,*) "Done: Hermiticity of dielectric matrix checked"
794 : call wrtout(std_out,message,'COLL')
795 : call wrtout(ab_out,message,'COLL')
796 : endif
797 :
798 : ! ========================================================================
799 : ! ------------------------------------------------------------------------
800 :
801 : ! FOURTH PART OF THE ROUTINE: Use dielectric function and oscillator
802 : ! strengh in Wannier basis to compute Screened cRPA interactions.
803 :
804 : ! ------------------------------------------------------------------------
805 : ! ========================================================================
806 : ! _ _
807 : ! | | | |
808 : ! | | | | _ __ ___
809 : ! | | | | | '_ ` _ \
810 : ! | |__| | | | | | | |
811 : ! \____/ |_| |_| |_|
812 : !
813 0 : write(message,*) "";call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
814 0 : write(message,*) "== Calculation of the screened interaction on the correlated orbital U m =="
815 0 : call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
816 0 : write(message,*)ch10, " = Start loop over frequency "
817 0 : call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
818 :
819 0 : ABI_MALLOC(U_m,(mbband1*nspinor,mbband2*nspinor,mbband3*nspinor,mbband4*nspinor))
820 0 : ABI_MALLOC(rhot_q_m1m3_npwe,(npwe,nqibz,mbband1,mbband3,nspinor,nspinor))
821 0 : ABI_MALLOC(rhot_q_m2m4_npwe,(npwe,nqibz,mbband2,mbband4,nspinor,nspinor))
822 0 : ABI_MALLOC(trrho,(npwe,nqibz))
823 0 : ABI_MALLOC(sumrhorhoeps,(nqibz))
824 :
825 : ! Following lines are only for debug
826 : !--------------------------------------------
827 0 : trrho(:,:)=czero
828 0 : do iG1=1,npwe
829 0 : rhot_q_m1m3_npwe(iG1,:,:,:,:,:)=rhot_q_m1m3(iG1,:,:,:,:,:)
830 0 : rhot_q_m2m4_npwe(iG1,:,:,:,:,:)=rhot_q_m2m4(iG1,:,:,:,:,:)
831 : enddo
832 : ! do ispinor1=1,nspinor
833 : ! do m1=1,mbband
834 : ! trrho(iG1,:)= trrho(iG1,:)+rhot_q_m(ispinor1,ispinor1,m1,m1,iG1,:)
835 : ! enddo
836 : ! enddo
837 : ! enddo
838 : ! write(6,*) "trrho"
839 : ! do iG1=1,npwe
840 : ! do iq_ibz=1,nqibz
841 : ! write(6,*) iG1,iq_ibz,trrho(iG1,iq_ibz)
842 : ! enddo
843 : ! enddo
844 : ! write(6,*)
845 :
846 : ! Loop over frequencies to compute cRPA U(w)
847 : !--------------------------------------------
848 0 : ABI_MALLOC(uomega,(nomega))
849 0 : ABI_MALLOC(jomega,(nomega))
850 :
851 0 : iomega=1
852 0 : do iomega=1,nomega
853 0 : write(message,'(2a,i4,2a)')ch10, " --- For frequency w =",iomega, " -------------",ch10
854 0 : call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
855 0 : sumrhorhoeps(:)=czero
856 0 : ualter=czero
857 :
858 0 : write(std_out,*) Optimisation
859 0 : U_m=cmplx(0,0)
860 0 : SELECT CASE(trim(Optimisation))
861 : CASE("naif")
862 : CASE("onlyG")
863 : CASE("Gsum2")
864 : CASE("Gsum")
865 : ! write(message,*) "Optimisation on G and sum"
866 : ! call wrtout(std_out,message,'COLL')
867 0 : U_m=cmplx(0,0)
868 0 : nc=cmplx(0,0)
869 0 : im_paral=0
870 0 : call cpu_time ( t1 )
871 0 : nprocs = xmpi_comm_size(Wfd%comm)
872 0 : do iq_ibz=1,nqibz
873 : ! eiqr=exp(cmplx(0.0, 1.0 ) * two_pi * ( &
874 : ! q_coord(iq_ibz,1)* ( cryst%xred(1,wanbz%iatom_wan(iatom3)) - cryst%xred(1,wanbz%iatom_wan(iatom2)) )+ &
875 : ! q_coord(iq_ibz,2)* ( cryst%xred(2,wanbz%iatom_wan(iatom3)) - cryst%xred(2,wanbz%iatom_wan(iatom2)) )+ &
876 : ! q_coord(iq_ibz,3)* ( cryst%xred(3,wanbz%iatom_wan(iatom3)) - cryst%xred(3,wanbz%iatom_wan(iatom2)) )))
877 : if(nsym>1.and..not.lscr_one) iqalloc=iq_ibz
878 : if(nsym==1.or.lscr_one) iqalloc=1
879 : if(nsym==1.or.lscr_one) then
880 : #ifdef HAVE_MPI_IO
881 0 : call read_screening(em1_ncname,fname,npwe,1,nomega,scr,IO_MODE_MPI,Wfd%comm,iqiA=iq_ibz)
882 : #else
883 : call read_screening(em1_ncname,fname,npwe,1,nomega,scr,IO_MODE_FORTRAN,Wfd%comm,iqiA=iq_ibz)
884 : #endif
885 0 : write(message,*) "Check the hermiticity"
886 0 : call wrtout(std_out,message,'COLL')
887 0 : tol = 0.01_dp
888 0 : do iG1=1,npwe
889 0 : if (modulo(iG1,100).EQ.1) then
890 0 : write(message,*) iG1,"/",npw
891 0 : call wrtout(std_out,message,'COLL')
892 : end if
893 0 : do iG2=iG1,npwe
894 0 : if (ANY(abs(scr(iG1,iG2,:,:)-scr(iG2,iG1,:,:))>tol)) then
895 0 : do iomega1=1,nomega
896 0 : if(abs(scr(iG1,iG2,iomega1,1)-scr(iG2,iG1,iomega1,1))>tol) then
897 0 : write(message,*) iG1,iG2,"False",scr(iG1,iG2,iomega1,1),scr(iG2,iG1,iomega1,1)
898 0 : call wrtout(std_out,message,'COLL')
899 : endif
900 : enddo
901 0 : write(message,*) "CHECK THE HERMITICITY"
902 0 : ABI_WARNING(message)
903 : end if
904 0 : if(iG1==iG2) then
905 0 : scr(iG1,iG1,:,:)=scr(iG1,iG1,:,:)-one ! unscreened part of
906 : ! interaction is computed before
907 : ! scr(iG1,iG1,:,:)=one
908 : ! else
909 : ! scr(iG1,iG2,:,:)=zero
910 : endif
911 : end do
912 : end do
913 : endif
914 0 : write(message,*) "Done: Hermiticity of dielectric matrix checked"
915 :
916 : ! do iG1=1,npwe
917 : ! do iG2=1,npwe
918 : ! sumrhorhoeps(iq_ibz)=sumrhorhoeps(iq_ibz)+conjg(trrho(iG1,iq_ibz))*trrho(iG2,iq_ibz)*scr(iG2,iG1,iomega,1)
919 : ! sumrhorhoeps(iq_ibz)=sumrhorhoeps(iq_ibz) + scr(iG2,iG1,iomega,iqalloc)
920 : ! enddo
921 : ! enddo
922 : ! ualter=ualter+sumrhorhoeps(iq_ibz)*q_coord(iq_ibz,4)*Ha_eV/ucvol/(mbband)**2
923 : ! write(6,*) "sumrhorhoeps",iq_ibz,sumrhorhoeps(iq_ibz)
924 : ! write(6,*) "ualter",iq_ibz,ualter
925 0 : do ispinor1=1,nspinor
926 0 : do ispinor2=1,nspinor
927 0 : do ispinor3=1,nspinor
928 0 : do ispinor4=1,nspinor
929 0 : do m1=1,mbband1
930 0 : do m2=1,mbband2
931 0 : do m3=1,mbband3
932 0 : do m4=1,mbband4
933 0 : ms1=m1+(ispinor1-1)*mbband1
934 0 : ms2=m2+(ispinor2-1)*mbband2
935 0 : ms3=m3+(ispinor3-1)*mbband3
936 0 : ms4=m4+(ispinor4-1)*mbband4
937 0 : im_paral=im_paral+1
938 0 : if(mod(im_paral-1,nprocs)==Wfd%my_rank) then
939 : ! sum q sum G1 sum G2 f(G1,q)f(G2,q)G(G1,G2,q)
940 : ! sum q sum G1 f(g1,q) sum G2 f(G2,q)G(G1,G2,q)
941 0 : do iG1=1,npwe
942 : nc=nc+conjg(rhot_q_m1m3_npwe(iG1,iq_ibz,m1,m3,ispinor1,ispinor3))*&
943 0 : &sum(rhot_q_m2m4_npwe(:,iq_ibz,m2,m4,ispinor2,ispinor4)*scr(:,iG1,iomega,iqalloc))
944 : end do
945 :
946 0 : U_m(ms1,ms2,ms3,ms4)=U_m(ms1,ms2,ms3,ms4)+nc*q_coord(iq_ibz,4)*eiqr(iq_ibz)
947 : ! if(m1==1.and.m2==1.and.m3==1.and.m4==1) then
948 : ! write(6,*) "TEST2"
949 : ! write(6,*) iq_ibz,nc
950 : ! write(6,*) q_coord(iq_ibz,4)
951 : ! endif
952 0 : nc=cmplx(0,0)
953 : endif!paral
954 : end do!m4
955 : end do!m3
956 : end do!m2
957 : end do!m1
958 : end do!ispinor4
959 : end do!ispinor3
960 : end do!ispinor2
961 : end do!ispinor1
962 : end do!iq_ibz
963 0 : U_m(:,:,:,:)=U_m(:,:,:,:)*Ha_eV/(ucvol)
964 0 : call xmpi_barrier(Wfd%comm) ! First make sure that all processors are here
965 0 : call xmpi_sum(U_m,Wfd%comm,ierr)
966 0 : call xmpi_barrier(Wfd%comm) ! First make sure that all processors are here
967 0 : call cpu_time ( t2 )
968 0 : write(message,*) "in ",t2-t1, "sec"
969 0 : call wrtout(std_out,message,'COLL')
970 : END SELECT
971 : ! tolerance of the symetry of screened U.
972 0 : tol=1E-2
973 0 : call checkk(U_m,1,mbband*nspinor,0,iomega,uu,jj,"UminusVbare",mbband1,mbband2,mbband3,mbband4,nspinor,one_orbital)
974 0 : U_m=V_m+U_m
975 0 : write(message,*) "UCRPA interaction"
976 0 : call wrtout(std_out,message,'COLL')
977 : call checkk(U_m,1,mbband*nspinor,1,iomega,uomega(iomega),jomega(iomega),&
978 0 : &"cRPA interaction",mbband1,mbband2,mbband3,mbband4,nspinor,one_orbital)
979 0 : if (spin1==1 .and. spin2==1) then
980 : ispin=1
981 0 : else if(spin1==1 .and. spin2==2) then
982 : ispin=2
983 0 : else if (spin1==2 .and. spin2==1)then
984 : ispin=3
985 : else
986 0 : ispin=4
987 : endif
988 0 : if (wanbz%nsppol/=1)then
989 0 : uomega(iomega)=4*uomega(iomega)
990 0 : jomega(iomega)=4*jomega(iomega)
991 0 : uspin(ispin,iomega)=uomega(iomega)
992 0 : jspin(ispin,iomega)=jomega(iomega)
993 : endif
994 : !write(message,*)ch10,"SCREENED INTERACTION"
995 : !call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
996 : !call print_U(mbband1,mbband2,mbband3,mbband4,nspinor,U_m)
997 : enddo
998 :
999 0 : call print_orbitals(spin1,spin2,iatom1,iatom2,iatom3,iatom4,pos1,pos2,pos3,pos4,il1,il2,il3,il4,wanbz,0)
1000 0 : write(message,*)ch10," -------------------------------------------------------------"
1001 0 : call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1002 0 : write(message,*)" Average U and J as a function of frequency "
1003 0 : call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1004 0 : write(message,*)" -------------------------------------------------------------"
1005 0 : call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1006 0 : write(message,*)" omega U(omega) J(omega)"
1007 0 : call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1008 0 : do iomega=1,nomega
1009 0 : if(nomega==1) then
1010 0 : omega(iomega)=omegamin
1011 : else
1012 0 : omega(iomega)=(omegamax-omegamin)/(nomega-1)*(iomega-1)+omegamin
1013 : endif
1014 0 : if(nomega==1) omega(iomega)=omegamin
1015 0 : write(message,'(2x,f11.3,2x,2f10.4,2x,2f10.4)') omega(iomega)*Ha_eV, uomega(iomega),jomega(iomega)
1016 0 : call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1017 : enddo
1018 0 : write(message,*)" -------------------------------------------------------------"
1019 0 : call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1020 :
1021 : ! END OF LOOP ON ATOMS !!
1022 :
1023 0 : ABI_FREE(uomega)
1024 0 : ABI_FREE(jomega)
1025 0 : ABI_FREE(V_m)
1026 0 : ABI_FREE(rhot_q_m1m3_npwe)
1027 0 : ABI_FREE(rhot_q_m2m4_npwe)
1028 0 : ABI_FREE(trrho)
1029 0 : ABI_FREE(sumrhorhoeps)
1030 0 : ABI_FREE(scr)
1031 0 : ABI_FREE(U_m)
1032 0 : ABI_FREE(rhot_q_m1m3)
1033 0 : ABI_FREE(rhot_q_m2m4)
1034 : ! Print dielectric matrix
1035 : ! do iq_ibz=1,nqibz
1036 : ! call read_screening(em1_ncname,fname,npwe,1,nomega,scr,IO_MODE_FORTRAN,Wfd%comm,iqiA=iq_ibz)
1037 : ! enddo
1038 : enddo!spin2
1039 : enddo!spin1
1040 0 : if (wanbz%nsppol/=1)then
1041 0 : do iomega=1,nomega
1042 0 : if(nomega==1) then
1043 0 : omega(iomega)=omegamin
1044 : else
1045 0 : omega(iomega)=(omegamax-omegamin)/(nomega-1)*(iomega-1)+omegamin
1046 : endif
1047 0 : if(nomega==1) omega(iomega)=omegamin
1048 : enddo
1049 : !call print_orbitals(1,1,iatom1,iatom2,iatom3,iatom4,pos1,pos2,pos3,pos4,il1,il2,il3,il4,wanbz,2)
1050 0 : call print_uj_spin(nomega,uspin,jspin,omega,one_orbital)
1051 : endif
1052 0 : if (wanbz%nsppol/=1)then
1053 0 : ABI_FREE(uspin)
1054 0 : ABI_FREE(jspin)
1055 : endif
1056 0 : ABI_FREE(omega)
1057 : enddo!il4
1058 : enddo!il3
1059 : enddo!il2
1060 : enddo!il1
1061 : enddo!pos4
1062 : enddo!pos3
1063 : enddo!pos2
1064 : enddo!pos1
1065 : enddo!iatom4
1066 : enddo!iatom3
1067 : enddo!iatom2
1068 : enddo!iatom1
1069 0 : ABI_FREE(k_coord)
1070 0 : ABI_FREE(q_coord)
1071 0 : ABI_FREE(eiqr)
1072 0 : ABI_FREE(bijection)
1073 0 : ABI_FREE(normG)
1074 : ! ABI_FREE(coeffW_BZ)
1075 : !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1076 : !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1077 :
1078 : CONTAINS
1079 :
1080 : !! __ _ _
1081 : !! / _| | | (_)
1082 : !! | |_ ___ _ __ ___| |_ _ ___ _ __
1083 : !! | _/ _ \| '_ \ / __| __| |/ _ \| '_ \
1084 : !! | || (_) | | | | (__| |_| | (_) | | | |
1085 : !! |_| \___/|_| |_|\___|\__|_|\___/|_| |_|
1086 : !
1087 0 : integer FUNCTION fi(nkbz,k_coord,kprime_coord)
1088 :
1089 : integer,intent(in) :: nkbz
1090 : real(dp),dimension(nkbz,3),intent(in) ::k_coord
1091 : real(dp),dimension(3),intent(in) :: kprime_coord(3)
1092 :
1093 0 : do fi=1,nkbz
1094 0 : if (ALL(abs(kprime_coord(:)-k_coord(fi,:))<0.001)) then
1095 : exit
1096 : end if
1097 : end do
1098 0 : END FUNCTION fi
1099 :
1100 0 : integer FUNCTION findkmq(ik_bz,k_coord,q_coord,nkbz)
1101 :
1102 : integer,intent(in) :: ik_bz,nkbz
1103 : real(dp),dimension(nkbz,3),intent(in) ::k_coord
1104 : real(dp),dimension(4),intent(in) ::q_coord
1105 : real(dp),dimension(3) :: kprime_coord
1106 : integer :: i,j,k
1107 :
1108 :
1109 0 : kprime_coord(:)=k_coord(ik_bz,:)-q_coord(1:3)
1110 :
1111 0 : where (kprime_coord > 0.5)
1112 : kprime_coord(:)= kprime_coord(:)-1
1113 : elsewhere(kprime_coord < -0.5)
1114 : kprime_coord(:)= kprime_coord(:)+1
1115 : end where
1116 :
1117 : !! indice of k -q
1118 0 : findkmq=fi(nkbz,k_coord,kprime_coord)
1119 :
1120 : !!Test if k-q exists
1121 0 : if (findkmq.EQ.(nkbz+1)) then
1122 : !!The prb comes from PBC included born_inf,born_sup]
1123 : !! One test all combination over boundaries
1124 0 : do i=1,2
1125 0 : if (abs(abs(kprime_coord(1))-0.5)<0.001) kprime_coord(1)=(-1)**i*0.5
1126 0 : do j=1,2
1127 0 : if (abs(abs(kprime_coord(2))-0.5)<0.001) kprime_coord(2)=(-1)**j*0.5
1128 0 : do k=1,2
1129 0 : if (abs(abs(kprime_coord(3))-0.5)<0.01) kprime_coord(3)=(-1)**k*0.5
1130 0 : findkmq=fi(nkbz,k_coord,kprime_coord)
1131 : !!Quand on a trouver la bonne valeur on part
1132 0 : if (findkmq.NE.(nkbz+1)) return
1133 : end do
1134 : end do
1135 : end do
1136 : end if
1137 : END FUNCTION findkmq
1138 :
1139 0 : SUBROUTINE checkk(Interaction,m_inf,m_sup,prtopt,ifreq,uu,jj,utype,mbband1,mbband2,mbband3,mbband4,nspinor,one_orbital)
1140 :
1141 : integer, intent(in) :: m_inf,m_sup,ifreq,mbband1,mbband2,mbband3,mbband4,nspinor,one_orbital
1142 : complex(dp), intent(in) :: Interaction(mbband1*nspinor,mbband2*nspinor,mbband3*nspinor,mbband4*nspinor)
1143 : complex(dp), intent(out) :: uu,jj
1144 : character(len=*), intent(in) :: utype
1145 : integer :: prtopt
1146 :
1147 :
1148 : !==Check correctness
1149 : ! write(message,*) "== Check == "
1150 : ! call wrtout(std_out,message,'COLL')
1151 : ! write(message,*) 'Tolerance :',tol
1152 : ! call wrtout(std_out,message,'COLL')
1153 : ! do i=m_inf,m_sup
1154 : ! do j=i+1,m_sup
1155 : !if (abs(abs(Interaction(i,i,i,i)-Interaction(j,j,j,j)))>tol) then
1156 : ! BUG=.TRUE.
1157 : ! write(message,*) "Problem in the interband calculation"&
1158 : !& ,i,j,abs(Interaction(i,i,i,i)),abs(Interaction(j,j,j,j))
1159 : ! call wrtout(std_out,message,'COLL')
1160 : !end if
1161 :
1162 : ! if (abs(Interaction(i,j,i,j)-Interaction(j,i,j,i))>tol) then
1163 : ! BUG=.TRUE.
1164 : ! write(message,*) "Warning in the symetry of U'",i,j,abs(Interaction(i,j,i,j)),&
1165 : ! & abs(Interaction(j,i,j,i)),abs(Interaction(i,j,i,j)-Interaction(j,i,j,i))
1166 : ! call wrtout(std_out,message,'COLL')
1167 : ! end if
1168 :
1169 : ! if (abs(Interaction(i,i,j,j)-Interaction(j,j,i,i))>tol) then
1170 : ! BUG=.TRUE.
1171 : ! write(message,*) "Warning in the symetry of J'",i,j,abs(Interaction(i,i,j,j)),&
1172 : ! & abs(Interaction(j,j,i,i)),abs(Interaction(j,j,i,i)-Interaction(i,i,j,j))
1173 : ! call wrtout(std_out,message,'COLL')
1174 : ! end if
1175 : ! end do
1176 : ! end do
1177 :
1178 :
1179 : ! do i=m_inf,m_sup
1180 : ! do j=m_inf,m_sup
1181 : ! if (i.EQ.j) cycle
1182 : ! if (abs(Interaction(i,j,j,j))>tol) then
1183 : ! BUG=.TRUE.
1184 : ! write(message,*) "Warning in the symetry U(i,j,j,j) should vanish (in the Ylm basis) for",&
1185 : !& i,j,abs(Interaction(i,j,j,j))
1186 : ! call wrtout(std_out,message,'COLL')
1187 : ! end if
1188 : ! end do
1189 : ! end do
1190 :
1191 : ! if (.not.BUG) then
1192 : ! call wrtout(std_out,'Calcul is possibly correct','COLL')
1193 : ! call Affichage(Interaction,m_inf,m_sup,2)
1194 : ! else
1195 : ! call wrtout(std_out,'Maybe somme error','COLL')
1196 : ! call Affichage(Interaction,m_inf,m_sup,1)
1197 : ! end if
1198 :
1199 0 : if(prtopt>0) call Affichage(Interaction,m_inf,m_sup,1,ifreq,uu,jj,utype,mbband1,mbband2,mbband3,mbband4,nspinor,one_orbital)
1200 :
1201 : END SUBROUTINE checkk
1202 :
1203 0 : SUBROUTINE Affichage(Interaction,m_inf,m_sup,option,ifreq,uu,jj,utype,mbband1,mbband2,mbband3,mbband4,nspinor,one_orbital)
1204 :
1205 : integer, intent(in) :: m_inf,m_sup,option,ifreq,mbband1,mbband2,mbband3,mbband4,nspinor,one_orbital
1206 : complex(dp), intent(in) :: Interaction(mbband1*nspinor,mbband2*nspinor,mbband3*nspinor,mbband4*nspinor)
1207 : complex(dp),intent(out) :: UU,JJ
1208 : character(len=*), intent(in) :: utype
1209 : complex(dp) :: UU1,UUmJJ,JJ1,JJ2
1210 : integer :: m1,m2
1211 : logical :: lprint
1212 : character(len=500) :: message
1213 :
1214 :
1215 0 : if(utype=="cRPA interaction".or.utype=="bare interaction") then
1216 : lprint=.true.
1217 : else
1218 0 : lprint=.false.
1219 : endif
1220 0 : write(message,*) "";call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
1221 :
1222 0 : if (one_orbital==1) then
1223 0 : if(lprint) then
1224 0 : write(message,*)" Diagonal ",utype
1225 0 : call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1226 : endif
1227 :
1228 0 : do m1=m_inf,m_sup
1229 0 : if (option.EQ.1) then
1230 0 : write(message,'(a,i3,14f7.3)') " ",m1,real(Interaction(m1,m1,m1,m1))
1231 0 : call wrtout(std_out,message,'COLL')
1232 0 : call wrtout(ab_out,message,'COLL')
1233 : end if
1234 : end do
1235 : endif
1236 :
1237 0 : if(lprint) then
1238 0 : write(message,*) "";call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
1239 0 : write(message,*)" U'=U(m1,m2,m1,m2) for the ",utype
1240 0 : call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1241 :
1242 0 : write(message,'(a,14i7)') " -",(m2,m2=1,mbband2)
1243 0 : call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1244 0 : do m1=m_inf,m_sup
1245 0 : if (option.EQ.1) then
1246 0 : write(message,'(a,i3,14f7.3)') " ",m1,(real(Interaction(m1,m2,m1,m2)),m2=1,mbband2)
1247 0 : call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1248 : end if
1249 : end do
1250 : endif
1251 :
1252 0 : write(message,*) ""
1253 0 : call wrtout(std_out,message,'COLL')
1254 0 : call wrtout(ab_out,message,'COLL')
1255 :
1256 0 : UU=czero
1257 0 : do m1=1,mbband1
1258 0 : do m2=1,mbband2
1259 0 : UU=UU+Interaction(m1,m2,m1,m2)
1260 : enddo
1261 : enddo
1262 0 : UU=UU/float(mbband1*mbband2)
1263 0 : if(ifreq/=0) write(message,'(3a,i3,a,2f10.4,a)')' Hubbard ',utype,' for w =',ifreq,', U=1/(2l+1)**2 \sum U(m1,m2,m1,m2)=',UU,ch10
1264 0 : if(ifreq==0) write(message,'(3a,2f10.4,a)') ' Hubbard ',utype, ' U=1/(2l+1)**2 \sum U(m1,m2,m1,m2)=',UU,ch10
1265 0 : call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1266 :
1267 :
1268 0 : if (one_orbital==1)then
1269 0 : UU1=czero
1270 0 : do m1=1,mbband1
1271 0 : UU1=UU1+Interaction(m1,m1,m1,m1)
1272 : enddo
1273 0 : UU1=UU1/((mbband1))
1274 0 : if(ifreq/=0) write(message,'(3a,i4,a,2f10.4,2a)')&
1275 0 : & ' (Hubbard ',utype,' for w =',ifreq,', U=1/(2l+1) \sum U(m1,m1,m1,m1)=',UU1,')',ch10
1276 0 : if(ifreq==0) write(message,'(3a,2f10.4,2a)')' (Hubbard ',utype,' U=1/(2l+1) \sum U(m1,m1,m1,m1)=',UU1,')',ch10
1277 0 : call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1278 : endif
1279 :
1280 0 : if(lprint .and. one_orbital==1) then
1281 0 : write(message,*)' Hund coupling J=U(m1,m1,m2,m2) for the ', utype
1282 0 : call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1283 :
1284 0 : write(message,'(a,14i7)') " -",(m2,m2=1,mbband1)
1285 0 : call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1286 0 : do m1=1,mbband1
1287 0 : if (option.EQ.1) then
1288 0 : write(message,'(a,i3,14f7.3)') " ",m1,(real(Interaction(m1,m1,m2,m2)),m2=1,mbband1)
1289 0 : call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1290 : end if
1291 : end do
1292 : endif
1293 0 : if (one_orbital==1)then
1294 0 : UUmJJ=czero
1295 0 : do m1=1,mbband1
1296 0 : do m2=1,mbband1
1297 0 : UUmJJ=UUmJJ+Interaction(m1,m2,m1,m2)-Interaction(m1,m2,m2,m1)
1298 : enddo
1299 : enddo
1300 0 : if (mbband1/=1) then
1301 0 : UUmJJ=UUmJJ/float((mbband1)*(mbband1-1))
1302 0 : JJ1=UU-UUmJJ
1303 : endif
1304 :
1305 :
1306 0 : JJ=czero
1307 0 : do m1=1,mbband1
1308 0 : do m2=1,mbband1
1309 0 : if(m1/=m2) JJ=JJ+Interaction(m1,m2,m2,m1)
1310 : enddo
1311 : enddo
1312 0 : if (mbband1/=1) then
1313 0 : JJ=JJ/float((mbband1)*(mbband1-1))
1314 : endif
1315 :
1316 0 : write(message,'(a,3x,2a,2f10.4,a)')ch10,utype,&
1317 0 : & ' value of J=U-1/((2l+1)(2l)) \sum_{m1,m2} (U(m1,m2,m1,m2)-U(m1,m2,m2,m1))=',JJ1,ch10
1318 0 : call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1319 :
1320 0 : if (mbband1/=1) then
1321 0 : UUmJJ=czero
1322 0 : do m1=1,mbband1
1323 0 : do m2=1,mbband1
1324 0 : UUmJJ=UUmJJ+Interaction(m1,m2,m1,m2)-Interaction(m1,m1,m2,m2)
1325 : enddo
1326 : enddo
1327 0 : UUmJJ=UUmJJ/float((mbband1)*(mbband1-1))
1328 0 : JJ2=UU-UUmJJ
1329 0 : if(abs(JJ1-JJ2)<0.0001) then
1330 0 : JJ=JJ1
1331 : else
1332 :
1333 0 : write(message,'(a,3x,2a,2f10.4,a)')ch10,utype,&
1334 0 : & ' value of J=U-1/((2l+1)(2l)) \sum_{m1,m2} (U(m1,m2,m1,m2)-U(m1,m1,m2,m2))=',JJ2,ch10
1335 0 : call wrtout(std_out,message,'COLL')
1336 : ! stop
1337 : endif
1338 : endif
1339 : endif
1340 :
1341 0 : if(lprint .and. one_orbital==1) then
1342 0 : write(message,*)ch10,' Hund coupling J2=U(m1,m2,m2,m1) for the ', utype
1343 0 : call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1344 :
1345 0 : write(message,'(a,14i7)') " -",(m2,m2=1,mbband1)
1346 0 : call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1347 0 : do m1=1,mbband1
1348 0 : if (option.EQ.1) then
1349 0 : write(message,'(a,i3,14f7.3)') " ",m1,(real(Interaction(m1,m2,m2,m1)),m2=1,mbband1)
1350 0 : call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1351 : end if
1352 : end do
1353 : ! write(message,*) "";call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
1354 : ! write(message,*) "U'=U-2J for the t2g should be checked"
1355 : ! call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1356 : endif
1357 :
1358 0 : END SUBROUTINE Affichage
1359 :
1360 : SUBROUTINE Sauvegarde_M_q_m(M_q_m,normG,nqibz,npw,mbband)
1361 :
1362 : integer, intent(in) :: nqibz,npw,mbband
1363 : complex(dp), intent(in) :: M_q_m(mbband,mbband,npw,nqibz)
1364 : real(dp), intent(in) :: normG(npw)
1365 : integer :: i,j,iq_ibz,iG,unt
1366 : character(len=500) :: msg
1367 :
1368 : !==Ecriture de M_(G=0)^(mm')(q) ==!
1369 : if (open_file('M_mimj(n=1_2_3)(q,G=0)',msg,newunit=unt,form='formatted',status='unknown') /=0) then
1370 : ABI_ERROR(msg)
1371 : end if
1372 : do iq_ibz=1,nqibz
1373 : write(unt,*) iq_ibz,((abs(M_q_m(i,j,1,iq_ibz)),i=1,mbband),j=1,mbband)
1374 : end do
1375 : close(unt)
1376 :
1377 : !==Ecriture de M_G^(mm')(q=0) ==!
1378 : if (open_file('M_mm(m=1..mbband)(q=0)',msg,newunit=unt,form='formatted',status='unknown') /= 0) then
1379 : ABI_ERROR(msg)
1380 : end if
1381 : do iG=1,npw
1382 : write(unt,*) normG(iG),(abs(M_q_m(i,i,iG,1)),i=1,mbband)
1383 : end do
1384 : close(unt)
1385 : END SUBROUTINE Sauvegarde_M_q_m
1386 :
1387 0 : subroutine print_orbitals(spin1,spin2,iatom1,iatom2,iatom3,iatom4,pos1,pos2,pos3,pos4,il1,il2,il3,il4,wanbz,opt)
1388 : integer, intent(in) :: spin1,spin2,iatom1,iatom2,iatom3,iatom4,pos1,pos2,pos3,pos4,il1,il2,il3,il4,opt
1389 : type(plowannier_type),intent(in) :: wanbz
1390 : character(len=5000) ::message
1391 : character(len=10):: print_spin
1392 :
1393 0 : if (spin1==spin2 .and. spin1==1)then
1394 0 : print_spin=" Up-Up"
1395 0 : else if(spin1==1 .and. spin2==2)then
1396 0 : print_spin=" Up-Down"
1397 0 : else if(spin1==2 .and. spin2==1) then
1398 0 : print_spin=" Down-Up"
1399 : else
1400 0 : print_spin=" Down-Down"
1401 : endif
1402 0 : if (opt==1)then
1403 0 : write(message,*)ch10,"==Definition of the orbitals=="
1404 0 : else if (opt==0) then
1405 0 : write(message,*)ch10,"==Reminder of the orbitals=="
1406 0 : else if (opt==2) then
1407 0 : write(message,*)ch10,"==Reminder of the orbitals=="
1408 0 : write(print_spin,*)" summary"
1409 0 : else if (opt==3) then
1410 0 : write(message,*)ch10,"==Reminder of the orbitals=="
1411 0 : write(print_spin,*)" average"
1412 : endif
1413 0 : call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
1414 0 : if (iatom1==iatom2.and. iatom3==iatom4 .and. iatom3==iatom2)then
1415 0 : if(pos1==pos2 .and. pos3==pos4 .and. pos1==pos3)then
1416 0 : if (il1==il2 .and. il3==il4 .and. il3==il1)then
1417 0 : write(message,*)" Only one orbital"
1418 0 : call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
1419 0 : write(message,*)" Orbital with l=",wanbz%latom_wan(iatom1)%lcalc(il1),&
1420 0 : &"on atom",wanbz%iatom_wan(iatom1),"with spin's orientations",print_spin
1421 0 : call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
1422 : else
1423 0 : write(message,*)"Different orbitals on atom",wanbz%iatom_wan(iatom1),"with spin's orientations",print_spin
1424 0 : call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
1425 0 : write(message,*)" orbital 1 with l=",wanbz%latom_wan(iatom1)%lcalc(il1)
1426 0 : call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
1427 0 : write(message,*)" orbital 2 with l=",wanbz%latom_wan(iatom1)%lcalc(il2)
1428 0 : call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
1429 0 : write(message,*)" orbital 3 with l=",wanbz%latom_wan(iatom1)%lcalc(il3)
1430 0 : call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
1431 0 : write(message,*)" orbital 4 with l=",wanbz%latom_wan(iatom1)%lcalc(il4)
1432 0 : call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
1433 : endif
1434 : else
1435 0 : if(il1==il2 .and. il3==il4 .and. il1==il3)then
1436 0 : write(message,*)" Different position of the same orbital"
1437 0 : call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
1438 0 : write(message,*)" Orbitals with l=",wanbz%latom_wan(iatom1)%lcalc(il1),&
1439 0 : &"on atom",wanbz%iatom_wan(iatom1),"with spin's orientations",print_spin
1440 0 : call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
1441 0 : write(message,*)" orbital 1 at postion ",wanbz%nposition(iatom1)%pos(pos1,:)
1442 0 : call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
1443 0 : write(message,*)" orbital 2 at postion ",wanbz%nposition(iatom1)%pos(pos2,:)
1444 0 : call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
1445 0 : write(message,*)" orbital 3 at postion ",wanbz%nposition(iatom1)%pos(pos3,:)
1446 0 : call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
1447 0 : write(message,*)" orbital 4 at postion ",wanbz%nposition(iatom1)%pos(pos4,:)
1448 0 : call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
1449 : else
1450 0 : write(message,*)" Different orbitals on the same atom, with different positions"
1451 0 : call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
1452 0 : write(message,*)" Orbitals on atom",wanbz%iatom_wan(iatom1),"with spin's orientations",print_spin
1453 0 : call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
1454 0 : write(message,*)" orbital 1 with l=",wanbz%latom_wan(iatom1)%lcalc(il1),"at position ",wanbz%nposition(iatom1)%pos(pos1,:)
1455 0 : call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
1456 0 : write(message,*)" orbital 2 with l=",wanbz%latom_wan(iatom1)%lcalc(il2),"at position ",wanbz%nposition(iatom1)%pos(pos2,:)
1457 0 : call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
1458 0 : write(message,*)" orbital 3 with l=",wanbz%latom_wan(iatom1)%lcalc(il3),"at position ",wanbz%nposition(iatom1)%pos(pos3,:)
1459 0 : call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
1460 0 : write(message,*)" orbital 4 with l=",wanbz%latom_wan(iatom1)%lcalc(il4),"at position ",wanbz%nposition(iatom1)%pos(pos4,:)
1461 0 : call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
1462 : endif
1463 : endif
1464 : else
1465 0 : if(pos1==pos2 .and. pos3==pos4 .and. pos1==pos3)then
1466 0 : write(message,*)"Different atoms, with spin orientation",print_spin
1467 0 : call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
1468 0 : write(message,*)" orbital 1 with l=",wanbz%latom_wan(iatom1)%lcalc(il1),"on atom",wanbz%iatom_wan(iatom1)
1469 0 : call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
1470 0 : write(message,*)" orbital 2 with l=",wanbz%latom_wan(iatom2)%lcalc(il2),"on atom",wanbz%iatom_wan(iatom2)
1471 0 : call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
1472 0 : write(message,*)" orbital 3 with l=",wanbz%latom_wan(iatom3)%lcalc(il3),"on atom",wanbz%iatom_wan(iatom3)
1473 0 : call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
1474 0 : write(message,*)" orbital 4 with l=",wanbz%latom_wan(iatom4)%lcalc(il4),"on atom",wanbz%iatom_wan(iatom4)
1475 0 : call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
1476 : else
1477 0 : write(message,*)"Different atoms, in different postions with spin's orientations",print_spin
1478 0 : call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
1479 0 : write(message,*)" orbital 1 with l=",wanbz%latom_wan(iatom1)%lcalc(il1),&
1480 0 : &"on atom",wanbz%iatom_wan(iatom1),"at position ",wanbz%nposition(iatom1)%pos(pos1,:)
1481 0 : call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
1482 0 : write(message,*)" orbital 2 with l=",wanbz%latom_wan(iatom2)%lcalc(il2),&
1483 0 : &"on atom",wanbz%iatom_wan(iatom2),"at position ",wanbz%nposition(iatom2)%pos(pos2,:)
1484 0 : call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
1485 0 : write(message,*)" orbital 3 with l=",wanbz%latom_wan(iatom3)%lcalc(il3),&
1486 0 : &"on atom",wanbz%iatom_wan(iatom3),"at position ",wanbz%nposition(iatom3)%pos(pos3,:)
1487 0 : call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
1488 0 : write(message,*)" orbital 4 with l=",wanbz%latom_wan(iatom4)%lcalc(il4),&
1489 0 : &"on atom",wanbz%iatom_wan(iatom4),"at position ",wanbz%nposition(iatom4)%pos(pos4,:)
1490 0 : call wrtout(std_out,message,'COLL');call wrtout(ab_out,message,'COLL')
1491 : endif
1492 : endif
1493 0 : end subroutine print_orbitals
1494 :
1495 :
1496 0 : subroutine print_uj_spin(nomega,uspin,jspin,omega,one_orbital)
1497 : integer,intent(in) :: nomega,one_orbital
1498 : complex(dp),intent(in) :: uspin(4,nomega)
1499 : complex(dp),intent(in) :: jspin(4,nomega)
1500 : real(dp),intent(in) :: omega(nomega)
1501 : integer :: iomega,ispin
1502 0 : complex(dp) :: uomega(nomega),jomega(nomega)
1503 : character(len=500)::message
1504 :
1505 0 : call print_orbitals(spin1,spin2,iatom1,iatom2,iatom3,iatom4,pos1,pos2,pos3,pos4,il1,il2,il3,il4,wanbz,3)
1506 0 : write(message,*)ch10," --------------------------------------------------------------------"
1507 0 : call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1508 0 : write(message,*)" Sum up of the calcul for different spin polarization and frequencies"
1509 0 : call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1510 0 : write(message,*)" --------------------------------------------------------------------"
1511 0 : call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1512 :
1513 :
1514 0 : write(message,*)ch10,"Sum up of U",ch10
1515 0 : call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1516 :
1517 0 : write(message,'(6a)')" -omega (eV)- "," Up-Up "," Up-Down "," Down-Up "," Down-Down "," Average "
1518 0 : call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1519 0 : do iomega=1,nomega
1520 0 : write(message,'(a,f7.2,5f9.3)')" ",omega(iomega)*Ha_eV,(real(uspin(ispin,iomega)),ispin=1,4),sum(real(uspin(:,iomega)))/4
1521 0 : call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1522 : end do
1523 :
1524 0 : if (one_orbital==1)then
1525 0 : write(message,*)ch10,"Sum up of J",ch10
1526 0 : call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1527 :
1528 0 : write(message,'(6a)')" -omega (eV)- "," Up-Up "," Up-Down "," Down-Up "," Down-Down "," Average "
1529 0 : call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1530 0 : do iomega=1,nomega
1531 0 : write(message,'(a,f7.2,5f9.3)')" ",omega(iomega)*Ha_eV,(real(jspin(ispin,iomega)),ispin=1,4),sum(real(jspin(:,iomega)))/4
1532 0 : call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1533 : end do
1534 : endif
1535 0 : uomega(:)=sum(uspin,dim=1)/4
1536 0 : jomega(:)=sum(jspin,dim=1)/4
1537 : !call print_orbitals(spin1,spin2,iatom1,iatom2,iatom3,iatom4,pos1,pos2,pos3,pos4,il1,il2,il3,il4,wanbz,3)
1538 0 : write(message,*)ch10," -------------------------------------------------------------"
1539 0 : call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1540 0 : write(message,*)" Average U and J as a function of frequency "
1541 0 : call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1542 0 : write(message,*)" -------------------------------------------------------------"
1543 0 : call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1544 0 : write(message,*)" omega U(omega) J(omega)"
1545 0 : call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1546 0 : do iomega=1,nomega
1547 0 : write(message,'(2x,f11.3,2x,2f10.4,2x,2f10.4)') omega(iomega)*Ha_eV, uomega(iomega),jomega(iomega)
1548 0 : call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1549 : enddo
1550 0 : write(message,*)" -------------------------------------------------------------"
1551 0 : call wrtout(std_out,message,'COLL'); call wrtout(ab_out,message,'COLL')
1552 0 : end subroutine print_uj_spin
1553 :
1554 : end subroutine calc_ucrpa
1555 : !!***
1556 :
1557 : END MODULE m_calc_ucrpa
1558 : !!***
|