Branch data Line data Source code
1 : : !!****m* ABINIT/m_wvl_rho
2 : : !! NAME
3 : : !! m_wvl_rho
4 : : !!
5 : : !! FUNCTION
6 : : !!
7 : : !!
8 : : !! COPYRIGHT
9 : : !! Copyright (C) 2012-2026 ABINIT group (TRangel, DC)
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_wvl_rho
23 : :
24 : : use defs_basis
25 : : use m_abicore
26 : : use m_splines
27 : : use m_errors
28 : : use defs_wvltypes
29 : : use m_sort
30 : : use m_abi2big
31 : : use m_xmpi
32 : : use m_dtset
33 : :
34 : : use defs_abitypes, only : MPI_type
35 : : use m_geometry, only : xred2xcart, metric
36 : : use m_pawrad, only : pawrad_type, pawrad_init, pawrad_free
37 : : use m_pawtab, only : pawtab_type
38 : : use m_pawrhoij, only : pawrhoij_type
39 : : use m_drivexc, only : mkdenpos
40 : :
41 : : implicit none
42 : :
43 : : private
44 : : !!***
45 : :
46 : : public :: wvl_initro
47 : : public :: wvl_mkrho
48 : : public :: wvl_prcref
49 : : !!***
50 : :
51 : : contains
52 : : !!***
53 : :
54 : : !!****f* ABINIT/wvl_initro
55 : : !! NAME
56 : : !! wvl_initro
57 : : !!
58 : : !! FUNCTION
59 : : !! FIXME: add description.
60 : : !!
61 : : !! INPUTS
62 : : !! argin(sizein)=description
63 : : !!
64 : : !! OUTPUT
65 : : !! argout(sizeout)=description
66 : : !!
67 : : !! SIDE EFFECTS
68 : : !!
69 : : !! NOTES
70 : : !!
71 : : !! SOURCE
72 : :
73 : 0 : subroutine wvl_initro(&
74 : 0 : & atindx1,geocode,h,me,&
75 : 0 : & natom,nattyp,nfft,nspden,ntypat,&
76 : : & n1,n1i,n2,n2i,n3,&
77 : 0 : & pawrad,pawtab,psppar,&
78 : 0 : & rhor,rprimd,spinat,wvl_den,xc_denpos,xred,zion)
79 : :
80 : : #if defined HAVE_BIGDFT
81 : : use BigDFT_API, only : ELECTRONIC_DENSITY, ext_buffers, ind_positions
82 : : #endif
83 : :
84 : : !Arguments ------------------------------------
85 : : integer,intent(in) :: me,natom,ntypat,nfft,nspden
86 : : integer,intent(in)::n1,n2,n1i,n2i,n3
87 : : real(dp),intent(in) :: h(3)
88 : : type(pawrad_type),intent(in) :: pawrad(ntypat)
89 : : type(pawtab_type),intent(in) :: pawtab(ntypat)
90 : : real(dp),intent(in) :: spinat(3,natom),zion(ntypat)
91 : : real(dp),intent(inout) :: rhor(nfft,nspden)
92 : : real(dp),intent(in) :: xc_denpos
93 : : character(1),intent(in)::geocode
94 : : type(wvl_denspot_type), intent(inout) :: wvl_den
95 : : !arrays
96 : : integer,intent(in) :: atindx1(natom),nattyp(ntypat)
97 : : real(dp),intent(in) :: psppar(0:4,0:6,ntypat),rprimd(3,3)
98 : : real(dp),intent(inout)::xred(3,natom)
99 : :
100 : : !Local variables-------------------------------
101 : : #if defined HAVE_BIGDFT
102 : : integer :: ia1,ia2
103 : : integer :: iat,iatm,iatom,iatom_tot,iex,iey,iez,ii,ind
104 : : integer :: ifft,ispden
105 : : integer :: isx,isy,isz,itypat,i1,i2,i3,iwarn,i3s
106 : : integer :: j1,j2,j3,msz
107 : : integer :: nbl1,nbr1,nbl2,nbr2,nbl3,nbr3
108 : : integer :: ncmax,nfgd,nspden_updn,n3pi,shift
109 : : real(dp) :: cutoff,fact,fact0
110 : : real(dp) :: rloc,rr2,rx,ry,rz
111 : : real(dp) :: rshp,r2shp
112 : : real(dp) :: ucvol,xx,yy,zz
113 : : type(pawrad_type)::vale_mesh
114 : : !arrays
115 : : logical :: perx,pery,perz,gox,goy,goz
116 : : real(dp) :: hh(3) !fine grid spacing for wavelets
117 : : real(dp) :: gmet(3,3),gprimd(3,3),rcart(3),rmet(3,3),xcart(3,natom)
118 : : character(len=500) :: message ! to be uncommented, if needed
119 : : !allocatable arrays
120 : : integer,allocatable :: ifftsph_tmp(:),iindex(:)
121 : : real(dp),allocatable:: raux(:),raux2(:)
122 : : real(dp),allocatable:: rr(:)!,rred(:,:)
123 : : #endif
124 : :
125 : : ! *************************************************************************
126 : :
127 : : DBG_ENTER("COLL")
128 : :
129 : : #if defined HAVE_BIGDFT
130 : :
131 : : !PENDING: PARALLELIZATION OVER ATOMS
132 : :
133 : : write(message,'(a,a)') ch10,&
134 : : & ' wvl_initro: Initialize valence density from atomic data by splines'
135 : : call wrtout(std_out,message,'COLL')
136 : :
137 : : !initialize
138 : : rhor(:,:)=zero
139 : :
140 : : if(nspden==4)then
141 : : write(std_out,*)' initro : might work yet for nspden=4 (not checked)'
142 : : write(std_out,*)'spinat',spinat(1:3,1:natom)
143 : : ! stop
144 : : end if
145 : :
146 : : !Check whether the values of spinat are acceptable
147 : : if(nspden==2)then
148 : : do itypat=1,ntypat
149 : : do iat=1,nattyp(itypat)
150 : : iatm=iatm+1;iatom=atindx1(iatm)
151 : : iatom_tot=iatom; !if (mpi_enreg%nproc_atom>1) iatom_tot=mpi_enreg%atom_indx(iatom)
152 : :
153 : : if( sqrt(spinat(1,iatom)**2+spinat(2,iatom)**2+spinat(3,iatom)**2) &
154 : : & > abs(zion(itypat))*(1.0_dp + epsilon(0.0_dp)) ) then
155 : : write(message, '(a,a,a,a,i4,a,a,3es11.4,a,a,a,es11.4)' ) ch10,&
156 : : & ' initro : WARNING - ',ch10,&
157 : : & ' For atom number ',iatom,ch10,&
158 : : & ' input spinat=',spinat(:,iatom),' is larger, in magnitude,',ch10,&
159 : : & ' than zion(ia)=',zion(itypat)
160 : : call wrtout(std_out,message,'COLL')
161 : : call wrtout(ab_out,message,'COLL')
162 : : end if
163 : : end do
164 : : ia1=ia2+1
165 : : end do
166 : : end if
167 : :
168 : : !Fine grid
169 : : hh(:)=0.5d0*h(:)
170 : :
171 : : !mpi:
172 : : !Obtain n3pi, BigDFT quantity:
173 : : n3pi=wvl_den%denspot%dpbox%n3pi
174 : : i3s=wvl_den%denspot%dpbox%nscatterarr(me,3)+1-wvl_den%denspot%dpbox%nscatterarr(me,4)
175 : : shift=n1i*n2i*wvl_den%denspot%dpbox%nscatterarr(me,4)
176 : :
177 : : !Compute xcart from xred
178 : : call xred2xcart(natom,rprimd,xcart,xred)
179 : :
180 : : !Compute metric tensors and ucvol from rprimd
181 : : call metric(gmet,gprimd,-1,rmet,rprimd,ucvol)
182 : :
183 : : !Conditions for periodicity in the three directions
184 : : perx=(geocode /= 'F')
185 : : pery=(geocode == 'P')
186 : : perz=(geocode /= 'F')
187 : :
188 : : !Compute values of external buffers
189 : : call ext_buffers(perx,nbl1,nbr1)
190 : : call ext_buffers(pery,nbl2,nbr2)
191 : : call ext_buffers(perz,nbl3,nbr3)
192 : :
193 : : iatm=0
194 : : !Big loop on atom types
195 : : do itypat=1,ntypat
196 : : !
197 : : rloc=psppar(0,0,itypat)
198 : : cutoff=10.d0*rloc
199 : :
200 : : ! Create mesh_core object
201 : : ! since tnvale_mesh_size can be bigger than pawrad%mesh_size,
202 : : msz=pawtab(itypat)%tnvale_mesh_size
203 : : call pawrad_init(vale_mesh,mesh_size=msz,mesh_type=pawrad(itypat)%mesh_type,&
204 : : & rstep=pawrad(itypat)%rstep,lstep=pawrad(itypat)%lstep)
205 : : !
206 : : ! Set radius size:
207 : : rshp=vale_mesh%rmax
208 : : r2shp=1.0000001_dp*rshp**2
209 : :
210 : : ! allocate arrays
211 : : if (n3pi > 0) then
212 : : ! sphere: cycle i1,i2,i3
213 : : ! ncmax=1+int(1.1_dp*nfft*four_pi/(three*ucvol)*rshp**3)
214 : : ! ncmax=1+int(1.1_dp*nfft*four_pi/(three*ucvol)*rshp**3)
215 : : ! 1+int(1.1* factors are included just for cautioness
216 : : ! circle: cycle only i1 and i2
217 : : ! ncmax=1+int(1.1d0*((rshp/hh(1))*(rshp/hh(2))*pi))
218 : : ! line:
219 : : ncmax=1+int(1.1_dp*rshp/hh(1)*2.d0)
220 : : else
221 : : ncmax=1
222 : : end if
223 : : !
224 : : ABI_MALLOC(ifftsph_tmp,(ncmax))
225 : : ABI_MALLOC(iindex,(ncmax))
226 : : ABI_MALLOC(rr,(ncmax))
227 : : ABI_MALLOC(raux,(ncmax))
228 : : if(nspden==2) then
229 : : ABI_MALLOC(raux2,(ncmax))
230 : : end if
231 : :
232 : : ! Big loop on atoms
233 : : do iat=1,nattyp(itypat)
234 : : iatm=iatm+1;iatom=atindx1(iatm)
235 : : iatom_tot=iatom; !if (mpi_enreg%nproc_atom>1) iatom_tot=mpi_enreg%atom_indx(iatom)
236 : :
237 : : ! Spin
238 : : if(nspden==2) then
239 : : fact0=half/zion(itypat)
240 : : fact=fact0*(zion(itypat)+spinat(3,iatom))
241 : : end if
242 : :
243 : : !
244 : : ! Define a "box" around each atom
245 : : rx=xcart(1,iatom_tot)
246 : : ry=xcart(2,iatom_tot)
247 : : rz=xcart(3,iatom_tot)
248 : : !
249 : : isx=floor((rx-cutoff)/hh(1))
250 : : isy=floor((ry-cutoff)/hh(2))
251 : : isz=floor((rz-cutoff)/hh(3))
252 : :
253 : : iex=ceiling((rx+cutoff)/hh(1))
254 : : iey=ceiling((ry+cutoff)/hh(2))
255 : : iez=ceiling((rz+cutoff)/hh(3))
256 : : !
257 : : do i3=isz,iez
258 : : zz=real(i3,kind=8)*hh(3)-rz
259 : : call ind_positions(perz,i3,n3,j3,goz)
260 : : j3=j3+nbl3+1
261 : : !
262 : : do i2=isy,iey
263 : : yy=real(i2,kind=8)*hh(2)-ry
264 : : call ind_positions(pery,i2,n2,j2,goy)
265 : : !
266 : : ! Initialize counters
267 : : nfgd=0
268 : : ! nfgd_r0=0
269 : : !
270 : : do i1=isx,iex
271 : : xx=real(i1,kind=8)*hh(1)-rx
272 : : call ind_positions(perx,i1,n1,j1,gox)
273 : : rr2=xx**2+yy**2+zz**2
274 : : if (j3 >= i3s .and. j3 <= i3s+n3pi-1 .and. goy .and. gox ) then
275 : : !
276 : : if(rr2<=r2shp) then
277 : : if(rr2>tol5) then
278 : : ind=j1+1+nbl1+(j2+nbl2)*n1i+(j3-i3s)*n1i*n2i
279 : : nfgd=nfgd+1
280 : : rcart=[xx,yy,zz]
281 : : rr(nfgd)=(rr2)**0.5
282 : : ifftsph_tmp(nfgd)=shift+ind
283 : : ! DEBUG
284 : : ! write(itmp,'(i10,3(f13.7,x))')ind,xx+rx,yy+ry,zz+rz
285 : : ! write(itmp,'(6(f13.7,x))')rcart,rred(:,nfgd)
286 : : ! ENDDEBUG
287 : : ! else
288 : : ! ! We save r=0 vectors
289 : : ! ind=j1+1+nbl1+(j2+nbl2)*n1i+(j3-i3s)*n1i*n2i
290 : : ! ! We reuse the same variable "ifftshp_tmp",
291 : : ! ! but we start from the higher index
292 : : ! nfgd_r0=nfgd_r0+1
293 : : ! ifftsph_tmp(ncmax-nfgd_r0+1)=shift+ind
294 : : end if !rr2>tol5
295 : : end if !rr2<r2shp
296 : : end if !j3..
297 : : end do !i1
298 : :
299 : : ! All of the following could be done inside or outside the loops (i2,i1,i3)
300 : : ! Outside the loops: the memory consuption increases.
301 : : ! Inside the inner loop: the time of calculation increases.
302 : :
303 : : if(nfgd==0) cycle
304 : :
305 : : ! Evaluate spline fit of 1st der of core charge density
306 : : ! from tcoredens(:,2) and tcoredens(:,4)
307 : : do ii=1,nfgd
308 : : iindex(ii)=ii
309 : : end do
310 : : ! write(600,'(i4,x,9999f14.7)')nfgd, rr(1:nfgd)
311 : : call sort_dp(nfgd,rr(1:nfgd),iindex(1:nfgd),tol16)
312 : : call splint(msz,vale_mesh%rad,&
313 : : & pawtab(itypat)%tvalespl(:,1),pawtab(itypat)%tvalespl(:,2),&
314 : : & nfgd,rr(1:nfgd),raux(1:nfgd))
315 : :
316 : :
317 : : ! Accumulate contributions to valence density on the entire cell
318 : : rhor(ifftsph_tmp(1:nfgd),1)=rhor(ifftsph_tmp(1:nfgd),1)+raux(iindex(1:nfgd))
319 : :
320 : : if(nspden==2) then
321 : : raux2(1:nfgd)=raux(iindex(1:nfgd))*fact
322 : : rhor(ifftsph_tmp(1:nfgd),2)=rhor(ifftsph_tmp(1:nfgd),1)+raux2(1:nfgd)
323 : : end if
324 : : ! DEBUG
325 : : ! do ii=1,msz
326 : : ! write(itmp,'(2(f15.7,1x))')vale_mesh%rad(ii),pawtab(itypat)%tvalespl(ii,1)
327 : : ! end do
328 : : ! do ii=1,nfgd
329 : : ! write(itmp,'(2i10)')ii,iindex(ii)
330 : : ! write(itmp,'(2(f15.7,1x))')rr(iindex(ii)),rhor(ifftsph_tmp(ii),1)!,raux(iindex(ii))
331 : : ! end do
332 : : ! END DEBUG
333 : :
334 : : end do !i2
335 : : end do !i1
336 : : end do !iat
337 : :
338 : : ! Deallocate
339 : : call pawrad_free(vale_mesh)
340 : : ABI_FREE(ifftsph_tmp)
341 : : ABI_FREE(iindex)
342 : : ABI_FREE(rr)
343 : : ABI_FREE(raux)
344 : : if(nspden==2) then
345 : : ABI_FREE(raux2)
346 : : end if
347 : :
348 : : end do !itypat
349 : :
350 : : !nspden_updn: 1 for non-polarized, 2 for polarized
351 : : nspden_updn=min(nspden,2)
352 : :
353 : : !Make the density positive everywhere
354 : : call mkdenpos(iwarn,nfft,nspden_updn,1,rhor(:,1:nspden_updn),xc_denpos)
355 : :
356 : : !There seems to be a bug in the intel11 compiler
357 : : !rhor = reshape(wvl_den%denspot%rhov, shape(rhor))
358 : : do ispden=1,nspden
359 : : do ifft=1,nfft
360 : : ii=ifft+nfft*(ispden-1)
361 : : ! rhor(ifft,ispden)=wvl_den%denspot%rhov(ii)
362 : : wvl_den%denspot%rhov(ii)=rhor(ifft,ispden)
363 : : end do
364 : : end do
365 : : wvl_den%denspot%rhov_is = ELECTRONIC_DENSITY
366 : : write(message, '(a,a,a,a)' ) ch10, ' wvl_initro : but why are you copying me :..o('
367 : : call wrtout(std_out,message,'COLL')
368 : :
369 : :
370 : : #else
371 : 0 : BIGDFT_NOTENABLED_ERROR()
372 : : if (.false.) write(std_out,*) me,natom,ntypat,nfft,nspden,n1,n2,n1i,n2i,n3,h(1),&
373 : : & pawrad(1)%mesh_size,pawtab(1)%mesh_size,spinat(1,1),zion(1),rhor(1,1),xc_denpos,&
374 : : & geocode,wvl_den%symObj,atindx1(1),nattyp(1),psppar(1,1,1),rprimd(1,1),xred(1,1)
375 : : #endif
376 : :
377 : : DBG_EXIT("COLL")
378 : :
379 : 0 : end subroutine wvl_initro
380 : : !!***
381 : :
382 : : !!****f* ABINIT/wvl_mkrho
383 : : !! NAME
384 : : !! wvl_mkrho
385 : : !!
386 : : !! FUNCTION
387 : : !! This method is just a wrapper around the BigDFT routine to compute the
388 : : !! density from the wavefunctions.
389 : : !!
390 : : !! INPUTS
391 : : !! dtset <type(dataset_type)>=input variables.
392 : : !! mpi_enreg=information about MPI parallelization
393 : : !! occ(dtset%mband)=occupation numbers.
394 : : !! psps <type(pseudopotential_type)>=variables related to pseudopotentials
395 : : !! wvl_wfs <type(wvl_projector_type)>=wavefunctions information for wavelets.
396 : : !!
397 : : !! OUTPUT
398 : : !! rhor(dtset%nfft)=electron density in r space
399 : : !!
400 : : !! SIDE EFFECTS
401 : : !! proj <type(wvl_projector_type)>=projectors information for wavelets.
402 : : !! | proj(OUT)=computed projectors.
403 : : !!
404 : : !! SOURCE
405 : :
406 : 0 : subroutine wvl_mkrho(dtset, irrzon, mpi_enreg, phnons, rhor, wvl_wfs, wvl_den)
407 : :
408 : : #if defined HAVE_BIGDFT
409 : : use BigDFT_API, only : sumrho, symmetry_data, ELECTRONIC_DENSITY, communicate_density
410 : : #endif
411 : :
412 : : !Arguments -------------------------------
413 : : !scalars
414 : : type(MPI_type),intent(in) :: mpi_enreg
415 : : type(dataset_type),intent(in) :: dtset
416 : : type(wvl_wf_type),intent(inout) :: wvl_wfs
417 : : type(wvl_denspot_type), intent(inout) :: wvl_den
418 : : !arrays
419 : : real(dp),intent(inout) :: rhor(dtset%nfft,dtset%nspden)
420 : : integer, target, intent(in) :: irrzon(dtset%nfft**(1-1/dtset%nsym),2, &
421 : : & (dtset%nspden/dtset%nsppol)-3*(dtset%nspden/4))
422 : : real(dp), target, intent(in) :: phnons(2,(dtset%ngfft(1)*dtset%ngfft(2)*dtset%ngfft(3))**(1-1/dtset%nsym), &
423 : : & (dtset%nspden/dtset%nsppol)-3*(dtset%nspden/4))
424 : :
425 : : !Local variables-------------------------------
426 : : #if defined HAVE_BIGDFT
427 : : !scalars
428 : : character(len=500) :: message
429 : : integer :: comm,me,nproc
430 : : type(symmetry_data) :: sym
431 : : !for debugging:
432 : : !integer::ifile,ierr
433 : : #endif
434 : :
435 : : ! *************************************************************************
436 : :
437 : : DBG_ENTER("COLL")
438 : :
439 : : #if defined HAVE_BIGDFT
440 : : comm=mpi_enreg%comm_wvl
441 : : me=xmpi_comm_rank(comm)
442 : : nproc=xmpi_comm_size(comm)
443 : :
444 : : sym%symObj = wvl_den%symObj
445 : : sym%irrzon => irrzon
446 : : sym%phnons => phnons
447 : :
448 : : call sumrho(wvl_den%denspot%dpbox,wvl_wfs%ks%orbs,wvl_wfs%ks%Lzd,&
449 : : & wvl_wfs%GPU,sym,wvl_den%denspot%rhod,wvl_den%denspot%xc,&
450 : : & wvl_wfs%ks%psi,wvl_den%denspot%rho_psi)
451 : :
452 : : call communicate_density(wvl_den%denspot%dpbox,wvl_wfs%ks%orbs%nspin,&
453 : : & wvl_den%denspot%rhod,wvl_den%denspot%rho_psi,wvl_den%denspot%rhov,.false.)
454 : :
455 : : wvl_den%denspot%rhov_is = ELECTRONIC_DENSITY
456 : : write(message, '(a,a,a,a)' ) ch10, ' wvl_mkrho : but why are you copying me :..o('
457 : : call wrtout(std_out,message,'COLL')
458 : :
459 : : call wvl_rho_abi2big(2,rhor,wvl_den)
460 : :
461 : : #else
462 : 0 : BIGDFT_NOTENABLED_ERROR()
463 : : if (.false.) write(std_out,*) mpi_enreg%me,dtset%nstep,wvl_wfs%ks,wvl_den%symObj,&
464 : : & rhor(1,1),irrzon(1,1,1),phnons(1,1,1)
465 : : #endif
466 : :
467 : : DBG_EXIT("COLL")
468 : :
469 : 0 : end subroutine wvl_mkrho
470 : : !!***
471 : :
472 : : !!****f* ABINIT/wvl_prcref
473 : : !! NAME
474 : : !! wvl_prcref
475 : : !!
476 : : !! FUNCTION
477 : : !! FIXME: add description.
478 : : !!
479 : : !! INPUTS
480 : : !! argin(sizein)=description
481 : : !!
482 : : !! OUTPUT
483 : : !! argout(sizeout)=description
484 : : !!
485 : : !! SIDE EFFECTS
486 : : !!
487 : : !! NOTES
488 : : !!
489 : : !! SOURCE
490 : :
491 : 0 : subroutine wvl_prcref(dielar,iprcel,my_natom,nfftprc,npawmix,nspden,pawrhoij,&
492 : 0 : & rhoijrespc,usepaw,vresid,vrespc)
493 : :
494 : : !Arguments ------------------------------------
495 : : integer , intent(in) :: iprcel,nfftprc,my_natom,npawmix,nspden,usepaw
496 : : real(dp), intent(in) :: dielar(7)
497 : : real(dp), intent(in) :: vresid(nfftprc,nspden)
498 : : real(dp),intent(out) :: rhoijrespc(npawmix)
499 : : real(dp),intent(out) :: vrespc(nfftprc,nspden)
500 : : type(pawrhoij_type),intent(inout) :: pawrhoij(my_natom*usepaw)
501 : :
502 : : !Local variables-------------------------------
503 : : integer :: iatom,index,ispden,klmn,kmix
504 : : real(dp):: diemix,diemixmag,mixfac_eff
505 : : character(len=500) :: message ! to be uncommented, if needed
506 : :
507 : : ! *************************************************************************
508 : :
509 : : DBG_ENTER("COLL")
510 : :
511 : : !PENDING:
512 : : !optres==1, or 0, for density or potential mixing.
513 : : !for potential mixing, we have to average over spins.
514 : : !check prcref.F90 and moddiel.F90
515 : :
516 : :
517 : : #if defined HAVE_BIGDFT
518 : : #endif
519 : :
520 [ # # ]: 0 : if(iprcel .ne. 0) then
521 : : write(message, '(a,i3,a,a,a,a)' )&
522 : 0 : & ' From the calling routine, iprcel=',iprcel,ch10,&
523 : 0 : & ' For wavelets, the only allowed value is 0.',ch10,&
524 : 0 : & ' Action : correct your input file.'
525 : 0 : ABI_ERROR(message)
526 : : end if
527 : :
528 : : !call wvl_moddiel !PENDING
529 : 0 : diemix=dielar(4)
530 : : !dielng=dielar(2) ; diemac=dielar(3) ; diemix=dielar(4) ;
531 : 0 : diemixmag=abs(dielar(7))
532 [ # # ]: 0 : vrespc(:,1)=diemix*vresid(:,1)
533 [ # # # # : 0 : if (nspden/=1) vrespc(:,2:nspden)=diemixmag*vresid(:,2:nspden)
# # ]
534 : :
535 : : !3) PAW only : precondition the rhoij quantities (augmentation
536 : : !occupancies) residuals. Use a simple preconditionning
537 : : !with the same mixing factor as the model dielectric function.
538 : :
539 [ # # # # ]: 0 : if (usepaw==1.and.my_natom>0) then
540 [ # # ]: 0 : ABI_CHECK(pawrhoij(1)%qphase==1,'wvl_prcref: not available with qphase=1!')
541 : : ! mixfac=dielar(4);mixfacmag=abs(dielar(7))
542 [ # # ]: 0 : if (pawrhoij(1)%cplex_rhoij==1) then
543 : : index=0
544 [ # # ]: 0 : do iatom=1,my_natom
545 [ # # ]: 0 : do ispden=1,pawrhoij(iatom)%nspden
546 [ # # ]: 0 : mixfac_eff=diemix;if (ispden>1) mixfac_eff=diemixmag
547 [ # # ]: 0 : do kmix=1,pawrhoij(iatom)%lmnmix_sz
548 : 0 : index=index+1;klmn=pawrhoij(iatom)%kpawmix(kmix)
549 : 0 : rhoijrespc(index)=mixfac_eff*pawrhoij(iatom)%rhoijres(klmn,ispden)
550 : : end do
551 : : end do
552 : : end do
553 : : else
554 : : index=-1
555 [ # # ]: 0 : do iatom=1,my_natom
556 [ # # ]: 0 : do ispden=1,pawrhoij(iatom)%nspden
557 [ # # ]: 0 : mixfac_eff=diemix;if (ispden>1) mixfac_eff=diemixmag
558 [ # # ]: 0 : do kmix=1,pawrhoij(iatom)%lmnmix_sz
559 : 0 : index=index+2;klmn=2*pawrhoij(iatom)%kpawmix(kmix)-1
560 [ # # ]: 0 : rhoijrespc(index:index+1)=mixfac_eff*pawrhoij(iatom)%rhoijres(klmn:klmn+1,ispden)
561 : : end do
562 : : end do
563 : : end do
564 : : end if
565 : : end if
566 : :
567 : :
568 : :
569 : : DBG_EXIT("COLL")
570 : :
571 : 0 : end subroutine wvl_prcref
572 : : !!***
573 : :
574 : : end module m_wvl_rho
575 : : !!***
|