Branch data Line data Source code
1 : : !!****m* ABINIT/m_bader
2 : : !! NAME
3 : : !! m_bader
4 : : !!
5 : : !! FUNCTION
6 : : !! Procedures used by AIM code.
7 : : !!
8 : : !! COPYRIGHT
9 : : !! Copyright (C) 2008-2026 ABINIT group (PCasek,FF,XG)
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_bader
23 : :
24 : : use defs_basis
25 : : use m_errors
26 : : use m_abicore
27 : : use m_xmpi
28 : : use m_sort
29 : : use m_hdr
30 : : use m_splines
31 : : use netcdf
32 : :
33 : : use m_time, only : timein
34 : : use m_geometry, only : metric
35 : : use m_parser, only : inread
36 : : use m_numeric_tools, only : coeffs_gausslegint
37 : : use m_hide_lapack, only : jacobi, lubksb, ludcmp
38 : :
39 : : implicit none
40 : :
41 : : !private
42 : : public
43 : : !!***
44 : :
45 : : !!****t* m_bader/aim_dataset_type
46 : : !! NAME
47 : : !! aim_dataset_type
48 : : !!
49 : : !! FUNCTION
50 : : !! The aim_dataset_type structured datatype
51 : : !! gathers all the input variables for the aim code
52 : : !!
53 : : !! SOURCE
54 : :
55 : : type aim_dataset_type
56 : :
57 : : ! Since all these input variables are described in the aim_help.html
58 : : ! file, they are not described in length here ...
59 : :
60 : : ! Integer
61 : : integer :: crit
62 : : integer :: denout
63 : : integer :: dltyp
64 : : integer :: gpsurf
65 : : integer :: irho
66 : : integer :: ivol
67 : : integer :: lapout
68 : : integer :: nsa
69 : : integer :: nsb
70 : : integer :: nsc
71 : :
72 : : integer :: batom ! Warning : corresponds to the input variable atom
73 : : integer :: foll ! Warning : corresponds to the input variable follow
74 : : integer :: isurf ! Warning : corresponds to the input variable surf
75 : : integer :: irsur ! Warning : corresponds to the input variable rsurf
76 : : integer :: nph ! Warning : corresponds to the input variable nphi
77 : : integer :: npt ! Warning : corresponds to the input variable inpt
78 : : integer :: nth ! Warning : corresponds to the input variable ntheta
79 : : integer :: plden ! Warning : not documented in help file ?!
80 : :
81 : : integer :: ngrid(3)
82 : :
83 : : ! Real
84 : : real(dp) :: atrad
85 : : real(dp) :: coff1
86 : : real(dp) :: coff2
87 : : real(dp) :: dpclim
88 : : real(dp) :: folstp
89 : : real(dp) :: lgrad
90 : : real(dp) :: lgrad2
91 : : real(dp) :: lstep
92 : : real(dp) :: lstep2
93 : : real(dp) :: maxatd
94 : : real(dp) :: maxcpd
95 : : real(dp) :: phimax
96 : : real(dp) :: phimin
97 : :
98 : : real(dp) :: dr0 ! Warning : correspond to the input variable radstp
99 : : real(dp) :: phi0 ! Warning : correspond to the input variable rsurdir(2)
100 : : real(dp) :: rmin ! Warning : correspond to the input variable ratmin
101 : : real(dp) :: th0 ! Warning : correspond to the input variable rsurdir(1)
102 : : real(dp) :: themax ! Warning : correspond to the input variable thetamax
103 : : real(dp) :: themin ! Warning : correspond to the input variable thetamin
104 : :
105 : : real(dp) :: foldep(3)
106 : : real(dp) :: scal(3)
107 : : real(dp) :: vpts(3,4)
108 : :
109 : : end type aim_dataset_type
110 : : !!***
111 : :
112 : : public :: adini
113 : : public :: drvaim
114 : : public :: inpar
115 : : public :: defad
116 : : public :: aim_shutdown
117 : :
118 : : ! Global from defs_aimfields
119 : : integer, save :: ngfft(3),nmax
120 : : integer, allocatable, save :: ndat(:)
121 : : real(dp), allocatable, target, save :: dig1(:),llg1(:),dig2(:),llg2(:),dig3(:),llg3(:)
122 : : real(dp), allocatable, target, save :: cdig1(:),cdig2(:),cdig3(:)
123 : : real(dp), save :: dix(3)
124 : : real(dp), allocatable, target, save :: dvl(:,:,:),ddx(:,:,:),ddy(:,:,:),ddz(:,:,:),rval(:,:,:)
125 : : real(dp), allocatable, save :: rrad(:,:),crho(:,:),sp2(:,:),sp3(:,:),sp4(:,:),pdd(:),pd(:)
126 : :
127 : : ! Global from defs_aimprom
128 : :
129 : : ! UNITS
130 : : integer, save :: unt0,unto,unt,untc,unts,untd,untl,untg,unta,untad,untp,untout
131 : : integer,save :: aim_iomode
132 : : ! DRIVER VARIABLES
133 : : real(dp), save :: maxatdst,maxcpdst
134 : : integer, parameter :: ndif=45,ngaus=200,npos=1000
135 : : integer, allocatable, save :: typat(:), corlim(:)
136 : : integer, save :: ntypat,nnpos,natom
137 : : integer, save :: nsimax,batcell,npc,nbcp,nrcp,nccp
138 : : integer, save :: icpc(npos*ndif),npcm3,slc
139 : : real(dp), save :: rprimd(3,3),ivrprim(3,3),trivrp(3,3)
140 : : real(dp), allocatable, save :: xred(:,:),xatm(:,:),rminl(:)
141 : : real(dp), save :: tpi,sqfp,fpi,sqpi,sqtpi,atp(3,npos)
142 : : real(dp), save :: h0,hmin,r0,ttsrf,ttcp,tttot
143 : : real(dp), save :: cth(ngaus),th(ngaus),ph(ngaus),wcth(ngaus),wph(ngaus),rs(ngaus,ngaus)
144 : : real(dp), save :: pc(3,npos*ndif), evpc(3,npos*ndif),zpc(3,3,npos*ndif), pcrb(3,npos*ndif)
145 : : logical, save :: deb,ldeb
146 : : !!! interface chgbas
147 : : !!! subroutine bschg1(vv,dir)
148 : : !!! implicit none
149 : : !!! integer, intent(in) :: dir
150 : : !!! real(dp),intent(inout) :: vv(3)
151 : : !!! end subroutine bschg1
152 : : !!! subroutine bschg2(aa,dir)
153 : : !!! implicit none
154 : : !!! integer, intent(in) :: dir
155 : : !!! real(dp),intent(inout) :: aa(3,3)
156 : : !!! end subroutine bschg2
157 : : !!! end interface chgbas
158 : :
159 : : !- Set of parameters for the aim utility -----------------------------------
160 : : real(dp), parameter :: aim_rhocormin=1.d-10 ! the minimal core density
161 : : real(dp), parameter :: aim_epstep=0.5
162 : : real(dp), parameter :: aim_rhomin=1.d-5,aim_dgmin=1.d-9,aim_dmaxcrit=5.d-2
163 : : real(dp), parameter :: aim_dmin=1.d-3,aim_hmax=2.d7,aim_fac0=2.1_dp,aim_facmin=1.d-3
164 : : real(dp), parameter :: aim_hmult=15._dp,aim_tiny=1.d-4,aim_snull=1.d-6
165 : : real(dp), parameter :: aim_deltarmin=1.d-7
166 : : !the minimal length of one step following the gradient line
167 : : real(dp), parameter :: aim_fac=1.2_dp,aim_drmin=1.d-5
168 : : real(dp), parameter :: aim_dlimit=1.d-4,aim_dmaxcs=3.d-1
169 : : real(dp), parameter :: aim_dpc0=1.d-2
170 : : integer, parameter :: aim_maxstep=100
171 : : real(dp), parameter :: aim_xymin=1.d-10
172 : : integer, parameter :: aim_npmaxin=17
173 : : real(dp), parameter :: aim_stmax=0.05
174 : : real(dp), parameter :: aim_dmaxc1=1.d-1, aim_dmaxcl=5.d-2
175 : :
176 : : !----------------------------------------------------------------------
177 : :
178 : : !!****t* m_bader/bcp_type
179 : : !! NAME
180 : : !! bcp_type
181 : : !!
182 : : !! FUNCTION
183 : : !! a "bonding critical point" for aim
184 : : !!
185 : : !! SOURCE
186 : :
187 : : type, private :: bcp_type
188 : :
189 : : ! Integer
190 : : integer :: iat ! number of the bonding atom inside a primitive cell
191 : : integer :: ipos ! number of the primitive cell of the bonding atom
192 : :
193 : : ! Real
194 : : real(dp) :: chg ! charge at the critical point
195 : : real(dp) :: diff(3) ! three distances : AT-CP,BAT-CP,AT-BAT
196 : : real(dp) :: ev(3) ! eigenvalues of the Hessian
197 : : real(dp) :: pom(3) ! position of the bonding atom
198 : : real(dp) :: rr(3) ! position of the bcp
199 : : real(dp) :: vec(3,3) ! eigenvectors of the Hessian
200 : : real(dp) :: vv(3) ! position of the bcp relative to the central atom
201 : :
202 : : end type bcp_type
203 : : !!***
204 : :
205 : : contains
206 : : !!***
207 : :
208 : : !----------------------------------------------------------------------
209 : :
210 : : !!****f* defs_aimprom/aim_shutdown
211 : : !! NAME
212 : : !! aim_shutdown
213 : : !!
214 : : !! FUNCTION
215 : : !! Free memory allocated in the module. Close units. Mainly used to pass the abirules
216 : : !!
217 : : !! SOURCE
218 : :
219 : 5 : subroutine aim_shutdown()
220 : :
221 : : !Local variables-------------------------------
222 : : integer :: ii
223 : : logical :: is_open
224 : : integer :: all_units(12)
225 : :
226 : : ! *********************************************************************
227 : :
228 : : !if (allocated(typat)) then
229 : : ! ABI_FREE(typat)
230 : : !end if
231 : : !if (allocated(corlim)) then
232 : : ! ABI_FREE(corlim)
233 : : !end if
234 : : !if (allocated(xred)) then
235 : : ! ABI_FREE(xred)
236 : : !end if
237 : : !if (allocated(xatm)) then
238 : : ! ABI_FREE(rminl)
239 : : !end if
240 : :
241 [ + + ]: 65 : all_units(:) = [unt0,unto,unt,untc,unts,untd,untl,untg,unta,untad,untp,untout]
242 [ + + ]: 65 : do ii=1,size(all_units)
243 : 60 : inquire(unit=all_units(ii), opened=is_open)
244 [ + + ]: 65 : if (is_open) close(all_units(ii))
245 : : end do
246 : :
247 : 5 : end subroutine aim_shutdown
248 : : !!***
249 : :
250 : : !!****f* m_bader/adini
251 : : !! NAME
252 : : !! adini
253 : : !!
254 : : !! FUNCTION
255 : : !! Analysis of the input string "inpstr" (the content of input file)
256 : : !! and setting of the corresponding input variables
257 : : !!
258 : : !! INPUTS
259 : : !! inpstr=character string containing the input data, to be treated
260 : : !! lenstr=actual length of the string contained in inpstr
261 : : !!
262 : : !! OUTPUT
263 : : !! aim_dtset=the structured entity containing all input variables
264 : : !!
265 : : !! SOURCE
266 : :
267 : 5 : subroutine adini(aim_dtset,inpstr,lenstr)
268 : :
269 : : !Arguments ------------------------------------
270 : : !scalars
271 : : integer,intent(in) :: lenstr
272 : : character(len=*),intent(in) :: inpstr
273 : : !no_abirules
274 : : type(aim_dataset_type), intent(inout) :: aim_dtset !vz_i
275 : :
276 : : !Local variables ------------------------------
277 : : !scalars
278 : : integer :: errcod,ii,inxh,ipos,jj,lenc,ll,outi,tstngr=0,tstvpt=0 !vz_z
279 : : real(dp) :: outr
280 : : logical :: nbtst,try
281 : : character(len=20) :: cmot
282 : :
283 : : ! *********************************************************************
284 : :
285 [ + - ]: 5 : if (iachar(inpstr(1:1)) < 32) then
286 : : ipos=2
287 : : else
288 : 5 : ipos=1
289 : : end if
290 : :
291 : 5 : write(std_out,*) 'ECHO of the INPUT'
292 : 5 : write(std_out,*) '************************'
293 : 5 : write(untout,*) 'ECHO of the INPUT'
294 : 5 : write(untout,*) '************************'
295 : :
296 [ + - ]: 78 : mread: do ii=1,lenstr
297 : 78 : try=.false.
298 : 78 : nbtst=.true.
299 : 78 : inxh=index(inpstr(ipos:lenstr),' ')
300 [ + + ]: 78 : if ((ipos >= lenstr)) exit
301 [ + + ]: 73 : if ((inxh==2).or.(inxh==1)) then
302 : 2 : ipos=ipos+inxh
303 : 2 : cycle
304 : : end if
305 : 71 : lenc=inxh-1
306 [ + - - + ]: 71 : cmot(1:lenc)=inpstr(ipos:ipos+inxh-2)
307 : 71 : ipos=ipos+inxh
308 : : ! write(std_out,*) cmot(1:lenc), lenc
309 : :
310 : 5 : select case (cmot(1:lenc))
311 : :
312 : : ! DRIVER SPECIFICATIONS
313 : :
314 : : case ('SURF')
315 : 5 : inxh=index(inpstr(ipos:lenstr),' ')
316 [ - + - - ]: 5 : if ((inxh /= 2).and.(inpstr(ipos:ipos)/='-')) then
317 : 0 : write(std_out,*) 'ERROR in specif. of ', cmot(1:lenc)
318 : 0 : ABI_ERROR("Aborting now")
319 : : end if
320 : 5 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"INT",outi,outr,errcod)
321 : 5 : aim_dtset%isurf=outi
322 : 5 : write(std_out,*) cmot(1:lenc),' ', aim_dtset%isurf
323 : 5 : write(untout,*) cmot(1:lenc),' ', aim_dtset%isurf
324 : 5 : ipos=ipos+inxh
325 : :
326 : : case ('CRIT')
327 : 5 : inxh=index(inpstr(ipos:lenstr),' ')
328 [ - + - - ]: 5 : if ((inxh /= 2).and.(inpstr(ipos:ipos)/='-')) then
329 : 0 : write(std_out,*) 'ERROR in specif. of ', cmot(1:lenc)
330 : 0 : ABI_ERROR("Aborting now")
331 : : end if
332 : 5 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"INT",outi,outr,errcod)
333 : 5 : aim_dtset%crit=outi
334 : 5 : write(std_out,*) cmot(1:lenc),' ', aim_dtset%crit
335 : 5 : write(untout,*) cmot(1:lenc),' ', aim_dtset%crit
336 : 5 : ipos=ipos+inxh
337 : :
338 : : case ('RSURF')
339 : 0 : inxh=index(inpstr(ipos:lenstr),' ')
340 [ # # ]: 0 : if (inxh /= 2) then
341 : 0 : write(std_out,*) 'ERROR in specif. of ', cmot(1:lenc)
342 : 0 : ABI_ERROR("Aborting now")
343 : : end if
344 : 0 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"INT",outi,outr,errcod)
345 : 0 : aim_dtset%irsur=outi
346 : 0 : write(std_out,*) cmot(1:lenc),' ', aim_dtset%irsur
347 : 0 : write(untout,*) cmot(1:lenc),' ', aim_dtset%irsur
348 : 0 : ipos=ipos+inxh
349 : :
350 : : case ('FOLLOW')
351 : 0 : inxh=index(inpstr(ipos:lenstr),' ')
352 [ # # ]: 0 : if (inxh /= 2) then
353 : 0 : write(std_out,*) 'ERROR in specif. of ', cmot(1:lenc)
354 : 0 : ABI_ERROR("Aborting now")
355 : : end if
356 : 0 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"INT",outi,outr,errcod)
357 : 0 : aim_dtset%foll=outi
358 : 0 : write(std_out,*) cmot(1:lenc),' ', aim_dtset%foll
359 : 0 : write(untout,*) cmot(1:lenc),' ', aim_dtset%foll
360 : 0 : ipos=ipos+inxh
361 : :
362 : : case ('IRHO')
363 : 5 : inxh=index(inpstr(ipos:lenstr),' ')
364 [ - + ]: 5 : if (inxh /= 2) then
365 : 0 : write(std_out,*) 'ERROR in specif. of ', cmot(1:lenc)
366 : 0 : ABI_ERROR("Aborting now")
367 : : end if
368 : 5 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"INT",outi,outr,errcod)
369 : 5 : aim_dtset%irho=outi
370 : 5 : write(std_out,*) cmot(1:lenc),' ', aim_dtset%irho
371 : 5 : write(untout,*) cmot(1:lenc),' ', aim_dtset%irho
372 : 5 : ipos=ipos+inxh
373 : :
374 : : case ('PLDEN')
375 : 0 : inxh=index(inpstr(ipos:lenstr),' ')
376 [ # # ]: 0 : if (inxh /= 2) then
377 : 0 : write(std_out,*) 'ERROR in specif. of ', cmot(1:lenc)
378 : 0 : ABI_ERROR("Aborting now")
379 : : end if
380 : 0 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"INT",outi,outr,errcod)
381 : 0 : aim_dtset%plden=outi
382 : 0 : write(std_out,*) cmot(1:lenc),' ', aim_dtset%plden
383 : 0 : write(untout,*) cmot(1:lenc),' ', aim_dtset%plden
384 : 0 : ipos=ipos+inxh
385 : :
386 : :
387 : : case ('IVOL')
388 : 1 : inxh=index(inpstr(ipos:lenstr),' ')
389 [ - + ]: 1 : if (inxh /= 2) then
390 : 0 : write(std_out,*) 'ERROR in specif. of ', cmot(1:lenc)
391 : 0 : ABI_ERROR("Aborting now")
392 : : end if
393 : 1 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"INT",outi,outr,errcod)
394 : 1 : aim_dtset%ivol=outi
395 : 1 : write(std_out,*) cmot(1:lenc),' ', aim_dtset%ivol
396 : 1 : write(untout,*) cmot(1:lenc),' ', aim_dtset%ivol
397 : 1 : ipos=ipos+inxh
398 : :
399 : : case ('DENOUT')
400 : 0 : inxh=index(inpstr(ipos:lenstr),' ')
401 [ # # ]: 0 : if (inxh /= 2) then
402 : 0 : write(std_out,*) 'ERROR in specif. of ', cmot(1:lenc)
403 : 0 : ABI_ERROR("Aborting now")
404 : : end if
405 : 0 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"INT",outi,outr,errcod)
406 : 0 : aim_dtset%denout=outi
407 [ # # ]: 0 : if ((aim_dtset%denout < -1).or.(aim_dtset%denout>3)) then
408 : 0 : write(std_out,*) 'ERROR in specif. of ', cmot(1:lenc)
409 : 0 : ABI_ERROR("Aborting now")
410 : : end if
411 : 0 : write(std_out,*) cmot(1:lenc),' ', aim_dtset%denout
412 : 0 : write(untout,*) cmot(1:lenc),' ', aim_dtset%denout
413 : 0 : ipos=ipos+inxh
414 : :
415 : : case ('LAPOUT')
416 : 0 : inxh=index(inpstr(ipos:lenstr),' ')
417 [ # # ]: 0 : if (inxh /= 2) then
418 : 0 : write(std_out,*) 'ERROR in specif. of ', cmot(1:lenc)
419 : 0 : ABI_ERROR("Aborting now")
420 : : end if
421 : 0 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"INT",outi,outr,errcod)
422 : 0 : aim_dtset%lapout=outi
423 [ # # ]: 0 : if ((aim_dtset%lapout < -1).or.(aim_dtset%lapout>3)) then
424 : 0 : write(std_out,*) 'ERROR in specif. of ', cmot(1:lenc)
425 : 0 : ABI_ERROR("Aborting now")
426 : : end if
427 : 0 : write(std_out,*) cmot(1:lenc),' ', aim_dtset%lapout
428 : 0 : write(untout,*) cmot(1:lenc),' ', aim_dtset%lapout
429 : 0 : ipos=ipos+inxh
430 : :
431 : : case ('DLTYP')
432 : 0 : inxh=index(inpstr(ipos:lenstr),' ')
433 [ # # ]: 0 : if (inxh /= 2) then
434 : 0 : write(std_out,*) 'ERROR in specif. of ', cmot(1:lenc)
435 : 0 : ABI_ERROR("Aborting now")
436 : : end if
437 : 0 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"INT",outi,outr,errcod)
438 : 0 : aim_dtset%dltyp=outi
439 : 0 : write(std_out,*) cmot(1:lenc),' ', aim_dtset%dltyp
440 : 0 : write(untout,*) cmot(1:lenc),' ', aim_dtset%dltyp
441 : 0 : ipos=ipos+inxh
442 : :
443 : : case ('GPSURF')
444 : 5 : inxh=index(inpstr(ipos:lenstr),' ')
445 [ - + ]: 5 : if (inxh /= 2) then
446 : 0 : write(std_out,*) 'ERROR in specif. of ', cmot(1:lenc)
447 : 0 : ABI_ERROR("Aborting now")
448 : : end if
449 : 5 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"INT",outi,outr,errcod)
450 : 5 : aim_dtset%gpsurf=outi
451 : 5 : write(std_out,*) cmot(1:lenc),' ', aim_dtset%gpsurf
452 : 5 : write(untout,*) cmot(1:lenc),' ', aim_dtset%gpsurf
453 : 5 : ipos=ipos+inxh
454 : :
455 : :
456 : : ! END OF THE DRIVER SPECIFICATIONS
457 : :
458 : : case ('ATOM')
459 : 5 : inxh=index(inpstr(ipos:lenstr),' ')
460 : 5 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"INT",outi,outr,errcod)
461 : 5 : aim_dtset%batom=outi
462 : 5 : write(std_out,*) cmot(1:lenc),' ', aim_dtset%batom
463 : 5 : write(untout,*) cmot(1:lenc),' ', aim_dtset%batom
464 : 5 : ipos=ipos+inxh
465 : :
466 : : case ('NSA')
467 : 0 : inxh=index(inpstr(ipos:lenstr),' ')
468 : 0 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"INT",outi,outr,errcod)
469 : 0 : aim_dtset%nsa=outi
470 : 0 : write(std_out,*) cmot(1:lenc),' ', aim_dtset%nsa
471 : 0 : write(untout,*) cmot(1:lenc),' ', aim_dtset%nsa
472 : 0 : ipos=ipos+inxh
473 : :
474 : : case ('NSB')
475 : 0 : inxh=index(inpstr(ipos:lenstr),' ')
476 : 0 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"INT",outi,outr,errcod)
477 : 0 : aim_dtset%nsb=outi
478 : 0 : write(std_out,*) cmot(1:lenc),' ', aim_dtset%nsb
479 : 0 : write(untout,*) cmot(1:lenc),' ', aim_dtset%nsb
480 : 0 : ipos=ipos+inxh
481 : :
482 : : case ('NSC')
483 : 0 : inxh=index(inpstr(ipos:lenstr),' ')
484 : 0 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"INT",outi,outr,errcod)
485 : 0 : aim_dtset%nsc=outi
486 : 0 : write(std_out,*) cmot(1:lenc),' ', aim_dtset%nsc
487 : 0 : write(untout,*) cmot(1:lenc),' ', aim_dtset%nsc
488 : 0 : ipos=ipos+inxh
489 : :
490 : : case ('INPT')
491 : 5 : inxh=index(inpstr(ipos:lenstr),' ')
492 : 5 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"INT",outi,outr,errcod)
493 : 5 : aim_dtset%npt=outi
494 : 5 : write(std_out,*) cmot(1:lenc),' ', aim_dtset%npt
495 : 5 : write(untout,*) cmot(1:lenc),' ', aim_dtset%npt
496 : 5 : ipos=ipos+inxh
497 : :
498 : : case ('NTHETA')
499 : 5 : inxh=index(inpstr(ipos:lenstr),' ')
500 : 5 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"INT",outi,outr,errcod)
501 : 5 : aim_dtset%nth=outi
502 : 5 : write(std_out,*) cmot(1:lenc),' ', aim_dtset%nth
503 : 5 : write(untout,*) cmot(1:lenc),' ', aim_dtset%nth
504 : 5 : ipos=ipos+inxh
505 : :
506 : : case ('NPHI')
507 : 5 : inxh=index(inpstr(ipos:lenstr),' ')
508 : 5 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"INT",outi,outr,errcod)
509 : 5 : aim_dtset%nph=outi
510 : 5 : write(std_out,*) cmot(1:lenc),' ', aim_dtset%nph
511 : 5 : write(untout,*) cmot(1:lenc),' ', aim_dtset%nph
512 : 5 : ipos=ipos+inxh
513 : :
514 : : case ('THETAMIN')
515 : 0 : inxh=index(inpstr(ipos:lenstr),' ')
516 : 0 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"DPR",outi,outr,errcod)
517 : 0 : aim_dtset%themin=outr
518 : 0 : write(std_out, '(1x,a,a,es17.10)') cmot(1:lenc),' ', aim_dtset%themin
519 : 0 : write(untout, '(1x,a,a,es17.10)') cmot(1:lenc),' ', aim_dtset%themin
520 : 0 : ipos=ipos+inxh
521 : :
522 : : case ('THETAMAX')
523 : 4 : inxh=index(inpstr(ipos:lenstr),' ')
524 : 4 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"DPR",outi,outr,errcod)
525 : 4 : aim_dtset%themax=outr
526 : 4 : write(std_out, '(1x,a,a,es17.10)' ) cmot(1:lenc),' ', aim_dtset%themax
527 : 4 : write(untout,'(1x,a,a,es17.10)') cmot(1:lenc),' ', aim_dtset%themax
528 : 4 : ipos=ipos+inxh
529 : :
530 : : case ('PHIMIN')
531 : 0 : inxh=index(inpstr(ipos:lenstr),' ')
532 : 0 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"DPR",outi,outr,errcod)
533 : 0 : aim_dtset%phimin=outr
534 : 0 : write(std_out, '(1x,a,a,es17.10)' ) cmot(1:lenc),' ', aim_dtset%phimin
535 : 0 : write(untout, '(1x,a,a,es17.10)') cmot(1:lenc),' ', aim_dtset%phimin
536 : 0 : ipos=ipos+inxh
537 : :
538 : : case ('PHIMAX')
539 : 4 : inxh=index(inpstr(ipos:lenstr),' ')
540 : 4 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"DPR",outi,outr,errcod)
541 : 4 : aim_dtset%phimax=outr
542 : 4 : write(std_out, '(1x,a,a,es17.10)') cmot(1:lenc),' ', aim_dtset%phimax
543 : 4 : write(untout, '(1x,a,a,es17.10)') cmot(1:lenc),' ', aim_dtset%phimax
544 : 4 : ipos=ipos+inxh
545 : :
546 : : case ('ATRAD')
547 : 2 : inxh=index(inpstr(ipos:lenstr),' ')
548 : 2 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"DPR",outi,outr,errcod)
549 : 2 : aim_dtset%atrad=outr
550 : 2 : write(std_out, '(1x,a,a,es17.10)') cmot(1:lenc),' ', aim_dtset%atrad
551 : 2 : write(untout, '(1x,a,a,es17.10)') cmot(1:lenc),' ', aim_dtset%atrad
552 : 2 : ipos=ipos+inxh
553 : :
554 : : case ('RADSTP')
555 : 2 : inxh=index(inpstr(ipos:lenstr),' ')
556 : 2 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"DPR",outi,outr,errcod)
557 : 2 : aim_dtset%dr0=outr
558 : 2 : write(std_out, '(1x,a,a,es17.10)') cmot(1:lenc),' ', aim_dtset%dr0
559 : 2 : write(untout, '(1x,a,a,es17.10)') cmot(1:lenc),' ', aim_dtset%dr0
560 : 2 : ipos=ipos+inxh
561 : :
562 : : case ('FOLSTP')
563 : 0 : inxh=index(inpstr(ipos:lenstr),' ')
564 : 0 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"DPR",outi,outr,errcod)
565 : 0 : aim_dtset%folstp=outr
566 : 0 : write(std_out, '(1x,a,a,es17.10)') cmot(1:lenc),' ', aim_dtset%folstp
567 : 0 : write(untout, '(1x,a,a,es17.10)') cmot(1:lenc),' ', aim_dtset%folstp
568 : 0 : ipos=ipos+inxh
569 : :
570 : : case ('RATMIN')
571 : 2 : inxh=index(inpstr(ipos:lenstr),' ')
572 : 2 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"DPR",outi,outr,errcod)
573 : 2 : aim_dtset%rmin=outr
574 : 2 : write(std_out, '(1x,a,a,es17.10)') cmot(1:lenc),' ', aim_dtset%rmin
575 : 2 : write(untout, '(1x,a,a,es17.10)') cmot(1:lenc),' ', aim_dtset%rmin
576 : 2 : ipos=ipos+inxh
577 : :
578 : : case ('COFF1')
579 : 0 : inxh=index(inpstr(ipos:lenstr),' ')
580 : 0 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"DPR",outi,outr,errcod)
581 : 0 : aim_dtset%coff1=outr
582 : 0 : write(std_out, '(1x,a,a,es17.10)') cmot(1:lenc),' ', aim_dtset%coff1
583 : 0 : write(untout, '(1x,a,a,es17.10)') cmot(1:lenc),' ', aim_dtset%coff1
584 : 0 : ipos=ipos+inxh
585 : :
586 : : case ('COFF2')
587 : 0 : inxh=index(inpstr(ipos:lenstr),' ')
588 : 0 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"DPR",outi,outr,errcod)
589 : 0 : aim_dtset%coff2=outr
590 : 0 : write(std_out, '(1x,a,a,es17.10)') cmot(1:lenc),' ', aim_dtset%coff2
591 : 0 : write(untout, '(1x,a,a,es17.10)') cmot(1:lenc),' ', aim_dtset%coff2
592 : 0 : ipos=ipos+inxh
593 : :
594 : : case ('DPCLIM')
595 : 1 : inxh=index(inpstr(ipos:lenstr),' ')
596 : 1 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"DPR",outi,outr,errcod)
597 : 1 : aim_dtset%dpclim=outr
598 : 1 : write(std_out, '(1x,a,a,es17.10)') cmot(1:lenc),' ', aim_dtset%dpclim
599 : 1 : write(untout, '(1x,a,a,es17.10)') cmot(1:lenc),' ', aim_dtset%dpclim
600 : 1 : ipos=ipos+inxh
601 : :
602 : : case ('LGRAD')
603 : 0 : inxh=index(inpstr(ipos:lenstr),' ')
604 : 0 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"DPR",outi,outr,errcod)
605 : 0 : aim_dtset%lgrad=outr
606 : 0 : write(std_out, '(1x,a,a,es17.10)') cmot(1:lenc),' ', aim_dtset%lgrad
607 : 0 : write(untout, '(1x,a,a,es17.10)') cmot(1:lenc),' ', aim_dtset%lgrad
608 : 0 : ipos=ipos+inxh
609 : :
610 : : case ('LGRAD2')
611 : 3 : inxh=index(inpstr(ipos:lenstr),' ')
612 : 3 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"DPR",outi,outr,errcod)
613 : 3 : aim_dtset%lgrad2=outr
614 : 3 : write(std_out, '(1x,a,a,es17.10)') cmot(1:lenc),' ', aim_dtset%lgrad2
615 : 3 : write(untout, '(1x,a,a,es17.10)') cmot(1:lenc),' ', aim_dtset%lgrad2
616 : 3 : ipos=ipos+inxh
617 : :
618 : : case ('LSTEP')
619 : 0 : inxh=index(inpstr(ipos:lenstr),' ')
620 : 0 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"DPR",outi,outr,errcod)
621 : 0 : aim_dtset%lstep=outr
622 : 0 : write(std_out, '(1x,a,a,es17.10)') cmot(1:lenc),' ', aim_dtset%lstep
623 : 0 : write(untout, '(1x,a,a,es17.10)') cmot(1:lenc),' ', aim_dtset%lstep
624 : 0 : ipos=ipos+inxh
625 : :
626 : : case ('LSTEP2')
627 : 3 : inxh=index(inpstr(ipos:lenstr),' ')
628 : 3 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"DPR",outi,outr,errcod)
629 : 3 : aim_dtset%lstep2=outr
630 : 3 : write(std_out, '(1x,a,a,es17.10)') cmot(1:lenc),' ', aim_dtset%lstep2
631 : 3 : write(untout, '(1x,a,a,es17.10)') cmot(1:lenc),' ', aim_dtset%lstep2
632 : 3 : ipos=ipos+inxh
633 : :
634 : : case ('RSURDIR')
635 : 0 : inxh=index(inpstr(ipos:lenstr),' ')
636 : 0 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"DPR",outi,outr,errcod)
637 : 0 : aim_dtset%th0=outr
638 : 0 : ipos=ipos+inxh
639 : 0 : inxh=index(inpstr(ipos:lenstr),' ')
640 : 0 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"DPR",outi,outr,errcod)
641 : 0 : aim_dtset%phi0=outr
642 : 0 : ipos=ipos+inxh
643 : 0 : write(std_out, '(1x,a,a,2es17.10)') cmot(1:lenc),' ', aim_dtset%th0, aim_dtset%phi0
644 : 0 : write(untout, '(1x,a,a,2es17.10)') cmot(1:lenc),' ', aim_dtset%th0, aim_dtset%phi0
645 : :
646 : : case ('FOLDEP')
647 [ # # ]: 0 : do jj=1,3
648 : 0 : inxh=index(inpstr(ipos:lenstr),' ')
649 : 0 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"DPR",outi,outr,errcod)
650 : 0 : aim_dtset%foldep(jj)=outr
651 : 0 : ipos=ipos+inxh
652 : : end do
653 : 0 : write(std_out, '(1x,a,a,es17.10)') cmot(1:lenc),' ', aim_dtset%foldep
654 : 0 : write(untout, '(1x,a,a,es17.10)') cmot(1:lenc),' ', aim_dtset%foldep
655 : :
656 : : case ('SCAL')
657 [ # # ]: 0 : do jj=1,3
658 : 0 : inxh=index(inpstr(ipos:lenstr),' ')
659 : 0 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"DPR",outi,outr,errcod)
660 : 0 : aim_dtset%scal(jj)=outr
661 : 0 : ipos=ipos+inxh
662 : : end do
663 : 0 : write(std_out,*) cmot(1:lenc),' ', aim_dtset%scal
664 : 0 : write(untout,*) cmot(1:lenc),' ', aim_dtset%scal
665 : :
666 : : case ('NGRID')
667 : 0 : try=.true.
668 [ # # ]: 0 : do jj=1,3
669 : 0 : inxh=index(inpstr(ipos:lenstr),' ')
670 : 0 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"INT",outi,outr,errcod)
671 : 0 : aim_dtset%ngrid(jj)=outi
672 : : if (.not.nbtst) then
673 : : tstngr=jj-1
674 : : cycle mread
675 : : end if
676 [ # # ]: 0 : if (inxh==0) then
677 : 0 : tstvpt=jj
678 : 0 : exit mread
679 : : end if
680 : 0 : ipos=ipos+inxh
681 [ # # ]: 0 : if (ipos==lenstr-1) then
682 : 0 : tstngr=jj
683 : 0 : exit mread
684 : : end if
685 : : end do
686 : : ! Why no echo ?? XG 030218
687 : 0 : tstngr=3
688 : :
689 : : case ('VPTS')
690 [ # # ]: 0 : do jj=1,4
691 [ # # ]: 0 : do ll=1,3
692 : 0 : try=.true.
693 : 0 : inxh=index(inpstr(ipos:lenstr),' ')
694 : 0 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"DPR",outi,outr,errcod)
695 : 0 : aim_dtset%vpts(ll,jj)=outr
696 : : if (.not.nbtst) then
697 : : tstvpt=jj-1
698 : : cycle mread
699 : : end if
700 : 0 : ipos=ipos+inxh
701 [ # # ]: 0 : if (ipos>=lenstr) then
702 : 0 : tstvpt=jj
703 : 0 : exit mread
704 : : end if
705 : : end do
706 : : end do
707 : : ! Why no echo ?? XG 030218
708 : 0 : tstvpt=4
709 : :
710 : : case ('MAXATD')
711 : 5 : inxh=index(inpstr(ipos:lenstr),' ')
712 : 5 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"DPR",outi,outr,errcod)
713 : 5 : aim_dtset%maxatd=outr
714 : 5 : write(std_out, '(1x,a,a,es17.10)') cmot(1:lenc),' ', aim_dtset%maxatd
715 : 5 : write(untout, '(1x,a,a,es17.10)') cmot(1:lenc),' ', aim_dtset%maxatd
716 : 5 : ipos=ipos+inxh
717 : :
718 : : case ('MAXCPD')
719 : 4 : inxh=index(inpstr(ipos:lenstr),' ')
720 : 4 : call inread(inpstr(ipos:ipos+inxh-2),inxh-1,"DPR",outi,outr,errcod)
721 : 4 : aim_dtset%maxcpd=outr
722 : 4 : write(std_out, '(1x,a,a,es17.10)') cmot(1:lenc),' ', aim_dtset%maxcpd
723 : 4 : write(untout, '(1x,a,a,es17.10)') cmot(1:lenc),' ', aim_dtset%maxcpd
724 : 4 : ipos=ipos+inxh
725 : :
726 : : case default
727 [ + + - - : 71 : write(std_out,*) 'ERROR Bad key word ! ',cmot(1:lenc)
+ - + - -
- + + - -
- + + + -
+ - + + +
- + - - +
- + - + -
- - - - +
+ - ]
728 : : end select
729 : : end do mread
730 : :
731 : 5 : write(std_out,*) '************************'
732 : :
733 : 5 : call consist(aim_dtset,tstngr,tstvpt)
734 : :
735 : 5 : end subroutine adini
736 : : !!***
737 : :
738 : : !!****f* m_bader/addout
739 : : !! NAME
740 : : !! addout
741 : : !!
742 : : !! FUNCTION
743 : : !! Output density and laplacian (see input variables denout and lapout)
744 : : !!
745 : : !! INPUTS
746 : : !! aim_dtset=the structured entity containing all input variables
747 : : !! also, uses the variables saved in the module "defs_aimprom"
748 : : !!
749 : : !! OUTPUT
750 : : !! (print)
751 : : !!
752 : : !! WARNING
753 : : !! This file does not follow the ABINIT coding rules (yet) : the use
754 : : !! of a module to transfer data should be avoided
755 : : !!
756 : : !! SOURCE
757 : :
758 : 0 : subroutine addout(aim_dtset)
759 : :
760 : : !Arguments ------------------------------------
761 : : !scalars
762 : : type(aim_dataset_type),intent(in) :: aim_dtset
763 : :
764 : : !Local variables ------------------------------
765 : : !scalars
766 : : integer :: cod,dims,iat,ii,ipos,jj,nn,tgrd
767 : : real(dp) :: alfa,rho,rr,xx,yy
768 : : !arrays
769 : : real(dp) :: grho(3),hrho(3,3),orig(3),vv(3)
770 : 0 : real(dp),allocatable :: dfld(:),lfld(:),nr(:),stp(:),uu(:,:)
771 : :
772 : : !************************************************************************
773 [ # # ]: 0 : orig(:)=aim_dtset%vpts(:,1)
774 [ # # ]: 0 : if (aim_dtset%denout > 0) then
775 : : dims=aim_dtset%denout
776 [ # # ]: 0 : elseif (aim_dtset%lapout > 0) then
777 : 0 : dims=aim_dtset%lapout
778 : : end if
779 : :
780 : 0 : select case (aim_dtset%dltyp)
781 : : case (1)
782 : 0 : cod=1
783 : : case (2)
784 : 0 : cod=2
785 : : case default
786 [ # # # ]: 0 : cod=0
787 : : end select
788 : :
789 [ # # # # : 0 : ABI_MALLOC(uu,(3,dims))
# # # # #
# ]
790 [ # # # # : 0 : ABI_MALLOC(nr,(dims))
# # # # #
# ]
791 [ # # # # : 0 : ABI_MALLOC(stp,(dims))
# # # # ]
792 : :
793 : 0 : write(std_out,*) 'grid:', aim_dtset%ngrid(1:dims)
794 : 0 : write(std_out,*) 'kod :', cod
795 : 0 : tgrd=1
796 [ # # ]: 0 : do ii=1,dims
797 : 0 : tgrd=tgrd*aim_dtset%ngrid(ii)
798 [ # # ]: 0 : uu(:,ii)=aim_dtset%vpts(:,ii+1)-aim_dtset%vpts(:,1)
799 : 0 : nr(ii)=vnorm(uu(:,ii),0)
800 : 0 : stp(ii)=nr(ii)/(aim_dtset%ngrid(ii)-1)
801 [ # # ]: 0 : uu(:,ii)=uu(:,ii)/nr(ii)
802 : : end do
803 : 0 : write(std_out,*) 'tgrd :', tgrd
804 [ # # ]: 0 : do ii=1,dims
805 : 0 : write(std_out,*) 'uu :', uu(1:3,ii)
806 : : end do
807 : :
808 [ # # ]: 0 : if (aim_dtset%denout > 0) then
809 [ # # # # : 0 : ABI_MALLOC(dfld,(tgrd+1))
# # # # #
# # # #
# ]
810 [ # # ]: 0 : dfld(:)=0._dp
811 : : end if
812 [ # # ]: 0 : if (aim_dtset%lapout > 0) then
813 [ # # # # : 0 : ABI_MALLOC(lfld,(tgrd+1))
# # # # #
# # # #
# ]
814 : : end if
815 : :
816 : 0 : select case (dims)
817 : : case (1)
818 : 0 : nn=0
819 [ # # ]: 0 : do ii=0,aim_dtset%ngrid(1)-1
820 : 0 : nn=nn+1
821 [ # # ]: 0 : vv(:)=orig(:)+ii*stp(1)*uu(:,1)
822 : 0 : call vgh_rho(vv,rho,grho,hrho,rr,iat,ipos,cod)
823 [ # # ]: 0 : if (aim_dtset%denout > 0) dfld(nn)=rho
824 [ # # ]: 0 : if (aim_dtset%lapout > 0) lfld(nn)=hrho(1,1)+hrho(2,2)+hrho(3,3)
825 : : end do
826 [ # # ]: 0 : if (aim_dtset%denout==1) then
827 [ # # ]: 0 : do ii=0,aim_dtset%ngrid(1)-1
828 : 0 : xx=ii*stp(1)
829 : 0 : write(untd,'(2E16.8)') xx, dfld(ii+1)
830 : : end do
831 : : end if
832 [ # # ]: 0 : if (aim_dtset%lapout==1) then
833 [ # # ]: 0 : do ii=0,aim_dtset%ngrid(1)-1
834 : 0 : xx=ii*stp(1)
835 : 0 : write(untl,'(2E16.8)') xx, lfld(ii+1)
836 : : end do
837 : : end if
838 : : case (2)
839 : 0 : nn=0
840 [ # # ]: 0 : alfa=dot_product(uu(:,1),uu(:,2))
841 : 0 : alfa=acos(alfa)
842 [ # # ]: 0 : do ii=0,aim_dtset%ngrid(2)-1
843 [ # # ]: 0 : do jj=0,aim_dtset%ngrid(1)-1
844 : 0 : nn=nn+1
845 [ # # ]: 0 : vv(:)=orig(:)+jj*uu(:,2)*stp(2)+ii*stp(1)*uu(:,1)
846 : 0 : call vgh_rho(vv,rho,grho,hrho,rr,iat,ipos,cod)
847 [ # # ]: 0 : if (aim_dtset%denout > 0) dfld(nn)=rho
848 [ # # ]: 0 : if (aim_dtset%lapout > 0) lfld(nn)=hrho(1,1)+hrho(2,2)+hrho(3,3)
849 : : end do
850 : : end do
851 : 0 : write(std_out,*) 'generace hotova', nn
852 : 0 : nn=0
853 [ # # ]: 0 : if (aim_dtset%denout==2) then
854 [ # # ]: 0 : do ii=0,aim_dtset%ngrid(2)-1
855 [ # # ]: 0 : do jj=0,aim_dtset%ngrid(1)-1
856 : 0 : nn=nn+1
857 : 0 : xx=jj*stp(1)+cos(alfa)*ii*stp(2)
858 : 0 : yy=sin(alfa)*ii*stp(2)
859 : 0 : write(untd,'(3E16.8)') xx, yy, dfld(nn)
860 : : end do
861 : 0 : write(untd,*) ' '
862 : : end do
863 : : end if
864 : 0 : nn=0
865 [ # # # # : 0 : if (aim_dtset%lapout==2) then
# ]
866 : 0 : write(std_out,*) 'lezes sem?'
867 [ # # ]: 0 : do ii=0,aim_dtset%ngrid(2)-1
868 [ # # ]: 0 : do jj=0,aim_dtset%ngrid(1)-1
869 : 0 : nn=nn+1
870 : 0 : xx=jj*stp(1)+cos(alfa)*ii*stp(2)
871 : 0 : yy=sin(alfa)*ii*stp(2)
872 : 0 : write(untl,'(3E16.8)') xx, yy, lfld(nn)
873 : : end do
874 : 0 : write(untl,*) ' '
875 : : end do
876 : : end if
877 : : end select
878 [ # # ]: 0 : ABI_FREE(uu)
879 [ # # ]: 0 : ABI_FREE(stp)
880 [ # # ]: 0 : ABI_FREE(nr)
881 [ # # ]: 0 : if(aim_dtset%denout>0) then
882 [ # # ]: 0 : ABI_FREE(dfld)
883 : : end if
884 [ # # ]: 0 : if(aim_dtset%lapout>0) then
885 [ # # ]: 0 : ABI_FREE(lfld)
886 : : end if
887 : :
888 [ # # # # ]: 0 : end subroutine addout
889 : : !!***
890 : :
891 : : !!****f* m_bader/aim_follow
892 : : !! NAME
893 : : !! aim_follow
894 : : !!
895 : : !! FUNCTION
896 : : !! This routine follows the gradient line starting from the point
897 : : !! vv. It stop when it arrives to the atom (nearer than rminl(iat))
898 : : !! or - if srch=true - also if it arrives under the already known
899 : : !! part of Bader surface
900 : : !!
901 : : !! INPUTS
902 : : !! aim_dtset= the structured entity containing all input variables
903 : : !! iatinit,iposinit= indexes of initial atom
904 : : !! npmax= maximum number of division in each step
905 : : !!
906 : : !! OUTPUT
907 : : !! iat,ipos= index of final atom
908 : : !! nstep= returns the number of step needed
909 : : !!
910 : : !! SIDE EFFECTS
911 : : !! srch= (true/false) check if the line is outside or
912 : : !! inside the atomic surface.
913 : : !! vv(3)= initial point in orthogonal coordinates
914 : : !!
915 : : !! SOURCE
916 : :
917 : 9342 : subroutine aim_follow(aim_dtset,vv,npmax,srch,iatinit,iposinit,iat,ipos,nstep)
918 : :
919 : : !Arguments ------------------------------------
920 : : !scalars
921 : : integer,intent(in) :: iatinit,iposinit,npmax
922 : : integer,intent(out) :: iat,ipos,nstep
923 : : logical,intent(inout) :: srch
924 : : type(aim_dataset_type),intent(in) :: aim_dtset
925 : : !arrays
926 : : real(dp),intent(inout) :: vv(3)
927 : :
928 : : !Local variables ------------------------------
929 : : !scalars
930 : : integer :: i1,i2,i3,ii,iph,ires,ith,jj,kk,nit,np,nph,nsi,nth
931 : : real(dp) :: deltar,dg,dist,dph,dth,fac2,facf,h0old,hh,hold,rho,rr,rsmed
932 : : real(dp) :: t1,t2,t3,vcth,vph,vth,wall,xy,xyz
933 : : logical :: fin,ldebold,srchold,stemp,stemp2
934 : : character(len=50) :: formpc
935 : : character(len=500) :: msg
936 : : !arrays
937 : : real(dp) :: ev(3),grho(3),hrho(3,3),pom(3),vold(3),vt(3),vt1(3)
938 : : real(dp) :: zz(3,3)
939 : :
940 : : !************************************************************************
941 : 3114 : formpc='(":CP",2I5,3F12.8,3E12.4,I4,2E12.4)'
942 : :
943 : :
944 : 3114 : fin=.false.
945 : :
946 : 3114 : srchold=srch
947 : 3114 : ldebold=ldeb
948 : 3114 : h0old=h0
949 : :
950 : 3114 : nth=aim_dtset%nth
951 : 3114 : nph=aim_dtset%nph
952 : :
953 [ - + ]: 3114 : if (slc==0) then
954 [ # # ]: 0 : rminl(:)=aim_dtset%rmin
955 : : end if
956 : :
957 [ - + ]: 3114 : if (deb) then
958 : 0 : ldeb=.true.
959 : : end if
960 : :
961 : 3114 : call vgh_rho(vv,rho,grho,hrho,rr,iat,ipos,slc)
962 : :
963 : : !Initial tests
964 : :
965 [ + + ]: 3114 : if (iat/=0) then
966 [ + - ]: 68 : if (rr<rminl(iat)) then
967 : 68 : fin=.true.
968 : 68 : write(std_out,*) 'rr < rmin iat=',iat,' ipos=',ipos
969 [ # # ]: 0 : elseif (rho<aim_rhomin) then
970 : 0 : fin=.true.
971 : 0 : write(std_out,*) 'CHARGE LT rhomin ',rho,' < ',aim_rhomin
972 [ # # ]: 0 : if (rho<zero) then
973 : 0 : ABI_ERROR('RHO < 0 !!!')
974 : : end if
975 : : end if
976 : : end if
977 : :
978 : 3114 : facf=aim_fac0
979 : 3114 : hh=aim_hmax
980 : :
981 : 3114 : call timein(t1,wall)
982 : 3114 : nstep=0
983 : 3114 : nsi=0
984 : :
985 : : !the principal cycle
986 : :
987 : 813964 : madw : do while(.not.fin)
988 : 203474 : hold=hh
989 : :
990 : 203474 : dg=vnorm(grho,0)
991 [ + - - + ]: 203474 : if (ldeb.or.deb) write(std_out,*) 'dg= ',dg
992 : :
993 : : ! the time test
994 : :
995 : 203474 : call timein(t3,wall)
996 : 203474 : t2=t3-t1
997 [ - + ]: 203474 : if (t2>300.0) then
998 : 0 : write(std_out,*) 'TIME EXCEEDED 5 min IN FOLLOW'
999 : 0 : write(std_out,*) 'h0 =',h0,' h =',hh,' h0old =',h0old,' dg =',dg
1000 : 0 : write(std_out,*) 'facf =',facf
1001 : 0 : msg = 'TIME EXCEEDED 5 min IN FOLLOW'
1002 : 0 : ABI_ERROR(msg)
1003 : : end if
1004 : :
1005 [ - + ]: 203474 : if (dg<aim_dgmin) then
1006 : 0 : write(std_out,*) 'gradient < dgmin ',dg,' < ',aim_dgmin
1007 : 0 : fin=.true.
1008 : 0 : iat=0
1009 : 0 : ipos=0
1010 : : ! testing for the CP
1011 [ # # ]: 0 : if (npc>0) then
1012 : 0 : call critic(aim_dtset,vv,ev,zz,aim_dmaxcrit,ires,0)
1013 [ # # ]: 0 : if (ires==0) then
1014 [ # # ]: 0 : do jj=1,npc
1015 [ # # ]: 0 : pom(:)=pc(:,jj)-vv(:)+xatm(:,aim_dtset%batom)
1016 : 0 : dist=vnorm(pom,0)
1017 [ # # ]: 0 : if (dist<aim_tiny) cycle madw
1018 : : end do
1019 : 0 : write(std_out,*) 'C.P. found !!'
1020 : 0 : npc=npc+1
1021 [ # # ]: 0 : do jj=1,3
1022 : 0 : pc(jj,npc)=vv(jj)
1023 : 0 : evpc(jj,npc)=ev(jj)
1024 [ # # ]: 0 : do kk=1,3
1025 : 0 : zpc(kk,jj,npc)=zz(kk,jj)
1026 : : end do
1027 : : end do
1028 : 0 : i1=ev(1)/abs(ev(1))
1029 : 0 : i2=ev(2)/abs(ev(2))
1030 : 0 : i3=ev(3)/abs(ev(3))
1031 : 0 : icpc(npc)=i1+i2+i3
1032 [ # # ]: 0 : if (icpc(npc)==-3) then ! pseudoatom handling
1033 : 0 : npcm3=npcm3+1
1034 : 0 : write(std_out,*) 'Pseudo-atom found !!'
1035 : : end if
1036 : :
1037 : 0 : call vgh_rho(vv,rho,grho,hrho,rr,iat,ipos,slc)
1038 : 0 : write(22,formpc) 0,0,(pcrb(jj,npc),jj=1,3),(ev(jj),jj=1,3),icpc(npc),&
1039 : 0 : & ev(1)+ev(2)+ev(3),rho
1040 : 0 : write(std_out,formpc) 0,0,(pcrb(jj,npc),jj=1,3),(ev(jj),jj=1,3),icpc(npc),&
1041 : 0 : & ev(1)+ev(2)+ev(3),rho
1042 : : else
1043 : 0 : write(std_out,*) 'C.P. not found !!'
1044 : : end if
1045 : : end if
1046 : :
1047 : : cycle madw
1048 : : end if
1049 : :
1050 : 203474 : hh=h0/dg
1051 [ + - - + ]: 203474 : if (ldeb.or.deb) write(std_out,*) 'h= ',hh,' h0= ',h0,' dg= ',dg
1052 [ - + ]: 203474 : if (hh>aim_hmax) hh=aim_hmax
1053 : : ! step modifications
1054 : :
1055 : 203474 : hh=hh*facf
1056 [ - + ]: 203474 : if (hh>(hold*aim_hmult)) then
1057 : 0 : hh=hold*aim_hmult
1058 : : end if
1059 : :
1060 [ + + ]: 813896 : do ii=1,3
1061 : 813896 : vold(ii)=vv(ii)
1062 : : end do
1063 : :
1064 : 203474 : nit=0
1065 : 203474 : hold=hh
1066 : :
1067 : : ! one step following the gradient line
1068 : : !
1069 : 203474 : call onestep(vv,rho,grho,hh,np,npmax,deltar)
1070 [ + + + + : 232463 : do while (((np>npmax).or.(deltar>aim_stmax)).and.(deltar>aim_dmin))
- + ]
1071 : 28989 : nit=nit+1
1072 [ - + ]: 28989 : if (nit>5) then
1073 [ # # ]: 0 : if (deltar>aim_stmax) then
1074 : 0 : write(std_out,*) 'nit > 5 and deltar > stmax nit=',nit
1075 : : else
1076 : 0 : write(std_out,*) 'nit > 5 and np > npmax nit=',nit
1077 : : end if
1078 : : end if
1079 [ + + ]: 115956 : do ii=1,3
1080 : 115956 : vv(ii)=vold(ii)
1081 : : end do
1082 : 28989 : hh=hh*0.3
1083 : 28989 : call onestep(vv,rho,grho,hh,np,npmax,deltar)
1084 : : end do
1085 : :
1086 : :
1087 : 203474 : nstep=nstep+1
1088 [ + - - + ]: 203474 : if (ldeb.or.deb) write(std_out,*) 'h= ',hh
1089 : :
1090 : 203474 : fac2=hh/hold
1091 [ + + ]: 203474 : if (fac2>=1._dp) then
1092 : 174540 : facf=facf*1.2
1093 : : else
1094 [ + - ]: 28934 : if (fac2>=aim_facmin) then
1095 : 28934 : facf=fac2
1096 : : else
1097 : 0 : facf=aim_facmin
1098 : : end if
1099 : : end if
1100 : :
1101 [ + - - + ]: 203474 : if (deb.or.ldeb) then
1102 : 0 : write(std_out,*) ':POS ',vv
1103 : 0 : write(std_out,*) ':RBPOS ',vt1
1104 : 0 : write(std_out,*) ':GRAD ',grho
1105 : : end if
1106 : :
1107 : 203474 : call vgh_rho(vv,rho,grho,hrho,rr,iat,ipos,slc)
1108 : 203474 : dg=vnorm(grho,0)
1109 [ + + ]: 813896 : pom(:)=vv(:)-xatm(:,iatinit)-atp(:,iposinit)
1110 : :
1111 [ + + ]: 203474 : if (iat /= 0) then
1112 : 3046 : fin=.true.
1113 : 3046 : write(std_out,*) 'r < rmin iat=',iat,' ipos=',ipos
1114 : : cycle madw
1115 : : end if
1116 : :
1117 [ - + ]: 200428 : if (rho<aim_rhomin) then
1118 : 0 : fin=.true.
1119 : 0 : write(std_out,*) 'charge < rhomin ',rho,' < ',aim_rhomin
1120 [ # # ]: 0 : if (rho<zero) then
1121 : 0 : ABI_ERROR('RHO < 0 !!!')
1122 : : end if
1123 : 0 : iat=0
1124 : 0 : ipos=0
1125 : : cycle madw
1126 : : end if
1127 : :
1128 [ - + ]: 200428 : if (npcm3>0) then
1129 [ # # ]: 0 : do jj=1,npc
1130 [ # # ]: 0 : if (icpc(jj)==(-3)) then
1131 [ # # ]: 0 : pom(:)=pc(:,jj)-vv(:)+xatm(:,aim_dtset%batom)
1132 : 0 : dist=vnorm(pom,0)
1133 [ # # ]: 0 : if (dist<(aim_dtset%rmin**2*0.1)) then
1134 : 0 : iat=0
1135 : 0 : ipos=0
1136 : 0 : fin=.true.
1137 : 0 : write(std_out,*) 'We are inside a pseudo-atom'
1138 : : cycle madw
1139 : : end if
1140 : : end if
1141 : : end do
1142 : : end if
1143 : :
1144 : 200428 : nsi=nsi+1
1145 : :
1146 : : ! surface checking
1147 : :
1148 [ + + - + ]: 200496 : if (srch.and.(nsi>=nsimax)) then
1149 : 703276 : nsi=0
1150 : 703276 : ith=0
1151 : 703276 : iph=0
1152 [ + + ]: 703276 : do ii=1,3
1153 : 703276 : vt(ii)=vv(ii)-xatm(ii,iatinit)
1154 : : end do
1155 : 175819 : xy=vt(1)*vt(1)+vt(2)*vt(2)
1156 : 175819 : xyz=xy+vt(3)*vt(3)
1157 : 175819 : xyz=sqrt(xyz)
1158 [ - + ]: 175819 : if (xy<aim_snull) then
1159 : 0 : vcth=1._dp
1160 [ # # ]: 0 : if (vt(3)<0._dp) vcth=-vcth
1161 : : vph=0._dp
1162 : : else
1163 : 175819 : vcth=vt(3)/xyz
1164 : 175819 : vph=atan2(vt(2),vt(1))
1165 : : end if
1166 : 175819 : vth=acos(vcth)
1167 [ + + ]: 175819 : if (vth<th(1)) then
1168 : : ith=0
1169 : : else
1170 [ + + ]: 159391 : if (vth>th(nth)) then
1171 : : ith=nth
1172 : : else
1173 [ + - ]: 458026 : do ii=2,nth
1174 [ + + ]: 458026 : if (vth<th(ii)) then
1175 : 137640 : ith=ii-1
1176 : 137640 : exit
1177 : : end if
1178 : : end do
1179 : : end if
1180 : : end if
1181 : :
1182 [ + + ]: 175819 : if (vph<ph(1)) then
1183 : : iph=0
1184 : : else
1185 [ + + ]: 137932 : if (vph>ph(nph)) then
1186 : : iph=nph
1187 : : else
1188 [ + - ]: 208006 : do ii=2,nph
1189 [ + + ]: 208006 : if (vph<ph(ii)) then
1190 : 104279 : iph=ii-1
1191 : 104279 : exit
1192 : : end if
1193 : : end do
1194 : : end if
1195 : : end if
1196 : :
1197 : 175819 : stemp=(iph>0).and.(iph<nph)
1198 [ + + + + ]: 175819 : stemp=stemp.and.(ith>0).and.(ith<nth)
1199 : :
1200 : : if (stemp) then
1201 : 81179 : stemp2=rs(ith,iph)>0._dp
1202 [ + + + + ]: 81179 : stemp2=stemp2.and.(rs(ith+1,iph)>0._dp)
1203 [ + + ]: 3504 : stemp2=stemp2.and.(rs(ith+1,iph+1)>0._dp)
1204 [ + + + - ]: 203593 : stemp2=stemp2.and.(rs(ith,iph+1)>0._dp)
1205 : : if (stemp2) then
1206 : 0 : dth=th(ith+1)-th(ith)
1207 : 0 : dph=ph(iph+1)-ph(iph)
1208 : 0 : rsmed=rs(ith,iph)*(th(ith+1)-vth)/dth*(ph(iph+1)-vph)/dph
1209 : 0 : rsmed=rsmed+rs(ith+1,iph)*(vth-th(ith))/dth*(ph(iph+1)-vph)/dph
1210 : 0 : rsmed=rsmed+rs(ith+1,iph+1)*(vth-th(ith))/dth*(vph-ph(iph))/dph
1211 : 0 : rsmed=rsmed+rs(ith,iph+1)*(th(ith+1)-vth)/dth*(vph-ph(iph))/dph
1212 [ # # ]: 0 : if (rsmed>xyz) then
1213 : 0 : write(std_out,*) 'We are inside the surface'
1214 : 0 : iat=iatinit
1215 : 0 : ipos=iposinit
1216 : : else
1217 : 0 : write(std_out,*) 'We are outside the surface'
1218 : 0 : iat=0
1219 : 0 : ipos=0
1220 : : end if
1221 : : fin=.true.
1222 : : cycle madw
1223 : : end if
1224 : : end if
1225 : : end if
1226 : :
1227 : : end do madw
1228 : :
1229 : :
1230 : 3114 : srch=srchold
1231 : 3114 : ldeb=ldebold
1232 : 3114 : h0=h0old
1233 : :
1234 : :
1235 : 3114 : end subroutine aim_follow
1236 : : !!***
1237 : :
1238 : : !!****f* m_bader/consist
1239 : : !! NAME
1240 : : !! consist
1241 : : !!
1242 : : !! FUNCTION
1243 : : !! Checking of the consistency between the values of input variables
1244 : : !!
1245 : : !! INPUTS
1246 : : !! aim_dtset= the structured entity containing all input variables
1247 : : !! tstngr= information about the test on the ngrid input variable
1248 : : !! tstvpt= information about the test on the vpts input variable
1249 : : !!
1250 : : !! OUTPUT
1251 : : !! (only checking : print error message and stop if there is a problem)
1252 : : !!
1253 : : !! WARNING
1254 : : !! This file does not follow the ABINIT coding rules (yet)
1255 : : !!
1256 : : !! SOURCE
1257 : :
1258 : 5 : subroutine consist(aim_dtset,tstngr,tstvpt)
1259 : :
1260 : : !Arguments ------------------------------------
1261 : : !scalars
1262 : : integer,intent(in) :: tstngr,tstvpt
1263 : : type(aim_dataset_type),intent(in) :: aim_dtset
1264 : :
1265 : : !Local variables ------------------------------
1266 : :
1267 : : ! *********************************************************************
1268 : :
1269 : : !write(std_out,*) tstngr, tstvpt
1270 : :
1271 [ + - - + : 5 : if (((aim_dtset%denout/=0).or.(aim_dtset%lapout/=0)).and.((tstngr < 1).or.(tstvpt < 2))) then
- - - - ]
1272 : 0 : ABI_ERROR('in input1 - I cannot do the output !')
1273 : : end if
1274 [ - + - - ]: 5 : if ((aim_dtset%denout > 0).and.(aim_dtset%lapout>0)) then
1275 [ # # ]: 0 : if (aim_dtset%denout/=aim_dtset%lapout) then
1276 : 0 : write(std_out,*) 'ERROR in input - when both denout and lapout are positive non-zero,'
1277 : 0 : write(std_out,*) 'they must be equal.'
1278 : 0 : ABI_ERROR("Aborting now")
1279 : : end if
1280 [ # # # # ]: 0 : if ((tstvpt < aim_dtset%denout+1).or.(tstngr < aim_dtset%denout)) then
1281 : 0 : write(std_out,*) 'ERROR in input2 - I cannot do the output !'
1282 : 0 : ABI_ERROR("Aborting now")
1283 : : end if
1284 [ - + ]: 5 : elseif (aim_dtset%denout > 0) then
1285 [ # # # # ]: 0 : if ((tstvpt < aim_dtset%denout+1).or.(tstngr < aim_dtset%denout)) then
1286 : 0 : write(std_out,*) 'ERROR in input - I cannot do the output !'
1287 : 0 : ABI_ERROR("Aborting now")
1288 : : end if
1289 [ - + ]: 5 : elseif (aim_dtset%lapout > 0) then
1290 [ # # # # ]: 0 : if ((tstvpt < aim_dtset%lapout+1).or.(tstngr < aim_dtset%lapout)) then
1291 : 0 : write(std_out,*) 'ERROR in input - I cannot do the output !'
1292 : 0 : ABI_ERROR("Aborting now")
1293 : : end if
1294 : : end if
1295 : :
1296 [ + - - + ]: 5 : if ((aim_dtset%isurf==1).and.(aim_dtset%crit==0)) then
1297 : 0 : write(std_out,*) 'ERROR in input - must have crit/=0 for isurf==1'
1298 : 0 : ABI_ERROR("Aborting now")
1299 : : end if
1300 : :
1301 [ + - - + ]: 5 : if (((aim_dtset%ivol/=0).or.(aim_dtset%irho/=0)).and.(aim_dtset%isurf==0)) then
1302 : 0 : ABI_ERROR('in input - I cannot integrate without surface !')
1303 : : end if
1304 : :
1305 : 5 : end subroutine consist
1306 : : !!***
1307 : :
1308 : : !!****f* m_bader/cpdrv
1309 : : !! NAME
1310 : : !! cpdrv
1311 : : !!
1312 : : !! FUNCTION
1313 : : !! Critical points (CPs) searching driver
1314 : : !! First Bond CPs are searched for each pair atom-its neighbor
1315 : : !! (distance cutoff=maxatdst)
1316 : : !! then Ring CPs for each pair of BCPs
1317 : : !! and finally Cage CPs for each pair of RCPs.
1318 : : !!
1319 : : !! INPUTS
1320 : : !! aim_dtset= the structured entity containing all input variables
1321 : : !!
1322 : : !! OUTPUT
1323 : : !!
1324 : : !! SIDE EFFECTS
1325 : : !! this routine treat information contained in the aim_prom module
1326 : : !!
1327 : : !! WARNING
1328 : : !! This file does not follow the ABINIT coding rules (yet)
1329 : : !!
1330 : : !! TODO
1331 : : !! Should combine parts of code that are similar ...
1332 : : !!
1333 : : !! SOURCE
1334 : :
1335 : 5 : subroutine cpdrv(aim_dtset)
1336 : :
1337 : : !Arguments ------------------------------------
1338 : : !scalars
1339 : : type(aim_dataset_type),intent(in) :: aim_dtset
1340 : :
1341 : : !Local variables ------------------------------
1342 : : !scalars
1343 : : integer :: iat,iatinit,ii,inxat,inxcell,ipair,ipos,iposinit,ires,jj,kk,nb,nb_now
1344 : : integer :: nn,nstep,nvs,me,nproc,ierr
1345 : : real(dp) :: candidate,chg,diff1,diff2,diff3,dist,prj,rtdiff,ss,tt0,wall
1346 : : logical :: srch=.false.
1347 : : !arrays
1348 : 10 : integer :: ibat(nnpos*natom),inatm(nnpos*natom),incell(nnpos*natom)
1349 : 10 : integer :: ipibat(nnpos*natom)
1350 : 5 : integer,allocatable :: indexcp(:),nr(:)
1351 : 15 : real(dp) :: bmin(natom),dif(3),dists(nnpos*natom),ev(3),evec(3,3),grho(3)
1352 : : real(dp) :: hrho(3,3),pom(3),rr(3),uu(3),vv(3),xorig(3)
1353 : 5 : real(dp),allocatable :: buffer(:,:),sortguide(:)
1354 : : !no_abirules
1355 : : !Warning : bcp_type should be transformed to cp_type
1356 : 5 : type(bcp_type),allocatable :: bcp(:),ccp(:),cp_tmp(:),rcp(:)
1357 : :
1358 : : !************************************************************************
1359 : :
1360 : 5 : me=xmpi_comm_rank(xmpi_world)
1361 : 5 : nproc=xmpi_comm_size(xmpi_world)
1362 : :
1363 : : !Consider the critical points starting from atom #batom
1364 : 5 : inxat=aim_dtset%batom
1365 : 5 : slc=-1
1366 [ + + ]: 28 : rminl(:)=aim_dtset%rmin
1367 [ + + ]: 28 : bmin(:)=0._dp
1368 : 5 : ttcp=0._dp
1369 : :
1370 : 5 : write(std_out,*)
1371 : 5 : write(std_out,*) "CRITICAL POINTS ANALYSIS"
1372 : 5 : write(std_out,*) "========================"
1373 : 5 : write(std_out,*)
1374 : :
1375 : 5 : write(untout,*)
1376 : 5 : write(untout,*) "CRITICAL POINTS ANALYSIS"
1377 : 5 : write(untout,*) "========================"
1378 : 5 : write(untout,*)
1379 : :
1380 : :
1381 [ + + ]: 20 : xorig(:)=xatm(:,inxat)
1382 : :
1383 : 5 : call timein(tt0,wall)
1384 : :
1385 : : !Searching the neighbouring atoms
1386 : :
1387 [ + - ]: 5 : if (aim_dtset%crit > 0) then
1388 : 5 : nvs=0
1389 [ + + ]: 1720 : do ii=1,nnpos
1390 [ + + ]: 9609 : do jj=1,natom
1391 : : dist=0._dp
1392 [ + + ]: 31556 : dif(:)=xatm(:,inxat)-xatm(:,jj)-atp(:,ii)
1393 [ + + ]: 31556 : dif(:)=dif(:)/aim_dtset%scal(:)
1394 : 7889 : dist=vnorm(dif,0)
1395 [ + + ]: 9604 : if (dist < tol6 ) then
1396 : 5 : inxcell=ii
1397 [ + + ]: 7884 : elseif (dist < maxatdst) then
1398 : 120 : nvs=nvs+1
1399 : 120 : dists(nvs)=dist
1400 : 120 : inatm(nvs)=jj
1401 : 120 : incell(nvs)=ii
1402 : : end if
1403 : : end do
1404 : : end do
1405 : :
1406 : 5 : write(std_out,*) "ATOM:"
1407 : 5 : write(std_out,*) 'inxat :', inxat, 'inxcell :', inxcell
1408 : 5 : write(std_out, '(3es16.6)' ) (xorig(ii),ii=1,3)
1409 : 5 : write(std_out,*)
1410 : :
1411 : 5 : write(untout,*) "ATOM:"
1412 : 5 : write(untout,*) 'inxat :', inxat, 'inxcell :', inxcell
1413 : 5 : write(untout, '(3es16.6)') (xorig(ii),ii=1,3)
1414 : 5 : write(untout,*)
1415 : :
1416 [ - + + - : 15 : ABI_MALLOC(nr,(nvs))
+ - + - -
+ - + ]
1417 [ + + ]: 125 : do ii=1,nvs
1418 : 125 : nr(ii)=ii
1419 : : end do
1420 : :
1421 : : ! Ordering of the nearest neighbouring atoms
1422 : 5 : call sort_dp(nvs,dists,nr,tol14)
1423 : :
1424 : 5 : nb=0
1425 : 5 : write(std_out,*) "NEIGHBORING ATOMS (atindex,cellindex,distance(in bohr)):"
1426 : 5 : write(untout,*) "NEIGHBORING ATOMS (atindex,cellindex,distance(in bohr)):"
1427 [ + + ]: 125 : do ii=1,nvs
1428 : 120 : nn=nr(ii)
1429 [ + - ]: 125 : if (dists(ii) < maxatdst) then
1430 : 120 : nb=nb+1
1431 : 120 : ibat(nb)=inatm(nn)
1432 : 120 : ipibat(nb)=incell(nn)
1433 : 120 : write(std_out,*) ':NEIG ',inatm(nn),incell(nn),dists(ii)
1434 : 120 : write(untout,'(" ",2I6,F16.8)')inatm(nn),incell(nn),dists(ii)
1435 : : else
1436 : : exit
1437 : : end if
1438 : : end do
1439 : :
1440 : : ! SEARCHING BCP
1441 [ - + + - : 15 : ABI_MALLOC(bcp,(nb))
+ - + - -
+ - + ]
1442 : 5 : nbcp=0
1443 : 5 : iatinit=inxat
1444 : 5 : iposinit=inxcell
1445 [ + + ]: 125 : bcp(:)%iat=0
1446 [ + + ]: 125 : bcp(:)%ipos=0
1447 : :
1448 : 5 : write(std_out,*)
1449 : 5 : write(std_out,*) "BONDING CRITICAL POINTS (BCP)"
1450 : 5 : write(std_out,*) "============================="
1451 : 5 : write(std_out,*)
1452 : :
1453 : 5 : write(untout,*)
1454 : 5 : write(untout,*) "BONDING CRITICAL POINTS (BCP)"
1455 : 5 : write(untout,*) "============================="
1456 : 5 : write(untout,*)
1457 : :
1458 [ + + ]: 125 : srbcp: do ii=1,nb
1459 : :
1460 : : ! Start the search for BCP from the midistance between the atom
1461 : : ! and his neighbor.
1462 [ + + ]: 480 : vv(:)=(xatm(:,inxat)+xatm(:,ibat(ii))+atp(:,ipibat(ii)))/2._dp
1463 : :
1464 : 120 : call critic(aim_dtset,vv,ev,evec,aim_dmaxcs,ires,-1)
1465 : :
1466 [ + + ]: 125 : if (ires==0) then
1467 : : ! Testing if CP is already known
1468 [ + + ]: 116 : if (nbcp > 0) then
1469 [ + + ]: 772 : do jj=1,nbcp
1470 [ + + ]: 2680 : pom(:)=vv(:)-bcp(jj)%rr(:)-xorig(:)
1471 : 670 : dist=vnorm(pom,0)
1472 [ + + ]: 772 : if (dist < aim_dtset%dpclim) then
1473 : 9 : write(std_out,*) 'BCP already known !'
1474 : 9 : cycle srbcp
1475 : : end if
1476 : : end do
1477 : : end if
1478 [ + + ]: 428 : rr(:)=vv(:)-xorig(:)
1479 : 107 : ss=vnorm(rr,0)
1480 [ + + ]: 107 : if (ss > maxcpdst) then
1481 : 4 : write(std_out, '(a,es16.6,a,es16.6)' ) 'BCP distance from atom,',ss,', exceed maxcpdst =',maxcpdst
1482 : 4 : cycle srbcp
1483 : : end if
1484 : 103 : nn=0
1485 [ + + ]: 412 : do jj=1,3
1486 : 412 : nn=nn+ev(jj)/abs(ev(jj))
1487 : : end do
1488 : 103 : write(std_out, '(a,3es16.6,i4)') ' vv(1:3), nn',(vv(jj), jj=1,3), nn
1489 : 103 : write(std_out, '(a,3es16.6)') 'ev: ', (ev(jj), jj=1,3)
1490 [ + + ]: 103 : if (nn /= -1) then
1491 : 34 : write(std_out,*) ' The trial critical point is not a BCP !'
1492 : 34 : cycle srbcp
1493 : : end if
1494 : 69 : write(std_out, '(a,3es16.6)' ) 'evec(:,1): ',(evec(jj,1), jj=1,3)
1495 [ + + ]: 276 : pom(:)=evec(:,1)
1496 : 69 : dist=vnorm(pom,0)
1497 [ + + ]: 276 : prj=dot_product(evec(:,1),rr)
1498 : 69 : write(std_out,*) 'prj:', prj, vnorm(evec(:,1),0)
1499 : 69 : dist=vnorm(evec(:,1),0)
1500 [ + + ]: 276 : uu(:)=vv(:)-sign(aim_epstep,prj)*evec(:,1)/dist
1501 : :
1502 : : ! Testing whether this BCP "is bonded" to the considered atom
1503 : 69 : call aim_follow(aim_dtset,uu,aim_npmaxin,srch,iatinit,iposinit,iat,ipos,nstep)
1504 : : ! write(std_out,*) 'do', iat, ipos
1505 : : ! if ((iat==0).or.(ipos==0)) cycle
1506 : : ! write(std_out,*) 'APOS: ',(xatm(jj,iat)+atp(jj,ipos), jj=1,3)
1507 [ + + - + ]: 69 : if ((iat/=inxat).or.(inxcell/=ipos)) then
1508 : 35 : write(std_out,*) ' The trial BCP is not bonded to the Bader atom'
1509 : 35 : cycle srbcp
1510 : : end if
1511 : :
1512 : : ! A new BCP has been found !
1513 : 34 : nbcp=nbcp+1
1514 : :
1515 : : ! Searching for the second bonded atom
1516 : 34 : ss=vnorm(rr,0)
1517 : 34 : diff1=ss
1518 : 34 : diff3=dists(ii)
1519 [ + + ]: 136 : uu(:)=vv(:)+sign(aim_epstep,prj)*evec(:,1)/dist
1520 [ + + + + ]: 34 : if ((abs(bmin(iat))<1.0d-12).or.( ss<bmin(iat))) then
1521 : 8 : bmin(iat)=ss
1522 : : end if
1523 : 34 : call aim_follow(aim_dtset,uu,aim_npmaxin,srch,iatinit,iposinit,iat,ipos,nstep)
1524 [ + - - + ]: 34 : if ((iat==0).or.(ipos==0)) then
1525 : 0 : write(std_out,*) ' The trial BCP is not bonded to a bonding atom !'
1526 : : ! cycle srbcp
1527 : : end if
1528 [ + + ]: 136 : pom(:)=vv(:)-xatm(:,iat)-atp(:,ipos)
1529 : 34 : ss=vnorm(pom,0)
1530 : 34 : diff2=ss
1531 [ + + ]: 136 : pom(:)=xorig(:)-xatm(:,iat)-atp(:,ipos)
1532 : 34 : diff3=vnorm(pom,0)
1533 : 34 : rtdiff=diff1/diff3
1534 [ + + + + ]: 34 : if ((abs(bmin(iat))<1.0d-12).or.(ss<bmin(iat))) then
1535 : 7 : bmin(iat)=ss
1536 : : end if
1537 [ + + ]: 136 : pom(:)=xatm(:,iat)+atp(:,ipos)
1538 : :
1539 : : ! Store more results, for coherent, and portable output
1540 : 34 : bcp(nbcp)%iat=iat
1541 : 34 : bcp(nbcp)%ipos=ipos
1542 : 34 : bcp(nbcp)%chg=chg
1543 : 34 : bcp(nbcp)%diff(1)=diff1
1544 : 34 : bcp(nbcp)%diff(2)=diff2
1545 : 34 : bcp(nbcp)%diff(3)=diff3
1546 [ + + ]: 136 : bcp(nbcp)%ev(:)=ev(:)
1547 [ + + ]: 136 : bcp(nbcp)%pom(:)=pom(:)
1548 [ + + ]: 136 : bcp(nbcp)%rr(:)=rr(:)
1549 [ + + + + ]: 442 : bcp(nbcp)%vec(:,:)=evec(:,:)
1550 [ + + ]: 136 : bcp(nbcp)%vv(:)=vv(:)
1551 : : ! Warning : iat, ipos might be modified by this call
1552 : 34 : call vgh_rho(vv,chg,grho,hrho,dist,iat,ipos,0)
1553 : 34 : bcp(nbcp)%chg=chg
1554 : :
1555 : : end if ! ires==0
1556 : : end do srbcp
1557 : :
1558 [ + - ]: 5 : if(nbcp>0)then
1559 : :
1560 : : ! Order the BCP. CPs should appear by increasing values of x,y,z , the latter
1561 : : ! varying the fastest
1562 [ - + + - : 15 : ABI_MALLOC(sortguide,(nbcp))
+ - - + -
+ ]
1563 [ - + + - : 15 : ABI_MALLOC(indexcp,(nbcp))
+ - - + -
+ ]
1564 [ - + + - : 15 : ABI_MALLOC(cp_tmp,(nbcp))
+ - - + -
+ ]
1565 [ + + ]: 20 : do ii=3,1,-1
1566 : : ! DEBUG
1567 : : ! write(std_out,*)' cpdrv : sort on index ii=',ii
1568 : : ! ENDDEBUG
1569 : :
1570 [ + + ]: 117 : do jj=1,nbcp
1571 : : ! DEBUG
1572 : : ! write(std_out,*)bcp(jj)%vv(:)
1573 : : ! ENDDEBUG
1574 : 102 : sortguide(jj)=bcp(jj)%vv(ii)
1575 : 117 : indexcp(jj)=jj
1576 : : end do
1577 : :
1578 : : ! Try to be platform-independent. Might need a larger tolerance.
1579 : 15 : call sort_dp(nbcp,sortguide,indexcp,tol3)
1580 [ + + ]: 117 : do jj=1,nbcp
1581 : 117 : cp_tmp(jj)=bcp(indexcp(jj))
1582 : : end do
1583 [ + + ]: 122 : do jj=1,nbcp
1584 : 117 : bcp(jj)=cp_tmp(jj)
1585 : : end do
1586 : : end do
1587 : : ! DEBUG
1588 : : ! write(std_out,*)' cpdrv : after the sort '
1589 : : ! do jj=1,nbcp
1590 : : ! write(std_out,*)bcp(jj)%vv(:)
1591 : : ! end do
1592 : : ! ENDDEBUG
1593 : :
1594 : :
1595 : : ! Output the info about the BCP
1596 [ + + ]: 39 : do jj=1,nbcp
1597 : : write(untout,'(" Bonded atom (BAT) (indxatm,indxcell,position): ",/,2I6,3F16.8)')&
1598 [ + + ]: 136 : & bcp(jj)%iat,bcp(jj)%ipos,bcp(jj)%pom(:)
1599 [ + + ]: 136 : write(untout,'("%Bonding CP: ",3F16.8)') bcp(jj)%vv(:)
1600 [ + + ]: 136 : write(untout,'("%Eigenval. of Hessian: ",3F16.8)') bcp(jj)%ev(:)
1601 : : write(untout,'(a,a,a,3f16.8,a,a,3f16.8,a,a,3f16.8,a)') &
1602 : 34 : & ' Eigenvec. of Hessian:',char(10),&
1603 [ + + ]: 136 : & '-',bcp(jj)%vec(1,:),char(10),&
1604 [ + + ]: 136 : & '-',bcp(jj)%vec(2,:),char(10),&
1605 [ + + ]: 170 : & '-',bcp(jj)%vec(3,:),char(10)
1606 : : write(untout,'("%Density and laplacian in CP: ",2F16.8)') &
1607 : 34 : & bcp(jj)%chg, bcp(jj)%ev(1)+bcp(jj)%ev(2)+bcp(jj)%ev(3)
1608 : : write(untout,'("%Relative position of BCP (AT-CP,BAT-CP,AT-BAT,relative(AT): ",/,4F16.8)') &
1609 [ + + ]: 136 : & bcp(jj)%diff(:),bcp(jj)%diff(1)/bcp(jj)%diff(3)
1610 : 34 : write(untout,*) "********************************************************************"
1611 : : write(std_out,'(/," BCP: ",3F10.6,3E12.4,E12.4,/)') &
1612 [ + + + + ]: 238 : & bcp(jj)%rr(:),bcp(jj)%ev(:),bcp(jj)%ev(1)+bcp(jj)%ev(2)+bcp(jj)%ev(3)
1613 [ + + ]: 141 : write(std_out,'(":DISPC ",4F12.6)') bcp(jj)%diff(:),bcp(jj)%diff(1)/bcp(jj)%diff(3)
1614 : : end do
1615 : :
1616 [ - + ]: 5 : ABI_FREE(cp_tmp)
1617 [ - + ]: 5 : ABI_FREE(indexcp)
1618 [ - + ]: 5 : ABI_FREE(sortguide)
1619 : :
1620 : : end if ! nbcp>0
1621 : :
1622 [ + - ]: 5 : if (abs(bmin(inxat))>1.0d-12) then
1623 : 5 : rminl(inxat)=aim_dtset%coff1*bmin(inxat)
1624 : 5 : r0=bmin(inxat)
1625 : : else
1626 : 0 : r0=0._dp
1627 : : end if
1628 : :
1629 : : ! !AD-HOC PARAMETER
1630 : :
1631 [ + + ]: 28 : do ii=1,natom
1632 [ + + + + ]: 28 : if ((abs(bmin(ii))>1.0d-12).and.(ii /= inxat)) rminl(ii)=aim_dtset%coff2*bmin(ii)
1633 : : end do
1634 : :
1635 : : ! END WARNING
1636 : :
1637 : 5 : write(std_out,*) ' number of BCP:', nbcp
1638 : 5 : write(untout,'(" Number of BCP found: ",I4)') nbcp
1639 : 5 : nn=nbcp*(nbcp-1)*(nbcp-2)/6
1640 [ - + ]: 5 : if (bit_size(ii) <= nbcp+1) then
1641 : 0 : ABI_ERROR("b-test!")
1642 : : end if
1643 : :
1644 : : ! SEARCHING RCP
1645 : :
1646 : 5 : write(std_out,*)
1647 : 5 : write(std_out,*) "RING CRITICAL POINTS (RCP)"
1648 : 5 : write(std_out,*) "============================="
1649 : 5 : write(std_out,*)
1650 : :
1651 : 5 : write(untout,*)
1652 : 5 : write(untout,*) "RING CRITICAL POINTS (RCP)"
1653 : 5 : write(untout,*) "============================="
1654 : 5 : write(untout,*)
1655 : :
1656 : 5 : nrcp=0
1657 [ - + ]: 5 : if(aim_dtset%crit==1)nb_now=nbcp
1658 [ + - ]: 5 : if(aim_dtset%crit==2)nb_now=nb
1659 : : ! DEBUG
1660 : : ! nb_now=nbcp
1661 : : ! ENDDEBUG
1662 : 5 : nn=nb_now*(nb_now-1)/2
1663 [ - + + - : 15 : ABI_MALLOC(rcp,(nn))
+ - + - -
+ - + ]
1664 : :
1665 : : ! Loop on pairs of BCP or atoms
1666 : 5 : ipair=0
1667 [ - + + - : 15 : ABI_MALLOC(buffer,(16,nn))
+ - + - -
+ - + ]
1668 [ + + + + ]: 26593 : buffer=zero
1669 : :
1670 : : ! DEBUG
1671 : : ! write(std_out,*)ch10,ch10,' drvcpr : enter loop to search for RCPs,nb_now,nn=',nb_now,nn
1672 : : ! ENDDEBUG
1673 : :
1674 [ + + ]: 120 : do ii=1,nb_now-1
1675 [ + + ]: 1684 : srcp1: do jj=ii+1,nb_now
1676 : 1564 : ipair=ipair+1
1677 [ + - ]: 1679 : if(mod(ipair,nproc)==me)then
1678 [ - + ]: 1564 : if (aim_dtset%crit==1) then
1679 [ # # ]: 0 : vv(:)=xorig(:)+(bcp(ii)%rr(:)+bcp(jj)%rr(:))/2._dp
1680 [ + - ]: 1564 : else if (aim_dtset%crit==2) then
1681 [ + + ]: 6256 : vv(:)=xorig(:)*half+(xatm(:,ibat(ii))+atp(:,ipibat(ii))+xatm(:,ibat(jj))+atp(:,ipibat(jj)))*quarter
1682 : : end if
1683 : :
1684 : 1564 : call critic(aim_dtset,vv,ev,evec,aim_dmaxcs,ires,1)
1685 : :
1686 [ + + ]: 1564 : if(ires==1)then
1687 : : cycle srcp1
1688 : : end if
1689 : :
1690 : : ! Check that it is within the maximum allowed distance for a CP
1691 [ + + ]: 5768 : rr(:)=vv(:)-xorig(:)
1692 : 1442 : ss=vnorm(rr,0)
1693 [ - + ]: 1442 : if (ss > maxcpdst) then
1694 : 0 : write(std_out,*) 'RCP distance from atom exceed maxcpdst !'
1695 : 0 : cycle srcp1
1696 : : end if
1697 : : ! Check that it is a RCP
1698 : 1442 : nn=0
1699 [ + + ]: 5768 : do kk=1,3
1700 : 5768 : nn=nn+ev(kk)/abs(ev(kk))
1701 : : end do
1702 [ + + ]: 1442 : if (nn /= 1) then
1703 : 118 : write(std_out,*) ' the critical point that is found is not a RCP '
1704 : 118 : cycle srcp1
1705 : : end if
1706 : : ! Might be the same RCP than one already found on the same processor
1707 [ + + ]: 1324 : if (nrcp > 0) then
1708 [ + + ]: 8730 : do kk=1,nrcp
1709 [ + + ]: 33568 : pom(:)=vv(:)-rcp(kk)%rr(:)-xorig(:)
1710 : 8392 : dist=vnorm(pom,0)
1711 [ + + ]: 8730 : if (dist < aim_dtset%dpclim) then
1712 : 972 : write(std_out,*) ':RCP already known'
1713 : 972 : cycle srcp1
1714 : : end if
1715 : : end do
1716 : : end if
1717 : : ! If crit==2, check that it is on the Bader surface
1718 [ + - ]: 352 : if (aim_dtset%crit==2) then
1719 [ + + ]: 1408 : uu(:)=vv(:)-aim_epstep*rr(:)/ss
1720 : 352 : call aim_follow(aim_dtset,uu,aim_npmaxin,srch,iatinit,iposinit,iat,ipos,nstep)
1721 [ + + + + ]: 352 : if ((iat/=inxat).or.(inxcell/=ipos))then
1722 : 300 : write(std_out,*) ' RCP is not on the Bader surface (outside of it)'
1723 : 300 : cycle srcp1
1724 : : end if
1725 : : end if
1726 : 52 : nrcp=nrcp+1
1727 [ + + ]: 208 : rcp(nrcp)%rr(:)=vv(:)-xorig(:)
1728 : :
1729 [ + + ]: 208 : buffer(1:3,ipair)=vv
1730 [ + + ]: 208 : buffer(4:6,ipair)=ev
1731 [ + + ]: 208 : buffer(7:9,ipair)=evec(:,1)
1732 [ + + ]: 208 : buffer(10:12,ipair)=evec(:,2)
1733 [ + + ]: 208 : buffer(13:15,ipair)=evec(:,3)
1734 : 52 : buffer(16,ipair)=one
1735 : :
1736 : : ! DEBUG
1737 : : ! write(std_out,*)ch10,ch10,' drvcpr : ipair,candidate=',ipair,candidate
1738 : : ! ENDDEBUG
1739 : : end if
1740 : : end do srcp1
1741 : : end do
1742 : 5 : call xmpi_sum(buffer,xmpi_world,ierr)
1743 : :
1744 : 5 : nrcp=0
1745 : 5 : ipair=0
1746 [ + + ]: 120 : do ii=1,nb_now-1
1747 [ + + ]: 1684 : srcp: do jj=ii+1,nb_now
1748 : 1564 : ipair=ipair+1
1749 : 1564 : candidate=buffer(16,ipair)
1750 : :
1751 : : ! One CP has been found, must make tests to see whether it is a new RCP
1752 [ + + ]: 1679 : if (nint(candidate)==1) then
1753 : :
1754 [ + + ]: 208 : vv=buffer(1:3,ipair)
1755 [ + + ]: 208 : ev=buffer(4:6,ipair)
1756 [ + + ]: 208 : evec(:,1)=buffer(7:9,ipair)
1757 [ + + ]: 208 : evec(:,2)=buffer(10:12,ipair)
1758 [ + + ]: 208 : evec(:,3)=buffer(13:15,ipair)
1759 : :
1760 : : ! Check that it is not the same as a previous one
1761 [ + + ]: 52 : if (nrcp > 0) then
1762 [ + + ]: 429 : do kk=1,nrcp
1763 [ + + ]: 1528 : pom(:)=vv(:)-rcp(kk)%rr(:)-xorig(:)
1764 : 382 : dist=vnorm(pom,0)
1765 [ - + ]: 429 : if (dist < aim_dtset%dpclim) then
1766 : 0 : write(std_out,*) ':RCP already known'
1767 : 0 : cycle srcp
1768 : : end if
1769 : : end do
1770 : : end if
1771 : :
1772 : : ! A new RCP has been found !
1773 : 52 : nrcp=nrcp+1
1774 : :
1775 : : ! DEBUG
1776 : : ! write(std_out,*)' drvcpr : A new RCP has been found, for kk=',kk
1777 : : ! ENDDEBUG
1778 : :
1779 : :
1780 : 52 : rcp(nrcp)%iat=iat
1781 : 52 : rcp(nrcp)%ipos=ipos
1782 [ + + ]: 208 : rcp(nrcp)%rr(:)=vv(:)-xorig(:)
1783 [ + + + + ]: 676 : rcp(nrcp)%vec(:,:)=evec(:,:)
1784 [ + + ]: 208 : rcp(nrcp)%ev(:)=ev(:)
1785 [ + + ]: 208 : rcp(nrcp)%vv(:)=vv(:)
1786 : 52 : call vgh_rho(vv,chg,grho,hrho,dist,iat,ipos,0)
1787 : 52 : rcp(nrcp)%chg=chg
1788 : :
1789 : : end if ! ires==0
1790 : : end do srcp ! jj=ii+2,nb_now
1791 : : end do ! ii=1,nb_now-1
1792 : :
1793 [ - + ]: 5 : ABI_FREE(buffer)
1794 : :
1795 [ + - ]: 5 : if(nrcp>0)then
1796 : :
1797 : : ! Order the RCP. CPs should appear by increasing values of x,y,z , the latter
1798 : : ! varying the fastest
1799 [ - + + - : 15 : ABI_MALLOC(sortguide,(nrcp))
+ - - + -
+ ]
1800 [ - + + - : 15 : ABI_MALLOC(indexcp,(nrcp))
+ - - + -
+ ]
1801 [ - + + - : 15 : ABI_MALLOC(cp_tmp,(nrcp))
+ - - + -
+ ]
1802 [ + + ]: 20 : do ii=3,1,-1
1803 : : ! DEBUG
1804 : : ! write(std_out,*)' cpdrv : sort on index ii=',ii
1805 : : ! ENDDEBUG
1806 [ + + ]: 171 : do jj=1,nrcp
1807 : :
1808 : : ! DEBUG
1809 : : ! write(std_out,*)rcp(jj)%vv(:)
1810 : : ! ENDDEBUG
1811 : :
1812 : : ! Try to be platform-independent. Might need a larger tolerance.
1813 : 156 : sortguide(jj)=rcp(jj)%vv(ii)
1814 : 171 : indexcp(jj)=jj
1815 : : end do
1816 : 15 : call sort_dp(nrcp,sortguide,indexcp,tol3)
1817 [ + + ]: 171 : do jj=1,nrcp
1818 : 171 : cp_tmp(jj)=rcp(indexcp(jj))
1819 : : end do
1820 [ + + ]: 176 : do jj=1,nrcp
1821 : 171 : rcp(jj)=cp_tmp(jj)
1822 : : end do
1823 : : end do
1824 : :
1825 : : ! DEBUG
1826 : : ! write(std_out,*)' cpdrv : after the sort '
1827 : : ! do jj=1,nrcp
1828 : : ! write(std_out,*)rcp(jj)%vv(:)
1829 : : ! end do
1830 : : ! ENDDEBUG
1831 : :
1832 : :
1833 : : ! Write the Ring Critical Point information
1834 [ + + ]: 57 : do jj=1,nrcp
1835 [ + + ]: 208 : write(untout,'(";Ring CP: ",3F16.8)') rcp(jj)%vv(:)
1836 [ + + ]: 208 : write(untout,'("%Eigenval. of Hessian: ",3F16.8)') rcp(jj)%ev(:)
1837 : : write(untout,'(a,a,a,3f16.8,a,a,3f16.8,a,a,3f16.8,a)') &
1838 : 52 : & ' Eigenvec. of Hessian:',char(10),&
1839 [ + + ]: 208 : & '-',rcp(jj)%vec(1,:),char(10),&
1840 [ + + ]: 208 : & '-',rcp(jj)%vec(2,:),char(10),&
1841 [ + + ]: 260 : & '-',rcp(jj)%vec(3,:),char(10)
1842 : : write(untout,'("%Density and laplacian in CP: ",2F16.8)') &
1843 : 52 : & rcp(jj)%chg, rcp(jj)%ev(1)+rcp(jj)%ev(2)+rcp(jj)%ev(3)
1844 : 52 : write(untout,*) "********************************************************************"
1845 : : write(std_out,'(/," RCP: ",3F10.6,3E12.4,E12.4,/)') &
1846 [ + + + + ]: 369 : & rcp(jj)%rr(:),rcp(jj)%ev(:),rcp(jj)%ev(1)+rcp(jj)%ev(2)+rcp(jj)%ev(3)
1847 : : end do
1848 : :
1849 [ - + ]: 5 : ABI_FREE(cp_tmp)
1850 [ - + ]: 5 : ABI_FREE(indexcp)
1851 [ - + ]: 5 : ABI_FREE(sortguide)
1852 : :
1853 : : end if ! nrcp>0
1854 : :
1855 : 5 : write(untout,'(" Number of RCP found: ",I4)') nrcp
1856 : 5 : write(std_out,*) ' Number of RCP:', nrcp
1857 : :
1858 : : ! SEARCHING CCP
1859 : :
1860 : 5 : write(std_out,*)
1861 : 5 : write(std_out,*) "CAGE CRITICAL POINTS (CCP)"
1862 : 5 : write(std_out,*) "============================="
1863 : 5 : write(std_out,*)
1864 : :
1865 : 5 : write(untout,*)
1866 : 5 : write(untout,*) "CAGE CRITICAL POINTS (CCP)"
1867 : 5 : write(untout,*) "============================="
1868 : 5 : write(untout,*)
1869 : :
1870 : :
1871 : 5 : nn=nrcp*(nrcp-1)/2
1872 [ - + + - : 15 : ABI_MALLOC(ccp,(nn))
+ - + - -
+ - + ]
1873 : :
1874 : 5 : nccp=0
1875 [ + + ]: 52 : do ii=1,nrcp-1
1876 [ + + ]: 434 : srccp: do jj=ii+1,nrcp
1877 [ + + ]: 1528 : vv(:)=xorig(:)+(rcp(ii)%rr(:)+rcp(jj)%rr(:))/2._dp
1878 : 382 : call critic(aim_dtset,vv,ev,evec,aim_dmaxcs,ires,3)
1879 [ + + ]: 429 : if (ires==0) then
1880 [ + + ]: 1524 : rr(:)=vv(:)-xorig(:)
1881 : 381 : ss=vnorm(rr,0)
1882 [ + + ]: 381 : if (ss > maxcpdst) then
1883 : 5 : write(std_out,*) 'CCP distance from atom exceed maxcpdst !'
1884 : 5 : cycle srccp
1885 : : end if
1886 : 376 : nn=0
1887 [ + + ]: 1504 : do kk=1,3
1888 : 1504 : nn=nn+ev(kk)/abs(ev(kk))
1889 : : end do
1890 [ + + ]: 376 : if (nn /= 3) then
1891 : 33 : write(std_out,*) ' the critical point that is found is not a CCP '
1892 : 33 : cycle srccp
1893 : : end if
1894 : :
1895 [ + + ]: 343 : if (nccp > 0) then
1896 [ + + ]: 1523 : do kk=1,nccp
1897 [ + + ]: 6000 : pom(:)=vv(:)-ccp(kk)%rr(:)-xorig(:)
1898 : 1500 : dist=vnorm(pom,0)
1899 [ + + ]: 1523 : if (dist < aim_dtset%dpclim) then
1900 : 315 : write(std_out,*) ':CCP already known'
1901 : 315 : cycle srccp
1902 : : end if
1903 : : end do
1904 : : end if
1905 [ + - ]: 28 : if (aim_dtset%crit==2) then
1906 [ + + ]: 112 : uu(:)=vv(:)-aim_epstep*rr(:)/ss
1907 : 28 : call aim_follow(aim_dtset,uu,aim_npmaxin,srch,iatinit,iposinit,iat,ipos,nstep)
1908 [ + + - + ]: 28 : if ((iat/=inxat).or.(inxcell/=ipos)) then
1909 : 1 : write(std_out,*) ' This CCP is not on the Bader surface (outside of it)'
1910 : 1 : cycle srccp
1911 : : end if
1912 : : end if
1913 : :
1914 : 27 : nccp=nccp+1
1915 : :
1916 : 27 : ccp(nccp)%iat=iat
1917 : 27 : ccp(nccp)%ipos=ipos
1918 [ + + ]: 108 : ccp(nccp)%rr(:)=vv(:)-xorig(:)
1919 [ + + + + ]: 351 : ccp(nccp)%vec(:,:)=evec(:,:)
1920 [ + + ]: 108 : ccp(nccp)%ev(:)=ev(:)
1921 [ + + ]: 108 : ccp(nccp)%vv(:)=vv(:)
1922 : 27 : call vgh_rho(vv,chg,grho,hrho,dist,iat,ipos,0)
1923 : 27 : ccp(nccp)%chg=chg
1924 : :
1925 : : end if
1926 : : end do srccp
1927 : : end do
1928 : :
1929 [ + + ]: 5 : if(nccp>0)then
1930 : :
1931 : : ! Order the CCP. CPs should appear by increasing values of x,y,z , the latter
1932 : : ! varying the fastest
1933 [ - + + - : 12 : ABI_MALLOC(sortguide,(nccp))
+ - - + -
+ ]
1934 [ - + + - : 12 : ABI_MALLOC(indexcp,(nccp))
+ - - + -
+ ]
1935 [ - + + - : 12 : ABI_MALLOC(cp_tmp,(nccp))
+ - - + -
+ ]
1936 [ + + ]: 16 : do ii=3,1,-1
1937 [ + + ]: 93 : do jj=1,nccp
1938 : : ! Try to be platform-independent. Might need a larger tolerance.
1939 : 81 : sortguide(jj)=ccp(jj)%vv(ii)
1940 : 93 : indexcp(jj)=jj
1941 : : end do
1942 : 12 : call sort_dp(nccp,sortguide,indexcp,tol3)
1943 [ + + ]: 93 : do jj=1,nccp
1944 : 93 : cp_tmp(jj)=ccp(indexcp(jj))
1945 : : end do
1946 [ + + ]: 97 : do jj=1,nccp
1947 : 93 : ccp(jj)=cp_tmp(jj)
1948 : : end do
1949 : : end do
1950 : :
1951 : : ! Write the Cage Critical Point information
1952 [ + + ]: 31 : do jj=1,nccp
1953 [ + + ]: 108 : write(untout,'("%Cage CP: ",3F16.8)') ccp(jj)%vv(:)
1954 [ + + ]: 108 : write(untout,'("%Eigenval. of Hessian: ",3F16.8)') ccp(jj)%ev(:)
1955 : : write(untout,'(a,a,a,3f16.8,a,a,3f16.8,a,a,3f16.8,a)') &
1956 : 27 : & ' Eigenvec. of Hessian:',char(10),&
1957 [ + + ]: 108 : & '-',ccp(jj)%vec(1,:),char(10),&
1958 [ + + ]: 108 : & '-',ccp(jj)%vec(2,:),char(10),&
1959 [ + + ]: 135 : & '-',ccp(jj)%vec(3,:),char(10)
1960 : : write(untout,'("%Density and laplacian in CP: ",2F16.8)') &
1961 : 27 : & ccp(jj)%chg, ccp(jj)%ev(1)+ccp(jj)%ev(2)+ccp(jj)%ev(3)
1962 : 27 : write(untout,*) "********************************************************************"
1963 : : write(std_out,'(/," CCP: ",3F10.6,3E12.4,E12.4,/)') &
1964 [ + + + + ]: 193 : & ccp(jj)%rr(:),ccp(jj)%ev(:),ccp(jj)%ev(1)+ccp(jj)%ev(2)+ccp(jj)%ev(3)
1965 : : end do
1966 : :
1967 [ - + ]: 4 : ABI_FREE(sortguide)
1968 [ - + ]: 4 : ABI_FREE(indexcp)
1969 [ - + ]: 4 : ABI_FREE(cp_tmp)
1970 : :
1971 : : end if ! nccp>0
1972 : :
1973 : 5 : write(untout,'(" Number of CCP found: ",I4)') nccp
1974 : 5 : write(std_out,*) 'Number of CCP:', nccp
1975 : 5 : write(std_out,*)
1976 : 5 : write(untout,*)
1977 : 5 : write(std_out, '(a,3i8)' ) 'BCP-RCP-CCP', nbcp,nrcp,nccp
1978 : 5 : write(untout, '(a,3i8)' ) 'BCP-RCP-CCP', nbcp,nrcp,nccp
1979 : :
1980 : 5 : write(std_out,*)
1981 : 5 : write(std_out,*) "==============================="
1982 : 5 : write(std_out,*) "END OF CRITICAL POINTS ANALYSIS"
1983 : 5 : write(std_out,*)
1984 : :
1985 : 5 : write(untout,*)
1986 : 5 : write(untout,*) "==============================="
1987 : 5 : write(untout,*) "END OF CRITICAL POINTS ANALYSIS"
1988 : 5 : write(untout,*)
1989 : :
1990 : :
1991 : : ! Output of the CPs
1992 : :
1993 : 5 : write(untc,'(I4, " :BCP''s, coordinates, laplacian eigs, type of bonding at., sum of lap.eigs., density")') nbcp
1994 [ + + ]: 39 : do ii=1,nbcp
1995 : : write(untc,'(3F10.6,3E12.4,I4,2E12.4)') &
1996 [ + + + + ]: 243 : & bcp(ii)%rr(:),bcp(ii)%ev(:),bcp(ii)%iat,bcp(ii)%ev(1)+bcp(ii)%ev(2)+bcp(ii)%ev(3),bcp(ii)%chg
1997 : : end do
1998 : :
1999 : 5 : write(untc,'(I4, " :RCP''s, coordinates, laplacian eigenvalues, sum of these, density")') nrcp
2000 [ + + ]: 57 : do ii=1,nrcp
2001 [ + + ]: 208 : vv(:)=rcp(ii)%rr(:)+xorig(:)
2002 : 52 : call vgh_rho(vv,chg,grho,hrho,dist,iat,ipos,0)
2003 : : write(untc,'(3F10.6,3E12.4,2E12.4)') &
2004 [ + + + + ]: 369 : & rcp(ii)%rr(:),rcp(ii)%ev(:),rcp(ii)%ev(1)+rcp(ii)%ev(2)+rcp(ii)%ev(3),rcp(ii)%chg
2005 : : end do
2006 : :
2007 : 5 : write(untc,'(I4, " :CCP''s coordinates, laplacian eigenvalues, sum of these, density")') nccp
2008 [ + + ]: 32 : do ii=1,nccp
2009 [ + + ]: 108 : vv(:)=ccp(ii)%rr(:)+xorig(:)
2010 : 27 : call vgh_rho(vv,chg,grho,hrho,dist,iat,ipos,0)
2011 : : write(untc,'(3F10.6,3E12.4,2E12.4)') &
2012 [ + + + + ]: 194 : & ccp(ii)%rr(:),ccp(ii)%ev(:),ccp(ii)%ev(1)+ccp(ii)%ev(2)+ccp(ii)%ev(3),ccp(ii)%chg
2013 : : end do
2014 : :
2015 : : end if ! End the condition on aim_dtset%crit > 0
2016 : :
2017 : : !Reading of the CPs from the file
2018 : :
2019 [ - + ]: 5 : if (aim_dtset%crit==-1) then
2020 : 0 : read(untc,*) nbcp
2021 [ # # # # : 0 : ABI_MALLOC(bcp,(nbcp))
# # # # #
# # # #
# ]
2022 [ # # ]: 0 : do ii=1,nbcp
2023 [ # # ]: 0 : read(untc,*) bcp(ii)%rr(:)
2024 : : end do
2025 : 0 : read(untc,*) nrcp
2026 [ # # # # : 0 : ABI_MALLOC(rcp,(nrcp))
# # # # #
# # # #
# ]
2027 [ # # ]: 0 : do ii=1,nrcp
2028 [ # # ]: 0 : read(untc,*) rcp(ii)%rr(:)
2029 : : end do
2030 : 0 : read(untc,*) nccp
2031 [ # # # # : 0 : ABI_MALLOC(ccp,(nccp))
# # # # #
# # # #
# ]
2032 [ # # ]: 0 : do ii=1,nccp
2033 [ # # ]: 0 : read(untc,*) ccp(ii)%rr(:)
2034 : : end do
2035 : : end if
2036 : :
2037 [ + + ]: 39 : do ii=1,nbcp
2038 [ + + ]: 136 : pc(:,ii)=bcp(ii)%rr(:)
2039 : 39 : icpc(ii)=-1
2040 : : end do
2041 [ + + ]: 57 : do ii=1,nrcp
2042 [ + + ]: 208 : pc(:,nbcp+ii)=rcp(ii)%rr(:)
2043 : 57 : icpc(nbcp+ii)=1
2044 : : end do
2045 [ + + ]: 32 : do ii=1,nccp
2046 [ + + ]: 108 : pc(:,nbcp+nrcp+ii)=ccp(ii)%rr(:)
2047 : 32 : icpc(nbcp+nrcp+ii)=3
2048 : : end do
2049 : 5 : npc=nbcp+nrcp+nccp
2050 : :
2051 : : !Checking
2052 : :
2053 [ + - ]: 5 : if (allocated(bcp)) then
2054 [ + + ]: 39 : do ii=1,nbcp
2055 [ + + ]: 1209 : do jj=1,npc
2056 : 1170 : iat=bcp(ii)%iat
2057 : 1170 : ipos=bcp(ii)%ipos
2058 [ + - + - ]: 1204 : if ((iat/=0).and.(ipos/=0)) then
2059 [ + + ]: 4680 : pom(:)=pc(:,jj)+xorig(:)-xatm(:,iat)-atp(:,ipos)
2060 : 1170 : ss=aim_dtset%coff2*vnorm(pom,0)
2061 [ + + ]: 1170 : if (rminl(iat) >= ss) rminl(iat)=ss
2062 : : end if
2063 : : end do
2064 : : end do
2065 : 5 : ABI_FREE(bcp)
2066 : : end if
2067 [ + + ]: 28 : do ii=1,natom
2068 : 28 : write(std_out,*) 'atom: ', ii, rminl(ii)
2069 : : end do
2070 : :
2071 [ + - ]: 5 : if(allocated(rcp)) then
2072 : 5 : ABI_FREE(rcp)
2073 : : end if
2074 [ + - ]: 5 : if(allocated(ccp)) then
2075 : 5 : ABI_FREE(ccp)
2076 : : end if
2077 : :
2078 : : !END CP ANALYSIS
2079 : :
2080 : 5 : call timein(ttcp,wall)
2081 : 5 : ttcp=ttcp-tt0
2082 : :
2083 [ + - - + ]: 5 : end subroutine cpdrv
2084 : : !!***
2085 : :
2086 : : !!****f* m_bader/critic
2087 : : !! NAME
2088 : : !! critic
2089 : : !!
2090 : : !! FUNCTION
2091 : : !! Search for a critical point starting from point vv
2092 : : !!
2093 : : !! INPUTS
2094 : : !! aim_dtset= the structured entity containing all input variables
2095 : : !! dmax= maximal step
2096 : : !! sort= 0(default) general CP searching (Newton-Raphson)
2097 : : !! -1,1,3 searching of specific type CP (Popelier)
2098 : : !!
2099 : : !! OUTPUT
2100 : : !! ev= eigenvalues (ordered) of the Hessian in the final point
2101 : : !! zz= eigenvectors of the Hessian in the final point
2102 : : !! ires= if ires==0 => CP found
2103 : : !! if ires==1 => CP not found within the maximum steps
2104 : : !!
2105 : : !! SIDE EFFECTS
2106 : : !! vv(3)= starting point and final point
2107 : : !!
2108 : : !! SOURCE
2109 : :
2110 : 2066 : subroutine critic(aim_dtset,vv,ev,zz,dmax,ires,sort)
2111 : :
2112 : : !Arguments ------------------------------------
2113 : : !scalars
2114 : : integer,intent(in) :: sort
2115 : : integer,intent(out) :: ires
2116 : : real(dp),intent(in) :: dmax
2117 : : !arrays
2118 : : real(dp),intent(inout) :: vv(3)
2119 : : real(dp),intent(out) :: ev(3),zz(3,3)
2120 : : !no_abirules
2121 : : type(aim_dataset_type), intent(in) :: aim_dtset
2122 : :
2123 : : !Local variables ------------------------------
2124 : : !scalars
2125 : : integer :: iat,id,ii,info,ipos,istep,jii,jj,nrot
2126 : : real(dp),parameter :: evol=1.d-3
2127 : : real(dp) :: chg,dg,dltcmax,dv,dvold,rr,ss
2128 : : logical :: oscl,outof
2129 : : !arrays
2130 : : integer :: ipiv(3)
2131 : : real(dp) :: dc(3),ff(3),grho(3),hrho(3,3),lp(3),vold(3),vt(3),yy(3,3)
2132 : 2066 : real(dp),allocatable :: lamb(:),pom(:,:),pom2(:,:)
2133 : :
2134 : : !************************************************************************
2135 : :
2136 : : !DEBUG
2137 : : !write(std_out,*)' critic : enter '
2138 : : !ENDDEBUG
2139 : 2066 : oscl=.false.
2140 [ + + ]: 2066 : if (sort==3) then
2141 [ - + ]: 382 : ABI_MALLOC(pom,(4,4))
2142 [ - + ]: 382 : ABI_MALLOC(pom2,(4,4))
2143 [ - + ]: 382 : ABI_MALLOC(lamb,(4))
2144 [ + - ]: 1684 : elseif (sort/=0) then
2145 [ - + ]: 1684 : ABI_MALLOC(pom,(3,3))
2146 [ - + ]: 1684 : ABI_MALLOC(pom2,(3,3))
2147 [ - + ]: 1684 : ABI_MALLOC(lamb,(3))
2148 : : end if
2149 : :
2150 : :
2151 : 2066 : deb=.false.
2152 : 2066 : istep=0
2153 : 2066 : ires=0
2154 : :
2155 : : !DEBUG
2156 : : !write(std_out,'(":POSIN ",3F16.8)') vv
2157 : : !do jj=1,3
2158 : : !vt(jj)=rprimd(1,jj)*vv(1)+rprimd(2,jj)*vv(2)+rprimd(3,jj)*vv(3)
2159 : : !end do
2160 : : !write(std_out,'(":RBPOSIN ",3F16.8)') vt
2161 : : !ENDDEBUG
2162 : :
2163 : 2066 : call vgh_rho(vv,chg,grho,hrho,rr,iat,ipos,0)
2164 : :
2165 : : !write(std_out,'(":GRAD ",3F16.8)') grho
2166 : : !write(std_out,'(":HESSIAN ",/,3F16.8,/,3F16.8,/,3F16.8)') ((hrho(ii,jj),jj=1,3),ii=1,3)
2167 : :
2168 : : dg=1.0_dp
2169 : 2066 : dv=1.0_dp
2170 : 2066 : dg = vnorm(grho,0)
2171 : :
2172 [ - + ]: 2066 : if (chg < aim_rhomin) then
2173 : 0 : ires=1
2174 : : ! DEBUG
2175 : : ! write(std_out,*)' critic : exit, ires=1'
2176 : : ! ENDDEBUG
2177 : 0 : return
2178 : : end if
2179 : :
2180 : : !main cycle => limits (adhoc):
2181 : : !aim_dtset%lstep - minimal step
2182 : : !aim_dtset%lgrad - minimal norm of gradient
2183 : : !aim_maxstep - max number of steps
2184 : :
2185 [ + + + + : 92632 : do while ((dv>aim_dtset%lstep).and.(dg>aim_dtset%lgrad).and.(istep<aim_maxstep))
+ + ]
2186 : 90566 : istep=istep+1
2187 : 90566 : vold(:)=vv(:)
2188 : 90566 : dvold=dv
2189 : 90566 : ev(:)=0._dp
2190 : 90566 : yy(:,:)=0._dp
2191 : 90566 : call jacobi(hrho,3,3,ev,yy,nrot) ! eigenval of Hessian
2192 : 90566 : call ordr(ev,yy,3,-1) ! ordering
2193 : :
2194 : : ! modification of the Newton-Raphson step to searching
2195 : : ! specific type of CP (Popelier algorithm)
2196 : :
2197 : 90566 : ff(:)=0._dp
2198 : 90566 : lp(:)=0._dp
2199 : 90566 : dc(:)=0._dp
2200 : 90566 : outof=.false.
2201 [ + + ]: 362264 : do ii=1,3
2202 [ + + ]: 1177358 : do jj=1,3
2203 : 1086792 : ff(ii)=ff(ii)+yy(jj,ii)*grho(jj)
2204 : : end do
2205 : : end do
2206 : 90566 : id=sign(1._dp,ev(1))+sign(1._dp,ev(2))+sign(1._dp,ev(3))
2207 [ + + ]: 90566 : if (id /= sort) then
2208 : 26687 : outof=.true.
2209 : 488 : select case (sort)
2210 : : case (-1)
2211 : 488 : lp(3)=0.5_dp*(ev(3)-sqrt(ev(3)*ev(3)+4._dp*ff(3)*ff(3)))
2212 [ + + + + ]: 6344 : pom(:,:)=0._dp
2213 [ + + + + ]: 6344 : pom2(:,:)=0._dp
2214 [ + + ]: 1952 : lamb(:)=0._dp
2215 [ + + ]: 1464 : do ii=1,2
2216 : 976 : pom(ii,ii)=ev(ii)
2217 : 976 : pom(ii,3)=ff(ii)
2218 : 1464 : pom(3,ii)=ff(ii)
2219 : : end do
2220 : 488 : call jacobi(pom,3,3,lamb,pom2,nrot)
2221 : 488 : call ordr(lamb,pom2,3,1)
2222 [ + - ]: 488 : do ii=1,3
2223 : 488 : lp(1)=lamb(ii)
2224 [ - + ]: 488 : if (abs(pom2(3,ii))>1.0d-24) exit
2225 : : end do
2226 : 488 : lp(2)=lp(1)
2227 : :
2228 : : ! write(std_out,*) (ev(ii),ii=1,3)
2229 : : ! write(std_out,*) (lamb(ii),ii=1,3)
2230 : : ! write(std_out,*) ':ID ',id,lp(1),lp(3)
2231 : :
2232 : : case (1)
2233 : 20471 : lp(1)=0.5_dp*(ev(1)+sqrt(ev(1)*ev(1)+4._dp*ff(1)*ff(1)))
2234 [ + + + + ]: 266123 : pom(:,:)=0._dp
2235 [ + + + + ]: 266123 : pom2(:,:)=0._dp
2236 [ + + ]: 81884 : lamb(:)=0._dp
2237 [ + + ]: 61413 : do ii=2,3
2238 : 40942 : pom(ii-1,ii-1)=ev(ii)
2239 : 40942 : pom(ii-1,3)=ff(ii)
2240 : 61413 : pom(3,ii-1)=ff(ii)
2241 : : end do
2242 : 20471 : call jacobi(pom,3,3,lamb,pom2,nrot)
2243 : 20471 : call ordr(lamb,pom2,3,1)
2244 [ + - ]: 20471 : do ii=3,1,-1
2245 : 20471 : lp(2)=lamb(ii)
2246 [ - + ]: 20471 : if (abs(pom2(3,ii))>1.0d-24) exit
2247 : : end do
2248 : 20471 : lp(3)=lp(2)
2249 : :
2250 : : case (3)
2251 [ + + + + ]: 120288 : pom(:,:)=0._dp
2252 [ + + + + ]: 120288 : pom2(:,:)=0._dp
2253 [ + + ]: 28640 : lamb(:)=0._dp
2254 [ + + ]: 22912 : do ii=1,3
2255 : 17184 : pom(ii,ii)=ev(ii)
2256 : 17184 : pom(ii,4)=ff(ii)
2257 : 22912 : pom(4,ii)=ff(ii)
2258 : : end do
2259 : 5728 : call jacobi(pom,4,4,lamb,pom2,nrot)
2260 : 5728 : call ordr(lamb,pom2,4,1)
2261 [ + - ]: 5728 : do ii=4,1,-1
2262 : 5728 : lp(1)=lamb(ii)
2263 [ - + ]: 5728 : if (abs(pom2(4,ii))>1.0d-24) exit
2264 : : end do
2265 : 5728 : lp(2)=lp(1); lp(3)=lp(1)
2266 : : case default
2267 [ + + + - ]: 26687 : lp(:)=0._dp
2268 : : end select
2269 : : end if
2270 : :
2271 [ + + ]: 345123 : do ii=1,3
2272 [ + + ]: 345123 : if (abs(ev(ii)-lp(ii))<1.0d-24) then
2273 : : outof=.false.
2274 : : exit
2275 : : end if
2276 : : end do
2277 [ + + ]: 362264 : do ii=1,3 ! SEARCHING STEP
2278 [ + + ]: 1177358 : do jj=1,3
2279 [ + + ]: 1086792 : if (outof) then
2280 : 184815 : dc(ii)=dc(ii)+ff(jj)*yy(ii,jj)/(ev(jj)-lp(jj))
2281 [ + - ]: 630279 : elseif (abs(ev(jj))>1.0d-24) then
2282 : 630279 : dc(ii)=dc(ii)+ff(jj)*yy(ii,jj)/ev(jj)
2283 : : else
2284 : 0 : ABI_ERROR("zero eigval of Hessian")
2285 : : end if
2286 : : end do
2287 : : end do
2288 : :
2289 : 90566 : dltcmax = vnorm(dc,0)
2290 [ + + ]: 90566 : if (dltcmax>dmax) then ! STEP RESTRICTION
2291 [ + + ]: 148936 : do ii=1,3
2292 : 148936 : dc(ii)=dc(ii)*dmax/dltcmax
2293 : : end do
2294 : : end if ! primitive handling of oscillations
2295 : 90566 : ss=vnorm(dc,0) ! usually not needed
2296 : 90566 : ss=abs(ss-dv)/ss
2297 [ + + + + ]: 90566 : if ((ss < evol).and.(oscl)) then
2298 [ + + ]: 77684 : dc(:)=dc(:)/2._dp
2299 : : end if
2300 : :
2301 : :
2302 [ + + ]: 362264 : do ii=1,3
2303 : 362264 : vv(ii) = vv(ii) - dc(ii)
2304 : : end do
2305 : :
2306 : : ! DEBUG
2307 : : ! write(std_out,'(":POSIN ",3F16.8)') vv
2308 : : ! ENDDEBUG
2309 : :
2310 : 90566 : call vgh_rho(vv,chg,grho,hrho,rr,iat,ipos,0)
2311 : 90566 : dg = vnorm(grho,0)
2312 : :
2313 [ - + ]: 90566 : if (deb) then ! DEBUGG OUTPUT
2314 : 0 : write(std_out,'("AFTER STEP ===================================")')
2315 [ # # # # ]: 0 : write(std_out,'(":HESSIAN^(-1) ",/,3F16.8,/,3F16.8,/,3F16.8)') ((yy(ii,jii),jii=1,3),ii=1,3)
2316 : 0 : write(std_out,'(":DC ",3F16.8)') dc
2317 : 0 : write(std_out,*) 'STEP ',istep
2318 : 0 : write(std_out,'(":POS ",3F16.8)') vv
2319 : 0 : write(std_out,'(":GRAD ",3F16.8)') grho
2320 : 0 : write(std_out,*) ':DGRAD,CHG ',dg,chg
2321 [ # # # # ]: 0 : write(std_out,'(":HESSIAN ",/,3F16.8,/,3F16.8,/,3F16.8)') ((hrho(ii,jii),jii=1,3),ii=1,3)
2322 : : end if
2323 [ + + ]: 362264 : vt(:)=vv(:)-vold(:)
2324 : 90566 : dv=vnorm(vt,0)
2325 : 90566 : ss=abs(dvold-dv)/dv
2326 [ + + ]: 92632 : if (ss < evol) oscl=.true.
2327 : : end do
2328 : :
2329 : : !end of main cycle
2330 : :
2331 : : !the final output
2332 : :
2333 : 2066 : write(std_out,*) 'iste:',istep, dv, dg
2334 [ + + ]: 2066 : if (istep>=aim_maxstep)then
2335 : 347 : write(std_out,*) ' istep=MAXSTEP ! Examine lstep2 and lgrad2 .'
2336 [ + + + + ]: 347 : if ( (dv>aim_dtset%lstep2) .and. (dg>aim_dtset%lgrad2 )) then
2337 : 127 : write(std_out,'(":POSOUT ",3F16.8)') vv
2338 : 127 : ires=1
2339 : : end if
2340 : : end if
2341 : :
2342 : 2066 : vt(:)=vv(:)
2343 : :
2344 : : !write(std_out,'(":POSOUT ",3F16.8)') vv
2345 : : !write(std_out,'(":RBPOSOUT ",3F16.8)') vt
2346 : :
2347 : 2066 : call vgh_rho(vv,chg,grho,hrho,rr,iat,ipos,0)
2348 : :
2349 : : !write(std_out,'(":GRAD ",3F16.8)') grho
2350 : : !write(std_out,'(":HESSIAN ",/,3F16.8,/,3F16.8,/,3F16.8)')&
2351 : : !& ((hrho(ii,jii),jii=1,3),ii=1,3)
2352 : :
2353 : :
2354 : : !FINAL INVERSION OF HESSIAN
2355 : :
2356 : 2066 : call ludcmp(hrho,3,3,ipiv,id,info)
2357 [ - + ]: 2066 : if (info /= 0) then
2358 : 0 : write(std_out,*) 'Error inverting hrho:'
2359 [ # # ]: 0 : do ii=1,3
2360 : 0 : write(std_out,*) (hrho(ii,jii),jii=1,3)
2361 : : end do
2362 : 0 : ires=1
2363 : : ! DEBUG
2364 : : ! write(std_out,*)' critic : exit, ires=1'
2365 : : ! ENDDEBUG
2366 : 0 : return
2367 : : ! stop 'ERROR INVERTING HESSIAN'
2368 : : end if
2369 [ + + ]: 8264 : do ii=1,3
2370 [ + + ]: 24792 : yy(ii,1:3)=0.
2371 : 8264 : yy(ii,ii)=1.
2372 : : end do
2373 [ + + ]: 8264 : do jii=1,3
2374 : 8264 : call lubksb(hrho,3,3,ipiv,yy(1,jii))
2375 : : end do
2376 : :
2377 : :
2378 : : !write(std_out,'(":HESSIAN^(-1) ",/,3F16.8,/,3F16.8,/,3F16.8)') ((y(ii,jii),jii=1,3),ii=1,3)
2379 : :
2380 : 2066 : call vgh_rho(vv,chg,grho,hrho,rr,iat,ipos,0)
2381 : :
2382 : : !write(std_out,'("LAPLAC:",F16.8)') hrho(1,1)+hrho(2,2)+hrho(3,3)
2383 : :
2384 : 2066 : call jacobi(hrho,3,3,ev,yy,nrot)
2385 : 2066 : call ordr(ev,yy,3,1)
2386 : 2066 : zz(:,:)=yy(:,:)
2387 : :
2388 : : !do ii=1,3
2389 : : !do jii=1,3
2390 : : !zz(ii,jii)=yy(jii,ii)
2391 : : !end do
2392 : : !end do
2393 : :
2394 : : !write(std_out,'(":AUTOVAL ",3F16.8)') (ev(ii),ii=1,3)
2395 : : !write(std_out,'(":AUTOVEC ",/,3F16.8,/,3F16.8,/,3F16.8)') ((zz(ii,jii),ii=1,3),jii=1,3)
2396 : :
2397 [ + - ]: 2066 : if (sort/=0) then
2398 [ - + ]: 2066 : ABI_FREE(pom)
2399 [ - + ]: 2066 : ABI_FREE(pom2)
2400 [ - + ]: 2066 : ABI_FREE(lamb)
2401 : : end if
2402 : :
2403 : : !DEBUG
2404 : : !write(std_out,*)' critic : exit, ires= ',ires
2405 : : !ENDDEBUG
2406 [ - + - + : 2066 : end subroutine critic
- + - - -
- - - ]
2407 : : !!***
2408 : :
2409 : : !!****f* m_bader/ordr
2410 : : !! NAME
2411 : : !! ordr
2412 : : !!
2413 : : !! FUNCTION
2414 : : !!
2415 : : !! INPUTS
2416 : : !! (to be filled)
2417 : : !!
2418 : : !! OUTPUT
2419 : : !! (to be filled)
2420 : : !!
2421 : : !! SOURCE
2422 : : !!
2423 : :
2424 : 119319 : subroutine ordr(aa,dd,nn,cff)
2425 : :
2426 : : !Arguments ----------------------------
2427 : : !scalars
2428 : : integer,intent(in) :: cff,nn
2429 : : !arrays
2430 : : real(dp),intent(inout) :: aa(nn),dd(nn,nn)
2431 : :
2432 : : !Local variables ----------------------
2433 : : !scalars
2434 : : integer :: ii,jj,kk
2435 : : real(dp) :: uu
2436 : :
2437 : : ! *********************************************************************
2438 : :
2439 [ + + ]: 363685 : do ii=1,nn-1
2440 : 244366 : kk=ii
2441 : 244366 : uu=aa(ii)
2442 [ + + ]: 619507 : do jj=ii+1,nn
2443 [ + + ]: 619507 : if (cff==1) then
2444 [ + + ]: 103443 : if (aa(jj) >= uu+tol12) then
2445 : 375141 : kk=jj
2446 : 375141 : uu=aa(jj)
2447 : : end if
2448 : : else
2449 [ + + ]: 271698 : if (aa(jj) <= uu-tol12) then
2450 : 375141 : kk=jj
2451 : 375141 : uu=aa(jj)
2452 : : end if
2453 : : end if
2454 : : end do
2455 [ + + ]: 363685 : if (kk /= ii) then
2456 : 138553 : aa(kk)=aa(ii)
2457 : 138553 : aa(ii)=uu
2458 [ + + ]: 568065 : do jj=1,nn
2459 : 429512 : uu=dd(jj,ii)
2460 : 429512 : dd(jj,ii)=dd(jj,kk)
2461 : 568065 : dd(jj,kk)=uu
2462 : : end do
2463 : : end if
2464 : : end do
2465 : 119319 : end subroutine ordr
2466 : : !!***
2467 : :
2468 : : !!****f* m_bader/critics
2469 : : !! NAME
2470 : : !! critics
2471 : : !!
2472 : : !! FUNCTION
2473 : : !! Search for critical points starting between
2474 : : !! atom inxat and its neighbors.
2475 : : !!
2476 : : !! INPUTS
2477 : : !! aim_dtset= the structured entity containing all input variables
2478 : : !! dstmax=maximum distance to search for neighbors
2479 : : !! stwo, sthree, sfour: logical switches (TRUE/FALSE) indicating
2480 : : !! to search CP starting in the middle point
2481 : : !! of two, three or four atoms. One of these
2482 : : !! atoms is inxat.
2483 : : !!
2484 : : !! OUTPUT
2485 : : !! (see side effects)
2486 : : !!
2487 : : !! SIDE EFFECTS
2488 : : !! This routines acts primarily on the data contained in the aim_prom module
2489 : : !!
2490 : : !! WARNING
2491 : : !! This file does not follow the ABINIT coding rules (yet)
2492 : : !!
2493 : : !! SOURCE
2494 : :
2495 : 0 : subroutine critics(aim_dtset,inxat,stwo,sthree,sfour,dstmax)
2496 : :
2497 : : !Arguments ------------------------------------
2498 : : !scalars
2499 : : integer,intent(in) :: inxat
2500 : : real(dp),intent(in) :: dstmax
2501 : : logical,intent(in) :: sfour,sthree,stwo
2502 : : !no_abirules
2503 : : type(aim_dataset_type), intent(in) :: aim_dtset
2504 : :
2505 : : !Local variables ------------------------------
2506 : : !scalars
2507 : : integer :: i1,i2,i3,iat,ii,ipos,ires,jii,jj,kjj,kk,ll,n1,n2,n3,nb,nc
2508 : : integer :: nshell
2509 : : real(dp) :: chg,dif1,dif2,diff,dist,olddist,rr
2510 : : ! real(dp) :: ss,uu
2511 : : logical :: found,inter
2512 : : !arrays
2513 : 0 : integer :: ibat(nnpos*natom),inat(nnpos*natom),ipibat(nnpos*natom)
2514 : 0 : integer :: nnat(nnpos*natom),nr(nnpos*natom)
2515 : 0 : real(dp) :: dif(3),dists(nnpos*natom),ev(3),grho(3),hrho(3,3)
2516 : : real(dp) :: pom(3),v1(3),v2(3),v3(3),v4(3),vi(3),vt(3),zz(3,3)
2517 : :
2518 : : !************************************************************************
2519 [ # # ]: 0 : vi(:)=xatm(:,inxat)
2520 : :
2521 : 0 : nc=0
2522 [ # # ]: 0 : do jii=1,nnpos
2523 [ # # ]: 0 : do kjj=1,natom
2524 : 0 : dist=0._dp
2525 [ # # ]: 0 : dif(:)=xatm(:,inxat)-xatm(:,kjj)-atp(:,jii)
2526 : :
2527 : : ! do ii=1,3
2528 : : ! dif(ii)=xatm(ii,inxat)-xatm(ii,kjj)-atp(ii,jii)
2529 : : ! end do
2530 : 0 : dist=vnorm(dif,0)
2531 [ # # # # ]: 0 : if (.not.((dist>dstmax).or.(dist<0.001))) then
2532 : 0 : nc=nc+1
2533 : 0 : dists(nc)=dist
2534 : 0 : nnat(nc)=kjj
2535 : 0 : inat(nc)=jii
2536 : : end if
2537 : : end do
2538 : : end do
2539 [ # # ]: 0 : do n1=1,nc
2540 : 0 : nr(n1)=n1
2541 : : end do
2542 : 0 : call sort_dp(nc,dists,nr,tol14)
2543 : 0 : nb=0
2544 : 0 : olddist=0._dp
2545 : 0 : nshell=0
2546 : : !write(std_out,*) ':ORIAT ', (xatm(ii,inxat),ii=1,3)
2547 [ # # ]: 0 : do n1=1,nc
2548 : 0 : n2=nr(n1)
2549 : 0 : n3=nnat(n2)
2550 [ # # ]: 0 : if (dists(n1)<(2*dists(1))) then
2551 [ # # ]: 0 : if ((dists(n1)-olddist)>aim_dlimit) then
2552 : 0 : nshell=nshell+1
2553 : 0 : olddist=dists(n1)
2554 [ # # ]: 0 : if (nshell==5) exit
2555 : : end if
2556 : 0 : nb=nb+1
2557 : 0 : ibat(nb)=n3
2558 : 0 : ipibat(nb)=inat(n2)
2559 : 0 : write(std_out,*) ':NEIG ',inxat,n3,inat(n2),dists(n1)
2560 : : ! write(std_out,*) ':POSAT',(xatm(ii,ibat(nb))+atp(ii,ipibat(nb)),ii=1,3)
2561 : : else
2562 : : exit
2563 : : end if
2564 : : end do
2565 : :
2566 : 0 : npc=0
2567 : 0 : npcm3=0
2568 : :
2569 : : !
2570 : : !.....SEARCH BETWEEN EACH PAIR OF ATOMS
2571 : : !
2572 : :
2573 [ # # ]: 0 : if (stwo) then
2574 [ # # ]: 0 : do jii=1,nb
2575 [ # # ]: 0 : do ii=1,3
2576 : 0 : v1(ii)=xatm(ii,inxat)
2577 : 0 : v2(ii)=xatm(ii,ibat(jii))+atp(ii,ipibat(jii))
2578 : 0 : vt(ii)=(v1(ii)+v2(ii))/2._dp
2579 : : end do
2580 : 0 : inter=.true.
2581 : 0 : diff=0._dp
2582 : 0 : pom(:)=vt(:)
2583 [ # # ]: 0 : pom(:)=pom(:)-vi(:)
2584 : 0 : diff=vnorm(pom,0)
2585 [ # # ]: 0 : if (diff > maxcpdst) inter=.false.
2586 : 0 : if (inter) then
2587 : 0 : call critic(aim_dtset,vt,ev,zz,aim_dmaxcs,ires,0)
2588 [ # # ]: 0 : if (ires==0) then
2589 : 0 : found=.false.
2590 [ # # ]: 0 : if (npc > 0) then
2591 [ # # ]: 0 : do jj=1,npc
2592 [ # # ]: 0 : pom(:)=vt(:)-pc(:,jj)
2593 : 0 : dist=vnorm(pom,0)
2594 [ # # ]: 0 : if (dist < aim_dtset%dpclim) found=.true.
2595 : : end do
2596 : : end if
2597 [ # # ]: 0 : if (.not.found) then
2598 : 0 : pom(:)=vt(:)
2599 : 0 : call bschg1(pom,-1)
2600 [ # # ]: 0 : pcrb(:,npc+1)=pom(:)
2601 [ # # ]: 0 : pom(:)=pom(:)-vi(:)
2602 : 0 : diff=vnorm(pom,0)
2603 [ # # ]: 0 : if (abs(diff) > maxcpdst) found=.true.
2604 : : end if
2605 : : if (.not.found) then
2606 : 0 : npc=npc+1
2607 [ # # ]: 0 : do jj=1,3
2608 : 0 : pc(jj,npc)=vt(jj)
2609 : 0 : evpc(jj,npc)=ev(jj)
2610 [ # # ]: 0 : do kk=1,3
2611 : 0 : zpc(kk,jj,npc)=zz(kk,jj)
2612 : : end do
2613 : : end do
2614 : 0 : i1=ev(1)/abs(ev(1))
2615 : 0 : i2=ev(2)/abs(ev(2))
2616 : 0 : i3=ev(3)/abs(ev(3))
2617 : 0 : icpc(npc)=i1+i2+i3
2618 [ # # ]: 0 : if (icpc(npc)==-3) then
2619 : 0 : npcm3=npcm3+1
2620 : : end if
2621 : 0 : write(std_out,*) 'New critical point found'
2622 : 0 : write(std_out,'("POS: ",3F16.8)') (pc(ii,npc),ii=1,3)
2623 : 0 : write(std_out,'("POS in base: ",3F16.8)') (pcrb(ii,npc),ii=1,3)
2624 : 0 : write(std_out,'("AUTOVAL: ",3F16.8)') ev
2625 : : write(std_out,'("AUTOVEC: ",/,3F16.8,/,3F16.8,/,3F16.8)') &
2626 : 0 : & ((zpc(ii,jj,npc),ii=1,3),jj=1,3)
2627 : 0 : call vgh_rho(vt,chg,grho,hrho,rr,iat,ipos,0)
2628 : : write(22,'(":PC2",3F10.6,3E12.4,I4,2E12.4)') &
2629 : 0 : & (pc(jj,npc),jj=1,3),(ev(jj),jj=1,3),icpc(npc),ev(1)+ev(2)+ev(3),chg
2630 : : write(std_out,'(":PC2",3F10.6,3E12.4,I4,2E12.4)') &
2631 : 0 : & (pc(jj,npc),jj=1,3),(ev(jj),jj=1,3),icpc(npc),ev(1)+ev(2)+ev(3),chg
2632 [ # # ]: 0 : pom(:)=vt(:)-v1(:)
2633 : 0 : dif1=vnorm(pom,0)
2634 [ # # ]: 0 : pom(:)=vt(:)-v2(:)
2635 : 0 : dif2=vnorm(pom,0)
2636 : 0 : write(std_out,'(":DISPC ",2F12.8)') dif1,dif2
2637 : : end if
2638 : : end if
2639 : : end if
2640 : : end do
2641 : : end if
2642 : : !
2643 : : !.....SEARCH BETWEEN EACH THREE ATOMS
2644 : : !
2645 [ # # ]: 0 : if(sthree) then
2646 : 0 : do jii=1,nb
2647 [ # # ]: 0 : do kjj=jii+1,nb
2648 [ # # ]: 0 : do ii=1,3
2649 : 0 : v1(ii)=xatm(ii,inxat)
2650 : 0 : v2(ii)=xatm(ii,ibat(jii))+atp(ii,ipibat(jii))
2651 : 0 : v3(ii)=xatm(ii,ibat(kjj))+atp(ii,ipibat(kjj))
2652 : 0 : vt(ii)=(v1(ii)+v2(ii)+v3(ii))/3._dp
2653 : : end do
2654 : 0 : inter=.true.
2655 : 0 : pom(:)=vt(:)
2656 [ # # ]: 0 : pom(:)=pom(:)-vi(:)
2657 : 0 : dist=vnorm(pom,0)
2658 [ # # ]: 0 : if (abs(diff)>maxcpdst) then
2659 [ # # ]: 0 : inter=.false.
2660 : : exit
2661 : : end if
2662 : : if (inter) then
2663 [ # # ]: 0 : do jj=1,npc
2664 [ # # ]: 0 : pom(:)=pc(:,jj)-vt(:)
2665 : 0 : diff=vnorm(pom,0)
2666 [ # # ]: 0 : if (diff<aim_dpc0) then
2667 : : inter=.false.
2668 : : exit
2669 : : end if
2670 : : end do
2671 : : end if
2672 [ # # ]: 0 : if (inter) then
2673 : 0 : call critic(aim_dtset,vt,ev,zz,aim_dmaxcs,ires,0)
2674 [ # # ]: 0 : if (ires==0) then
2675 : 0 : found=.false.
2676 [ # # ]: 0 : if (npc>0) then
2677 [ # # ]: 0 : do jj=1,npc
2678 [ # # ]: 0 : pom(:)=vt(:)-pc(:,jj)
2679 : 0 : dist=vnorm(pom,0)
2680 [ # # ]: 0 : if (dist<aim_dtset%dpclim) then
2681 : : found=.true.
2682 : : exit
2683 : : end if
2684 : : end do
2685 : : end if
2686 [ # # ]: 0 : if (.not.found) then
2687 : 0 : pom(:)=vt(:)
2688 : 0 : call bschg1(pom,-1)
2689 [ # # ]: 0 : pcrb(:,npc+1)=pom(:)
2690 [ # # ]: 0 : pom(:)=pom(:)-vi(:)
2691 : 0 : diff=vnorm(pom,0)
2692 [ # # ]: 0 : if (abs(diff)>maxcpdst) found=.true.
2693 : : end if
2694 : : if (.not.found) then
2695 : 0 : npc=npc+1
2696 [ # # ]: 0 : do jj=1,3
2697 : 0 : pc(jj,npc)=vt(jj)
2698 : 0 : evpc(jj,npc)=ev(jj)
2699 [ # # ]: 0 : do kk=1,3
2700 : 0 : zpc(kk,jj,npc)=zz(kk,jj)
2701 : : end do
2702 : : end do
2703 : 0 : i1=ev(1)/abs(ev(1))
2704 : 0 : i2=ev(2)/abs(ev(2))
2705 : 0 : i3=ev(3)/abs(ev(3))
2706 : 0 : icpc(npc)=i1+i2+i3
2707 [ # # ]: 0 : if (icpc(npc)==-3) then
2708 : 0 : npcm3=npcm3+1
2709 : : end if
2710 : 0 : write(std_out,*) 'New critical point found'
2711 : 0 : write(std_out,'("POS: ",3F16.8)') (pc(ii,npc),ii=1,3)
2712 : 0 : write(std_out,'("POS in base: ",3F16.8)') (pcrb(ii,npc),ii=1,3)
2713 : 0 : write(std_out,'("AUTOVAL: ",3F16.8)') ev
2714 : : write(std_out,'("AUTOVEC: ",/,3F16.8,/,3F16.8,/,3F16.8)') &
2715 : 0 : & ((zpc(ii,jj,npc),ii=1,3),jj=1,3)
2716 : 0 : call vgh_rho(vt,chg,grho,hrho,rr,iat,ipos,0)
2717 : : write(22,'(":PC3",3F10.6,3E12.4,I4,2E12.4)') &
2718 : 0 : & (pc(jj,npc),jj=1,3),(ev(jj),jj=1,3),icpc(npc),ev(1)+ev(2)+ev(3),chg
2719 : : write(std_out,'(":PC3",3F10.6,3E12.4,I4,2E12.4)') &
2720 : 0 : & (pc(jj,npc),jj=1,3),(ev(jj),jj=1,3),icpc(npc),ev(1)+ev(2)+ev(3),chg
2721 : : end if
2722 : : end if
2723 : : end if
2724 : : end do
2725 : : end do
2726 : : end if
2727 : :
2728 : : !
2729 : : !.....SEARCH BETWEEN EACH FOUR ATOMS
2730 : : !
2731 [ # # ]: 0 : if (sfour) then
2732 [ # # ]: 0 : do jii=1,nb
2733 [ # # ]: 0 : do kjj=jii+1,nb
2734 [ # # ]: 0 : do ll=jii+1,nb
2735 [ # # ]: 0 : do ii=1,3
2736 : 0 : v1(ii)=xatm(ii,inxat)
2737 : 0 : v2(ii)=xatm(ii,ibat(jii))+atp(ii,ipibat(jii))
2738 : 0 : v3(ii)=xatm(ii,ibat(kjj))+atp(ii,ipibat(kjj))
2739 : 0 : v4(ii)=xatm(ii,ibat(ll))+atp(ii,ipibat(ll))
2740 : 0 : vt(ii)=(v1(ii)+v2(ii)+v3(ii)+v4(ii))/4._dp
2741 : : end do
2742 : 0 : inter=.true.
2743 : 0 : pom(:)=vt(:)
2744 [ # # ]: 0 : pom(:)=pom(:)-vi(:)
2745 : 0 : diff=vnorm(pom,0)
2746 [ # # ]: 0 : if (abs(diff)>maxcpdst) then
2747 : 0 : inter=.false.
2748 : : exit
2749 : : end if
2750 : : if (inter) then
2751 [ # # ]: 0 : do jj=1,npc
2752 [ # # ]: 0 : pom(:)=pc(:,jj)-vt(:)
2753 : 0 : diff=vnorm(pom,0)
2754 [ # # ]: 0 : if (diff < aim_dpc0) then
2755 : : inter=.false.
2756 : : exit
2757 : : end if
2758 : : end do
2759 : : end if
2760 [ # # ]: 0 : if (inter) then
2761 : 0 : call critic(aim_dtset,vt,ev,zz,aim_dmaxcs,ires,0)
2762 [ # # ]: 0 : if (ires==0) then
2763 : 0 : found=.false.
2764 [ # # ]: 0 : if (npc>0) then
2765 [ # # ]: 0 : do jj=1,npc
2766 [ # # ]: 0 : pom(:)=vt(:)-pc(:,jj)
2767 : 0 : dist=vnorm(pom,0)
2768 [ # # ]: 0 : if (dist < aim_dtset%dpclim) found=.true.
2769 : : end do
2770 : : end if
2771 [ # # ]: 0 : if (.not.found) then
2772 : 0 : pom(:)=vt(:)
2773 [ # # ]: 0 : pcrb(:,npc+1)=pom(:)
2774 [ # # ]: 0 : pom(:)=pom(:)-vi(:)
2775 : 0 : diff=vnorm(pom,0)
2776 [ # # ]: 0 : if (abs(diff)>maxcpdst) found=.true.
2777 : : end if
2778 : : if (.not.found) then
2779 : 0 : npc=npc+1
2780 [ # # ]: 0 : do jj=1,3
2781 : 0 : pc(jj,npc)=vt(jj)
2782 : 0 : evpc(jj,npc)=ev(jj)
2783 [ # # ]: 0 : do kk=1,3
2784 : 0 : zpc(kk,jj,npc)=zz(kk,jj)
2785 : : end do
2786 : : end do
2787 : 0 : i1=ev(1)/abs(ev(1))
2788 : 0 : i2=ev(2)/abs(ev(2))
2789 : 0 : i3=ev(3)/abs(ev(3))
2790 : 0 : icpc(npc)=i1+i2+i3
2791 [ # # ]: 0 : if (icpc(npc)==-3) then
2792 : 0 : npcm3=npcm3+1
2793 : : end if
2794 : 0 : write(std_out,*) 'New critical point found'
2795 : 0 : write(std_out,'("POS: ",3F16.8)') (pc(ii,npc),ii=1,3)
2796 : 0 : write(std_out,'("POS in base: ",3F16.8)') (pcrb(ii,npc),ii=1,3)
2797 : 0 : write(std_out,'("AUTOVAL: ",3F16.8)') ev
2798 : : write(std_out,'("AUTOVEC: ",/,3F16.8,/,3F16.8,/,3F16.8)') &
2799 : 0 : & ((zpc(ii,jj,npc),ii=1,3),jj=1,3)
2800 : 0 : call vgh_rho(vt,chg,grho,hrho,rr,iat,ipos,0)
2801 : : write(22,'(":PC4",3F10.6,3E12.4,I4,2E12.4)') &
2802 : 0 : & (pc(jj,npc),jj=1,3), (ev(jj),jj=1,3),icpc(npc),ev(1)+ev(2)+ev(3),chg
2803 : : write(std_out,'(":PC4",3F10.6,3E12.4,I4,2E12.4)') &
2804 : 0 : & (pc(jj,npc),jj=1,3), (ev(jj),jj=1,3),icpc(npc),ev(1)+ev(2)+ev(3),chg
2805 : : end if
2806 : : end if
2807 : : end if
2808 : : end do
2809 : : end do
2810 : : end do
2811 : : end if
2812 : :
2813 : 0 : write(std_out,*) npc
2814 : 0 : end subroutine critics
2815 : : !!***
2816 : :
2817 : : !!****f* m_bader/defad
2818 : : !! NAME
2819 : : !! defad
2820 : : !!
2821 : : !! FUNCTION
2822 : : !! Initialisation of aim input variables to their default values.
2823 : : !!
2824 : : !! INPUTS
2825 : : !! (no input : initialisation by default values)
2826 : : !!
2827 : : !! OUTPUT
2828 : : !! aim_dtset = the structured entity containing all input variables
2829 : : !!
2830 : : !! SOURCE
2831 : :
2832 : 5 : subroutine defad(aim_dtset)
2833 : :
2834 : : !Arguments ------------------------------------
2835 : : !scalars
2836 : : type(aim_dataset_type),intent(out) :: aim_dtset
2837 : :
2838 : : !Local variables ------------------------------
2839 : :
2840 : : ! *********************************************************************
2841 : :
2842 : 5 : aim_dtset%isurf=0
2843 : 5 : aim_dtset%crit=0
2844 : 5 : aim_dtset%irsur=0
2845 : 5 : aim_dtset%foll=0
2846 : 5 : aim_dtset%irho=0
2847 : 5 : aim_dtset%ivol=0
2848 : 5 : aim_dtset%denout=0
2849 : 5 : aim_dtset%lapout=0
2850 : 5 : aim_dtset%gpsurf=0
2851 : 5 : aim_dtset%plden=0
2852 : 5 : aim_dtset%dltyp=0
2853 : :
2854 : 5 : aim_dtset%batom=1
2855 : 5 : aim_dtset%nsa=3
2856 : 5 : aim_dtset%nsb=3
2857 : 5 : aim_dtset%nsc=3
2858 : 5 : aim_dtset%npt=100
2859 : 5 : aim_dtset%nth=32
2860 : 5 : aim_dtset%nph=48
2861 : :
2862 : 5 : aim_dtset%themax=pi
2863 : 5 : aim_dtset%themin=zero
2864 : 5 : aim_dtset%phimin=zero
2865 : 5 : aim_dtset%phimax=two_pi
2866 : 5 : aim_dtset%phi0=zero
2867 : 5 : aim_dtset%th0=zero
2868 : 5 : aim_dtset%folstp=5.d-2
2869 : 5 : aim_dtset%dr0=5.d-2
2870 : 5 : aim_dtset%atrad=one
2871 : 5 : aim_dtset%rmin=one
2872 : :
2873 [ + + ]: 20 : aim_dtset%foldep(:)=zero
2874 [ + + + + ]: 85 : aim_dtset%vpts(:,:)=zero
2875 [ + + ]: 20 : aim_dtset%ngrid(:)=30
2876 [ + + ]: 20 : aim_dtset%scal(:)=one
2877 : 5 : aim_dtset%maxatd=1.d1
2878 : 5 : aim_dtset%maxcpd=5.d1
2879 : :
2880 : 5 : aim_dtset%dpclim=1.d-2
2881 : 5 : aim_dtset%lstep=1.d-10
2882 : 5 : aim_dtset%lstep2=1.d-5
2883 : 5 : aim_dtset%lgrad=1.d-12
2884 : 5 : aim_dtset%lgrad2=1.d-5
2885 : 5 : aim_dtset%coff1=0.98_dp
2886 : 5 : aim_dtset%coff2=0.95_dp
2887 : :
2888 : 5 : end subroutine defad
2889 : : !!***
2890 : :
2891 : : !!****f* m_bader/drvaim
2892 : : !! NAME
2893 : : !! drvaim
2894 : : !!
2895 : : !! FUNCTION
2896 : : !! Main driver for the Bader analysis
2897 : : !! it looks the values of the input variables
2898 : : !! and calls corresponding procedures
2899 : : !!
2900 : : !! INPUTS
2901 : : !! aim_dtset = the structured entity containing all input variables
2902 : : !! tcpui=initial CPU time
2903 : : !! twalli=initial wall clock time
2904 : : !!
2905 : : !! OUTPUT
2906 : : !! (see side effects)
2907 : : !!
2908 : : !! SIDE EFFECTS
2909 : : !! this routine acts primarily on the data contained in the aimprom module
2910 : : !!
2911 : : !! WARNING
2912 : : !! This file does not follow the ABINIT coding rules (yet)
2913 : : !!
2914 : : !! SOURCE
2915 : :
2916 : 5 : subroutine drvaim(aim_dtset,tcpui,twalli)
2917 : :
2918 : : !Arguments ------------------------------------
2919 : : !scalars
2920 : : real(dp) :: tcpui,twalli
2921 : : type(aim_dataset_type),intent(in) :: aim_dtset
2922 : :
2923 : : !Local variables ------------------------------
2924 : : !scalars
2925 : : integer :: iat,iatinit,inxat,ipos,iposinit
2926 : : integer :: me,npmax,nproc,nstep
2927 : : real(dp) :: dstlim,rr,ss,t1,t2,tf,wall
2928 : : real(dp) :: tcpu,twall,znucl_batom
2929 : : logical :: debold,sfour,srch,sthree,stwo
2930 : : !arrays
2931 : : real(dp) :: tsec(2)
2932 : : real(dp) :: grho(3),xstart(3)
2933 : :
2934 : : ! *********************************************************************
2935 : :
2936 : 5 : me=xmpi_comm_rank(xmpi_world)
2937 : 5 : nproc=xmpi_comm_size(xmpi_world)
2938 : :
2939 : : !These input variables might be modified during what follows,
2940 : : !so, they are copied outside of aim_dtset.
2941 : 5 : inxat=aim_dtset%batom
2942 : 5 : r0=aim_dtset%atrad
2943 : 5 : h0=aim_dtset%folstp
2944 : 5 : maxatdst=aim_dtset%maxatd
2945 : 5 : maxcpdst=aim_dtset%maxcpd
2946 : :
2947 : 5 : dstlim=maxcpdst
2948 : :
2949 : : !Flags from the old version
2950 : : !to be remove later
2951 : 5 : deb=.false.
2952 : 5 : stwo=.true.
2953 : 5 : sthree=.true.
2954 : 5 : sfour=.false.
2955 : 5 : srch=.false.
2956 : :
2957 : 5 : npmax=aim_npmaxin
2958 : :
2959 : : !Main initialisation procedure -
2960 : : !- it reads ABINIT density file and files
2961 : : !with core densities and initialises the fields for
2962 : : !spline interpolation
2963 : :
2964 : 5 : call initaim(aim_dtset,znucl_batom)
2965 : :
2966 : :
2967 : : !CP SEARCHING
2968 : :
2969 [ + - ]: 5 : if (aim_dtset%crit /= 0) then
2970 : :
2971 : 5 : call timein(tcpu,twall)
2972 : 5 : tsec(1)=tcpu-tcpui ; tsec(2)=twall-twalli
2973 : : write(std_out, '(5a,f13.1,a,f13.1)' ) &
2974 : 5 : & '-',ch10,'- Before searching the CP ',ch10,&
2975 : 10 : & '- Proc. 0 individual time (sec): cpu=',tsec(1),' wall=',tsec(2)
2976 : :
2977 [ - + ]: 5 : if (aim_dtset%crit==3) then
2978 : : ! old version of the driver for searching CPs (original code)
2979 : 0 : call critics(aim_dtset,inxat,stwo,sthree,sfour,dstlim)
2980 : : else
2981 : : ! driver for searching CPs with Popellier algorithm
2982 : 5 : call cpdrv(aim_dtset)
2983 : : end if
2984 : :
2985 : 5 : call timein(tcpu,twall)
2986 : 5 : tsec(1)=tcpu-tcpui ; tsec(2)=twall-twalli
2987 : : write(std_out, '(5a,f13.1,a,f13.1)' ) &
2988 : 5 : & '-',ch10,'- After searching the CP ',ch10,&
2989 : 10 : & '- Proc. 0 individual time (sec): cpu=',tsec(1),' wall=',tsec(2)
2990 : :
2991 : : end if
2992 : :
2993 : : !
2994 : : !BADER SURFACE CALCULATION
2995 : : !
2996 : :
2997 [ + - ]: 5 : if (aim_dtset%isurf==1) then
2998 : : ! driver for determination of the Bader surface
2999 : :
3000 : 5 : call timein(tcpu,twall)
3001 : 5 : tsec(1)=tcpu-tcpui ; tsec(2)=twall-twalli
3002 : : write(std_out, '(5a,f13.1,a,f13.1)' ) &
3003 : 5 : & '-',ch10,'- Before determinating the Bader surface ',ch10,&
3004 : 10 : & '- Proc. 0 individual time (sec): cpu=',tsec(1),' wall=',tsec(2)
3005 : :
3006 : 5 : call surf(aim_dtset)
3007 : :
3008 : 5 : call timein(tcpu,twall)
3009 : 5 : tsec(1)=tcpu-tcpui ; tsec(2)=twall-twalli
3010 : : write(std_out, '(5a,f13.1,a,f13.1)' ) &
3011 : 5 : & '-',ch10,'- After determinating the Bader surface ',ch10,&
3012 : 10 : & '- Proc. 0 individual time (sec): cpu=',tsec(1),' wall=',tsec(2)
3013 : :
3014 : : end if
3015 : :
3016 : : !
3017 : : !CHARGE INTEGRATIOM
3018 : : !
3019 : :
3020 [ + - ]: 5 : if (aim_dtset%irho==1) then
3021 : 5 : call integrho(aim_dtset,znucl_batom)
3022 : : end if
3023 : :
3024 : : !
3025 : : !VOLUME INTEGRATION OF THE BADER ATOM
3026 : : !
3027 : :
3028 [ + + ]: 5 : if (aim_dtset%ivol==1) then
3029 : 1 : call integvol()
3030 : : end if
3031 : :
3032 : : !
3033 : : !ONE RADIUS OF THE BADER SURFACE
3034 : : !
3035 : :
3036 [ - + ]: 5 : if (aim_dtset%irsur==1) then
3037 [ # # ]: 0 : if (aim_dtset%isurf/=0) srch=.true.
3038 : 0 : iat=aim_dtset%batom
3039 : 0 : ss=r0
3040 : 0 : call timein(t1,wall)
3041 : 0 : call rsurf(aim_dtset,rr,grho,aim_dtset%th0,aim_dtset%phi0,ss,iat,npmax,srch)
3042 : 0 : call timein(t2,wall)
3043 : 0 : t2=t2-t1
3044 : 0 : write(unts,'(2F12.8,F15.10)') aim_dtset%th0,aim_dtset%phi0,rr
3045 : 0 : write(std_out,'(":RSUR ",2F12.8,2F15.10)') aim_dtset%th0,aim_dtset%phi0,rr,t2
3046 : : end if
3047 : :
3048 : : !
3049 : : !FOLLOW THE GRADIENT PATH FROM ONE POINT
3050 : : !
3051 : :
3052 [ - + ]: 5 : if (aim_dtset%foll==1) then
3053 : 0 : iatinit=aim_dtset%batom
3054 : 0 : iposinit=batcell
3055 [ # # ]: 0 : if (aim_dtset%isurf/=0) srch=.true.
3056 : 0 : debold=deb
3057 [ # # ]: 0 : xstart(:)=aim_dtset%foldep(:)
3058 : 0 : call timein(t1,wall)
3059 : 0 : call aim_follow(aim_dtset,xstart,npmax,srch,iatinit,iposinit,iat,ipos,nstep)
3060 : 0 : call timein(t2,wall)
3061 : 0 : tf=t2-t1
3062 : 0 : write(std_out,'(":TIME in aim_follow:", F12.4)') tf
3063 : : end if
3064 : :
3065 [ - + ]: 5 : if (aim_dtset%plden == 1) then
3066 : : ! profile of the density integrated in plane xy
3067 : : ! belong the z-axes - not finished - cut3d better !
3068 : 0 : call plint()
3069 : : end if
3070 : :
3071 [ + - - + ]: 5 : if ((aim_dtset%denout > 0).or.(aim_dtset%lapout > 0)) then
3072 : : ! additional outputs of density and laplacian fields
3073 : : ! in the plane or line
3074 : 0 : call addout(aim_dtset)
3075 : : end if
3076 : :
3077 [ + - ]: 5 : if (aim_dtset%gpsurf == 1) then
3078 : : ! script for gnuplot - simple demonstration of the
3079 : : ! computed surface
3080 : 5 : call graph(unts,untg)
3081 : : end if
3082 : :
3083 : : !Deallocation of global variables allocated in initaim
3084 : : !and declared in defs_aimfields.
3085 [ - + ]: 5 : ABI_FREE(dig1)
3086 [ - + ]: 5 : ABI_FREE(dig2)
3087 [ - + ]: 5 : ABI_FREE(dig3)
3088 [ - + ]: 5 : ABI_FREE(llg1)
3089 [ - + ]: 5 : ABI_FREE(llg2)
3090 [ - + ]: 5 : ABI_FREE(llg3)
3091 [ - + ]: 5 : ABI_FREE(cdig1)
3092 [ - + ]: 5 : ABI_FREE(cdig2)
3093 [ - + ]: 5 : ABI_FREE(cdig3)
3094 [ - + ]: 5 : ABI_FREE(ddx)
3095 [ - + ]: 5 : ABI_FREE(ddy)
3096 [ - + ]: 5 : ABI_FREE(ddz)
3097 [ - + ]: 5 : ABI_FREE(rrad)
3098 [ - + ]: 5 : ABI_FREE(crho)
3099 [ - + ]: 5 : ABI_FREE(sp2)
3100 [ - + ]: 5 : ABI_FREE(sp3)
3101 [ - + ]: 5 : ABI_FREE(sp4)
3102 [ - + ]: 5 : ABI_FREE(corlim)
3103 [ - + ]: 5 : ABI_FREE(dvl)
3104 [ - + ]: 5 : ABI_FREE(ndat)
3105 [ - + ]: 5 : ABI_FREE(rminl)
3106 : : !Deallocation of global variables allocated in initaim
3107 : : !and declared in defs_aimprom.
3108 [ - + ]: 5 : ABI_FREE(typat)
3109 [ - + ]: 5 : ABI_FREE(xred)
3110 [ - + ]: 5 : ABI_FREE(xatm)
3111 : :
3112 : 5 : end subroutine drvaim
3113 : : !!***
3114 : :
3115 : : !!****f* m_bader/graph
3116 : : !! NAME
3117 : : !! graph
3118 : : !!
3119 : : !! FUNCTION
3120 : : !! Writing of the gnuplot script to show the computed part
3121 : : !! of Bader surface with lines
3122 : : !!
3123 : : !! INPUTS
3124 : : !! untg = unit number of the file on which the info is written
3125 : : !! unts = unit number of the file from which the Bader surface is read
3126 : : !!
3127 : : !! OUTPUT
3128 : : !! (written in the untg file)
3129 : : !!
3130 : : !! SOURCE
3131 : :
3132 : 5 : subroutine graph(unts,untg)
3133 : :
3134 : : !Arguments ------------------------------------
3135 : : !scalars
3136 : : integer,intent(in) :: untg,unts
3137 : :
3138 : : !Local variables ------------------------------
3139 : : !scalars
3140 : : integer :: ii,indx,jj,nphi,nth
3141 : : real(dp),parameter :: snull=1.d-6
3142 : : real(dp) :: phimax,phimin,ss,thmax,thmin
3143 : : !arrays
3144 : : real(dp) :: xorig(3)
3145 : 5 : real(dp),allocatable :: phi(:),rr(:,:),th(:)
3146 : :
3147 : : ! *********************************************************************
3148 : :
3149 : 5 : rewind(unts)
3150 : 5 : read(unts,*) indx, xorig(1:3)
3151 : 5 : read(unts,*) nth, thmin, thmax
3152 : 5 : read(unts,*) nphi, phimin, phimax
3153 [ - + + - : 15 : ABI_MALLOC(th,(nth))
+ - + - -
+ - + ]
3154 [ - + + - : 15 : ABI_MALLOC(phi,(nphi))
+ - + - -
+ - + ]
3155 [ - + + - : 20 : ABI_MALLOC(rr,(nth,nphi))
- + + - +
- + - - +
+ - ]
3156 [ + + ]: 35 : do ii=1,nth
3157 [ + + ]: 165 : do jj=1,nphi
3158 : 160 : read(unts,*) th(ii),phi(jj),rr(ii,jj),ss
3159 : : end do
3160 : : end do
3161 : :
3162 : : !end of reading
3163 : :
3164 : 5 : write(untg,*) 'reset'
3165 : 5 : write(untg,*) 'set st d l'
3166 : 5 : write(untg,*) 'set ticslevel 0'
3167 : 5 : write(untg,*) 'set title ''Bader surface'' '
3168 : 5 : write(untg,*) 'splot ''-'' using ($3*sin($1)*cos($2)):($3*sin($1)*sin($2)):($3*cos($1)) notitle'
3169 [ + + ]: 35 : do ii=1,nth
3170 [ + + ]: 160 : do jj=1,nphi
3171 : 160 : write(untg,'(2F12.8,E16.8)') th(ii),phi(jj),rr(ii,jj)
3172 : : end do
3173 : 5 : if ((ii==nth).and.(jj==nphi)) then
3174 : : cycle
3175 : : else
3176 : 30 : write(untg,*)
3177 : : end if
3178 : : end do
3179 : :
3180 [ + - + - : 5 : end subroutine graph
+ - ]
3181 : : !!***
3182 : :
3183 : : !!****f* m_bader/initaim
3184 : : !! NAME
3185 : : !! initaim
3186 : : !!
3187 : : !! FUNCTION
3188 : : !! Initialization for the 3D interpolation for the AIM code:
3189 : : !! - this procedure reads the charge density of the electrons of valence on
3190 : : !! the equidistant 3D grid (*_DEN output file of ABINIT) and the core charge
3191 : : !! density of electrons from *.fc files (fhi package)
3192 : : !! - the Cholesky decomposition of the general matrix for
3193 : : !! the computation of the 1D spline coeficients in each direction is done.
3194 : : !! Warning - the procedure is modified to use periodic boundary conditions
3195 : : !! already during the decomposition
3196 : : !! - the second derivations of valence density in three directions are computed
3197 : : !! and stored in the real space grid of the density for interpolation.
3198 : : !! - the core density is stored separately in the radial grid together with th
3199 : : !! second radial derivation
3200 : : !!
3201 : : !! INPUTS
3202 : : !! aim_dtset= the structured entity containing all input variables
3203 : : !!
3204 : : !! OUTPUT
3205 : : !! znucl_batom= the nuclear charge of the Bader atom
3206 : : !! (see side effects)
3207 : : !!
3208 : : !! SIDE EFFECTS
3209 : : !! thie routine works on the data contained in the aim_fields and aim_prom modules
3210 : : !!
3211 : : !! WARNING
3212 : : !! This file does not follow the ABINIT coding rules (yet)
3213 : : !!
3214 : : !! SOURCE
3215 : :
3216 : 5 : subroutine initaim(aim_dtset,znucl_batom)
3217 : :
3218 : : !Arguments ------------------------------------
3219 : : !scalars
3220 : : type(aim_dataset_type),intent(in) :: aim_dtset
3221 : :
3222 : : !Local variables ------------------------------
3223 : : !scalars
3224 : : integer,parameter :: master=0
3225 : : integer :: fform0,id,ierr,ii,info,jj,kk,kod,mm,ndtmax,nn,nsa,nsb,nsc,nsym,me,nproc,npsp
3226 : : integer :: unth,comm
3227 : : integer :: den_id
3228 : : real(dp) :: ss,ucvol,znucl_batom
3229 : : real(dp) :: zz
3230 : 5 : type(hdr_type) :: hdr
3231 : : !arrays
3232 : : integer :: ipiv(3)
3233 : 5 : integer,allocatable :: symrel(:,:,:)
3234 : : real(dp) :: aa(3),bb(3),gmet(3,3),gprimd(3,3),rmet(3,3),yy(3,3)
3235 : 5 : real(dp),allocatable :: tnons(:,:),znucl(:),zionpsp(:)
3236 : 5 : real(dp),pointer :: ptc(:),ptd(:),ptf(:),ptp(:),ptsd(:)
3237 : :
3238 : : ! *********************************************************************
3239 : :
3240 : : !DEBUG
3241 : : !write(std_out,*) ' initaim : enter '
3242 : : !ENDDEBUG
3243 : :
3244 : 5 : comm = xmpi_world
3245 : 10 : me=xmpi_comm_rank(comm)
3246 : 5 : nproc=xmpi_comm_size(comm)
3247 : :
3248 : 5 : slc=0 ! code for follow
3249 : :
3250 : : !The use of the "hdr" routines is much better for the future
3251 : : !maintenance of the code. Indeed, the content of the header
3252 : : !will continue to change from time to time, and the associated
3253 : : !changes should be done in one place only.
3254 : :
3255 : : !Read ABINIT header ----------------------------------------------------------
3256 [ + - ]: 5 : if(me==master)then
3257 [ + - ]: 5 : if (aim_iomode == IO_MODE_ETSF) then
3258 : 5 : call hdr%ncread(untad, fform0)
3259 : : else
3260 : 0 : call hdr%fort_read(untad, fform0)
3261 : : end if
3262 : : end if
3263 [ - + ]: 5 : ABI_CHECK(fform0 /= 0, "hdr_read returned fform == 0")
3264 : 5 : call hdr%bcast(master, me, comm)
3265 : :
3266 : : !Echo part of the header
3267 : 5 : call hdr%echo(fform0, 4, unit=std_out)
3268 : 5 : call hdr%echo(fform0, 4, unit=untout)
3269 : :
3270 : 5 : natom=hdr%natom
3271 [ + + ]: 20 : ngfft(1:3)=hdr%ngfft(:)
3272 : 5 : nsym=hdr%nsym
3273 : 5 : npsp=hdr%npsp
3274 : 5 : ntypat=hdr%ntypat
3275 [ + + + + ]: 65 : rprimd(:,:)=hdr%rprimd(:,:)
3276 : :
3277 [ - + + - : 15 : ABI_MALLOC(zionpsp,(npsp))
+ - + - -
+ - + ]
3278 [ - + + - : 15 : ABI_MALLOC(znucl,(ntypat))
+ - + - -
+ - + ]
3279 [ - + + - : 15 : ABI_MALLOC(typat,(natom))
+ - + - -
+ - + -
+ ]
3280 [ - + + - : 15 : ABI_MALLOC(xred,(3,natom))
+ - + - -
+ - + -
+ ]
3281 [ - + + - : 15 : ABI_MALLOC(symrel,(3,3,nsym))
+ - + - -
+ - + ]
3282 [ - + + - : 15 : ABI_MALLOC(tnons,(3,nsym))
+ - + - -
+ - + ]
3283 [ - + + - : 10 : ABI_MALLOC(xatm,(3,natom))
- + - + -
+ ]
3284 : :
3285 [ + + + + : 1474 : symrel(:,:,:)=hdr%symrel(:,:,:)
+ + ]
3286 [ + + ]: 28 : typat(:)=hdr%typat(:)
3287 [ + + + + ]: 457 : tnons(:,:)=hdr%tnons(:,:)
3288 [ + + ]: 14 : znucl(:)=hdr%znucltypat(:)
3289 [ + + ]: 14 : zionpsp(:)=hdr%zionpsp(:)
3290 [ + + + + ]: 97 : xred(:,:)=hdr%xred(:,:)
3291 : :
3292 : 5 : call hdr%free()
3293 : :
3294 : : !-------------------------------------------------------------------------------
3295 : :
3296 [ - + + - : 25 : ABI_MALLOC(dvl,(ngfft(1),ngfft(2),ngfft(3)))
- + + - -
+ + - + -
+ - - + -
+ - + ]
3297 : :
3298 [ + - ]: 5 : if(me==master)then
3299 [ + - ]: 5 : if (aim_iomode == IO_MODE_ETSF) then
3300 : : ! netcdf array has shape [cplex, n1, n2, n3, nspden]), here we read only the total density.
3301 [ - + ]: 5 : NCF_CHECK(nf90_inq_varid(untad, "density", den_id))
3302 [ + + - + : 30 : NCF_CHECK(nf90_get_var(untad, den_id, dvl, start=[1,1,1,1], count=[1, ngfft(1), ngfft(2), ngfft(3), 1]))
- - ]
3303 : : else
3304 : 0 : read(untad,iostat=nn) dvl(1:ngfft(1),1:ngfft(2),1:ngfft(3))
3305 [ # # ]: 0 : ABI_CHECK(nn==0,"error of reading !")
3306 : : end if
3307 : : end if
3308 : 5 : call xmpi_bcast(dvl, master, comm, ierr)
3309 : :
3310 : 5 : write(std_out,*)ch10,' initaim : the valence density has been read' ,ch10
3311 : :
3312 : : !INITIALISATION OF SOME IMPORTANT FIELDS
3313 : :
3314 : : !Only interpolation is computed (inside vgh_rho) in reduced
3315 : : !coordinates. In all other routines the cart. coordinates (CC) are used.
3316 : :
3317 : : !transformation of the atom positions to CC
3318 [ + + ]: 28 : do ii=1,natom
3319 [ + + ]: 92 : xatm(:,ii)=xred(:,ii)
3320 : 28 : call bschg1(xatm(:,ii),1)
3321 : : end do
3322 : :
3323 : : !Generation of the neighbouring cells + transf to CC
3324 : 5 : nn=0
3325 : 5 : nsa=aim_dtset%nsa ; nsb=aim_dtset%nsb ; nsc=aim_dtset%nsc
3326 [ + + ]: 40 : do ii=-nsa,nsa
3327 [ + + ]: 285 : do jj=-nsb,nsb
3328 [ + + ]: 1995 : do kk=-nsc,nsc
3329 : 1715 : nn=nn+1
3330 : 1715 : atp(1,nn)=ii*1._dp
3331 : 1715 : atp(2,nn)=jj*1._dp
3332 : 1715 : atp(3,nn)=kk*1._dp
3333 : 1960 : call bschg1(atp(:,nn),1)
3334 : : end do
3335 : : end do
3336 : : end do
3337 : 5 : nnpos=nn
3338 : :
3339 : : !DEBUG
3340 : : !write(std_out,*)' initaim : nnpos=',nnpos
3341 : : !ENDDEBUG
3342 : :
3343 : 5 : batcell=nsa*(2*nsb+1)*(2*nsc+1)+(2*nsc+1)*nsb+nsc+1
3344 : 5 : call metric(gmet,gprimd,-1,rmet,rprimd,ucvol)
3345 : 5 : maxatdst=min(maxatdst, nsa*sqrt(rmet(1,1)), nsb*sqrt(rmet(2,2)), nsc*sqrt(rmet(3,3)) )
3346 [ + + ]: 5 : if (maxcpdst > maxatdst) maxcpdst=0.75*maxatdst
3347 : :
3348 : :
3349 : : !RPRIM ITS INVERSE AND TRANSPOSE
3350 : :
3351 [ + + ]: 20 : do ii=1,3
3352 [ + + ]: 65 : do jj=1,3
3353 : 60 : yy(ii,jj)=rprimd(ii,jj)
3354 : : end do
3355 : : end do
3356 : 5 : call ludcmp(yy,3,3,ipiv,id,info)
3357 [ - + ]: 5 : ABI_CHECK(info==0,'Error inverting rprimd')
3358 : :
3359 [ + + ]: 20 : do ii=1,3
3360 [ + + ]: 60 : do jj=1,3
3361 : 60 : ivrprim(ii,jj)=0._dp
3362 : : end do
3363 : 20 : ivrprim(ii,ii)=1._dp
3364 : : end do
3365 [ + + ]: 20 : do ii=1,3
3366 : 20 : call lubksb(yy,3,3,ipiv,ivrprim(:,ii))
3367 : : end do
3368 [ + + ]: 20 : do ii=1,3
3369 [ + + ]: 65 : do jj=1,3
3370 : 60 : trivrp(ii,jj)=ivrprim(jj,ii)
3371 : : end do
3372 : : end do
3373 : :
3374 : : write(std_out,'(" INVERSE OF RPRIMD: ",/,3F16.8,/,3F16.8,/,3F16.8,/)') &
3375 [ + - + + ]: 20 : & ((ivrprim(ii,jj), jj=1,3), ii=1,3)
3376 : : write(untout,'(" INVERSE OF RPRIMD: ",/,3F16.8,/,3F16.8,/,3F16.8,/)') &
3377 [ + - + + ]: 20 : & ((ivrprim(ii,jj), jj=1,3), ii=1,3)
3378 : :
3379 : 5 : write(std_out,*) "ATOMS (index,at.number,Zionic,position(xcart.))"
3380 : 5 : write(std_out,*) "======================================="
3381 [ + + ]: 28 : do ii=1,natom
3382 : 23 : jj=typat(ii)
3383 : 28 : write(std_out,'(I4,2F10.6,3F16.8)') ii, znucl(jj), zionpsp(jj), (xatm(kk,ii),kk=1,3)
3384 : : end do
3385 : 5 : write(untout,*) "ATOMS (index,at.number,Zionic,position(xcart.))"
3386 : 5 : write(untout,*) "======================================="
3387 [ + + ]: 28 : do ii=1,natom
3388 : 23 : jj=typat(ii)
3389 : 28 : write(untout,'(I4,2F10.6,3F16.8)') ii, znucl(jj), zionpsp(jj), (xatm(kk,ii),kk=1,3)
3390 : : end do
3391 : :
3392 : : !STEPS IN REAL SPACE GRID (REDUCED)
3393 [ + + ]: 20 : do ii=1,3
3394 : 20 : dix(ii)=1._dp/ngfft(ii)
3395 : : end do
3396 : :
3397 : : !READING OF THE CORE DENSITY
3398 : 5 : write(std_out,*)ch10,' initaim : will read the core densities' ,ch10
3399 : :
3400 [ - + + - : 15 : ABI_MALLOC(ndat,(ntypat))
+ - + - -
+ - + -
+ ]
3401 [ - + + - : 15 : ABI_MALLOC(rminl,(natom))
+ - + - -
+ - + -
+ ]
3402 : 5 : ndtmax=0
3403 [ + - ]: 5 : if(me==master)then
3404 [ + + ]: 14 : do ii=1,ntypat
3405 : 9 : unth=unt+ii
3406 : : ! DEBUG
3407 : : ! write(std_out,*)' read from unit ',unth
3408 : : ! call flush(std_out)
3409 : : ! stop
3410 : : ! ENDDEBUG
3411 : 9 : read(unth,*) ndat(ii),ss
3412 [ + - ]: 14 : if (ndat(ii)>ndtmax) ndtmax=ndat(ii)
3413 : : end do
3414 : : end if
3415 : 5 : call xmpi_bcast(ndat,master,comm,ierr)
3416 : 5 : call xmpi_bcast(ndtmax,master,comm,ierr)
3417 : 5 : call xmpi_bcast(ss,master,comm,ierr)
3418 : :
3419 : : !FIELDS FOR STORING CORE DENSITY
3420 : :
3421 [ - + + - : 20 : ABI_MALLOC(rrad,(ndtmax,ntypat))
- + + - +
- + - - +
- + - + ]
3422 [ - + + - : 15 : ABI_MALLOC(crho,(ndtmax,ntypat))
- + + - -
+ - + -
+ ]
3423 [ - + + - : 15 : ABI_MALLOC(sp2,(ndtmax,ntypat))
- + + - -
+ - + -
+ ]
3424 [ - + + - : 15 : ABI_MALLOC(sp3,(ndtmax,ntypat))
- + + - -
+ - + -
+ ]
3425 [ - + + - : 15 : ABI_MALLOC(sp4,(ndtmax,ntypat))
- + + - -
+ - + -
+ ]
3426 [ - + + - : 15 : ABI_MALLOC(corlim,(ntypat))
+ - + - -
+ - + -
+ ]
3427 : :
3428 [ + + + + ]: 3895 : sp2(:,:)=zero
3429 [ + + + + ]: 3895 : sp3(:,:)=zero
3430 [ + + + + ]: 3895 : sp4(:,:)=zero
3431 : :
3432 : : !Reading of the core densities
3433 [ + + ]: 14 : corlim(:)=0
3434 : 5 : kod=0
3435 [ + - ]: 5 : if(me==master)then
3436 [ + + ]: 14 : do ii=1,ntypat
3437 : 9 : unth=unt+ii
3438 [ + + ]: 3229 : do jj=1,ndat(ii)
3439 : 3220 : read(unth,*) rrad(jj,ii),crho(jj,ii),sp2(jj,ii),sp3(jj,ii)
3440 : : ! this is the integral of the core charge read in
3441 : 3220 : crho(jj,ii) = crho(jj,ii)/4._dp/pi
3442 [ + + + + ]: 3220 : if ((crho(jj,ii) < aim_rhocormin) .and. (corlim(ii)==0)) corlim(ii)=jj
3443 : 3220 : sp2(jj,ii)=sp2(jj,ii)/4._dp/pi
3444 : 3229 : sp3(jj,ii)=sp3(jj,ii)/4._dp/pi ! ATENTION!!! in sp3 is just second derivation
3445 : : end do
3446 [ + + ]: 3220 : do jj=1,ndat(ii)-1
3447 : 3220 : sp4(jj,ii)=(sp3(jj+1,ii)-sp3(jj,ii))/(6._dp*(rrad(jj+1,ii)-rrad(jj,ii)))
3448 : : end do
3449 : : !
3450 : 9 : zz = crho(1,ii) * rrad(1,ii)**2 * (rrad(2,ii)-rrad(1,ii))
3451 [ + + ]: 3211 : do jj=2,ndat(ii)-1
3452 : 3211 : zz = zz + crho(jj,ii) * rrad(jj,ii)**2 * (rrad(jj+1,ii)-rrad(jj-1,ii))
3453 : : end do
3454 : 9 : zz = zz * half * 4._dp * pi
3455 [ - + ]: 9 : if (corlim(ii)==0) corlim(ii)=ndat(ii)
3456 : :
3457 : : ! add check on zion wrt FHI .fc file
3458 : : ! compare zion to zionpsp(typat(aim_dtset%batom))
3459 [ - + ]: 14 : if (abs(znucl(ii) - zz - zionpsp(ii)) > 1.e-1_dp) then
3460 : 0 : write (std_out,*) 'error: your core charge ', zz, ' does not correspond to the correct number'
3461 : 0 : write (std_out,*) ' of valence electrons', zionpsp(ii), ' and the nuclear charge ', znucl(ii)
3462 : 0 : write (std_out,*) ' You have probably used a pseudopotential which has more valence electrons than the'
3463 : 0 : write (std_out,*) ' original FHI ones. ACTION: make a .fc file with the correct core charge'
3464 : 0 : stop
3465 : : end if
3466 : :
3467 : : end do
3468 : : end if
3469 : 5 : call xmpi_bcast(rrad,master,comm,ierr)
3470 : 5 : call xmpi_bcast(crho,master,comm,ierr)
3471 : 5 : call xmpi_bcast(sp2,master,comm,ierr)
3472 : 5 : call xmpi_bcast(sp3,master,comm,ierr)
3473 : 5 : call xmpi_bcast(sp4,master,comm,ierr)
3474 : 5 : call xmpi_bcast(corlim,master,comm,ierr)
3475 : :
3476 : 5 : write(std_out,*)ch10,' initaim : the core densities have been read' ,ch10
3477 : :
3478 : :
3479 : : !CORRECTION OF THE CORE DENSITY NORMALISATION
3480 [ + + + + ]: 3895 : crho(:,:)=1.0003*crho(:,:)
3481 [ + + + + ]: 3895 : sp2(:,:)=1.0003*sp2(:,:)
3482 [ + + + + ]: 3895 : sp3(:,:)=1.0003*sp3(:,:)
3483 [ + + + + ]: 3895 : sp4(:,:)=1.0003*sp4(:,:)
3484 : :
3485 : : !FIELDS FOR INTERPOLATIONS OF THE VALENCE DENSITY
3486 : :
3487 [ - + + - : 15 : ABI_MALLOC(dig1,(ngfft(1)))
+ - + - -
+ - + -
+ ]
3488 [ - + + - : 15 : ABI_MALLOC(dig2,(ngfft(2)))
+ - + - -
+ - + -
+ ]
3489 [ - + + - : 15 : ABI_MALLOC(dig3,(ngfft(3)))
+ - + - -
+ - + -
+ ]
3490 [ - + + - : 10 : ABI_MALLOC(llg1,(ngfft(1)))
- + - + -
+ ]
3491 [ - + + - : 10 : ABI_MALLOC(llg2,(ngfft(2)))
- + - + -
+ ]
3492 [ - + + - : 10 : ABI_MALLOC(llg3,(ngfft(3)))
- + - + -
+ ]
3493 [ + - - + : 15 : ABI_MALLOC(cdig1,(ngfft(1)-1))
+ - + - +
- - + - +
- + ]
3494 [ + - - + : 15 : ABI_MALLOC(cdig2,(ngfft(2)-1))
+ - + - +
- - + - +
- + ]
3495 [ + - - + : 15 : ABI_MALLOC(cdig3,(ngfft(3)-1))
+ - + - +
- - + - +
- + ]
3496 [ - + + - : 25 : ABI_MALLOC(ddx,(ngfft(1),ngfft(2),ngfft(3)))
- + + - -
+ + - + -
+ - - + -
+ - + ]
3497 [ - + + - : 20 : ABI_MALLOC(ddy,(ngfft(1),ngfft(2),ngfft(3)))
- + + - -
+ + - - +
- + - + ]
3498 [ - + + - : 20 : ABI_MALLOC(ddz,(ngfft(1),ngfft(2),ngfft(3)))
- + + - -
+ + - - +
- + - + ]
3499 : :
3500 : : !DECOMPOSITION OF THE MATRIX FOR THE DETERMINATION OF COEFFICIENTS
3501 : : !FOR CUBIC SPLINE INTERPOLATION (using the periodic boundary conditions)
3502 : :
3503 : : !MAIN DIAGONAL (aa) AND SECONDARY DIAGONAL (bb) MATRIX ELEMENTS
3504 : :
3505 : 5 : nmax=ngfft(1)
3506 [ + + ]: 15 : do ii=2,3
3507 [ + + ]: 15 : if (ngfft(ii) > nmax) nmax=ngfft(ii)
3508 : : end do
3509 : : nullify(ptf,ptsd)
3510 : 20 : nullify(ptd,ptc,ptp)
3511 [ + + ]: 20 : aa(:)=2.0*dix(:)**2/3.0
3512 [ + + ]: 20 : bb(:)=dix(:)**2/6.0
3513 : :
3514 [ + + ]: 20 : do ii=1,3
3515 [ + + ]: 15 : if(ii==1) then
3516 : 5 : ptd=>dig1;ptc=>cdig1;ptp=>llg1
3517 [ + + ]: 10 : elseif (ii==2) then
3518 : 5 : ptd=>dig2;ptc=>cdig2;ptp=>llg2
3519 : : else
3520 : 5 : ptd=>dig3;ptc=>cdig3;ptp=>llg3
3521 : : end if
3522 : 15 : ptd(1)=sqrt(aa(ii))
3523 : 15 : ptc(1)=bb(ii)/ptd(1)
3524 : 15 : ptp(1)=ptc(1)
3525 [ + - ]: 688 : do jj=2,ngfft(ii)-1
3526 : 688 : ptd(jj)=aa(ii)-ptc(jj-1)**2
3527 [ - + ]: 688 : if(ptd(jj)<zero) then
3528 : 0 : ABI_ERROR('Matrix is not positive definite !')
3529 : : end if
3530 : 688 : ptd(jj)=sqrt(ptd(jj))
3531 [ + + ]: 688 : if (jj==ngfft(ii)-1) then
3532 : 15 : ptc(jj)=(bb(ii)-ptp(jj-1)*ptc(jj-1))/ptd(jj)
3533 : 15 : ptp(jj)=ptc(jj)
3534 : 15 : exit
3535 : : end if
3536 : 673 : ptc(jj)=bb(ii)/ptd(jj)
3537 : 673 : ptp(jj)=-ptp(jj-1)*ptc(jj-1)/ptd(jj)
3538 : : end do
3539 : 15 : ss=0._dp
3540 [ + + ]: 718 : do jj=1,ngfft(ii)-1
3541 : 718 : ss=ss+ptp(jj)**2
3542 : : end do
3543 : 15 : ss=aa(ii)-ss
3544 [ - + ]: 15 : if(ss<zero) then
3545 : 0 : ABI_ERROR('Matrix is not positive definite !')
3546 : : end if
3547 : 15 : ptd(ngfft(ii))=sqrt(ss)
3548 : 15 : ptp(ngfft(ii))=ptd(ngfft(ii))
3549 : :
3550 : :
3551 : : ! INITIALISATION OF THE SECOND DERIVATIVE FIELDS
3552 : :
3553 : 15 : nn=ii+1
3554 [ + + ]: 15 : if (nn>3) nn=nn-3
3555 : 15 : mm=ii+2
3556 [ + + ]: 15 : if (mm>3) mm=mm-3
3557 [ + + ]: 733 : do jj=1,ngfft(nn)
3558 [ + + ]: 34857 : do kk=1,ngfft(mm)
3559 : : ! The calcul of the second derivations on the grid
3560 : 34842 : call inspln(ii,jj,kk)
3561 : : end do
3562 : : end do
3563 : 20 : nullify(ptd,ptc,ptp)
3564 : : end do
3565 : 5 : nullify(ptd,ptc,ptp)
3566 : :
3567 : 5 : znucl_batom=znucl(typat(aim_dtset%batom))
3568 : :
3569 : 5 : ABI_FREE(znucl)
3570 [ - + ]: 5 : ABI_FREE(zionpsp)
3571 [ - + ]: 5 : ABI_FREE(symrel)
3572 [ - + ]: 5 : ABI_FREE(tnons)
3573 : :
3574 : : !the pointers are obsolete - to remove later
3575 : :
3576 [ - + - + : 10 : end subroutine initaim
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - -
- - - - -
- - - - -
- - ]
3577 : : !!***
3578 : :
3579 : : !!****f* m_bader/inpar
3580 : : !! NAME
3581 : : !! inpar
3582 : : !!
3583 : : !! FUNCTION
3584 : : !! Parser for the aim utility (shorter than the one of ABINIT)
3585 : : !!
3586 : : !! INPUTS
3587 : : !! This routine uses data from the defs_aimprom module
3588 : : !!
3589 : : !! OUTPUT
3590 : : !! instr=string of character containing the input data
3591 : : !! lenstr=actual length of the character string
3592 : : !!
3593 : : !! WARNING
3594 : : !! This file does not follow the ABINIT coding rules (yet)
3595 : : !!
3596 : : !! SOURCE
3597 : :
3598 : 5 : subroutine inpar(instr,lenstr)
3599 : :
3600 : : !Arguments ------------------------------------
3601 : : !scalars
3602 : : integer,intent(out) :: lenstr
3603 : : character(len=*),intent(out) :: instr
3604 : :
3605 : : !Local variables ------------------------------
3606 : : character(len=1),parameter :: space=' '
3607 : : character(len=26),parameter :: uplett='ABCDEFGHIJKLMNOPQRSTUVWXYZ', lolett='abcdefghijklmnopqrstuvwxyz'
3608 : : !scalars
3609 : : integer,parameter :: nline=100
3610 : : integer :: ii,inxh,inxl,ios,jj,kk,ll
3611 : : character(len=fnlen) :: line
3612 : :
3613 : : ! *********************************************************************
3614 : :
3615 : 5 : lenstr=0
3616 : :
3617 [ + + ]: 135 : do ii=1,26
3618 : 130 : inxh=index(lolett,uplett(ii:ii))
3619 [ - + ]: 135 : if (inxh > 0) then
3620 : 0 : write(std_out,*) 'ERROR The ', uplett(ii:ii) ,' is considered come lowcase !'
3621 : 0 : ABI_ERROR("Aborting now")
3622 : : end if
3623 : : end do
3624 : 5 : rewind(unt0)
3625 [ + - ]: 302 : do ii=1,nline
3626 : 302 : read(unt0,'(A)',iostat=ios) line(1:fnlen)
3627 [ + + ]: 302 : if (ios/=0) exit
3628 : 297 : inxh=index(line,'#')
3629 [ + + ]: 297 : if (inxh == 1) then
3630 : : cycle
3631 [ + + ]: 99 : elseif (inxh > 0) then
3632 : 52 : inxl=inxh-1
3633 : 52 : line(inxh:inxh)=space
3634 : : else
3635 : 47 : inxl=len_trim(line)
3636 [ + + ]: 47 : if (inxl==0) cycle
3637 : : end if
3638 : 75 : inxh=index(line(1:inxl),char(9))
3639 [ - + ]: 75 : if (inxh/=0) line(inxh:inxh)=space
3640 [ + + ]: 1031 : do ll=1,inxl
3641 [ - + ]: 1031 : if (iachar(line(ll:ll)) < 32) line(ll:ll)=space
3642 : : end do
3643 : 75 : inxh=index(line(1:inxl),'- ')
3644 [ - + ]: 75 : if (inxh/=0) then
3645 : 0 : write(std_out,*) 'ERROR sign minus with white space in input file'
3646 : 0 : ABI_ERROR("Aborting now")
3647 : : end if
3648 [ + - ]: 75 : line(1:inxl)=adjustl(line(1:inxl))
3649 : 75 : inxl=len_trim(line(1:inxl))+1
3650 : 75 : jj=2;kk=0
3651 [ + - ]: 75 : line(1:inxl)=adjustl(line(1:inxl))
3652 : 75 : kk=len_trim(line(1:inxl))+1
3653 [ + - ]: 146 : do ll=1,inxl
3654 : 146 : inxh=index(line(jj:kk),space)
3655 [ + + - + ]: 146 : if ((inxh==0).or.((jj+inxh-1)==kk)) exit
3656 [ + - ]: 71 : line(inxh+jj:kk)=adjustl(line(inxh+jj:kk))
3657 : 71 : kk=len_trim(line(1:inxl))
3658 [ - + ]: 71 : if (kk == inxl) then
3659 : : exit
3660 : : end if
3661 : 146 : jj=jj+inxh
3662 : : end do
3663 : 75 : inxl=len_trim(line(1:inxl))+1
3664 [ + + ]: 761 : do ll=1,inxl-1
3665 : 686 : inxh=index(lolett,line(ll:ll))
3666 [ + + ]: 761 : if (inxh/=0) line(ll:ll)=uplett(inxh:inxh)
3667 : : end do
3668 [ - + ]: 80 : if ((lenstr+inxl) > strlen ) then
3669 : 0 : write(std_out,*) 'ERROR Too large input !'
3670 : 0 : ABI_ERROR("Aborting now")
3671 : : else
3672 [ + - - + ]: 75 : instr(lenstr+1:lenstr+inxl)=line(1:inxl)
3673 : 75 : lenstr=lenstr+inxl
3674 : : end if
3675 : : end do
3676 : 5 : end subroutine inpar
3677 : : !!***
3678 : :
3679 : : !!****f* m_bader/inspln
3680 : : !! NAME
3681 : : !! inspln
3682 : : !!
3683 : : !! FUNCTION
3684 : : !! This procedure gives the values of the spline coefficients
3685 : : !! (second derivatives) in the 1D grid with periodic boundary
3686 : : !! conditions at rsid - the values of the unknown functions specified
3687 : : !! in the vector valf of direction idir
3688 : : !!
3689 : : !! INPUTS
3690 : : !! idir= direction following which the derivatives are evaluated
3691 : : !! snn, tnn=remaining bi-dimensional coordinates of the line along which
3692 : : !! the derivative is to be computed
3693 : : !!
3694 : : !! OUTPUT
3695 : : !! (see side effects)
3696 : : !!
3697 : : !! SIDE EFFECTS
3698 : : !! This routine works on the data contained in the aimfields module
3699 : : !!
3700 : : !! WARNING
3701 : : !! This file does not follow the ABINIT coding rules (yet)
3702 : : !!
3703 : : !! SOURCE
3704 : :
3705 : 34124 : subroutine inspln(idir,snn,tnn)
3706 : :
3707 : : !Arguments ------------------------------------
3708 : : !scalars
3709 : : integer,intent(in) :: idir,snn,tnn
3710 : :
3711 : : !Local variables-------------------------------
3712 : : !scalars
3713 : : integer :: dim,ii
3714 : : real(dp) :: ss
3715 : : !arrays
3716 : 68248 : real(dp) :: rsid(ngfft(idir)),valf(ngfft(idir))
3717 : 34124 : real(dp),pointer :: ptc(:),ptd(:),ptp(:)
3718 : :
3719 : : ! *************************************************************************
3720 : :
3721 : : !POINTER INITIALIZATION
3722 : :
3723 : 34124 : if (idir==1) then
3724 [ + + ]: 549788 : valf(:)=dvl(:,snn,tnn)
3725 [ + + ]: 22216 : elseif (idir==2) then
3726 [ + + ]: 548924 : valf(:)=dvl(tnn,:,snn)
3727 : : else
3728 [ + + ]: 549052 : valf(:)=dvl(snn,tnn,:)
3729 : : end if
3730 : :
3731 : 34124 : nullify(ptd,ptc,ptp)
3732 [ + + ]: 34124 : if(idir==1) then
3733 : 11908 : ptd=>dig1;ptc=>cdig1;ptp=>llg1
3734 [ + + ]: 22216 : elseif (idir==2) then
3735 : 11044 : ptd=>dig2;ptc=>cdig2;ptp=>llg2
3736 : : else
3737 : 11172 : ptd=>dig3;ptc=>cdig3;ptp=>llg3
3738 : : end if
3739 : :
3740 : 34124 : dim=ngfft(idir)
3741 : :
3742 : : !FIRST CYCLE OF RECURRENCE
3743 : :
3744 : 34124 : rsid(1)=valf(2)+valf(dim)-2.*valf(1)
3745 : 34124 : rsid(1)=rsid(1)/ptd(1)
3746 [ + + ]: 1579516 : do ii=2,dim-1
3747 : 1545392 : rsid(ii)=valf(ii+1)+valf(ii-1)-2.*valf(ii)
3748 : 1579516 : rsid(ii)=(rsid(ii)-ptc(ii-1)*rsid(ii-1))/ptd(ii)
3749 : : end do
3750 : : ss=0._dp
3751 [ + + ]: 1613640 : do ii=1,dim-1
3752 : 1613640 : ss=ss+rsid(ii)*ptp(ii)
3753 : : end do
3754 : 34124 : rsid(dim)=valf(1)+valf(dim-1)-2.*valf(dim)
3755 : 34124 : rsid(dim)=(rsid(dim)-ss)/ptd(dim)
3756 : :
3757 : : !SECOND CYCLE WITH TRANSPOSED MATRIX
3758 : :
3759 : 34124 : rsid(dim)=rsid(dim)/ptd(dim)
3760 : 34124 : rsid(dim-1)=(rsid(dim-1)-ptc(dim-1)*rsid(dim))/ptd(dim-1)
3761 [ + + ]: 1579516 : do ii=dim-2,1,-1
3762 : 1579516 : rsid(ii)=(rsid(ii)-ptc(ii)*rsid(ii+1)-ptp(ii)*rsid(dim))/ptd(ii)
3763 : : end do
3764 : :
3765 [ + + ]: 34124 : if (idir==1) then
3766 [ + + ]: 549788 : ddx(:,snn,tnn)=rsid(:)
3767 [ + + ]: 22216 : elseif (idir==2) then
3768 [ + + ]: 548924 : ddy(tnn,:,snn)=rsid(:)
3769 : : else
3770 [ + + ]: 549052 : ddz(snn,tnn,:)=rsid(:)
3771 : : end if
3772 : :
3773 [ + + ]: 34124 : end subroutine inspln
3774 : : !!***
3775 : :
3776 : : !!****f* m_bader/integrho
3777 : : !! NAME
3778 : : !! integrho
3779 : : !!
3780 : : !! FUNCTION
3781 : : !! This routine integrates the electron density inside the
3782 : : !! atomic surface already calculated - it reads the file *.surf
3783 : : !! The radial integration is always performed with splines and
3784 : : !! the two angular integrations with Gauss quadrature
3785 : : !!
3786 : : !! INPUTS
3787 : : !! aim_dtset = the structured entity containing all input variables
3788 : : !! znucl_batom=the nuclear charge of the Bader atom
3789 : : !!
3790 : : !! OUTPUT
3791 : : !! (see side effects)
3792 : : !!
3793 : : !! SIDE EFFECTS
3794 : : !! This routine works primarily on the data contained in the aimfields and aimprom modules
3795 : : !!
3796 : : !! WARNING
3797 : : !! This file does not follow the ABINIT coding rules (yet)
3798 : : !!
3799 : : !! SOURCE
3800 : :
3801 : 5 : subroutine integrho(aim_dtset,znucl_batom)
3802 : :
3803 : : !Arguments ------------------------------------
3804 : : !scalars
3805 : : type(aim_dataset_type),intent(in) :: aim_dtset
3806 : :
3807 : : !Local variables ------------------------------
3808 : : !scalars
3809 : : integer :: batom,chs,iat,ii,inx,inxf,ipos,jj,kk,ll,nn,nph,nth
3810 : : real(dp) :: chg,chgint,cintr,ct1,ct2,lder,nsphe,phimax,phimin,rder
3811 : : real(dp) :: rsmax,rsmin,ss,stp,themax,themin,uu
3812 : : real(dp) :: znucl_batom,zz
3813 : : logical :: gaus,weit
3814 : : !arrays
3815 : : real(dp) :: grho(3),hrho(3,3),shift(3),unvec(3),vv(3)
3816 : 5 : real(dp),allocatable :: ncrho(:),nsp2(:),nsp3(:),nsp4(:),rdint(:,:),rr(:)
3817 : 5 : real(dp),allocatable :: vdd(:),vrho(:),wgrs(:,:),work(:)
3818 : :
3819 : : ! *********************************************************************
3820 : :
3821 : 5 : gaus=.true.
3822 : 5 : weit=.true.
3823 : :
3824 : 5 : write(std_out,*) 'npt = ',aim_dtset%npt
3825 : :
3826 : 5 : rewind(unts)
3827 : 5 : read(unts,*) batom,shift ! Warning : batom is read, instead of coming from aim_dtset
3828 : 5 : read(unts,*) nth,themin,themax ! Warning : these numbers are read, instead of coming from aim_dtset
3829 : 5 : read(unts,*) nph,phimin,phimax ! Warning : these numbers are read, instead of coming from aim_dtset
3830 : :
3831 : 5 : write(std_out,*) 'NTH NPH ',nth,nph
3832 : :
3833 [ - + + - : 20 : ABI_MALLOC(wgrs,(nth,nph))
- + + - +
- + - - +
- + ]
3834 [ - + + - : 15 : ABI_MALLOC(rdint,(nth,nph))
- + + - -
+ - + ]
3835 : :
3836 [ + + ]: 35 : do ii=1,nth
3837 [ + + ]: 165 : do jj=1,nph
3838 : 30 : if (weit) then
3839 : 130 : read(unts,*) th(ii),ph(jj),rs(ii,jj),wgrs(ii,jj)
3840 : : else
3841 : : read(unts,*) th(ii),ph(jj),rs(ii,jj)
3842 : : end if
3843 : : end do
3844 : : end do
3845 : 5 : read(unts,*) rsmin,rsmax
3846 : :
3847 : :
3848 : : if (gaus) then
3849 : 5 : ct1=cos(themin)
3850 : 5 : ct2=cos(themax)
3851 : 5 : call coeffs_gausslegint(ct1,ct2,cth,wcth,nth)
3852 : 5 : call coeffs_gausslegint(phimin,phimax,ph,wph,nph)
3853 : : end if
3854 : :
3855 : 5 : do ii=1,nth
3856 : 5 : do jj=1,nph
3857 : : if (.not.weit) then
3858 : : if (gaus) then
3859 : : wgrs(ii,jj)=wcth(ii)*wph(jj)
3860 : : else
3861 : : wgrs(ii,jj)=1._dp
3862 : : end if
3863 : : end if
3864 : : end do
3865 : : end do
3866 : :
3867 : :
3868 [ + + ]: 35 : do ii=1,nth
3869 [ + + ]: 165 : do jj=1,nph
3870 [ + + ]: 160 : if (rs(ii,jj) < rsmin) rsmin=rs(ii,jj)
3871 : : end do
3872 : : end do
3873 : :
3874 : :
3875 : : !INTEGRATION OF THE CORE DENSITY
3876 : :
3877 : 5 : nn=typat(batom)
3878 : 5 : kk=ndat(nn)
3879 : :
3880 : :
3881 : : !spherical integration of the core density in the sphere
3882 : : !of the minimal Bader radius
3883 : :
3884 : : !COEF. FOR SPHERICAL INTEGRATION
3885 : :
3886 [ - + + - : 15 : ABI_MALLOC(nsp2,(kk))
+ - + - -
+ - + ]
3887 [ - + + - : 10 : ABI_MALLOC(nsp3,(kk))
- + - + ]
3888 [ - + + - : 10 : ABI_MALLOC(nsp4,(kk))
- + - + ]
3889 [ - + + - : 10 : ABI_MALLOC(ncrho,(kk))
- + - + ]
3890 : :
3891 [ + + ]: 1557 : do ii=1,kk
3892 : 1552 : ncrho(ii)=crho(ii,nn)*4._dp*pi*rrad(ii,nn)*rrad(ii,nn)
3893 : : nsp3(ii)=4._dp*pi*(2._dp*crho(ii,nn)+2._dp*rrad(ii,nn)*sp2(ii,nn)+&
3894 : 1557 : & rrad(ii,nn)*rrad(ii,nn)*sp3(ii,nn))
3895 : : end do
3896 : :
3897 [ + + ]: 5 : if (rsmin < rrad(ndat(nn),nn)) then ! search index
3898 : 4 : inx=0
3899 [ - + ]: 4 : if (rsmin < rrad(1,nn)) then
3900 : 0 : ABI_ERROR('absurd')
3901 : : elseif (rsmin > rrad(ndat(nn),nn)) then
3902 : : inx=ndat(nn)
3903 : : else
3904 [ + + ]: 1348 : do while (rsmin >= rrad(inx+1,nn))
3905 : 4 : inx=inx+1
3906 : : end do
3907 : : end if
3908 : : else
3909 : : inx=ndat(nn)
3910 : : end if
3911 : :
3912 : 5 : cintr=4._dp/3._dp*pi*rrad(1,nn)**3*crho(1,nn)
3913 : :
3914 : : !spline integration
3915 : :
3916 [ + + ]: 1366 : do ii=1,inx-1
3917 : 1361 : uu=rrad(ii+1,nn)-rrad(ii,nn)
3918 : 1366 : cintr=cintr+(ncrho(ii)+ncrho(ii+1))*uu/2._dp-uu*uu*uu/2.4d1*(nsp3(ii)+nsp3(ii+1))
3919 : : end do
3920 [ + + ]: 5 : if (inx/=ndat(nn)) then
3921 : 4 : uu=rsmin-rrad(inx,nn)
3922 : 4 : zz=rrad(inx+1,nn)-rsmin
3923 : 4 : ss=rrad(inx+1,nn)-rrad(inx,nn)
3924 : : cintr=cintr+ncrho(inx)/2._dp*(ss-zz*zz/ss)+ncrho(inx+1)/2._dp*uu*uu/ss+&
3925 : : nsp3(inx)/1.2d1*(zz*zz*ss-zz*zz*zz*zz/2._dp/ss-ss*ss*ss/2._dp)+&
3926 : 4 : nsp3(inx+1)/1.2d1*(uu*uu*uu*uu/2._dp/ss-uu*uu*ss)
3927 : : end if
3928 : :
3929 : :
3930 : : !INTEGRATION OF THE REST OF THE CORE DENSITY
3931 : : !(for gauss quadrature)
3932 : : !For the Gauss quadrature it is added
3933 : : !to the radial integrated valence density
3934 : :
3935 [ + + + + ]: 157 : rdint(:,:)=0._dp
3936 : 5 : nsphe=0._dp
3937 [ + + ]: 35 : do ii=1,nth
3938 [ + + ]: 165 : do jj=1,nph
3939 [ + + ]: 130 : if (inx==ndat(nn)) cycle
3940 : 114 : inxf=inx
3941 [ - + ]: 114 : if (rs(ii,jj) < rsmin) then
3942 : 0 : write(std_out,*) rs(ii,jj),rsmin
3943 : 0 : ABI_ERROR('in surface')
3944 [ + + ]: 114 : elseif (rs(ii,jj) > rrad(ndat(nn),nn)) then
3945 : : inxf=ndat(nn)
3946 : : else
3947 [ + + ]: 1564 : do while (rs(ii,jj) >= rrad(inxf+1,nn))
3948 : 96 : inxf=inxf+1
3949 : : end do
3950 : : end if
3951 : :
3952 [ + + ]: 114 : if (inxf==inx) then
3953 : 12 : uu=rrad(inx+1,nn)-rs(ii,jj)
3954 : 12 : zz=rrad(inx+1,nn)-rsmin
3955 : 12 : ss=rrad(inx+1,nn)-rrad(inx,nn)
3956 : :
3957 : : rdint(ii,jj)=(ncrho(inx)/2._dp/ss-nsp3(inx)/1.2d1*ss)*(zz*zz-uu*uu)+&
3958 : 12 : nsp3(inx)/2.4d1/ss*(zz**4-uu**4)
3959 : 12 : uu=rs(ii,jj)-rrad(inx,nn)
3960 : 12 : zz=rsmin-rrad(inx,nn)
3961 : : rdint(ii,jj)=rdint(ii,jj)+(uu*uu-zz*zz)*(ncrho(inx+1)/2._dp/ss-nsp3(inx+1)/1.2d1*ss)+&
3962 : 12 : nsp3(inx+1)/2.4d1/ss*(uu**4-zz**4)
3963 : : else
3964 : 102 : uu=rrad(inx+1,nn)-rsmin
3965 : 102 : zz=rsmin-rrad(inx,nn)
3966 : :
3967 : : rdint(ii,jj)=ncrho(inx)/2._dp/ss*uu*uu+ncrho(inx+1)/2._dp*(ss-zz*zz/ss)+&
3968 : 102 : nsp3(inx)/1.2d1*(uu**4/2._dp/ss-uu*uu*ss)+nsp3(inx+1)/1.2d1*(zz*zz*ss-ss**3/2._dp-zz**4/2._dp/ss)
3969 [ + + ]: 102 : if (inxf > inx+1) then
3970 [ + + ]: 1914 : do kk=inx+1,inxf-1
3971 : 1816 : uu=rrad(kk+1,nn)-rrad(kk,nn)
3972 : 1914 : rdint(ii,jj)=rdint(ii,jj)+(ncrho(kk)+ncrho(kk+1))*uu/2._dp-uu*uu*uu/2.4d1*(nsp3(kk)+nsp3(kk+1))
3973 : : end do
3974 : : end if
3975 : :
3976 [ + + ]: 102 : if (inxf/=ndat(nn)) then
3977 : 84 : uu=rs(ii,jj)-rrad(inxf,nn)
3978 : 84 : zz=rrad(inxf+1,nn)-rs(ii,jj)
3979 : 84 : ss=rrad(inxf+1,nn)-rrad(inxf,nn)
3980 : : rdint(ii,jj)=rdint(ii,jj)+ncrho(inxf)/2._dp*(ss-zz*zz/ss)+ncrho(inxf+1)/2._dp*uu*uu/ss+&
3981 : : nsp3(inxf)/1.2d1*(zz*zz*ss-zz*zz*zz*zz/2._dp/ss-ss*ss*ss/2._dp)+&
3982 : 84 : nsp3(inxf+1)/1.2d1*(uu*uu*uu*uu/2._dp/ss-uu*uu*ss)
3983 : : end if
3984 : : end if
3985 : 114 : rdint(ii,jj)=rdint(ii,jj)/4._dp/pi
3986 : 160 : nsphe=nsphe+rdint(ii,jj)*wgrs(ii,jj)
3987 : : end do
3988 : : end do
3989 : 5 : nsphe=nsphe*(pi/(themin-themax))*(two_pi/(phimax-phimin))
3990 : :
3991 : 5 : write(untout,*)
3992 : 5 : write(untout,*) "CHARGE INTEGRATION"
3993 : 5 : write(untout,*) "=================="
3994 : 5 : write(untout,'(" Core density contribution: ",/,/," ",F16.8)') cintr+nsphe
3995 : :
3996 : 5 : write(std_out,*) ':INTECOR ', cintr+nsphe
3997 : :
3998 [ - + ]: 5 : ABI_FREE(ncrho)
3999 [ - + ]: 5 : ABI_FREE(nsp2)
4000 [ - + ]: 5 : ABI_FREE(nsp3)
4001 [ - + ]: 5 : ABI_FREE(nsp4)
4002 : :
4003 : : !INTEGRATION OF THE VALENCE DENSITY
4004 : :
4005 [ + - - + : 15 : ABI_MALLOC(rr,(aim_dtset%npt+1))
+ - + - +
- - + -
+ ]
4006 [ - + + - : 10 : ABI_MALLOC(vrho,(aim_dtset%npt+1))
- + - + ]
4007 [ - + + - : 10 : ABI_MALLOC(vdd,(aim_dtset%npt+1))
- + - + ]
4008 : :
4009 : : !in the case of the only irho appelation
4010 : :
4011 : 40 : nn=0
4012 [ + + ]: 40 : do ii=-3,3
4013 [ + + ]: 285 : do jj=-3,3
4014 [ + + ]: 1995 : do kk=-3,3
4015 : 1715 : nn=nn+1
4016 : 1715 : atp(1,nn)=ii*1._dp
4017 : 1715 : atp(2,nn)=jj*1._dp
4018 : 1715 : atp(3,nn)=kk*1._dp
4019 : 1715 : call bschg1(atp(:,nn),1)
4020 [ + + ]: 1960 : if ((ii==0).and.(jj==0).and.(kk==0)) ipos=nn
4021 : : end do
4022 : : end do
4023 : : end do
4024 : 5 : nnpos=nn
4025 : 5 : iat=batom
4026 : :
4027 : : !XG020629 There is a problem with this routine
4028 : : !(or vgh_rho), when one uses the PGI compiler :
4029 : : !The following line is needed, otherwise, iat and ipos
4030 : : !are set to 0 inside vgh_now. Why ????
4031 : 5 : write(std_out,*)' integrho : iat,ipos=',iat,ipos
4032 : : !
4033 : :
4034 : 5 : nsphe=0._dp
4035 [ - + + - : 10 : ABI_MALLOC(work,(aim_dtset%npt+1))
- + - + ]
4036 [ + + ]: 35 : do ii=1,nth
4037 [ + + ]: 165 : do jj=1,nph
4038 : :
4039 : 130 : stp=rs(ii,jj)/aim_dtset%npt
4040 : 130 : unvec(1)=sin(th(ii))*cos(ph(jj))
4041 : 130 : unvec(2)=sin(th(ii))*sin(ph(jj))
4042 : 130 : unvec(3)=cos(th(ii))
4043 [ + + ]: 6120 : do kk=0,aim_dtset%npt
4044 : 5990 : rr(kk+1)=kk*stp
4045 [ + + ]: 23960 : vv(:)=xatm(:,batom)+kk*stp*unvec(:)
4046 : 5990 : chs=-2
4047 : 5990 : call vgh_rho(vv,chg,grho,hrho,uu,iat,ipos,chs)
4048 : 5990 : vrho(kk+1)=chg*rr(kk+1)*rr(kk+1)
4049 [ + + ]: 6120 : if (kk==aim_dtset%npt) then
4050 : 130 : rder=0._dp
4051 [ + + ]: 520 : do ll=1,3
4052 : 520 : rder=rder+grho(ll)*unvec(ll)
4053 : : end do
4054 : 130 : rder=rder*rr(kk+1)*rr(kk+1)+2._dp*rr(kk+1)*chg
4055 : : end if
4056 : : end do
4057 : 130 : lder=0._dp
4058 : 130 : kk=aim_dtset%npt+1
4059 : 130 : call spline(rr,vrho,kk,lder,rder,vdd)
4060 : :
4061 : : ! INTEGRATION
4062 : :
4063 [ + + ]: 5990 : do kk=1,aim_dtset%npt
4064 : : rdint(ii,jj)=rdint(ii,jj)+stp/2._dp*(vrho(kk)+vrho(kk+1))&
4065 : 5990 : & -stp*stp*stp/24._dp*(vdd(kk)+vdd(kk+1))
4066 : : end do
4067 : 160 : nsphe=nsphe+rdint(ii,jj)*wgrs(ii,jj)
4068 : : end do
4069 : : end do
4070 [ - + ]: 5 : ABI_FREE(work)
4071 : :
4072 : : if (gaus.or.weit) then
4073 : 5 : nsphe=nsphe*(pi/(themin-themax))*(two_pi/(phimax-phimin))
4074 : : else
4075 : : nsphe=nsphe/(nth*nph)*2.0*two_pi
4076 : : end if
4077 : 5 : chgint=cintr+nsphe
4078 : :
4079 : : write(untout,'(/," Different density contributions: Core (only spherical part) and the rest ",/,/," ",2F16.8)') &
4080 : 5 : & cintr, nsphe
4081 : 5 : write(untout,'(/,a,i4,a,f14.8)') ' For atom number ',batom,', the number of electrons in the Bader volume is ',chgint
4082 : 5 : write(untout,'(a,f15.7,a,f17.8)') ' The nuclear charge is',znucl_batom,', so that the Bader charge is ',znucl_batom-chgint
4083 : 5 : write(untout,*)
4084 : 5 : write(std_out,*) ':INTEPAR ', cintr, nsphe
4085 : 5 : write(std_out,*) ':RHOTOT ',batom,chgint
4086 : :
4087 [ + - + - : 5 : end subroutine integrho
+ - + - +
- ]
4088 : : !!***
4089 : :
4090 : : !!****f* m_bader/integvol
4091 : : !! NAME
4092 : : !! integvol
4093 : : !!
4094 : : !! FUNCTION
4095 : : !! This routine integrates the volume of the Bader atom
4096 : : !!
4097 : : !! INPUTS
4098 : : !! (see side effects)
4099 : : !!
4100 : : !! OUTPUT
4101 : : !! (see side effects)
4102 : : !!
4103 : : !! SIDE EFFECTS
4104 : : !! This routine works on the data contained in the aimfields and aimprom modules
4105 : : !!
4106 : : !! WARNING
4107 : : !! This file does not follow the ABINIT coding rules (yet)
4108 : : !!
4109 : : !! SOURCE
4110 : :
4111 : 1 : subroutine integvol()
4112 : :
4113 : : !Arguments ------------------------------------
4114 : :
4115 : : !Local variables ------------------------------
4116 : : !scalars
4117 : : integer :: batom,ii,jj,nph,nth
4118 : : real(dp) :: chgint,ct1,ct2,nsphe,phimax,phimin
4119 : : real(dp) :: rsmax,rsmin,themax,themin
4120 : : logical :: gaus,weit
4121 : : !arrays
4122 : : real(dp) :: shift(3)
4123 : 1 : real(dp),allocatable :: rdint(:,:)
4124 : 1 : real(dp),allocatable :: wgrs(:,:)
4125 : :
4126 : : ! *********************************************************************
4127 : :
4128 : 1 : tpi=two_pi
4129 : 1 : gaus=.true.
4130 : 1 : weit=.true.
4131 : :
4132 : :
4133 : 1 : rewind(unts)
4134 : 1 : read(unts,*) batom,shift
4135 : 1 : read(unts,*) nth,themin,themax
4136 : 1 : read(unts,*) nph,phimin,phimax
4137 : :
4138 : 1 : write(std_out,*) 'NTH NPH ',nth,nph
4139 : :
4140 [ - + + - : 4 : ABI_MALLOC(wgrs,(nth,nph))
- + + - +
- + - - +
- + ]
4141 [ - + + - : 3 : ABI_MALLOC(rdint,(nth,nph))
- + + - -
+ - + ]
4142 : :
4143 [ + + ]: 5 : do ii=1,nth
4144 [ + + ]: 21 : do jj=1,nph
4145 : 4 : if (weit) then
4146 : 16 : read(unts,*) th(ii),ph(jj),rs(ii,jj),wgrs(ii,jj)
4147 : : else
4148 : : read(unts,*) th(ii),ph(jj),rs(ii,jj)
4149 : : end if
4150 : : end do
4151 : : end do
4152 : 1 : read(unts,*) rsmin,rsmax
4153 : :
4154 : :
4155 : : if (gaus) then
4156 : 1 : ct1=cos(themin)
4157 : 1 : ct2=cos(themax)
4158 : 1 : call coeffs_gausslegint(ct1,ct2,cth,wcth,nth)
4159 : 1 : call coeffs_gausslegint(phimin,phimax,ph,wph,nph)
4160 : : end if
4161 : :
4162 : 1 : do ii=1,nth
4163 : 1 : do jj=1,nph
4164 : : if (.not.weit) then
4165 : : if (gaus) then
4166 : : wgrs(ii,jj)=wcth(ii)*wph(jj)
4167 : : else
4168 : : wgrs(ii,jj)=1._dp
4169 : : end if
4170 : : end if
4171 : : end do
4172 : : end do
4173 : :
4174 : : nsphe=0._dp
4175 [ + + ]: 5 : do ii=1,nth
4176 [ + + ]: 21 : do jj=1,nph
4177 : 20 : nsphe=nsphe+rs(ii,jj)**3/3._dp*wgrs(ii,jj)
4178 : : end do
4179 : : end do
4180 : : if (gaus.or.weit) then
4181 : 1 : nsphe=nsphe*(pi/(themin-themax))*(tpi/(phimax-phimin))
4182 : : else
4183 : : nsphe=nsphe/(nth*nph)*2.0*tpi
4184 : : end if
4185 : 1 : chgint=nsphe
4186 : :
4187 : 1 : write(std_out,*) ':VOLTOT ',batom,chgint
4188 : 1 : write(untout,'("Volume of the Bader atom: ", I6, F16.8)') batom,chgint
4189 : :
4190 [ + - + - ]: 1 : end subroutine integvol
4191 : : !!***
4192 : :
4193 : : !!****f* m_bader/onestep
4194 : : !! NAME
4195 : : !! onestep
4196 : : !!
4197 : : !! FUNCTION
4198 : : !! Advance one step following the gradient from vv(3).
4199 : : !! It returns a new point in vv(3) and the value and gradient of the
4200 : : !! electron density at this point in chg and grho(3)
4201 : : !!
4202 : : !! INPUTS
4203 : : !! npmax= maximum number of divisions
4204 : : !! hh= determines the initial value of the step (to be multiplied by grho)
4205 : : !!
4206 : : !! OUTPUT
4207 : : !! chg= value of electron density
4208 : : !! deltar= the length of the step thaty was needed
4209 : : !! grho(3)= gradient of electron density
4210 : : !! np= returns the number of divisions that were needed
4211 : : !!
4212 : : !! SIDE EFFECTS
4213 : : !! vv(3)=starting and updated point
4214 : : !!
4215 : : !! WARNING
4216 : : !! This file does not follow the ABINIT coding rules (yet)
4217 : : !!
4218 : : !! SOURCE
4219 : :
4220 : 232463 : subroutine onestep(vv,chg,grho,hh,np,npmax,deltar)
4221 : :
4222 : : !Arguments ------------------------------------
4223 : : !scalars
4224 : : integer,intent(in) :: npmax
4225 : : integer,intent(out) :: np
4226 : : real(dp),intent(in) :: hh
4227 : : real(dp),intent(out) :: chg,deltar
4228 : : !arrays
4229 : : real(dp),intent(inout) :: vv(3)
4230 : : real(dp),intent(out) :: grho(3)
4231 : :
4232 : : !Local variables ------------------------------
4233 : : !scalars
4234 : : integer :: iat,ii,ipos,jj
4235 : : real(dp) :: dt,rr
4236 : : !arrays
4237 : : real(dp) :: hrho(3,3),pom(3),vinter(3,200),vk(3),vkold(3)
4238 : :
4239 : : !************************************************************************
4240 : 232463 : dt=hh
4241 : 232463 : np=1
4242 : 232463 : deltar=1._dp
4243 : 232463 : vk(1:3)=vv(1:3)
4244 : :
4245 : :
4246 [ + + + + : 801406 : do while((np<3).or.((np<=npmax).and.(deltar>aim_deltarmin)))
+ + ]
4247 : 568943 : np=np*2
4248 : 568943 : dt=dt*0.5_dp
4249 : 568943 : vkold(1:3)=vk(1:3)
4250 : 568943 : call vgh_rho(vk,chg,grho,hrho,rr,iat,ipos,0)
4251 [ + + ]: 2275772 : vinter(1:3,1)=vv(1:3)+dt*grho(1:3)
4252 [ + + ]: 2724090 : do jj=2,np
4253 : 2155147 : call vgh_rho(vinter(1,jj-1),chg,grho,hrho,rr,iat,ipos,0)
4254 [ + + ]: 2724090 : if(jj.eq.2) then
4255 [ + + ]: 2275772 : vinter(1:3,2)=vv(1:3)+2.0*dt*grho(1:3)
4256 : : else
4257 [ + + ]: 6344816 : vinter(1:3,jj)=vinter(1:3,jj-2)+2.0*dt*grho(1:3)
4258 : : end if
4259 : : end do
4260 : :
4261 : 568943 : call vgh_rho(vinter(1,np),chg,grho,hrho,rr,iat,ipos,0)
4262 [ + + ]: 2275772 : vinter(1:3,np+1)=vinter(1:3,np-1)+dt*grho(1:3)
4263 : :
4264 : 568943 : deltar=0._dp
4265 [ + + ]: 2508235 : do ii=1,3
4266 : 1706829 : vk(ii)=(vinter(ii,np)+vinter(ii,np+1))*0.5_dp
4267 : 2275772 : deltar=deltar+(vkold(ii)-vk(ii))*(vkold(ii)-vk(ii))
4268 : : end do
4269 : : end do
4270 : :
4271 [ + + ]: 929852 : pom(:)=vk(:)-vv(:)
4272 : 232463 : deltar=vnorm(pom,0)
4273 : 232463 : vv(1:3)=vk(1:3)
4274 : :
4275 : 232463 : call vgh_rho(vv,chg,grho,hrho,rr,iat,ipos,0)
4276 [ - + ]: 232463 : if(deb) write(std_out,*) ':VKf ',np,vk
4277 : :
4278 : 232463 : end subroutine onestep
4279 : : !!***
4280 : :
4281 : : !!****f* m_bader/plint
4282 : : !! NAME
4283 : : !! plint
4284 : : !!
4285 : : !! FUNCTION
4286 : : !! This simple routine gives the profile of the density
4287 : : !! integrated in xy plane belong the z-axes (it works only
4288 : : !! for orthogonal coordinates at present - it is better to use cut3d)
4289 : : !! integration in plane - with equilateral triangles (not really
4290 : : !! finished and not tested!)
4291 : : !!
4292 : : !! INPUTS
4293 : : !! (this routine works on the data in the aimprom module)
4294 : : !!
4295 : : !! OUTPUT
4296 : : !! (this routine works on the data in the aimprom module)
4297 : : !!
4298 : : !! WARNING
4299 : : !! This file does not follow the ABINIT coding rules (yet)
4300 : : !!
4301 : : !! SOURCE
4302 : :
4303 : 0 : subroutine plint()
4304 : :
4305 : : !Arguments ------------------------------------
4306 : :
4307 : : !Local variables ------------------------------
4308 : : !scalars
4309 : : integer,parameter :: nd=150,ng=300
4310 : : integer :: cod,iat,ii,ipos,jj,kk,nn
4311 : : real(dp) :: dd,ee,ff,gg,hh,igr,rho,ss
4312 : : logical :: prep
4313 : : !arrays
4314 : : real(dp) :: grho(3),hrho(3,3),vv(3),xl(nd+1),xs(nd)
4315 : 0 : real(dp),allocatable :: uu(:)
4316 : :
4317 : : ! *********************************************************************
4318 : :
4319 : 0 : ff=rprimd(1,1)/nd
4320 : 0 : ss=2._dp/sqrt(3._dp)*rprimd(2,2)/rprimd(1,1)*nd
4321 : 0 : nn=int(ss)
4322 : 0 : gg=sqrt(3._dp)/2.*ff
4323 : 0 : hh=rprimd(2,2)-nn/nd*sqrt(3._dp)/2.*rprimd(1,1)
4324 : 0 : ee=hh/sqrt(3._dp)
4325 : 0 : hh=hh/2.
4326 : 0 : ss=sqrt(3._dp)*ff*ff/4.
4327 : 0 : dd=ee*ff/2.
4328 : :
4329 [ # # ]: 0 : do ii=1,nd
4330 : 0 : xl(ii)=ii*ff
4331 : 0 : xs(ii)=ff/2.+ii*ff
4332 : : end do
4333 : : xl(nd+1)=rprimd(1,1)
4334 : :
4335 [ # # # # : 0 : ABI_MALLOC(uu,(nn+3))
# # # # #
# # # #
# ]
4336 : :
4337 : 0 : uu(1)=0._dp
4338 : 0 : uu(nn+3)=rprimd(2,2)
4339 [ # # ]: 0 : do ii=2,nn+2
4340 : 0 : uu(ii)=hh+(ii-1)*gg
4341 : : end do
4342 : : igr=0._dp
4343 : 0 : prep=.true.
4344 [ # # ]: 0 : do kk=1,ng
4345 : 0 : igr=0._dp
4346 : 0 : vv(3)=(kk-1)*rprimd(3,3)/ng
4347 [ # # ]: 0 : do ii=1,nn+3
4348 : 0 : vv(2)=uu(ii)
4349 [ # # ]: 0 : do jj=1,nd
4350 [ # # ]: 0 : if (prep) then
4351 : 0 : vv(1)=xl(jj)
4352 : 0 : prep=.false.
4353 : : else
4354 : 0 : vv(1)=xs(jj)
4355 : 0 : prep=.true.
4356 : : end if
4357 : 0 : call vgh_rho(vv,rho,grho,hrho,dd,iat,ipos,cod)
4358 [ # # # # ]: 0 : if ((ii==1).or.(ii==nn+3)) then
4359 : 0 : igr=igr+dd*rho
4360 [ # # # # ]: 0 : elseif ((ii==2).or.(ii==nn+2)) then
4361 : 0 : igr=igr+(dd+ss)*rho
4362 : : else
4363 : 0 : igr=igr+ss*2*rho
4364 : : end if
4365 : : end do
4366 : : end do
4367 : 0 : write(untp,'(2E16.8)') vv(3), igr
4368 : : end do
4369 : 0 : ABI_FREE(uu)
4370 : :
4371 : 0 : end subroutine plint
4372 : : !!***
4373 : :
4374 : : !!****f* m_bader/rsurf
4375 : : !! NAME
4376 : : !! rsurf
4377 : : !!
4378 : : !! FUNCTION
4379 : : !! Basic routine for determination of the radius of Bader surface
4380 : : !! for spherical rayon theta,phi
4381 : : !! the bassin is tested by following the gradient line
4382 : : !! If srch==true (in general for calls from surf) the routine aim_follow
4383 : : !! is called to stop when it arrives under already known part of surface
4384 : : !! Simple bissection method is used to obtain the radius
4385 : : !!
4386 : : !! WARNING
4387 : : !! This file does not follow the ABINIT coding rules (yet)
4388 : : !!
4389 : : !! INPUTS
4390 : : !! aim_dtset= the structured entity containing all input variables
4391 : : !! rr0= starting radius
4392 : : !! theta,phi = the spherical direction
4393 : : !! iatinit= the atom index
4394 : : !! srch= see above
4395 : : !! npmax= maximum number of divisions in one step for follow
4396 : : !!
4397 : : !! OUTPUT
4398 : : !! rr= radius
4399 : : !! grho(3)= gradient on the surface
4400 : : !!
4401 : : !! SOURCE
4402 : :
4403 : 130 : subroutine rsurf(aim_dtset,rr,grho,theta,phi,rr0,iatinit,npmax,srch)
4404 : :
4405 : : !Arguments ------------------------------------
4406 : : !scalars
4407 : : integer,intent(in) :: iatinit,npmax
4408 : : real(dp),intent(in) :: phi,rr0,theta
4409 : : real(dp),intent(out) :: rr
4410 : : logical,intent(in) :: srch
4411 : : !arrays
4412 : : real(dp),intent(out) :: grho(3)
4413 : : !no_abirules
4414 : : type(aim_dataset_type),intent(in) :: aim_dtset
4415 : :
4416 : : !Local variables ------------------------------
4417 : : !scalars
4418 : : integer :: iat,ii,ipos,iposinit,jj,nstep
4419 : : real(dp),parameter :: mfkt=1.d1
4420 : : real(dp) :: aa,dmax,dr,drr,rho,rr1,rr2,t1,t2,wall
4421 : : logical :: cross,deb_tmp,in,in1,in2,low,srch_tmp
4422 : : !arrays
4423 : : real(dp) :: hrho(3,3),unvec(3),vv(3)
4424 : :
4425 : : ! *********************************************************************
4426 : :
4427 : 130 : srch_tmp=srch
4428 : 130 : deb_tmp=deb
4429 : :
4430 : : !unity vecteur in the direction (theta,phi)
4431 : :
4432 : 130 : unvec(1)=sin(theta)*cos(phi)
4433 : 130 : unvec(2)=sin(theta)*sin(phi)
4434 : 130 : unvec(3)=cos(theta)
4435 : :
4436 : :
4437 : 130 : rr=rr0
4438 : 130 : rr1=rr
4439 : 130 : rr2=rr
4440 : 130 : drr=1._dp
4441 [ + + ]: 130 : if (abs(rr0-r0)<1.0d-12) then
4442 : 28 : dr=aim_dtset%dr0*mfkt
4443 : : else
4444 : 102 : dr=aim_dtset%dr0
4445 : : end if
4446 : :
4447 : 130 : vv(1)=xatm(1,aim_dtset%batom)
4448 : 130 : vv(2)=xatm(2,aim_dtset%batom)
4449 : 130 : vv(3)=xatm(3,aim_dtset%batom)
4450 : :
4451 : :
4452 : 130 : iposinit=batcell
4453 : 130 : write(std_out,'("ATOM iat=",i4," ipos=",i4)') aim_dtset%batom,batcell
4454 : 130 : jj=0
4455 : :
4456 : 130 : cross=.false.
4457 : :
4458 : 130 : in=.true.
4459 : 130 : low=.false.
4460 : :
4461 : 130 : dmax=h0
4462 : :
4463 : 130 : in1=.true.
4464 : 130 : in2=in1
4465 : :
4466 [ + + + + ]: 2761 : do while((drr>aim_drmin).or.(jj<2))
4467 : 2631 : call timein(t1,wall)
4468 : 2631 : jj=jj+1
4469 [ + + ]: 10524 : do ii=1,3
4470 : 10524 : vv(ii)=xatm(ii,aim_dtset%batom)+rr*unvec(ii)
4471 : : end do
4472 : :
4473 : : ! VACUUM CONDITION
4474 : :
4475 : 2631 : call vgh_rho(vv,rho,grho,hrho,aa,iat,ipos,0)
4476 [ - + ]: 2631 : if (rho < aim_rhomin) exit
4477 : :
4478 : 2631 : ldeb=.false.
4479 : :
4480 : 2631 : call aim_follow(aim_dtset,vv,npmax,srch_tmp,iatinit,iposinit,iat,ipos,nstep)
4481 : :
4482 : 2631 : call timein(t2,wall)
4483 : 2631 : t2=t2-t1
4484 : :
4485 : : write(std_out,'(a,i4,a,f12.8,a,i4,a,i4,a,f10.5,a,i4)') &
4486 : 2631 : & ' :STEP ',jj,' r=',rr,' iat=',iat,' ipos=',ipos,' time(sec)=',t2,' nstep=',nstep
4487 : :
4488 [ + + + + ]: 2631 : if ((iat.eq.iatinit).and.(ipos.eq.iposinit)) then
4489 : : in=.true.
4490 : : else
4491 : 1285 : in=.false.
4492 : : end if
4493 : :
4494 : : !
4495 : : ! NEW RADIUS
4496 : : !
4497 : :
4498 [ + + + + ]: 2631 : if ((jj.eq.1).or.((in1.eqv.in).and.(.not.cross))) then
4499 [ + + ]: 850 : if (in) then
4500 : 516 : rr2=rr1
4501 : 516 : rr1=rr
4502 : 516 : rr=rr+dr
4503 : : else
4504 : 334 : rr2=rr1
4505 : 334 : rr1=rr
4506 : 334 : rr=rr-dr
4507 : : end if
4508 [ + + + + ]: 850 : if ((jj>2).and.(dr<(0.6))) then
4509 : : ! modification of the step
4510 : 606 : dr=dr*aim_fac
4511 [ + - ]: 606 : if (deb_tmp) write(std_out,*) ':DR ',dr
4512 : : end if
4513 : : else
4514 [ + + ]: 1781 : if (.not.cross) then
4515 : 130 : cross=.true.
4516 : 130 : rr2=rr1
4517 : : else
4518 [ + + ]: 1651 : if (in2) then
4519 [ + + ]: 887 : if (in) then
4520 : 387 : rr2=rr1
4521 : : else
4522 : : in1=in2
4523 : : end if
4524 : : else
4525 [ + + ]: 764 : if (in) then
4526 : : in1=in2
4527 : : else
4528 : 368 : rr2=rr1
4529 : : end if
4530 : : end if
4531 : : end if
4532 : 1781 : rr1=rr
4533 : 1781 : rr=(rr2+rr1)/2.0
4534 : : end if
4535 : :
4536 : 2631 : in2=in1
4537 : 2631 : in1=in
4538 : 2631 : drr=abs(rr2-rr1)/rr
4539 [ + - ]: 2761 : if (deb_tmp) write(std_out,*) ':DRR ',jj,rr2,rr1,drr
4540 : : end do
4541 : :
4542 : 130 : end subroutine rsurf
4543 : : !!***
4544 : :
4545 : : !!****f* m_bader/surf
4546 : : !! NAME
4547 : : !! surf
4548 : : !!
4549 : : !! FUNCTION
4550 : : !! Determination of the Bader surface.
4551 : : !! Use rsurf to determine radius for one direction
4552 : : !! simple bisection method is used
4553 : : !! the bassin is tested following the gradient (follow) =
4554 : : !! = the most time consuming
4555 : : !! follow stops if the gradient line is near the atom
4556 : : !! or if it is under already known part of surface - this is why
4557 : : !! the surface is not computed row by row.
4558 : : !!
4559 : : !! INPUTS
4560 : : !! aim_dtset= the structured entity containing all input variables
4561 : : !!
4562 : : !! OUTPUT
4563 : : !! (see side effects)
4564 : : !!
4565 : : !! SIDE EFFECTS
4566 : : !! This routine works primarily on the data contained in the defs_aimprom module
4567 : : !!
4568 : : !! WARNING
4569 : : !! This file does not follow the ABINIT coding rules (yet)
4570 : : !!
4571 : : !! SOURCE
4572 : :
4573 : 5 : subroutine surf(aim_dtset)
4574 : :
4575 : : !Arguments ------------------------------------
4576 : : !scalars
4577 : : type(aim_dataset_type) :: aim_dtset
4578 : :
4579 : : !Local variables ------------------------------
4580 : : !scalars
4581 : : integer :: ierr,ii,ijj,ijj_exist,incr,init,iph,iph2,ith,ith2,jj,jj_exist,kk,level,me,mm,nn,nph,npmax,nproc,nth,comm
4582 : : real(dp) :: ct1,ct2,phi,rr,rsmax,rsmin,rthe,rthe0,t1,t2,theta,tt0,vcth,vph,vth
4583 : : real(dp) :: wall,xy,xyz
4584 : : logical :: srch,stemp
4585 : : !arrays
4586 : : real(dp) :: grho(3),vr(3),vv(3)
4587 : 5 : real(dp),allocatable :: rs_computed(:,:)
4588 : :
4589 : : !************************************************************************
4590 : :
4591 : 5 : comm = xmpi_world
4592 : 5 : me=xmpi_comm_rank(comm)
4593 : 5 : nproc=xmpi_comm_size(comm)
4594 : :
4595 : 5 : ttsrf=zero
4596 : :
4597 : 5 : rewind(unts)
4598 : :
4599 : 5 : nth=aim_dtset%nth
4600 : 5 : nph=aim_dtset%nph
4601 : :
4602 : : !Coefficients for spherical Gauss quadrature
4603 : :
4604 : 5 : ct1=cos(aim_dtset%themin)
4605 : 5 : ct2=cos(aim_dtset%themax)
4606 : 5 : call coeffs_gausslegint(ct1,ct2,cth,wcth,nth)
4607 : 5 : call coeffs_gausslegint(aim_dtset%phimin,aim_dtset%phimax,ph,wph,nph)
4608 : :
4609 : : !DEBUG
4610 : : !write(std_out,*)' surf : wcth=',wcth(1:nth)
4611 : : !write(std_out,*)' surf : wph=',wph(1:nth)
4612 : : !ENDDEBUG
4613 : :
4614 [ + + ]: 35 : do ijj=1,nth
4615 : 30 : th(ijj)=acos(cth(ijj))
4616 [ + - ]: 35 : if (aim_dtset%isurf/=-1) then
4617 [ + + ]: 160 : do jj=1,nph
4618 : 160 : rs(ijj,jj)=zero
4619 : : end do
4620 : : end if
4621 : : end do
4622 : :
4623 : 5 : npmax=aim_npmaxin
4624 : 5 : rsmax=0.0
4625 : 5 : rsmin=100.0
4626 : 5 : rthe0=r0
4627 : 5 : srch=.false.
4628 : :
4629 [ + + ]: 20 : do ijj=1,3
4630 : 20 : vv(ijj)=xatm(ijj,aim_dtset%batom)
4631 : : end do
4632 : :
4633 : :
4634 : 5 : write(std_out,*)
4635 : 5 : write(std_out,*) "BADER SURFACE DETERMINATION"
4636 : 5 : write(std_out,*) "==========================="
4637 : 5 : write(std_out,*)
4638 : :
4639 : 5 : write(untout,*)
4640 : 5 : write(untout,*) "BADER SURFACE DETERMINATION"
4641 : 5 : write(untout,*) "==========================="
4642 : 5 : write(untout,*)
4643 : :
4644 : 5 : write(std_out,'(" Atom: ",i3,3F15.10)') aim_dtset%batom,vv
4645 : 5 : write(std_out,'(" Theta: ",i3,2F15.10)') nth,aim_dtset%themin,aim_dtset%themax
4646 : 5 : write(std_out,'(" Phi: ",i3,2F15.10)') nph,aim_dtset%phimin,aim_dtset%phimax
4647 : :
4648 : 5 : write(untout,'(" Atom: ",i3,3F15.10)') aim_dtset%batom,vv
4649 : 5 : write(untout,'(" Theta: ",i3,2F15.10)') nth,aim_dtset%themin,aim_dtset%themax
4650 : 5 : write(untout,'(" Phi: ",i3,2F15.10)') nph,aim_dtset%phimin,aim_dtset%phimax
4651 : :
4652 : 5 : write(unts,'(i3,3F15.10)') aim_dtset%batom,vv
4653 : 5 : write(unts,'(i3,2F15.10)') nth,aim_dtset%themin,aim_dtset%themax
4654 : 5 : write(unts,'(i3,2F15.10)') nph,aim_dtset%phimin,aim_dtset%phimax
4655 : :
4656 : : !write(std_out,*) 'npmax in surf= ',npmax
4657 : :
4658 : 5 : ith=0
4659 : 5 : iph=0
4660 : : tt0=0._dp
4661 : 5 : call timein(tt0,wall)
4662 : :
4663 : 5 : write(untout,*)
4664 : 5 : write(untout,*) "DEVELOPMENT OF THE RADII DETERMINATIONS"
4665 : 5 : write(untout,*) "========================================"
4666 : 5 : write(untout,*)
4667 : 5 : write(untout,*) "Determination near the CPs:"
4668 : :
4669 : : !Determination of the CP neighbouring radii
4670 : :
4671 [ + - ]: 5 : if (aim_dtset%isurf/=-1) then
4672 : :
4673 : : ! Precomputation of the value of the radii (for parallelisation)
4674 : : ! To make the output independent of the number of processors, but still
4675 : : ! cut down the CPU time, use a multigrid technique
4676 : 5 : srch=.true.
4677 [ - + + - : 20 : ABI_MALLOC(rs_computed,(nth,nph))
- + + - +
- + - - +
- + ]
4678 : 5 : rs(:,:)=zero
4679 [ + + + + ]: 157 : rs_computed(:,:)=zero
4680 : 5 : kk=0 ; init=0
4681 [ + + ]: 25 : do level=3,0,-1
4682 : 20 : incr=2**level
4683 [ + + + + ]: 25 : if(incr<nth .and. incr<nph)then
4684 [ + + + + ]: 376 : rs_computed(:,:)=rs(1:nth,1:nph)
4685 [ + + + + ]: 376 : rs(1:nth,1:nph)=zero
4686 [ - + + + ]: 62 : do ijj=1,nth,incr
4687 [ - + + + ]: 238 : do jj=1,nph,incr
4688 [ + + ]: 226 : if(rs_computed(ijj,jj)<1.0d-12) then
4689 : 130 : kk=kk+1
4690 [ + - ]: 130 : if(mod(kk,nproc)==me)then
4691 : : ! Find an approximate starting radius, from the already computed ones
4692 [ + + ]: 130 : if(init==0)then
4693 : 28 : rthe=r0
4694 : : else
4695 [ + + ]: 102 : ijj_exist=ijj ; if(mod(ijj-1,2*incr)>=incr)ijj_exist=ijj-incr
4696 [ + + ]: 102 : jj_exist=jj ; if(mod(jj-1,2*incr)>=incr)jj_exist=jj-incr
4697 : 102 : rthe=rs_computed(ijj_exist,jj_exist)
4698 [ - + ]: 102 : if(rthe<1.0d-12)then
4699 : 0 : write(std_out,*)' surf : there is a bug ! rthe=',rthe
4700 : 0 : ABI_ERROR("Aborting now")
4701 : : end if
4702 : : end if
4703 : 130 : call timein(t1,wall) ; t2=zero
4704 : 130 : call rsurf(aim_dtset,rr,grho,th(ijj),ph(jj),rthe,aim_dtset%batom,npmax,srch)
4705 : 130 : rs(ijj,jj)=rr
4706 [ - + ]: 130 : if (deb) then
4707 : 0 : call timein(t2,wall) ; t2=t2-t1
4708 : 0 : write(std_out,*) ':CALCULATED NP',ijj,jj,th(ijj),ph(jj),rthe,npmax,rs(ijj,jj),t2
4709 : : end if
4710 : : end if
4711 : : end if
4712 : : end do ! jj
4713 : : end do ! ijj
4714 : 12 : call xmpi_sum(rs,comm,ierr)
4715 : : ! Combine the set of already computed radii and the set of the newly computed, to obtain all computed.
4716 [ + + + + ]: 376 : rs(1:nth,1:nph)=rs(1:nth,1:nph)+rs_computed(:,:)
4717 : : init=1
4718 : : end if
4719 : : end do
4720 [ - + ]: 5 : ABI_FREE(rs_computed)
4721 : :
4722 : 5 : srch=.true.
4723 : :
4724 [ + + ]: 39 : do ijj=1,nbcp
4725 : : ! if ((icpc(ijj) == -1)) then
4726 : 34 : rthe0=vnorm(pc(:,ijj),0)
4727 [ + + ]: 136 : do jj=1,3
4728 : 136 : vr(jj)=pc(jj,ijj)-vv(jj)+xatm(jj,aim_dtset%batom)
4729 : : end do
4730 : 34 : xy=vr(1)*vr(1)+vr(2)*vr(2)
4731 : 34 : xyz=xy+vr(3)*vr(3)
4732 : 34 : xyz=sqrt(xyz)
4733 : :
4734 [ + + ]: 34 : if (xy < aim_xymin) then
4735 : 4 : vcth=1._dp
4736 [ + + ]: 4 : if (vr(3) < 0._dp) vcth=-vcth
4737 : 4 : vph=0._dp
4738 : : else
4739 : 30 : vcth=vr(3)/xyz
4740 : 30 : vph=atan2(vr(2),vr(1))
4741 : : end if
4742 : :
4743 : 34 : vth=acos(vcth)
4744 : 34 : write(untout,'(/," BCP: (index,theta,phi)",I4,2E16.8)') ijj,vth,vph
4745 : :
4746 [ + + ]: 34 : if (vth < th(1)) then
4747 : : ith=0
4748 : : else
4749 [ + + ]: 30 : if (vth > th(nth)) then
4750 : : ith=nth
4751 : : else
4752 [ + - ]: 28 : do ii=2,nth
4753 [ + + ]: 28 : if (vth < th(ii)) then
4754 : 10 : ith=ii-1
4755 : 10 : exit
4756 : : end if
4757 : : end do
4758 : : end if
4759 : : end if
4760 : :
4761 [ + + ]: 34 : if (vph < ph(1)) then
4762 : : iph=0
4763 : : else
4764 [ + + ]: 15 : if (vph > ph(nph)) then
4765 : : iph=nph
4766 : : else
4767 [ + - ]: 8 : do ii=2,nph
4768 [ + + ]: 8 : if (vph < ph(ii)) then
4769 : 4 : iph=ii-1
4770 : 4 : exit
4771 : : end if
4772 : : end do
4773 : : end if
4774 : : end if
4775 : :
4776 : 34 : write(untout,*) "ATOMIC RADII (ith,iph,theta,phi,radius)"
4777 [ + + ]: 175 : do jj=-1,2
4778 [ + + ]: 714 : do kk=-1,2
4779 : 544 : ith2=ith+jj
4780 : 544 : iph2=iph+kk
4781 [ + + + + ]: 544 : stemp=(iph2 > 0).and.(iph2 < nph+1)
4782 [ + + + + ]: 736 : stemp=(stemp.and.((ith2 > 0).and.(ith2 < nth+1)))
4783 : 136 : if (stemp) then
4784 : 192 : theta=th(ith2)
4785 : 192 : phi=ph(iph2)
4786 [ - + ]: 192 : if (abs(rs(ith2,iph2))<1.0d-12) then
4787 : 0 : rthe=rthe0
4788 [ # # ]: 0 : if (deb) write(std_out,*) ':CALCULATING NP',theta,phi,rthe,npmax
4789 : 0 : call timein(t1,wall)
4790 : 0 : call rsurf(aim_dtset,rr,grho,theta,phi,rthe,aim_dtset%batom,npmax,srch)
4791 : 0 : call timein(t2,wall)
4792 : 0 : t2=t2-t1
4793 : 0 : rs(ith2,iph2)=rr
4794 : : end if
4795 : 192 : rr=rs(ith2,iph2)
4796 : : ! write(unts,'(2F12.8,2E16.8)') theta,phi,rr,wcth(ijj)*wph(jj)
4797 : 192 : write(std_out,'(":RSUR PC ",3i3,4E16.8,F10.4)') ijj,jj,kk,theta,phi,rr,wcth(ith2)*wph(iph2),t2
4798 : 192 : write(untout,'(a,2i3,3E16.8)') '- ',jj,kk,theta,phi,rr
4799 : 192 : rthe0=rr
4800 : : end if
4801 : :
4802 : : end do ! kk
4803 : : end do ! jj
4804 : :
4805 : : ! end if
4806 : :
4807 : : end do ! ijj (loop on BCP)
4808 : :
4809 : : ! DEBUG
4810 : : ! write(std_out,*)' surf : near BCP '
4811 : : ! do ijj=1,nth
4812 : : ! do jj=1,nph
4813 : : ! write(std_out,*)ijj,jj,rs(ijj,jj)
4814 : : ! end do
4815 : : ! end do
4816 : : ! ENDDEBUG
4817 : :
4818 : :
4819 : 5 : srch=.true.
4820 [ + + ]: 57 : do ijj=nbcp+1,nbcp+nrcp ! Loop on RCP
4821 : : ! if ((icpc(ijj) == 1)) then
4822 : 52 : rthe0=max(rminl(aim_dtset%batom),r0)
4823 [ + + ]: 208 : do jj=1,3
4824 : 208 : vr(jj)=pc(jj,ijj)-vv(jj)+xatm(jj,aim_dtset%batom)
4825 : : end do
4826 : 52 : xy=vr(1)*vr(1)+vr(2)*vr(2)
4827 : 52 : xyz=xy+vr(3)*vr(3)
4828 : 52 : xyz=sqrt(xyz)
4829 : :
4830 [ - + ]: 52 : if (xy < aim_xymin) then
4831 : 0 : vcth=1._dp
4832 [ # # ]: 0 : if (vr(3) < 0._dp) vcth=-vcth
4833 : 0 : vph=0._dp
4834 : : else
4835 : 52 : vcth=vr(3)/xyz
4836 : 52 : vph=atan2(vr(2),vr(1))
4837 : : end if
4838 : 52 : vth=acos(vcth)
4839 : 52 : write(untout,'(/,";RCP: (index,theta,phi)",I4,2E16.8)') ijj-nbcp,vth,vph
4840 : :
4841 [ + - ]: 52 : if (vth < th(1)) then
4842 : : ith=0
4843 : : else
4844 [ + + ]: 52 : if (vth > th(nth)) then
4845 : : ith=nth
4846 : : else
4847 [ + - ]: 84 : do ii=2,nth
4848 [ + + ]: 84 : if (vth < th(ii)) then
4849 : 28 : ith=ii-1
4850 : 28 : exit
4851 : : end if
4852 : : end do
4853 : : end if
4854 : : end if
4855 : :
4856 [ + + ]: 52 : if (vph < ph(1)) then
4857 : : iph=0
4858 : : else
4859 [ + + ]: 25 : if (vph > ph(nph)) then
4860 : : iph=nph
4861 : : else
4862 [ + - ]: 18 : do ii=2,nph
4863 [ + + ]: 18 : if (vph < ph(ii)) then
4864 : 8 : iph=ii-1
4865 : 8 : exit
4866 : : end if
4867 : : end do
4868 : : end if
4869 : : end if
4870 : :
4871 : 52 : write(untout,*) "ATOMIC RADIUS (ith,iph,theta,phi,radius)"
4872 [ + + ]: 265 : do jj=-1,2
4873 [ + + ]: 1092 : do kk=-1,2
4874 : 832 : ith2=ith+jj
4875 : 832 : iph2=iph+kk
4876 [ + + + + ]: 832 : stemp=(iph2 > 0).and.(iph2 < nph+1)
4877 [ + + + + ]: 1176 : stemp=stemp.and.(ith2 > 0).and.(ith2 < nth+1)
4878 : :
4879 : 208 : if (stemp) then
4880 : 344 : theta=th(ith2)
4881 : 344 : phi=ph(iph2)
4882 [ - + ]: 344 : if ((abs(rs(ith2,iph2))<1.0d-12)) then
4883 : 0 : rthe=rthe0
4884 [ # # ]: 0 : if (deb) write(std_out,*) ':CALCULATING NP',theta,phi,rthe,npmax
4885 : 0 : call timein(t1,wall)
4886 : 0 : call rsurf(aim_dtset,rr,grho,theta,phi,rthe,aim_dtset%batom,npmax,srch)
4887 : 0 : call timein(t2,wall)
4888 : 0 : t2=t2-t1
4889 : 0 : rs(ith2,iph2)=rr
4890 : : end if
4891 : 344 : rr=rs(ith2,iph2)
4892 : : ! write(unts,'(2F12.8,2E16.8)') theta,phi,rr,wcth(ijj)*wph(jj)
4893 : 344 : write(std_out,'(":RSUR PC ",3i3,4E16.8,F10.4)') ijj,jj,kk,theta,phi,rr,wcth(ith2)*wph(iph2),t2
4894 : 344 : write(untout,'(a,2i3,3E16.8)') '- ',jj,kk,theta,phi,rr
4895 : 344 : rthe0=rr
4896 : : end if
4897 : :
4898 : : end do ! kk
4899 : : end do ! jj
4900 : : ! end if
4901 : :
4902 : : end do ! ijj (Loop on RCP)
4903 : :
4904 : : ! DEBUG
4905 : : ! write(std_out,*)' surf : near RCP '
4906 : : ! do ijj=1,nth
4907 : : ! do jj=1,nph
4908 : : ! write(std_out,*)ijj,jj,rs(ijj,jj)
4909 : : ! end do
4910 : : ! end do
4911 : : ! ENDDEBUG
4912 : :
4913 : : ! Boundary angles
4914 : 5 : rthe0=r0
4915 : 5 : srch=.true.
4916 : 5 : write(untout,*)
4917 : 5 : write(untout,*) "The boundary angles:"
4918 : 5 : write(untout,*) "===================="
4919 : 5 : write(untout,*) "ATOMIC RADIUS (ith,iph,theta,phi,radius)"
4920 : :
4921 : : ! Must have sufficient angular sampling
4922 [ - + - - ]: 5 : if ((nth > 8).and.(nph > 8)) then
4923 : 0 : rthe=r0
4924 [ # # ]: 0 : do ijj=1,2
4925 : 0 : theta=th(ijj)
4926 [ # # ]: 0 : if (ijj==2) rthe=rs(1,1)
4927 [ # # ]: 0 : do jj=1,nph
4928 : 0 : phi=ph(jj)
4929 : 0 : call timein(t1,wall)
4930 [ # # ]: 0 : if (abs(rs(ijj,jj))<1.0d-12) then
4931 [ # # ]: 0 : if (deb) write(std_out,*) ':CALC NP',theta,phi,rthe,npmax
4932 : 0 : call rsurf(aim_dtset,rr,grho,theta,phi,rthe,aim_dtset%batom,npmax,srch)
4933 : 0 : rs(ijj,jj)=rr
4934 : : end if
4935 : 0 : rr=rs(ijj,jj)
4936 : 0 : call timein(t2,wall)
4937 : 0 : t2=t2-t1
4938 : 0 : write(std_out,'(":RSUR ",2F12.8,2E16.8,F10.4)') theta,phi,rr,wcth(ijj)*wph(jj),t2
4939 : 0 : write(untout,'(a,2i3,3E16.8)') '- ',ijj,jj,theta,phi,rr
4940 : 0 : rthe=rs(ijj,jj)
4941 : : end do ! jj
4942 : : end do ! ijj
4943 : :
4944 : 0 : write(untout,*)
4945 : :
4946 : 0 : rthe=rs(2,1)
4947 [ # # ]: 0 : do jj=1,2
4948 : 0 : phi=ph(jj)
4949 [ # # ]: 0 : if (jj==2) rthe=rs(2,2)
4950 [ # # ]: 0 : do ijj=3,nth
4951 : 0 : theta=th(ijj)
4952 : 0 : t2=0.0
4953 : 0 : call timein(t1,wall)
4954 [ # # ]: 0 : if (abs(rs(ijj,jj))<1.0d-12) then
4955 [ # # ]: 0 : if (deb) write(std_out,*) ':CALC NP',theta,phi,rthe,npmax
4956 : 0 : call rsurf(aim_dtset,rr,grho,theta,phi,rthe,aim_dtset%batom,npmax,srch)
4957 : 0 : rs(ijj,jj)=rr
4958 : : end if
4959 : 0 : rr=rs(ijj,jj)
4960 : 0 : call timein(t2,wall)
4961 : 0 : t2=t2-t1
4962 : 0 : write(std_out,'(":RSUR ",2F12.8,2E16.8,F10.4)') theta,phi,rr,wcth(ijj)*wph(jj),t2
4963 : 0 : write(untout,'(2i3,3E16.8)') ijj,jj,theta,phi,rr
4964 : 0 : rthe=rs(ijj,jj)
4965 : : end do ! ijj
4966 : : end do ! jj
4967 : :
4968 : 0 : write(untout,*)
4969 : :
4970 : 0 : rthe=rs(nth-1,2)
4971 [ # # ]: 0 : do ijj=nth-1,nth
4972 : 0 : theta=th(ijj)
4973 [ # # ]: 0 : if (ijj==nth) rthe=rs(nth,2)
4974 [ # # ]: 0 : do jj=3,nph
4975 : 0 : phi=ph(jj)
4976 : 0 : call timein(t1,wall)
4977 [ # # ]: 0 : if (abs(rs(ijj,jj))<1.0d-12) then
4978 [ # # ]: 0 : if (deb) write(std_out,*) ':CALC NP',theta,phi,rthe,npmax
4979 : 0 : call rsurf(aim_dtset,rr,grho,theta,phi,rthe,aim_dtset%batom,npmax,srch)
4980 : 0 : rs(ijj,jj)=rr
4981 : : end if
4982 : 0 : rr=rs(ijj,jj)
4983 : 0 : call timein(t2,wall)
4984 : 0 : t2=t2-t1
4985 : 0 : write(std_out,'(":RSUR ",2F12.8,2E16.8,F10.4)') theta,phi,rr,wcth(ijj)*wph(jj),t2
4986 : 0 : write(untout,'(2i3,3E16.8)') ijj,jj,theta,phi,rr
4987 : 0 : rthe=rs(ijj,jj)
4988 : : end do ! jj
4989 : : end do ! ijj
4990 : :
4991 : 0 : rthe=rs(2,nph-1)
4992 [ # # ]: 0 : do jj=nph-1,nph
4993 : 0 : phi=ph(jj)
4994 [ # # ]: 0 : if (jj==nph) rthe=rs(2,nph)
4995 [ # # ]: 0 : do ijj=3,nth-2
4996 : 0 : theta=th(ijj)
4997 : 0 : t2=0.0
4998 : 0 : call timein(t1,wall)
4999 [ # # ]: 0 : if (abs(rs(ijj,jj))<1.0d-12) then
5000 [ # # ]: 0 : if (deb) write(std_out,*) ':CALC NP',theta,phi,rthe,npmax
5001 : 0 : call rsurf(aim_dtset,rr,grho,theta,phi,rthe,aim_dtset%batom,npmax,srch)
5002 : 0 : rs(ijj,jj)=rr
5003 : : end if
5004 : 0 : rr=rs(ijj,jj)
5005 : 0 : call timein(t2,wall)
5006 : 0 : t2=t2-t1
5007 : 0 : write(std_out,'(":RSUR ",2F12.8,2E16.8,F10.4)') theta,phi,rr,wcth(ijj)*wph(jj),t2
5008 : 0 : write(untout,'(2i3,3E16.8)') ijj,jj,theta,phi,rr
5009 : 0 : rthe=rs(ijj,jj)
5010 : : end do ! ijj
5011 : : end do ! jj
5012 : 0 : write(untout,*)
5013 : :
5014 : : ! Complementary bands for boundary angles
5015 : 0 : nn=int(real(nth)/1.4d1)
5016 [ # # ]: 0 : if (nn > 1) then
5017 [ # # ]: 0 : do ii=1,nn-1
5018 : 0 : mm=int(nth/nn)*ii
5019 [ # # ]: 0 : do kk=0,1
5020 : 0 : mm=mm+kk
5021 : 0 : theta=th(mm)
5022 : 0 : rthe=rs(mm,2)
5023 [ # # ]: 0 : do jj=3,nph-2
5024 : 0 : phi=ph(jj)
5025 : 0 : call timein(t1,wall)
5026 [ # # ]: 0 : if (abs(rs(mm,jj))<1.0d-12) then
5027 [ # # ]: 0 : if (deb) write(std_out,*) ':CALC NP',theta,phi,rthe,npmax
5028 : 0 : call rsurf(aim_dtset,rr,grho,theta,phi,rthe,aim_dtset%batom,npmax,srch)
5029 : 0 : rs(mm,jj)=rr
5030 : : end if
5031 : 0 : rr=rs(mm,jj)
5032 : 0 : call timein(t2,wall)
5033 : 0 : t2=t2-t1
5034 : 0 : write(std_out,'(":RSUR ",2F12.8,2E16.8,F10.4)') theta,phi,rr,wcth(mm)*wph(jj),t2
5035 : 0 : write(untout,'(2i3,3E16.8)') mm,jj,theta,phi,rr
5036 : 0 : rthe=rs(mm,jj)
5037 : : end do ! jj
5038 : : end do ! kk
5039 : : end do ! ii
5040 : : end if ! nn>1
5041 : :
5042 : 0 : write(untout,*)
5043 : :
5044 : 0 : nn=nint(real(nph)/1.2d1)
5045 [ # # ]: 0 : if (nn > 1) then
5046 [ # # ]: 0 : do ii=1,nn-1
5047 : 0 : mm=int(nph/nn)*ii
5048 [ # # ]: 0 : do kk=0,1
5049 : 0 : mm=mm+kk
5050 : 0 : phi=ph(mm)
5051 : 0 : rthe=rs(2,mm)
5052 : :
5053 [ # # ]: 0 : do jj=3,nth-2
5054 : 0 : theta=th(jj)
5055 : 0 : call timein(t1,wall)
5056 [ # # ]: 0 : if (abs(rs(jj,mm))<1.0d-12) then
5057 [ # # ]: 0 : if (deb) write(std_out,*) ':CALC NP',theta,phi,rthe,npmax
5058 : 0 : call rsurf(aim_dtset,rr,grho,theta,phi,rthe,aim_dtset%batom,npmax,srch)
5059 : 0 : rs(jj,mm)=rr
5060 : : end if
5061 : 0 : rr=rs(mm,jj)
5062 : 0 : call timein(t2,wall)
5063 : 0 : t2=t2-t1
5064 : 0 : write(std_out,'(":RSUR ",2F12.8,2E16.8,F10.4)') theta,phi,rr,wcth(jj)*wph(mm),t2
5065 : 0 : write(untout,'(2i3,3E16.8)') jj,mm,theta,phi,rr
5066 : 0 : rthe=rs(jj,mm)
5067 : : end do ! jj
5068 : :
5069 : : end do ! kk
5070 : : end do ! ii
5071 : : end if ! nn>1
5072 : :
5073 : : end if ! sufficient sampling to determine boundary angles
5074 : :
5075 : 5 : write(untout,*)
5076 : :
5077 : : ! DEBUG
5078 : : ! write(std_out,*)' surf : after boundary angles '
5079 : : ! do ijj=1,nth
5080 : : ! do jj=1,nph
5081 : : ! write(std_out,*)ijj,jj,rs(ijj,jj)
5082 : : ! end do
5083 : : ! end do
5084 : : ! ENDDEBUG
5085 : :
5086 : : ! Output the complete Bader surface
5087 : :
5088 : 5 : write(untout,*) "The complete Bader surface:"
5089 : 5 : write(untout,*) "==========================="
5090 : 5 : write(untout,*) "ATOMIC RADIUS (ith,iph,theta,phi,radius)"
5091 : 5 : rthe0=r0
5092 : 5 : srch=.true.
5093 : :
5094 : : ! Write all the values
5095 : :
5096 [ + + ]: 35 : do ijj=1,nth
5097 : 30 : theta=th(ijj)
5098 [ + + ]: 165 : do jj=1,nph
5099 : 130 : phi=ph(jj)
5100 : 130 : rr=rs(ijj,jj)
5101 : 130 : write(unts,'(2F12.8,2E16.8)') theta,phi,rr,wcth(ijj)*wph(jj)
5102 : 130 : write(std_out,'(":RSUR ",2F12.8,2E16.8,F10.4)') theta,phi,rr,wcth(ijj)*wph(jj),t2
5103 : 130 : write(untout,'(a,2i3,3E16.8)') ' ',ijj,jj,theta,phi,rr
5104 [ + + ]: 130 : if (rr < rsmin) rsmin=rr
5105 [ + + ]: 160 : if (rr> rsmax) rsmax=rr
5106 : : end do ! jj
5107 : : end do ! ijj
5108 : 5 : write(unts,'(2F15.10)') rsmin,rsmax
5109 : 5 : write(untout,'(/," The minimal and maximal radii:",/,/," ",2F15.10)') rsmin,rsmax
5110 : :
5111 : : ! DEBUG
5112 : : ! write(std_out,*)' surf : final output '
5113 : : ! do ijj=1,nth
5114 : : ! do jj=1,nph
5115 : : ! write(std_out,*)ijj,jj,rs(ijj,jj)
5116 : : ! end do
5117 : : ! end do
5118 : : ! ENDDEBUG
5119 : :
5120 : : end if ! determination of the critical surface
5121 : :
5122 : 5 : call timein(ttsrf,wall)
5123 : 5 : ttsrf=ttsrf-tt0
5124 : :
5125 : 5 : end subroutine surf
5126 : : !!***
5127 : :
5128 : : !!****f* m_bader/vgh_rho
5129 : : !! NAME
5130 : : !! vgh_rho
5131 : : !!
5132 : : !! FUNCTION
5133 : : !! The general procedure to obtain the value, the gradient and the hessian
5134 : : !! of the density of electrons in the point vv (in cart.coord).
5135 : : !!
5136 : : !! WARNING
5137 : : !! This file does not follow the ABINIT coding rules (yet)
5138 : : !!
5139 : : !! INPUTS
5140 : : !! vv(3)=position
5141 : : !! chs 1 only valence density
5142 : : !! 2 only core density
5143 : : !! 0 total density
5144 : : !! -2 iat, ipos are nulify and ignored
5145 : : !! -1 iat,ipos = index of atom if vv is inside
5146 : : !! the "core sphere (rminl)", 0 otherwise
5147 : : !!
5148 : : !! OUTPUT
5149 : : !! rho,grho(3),hrho(3,3) - density, gradient of density, hessian of density
5150 : : !! (cart. coord)
5151 : : !! iat, ipos - index of the nearest atom (except chs < 0 see above)
5152 : : !! rdmin - the distance to the nearest atom
5153 : : !!
5154 : : !! SIDE EFFECTS
5155 : : !! This routine also works on the data contained in the defs_aimprom and defs_aimfields modules
5156 : : !!
5157 : : !! SOURCE
5158 : :
5159 : 3837661 : subroutine vgh_rho(vv,rho,grho,hrho,rdmin,iat,ipos,chs)
5160 : :
5161 : : !Arguments ------------------------------------
5162 : : !scalars
5163 : : integer,intent(in) :: chs
5164 : : integer,intent(inout) :: iat,ipos
5165 : : real(dp),intent(out) :: rdmin,rho
5166 : : !arrays
5167 : : real(dp),intent(in) :: vv(3)
5168 : : real(dp),intent(out) :: grho(3),hrho(3,3)
5169 : :
5170 : : !Local variables ------------------------------
5171 : : !scalars
5172 : : integer :: ii,inmax,inmin,inx,jj,kk,ll,nn,oii,omm,onn
5173 : : integer :: selct
5174 : : ! real(dp),save :: cumul_cpu=0.0_dp,cumul_cpu_old=0.0_dp
5175 : : real(dp),save :: tcpui,tcpuo,twalli
5176 : : real(dp),save :: twallo
5177 : : real(dp) :: aa,bb,cc,cgrad1_rr_inv,coeff,dd,rr,rr2,rr_inv
5178 : : real(dp) :: rrad2_nn,rrad_nn,ss,uu,uu_inv,val,vt1,vt2,vt3,vw1,vw2
5179 : : ! real(dp) :: ss_inv
5180 : : real(dp) :: vw3
5181 : : !arrays
5182 : : integer :: indx(3),inii(4,3)
5183 : : real(dp) :: cgrad(3),ches(3,3),cof(2,3),ddstar(6),ddu(2),grd(4)
5184 : : real(dp) :: hh(4,2),hrh(2),lder(4),pom2sq(2,3),pomsq(2,3)
5185 : : real(dp) :: rhstar(6),sqder(6,4),sqvlr(6,4),trsf(3,3),xx(3)
5186 : 3837661 : real(dp),pointer :: ptddx(:,:,:),ptddy(:,:,:),ptddz(:,:,:),ptrho(:,:,:)
5187 : :
5188 : : !************************************************************************
5189 : 3837661 : tcpui=0.0_dp
5190 : 3837661 : tcpuo=0.0_dp
5191 : 3837661 : twalli=0.0_dp
5192 : 3837661 : twallo=0.0_dp
5193 : :
5194 : 3837661 : nullify(ptddx,ptddy,ptddz,ptrho)
5195 : :
5196 : 3837661 : selct=chs
5197 : :
5198 : 3837661 : if (selct/=2) then
5199 : :
5200 : : ! call timein(tcpui,twalli)
5201 : :
5202 : : ! TRANSFORMATION TO THE REDUCED COORD.
5203 : :
5204 : 3837661 : xx(:)=vv(:)
5205 : 3837661 : call bschg1(xx,-1)
5206 : :
5207 : : ! call timein(tcpuo,twallo)
5208 : : ! cumul_cpu=cumul_cpu+(tcpuo-tcpui)
5209 : :
5210 : : ! REDUCTION TO THE PRIMITIVE CELL
5211 : :
5212 [ + + ]: 15350644 : do ii=1,3
5213 [ + + ]: 15350644 : if (xx(ii) >= one-tol12 ) then
5214 : 472338 : xx(ii)=xx(ii)-aint(xx(ii))
5215 [ + + ]: 11040645 : elseif (xx(ii) < -tol12 ) then
5216 [ + - ]: 1506735 : xx(ii)=xx(ii)-floor(xx(ii))
5217 : : end if
5218 : : end do
5219 : :
5220 : :
5221 : : ! DETERMINATION OF THE INDEX IN THE GRID
5222 : :
5223 [ + + ]: 15350644 : do ii=1,3
5224 : 11512983 : indx(ii)=aint(xx(ii)*ngfft(ii))
5225 : 11512983 : bb=(xx(ii)-indx(ii)*dix(ii))*ngfft(ii)
5226 [ - + ]: 11512983 : if (indx(ii)==ngfft(ii)) then
5227 : 0 : indx(ii)=1
5228 : 0 : xx(ii)=0._dp
5229 : : else
5230 : 11512983 : indx(ii)=indx(ii)+1
5231 : : end if
5232 : :
5233 : : ! Explicit handling to avoid numeric problems
5234 : :
5235 [ - + ]: 15350644 : if (bb > 1._dp+tol12 ) then
5236 : 0 : cof(1,ii)=0._dp
5237 : 0 : cof(2,ii)=1._dp
5238 [ + + ]: 11512983 : elseif (bb < -tol12 ) then
5239 : 222 : cof(1,ii)=1._dp
5240 : 222 : cof(2,ii)=0._dp
5241 : : else
5242 : 11512761 : cof(1,ii)=1._dp-bb
5243 : 11512761 : cof(2,ii)=bb
5244 : : end if
5245 : : end do
5246 : :
5247 : : ! 3D INTERPOLATION OF THE VALENCE DENSITY
5248 : :
5249 : : ! determination of the values of density and of its second derivative
5250 : : ! at the "star" = constructed at vv with primitive directions
5251 : : ! To interpolation the values at the faces of the grid cell are needed
5252 : :
5253 : 3837661 : rhstar(:)=0._dp
5254 : 3837661 : sqder(:,:)=0._dp
5255 : 3837661 : sqvlr(:,:)=0._dp
5256 : 3837661 : ddstar(:)=0._dp
5257 : 3837661 : pomsq(:,:)=0._dp
5258 : 3837661 : pom2sq(:,:)=0._dp
5259 : :
5260 : 3837661 : oii=1; onn=1; omm=1
5261 [ + + ]: 3837661 : if (indx(1)==ngfft(1)) oii=1-ngfft(1)
5262 [ + + ]: 3837661 : if (indx(2)==ngfft(2)) onn=1-ngfft(2)
5263 [ + + ]: 3837661 : if (indx(3)==ngfft(3)) omm=1-ngfft(3)
5264 : :
5265 : : ! the values in the corners of the grid cell
5266 : :
5267 : 3837661 : ptddx=>ddx(indx(1):indx(1)+oii:oii,indx(2):indx(2)+onn:onn,indx(3):indx(3)+omm:omm)
5268 : 3837661 : ptddy=>ddy(indx(1):indx(1)+oii:oii,indx(2):indx(2)+onn:onn,indx(3):indx(3)+omm:omm)
5269 : 3837661 : ptddz=>ddz(indx(1):indx(1)+oii:oii,indx(2):indx(2)+onn:onn,indx(3):indx(3)+omm:omm)
5270 : 3837661 : ptrho=>dvl(indx(1):indx(1)+oii:oii,indx(2):indx(2)+onn:onn,indx(3):indx(3)+omm:omm)
5271 : :
5272 : : ! the coefficients for spline interpolation of density and its derivation
5273 [ + + ]: 15350644 : do ii=1,3
5274 [ + + ]: 38376610 : do jj=1,2
5275 : 23025966 : pomsq(jj,ii)=(cof(jj,ii)*cof(jj,ii)*cof(jj,ii)-cof(jj,ii))/6._dp*dix(ii)*dix(ii)
5276 : 23025966 : pom2sq(jj,ii)=(3._dp*cof(jj,ii)*cof(jj,ii)-1._dp)/6._dp*dix(ii)
5277 [ + + ]: 34538949 : if (jj==1) pom2sq(jj,ii)=-pom2sq(jj,ii)
5278 : : end do
5279 : : end do
5280 : :
5281 : :
5282 [ + + ]: 11512983 : do ii=1,2
5283 [ + + ]: 26863627 : do jj=1,2
5284 [ + + ]: 53727254 : do kk=1,2
5285 : 30701288 : ddstar(ii)=ddstar(ii)+cof(jj,2)*cof(kk,3)*ptddx(ii,jj,kk)
5286 : 30701288 : ddstar(ii+2)=ddstar(ii+2)+cof(jj,3)*cof(kk,1)*ptddy(kk,ii,jj)
5287 : 30701288 : ddstar(ii+4)=ddstar(ii+4)+cof(jj,1)*cof(kk,2)*ptddz(jj,kk,ii)
5288 : 30701288 : sqder(ii,jj)=sqder(ii,jj)+cof(kk,2)*ptddz(ii,kk,jj)
5289 : 30701288 : sqder(ii,jj+2)=sqder(ii,jj+2)+cof(kk,3)*ptddy(ii,jj,kk)
5290 : 30701288 : sqder(ii+2,jj)=sqder(ii+2,jj)+cof(kk,3)*ptddx(jj,ii,kk)
5291 : 30701288 : sqder(ii+2,jj+2)=sqder(ii+2,jj+2)+cof(kk,1)*ptddz(kk,ii,jj)
5292 : 30701288 : sqder(ii+4,jj)=sqder(ii+4,jj)+cof(kk,1)*ptddy(kk,jj,ii)
5293 : 30701288 : sqder(ii+4,jj+2)=sqder(ii+4,jj+2)+cof(kk,2)*ptddx(jj,kk,ii)
5294 : 30701288 : sqvlr(ii,jj)=sqvlr(ii,jj)+cof(kk,2)*ptrho(ii,kk,jj)+pomsq(kk,2)*ptddy(ii,kk,jj)
5295 : 30701288 : sqvlr(ii,jj+2)=sqvlr(ii,jj+2)+cof(kk,3)*ptrho(ii,jj,kk)+pomsq(kk,3)*ptddz(ii,jj,kk)
5296 : 46051932 : sqvlr(ii+2,jj+2)=sqvlr(ii+2,jj+2)+cof(kk,1)*ptrho(kk,ii,jj)+pomsq(kk,1)*ptddx(kk,ii,jj)
5297 : : end do
5298 : : end do
5299 : : end do
5300 : :
5301 [ + + ]: 11512983 : do ii=1,2
5302 [ + + ]: 26863627 : do jj=1,2
5303 : 15350644 : sqvlr(ii+2,jj)=sqvlr(jj,ii+2)
5304 : 15350644 : sqvlr(ii+4,jj)=sqvlr(jj+2,ii+2)
5305 : 23025966 : sqvlr(ii+4,jj+2)=sqvlr(jj,ii)
5306 : : end do
5307 : : end do
5308 : :
5309 [ + + ]: 11512983 : do ii=1,2
5310 [ + + ]: 26863627 : do jj=1,2
5311 : : rhstar(ii)=rhstar(ii)+cof(jj,3)*sqvlr(ii,jj)+pomsq(jj,3)*sqder(ii,jj)+&
5312 : 15350644 : & cof(jj,2)*sqvlr(ii,jj+2)+pomsq(jj,2)*sqder(ii,jj+2)
5313 : : rhstar(ii+2)=rhstar(ii+2)+cof(jj,1)*sqvlr(ii+2,jj)+pomsq(jj,1)*sqder(ii+2,jj)+&
5314 : 15350644 : & cof(jj,3)*sqvlr(ii+2,jj+2)+pomsq(jj,3)*sqder(ii+2,jj+2)
5315 : : rhstar(ii+4)=rhstar(ii+4)+cof(jj,2)*sqvlr(ii+4,jj)+pomsq(jj,2)*sqder(ii+4,jj)+&
5316 : 23025966 : & cof(jj,1)*sqvlr(ii+4,jj+2)+pomsq(jj,1)*sqder(ii+4,jj+2)
5317 : : end do
5318 : : end do
5319 [ + + ]: 26863627 : rhstar(:)=rhstar(:)/2._dp
5320 : :
5321 : 3837661 : rho=0._dp
5322 : 3837661 : grho(:)=0._dp
5323 : 3837661 : hrho(:,:)=0._dp
5324 : 3837661 : kk=1; nn=1
5325 : 3837661 : do ii=1,5,2
5326 [ + + ]: 34538949 : do jj=1,2
5327 : 23025966 : nn=-nn
5328 : 23025966 : rho=rho+cof(jj,kk)*rhstar(ii+jj-1)+pomsq(jj,kk)*ddstar(ii+jj-1)
5329 : 23025966 : grho(kk)=grho(kk)+pom2sq(jj,kk)*ddstar(ii+jj-1)
5330 : 23025966 : hrho(kk,kk)=hrho(kk,kk)+cof(jj,kk)*ddstar(ii+jj-1)
5331 : 34538949 : grho(kk)=grho(kk)+nn*rhstar(ii+jj-1)/dix(kk)
5332 : : end do
5333 [ + + ]: 11512983 : kk=kk+1
5334 : : end do
5335 : 3837661 : rho=rho/3._dp
5336 : :
5337 : : ! Off-diagonal elements of the hessian
5338 : :
5339 : : ! for the speed reasons the polynomial interpolation
5340 : : ! for second derivation fields is used in this case
5341 : : ! but the last step is always done by spline interpolation.
5342 : :
5343 : :
5344 [ + + ]: 15350644 : do ii=1,3
5345 [ + + ]: 61402576 : do jj=-1,2
5346 : 46051932 : inii(jj+2,ii)=indx(ii)+jj
5347 [ + + ]: 46051932 : if (inii(jj+2,ii) < 1) inii(jj+2,ii)=inii(jj+2,ii)+ngfft(ii)
5348 [ + + ]: 57564915 : if (inii(jj+2,ii) > ngfft(ii)) inii(jj+2,ii)=inii(jj+2,ii)-ngfft(ii)
5349 : : end do
5350 : : end do
5351 : :
5352 : : ! Not very nice
5353 : :
5354 [ + + ]: 15350644 : do ii=1,3
5355 : : select case (ii)
5356 : : case (1)
5357 [ + + ]: 19188305 : do jj=1,4
5358 : 15350644 : ddu(1)=cof(1,2)*ddz(inii(jj,1),inii(2,2),inii(2,3))+cof(2,2)*ddz(inii(jj,1),inii(3,2),inii(2,3))
5359 : 15350644 : ddu(2)=cof(1,2)*ddz(inii(jj,1),inii(2,2),inii(3,3))+cof(2,2)*ddz(inii(jj,1),inii(3,2),inii(3,3))
5360 : : hrh(1)=cof(1,2)*dvl(inii(jj,1),inii(2,2),inii(2,3))+cof(2,2)*dvl(inii(jj,1),inii(3,2),inii(2,3))+&
5361 : 15350644 : & pomsq(1,2)*ddy(inii(jj,1),inii(2,2),inii(2,3))+pomsq(2,2)*ddy(inii(jj,1),inii(3,2),inii(2,3))
5362 : : hrh(2)=cof(1,2)*dvl(inii(jj,1),inii(2,2),inii(3,3))+cof(2,2)*dvl(inii(jj,1),inii(3,2),inii(3,3))+&
5363 : 15350644 : & pomsq(1,2)*ddy(inii(jj,1),inii(2,2),inii(3,3))+pomsq(2,2)*ddy(inii(jj,1),inii(3,2),inii(3,3))
5364 : 15350644 : hh(jj,2)=(hrh(2)-hrh(1))/dix(3)+pom2sq(1,3)*ddu(1)+pom2sq(2,3)*ddu(2)
5365 : :
5366 : 15350644 : ddu(1)=cof(1,3)*ddy(inii(jj,1),inii(2,2),inii(2,3))+cof(2,3)*ddy(inii(jj,1),inii(2,2),inii(3,3))
5367 : 15350644 : ddu(2)=cof(1,3)*ddy(inii(jj,1),inii(3,2),inii(2,3))+cof(2,3)*ddy(inii(jj,1),inii(3,2),inii(3,3))
5368 : : hrh(1)=cof(1,3)*dvl(inii(jj,1),inii(2,2),inii(2,3))+cof(2,3)*dvl(inii(jj,1),inii(2,2),inii(3,3))+&
5369 : 15350644 : & pomsq(1,3)*ddz(inii(jj,1),inii(2,2),inii(2,3))+pomsq(2,3)*ddz(inii(jj,1),inii(2,2),inii(3,3))
5370 : : hrh(2)=cof(1,3)*dvl(inii(jj,1),inii(3,2),inii(2,3))+cof(2,3)*dvl(inii(jj,1),inii(3,2),inii(3,3))+&
5371 : 15350644 : & pomsq(1,3)*ddz(inii(jj,1),inii(3,2),inii(2,3))+pomsq(2,3)*ddz(inii(jj,1),inii(3,2),inii(3,3))
5372 : 19188305 : hh(jj,1)=(hrh(2)-hrh(1))/dix(2)+pom2sq(1,2)*ddu(1)+pom2sq(2,2)*ddu(2)
5373 : : end do
5374 : : case (2)
5375 [ + + ]: 19188305 : do jj=1,4
5376 : 15350644 : ddu(1)=cof(1,3)*ddx(inii(2,1),inii(jj,2),inii(2,3))+cof(2,3)*ddx(inii(2,1),inii(jj,2),inii(3,3))
5377 : 15350644 : ddu(2)=cof(1,3)*ddx(inii(3,1),inii(jj,2),inii(2,3))+cof(2,3)*ddx(inii(3,1),inii(jj,2),inii(3,3))
5378 : : hrh(1)=cof(1,3)*dvl(inii(2,1),inii(jj,2),inii(2,3))+cof(2,3)*dvl(inii(2,1),inii(jj,2),inii(3,3))+&
5379 : 15350644 : & pomsq(1,3)*ddz(inii(2,1),inii(jj,2),inii(2,3))+pomsq(2,3)*ddz(inii(2,1),inii(jj,2),inii(3,3))
5380 : : hrh(2)=cof(1,3)*dvl(inii(3,1),inii(jj,2),inii(2,3))+cof(2,3)*dvl(inii(3,1),inii(jj,2),inii(3,3))+&
5381 : 15350644 : & pomsq(1,3)*ddz(inii(3,1),inii(jj,2),inii(2,3))+pomsq(2,3)*ddz(inii(3,1),inii(jj,2),inii(3,3))
5382 : 15350644 : hh(jj,2)=(hrh(2)-hrh(1))/dix(1)+pom2sq(1,1)*ddu(1)+pom2sq(2,1)*ddu(2)
5383 : :
5384 : 15350644 : ddu(1)=cof(1,1)*ddz(inii(2,1),inii(jj,2),inii(2,3))+cof(2,1)*ddz(inii(3,1),inii(jj,2),inii(2,3))
5385 : 15350644 : ddu(2)=cof(1,1)*ddz(inii(2,1),inii(jj,2),inii(3,3))+cof(2,1)*ddz(inii(3,1),inii(jj,2),inii(3,3))
5386 : : hrh(1)=cof(1,1)*dvl(inii(2,1),inii(jj,2),inii(2,3))+cof(2,1)*dvl(inii(3,1),inii(jj,2),inii(2,3))+&
5387 : 15350644 : & pomsq(1,1)*ddx(inii(2,1),inii(jj,2),inii(2,3))+pomsq(2,1)*ddx(inii(3,1),inii(jj,2),inii(2,3))
5388 : : hrh(2)=cof(1,1)*dvl(inii(2,1),inii(jj,2),inii(3,3))+cof(2,1)*dvl(inii(3,1),inii(jj,2),inii(3,3))+&
5389 : 15350644 : & pomsq(1,1)*ddx(inii(2,1),inii(jj,2),inii(3,3))+pomsq(2,1)*ddx(inii(3,1),inii(jj,2),inii(3,3))
5390 : 19188305 : hh(jj,1)=(hrh(2)-hrh(1))/dix(3)+pom2sq(1,3)*ddu(1)+pom2sq(2,3)*ddu(2)
5391 : : end do
5392 : : case (3)
5393 [ + + + + : 26863627 : do jj=1,4
+ ]
5394 : 15350644 : ddu(1)=cof(1,1)*ddy(inii(2,1),inii(2,2),inii(jj,3))+cof(2,1)*ddy(inii(3,1),inii(2,2),inii(jj,3))
5395 : 15350644 : ddu(2)=cof(1,1)*ddy(inii(2,1),inii(3,2),inii(jj,3))+cof(2,1)*ddy(inii(3,1),inii(3,2),inii(jj,3))
5396 : : hrh(1)=cof(1,1)*dvl(inii(2,1),inii(2,2),inii(jj,3))+cof(2,1)*dvl(inii(3,1),inii(2,2),inii(jj,3))+&
5397 : 15350644 : & pomsq(1,1)*ddx(inii(2,1),inii(2,2),inii(jj,3))+pomsq(2,1)*ddx(inii(3,1),inii(2,2),inii(jj,3))
5398 : : hrh(2)=cof(1,1)*dvl(inii(2,1),inii(3,2),inii(jj,3))+cof(2,1)*dvl(inii(3,1),inii(3,2),inii(jj,3))+&
5399 : 15350644 : & pomsq(1,1)*ddx(inii(2,1),inii(3,2),inii(jj,3))+pomsq(2,1)*ddx(inii(3,1),inii(3,2),inii(jj,3))
5400 : 15350644 : hh(jj,2)=(hrh(2)-hrh(1))/dix(2)+pom2sq(1,2)*ddu(1)+pom2sq(2,2)*ddu(2)
5401 : :
5402 : 15350644 : ddu(1)=cof(1,2)*ddx(inii(2,1),inii(2,2),inii(jj,3))+cof(2,2)*ddx(inii(2,1),inii(3,2),inii(jj,3))
5403 : 15350644 : ddu(2)=cof(1,2)*ddx(inii(3,1),inii(2,2),inii(jj,3))+cof(2,2)*ddx(inii(3,1),inii(3,2),inii(jj,3))
5404 : : hrh(1)=cof(1,2)*dvl(inii(2,1),inii(2,2),inii(jj,3))+cof(2,2)*dvl(inii(2,1),inii(3,2),inii(jj,3))+&
5405 : 15350644 : & pomsq(1,2)*ddy(inii(2,1),inii(2,2),inii(jj,3))+pomsq(2,2)*ddy(inii(2,1),inii(3,2),inii(jj,3))
5406 : : hrh(2)=cof(1,2)*dvl(inii(3,1),inii(2,2),inii(jj,3))+cof(2,2)*dvl(inii(3,1),inii(3,2),inii(jj,3))+&
5407 : 15350644 : & pomsq(1,2)*ddy(inii(3,1),inii(2,2),inii(jj,3))+pomsq(2,2)*ddy(inii(3,1),inii(3,2),inii(jj,3))
5408 : 19188305 : hh(jj,1)=(hrh(2)-hrh(1))/dix(1)+pom2sq(1,1)*ddu(1)+pom2sq(2,1)*ddu(2)
5409 : : end do
5410 : : end select
5411 [ + + ]: 57564915 : do jj=-2,1
5412 : 57564915 : grd(jj+3)=(indx(ii)+jj)*dix(ii)
5413 : : end do
5414 : :
5415 : : ! write(std_out,'("hh: ",/,4F16.8,/,4F16.8)') ((hh(kk,jj),kk=1,4),jj=1,2)
5416 : : ! write(std_out,'("grad: ",3F16.8)') (grho(kk),kk=1,3)
5417 : : ! write(std_out,'("dix: ",3F16.8)') (dix(kk),kk=1,3)
5418 : : ! write(std_out,'("grd: ",4F16.8)') (grd(kk),kk=1,4)
5419 : : ! write(std_out,'("inii: ",4I4)') (inii(kk,ii),kk=1,4)
5420 : :
5421 [ + + ]: 38376610 : do jj=1,2
5422 : :
5423 : : ! polynomial interpolation
5424 : :
5425 [ + + ]: 92103864 : do kk=1,3
5426 [ + + ]: 230259660 : do ll=4,kk+1,-1
5427 : 207233694 : hh(ll,jj)=(hh(ll,jj)-hh(ll-1,jj))/(grd(ll)-grd(ll-1))
5428 : : end do
5429 : : end do
5430 : 23025966 : lder(4)=hh(4,jj)
5431 [ + + ]: 92103864 : do kk=3,1,-1
5432 : 92103864 : lder(kk)=hh(kk,jj)+(xx(ii)-grd(kk))*lder(kk+1)
5433 : : end do
5434 [ + + ]: 69077898 : do kk=1,2
5435 [ + + ]: 138155796 : do ll=3,kk+1,-1
5436 : 115129830 : lder(ll)=lder(ll)+(xx(ii)-grd(ll-kk))*lder(ll+1)
5437 : : end do
5438 : : end do
5439 : 23025966 : nn=ii+jj
5440 [ + + ]: 23025966 : if (nn > 3) nn=nn-3
5441 : 23025966 : hrho(ii,nn)=hrho(ii,nn)+lder(2)
5442 : 34538949 : hrho(nn,ii)=hrho(nn,ii)+lder(2)
5443 : : end do
5444 : : end do
5445 : :
5446 : : ! averaging of the mixed derivations obtained in different order
5447 : :
5448 [ + + ]: 15350644 : do ii=1,3
5449 [ + + ]: 49889593 : do jj=1,3
5450 [ + + ]: 46051932 : if (ii /= jj) hrho(ii,jj)=hrho(ii,jj)/2._dp
5451 : : end do
5452 : : end do
5453 : :
5454 : :
5455 : : ! write(std_out,'("xx:",3F16.8)') (xx(ii),ii=1,3)
5456 : : ! write(std_out,'("hrho: ",/,3F16.8,/,3F16.8,/,3F16.8)') &
5457 : : ! & ((hrho(ii,jj),ii=1,3),jj=1,3)
5458 : : ! stop
5459 : : ! write(std_out,'("xx:",3F16.8)') (xx(ii),ii=1,3)
5460 : : ! write(std_out,'(":GRAD pred tr ",3F16.8)') grho
5461 : : ! write(std_out,'(":HESSIAN pred tr",/,3F16.8,/,3F16.8,/,3F16.8)') ((hrho(ii,jj),jj=1,3),ii=1,3)
5462 : :
5463 : :
5464 : : ! Transformation back to Cart. coordonnes
5465 : :
5466 : 3837661 : call bschg1(grho,2)
5467 : 3837661 : call bschg2(hrho,2)
5468 : :
5469 : : ! write(std_out,'("hrho: ",/,3F16.8,/,3F16.8,/,3F16.8)') &
5470 : : ! & ((hrho(ii,jj),ii=1,3),jj=1,3)
5471 : : ! stop
5472 : :
5473 : 3837661 : nullify(ptddx,ptddy,ptddz,ptrho)
5474 : :
5475 [ - + ]: 3837661 : if (selct==1) return
5476 : :
5477 : : end if
5478 : :
5479 : : !write(51,'(":GRADv ",3F16.8)') grho
5480 : : !write(52,'(":LAPv ",F16.8)') hrho(1,1)+hrho(2,2)+hrho(3,3)
5481 : : !write(52,'(":HESNv ",/,3F16.8,/,3F16.8,/,3F16.8)') ((hrho(ii,jj),jj=1,3),ii=1,3)
5482 : :
5483 : : !INTERPOLATION OF THE CORE DENSITY
5484 : :
5485 : : if (selct/=1) then
5486 : :
5487 [ - + ]: 3837661 : if (selct==2) then
5488 : 0 : grho(:)=0._dp
5489 : 0 : hrho(:,:)=0._dp
5490 : 0 : rho=0._dp
5491 : : end if
5492 : :
5493 : : ! SEARCH OF THE NEIGHBOUR ATOMS
5494 : :
5495 [ + + ]: 3837661 : if (selct /= -2) then
5496 : 3831671 : iat=0
5497 : 3831671 : ipos=0
5498 : : end if
5499 : 3837661 : rdmin=20._dp
5500 : :
5501 [ + + ]: 18674195 : do jj=1,natom
5502 : 14836534 : nn=typat(jj)
5503 : 14836534 : rrad_nn=rrad(corlim(nn),nn)
5504 : 14836534 : rrad2_nn=rrad_nn*rrad_nn
5505 : 14836534 : vw1=vv(1)-xatm(1,jj)
5506 : 14836534 : vw2=vv(2)-xatm(2,jj)
5507 : 14836534 : vw3=vv(3)-xatm(3,jj)
5508 : :
5509 [ + + ]: 5107605357 : do kk=1,nnpos
5510 : :
5511 : 5088931162 : vt1=vw1-atp(1,kk)
5512 : 5088931162 : vt2=vw2-atp(2,kk)
5513 : 5088931162 : vt3=vw3-atp(3,kk)
5514 : 5088931162 : rr2=vt1*vt1+vt2*vt2+vt3*vt3
5515 : :
5516 : : ! rr=vnorm(vt,0)
5517 : :
5518 : : ! Only contribution > rhocormin (adhoc.f90) are considered
5519 : :
5520 [ + + + + : 5088931162 : if (rr2 < rrad2_nn .and.(.not.((selct==-2).and.(iat==jj).and.(ipos==kk)))) then
+ + + + ]
5521 : : ! if (rr /= 0.0_dp) then ! XG020629 : never test a real number against zero (not portable)
5522 [ + + ]: 11652540 : if (rr2 > 1.0d-28) then ! SEARCH INDEX
5523 : :
5524 : 11652426 : rr=sqrt(rr2)
5525 : 11652426 : rr_inv=1.0_dp/rr
5526 : :
5527 [ + + ]: 11652426 : if (rr < rrad(1,nn)) then
5528 : : inx=-1
5529 [ + - ]: 11652340 : elseif (rr > rrad(ndat(nn),nn)) then
5530 : : inx=ndat(nn)
5531 : : else
5532 : : ! Find the index of the radius by bissection
5533 : : inmin=1
5534 : : inmax=ndat(nn)
5535 : 114265787 : inx=1
5536 : : do
5537 [ + + ]: 114265787 : if(inmax-inmin==1)exit
5538 : 102613447 : inx=(inmin+inmax)/2
5539 [ + + ]: 114265787 : if(rr>=rrad(inx,nn))then
5540 : : inmin=inx
5541 : : else
5542 : 49962771 : inmax=inx
5543 : : end if
5544 : : end do
5545 : : inx=inmin
5546 : :
5547 : : ! XG020629 : old coding, slower
5548 : : ! inx=0
5549 : : ! do while (rr >= rrad(inx+1,nn))
5550 : : ! inx=inx+1
5551 : : ! end do
5552 : :
5553 : : end if
5554 : :
5555 : : ! Transformation matrix radial -> cart. coord
5556 : 11652426 : ss=sqrt(vt1*vt1+vt2*vt2)
5557 : : ! if (ss /=0._dp) then ! XG020629 : never test a real number against zero (not portable)
5558 [ + + ]: 11652426 : if (ss*ss > 1.0d-28) then ! ss non-zero
5559 : : ! XG020629 : very strange : only trsf(:,1) is needed in what follows ? !
5560 : : ! ss_inv=1.0_dp/ss
5561 : 11651885 : trsf(1,1)=vt1*rr_inv
5562 : : ! trsf(1,2)=-vt2*ss_inv
5563 : : ! trsf(1,3)=vt3*vt1*rr_inv*ss_inv
5564 : 11651885 : trsf(2,1)=vt2*rr_inv
5565 : : ! trsf(2,2)=vt1*ss_inv
5566 : : ! trsf(2,3)=vt3*vt2*rr_inv*ss_inv
5567 : 11651885 : trsf(3,1)=vt3*rr_inv
5568 : : ! trsf(3,2)=0._dp
5569 : : ! trsf(3,3)=-ss*rr_inv
5570 : : ! XG020629 Not needed
5571 : : ! do ii=1,3
5572 : : ! do ll=1,3
5573 : : ! ches(ii,ll)=0._dp
5574 : : ! end do
5575 : : ! cgrad(ii)=0._dp
5576 : : ! end do
5577 : : else ! ss zero
5578 [ + + ]: 2164 : do ii=1,3
5579 [ + + ]: 6492 : do ll=1,3
5580 : 6492 : trsf(ii,ll)=0._dp
5581 : : end do
5582 : 2164 : trsf(ii,4-ii)=1._dp
5583 : : end do
5584 : : end if ! ss zero or non-zero
5585 : :
5586 [ + + ]: 11652426 : if (inx == -1) then ! LEFT EXTRAPOLATION y=a*x^2+b (a<0)
5587 : 86 : val=sp2(1,nn)*0.5_dp*rr*rr/rrad(1,nn)+crho(1,nn)-sp2(1,nn)*rrad(1,nn)*0.5_dp
5588 : 86 : cgrad(1)=sp2(1,nn)*rr/rrad(1,nn)
5589 : 86 : ches(1,1)=sp2(1,nn)/rrad(1,nn)
5590 [ - + ]: 11652340 : elseif (inx == ndat(nn) ) then ! RIGHT EXTRAPOLATION y=a*exp(b*x)
5591 : 0 : val=rrad(ndat(nn),nn)*exp(sp2(ndat(nn),nn)*(rr-rrad(ndat(nn),nn))/crho(ndat(nn),nn))
5592 : 0 : cgrad(1)=val*sp2(ndat(nn),nn)/crho(ndat(nn),nn)
5593 : 0 : ches(1,1)=cgrad(1)*sp2(ndat(nn),nn)/crho(ndat(nn),nn)
5594 : : else ! INTERPOLATION
5595 : 11652340 : uu=rrad(inx+1,nn)-rrad(inx,nn)
5596 : 11652340 : uu_inv=1.0_dp/uu
5597 : 11652340 : aa=(rrad(inx+1,nn)-rr)*uu_inv
5598 : 11652340 : bb=(rr-rrad(inx,nn))*uu_inv
5599 : 11652340 : cc=(aa*aa*aa-aa)*uu*uu*0.16666666666666666_dp
5600 : 11652340 : dd=(bb*bb*bb-bb)*uu*uu*0.16666666666666666_dp
5601 : 11652340 : val=aa*crho(inx,nn)+bb*crho(inx+1,nn)+cc*sp3(inx,nn)+dd*sp3(inx+1,nn)
5602 : : cgrad(1)=(crho(inx+1,nn)-crho(inx,nn))*uu_inv&
5603 : : & -(3._dp*aa*aa-1._dp)*uu*0.16666666666666666_dp*sp3(inx,nn)+&
5604 : 11652340 : & (3._dp*bb*bb-1._dp)*uu*0.16666666666666666_dp*sp3(inx+1,nn)
5605 : 11652340 : ches(1,1)=aa*sp3(inx,nn)+bb*sp3(inx+1,nn)
5606 : :
5607 : : end if ! TRANSFORMATION TO CARTEZ. COORD.
5608 : :
5609 : 11652426 : cgrad1_rr_inv=cgrad(1)*rr_inv
5610 : 11652426 : coeff=(ches(1,1)-cgrad1_rr_inv)*rr_inv*rr_inv
5611 : 11652426 : cgrad(3)=trsf(3,1)*cgrad(1)
5612 : 11652426 : cgrad(2)=trsf(2,1)*cgrad(1)
5613 : 11652426 : cgrad(1)=trsf(1,1)*cgrad(1)
5614 : 11652426 : ches(1,1)=coeff*vt1*vt1+cgrad1_rr_inv
5615 : 11652426 : ches(2,2)=coeff*vt2*vt2+cgrad1_rr_inv
5616 : 11652426 : ches(3,3)=coeff*vt3*vt3+cgrad1_rr_inv
5617 : 11652426 : ches(1,2)=coeff*vt1*vt2 ; ches(2,1)=coeff*vt1*vt2
5618 : 11652426 : ches(1,3)=coeff*vt1*vt3 ; ches(3,1)=coeff*vt1*vt3
5619 : 11652426 : ches(2,3)=coeff*vt2*vt3 ; ches(3,2)=coeff*vt2*vt3
5620 : :
5621 : : else ! case rr==0
5622 : :
5623 : 114 : val=crho(1,nn)-sp2(1,nn)*rrad(1,nn)/2._dp
5624 [ + + ]: 456 : do ii=1,3
5625 [ + + ]: 1368 : do ll=1,3
5626 : 1368 : ches(ii,ll)=0._dp
5627 : : end do
5628 : 342 : cgrad(ii)=0._dp
5629 : 456 : ches(ii,ii)=sp2(1,nn)/rrad(1,nn)
5630 : : end do
5631 : :
5632 : : end if ! rr>0 or rr==0
5633 : :
5634 [ + + ]: 46610160 : do ii=1,3
5635 [ + + ]: 139830480 : do ll=1,3
5636 : 139830480 : hrho(ii,ll)=hrho(ii,ll)+ches(ii,ll)
5637 : : end do
5638 : 46610160 : grho(ii)=grho(ii)+cgrad(ii)
5639 : : end do
5640 : 11652540 : rho=rho+val
5641 : :
5642 : : end if ! rr2< rrad_nn*rrad_nn
5643 : :
5644 [ + + ]: 5103767696 : if (selct==-1) then
5645 [ + + ]: 264538750 : if (rr2 < rminl(jj)*rminl(jj) ) then
5646 : 3114 : iat=jj
5647 : 3114 : ipos=kk
5648 : 3114 : rdmin=sqrt(rr2)
5649 : : end if
5650 [ + + ]: 4824392412 : elseif (selct==-2) then
5651 : : cycle
5652 : : else
5653 [ + + ]: 4819875445 : if (rr2 < rdmin*rdmin) then
5654 : 30825293 : iat=jj
5655 : 30825293 : ipos=kk
5656 : 30825293 : rdmin=sqrt(rr2)
5657 : : end if
5658 : : end if
5659 : :
5660 : : end do
5661 : : end do
5662 : :
5663 : : end if
5664 : :
5665 : : !write(51,'(":GRADt ",3F16.8)') grho
5666 : : !write(52,'(":LAPt ",F16.8)') hrho(1,1)+hrho(2,2)+hrho(3,3)
5667 : : !write(52,'(":HESNt ",/,3F16.8,/,3F16.8,/,3F16.8)') ((hrho(ii,jj),jj=1,3),ii=1,3)
5668 : :
5669 : : !if(abs(cumul_cpu-cumul_cpu_old)>0.499)then
5670 : : !write(std_out,'(a,f7.1)' )' vgh_rho : cumul_cpu=',cumul_cpu
5671 : : !cumul_cpu_old=cumul_cpu
5672 : : !end if
5673 : :
5674 [ + - ]: 3837661 : end subroutine vgh_rho
5675 : : !!***
5676 : :
5677 : : !!****f* m_bader/vnorm
5678 : : !! NAME
5679 : : !! vnorm
5680 : : !!
5681 : : !! FUNCTION
5682 : : !! Default declarations, and interfaces for the aim.f utility.
5683 : : !!
5684 : : !! INPUTS
5685 : : !! vector norm ->dir==1: vector in reduced coordinates
5686 : : !! dir==0: vector in cartes. coordinates
5687 : : !!
5688 : : !! OUTPUT
5689 : : !! (see side effects)
5690 : : !!
5691 : : !! SIDE EFFECTS
5692 : : !! vv = on entry, vector to normalized
5693 : : !! = on exit, normalized vector
5694 : : !!
5695 : : !! SOURCE
5696 : :
5697 : 1026017 : function vnorm(vv,dir)
5698 : :
5699 : : !Arguments ------------------------------------
5700 : : !scalars
5701 : : integer,intent(in) :: dir
5702 : : real(dp) :: vnorm
5703 : : !arrays
5704 : : real(dp),intent(in) :: vv(3)
5705 : :
5706 : : !Local variables-------------------------------
5707 : : !scalars
5708 : : integer :: ii
5709 : : !arrays
5710 : : real(dp) :: vt(3)
5711 : :
5712 : : ! *************************************************************************
5713 : :
5714 : 1026017 : vnorm=zero
5715 [ - + ]: 1026017 : if (dir==1) then
5716 [ # # ]: 0 : do ii=1,3
5717 : 0 : vt(ii)=rprimd(ii,1)*vv(1)+rprimd(ii,2)*vv(2)+rprimd(ii,3)*vv(3)
5718 : 0 : vnorm=vnorm+vt(ii)*vt(ii)
5719 : : end do
5720 [ + - ]: 1026017 : elseif (dir==0) then
5721 [ + + ]: 4104068 : do ii=1,3
5722 : 4104068 : vnorm=vnorm+vv(ii)*vv(ii)
5723 : : end do
5724 : : else
5725 : 0 : ABI_ERROR('vnorm calcul')
5726 : : end if
5727 : 1026017 : vnorm=sqrt(vnorm)
5728 : :
5729 : 1026017 : end function vnorm
5730 : : !!***
5731 : :
5732 : : !!****f* m_bader/vec_prod
5733 : : !! NAME
5734 : : !! vec_prod
5735 : : !!
5736 : : !! FUNCTION
5737 : : !! Vector product
5738 : : !!
5739 : : !! INPUTS
5740 : : !! vv,uu = vectors to compute vector product
5741 : : !!
5742 : : !! OUTPUT
5743 : : !! (return the value of the vector product)
5744 : : !!
5745 : : !! SOURCE
5746 : :
5747 [ # # ]: 0 : function vec_prod(uu,vv)
5748 : :
5749 : : !Arguments ------------------------------------
5750 : : !arrays
5751 : : real(dp) :: vec_prod(3)
5752 : : real(dp),intent(in) :: uu(3),vv(3)
5753 : :
5754 : : !Local variables-------------------------------
5755 : :
5756 : : ! *************************************************************************
5757 : :
5758 : 0 : vec_prod(1)=uu(2)*vv(3)-vv(2)*uu(3)
5759 : 0 : vec_prod(2)=uu(3)*vv(1)-vv(3)*uu(1)
5760 : 0 : vec_prod(3)=uu(1)*vv(2)-vv(1)*uu(2)
5761 : :
5762 : : end function vec_prod
5763 : : !!***
5764 : :
5765 : : !!****f* m_bader/mprod
5766 : : !! NAME
5767 : : !! mprod
5768 : : !!
5769 : : !! FUNCTION
5770 : : !! Matrix multiplication cc=aa*bb
5771 : : !!
5772 : : !! SOURCE
5773 : :
5774 : 7675322 : subroutine mprod(aa,bb,cc)
5775 : :
5776 : : !Arguments ------------------------------------
5777 : : !arrays
5778 : : real(dp),intent(in) :: aa(3,3),bb(3,3)
5779 : : real(dp),intent(out) :: cc(3,3)
5780 : :
5781 : : !Local variables-------------------------------
5782 : : !scalars
5783 : : integer :: ii,jj,kk
5784 : :
5785 : : ! *************************************************************************
5786 : :
5787 [ + + ]: 30701288 : do ii=1,3
5788 [ + + ]: 99779186 : do jj=1,3
5789 : 69077898 : cc(ii,jj)=0._dp
5790 [ + + ]: 299337558 : do kk=1,3
5791 : 276311592 : cc(ii,jj)=cc(ii,jj)+aa(ii,kk)*bb(kk,jj)
5792 : : end do
5793 : : end do
5794 : : end do
5795 : :
5796 : 7675322 : end subroutine mprod
5797 : : !!***
5798 : :
5799 : : !!****f* m_bader/bschg1
5800 : : !! NAME
5801 : : !! bschg1
5802 : : !!
5803 : : !! FUNCTION
5804 : : !! bschg1: Vector transformation of coordinates
5805 : : !!
5806 : : !! SOURCE
5807 : :
5808 : 7678775 : subroutine bschg1(vv,dir)
5809 : :
5810 : : !Arguments ------------------------------------
5811 : : !scalars
5812 : : integer,intent(in) :: dir
5813 : : !arrays
5814 : : real(dp),intent(inout) :: vv(3)
5815 : :
5816 : : !Local variables ------------------------------
5817 : : !scalars
5818 : : integer :: ii
5819 : : !arrays
5820 : : real(dp) :: vt(3)
5821 : :
5822 : : ! *********************************************************************
5823 : :
5824 [ + + ]: 7678775 : if (dir==1) then
5825 [ + + ]: 13812 : do ii=1,3
5826 : 13812 : vt(ii)=rprimd(ii,1)*vv(1)+rprimd(ii,2)*vv(2)+rprimd(ii,3)*vv(3)
5827 : : end do
5828 [ + + ]: 7675322 : elseif (dir==-1) then
5829 [ + + ]: 15350644 : do ii=1,3
5830 : 15350644 : vt(ii)=ivrprim(ii,1)*vv(1)+ivrprim(ii,2)*vv(2)+ivrprim(ii,3)*vv(3)
5831 : : end do
5832 [ + - ]: 3837661 : elseif (dir==2) then
5833 [ + + ]: 15350644 : do ii=1,3
5834 : 15350644 : vt(ii)=trivrp(ii,1)*vv(1)+trivrp(ii,2)*vv(2)+trivrp(ii,3)*vv(3)
5835 : : end do
5836 : : else
5837 : 0 : ABI_ERROR('Transformation of coordinates')
5838 : : end if
5839 : 7678775 : vv(:)=vt(:)
5840 : :
5841 : 7678775 : end subroutine bschg1
5842 : : !!***
5843 : :
5844 : : !!****f* m_bader/bschg2
5845 : : !! NAME
5846 : : !! bschg2
5847 : : !!
5848 : : !! FUNCTION
5849 : : !! bschg2: Matrix transformation of coordinates
5850 : : !!
5851 : : !! SOURCE
5852 : :
5853 : 3837661 : subroutine bschg2(aa,dir)
5854 : :
5855 : : !Arguments ------------------------------------
5856 : : !scalars
5857 : : integer,intent(in) :: dir
5858 : : !arrays
5859 : : real(dp),intent(inout) :: aa(3,3)
5860 : :
5861 : : !Local variables ------------------------------
5862 : : !arrays
5863 : : real(dp) :: bb(3,3)
5864 : :
5865 : : ! *********************************************************************
5866 : :
5867 [ - + ]: 3837661 : if (dir==1) then
5868 : 0 : call mprod(aa,ivrprim,bb)
5869 : 0 : call mprod(rprimd,bb,aa)
5870 [ + - ]: 3837661 : elseif (dir==2) then
5871 : 3837661 : call mprod(aa,ivrprim,bb)
5872 : 3837661 : call mprod(trivrp,bb,aa)
5873 [ # # ]: 0 : elseif (dir==-1) then
5874 : 0 : call mprod(aa,rprimd,bb)
5875 : 0 : call mprod(ivrprim,bb,aa)
5876 : : else
5877 : 0 : ABI_ERROR("transformation of coordinates")
5878 : : end if
5879 : 3837661 : end subroutine bschg2
5880 : : !!***
5881 : :
5882 : 0 : end module m_bader
5883 : : !!***
|