Line data Source code
1 : !!****m* ABINIT/m_dfptnl_loop
2 : !! NAME
3 : !! m_dfptnl_loop
4 : !!
5 : !! FUNCTION
6 : !!
7 : !! COPYRIGHT
8 : !! Copyright (C) 2018-2026 ABINIT group (LB)
9 : !! This file is distributed under the terms of the
10 : !! GNU General Public License, see ~abinit/COPYING
11 : !! or http://www.gnu.org/copyleft/gpl.txt .
12 : !!
13 : !! SOURCE
14 :
15 : #if defined HAVE_CONFIG_H
16 : #include "config.h"
17 : #endif
18 :
19 : #include "abi_common.h"
20 :
21 : module m_dfptnl_loop
22 :
23 : implicit none
24 :
25 : private
26 : !!***
27 :
28 : public :: dfptnl_loop
29 : !!***
30 :
31 : contains
32 : !!***
33 :
34 : !!****f* ABINIT/dfptnl_loop
35 : !! NAME
36 : !! dfptnl_loop
37 : !!
38 : !! FUNCTION
39 : !! Loop over the perturbations j1, j2 and j3
40 : !!
41 : !! COPYRIGHT
42 : !! Copyright (C) 2018-2026 ABINIT group (LB)
43 : !! This file is distributed under the terms of the
44 : !! GNU General Public License, see ~abinit/COPYING
45 : !! or http://www.gnu.org/copyleft/gpl.txt .
46 : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt .
47 : !!
48 : !! INPUTS
49 : !! atindx(natom)=index table for atoms (see gstate.f)
50 : !! cg(2,mpw*nspinor*mband*mkmem*nsppol) = array for planewave coefficients of wavefunctions
51 : !! dtfil <type(datafiles_type)>=variables related to files
52 : !! dtset <type(dataset_type)>=all input variables for this dataset
53 : !! eigen0(mband*nkpt_rbz*nsppol)=GS eigenvalues at k (hartree)
54 : !! gmet(3,3)=reciprocal space metric tensor in bohr**-2
55 : !! gprimd(3,3)=dimensional primitive translations for reciprocal space(bohr^-1)
56 : !! gsqcut=Fourier cutoff on G^2 for "large sphere" of radius double
57 : !! that of the basis sphere--appropriate for charge density rho(G),
58 : !! Hartree potential, and pseudopotentials
59 : !! kg(3,mpw*mkmem)=reduced planewave coordinates
60 : !! kxc(nfftf,nkxc)=exchange-correlation kernel
61 : !! k3xc(nfftf,nk3xc)=third-order exchange-correlation kernel
62 : !! mband = maximum number of bands
63 : !! mgfft = maximum single fft dimension
64 : !! mkmem = Number of k points treated by this node.
65 : !! mk1mem = Number of k points for first-order WF treated by this node.
66 : !! mpert =maximum number of ipert
67 : !! mpi_enreg=MPI-parallelisation information
68 : !! mpw = maximum number of planewaves in basis sphere (large number)
69 : !! natom = number of atoms in unit cell
70 : !! nattyp(ntypat)= # atoms of each type.
71 : !! nfftf=(effective) number of FFT grid points (for this proc) for the "fine" grid (see NOTES in respfn.F90)
72 : !! ngfftf(1:18)=integer array with FFT box dimensions and other for the "fine" grid (see NOTES in respfn.F90)
73 : !! nhat=compensation charge density on fine rectangular grid
74 : !! nkpt = number of k points
75 : !! nkxc=second dimension of the array kxc, see rhotoxc.f for a description
76 : !! nk3xc=second dimension of the array k3xc
77 : !! nspinor = number of spinorial components of the wavefunctions
78 : !! nsppol = number of channels for spin-polarization (1 or 2)
79 : !! npwarr(nkpt) = array holding npw for each k point
80 : !! occ(mband*nkpt*nsppol) = occupation number for each band and k
81 : !! paw_an0(natom) <type(paw_an_type)>=paw arrays for 0th-order quantities given on angular mesh
82 : !! paw_ij0(my_natom*usepaw) <type(paw_ij_type)>=paw arrays given on (i,j) channels for the GS
83 : !! pawang <type(pawang_type)>=paw angular mesh and related data
84 : !! pawang1 <type(pawang_type)>=pawang datastructure containing only the symmetries preserving the perturbation
85 : !! pawfgr <type(pawfgr_type)>=fine grid parameters and related data
86 : !! pawfgrtab(natom*usepaw) <type(pawfgrtab_type)>=atomic data given on fine rectangular grid for the GS
87 : !! pawrad(ntypat*usepaw) <type(pawrad_type)>=paw radial mesh and related data
88 : !! pawrhoij(natom) <type(pawrhoij_type)>= paw rhoij occupancies and related data for the GS
89 : !! pawtab(ntypat*usepaw) <type(pawtab_type)>=paw tabulated starting data
90 : !! ph1d(2,3*(2*mgfft+1)*natom)=one-dimensional structure factor information
91 : !! ph1df(2,3*(2*mgfftf+1)*natom)=one-dimensional structure factor information (fine grid)
92 : !! psps <type(pseudopotential_type)> = variables related to pseudopotentials
93 : !! rfpert(3,mpert,3,mpert,3,mpert) = array defining the type of perturbations
94 : !! that have to be computed
95 : !! 1 -> element has to be computed explicitely
96 : !! -1 -> use symmetry operations to obtain the corresponding element
97 : !! rhog(2,nfftf)=array for Fourier transform of GS electron density
98 : !! rhor(nfftf,nspden)=array for GS electron density in electrons/bohr**3.
99 : !! rprimd(3,3)=dimensional primitive translations (bohr)
100 : !! ucvol = unit cell volume (bohr^3)
101 : !! usecprj= 1 if cprj, cprjq, cprj1 arrays are stored in memory
102 : !! vtrial(nfftf,nspden)=GS Vtrial(r).
103 : !! vxc(nfftf,nspden)=Exchange-Correlation GS potential (Hartree)
104 : !! xred(3,natom) = reduced atomic coordinates
105 : !! nsym1=number of symmetry elements in space group consistent with perturbation
106 : !! indsy1(4,nsym1,natom)=indirect indexing array for atom labels
107 : !! symaf1(nsym1)=anti(ferromagnetic) part of symmetry operations
108 : !! symrc1(3,3,nsym1)=symmetry operations in reciprocal space
109 : !!
110 : !! OUTPUT
111 : !! blkflg(3,mpert,3,mpert) = flags for each element of the 3DTE
112 : !! (=1 if computed)
113 : !! d3etot(2,3,mpert,3,mpert,3,mpert) = third derivatives of the energy tensor
114 : !! = \sum_{i=1}^9 d3etot_i
115 : !! d3etot_1(2,3,mpert,3,mpert,3,mpert) = 1st term of d3etot
116 : !! d3etot_2(2,3,mpert,3,mpert,3,mpert) = 2nd term of d3etot
117 : !! d3etot_3(2,3,mpert,3,mpert,3,mpert) = 3rd term of d3etot
118 : !! d3etot_4(2,3,mpert,3,mpert,3,mpert) = 4th term of d3etot
119 : !! d3etot_5(2,3,mpert,3,mpert,3,mpert) = 5th term of d3etot
120 : !! d3etot_6(2,3,mpert,3,mpert,3,mpert) = 6th term of d3etot
121 : !! d3etot_7(2,3,mpert,3,mpert,3,mpert) = 7th term of d3etot
122 : !! d3etot_8(2,3,mpert,3,mpert,3,mpert) = 8th term of d3etot
123 : !! d3etot_9(2,3,mpert,3,mpert,3,mpert) = 9th term of d3etot
124 : !!
125 : !! SIDE EFFECTS
126 : !! hdr <type(hdr_type)>=the header of wf, den and pot files
127 : !!
128 : !! SOURCE
129 :
130 7 : subroutine dfptnl_loop(atindx,blkflg,cg,dtfil,dtset,d3etot,eigen0,gmet,gprimd,gsqcut, &
131 7 : & hdr,kg,kxc,k3xc,mband,mgfft,mgfftf,mkmem,mk1mem,&
132 7 : & mpert,mpi_enreg,mpw,natom,nattyp,ngfftf,nfftf,nhat,nkpt,nkxc,nk3xc,nspinor,nsppol,&
133 7 : & npwarr,occ,paw_an0,paw_ij0,&
134 7 : & pawang,pawang1,pawfgr,pawfgrtab,pawrad,pawrhoij,pawtab,&
135 7 : & ph1d,ph1df,psps,rfpert,rhog,rhor,rprimd,ucvol,usecprj,vtrial,vxc,xred,&
136 7 : & nsym1,indsy1,symaf1,symrc1,&
137 7 : & d3etot_1,d3etot_2,d3etot_3,d3etot_4,d3etot_5,d3etot_6,d3etot_7,d3etot_8,d3etot_9)
138 :
139 : use defs_basis
140 : use defs_wvltypes
141 : use m_errors
142 : use m_abicore
143 : use m_hdr
144 : use m_nctk
145 : use m_wffile
146 : use m_wfk
147 : use m_dtset
148 : use m_dtfil
149 :
150 : use defs_datatypes, only : pseudopotential_type
151 : use defs_abitypes, only : MPI_type
152 : use m_time, only : timab
153 : use m_io_tools, only : file_exists
154 : use m_kg, only : getph
155 : use m_inwffil, only : inwffil
156 : use m_fft, only : fourdp
157 : use m_ioarr, only : read_rhor
158 : use m_hamiltonian, only : gs_hamiltonian_type
159 : use m_pawdij, only : pawdij, pawdijfr, symdij
160 : use m_paw_energies,only : paw_energies_type
161 : use m_pawfgr, only : pawfgr_type
162 : use m_pawfgrtab, only : pawfgrtab_type
163 : use m_paw_an, only : paw_an_type, paw_an_init, paw_an_free, paw_an_nullify, paw_an_reset_flags
164 : use m_paw_ij, only : paw_ij_type, paw_ij_init, paw_ij_free, paw_ij_nullify, paw_ij_reset_flags, paw_ij_print
165 : use m_pawang, only : pawang_type
166 : use m_pawrad, only : pawrad_type
167 : use m_pawrhoij, only : pawrhoij_type, pawrhoij_alloc, pawrhoij_free, pawrhoij_nullify, &
168 : & pawrhoij_io, pawrhoij_inquire_dim
169 : use m_paw_nhat, only : pawmknhat,pawnhatfr
170 : use m_paw_denpot, only : pawdenpot
171 : use m_pawtab, only : pawtab_type
172 : use m_rf2, only : rf2_getidir
173 : use m_initylmg, only : initylmg
174 : use m_atm2fft, only : dfpt_atm2fft
175 : use m_dfpt_mkvxc, only : dfpt_mkvxc
176 : use m_dfpt_rhotov, only : dfpt_rhotov
177 : use m_mkcore, only : dfpt_mkcore
178 : use m_mklocl, only : dfpt_vlocal
179 : use m_dfptnl_pert, only : dfptnl_pert
180 :
181 : !Arguments ------------------------------------
182 : !scalars
183 : integer,intent(in) :: mband,mgfft,mgfftf,mk1mem,mkmem,mpert,mpw,natom,nfftf
184 : integer,intent(in) :: nk3xc,nkpt,nkxc,nspinor,nsppol,nsym1,usecprj
185 : real(dp),intent(in) :: gsqcut,ucvol
186 : type(MPI_type),intent(inout) :: mpi_enreg
187 : type(datafiles_type),intent(in) :: dtfil
188 : type(dataset_type),intent(in) :: dtset
189 : type(hdr_type),intent(inout) :: hdr
190 : type(pawang_type),intent(inout) :: pawang,pawang1
191 : type(pawfgr_type),intent(in) :: pawfgr
192 : type(pseudopotential_type),intent(in) :: psps
193 :
194 : !arrays
195 : integer,intent(in) :: atindx(natom),kg(3,mk1mem*mpw)
196 : integer,intent(in) :: nattyp(psps%ntypat),ngfftf(18),npwarr(nkpt)
197 : integer,intent(in) :: rfpert(3,mpert,3,mpert,3,mpert)
198 : integer,intent(in) :: indsy1(4,nsym1,dtset%natom),symaf1(nsym1),symrc1(3,3,nsym1)
199 : integer,intent(inout) :: blkflg(3,mpert,3,mpert,3,mpert) !vz_i
200 : real(dp),intent(in) :: cg(2,mpw*nspinor*mband*mkmem*nsppol),gmet(3,3)
201 : real(dp),intent(in) :: eigen0(dtset%mband*dtset%nkpt*dtset%nsppol)
202 : real(dp),intent(in) :: gprimd(3,3),k3xc(nfftf,nk3xc),kxc(nfftf,nkxc)
203 : real(dp),intent(in) :: nhat(nfftf,dtset%nspden)
204 : real(dp),intent(in) :: rhog(2,nfftf),rhor(nfftf,dtset%nspden),rprimd(3,3)
205 : real(dp),intent(in) :: ph1d(2,3*(2*mgfft+1)*natom),ph1df(2,3*(2*mgfftf+1)*natom)
206 : real(dp),intent(in) :: vtrial(nfftf,dtset%nspden),xred(3,natom)
207 : real(dp),intent(in) :: vxc(nfftf,dtset%nspden)
208 : real(dp),intent(inout) :: occ(mband*nkpt*nsppol)
209 : real(dp),intent(inout) :: d3etot(2,3,mpert,3,mpert,3,mpert) !vz_i
210 : real(dp),intent(inout) :: d3etot_1(2,3,mpert,3,mpert,3,mpert)
211 : real(dp),intent(inout) :: d3etot_2(2,3,mpert,3,mpert,3,mpert)
212 : real(dp),intent(inout) :: d3etot_3(2,3,mpert,3,mpert,3,mpert)
213 : real(dp),intent(inout) :: d3etot_4(2,3,mpert,3,mpert,3,mpert)
214 : real(dp),intent(inout) :: d3etot_5(2,3,mpert,3,mpert,3,mpert)
215 : real(dp),intent(inout) :: d3etot_6(2,3,mpert,3,mpert,3,mpert)
216 : real(dp),intent(inout) :: d3etot_7(2,3,mpert,3,mpert,3,mpert)
217 : real(dp),intent(inout) :: d3etot_8(2,3,mpert,3,mpert,3,mpert)
218 : real(dp),intent(inout) :: d3etot_9(2,3,mpert,3,mpert,3,mpert)
219 : type(pawfgrtab_type),intent(inout) :: pawfgrtab(natom*psps%usepaw)
220 : type(pawrhoij_type),intent(in) :: pawrhoij(natom*psps%usepaw)
221 : type(pawrad_type),intent(inout) :: pawrad(psps%ntypat*psps%usepaw)
222 : type(pawtab_type),intent(inout) :: pawtab(psps%ntypat*psps%usepaw)
223 : type(paw_an_type),intent(in) :: paw_an0(natom*psps%usepaw)
224 : type(paw_ij_type),intent(in) :: paw_ij0(natom*psps%usepaw)
225 :
226 : !Local variables-------------------------------
227 : !scalars
228 : integer,parameter :: level=51
229 : integer :: ask_accurate,comm_cell,counter,cplex,cplex_rhoij,formeig,flag1,flag3
230 : integer :: has_dijfr,has_diju
231 : integer :: i1dir,i1pert,i2dir,i2pert,i3dir,i3pert,iatom,idir_dkde,ierr,ii,ireadwf
232 : integer :: mcg,mpsang,n1,n2,n3,n3xccc,ndir,nfftotf,nhat1grdim,npert_phon,nspden,nspden_rhoij,nwffile
233 : integer :: option,optene,optfr,optorth,pert1case,pert2case,pert3case
234 : integer :: qphase_rhoij,rdwrpaw,second_idir,timrev,usexcnhat
235 : logical :: non_magnetic_xc
236 : real(dp) :: dummy_real,ecut_eff,el_temp
237 : character(len=500) :: message
238 : character(len=fnlen) :: fiden1i,fiwf1i,fiwf2i,fiwf3i,fiwfddk,fnamewff(5)
239 7 : type(gs_hamiltonian_type) :: gs_hamkq
240 : type(paw_energies_type) :: paw_energies_dum
241 : type(wffile_type) :: wff1,wff2,wff3,wfft1,wfft2,wfft3
242 1120 : type(wfk_t) :: ddk_f(5)
243 7 : type(wvl_data) :: wvl
244 7 : type(hdr_type) :: hdr_den
245 : !arrays
246 : integer :: file_index(5)
247 : real(dp) :: qphon(3),tsec(2)
248 7 : real(dp),allocatable :: cg1(:,:),cg2(:,:),cg3(:,:),eigen1(:),eigen2(:),eigen3(:)
249 7 : real(dp),allocatable :: nhat1_i1pert(:,:),nhat1_i2pert(:,:),nhat1_i3pert(:,:)
250 7 : real(dp),allocatable :: nhat1gr(:,:,:),vresid_dum(:,:)
251 7 : real(dp),allocatable :: rho1r1(:,:)
252 7 : real(dp),allocatable :: rho2g1(:,:),rho2r1(:,:),rho3r1(:,:),vhartr1_i2pert(:)
253 7 : real(dp),allocatable :: vpsp1(:),vxc1_i2pert(:,:),work(:)
254 7 : real(dp),allocatable,target :: vtrial1_i2pert(:,:)
255 7 : real(dp),pointer :: vtrial1_tmp(:,:)
256 7 : real(dp),allocatable :: xccc3d1(:),xccc3d2(:),xccc3d3(:)
257 7 : type(pawrhoij_type),allocatable :: pawrhoij1_i1pert(:),pawrhoij1_i2pert(:),pawrhoij1_i3pert(:)
258 7 : type(paw_an_type),allocatable :: paw_an1_i2pert(:)
259 7 : type(paw_ij_type),allocatable :: paw_ij1_i2pert(:)
260 :
261 : ! ***********************************************************************
262 :
263 : DBG_ENTER("COLL")
264 :
265 7 : call timab(503,1,tsec)
266 :
267 7 : comm_cell = mpi_enreg%comm_cell
268 :
269 7 : timrev = 1 ! as q=0
270 7 : cplex = 2 - timrev
271 7 : nspden = dtset%nspden
272 7 : ecut_eff = (dtset%ecut)*(dtset%dilatmx)**2
273 7 : mpsang = psps%mpsang
274 7 : optorth=1;if (psps%usepaw==1) optorth=0
275 :
276 7 : qphon(:)=zero
277 :
278 21 : ABI_MALLOC(cg1,(2,dtset%mpw*dtset%nspinor*mband*dtset%mk1mem*dtset%nsppol))
279 14 : ABI_MALLOC(cg2,(2,dtset%mpw*dtset%nspinor*mband*dtset%mk1mem*dtset%nsppol))
280 14 : ABI_MALLOC(cg3,(2,dtset%mpw*dtset%nspinor*mband*dtset%mk1mem*dtset%nsppol))
281 21 : ABI_MALLOC(eigen1,(2*dtset%mband*dtset%mband*dtset%nkpt*dtset%nsppol))
282 14 : ABI_MALLOC(eigen2,(2*dtset%mband*dtset%mband*dtset%nkpt*dtset%nsppol))
283 14 : ABI_MALLOC(eigen3,(2*dtset%mband*dtset%mband*dtset%nkpt*dtset%nsppol))
284 28 : ABI_MALLOC(rho1r1,(cplex*nfftf,dtset%nspden))
285 21 : ABI_MALLOC(rho2r1,(cplex*nfftf,dtset%nspden))
286 21 : ABI_MALLOC(rho2g1,(2,nfftf))
287 21 : ABI_MALLOC(rho3r1,(cplex*nfftf,dtset%nspden))
288 :
289 7 : ask_accurate=1 ; formeig = 1 ; ireadwf = 1
290 7 : n1=ngfftf(1) ; n2=ngfftf(2) ; n3=ngfftf(3)
291 7 : nfftotf=n1*n2*n3
292 :
293 : !==== Initialize most of the Hamiltonian (and derivative) ====
294 : !1) Allocate all arrays and initialize quantities that do not depend on k and spin.
295 : !2) Perform the setup needed for the non-local factors:
296 : !* Norm-conserving: Constant kleimann-Bylander energies are copied from psps to gs_hamk.
297 : !* PAW: Initialize the overlap coefficients and allocate the Dij coefficients.
298 : call gs_hamkq%init(psps,pawtab,dtset%nspinor,dtset%nsppol,dtset%nspden,natom,&
299 : & dtset%typat,xred,dtset%nfft,dtset%mgfft,dtset%ngfft,rprimd,dtset%nloalg,&
300 : & usecprj=usecprj,ph1d=ph1d,nucdipmom=dtset%nucdipmom,paw_ij=paw_ij0,&
301 7 : & gpu_option=dtset%gpu_option)
302 :
303 21 : ABI_MALLOC(vpsp1,(cplex*nfftf))
304 14 : ABI_MALLOC(xccc3d1,(cplex*nfftf))
305 14 : ABI_MALLOC(xccc3d2,(cplex*nfftf))
306 14 : ABI_MALLOC(xccc3d3,(cplex*nfftf))
307 14 : ABI_MALLOC(vhartr1_i2pert,(cplex*nfftf))
308 21 : ABI_MALLOC(vxc1_i2pert,(cplex*nfftf,dtset%nspden))
309 21 : ABI_MALLOC(vtrial1_i2pert,(cplex*nfftf,dtset%nspden))
310 :
311 7 : ABI_MALLOC(vresid_dum,(0,0))
312 : ! PAW stuff
313 7 : usexcnhat = 0
314 7 : nhat1grdim=0
315 7 : ABI_MALLOC(nhat1gr,(0,0,0))
316 : nhat1gr(:,:,:) = zero
317 7 : rdwrpaw=psps%usepaw
318 : !Allocate 1st-order PAW occupancies (rhoij1)
319 7 : if (psps%usepaw==1) then
320 : call pawrhoij_inquire_dim(cplex_rhoij=cplex_rhoij,qphase_rhoij=qphase_rhoij,nspden_rhoij=nspden_rhoij,&
321 4 : & nspden=dtset%nspden,spnorb=dtset%pawspnorb,cplex=cplex,cpxocc=dtset%pawcpxocc)
322 20 : ABI_MALLOC(pawrhoij1_i1pert,(natom))
323 16 : ABI_MALLOC(pawrhoij1_i2pert,(natom))
324 16 : ABI_MALLOC(pawrhoij1_i3pert,(natom))
325 4 : call pawrhoij_nullify(pawrhoij1_i1pert)
326 4 : call pawrhoij_nullify(pawrhoij1_i2pert)
327 4 : call pawrhoij_nullify(pawrhoij1_i3pert)
328 : call pawrhoij_alloc(pawrhoij1_i1pert,cplex_rhoij,nspden_rhoij,dtset%nspinor,dtset%nsppol,&
329 4 : & dtset%typat,qphase=qphase_rhoij,pawtab=pawtab,comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab)
330 : call pawrhoij_alloc(pawrhoij1_i2pert,cplex_rhoij,nspden_rhoij,dtset%nspinor,dtset%nsppol,&
331 4 : & dtset%typat,qphase=qphase_rhoij,pawtab=pawtab,comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab)
332 : call pawrhoij_alloc(pawrhoij1_i3pert,cplex_rhoij,nspden_rhoij,dtset%nspinor,dtset%nsppol,&
333 8 : & dtset%typat,qphase=qphase_rhoij,pawtab=pawtab,comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab)
334 : else
335 3 : ABI_MALLOC(pawrhoij1_i1pert,(0))
336 3 : ABI_MALLOC(pawrhoij1_i2pert,(0))
337 3 : ABI_MALLOC(pawrhoij1_i3pert,(0))
338 : end if
339 :
340 7 : mcg=mpw*nspinor*mband*mkmem*nsppol
341 :
342 : !Get electronic temperature from dtset
343 7 : el_temp=merge(dtset%tphysel,dtset%tsmear,dtset%tphysel>tol8.and.dtset%occopt/=3.and.dtset%occopt/=9)
344 :
345 : !Allocations/initializations for PAW only
346 7 : if(psps%usepaw==1) then
347 12 : usexcnhat=maxval(pawtab(:)%usexcnhat)
348 : ! 1st-order compensation density
349 12 : ABI_MALLOC(nhat1_i1pert,(cplex*nfftf,dtset%nspden))
350 40835 : nhat1_i1pert=zero
351 16 : ABI_MALLOC(nhat1_i2pert,(cplex*nfftf,dtset%nspden))
352 40835 : nhat1_i2pert=zero
353 12 : ABI_MALLOC(nhat1_i3pert,(cplex*nfftf,dtset%nspden))
354 40835 : nhat1_i3pert=zero
355 :
356 : ! 1st-order arrays/variables related to the PAW spheres
357 20 : ABI_MALLOC(paw_an1_i2pert,(natom))
358 20 : ABI_MALLOC(paw_ij1_i2pert,(natom))
359 4 : call paw_an_nullify(paw_an1_i2pert)
360 4 : call paw_ij_nullify(paw_ij1_i2pert)
361 :
362 4 : has_dijfr=1
363 4 : has_diju=merge(0,1,dtset%usepawu==0)
364 :
365 : call paw_an_init(paw_an1_i2pert,dtset%natom,dtset%ntypat,0,0,dtset%nspden,cplex,dtset%pawxcdev,&
366 : & dtset%typat,pawang,pawtab,has_vxc=1,&
367 4 : & comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab)
368 :
369 : call paw_ij_init(paw_ij1_i2pert,cplex,dtset%nspinor,dtset%nsppol,dtset%nspden,0,dtset%natom,&
370 : & dtset%ntypat,dtset%typat,pawtab,&
371 : & has_dij=1,has_dijhartree=1,has_dijfr=has_dijfr,has_dijU=has_diju,&
372 4 : & mpi_atmtab=mpi_enreg%my_atmtab,comm_atom=mpi_enreg%comm_atom)
373 : else
374 3 : ABI_MALLOC(nhat1_i1pert,(0,0))
375 3 : ABI_MALLOC(nhat1_i2pert,(0,0))
376 3 : ABI_MALLOC(nhat1_i3pert,(0,0))
377 3 : ABI_MALLOC(paw_an1_i2pert,(0))
378 3 : ABI_MALLOC(paw_ij1_i2pert,(0))
379 : end if ! PAW
380 :
381 7 : n3xccc=0;if(psps%n1xccc/=0)n3xccc=nfftf
382 7 : non_magnetic_xc=(dtset%usepaw==1.and.mod(abs(dtset%usepawu),10)==4)
383 :
384 : !Loop over the perturbations j1, j2, j3
385 :
386 7 : pert1case = 0 ; pert2case = 0 ; pert3case = 0
387 :
388 63 : do i1pert = 1, mpert
389 231 : do i1dir = 1, 3
390 :
391 134624 : if ((maxval(rfpert(i1dir,i1pert,:,:,:,:))==1)) then
392 :
393 33 : pert1case = i1dir + (i1pert-1)*3
394 33 : counter = pert1case
395 33 : call appdig(pert1case,dtfil%fnamewff1,fiwf1i)
396 :
397 : call inwffil(ask_accurate,cg1,dtset,dtset%ecut,ecut_eff,eigen1,dtset%exchn2n3d,&
398 : & formeig,hdr,ireadwf,dtset%istwfk,kg,dtset%kptns,dtset%localrdwf,&
399 : & dtset%mband,mcg,dtset%mk1mem,mpi_enreg,mpw,&
400 : & dtset%nband,dtset%ngfft,dtset%nkpt,npwarr,&
401 : & dtset%nsppol,dtset%nsym,&
402 : & occ,optorth,dtset%symafm,dtset%symrel,dtset%tnons,&
403 33 : & dtfil%unkg1,wff1,wfft1,dtfil%unwff1,fiwf1i,wvl)
404 :
405 33 : if (ireadwf==1) then
406 33 : call WffClose (wff1,ierr)
407 : end if
408 :
409 90 : flag1 = 0
410 283266 : rho1r1(:,:) = zero
411 33 : if (dtset%get1den /= 0 .or. dtset%ird1den /= 0) then
412 33 : call appdig(pert1case,dtfil%fildens1in,fiden1i)
413 :
414 : call read_rhor(fiden1i, cplex, dtset%nspden, nfftf, ngfftf, rdwrpaw, mpi_enreg, rho1r1, &
415 33 : hdr_den, pawrhoij1_i1pert, comm_cell, check_hdr=hdr)
416 33 : call hdr_den%free()
417 : end if
418 :
419 155553 : xccc3d1(:) = zero
420 33 : if (psps%usepaw==1 .or. psps%nc_xccc_gspace==1) then
421 24 : ndir=1
422 : call dfpt_atm2fft(atindx,cplex,gmet,gprimd,gsqcut,i1dir,i1pert,&
423 : & mgfftf,psps%mqgrid_vl,dtset%natom,ndir,nfftf,ngfftf,psps%ntypat,&
424 : & ph1df,psps%qgrid_vl,dtset%qptn,dtset%typat,ucvol,psps%usepaw,xred,psps,pawtab,&
425 24 : & atmrhor1=xccc3d1,optn_in=n3xccc/nfftf,optn2_in=1,optv_in=0,vspl=psps%vlspl)
426 : else
427 : ! Norm-conserving psp: compute Vloc(1) in reciprocal sp. and core(1) in real sp.
428 : ! ------------------------------------------------------------------------------
429 9 : if(psps%n1xccc/=0)then
430 : call dfpt_mkcore(cplex,i1dir,i1pert,dtset%natom,psps%ntypat,n1,psps%n1xccc,&
431 9 : & n2,n3,dtset%qptn,rprimd,dtset%typat,ucvol,psps%xcccrc,psps%xccc1d,xccc3d1,xred)
432 : end if ! psps%n1xccc/=0
433 : end if ! usepaw
434 :
435 297 : do i3pert = 1, mpert
436 1089 : do i3dir = 1, 3
437 :
438 26400 : if ((maxval(rfpert(i1dir,i1pert,:,:,i3dir,i3pert))==1)) then
439 :
440 83 : pert3case = i3dir + (i3pert-1)*3
441 83 : counter = 100*pert3case + pert1case
442 83 : call appdig(pert3case,dtfil%fnamewff1,fiwf3i)
443 :
444 : call inwffil(ask_accurate,cg3,dtset,dtset%ecut,ecut_eff,eigen3,dtset%exchn2n3d,&
445 : & formeig,hdr,ireadwf,dtset%istwfk,kg,dtset%kptns,dtset%localrdwf,&
446 : & dtset%mband,mcg,dtset%mk1mem,mpi_enreg,mpw,&
447 : & dtset%nband,dtset%ngfft,dtset%nkpt,npwarr,&
448 : & dtset%nsppol,dtset%nsym,&
449 : & occ,optorth,dtset%symafm,dtset%symrel,dtset%tnons,&
450 : & dtfil%unkg1,wff3,wfft3,dtfil%unwff3,&
451 83 : & fiwf3i,wvl)
452 83 : if (ireadwf==1) then
453 83 : call WffClose (wff3,ierr)
454 : end if
455 :
456 228 : flag3 = 0
457 730956 : rho3r1(:,:) = zero
458 83 : if (dtset%get1den /= 0 .or. dtset%ird1den /= 0) then
459 :
460 83 : call appdig(pert3case,dtfil%fildens1in,fiden1i)
461 :
462 : call read_rhor(fiden1i, cplex, dtset%nspden, nfftf, ngfftf, rdwrpaw, mpi_enreg, rho3r1, &
463 83 : hdr_den, pawrhoij1_i3pert, comm_cell, check_hdr=hdr)
464 83 : call hdr_den%free()
465 : end if
466 :
467 397955 : xccc3d3(:) = zero
468 83 : if (psps%usepaw==1 .or. psps%nc_xccc_gspace==1) then
469 62 : ndir=1
470 : call dfpt_atm2fft(atindx,cplex,gmet,gprimd,gsqcut,i3dir,i3pert,&
471 : & mgfftf,psps%mqgrid_vl,dtset%natom,ndir,nfftf,ngfftf,psps%ntypat,&
472 : & ph1df,psps%qgrid_vl,dtset%qptn,dtset%typat,ucvol,psps%usepaw,xred,psps,pawtab,&
473 62 : & atmrhor1=xccc3d3,optn_in=n3xccc/nfftf,optn2_in=1,optv_in=0,vspl=psps%vlspl)
474 : else
475 : ! Norm-conserving psp: compute Vloc(1) in reciprocal sp. and core(1) in real sp.
476 : ! ------------------------------------------------------------------------------
477 21 : if(psps%n1xccc/=0)then
478 : call dfpt_mkcore(cplex,i3dir,i3pert,dtset%natom,psps%ntypat,n1,psps%n1xccc,&
479 21 : & n2,n3,dtset%qptn,rprimd,dtset%typat,ucvol,psps%xcccrc,psps%xccc1d,xccc3d3,xred)
480 : end if ! psps%n1xccc/=0
481 : end if ! usepaw
482 :
483 747 : do i2pert = 1, mpert
484 2739 : do i2dir = 1, 3
485 :
486 2656 : if (rfpert(i1dir,i1pert,i2dir,i2pert,i3dir,i3pert)==1) then
487 :
488 291 : blkflg(i1dir,i1pert,i2dir,i2pert,i3dir,i3pert) = 1
489 :
490 291 : npert_phon = 0
491 291 : if(i1pert<=dtset%natom) npert_phon = npert_phon + 1
492 291 : if(i2pert<=dtset%natom) npert_phon = npert_phon + 1
493 291 : if(i3pert<=dtset%natom) npert_phon = npert_phon + 1
494 291 : if (npert_phon>1) then
495 0 : ABI_ERROR("dfptnl_loop is available with at most one phonon perturbation. Change your input!")
496 : end if
497 :
498 291 : pert2case = i2dir + (i2pert-1)*3
499 291 : counter = 100*pert2case + pert2case
500 291 : call appdig(pert2case,dtfil%fnamewff1,fiwf2i)
501 :
502 : call inwffil(ask_accurate,cg2,dtset,dtset%ecut,ecut_eff,eigen2,dtset%exchn2n3d,&
503 : & formeig,hdr,ireadwf,dtset%istwfk,kg,dtset%kptns,dtset%localrdwf,&
504 : & dtset%mband,mcg,dtset%mk1mem,mpi_enreg,mpw,&
505 : & dtset%nband,dtset%ngfft,dtset%nkpt,npwarr,&
506 : & dtset%nsppol,dtset%nsym,&
507 : & occ,optorth,dtset%symafm,dtset%symrel,dtset%tnons,&
508 : & dtfil%unkg1,wff2,wfft2,dtfil%unwff2,&
509 291 : & fiwf2i,wvl)
510 291 : if (ireadwf==1) then
511 291 : call WffClose (wff2,ierr)
512 : end if
513 :
514 : ! Read the first-order densities from disk-files
515 7423668 : rho2r1(:,:) = zero ; rho2g1(:,:) = zero
516 :
517 291 : if (dtset%get1den /= 0 .or. dtset%ird1den /= 0) then
518 :
519 291 : call appdig(pert2case,dtfil%fildens1in,fiden1i)
520 :
521 : call read_rhor(fiden1i, cplex, dtset%nspden, nfftf, ngfftf, rdwrpaw, mpi_enreg, rho2r1, &
522 291 : hdr_den, pawrhoij1_i2pert , comm_cell, check_hdr=hdr)
523 291 : call hdr_den%free()
524 :
525 : ! Compute up+down rho1(G) by fft
526 873 : ABI_MALLOC(work,(cplex*nfftf))
527 1512723 : work(:)=rho2r1(:,1)
528 291 : call fourdp(cplex,rho2g1,work,-1,mpi_enreg,nfftf,1,ngfftf,0)
529 291 : ABI_FREE(work)
530 :
531 : end if
532 :
533 3025155 : xccc3d2(:)=zero ; vpsp1(:)=zero
534 : ! PAW: compute Vloc(1) and core(1) together in reciprocal space
535 : ! --------------------------------------------------------------
536 291 : if (psps%usepaw==1 .or. psps%nc_xccc_gspace==1) then
537 246 : ndir=1
538 : call dfpt_atm2fft(atindx,cplex,gmet,gprimd,gsqcut,i2dir,i2pert,&
539 : & mgfftf,psps%mqgrid_vl,dtset%natom,ndir,nfftf,ngfftf,psps%ntypat,&
540 : & ph1df,psps%qgrid_vl,dtset%qptn,dtset%typat,ucvol,psps%usepaw,xred,psps,pawtab,&
541 246 : & atmrhor1=xccc3d2,atmvlocr1=vpsp1,optn_in=n3xccc/nfftf,optn2_in=1,vspl=psps%vlspl)
542 : ! PAW only: we sometimes have to compute 1st-order compensation density
543 : ! and eventually add it to density from 1st-order WFs
544 : ! ----------------------------------------------------------------------
545 246 : if (psps%usepaw==1) then
546 :
547 : !Force the computation of nhatfr
548 738 : do iatom=1,dtset%natom
549 492 : pawfgrtab(iatom)%nhatfr_allocated = 0
550 382848 : pawfgrtab(iatom)%nhatfr = zero
551 : end do
552 :
553 : ! This portion of code works only when npert_phon<=1
554 246 : if (i1pert<=natom.and.usexcnhat==0) then
555 : call pawnhatfr(0,i1dir,i1pert,1,dtset%natom,nspden,psps%ntypat,&
556 : & pawang,pawfgrtab(i1pert),pawrhoij(i1pert),pawtab,rprimd,&
557 120 : & mpi_atmtab=mpi_enreg%my_atmtab,comm_atom=mpi_enreg%comm_atom)
558 : end if
559 246 : if (i2pert<=natom) then
560 : call pawnhatfr(0,i2dir,i2pert,1,dtset%natom,nspden,psps%ntypat,&
561 : & pawang,pawfgrtab(i2pert),pawrhoij(i2pert),pawtab,rprimd,&
562 80 : & mpi_atmtab=mpi_enreg%my_atmtab,comm_atom=mpi_enreg%comm_atom)
563 : end if
564 246 : if (i3pert<=natom.and.usexcnhat==0) then
565 : call pawnhatfr(0,i3dir,i3pert,1,dtset%natom,nspden,psps%ntypat,&
566 : & pawang,pawfgrtab(i3pert),pawrhoij(i3pert),pawtab,rprimd,&
567 0 : & mpi_atmtab=mpi_enreg%my_atmtab,comm_atom=mpi_enreg%comm_atom)
568 : end if
569 :
570 246 : if (usexcnhat==0) then
571 :
572 : call pawmknhat(dummy_real,cplex,0,i1dir,i1pert,0,gprimd,natom,dtset%natom,&
573 : & nfftf,ngfftf,nhat1grdim,nspden,psps%ntypat,pawang,pawfgrtab,nhat1gr,nhat1_i1pert,&
574 : & pawrhoij1_i1pert,pawrhoij,pawtab,qphon,rprimd,ucvol,dtset%usewvl,xred,&
575 246 : & mpi_atmtab=mpi_enreg%my_atmtab,comm_atom=mpi_enreg%comm_atom)
576 246 : if (flag1==0) then
577 262509 : rho1r1(:,:) = rho1r1(:,:) - nhat1_i1pert(:,:)
578 : flag1 = 1
579 : end if
580 :
581 : call pawmknhat(dummy_real,cplex,0,i3dir,i3pert,0,gprimd,natom,dtset%natom,&
582 : & nfftf,ngfftf,nhat1grdim,nspden,psps%ntypat,pawang,pawfgrtab,nhat1gr,nhat1_i3pert,&
583 : & pawrhoij1_i3pert,pawrhoij,pawtab,qphon,rprimd,ucvol,dtset%usewvl,xred,&
584 246 : & mpi_atmtab=mpi_enreg%my_atmtab,comm_atom=mpi_enreg%comm_atom)
585 246 : if (flag3==0) then
586 682523 : rho3r1(:,:) = rho3r1(:,:) - nhat1_i3pert(:,:)
587 : flag3 = 1
588 : end if
589 :
590 : end if
591 :
592 : call pawmknhat(dummy_real,cplex,0,i2dir,i2pert,0,gprimd,natom,dtset%natom,&
593 : & nfftf,ngfftf,nhat1grdim,nspden,psps%ntypat,pawang,pawfgrtab,nhat1gr,nhat1_i2pert,&
594 : & pawrhoij1_i2pert,pawrhoij,pawtab,qphon,rprimd,ucvol,dtset%usewvl,xred,&
595 246 : & mpi_atmtab=mpi_enreg%my_atmtab,comm_atom=mpi_enreg%comm_atom)
596 :
597 : end if
598 :
599 : else
600 :
601 : ! Norm-conserving psp: compute Vloc(1) in reciprocal sp. and core(1) in real sp.
602 : ! ------------------------------------------------------------------------------
603 45 : if(psps%n1xccc/=0)then
604 : call dfpt_mkcore(cplex,i2dir,i2pert,dtset%natom,psps%ntypat,n1,psps%n1xccc,&
605 45 : & n2,n3,dtset%qptn,rprimd,dtset%typat,ucvol,psps%xcccrc,psps%xccc1d,xccc3d2,xred)
606 : end if ! psps%n1xccc/=0
607 :
608 : call dfpt_vlocal(atindx,cplex,gmet,gsqcut,dtset%icutcoul,i2dir,i2pert,mpi_enreg,psps%mqgrid_vl,dtset%natom,&
609 : & nattyp,nfftf,ngfftf,nkpt,psps%ntypat,n1,n2,n3,ph1df,psps%qgrid_vl,&
610 45 : & dtset%qptn,dtset%rcut,rprimd,ucvol,dtset%vcutgeo,psps%vlspl,vpsp1,xred)
611 :
612 : end if ! usepaw
613 :
614 291 : option=1;optene=0
615 : call dfpt_rhotov(cplex,dummy_real,dummy_real,dummy_real,dummy_real,dummy_real,dummy_real,&
616 : & gsqcut,dtset%icutcoul,i2dir,i2pert,dtset%ixc,kxc,dtset%magpen,dtset%mpatpol,dtset%mpdir,mpi_enreg,dtset%natom,nfftf,ngfftf,nhat,&
617 : & nhat1_i2pert,nhat1gr,nhat1grdim,nkxc,nspden,dtset%ntypat,n3xccc,non_magnetic_xc,optene,option,&
618 : & dtset%qptn,dtset%ratsm,dtset%ratsph,rhog,rho2g1,rhor,rho2r1,rprimd,dtset%typat,ucvol,psps%usepaw,&
619 : & usexcnhat,dtset%vcutgeo,vhartr1_i2pert,&
620 291 : & vpsp1,vresid_dum,dummy_real,vtrial1_i2pert,vxc,vxc1_i2pert,xccc3d2,dtset%ixcrot,xred,dtset%qgbt,dtset%use_gbt)
621 :
622 291 : if (psps%usepaw==1.and.usexcnhat==0) then
623 2782587 : rho2r1(:,:) = rho2r1(:,:) - nhat1_i2pert(:,:)
624 : end if
625 :
626 291 : if (psps%usepaw==1)then
627 246 : call paw_an_reset_flags(paw_an1_i2pert) ! Force the recomputation of on-site potentials
628 246 : call paw_ij_reset_flags(paw_ij1_i2pert,all=.true.) ! Force the recomputation of Dij
629 246 : optfr=0
630 : call pawdijfr(gprimd,i2dir,i2pert,natom,natom,nfftf,ngfftf,nspden,nsppol,&
631 : & psps%ntypat,optfr,paw_ij1_i2pert,pawang,pawfgrtab,pawrad,pawtab,cplex,qphon,&
632 : & rprimd,ucvol,vpsp1,vtrial,vxc,xred,&
633 246 : & mpi_atmtab=mpi_enreg%my_atmtab,comm_atom=mpi_enreg%comm_atom)
634 :
635 : ! Computation of "on-site" first-order potentials, first-order densities
636 : option=1
637 : call pawdenpot(dummy_real,el_temp,gprimd,i2pert,dtset%ixc,natom,dtset%natom,&
638 : & nspden,psps%ntypat,dtset%nucdipmom,0,option,paw_an1_i2pert,paw_an0,&
639 : & paw_energies_dum,paw_ij1_i2pert,pawang,dtset%pawprtvol,pawrad,&
640 : & pawrhoij1_i2pert,dtset%pawspnorb,pawtab,dtset%pawxcdev,dtset%spnorbscl,&
641 : & dtset%xclevel,dtset%xc_denpos,dtset%xc_taupos,xred,ucvol,psps%znuclpsp,dtset%spinaxis, &
642 246 : & comm_atom=mpi_enreg%comm_atom,mpi_atmtab=mpi_enreg%my_atmtab)
643 : ! First-order Dij computation
644 : ! call timab(561,1,tsec)
645 246 : if (has_dijfr>0) then
646 : !vpsp1 contribution to Dij already stored in frozen part of Dij
647 984 : ABI_MALLOC(vtrial1_tmp,(cplex*nfftf,nspden))
648 5564928 : vtrial1_tmp=vtrial1_i2pert
649 723 : do ii=1,min(nspden,2)
650 2782587 : vtrial1_tmp(:,ii)=vtrial1_tmp(:,ii)-vpsp1(:)
651 : end do
652 : else
653 0 : vtrial1_tmp => vtrial1_i2pert
654 : end if
655 : call pawdij(cplex,dtset%enunit,gprimd,i2pert,natom,dtset%natom,&
656 : & nfftf,nfftotf,dtset%nspden,psps%ntypat,paw_an1_i2pert,paw_ij1_i2pert,pawang,&
657 : & pawfgrtab,dtset%pawprtvol,pawrad,pawrhoij1_i2pert,dtset%pawspnorb,pawtab,&
658 : & dtset%pawxcdev,qphon,dtset%spnorbscl,ucvol,dtset%cellcharge(1),&
659 : & vtrial1_tmp,vxc1_i2pert,xred,dtset%znucl,&
660 : & mpi_atmtab=mpi_enreg%my_atmtab,comm_atom=mpi_enreg%comm_atom,&
661 246 : & spinaxis=dtset%spinaxis)
662 246 : if (has_dijfr>0) then
663 246 : ABI_FREE(vtrial1_tmp)
664 : end if
665 : call symdij(gprimd,indsy1,i2pert,natom,dtset%natom,nsym1,psps%ntypat,0,&
666 : & paw_ij1_i2pert,pawang1,dtset%pawprtvol,pawtab,rprimd,symaf1,symrc1, &
667 : & mpi_atmtab=mpi_enreg%my_atmtab,comm_atom=mpi_enreg%comm_atom,&
668 246 : & qphon=qphon)
669 : ! call timab(561,2,tsec)
670 :
671 : end if ! end usepaw section
672 :
673 291 : nwffile = 1
674 291 : file_index(1) = i2dir + 3*(i2pert-1)
675 291 : fnamewff(1) = dtfil%fnamewff1
676 :
677 291 : if (i2pert==natom+2) then
678 :
679 199 : nwffile = 3
680 199 : file_index(2) = i2dir+natom*3
681 199 : fnamewff(2) = dtfil%fnamewffddk
682 : ! As npert_phon<=1 and i2pert==natom+2, i1pert or i3pert is necessarly equal to natom+2
683 199 : if (i3pert==natom+2) then
684 199 : second_idir = i3dir
685 0 : else if (i1pert==natom+2) then
686 0 : second_idir = i1dir
687 : else
688 0 : ABI_BUG(" i1pert or i3pert is supposed to be equal to natom+2, which is not the case here.")
689 : end if
690 199 : call rf2_getidir(i2dir,second_idir,idir_dkde)
691 199 : file_index(3) = idir_dkde+9+(dtset%natom+6)*3
692 199 : fnamewff(3) = dtfil%fnamewffdkde
693 :
694 199 : if (npert_phon==1.and.psps%usepaw==1.and.second_idir/=i2dir) then
695 80 : nwffile = 5
696 80 : file_index(4) = second_idir+natom*3
697 80 : fnamewff(4) = dtfil%fnamewffddk
698 80 : call rf2_getidir(second_idir,i2dir,idir_dkde) ! i2dir and second_idir are reversed
699 80 : file_index(5) = idir_dkde+9+(dtset%natom+6)*3
700 80 : fnamewff(5) = dtfil%fnamewffdkde
701 : end if
702 :
703 : end if
704 :
705 1140 : do ii=1,nwffile
706 849 : call appdig(file_index(ii),fnamewff(ii),fiwfddk)
707 : ! Checking the existence of data file
708 849 : if (.not. file_exists(fiwfddk)) then
709 : ! Trick needed to run Abinit test suite in netcdf mode.
710 849 : if (file_exists(nctk_ncify(fiwfddk))) then
711 849 : write(message,"(3a)")"- File: ",trim(fiwfddk),&
712 1698 : " does not exist but found netcdf file with similar name."
713 849 : call wrtout(std_out,message,'COLL')
714 1698 : fiwfddk = nctk_ncify(fiwfddk)
715 : end if
716 849 : if (.not. file_exists(fiwfddk)) then
717 0 : ABI_ERROR('Missing file: '//TRIM(fiwfddk))
718 : end if
719 : end if
720 849 : write(message,'(2a)')'-dfptnl_loop : read the wavefunctions from file: ',trim(fiwfddk)
721 849 : call wrtout(std_out,message,'COLL')
722 849 : call wrtout(ab_out,message,'COLL')
723 : ! Note that the unit number for these files is 50,51,52 or 53 (dtfil%unddk=50)
724 1140 : call ddk_f(ii)%open_read(fiwfddk,1,dtset%iomode,dtfil%unddk+(ii-1),mpi_enreg%comm_cell)
725 : end do
726 :
727 : ! Perform DFPT part of the 3dte calculation
728 291 : call timab(513,1,tsec)
729 : ! NOTE : eigen2 equals zero here
730 :
731 : call dfptnl_pert(atindx,cg,cg1,cg2,cg3,cplex,dtfil,dtset,d3etot,eigen0,gs_hamkq,k3xc,indsy1,i1dir,&
732 : & i2dir,i3dir,i1pert,i2pert,i3pert,kg,mband,mgfft,mkmem,mk1mem,mpert,mpi_enreg,&
733 : & mpsang,mpw,natom,nattyp,nfftf,nfftotf,ngfftf,nkpt,nk3xc,nspden,nspinor,nsppol,nsym1,npwarr,occ,&
734 : & pawang,pawang1,pawfgr,pawfgrtab,pawrad,pawtab,pawrhoij,pawrhoij1_i1pert,pawrhoij1_i2pert,pawrhoij1_i3pert,&
735 : & paw_an0,paw_an1_i2pert,paw_ij1_i2pert,ph1d,psps,rho1r1,rho2r1,rho3r1,&
736 : & rprimd,symaf1,symrc1,ucvol,vtrial,vhartr1_i2pert,vtrial1_i2pert,vxc1_i2pert,&
737 : & ddk_f,xccc3d1,xccc3d2,xccc3d3,xred,&
738 291 : & d3etot_1,d3etot_2,d3etot_3,d3etot_4,d3etot_5,d3etot_6,d3etot_7,d3etot_8,d3etot_9)
739 291 : call timab(513,2,tsec)
740 :
741 :
742 : ! Eventually close the dot file
743 1140 : do ii=1,nwffile
744 1140 : call ddk_f(ii)%close()
745 : end do
746 :
747 : ! if (psps%usepaw==1) then
748 : ! do ii=1,natom
749 : ! pawfgrtab(ii)%nhatfr = zero
750 : ! end do
751 : ! end if
752 :
753 : end if ! rfpert
754 : end do ! i2dir
755 : end do ! i2pert
756 :
757 : end if ! rfpert
758 : end do ! i3dir
759 : end do ! i3pert
760 :
761 : end if ! rfpert
762 : end do ! i1dir
763 : end do ! i1pert
764 :
765 : !More memory cleaning
766 7 : call gs_hamkq%free()
767 :
768 7 : ABI_FREE(cg1)
769 7 : ABI_FREE(cg2)
770 7 : ABI_FREE(cg3)
771 7 : ABI_FREE(eigen1)
772 7 : ABI_FREE(eigen2)
773 7 : ABI_FREE(eigen3)
774 7 : ABI_FREE(rho1r1)
775 7 : ABI_FREE(rho2r1)
776 7 : ABI_FREE(rho2g1)
777 7 : ABI_FREE(rho3r1)
778 7 : ABI_FREE(nhat1gr)
779 7 : ABI_FREE(vresid_dum)
780 7 : ABI_FREE(vtrial1_i2pert)
781 7 : ABI_FREE(vxc1_i2pert)
782 7 : ABI_FREE(vhartr1_i2pert)
783 7 : ABI_FREE(vpsp1)
784 7 : ABI_FREE(xccc3d1)
785 7 : ABI_FREE(xccc3d2)
786 7 : ABI_FREE(xccc3d3)
787 7 : if (psps%usepaw==1) then
788 4 : call pawrhoij_free(pawrhoij1_i1pert)
789 4 : call pawrhoij_free(pawrhoij1_i2pert)
790 4 : call pawrhoij_free(pawrhoij1_i3pert)
791 4 : ABI_FREE(nhat1_i1pert)
792 4 : ABI_FREE(nhat1_i2pert)
793 4 : ABI_FREE(nhat1_i3pert)
794 4 : call paw_an_free(paw_an1_i2pert)
795 4 : call paw_ij_free(paw_ij1_i2pert)
796 12 : ABI_FREE(paw_an1_i2pert)
797 12 : ABI_FREE(paw_ij1_i2pert)
798 : end if
799 15 : ABI_FREE(pawrhoij1_i1pert)
800 15 : ABI_FREE(pawrhoij1_i2pert)
801 15 : ABI_FREE(pawrhoij1_i3pert)
802 :
803 7 : call timab(503,2,tsec)
804 :
805 : DBG_EXIT("COLL")
806 :
807 21 : end subroutine dfptnl_loop
808 : !!***
809 :
810 : end module m_dfptnl_loop
811 : !!***
|