Line data Source code
1 : !!****m* ABINIT/m_evdw_wannier
2 : !! NAME
3 : !! m_evdw_wannier
4 : !!
5 : !! FUNCTION
6 : !!
7 : !!
8 : !! COPYRIGHT
9 : !! Copyright (C) 2010-2026 ABINIT group (CE, TR, AR)
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 : !! SOURCE
15 :
16 : #if defined HAVE_CONFIG_H
17 : #include "config.h"
18 : #endif
19 :
20 : #include "abi_common.h"
21 :
22 : module m_evdw_wannier
23 :
24 : use defs_basis
25 : use m_abicore
26 : use m_errors
27 :
28 : use m_special_funcs, only : abi_derf
29 : use m_numeric_tools, only : simpson_int
30 : use m_geometry, only : xcart2xred, xred2xcart
31 :
32 : implicit none
33 :
34 : private
35 : !!***
36 :
37 : public :: evdw_wannier
38 : !!***
39 :
40 : contains
41 : !!***
42 :
43 : !!****f* ABINIT/evdw_wannier
44 : !! NAME
45 : !! evdw_wannier
46 : !!
47 : !! FUNCTION
48 : !! FIXME: Evaluates the van der Waals correlation energy using maximally
49 : !! localized Wannier functions (MLWF) as proposed by:
50 : !! P. L. Silvestrelli in PRL 100:053002 (2008) [[cite:Sivestrelli2008]] vdw_xc=10 and
51 : !! A. Ambrosetti and P. L. Silvestrelli in PRB 85:073101 (2012) [[cite:Ambrosetti2012]] vdw_xc=11.
52 : !! P. L. Silvestrelli in J.Chem.Phys. 139:054106 (2013) [[cite:Silvestrelli2013]] vdw_xc=14.
53 : !!
54 : !! INPUTS
55 : !! nsppol = Spin polarization.
56 : !! nwan(nsppol) = Total number of MLWF in the system per spin component.
57 : !! origmwan = max[nwan(nsppol)] from mlwfovlp.F90.
58 : !! tdocc_wan = MLWFs occupation matrix diagonal terms
59 : !! vdw_nfrag = Number of vdW interating fragments in the unit cell.
60 : !! vdw_supercell(3) = Distance along each rprimd components for
61 : !! which vdW interactions between MLWF will be taken into account.
62 : !! vdw_typfrag(natom) = Fragment to which each atom belongs to.
63 : !! vdw_xc = vdW-WF version.
64 : !! rprimd = Real space primitive translations.
65 : !! wann_centres(3,origmwan,nsppol) = The centers of MLWFs in a.u.
66 : !! wann_spreads(origmwan,nsppol) = Spread of the MLWFs, in Ang**2. (from wannier90).
67 : !! xcart = Coordinates of unit cell atoms in atomic units.
68 : !!
69 : !! OUTPUT
70 : !! csix(origmwan,origmwan,nsppol,nsppol) = dispersion coefficient between each pair of MLWF.
71 : !! corrvdw = van der Waals correction to the energy.
72 : !!
73 : !! SOURCE
74 :
75 3 : subroutine evdw_wannier(csix,corrvdw,origmwan,natom,nsppol,orignwan,tdocc_wan,vdw_nfrag,&
76 3 : & vdw_supercell,vdw_typfrag,vdw_xc,rprimd,wann_centres,wann_spreads,xcart)
77 :
78 : !Arguments ------------------------------------
79 : integer , intent(in) :: origmwan,nsppol,natom,orignwan(nsppol)
80 : integer , intent(in) :: vdw_nfrag,vdw_supercell(3),vdw_typfrag(natom),vdw_xc
81 : real(dp), intent(in) :: rprimd(3,3),wann_centres(3,origmwan,nsppol),wann_spreads(origmwan,nsppol)
82 : real(dp), intent(in) :: xcart(3,natom)
83 : real(dp), intent(out) :: corrvdw
84 : real(dp), intent(out) :: csix(origmwan,origmwan,nsppol,nsppol)
85 : real(dp), intent(in) :: tdocc_wan(origmwan,nsppol)
86 :
87 : !Local variables-------------------------------
88 : integer :: ier,igr,icx,icy,icz,ii,inx,iny,inz,isppol,iwan
89 : integer :: jwan,jj,ll,mm,mwan,nc,ngr,tmp_mwan,mwan_half
90 3 : integer, allocatable:: amagr(:,:,:),inwan(:,:),nw(:,:),nwan(:),npwf(:),ord(:,:)
91 3 : integer, allocatable:: tmp_nwan(:)
92 : real(dp) :: dnrm2,fij,rij,rij_c(3),fu,shift,erfValue
93 : real(dp), parameter :: a = 20.d0 !Parameter related to the damping function.
94 : real(dp), parameter :: gama = 4.5d0/(sqrt3**3) !alpha=gama*S**3.
95 : real(dp), parameter :: gama1 = 0.88d0 !alpha=gama*S**3.
96 : real(dp), parameter :: zeta = 1.30d0 !polar=zeta*(Z/omega**2).
97 : real(dp), parameter :: beta = 1.39d0 ! .
98 3 : real(dp), allocatable:: amawf(:,:),amaspr(:),amaocc(:),dcenters(:,:,:),rc(:,:)
99 3 : real(dp), allocatable:: tmp_cent(:,:,:),tmp_spr(:,:),tmp_occ(:,:)
100 3 : real(dp), allocatable:: rv(:,:),wanncent(:,:,:),wannspr(:,:),wc_rec(:,:,:),xi(:,:)
101 3 : real(dp), allocatable:: c_QHO(:,:),Tij_dip(:,:),polar(:),omega(:),eigv(:),zhpev2(:)
102 3 : real(dp), allocatable :: newocc_wan(:,:)
103 3 : complex(dp), allocatable :: eigvec(:,:),matrx(:),zhpev1(:)
104 : character(len=500) :: message ! to be uncommented, if needed
105 : ! *************************************************************************
106 :
107 : !Determining presence p-like MLWFs see J.Chem.Phys.135:154105 (2011) [[cite:Andrinopoulos2011]]
108 9 : ABI_MALLOC(npwf,(nsppol))
109 12 : ABI_MALLOC(inwan,(origmwan,nsppol))
110 6 : ABI_MALLOC(nwan,(nsppol))
111 :
112 3 : ll = 0
113 6 : npwf(:) = 0
114 18 : inwan(:,:) = 0
115 6 : do jj=1,nsppol
116 18 : do iwan=1,orignwan(jj)
117 15 : if(tdocc_wan(iwan,jj)*nsppol<=1.50d0) then
118 0 : npwf(jj) = npwf(jj) + 1
119 0 : ll = ll+1
120 0 : inwan(ll,jj) = iwan
121 : end if
122 : end do
123 : end do
124 :
125 3 : write(std_out,*) ch10,'Number of p-like MLWFs per spin pol:',ch10
126 3 : write(std_out,*) (npwf(ii),ii=1,nsppol), ch10
127 :
128 6 : mwan=origmwan+(sum(npwf(:))) !two new MLWFs per p-like MLWF
129 6 : nwan(:)=orignwan(:)+npwf(:)
130 :
131 :
132 12 : ABI_MALLOC(wanncent,(3,mwan,nsppol))
133 12 : ABI_MALLOC(wannspr,(mwan,nsppol))
134 9 : ABI_MALLOC(wc_rec,(3,mwan,nsppol))
135 12 : ABI_MALLOC(ord,(mwan,nsppol))
136 9 : ABI_MALLOC(newocc_wan,(mwan,nsppol))
137 :
138 54 : wanncent(:,:,:) = zero
139 18 : wannspr(:,:) = zero
140 54 : wc_rec(:,:,:) = zero
141 18 : newocc_wan(:,:) = zero
142 18 : ord(:,:) = zero
143 :
144 : !The vdW correction is calculated in atomic units:
145 6 : do ii=1,nsppol
146 18 : do iwan=1,orignwan(ii)
147 : ! converting to bohr**2 and then squared
148 48 : wanncent(:,iwan,ii)=wann_centres(:,iwan,ii)/Bohr_Ang
149 : ! write(std_out,*) "spread of WF",i, "=", wann_spreads(i)
150 12 : wannspr(iwan,ii)=sqrt(wann_spreads(iwan,ii)/Bohr_Ang**2)
151 15 : newocc_wan(iwan,ii)=tdocc_wan(iwan,ii)
152 : end do
153 : end do
154 :
155 : !write(std_out,*) 'Number of MLWFs:',ch10
156 : !do ii=1,nsppol
157 : !write(std_out,*) 'nsppol=',ii, 'nwan(nsppol)=',nwan(nsppol),ch10
158 : !end do
159 :
160 3 : write(std_out,*) 'Original Wannier centres and spreads:',ch10
161 6 : do ii=1,nsppol
162 3 : write(std_out,*) 'nsppol=',ii,ch10
163 18 : do iwan=1,orignwan(ii)
164 15 : write(std_out,*) (wanncent(jj,iwan,ii),jj=1,3), wannspr(iwan,ii),ch10
165 : end do
166 : end do
167 :
168 : !Translate MLWFs to the original unit cell if vdw_nfrag > 0 :
169 :
170 3 : if(vdw_nfrag>0)then
171 0 : do jj=1,nsppol
172 : call xcart2xred(orignwan(jj),rprimd,wanncent(:,1:orignwan(jj),jj), &
173 0 : & wc_rec(:,1:orignwan(jj),jj))
174 : ! got centers in reduced coor
175 0 : do iwan=1,orignwan(jj)
176 0 : do ii=1,3
177 0 : if(wc_rec(ii,iwan,jj)<zero) then
178 0 : shift=REAL(CEILING(ABS(wc_rec(ii,iwan,jj))),dp)
179 0 : wc_rec(ii,iwan,jj) = wc_rec(ii,iwan,jj)+shift
180 : end if
181 0 : if(wc_rec(ii,iwan,jj)>one) then
182 0 : shift=-REAL(INT(wc_rec(ii,iwan,jj)),dp)
183 0 : wc_rec(ii,iwan,jj) = wc_rec(ii,iwan,jj)+shift
184 : end if
185 : end do
186 : end do
187 : call xred2xcart(orignwan(jj),rprimd,wanncent(:,1:orignwan(jj),jj), &
188 0 : & wc_rec(:,1:orignwan(jj),jj))
189 : end do
190 :
191 : ! ====================================================================
192 :
193 0 : write(std_out,*) ch10,'Wannier centres translated to unit cell and spr:',ch10
194 0 : do jj=1,nsppol
195 0 : write(std_out,*) 'nsppol=',jj,ch10
196 0 : do iwan=1,orignwan(jj)
197 0 : write(std_out,*) (wanncent(ii,iwan,jj),ii=1,3), wannspr(iwan,jj)
198 : end do
199 : end do
200 : end if !vdw_nfrag>0
201 :
202 : !Spliting of p-like into 2 s-like MLWFs
203 : !Eqs. (22) and (23) of J.Chem.Phys.135:154105 (2011) [[cite:Andrinopoulos2011]]
204 :
205 6 : if ( any (npwf(:)/=0) ) then
206 :
207 0 : write(std_out,*) 'Indexes of p-like MLWFs and its spin:'
208 :
209 0 : do isppol=1,nsppol
210 0 : do jj=1,npwf(isppol)
211 :
212 0 : write(std_out,*) inwan(jj,isppol),isppol
213 :
214 0 : wanncent(1:2,orignwan(isppol)+jj,isppol) = wanncent(1:2,inwan(jj,isppol),isppol)
215 :
216 : wanncent(3,orignwan(isppol)+jj,isppol) = wanncent(3,inwan(jj,isppol),isppol) &
217 0 : & + 15.d0*wannspr(inwan(jj,isppol),isppol) / (eight*sqrt(30.d0))
218 :
219 : wanncent(3,inwan(jj,isppol),isppol) = wanncent(3,inwan(jj,isppol),isppol) &
220 0 : & - 15.d0*wannspr(inwan(jj,isppol),isppol) / (eight*sqrt(30.d0))
221 :
222 0 : wannspr(orignwan(isppol)+jj,isppol) = seven*wannspr(inwan(jj,isppol),isppol) / (eight*sqrt2)
223 :
224 0 : wannspr(inwan(jj,isppol),isppol) = seven*wannspr(inwan(jj,isppol),isppol) / (eight*sqrt2)
225 :
226 0 : newocc_wan(orignwan(isppol)+jj,isppol) = tdocc_wan(inwan(jj,isppol),isppol) / two
227 :
228 0 : newocc_wan(inwan(jj,isppol),isppol) = tdocc_wan(inwan(jj,isppol),isppol) / two
229 :
230 : end do
231 : end do
232 :
233 0 : write(std_out,*) ch10,'Wannier centres and spreads after splitting of p-like MLWFs:',ch10
234 0 : do isppol=1,nsppol
235 0 : write(std_out,*) 'nsppol=',isppol,ch10
236 0 : do iwan=1,nwan(isppol)
237 0 : write(std_out,*) (wanncent(jj,iwan,isppol),jj=1,3), wannspr(iwan,isppol)
238 : end do
239 : end do
240 :
241 : end if ! any(npwf(:)/=0)
242 :
243 : !Asign each MLWFs to one fragment, the same as their nearest atom:
244 :
245 3 : call order_wannier(mwan,natom,nwan,nsppol,ord,vdw_typfrag,wanncent,xcart)
246 :
247 3 : write(std_out,*) ch10,'Wannier centres and fragments',ch10
248 6 : do ll=1,abs(vdw_nfrag)
249 3 : write(std_out,*) 'MLWF centers in fragment',ll,ch10
250 9 : do jj=1,nsppol
251 18 : do iwan=1,nwan(jj)
252 15 : if (ord(iwan,jj)==ll) then
253 48 : write(std_out,*) 'X', (Bohr_Ang*wanncent(ii,iwan,jj),ii=1,3),iwan,jj
254 : end if
255 : end do
256 : end do
257 : end do
258 :
259 3 : write(std_out,*) ch10,'Occupation Matrix diagonal terms:',ch10
260 6 : do ll=1,abs(vdw_nfrag)
261 3 : write(std_out,*) 'For MLWF centers in fragment',ll,ch10
262 9 : do jj=1,nsppol
263 18 : do iwan=1,nwan(jj)
264 15 : if (ord(iwan,jj)==ll) then
265 12 : write(std_out,*) newocc_wan(iwan,jj),ch10
266 : end if
267 : end do
268 : end do
269 : end do
270 :
271 : !Amalgamation of close MLWFs, see J.Chem.Phys.135:154105 (2011) [[cite:Andrinopoulos2011]]
272 :
273 6 : if (all(npwf(:)==0).and.vdw_xc/=14) then !amalgamation is done only if no p-like
274 :
275 2 : mwan_half=mwan/2
276 10 : ABI_MALLOC(amagr,(mwan,nsppol,mwan_half))
277 8 : ABI_MALLOC(nw,(nsppol,mwan_half))
278 10 : nw=0
279 :
280 2 : call amalgam(amagr,ngr,nsppol,nw,mwan,ord,nwan,vdw_nfrag,wanncent,wannspr)
281 :
282 : ! Calculating amalgamated centres, spreads and occupancies if any:
283 :
284 10 : if( any(nw(:,:) /= 0) ) then
285 :
286 0 : ABI_MALLOC(amawf,(3,ngr))
287 0 : ABI_MALLOC(amaspr,(ngr))
288 0 : ABI_MALLOC(amaocc,(ngr))
289 :
290 0 : amawf(:,:) = 0
291 0 : amaspr(:) = 0
292 0 : amaocc(:) = 0
293 :
294 0 : do igr = 1 , ngr
295 0 : do isppol = 1 , nsppol
296 0 : do ii = 1 , nw(isppol,igr)
297 :
298 0 : amawf(:,igr) = amawf(:,igr) + wanncent(:,amagr(ii,isppol,igr),isppol)
299 0 : amaspr(igr) = amaspr(igr) + wannspr(amagr(ii,isppol,igr),isppol)
300 0 : amaocc(igr) = amaocc(igr) + newocc_wan(amagr(ii,isppol,igr),isppol)
301 :
302 : end do
303 : end do
304 :
305 0 : amawf(:,igr) = amawf(:,igr) / real(sum(nw(1:nsppol,igr)),dp )
306 0 : amaspr(igr) = amaspr(igr) / real(sum(nw(1:nsppol,igr)),dp )
307 :
308 : end do
309 :
310 0 : write(std_out,*) ch10,'Amalgamated MLWFs Centres, Spreads and Occupancies:',ch10
311 0 : do igr = 1 , ngr
312 0 : write(std_out,*) (amawf(ii,igr),ii=1,3),amaspr(igr),amaocc(igr)
313 : end do
314 :
315 : ! Redefining centres, spreads and occps arrays:
316 0 : ABI_MALLOC(tmp_nwan,(nsppol))
317 :
318 0 : tmp_nwan(:) = nwan(:) - sum(nw(:,1:ngr))
319 0 : tmp_mwan = maxval(tmp_nwan(:))
320 :
321 0 : ABI_MALLOC(tmp_cent,(3,tmp_mwan,nsppol))
322 0 : ABI_MALLOC(tmp_spr,(tmp_mwan,nsppol))
323 0 : ABI_MALLOC(tmp_occ,(tmp_mwan,nsppol))
324 :
325 0 : tmp_cent(:,:,:) = zero
326 0 : tmp_spr(:,:) = zero
327 0 : tmp_occ(:,:) = zero
328 :
329 0 : do isppol = 1 , nsppol
330 0 : ii = 0
331 0 : do iwan = 1 , nwan(isppol)
332 :
333 0 : if ( any(amagr(:,isppol,:) == iwan) ) cycle
334 :
335 0 : ii = ii + 1
336 0 : tmp_cent(:,ii,isppol) = wanncent(:,iwan,isppol)
337 0 : tmp_spr(ii,isppol) = wannspr(iwan,isppol)
338 0 : tmp_occ(ii,isppol) = newocc_wan(iwan,isppol)
339 :
340 : end do
341 : end do
342 :
343 : ! Redefining wanncent, wannspr, newocc_wan:
344 : ! Even if amalgamation occurs with MLWFs of different spins
345 : ! the new WF are gathered with isppol=1 functions...
346 :
347 0 : nwan(1) = nwan(1) - sum(nw(1,1:ngr)) + ngr
348 :
349 0 : if (nsppol == 2) then
350 0 : nwan(2) = nwan(2) - sum(nw(2,1:ngr))
351 : end if
352 :
353 0 : mwan = maxval(nwan(:))
354 :
355 0 : do isppol = 1 , nsppol
356 0 : do iwan = 1 , tmp_nwan(isppol)
357 :
358 0 : wanncent(:,iwan,isppol) = tmp_cent(:,iwan,isppol)
359 0 : wannspr(iwan,isppol) = tmp_spr(iwan,isppol)
360 0 : newocc_wan(iwan,isppol) = tmp_occ(iwan,isppol)
361 :
362 : end do
363 : end do
364 :
365 0 : do igr = 1 , ngr
366 :
367 0 : wanncent(:,tmp_nwan(1)+igr,1) = amawf(:,igr)
368 0 : wannspr(tmp_nwan(1)+igr,1) = amaspr(igr)
369 0 : newocc_wan(tmp_nwan(1)+igr,1) = amaocc(igr)
370 :
371 : end do
372 :
373 : ! Ordering again:
374 : ! Asign each MLWFs to one fragment, the same as their nearest atom:
375 :
376 0 : call order_wannier(mwan,natom,nwan,nsppol,ord,vdw_typfrag,wanncent,xcart)
377 :
378 :
379 0 : write(std_out,*) ch10,'Full set of Wannier functions and spreads'
380 0 : write(std_out,*) 'after both splitting of p-like WFs and amalgamation',ch10
381 :
382 0 : do ll=1,abs(vdw_nfrag)
383 0 : write(std_out,*) 'MLWF centers and spreads in fragment',ll,ch10
384 0 : do jj=1,nsppol
385 0 : do iwan=1,nwan(jj)
386 0 : if (ord(iwan,jj)==ll) then
387 0 : write(std_out,*) 'X', (Bohr_Ang*wanncent(ii,iwan,jj),ii=1,3),Bohr_Ang*wannspr(iwan,jj)
388 : end if
389 : end do
390 : end do
391 : end do
392 :
393 : end if ! any(nw(:,:) /= 0)
394 : end if ! all((npwf(:)==0).and.vdw_xc/=14)
395 :
396 : !vdW-WF VERSION 1
397 :
398 3 : if(vdw_xc==10) then
399 :
400 4 : ABI_MALLOC(dcenters,(3,mwan,nsppol))
401 4 : ABI_MALLOC(rc,(mwan,nsppol))
402 3 : ABI_MALLOC(rv,(mwan,nsppol))
403 : ! Calculate intermediate quantities
404 2 : do jj=1,nsppol
405 6 : do iwan=1, nwan(jj)
406 4 : rc(iwan,jj)= three*(0.769d0+half*dlog(wannspr(iwan,jj)))
407 : ! rv(iwan,jj)= (1.475d0-half_sqrt3*dlog(wannspr(iwan,jj)))*wannspr(iwan,jj)
408 : ! r_v suggested in JPhysChemA 113:5224 [[cite:Silvestrelli2009]]
409 5 : rv(iwan,jj)= (rc(iwan,jj)*wannspr(iwan,jj))/sqrt3
410 : end do
411 : end do
412 1 : corrvdw=0.0d0 !Initializing the vdW correction energy.
413 :
414 2 : do ii=1,nsppol
415 3 : do jj=1,nsppol
416 6 : do iwan=1,nwan(ii)
417 21 : do jwan=1,nwan(jj)
418 :
419 : call getFu(wannspr(iwan,ii),wannspr(jwan,jj),rc(iwan,ii),rc(jwan,jj),&
420 16 : & newocc_wan(iwan,ii),newocc_wan(jwan,jj),fu)
421 :
422 : csix(iwan,jwan,ii,jj)=( ( ((wannspr(iwan,ii))**1.5d0)*&
423 20 : & (wannspr(jwan,jj)**three))/(two*(three**1.25d0) ) )*fu
424 :
425 : end do
426 : end do
427 : end do
428 : end do
429 :
430 : ! if (nsppol == 1) then
431 : ! csix(:,:,:,:)=sqrt2*csix(:,:,:,:) !For non spin polarized systems
432 : ! end if
433 :
434 :
435 : ! DEBUG
436 1 : write(std_out,*) ch10,'C6ij coefficients matrix',ch10
437 2 : do ii=1,nsppol
438 3 : do jj=1,nsppol
439 6 : do iwan=1,nwan(ii)
440 5 : write(std_out,*) (csix(iwan,jwan,ii,jj),jwan=1,nwan(jj)),ch10
441 : end do
442 : end do
443 : end do
444 : ! END DEBUG
445 :
446 : ! test k=0
447 2 : do ii=1,nsppol
448 6 : do iwan=1,nwan(ii)
449 25 : do inx=-abs(vdw_supercell(1)),abs(vdw_supercell(1))
450 124 : do iny=-abs(vdw_supercell(2)),abs(vdw_supercell(2))
451 620 : do inz=-abs(vdw_supercell(3)),abs(vdw_supercell(3))
452 1100 : do jj=1,nsppol
453 3000 : do jwan=1,nwan(jj)
454 :
455 2000 : if(inx==0.and.iny==0.and.inz==0.and.ord(jwan,jj)==ord(iwan,ii)) cycle
456 : ! This avoids intrafragment vdW interactions.
457 1984 : if(vdw_supercell(1)<=0.and.inx==0.and.ord(jwan,jj)==ord(iwan,ii)) cycle
458 1984 : if(vdw_supercell(2)<=0.and.iny==0.and.ord(jwan,jj)==ord(iwan,ii)) cycle
459 1984 : if(vdw_supercell(3)<=0.and.inz==0.and.ord(jwan,jj)==ord(iwan,ii)) cycle
460 : ! Last three conditions allow proper treatment of layered systems.
461 :
462 : dcenters(:,jwan,jj) = (real(inx,dp))*rprimd(:,1)+(real(iny,dp))*rprimd(:,2)+&
463 7936 : & (real(inz,dp))*rprimd(:,3)+wanncent(:,jwan,jj)
464 : rij=sqrt((dcenters(1,jwan,jj)-wanncent(1,iwan,ii))**2+&
465 : & (dcenters(2,jwan,jj)-wanncent(2,iwan,ii))**2+&
466 1984 : & (dcenters(3,jwan,jj)-wanncent(3,iwan,ii))**2)
467 :
468 1984 : fij=one/(one+exp(-a*(rij/(rv(iwan,ii)+rv(jwan,jj))-one))) !Damping function.
469 :
470 2500 : corrvdw = corrvdw - csix(iwan,jwan,ii,jj)*fij/(two*(rij**6)) !making the sum of eq(4) of
471 : ! JPhysChemA 113:5224-5234 [[cite:Silvestrelli2009]]. Each term is divided by two because
472 : ! we are counting twice within the unit cell, also the
473 : ! interactions with neighbor cells are properly acounted for in
474 : ! this way.
475 :
476 : ! write(std_out,*) 'i=',iwan, 'j=',jwan, 'C6ij=', csix(iwan,jwan)
477 : ! write(std_out,*) 'inx=',inx, "iny=",iny, "inz=",inz, "Evdw=",&
478 : ! & -(csix(iwan,jwan)*fij/(two*rij**6))*Ha_ev*ten**3
479 : ! write(std_out,*) 'rnl=',rnl
480 : end do
481 : end do
482 : end do
483 : end do
484 : end do
485 : end do
486 : end do
487 :
488 1 : ABI_FREE(dcenters)
489 1 : ABI_FREE(rc)
490 1 : ABI_FREE(rv)
491 :
492 1 : write(message, '(2a,i2,2a,f12.6,2a,f12.6,a)' )ch10,&
493 1 : & ' vdw_xc : ',10,ch10,&
494 1 : & ' van der Waals correction(Ha):', corrvdw,ch10,&
495 2 : & ' van der Waals correction(eV):', corrvdw*Ha_ev,ch10
496 1 : call wrtout(std_out,message,'COLL')
497 1 : call wrtout(ab_out,message,'COLL')
498 :
499 : end if
500 :
501 : !vdW-WF VERSION 2: Phys. Rev. B. 85:073101 (2012) [[cite:Ambrosetti2012]]
502 :
503 3 : if (vdw_xc==11) then
504 :
505 4 : ABI_MALLOC(dcenters,(3,mwan,nsppol))
506 4 : ABI_MALLOC(rv,(mwan,nsppol))
507 3 : ABI_MALLOC(xi,(mwan,nsppol))
508 :
509 : ! Calculate intermediate quantities
510 2 : do jj=1,nsppol
511 6 : do iwan=1, nwan(jj)
512 4 : rv(iwan,jj)= ( (1.20d0/Bohr_Ang)*wannspr(iwan,jj) )/sqrt3
513 5 : write(std_out,*) 'rv(iwan,jj)=',rv(iwan,jj),ch10
514 : end do
515 : end do
516 :
517 : ! C6 coefficients between WF
518 23 : csix(:,:,:,:) = 0.0d0
519 1 : corrvdw = 0.0d0
520 :
521 1 : call ovlp_wann(mwan,nwan,nsppol,ord,wanncent,wannspr,xi)
522 :
523 : ! DEBUG
524 1 : write(std_out,*)ch10,'xi(iwan,isspol)=',ch10
525 2 : do jj=1,nsppol
526 2 : write(std_out,*) (xi(iwan,jj),iwan=1,nwan(jj))
527 : end do
528 : ! END DEBUG
529 :
530 2 : do ii=1,nsppol
531 3 : do jj=1,nsppol
532 6 : do iwan=1,nwan(ii)
533 21 : do jwan=1,nwan(jj)
534 :
535 : csix(iwan,jwan,ii,jj)=onehalf*( (wannspr(iwan,ii)*wannspr(jwan,jj))**three )*&
536 : & ((xi(iwan,ii)*xi(jwan,jj))*gama**onehalf)/( sqrt(xi(iwan,ii))*&
537 20 : & wannspr(iwan,ii)**onehalf + sqrt(xi(jwan,jj))*wannspr(jwan,jj)**onehalf )
538 :
539 : end do
540 : end do
541 : end do
542 : end do
543 :
544 : ! if (nsppol == 1) then
545 : ! csix(:,:,:,:)=sqrt2*csix(:,:,:,:) !For non spin polarized systems
546 : ! end if
547 :
548 : ! DEBUG
549 1 : write(std_out,*) ch10,'C6ij coefficients:',ch10
550 2 : do ii=1,nsppol
551 3 : do jj=1,nsppol
552 6 : do iwan=1,nwan(ii)
553 5 : write(std_out,*) (csix(iwan,jwan,ii,jj),jwan=1,nwan(jj))
554 : end do
555 : end do
556 : end do
557 : ! END DEBUG
558 2 : do ii=1,nsppol
559 6 : do iwan=1,nwan(ii)
560 33 : do inx=-abs(vdw_supercell(1)),abs(vdw_supercell(1))
561 228 : do iny=-abs(vdw_supercell(2)),abs(vdw_supercell(2))
562 1596 : do inz=-abs(vdw_supercell(3)),abs(vdw_supercell(3))
563 2940 : do jj=1,nsppol
564 8232 : do jwan=1,nwan(jj)
565 :
566 5488 : if(inx==0.and.iny==0.and.inz==0.and.ord(jwan,jj)==ord(iwan,ii)) cycle
567 : ! This avoids intrafragment vdW interactions.
568 5472 : if(vdw_supercell(1)<=0.and.inx==0.and.ord(jwan,jj)==ord(iwan,ii)) cycle
569 5472 : if(vdw_supercell(2)<=0.and.iny==0.and.ord(jwan,jj)==ord(iwan,ii)) cycle
570 5472 : if(vdw_supercell(3)<=0.and.inz==0.and.ord(jwan,jj)==ord(iwan,ii)) cycle
571 : ! Last three conditions allow proper treatment of layered systems.
572 :
573 : dcenters(:,jwan,jj) = (real(inx,dp))*rprimd(:,1)+(real(iny,dp))*rprimd(:,2)+&
574 21888 : & (real(inz,dp))*rprimd(:,3)+wanncent(:,jwan,jj)
575 : rij=sqrt((dcenters(1,jwan,jj)-wanncent(1,iwan,ii))**2+&
576 : & (dcenters(2,jwan,jj)-wanncent(2,iwan,ii))**2+&
577 5472 : & (dcenters(3,jwan,jj)-wanncent(3,iwan,ii))**2)
578 :
579 5472 : fij=one/(one+exp(-a*(rij/(rv(iwan,ii)+rv(jwan,jj))-one))) !Damping function.
580 : ! DEBUG
581 : ! write(std_out,*) 'f_i,j=',fij,ch10
582 : ! END DEBUG
583 6860 : corrvdw = corrvdw - csix(iwan,jwan,ii,jj)*fij/(two*(rij**6)) !making the sum of eq(4) of
584 : ! JPhysChemA 113:5224-5234 [[cite:Silvestrelli2009]]
585 : end do
586 : end do
587 : end do
588 : end do
589 : end do
590 : end do
591 : end do
592 :
593 1 : write(message, '(2a,i2,2a,f12.6,2a,f12.6,a)' )ch10,&
594 1 : & ' vdw_xc : ',11,ch10,&
595 1 : & ' van der Waals correction(Ha):', corrvdw,ch10,&
596 2 : & ' van der Waals correction(eV):', corrvdw*Ha_ev,ch10
597 1 : call wrtout(std_out,message,'COLL')
598 1 : call wrtout(ab_out,message,'COLL')
599 :
600 1 : ABI_FREE(dcenters)
601 1 : ABI_FREE(rv)
602 1 : ABI_FREE(xi)
603 : end if
604 :
605 : !vdW-WF VERSION 3 (Using the long range limit of VV10 functional)
606 :
607 3 : if(vdw_xc==12) then
608 :
609 0 : ABI_MALLOC(dcenters,(3,mwan,nsppol))
610 0 : ABI_MALLOC(rc,(mwan,nsppol))
611 0 : ABI_MALLOC(rv,(mwan,nsppol))
612 : ! Calculate intermediate quantities
613 0 : do jj=1,nsppol
614 0 : do iwan=1, nwan(jj)
615 : ! rc(iwan,jj)= three*(0.769d0+half*dlog(wannspr(iwan,jj))) !from Silvestrelli see above.
616 0 : rc(iwan,jj)=three*wannspr(iwan,jj) !integral cutoff
617 : ! rv(iwan,jj)= (1.475d0-half_sqrt3*dlog(wannspr(iwan,jj)))*wannspr(iwan,jj)
618 0 : rv(iwan,jj)= wannspr(iwan,jj)*sqrt3*(0.769d0+half*dlog(wannspr(iwan,jj)))
619 : ! r_v suggested in JPhysChemA 113:5224 [[cite:Silvestrelli2009]]
620 : end do
621 : end do
622 0 : corrvdw=0.0d0 !Initializing the vdW correction energy.
623 :
624 0 : do ii=1,nsppol
625 0 : do jj=1,nsppol
626 0 : do iwan=1,nwan(ii)
627 0 : do jwan=1,nwan(jj)
628 :
629 0 : call vv10limit(wannspr(iwan,ii),wannspr(jwan,jj),rc(iwan,ii),rc(jwan,jj),fu)
630 :
631 0 : csix(iwan,jwan,ii,jj)=(1296.0d0/( (wannspr(iwan,ii)*wannspr(jwan,jj) )**3))*fu
632 : ! vv10limit needs revision as an error regarding occupations has been included
633 : ! currently we are calculating it with 1 electron per MLWF and there is an error four-->two
634 : end do
635 : end do
636 : end do
637 : end do
638 :
639 : ! if (nsppol == 1) then
640 : ! csix(:,:,:,:)=sqrt2*csix(:,:,:,:) !For non spin polarized systems
641 : ! end if
642 :
643 :
644 : ! DEBUG
645 :
646 0 : write(std_out,*) ch10,'C6ij coefficients matrix',ch10
647 0 : do ii=1,nsppol
648 0 : do jj=1,nsppol
649 0 : do iwan=1,nwan(ii)
650 0 : write(std_out,*) (csix(iwan,jwan,ii,jj),jwan=1,nwan(jj)),ch10
651 : end do
652 : end do
653 : end do
654 : ! END DEBUG
655 :
656 : ! test k=0
657 0 : do ii=1,nsppol
658 0 : do iwan=1,nwan(ii)
659 0 : do inx=-abs(vdw_supercell(1)),abs(vdw_supercell(1))
660 0 : do iny=-abs(vdw_supercell(2)),abs(vdw_supercell(2))
661 0 : do inz=-abs(vdw_supercell(3)),abs(vdw_supercell(3))
662 0 : do jj=1,nsppol
663 0 : do jwan=1,nwan(jj)
664 :
665 0 : if(inx==0.and.iny==0.and.inz==0.and.ord(jwan,jj)==ord(iwan,ii)) cycle
666 : ! This avoids intrafragment vdW interactions.
667 0 : if(vdw_supercell(1)<=0.and.inx==0.and.ord(jwan,jj)==ord(iwan,ii)) cycle
668 0 : if(vdw_supercell(2)<=0.and.iny==0.and.ord(jwan,jj)==ord(iwan,ii)) cycle
669 0 : if(vdw_supercell(3)<=0.and.inz==0.and.ord(jwan,jj)==ord(iwan,ii)) cycle
670 : ! Last three conditions allow proper treatment of layered systems.
671 :
672 : dcenters(:,jwan,jj) = (real(inx,dp))*rprimd(:,1)+(real(iny,dp))*rprimd(:,2)+&
673 0 : & (real(inz,dp))*rprimd(:,3)+wanncent(:,jwan,jj)
674 : rij=sqrt((dcenters(1,jwan,jj)-wanncent(1,iwan,ii))**2+&
675 : & (dcenters(2,jwan,jj)-wanncent(2,iwan,ii))**2+&
676 0 : & (dcenters(3,jwan,jj)-wanncent(3,iwan,ii))**2)
677 :
678 0 : fij=one/(one+exp(-a*(rij/(rv(iwan,ii)+rv(jwan,jj))-one))) !Damping function.
679 :
680 0 : corrvdw = corrvdw - csix(iwan,jwan,ii,jj)*fij/(two*(rij**6)) !making the sum of eq(4) of
681 : ! JPhysChemA 113:5224-5234 [[cite:Silvestrelli2009]]. Each term is divided by two because
682 : ! we are counting twice within the unit cell, also the
683 : ! interactions with neighbor cells are properly acounted for in
684 : ! this way.
685 :
686 : ! write(std_out,*) 'i=',iwan, 'j=',jwan, 'C6ij=', csix(iwan,jwan)
687 : ! write(std_out,*) 'inx=',inx, "iny=",iny, "inz=",inz, "Evdw=",&
688 : ! & -(csix(iwan,jwan)*fij/(two*rij**6))*Ha_ev*ten**3
689 : ! write(std_out,*) 'rnl=',rnl
690 : end do
691 : end do
692 : end do
693 : end do
694 : end do
695 : end do
696 : end do
697 :
698 0 : ABI_FREE(dcenters)
699 0 : ABI_FREE(rc)
700 0 : ABI_FREE(rv)
701 :
702 0 : write(message, '(2a,i2,2a,f12.6,2a,f12.6,a)' )ch10,&
703 0 : & ' vdw_xc : ',12,ch10,&
704 0 : & ' van der Waals correction(Ha):', corrvdw,ch10,&
705 0 : & ' van der Waals correction(eV):', corrvdw*Ha_ev,ch10
706 0 : call wrtout(std_out,message,'COLL')
707 0 : call wrtout(ab_out,message,'COLL')
708 :
709 : end if
710 :
711 :
712 : !vdW-QHO-WF method.
713 :
714 3 : if(vdw_xc==14) then
715 :
716 : ! There is no need of building the full set of MLWFs corresponding to the vdw_supercell
717 : ! since the matrix elements can be computed on the fly by translating the MLWFs centers.
718 : ! The polarizability and QHO frequencies are obteined for the MLWFs in the unit cell:
719 :
720 3 : ABI_MALLOC(polar,(mwan))
721 2 : ABI_MALLOC(omega,(mwan))
722 :
723 1 : corrvdw=zero
724 1 : fu=zero
725 :
726 2 : do isppol=1,nsppol
727 5 : polar=zero
728 5 : omega=zero
729 5 : do iwan=1,nwan(isppol)
730 4 : polar(iwan)=gama1*(wannspr(iwan,isppol)**3)
731 : ! assuming Z( not zeta) is the charge of a single Wannier function, 2 for non polarized and 1 for polarized)
732 4 : omega(iwan)=sqrt(zeta*(3-nsppol)/polar(iwan))
733 5 : fu=fu+omega(iwan)
734 : end do
735 : !DEBUG
736 1 : write(std_out,*) 'Unit cell non interacting QHO energy:',ch10
737 1 : write(std_out,*) (1.5d0)*fu,ch10
738 : !ENDDEBUG
739 :
740 : ! Total number of unit cells considered:
741 1 : nc=(2*abs(vdw_supercell(1))+1)*(2*abs(vdw_supercell(2))+1)*(2*abs(vdw_supercell(3))+1)
742 : !DEBUG
743 1 : write(std_out,*) 'Evaluation of vdW energy from ',nc,' unit cells.',ch10
744 :
745 1 : write(std_out,*) 'VdW supercell non interacting QHO energy:',ch10
746 1 : fu=nc*fu
747 1 : write(std_out,*) (1.5d0)*fu,ch10
748 : !ENDDEBUG
749 4 : ABI_MALLOC(c_QHO,(3*mwan*nc,3*mwan*nc))
750 3 : ABI_MALLOC(Tij_dip,(3*mwan*nc,3*mwan*nc))
751 4 : ABI_MALLOC(dcenters,(3,mwan,nsppol))
752 :
753 105301 : c_QHO(:,:)=zero
754 105301 : Tij_dip(:,:)=zero
755 1 : inx=0
756 1 : iny=0
757 :
758 : !writing matrix diagonal terms
759 28 : do ll=1,nc
760 136 : do iwan=1,nwan(isppol)
761 459 : do ii=1,3
762 324 : inx=inx+1
763 432 : c_QHO(inx,inx)=omega(iwan)*omega(iwan)
764 : end do
765 : end do
766 : end do
767 :
768 : !writing terms for interactions from each cell to the central unit cell
769 : ! icx, icy, icz labels the cells in the supercell defined by vdw_supercell
770 : ! while inx and iny label QHO matrix elements.
771 : ! iny should start from (nc/2)*3*mwan + 1 --> r=r_central-r_cell, and r_cell=displaced positions
772 : ! inx starts from 1 up to (nc/2)*3*mwan +1, this includes central cell intra-interactions.
773 :
774 1 : inx=0
775 3 : do icz=-abs(vdw_supercell(3)),0
776 2 : if (icz==0) then
777 : mm=0
778 : else
779 1 : mm=abs(vdw_supercell(2))
780 : end if
781 8 : do icy=-abs(vdw_supercell(2)),mm
782 5 : if (icy==0) then
783 2 : ll=0
784 : else
785 3 : ll=abs(vdw_supercell(1))
786 : end if
787 20 : do icx=-abs(vdw_supercell(1)),ll
788 70 : do iwan=1,nwan(isppol)
789 221 : do ii=1,3
790 156 : inx=inx+1
791 : ! loop over the MLWFs in the 'central' unit cell:
792 156 : iny=(nc/2)*3*mwan
793 832 : do jwan=1,nwan(isppol)
794 2652 : do jj=1,3
795 1872 : iny=iny+1
796 :
797 1872 : if (inx==iny) cycle !in order to avoid digonal terms which were already computed
798 :
799 : dcenters(:,iwan,isppol) = (real(icx,dp))*rprimd(:,1)+(real(icy,dp))*rprimd(:,2)+&
800 7488 : & (real(icz,dp))*rprimd(:,3)+wanncent(:,iwan,isppol)
801 :
802 7488 : rij_c = -dcenters(:,iwan,isppol)+wanncent(:,jwan,isppol)
803 1872 : rij = dnrm2(3,rij_c,1)
804 : ! rij=sqrt(dot_product(rij_c,rij_c))
805 1872 : if (rij==zero) cycle
806 : !DEBUG
807 : ! write(std_out,*) 'rij=',rij,' inx=',inx,' iny=',iny, ch10
808 : !ENDDEBUG
809 : ! This corresponds to beta*sigma_ij in the original paper:
810 1836 : fij=beta*sqrt(wannspr(iwan,isppol)*wannspr(iwan,isppol)+wannspr(jwan,isppol)*wannspr(jwan,isppol))
811 1836 : erfValue = abi_derf(rij/fij)
812 :
813 1836 : if (ii==jj) then
814 612 : ll=1
815 : else
816 1224 : ll=0
817 : end if ! ii==jj
818 :
819 : Tij_dip(inx,iny)=-((3*rij_c(ii)*rij_c(jj)-rij*rij*ll)/rij**5)* &
820 : & (erfValue-two*rij*exp(-((rij/fij)**2))/(sqrt(pi)*fij)) + &
821 1836 : & 2.*two*rij_c(ii)*rij_c(jj)*exp(-((rij/fij)**2))/(sqrt(pi)*fij*fij*fij*rij*rij)
822 :
823 2496 : c_QHO(inx,iny)=omega(iwan)*omega(jwan)*sqrt(polar(iwan)*polar(jwan))*Tij_dip(inx,iny)
824 :
825 : end do !jj=1,3
826 : end do !jwan=1,nwan
827 : end do !ii=1,3
828 : end do !iwan=1,nwan
829 : end do !icx=-abs(vdw_supercell(1)),ll
830 : end do !icy=-abs(vdw_supercell(2)),mm
831 : end do !icz=-abs(vdw_supercell(3)),0
832 :
833 :
834 : !writing terms for interactions from the central unit cell to each cell
835 : ! icx, icy, icz labels the cells in the supercell defined by vdw_supercell
836 : ! while inx and iny label QHO matrix elements.
837 : ! inx should start from (nc/2)*3*mwan + 1 --> r=-r_central+r_cell, and r_cell=displaced positions
838 : ! iny starts from (nc/2)*3*mwan+3*man+1 to avoid central cell intra interactions which were built
839 : ! before
840 :
841 1 : iny=(nc/2)*3*mwan+3*mwan
842 :
843 3 : do icz=0,abs(vdw_supercell(3))
844 2 : if (icz==0) then
845 : mm=1
846 : else
847 1 : mm=-abs(vdw_supercell(2))
848 : end if
849 7 : do icy=mm,abs(vdw_supercell(2))
850 4 : if (icy==0) then
851 1 : ll=1
852 : else
853 3 : ll=-abs(vdw_supercell(1))
854 : end if
855 16 : do icx=ll,abs(vdw_supercell(1))
856 54 : do iwan=1,nwan(isppol)
857 170 : do ii=1,3
858 120 : iny=iny+1
859 : ! loop over the MLWFs in the 'central' unit cell:
860 120 : inx=(nc/2)*3*mwan
861 640 : do jwan=1,nwan(isppol)
862 2040 : do jj=1,3
863 1440 : inx=inx+1
864 :
865 1440 : if (inx==iny) cycle !in order to avoid digonal terms which were already computed
866 :
867 :
868 : dcenters(:,iwan,isppol) = (real(icx,dp))*rprimd(:,1)+(real(icy,dp))*rprimd(:,2)+&
869 5760 : & (real(icz,dp))*rprimd(:,3)+wanncent(:,iwan,isppol)
870 :
871 5760 : rij_c = dcenters(:,iwan,isppol)-wanncent(:,jwan,isppol)
872 1440 : rij = dnrm2(3,rij_c,1)
873 : ! rij=sqrt(dot_product(rij_c,rij_c))
874 1440 : if(rij==zero) cycle
875 : !DEBUG
876 : ! write(std_out,*) 'rij=',rij,' inx=',inx,' iny=',iny, ch10
877 : !ENDDEBUG
878 : ! This corresponds to beta*sigma_ij in the original paper:
879 1440 : fij=beta*sqrt(wannspr(iwan,isppol)*wannspr(iwan,isppol)+wannspr(jwan,isppol)*wannspr(jwan,isppol))
880 1440 : erfValue = abi_derf(rij/fij)
881 :
882 1440 : if (ii==jj) then
883 480 : ll=1
884 : else
885 960 : ll=0
886 : end if ! ii==jj
887 :
888 : Tij_dip(inx,iny)=-((3*rij_c(ii)*rij_c(jj)-rij*rij*ll)/rij**5)* &
889 : & (erfValue-two*rij*exp(-((rij/fij)**2))/(sqrt(pi)*fij)) + &
890 1440 : & 2.*two*rij_c(ii)*rij_c(jj)*exp(-((rij/fij)**2))/(sqrt(pi)*fij*fij*fij*rij*rij)
891 :
892 1920 : c_QHO(inx,iny)=omega(iwan)*omega(jwan)*sqrt(polar(iwan)*polar(jwan))*Tij_dip(inx,iny)
893 :
894 : end do !jj=1,3
895 : end do !jwan=1,nwan
896 : end do !ii=1,3
897 : end do !iwan=1,nwan
898 : end do !icx=-abs(vdw_supercell(1)),ll
899 : end do !icy=-abs(vdw_supercell(2)),mm
900 : end do !icz=-abs(vdw_supercell(3)),0
901 :
902 :
903 : ! Here we diagonalize the matrix c_QHO and the eigenvalues come back in vector eigv
904 3 : ABI_MALLOC(matrx,((3*mwan*nc*(3*mwan*nc+1))/2))
905 3 : ABI_MALLOC(eigv,(3*mwan*nc))
906 4 : ABI_MALLOC(eigvec,(3*mwan*nc,3*mwan*nc))
907 3 : ABI_MALLOC(zhpev1,(3*2*mwan*nc-1))
908 3 : ABI_MALLOC(zhpev2,(3*3*mwan*nc-2))
909 52651 : matrx(:)=cmplx(zero,zero)
910 325 : do jj=1,3*mwan*nc
911 52975 : do ii=1,jj
912 52974 : matrx(ii+(jj-1)*jj/2)=cmplx(c_QHO(ii,jj),0.0d0)
913 : end do
914 : end do
915 :
916 : !DEBUG
917 : ! write(std_out,*) 'Printing the real part of elements in array matrx:',ch10
918 : ! do jj=1,3*mwan*nc*(3*mwan*nc+1)/2
919 : ! write(std_out,*) real(matrx(jj))
920 : ! enddo
921 : !ENDDEBUG
922 1 : call ZHPEV ('N','U',3*mwan*nc,matrx,eigv,eigvec,3*mwan*nc,zhpev1,zhpev2,ier)
923 : !DEBUG
924 1 : write(std_out,*) 'Last argument of ZHPEV: ier=',ch10
925 1 : write(std_out,*) ier,ch10
926 1 : write(std_out,*) 'List of c_QHO eigenvaules:',ch10
927 325 : do ll=1,3*mwan*nc
928 325 : write(std_out,*) eigv(ll)
929 : end do
930 : !ENDDEBUG
931 1 : if(ier/=0) then !vz_d
932 0 : ABI_ERROR('zhpev fails!') !vz_d
933 : end if !vz_d
934 :
935 1 : ABI_FREE(matrx)
936 1 : ABI_FREE(eigvec)
937 1 : ABI_FREE(zhpev1)
938 1 : ABI_FREE(zhpev2)
939 :
940 326 : do ii=1,3*mwan*nc !3*nwan(isppol)
941 325 : corrvdw=corrvdw+sqrt(eigv(ii))
942 : end do
943 :
944 : end do ! end isppol
945 :
946 :
947 1 : corrvdw=0.5*corrvdw
948 :
949 : !DEBUG
950 1 : write(std_out,*) 'Half the sum of interacting matrix eigenvalues square roots:',ch10
951 1 : write(std_out,*) corrvdw,ch10
952 : !ENDDEBUG
953 :
954 :
955 :
956 1 : corrvdw=corrvdw-1.5d0*fu
957 :
958 1 : ABI_FREE(c_QHO)
959 1 : ABI_FREE(Tij_dip)
960 1 : ABI_FREE(dcenters)
961 1 : ABI_FREE(eigv)
962 1 : ABI_FREE(polar)
963 1 : ABI_FREE(omega)
964 :
965 1 : write(message, '(2a,i2,2a,f12.6,2a,f12.6,a)' )ch10,&
966 1 : & ' vdw_xc : ',14,ch10,&
967 1 : & ' van der Waals correction(Ha):', corrvdw,ch10,&
968 2 : & ' van der Waals correction(eV):', corrvdw*Ha_ev,ch10
969 1 : call wrtout(std_out,message,'COLL')
970 1 : call wrtout(ab_out,message,'COLL')
971 :
972 : end if ! vdw-QHO
973 :
974 3 : if(allocated(ord))then
975 3 : ABI_FREE(ord)
976 : end if
977 3 : if(allocated(wanncent))then
978 3 : ABI_FREE(wanncent)
979 : end if
980 3 : if(allocated(wannspr))then
981 3 : ABI_FREE(wannspr)
982 : end if
983 3 : if(allocated(newocc_wan))then
984 3 : ABI_FREE(newocc_wan)
985 : end if
986 3 : if(allocated(npwf))then
987 3 : ABI_FREE(npwf)
988 : end if
989 3 : if (allocated(inwan))then
990 3 : ABI_FREE(inwan)
991 : end if
992 3 : if(allocated(nw))then
993 2 : ABI_FREE(nw)
994 : end if
995 3 : if(allocated(nwan))then
996 3 : ABI_FREE(nwan)
997 : end if
998 3 : ABI_FREE(wc_rec)
999 3 : if(allocated(amagr))then
1000 2 : ABI_FREE(amagr)
1001 : end if
1002 3 : if(allocated(amawf))then
1003 0 : ABI_FREE(amawf)
1004 : end if
1005 : if(allocated(Tij_dip))then
1006 : ABI_FREE(Tij_dip)
1007 : end if
1008 : if(allocated(c_QHO))then
1009 : ABI_FREE(c_QHO)
1010 : end if
1011 3 : if(allocated(amaspr))then
1012 0 : ABI_FREE(amaspr)
1013 : end if
1014 3 : if(allocated(amaocc))then
1015 0 : ABI_FREE(amaocc)
1016 : end if
1017 3 : if(allocated(tmp_cent))then
1018 0 : ABI_FREE(tmp_cent)
1019 : end if
1020 3 : if(allocated(tmp_nwan))then
1021 0 : ABI_FREE(tmp_nwan)
1022 : end if
1023 3 : if(allocated(tmp_spr))then
1024 0 : ABI_FREE(tmp_spr)
1025 : end if
1026 3 : if(allocated(tmp_occ))then
1027 0 : ABI_FREE(tmp_occ)
1028 : end if
1029 :
1030 :
1031 3 : end subroutine evdw_wannier
1032 : !!***
1033 :
1034 : !!****f* ABINIT/getFu
1035 : !! NAME
1036 : !! getFu
1037 : !!
1038 : !! FUNCTION
1039 : !! Performs double integral needed to evaluate C6
1040 : !! coefficients. Eq. (9) in J.Phys.Chem. 113:5224 [[cite:Silvestrelli2009]]
1041 : !!
1042 : !! INPUTS
1043 : !!
1044 : !! OUTPUT
1045 : !!
1046 : !! SOURCE
1047 :
1048 16 : subroutine getFu(sn,sl,rn,rl,occn,occl,fu) ! sn-->spread(n), sl-->spread(l), rn --> rc(n), rl --> rc(l)
1049 :
1050 : real(dp),intent(in)::sn,sl,rn,rl,occn,occl
1051 : real(dp),intent(out)::fu
1052 : !local variables
1053 : integer::nx,ny,ix,iy
1054 : real(dp)::deltax,deltay
1055 : real(dp)::beta,xc,yc,y,x
1056 16 : real(dp),allocatable::arg1(:),res1(:),arg2(:),res2(:)
1057 :
1058 : ! *************************************************************************
1059 :
1060 16 : ny=100
1061 16 : nx=100
1062 16 : beta=(sn/sl)**(1.5d0)
1063 16 : xc=rn
1064 16 : yc=rl
1065 16 : deltax=xc/(real(nx,dp)-1.d0)
1066 16 : deltay=yc/(real(ny,dp)-1.d0)
1067 :
1068 16 : ABI_MALLOC(arg1,(ny))
1069 16 : ABI_MALLOC(res1,(ny))
1070 16 : ABI_MALLOC(arg2,(nx))
1071 16 : ABI_MALLOC(res2,(nx))
1072 :
1073 1616 : do ix=1,nx
1074 :
1075 1600 : x=deltax*(real(ix,dp)-1.d0)
1076 :
1077 161600 : do iy=1,ny
1078 160000 : y=deltay*(real(iy,dp)-1.d0)
1079 161600 : arg1(iy)=( (y**2.d0)*exp(-y) )/( (exp(-x)/(beta*sqrt(occn))) + exp(-y)/(sqrt(occl)) )
1080 : end do
1081 :
1082 1600 : call simpson_int(ny,deltay,arg1,res1)
1083 1616 : arg2(ix)=(x**2.d0)*exp(-x)*res1(ny)
1084 :
1085 : end do
1086 :
1087 16 : call simpson_int(nx,deltax,arg2,res2)
1088 :
1089 16 : Fu = res2(nx)
1090 :
1091 16 : ABI_FREE(arg1)
1092 16 : ABI_FREE(res1)
1093 16 : ABI_FREE(arg2)
1094 16 : ABI_FREE(res2)
1095 16 : end subroutine getFu
1096 : !!***
1097 :
1098 : !!****f* ABINIT/order_wannier
1099 : !! NAME
1100 : !! order_wannier
1101 : !!
1102 : !! FUNCTION
1103 : !! Assign each MLWF with a corresponding fragment of atoms, according
1104 : !! to vdw_typfrag array. Assignation is done by evaluating the distance
1105 : !! from each MLWF center to the unit cell atoms. MLWFs belong to the
1106 : !! same fragment as their nearest atom.
1107 : !!
1108 : !! INPUTS
1109 : !!
1110 : !! OUTPUT
1111 : !!
1112 : !! SOURCE
1113 3 : subroutine order_wannier(mwan,natom,nwan,nsppol,ord,vdw_typfrag,wanncent,xcart)
1114 :
1115 : !Arguments
1116 : integer, intent(in) :: mwan,natom,nsppol,nwan(nsppol),vdw_typfrag(natom) !vz_d
1117 : integer, intent(inout) :: ord(mwan,nsppol)
1118 : real(dp),intent(in) :: wanncent(3,mwan,nsppol),xcart(3,natom)
1119 : !Local variables
1120 : integer :: ii,jj,ll
1121 : real(dp):: dis,dnrm2,mindi
1122 3 : real(dp), allocatable :: tmp(:)
1123 : ! *************************************************************************
1124 :
1125 3 : ABI_MALLOC(tmp,(3))
1126 :
1127 6 : do ll=1,nsppol
1128 18 : do ii=1,nwan(ll)
1129 48 : tmp(:) = wanncent(:,ii,ll) - xcart(:,1)
1130 12 : mindi = dnrm2(3,tmp,1)
1131 : ! mindi=sqrt( dot_product(wanncent(:,ii,ll),wanncent(:,ii,ll))+dot_product(xcart(:,1),xcart(:,1))&
1132 : !& -2*(dot_product(wanncent(:,ii,ll),xcart(:,1))) )
1133 12 : ord(ii,ll)=vdw_typfrag(1)
1134 15 : do jj=2,natom
1135 0 : tmp(:) = wanncent(:,ii,ll) - xcart(:,jj)
1136 0 : dis = dnrm2(3,tmp,1)
1137 : ! dis=sqrt( dot_product(wanncent(:,ii,ll),wanncent(:,ii,ll))+dot_product(xcart(:,jj),xcart(:,jj))&
1138 : !& -2*(dot_product(wanncent(:,ii,ll),xcart(:,jj))) )
1139 12 : if(dis<=mindi) then
1140 0 : mindi=dis
1141 0 : ord(ii,ll)=vdw_typfrag(jj)
1142 : end if
1143 : end do
1144 : end do
1145 : end do
1146 :
1147 3 : ABI_FREE(tmp)
1148 :
1149 3 : end subroutine order_wannier
1150 : !!***
1151 :
1152 : !!****f* ABINIT/ovlp_wann
1153 : !! NAME
1154 : !! ovlp_wann
1155 : !!
1156 : !! FUNCTION
1157 : !! Evaluate volumen reduction of MLWFs
1158 : !! due to intrafragment overlapping
1159 : !!
1160 : !! INPUTS
1161 : !!
1162 : !! OUTPUT
1163 : !!
1164 : !! SOURCE
1165 1 : subroutine ovlp_wann(mwan,nwan,nsppol,ord,wanncent,wannspr,xi)
1166 :
1167 : !Arguments
1168 : integer, intent(in) :: mwan,nsppol,nwan(nsppol),ord(mwan,nsppol) !vz_d
1169 : real(dp),intent(in) :: wanncent(3,mwan,nsppol),wannspr(mwan,nsppol)
1170 : real(dp), intent(out) :: xi(mwan,nsppol)
1171 : !Local variables
1172 : integer :: ii,iwan,ix,iy,iz,jj,jwan,neigh,steps
1173 : real(dp):: dis,disi,discent,veff,vfree,dnrm2
1174 1 : integer, allocatable :: intsec(:,:,:,:)
1175 1 : real(dp), allocatable :: rpoint(:), tmp(:)
1176 : real(dp), parameter :: delt = 0.05d0 !Bohr, spatial mesh (1D) step
1177 : ! *************************************************************************
1178 :
1179 6 : ABI_MALLOC(intsec,(mwan,nsppol,mwan,nsppol))
1180 1 : ABI_MALLOC(rpoint,(3))
1181 1 : ABI_MALLOC(tmp,(3))
1182 26 : intsec(:,:,:,:) = 0
1183 6 : xi(:,:) = 0.0d0
1184 : !detecting WF intersecting neighbors
1185 2 : do ii=1,nsppol
1186 6 : do iwan=1,nwan(ii)
1187 9 : do jj=1,nsppol
1188 24 : do jwan=1,nwan(jj)
1189 16 : dis = 0.0d0
1190 20 : if (ord(jwan,jj)==ord(iwan,ii)) then
1191 :
1192 :
1193 64 : tmp(:) = wanncent(:,iwan,ii) - wanncent(:,jwan,jj)
1194 16 : dis = dnrm2(3,tmp,1)
1195 : ! dis=sqrt( dot_product(wanncent(:,iwan,ii),wanncent(:,iwan,ii))+&
1196 : !& dot_product(wanncent(:,jwan,jj),wanncent(:,jwan,jj))&
1197 : !& -2*( dot_product(wanncent(:,iwan,ii),wanncent(:,jwan,jj)) ) )
1198 :
1199 16 : if ( ii == jj ) then
1200 16 : if ( dis<=(wannspr(iwan,ii)+wannspr(jwan,jj)).and.iwan/=jwan ) then
1201 12 : intsec(iwan,ii,jwan,jj) = 1
1202 : end if
1203 : end if
1204 16 : if ( ii /= jj) then
1205 0 : if ( dis<=(wannspr(iwan,ii)+wannspr(jwan,jj)) ) then
1206 0 : intsec(iwan,ii,jwan,jj) = 1
1207 : end if
1208 : end if
1209 :
1210 : end if
1211 : end do
1212 : end do
1213 : end do
1214 : end do
1215 :
1216 : !DEBUG
1217 1 : write(std_out,*) 'intsec(iwan,ii,jwan,jj)=',ch10
1218 2 : do ii=1,nsppol
1219 6 : do iwan=1,nwan(ii)
1220 9 : do jj=1,nsppol
1221 8 : write(std_out,*) (intsec(iwan,ii,jwan,jj),jwan=1,nwan(jj)),ch10
1222 : end do
1223 : end do
1224 : end do
1225 : !END DEBUG
1226 : !Determining both free and effective volumes.
1227 : !Eqs (6) and (7) in PRB 85:073101 [[cite:Ambrosetti2012]].
1228 : !Creation of grids around each WF centre.
1229 : !Calculation of intersection volumes.
1230 2 : do ii = 1,nsppol
1231 6 : do iwan = 1,nwan(ii)
1232 : ! Spatial meshes and volume parameters
1233 4 : steps=NINT(wannspr(iwan,ii)/delt)
1234 4 : vfree = 0
1235 4 : veff = 0
1236 16 : rpoint(:) = 0.0d0
1237 248 : do iz=-steps,steps
1238 15132 : do iy=-steps,steps
1239 923052 : do ix=-steps,steps
1240 907924 : neigh = 0
1241 907924 : rpoint(1) = wanncent(1,iwan,ii) + ix*delt
1242 907924 : rpoint(2) = wanncent(2,iwan,ii) + iy*delt
1243 907924 : rpoint(3) = wanncent(3,iwan,ii) + iz*delt
1244 :
1245 3631696 : tmp(:) = wanncent(:,iwan,ii) - rpoint(:)
1246 907924 : discent = dnrm2(3,tmp,1)
1247 :
1248 : ! discent = sqrt( dot_product(wanncent(:,iwan,ii),wanncent(:,iwan,ii))&
1249 : !& +dot_product( rpoint(:),rpoint(:) )&
1250 : !& -2*( dot_product( wanncent(:,iwan,ii),rpoint(:) ) ) )
1251 :
1252 907924 : if (discent > wannspr(iwan,ii)) cycle
1253 473040 : if (discent <= wannspr(iwan,ii)) then
1254 :
1255 : neigh = 1
1256 916312 : do jj = 1,nsppol
1257 2748936 : do jwan = 1,nwan(jj)
1258 1832624 : if ( intsec(iwan,ii,jwan,jj) == 0 ) cycle
1259 1832624 : if ( intsec(iwan,ii,jwan,jj) == 1 ) then
1260 :
1261 5497872 : tmp(:) = rpoint(:) - wanncent(:,jwan,jj)
1262 1374468 : disi = dnrm2(3,tmp,1)
1263 : ! disi = sqrt( dot_product(rpoint(:),rpoint(:))&
1264 : !& +dot_product( wanncent(:,jwan,jj),wanncent(:,jwan,jj) )&
1265 : !& -2*( dot_product(rpoint(:),wanncent(:,jwan,jj)) ) )
1266 1374468 : if (disi <= wannspr(jwan,jj)) then
1267 574372 : neigh = neigh + 1
1268 : end if
1269 : end if
1270 : end do
1271 : end do
1272 458156 : if (nsppol==1) then
1273 458156 : veff = veff + 1/(real(neigh,dp)**2)
1274 : end if
1275 458156 : if (nsppol==2) then
1276 0 : veff = veff + 1/real(neigh,dp)
1277 : end if
1278 458156 : vfree = vfree + 1/real(neigh,dp)
1279 : end if
1280 : end do
1281 : end do
1282 : end do
1283 : ! write(std_out,*) 'iwan=',iwan,'ii=',ii,ch10
1284 : ! write(std_out,*) 'vfree=',vfree,'neigh=',neigh,'veff=',veff,ch10
1285 5 : xi(iwan,ii) = veff/vfree
1286 : ! write(std_out,*) 'xi(iwan,ii)=',xi(iwan,ii),ch10
1287 : end do
1288 : end do
1289 :
1290 1 : ABI_FREE(intsec)
1291 1 : ABI_FREE(rpoint)
1292 1 : ABI_FREE(tmp)
1293 :
1294 1 : end subroutine ovlp_wann
1295 : !!***
1296 :
1297 : !!****f* ABINIT/vv10limit
1298 : !! NAME
1299 : !! vv10limit
1300 : !!
1301 : !! FUNCTION
1302 : !! Performs double integral needed to evaluate C6
1303 : !! coefficients from the long range limit of VV10
1304 : !! functional (Phys. Rev. A. 81:062708 (2010)) [[cite:Vydrov2010]]
1305 : !! as expressed in terms of MLWFs.
1306 : !!
1307 : !! INPUTS
1308 : !!
1309 : !! OUTPUT
1310 : !!
1311 : !! SOURCE
1312 :
1313 0 : subroutine vv10limit(sn,sl,rn,rl,fu) ! sn-->spread(n), sl-->spread(l), rn --> rc(n), rl --> rc(l)
1314 :
1315 : real(dp),intent(in)::sn,sl,rn,rl
1316 : real(dp),intent(out)::fu
1317 : !local variables
1318 : integer::nx,ny,ix,iy
1319 : real(dp)::deltax,deltay,pown,powl
1320 : real(dp)::xc,yc,y,x,wgn,wgl,wox,woy
1321 : real(dp),parameter :: cons = 0.0093d0 !related to local band gap model, VV10
1322 0 : real(dp),allocatable::arg1(:),res1(:),arg2(:),res2(:)
1323 : ! *************************************************************************
1324 :
1325 0 : ny=1000
1326 0 : nx=1000
1327 :
1328 0 : xc=rn
1329 0 : yc=rl
1330 0 : deltax=xc/(real(nx,dp)-1.d0)
1331 0 : deltay=yc/(real(ny,dp)-1.d0)
1332 :
1333 0 : ABI_MALLOC(arg1,(ny))
1334 0 : ABI_MALLOC(res1,(ny))
1335 0 : ABI_MALLOC(arg2,(nx))
1336 0 : ABI_MALLOC(res2,(nx))
1337 :
1338 0 : wgn = cons*( (18.0d0/(sn*sqrt3**three))**4 )
1339 0 : pown = two*sqrt3/sn
1340 0 : wgl = cons*( (18.0d0/(sl*sqrt3**three))**4 )
1341 0 : powl = two*sqrt3/sl
1342 :
1343 0 : do ix=1,nx
1344 :
1345 0 : x = deltax*(real(ix,dp)-1.d0)
1346 0 : wox = sqrt(wgn + (four*pown/sn**two)*exp(-pown*x))
1347 :
1348 0 : do iy=1,ny
1349 :
1350 0 : y = deltay*(real(iy,dp)-1.d0)
1351 0 : woy = sqrt(wgl + (four*powl/sl**two)*exp(-powl*y))
1352 :
1353 0 : arg1(iy)=( (y**two)*exp(-powl*y) )/( woy*(wox+woy) )
1354 :
1355 : end do
1356 :
1357 0 : call simpson_int(ny,deltay,arg1,res1)
1358 0 : arg2(ix)=(x**two)*exp(-pown*x)*res1(ny)/wox
1359 :
1360 : end do
1361 :
1362 0 : call simpson_int(nx,deltax,arg2,res2)
1363 :
1364 0 : fu = res2(nx)
1365 :
1366 : !DEBUG
1367 0 : write(std_out,*) ch10,'Int argument',ch10
1368 0 : do ix=1,nx
1369 0 : write(std_out,*) deltax*(real(ix,dp)-1.d0), arg2(ix)
1370 : end do
1371 : !END DEBUG
1372 :
1373 0 : ABI_FREE(arg1)
1374 0 : ABI_FREE(res1)
1375 0 : ABI_FREE(arg2)
1376 0 : ABI_FREE(res2)
1377 0 : end subroutine vv10limit
1378 : !!***
1379 :
1380 : !!****f* ABINIT/amalgam
1381 : !! NAME
1382 : !! amalgam
1383 : !!
1384 : !! FUNCTION
1385 : !! Amalgamates MLWFs, which are close enough,
1386 : !! into one MLWF as suggested in J.Chem.Phys.135:154105 (2011) [[cite:Andrinopoulos2011]]
1387 : !!
1388 : !! INPUTS
1389 : !!
1390 : !! OUTPUT
1391 : !!
1392 : !! SOURCE
1393 :
1394 2 : subroutine amalgam(amagr,ngr,nsppol,nw,mwan,ord,nwan,vdw_nfrag,wanncent,wannspr)
1395 :
1396 : !Arguments
1397 : integer,intent(in) :: nsppol,mwan,vdw_nfrag
1398 : integer,intent(in) :: ord(mwan,nsppol),nwan(nsppol)
1399 : real(dp),intent(in):: wanncent(3,mwan,nsppol),wannspr(mwan,nsppol)
1400 : integer,intent(out):: ngr
1401 : integer,intent(out):: nw(nsppol,mwan/2),amagr(mwan,nsppol,mwan/2)
1402 : !local variables
1403 : integer :: dimen,ii,igr,isppol,iw,iwan,jj,jsppol,jwan,ll
1404 : real(dp):: dis, dnrm2
1405 2 : real(dp),allocatable :: tmp(:)
1406 : ! *************************************************************************
1407 :
1408 2 : ABI_MALLOC(tmp,(3))
1409 :
1410 : !Selecting pairs of MLWFs satisfying amalgamation criteria
1411 2 : write(std_out,*) 'Searching for MLWFs close enough to amalgamate...',ch10
1412 :
1413 2 : dimen = iabs(vdw_nfrag)
1414 :
1415 : !Grouping MLWFs and amalgamation
1416 :
1417 2 : ngr = 0
1418 26 : amagr(:,:,:) = 0
1419 10 : nw(:,:) = 0
1420 :
1421 4 : do ll = 1 , dimen
1422 4 : do isppol = 1 , nsppol
1423 2 : jsppol = isppol
1424 10 : do iwan = 2 , nwan(isppol)
1425 20 : do jwan = 1 , iwan-1
1426 :
1427 18 : if (ord(iwan,isppol)==ll .and. ord(jwan,jsppol)==ll ) then
1428 :
1429 48 : tmp(:) = wanncent(:,iwan,isppol) - wanncent(:,jwan,jsppol)
1430 12 : dis = dnrm2(3,tmp,1)
1431 :
1432 : ! dis=sqrt( dot_product(wanncent(:,iwan,isppol),wanncent(:,iwan,isppol)) &
1433 : !& + dot_product(wanncent(:,jwan,jsppol),wanncent(:,jwan,jsppol))&
1434 : !& - 2*(dot_product(wanncent(:,iwan,isppol),wanncent(:,jwan,jsppol))) )
1435 :
1436 12 : if ( dis <= (wannspr(iwan,isppol) + wannspr(jwan,jsppol)) / three ) then
1437 :
1438 0 : if ( all(amagr(:,isppol,:) /= iwan) .and. &
1439 : & all(amagr(:,jsppol,:) /= jwan) ) then
1440 :
1441 0 : ngr = ngr + 1
1442 0 : amagr(1,isppol,ngr) = jwan
1443 0 : amagr(2,jsppol,ngr) = iwan
1444 0 : nw(isppol,ngr) = 2
1445 0 : cycle
1446 :
1447 : end if
1448 :
1449 0 : if ( any(amagr(:,isppol,:) == iwan) .and. &
1450 : & any(amagr(:,jsppol,:) == jwan) ) cycle
1451 :
1452 0 : do igr = 1 , mwan/2
1453 0 : do iw = 1 , mwan
1454 :
1455 0 : if ( amagr(iw,isppol,igr) == jwan .and. &
1456 : & all(amagr(:,isppol,igr) /= iwan) ) then
1457 0 : nw(isppol,igr) = nw(isppol,igr) + 1
1458 0 : amagr(nw(isppol,igr),isppol,igr) = iwan
1459 0 : cycle
1460 : end if
1461 :
1462 0 : if ( amagr(iw,isppol,igr) == iwan .and. &
1463 0 : & all(amagr(:,isppol,igr) /= jwan) ) then
1464 0 : nw(isppol,igr) = nw(isppol,igr) + 1
1465 0 : amagr(nw(isppol,igr),isppol,igr) = jwan
1466 0 : cycle
1467 : end if
1468 :
1469 : end do
1470 : end do
1471 :
1472 : end if !if dis < (wannspr(iwan,isppol) + wannspr(jwan,jsppol))/three
1473 : end if !if (ord(iwan,isppol)==ll .and. ord(jwan,jsppol)==ll )
1474 : end do !jwan
1475 : end do !iwan
1476 : end do !isppol
1477 :
1478 :
1479 4 : if (nsppol == 2) then
1480 0 : isppol = 1
1481 0 : jsppol = 2
1482 0 : do iwan = 1 , nwan(isppol)
1483 0 : do jwan = 1 , nwan(jsppol)
1484 :
1485 0 : if (ord(iwan,isppol)==ll .and. ord(jwan,jsppol)==ll ) then
1486 :
1487 0 : tmp(:) = wanncent(:,iwan,isppol) - wanncent(:,jwan,jsppol)
1488 0 : dis = dnrm2(3,tmp,1)
1489 :
1490 : ! dis=sqrt( dot_product(wanncent(:,iwan,isppol),wanncent(:,iwan,isppol)) &
1491 : !& + dot_product(wanncent(:,jwan,jsppol),wanncent(:,jwan,jsppol))&
1492 : !& - 2*(dot_product(wanncent(:,iwan,isppol),wanncent(:,jwan,jsppol))) )
1493 :
1494 0 : if ( dis <= (wannspr(iwan,isppol) + wannspr(jwan,jsppol)) / three ) then
1495 :
1496 0 : if ( all(amagr(:,isppol,:) /= iwan) .and. &
1497 : & all(amagr(:,jsppol,:) /= jwan) ) then
1498 :
1499 0 : ngr = ngr + 1
1500 0 : amagr(1,isppol,ngr) = iwan
1501 0 : amagr(1,jsppol,ngr) = jwan
1502 0 : nw(isppol,ngr) = nw(isppol,ngr) + 1
1503 0 : nw(jsppol,ngr) = nw(jsppol,ngr) + 1
1504 0 : cycle
1505 :
1506 : end if
1507 :
1508 0 : if ( any(amagr(:,isppol,:) == iwan) .and. &
1509 : & any(amagr(:,jsppol,:) == jwan) ) cycle
1510 :
1511 0 : do igr = 1 , mwan/2
1512 0 : do iw = 1 , mwan
1513 :
1514 0 : if ( amagr(iw,jsppol,igr) == jwan .and. &
1515 : & all(amagr(:,isppol,igr) /= iwan) ) then
1516 0 : nw(isppol,igr) = nw(isppol,igr) + 1
1517 0 : amagr(nw(isppol,igr),isppol,igr) = iwan
1518 0 : cycle
1519 : end if
1520 :
1521 0 : if ( amagr(iw,isppol,igr) == iwan .and. &
1522 0 : & all(amagr(:,jsppol,igr) /= jwan) ) then
1523 0 : nw(jsppol,igr) = nw(jsppol,igr) + 1
1524 0 : amagr(nw(jsppol,igr),jsppol,igr) = jwan
1525 0 : cycle
1526 : end if
1527 :
1528 : end do
1529 : end do
1530 :
1531 : end if
1532 :
1533 : end if
1534 :
1535 : end do
1536 : end do
1537 : end if !if (nsppol == 2)
1538 :
1539 : end do !ll
1540 :
1541 2 : write(std_out,*) 'Number of amalgamation groups:',ngr,ch10
1542 2 : if(ngr/=0)then
1543 0 : do ii = 1 , ngr
1544 0 : do isppol = 1 ,nsppol
1545 0 : write(std_out,*) 'Number of MLWFs in group',ii,':',nw(isppol,ii),ch10
1546 0 : write(std_out,*) 'MLWFs in group',ii,': WFindex,spin,group ',ch10
1547 0 : do jj = 1, nw(isppol,ii)
1548 0 : write(std_out,*) amagr(jj,isppol,ii),isppol,ii,ch10
1549 : end do
1550 : end do
1551 : end do
1552 : end if
1553 :
1554 : !DEBUG
1555 : !write(std_out,*)' amalgam : exit '
1556 : !write(std_out,*)' nw =',nw
1557 : !call flush
1558 : !ENDDEBUG
1559 :
1560 2 : ABI_FREE(tmp)
1561 2 : end subroutine amalgam
1562 : !!***
1563 :
1564 : end module m_evdw_wannier
1565 : !!***
|