Line data Source code
1 : !!****m* ABINIT/m_nonlinear
2 : !! NAME
3 : !! m_nonlinear
4 : !!
5 : !! FUNCTION
6 : !! DFT calculations of non linear response functions.
7 : !!
8 : !! COPYRIGHT
9 : !! Copyright (C) 2002-2026 ABINIT group (MVeithen,MB,LB)
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_nonlinear
23 :
24 : use defs_basis
25 : use defs_wvltypes
26 : use m_wffile
27 : use m_errors
28 : use m_abicore
29 : use m_xmpi
30 : use m_hdr
31 : use m_ebands
32 : use m_xcdata
33 : use m_dtset
34 : use m_dtfil
35 :
36 : use defs_datatypes, only : pseudopotential_type
37 : use defs_abitypes, only : MPI_type
38 : use m_fstrings, only : sjoin, itoa
39 : use m_time, only : timab
40 : use m_symtk, only : symmetrize_xred, littlegroup_q
41 : use m_dynmat, only : d3sym, sytens
42 : use m_ddb, only : ddb_type, nlopt
43 : use m_ddb_hdr, only : ddb_hdr_type
44 : use m_ioarr, only : read_rhor
45 : use m_kg, only : getcut, kpgio, getph
46 : use m_fft, only : fourdp
47 : use m_kpts, only : getkgrid
48 : use m_inwffil, only : inwffil
49 : use m_spacepar, only : hartre, setsym
50 : use m_pawfgr, only : pawfgr_type,pawfgr_init, pawfgr_destroy
51 : use m_pawang, only : pawang_type, pawang_init, pawang_free
52 : use m_pawrad, only : pawrad_type
53 : use m_pawtab, only : pawtab_type,pawtab_get_lsize
54 : use m_paw_an, only : paw_an_type, paw_an_init, paw_an_free, paw_an_nullify, paw_an_print
55 : use m_paw_ij, only : paw_ij_type, paw_ij_init, paw_ij_free, paw_ij_nullify, paw_ij_print
56 : use m_pawfgrtab, only : pawfgrtab_type, pawfgrtab_init, pawfgrtab_free
57 : use m_pawrhoij, only : pawrhoij_type, pawrhoij_alloc, pawrhoij_free, pawrhoij_copy, &
58 : pawrhoij_bcast, pawrhoij_nullify, pawrhoij_inquire_dim
59 : use m_paw_energies,only : paw_energies_type
60 : use m_pawdij, only : pawdij, symdij
61 : use m_paw_finegrid,only : pawexpiqr
62 : use m_pawxc, only : pawxc_get_nkxc
63 : use m_paw_dmft, only : paw_dmft_type
64 : use m_paw_sphharm, only : setsym_ylm
65 : use m_paw_nhat, only : nhatgrid,pawmknhat
66 : use m_paw_denpot, only : pawdenpot
67 : use m_paw_init, only : pawinit,paw_gencond
68 : use m_paw_tools, only : chkpawovlp
69 : use m_mkrho, only : mkrho
70 : use m_getshell, only : getshell
71 : use m_pspini, only : pspini
72 : use m_atm2fft, only : atm2fft
73 : use m_rhotoxc, only : rhotoxc
74 : use m_drivexc, only : check_kxc
75 : use m_mpinfo, only : proc_distrb_cycle
76 : use m_mklocl, only : mklocl
77 : use m_common, only : setup1
78 : use m_fourier_interpol, only : transgrid
79 : use m_paw_occupancies, only : initrhoij
80 : use m_paw_correlations, only : pawpuxinit
81 : use m_mkcore, only : mkcore
82 : use m_pead_nl_loop, only : pead_nl_loop
83 : use m_dfptnl_loop, only : dfptnl_loop
84 :
85 : implicit none
86 :
87 : private
88 : !!***
89 :
90 : public :: nonlinear
91 : public :: dfptnl_doutput ! Write the matrix of third-order derivatives to the output file
92 : !!***
93 :
94 : contains
95 : !!***
96 :
97 : !!****f* ABINIT/nonlinear
98 : !! NAME
99 : !! nonlinear
100 : !!
101 : !! FUNCTION
102 : !! Primary routine for conducting DFT calculations of non linear response functions.
103 : !!
104 : !! INPUTS
105 : !! codvsn = code version
106 : !! dtfil <type(datafiles_type)> = variables related to files
107 : !! dtset <type(dataset_type)> = all input variables for this dataset
108 : !! etotal = new total energy (no meaning at output)
109 : !! mpi_enreg=information about MPI pnarallelization
110 : !! occ(mband*nkpt*nsppol) = occupation number for each band and k
111 : !! xred(3,natom) = reduced atomic coordinates
112 : !!
113 : !! OUTPUT
114 : !!
115 : !! npwtot(nkpt) = total number of plane waves at each k point
116 : !!
117 : !! SIDE EFFECTS
118 : !! pawang <type(pawang_type)>=paw angular mesh and related data
119 : !! pawrad(ntypat*usepaw) <type(pawrad_type)>=paw radial mesh and related data
120 : !! pawtab(ntypat*usepaw) <type(pawtab_type)>=paw tabulated starting data
121 : !! psps <type(pseudopotential_type)> = variables related to pseudopotentials
122 : !!
123 : !! NOTES
124 : !! USE OF FFT GRIDS:
125 : !! =================
126 : !! In case of PAW:
127 : !! ---------------
128 : !! Two FFT grids are used:
129 : !! - A "coarse" FFT grid (defined by ecut)
130 : !! for the application of the Hamiltonian on the plane waves basis.
131 : !! It is defined by nfft, ngfft, mgfft, ...
132 : !! Hamiltonian, wave-functions, density related to WFs (rhor here), ...
133 : !! are expressed on this grid.
134 : !! - A "fine" FFT grid (defined) by ecutdg)
135 : !! for the computation of the density inside PAW spheres.
136 : !! It is defined by nfftf, ngfftf, mgfftf, ...
137 : !! Total density, potentials, ...
138 : !! are expressed on this grid.
139 : !! In case of norm-conserving:
140 : !! ---------------------------
141 : !! - Only the usual FFT grid (defined by ecut) is used.
142 : !! It is defined by nfft, ngfft, mgfft, ...
143 : !! For compatibility reasons, (nfftf,ngfftf,mgfftf)
144 : !! are set equal to (nfft,ngfft,mgfft) in that case.
145 : !!
146 : !! SOURCE
147 :
148 28 : subroutine nonlinear(codvsn,dtfil,dtset,etotal,mpi_enreg,npwtot,occ,pawang,pawrad,pawtab,psps,xred)
149 :
150 : !Arguments ------------------------------------
151 : !scalars
152 : real(dp),intent(inout) :: etotal
153 : character(len=8),intent(in) :: codvsn
154 : type(MPI_type),intent(inout) :: mpi_enreg
155 : type(datafiles_type),intent(in) :: dtfil
156 : type(dataset_type),intent(inout) :: dtset
157 : type(pawang_type),intent(inout) :: pawang
158 : type(pseudopotential_type),intent(inout) :: psps
159 : !arrays
160 : integer,intent(out) :: npwtot(dtset%nkpt)
161 : real(dp),intent(inout) :: occ(dtset%mband*dtset%nkpt*dtset%nsppol),xred(3,dtset%natom)
162 : type(pawrad_type),intent(inout) :: pawrad(psps%ntypat*psps%usepaw)
163 : type(pawtab_type),intent(inout) :: pawtab(psps%ntypat*psps%usepaw)
164 :
165 : !Local variables-------------------------------
166 : !scalars
167 : logical :: paral_atom,call_pawinit,qeq0
168 : integer,parameter :: level=50,formeig=0,response=1,cplex1=1
169 : integer :: ask_accurate,band_index,bantot,cplex,cplex_rhoij,dum_nshiftk,flag,gnt_option,gscase
170 : integer :: has_dijnd,has_diju,has_kxc,has_k3xc
171 : integer :: i1dir,i1pert,i2dir,i2pert,i3dir,i3pert
172 : integer :: iatom,indx,iband,ider,idir,ierr,ifft,ikpt,ipert,isppol
173 : integer :: ireadwf0,iscf_eff,ispden,itypat,izero,mcg,me,mgfftf,mkmem_max,mpert,my_natom
174 : integer :: n1,n3xccc,natom,nband_k,nfftf,nfftot,nfftotf,nhatdim,nhatgrdim
175 : integer :: nkpt_eff,nkpt_max,nkpt3,nkxc,nkxc1,nk3xc,nk3xc1,nneigh,ntypat,nsym1,nspden_rhoij,nzlmopt
176 : integer :: optcut,optgr0,optgr1,optgr2,optrad,option,optorth
177 : integer :: optatm,optdyfr,opteltfr,optgr,optstr,optv,optn,optn2
178 : integer :: psp_gencond,pead,qphase_rhoij,rdwr,rdwrpaw,spaceworld,tim_mkrho,timrev
179 : integer :: use_sym,usecprj,usexcnhat
180 : logical :: is_dfpt=.true.,nmxc
181 : real(dp),parameter :: k0(3)=(/zero,zero,zero/)
182 : real(dp) :: boxcut,compch_fft,compch_sph,ecore,ecut_eff,ecutdg_eff,ecutf
183 : real(dp) :: eei,bigexc,bigsxc,etot,fermie,fermih
184 : real(dp) :: gsqcut,gsqcut_eff,gsqcutc_eff
185 : real(dp) :: rdum,residm,ucvol,vxcavg,el_temp
186 : character(len=500) :: msg
187 : character(len=30) :: small_msg
188 : character(len=fnlen) :: dscrpt
189 28 : type(pawang_type) :: pawang1
190 : type(paw_energies_type) :: paw_energies
191 28 : type(ebands_t) :: bstruct
192 28 : type(hdr_type) :: hdr,hdr_den
193 1456 : type(ddb_hdr_type) :: ddb_hdr
194 28 : type(ddb_type) :: ddb
195 : type(wffile_type) :: wffgs,wfftgs
196 28 : type(wvl_data) :: wvl
197 : type(xcdata_type) :: xcdata
198 : !arrays
199 : integer :: dum_kptrlatt(3,3),dum_vacuum(3),ngfft(18),ngfftf(18),perm(6),ii,theunit
200 28 : integer,allocatable :: atindx(:),atindx1(:),blkflg(:,:,:,:,:,:),carflg(:,:,:,:,:,:),cgindex(:,:)
201 28 : integer,allocatable :: flg_tmp(:,:,:,:,:,:)
202 28 : integer,allocatable :: d3e_pert1(:),d3e_pert2(:),d3e_pert3(:)
203 28 : integer,allocatable :: indsym(:,:,:),indsy1(:,:,:),irrzon(:,:,:),irrzon1(:,:,:)
204 28 : integer,allocatable :: kg(:,:),kneigh(:,:),kg_neigh(:,:,:)
205 28 : integer,allocatable :: kptindex(:,:),l_size_atm(:)
206 28 : integer,allocatable :: npwarr(:),nattyp(:),pwind(:,:,:),rfpert(:,:,:,:,:,:)
207 28 : integer,allocatable :: symq(:,:,:),symrec(:,:,:),symaf1(:),symrc1(:,:,:),symrl1(:,:,:)
208 : real(dp) :: dum_gauss(0),dum_dyfrn(0),dum_dyfrv(0),dum_eltfrxc(0)
209 : real(dp) :: dum_grn(0),dum_grv(0),dum_rhog(0),dum_vg(0)
210 : real(dp) :: dum_shiftk(3,MAX_NSHIFTK),dummy6(6),other_dummy6(6),gmet(3,3),gprimd(3,3)
211 : real(dp) :: qphon(3),rmet(3,3),rprimd(3,3),tsec(2)
212 28 : real(dp),allocatable :: cg(:,:),d3cart(:,:,:,:,:,:,:)
213 56 : real(dp),allocatable :: d3etot(:,:,:,:,:,:,:),dum_kptns(:,:)
214 : ! We need all these arrays instead of one because in Fortran the maximum number of dimensions is 7...
215 28 : real(dp),allocatable :: d3e_1(:,:,:,:,:,:,:),d3cart_1(:,:,:,:,:,:,:)
216 28 : real(dp),allocatable :: d3e_2(:,:,:,:,:,:,:),d3cart_2(:,:,:,:,:,:,:)
217 28 : real(dp),allocatable :: d3e_3(:,:,:,:,:,:,:),d3cart_3(:,:,:,:,:,:,:)
218 28 : real(dp),allocatable :: d3e_4(:,:,:,:,:,:,:),d3cart_4(:,:,:,:,:,:,:)
219 28 : real(dp),allocatable :: d3e_5(:,:,:,:,:,:,:),d3cart_5(:,:,:,:,:,:,:)
220 28 : real(dp),allocatable :: d3e_6(:,:,:,:,:,:,:),d3cart_6(:,:,:,:,:,:,:)
221 28 : real(dp),allocatable :: d3e_7(:,:,:,:,:,:,:),d3cart_7(:,:,:,:,:,:,:)
222 28 : real(dp),allocatable :: d3e_8(:,:,:,:,:,:,:),d3cart_8(:,:,:,:,:,:,:)
223 28 : real(dp),allocatable :: d3e_9(:,:,:,:,:,:,:),d3cart_9(:,:,:,:,:,:,:)
224 28 : real(dp),allocatable :: dum_wtk(:),dyfrlo_indx(:,:,:),dyfrx2(:,:,:),eigen0(:)
225 28 : real(dp),allocatable :: grtn_indx(:,:),grxc(:,:),k3xc(:,:),kpt3(:,:),kxc(:,:)
226 28 : real(dp),allocatable :: mvwtk(:,:),nhat(:,:),nhatgr(:,:,:),ph1d(:,:),ph1df(:,:),phnons(:,:,:),phnons1(:,:,:)
227 28 : real(dp),allocatable :: rhog(:,:),rhor(:,:),rhowfg(:,:),rhowfr(:,:),tnons1(:,:)
228 28 : real(dp),allocatable :: vhartr(:),vpsp(:),vtrial(:,:),vxc(:,:),work(:),xccc3d(:)
229 : type(pawfgr_type) :: pawfgr
230 28 : type(pawrhoij_type),allocatable :: pawrhoij(:),pawrhoij_read(:)
231 28 : type(pawfgrtab_type),allocatable,save :: pawfgrtab(:)
232 28 : type(paw_an_type),allocatable :: paw_an(:)
233 28 : type(paw_ij_type),allocatable :: paw_ij(:)
234 28 : type(paw_dmft_type) :: paw_dmft
235 :
236 : ! ***********************************************************************
237 :
238 : DBG_ENTER("COLL")
239 :
240 28 : call timab(501,1,tsec)
241 :
242 : !Structured debugging if dtset%prtvol==-level
243 28 : if(dtset%prtvol==-level)then
244 0 : write(msg,'(80a,a,a)') ('=',ii=1,80),ch10,' nonlinear : enter , debug mode '
245 0 : call wrtout(std_out,msg)
246 : end if
247 :
248 : !Check if the perturbations asked in the input file can be computed
249 :
250 : if (((dtset%d3e_pert1_phon == 1).and.(dtset%d3e_pert2_phon == 1)).or. &
251 28 : & ((dtset%d3e_pert1_phon == 1).and.(dtset%d3e_pert3_phon == 1)).or. &
252 : & ((dtset%d3e_pert2_phon == 1).and.(dtset%d3e_pert3_phon == 1))) then
253 : write(msg,'(7a)')&
254 0 : & 'You have asked for a third-order derivative with respect to',ch10,&
255 0 : & '2 or more atomic displacements.',ch10,&
256 0 : & 'This is not allowed yet.',ch10,&
257 0 : & 'Action : change d3e_pert1_phon, d3e_pert2_phon or d3e_pert3_phon in your input file.'
258 0 : ABI_ERROR(msg)
259 : end if
260 :
261 : !Computation of third order derivatives from PEAD (pead=1) or full DPFT formalism (pead=0):
262 28 : pead = dtset%usepead
263 28 : if (pead==0) then
264 7 : write(msg, '(2a)' ) ch10,'NONLINEAR : PEAD=0, full DFPT computation of third order derivatives'
265 21 : call wrtout([ab_out, std_out], msg)
266 : end if
267 :
268 : !Some data for parallelism
269 28 : nkpt_max=50;if(xmpi_paral==1)nkpt_max=-1
270 28 : my_natom=mpi_enreg%my_natom
271 28 : paral_atom=(my_natom/=dtset%natom)
272 28 : if (paral_atom) then
273 0 : ABI_BUG(" Nonlinear routine is not available yet with parallelization over atoms...")
274 : end if
275 :
276 : !Init spaceworld
277 28 : spaceworld=mpi_enreg%comm_cell
278 28 : me = xmpi_comm_rank(spaceworld)
279 :
280 : !Define FFT grid(s) sizes (be careful !)
281 : !See NOTES in the comments at the beginning of this file.
282 28 : call pawfgr_init(pawfgr,dtset,mgfftf,nfftf,ecut_eff,ecutdg_eff,ngfft,ngfftf)
283 :
284 28 : ntypat=psps%ntypat
285 28 : natom=dtset%natom
286 112 : nfftot=product(ngfft(1:3))
287 112 : nfftotf=product(ngfftf(1:3))
288 :
289 : !Define the set of admitted perturbations taking into account
290 : !the possible permutations
291 28 : mpert=natom+6
292 196 : ABI_MALLOC(blkflg,(3,mpert,3,mpert,3,mpert))
293 112 : ABI_MALLOC(carflg,(3,mpert,3,mpert,3,mpert))
294 112 : ABI_MALLOC(rfpert,(3,mpert,3,mpert,3,mpert))
295 84 : ABI_MALLOC(d3e_pert1,(mpert))
296 56 : ABI_MALLOC(d3e_pert2,(mpert))
297 56 : ABI_MALLOC(d3e_pert3,(mpert))
298 196 : ABI_MALLOC(d3etot,(2,3,mpert,3,mpert,3,mpert))
299 112 : ABI_MALLOC(d3cart,(2,3,mpert,3,mpert,3,mpert))
300 28 : if (pead==0) then
301 28 : ABI_MALLOC(d3e_1,(2,3,mpert,3,mpert,3,mpert))
302 28 : ABI_MALLOC(d3e_2,(2,3,mpert,3,mpert,3,mpert))
303 28 : ABI_MALLOC(d3e_3,(2,3,mpert,3,mpert,3,mpert))
304 28 : ABI_MALLOC(d3e_4,(2,3,mpert,3,mpert,3,mpert))
305 28 : ABI_MALLOC(d3e_5,(2,3,mpert,3,mpert,3,mpert))
306 28 : ABI_MALLOC(d3e_6,(2,3,mpert,3,mpert,3,mpert))
307 28 : ABI_MALLOC(d3e_7,(2,3,mpert,3,mpert,3,mpert))
308 28 : ABI_MALLOC(d3e_8,(2,3,mpert,3,mpert,3,mpert))
309 28 : ABI_MALLOC(d3e_9,(2,3,mpert,3,mpert,3,mpert))
310 328167 : d3e_1(:,:,:,:,:,:,:) = 0_dp
311 328167 : d3e_2(:,:,:,:,:,:,:) = 0_dp
312 328167 : d3e_3(:,:,:,:,:,:,:) = 0_dp
313 328167 : d3e_4(:,:,:,:,:,:,:) = 0_dp
314 328167 : d3e_5(:,:,:,:,:,:,:) = 0_dp
315 328167 : d3e_6(:,:,:,:,:,:,:) = 0_dp
316 328167 : d3e_7(:,:,:,:,:,:,:) = 0_dp
317 328167 : d3e_8(:,:,:,:,:,:,:) = 0_dp
318 328167 : d3e_9(:,:,:,:,:,:,:) = 0_dp
319 7 : if (dtset%nonlinear_info>0) then
320 4 : ABI_MALLOC(flg_tmp,(3,mpert,3,mpert,3,mpert))
321 4 : ABI_MALLOC(d3cart_1,(2,3,mpert,3,mpert,3,mpert))
322 4 : ABI_MALLOC(d3cart_2,(2,3,mpert,3,mpert,3,mpert))
323 4 : ABI_MALLOC(d3cart_3,(2,3,mpert,3,mpert,3,mpert))
324 4 : ABI_MALLOC(d3cart_4,(2,3,mpert,3,mpert,3,mpert))
325 4 : ABI_MALLOC(d3cart_5,(2,3,mpert,3,mpert,3,mpert))
326 4 : ABI_MALLOC(d3cart_6,(2,3,mpert,3,mpert,3,mpert))
327 4 : ABI_MALLOC(d3cart_7,(2,3,mpert,3,mpert,3,mpert))
328 4 : ABI_MALLOC(d3cart_8,(2,3,mpert,3,mpert,3,mpert))
329 31 : ABI_MALLOC(d3cart_9,(2,3,mpert,3,mpert,3,mpert))
330 : end if
331 : end if
332 538524 : blkflg(:,:,:,:,:,:) = 0
333 1312668 : d3etot(:,:,:,:,:,:,:) = 0_dp
334 538524 : rfpert(:,:,:,:,:,:) = 0
335 700 : d3e_pert1(:) = 0 ; d3e_pert2(:) = 0 ; d3e_pert3(:) = 0
336 :
337 74 : if (dtset%d3e_pert1_phon==1) d3e_pert1(dtset%d3e_pert1_atpol(1):dtset%d3e_pert1_atpol(2))=1
338 29 : if (dtset%d3e_pert2_phon==1) d3e_pert2(dtset%d3e_pert2_atpol(1):dtset%d3e_pert2_atpol(2))=1
339 29 : if (dtset%d3e_pert3_phon==1) d3e_pert3(dtset%d3e_pert3_atpol(1):dtset%d3e_pert3_atpol(2))=1
340 28 : if (dtset%d3e_pert1_elfd/=0) d3e_pert1(natom+2)=1
341 28 : if (dtset%d3e_pert2_elfd/=0) d3e_pert2(natom+2)=1
342 28 : if (dtset%d3e_pert3_elfd/=0) d3e_pert3(natom+2)=1
343 :
344 252 : do i1pert = 1, mpert
345 924 : do i1dir = 1, 3
346 6272 : do i2pert = 1, mpert
347 22176 : do i2dir = 1, 3
348 150528 : do i3pert = 1, mpert
349 532224 : do i3dir = 1, 3
350 : perm(1) = &
351 : & d3e_pert1(i1pert)*dtset%d3e_pert1_dir(i1dir) &
352 : & *d3e_pert2(i2pert)*dtset%d3e_pert2_dir(i2dir) &
353 387072 : & *d3e_pert3(i3pert)*dtset%d3e_pert3_dir(i3dir)
354 : perm(2) = &
355 : & d3e_pert1(i1pert)*dtset%d3e_pert1_dir(i1dir) &
356 : & *d3e_pert2(i3pert)*dtset%d3e_pert2_dir(i3dir) &
357 387072 : & *d3e_pert3(i2pert)*dtset%d3e_pert3_dir(i2dir)
358 : perm(3) = &
359 : & d3e_pert1(i2pert)*dtset%d3e_pert1_dir(i2dir) &
360 : & *d3e_pert2(i1pert)*dtset%d3e_pert2_dir(i1dir) &
361 387072 : & *d3e_pert3(i3pert)*dtset%d3e_pert3_dir(i3dir)
362 : perm(4) = &
363 : & d3e_pert1(i2pert)*dtset%d3e_pert1_dir(i2dir) &
364 : & *d3e_pert2(i3pert)*dtset%d3e_pert2_dir(i3dir) &
365 387072 : & *d3e_pert3(i1pert)*dtset%d3e_pert3_dir(i1dir)
366 : perm(5) = &
367 : & d3e_pert1(i3pert)*dtset%d3e_pert1_dir(i3dir) &
368 : & *d3e_pert2(i2pert)*dtset%d3e_pert2_dir(i2dir) &
369 387072 : & *d3e_pert3(i1pert)*dtset%d3e_pert3_dir(i1dir)
370 : perm(6) = &
371 : & d3e_pert1(i3pert)*dtset%d3e_pert1_dir(i3dir) &
372 : & *d3e_pert2(i1pert)*dtset%d3e_pert2_dir(i1dir) &
373 387072 : & *d3e_pert3(i2pert)*dtset%d3e_pert3_dir(i2dir)
374 2838528 : if (sum(perm(:)) > 0) rfpert(i1dir,i1pert,i2dir,i2pert,i3dir,i3pert) = 1
375 : end do
376 : end do
377 : end do
378 : end do
379 : end do
380 : end do
381 :
382 : ! call timab(134,2,tsec)
383 : ! call timab(135,1,tsec)
384 :
385 : !Do symmetry stuff
386 112 : ABI_MALLOC(irrzon,(nfftot**(1-1/dtset%nsym),2,(dtset%nspden/dtset%nsppol)-3*(dtset%nspden/4)))
387 112 : ABI_MALLOC(phnons,(2,nfftot**(1-1/dtset%nsym),(dtset%nspden/dtset%nsppol)-3*(dtset%nspden/4)))
388 112 : ABI_MALLOC(indsym,(4,dtset%nsym,natom))
389 84 : ABI_MALLOC(symrec,(3,3,dtset%nsym))
390 399078 : irrzon=0;indsym=0;symrec=0;phnons=zero
391 : !If the density is to be computed by mkrho, need irrzon and phnons
392 28 : iscf_eff=0;if(dtset%getden==0)iscf_eff=1
393 : call setsym(indsym,irrzon,iscf_eff,natom,&
394 : & nfftot,ngfft,dtset%nspden,dtset%nsppol,dtset%nsym,&
395 28 : & phnons,dtset%symafm,symrec,dtset%symrel,dtset%tnons,dtset%typat,xred)
396 :
397 : !Symmetrize atomic coordinates over space group elements:
398 28 : call symmetrize_xred(natom,dtset%nsym,dtset%symrel,dtset%tnons,xred,indsym=indsym)
399 :
400 28 : call sytens(indsym,mpert,natom,dtset%nsym,rfpert,symrec,dtset%symrel)
401 :
402 28 : write(msg, '(a,a,a,a,a)' ) ch10, &
403 28 : & ' The list of irreducible elements of the Raman and non-linear',&
404 56 : & ch10,' optical susceptibility tensors is:',ch10
405 28 : call wrtout(ab_out,msg)
406 28 : call wrtout(std_out,msg)
407 :
408 : write(msg,'(12x,a)')&
409 28 : & 'i1pert i1dir i2pert i2dir i3pert i3dir'
410 28 : call wrtout(ab_out,msg)
411 28 : call wrtout(std_out,msg)
412 28 : n1 = 0
413 140 : do i1pert = 1, natom + 2
414 476 : do i1dir = 1, 3
415 1792 : do i2pert = 1, natom + 2
416 5712 : do i2dir = 1,3
417 21504 : do i3pert = 1, natom + 2
418 68544 : do i3dir = 1, 3
419 64512 : if (rfpert(i1dir,i1pert,i2dir,i2pert,i3dir,i3pert)==1) then
420 698 : n1 = n1 + 1
421 698 : write(msg,'(2x,i4,a,6(5x,i3))') n1,')', &
422 1396 : & i1pert,i1dir,i2pert,i2dir,i3pert,i3dir
423 698 : call wrtout(ab_out,msg)
424 698 : call wrtout(std_out,msg)
425 47686 : else if (rfpert(i1dir,i1pert,i2dir,i2pert,i3dir,i3pert)==-2) then
426 1220 : blkflg(i1dir,i1pert,i2dir,i2pert,i3dir,i3pert) = 1
427 1220 : if (dtset%nonlinear_info>0) then
428 : ! n1 = n1 + 1
429 0 : write(msg,'(2x,i4,a,6(5x,i3),a)') n1,')', &
430 0 : & i1pert,i1dir,i2pert,i2dir,i3pert,i3dir,' => must be zero, not computed'
431 0 : call wrtout(ab_out,msg)
432 0 : call wrtout(std_out,msg)
433 : end if
434 46466 : else if (rfpert(i1dir,i1pert,i2dir,i2pert,i3dir,i3pert)==-1) then
435 1894 : if (dtset%nonlinear_info>0) then
436 : ! n1 = n1 + 1
437 81 : write(msg,'(2x,i4,a,6(5x,i3),a)') n1,')', &
438 162 : & i1pert,i1dir,i2pert,i2dir,i3pert,i3dir,' => symmetric of an other element, not computed'
439 81 : call wrtout(ab_out,msg)
440 81 : call wrtout(std_out,msg)
441 : end if
442 : end if
443 : end do
444 : end do
445 : end do
446 : end do
447 : end do
448 : end do
449 28 : write(msg,'(a,a)') ch10,ch10
450 28 : call wrtout(ab_out,msg)
451 28 : call wrtout(std_out,msg)
452 :
453 : ! For abipy :
454 28 : if (dtset%paral_rf == -1) then
455 0 : write(std_out,'(a)')"--- !IrredPerts"
456 0 : write(std_out,'(a)')'# List of irreducible perturbations for nonlinear'
457 0 : write(std_out,'(a)')'irred_perts:'
458 :
459 0 : n1 = 0
460 0 : do i1pert = 1, natom + 2
461 0 : do i1dir = 1, 3
462 0 : do i2pert = 1, natom + 2
463 0 : do i2dir = 1, 3
464 0 : do i3pert = 1, natom + 2
465 0 : do i3dir = 1,3
466 0 : if (rfpert(i1dir,i1pert,i2dir,i2pert,i3dir,i3pert)==1) then
467 0 : n1 = n1 + 1
468 0 : write(std_out,'(a,i0)')" - i1pert: ",i1pert
469 0 : write(std_out,'(a,i0)')" i1dir: ",i1dir
470 0 : write(std_out,'(a,i0)')" i2pert: ",i2pert
471 0 : write(std_out,'(a,i0)')" i2dir: ",i2dir
472 0 : write(std_out,'(a,i0)')" i3pert: ",i3pert
473 0 : write(std_out,'(a,i0)')" i3dir: ",i3dir
474 : end if
475 : end do
476 : end do
477 : end do
478 : end do
479 : end do
480 : end do
481 0 : write(std_out,'(a)')"..."
482 0 : ABI_ERROR_NODUMP("aborting now")
483 : end if
484 :
485 : !Set up for iterations
486 : call setup1(dtset%acell_orig(1:3,1),bantot,dtset,&
487 : ecutdg_eff,ecut_eff,gmet,gprimd,gsqcut_eff,gsqcutc_eff,&
488 : ngfftf,ngfft,dtset%nkpt,dtset%nsppol,&
489 28 : response,rmet,dtset%rprim_orig(1:3,1:3,1),rprimd,ucvol,psps%usepaw)
490 :
491 : !Set up the basis sphere of planewaves
492 84 : ABI_MALLOC(kg,(3,dtset%mpw*dtset%mkmem))
493 84 : ABI_MALLOC(npwarr,(dtset%nkpt))
494 : call kpgio(ecut_eff,dtset%exchn2n3d,gmet,dtset%istwfk,kg,&
495 : & dtset%kptns,dtset%mkmem,dtset%nband,dtset%nkpt,'PERS',mpi_enreg,dtset%mpw,npwarr,npwtot,&
496 28 : & dtset%nsppol)
497 :
498 : !Recompute first large sphere cut-off gsqcut, without taking into account dilatmx
499 28 : ecutf=dtset%ecut
500 28 : if (psps%usepaw==1) then
501 4 : ecutf=dtset%pawecutdg
502 4 : call wrtout(std_out,ch10//' FFT (fine) grid used in SCF cycle:')
503 : end if
504 28 : call getcut(boxcut,ecutf,gmet,gsqcut,dtset%iboxcut,std_out,k0,ngfftf)
505 :
506 : !Open and read pseudopotential files
507 : ecore = 0_dp
508 : call pspini(dtset,dtfil,ecore,psp_gencond,gsqcutc_eff,gsqcut_eff,pawrad,pawtab,&
509 28 : & psps,rprimd,comm_mpi=mpi_enreg%comm_cell)
510 :
511 : !Initialize band structure datatype
512 28 : call bstruct%from_dtset(dtset, npwarr)
513 :
514 : !Initialize PAW atomic occupancies
515 28 : if (psps%usepaw==1) then
516 20 : ABI_MALLOC(pawrhoij,(my_natom))
517 4 : call pawrhoij_nullify(pawrhoij)
518 : call initrhoij(dtset%pawcpxocc,dtset%lexexch,dtset%lpawu, &
519 : & my_natom,natom,dtset%nspden,dtset%nspinor,dtset%nsppol,dtset%ntypat,&
520 : & pawrhoij,dtset%pawspnorb,pawtab,cplex1,dtset%spinat,dtset%typat,&
521 4 : & comm_atom=mpi_enreg%comm_atom, mpi_atmtab=mpi_enreg%my_atmtab)
522 : else
523 24 : ABI_MALLOC(pawrhoij,(0))
524 : end if
525 :
526 : !Initialize header
527 28 : gscase=0
528 : call hdr%init(bstruct,codvsn,dtset,pawtab,gscase,psps,wvl%descr, &
529 28 : & comm_atom=mpi_enreg%comm_atom, mpi_atmtab=mpi_enreg%my_atmtab)
530 :
531 : !Update header, with evolving variables, when available
532 : !Here, rprimd, xred and occ are available
533 28 : etot=hdr%etot ; fermie=hdr%fermie ; fermih=hdr%fermih ; residm=hdr%residm
534 :
535 : !If parallelism over atom, hdr is distributed
536 : call hdr%update(bantot,etot,fermie,fermih,&
537 : residm,rprimd,occ,pawrhoij,xred,dtset%amu_orig(:,1), &
538 28 : comm_atom=mpi_enreg%comm_atom, mpi_atmtab=mpi_enreg%my_atmtab)
539 :
540 : !Clean band structure datatype (should use it more in the future !)
541 28 : call bstruct%free()
542 :
543 : !Initialize wavefunction files and wavefunctions.
544 28 : ireadwf0=1
545 :
546 28 : mcg=dtset%mpw*dtset%nspinor*dtset%mband*dtset%mkmem*dtset%nsppol
547 84 : ABI_MALLOC_OR_DIE(cg,(2,mcg), ierr)
548 :
549 84 : ABI_MALLOC(eigen0,(dtset%mband*dtset%nkpt*dtset%nsppol))
550 5398 : eigen0(:)=zero ; ask_accurate=1
551 28 : optorth=0
552 :
553 : call inwffil(ask_accurate,cg,dtset,dtset%ecut,ecut_eff,eigen0,dtset%exchn2n3d,&
554 : & formeig,hdr,ireadwf0,dtset%istwfk,kg,dtset%kptns,&
555 : & dtset%localrdwf,dtset%mband,mcg,dtset%mkmem,mpi_enreg,dtset%mpw,&
556 : & dtset%nband,ngfft,dtset%nkpt,npwarr,dtset%nsppol,dtset%nsym,&
557 : & occ,optorth,dtset%symafm,dtset%symrel,dtset%tnons,&
558 28 : & dtfil%unkg,wffgs,wfftgs,dtfil%unwffgs,dtfil%fnamewffk,wvl)
559 :
560 : !Close wffgs, if it was ever opened (in inwffil)
561 28 : if (ireadwf0==1) then
562 28 : call WffClose(wffgs,ierr)
563 : end if
564 :
565 28 : if (psps%usepaw==1.and.ireadwf0==1) then
566 : ! if parallelism, pawrhoij is distributed, hdr%pawrhoij is not
567 : call pawrhoij_copy(hdr%pawrhoij,pawrhoij,comm_atom=mpi_enreg%comm_atom,&
568 4 : & mpi_atmtab=mpi_enreg%my_atmtab)
569 : end if
570 :
571 : ! call timab(135,2,tsec)
572 : ! call timab(136,1,tsec)
573 :
574 : !Report on eigen0 values ! Should use prteigrs.F90
575 28 : write(msg, '(a,a)' )
576 28 : call wrtout(std_out,ch10//' respfn : eigen0 array')
577 28 : nkpt_eff=dtset%nkpt
578 28 : if( (dtset%prtvol==0.or.dtset%prtvol==1.or.dtset%prtvol==2) .and. dtset%nkpt>nkpt_max ) nkpt_eff=nkpt_max
579 28 : band_index=0
580 63 : do isppol=1,dtset%nsppol
581 1295 : do ikpt=1,dtset%nkpt
582 1232 : nband_k=dtset%nband(ikpt+(isppol-1)*dtset%nkpt)
583 1232 : if(ikpt<=nkpt_eff)then
584 0 : write(msg, '(a,i2,a,i5)' )' isppol=',isppol,', k point number',ikpt
585 0 : call wrtout(std_out,msg)
586 0 : do iband=1,nband_k,4
587 0 : write(msg, '(a,4es16.6)')' ',eigen0(iband+band_index:min(iband+3,nband_k)+band_index)
588 0 : call wrtout(std_out,msg)
589 : end do
590 1232 : else if(ikpt==nkpt_eff+1)then
591 0 : write(msg,'(a,a)' )' respfn : prtvol=0, 1 or 2, stop printing eigen0.',ch10
592 0 : call wrtout(std_out,msg)
593 : end if
594 1267 : band_index=band_index+nband_k
595 : end do
596 : end do
597 :
598 : !Allocation for forces and atomic positions (should be taken away, also argument ... )
599 84 : ABI_MALLOC(grxc,(3,natom))
600 :
601 : !Examine the symmetries of the q wavevector
602 84 : ABI_MALLOC(symq,(4,2,dtset%nsym))
603 : timrev=1
604 :
605 : ! By default use symmetries.
606 28 : use_sym = 1
607 28 : if (dtset%prtgkk == 1)then
608 0 : use_sym = 0
609 0 : call littlegroup_q(dtset%nsym,dtset%qptn,symq,symrec,dtset%symafm,timrev,prtvol=dtset%prtvol,use_sym=use_sym)
610 : else
611 28 : call littlegroup_q(dtset%nsym,dtset%qptn,symq,symrec,dtset%symafm,timrev,prtvol=dtset%prtvol)
612 : end if
613 :
614 :
615 :
616 : !Generate an index table of atoms, in order for them to be used
617 : !type after type.
618 84 : ABI_MALLOC(atindx,(natom))
619 56 : ABI_MALLOC(atindx1,(natom))
620 84 : ABI_MALLOC(nattyp,(ntypat))
621 77 : indx=1
622 77 : do itypat=1,ntypat
623 49 : nattyp(itypat)=0
624 175 : do iatom=1,natom
625 147 : if(dtset%typat(iatom)==itypat)then
626 56 : atindx(iatom)=indx
627 56 : atindx1(indx)=iatom
628 56 : indx=indx+1
629 56 : nattyp(itypat)=nattyp(itypat)+1
630 : end if
631 : end do
632 : end do
633 :
634 : !Compute structure factor phases for current atomic pos:
635 84 : ABI_MALLOC(ph1d,(2,3*(2*dtset%mgfft+1)*natom))
636 84 : ABI_MALLOC(ph1df,(2,3*(2*mgfftf+1)*natom))
637 28 : call getph(atindx,natom,ngfft(1),ngfft(2),ngfft(3),ph1d,xred)
638 :
639 28 : if (psps%usepaw==1.and.pawfgr%usefinegrid==1) then
640 4 : call getph(atindx,natom,ngfftf(1),ngfftf(2),ngfftf(3),ph1df,xred)
641 : else
642 15432 : ph1df(:,:)=ph1d(:,:)
643 : end if
644 :
645 28 : qeq0=(dtset%qptn(1)**2+dtset%qptn(2)**2+dtset%qptn(3)**2<1.d-14)
646 28 : if (.not.qeq0) then
647 0 : ABI_BUG('NONLINEAR with dtset%qptn!=0 is not implemented yet')
648 : end if
649 :
650 : !PAW: 1- Initialize values for several arrays depending only on atomic data
651 : !2- Check overlap
652 : !3- Identify FFT points in spheres and compute g_l(r).Y_lm(r) (and exp(-i.q.r) if needed)
653 : !4- Allocate PAW specific arrays
654 : !5- Compute perturbed local potential inside spheres
655 : !6- Eventually open temporary storage files
656 28 : if(psps%usepaw==1) then
657 : ! 1-Initialize values for several arrays depending only on atomic data
658 :
659 4 : gnt_option=2
660 :
661 : ! Test if we have to call pawinit
662 4 : call paw_gencond(Dtset,gnt_option,"test",call_pawinit)
663 :
664 4 : if (psp_gencond==1.or.call_pawinit) then
665 : ! Some gen-cond have to be added...
666 0 : call timab(553,1,tsec)
667 : call pawinit(dtset%effmass_free,gnt_option,zero,zero,dtset%pawlcutd,dtset%pawlmix,&
668 : & psps%mpsang,dtset%pawnphi,dtset%nsym,dtset%pawntheta,&
669 0 : & pawang,pawrad,dtset%pawspnorb,pawtab,dtset%pawxcdev,dtset%ixc,dtset%usepotzero)
670 : call setsym_ylm(gprimd,pawang%l_max-1,dtset%nsym,dtset%pawprtvol,&
671 0 : & rprimd,symrec,pawang%zarot)
672 :
673 : ! Update internal values
674 0 : call paw_gencond(Dtset,gnt_option,"save",call_pawinit)
675 :
676 0 : call timab(553,2,tsec)
677 : else
678 4 : if (pawtab(1)%has_kij ==1) pawtab(1:psps%ntypat)%has_kij =2
679 4 : if (pawtab(1)%has_nabla==1) pawtab(1:psps%ntypat)%has_nabla=2
680 : end if
681 12 : psps%n1xccc=maxval(pawtab(1:psps%ntypat)%usetcore)
682 4 : call setsym_ylm(gprimd,pawang%l_max-1,dtset%nsym,dtset%pawprtvol,rprimd,symrec,pawang%zarot)
683 : call pawpuxinit(dtset%dmatpuopt,dtset%exchmix,dtset%f4of2_sla,dtset%f6of2_sla,&
684 : & is_dfpt,dtset%jpawu,dtset%lexexch,dtset%lpawu,dtset%nspinor,ntypat,dtset%optdcmagpawu,pawang,dtset%pawprtvol,pawrad,&
685 4 : & pawtab,dtset%upawu,dtset%usedmft,dtset%useexexch,dtset%usepawu)
686 4 : compch_fft=-1.d5;compch_sph=-1.d5
687 12 : usexcnhat=maxval(pawtab(:)%usexcnhat)
688 :
689 : ! Note: many derivatives of cprj are needed and used a few times only, so for simplicity the
690 : ! computation of all needed derivatives will be done on-the-fly.
691 4 : usecprj=0
692 :
693 : ! 2-Check overlap
694 4 : call chkpawovlp(natom,psps%ntypat,dtset%pawovlp,pawtab,rmet,dtset%typat,xred)
695 : ! 3-Identify FFT points in spheres and compute g_l(r).Y_lm(r) and exp(-i.q.r)
696 20 : ABI_MALLOC(pawfgrtab,(my_natom))
697 4 : if (my_natom>0) then
698 : call pawtab_get_lsize(pawtab,l_size_atm,my_natom,dtset%typat,&
699 4 : & mpi_atmtab=mpi_enreg%my_atmtab)
700 : call pawfgrtab_init(pawfgrtab,1,l_size_atm,pawrhoij(1)%nspden,dtset%typat,&
701 4 : & mpi_atmtab=mpi_enreg%my_atmtab,comm_atom=mpi_enreg%comm_atom)
702 4 : ABI_FREE(l_size_atm)
703 : end if
704 4 : optcut=0;optgr0=dtset%pawstgylm;optgr1=0;optgr2=0;optrad=1-dtset%pawstgylm
705 4 : optgr1=dtset%pawstgylm
706 4 : optgr2=dtset%pawstgylm
707 : call nhatgrid(atindx1,gmet,my_natom,natom,nattyp,ngfftf,psps%ntypat,&
708 : & optcut,optgr0,optgr1,optgr2,optrad,pawfgrtab,pawtab,rprimd,dtset%typat,ucvol,xred,&
709 4 : & comm_atom=mpi_enreg%comm_atom, mpi_atmtab=mpi_enreg%my_atmtab )
710 20 : ABI_MALLOC(paw_an,(my_natom))
711 20 : ABI_MALLOC(paw_ij,(my_natom))
712 4 : call paw_an_nullify(paw_an)
713 4 : call paw_ij_nullify(paw_ij)
714 4 : has_kxc=0;nkxc1=0;cplex=1
715 36 : has_dijnd=0;if(any(abs(dtset%nucdipmom)>tol8)) has_dijnd=1
716 4 : has_diju=merge(0,1,dtset%usepawu==0)
717 4 : has_kxc=1;nkxc1=2*dtset%nspden-1 ! LDA only
718 4 : call pawxc_get_nkxc(nkxc1,dtset%nspden,dtset%xclevel)
719 4 : has_k3xc=1; nk3xc1=3*min(dtset%nspden,2)-2 ! LDA only
720 : call paw_an_init(paw_an,dtset%natom,dtset%ntypat,nkxc1,nk3xc1,dtset%nspden,cplex,dtset%pawxcdev,&
721 : & dtset%typat,pawang,pawtab,has_vxc=1,has_vxc_ex=1,has_kxc=has_kxc,has_k3xc=has_k3xc,&
722 4 : & mpi_atmtab=mpi_enreg%my_atmtab,comm_atom=mpi_enreg%comm_atom)
723 : call paw_ij_init(paw_ij,cplex,dtset%nspinor,dtset%nsppol,dtset%nspden,dtset%pawspnorb,&
724 : & natom,dtset%ntypat,dtset%typat,pawtab,has_dij=1,has_dijhartree=1,has_dijnd=has_dijnd,&
725 : & has_dijso=1,has_dijU=has_diju,has_pawu_occ=1,has_exexch_pot=1,nucdipmom=dtset%nucdipmom,&
726 12 : & mpi_atmtab=mpi_enreg%my_atmtab,comm_atom=mpi_enreg%comm_atom)
727 : else ! PAW vs NCPP
728 24 : usexcnhat=0;usecprj=0
729 24 : ABI_MALLOC(paw_an,(0))
730 24 : ABI_MALLOC(paw_ij,(0))
731 24 : ABI_MALLOC(pawfgrtab,(0))
732 : end if
733 :
734 84 : ABI_MALLOC(rhog,(2,nfftf))
735 112 : ABI_MALLOC(rhor,(nfftf,dtset%nspden))
736 :
737 : !Read ground-state charge density from diskfile in case getden /= 0
738 : !or compute it from wfs that were read previously : rhor as well as rhog
739 :
740 28 : if (dtset%getden /= 0 .or. dtset%irdden /= 0) then
741 : ! Read rho1(r) from a disk file and broadcast data.
742 : ! This part is not compatible with MPI-FFT (note single_proc=.True. below)
743 :
744 26 : rdwr=1;rdwrpaw=psps%usepaw;if(ireadwf0/=0) rdwrpaw=0
745 : if (rdwrpaw/=0) then
746 : ABI_MALLOC(pawrhoij_read,(natom))
747 : call pawrhoij_nullify(pawrhoij_read)
748 : call pawrhoij_inquire_dim(cplex_rhoij=cplex_rhoij,qphase_rhoij=qphase_rhoij,nspden_rhoij=nspden_rhoij,&
749 : & nspden=dtset%nspden,spnorb=dtset%pawspnorb,cplex=cplex,cpxocc=dtset%pawcpxocc)
750 : call pawrhoij_alloc(pawrhoij_read,cplex_rhoij,nspden_rhoij,dtset%nspinor,&
751 : & dtset%nsppol,dtset%typat,qphase=qphase_rhoij,pawtab=pawtab)
752 : else
753 26 : ABI_MALLOC(pawrhoij_read,(0))
754 : end if
755 :
756 : ! MT july 2013: Should we read rhoij from the density file ?
757 : call read_rhor(dtfil%fildensin, cplex1, dtset%nspden, nfftf, ngfftf, rdwrpaw, mpi_enreg, rhor, &
758 26 : hdr_den, pawrhoij_read, spaceworld, check_hdr=hdr)
759 26 : call hdr_den%free()
760 :
761 : if (rdwrpaw/=0) then
762 : call pawrhoij_bcast(pawrhoij_read,hdr%pawrhoij,0,spaceworld)
763 : call pawrhoij_free(pawrhoij_read)
764 : end if
765 26 : ABI_FREE(pawrhoij_read)
766 :
767 : ! Compute up+down rho(G) by fft
768 78 : ABI_MALLOC(work,(nfftf))
769 163138 : work(:)=rhor(:,1)
770 26 : call fourdp(1,rhog,work,-1,mpi_enreg,nfftf,1,ngfftf,0)
771 26 : ABI_FREE(work)
772 :
773 : else
774 2 : izero=0
775 : ! Obtain the charge density from read wfs
776 : ! Be careful: in PAW, compensation density has to be added !
777 2 : tim_mkrho=4
778 2 : paw_dmft%use_sc_dmft=0 ! respfn with dmft not implemented
779 2 : paw_dmft%use_dmft=0 ! respfn with dmft not implemented
780 2 : if (psps%usepaw==1) then
781 0 : ABI_MALLOC(rhowfg,(2,dtset%nfft))
782 0 : ABI_MALLOC(rhowfr,(dtset%nfft,dtset%nspden))
783 : call mkrho(cg,dtset,gprimd,irrzon,kg,mcg,&
784 0 : & mpi_enreg,npwarr,occ,paw_dmft,phnons,rhowfg,rhowfr,rprimd,tim_mkrho,ucvol,wvl%den,wvl%wfs)
785 0 : call transgrid(1,mpi_enreg,dtset%nspden,+1,1,1,dtset%paral_kgb,pawfgr,rhowfg,rhog,rhowfr,rhor)
786 0 : ABI_FREE(rhowfg)
787 0 : ABI_FREE(rhowfr)
788 : else
789 : call mkrho(cg,dtset,gprimd,irrzon,kg,mcg,&
790 2 : & mpi_enreg,npwarr,occ,paw_dmft,phnons,rhog,rhor,rprimd,tim_mkrho,ucvol,wvl%den,wvl%wfs)
791 : end if
792 : end if ! getden
793 :
794 : !In PAW, compensation density has eventually to be added
795 28 : nhatgrdim=0;nhatdim=0
796 28 : ABI_MALLOC(nhatgr,(0,0,0))
797 28 : if (psps%usepaw==1.and. ((usexcnhat==0).or.(dtset%getden==0).or.dtset%xclevel==2)) then
798 4 : nhatdim=1
799 16 : ABI_MALLOC(nhat,(nfftf,dtset%nspden))
800 4 : call timab(558,1,tsec)
801 4 : nhatgrdim=0;if (dtset%xclevel==2.and.dtset%pawnhatxc>0) nhatgrdim=usexcnhat
802 4 : ider=2*nhatgrdim
803 4 : if (nhatgrdim>0) then
804 0 : ABI_FREE(nhatgr)
805 0 : ABI_MALLOC(nhatgr,(nfftf,dtset%nspden,3))
806 : end if
807 4 : izero=0;cplex=1;ipert=0;idir=0;qphon(:)=zero
808 : call pawmknhat(compch_fft,cplex,ider,idir,ipert,izero,gprimd,my_natom,natom,&
809 : & nfftf,ngfftf,nhatgrdim,dtset%nspden,psps%ntypat,pawang,pawfgrtab,&
810 : & nhatgr,nhat,pawrhoij,pawrhoij,pawtab,qphon,rprimd,ucvol,dtset%usewvl,xred, &
811 4 : & mpi_atmtab=mpi_enreg%my_atmtab, comm_atom=mpi_enreg%comm_atom)
812 4 : if (dtset%getden==0) then
813 0 : rhor(:,:)=rhor(:,:)+nhat(:,:)
814 0 : call fourdp(1,rhog,rhor(:,1),-1,mpi_enreg,nfftf,1,ngfftf,0)
815 : end if
816 4 : call timab(558,2,tsec)
817 : else
818 24 : ABI_MALLOC(nhat,(0,0))
819 : end if
820 :
821 : !The GS irrzon and phnons were only needed to symmetrize the GS density
822 28 : ABI_FREE(irrzon)
823 28 : ABI_FREE(phnons)
824 :
825 : !!jmb 2012 write(std_out,'(a)')' ' ! needed to make ibm6_xlf12 pass tests. No idea why this works. JWZ 5 Sept 2011
826 : !!Will compute now the total potential
827 :
828 : !Compute local ionic pseudopotential vpsp and core electron density xccc3d:
829 28 : n3xccc=0;if (psps%n1xccc/=0) n3xccc=nfftf
830 84 : ABI_MALLOC(xccc3d,(n3xccc))
831 84 : ABI_MALLOC(vpsp,(nfftf))
832 :
833 28 : eei = zero
834 28 : if (psps%usepaw==1 .or. psps%nc_xccc_gspace==1) then
835 : ! PAW or NC with nc_xccc_gspace: compute Vloc and core charge together in reciprocal space
836 4 : call timab(562,1,tsec)
837 4 : optatm=1;optdyfr=0;opteltfr=0;optgr=0;optstr=0;optv=1;optn=n3xccc/nfftf;optn2=1
838 : call atm2fft(atindx1,xccc3d,vpsp,dum_dyfrn,dum_dyfrv,dum_eltfrxc,dum_gauss,gmet,gprimd,&
839 : & dum_grn,dum_grv,gsqcut,mgfftf,psps%mqgrid_vl,natom,nattyp,nfftf,ngfftf,&
840 : & ntypat,optatm,optdyfr,opteltfr,optgr,optn,optn2,optstr,optv,psps,pawtab,ph1df,psps%qgrid_vl,&
841 4 : & dtset%qprtrb,dtset%rcut,dum_rhog,rprimd,dummy6,other_dummy6,ucvol,psps%usepaw,dum_vg,dum_vg,dum_vg,dtset%vprtrb,psps%vlspl)
842 4 : call timab(562,2,tsec)
843 : else
844 : ! Norm-cons.: compute Vloc in reciprocal space and core charge in real space
845 24 : option=1
846 72 : ABI_MALLOC(dyfrlo_indx,(3,3,natom))
847 72 : ABI_MALLOC(grtn_indx,(3,natom))
848 : call mklocl(dtset,dyfrlo_indx,eei,gmet,gprimd,&
849 : & grtn_indx,gsqcut,dummy6,mgfftf,mpi_enreg,natom,nattyp,&
850 : & nfftf,ngfftf,dtset%nspden,ntypat,option,pawtab,ph1df,psps,&
851 24 : & dtset%qprtrb,rhog,rhor,rprimd,ucvol,dtset%vprtrb,vpsp,wvl%descr,wvl%den,xred)
852 24 : ABI_FREE(dyfrlo_indx)
853 24 : ABI_FREE(grtn_indx)
854 24 : if (psps%n1xccc/=0) then
855 18 : ABI_MALLOC(dyfrx2,(3,3,natom))
856 9 : ABI_MALLOC(vxc,(0,0)) ! dummy
857 : call mkcore(dummy6,dyfrx2,grxc,mpi_enreg,natom,nfftf,dtset%nspden,ntypat,&
858 : & ngfftf(1),psps%n1xccc,ngfftf(2),ngfftf(3),option,rprimd,dtset%typat,ucvol,vxc,&
859 9 : & psps%xcccrc,psps%xccc1d,xccc3d,xred)
860 9 : ABI_FREE(dyfrx2)
861 9 : ABI_FREE(vxc) ! dummy
862 : end if
863 : end if
864 :
865 : !Set up hartree and xc potential. Compute kxc here.
866 56 : ABI_MALLOC(vhartr,(nfftf))
867 : call hartre(1,gsqcut,dtset%icutcoul,psps%usepaw,mpi_enreg,nfftf,ngfftf,&
868 28 : &dtset%nkpt,dtset%rcut,rhog,rprimd,dtset%vcutgeo,vhartr)
869 :
870 28 : option=3
871 28 : nkxc=2*dtset%nspden-1 ! LDA
872 28 : if(dtset%xclevel==2.and.dtset%nspden==1) nkxc=7 ! non-polarized GGA
873 28 : if(dtset%xclevel==2.and.dtset%nspden==2) nkxc=19 ! polarized GGA
874 28 : nk3xc=3*dtset%nspden-2
875 28 : call check_kxc(dtset%ixc,dtset%optdriver,check_k3xc=.true.)
876 112 : ABI_MALLOC(kxc,(nfftf,nkxc))
877 112 : ABI_MALLOC(k3xc,(nfftf,nk3xc))
878 112 : ABI_MALLOC(vxc,(nfftf,dtset%nspden))
879 :
880 28 : call xcdata_init(xcdata,dtset=dtset)
881 28 : nmxc=(dtset%usepaw==1.and.mod(abs(dtset%usepawu),10)==4)
882 : call rhotoxc(bigexc,bigsxc,kxc,mpi_enreg,nfftf,ngfftf,&
883 : & nhat,nhatdim,nhatgr,nhatgrdim,nkxc,nk3xc,nmxc,n3xccc,option,rhor,&
884 28 : & rprimd,usexcnhat,vxc,vxcavg,xccc3d,xcdata,k3xc=k3xc,vhartr=vhartr)
885 :
886 : !Get electronic temperature from dtset
887 28 : el_temp=merge(dtset%tphysel,dtset%tsmear,dtset%tphysel>tol8.and.dtset%occopt/=3.and.dtset%occopt/=9)
888 :
889 : !Compute local + Hxc potential, and subtract mean potential.
890 112 : ABI_MALLOC(vtrial,(nfftf,dtset%nspden))
891 63 : do ispden=1,min(dtset%nspden,2)
892 215999 : do ifft=1,nfftf
893 215971 : vtrial(ifft,ispden)=vhartr(ifft)+vxc(ifft,ispden)+vpsp(ifft)
894 : end do
895 : end do
896 28 : if (dtset%nspden==4) then
897 0 : do ispden=3,4
898 0 : do ifft=1,nfftf
899 0 : vtrial(ifft,ispden)=vxc(ifft,ispden)
900 : end do
901 : end do
902 : end if
903 28 : ABI_FREE(vpsp)
904 28 : ABI_FREE(vhartr)
905 :
906 28 : if(dtset%prtvol==-level)then
907 0 : call wrtout(std_out,' nonlinear : ground-state density and potential set up.')
908 : end if
909 :
910 : !PAW: compute Dij quantities (psp strengths)
911 28 : if (psps%usepaw==1)then
912 4 : cplex=1;ipert=0;option=1
913 4 : nzlmopt=0;if (dtset%pawnzlm>0) nzlmopt=-1
914 : call pawdenpot(compch_sph,el_temp,gprimd,ipert,dtset%ixc,my_natom,natom,dtset%nspden,&
915 : & ntypat,dtset%nucdipmom,nzlmopt,option,paw_an,paw_an,paw_energies,paw_ij,pawang,&
916 : & dtset%pawprtvol,pawrad,pawrhoij,dtset%pawspnorb,pawtab,dtset%pawxcdev,&
917 : & dtset%spnorbscl,dtset%xclevel,dtset%xc_denpos,dtset%xc_taupos,xred,ucvol,psps%znuclpsp,dtset%spinaxis, &
918 4 : & mpi_atmtab=mpi_enreg%my_atmtab,comm_atom=mpi_enreg%comm_atom)
919 :
920 4 : call timab(561,1,tsec)
921 : call pawdij(cplex,dtset%enunit,gprimd,ipert,my_natom,natom,nfftf,nfftotf,&
922 : & dtset%nspden,ntypat,paw_an,paw_ij,pawang,pawfgrtab,dtset%pawprtvol,&
923 : & pawrad,pawrhoij,dtset%pawspnorb,pawtab,dtset%pawxcdev,k0,&
924 : & dtset%spnorbscl,ucvol,dtset%cellcharge(1),vtrial,vxc,xred,dtset%znucl,&
925 : & nucdipmom=dtset%nucdipmom,&
926 : & mpi_atmtab=mpi_enreg%my_atmtab,comm_atom=mpi_enreg%comm_atom,&
927 4 : & spinaxis=dtset%spinaxis)
928 : call symdij(gprimd,indsym,ipert,my_natom,natom,dtset%nsym,ntypat,0,&
929 : & paw_ij,pawang,dtset%pawprtvol,pawtab,rprimd,dtset%symafm,symrec,&
930 4 : & mpi_atmtab=mpi_enreg%my_atmtab,comm_atom=mpi_enreg%comm_atom)
931 4 : call timab(561,2,tsec)
932 : end if
933 :
934 28 : ABI_FREE(xccc3d)
935 :
936 : ! Determine the subset of symmetry operations (nsym1 operations)
937 : ! that leaves the perturbation invariant, and initialize corresponding arrays
938 : ! symaf1, symrl1, tnons1 (and pawang1%zarot, if PAW)..
939 28 : nsym1 = 1
940 : ! symaf1_tmp(1) = 1
941 : ! symrl1_tmp(:,:,1) = dtset%symrel(:,:,1)
942 : ! tnons1_tmp(:,1) = 0_dp
943 84 : ABI_MALLOC(indsy1,(4,nsym1,dtset%natom))
944 28 : ABI_MALLOC(symrc1,(3,3,nsym1))
945 28 : ABI_MALLOC(symaf1,(nsym1))
946 28 : ABI_MALLOC(symrl1,(3,3,nsym1))
947 28 : ABI_MALLOC(tnons1,(3,nsym1))
948 28 : symaf1(1)= 1 !symaf1_tmp(1:nsym1)
949 364 : symrl1(:,:,1)= dtset%symrel(:,:,1) !symrl1_tmp(:,:,1:nsym1)
950 112 : tnons1(:,1)= 0_dp !tnons1_tmp(:,1:nsym1)
951 : ! ABI_FREE(symaf1_tmp)
952 : ! ABI_FREE(symrl1_tmp)
953 : ! ABI_FREE(tnons1_tmp)
954 :
955 : ! Set up corresponding symmetry data
956 112 : ABI_MALLOC(irrzon1,(dtset%nfft**(1-1/nsym1),2,(dtset%nspden/dtset%nsppol)-3*(dtset%nspden/4)))
957 112 : ABI_MALLOC(phnons1,(2,dtset%nfft**(1-1/nsym1),(dtset%nspden/dtset%nsppol)-3*(dtset%nspden/4)))
958 : call setsym(indsy1,irrzon1,1,dtset%natom,dtset%nfft,dtset%ngfft,dtset%nspden,dtset%nsppol,&
959 28 : & nsym1,phnons1,symaf1,symrc1,symrl1,tnons1,dtset%typat,xred)
960 28 : if (psps%usepaw==1) then
961 : ! Allocate/initialize only zarot in pawang1 datastructure
962 4 : call pawang_init(pawang1,0,0,pawang%l_max-1,0,0,nsym1,0,0,0,0)
963 4 : call setsym_ylm(gprimd,pawang1%l_max-1,pawang1%nsym,0,rprimd,symrc1,pawang1%zarot)
964 : end if
965 :
966 28 : if (pead/=0) then
967 : ! Initialize finite difference calculation of the ddk
968 :
969 21 : nkpt3 = 0
970 :
971 : ! Prepare first call to getkgrid (obtain number of k points in FBZ)
972 273 : dum_kptrlatt(:,:) = dtset%kptrlatt(:,:)
973 21 : dum_nshiftk = dtset%nshiftk
974 21 : ABI_CHECK(dum_nshiftk <= MAX_NSHIFTK, sjoin("dum_nshiftk must be <= ", itoa(MAX_NSHIFTK)))
975 21 : dum_shiftk(:,:) = zero
976 105 : dum_shiftk(:,1:dtset%nshiftk) = dtset%shiftk(:,1:dtset%nshiftk)
977 21 : dum_vacuum(:) = 0
978 :
979 21 : ABI_MALLOC(dum_kptns,(3,0))
980 21 : ABI_MALLOC(dum_wtk,(0))
981 : call getkgrid(0,0,dtset%iscf,dum_kptns,3,dum_kptrlatt,&
982 : & rdum,dtset%nsym,0,nkpt3,dum_nshiftk,dtset%nsym,&
983 : & rprimd,dum_shiftk,dtset%symafm,dtset%symrel,&
984 21 : & dum_vacuum,dum_wtk)
985 21 : ABI_FREE(dum_kptns)
986 21 : ABI_FREE(dum_wtk)
987 :
988 : ! write(std_out,*) 'nonlinear : nkpt, nkpt3 = ',dtset%nkpt,nkpt3
989 : !call flush(6)
990 : !jmb : malloc() problem with gcc461_openmpi under max2 : change order of allocations works ?!?
991 : !allocate(kneigh(30,nkpt),kg_neigh(30,nkpt,3),mvwtk(30,nkpt))
992 84 : ABI_MALLOC(kg_neigh,(30,dtset%nkpt,3))
993 63 : ABI_MALLOC(mvwtk,(30,dtset%nkpt))
994 63 : ABI_MALLOC(kneigh,(30,dtset%nkpt))
995 :
996 63 : ABI_MALLOC(kptindex,(2,nkpt3))
997 63 : ABI_MALLOC(kpt3,(3,nkpt3))
998 :
999 : call getshell(gmet,kneigh,kg_neigh,kptindex,dtset%kptopt,&
1000 : & dtset%kptrlatt,dtset%kptns,kpt3,dtset%mkmem,mkmem_max,mvwtk,&
1001 21 : & dtset%nkpt,nkpt3,nneigh,dtset%nshiftk,rmet,rprimd,dtset%shiftk,dtset%wtk, mpi_enreg%comm_cell)
1002 :
1003 105 : ABI_MALLOC(pwind,(dtset%mpw,nneigh,dtset%mkmem))
1004 84 : ABI_MALLOC(cgindex,(dtset%nkpt,dtset%nsppol))
1005 105 : ABI_MALLOC(mpi_enreg%kpt_loc2ibz_sp,(0:mpi_enreg%nproc-1,1:mkmem_max, 1:2))
1006 63 : ABI_MALLOC(mpi_enreg%mkmem,(0:mpi_enreg%nproc-1))
1007 :
1008 : call initmv(cgindex,dtset,gmet,kg,kneigh,kg_neigh,kptindex,&
1009 : & kpt3,dtset%mband,dtset%mkmem,mpi_enreg,dtset%mpw,dtset%nband,dtset%nkpt,&
1010 21 : & nkpt3,nneigh,npwarr,dtset%nsppol,occ,pwind)
1011 :
1012 : call pead_nl_loop(blkflg,cg,cgindex,dtfil,dtset,d3etot,gmet,gprimd,gsqcut,&
1013 : & hdr,kg,kneigh,kg_neigh,kptindex,kpt3,kxc,k3xc,dtset%mband,dtset%mgfft,&
1014 : & dtset%mkmem,mkmem_max,dtset%mk1mem,mpert,mpi_enreg,dtset%mpw,mvwtk,natom,nfftf,&
1015 : & dtset%nkpt,nkpt3,nkxc,nk3xc,nneigh,dtset%nspinor,dtset%nsppol,npwarr,occ,psps,pwind,&
1016 21 : & rfpert,rprimd,ucvol,xred)
1017 :
1018 : else ! pead=0 in this case
1019 :
1020 : call dfptnl_loop(atindx,blkflg,cg,dtfil,dtset,d3etot,eigen0,gmet,gprimd,gsqcut,&
1021 : & hdr,kg,kxc,k3xc,dtset%mband,dtset%mgfft,mgfftf,&
1022 : & dtset%mkmem,dtset%mk1mem,mpert,mpi_enreg,dtset%mpw,natom,nattyp,ngfftf,nfftf,nhat,&
1023 : & dtset%nkpt,nkxc,nk3xc,dtset%nspinor,dtset%nsppol,npwarr,occ,&
1024 : & paw_an,paw_ij,pawang,pawang1,pawfgr,pawfgrtab,pawrad,pawrhoij,pawtab,&
1025 : & ph1d,ph1df,psps,rfpert,rhog,rhor,rprimd,ucvol,usecprj,vtrial,vxc,xred,&
1026 : & nsym1,indsy1,symaf1,symrc1,&
1027 7 : & d3e_1,d3e_2,d3e_3,d3e_4,d3e_5,d3e_6,d3e_7,d3e_8,d3e_9)
1028 :
1029 : !Complete missing elements using symmetry operations
1030 :
1031 7 : if (dtset%nonlinear_info>0) then
1032 19234 : flg_tmp = blkflg
1033 1 : call d3sym(flg_tmp,d3e_1,indsym,mpert,natom,dtset%nsym,symrec,dtset%symrel)
1034 19234 : flg_tmp = blkflg
1035 1 : call d3sym(flg_tmp,d3e_2,indsym,mpert,natom,dtset%nsym,symrec,dtset%symrel)
1036 19234 : flg_tmp = blkflg
1037 1 : call d3sym(flg_tmp,d3e_3,indsym,mpert,natom,dtset%nsym,symrec,dtset%symrel)
1038 19234 : flg_tmp = blkflg
1039 1 : call d3sym(flg_tmp,d3e_4,indsym,mpert,natom,dtset%nsym,symrec,dtset%symrel)
1040 19234 : flg_tmp = blkflg
1041 1 : call d3sym(flg_tmp,d3e_5,indsym,mpert,natom,dtset%nsym,symrec,dtset%symrel)
1042 19234 : flg_tmp = blkflg
1043 1 : call d3sym(flg_tmp,d3e_6,indsym,mpert,natom,dtset%nsym,symrec,dtset%symrel)
1044 19234 : flg_tmp = blkflg
1045 1 : call d3sym(flg_tmp,d3e_7,indsym,mpert,natom,dtset%nsym,symrec,dtset%symrel)
1046 19234 : flg_tmp = blkflg
1047 1 : call d3sym(flg_tmp,d3e_8,indsym,mpert,natom,dtset%nsym,symrec,dtset%symrel)
1048 19234 : flg_tmp = blkflg
1049 1 : call d3sym(flg_tmp,d3e_9,indsym,mpert,natom,dtset%nsym,symrec,dtset%symrel)
1050 : end if
1051 :
1052 : end if ! end pead/=0
1053 :
1054 28 : write(msg,'(a,a,a)')ch10,&
1055 56 : & ' --- Third order energy calculation completed --- ',ch10
1056 28 : call wrtout(ab_out,msg)
1057 :
1058 :
1059 : !Complete missing elements using symmetry operations
1060 28 : call d3sym(blkflg,d3etot,indsym,mpert,natom,dtset%nsym,symrec,dtset%symrel)
1061 :
1062 28 : if (mpi_enreg%me == 0) then
1063 :
1064 : ! Write 3rd order derivatives in the output file
1065 24 : call dfptnl_doutput(blkflg,d3etot,mpert)
1066 :
1067 : ! Write the DDB file
1068 24 : dscrpt=' Note : temporary (transfer) database '
1069 24 : call ddb_hdr%init(dtset,psps,pawtab,dscrpt,1,xred=xred,occ=occ)
1070 :
1071 24 : call ddb%init(dtset, 1, mpert, with_d3E=.true.)
1072 :
1073 24 : call ddb%set_d3matr(1, d3etot, blkflg)
1074 :
1075 24 : call ddb%write(ddb_hdr, dtfil%fnameabo_ddb)
1076 :
1077 24 : call ddb_hdr%free()
1078 24 : call ddb%free()
1079 :
1080 : ! Compute tensors related to third-order derivatives
1081 24 : call nlopt(blkflg,carflg,d3etot,d3cart,gprimd,mpert,natom,rprimd,ucvol)
1082 : ! Note that the imaginary part is not transformed into cartesian coordinates
1083 24 : if (pead==0.and.(dtset%nonlinear_info>0)) then
1084 1 : call nlopt(blkflg,flg_tmp,d3e_1,d3cart_1,gprimd,mpert,natom,rprimd,ucvol)
1085 1 : call nlopt(blkflg,flg_tmp,d3e_2,d3cart_2,gprimd,mpert,natom,rprimd,ucvol)
1086 1 : call nlopt(blkflg,flg_tmp,d3e_3,d3cart_3,gprimd,mpert,natom,rprimd,ucvol)
1087 1 : call nlopt(blkflg,flg_tmp,d3e_4,d3cart_4,gprimd,mpert,natom,rprimd,ucvol)
1088 1 : call nlopt(blkflg,flg_tmp,d3e_5,d3cart_5,gprimd,mpert,natom,rprimd,ucvol)
1089 1 : call nlopt(blkflg,flg_tmp,d3e_6,d3cart_6,gprimd,mpert,natom,rprimd,ucvol)
1090 1 : call nlopt(blkflg,flg_tmp,d3e_7,d3cart_7,gprimd,mpert,natom,rprimd,ucvol)
1091 1 : call nlopt(blkflg,flg_tmp,d3e_8,d3cart_8,gprimd,mpert,natom,rprimd,ucvol)
1092 1 : call nlopt(blkflg,flg_tmp,d3e_9,d3cart_9,gprimd,mpert,natom,rprimd,ucvol)
1093 : end if
1094 :
1095 24 : if ((d3e_pert1(natom+2)==1).and.(d3e_pert2(natom+2)==1).and. &
1096 : & (d3e_pert3(natom+2)==1)) then
1097 :
1098 24 : flag = 1
1099 24 : i1pert = natom+2
1100 :
1101 : d3cart(:,:,i1pert,:,i1pert,:,i1pert) = &
1102 2256 : & d3cart(:,:,i1pert,:,i1pert,:,i1pert)*16*(pi**2)*(Bohr_Ang**2)*1.0d-8*eps0/e_Cb
1103 :
1104 24 : write(ab_out,*)ch10
1105 24 : write(ab_out,*)' Non-linear optical susceptibility tensor d (pm/V)'
1106 24 : write(ab_out,*)' in cartesian coordinates'
1107 24 : write(ab_out,*)' i1dir i2dir i3dir d'
1108 :
1109 96 : do i1dir = 1, 3
1110 312 : do i2dir = 1, 3
1111 936 : do i3dir = 1, 3
1112 648 : write(ab_out,'(3(5x,i2),5x,f16.9)') i1dir,i2dir,i3dir,&
1113 1296 : & d3cart(1,i1dir,i1pert,i2dir,i1pert,i3dir,i1pert)
1114 648 : if ((blkflg(i1dir,i1pert,i2dir,i1pert,i3dir,i1pert)/=1).or.&
1115 427 : & (carflg(i1dir,i1pert,i2dir,i1pert,i3dir,i1pert)/=1)) flag = 0
1116 : end do
1117 : end do
1118 : end do
1119 :
1120 24 : if (pead==0.and.(dtset%nonlinear_info>0)) then
1121 :
1122 : d3cart_1(:,:,i1pert,:,i1pert,:,i1pert) = &
1123 94 : & d3cart_1(:,:,i1pert,:,i1pert,:,i1pert)*16*(pi**2)*(Bohr_Ang**2)*1.0d-8*eps0/e_Cb
1124 : d3cart_2(:,:,i1pert,:,i1pert,:,i1pert) = &
1125 94 : & d3cart_2(:,:,i1pert,:,i1pert,:,i1pert)*16*(pi**2)*(Bohr_Ang**2)*1.0d-8*eps0/e_Cb
1126 : d3cart_8(:,:,i1pert,:,i1pert,:,i1pert) = &
1127 94 : & d3cart_8(:,:,i1pert,:,i1pert,:,i1pert)*16*(pi**2)*(Bohr_Ang**2)*1.0d-8*eps0/e_Cb
1128 : d3cart_9(:,:,i1pert,:,i1pert,:,i1pert) = &
1129 94 : & d3cart_9(:,:,i1pert,:,i1pert,:,i1pert)*16*(pi**2)*(Bohr_Ang**2)*1.0d-8*eps0/e_Cb
1130 :
1131 1 : theunit = ab_out
1132 :
1133 1 : write(small_msg,'(a)') ' ** Total :'
1134 1 : call print_chi2(d3cart,small_msg,theunit)
1135 :
1136 1 : write(small_msg,'(a)') ' ** sum_psi1H1psi1 :'
1137 1 : call print_chi2(d3cart_1,small_msg,theunit)
1138 :
1139 1 : write(small_msg,'(a)') ' ** sum_lambda1psi1psi1 :'
1140 1 : call print_chi2(d3cart_2,small_msg,theunit)
1141 :
1142 1 : write(small_msg,'(a)') ' ** exc3 :'
1143 1 : call print_chi2(d3cart_8,small_msg,theunit)
1144 :
1145 1 : write(small_msg,'(a)') ' ** exc3_paw :'
1146 1 : call print_chi2(d3cart_9,small_msg,theunit)
1147 :
1148 : end if ! nonlinear_info > 0
1149 :
1150 24 : if (flag == 0) then
1151 8 : write(msg,'(a,a,a,a,a,a)')ch10,&
1152 8 : & ' dfptnl_doutput: WARNING -',ch10,&
1153 8 : & ' matrix of third-order energies incomplete,',ch10,&
1154 16 : & ' non-linear optical coefficients may be wrong, check input variables rfatpol and rfdir.'
1155 8 : call wrtout(ab_out,msg)
1156 8 : call wrtout(std_out,msg)
1157 : end if
1158 :
1159 : end if ! d3e_pert1,d3e_pert2,d3e_pert3
1160 :
1161 : if (((maxval(d3e_pert1(1:natom))/=0).and.(d3e_pert2(natom+2)/=0).and. &
1162 : & (d3e_pert3(natom+2)/=0)).or.&
1163 : ((maxval(d3e_pert2(1:natom))/=0).and.(d3e_pert1(natom+2)/=0).and. &
1164 168 : & (d3e_pert3(natom+2)/=0)).or.&
1165 : ((maxval(d3e_pert3(1:natom))/=0).and.(d3e_pert2(natom+2)/=0).and. &
1166 : & (d3e_pert1(natom+2)/=0))) then
1167 : ! Perform a check if all relevant elements are available
1168 :
1169 24 : flag = 1
1170 72 : do i1pert = 1, natom
1171 216 : do i1dir = 1, 3
1172 624 : do i2dir = 1, 3
1173 1872 : do i3dir = 1, 3
1174 : if ((blkflg(i1dir,i1pert,i2dir,natom+2,i3dir,natom+2) /= 1).or.&
1175 1296 : (blkflg(i1dir,natom+2,i2dir,i1pert,i3dir,natom+2) /= 1).or.&
1176 418 : (blkflg(i1dir,natom+2,i2dir,natom+2,i3dir,i1pert) /= 1)) flag = 0
1177 : if ((carflg(i1dir,i1pert,i2dir,natom+2,i3dir,natom+2) /= 1).or.&
1178 1296 : (carflg(i1dir,natom+2,i2dir,i1pert,i3dir,natom+2) /= 1).or.&
1179 859 : (carflg(i1dir,natom+2,i2dir,natom+2,i3dir,i1pert) /= 1)) flag = 0
1180 : end do
1181 : end do
1182 : end do
1183 : end do
1184 :
1185 24 : write(ab_out,*)ch10
1186 24 : write(ab_out,*)' First-order change in the electronic dielectric '
1187 24 : write(ab_out,*)' susceptibility tensor (Bohr^-1)'
1188 24 : write(ab_out,*)' induced by an atomic displacement'
1189 24 : write(ab_out,*)' atom displacement'
1190 :
1191 72 : do i1pert = 1,natom
1192 192 : do i1dir = 1,3
1193 144 : write(ab_out,'(1x,i4,9x,i2,3(3x,f16.9))')i1pert,i1dir,&
1194 288 : & d3cart(1,i1dir,i1pert,1,natom+2,:,natom+2)
1195 : write(ab_out,'(16x,3(3x,f16.9))')&
1196 144 : & d3cart(1,i1dir,i1pert,2,natom+2,:,natom+2)
1197 : write(ab_out,'(16x,3(3x,f16.9))')&
1198 192 : & d3cart(1,i1dir,i1pert,3,natom+2,:,natom+2)
1199 : end do
1200 72 : write(ab_out,*)
1201 : end do
1202 :
1203 24 : if (flag == 0) then
1204 8 : write(msg,'(a,a,a,a,a,a)')ch10,&
1205 8 : & ' dfptnl_doutput: WARNING -',ch10,&
1206 8 : & ' matrix of third-order energies incomplete,',ch10,&
1207 16 : & ' changes in the dielectric susceptibility may be wrong, check input variables rfatpol and rfdir.'
1208 8 : call wrtout(ab_out,msg)
1209 8 : call wrtout(std_out,msg)
1210 : end if
1211 :
1212 24 : if (pead==0.and.(dtset%nonlinear_info>0)) then
1213 1 : theunit = ab_out
1214 :
1215 1 : write(small_msg,'(a)') ' ** Total :'
1216 1 : call print_dchidtau(d3cart,small_msg,theunit)
1217 :
1218 1 : write(small_msg,'(a)') ' ** sum_psi1H1psi1 :'
1219 1 : call print_dchidtau(d3cart_1,small_msg,theunit)
1220 :
1221 1 : write(small_msg,'(a)') ' ** sum_lambda1psi1psi1 :'
1222 1 : call print_dchidtau(d3cart_2,small_msg,theunit)
1223 :
1224 1 : write(small_msg,'(a)') ' ** sum_lambda1psi0S1psi1 :'
1225 1 : call print_dchidtau(d3cart_3,small_msg,theunit)
1226 :
1227 1 : write(small_msg,'(a)') ' ** sum_psi0H2psi1a :'
1228 1 : call print_dchidtau(d3cart_4,small_msg,theunit)
1229 :
1230 1 : write(small_msg,'(a)') ' ** sum_psi0H2psi1b :'
1231 1 : call print_dchidtau(d3cart_5,small_msg,theunit)
1232 :
1233 1 : write(small_msg,'(a)') ' ** eHxc21_paw :'
1234 1 : call print_dchidtau(d3cart_6,small_msg,theunit)
1235 :
1236 1 : write(small_msg,'(a)') ' ** eHxc21_nhat :'
1237 1 : call print_dchidtau(d3cart_7,small_msg,theunit)
1238 :
1239 1 : write(small_msg,'(a)') ' ** exc3 :'
1240 1 : call print_dchidtau(d3cart_8,small_msg,theunit)
1241 :
1242 1 : write(small_msg,'(a)') ' ** exc3_paw :'
1243 1 : call print_dchidtau(d3cart_9,small_msg,theunit)
1244 :
1245 : end if ! nonlinear_info > 0
1246 :
1247 : end if ! d3e_pert1,d3e_pert2,d3e_pert3
1248 : end if ! mpi_enreg%me
1249 :
1250 : ! TO OPTIMIZE DEALLOCATION !
1251 11 : if (pead/=0) then
1252 21 : ABI_FREE(cgindex)
1253 21 : ABI_FREE(kg_neigh)
1254 21 : ABI_FREE(kneigh)
1255 21 : ABI_FREE(kptindex)
1256 21 : ABI_FREE(kpt3)
1257 21 : ABI_FREE(mpi_enreg%kpt_loc2ibz_sp)
1258 21 : ABI_FREE(mpi_enreg%mkmem)
1259 21 : ABI_FREE(mvwtk)
1260 21 : ABI_FREE(pwind)
1261 : else
1262 7 : if (dtset%nonlinear_info>0) then
1263 1 : ABI_FREE(d3cart_1)
1264 1 : ABI_FREE(d3cart_2)
1265 1 : ABI_FREE(d3cart_3)
1266 1 : ABI_FREE(d3cart_4)
1267 1 : ABI_FREE(d3cart_5)
1268 1 : ABI_FREE(d3cart_6)
1269 1 : ABI_FREE(d3cart_7)
1270 1 : ABI_FREE(d3cart_8)
1271 1 : ABI_FREE(d3cart_9)
1272 1 : ABI_FREE(flg_tmp)
1273 : end if
1274 7 : ABI_FREE(d3e_1)
1275 7 : ABI_FREE(d3e_2)
1276 7 : ABI_FREE(d3e_3)
1277 7 : ABI_FREE(d3e_4)
1278 7 : ABI_FREE(d3e_5)
1279 7 : ABI_FREE(d3e_6)
1280 7 : ABI_FREE(d3e_7)
1281 7 : ABI_FREE(d3e_8)
1282 7 : ABI_FREE(d3e_9)
1283 : end if
1284 28 : ABI_FREE(atindx)
1285 28 : ABI_FREE(atindx1)
1286 28 : ABI_FREE(blkflg)
1287 28 : ABI_FREE(carflg)
1288 28 : ABI_FREE(cg)
1289 28 : ABI_FREE(d3cart)
1290 28 : ABI_FREE(d3etot)
1291 28 : ABI_FREE(d3e_pert1)
1292 28 : ABI_FREE(d3e_pert2)
1293 28 : ABI_FREE(d3e_pert3)
1294 28 : ABI_FREE(eigen0)
1295 28 : ABI_FREE(rhog)
1296 28 : ABI_FREE(rhor)
1297 28 : ABI_FREE(nhat)
1298 28 : ABI_FREE(nhatgr)
1299 28 : ABI_FREE(rfpert)
1300 28 : ABI_FREE(grxc)
1301 28 : ABI_FREE(kg)
1302 28 : ABI_FREE(kxc)
1303 28 : ABI_FREE(k3xc)
1304 28 : ABI_FREE(indsym)
1305 28 : ABI_FREE(indsy1)
1306 28 : ABI_FREE(nattyp)
1307 28 : ABI_FREE(npwarr)
1308 28 : ABI_FREE(symrec)
1309 28 : ABI_FREE(symrc1)
1310 28 : ABI_FREE(symaf1)
1311 28 : ABI_FREE(symrl1)
1312 28 : ABI_FREE(tnons1)
1313 28 : ABI_FREE(irrzon1)
1314 28 : ABI_FREE(phnons1)
1315 28 : ABI_FREE(symq)
1316 28 : ABI_FREE(ph1d)
1317 28 : ABI_FREE(ph1df)
1318 28 : ABI_FREE(vtrial)
1319 28 : ABI_FREE(vxc)
1320 28 : call pawfgr_destroy(pawfgr)
1321 28 : if (psps%usepaw==1) then
1322 4 : call pawang_free(pawang1)
1323 4 : call pawrhoij_free(pawrhoij)
1324 4 : call paw_an_free(paw_an)
1325 4 : call paw_ij_free(paw_ij)
1326 4 : call pawfgrtab_free(pawfgrtab)
1327 : end if
1328 36 : ABI_FREE(pawrhoij)
1329 36 : ABI_FREE(paw_an)
1330 36 : ABI_FREE(paw_ij)
1331 36 : ABI_FREE(pawfgrtab)
1332 :
1333 : ! Clean the header
1334 28 : call hdr%free()
1335 :
1336 : !As the etotal energy has no meaning here, we set it to zero
1337 : !(to avoid meaningless side-effects when comparing ouputs...)
1338 28 : etotal = zero
1339 :
1340 140 : call timab(501,2,tsec)
1341 :
1342 : DBG_EXIT("COLL")
1343 :
1344 : contains
1345 : !!***
1346 :
1347 : !!****f* nonlinear/print_chi2
1348 : !! NAME
1349 : !! print_chi2
1350 : !!
1351 : !! FUNCTION
1352 : !! Print a third derivative tensor. Used only in nonlinear
1353 : !!
1354 : !! INPUTS
1355 : !! d3cart0 = the tensor to print
1356 : !! msg = a short message printed before the tensor
1357 : !! theunit = unit where the tensor is written
1358 : !!
1359 : !! SOURCE
1360 :
1361 5 : subroutine print_chi2(d3cart0,msg,theunit)
1362 :
1363 : integer,intent(in) :: theunit
1364 : character(len=30) :: msg
1365 : real(dp) :: elem1,elem2
1366 : real(dp),intent(in) :: d3cart0(2,3,mpert,3,mpert,3,mpert)
1367 : ! *************************************************************************
1368 :
1369 5 : write(theunit,'(2a)') ch10,msg
1370 20 : do i1dir = 1, 3
1371 65 : do i2dir = 1, 3
1372 195 : do i3dir = 1, 3
1373 135 : elem1 = d3cart0(1,i1dir,natom+2,i2dir,natom+2,i3dir,natom+2)
1374 135 : elem2 = d3cart0(2,i1dir,natom+2,i2dir,natom+2,i3dir,natom+2)
1375 180 : write(theunit,'(3(5x,i2),5x,f16.9,2x,f16.9)') i1dir,i2dir,i3dir,elem1,elem2
1376 : end do
1377 : end do
1378 : end do
1379 :
1380 5 : end subroutine print_chi2
1381 : !!***
1382 :
1383 : !!****f* nonlinear/print_dchidtau
1384 : !! NAME
1385 : !! print_dchidtau
1386 : !!
1387 : !! FUNCTION
1388 : !! Print a third derivative tensor. Used only in nonlinear
1389 : !!
1390 : !! INPUTS
1391 : !! d3cart0 = the tensor to print
1392 : !! msg = a short message printed before the tensor
1393 : !! theunit = unit where the tensor is written
1394 : !!
1395 : !! OUTPUT
1396 : !!
1397 : !! SIDE EFFECTS
1398 : !!
1399 : !! SOURCE
1400 :
1401 10 : subroutine print_dchidtau(d3cart0,msg,theunit)
1402 :
1403 : integer,intent(in) :: theunit
1404 : character(len=30) :: msg
1405 : real(dp),intent(in) :: d3cart0(2,3,mpert,3,mpert,3,mpert)
1406 : ! *************************************************************************
1407 :
1408 10 : write(theunit,'(a)') msg
1409 30 : do i1pert = 1,natom
1410 90 : do i1dir = 1,3
1411 60 : write(theunit,'(1x,i4,9x,i2,3(3x,f16.9),3(3x,f16.9))')i1pert,i1dir,&
1412 120 : d3cart0(1,i1dir,i1pert,1,natom+2,:,natom+2),d3cart0(2,i1dir,i1pert,1,natom+2,:,natom+2)
1413 : write(theunit,'(16x,3(3x,f16.9),3(3x,f16.9))')&
1414 60 : d3cart0(1,i1dir,i1pert,2,natom+2,:,natom+2),d3cart0(2,i1dir,i1pert,2,natom+2,:,natom+2)
1415 : write(theunit,'(16x,3(3x,f16.9),3(3x,f16.9))')&
1416 80 : d3cart0(1,i1dir,i1pert,3,natom+2,:,natom+2),d3cart0(2,i1dir,i1pert,3,natom+2,:,natom+2)
1417 : end do
1418 : end do
1419 :
1420 10 : end subroutine print_dchidtau
1421 : !!***
1422 :
1423 : end subroutine nonlinear
1424 : !!***
1425 :
1426 : !!****f* ABINIT/initmv
1427 : !! NAME
1428 : !! initmv
1429 : !!
1430 : !! FUNCTION
1431 : !! Initialize finite difference calculation of the ddk im dfptnl_mv.f
1432 : !!
1433 : !! INPUTS
1434 : !! dtset <type(dataset_type)> = all input variables in this dataset
1435 : !! gmet(3,3) = reciprocal space metric tensor in bohr**-2
1436 : !! kg(3,mpw*mkmem) = reduced (integer) coordinates of G vecs in basis sphere
1437 : !! kneigh(30,nkpt2) = index of the neighbours of each k-point
1438 : !! kg_neigh(30,nkpt2,3) = necessary to construct the vector joining a k-point
1439 : !! to its nearest neighbour in case of a single k-point,
1440 : !! a line of k-points or a plane of k-points.
1441 : !! See getshell.F90 for details
1442 : !! kptindex(2,nkpt3)= index of the k-points in the reduced BZ
1443 : !! related to a k-point in the full BZ
1444 : !! kpt3(3,nkpt3) = reduced coordinates of k-points in the full BZ
1445 : !! mband = maximum number of bands
1446 : !! mkmem = number of k points which can fit in memory
1447 : !! mpi_enreg = information about MPI parallelization
1448 : !! mpw = maximum number of plane waves
1449 : !! nband(nkpt*nsppol)=number of bands at each k point, for each polarization
1450 : !! nkpt2 = number of k-points in the reduced BZ
1451 : !! nkpt3 = number of k-points in the full BZ
1452 : !! nneigh = total number of neighbours required to evaluate the finite
1453 : !! difference formula
1454 : !! npwarr(nkpt2)=number of planewaves at each k point
1455 : !! nsppol = number of spin polarizations
1456 : !! occ(mband*nkpt*nsppol) = occupation number for each band for each k
1457 : !!
1458 : !! OUTPUT
1459 : !! cgindex(nkpt2,nsppol) = for each k-point, cgindex tores the location of the WF in the cg array
1460 : !! me = index of the current processor
1461 : !! ineigh = index of a neighbour
1462 : !! ikpt_loc = index of the iteration on ikpt on the current processor
1463 : !! ikpt_rbz = index of a k-point in the reduced BZ
1464 : !! pwind(mpw,nneigh,mkmem) = array used to compute the overlap matrix smat between k-points
1465 : !! (see initberry.f for more explanations)
1466 : !!
1467 : !! SOURCE
1468 :
1469 21 : subroutine initmv(cgindex,dtset,gmet,kg,kneigh,kg_neigh,kptindex,&
1470 21 : & kpt3,mband,mkmem,mpi_enreg,mpw,nband,nkpt2,&
1471 21 : & nkpt3,nneigh,npwarr,nsppol,occ,pwind)
1472 :
1473 : !Arguments ------------------------------------
1474 : !scalars
1475 : integer,intent(in) :: mband,mkmem,mpw,nkpt2,nkpt3,nneigh,nsppol
1476 : type(MPI_type),intent(inout) :: mpi_enreg
1477 : type(dataset_type),intent(in) :: dtset
1478 : !arrays
1479 : integer,intent(in) :: kg(3,mpw*mkmem),kneigh(30,nkpt2),kg_neigh(30,nkpt2,3)
1480 : integer,intent(in) :: nband(nkpt2*nsppol),npwarr(nkpt2),kptindex(2,nkpt3)
1481 : integer,intent(out) :: cgindex(nkpt2,nsppol),pwind(mpw,nneigh,mkmem)
1482 : real(dp),intent(in) :: gmet(3,3),kpt3(3,nkpt3),occ(mband*nkpt2*nsppol)
1483 :
1484 : !Local variables-------------------------------
1485 : !scalars
1486 : integer :: flag,iband,icg,ierr,ikg,ikg1,ikpt,ikpt2,ikpt_loc,ikpt_rbz
1487 : integer :: index,ineigh,ipw,isppol,jpw,nband_k,mband_occ,mband_occ_k,npw_k
1488 : integer :: npw_k1,orig,spaceComm
1489 : real(dp) :: ecut_eff,sdeg
1490 : character(len=500) :: msg
1491 : !arrays
1492 : integer :: dg(3)
1493 21 : integer,allocatable :: kg1(:,:),kg1_k(:,:),npwar1(:),npwtot(:)
1494 : real(dp) :: dk(3),dk_(3)
1495 21 : real(dp),allocatable :: kpt1(:,:)
1496 :
1497 : !************************************************************************
1498 :
1499 : if (xmpi_paral== 1) then
1500 21 : spaceComm=mpi_enreg%comm_cell
1501 2567 : mpi_enreg%kpt_loc2ibz_sp(:,:,:) = 0
1502 56 : mpi_enreg%mkmem(:) = 0
1503 : end if
1504 :
1505 21 : ecut_eff = dtset%ecut*(dtset%dilatmx)**2
1506 63 : ABI_MALLOC(kg1_k,(3,mpw))
1507 63 : ABI_MALLOC(kg1,(3,mkmem*mpw))
1508 63 : ABI_MALLOC(kpt1,(3,nkpt2))
1509 63 : ABI_MALLOC(npwar1,(nkpt2))
1510 42 : ABI_MALLOC(npwtot,(nkpt2))
1511 29997 : kg1_k(:,:) = 0
1512 328593 : pwind(:,:,:) = 0
1513 717 : cgindex(:,:) = 0
1514 :
1515 : !Compute the number of occupied bands.
1516 : !Check that it is the same for every k-point and that
1517 : !nband(ikpt) is equal to this value
1518 :
1519 21 : if (nsppol == 1) then
1520 : sdeg = two
1521 3 : else if (nsppol == 2) then
1522 3 : sdeg = one
1523 : end if
1524 :
1525 : !DEBUG
1526 : !write(std_out,*)' list of nband '
1527 : !do isppol = 1, nsppol
1528 : !do ikpt = 1, nkpt2
1529 : !nband_k = nband(ikpt + (isppol - 1)*nkpt2)
1530 : !write(std_out,*)' isppol, ikpt, nband_k=',isppol, ikpt, nband_k
1531 : !end do
1532 : !end do
1533 : !ENDDEBUG
1534 :
1535 21 : index = 0
1536 45 : do isppol = 1, nsppol
1537 717 : do ikpt = 1, nkpt2
1538 :
1539 672 : mband_occ_k = 0
1540 672 : nband_k = nband(ikpt + (isppol - 1)*nkpt2)
1541 :
1542 3280 : do iband = 1, nband_k
1543 2608 : index = index + 1
1544 3280 : if (abs(occ(index) - sdeg) < tol8) mband_occ_k = mband_occ_k + 1
1545 : end do
1546 :
1547 672 : if (nband_k /= mband_occ_k) then
1548 : write(msg,'(a,a,a)')&
1549 0 : & ' In a non-linear response calculation, nband must be equal ',ch10,&
1550 0 : & ' to the number of valence bands.'
1551 0 : ABI_ERROR(msg)
1552 : end if
1553 :
1554 : ! Note that the number of bands can be different for spin up and spin down
1555 696 : if (ikpt > 1) then
1556 648 : if (mband_occ /= mband_occ_k) then
1557 0 : ABI_ERROR('The number of valence bands is not the same for every k-point')
1558 : end if
1559 : else
1560 : mband_occ = mband_occ_k
1561 : end if
1562 :
1563 : end do ! close loop over ikpt
1564 : end do ! close loop over isppol
1565 :
1566 : !Find the location of each wavefunction
1567 :
1568 21 : icg = 0
1569 45 : do isppol = 1, nsppol
1570 717 : do ikpt = 1, nkpt2
1571 : ! fab: inserted the shift due to the spin...
1572 672 : nband_k = dtset%nband(ikpt+(isppol - 1)*nkpt2)
1573 672 : npw_k = npwarr(ikpt)
1574 :
1575 672 : if (proc_distrb_cycle(mpi_enreg%proc_distrb,ikpt,1,nband_k,isppol,mpi_enreg%me)) cycle
1576 :
1577 608 : cgindex(ikpt,isppol) = icg
1578 696 : icg = icg + dtset%nspinor*npw_k*nband_k
1579 :
1580 : end do
1581 : end do
1582 :
1583 :
1584 : !Build pwind
1585 :
1586 147 : do ineigh = 1, nneigh
1587 :
1588 4074 : do ikpt = 1, nkpt2
1589 3948 : ikpt2 = kneigh(ineigh,ikpt)
1590 3948 : ikpt_rbz = kptindex(1,ikpt2) ! index of the k-point in the reduced BZ
1591 15918 : kpt1(:,ikpt) = dtset%kptns(:,ikpt_rbz)
1592 : end do
1593 :
1594 : ! Set up the basis sphere of plane waves at kpt1
1595 1297782 : kg1(:,:) = 0
1596 : call kpgio(ecut_eff,dtset%exchn2n3d,gmet,dtset%istwfk,kg1,&
1597 : & kpt1,mkmem,dtset%nband,nkpt2,'PERS',mpi_enreg,mpw,&
1598 126 : & npwar1,npwtot,dtset%nsppol)
1599 :
1600 126 : ikg = 0 ; ikg1 = 0 ; ikpt_loc = 0
1601 :
1602 126 : if(dtset%nsppol/=1)then
1603 18 : if(mpi_enreg%nproc/=1)then
1604 0 : ABI_ERROR('At present, non-linear response calculations for spin-polarized system cannot be done in parallel.')
1605 : else
1606 18 : isppol=1
1607 : end if
1608 : else
1609 108 : isppol=1
1610 : end if
1611 :
1612 4095 : do ikpt = 1, nkpt2
1613 :
1614 3948 : nband_k = dtset%nband(ikpt+(isppol - 1)*nkpt2)
1615 3948 : ikpt2 = kneigh(ineigh,ikpt)
1616 3948 : ikpt_rbz = kptindex(1,ikpt2) ! index of the k-point in the reduced BZ
1617 :
1618 3948 : if (proc_distrb_cycle(mpi_enreg%proc_distrb,ikpt,1,nband_k,-1,mpi_enreg%me)) cycle
1619 :
1620 3564 : ikpt_loc = ikpt_loc + 1
1621 :
1622 3564 : mpi_enreg%kpt_loc2ibz_sp(mpi_enreg%me, ikpt_loc, 1) = ikpt
1623 :
1624 3564 : flag = 0
1625 3564 : npw_k = npwarr(ikpt)
1626 3564 : npw_k1 = npwarr(ikpt_rbz)
1627 14256 : dk_(:) = kpt3(:,ikpt2) - dtset%kptns(:,ikpt)
1628 14256 : dk(:) = dk_(:) - nint(dk_(:)) + real(kg_neigh(ineigh,ikpt,:),dp)
1629 14256 : dg(:) = nint(dk(:) - dk_(:))
1630 :
1631 :
1632 3564 : if (kptindex(2,ikpt2) == 0) then
1633 1071030 : kg1_k(:,1:npw_k1) = kg1(:,ikg1+1:ikg1+npw_k1)
1634 2854 : if (dg(1)==0.and.dg(2)==0.and.dg(3)==0) flag = 1
1635 : else
1636 184494 : kg1_k(:,1:npw_k1) = -1*kg1(:,ikg1+1:ikg1+npw_k1)
1637 : end if
1638 :
1639 3564 : orig = 1
1640 316554 : do ipw = 1, npw_k
1641 61901662 : do jpw = orig, npw_k1
1642 :
1643 : if ((kg(1,ikg + ipw) == kg1_k(1,jpw) - dg(1)).and. &
1644 61875792 : & (kg(2,ikg + ipw) == kg1_k(2,jpw) - dg(2)).and. &
1645 22306 : & (kg(3,ikg + ipw) == kg1_k(3,jpw) - dg(3))) then
1646 :
1647 290684 : pwind(ipw,ineigh,ikpt_loc) = jpw
1648 290684 : if (flag == 1) orig = jpw + 1
1649 : exit
1650 :
1651 : end if
1652 :
1653 : end do
1654 : end do
1655 :
1656 3564 : ikg = ikg + npw_k
1657 4074 : ikg1 = ikg1 + npw_k1
1658 :
1659 : end do ! close loop over k-points
1660 : end do ! close loop over ineigh
1661 :
1662 21 : mpi_enreg%mkmem(mpi_enreg%me) = mkmem
1663 :
1664 21 : call xmpi_sum(mpi_enreg%kpt_loc2ibz_sp,spaceComm,ierr)
1665 21 : call xmpi_sum(mpi_enreg%mkmem,spaceComm,ierr)
1666 :
1667 21 : ABI_FREE(kg1)
1668 21 : ABI_FREE(kg1_k)
1669 21 : ABI_FREE(kpt1)
1670 21 : ABI_FREE(npwar1)
1671 21 : ABI_FREE(npwtot)
1672 :
1673 21 : end subroutine initmv
1674 : !!***
1675 :
1676 : !----------------------------------------------------------------------
1677 :
1678 : !!****f* m_nonlinear/dfptnl_doutput
1679 : !! NAME
1680 : !! dfptnl_doutput
1681 : !!
1682 : !! FUNCTION
1683 : !! Write the matrix of third-order derivatives to the output file
1684 : !!
1685 : !! INPUTS
1686 : !! blkflg(3,mpert,3,mpert,3,mpert)= ( 1 if the element of the 3dte
1687 : !! has been calculated ; 0 otherwise )
1688 : !! d3(2,3,mpert,3,mpert,3,mpert)= matrix of the 3DTE
1689 : !! mpert =maximum number of ipert
1690 : !! natom=Number of atoms
1691 : !! ntypat=Number of type of atoms
1692 : !! unddb = unit number for DDB output
1693 : !!
1694 : !! NOTES
1695 : !! d3 holds the third-order derivatives before computing
1696 : !! the permutations of the perturbations.
1697 : !!
1698 : !! SOURCE
1699 :
1700 24 : subroutine dfptnl_doutput(blkflg,d3,mpert)
1701 :
1702 : !Arguments -------------------------------
1703 : !scalars
1704 : integer,intent(in) :: mpert
1705 : !arrays
1706 : integer,intent(in) :: blkflg(3,mpert,3,mpert,3,mpert)
1707 : real(dp),intent(in) :: d3(2,3,mpert,3,mpert,3,mpert)
1708 :
1709 : !Local variables -------------------------
1710 : !scalars
1711 : integer :: i1dir,i1pert,i2dir,i2pert,i3dir,i3pert
1712 : character(len=500) :: msg
1713 :
1714 : !*************************************************************************
1715 :
1716 : ! Write blok of third-order derivatives to ouput file
1717 :
1718 24 : write(msg,'(a,a,a,a,a)')ch10,&
1719 24 : ' Matrix of third-order derivatives (reduced coordinates)',ch10,&
1720 48 : ' before computing the permutations of the perturbations',ch10
1721 24 : call wrtout(ab_out,msg)
1722 :
1723 24 : write(ab_out,*)' j1 j2 j3 matrix element'
1724 24 : write(ab_out,*)' dir pert dir pert dir pert real part imaginary part'
1725 :
1726 216 : do i1pert=1,mpert
1727 792 : do i1dir=1,3
1728 5376 : do i2pert=1,mpert
1729 19008 : do i2dir=1,3
1730 129024 : do i3pert=1,mpert
1731 456192 : do i3dir=1,3
1732 :
1733 442368 : if (blkflg(i1dir,i1pert,i2dir,i2pert,i3dir,i3pert)/=0) then
1734 :
1735 : write(ab_out,'(3(i4,i5),2f22.10)')&
1736 3080 : i1dir,i1pert,i2dir,i2pert,i3dir,i3pert,&
1737 6160 : d3(:,i1dir,i1pert,i2dir,i2pert,i3dir,i3pert)
1738 : end if
1739 :
1740 : end do
1741 : end do
1742 : end do
1743 : end do
1744 : end do
1745 : end do
1746 :
1747 24 : end subroutine dfptnl_doutput
1748 : !!***
1749 :
1750 : end module m_nonlinear
1751 : !!***
|