Branch data Line data Source code
1 : : !!****m* ABINIT/m_tddft
2 : : !! NAME
3 : : !! m_tddft
4 : : !!
5 : : !! FUNCTION
6 : : !! Routines for computing excitation energies within TDDFT
7 : : !!
8 : : !! COPYRIGHT
9 : : !! Copyright (C) 1999-2026 ABINIT group (XG, JYR, MB, MBELAND, SHAMEL)
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 : : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt .
14 : : !!
15 : : !! NOTES
16 : : !!
17 : : !! SOURCE
18 : :
19 : : #if defined HAVE_CONFIG_H
20 : : #include "config.h"
21 : : #endif
22 : :
23 : : #include "abi_common.h"
24 : :
25 : : module m_tddft
26 : :
27 : : use defs_basis
28 : : use m_abicore
29 : : use m_xmpi
30 : : use m_errors
31 : : use m_wffile
32 : : use m_sort
33 : : use m_dtset
34 : : use m_dtfil
35 : : use iso_c_binding, only : c_ptr,c_loc,c_f_pointer
36 : :
37 : : use defs_abitypes, only : MPI_type
38 : : use m_io_tools, only : get_unit
39 : : use m_matrix, only : matr3inv
40 : : use m_time, only : timab
41 : : use m_fftcore, only : sphereboundary
42 : : use m_spacepar, only : hartre
43 : : use m_mpinfo, only : proc_distrb_cycle
44 : : use m_fft, only : fourwf, fourdp
45 : :
46 : : implicit none
47 : :
48 : : private
49 : : !!***
50 : :
51 : : #if defined HAVE_MPI1
52 : : include 'mpif.h'
53 : : #endif
54 : :
55 : : public :: tddft
56 : : !!***
57 : :
58 : : contains
59 : :
60 : : !!****f* m_tddft/tddft
61 : : !! NAME
62 : : !! tddft
63 : : !!
64 : : !! FUNCTION
65 : : !! Compute the excitation energies within TDLDA
66 : : !! from input wavefunctions, eigenenergies, and band occupations.
67 : : !!
68 : : !! INPUTS
69 : : !! cg(2,mpw*nspinor*mband*mkmem*nsppol)=wf in G space
70 : : !! dtfil <type(datafiles_type)>=variables related to files
71 : : !! dtset <type(dataset_type)>=all input variables for this dataset
72 : : !! eigen(mband*nkpt*nsppol)=array for holding eigenvalues (hartree)
73 : : !! etotal=total energy of the ground-state (Ha)
74 : : !! gmet(3,3)=metrix tensor in G space in Bohr**-2.
75 : : !! gprimd(3,3)=dimensional reciprocal space primitive translations
76 : : !! gsqcut=cutoff on (k+G)^2 (bohr^-2)
77 : : !! kg(3,mpw*mkmem)=reduced planewave coordinates.
78 : : !! kxc(nfft,nkxc)=exchange-correlation kernel
79 : : !! mband=maximum number of bands
80 : : !! mgfftdiel=maximum size of 1D FFTs, for the computation of the dielectric matrix
81 : : !! mkmem=number of k-points treated by this node.
82 : : !! mpi_enreg=information about MPI parallelization
83 : : !! mpw=maximum allowed value for npw
84 : : !! nfft=(effective) number of FFT grid points (for this processor)
85 : : !! WARNING about parallelization: see below
86 : : !! ngfftdiel(18)=contain all needed information about 3D FFT, for dielectric matrix,
87 : : !! see ~abinit/doc/variables/vargs.htm#ngfft
88 : : !! nkpt=number of k points
89 : : !! nkxc=second dimension of the array kxc (see rhotoxc for a description)
90 : : !! npwarr(nkpt)=number of planewaves at each k point
91 : : !! nspinor=number of spinorial components of the wavefunctions
92 : : !! nsppol=1 for unpolarized, 2 for spin-polarized
93 : : !! occ(mband*nkpt*nsppol)=
94 : : !! occupation numbers for each band (usually 2.0) at each k point
95 : : !! ucvol=unit cell volume (Bohr**3)
96 : : !! wffnew=unit number for current wf disk file
97 : : !!
98 : : !! OUTPUT
99 : : !! (only writing)
100 : : !!
101 : : !! WARNING:
102 : : !! This routine should not be parallelized on space for the time being,
103 : : !! because the already existing parallelisation is not the usual one, found
104 : : !! in the majority of ABINIT routines.
105 : : !!
106 : : !! NOTES
107 : : !! * Only accept nspinor=1, nsppol=1, nkpt=1 (Gamma point), and occopt<3
108 : : !! (insulating occupation numbers).
109 : : !! It is expected to make it work for nsppol=2 in the future.
110 : : !!
111 : : !! * For the oscillator strengths, see the paper
112 : : !! ''Time-Dependent Density Functional Response Theory of Molecular
113 : : !! systems: Theory, Computational Methods, and Functionals'', by M.E. Casida,
114 : : !! in Recent Developments and Applications of Modern Density Functional
115 : : !! Theory, edited by J.M. Seminario (Elsevier, Amsterdam, 1996).
116 : : !!
117 : : !! SOURCE
118 : :
119 : 22 : subroutine tddft(cg,dtfil,dtset,eigen,etotal,gmet,gprimd,gsqcut,&
120 : 22 : & kg,kxc,mband,mgfftdiel,mkmem,mpi_enreg,mpw,nfft,ngfftdiel,nkpt,nkxc,&
121 : 22 : & npwarr,nspinor,nsppol,occ,ucvol,wffnew)
122 : :
123 : : !Arguments ------------------------------------
124 : : integer, intent(in) :: mband,mgfftdiel,mkmem,mpw,nfft,nkpt,nkxc,nsppol
125 : : integer, intent(in) :: nspinor
126 : : real(dp), intent(in) :: etotal,gsqcut,ucvol
127 : : type(datafiles_type), intent(in) :: dtfil
128 : : type(dataset_type), intent(in) :: dtset
129 : : type(MPI_type), intent(in) :: mpi_enreg
130 : : type(wffile_type), intent(inout) :: wffnew
131 : : integer, intent(in) :: kg(3,mpw*mkmem),ngfftdiel(18),npwarr(nkpt)
132 : : real(dp), intent(in) :: cg(2,mpw*nspinor*mband*mkmem*nsppol),eigen(mband*nkpt*nsppol)
133 : : real(dp), intent(in) :: gmet(3,3),gprimd(3,3),kxc(nfft,nkxc),occ(mband*nkpt*nsppol)
134 : :
135 : : !Local variables-------------------------------
136 : : integer,parameter :: nexcitout=20
137 : : integer :: cplex,i1,i2,i3,iband,idir,ier,ierr,iexcit,iexcit1,iexcit2,ifft
138 : : integer :: old_iexcit,ii,jj,isppol,jsppol,isppol1,isppol2,isppol_l,isppol_n
139 : : integer :: isppol_n1,isppol_n2,iocc_n1,iocc_n2,iunocc_n1,iunocc_n2,temp_unit2
140 : : integer :: ikpt,index,iocc,iocc1,iocc2,iocc_l,iocc_n
141 : : integer :: istwf_k,iunocc,iunocc1,iunocc2,iunocc_l,iunocc_n,istate,jexcit
142 : : integer :: jexcit_cbase,master,mcg_disk,me_loc
143 : 44 : integer :: nband_k(nsppol), nband_occ(nsppol), nband_unocc(nsppol)
144 : 44 : integer :: nstate_k, nstate_occ, nstate_unocc, nexcit_pol(nsppol)
145 : : integer :: nstate_win,ndiel,ndiel1,ndiel2,ndiel3,ndiel4
146 : : integer :: ndiel5,ndiel6,nexcit,nexcit_max,nexcit_win,nfftdiel,nlargest,nnext
147 : : integer :: nnext1,nnext2
148 : : integer :: nproc_loc,npw_k,pole_approx,sing_trip,spaceComm,mtag,tim_fourwf
149 : : integer :: tim_rwwf,save_iomode
150 : : integer :: rec,recl,idummy,jdummy
151 : : real(dp) :: buffer,buffer_inv,diffeig,eigunocc,emax_win
152 : : real(dp) :: factor,ff,flargest,fnext,fr_invsquare,fr_power
153 : : real(dp) :: fnext1,fnext2
154 : : real(dp) :: normint,myproduct,saa,sab,sbb
155 : : real(dp) :: sumx
156 : 44 : real(dp) :: sum_kernel(2/nsppol)
157 : : real(dp) :: weight,xx
158 : : logical :: am_master,file_exist
159 : 22 : logical, allocatable :: done_excit(:,:),done_sexc(:) !,done_sexc2(:)
160 : : character(len=18) :: chain1,chain2
161 : : character(len=500) :: message
162 : 22 : integer,allocatable :: flag_state_win(:),gbound(:,:),indarr(:),index_state(:)
163 : 22 : integer,allocatable :: kg_k(:,:)
164 : 22 : integer,allocatable :: excit_coords(:,:)
165 : : integer :: count_to_do, count, displ, countmax, displmax
166 : : integer :: ijexcit, ijexcit2, sendcount
167 : 66 : real(dp) :: f_sing_trip(2/nsppol),sendbuf(5-nsppol)
168 : : real(dp) :: cauchy(7),poscart(3),rprimd(3,3),tsec(2),dummy(2,1)
169 : : integer :: iomode,action,me,nmaster,sender,source,sread,sskip
170 : : integer :: formeig,icg,ikg,nband_k_
171 : : logical :: mydata, tmaster, swrite
172 : 22 : integer,allocatable :: kg_disk(:,:)
173 : 22 : integer,allocatable :: counts(:),displs(:),recvcounts(:),tmpbuf(:)
174 : 22 : real(dp),allocatable :: cg_disk(:,:),cg_tmp(:,:)
175 : 22 : real(dp),allocatable :: cwavef(:,:),eexcit(:)
176 : 22 : real(dp),allocatable :: eexcit2(:)
177 : 22 : real(dp),allocatable :: matr(:)
178 : 22 : real(dp),allocatable :: kxc_for_tddft(:,:,:,:,:,:),omega_tddft_casida(:,:,:,:,:,:,:)
179 : 22 : real(dp),allocatable :: osc_str(:,:),pos(:,:),rhoaug(:,:,:),rhog(:,:)
180 : 22 : real(dp),allocatable :: sexc(:,:),sqrtks(:),vec(:,:,:),vhartr(:),wfprod(:,:,:)
181 : 44 : real(dp) :: omega_tddft_casida_dummy(2/nsppol)
182 : 22 : real(dp),allocatable :: wfraug(:,:,:,:),wfrspa(:,:,:,:),work(:),zhpev1(:,:)
183 : 22 : real(dp),allocatable :: zhpev2(:)
184 : :
185 : : integer :: iproc
186 : : integer :: ipwnbd
187 : 22 : real(dp), allocatable,target :: recvbuf(:,:)
188 : 22 : real(dp),pointer :: recvbuf_ptr(:)
189 : : type(c_ptr) :: cptr
190 : :
191 : : ! *************************************************************************
192 : :
193 : : !Init mpi_comm
194 : 22 : spaceComm=mpi_enreg%comm_cell
195 : :
196 : 22 : am_master=.true.
197 : 22 : master = 0
198 : 44 : nproc_loc = xmpi_comm_size(spaceComm) !Init ntot proc max
199 : 22 : me_loc = xmpi_comm_rank(spaceComm) !Define who i am
200 : :
201 : : #if defined HAVE_MPI
202 [ + + ]: 22 : if (me_loc/=0) then
203 : 4 : am_master=.FALSE.
204 : : end if
205 : 22 : write(message, '(a,i3,a)' ) ' TDDFT ',nproc_loc,' CPU synchronized'
206 : 22 : call wrtout(std_out,message,'COLL')
207 : 22 : write(message, '(a,3D12.5,a,3D12.5,a,3D12.5)' ) ' gmet ',&
208 : 22 : & gmet(1,1),gmet(1,2),gmet(1,3),ch10,&
209 : 22 : & gmet(2,1),gmet(2,2),gmet(2,3),ch10,&
210 : 44 : & gmet(3,1),gmet(3,2),gmet(3,3)
211 : 22 : call wrtout(std_out,message,'COLL')
212 : : #endif
213 : :
214 : :
215 : : !COMMENT these values should become arguments
216 : : !the two first define the energy window
217 : :
218 : 22 : emax_win=greatest_real*tol6
219 [ + + ]: 22 : if(dtset%td_maxene>tol6)then
220 : 1 : emax_win = dtset%td_maxene
221 : : end if
222 : :
223 : 22 : call timab(95,1,tsec)
224 : :
225 : 22 : istwf_k=dtset%istwfk(1)
226 : :
227 [ + - - + ]: 22 : if(nkpt/=1 .or. &
228 : : & abs(dtset%kptns(1,1))+abs(dtset%kptns(2,1))+abs(dtset%kptns(3,1))>1.0d-6 )then
229 : : write(message, '(a,a,a,a,a,i4,a,3es14.6,a,a,a,a,a)' )&
230 : 0 : & 'The computation of excited states using TDDFT is only allowed',ch10,&
231 : 0 : & 'with nkpt=1, kpt=(0 0 0), but the following values are input:',ch10,&
232 : 0 : & 'nkpt=',nkpt,', kpt=',dtset%kptns(1:3,1),'.',ch10,&
233 : 0 : & 'Action: in the input file, set nkpt to 1 and kpt to 0 0 0 ,',ch10,&
234 : 0 : & 'or change iscf.'
235 : 0 : ABI_ERROR(message)
236 : : end if
237 : :
238 [ - + ]: 22 : if(nspinor/=1)then
239 : : write(message, '(a,a,a,a,a,a,a)' )&
240 : 0 : & 'The computation of excited states using TDDFT is restricted',ch10,&
241 : 0 : & 'for the time being to nspinor=1, while input nspinor=2.',ch10,&
242 : 0 : & 'Action: if you want to compute excited states within TDDFT,',ch10,&
243 : 0 : & 'set nsppol to 1 in the input file. Otherwise, do not use iscf=-1.'
244 : 0 : ABI_ERROR(message)
245 : : end if
246 : :
247 : :
248 [ + + - + ]: 22 : if(nsppol==2 .and. (dtset%ixc==22 .or. dtset%ixc==20))then
249 : : write(message, '(a,a,a,a,a,a,a,a,a,a,a)' )&
250 : 0 : & 'The computation of excited states using TDDFT in the spin',ch10,&
251 : 0 : & 'polarized case for the time being cannot be used with ixc=20',ch10,&
252 : 0 : & 'or ixc=22',ch10,&
253 : 0 : & 'Action: if you want to compute excited states within TDDFT,',ch10,&
254 : 0 : & 'set ixc different from 20 or 22. Otherwise, do not use iscf=-1',ch10,&
255 : 0 : & 'with nsppol=2.'
256 : 0 : ABI_ERROR(message)
257 : : end if
258 : :
259 : :
260 [ - + ]: 22 : if(dtset%occopt>2)then
261 : : write(message, '(a,a,a,i2,a,a,a,a,a)' )&
262 : 0 : & 'The computation of excited states using TDDFT is only allowed',ch10,&
263 : 0 : & 'with occopt=0, 1, or 2, while input occopt=',dtset%occopt,'.',ch10,&
264 : 0 : & 'Action: if you want to compute excited states within TDDFT,',ch10,&
265 : 0 : & 'set occopt=0, 1, or 2 in the input file. Otherwise, do not use iscf=-1.'
266 : 0 : ABI_ERROR(message)
267 : : end if
268 : :
269 : : !Examine the occupation numbers, and determine the number of
270 : : !occupied and unoccupied states and band.
271 : : !States are numerated as usual in Abinit, before all spin up band
272 : : !and after all spin down bands.
273 : : !Note that if nsppol==1 nstate=nband_k
274 [ + + ]: 54 : do isppol=1,nsppol
275 : 32 : nband_k(isppol)=dtset%nband(isppol)
276 : 32 : nband_occ(isppol)=0
277 [ + + ]: 470 : do iband=1,nband_k(isppol)
278 [ + + ]: 438 : if(abs(occ(iband+(isppol-1)*nband_k(1))-two/nsppol)<tol6) &
279 : 142 : & nband_occ(isppol)=nband_occ(isppol)+1
280 : : end do
281 : 32 : nband_unocc(isppol)=nband_k(isppol)-nband_occ(isppol)
282 : : ! next line make no sense if spin flip is taken into account
283 : 54 : nexcit_pol(isppol)=nband_occ(isppol)*nband_unocc(isppol)
284 : : end do
285 : 22 : nstate_k=nband_k(1)+(nsppol-1)*nband_k(nsppol)
286 : 22 : nstate_occ=nband_occ(1)+(nsppol-1)*nband_occ(nsppol)
287 : 22 : nstate_unocc=nstate_k-nstate_occ
288 : : !next line to be changed if spin fli is taken into account
289 : 22 : nexcit=nexcit_pol(1)+(nsppol-1)*nexcit_pol(nsppol)
290 : :
291 : : !number of plane wave (does it work even for nsppol=2 ??)
292 : 22 : npw_k=npwarr(1)
293 : :
294 : : !mux number of excitations that is taken into account
295 [ + + ]: 22 : if(dtset%td_mexcit==0)then
296 : : nexcit_max=nexcit
297 : : else
298 : 1 : nexcit_max =dtset%td_mexcit
299 : : end if
300 : :
301 : : !DEBUG
302 : : !write(std_out,*) nband_occ(1),nband_unocc(1)
303 : : !write(std_out,*) nband_occ(nsppol),nband_unocc(nsppol)
304 : : !END DEBUG
305 : :
306 : :
307 [ + + ]: 22 : if(nsppol==1)then
308 : 12 : write(message, '(a,a,a,a,i4,a,i4,a,a,i4,a,a,a,i6,a)' )ch10,&
309 : 12 : & ' *** TDDFT : computation of excited states *** ',ch10,&
310 : 12 : & ' Splitting of',dtset%nband(1),' states in',nband_occ(1),' occupied states,',&
311 : 12 : & ' and',nband_unocc(1),' unoccupied states,',ch10,&
312 : 24 : & ' giving',nexcit,' excitations.'
313 : 12 : call wrtout(std_out,message,'COLL')
314 : 12 : call wrtout(ab_out,message,'COLL')
315 : : else
316 : 10 : write(message, '(a,a,a,a,i4,a,i4,a,a,i4,a,a,a,i6,a,a,a)' )ch10,&
317 : 10 : & ' *** TDDFT : computation of excited states *** ',ch10,&
318 : 10 : & ' Splitting of',nstate_k,' states in',nstate_occ,' occupied states,',&
319 : 10 : & ' and',nstate_unocc,' unoccupied states,',ch10,&
320 : 10 : & ' giving',nexcit,' excitations. Note that spin flip is not possible actually.',ch10,&
321 : 20 : & ' So the number of excitation is the half of the product of the number of state'
322 : 10 : call wrtout(std_out,message,'COLL')
323 : 10 : call wrtout(ab_out,message,'COLL')
324 : : end if
325 : :
326 : : !Allocate the matrices to be diagonalized.
327 : : !Use a simple storage mode, to be improved in the future.
328 : 22 : ii=max(nband_occ(1),nband_occ(nsppol))
329 : 22 : jj=max(nband_unocc(1),nband_unocc(nsppol))
330 [ - + + - : 198 : ABI_MALLOC(omega_tddft_casida,(ii,jj,nsppol,ii,jj,nsppol,2/nsppol))
- + + - -
+ + - - +
+ - - + +
- - + + -
- + + - +
- + - - +
- + ]
331 [ - + + - : 66 : ABI_MALLOC(eexcit,(nexcit))
+ - + - -
+ - + ]
332 [ - + + - : 44 : ABI_MALLOC(sqrtks,(nexcit))
- + - + ]
333 [ - + + - : 66 : ABI_MALLOC(flag_state_win,(nstate_k))
+ - + - -
+ - + ]
334 [ + + + + : 84196 : omega_tddft_casida(:,:,:,:,:,:,:)=zero
+ + + + +
+ + + +
+ ]
335 : :
336 : :
337 : : !Fill the diagonal elements with square of differences of KS eigenvalues
338 : : !(also not very efficient, but OK for the present first coding)
339 : : !Also compute the square root of Kohn-Sham eigenvalue differences
340 [ + + ]: 54 : do isppol=1,nsppol
341 [ + + ]: 382 : do iunocc=1,nband_unocc(isppol)
342 : 328 : eigunocc=eigen(iunocc+nband_occ(isppol)+(isppol-1)*nband_k(1))
343 [ + + ]: 1256 : do iocc=1,nband_occ(isppol)
344 : 896 : iexcit=iocc+(isppol-1)*nexcit_pol(1)+nband_occ(isppol)*(iunocc-1)
345 : 896 : diffeig=eigunocc-eigen(iocc+(isppol-1)*nband_k(1))
346 [ + + ]: 2018 : do sing_trip=1,2/nsppol
347 : 2018 : omega_tddft_casida(iocc,iunocc,isppol,iocc,iunocc,isppol,sing_trip)=diffeig**2
348 : : end do
349 : 896 : eexcit(iexcit)=diffeig
350 : 1224 : sqrtks(iexcit)=sqrt(diffeig)
351 : : end do
352 : : end do
353 : : end do
354 : :
355 : :
356 : :
357 : : !Sort the excitation energies : note that the array eexcit is reordered
358 [ - + + - : 66 : ABI_MALLOC(indarr,(nexcit))
+ - + - -
+ - + ]
359 [ + - + + : 1814 : indarr(:)=(/ (ii,ii=1,nexcit) /)
+ + ]
360 : 22 : call sort_dp(nexcit,eexcit,indarr,tol14)
361 : :
362 : : !Determine an energy window for the excitations
363 : : !to take into account. This is necessary for large systems
364 : :
365 : 22 : nexcit_win = 0
366 [ + + ]: 918 : do iexcit = 1, nexcit
367 [ + + + + ]: 918 : if ((eexcit(iexcit) < emax_win ).and.(nexcit_win < nexcit_max)) then
368 : 890 : nexcit_win = nexcit_win + 1
369 : :
370 : : ! DEBUG
371 : : ! write(message,'(a,F12.5,a,a,i2,a,a,i2)') 'excitation energy:', eexcit(indarr(iexcit)),ch10, &
372 : : ! & 'excitation number:', indarr(iexcit),ch10, &
373 : : ! & 'nexcit_win: ', nexcit_win
374 : : ! call wrtout(std_out,message,'COLL')
375 : : ! ENDDEBUG
376 : :
377 : : end if
378 : : end do
379 : :
380 : : !identification of the bands contributing to the
381 : : !nexcit_win excitations within the window
382 : :
383 : :
384 : 22 : nstate_win = 0
385 [ + + ]: 460 : flag_state_win(:) = 0
386 [ + + ]: 912 : do iexcit = 1, nexcit_win
387 : 890 : iexcit1 = indarr(iexcit)
388 : 890 : isppol1 = min((iexcit1-1)/nexcit_pol(1) +1,2)
389 : 890 : iunocc1 = (iexcit1-(isppol1-1)*nexcit_pol(1)-1)/nband_occ(isppol1)+1
390 : 890 : iocc1 = iexcit1-(isppol1-1)*nexcit_pol(1)-(iunocc1-1)*nband_occ(isppol1)
391 [ + + ]: 890 : if (flag_state_win(nband_occ(isppol1)+(isppol1-1)*nband_k(1)+iunocc1)==0) &
392 : 322 : & flag_state_win(nband_occ(isppol1)+(isppol1-1)*nband_k(1)+iunocc1) =1
393 [ + + ]: 890 : if (flag_state_win(iocc1+(isppol1-1)*nband_k(1))==0) &
394 : 132 : & flag_state_win(iocc1+(isppol1-1)*nband_k(1)) =1
395 : : ! DEBUG
396 : : ! write(message,'(a,i2,a,a,i2,i2,a,a,i2,a,a,i2)') 'isppol:', isppol1,ch10, &
397 : : ! & 'iocc,iunocc:', iocc1,iunocc1,ch10, &
398 : : ! & 'flag_state_win:', flag_state_win(iocc1+(isppol1-1)*nband_k(1)), &
399 : : ! & ch10, 'flag_state_win:', flag_state_win(nband_occ(isppol1)+(isppol1-1)*nband_k(1)+iunocc1)
400 : : ! call wrtout(std_out,message,'COLL')
401 : : ! END DEBUG
402 : :
403 : : end do
404 : :
405 [ + + ]: 54 : do isppol=1,nsppol
406 [ + + ]: 492 : do iband=1,nband_k(isppol)
407 : 470 : nstate_win=nstate_win+flag_state_win(iband+(isppol-1)*nband_k(1))
408 : : end do
409 : : end do
410 : :
411 : :
412 : 22 : write(message,'(a,a,i5)') ch10,'Nr of states to Fourier transform : ',nstate_win
413 : 22 : call wrtout(std_out,message,'COLL')
414 : :
415 : 22 : ndiel1=ngfftdiel(1) ; ndiel2=ngfftdiel(2) ; ndiel3=ngfftdiel(3)
416 : : !ndiel4,ndiel5,ndiel6 are FFT dimensions, modified to avoid cache trashing
417 : 22 : ndiel4=ngfftdiel(4) ; ndiel5=ngfftdiel(5) ; ndiel6=ngfftdiel(6)
418 : :
419 : : !The evaluation of integrals, later, needs the following factor
420 : 22 : normint=one/(ucvol*dble(ndiel1*ndiel2*ndiel3))
421 : :
422 : : !Setup the positions in real space for later integration
423 : 22 : call matr3inv(gprimd,rprimd)
424 : :
425 [ - + + - : 66 : ABI_MALLOC(pos,(max(ndiel1,ndiel2,ndiel3),3))
+ - + - -
+ - + ]
426 : :
427 : : !Select the reduced position of the point with respect to the box center,
428 : : !in the interval ]-0.5,0.5].
429 : : buffer=0.05_dp ; buffer_inv=one/buffer
430 [ + + ]: 88 : do idir=1,3
431 [ + + ]: 66 : if(idir==1)ndiel=ndiel1
432 [ + + ]: 44 : if(idir==2)ndiel=ndiel2
433 [ + + ]: 44 : if(idir==3)ndiel=ndiel3
434 [ + + ]: 2734 : do ii=1,ndiel
435 : : ! dtset%boxcenter(3)=reduced coordinates of the center of the box,
436 : : ! in view of the computation of the oscillator strength
437 : 2646 : pos(ii,idir)=(ii-1)/(one*ndiel)-dtset%boxcenter(idir)
438 : 2646 : pos(ii,idir)=pos(ii,idir)-nint(pos(ii,idir)-tol12)
439 : : ! The linear behaviour is cut-off when one becomes
440 : : ! close to the boundaries : the buffer allows to match smoothly
441 : : ! one side of the cell to the other. This is important
442 : : ! to get rid of small breakings of symmetry, that are
443 : : ! confusing in accurate tests
444 [ + + ]: 2712 : if(abs(pos(ii,idir))>half-buffer)then
445 : : ! xx is always positive, and goes linearly from 1 to 0
446 : : ! in the buffer region
447 : 242 : xx=(half-abs(pos(ii,idir)))*buffer_inv
448 : : ! The cut-off is applied to pos(:,:)
449 : 242 : pos(ii,idir)=pos(ii,idir)*xx*(two-xx)
450 : : ! DEBUG
451 : : ! if (idir==1)then
452 : : ! write(std_out,'(i2)') ndiel
453 : : ! write(std_out,'(a,i2,a,F12.5,F12.5)')'idiel : ',ii,' x : ',pos(ii,idir),&
454 : : ! & dtset%boxcenter(idir)
455 : : ! endif
456 : : ! ENDDEBUG
457 : : end if
458 : : end do ! ii
459 : : end do ! idir
460 : :
461 : : !need to run in MPI I/O case
462 [ - + ]: 22 : if (wffnew%iomode == IO_MODE_MPI ) then
463 : 0 : save_iomode=wffnew%iomode
464 : 0 : wffnew%iomode = IO_MODE_FORTRAN
465 : : else
466 : : ! Do not store value but set to have save_iomode /= 1
467 : : save_iomode = IO_MODE_FORTRAN
468 : : end if
469 : :
470 : : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
471 : : !2009 Chunping Hu
472 : : !need to collect wavefunctions from processors to master
473 : 22 : me=me_loc
474 : :
475 : 22 : tim_rwwf =0
476 : 22 : source = master
477 : 22 : sread = master
478 : 22 : tmaster=(master==me)
479 : 22 : swrite=tmaster
480 : 22 : sender=-1
481 : :
482 : 22 : iomode=wffnew%iomode
483 : :
484 [ + + ]: 22 : if(am_master)then
485 : : #if defined HAVE_MPI
486 [ - + + - : 54 : ABI_MALLOC(cg_tmp,(2,mpw*nspinor*mband*nsppol))
+ - + - -
+ - + ]
487 : : #endif
488 : : end if
489 : :
490 [ - + + - : 66 : ABI_MALLOC(kg_disk,(3,mpw))
+ - + - -
+ - + ]
491 : 22 : mcg_disk=mpw*nspinor*mband
492 : 22 : formeig=0
493 : :
494 : : #if defined HAVE_MPI
495 : 22 : call xmpi_barrier(spaceComm)
496 [ - + + - : 66 : ABI_MALLOC(cg_disk,(2,mcg_disk))
+ - + - -
+ - + ]
497 : : #endif
498 : :
499 : 22 : icg=0
500 : : if(mpi_enreg%paralbd==0) tim_rwwf=6
501 : 22 : if(mpi_enreg%paralbd==1)tim_rwwf=12
502 : :
503 [ + + ]: 54 : do isppol=1,nsppol
504 : 32 : ikg=0
505 [ + + ]: 86 : do ikpt=1,nkpt
506 : 32 : nband_k_=dtset%nband(ikpt+(isppol-1)*nkpt)
507 : 32 : npw_k=npwarr(ikpt)
508 : : #if defined HAVE_MPI
509 [ + - ]: 32 : if (dtset%usewvl == 0) then
510 : 32 : mtag=ikpt+(isppol-1)*nkpt
511 : 32 : call xmpi_barrier(spaceComm)
512 : : ! Must transfer the wavefunctions to the master processor
513 : : ! Separate sections for paralbd=1 or other values ; might be merged
514 [ + - ]: 32 : if(mpi_enreg%paralbd==0) then
515 : 32 : nmaster=0
516 [ + + ]: 470 : source=minval(mpi_enreg%proc_distrb(ikpt,1:nband_k_,isppol))
517 : 32 : mydata=.false.
518 [ + + ]: 32 : if(source==me)mydata=.true.
519 : 24 : action=0
520 : : ! I am the master node, and I have the data in cg or cg_disk
521 [ + + ]: 24 : if((tmaster).and.(mydata))action=1
522 : : ! I am not the master, and I have the data => send to master
523 [ + + ]: 32 : if((.not.tmaster).and.(mydata))action=2
524 : : ! I am the master, and I receive the data
525 [ + + ]: 32 : if((tmaster).and.(.not.mydata))action=3
526 : : ! I have the data in cg or cg_disk ( MPI_IO case)
527 [ - + ]: 32 : if (iomode==IO_MODE_MPI) then
528 : 0 : action = 0
529 : 0 : sender=-1
530 : 0 : swrite=.false.
531 [ # # ]: 0 : if (mydata)then
532 : : action=1
533 : 22 : swrite=.true.
534 : 22 : sender=me
535 : : end if
536 : : end if
537 : : ! I am the master node, and I have the data in cg or cg_disk
538 : : ! I have the data in cg or cg_disk ( MPI_IO case)
539 [ + + ]: 32 : if(action==1)then
540 : : ! Copy from kg to kg_disk
541 [ + + + + ]: 162074 : kg_disk(:,1:npw_k)=kg(:,1+ikg:npw_k+ikg)
542 : : ! Copy from cg to cg_disk
543 [ + + ]: 546050 : do ipwnbd=1,nband_k_*npw_k*nspinor
544 : 546028 : cg_disk(1,ipwnbd)=cg(1,ipwnbd+icg)
545 : 546050 : cg_disk(2,ipwnbd)=cg(2,ipwnbd+icg)
546 : : end do
547 : : end if
548 : : ! I am not the master, and I have the data => send to master
549 : : ! I am the master, and I receive the data
550 [ + + ]: 32 : if ( action==2.or.action==3) then
551 : 4 : call timab(48,1,tsec)
552 [ + + ]: 4 : if(action==2)then
553 : 2 : call xmpi_exch(kg(:,1+ikg:npw_k+ikg),3*npw_k,source,kg_disk,nmaster,spaceComm,2*(mtag-1)+1,ierr)
554 : : call xmpi_exch(cg(:,icg+1:icg+nband_k_*npw_k*nspinor),2*nband_k_*npw_k*nspinor &
555 : 2 : & ,source,cg_disk,nmaster,spaceComm,2*(mtag-1)+2,ierr)
556 : : else
557 : 2 : call xmpi_exch(kg_disk,3*npw_k,source,kg_disk,nmaster,spaceComm,2*(mtag-1)+1,ierr)
558 : 2 : call xmpi_exch(cg_disk,2*nband_k_*npw_k*nspinor,source,cg_disk,nmaster,spaceComm,2*(mtag-1)+2,ierr)
559 : : end if
560 : 4 : call timab(48,2,tsec)
561 : : end if
562 [ # # ]: 0 : else if(mpi_enreg%paralbd==1)then
563 : 0 : nmaster=0
564 : : #if defined HAVE_MPI_IO
565 : 0 : sender=-1
566 [ # # ]: 0 : if( iomode ==IO_MODE_MPI ) then
567 : 0 : nmaster=mpi_enreg%proc_distrb(ikpt,1,isppol)
568 : 0 : sender=nmaster
569 : : end if
570 : : #endif
571 : : ! Note the loop over bands
572 [ # # ]: 0 : do iband=1,nband_k_
573 : : ! The message passing related to kg is counted as one band
574 : 0 : action=0
575 : : ! I am the master node, and I have the data in cg or cg_disk
576 [ # # # # ]: 0 : if( mpi_enreg%proc_distrb(ikpt,iband,isppol)==nmaster .and. me==nmaster) then
577 : : action=1
578 : : ! I am not the master, and I have the data => send to master
579 [ # # # # ]: 0 : elseif( mpi_enreg%proc_distrb(ikpt,iband,isppol)==me .and. me/=nmaster ) then
580 : : action = 2
581 : : ! I am the master, and I receive the data
582 [ # # # # ]: 0 : elseif( mpi_enreg%proc_distrb(ikpt,iband,isppol)/=me .and. me==nmaster ) then
583 : : action=3
584 : : end if
585 : : if(action==1) then
586 : : ! I am the master node, and I have the data in cg or cg_disk
587 : : ! Copy from kg to kg_disk
588 [ # # # # : 0 : if(iband==1)kg_disk(:,1:npw_k)=kg(:,1+ikg:npw_k+ikg)
# # ]
589 : : ! Copy from cg to cg_disk
590 [ # # ]: 0 : do ipwnbd=1,npw_k*nspinor
591 : 0 : cg_disk(1,(iband-1)*npw_k*nspinor+ipwnbd)= cg(1,(iband-1)*npw_k*nspinor+ipwnbd+icg)
592 : 0 : cg_disk(2,(iband-1)*npw_k*nspinor+ipwnbd)= cg(2,(iband-1)*npw_k*nspinor+ipwnbd+icg)
593 : : end do
594 : : end if ! action=1
595 [ # # ]: 0 : if ( action==2.or.action==3) then
596 : : ! action=2 : I am not the master, and I have the data => send to master
597 : : ! action=3 : I am the master, and I receive the data
598 : 0 : call timab(48,1,tsec)
599 [ # # ]: 0 : if ( iband == 1 ) then
600 [ # # ]: 0 : if (action==2) then
601 : : call xmpi_exch(kg(:,1+ikg:npw_k+ikg),3*npw_k,mpi_enreg%proc_distrb(ikpt,iband,isppol) &
602 : 0 : & ,kg_disk,nmaster,spaceComm,iband*(mtag-1)+1,ierr)
603 : : else
604 : : call xmpi_exch(kg_disk,3*npw_k,mpi_enreg%proc_distrb(ikpt,iband,isppol) &
605 : 0 : & ,kg_disk,nmaster,spaceComm,iband*(mtag-1)+1,ierr)
606 : : end if
607 : : end if ! iband =1
608 : 0 : ipwnbd=(iband-1)*npw_k*nspinor
609 [ # # ]: 0 : if (action==2)then
610 : : call xmpi_exch( cg(:,ipwnbd+icg+1:ipwnbd+icg+npw_k*nspinor),2*npw_k*nspinor &
611 : : & ,mpi_enreg%proc_distrb(ikpt,iband,isppol) &
612 : 0 : & ,cg_disk(:,ipwnbd+1:ipwnbd+npw_k*nspinor),nmaster,spaceComm,iband*(mtag-1)+2,ierr)
613 : : else
614 : : call xmpi_exch( cg_disk(:,ipwnbd+1:ipwnbd+npw_k*nspinor),2*npw_k*nspinor &
615 : : & ,mpi_enreg%proc_distrb(ikpt,iband,isppol) &
616 : 0 : & ,cg_disk(:,ipwnbd+1:ipwnbd+npw_k*nspinor),nmaster,spaceComm,iband*(mtag-1)+2,ierr)
617 : : end if
618 : 0 : call timab(48,2,tsec)
619 : : end if ! action=2 or action=3
620 : 0 : if(iomode ==IO_MODE_MPI) then
621 : : ! I have the data in cg or cg_disk
622 : : swrite=.false.
623 : : if (nmaster == me) then
624 : 0 : swrite=.true.
625 : : end if
626 : : end if
627 : : ! End of loop over bands
628 : : end do
629 : : ! End of paralbd=1
630 : : end if
631 : : end if
632 : : #endif
633 : :
634 : : ! The wavefunctions for the present k point and spin are stored into cg_tmp
635 [ + + ]: 32 : if(am_master)then
636 : : #if defined HAVE_MPI
637 [ + + + + ]: 1856340 : cg_tmp(:,icg+1:icg+nband_k_*npw_k*nspinor)=cg_disk(:,:)
638 : : #endif
639 : : end if
640 : :
641 : 32 : sskip=1
642 : : #if defined HAVE_MPI
643 [ + - ]: 32 : if (dtset%usewvl == 0) then
644 : 32 : sskip=0
645 [ + + ]: 32 : if(.not.(proc_distrb_cycle(mpi_enreg%proc_distrb,ikpt,1,nband_k_,isppol,me)))sskip=1
646 : : end if
647 : : #endif
648 : 32 : if(sskip==1)then
649 : 24 : icg=icg+npw_k*nspinor*nband_k_
650 : 24 : ikg=ikg+npw_k
651 : : end if
652 : :
653 : : end do ! ikpt
654 : : end do ! isppol
655 [ - + ]: 22 : ABI_FREE(kg_disk)
656 : : #if defined HAVE_MPI
657 [ - + ]: 22 : ABI_FREE(cg_disk)
658 : : #endif
659 : : !!!!!!!end of collecting wavefunction to master!!!!!!
660 : :
661 : :
662 [ + + ]: 22 : if(am_master)then
663 : : ! -----------------------------------------------------------
664 : : ! The disk access is only done by master...
665 : :
666 [ + - - + : 72 : ABI_MALLOC(gbound,(2*mgfftdiel+8,2))
+ - + - +
- + - - +
- + ]
667 [ - + + - : 54 : ABI_MALLOC(kg_k,(3,npw_k))
+ - + - -
+ - + ]
668 : :
669 : 18 : ikpt=1
670 : : ! Only one k point
671 : : ! do isppol=1,nsppol
672 [ + + + + ]: 126038 : kg_k(:,1:npw_k)=kg(:,1:npw_k)
673 : 18 : call sphereboundary(gbound,istwf_k,kg_k,mgfftdiel,npw_k)
674 : : ! enddo
675 : :
676 : : end if ! am_master
677 : :
678 : : !need to run in MPI I/O case
679 [ - + ]: 22 : if ( save_iomode == 1 ) wffnew%iomode = IO_MODE_MPI
680 : : !call wrtout(std_out,'After reading the wavefunction','COLL')
681 : :
682 : : !Use a simple implementation for the computation of the kernel elements
683 [ + + ]: 22 : if (am_master) then
684 [ - + + - : 54 : ABI_MALLOC(cwavef,(2,mpw))
+ - + - -
+ - + ]
685 [ - + + - : 90 : ABI_MALLOC(rhoaug,(ndiel4,ndiel5,ndiel6))
- + + - -
+ + - + -
+ - - + -
+ ]
686 [ - + + - : 90 : ABI_MALLOC(wfraug,(2,ndiel4,ndiel5,ndiel6))
- + + - -
+ + - + -
+ - - + -
+ ]
687 : : end if
688 [ - + + - : 44 : ABI_MALLOC(index_state,(nstate_k))
- + - + ]
689 : :
690 : : ! all real-space states are kept in memory
691 [ - + + - : 132 : ABI_MALLOC(wfrspa,(ndiel4,ndiel5,ndiel6,nstate_win))
- + + - -
+ + - - +
+ - + - +
- - + -
+ ]
692 : :
693 : : !DEBUG
694 : : !write(message,'(a)') 'After allocating wfrspa'
695 : : !call wrtout(std_out,message,'COLL')
696 : : !ENDDEBUG
697 : :
698 : 22 : weight=zero
699 : :
700 : : !Generate states in real space, only for states contributing to excitations in window
701 : 22 : istate=0
702 : :
703 [ + + ]: 54 : do isppol=1,nsppol
704 [ + + ]: 492 : do iband=1,nband_k(isppol)
705 : :
706 [ + + ]: 470 : if(flag_state_win(iband+(isppol-1)*nband_k(1)) == 1) then
707 : 432 : istate=istate+1
708 : 432 : index_state(iband+(isppol-1)*nband_k(1))=istate
709 : :
710 [ + + ]: 432 : if (am_master) then
711 : : #if defined HAVE_MPI
712 : : ! Obtain Fourier transform in fft box
713 : : cwavef(:,1:npw_k)=cg_tmp(:,1+(iband-1)*npw_k+(isppol-1)* &
714 [ + + + + ]: 1840092 : & (npw_k*nband_k(1)) : iband*npw_k+(isppol-1)*(npw_k*nband_k(1)))
715 : : #else
716 : : cwavef(:,1:npw_k)=cg(:,1+(iband-1)*npw_k+(isppol-1)* (npw_k*nband_k(1)) : iband*npw_k+(isppol-1)*(npw_k*nband_k(1)))
717 : : #endif
718 : :
719 : : ! write(std_out,*)' iband : ',iband, ' isppol', isppol, ' -> index ', &
720 : : ! & istate,index_state(iband+(isppol-1)*nband_k(1))
721 : :
722 : 336 : tim_fourwf=14
723 : : ! This call should be made by master, and then the results be sent to the other procs
724 : :
725 : : call fourwf(1,rhoaug,cwavef,dummy,wfraug,gbound,gbound,&
726 : : & istwf_k,kg_k,kg_k,mgfftdiel,mpi_enreg,1,ngfftdiel,npw_k,1,ndiel4,ndiel5,ndiel6,&
727 : 336 : & 0,tim_fourwf,weight,weight,gpu_option=dtset%gpu_option)
728 : :
729 : : ! write(std_out,'(a,i5)')' After Fourier proc ',me_loc
730 : :
731 : : ! Fix the phase, and checks that the wavefunction is real
732 : : ! (should be merged with routine fxphas)
733 : 336 : saa=zero ; sab=zero ; sbb=zero
734 [ + + ]: 12964 : do i3=1,ndiel3
735 [ + + ]: 501000 : do i2=1,ndiel2
736 [ + + ]: 22377136 : do i1=1,ndiel1
737 : 21876472 : saa=saa+wfraug(1,i1,i2,i3)**2
738 : 21876472 : sbb=sbb+wfraug(2,i1,i2,i3)**2
739 : 22364508 : sab=sab+wfraug(1,i1,i2,i3)*wfraug(2,i1,i2,i3)
740 : : end do
741 : : end do
742 : : end do
743 : :
744 [ - + ]: 336 : if(sbb>5.0d-9)then
745 : :
746 : : write(message, '(a,a,a,es20.10,a,i4,a,i2,a)' )&
747 : 0 : & 'The imaginary part of wavefunctions should be practically zero.',ch10,&
748 : 0 : & 'This is not the case, since sbb=',sbb,' for iband=',iband,'with sppol=',1,'.'
749 : 0 : ABI_WARNING(message)
750 [ # # ]: 0 : if(sbb>1.0d-7)then
751 : 0 : ABI_ERROR("sbb>1.0d-7")
752 : : end if
753 : : end if
754 : :
755 : : ! Possibility of writing to disk
756 : :
757 [ + + + + : 23103220 : wfrspa(:,:,:,istate)=wfraug(1,:,:,:)
+ + ]
758 : : end if !am_master
759 : :
760 : : end if
761 : :
762 : : ! End loop on iband
763 : : end do
764 : : ! End loop on nsppol
765 : : end do
766 : :
767 [ + + ]: 22 : if (am_master) then
768 [ - + ]: 18 : ABI_FREE(gbound)
769 [ - + ]: 18 : ABI_FREE(kg_k)
770 [ - + ]: 18 : ABI_FREE(cwavef)
771 [ - + ]: 18 : ABI_FREE(rhoaug)
772 [ - + ]: 18 : ABI_FREE(wfraug)
773 : : #if defined HAVE_MPI
774 [ - + ]: 18 : ABI_FREE(cg_tmp)
775 : : #else
776 : : #endif
777 : : end if
778 [ - + ]: 22 : ABI_FREE(flag_state_win)
779 : :
780 : : ! send wfrspa from master to world
781 : 22 : call xmpi_bcast(wfrspa,master,spaceComm,ierr)
782 : : !call MPI_BCAST(wfrspa,nbuf,MPI_DOUBLE_PRECISION,master,spaceComm,ierr)
783 : :
784 : :
785 : : !DEBUG
786 : : !#if defined HAVE_MPI
787 : : !call xmpi_barrier(spaceComm)
788 : : !write(message,'(a)')' after iband loop synchronization done...'
789 : : !call wrtout(std_out,message,'COLL')
790 : : !#endif
791 : : !ENDDEBUG
792 : :
793 : : !Compute the xc kernel, in the form needed for the singlet or triplet
794 : : !excitation energy.
795 : : !In the case ixc=20, kxc vanishes, but no change is made here, for simplicity.
796 : : !(ixc=20 implemented only in the not spin polarized case)
797 : :
798 : : !DEBUG
799 : : !write(std_out,*)' tddft : xc kernel '
800 : : !do ifft=1,nkxc,41
801 : : !write(std_out,*)ifft,kxc(ifft,1),kxc(ifft,2),kxc(ifft,3)
802 : : !enddo
803 : : !stop
804 : : !ENDDEBUG
805 : :
806 [ - + + - : 176 : ABI_MALLOC(kxc_for_tddft,(ndiel1,ndiel2,ndiel3,nsppol,nsppol,2/nsppol))
- + + - -
+ + - - +
+ - - + +
- - + + -
+ - + - -
+ - + ]
807 [ + + ]: 22 : if(dtset%ixc/=22)then
808 [ + + ]: 52 : do isppol=1,nsppol
809 [ + + ]: 103 : do jsppol=1,nsppol
810 : : index=1
811 [ + + ]: 2195 : do i3=1,ndiel3
812 [ + + ]: 91227 : do i2=1,ndiel2
813 [ + + ]: 4541914 : do i1=1,ndiel1
814 [ + + ]: 9479766 : do sing_trip=1,2/nsppol
815 : : kxc_for_tddft(i1,i2,i3,isppol,jsppol,sing_trip)=two/nsppol* &
816 : 9479766 : & (kxc(index,isppol+jsppol-1)-(sing_trip-1)*kxc(index,2))
817 : : end do
818 : 4539801 : index=index+1
819 : : end do
820 : : end do
821 : : end do
822 : : end do
823 : : end do
824 : : else
825 : : ! This is for the Burke-Petersilka-Gross hybrid, with ixc=22
826 : : ! However, the implementation in case of spin-polarized system should not be expected to be the correct one !
827 [ + + ]: 2 : do isppol=1,nsppol
828 [ + + ]: 3 : do jsppol=1,nsppol
829 : : index=1
830 [ + + ]: 32 : do i3=1,ndiel3
831 [ + + ]: 931 : do i2=1,ndiel2
832 [ + + ]: 27930 : do i1=1,ndiel1
833 [ + + ]: 81000 : do sing_trip=1,2/nsppol
834 : 81000 : kxc_for_tddft(i1,i2,i3,isppol,jsppol,sing_trip)=((-1)**(sing_trip+1))*kxc(index,2)
835 : : end do
836 : 27900 : index=index+1
837 : : end do
838 : : end do
839 : : end do
840 : : end do
841 : : end do
842 : : end if
843 : :
844 : 22 : pole_approx=0
845 : :
846 [ - + + - : 66 : ABI_MALLOC(excit_coords,(nexcit_win**2,2))
+ - + - -
+ - + ]
847 : :
848 : : if (xmpi_paral==1) then
849 [ - + + - : 66 : ABI_MALLOC(counts,(0:nproc_loc-1))
+ - + - -
+ - + ]
850 [ - + + - : 44 : ABI_MALLOC(displs,(0:nproc_loc-1))
- + - + ]
851 [ - + + - : 44 : ABI_MALLOC(recvcounts,(0:nproc_loc-1))
- + - + ]
852 [ - + + - : 94 : ABI_MALLOC(recvbuf,(5-nsppol,nproc_loc-1))
+ + + + +
- + - + +
- + - + ]
853 : : end if
854 : :
855 : : !DEBUG
856 : : !write(std_out,*)'before first loop'
857 : : !ENDDEBUG
858 : :
859 : : !0000000000000000000000000000000000000000000000000000000
860 : : !check if matrix file fname_tdexcit exists on disk
861 : : !if the file is present,calculation is a continuation
862 [ + + ]: 22 : if (am_master) then
863 : 18 : inquire(file=trim(dtfil%fnametmp_tdexcit),exist=file_exist)
864 : : ! for direct access to excitation file
865 [ + + ]: 18 : if(nsppol==1)then
866 : 12 : inquire(iolength=recl) omega_tddft_casida(1,1,1,1,1,1,1),omega_tddft_casida(1,1,1,1,1,1,1), iexcit,jexcit
867 : : else
868 : 6 : inquire(iolength=recl) omega_tddft_casida(1,1,1,1,1,1,1), iexcit,jexcit
869 : : end if
870 : :
871 : 18 : temp_unit2 = get_unit()
872 : 18 : open(temp_unit2, file=trim(dtfil%fnametmp_tdexcit),form='unformatted', recl=recl, access='DIRECT')
873 : :
874 [ - + + - : 72 : ABI_MALLOC(done_excit,(nexcit_win,nexcit_win))
- + + - +
- + - - +
- + ]
875 : :
876 [ - + ]: 18 : if(file_exist)then
877 : 0 : write(std_out,*)'TDDFT continues from a previous run'
878 : 0 : rec=0
879 [ # # ]: 0 : do iexcit=1,nexcit_win
880 : 0 : iexcit2 = indarr(iexcit)
881 : 0 : isppol2 = min((iexcit2-1)/nexcit_pol(1) +1,2)
882 : 0 : iunocc2 = (iexcit2-(isppol2-1)*nexcit_pol(1)-1)/nband_occ(isppol2)+1
883 : 0 : iocc2 = iexcit2-(isppol2-1)*nexcit_pol(1)-(iunocc2-1)*nband_occ(isppol2)
884 [ # # ]: 0 : do jexcit=1,nexcit_win
885 : 0 : iexcit1 = indarr(jexcit)
886 : 0 : isppol1 = min((iexcit1-1)/nexcit_pol(1) +1,2)
887 : 0 : iunocc1 = (iexcit1-(isppol1-1)*nexcit_pol(1)-1)/nband_occ(isppol1)+1
888 : 0 : iocc1 = iexcit1-(isppol1-1)*nexcit_pol(1)-(iunocc1-1)*nband_occ(isppol1)
889 : :
890 : 0 : rec=rec+1 ! record of the entry in the excitation file
891 [ # # ]: 0 : if(nsppol==1)then
892 : 0 : read(temp_unit2,rec=rec) omega_tddft_casida_dummy(1), omega_tddft_casida_dummy(2), idummy, jdummy
893 : : else
894 : 0 : read(temp_unit2,rec=rec) omega_tddft_casida_dummy(1), idummy, jdummy
895 : : end if
896 [ # # # # ]: 0 : done_excit(jexcit,iexcit)= ( idummy /= -1 .and. jdummy /= -1 ) ! if true, eigsqr_singlet and eigsqr_triplet are ok
897 : : ! and a true is marked in the logical array done_excit
898 [ # # ]: 0 : if (done_excit(jexcit,iexcit)) then
899 [ # # ]: 0 : do sing_trip=1,2/nsppol
900 : : omega_tddft_casida(iocc1,iunocc1,isppol1,iocc2,iunocc2,isppol2,sing_trip)= &
901 : 0 : & omega_tddft_casida_dummy(sing_trip)
902 : : end do
903 : : end if
904 : : end do
905 : : end do
906 : :
907 : : else
908 : 18 : write(std_out,*)'no excitation matrix on disk'
909 : 18 : write(std_out,*)'TDDFT starts from scratch'
910 [ + + + + ]: 31712 : done_excit = .false. ! initialize the logical array to false
911 : 18 : rec=0
912 [ + + ]: 628 : do iexcit=1,nexcit_win
913 [ + + ]: 31712 : do jexcit=1,nexcit_win
914 : 31084 : rec=rec+1
915 [ + + ]: 31694 : if(nsppol==1)then
916 : 5434 : write(temp_unit2,rec=rec) zero,zero,-1,-1
917 : : else
918 : 25650 : write(temp_unit2,rec=rec) zero,-1,-1
919 : : end if
920 : : end do
921 : : end do
922 : : end if
923 : :
924 : : ! Need to list the elements to compute, taking the symmetry into account: valid only for Gamma point but this is already the case
925 : 18 : count_to_do=0
926 [ + + ]: 628 : do iexcit=1,nexcit_win
927 [ + + ]: 16475 : do jexcit=1,iexcit
928 [ + - ]: 16457 : if (.not. done_excit(jexcit,iexcit)) then
929 : 15847 : count_to_do=count_to_do+1
930 : 15847 : excit_coords(count_to_do,1)=iexcit
931 : 15847 : excit_coords(count_to_do,2)=jexcit
932 : : end if
933 : : end do
934 : : end do
935 : :
936 [ - + ]: 18 : ABI_FREE(done_excit)
937 : :
938 : :
939 : :
940 : : if (xmpi_paral==1) then
941 : : ! Compute limits for load balancing
942 [ + + ]: 40 : do iproc=0,nproc_loc-1
943 : 22 : displs(iproc)=(iproc*count_to_do)/nproc_loc
944 : 40 : counts(iproc)=min(((iproc+1)*count_to_do)/nproc_loc,count_to_do)-displs(iproc)
945 : : end do
946 : : end if
947 : :
948 : : end if ! am_master
949 : :
950 : 22 : call xmpi_bcast(count_to_do,master,spaceComm,ierr)
951 : :
952 : 22 : displ=(me_loc*count_to_do)/nproc_loc
953 : 22 : count=min(((me_loc+1)*count_to_do)/nproc_loc,count_to_do)-displ
954 : 22 : displmax=((nproc_loc-1)*count_to_do)/nproc_loc
955 : 22 : countmax=count_to_do-displmax
956 : :
957 : 22 : write(message,'(A,I6)') 'Maximum number of matrix elements per processor = ',countmax
958 : 22 : call wrtout(std_out,message,'COLL')
959 : :
960 : : if (xmpi_paral==1) then
961 : : ! Need to dispatch the elements to compute to the different processes
962 [ - + + - : 66 : ABI_MALLOC(tmpbuf,(nexcit_win**2))
+ - + - -
+ - + ]
963 [ + + ]: 50706 : tmpbuf=0
964 : 22 : call xmpi_scatterv(excit_coords(:,1),counts,displs,tmpbuf,count,0,spaceComm,ierr)
965 [ + + ]: 50706 : excit_coords(:,1)=tmpbuf(:)
966 [ + + ]: 50706 : tmpbuf=0
967 : 22 : call xmpi_scatterv(excit_coords(:,2),counts,displs,tmpbuf,count,0,spaceComm,ierr)
968 [ + + ]: 50706 : excit_coords(:,2)=tmpbuf(:)
969 [ - + ]: 22 : ABI_FREE(tmpbuf)
970 : : end if
971 : :
972 : 22 : nfftdiel=ndiel1*ndiel2*ndiel3
973 [ - + + - : 110 : ABI_MALLOC(wfprod,(ndiel1,ndiel2,ndiel3))
- + + - -
+ + - + -
+ - - + -
+ ]
974 [ - + + - : 66 : ABI_MALLOC(work,(nfftdiel))
+ - + - -
+ - + ]
975 [ - + + - : 66 : ABI_MALLOC(sexc,(3,nexcit_win))
+ - + - -
+ - + -
+ ]
976 [ - + + - : 66 : ABI_MALLOC(done_sexc,(nexcit_win))
+ - + - -
+ - + -
+ ]
977 : : !ABI_MALLOC(done_sexc2,(nexcit_win))
978 [ - + + - : 66 : ABI_MALLOC(rhog,(2,nfftdiel))
+ - + - -
+ - + ]
979 [ - + + - : 44 : ABI_MALLOC(vhartr,(nfftdiel))
- + - + ]
980 : :
981 [ + + + + ]: 3582 : sexc(:,:)=zero
982 [ + + ]: 912 : done_sexc(:)=.false.
983 : :
984 : : !----------------------------------------------------------
985 : : !Main double loop
986 : :
987 : : old_iexcit=0
988 [ + + ]: 15873 : do ijexcit=1,countmax
989 : : ! we really loop only through count, but we need to go through countmax
990 : : ! to make sure that all processes execute MPI_Gatherv below
991 [ + + ]: 15851 : if (ijexcit <= count) then
992 : 15847 : iexcit=excit_coords(ijexcit,1)
993 : 15847 : jexcit=excit_coords(ijexcit,2)
994 : :
995 : 15847 : iexcit2 = indarr(iexcit)
996 : 15847 : isppol2 = min((iexcit2-1)/nexcit_pol(1) +1,2)
997 : 15847 : iunocc2 = (iexcit2-(isppol2-1)*nexcit_pol(1)-1)/nband_occ(isppol2)+1
998 : 15847 : iocc2 = iexcit2-(isppol2-1)*nexcit_pol(1)-(iunocc2-1)*nband_occ(isppol2)
999 : :
1000 : 15847 : iexcit1 = indarr(jexcit)
1001 : 15847 : isppol1 = min((iexcit1-1)/nexcit_pol(1) +1,2)
1002 : 15847 : iunocc1 = (iexcit1-(isppol1-1)*nexcit_pol(1)-1)/nband_occ(isppol1)+1
1003 : 15847 : iocc1 = iexcit1-(isppol1-1)*nexcit_pol(1)-(iunocc1-1)*nband_occ(isppol1)
1004 : :
1005 [ + + ]: 15847 : if (old_iexcit /= iexcit) then
1006 : : ! We start a new column of the matrix
1007 : : ! DEBUG
1008 : : ! write(message,'(a,i5,a,i3)')'treating iexcit = ',iexcit,&
1009 : : ! &' with proc ',me_loc
1010 : : ! call wrtout(std_out,message,'PERS')
1011 : : ! ENDDEBUG
1012 : :
1013 : : ! DEBUG
1014 : : ! write(message,'(a,i3)')'Multiplicating phi1 phi2, on proc ',me_loc
1015 : : ! call wrtout(std_out,message,'PERS')
1016 : : ! ENDDEBUG
1017 : :
1018 : : ifft=1
1019 [ + + ]: 25607 : do i3=1,ndiel3
1020 [ + + ]: 1064228 : do i2=1,ndiel2
1021 [ + + ]: 52165476 : do i1=1,ndiel1
1022 : : wfprod(i1,i2,i3)=wfrspa(i1,i2,i3,index_state(iocc2+(isppol2-1)*nband_k(1))) &
1023 : 51101862 : & *wfrspa(i1,i2,i3,index_state(iunocc2+nband_occ(isppol2)+(isppol2-1)*nband_k(1)))
1024 : 51101862 : work(ifft)=wfprod(i1,i2,i3)
1025 : 52140483 : ifft=ifft+1
1026 : : end do
1027 : : end do
1028 : : end do
1029 [ + + ]: 614 : if (jexcit == 1) then
1030 [ + + ]: 25423 : do i3=1,ndiel3
1031 [ + + ]: 1055334 : do i2=1,ndiel2
1032 [ + + ]: 51719796 : do i1=1,ndiel1
1033 [ + + ]: 203688369 : do idir=1,3
1034 : : poscart(idir)=rprimd(idir,1)*pos(i1,1)+&
1035 : : & rprimd(idir,2)*pos(i2,2)+&
1036 : 151993386 : & rprimd(idir,3)*pos(i3,3)
1037 : 202657848 : sexc(idir,iexcit)=sexc(idir,iexcit)+poscart(idir)*wfprod(i1,i2,i3)
1038 : : end do
1039 : : end do
1040 : : end do
1041 : 25423 : done_sexc(iexcit)=.true.
1042 : : end do
1043 : : end if
1044 : :
1045 : : ! For the singlet correction, must compute the hartre potential created
1046 : : ! by the product of wavefunctions
1047 : 614 : cplex=1
1048 : :
1049 : : ! DEBUG
1050 : : ! write(message,'(a,i3)')'Before Fourdp, on proc ',me_loc
1051 : : ! call wrtout(std_out,message,'PERS')
1052 : : ! ENDDEBUG
1053 : :
1054 : 614 : call fourdp(cplex,rhog,work,-1,mpi_enreg,nfftdiel,1,ngfftdiel,0)
1055 : :
1056 : : ! DEBUG
1057 : : ! write(message,'(a,i3)')'Before Hartree, on proc ',me_loc
1058 : : ! call wrtout(std_out,message,'PERS')
1059 : : ! write(std_out,*)'CPU ',me_loc,ch10,&
1060 : : ! & ' cplex : ',cplex,ch10,&
1061 : : ! & ' gmet(3,3) : ',gmet(3,3),ch10,&
1062 : : ! & ' gsqcut : ',gsqcut,ch10,&
1063 : : ! & ' rhog(1,1) :,',rhog(1,1),ch10,&
1064 : : ! & ' vhartr(1) :,',vhartr(1)
1065 : : ! ENDDEBUG
1066 : :
1067 : : call hartre(cplex,gsqcut,dtset%icutcoul,0,mpi_enreg,nfftdiel,ngfftdiel,&
1068 : 614 : &dtset%nkpt,dtset%rcut,rhog,rprimd,dtset%vcutgeo,vhartr)
1069 : :
1070 : : ! DEBUG
1071 : : ! write(message,'(a,i3)')'After Hartree, on proc ',me_loc
1072 : : ! call wrtout(std_out,message,'PERS')
1073 : : ! ENDDEBUG
1074 : : end if
1075 : 34521 : old_iexcit=iexcit
1076 : :
1077 : : ! DEBUG
1078 : : ! write(std_out,*)' treating iexcit = ',jexcit
1079 : : ! write(std_out,*)' indarr(iexcit) =',iexcit1,iocc1,iunocc1
1080 : : ! write(std_out,*)' index ',index_state(iocc1+(isppol1-1)*nband_k(1)), &
1081 : : ! & index_state(iunocc1+nband_occ(isppol1)+(isppol1-1)*nband_k(1))
1082 : : ! ENDDEBUG
1083 : :
1084 : : if(pole_approx==0 .or. (iunocc1==iunocc2 .and. iocc1==iocc2 .and. isppol1==isppol2))then
1085 [ + + ]: 34521 : sum_kernel(:)=zero
1086 : 15847 : f_sing_trip(1)=two/dble(nsppol)
1087 [ + + ]: 15847 : if(nsppol==1) f_sing_trip(2)=zero
1088 : : ! For Fermi-Amaldi kxc, the xc contribution is -1/2 the Hartree contribution
1089 : : ! to the triplet state. The following factors combines both contributions.
1090 [ + + ]: 15847 : if(dtset%ixc==20 .or. dtset%ixc==22)then
1091 [ + - ]: 570 : if(nsppol==1)then
1092 : 570 : f_sing_trip(1)= one
1093 : 570 : f_sing_trip(2)=-one
1094 : : end if
1095 : : end if
1096 : : ifft=1
1097 [ + + ]: 687541 : do i3=1,ndiel3
1098 [ + + ]: 29500219 : do i2=1,ndiel2
1099 [ + + ]: 1494141288 : do i1=1,ndiel1
1100 : : myproduct=wfrspa(i1,i2,i3,index_state(iocc1+(isppol1-1)*nband_k(1))) &
1101 : 1464656916 : & *wfrspa(i1,i2,i3,index_state(iunocc1+nband_occ(isppol1)+(isppol1-1)*nband_k(1)))
1102 [ + + ]: 3163331268 : do sing_trip=1,2/nsppol
1103 : : sum_kernel(sing_trip)=sum_kernel(sing_trip)+&
1104 : : & myproduct*(f_sing_trip(sing_trip)*vhartr(ifft)+kxc_for_tddft(i1,i2,i3,isppol1,isppol2,sing_trip) &
1105 : 3163331268 : *wfprod(i1,i2,i3))
1106 : : end do
1107 : 1493469594 : ifft=ifft+1
1108 : : end do ! i1
1109 : : end do ! i2
1110 : : end do ! i3
1111 : :
1112 : : ! The factor two is coherent with the formulas of Vasiliev et al
1113 : 15847 : factor=two*sqrtks(iexcit1)*sqrtks(iexcit2)*normint
1114 [ + + ]: 34521 : do sing_trip=1,2/nsppol
1115 : : omega_tddft_casida(iocc1,iunocc1,isppol1,iocc2,iunocc2,isppol2,sing_trip)= &
1116 : : & omega_tddft_casida(iocc1,iunocc1,isppol1,iocc2,iunocc2,isppol2,sing_trip)+ &
1117 : 34521 : & factor*sum_kernel(sing_trip)
1118 : : end do
1119 : :
1120 : : ! End condition of being diagonal element if pole approximation
1121 : : end if
1122 : :
1123 : : ! Continue writing excitation matrix
1124 [ + + ]: 15847 : if (am_master) then
1125 : : ! the master writes its results to disk
1126 [ + + ]: 12740 : if(nsppol==1)then
1127 : : write(temp_unit2, rec=(iexcit-1)*nexcit_win+jexcit ) &
1128 : 2827 : & omega_tddft_casida(iocc1,iunocc1,isppol1,iocc2,iunocc2,isppol2,1),&
1129 : 2827 : & omega_tddft_casida(iocc1,iunocc1,isppol1,iocc2,iunocc2,isppol2,2),&
1130 : 5654 : & iexcit, jexcit
1131 : : else
1132 : : write(temp_unit2, rec=(iexcit-1)*nexcit_win+jexcit ) &
1133 : 9913 : & omega_tddft_casida(iocc1,iunocc1,isppol1,iocc2,iunocc2,isppol2,1), &
1134 : 19826 : & iexcit, jexcit
1135 : : end if
1136 : :
1137 : : ! DEBUG
1138 : : ! if(nsppol==1)then
1139 : : ! write(std_out,*)'singlet: ',omega_tddft_casida(iocc1,iunocc1,isppol1,iocc2,iunocc2,isppol2,1),&
1140 : : ! & 'iexcit: ',iexcit,'jexcit :',jexcit
1141 : : ! write(std_out,*)'triplet: ',omega_tddft_casida(iocc1,iunocc1,isppol1,iocc2,iunocc2,isppol2,2),&
1142 : : ! & 'iexcit: ',iexcit,'jexcit :',jexcit
1143 : : ! else
1144 : : ! write(std_out,*)'excitation: ',omega_tddft_casida(iocc1,iunocc1,isppol1,iocc2,iunocc2,isppol2,1),&
1145 : : ! & 'iexcit: ',iexcit,'jexcit :',jexcit
1146 : : ! endif
1147 : : ! ENDDEBUG
1148 : :
1149 : 12740 : sendcount=0
1150 : : else
1151 : 3107 : sendcount=5-nsppol
1152 : :
1153 [ - + ]: 3107 : if(nsppol==1)then
1154 : : sendbuf=(/ omega_tddft_casida(iocc1,iunocc1,isppol1,iocc2,iunocc2,isppol2,1), &
1155 : : & omega_tddft_casida(iocc1,iunocc1,isppol1,iocc2,iunocc2,isppol2,2), &
1156 [ # # ]: 0 : & real(iexcit,dp), real(jexcit,dp) /)
1157 : : else
1158 : : sendbuf=(/ omega_tddft_casida(iocc1,iunocc1,isppol1,iocc2,iunocc2,isppol2,1), &
1159 [ + + ]: 12428 : & real(iexcit,dp), real(jexcit,dp) /)
1160 : : end if
1161 : : end if ! am_master
1162 : : else
1163 : : ! ijexcit > count
1164 : :
1165 : : ! done with local work, so send message of zero length
1166 : 4 : sendcount=0
1167 : :
1168 : : end if ! ijexcit <= count
1169 : :
1170 : 22 : if (xmpi_paral==1) then
1171 [ + + ]: 15851 : if (am_master) then
1172 : :
1173 : : ! Compute displacements and counts for the gathering of the results
1174 : 12742 : displs(0)=0
1175 : 12742 : recvcounts(0)=0
1176 [ + + ]: 15851 : do iproc=1,nproc_loc-1
1177 : 3109 : recvcounts(iproc)=min(((iproc+1)*count_to_do)/nproc_loc,count_to_do)-(iproc*count_to_do)/nproc_loc
1178 [ + + + + ]: 3109 : if (recvcounts(iproc) < countmax .and. ijexcit==countmax) then
1179 : 2 : recvcounts(iproc)=0
1180 : : else
1181 : 3107 : recvcounts(iproc)=5-nsppol
1182 : : end if
1183 : 15851 : displs(iproc)=displs(iproc-1)+recvcounts(iproc-1)
1184 : : end do
1185 : : end if
1186 : :
1187 [ + + ]: 15851 : if (nproc_loc>1) then
1188 [ + + + + ]: 19896 : cptr=c_loc(recvbuf) ; call c_f_pointer(cptr,recvbuf_ptr,[size(recvbuf)])
1189 : 4974 : call xmpi_gatherv(sendbuf,sendcount,recvbuf_ptr,recvcounts,displs,0,spaceComm,ierr)
1190 : : end if
1191 : :
1192 [ + + ]: 15851 : if (am_master) then
1193 : :
1194 : : ! Extract eigsqr_singlet, eigsqr_triplet, iexcit, jexcit from receive buffer and
1195 : : ! write to file
1196 [ + + + + ]: 31700 : do ijexcit2=1,sum(recvcounts)/(5-nsppol)
1197 : 3107 : iexcit=int(recvbuf(4-nsppol,ijexcit2))
1198 : 3107 : jexcit=int(recvbuf(5-nsppol,ijexcit2))
1199 : :
1200 : 3107 : iexcit2 = indarr(iexcit)
1201 : 3107 : isppol2 = min((iexcit2-1)/nexcit_pol(1) +1,2)
1202 : 3107 : iunocc2 = (iexcit2-(isppol2-1)*nexcit_pol(1)-1)/nband_occ(isppol2)+1
1203 : 3107 : iocc2 = iexcit2-(isppol2-1)*nexcit_pol(1)-(iunocc2-1)*nband_occ(isppol2)
1204 : :
1205 : 3107 : iexcit1 = indarr(jexcit)
1206 : 3107 : isppol1 = min((iexcit1-1)/nexcit_pol(1) +1,2)
1207 : 3107 : iunocc1 = (iexcit1-(isppol1-1)*nexcit_pol(1)-1)/nband_occ(isppol1)+1
1208 : 3107 : iocc1 = iexcit1-(isppol1-1)*nexcit_pol(1)-(iunocc1-1)*nband_occ(isppol1)
1209 : :
1210 [ + + ]: 6214 : do sing_trip=1,2/nsppol
1211 : : omega_tddft_casida(iocc1,iunocc1,isppol1,iocc2,iunocc2,isppol2,sing_trip)= &
1212 : 6214 : & recvbuf(sing_trip,ijexcit2)
1213 : : end do
1214 : :
1215 [ - + ]: 15849 : if(nsppol==1)then
1216 : : write(temp_unit2, rec=(iexcit-1)*nexcit_win+jexcit ) &
1217 : 0 : & omega_tddft_casida(iocc1,iunocc1,isppol1,iocc2,iunocc2,isppol2,1), &
1218 : 0 : & omega_tddft_casida(iocc1,iunocc1,isppol1,iocc2,iunocc2,isppol2,2), &
1219 : 0 : & iexcit, jexcit
1220 : : else
1221 : : write(temp_unit2, rec=(iexcit-1)*nexcit_win+jexcit ) &
1222 : 3107 : omega_tddft_casida(iocc1,iunocc1,isppol1,iocc2,iunocc2,isppol2,1), &
1223 : 6214 : & iexcit, jexcit
1224 : : end if
1225 : : ! DEBUG
1226 : : ! if(nsppol==1)then
1227 : : ! write(std_out,*)'singlet: ',omega_tddft_casida(iocc1,iunocc1,isppol1,iocc2,iunocc2,isppol2,1), &
1228 : : ! & 'iexcit: ',iexcit,'jexcit :',jexcit
1229 : : ! write(std_out,*)'triplet: ',omega_tddft_casida(iocc1,iunocc1,isppol1,iocc2,iunocc2,isppol2,2),
1230 : : ! & 'iexcit: ',iexcit,'jexcit :',jexcit
1231 : : ! else
1232 : : ! write(std_out,*)'excitation: ',omega_tddft_casida(iocc1,iunocc1,isppol1,iocc2,iunocc2,isppol2,1), &
1233 : : ! & 'iexcit: ',iexcit,'jexcit :',jexcit
1234 : : ! endif
1235 : : ! ENDDEBUG
1236 : :
1237 : : end do
1238 : :
1239 : : end if
1240 : : end if ! MPI parallel
1241 : :
1242 : : ! End indices loops
1243 : : end do ! ijexcit
1244 : :
1245 : : !End of the main double loop
1246 : : !--------------------------------------------------------------------
1247 : :
1248 : :
1249 : : if (xmpi_paral==1) then
1250 : : ! sexc needs to be summed here since it used only by master
1251 : 22 : call xmpi_barrier(spaceComm)
1252 : : ! call xmpi_sum_master(sexc,master,spaceComm,ierr) ! Does not work on some machines
1253 : 22 : call xmpi_sum(sexc,spaceComm,ierr)
1254 : 22 : call xmpi_lor(done_sexc,spaceComm)
1255 : : !done_sexc2=done_sexc
1256 : : !call MPI_Reduce(done_sexc2,done_sexc,nexcit_win,MPI_LOGICAL,MPI_LOR,master,spaceComm,ierr)
1257 : : end if
1258 : :
1259 : :
1260 [ + + ]: 22 : if (am_master) then
1261 : : ! We compute sexc again if it was not done. Will only be executed if
1262 : : ! there was a restart from values read from logical unit temp_unit2.
1263 : :
1264 [ + + ]: 628 : do iexcit=1,nexcit_win
1265 : :
1266 : : ! DEBUG
1267 : : ! write(std_out,*)'do on excitation',iexcit
1268 : : ! END DEBUG
1269 : :
1270 [ - + ]: 628 : if (.not.done_sexc(iexcit)) then
1271 : 0 : iexcit2 = indarr(iexcit)
1272 : 0 : isppol2 = min((iexcit2-1)/nexcit_pol(1) +1,2)
1273 : 0 : iunocc2 = (iexcit1-(isppol2-1)*nexcit_pol(1)-1)/nband_occ(isppol2)+1
1274 : 0 : iocc2 = iexcit2-(isppol2-1)*nexcit_pol(1)-(iunocc2-1)*nband_occ(isppol2)
1275 [ # # ]: 0 : do i3=1,ndiel3
1276 [ # # ]: 0 : do i2=1,ndiel2
1277 [ # # ]: 0 : do i1=1,ndiel1
1278 : : wfprod(i1,i2,i3)=wfrspa(i1,i2,i3,index_state(iocc2+(isppol2-1)*nband_k(1))) &
1279 : 0 : & *wfrspa(i1,i2,i3,index_state(iunocc2+nband_occ(isppol2)+ (isppol2-1)*nband_k(1)))
1280 [ # # ]: 0 : do idir=1,3
1281 : : poscart(idir)=rprimd(idir,1)*pos(i1,1)+&
1282 : : & rprimd(idir,2)*pos(i2,2)+&
1283 : 0 : & rprimd(idir,3)*pos(i3,3)
1284 : 0 : sexc(idir,iexcit)=sexc(idir,iexcit)+poscart(idir)*wfprod(i1,i2,i3)
1285 : : end do
1286 : : end do
1287 : : end do
1288 : : end do
1289 : : end if
1290 : : end do
1291 : : end if
1292 : :
1293 [ - + ]: 22 : ABI_FREE(work)
1294 [ - + ]: 22 : ABI_FREE(rhog)
1295 [ - + ]: 22 : ABI_FREE(pos)
1296 [ - + ]: 22 : ABI_FREE(vhartr)
1297 [ - + ]: 22 : ABI_FREE(kxc_for_tddft)
1298 [ - + ]: 22 : ABI_FREE(wfprod)
1299 [ - + ]: 22 : ABI_FREE(index_state)
1300 [ - + ]: 22 : ABI_FREE(excit_coords)
1301 [ - + ]: 22 : ABI_FREE(wfrspa)
1302 : :
1303 : : !Write the first excitation energies
1304 : 22 : write(message, '(a,a,es18.8,a,a,a,a,a,a,a,a,a)' )ch10,&
1305 : 22 : & ' Ground state total energy (Ha) :',etotal,ch10,ch10,&
1306 : 22 : & ' Kohn-Sham energy differences,',ch10,&
1307 : 22 : & ' corresponding total energies and oscillator strengths (X,Y,Z and average)-',ch10,&
1308 : 22 : & ' (oscillator strengths smaller than 1.e-6 are set to zero)',ch10,&
1309 : 44 : & ' Transition (Ha) and (eV) Tot. Ene. (Ha) Aver XX YY ZZ'
1310 : 22 : call wrtout(ab_out,message,'COLL')
1311 : 22 : call wrtout(std_out,message,'COLL')
1312 : :
1313 : : if (xmpi_paral==1) then
1314 [ - + ]: 22 : ABI_FREE(counts)
1315 [ - + ]: 22 : ABI_FREE(displs)
1316 [ - + ]: 22 : ABI_FREE(recvbuf)
1317 [ - + ]: 22 : ABI_FREE(recvcounts)
1318 : : end if
1319 : :
1320 [ + + ]: 22 : if (am_master) then
1321 : :
1322 [ - + + - : 54 : ABI_MALLOC(osc_str,(7,nexcit))
+ - + - -
+ - + ]
1323 : :
1324 [ + + ]: 628 : do iexcit=1,nexcit_win
1325 : 610 : iexcit2 = indarr(iexcit)
1326 : 610 : isppol = min((iexcit2-1)/nexcit_pol(1) +1,2)
1327 : 610 : iunocc = (iexcit2-(isppol-1)*nexcit_pol(1)-1)/nband_occ(isppol)+1
1328 : 610 : iocc = iexcit2-(isppol-1)*nexcit_pol(1)-(iunocc-1)*nband_occ(isppol)
1329 : :
1330 : 610 : osc_str(1,iexcit)=zero
1331 [ + + ]: 2440 : do idir=1,3
1332 : : ! One of the factor of two comes from the spin degeneracy,
1333 : : ! the other comes from Eq.(40) of Casida
1334 : : osc_str(idir+1,iexcit)=&
1335 : 1830 : & (sexc(idir,iexcit)*sqrtks(iexcit2)*normint*ucvol)**2*two*two/nsppol
1336 : : osc_str(1,iexcit)=osc_str(1,iexcit)&
1337 : 2440 : & +osc_str(idir+1,iexcit)*third
1338 : : end do
1339 [ + + ]: 3050 : do ii=1,4
1340 [ + + ]: 3050 : if(abs(osc_str(ii,iexcit))<tol6)osc_str(ii,iexcit)=zero
1341 : : end do
1342 : : ! Changed, the whole spectrum is written
1343 : : ! The array eexcit has been reordered previously, the others also
1344 [ + + ]: 610 : if(nsppol==1)then
1345 : : write(message, '(i4,a,i3,2es12.5,es13.5,es11.4,3es9.2)' ) &
1346 : 220 : & iocc,'->',iunocc+nband_occ(isppol), &
1347 : 220 : & eexcit(iexcit), eexcit(iexcit)*Ha_eV,eexcit(iexcit)+etotal, &
1348 : : ! XG 020209 : Jean-Yves, I assume that the printout of sexc is for debugging ?!
1349 : : ! & osc_str(1:4,iexcit),sexc(1:3,iexcit)
1350 : 440 : & osc_str(1:4,iexcit)
1351 : : else
1352 : : write(message, '(i4,a,i3,a,i1,2es12.5,es13.5,es11.4,3es9.2)' ) &
1353 : 390 : & iocc,'->',iunocc+nband_occ(isppol),' s:',isppol, &
1354 : 390 : & eexcit(iexcit), eexcit(iexcit)*Ha_eV,eexcit(iexcit)+etotal, &
1355 : 780 : & osc_str(1:4,iexcit)
1356 : : end if
1357 : 610 : call wrtout(ab_out,message,'COLL')
1358 : 628 : call wrtout(std_out,message,'COLL')
1359 : :
1360 : : end do
1361 : :
1362 : : ! Check of the Sum rule for Casida eq.47,
1363 : : ! only exact if complete basis of excitations, as well as local potentials only.
1364 : 18 : sumx=zero
1365 [ + + ]: 628 : do iexcit=1,nexcit_win
1366 : 628 : sumx=sumx+osc_str(1,iexcit)
1367 : : end do
1368 : 18 : write(message, '(a,es16.6)' )' Sum of osc. strength : ',sumx
1369 : 18 : call wrtout(ab_out,message,'COLL')
1370 : 18 : call wrtout(std_out,message,'COLL')
1371 : :
1372 : : ! -Diagonalize the excitation matrices----------------------------
1373 : :
1374 [ - + + - : 54 : ABI_MALLOC(eexcit2,(nexcit_win))
+ - + - -
+ - + ]
1375 [ - + + - : 72 : ABI_MALLOC(vec,(2,nexcit_win,nexcit_win))
- + + - +
- + - - +
- + ]
1376 : :
1377 [ + + ]: 48 : do sing_trip=1,2/nsppol
1378 : :
1379 : : if(pole_approx==0)then
1380 : :
1381 [ - + + - : 90 : ABI_MALLOC(matr,(nexcit_win*(nexcit_win+1)))
+ - + - -
+ - + ]
1382 [ + - - + : 90 : ABI_MALLOC(zhpev1,(2,2*nexcit_win-1))
+ - + - +
- - + -
+ ]
1383 [ + - - + : 90 : ABI_MALLOC(zhpev2,(3*nexcit_win-2))
+ - + - +
- - + -
+ ]
1384 [ + + ]: 37378 : matr(:)=zero
1385 : 30 : ier=0
1386 : : ! DEBUG
1387 : : ! write(std_out,*)' after allocation matrices '
1388 : : ! ENDDEBUG
1389 : :
1390 : :
1391 : : ! Store the matrix in proper mode before calling zhpev
1392 : :
1393 : 30 : index=1
1394 [ + + ]: 860 : do iexcit=1,nexcit_win
1395 : 830 : iexcit2 = indarr(iexcit)
1396 : 830 : isppol2 = min((iexcit2-1)/nexcit_pol(1) +1,2)
1397 : 830 : iunocc2 = (iexcit2-(isppol2-1)*nexcit_pol(1)-1)/nband_occ(isppol2)+1
1398 : 830 : iocc2 = iexcit2-(isppol2-1)*nexcit_pol(1)-(iunocc2-1)*nband_occ(isppol2)
1399 [ + + ]: 19534 : do jexcit=1,iexcit
1400 : 18674 : iexcit1 = indarr(jexcit)
1401 : 18674 : isppol1 = min((iexcit1-1)/nexcit_pol(1) +1,2)
1402 : 18674 : iunocc1 = (iexcit1-(isppol1-1)*nexcit_pol(1)-1)/nband_occ(isppol1)+1
1403 : 18674 : iocc1 = iexcit1-(isppol1-1)*nexcit_pol(1)-(iunocc1-1)*nband_occ(isppol1)
1404 : :
1405 : 18674 : matr(index)=omega_tddft_casida(iocc1,iunocc1,isppol1,iocc2,iunocc2,isppol2,sing_trip)
1406 : 18674 : matr(index+1)=zero
1407 : 19504 : index=index+2
1408 : : end do
1409 : :
1410 : : end do
1411 : :
1412 : : ! DEBUG
1413 : : ! write(std_out,*)' after filling matrices '
1414 : : ! ENDDEBUG
1415 : :
1416 : : call ZHPEV ('V','U',nexcit_win,matr,eexcit2,vec,nexcit_win,zhpev1,&
1417 : 30 : & zhpev2,ier)
1418 : :
1419 [ - + ]: 30 : ABI_FREE(matr)
1420 [ - + ]: 30 : ABI_FREE(zhpev1)
1421 [ - + ]: 30 : ABI_FREE(zhpev2)
1422 : : ! DEBUG
1423 : : ! write(std_out,*)' after deallocating matrices '
1424 : : ! ENDDEBUG
1425 : :
1426 : :
1427 : : else
1428 : :
1429 : : vec(:,:,:)=zero
1430 : : do isppol=1, nsppol
1431 : : do iunocc=1,nband_k(isppol)
1432 : : do iocc=1,nband_k(isppol)
1433 : : index=iocc+nband_k(isppol)*(iunocc-1)+(isppol-1)*nexcit_pol(1)
1434 : : eexcit2(index)=omega_tddft_casida(iocc,iunocc,isppol,iocc,iunocc,isppol,sing_trip)
1435 : : vec(1,index,index)=one
1436 : : end do
1437 : : end do
1438 : : end do
1439 : :
1440 : : end if
1441 : :
1442 : : ! Compute the excitation energies from the square root of eexcit2
1443 : : ! eexcit(:)=sqrt(eexcit2(:)
1444 : :
1445 [ - + ]: 30 : ABI_FREE(eexcit)
1446 [ - + + - : 90 : ABI_MALLOC(eexcit,(nexcit_win))
+ - + - -
+ - + ]
1447 : :
1448 [ + + ]: 860 : eexcit(:)=sqrt(dabs(eexcit2(:))+tol10**2)
1449 : : ! Write the first excitation energies
1450 [ + + ]: 30 : if(sing_trip==1)then
1451 [ + + ]: 18 : if(nsppol==1)then
1452 : 12 : write(message, '(a,a,a,a,a,a)' )ch10,&
1453 : 12 : & ' TDDFT singlet excitation energies (at most 20 of them are printed),',ch10,&
1454 : 12 : & ' and corresponding total energies. ',ch10,&
1455 : 24 : & ' Excit# (Ha) and (eV) total energy (Ha) major contributions '
1456 : : else
1457 : 6 : write(message, '(a,a,a,a,a,a)' )ch10,&
1458 : 6 : & ' TDDFT mixed excitation energies (at most 40 of them are printed),',ch10,&
1459 : 6 : & ' and corresponding total energies. ',ch10,&
1460 : 12 : & ' Excit# (Ha) and (eV) total energy (Ha) major contributions '
1461 : : end if
1462 : : else
1463 : 12 : write(message, '(a,a,a,a,a,a)' )ch10,&
1464 : 12 : & ' TDDFT triplet excitation energies (at most 20 of them are printed),',ch10,&
1465 : 12 : & ' and corresponding total energies. ',ch10,&
1466 : 24 : & ' Excit# (Ha) and (eV) total energy (Ha) major contributions '
1467 : : end if
1468 : 30 : call wrtout(ab_out,message,'COLL')
1469 : 30 : call wrtout(std_out,message,'COLL')
1470 : 30 : call wrtout(std_out,' tddft : before iexcit loop',"COLL")
1471 : :
1472 [ + + ]: 500 : do iexcit=1,min(nexcit_win,nexcitout)
1473 : 470 : write(std_out,*)' tddft : iexcit=',iexcit
1474 : : ! Select largest and next contributions
1475 : 470 : flargest=zero ; fnext=zero
1476 : 470 : nlargest=0 ; nnext=0
1477 [ + + ]: 470 : if(nsppol==2)then
1478 : 120 : fnext1=zero ; fnext2=zero
1479 : 120 : nnext1=0 ; nnext2=0
1480 : : end if
1481 [ + + ]: 15988 : do jexcit=1,nexcit_win
1482 : 15518 : ff=vec(1,jexcit,iexcit)**2+vec(2,jexcit,iexcit)**2
1483 [ + + ]: 15988 : if(ff>flargest+tol12)then
1484 [ + + ]: 1475 : if(nsppol==2)then
1485 : 392 : nnext2=nnext1 ; fnext2=fnext1
1486 : 392 : nnext1=nnext ; fnext1=fnext
1487 : : end if
1488 : 1475 : nnext=nlargest ; fnext=flargest
1489 : 1475 : nlargest=indarr(jexcit) ; flargest=ff
1490 [ + + ]: 14043 : else if(ff>fnext+tol12)then
1491 [ + + ]: 825 : if(nsppol==2)then
1492 : 256 : nnext2=nnext1 ; fnext2=fnext1
1493 : 256 : nnext1=nnext ; fnext1=fnext
1494 : : end if
1495 : 825 : nnext=indarr(jexcit) ; fnext=ff
1496 [ + + ]: 13218 : else if(nsppol==2)then
1497 [ + + ]: 7152 : if(ff>fnext1+tol12)then
1498 : 228 : nnext2=nnext1 ; fnext2=fnext1
1499 : 228 : nnext1=indarr(jexcit) ; fnext1=ff
1500 [ + + ]: 6924 : else if(ff>fnext2+tol12)then
1501 : 224 : nnext2=indarr(jexcit) ; fnext2=ff
1502 : : end if
1503 : : end if
1504 : :
1505 : : end do
1506 : :
1507 : 470 : isppol_l = min((nlargest-1)/nexcit_pol(1) +1,nsppol)
1508 : 470 : iunocc_l = (nlargest-(isppol_l-1)*nexcit_pol(1)-1)/nband_occ(isppol_l)+1
1509 : 470 : iocc_l = nlargest-(isppol_l-1)*nexcit_pol(1)-(iunocc_l-1)*nband_occ(isppol_l)
1510 : 470 : isppol_n = min((nnext-1)/nexcit_pol(1) +1,nsppol)
1511 : 470 : iunocc_n = (nnext-(isppol_n-1)*nexcit_pol(1)-1)/nband_occ(isppol_n)+1
1512 : 470 : iocc_n = nnext-(isppol_n-1)*nexcit_pol(1)-(iunocc_n-1)*nband_occ(isppol_n)
1513 [ + + ]: 470 : if(nsppol==2)then
1514 : 120 : isppol_n1 = min((nnext1-1)/nexcit_pol(1) +1,nsppol)
1515 : 120 : iunocc_n1 = (nnext1-(isppol_n1-1)*nexcit_pol(1)-1)/nband_occ(isppol_n1)+1
1516 : 120 : iocc_n1 = nnext1-(isppol_n1-1)*nexcit_pol(1)-(iunocc_n1-1)*nband_occ(isppol_n1)
1517 : 120 : isppol_n2 = min((nnext2-1)/nexcit_pol(1) +1,nsppol)
1518 : 120 : iunocc_n2 = (nnext2-(isppol_n2-1)*nexcit_pol(1)-1)/nband_occ(isppol_n2)+1
1519 : 120 : iocc_n2 = nnext2-(isppol_n2-1)*nexcit_pol(1)-(iunocc_n2-1)*nband_occ(isppol_n2)
1520 : : end if
1521 : :
1522 [ + + ]: 500 : if(nsppol==1)then
1523 : : write(message,'(i4,es15.5,es14.5,es16.6,f8.2,a,i3,a,i3,a,f6.2,a,i3,a,i3,a)') &
1524 : 350 : & iexcit,eexcit(iexcit),&
1525 : 350 : & eexcit(iexcit)*Ha_eV,eexcit(iexcit)+etotal,&
1526 : 350 : & flargest,'(',iocc_l,'->',iunocc_l+nband_occ(1),')',&
1527 : 700 : & fnext, '(',iocc_n,'->',iunocc_n+nband_occ(1),')'
1528 : 350 : call wrtout(ab_out,message,'COLL')
1529 : 350 : call wrtout(std_out,message,'COLL')
1530 : : else
1531 : 120 : write(chain1,'(f8.2,a,i3,a,i3,a)')flargest,'(',iocc_l,'->',iunocc_l+nband_occ(isppol_l),')'
1532 : 120 : write(chain2,'(f8.2,a,i3,a,i3,a)')fnext,'(',iocc_n,'->',iunocc_n+nband_occ(isppol_n),')'
1533 [ + + ]: 120 : if(trim(chain1)==trim(chain2))then
1534 : : write(message,'(i4,es15.5,es14.5,es16.6,a,a,a,a)') &
1535 : 80 : & iexcit,eexcit(iexcit),&
1536 : 160 : & eexcit(iexcit)*Ha_eV,eexcit(iexcit)+etotal,trim(chain1),'(1)',trim(chain2),'(2)'
1537 : : else
1538 : : write(message,'(i4,es15.5,es14.5,es16.6,a,a,i1,a,a,a,i1,a)') &
1539 : 40 : & iexcit,eexcit(iexcit),&
1540 : 40 : & eexcit(iexcit)*Ha_eV,eexcit(iexcit)+etotal,trim(chain1),'(',isppol_l,')',&
1541 : 80 : & trim(chain2),'(',isppol_n,')'
1542 : : end if
1543 : 120 : call wrtout(ab_out,message,'COLL')
1544 : 120 : call wrtout(std_out,message,'COLL')
1545 : 120 : write(chain1,'(f8.2,a,i3,a,i3,a)')fnext1,'(',iocc_n1,'->',iunocc_n1+nband_occ(isppol_n1),')'
1546 : 120 : write(chain2,'(f8.2,a,i3,a,i3,a)')fnext2,'(',iocc_n2,'->',iunocc_n2+nband_occ(isppol_n2),')'
1547 [ + + ]: 120 : if(trim(chain1)==trim(chain2))then
1548 : : write(message,'(a,a,a,a,a)' ) &
1549 : 80 : & ' ',&
1550 : 160 : & chain1,'(1)',chain2,'(2)'
1551 : : else
1552 : : write(message,'(a,a,a,i1,a,a,a,i1,a)' ) &
1553 : 40 : & ' ',&
1554 : 40 : & chain1,'(',isppol_n1,')',&
1555 : 80 : & chain2,'(',isppol_n2,')'
1556 : : end if
1557 : 120 : call wrtout(ab_out,message,'COLL')
1558 : 120 : call wrtout(std_out,message,'COLL')
1559 : : end if
1560 : : end do
1561 : :
1562 : : ! For each iexcit excitation, compute the oscillator strength (Casida, eq 47)
1563 : 30 : write(message, '(a,a,a,a)' )ch10,&
1564 : 30 : & ' Oscillator strengths : (elements smaller than 1.e-6 are set to zero)',ch10,&
1565 : 60 : & ' Excit# (Ha) Average XX YY ZZ XY XZ YZ'
1566 : 30 : call wrtout(ab_out,message,'COLL')
1567 : 30 : call wrtout(std_out,message,'COLL')
1568 : :
1569 [ + + ]: 860 : do iexcit=1,nexcit_win
1570 : :
1571 : : ! One of the factor of two comes from the spin degeneracy,
1572 : : ! the other comes from Eq.(40) of Casida
1573 : 830 : factor=(normint*ucvol)**2*two*two/nsppol
1574 : :
1575 [ + + ]: 6640 : osc_str(:,iexcit)=zero
1576 : :
1577 : : ! factor=(normint*ucvol)**2*two*two/nsppol
1578 : :
1579 [ + + ]: 37348 : do jexcit=1,nexcit_win
1580 : 36518 : jexcit_cbase=indarr(jexcit)
1581 [ + + ]: 146902 : do idir=1,3
1582 : : osc_str(idir+1,iexcit)=osc_str(idir+1,iexcit)+ &
1583 : : & sexc(idir,jexcit)*sqrtks(jexcit_cbase)*sqrt(factor)* &
1584 : 146072 : & vec(1,jexcit,iexcit)
1585 : : end do ! idir
1586 : : end do ! jexcit
1587 : :
1588 : : ! The "standard" definition of the oscillator strength is the square
1589 : : ! of the matrix elements.
1590 : : ! So, instead of the coding
1591 : : ! do idir=1,3
1592 : : ! osc_str(1,iexcit)=osc_str(1,iexcit)+osc_str(idir+1,iexcit)**2*third
1593 : : ! enddo
1594 : : ! I think that the following is more "standard"
1595 : : ! Now, osc_str(2:4,iexcit) are the X, Y and Z matrix elements, not
1596 : : ! yet the oscillator strengths
1597 : 830 : osc_str(5,iexcit)=osc_str(2,iexcit)*osc_str(3,iexcit) ! off diag XY
1598 : 830 : osc_str(6,iexcit)=osc_str(2,iexcit)*osc_str(4,iexcit) ! off diag XZ
1599 : 830 : osc_str(7,iexcit)=osc_str(3,iexcit)*osc_str(4,iexcit) ! off diag ZZ
1600 [ + + ]: 3320 : do idir=1,3
1601 : : ! Here the X,Y, and Z matrix elements are combined to give diagonal osc. strengths
1602 : 2490 : osc_str(idir+1,iexcit)=osc_str(idir+1,iexcit)**2
1603 : 3320 : osc_str(1,iexcit)=osc_str(1,iexcit)+osc_str(idir+1,iexcit)*third ! compute the trace
1604 : : end do
1605 : : ! At this stage, osc_str(1,iexcit) is exactly the same as from your coding
1606 : : ! ***End of section to be checked
1607 : :
1608 [ + + ]: 6640 : do ii=1,7
1609 [ + + ]: 6640 : if(abs(osc_str(ii,iexcit))<tol6)osc_str(ii,iexcit)=zero
1610 : : end do
1611 : : ! XG 020209 : Jean-Yves, the off-diagonal oscillator strengths
1612 : : ! can become negative. It is important for automatic
1613 : : ! checking that the numbers are separated by a blank, even
1614 : : ! if they are negative. So replace the following format, to have at least one blank.
1615 : 830 : write(message, '(i4,es12.5,es10.3,3es10.3,3es10.2)' )iexcit,eexcit(iexcit),osc_str(1:7,iexcit)
1616 : 830 : call wrtout(ab_out,message,'COLL')
1617 : 860 : call wrtout(std_out,message,'COLL')
1618 : : end do
1619 : :
1620 : : ! Check of the Sum rule for Casida eq.47,
1621 : : ! only exact if complete basis of excitations, as well as local potentials only.
1622 : 30 : sumx=zero
1623 [ + + ]: 860 : do iexcit=1,nexcit_win
1624 : 860 : sumx=sumx+osc_str(1,iexcit)
1625 : : end do
1626 : 30 : write(message, '(a,es16.6)' )' Sum of osc. strength : ',sumx
1627 : 30 : call wrtout(ab_out,message,'COLL')
1628 : 30 : call wrtout(std_out,message,'COLL')
1629 : :
1630 : : ! If singlet, compute Cauchy coefficients
1631 [ + + + + ]: 48 : if(sing_trip==1.AND.nsppol==1)then
1632 : 12 : cauchy(:)=zero
1633 [ + + ]: 232 : do iexcit=1,nexcit_win
1634 : 220 : fr_invsquare=one/(eexcit(iexcit)**2)
1635 : 220 : fr_power=one
1636 [ + + ]: 1772 : do ii=1,7
1637 : 1540 : fr_power=fr_power*fr_invsquare
1638 : 1760 : cauchy(ii)=cauchy(ii)+osc_str(1,iexcit)*fr_power
1639 : : end do
1640 : : end do
1641 : : write(message, '(a,es11.3,a,es11.3,a,es11.3,a,a,es11.3,a,es11.3,a,es11.3,a,es11.3)' ) &
1642 : 12 : & ' Cauchy coeffs (au) : ( -2)->',cauchy(1),&
1643 : 12 : & ', ( -4)->',cauchy(2),', ( -6)->',cauchy(3),ch10,&
1644 : 24 : & ' (-8)->',cauchy(4),', (-10)->',cauchy(5),', (-12)->',cauchy(6),', (-14)->',cauchy(7)
1645 : 12 : call wrtout(ab_out,message,'COLL')
1646 : 12 : call wrtout(std_out,message,'COLL')
1647 : : end if
1648 : :
1649 : : ! End the loop on singlet or triplet
1650 : : end do
1651 : :
1652 [ - + ]: 18 : ABI_FREE(eexcit2)
1653 [ - + ]: 18 : ABI_FREE(vec)
1654 [ - + ]: 18 : ABI_FREE(osc_str)
1655 : :
1656 : : !! The temporary files should be deleted at the end of this routine
1657 : 18 : close(temp_unit2,status='delete')
1658 : 18 : call timab(95,2,tsec)
1659 : : end if ! end of am_master
1660 : :
1661 [ - + ]: 22 : ABI_FREE(omega_tddft_casida)
1662 [ - + ]: 22 : ABI_FREE(eexcit)
1663 [ - + ]: 22 : ABI_FREE(sqrtks)
1664 [ - + ]: 22 : ABI_FREE(sexc)
1665 [ - + ]: 22 : ABI_FREE(done_sexc)
1666 [ - + ]: 22 : ABI_FREE(indarr)
1667 : : !ABI_FREE(done_sexc2)
1668 : :
1669 [ - + - + : 110 : end subroutine tddft
- + - + -
+ - + - +
- + ]
1670 : : !!***
1671 : :
1672 : : end module m_tddft
1673 : : !!***
|