Line data Source code
1 : !!****m* ABINIT/m_fock
2 : !! NAME
3 : !! m_fock
4 : !!
5 : !! FUNCTION
6 : !! This module provides the definition of
7 : !! the fock_type used to store data for the calculation of Fock exact exchange term
8 : !! and the procedures to perform this calculation.
9 : !!
10 : !! COPYRIGHT
11 : !! Copyright (C) 2012-2026 ABINIT group (CMartins,FJ,FA,MT)
12 : !! This file is distributed under the terms of the
13 : !! GNU General Public License, see ~abinit/COPYING
14 : !! or http://www.gnu.org/copyleft/gpl.txt .
15 : !!
16 : !! SOURCE
17 :
18 : #if defined HAVE_CONFIG_H
19 : #include "config.h"
20 : #endif
21 :
22 : #include "abi_common.h"
23 :
24 : module m_fock
25 :
26 : use defs_basis
27 : use m_abicore
28 : use m_errors
29 : use m_mpinfo
30 : use m_xmpi
31 : use libxc_functionals
32 : use m_pawang
33 : use m_pawtab
34 : use m_pawfgr
35 : use m_pawfgrtab
36 : use m_pawcprj
37 : use m_cgtools
38 : use m_nctk
39 : use m_dtset
40 :
41 : use defs_abitypes, only : MPI_type
42 : use m_time, only : timab
43 : use m_fstrings, only : itoa, ftoa, sjoin
44 : use m_matrix, only : mati3inv, matr3inv
45 : use m_fftcore, only : sphereboundary
46 : use m_fft, only : zerosym, fourwf
47 : use m_kg, only : ph1d3d, getph
48 : use m_kpts, only : listkk
49 : use m_barevcoul, only : barevcoul
50 :
51 : implicit none
52 :
53 : private
54 : !!***
55 :
56 : !!****t* m_fock/fock_type
57 : !! NAME
58 : !! fock_type
59 : !!
60 : !! FUNCTION
61 : !! This object stores the occupied wavefunctions and other quantities
62 : !! needed to calculate Fock exact exchange
63 : !!
64 : !! SOURCE
65 :
66 : type, public :: fock_type
67 : type(fock_common_type), pointer :: fock_common=> null()
68 : type(fock_BZ_type), pointer :: fock_BZ=> null()
69 : type(fock_ACE_type), pointer :: fockACE(:,:)=> null()
70 : end type fock_type
71 :
72 : type, public :: fock_common_type
73 :
74 : ! Integer scalars
75 : !integer :: mcgocc_bz,mkg_bz,mocc
76 : !integer :: natom,ntypat
77 :
78 : integer :: usepaw
79 : ! 0 if norm-conserving psps, 1 for PAW (not implemented)
80 :
81 : integer :: ikpt,isppol,ieigen,iband
82 : ! data relative to the current states.
83 :
84 : integer :: mband
85 : ! maximum number of bands
86 :
87 : integer :: my_nsppol
88 : ! my_nsppol=1 when nsppol=1 or nsppol=2 and only one spin is treated by the processor.
89 : ! my_nsppol=2 when nsppol=2 and no parallelization over kpt (both spins are treated by the processor).
90 :
91 : integer :: natom
92 : ! Number of atoms, input variable
93 :
94 : integer :: nsppol
95 : ! Number of independent spin polarizations, input variable
96 : ! Note that this value does not take into account the MPI distribution of the wavefunctions.
97 :
98 : integer :: ntypat
99 : ! Number of type of atoms
100 :
101 : integer :: nnsclo_hf
102 : ! Number of iterations with fixed occupied states when calculating the exact exchange contribution.
103 :
104 : integer :: ixc
105 : ! XC option (abinit input variable)
106 :
107 : integer :: use_ACE
108 : ! option to use the ACE method of Lin Lin
109 : !==0 if the normal Fock operator is to be created and/or used
110 : !==1 if the ACE operator is to be created and/or used
111 :
112 : integer :: fock_icutcoul
113 : ! contains input variable fock_icutcoul that specifies the treatment of the Coulomb interaction (cutoff in real-space,
114 : ! divergence treatment etc.)
115 :
116 : integer ABI_PRIVATE :: getghc_call_ = 1
117 : ! 1 if fock_getghc should be called in getghc, 0 otherwise
118 :
119 : ! Logical
120 : logical :: optfor
121 : ! option to calculate forces
122 :
123 : logical :: optstr
124 : ! option to calculate stresses
125 :
126 : logical :: fock_converged
127 : ! .false. if the Fock cycle (with changing Fock/ACE operator) is not converged
128 : ! .true. if the Fock cycle (with changing Fock/ACE operator) has converged
129 :
130 : logical :: scf_converged
131 : ! .false. if the SCF cycle (with fixed Fock/ACE operator) is not converged
132 : ! .true. if the SCF cycle (with fixed Fock/ACE operator) has converged
133 :
134 : ! Real(dp) scalars
135 :
136 : real(dp) :: gsqcut
137 : ! cutoff value on G**2 for sphere inside fft box.
138 : ! (gsqcut=(boxcut**2)*ecut/(2.d0*(Pi**2)). Used in hartre
139 :
140 : real(dp) :: hyb_mixing
141 : ! hybrid mixing coefficient for the Fock contribution
142 :
143 : real(dp) :: hyb_mixing_sr
144 : ! hybrid mixing coefficient for the short-range Fock contribution
145 :
146 : real(dp) :: hyb_range_dft
147 : ! hybrid range for separation, used in the DFT functional
148 : ! (should be equal to hyb_range_fock, but this is not true for HSE03)
149 :
150 : real(dp) :: hyb_range_fock
151 : ! hybrid range for separation, used in the fock contribution
152 :
153 : real(dp) :: rcut
154 : ! contains input variable rcut that specifies the cutoff radius for spherical cutoff
155 :
156 : real(dp) :: e_fock0
157 : ! contribution of the Fock term to energy (computed and stored here in case of ACE)
158 :
159 : integer, allocatable :: atindx(:)
160 : ! atindx(natom)=index table for atoms (see gstate.f)
161 :
162 : integer, allocatable :: nband(:)
163 : ! nband(nkpt)
164 : ! Number of bands for each k point
165 :
166 : integer, allocatable :: symrec(:,:,:)
167 :
168 : integer,allocatable :: typat(:)
169 : ! typat(natom)
170 : ! type of each atom
171 :
172 : ! Real(dp) arrays
173 : real(dp) :: stress(6)
174 : ! stress(6)
175 : ! contribution of the fock term to stresses
176 :
177 : real(dp), allocatable :: stress_ikpt(:,:)
178 : ! stress(6,nband)
179 : ! contribution of the fock term to stresses for the current band
180 :
181 : real(dp), allocatable :: forces_ikpt(:,:,:)
182 : ! forces(3,natom,nband))
183 : ! contribution of the fock term to forces for the current band
184 :
185 : real(dp), allocatable :: forces(:,:)
186 : ! forces(3,natom))
187 : ! contribution of the fock term to forces
188 :
189 : real(dp), allocatable :: eigen_ikpt(:)
190 : ! eigen_ikpt,(nband))
191 : ! Will contain the band index of the current state
192 : ! if the value is 0, the Fock contribution to the eigenvalue is not calculated.
193 :
194 : ! Pointers to PAW-types (associated only if usepaw==1)
195 : ! Note that these are references to already existing objects.
196 :
197 : type(pawtab_type), pointer :: pawtab(:) => null()
198 : type(pawfgr_type),pointer :: pawfgr => null()
199 : type(pawfgrtab_type),allocatable :: pawfgrtab(:)
200 :
201 : end type fock_common_type
202 :
203 : type, public :: fock_BZ_type
204 :
205 : integer :: mcprj
206 : ! dimension of cwaveocc_cprj
207 :
208 : integer :: mkpt
209 : ! maximum number of k-points for Fock treated by this node
210 :
211 : integer :: mkptband
212 : ! size of occupied states stored by this node.
213 :
214 : integer :: nkpt_bz
215 : ! Number of k-points in the BZ for Fock operator
216 :
217 : integer, allocatable :: gbound_bz(:,:,:)
218 : ! gbound_bz(2*mgfft+8,2,mkpt)
219 : ! Tables for zero-padded FFT of wavefunctions.
220 :
221 : integer, allocatable :: kg_bz(:,:)
222 : ! kg_bz(3,mpw*mkpt)
223 : ! G-vectors for each k-point in the BZ treate by this node
224 :
225 : integer, allocatable :: nbandocc_bz(:,:)
226 : ! nbandocc_bz,(mkpt,my_nsppol))
227 : ! nb of bands at each k point
228 :
229 : integer, allocatable :: npwarr(:)
230 : ! npwarr(mkpt)
231 :
232 : integer, allocatable :: istwfk_bz(:)
233 : ! istwfk_bz,(mkpt))
234 : ! storage mode of the wavefunction at each k-point
235 :
236 : integer, allocatable :: calc_phase(:)
237 : ! calc_phase,(mkpt))
238 : ! 1 if a phase factor must be considered (0 otherwise) at each k point
239 :
240 : integer, allocatable :: tab_symkpt(:)
241 : ! tab_symkpt,(mkpt))
242 : ! indices of symmetry operation to apply to get jkpt in full BZ from ikpt in IBZ
243 :
244 : integer, allocatable :: timerev(:)
245 : ! timerev,(mkpt))
246 : ! 1 if time reversal symmetry must be used (0 otherwise) at each k point
247 :
248 : integer, allocatable :: tab_ibg(:,:)
249 : ! tab_ibg,(mkpt,my_nsppol))
250 : ! indices of cprj(ikpt)/occ(ikpt) in the arrays cprj/occ for each k-point jkpt
251 :
252 : integer, allocatable :: tab_icg(:,:)
253 : ! tab_icg,(mkpt,my_nsppol))
254 : ! indices of cg(ikpt) in the arrays cg for each k-point jkpt
255 :
256 : integer, allocatable :: tab_icp(:,:)
257 : ! tab_icg,(mkpt,my_nsppol))
258 : ! indices of cprj(ikpt) in the arrays cprj for each k-point jkpt
259 :
260 : integer, allocatable :: tab_ikpt(:)
261 : ! tab_ikpt,(mkpt))
262 : ! indices of k-point ikpt in IBZ which corresponds to each k-point jkpt in full BZ
263 :
264 : real(dp), allocatable :: cgocc(:,:,:)
265 : ! cgocc(2,npw*mkptband,my_nsppol)
266 : ! wavefunction in the G-space
267 :
268 : real(dp), allocatable :: cwaveocc_bz(:,:,:,:,:,:)
269 : ! (2,n4,n5,n6,mkptband,my_nsppol))
270 : ! occupied states of each bands at each k point (used to construct Fock operator), in the real space
271 : real(dp), allocatable :: occ_bz(:,:)
272 : ! occ_bz(mkptband,my_nsppol))
273 : ! occupancy of each bands at each k point
274 :
275 : real(dp), allocatable :: wtk_bz(:)
276 : ! wtk_bz,(mkpt))
277 : ! weights assigned to each k point in the BZ
278 : ! Caution, the definition takes into account "ucvol" !
279 :
280 : real(dp), allocatable :: kptns_bz(:,:)
281 : ! kptns_bz(3,mkpt)
282 : ! k-points in full BZ
283 :
284 : real(dp), allocatable :: phase(:,:)
285 : ! phase(2,mpw*mkpt))
286 : ! phase factor the cg array will be multiplied with at each k point
287 :
288 : type(MPI_type) :: mpi_enreg
289 : type(pawang_type),pointer :: pawang
290 : type(pawcprj_type), allocatable :: cwaveocc_prj(:,:)
291 :
292 : end type fock_BZ_type
293 : !----------------------------------------------------------------------
294 :
295 : type,public :: fock_ACE_type
296 :
297 : real(dp), allocatable :: xi(:,:,:)
298 :
299 : end type fock_ACE_type
300 : !----------------------------------------------------------------------
301 :
302 : public :: fock_init ! Initialize the object.
303 : !public :: fock_from_wfk ! Initialize the object from external WFK file.
304 : public :: fock_set_ieigen ! Set the value of ieigen to the value given in argument.
305 : public :: fock_updateikpt ! Update the value of energies%e_xc and energies%e_xcdc with Fock contribution.
306 : public :: fock_destroy ! Free memory.
307 : public :: fock_ACE_destroy ! Free memory.
308 : public :: fock_common_destroy ! Free memory.
309 : public :: fock_bz_destroy ! Free memory.
310 : public :: fock_calc_ene ! Calculate the Fock contribution to the total energy.
311 : public :: fock_update_exc ! Update the value of energies%e_xc and energies%e_xcdc with Fock contribution.
312 : public :: fock_updatecwaveocc ! Update in the fock datastructure the fields relative to the occupied states.
313 : public :: fock_set_getghc_call ! Enable/disable the call to fock_getghc in getghc.
314 : public :: fock_get_getghc_call ! Return the value of the flag used to enable/disable the call to fock_getghc in getghc.
315 : public :: fock_print ! Print info on the object.
316 : !!***
317 :
318 : ! Help functions
319 : public :: bare_vqg
320 : public :: strfock
321 :
322 : contains
323 : !!***
324 :
325 : !!****f* m_fock/fockbz_create
326 : !! NAME
327 : !! fockbz_create
328 : !!
329 : !! FUNCTION
330 : !! Create a fock__BZ_type structure.
331 : !!
332 : !! INPUTS
333 : !!
334 : !! NOTES
335 : !!
336 : !! ############################
337 : !! ### Not fully tested yet ###
338 : !! ############################
339 : !!
340 : !! The current version is restricted to the case nsym=1, nspinor=1 and mkmem/=0.
341 : !!
342 : !! SOURCE
343 :
344 123 : subroutine fockbz_create(fockbz,mgfft,mpw,mkpt,mkptband,my_nsppol,n4,n5,n6,use_ACE)
345 :
346 : !Arguments ------------------------------------
347 : type(fock_BZ_type), intent(inout) :: fockbz
348 : integer, intent(in) :: mgfft,mpw,mkpt,mkptband,my_nsppol,n4,n5,n6,use_ACE
349 : ! *************************************************************************
350 :
351 : !write (std_out,*) ' fockbz_create : enter'
352 :
353 : !* Create the array %kptns_bz = the k points in full BZ
354 369 : ABI_MALLOC(fockbz%kptns_bz,(3,mkpt))
355 3047 : fockbz%kptns_bz=zero
356 : !* Create the array %jstwfk = how is stored the wavefunction at each k-point
357 : !* By default, the table is initialized to 1 (do NOT take advantage of the time-reversal symmetry)
358 369 : ABI_MALLOC(fockbz%istwfk_bz,(mkpt))
359 854 : fockbz%istwfk_bz=1
360 : !* Create the array %wtk_bz = weight assigned to each k point.
361 369 : ABI_MALLOC(fockbz%wtk_bz,(mkpt))
362 854 : fockbz%wtk_bz=zero
363 : !* Create the array %npwarr_bz = number of planewaves in basis at each k-point
364 : ! ABI_MALLOC(fockbz%npwarr_bz,(mkpt))
365 : ! fockbz%npwarr_bz=0
366 : !* Create the array %kg_bz = reduced planewave coordinates at each k-point
367 369 : ABI_MALLOC(fockbz%kg_bz,(3,mpw*mkpt))
368 576543 : fockbz%kg_bz=0
369 : !* Create the array %gbound_bz = boundary of the basis sphere of G vectors at each k-point
370 615 : ABI_MALLOC(fockbz%gbound_bz,(2*mgfft+8,2,mkpt))
371 61116 : fockbz%gbound_bz=0
372 :
373 : !* Create the array %tab_ikpt = indices of k-point ikpt in IBZ which corresponds to each k-point jkpt in full BZ
374 246 : ABI_MALLOC(fockbz%tab_ikpt,(mkpt))
375 854 : fockbz%tab_ikpt=0
376 : !* Create the array %tab_symkpt =indices of symmetry operation to apply to get jkpt in full BZ from ikpt in IBZ
377 246 : ABI_MALLOC(fockbz%tab_symkpt,(mkpt))
378 854 : fockbz%tab_symkpt=0
379 : !* Create the array %tab_ibg = indices of occ(ikpt) in the arrays cprj/occ for each k-point jkpt
380 492 : ABI_MALLOC(fockbz%tab_ibg,(mkpt,my_nsppol))
381 1031 : fockbz%tab_ibg=0
382 : !* Create the array %tab_icp = indices of cprj(ikpt) in the arrays cprj/occ for each k-point jkpt
383 369 : ABI_MALLOC(fockbz%tab_icp,(mkpt,my_nsppol))
384 1031 : fockbz%tab_icp=0
385 : !* Create the array %tab_icg = indices of cg(ikpt) in the arrays cg for each k-point jkpt
386 369 : ABI_MALLOC(fockbz%tab_icg,(mkpt,my_nsppol))
387 1031 : fockbz%tab_icg=0
388 :
389 : !* Create the array %calc_phase = 1 if a phase factor must be considered (0 otherwise) at each k point
390 246 : ABI_MALLOC(fockbz%calc_phase,(mkpt))
391 854 : fockbz%calc_phase=0
392 : !* Create the array %phase = phase factor the cg array will be multiplied with at each k point
393 369 : ABI_MALLOC(fockbz%phase,(2,mpw*mkpt))
394 432438 : fockbz%phase=zero
395 :
396 : !* Create the array %timerev i= 1 if time reversal symmetry must be used (0 otherwise) at each k point
397 246 : ABI_MALLOC(fockbz%timerev,(mkpt))
398 854 : fockbz%timerev=0
399 :
400 : !* Create the array %cwaveocc_bz = wavefunctions of each bands at each k point
401 :
402 123 : if (use_ACE==1) then
403 492 : ABI_MALLOC(fockbz%cgocc,(2,mpw*mkptband,my_nsppol))
404 2199326 : fockbz%cgocc=zero
405 : else
406 0 : ABI_MALLOC(fockbz%cwaveocc_bz,(2,n4,n5,n6,mkptband,my_nsppol))
407 0 : fockbz%cwaveocc_bz=zero
408 : end if
409 : !* Create the array %occ_bz = occupancy of each bands at each k point => will be limited to only the occupied states
410 492 : ABI_MALLOC(fockbz%occ_bz,(mkptband,my_nsppol))
411 3513 : fockbz%occ_bz=zero
412 : !* Create the array %nbandocc_bz = nb of bands at each k point
413 369 : ABI_MALLOC(fockbz%nbandocc_bz,(mkpt,my_nsppol))
414 1031 : fockbz%nbandocc_bz=0
415 :
416 246 : ABI_MALLOC(fockbz%npwarr,(mkpt))
417 854 : fockbz%npwarr=0
418 :
419 123 : end subroutine fockbz_create
420 : !!***
421 :
422 : !!****f* m_fock/fock_init
423 : !! NAME
424 : !! fock_init
425 : !!
426 : !! FUNCTION
427 : !! Init fock_t object
428 : !!
429 : !! INPUTS
430 : !! cg(2,mcg)= wavefunctions
431 : !! dtset <type(dataset_type)>= all input variables for this dataset
432 : !! gsqcut= Fourier cutoff on G^2 used to calculate charge density
433 : !! kg(3,mpw*mkmem)= reduced planewave coordinates.
434 : !! mcg= size of wave-functions array (cg) = mpw*nspinor*mband*mkmem*nsppol
435 : !! mpi_enreg=information about MPI parallelization
436 : !! npwarr_bz(nkpt)= number of planewaves in basis at this k point
437 : !! occ(mband*nkpt*nsppol)= occupation number for each band (often 2) at each k point
438 : !!
439 : !! SIDE EFFECTS
440 : !! fock <type(fock_type)>= all the quantities to calculate Fock exact exchange are initialized
441 : !!
442 : !! NOTES
443 : !!
444 : !! ############################
445 : !! ### Not fully tested yet ###
446 : !! ############################
447 : !!
448 : !! The current version is restricted to the case nsym=1, nspinor=1 and mkmem/=0.
449 : !!
450 : !! SOURCE
451 :
452 123 : subroutine fock_init(atindx,cplex,dtset,fock,gsqcut,kg,mpi_enreg,nattyp,npwarr,pawang,pawfgr,pawtab,rprimd)
453 :
454 : !Arguments ------------------------------------
455 : !scalars
456 : integer, intent(in) :: cplex
457 : real(dp),intent(in) :: gsqcut
458 : type(dataset_type),intent(in) :: dtset
459 : type(MPI_type),intent(in) :: mpi_enreg
460 : type(fock_type),intent(inout),pointer :: fock
461 : type(pawfgr_type),intent(in),target :: pawfgr
462 : type(pawang_type),intent(in),target :: pawang
463 : !arrays
464 : integer, intent(in) :: atindx(dtset%natom),nattyp(dtset%ntypat), npwarr(dtset%nkpt)
465 : integer,intent(in) :: kg(3,dtset%mpw*dtset%mkmem)
466 : real(dp), intent(in) :: rprimd(3,3)
467 : type(pawtab_type), intent(in),target :: pawtab(dtset%ntypat*dtset%usepaw)
468 : !Local variables-------------------------------
469 : !scalars
470 : integer :: iatom,ibg,icg,icp,ier,ik,ikg,ikpt,isppol,isym,itypat,jkpt,jpw,jsym,mband,mgfft,mkpt,mkptband
471 : integer :: n1,n2,n3,n4,n5,n6,nband,ncpgr,nkpt_bz,nproc_hf,npwj,timrev,use_ACE,v1,v2,v3
472 : integer :: my_jkpt,jkg_this_proc,my_nsppol,my_nspinor
473 : real(dp) :: dksqmax,arg
474 : character(len=500) :: msg
475 : !arrays
476 246 : integer :: indx(1),l_size_atm(dtset%natom),shiftg(3),symm(3,3),ident(3,3),symrec(3,3,dtset%nsym)
477 246 : real(dp) :: gmet(3,3),gprimd(3,3),tau_nons(3),phktnons(2,1),tsec(2),Rtnons(3,dtset%nsym)
478 123 : integer,allocatable :: dimcprj(:),indkk(:,:),kg_tmp(:),my_ikgtab(:),my_ibgtab(:,:),my_icgtab(:,:),my_icptab(:,:),invsym(:)
479 123 : real(dp),allocatable :: kptns_hf(:,:), phase1d(:,:)
480 : type(fock_common_type),pointer :: fockcommon
481 : type(fock_BZ_type),pointer :: fockbz
482 : ! *************************************************************************
483 :
484 : DBG_ENTER("COLL")
485 :
486 123 : call timab(1501,1,tsec)
487 123 : ABI_CHECK_IEQ(dtset%nspinor, 1, 'Hartree-Fock option can be used only with option nspinor = 1')
488 :
489 : ! =====================================
490 : ! === Define useful local variables ===
491 : ! =====================================
492 :
493 123 : nkpt_bz=dtset%nkpthf
494 123 : nproc_hf=mpi_enreg%nproc_hf
495 123 : mband=dtset%nbandhf
496 :
497 123 : n1=dtset%ngfft(1) ; n2=dtset%ngfft(2) ; n3=dtset%ngfft(3)
498 123 : n4=dtset%ngfft(4) ; n5=dtset%ngfft(5) ; n6=dtset%ngfft(6)
499 :
500 : !* Allocations
501 369 : ABI_MALLOC(kptns_hf,(3,nkpt_bz))
502 3047 : kptns_hf=zero
503 369 : ABI_MALLOC(indkk,(nkpt_bz,6))
504 5247 : indkk=0
505 369 : ABI_MALLOC(phase1d,(2,(2*n1+1)*(2*n2+1)*(2*n3+1)))
506 27690318 : phase1d=zero
507 369 : ABI_MALLOC(kg_tmp,(3*dtset%mpw))
508 :
509 : !* Initialize the array my_ikgtab = shifts in arrays kg(ikg) associated to ikpt
510 369 : ABI_MALLOC(my_ikgtab,(dtset%nkpt))
511 123 : ikg=0
512 803 : do ikpt=1,dtset%nkpt
513 680 : nband=dtset%nband(ikpt)
514 803 : if (.NOT.(proc_distrb_cycle(mpi_enreg%proc_distrb,ikpt,1,nband,-1,mpi_enreg%me_kpt))) then
515 : !* The point ikpt is treated on this processor.
516 520 : my_ikgtab(ikpt)=ikg
517 : !* The array kg is distributed, the shift ikg is incremented only on this proc.
518 520 : ikg=ikg+npwarr(ikpt)
519 : else
520 160 : my_ikgtab(ikpt)=-1
521 : !* Default value is -1.
522 : end if
523 : end do
524 :
525 : !* Initialize the array my_ibgtab = shifts in arrays occ(ibg) associated to ikpt
526 : !* Initialize the array my_icgtab = shifts in arrays cg(icg) associated to ikpt
527 492 : ABI_MALLOC(my_ibgtab,(dtset%nkpt,dtset%nsppol))
528 369 : ABI_MALLOC(my_icgtab,(dtset%nkpt,dtset%nsppol))
529 369 : ABI_MALLOC(my_icptab,(dtset%nkpt,dtset%nsppol))
530 123 : ibg=0; icg=0 ;icp=0
531 260 : do isppol=1,dtset%nsppol
532 957 : do ikpt=1,dtset%nkpt
533 697 : nband=dtset%nband(ikpt+(isppol-1)*dtset%nkpt)
534 697 : if (.NOT.(proc_distrb_cycle(mpi_enreg%proc_distrb,ikpt,1,nband,isppol,mpi_enreg%me_kpt))) then
535 : !* The states with (ikpt,isppol) are stored on this processor.
536 537 : my_icgtab(ikpt,isppol)=icg
537 537 : my_icptab(ikpt,isppol)=icp
538 : !* The array cg is distributed, the shift icg is incremented only on this proc.
539 537 : icg=icg+npwarr(ikpt)*nband
540 537 : icp=icp+nband
541 : else
542 160 : my_icgtab(ikpt,isppol)=-1
543 160 : my_icptab(ikpt,isppol)=-1
544 : !* Otherwise, the states with (ikpt,isspol) are not stored on this processor and default value is -1.
545 : end if
546 : !* The array occ is shared among the proc, the shift ibg is always incremented.
547 697 : my_ibgtab(ikpt,isppol)=ibg
548 834 : ibg=ibg+nband
549 : end do
550 : end do
551 :
552 123 : if (.not.(associated(fock))) then
553 :
554 : ! =================================
555 : ! === Create the fock structure ===
556 : ! =================================
557 123 : ABI_MALLOC(fock,)
558 123 : ABI_MALLOC(fock%fock_common,)
559 123 : ABI_MALLOC(fock%fock_BZ,)
560 : ! ========================================================
561 : ! === Set all the other state-dependent fields to zero ===
562 : ! ========================================================
563 123 : fockcommon=>fock%fock_common
564 123 : fockbz=> fock%fock_BZ
565 369 : ABI_MALLOC(fockcommon%nband,(dtset%nkpt*dtset%nsppol))
566 820 : do ikpt=1,dtset%nkpt*dtset%nsppol
567 820 : fockcommon%nband(ikpt)=dtset%nband(ikpt)
568 : end do
569 :
570 123 : nband=dtset%mband
571 123 : fockcommon%ikpt= 0
572 : !* Will contain the k-point ikpt of the current state
573 123 : fockcommon%isppol= 0
574 : !* Will contain the spin isppol of the current state
575 123 : fockcommon%ieigen=0
576 : !* Will contain the band index of the current state
577 : !* if the value is 0, the Fock contribution to the eigenvalue is not calculated.
578 369 : ABI_MALLOC(fockcommon%eigen_ikpt,(nband))
579 748 : fockcommon%eigen_ikpt=0.d0
580 : !* Will contain the Fock contributions to the eigenvalue of the current state
581 :
582 : !* Compute the dimension of arrays in "spin" w.r.t parallelism
583 123 : my_nsppol=dtset%nsppol
584 123 : if (mpi_enreg%nproc_spkpt>1) my_nsppol=1
585 : !* my_nsppol=1 when nsppol=1 or nsppol=2 and only one spin is treated by the processor.
586 : !* my_nsppol=2 when nsppol=2 and no parallelization over kpt (both spins are treated by the processor).
587 :
588 : !* Compute mkpt the size of arrays/pointers for k points w.r.t. parallelism
589 : !* Compute mkptband the size of arrays/pointers for occupied states w.r.t. parallelism
590 123 : if (nproc_hf<nkpt_bz) then
591 : !* Parallelization over kpts only
592 87 : mkpt=nkpt_bz/nproc_hf
593 87 : if (mod(nkpt_bz,nproc_hf) /=0) mkpt=mkpt+1
594 87 : mkptband=mkpt*mband
595 : else
596 : !* Parallelization over occupied states
597 36 : if (nproc_hf<nkpt_bz*mband) then
598 35 : mkptband=(nkpt_bz*mband)/nproc_hf
599 35 : if (mod((nkpt_bz*mband),nproc_hf) /=0) mkptband=mkptband+1
600 35 : mkpt=1
601 35 : if (mod(nproc_hf,nkpt_bz) /=0) mkpt=2
602 : else
603 1 : mkptband=1
604 1 : mkpt=1
605 : end if
606 : end if
607 :
608 : ! mpi_enreg settings
609 123 : call copy_mpi_enreg(mpi_enreg,fockbz%mpi_enreg)
610 123 : fockbz%mpi_enreg%me_kpt=mpi_enreg%me_hf
611 123 : fockbz%mpi_enreg%comm_kpt=mpi_enreg%comm_hf
612 123 : fockbz%mpi_enreg%nproc_spkpt=mpi_enreg%nproc_hf
613 123 : ABI_SFREE(fockbz%mpi_enreg%proc_distrb)
614 492 : ABI_MALLOC(fockbz%mpi_enreg%proc_distrb,(nkpt_bz,mband,1))
615 854 : do jkpt=1,nkpt_bz
616 3960 : fockbz%mpi_enreg%proc_distrb(jkpt,:,1)=fockbz%mpi_enreg%me_kpt
617 : end do
618 :
619 123 : mgfft=dtset%mgfft
620 123 : fockcommon%usepaw=dtset%usepaw
621 123 : if (fockcommon%usepaw==1)then
622 26 : mgfft=dtset%mgfftdg
623 26 : n4=dtset%ngfftdg(4) ; n5=dtset%ngfftdg(5) ; n6=dtset%ngfftdg(6)
624 : end if
625 123 : fockcommon%optfor=.false.; fockcommon%optstr=.false.
626 123 : if(dtset%optforces==1) fockcommon%optfor=.true.
627 123 : if (fockcommon%optfor) then
628 92 : ABI_MALLOC(fockcommon%forces_ikpt,(3,dtset%natom,nband))
629 69 : ABI_MALLOC(fockcommon%forces,(3,dtset%natom))
630 207 : fockcommon%forces=zero
631 : end if
632 123 : use_ACE=1 ! Default. Normal users do not have access to this variable, although the next line allows experts to make tests.
633 123 : if(dtset%userie==1729)use_ACE=0 ! Hidden possibility to disable ACE
634 :
635 123 : fockcommon%use_ACE=use_ACE
636 123 : call fockbz_create(fockbz,mgfft,dtset%mpw,mkpt,mkptband,my_nsppol,n4,n5,n6,use_ACE)
637 :
638 123 : fockcommon%fock_icutcoul = dtset%fock_icutcoul
639 123 : fockcommon%rcut = dtset%fock_rcut
640 :
641 : !* Initialize %mband, %mkpt, %mkptband = size of arrays
642 123 : fockcommon%mband=mband
643 123 : fockbz%mkpt=mkpt
644 123 : fockbz%mkptband=mkptband
645 123 : fockcommon%my_nsppol = my_nsppol
646 123 : fockcommon%nsppol = dtset%nsppol
647 123 : if (fockcommon%use_ACE/=0) then
648 1326 : ABI_MALLOC(fock%fockACE,(dtset%nkpt,dtset%nsppol))
649 123 : my_nspinor=max(1,dtset%nspinor/mpi_enreg%nproc_spinor)
650 260 : do isppol=1,dtset%nsppol
651 957 : do ikpt=1,dtset%nkpt
652 697 : nband=dtset%nband(ikpt+(isppol-1)*dtset%nkpt)
653 2925 : ABI_MALLOC(fock%fockACE(ikpt,isppol)%xi,(2,npwarr(ikpt)*my_nspinor,nband))
654 : end do
655 : end do
656 : end if
657 : !========Initialze PAW data========
658 123 : fockcommon%ntypat=dtset%ntypat
659 123 : fockcommon%natom=dtset%natom
660 123 : if (fockcommon%usepaw==1) then
661 26 : fockbz%mcprj=mkptband*my_nsppol
662 26 : fockcommon%pawfgr => pawfgr
663 26 : fockbz%pawang => pawang
664 26 : fockcommon%pawtab => pawtab
665 130 : ABI_MALLOC(fockcommon%pawfgrtab,(dtset%natom))
666 78 : do iatom = 1, dtset%natom
667 52 : itypat=dtset%typat(iatom)
668 78 : l_size_atm(iatom) = pawtab(itypat)%lcut_size
669 : end do
670 26 : call pawfgrtab_init(fockcommon%pawfgrtab,cplex,l_size_atm,dtset%nspden,dtset%typat)
671 26 : call pawfgrtab_nullify(fockcommon%pawfgrtab)
672 1922 : ABI_MALLOC(fockbz%cwaveocc_prj,(dtset%natom,fockbz%mcprj))
673 78 : ABI_MALLOC(dimcprj,(dtset%natom))
674 26 : call pawcprj_getdim(dimcprj,dtset%natom,nattyp,dtset%ntypat,dtset%typat,pawtab,'O')
675 26 : ncpgr = 0
676 26 : if (dtset%optforces== 1) ncpgr = 3
677 : ! if (dtset%optstress /= 0) ncpgr = 6
678 : ! ncpgr=3*dtset%optforces+6*dtset%optstress
679 26 : call pawcprj_alloc(fockbz%cwaveocc_prj,ncpgr,dimcprj)
680 26 : ABI_FREE(dimcprj)
681 52 : ABI_MALLOC(fockcommon%atindx,(dtset%natom))
682 104 : fockcommon%atindx=atindx
683 52 : ABI_MALLOC(fockcommon%typat,(dtset%natom))
684 104 : fockcommon%typat=dtset%typat
685 : end if
686 : ! ==========================================
687 : ! === Initialize the convergence options ===
688 : ! ==========================================
689 123 : write(msg,'(2a)') ch10,'Fock_init: initialization of Fock operator parameters:'
690 123 : call wrtout(std_out,msg)
691 :
692 123 : fockcommon%fock_converged=.false.
693 123 : fockcommon%scf_converged=.false.
694 :
695 : !* Number of iterations with fixed occupied states when calculating the exact exchange contribution.
696 123 : if (dtset%nnsclohf<0) then
697 0 : ABI_ERROR('The parameter nnsclohf must be a non-negative integer.')
698 : end if
699 123 : if (dtset%nnsclohf==0) then
700 116 : fockcommon%nnsclo_hf=1
701 116 : msg=' - The parameter nnsclohf is set to its default value 1.'
702 116 : call wrtout(std_out,msg)
703 : !* Default value is set to 1 (updating cgocc at each step)
704 : !* May be useful to put default to 3
705 : else
706 7 : fockcommon%nnsclo_hf=dtset%nnsclohf
707 7 : write(msg,'(a,i3)') ' - The parameter nnsclohf is set to the value:', dtset%nnsclohf
708 7 : call wrtout(std_out,msg)
709 : !* value chosen by the user
710 : end if
711 :
712 : ! =========================================
713 : ! === Initialize the hybrid coefficient ===
714 : ! =========================================
715 123 : fockcommon%ixc = dtset%ixc
716 : ! By convention, positive values are the default values for the ixc,
717 : ! while negative values have been set by the user (and stored as negative numbers)
718 123 : fockcommon%hyb_mixing=abs(dtset%hyb_mixing)
719 123 : fockcommon%hyb_mixing_sr=abs(dtset%hyb_mixing_sr)
720 123 : fockcommon%hyb_range_dft=abs(dtset%hyb_range_dft)
721 123 : fockcommon%hyb_range_fock=abs(dtset%hyb_range_fock)
722 :
723 : ! Set the hybrid parameters if functional from libxc for which parameters can be changed, or if the user asked to do so.
724 : ! Usually, these parameters were obtained from libxc,
725 : ! but the user might have possibly modified them. By the way, must define them here for the usual changeable fonctionals,
726 : ! since otherwise might inherit them from the previous dataset !
727 123 : if(dtset%ixc<0)then
728 52 : if (dtset%ixc==-406.or.dtset%ixc==-427.or.dtset%ixc==-428 .or. &
729 : & min(dtset%hyb_mixing,dtset%hyb_mixing_sr,dtset%hyb_range_dft,dtset%hyb_range_fock)<-tol8)then
730 : call libxc_functionals_set_hybridparams(hyb_mixing=fockcommon%hyb_mixing,&
731 : & hyb_mixing_sr=fockcommon%hyb_mixing_sr,&
732 48 : & hyb_range=fockcommon%hyb_range_dft)
733 : end if
734 : end if
735 :
736 :
737 : ! ======================================================
738 : ! === Initialize the data relative to Poisson solver ===
739 : ! ======================================================
740 :
741 : !* gsqcut = cutoff value on G^2 for sphere inside the fft box (input for vhartre).
742 123 : fockcommon%gsqcut= gsqcut
743 :
744 : ! =======================================================
745 : ! === Initialize the properties of the k-points in BZ ===
746 : ! =======================================================
747 : !* Initialize %nkpt_bz = nb of k point in BZ for the calculation of exchange
748 123 : fockbz%nkpt_bz=nkpt_bz
749 : !* Initialize the array %wtk_bz = weight assigned to each k point.
750 854 : fockbz%wtk_bz=1.0_dp/dble(nkpt_bz)
751 :
752 :
753 123 : if (dtset%kptopt>=1 .and. dtset%kptopt<=4) then
754 : ! ============================================
755 : ! === Initialize the set of k-points in BZ ===
756 : ! ============================================
757 3047 : kptns_hf(:,1:nkpt_bz)=dtset%kptns_hf(:,1:nkpt_bz)
758 : !* kptns_hf contains the special k points obtained by the Monkhorst & Pack method, in reduced coordinates. (output)
759 :
760 : ! =======================================================
761 : ! === Compute the transformation to go from IBZ to BZ ===
762 : ! =======================================================
763 : !* Compute the reciprocal space metric.
764 123 : call matr3inv(rprimd,gprimd)
765 4920 : gmet = MATMUL(TRANSPOSE(gprimd),gprimd)
766 :
767 : !* Calculate the array indkk which describes how to get IBZ from BZ
768 : !* dksqmax=maximal value of the norm**2 of the difference between a kpt2 vector and the closest k-point found from the kptns1 set, using symmetries. (output)
769 : !* sppoldbl=1, no spin-polarisation doubling is required.
770 123 : timrev=1 ; if (dtset%kptopt==3 .or. dtset%kptopt==4) timrev=0
771 : !* timrev=1 if the use of time-reversal is allowed ; 0 otherwise
772 123 : if (dtset%kptopt==2 .or. dtset%kptopt==3) then
773 : !* No space symmetry is used, if kptopt==2 time reversal symmetry is used.
774 0 : symm=0 ; symm(1,1)=1 ; symm(2,2)=1 ; symm(3,3)=1
775 : call listkk(dksqmax,gmet,indkk(1:nkpt_bz,:),dtset%kptns,kptns_hf,dtset%nkpt, &
776 0 : & nkpt_bz,1,1,indx,symm,timrev,xmpi_comm_self)
777 : else
778 : !* As in getkgrid, no use of antiferromagnetic symmetries thans to the option sppoldbl=1
779 : call listkk(dksqmax,gmet,indkk(1:nkpt_bz,:),dtset%kptns,kptns_hf,dtset%nkpt, &
780 123 : & nkpt_bz,dtset%nsym,1,dtset%symafm,dtset%symrel,timrev, xmpi_comm_self)
781 : end if
782 : !* indkk(nkpt_bz,6) describes the k point of IBZ that generates each k point of BZ
783 : !* indkk(:,1) = k point of IBZ, kpt_ibz
784 : !* indkk(:,2) = symmetry operation to apply to kpt_ibz to give the k point of BZ
785 : !* (if 0, means no symmetry operation, equivalent to identity )
786 : !* indkk(:,3:5) = Umklapp vectors to apply to remain in BZ
787 : !* indkk(:,6) = 1 if time-reversal was used to generate the k point of BZ, 0 otherwise
788 : !* No use of symafm to generate spin down wfs from spin up wfs for the moment
789 :
790 : else
791 0 : if (dtset%kptopt==0) then
792 : !* kptopt =0 : read directly nkpt, kpt, kptnrm and wtk in the input file
793 : !* => this case is not allowed for the moment
794 0 : ABI_ERROR('Hartree-Fock option can not be used with option kptopt=0.')
795 : else
796 : !* kptopt <0 : rely on kptbounds, and ndivk to set up a band structure calculation
797 : !* => a band structure calculation is not yet allowed.
798 0 : ABI_ERROR('Hartree-Fock option can not be used with option kptopt<0.')
799 : end if
800 : end if
801 :
802 : !! =======================================================
803 : !! === Initialize the properties of the k-points in BZ ===
804 : !! =======================================================
805 : ! jkg=0
806 : !!* Initialize the arrays %npwarr_bz, %kg_j, %phase_j, %gbound_j
807 : ! do jkpt=1,nkpt_bz
808 : ! ikpt=indkk(jkpt,1)
809 : !!* ikpt = the point of IBZ that jkpt is an image of in BZ
810 : ! npwj=npwarr(ikpt)
811 : !!* npwj = number of planewaves in basis at point jkpt = at point ikpt
812 : ! jsym=indkk(jkpt,2)
813 : !!* jsym = symmetry operation to apply to get jkpt from ikpt
814 : ! shiftg(:)=indkk(jkpt,3:5)
815 : !!* shiftg = Bravais vector G0 to add to remain in BZ
816 : ! if (jsym/=0) then
817 : ! symm(:,:)=dtset%symrel(:,:,jsym)
818 : ! tau_nons(:)=dtset%tnons(:,jsym)
819 : !!* The symmetry operation in k-space (symm) and the non-symorphic translation (tau_nons) are now defined.
820 : ! if(sum(tau_nons(:)**2)>tol8) then
821 : !!* Initialize %calc_phase(jkpt) to 1
822 : ! fock%calc_phase(jkpt)=1
823 : !!* Compute the phase factor exp(i*2*pi*G.tau) for all G.
824 : ! indx(1)=1
825 : ! phase1d=zero
826 : ! call getph(indx,1,n1,n2,n3,phase1d,tau_nons)
827 : !!* Although the routine getph is orignally written for atomic phase factors, it does precisely what we want
828 : ! arg=two_pi*(dtset%kptns(1,ikpt)*tau_nons(1) + dtset%kptns(2,ikpt)*tau_nons(2) &
829 : !& + dtset%kptns(3,ikpt)*tau_nons(3))
830 : ! phktnons(1,1)=cos(arg)
831 : ! phktnons(2,1)=sin(arg)
832 : !! phktnons(1,1)=one
833 : !! phktnons(2,1)=zero
834 : !!* Convert 1D phase factors to 3D phase factors exp(i*2*pi*(k+G).tau) and store it in %phase_j
835 : ! call ph1d3d(1,1,kg(:,1+tab_indikpt(1,ikpt):npwj+tab_indikpt(1,ikpt)),1,1,npwj,n1, &
836 : !& n2,n3,phktnons,phase1d,fock%phase(:,1+jkg:npwj+jkg))
837 : ! end if
838 : ! else
839 : ! symm=0 ; symm(1,1)=1 ; symm(2,2)=1 ; symm(3,3)=1
840 : ! tau_nons(:)=zero
841 : ! shiftg(:)=0
842 : ! end if
843 : !!* Apply time-reversal symmetry if required
844 : ! if(indkk(jkpt,6)/=0) then
845 : !!* Initialize %timerev(jkpt) to 1
846 : ! fock%timerev(jkpt)=1
847 : ! symm(:,:)=-symm(:,:)
848 : ! end if
849 :
850 : !!* Initialize %istwfk_bz(jkpt) to
851 : ! fock%istwfk_bz(jkpt)=dtset%istwfk(ikpt)
852 :
853 : !!* Initialize %tab_ikpt and %tab_ibgcg
854 : ! fock%tab_ikpt(jkpt)=ikpt
855 : ! fock%tab_ibgcg(1:dtset%nsppol,jkpt)=tab_indikpt(2:1+dtset%nsppol,ikpt)
856 : ! fock%tab_ibgcg(1+dtset%nsppol:2*dtset%nsppol,jkpt)= &
857 : !& tab_indikpt(2+dtset%nsppol:2*dtset%nsppol+1,ikpt)
858 :
859 : !!* Initialize %npwarr_bz
860 : ! fock%npwarr_bz(jkpt)=npwj
861 :
862 : !!* Initialize %kg_bz
863 : ! do jpw=1,npwj
864 : ! v1=kg(1,jpw+tab_indikpt(1,ikpt)) ; v2=kg(2,jpw+tab_indikpt(1,ikpt)) ; v3=kg(3,jpw+tab_indikpt(1,ikpt))
865 : ! fock%kg_bz(1,jpw+jkg)=-shiftg(1)+symm(1,1)*v1+symm(2,1)*v2+symm(3,1)*v3
866 : ! fock%kg_bz(2,jpw+jkg)=-shiftg(2)+symm(1,2)*v1+symm(2,2)*v2+symm(3,2)*v3
867 : ! fock%kg_bz(3,jpw+jkg)=-shiftg(3)+symm(1,3)*v1+symm(2,3)*v2+symm(3,3)*v3
868 : !!* The symmetry operation symm must be transposed when used. (cf. docs about wfconv)
869 : ! end do
870 :
871 : !!* Initialize %gbound_bz
872 : ! call sphereboundary(fock%gbound_bz(:,:,jkpt),fock%istwfk_bz(jkpt), &
873 : !& fock%kg_bz(:,1+jkg:npwj+jkg),dtset%mgfft,npwj)
874 :
875 : !!* Update of the shift to be applied
876 : ! jkg=jkg+npwj
877 : ! end do
878 :
879 : ! ==========================================================
880 : ! === Initialize the k-points in BZ and their properties ===
881 : ! ==========================================================
882 : ! jkg=0;
883 :
884 9627 : do isym=1,dtset%nsym
885 9504 : call mati3inv(dtset%symrel(:,:,isym),symrec(:,:,isym))
886 266235 : Rtnons (:,isym)= MATMUL(TRANSPOSE(symrec(:,:,isym)),dtset%tnons(:,isym))
887 : end do
888 369 : ABI_MALLOC(fockcommon%symrec,(3,3,dtset%nsym))
889 123798 : fockcommon%symrec=symrec
890 :
891 369 : ABI_MALLOC(invsym,(dtset%nsym))
892 9627 : invsym=0
893 492 : ident(1,:3)=(/1,0,0/)
894 492 : ident(2,:3)=(/0,1,0/)
895 492 : ident(3,:3)=(/0,0,1/)
896 9627 : do isym=1,dtset%nsym
897 636768 : symm(:,:)=MATMUL(dtset%symrel(:,:,isym),dtset%symrel(:,:,isym))
898 61206 : if (all(symm(:,:)==ident(:,:))) then
899 4042 : invsym(isym)=isym
900 : else
901 765542 : do jsym=1,dtset%nsym
902 50925360 : symm(:,:)=MATMUL(dtset%symrel(:,:,isym),dtset%symrel(:,:,jsym))
903 1562638 : if (all(symm(:,:)==ident(:,:))) then
904 15878 : invsym(isym)=jsym
905 15878 : cycle
906 : end if
907 : end do
908 : end if
909 9627 : if(invsym(isym)==0) then
910 0 : ABI_ERROR('No inverse has been found for isym')
911 : end if
912 : end do
913 :
914 123 : jkg_this_proc=0;my_jkpt=0
915 : !indkk(1:nkpt_bz,2)=(/1,1,3,1,11,7,9,1/)
916 854 : do jkpt=1,nkpt_bz
917 :
918 : !* If this processor does not calculate exchange with the k point jkpt, skip the rest of the k-point loop.
919 731 : if (proc_distrb_cycle(mpi_enreg%distrb_hf,jkpt,1,mband,1,mpi_enreg%me_hf)) cycle
920 : ! if (.NOT.(proc_distrb_cycle(mpi_enreg%proc_distrb,jkpt,1,dtset%nbandhf,1,mpi_enreg%me_kpt))) then
921 : !* The processor does own a copy of the array kg of ikpt ; increment the shift.
922 : ! jkg=jkg+npwj
923 : ! end if
924 : ! Skip the rest of the k-point loop
925 : ! cycle
926 : ! end if
927 731 : my_jkpt=my_jkpt+1
928 :
929 731 : ikpt=indkk(jkpt,1)
930 : !* ikpt = the point of IBZ that jkpt is an image of in BZ
931 731 : npwj=npwarr(ikpt)
932 731 : fockbz%npwarr(my_jkpt)=npwarr(ikpt)
933 : !* npwj = number of planewaves in basis at point jkpt = at point ikpt
934 731 : jsym=indkk(jkpt,2)
935 : !* jsym = symmetry operation to apply to get jkpt from ikpt
936 731 : fockbz%tab_symkpt(my_jkpt)=invsym(jsym)
937 2924 : shiftg(:)=indkk(jkpt,3:5)
938 : !* shiftg = Bravais vector G0 to add to remain in BZ
939 :
940 : !* Initialize the array %kptns_bz = the k points in full BZ
941 2924 : fockbz%kptns_bz(:,my_jkpt)=kptns_hf(:,jkpt)
942 :
943 : !* Initialize the array %jstwfk = how is stored the wavefunction at each k point
944 731 : if (dtset%istwfk(ikpt)/=1) then
945 1 : fockbz%istwfk_bz(my_jkpt)=set_istwfk(kptns_hf(:,jkpt))
946 : end if
947 :
948 : !* One can take advantage of the time-reversal symmetry in this case.
949 : !* Initialize the array %wtk_bz = weight assigned to each k point.
950 : ! fock%wtk_bz(my_jkpt)=dtset%wtk(jkpt)/ucvol
951 : !* Caution, the definition takes into account "ucvol" !
952 :
953 : !* Initialize the array %npwarr_bz = number of planewaves in basis at each k point
954 : ! fock%npwarr_bz(my_jkpt)=npwj
955 :
956 : !!* Initialize the array %tab_ikpt = indices of k-point in IBZ ikpt for each k point jkpt in BZ (here,ikpt=jkpt)
957 731 : fockbz%tab_ikpt(my_jkpt)=ikpt
958 :
959 :
960 : !!* Initialize the array %tab_ibgcg = indices of cprj(ikpt)/occ(ikpt) and cg(ikpt) for each k point jkpt
961 : ! if (my_nsppol==2) then
962 : !!* In this case, my_nsppol=dtset%nsppol=2
963 : ! fock%tab_ibgcg(1:2,my_jkpt)=tab_indikpt(2:3,ikpt)
964 : ! fock%tab_ibgcg(3:4,my_jkpt)=tab_indikpt(4:5,ikpt)
965 : ! else
966 : ! if(mpi_enreg%my_isppoltab(1)==1) then
967 : !!* In this case, my_nsppol=1 and the up spin is treated (dtset%nsppol= 1 or 2)
968 : ! fock%tab_ibgcg(1,my_jkpt)=tab_indikpt(2,ikpt)
969 : ! fock%tab_ibgcg(2,my_jkpt)=tab_indikpt(2+dtset%nsppol,ikpt)
970 : ! else
971 : !!* In this case, my_nsppol=1 and the dn spin is treated (so dtset%nsppol=2)
972 : ! fock%tab_ibgcg(1,my_jkpt)=tab_indikpt(3,ikpt)
973 : ! fock%tab_ibgcg(2,my_jkpt)=tab_indikpt(5,ikpt)
974 : ! end if
975 : ! end if
976 :
977 : !* Initialize the array %kg_bz = reduced planewave coordinates at each k point
978 731 : if (.NOT.(proc_distrb_cycle(mpi_enreg%proc_distrb,ikpt,1,mband,-1,mpi_enreg%me_kpt))) then
979 : !* We perform the test with isppol=-1 (both spins) and the occupied band (dtset%nbandhf).
980 : !* We assume that paral_kgb==0 (a k-point may not be present on several proc.)
981 : !* The array kg for ikpt is stored on this processor and copied in kg_tmp.
982 687 : ikg=my_ikgtab(ikpt)
983 : !* ikg = the shift in kg to get the G-vectors associated to ikpt
984 2748 : do ik=1,3
985 : ! kg_tmp(1+(ik-1)*npwj:ik*npwj)=kg(ik,1+tab_indikpt(1,ikpt):npwj+tab_indikpt(1,ikpt))
986 378546 : kg_tmp(1+(ik-1)*npwj:ik*npwj)=kg(ik,1+ikg:npwj+ikg)
987 : end do
988 : ! jkg=jkg+npwj
989 : end if
990 : !* Broadcast the array kg_tmp to all the processors of comm_kpt.
991 : !* Since paral_kgb==0, all the bands of a k-point are treated on the same proc.
992 731 : call xmpi_bcast(kg_tmp,mpi_enreg%proc_distrb(ikpt,1,1),mpi_enreg%comm_kpt,ier)
993 2924 : do ik=1,3
994 419666 : fockbz%kg_bz(ik,1+jkg_this_proc:npwj+jkg_this_proc)=kg_tmp(1+(ik-1)*npwj:ik*npwj)
995 : end do
996 :
997 : !* Apply a symmetry operation on kg_bz if necessary
998 731 : if (jsym/=0) then
999 9503 : symm(:,:)=dtset%symrel(:,:,jsym)
1000 : ! tau_nons(:)=dtset%tnons(:,jsym)
1001 2924 : tau_nons(:)=-Rtnons(:,invsym(jsym))
1002 : !* The symmetry operation in k-space (symm) and the non-symorphic translation (tau_nons) are now defined.
1003 2924 : if(sum(tau_nons(:)**2)>tol8) then
1004 : !* Initialize %calc_phase(jkpt) to 1
1005 193 : fockbz%calc_phase(my_jkpt)=1
1006 : !* Compute the phase factor exp(i*2*pi*G.tau) for all G.
1007 193 : indx(1)=1
1008 20042938 : phase1d=zero
1009 193 : call getph(indx,1,n1,n2,n3,phase1d,tau_nons)
1010 : !* Although the routine getph is orignally written for atomic phase factors, it does precisely what we want
1011 : arg=two_pi*(dtset%kptns(1,ikpt)*tau_nons(1) + dtset%kptns(2,ikpt)*tau_nons(2) &
1012 193 : & + dtset%kptns(3,ikpt)*tau_nons(3))
1013 193 : phktnons(1,1)=cos(arg)
1014 193 : phktnons(2,1)=sin(arg)
1015 : ! phktnons(1,1)=one
1016 : ! phktnons(2,1)=zero
1017 : !* Convert 1D phase factors to 3D phase factors exp(i*2*pi*(k+G).tau) and store it in %phase_j
1018 : call ph1d3d(1,1,fockbz%kg_bz(:,1+jkg_this_proc:npwj+jkg_this_proc),1,1,npwj,n1,n2,n3, &
1019 193 : & phktnons,phase1d,fockbz%phase(:,1+jkg_this_proc:npwj+jkg_this_proc))
1020 : end if
1021 : !* Apply time-reversal symmetry if required
1022 731 : if(indkk(jkpt,6)/=0) then
1023 : !* Initialize %timerev(jkpt) to 1
1024 0 : fockbz%timerev(my_jkpt)=1
1025 0 : symm(:,:)=-symm(:,:)
1026 : end if
1027 : !* Initialize %kg_bz
1028 139645 : do jpw=1,npwj
1029 138914 : v1=fockbz%kg_bz(1,jpw+jkg_this_proc) ; v2=fockbz%kg_bz(2,jpw+jkg_this_proc) ; v3=fockbz%kg_bz(3,jpw+jkg_this_proc)
1030 138914 : fockbz%kg_bz(1,jpw+jkg_this_proc)=-shiftg(1)+symm(1,1)*v1+symm(2,1)*v2+symm(3,1)*v3
1031 138914 : fockbz%kg_bz(2,jpw+jkg_this_proc)=-shiftg(2)+symm(1,2)*v1+symm(2,2)*v2+symm(3,2)*v3
1032 139645 : fockbz%kg_bz(3,jpw+jkg_this_proc)=-shiftg(3)+symm(1,3)*v1+symm(2,3)*v2+symm(3,3)*v3
1033 : !* The symmetry operation symm must be transposed when used. (cf. docs about wfconv)
1034 : end do
1035 : else
1036 : !* Ths symmetry operation is the identity.
1037 : !* Apply time-reversal symmetry if required
1038 0 : if(indkk(jkpt,6)/=0) then
1039 : !* Initialize %timerev(jkpt) to 1
1040 0 : fockbz%timerev(my_jkpt)=1
1041 0 : fockbz%kg_bz(ik,1+jkg_this_proc:npwj+jkg_this_proc)=-fockbz%kg_bz(ik,1+jkg_this_proc:npwj+jkg_this_proc)
1042 : end if
1043 : end if
1044 :
1045 : !* Initialize the array %gbound_bz = boundary of the basis sphere of G vectors at each k point
1046 : call sphereboundary(fockbz%gbound_bz(:,:,my_jkpt),fockbz%istwfk_bz(my_jkpt),&
1047 731 : & fockbz%kg_bz(:,1+jkg_this_proc:npwj+jkg_this_proc),mgfft,npwj)
1048 :
1049 731 : jkg_this_proc=jkg_this_proc+npwj
1050 :
1051 : !* Initialize the arrays %tab_ibg = shifts in arrays cprj and occ (ibg) for each k point jkpt
1052 : !* Initialize the arrays %tab_icg = shifts in arrays cg(icg) for each k point jkpt
1053 1585 : if (my_nsppol==1) then
1054 691 : fockbz%tab_ibg(my_jkpt,1)=my_ibgtab(ikpt,1+mpi_enreg%my_isppoltab(2))
1055 691 : fockbz%tab_icg(my_jkpt,1)=my_icgtab(ikpt,1+mpi_enreg%my_isppoltab(2))
1056 691 : fockbz%tab_icp(my_jkpt,1)=my_icptab(ikpt,1+mpi_enreg%my_isppoltab(2))
1057 : !* if mpy_isppoltab(2)=0, the up spin is treated (dtset%nsppol= 1 or 2)
1058 : !* if mpy_isppoltab(2)=1, the dn spin is treated (so dtset%nsppol=2)
1059 :
1060 : ! if(mpi_enreg%my_isppoltab(2)==1) then
1061 : !* In this case, my_nsppol=1 and the up spin is treated (dtset%nsppol= 1 or 2)
1062 : ! fock%tab_ibg(my_jkpt,1)=my_ibgtab(ikpt,1)
1063 : ! fock%tab_icg(my_jkpt,1)=my_icgtab(ikpt,1)
1064 : ! else
1065 : !* In this case, my_nsppol=1 and the dn spin is treated (so dtset%nsppol=2)
1066 : ! fock%tab_ibg(my_jkpt,1)=my_ibgtab(ikpt,2)
1067 : ! fock%tab_icg(my_jkpt,1)=my_icgtab(ikpt,2)
1068 : ! end if
1069 : else
1070 : !* In this case, my_nsppol=dtset%nsppol=2
1071 120 : fockbz%tab_ibg(my_jkpt,:)=my_ibgtab(ikpt,:)
1072 120 : fockbz%tab_icg(my_jkpt,:)=my_icgtab(ikpt,:)
1073 120 : fockbz%tab_icp(my_jkpt,:)=my_icptab(ikpt,:)
1074 : end if
1075 :
1076 : enddo
1077 :
1078 : !* Deallocation
1079 123 : ABI_FREE(invsym)
1080 :
1081 : end if
1082 123 : ABI_FREE(indkk)
1083 123 : ABI_FREE(kg_tmp)
1084 123 : ABI_FREE(kptns_hf)
1085 123 : ABI_FREE(my_ibgtab)
1086 123 : ABI_FREE(my_icgtab)
1087 123 : ABI_FREE(my_icptab)
1088 123 : ABI_FREE(my_ikgtab)
1089 123 : ABI_FREE(phase1d)
1090 123 : call fock_print(fockcommon,fockbz,unit=std_out)
1091 :
1092 123 : call timab(1501,2,tsec)
1093 :
1094 : DBG_EXIT("COLL")
1095 :
1096 123 : end subroutine fock_init
1097 : !!***
1098 :
1099 : !!****f* m_fock/fock_updateikpt
1100 : !! NAME
1101 : !! fock_updateikpt
1102 : !!
1103 : !! FUNCTION
1104 : !! Update the value of ikpt,isppol for the next exact exchange calculation.
1105 : !!
1106 : !! INPUTS
1107 : !! fock <type(fock_type)>= all the quantities to calculate Fock exact exchange
1108 : !! ikpt= k-point index
1109 : !! isppol= Spin index
1110 : !!
1111 : !! SIDE EFFECTS
1112 : !! The field fock%eigen_ikpt is also set to 0.d0.
1113 : !!
1114 : !! NOTES
1115 : !! May be improved to calculate the star of ikpt. => I think NO finally
1116 : !!
1117 : !! SOURCE
1118 :
1119 6063 : subroutine fock_updateikpt(fock,ikpt,isppol)
1120 :
1121 : !Arguments ------------------------------------
1122 : type(fock_common_type),pointer :: fock
1123 : integer, intent(in) :: ikpt,isppol
1124 : ! *************************************************************************
1125 :
1126 : !write (std_out,*) ' fock_updateikpt : enter'
1127 :
1128 : ! ======================================================
1129 : ! === Update the data relative to the current states ===
1130 : ! ======================================================
1131 : !* Copy of the value ikpt in the field ikpt
1132 6063 : fock%ikpt=ikpt
1133 : !* Copy of the value isppol in the field isppol
1134 6063 : fock%isppol=isppol
1135 : !* Set all the Fock contributions to the eigenvalues to 0.d0.
1136 35071 : fock%eigen_ikpt=zero
1137 : !* Set all the Fock contributions to the forces to 0.d0.
1138 6063 : if ((fock%optfor).and.(fock%use_ACE==0)) then
1139 0 : fock%forces_ikpt=zero
1140 : end if
1141 :
1142 6063 : end subroutine fock_updateikpt
1143 : !!***
1144 :
1145 : !!****f* m_fock/fock_set_ieigen
1146 : !! NAME
1147 : !! fock_set_ieigen
1148 : !!
1149 : !! FUNCTION
1150 : !! Set the value of ieigen to the value given in argument.
1151 : !!
1152 : !! INPUTS
1153 : !! fock <type(fock_type)>= all the quantities to calculate Fock exact exchange
1154 : !! iband= index of the band iband
1155 : !!
1156 : !! OUTPUT
1157 : !! none
1158 : !!
1159 : !! SOURCE
1160 :
1161 3149627 : subroutine fock_set_ieigen(fock,iband)
1162 :
1163 : !Arguments ------------------------------------
1164 : type(fock_common_type),pointer :: fock
1165 : integer, intent(in) :: iband
1166 : ! *************************************************************************
1167 :
1168 : !Nothing to do if fock pointer is not associated...
1169 :
1170 : ! ======================================================
1171 : ! === Update the data relative to the current states ===
1172 : ! ======================================================
1173 :
1174 : !* Copy of the value iband in the field ieigen
1175 3149627 : if (associated(fock)) then
1176 34259 : fock%ieigen=iband
1177 34259 : fock%iband=iband
1178 : end if
1179 :
1180 3149627 : end subroutine fock_set_ieigen
1181 : !!***
1182 :
1183 : !!****f* m_fock/fock_destroy
1184 : !! NAME
1185 : !! fock_destroy
1186 : !!
1187 : !! FUNCTION
1188 : !! Clean and destroy fock datastructure.
1189 : !!
1190 : !! INPUTS
1191 : !! fock <type(fock_type)>= all the quantities to calculate Fock exact exchange
1192 : !!
1193 : !! SOURCE
1194 123 : subroutine fock_destroy(fock)
1195 :
1196 : !Arguments ------------------------------------
1197 : type(fock_type),pointer :: fock
1198 : ! *************************************************************************
1199 :
1200 123 : if (fock%fock_common%use_ACE/=0) then
1201 123 : ABI_FREE(fock%fockACE)
1202 : end if
1203 123 : ABI_FREE(fock%fock_common)
1204 123 : ABI_FREE(fock%fock_BZ)
1205 123 : ABI_FREE(fock)
1206 :
1207 123 : end subroutine fock_destroy
1208 : !!***
1209 :
1210 123 : subroutine fock_common_destroy(fock)
1211 :
1212 : !Arguments ------------------------------------
1213 : type(fock_common_type),pointer :: fock
1214 : ! *************************************************************************
1215 :
1216 : DBG_ENTER("COLL")
1217 :
1218 123 : ABI_SFREE(fock%atindx)
1219 123 : ABI_SFREE(fock%typat)
1220 :
1221 : ! real arrays
1222 123 : ABI_SFREE(fock%forces)
1223 123 : ABI_SFREE(fock%nband)
1224 123 : ABI_SFREE(fock%forces_ikpt)
1225 123 : ABI_SFREE(fock%stress_ikpt)
1226 123 : ABI_SFREE(fock%eigen_ikpt)
1227 :
1228 : ! Deallocate datatypes
1229 123 : if (allocated(fock%pawfgrtab)) then
1230 26 : call pawfgrtab_free(fock%pawfgrtab)
1231 78 : ABI_FREE(fock%pawfgrtab)
1232 : end if
1233 :
1234 : ! Put the integer to 0
1235 123 : fock%ieigen=0
1236 123 : fock%ikpt=0
1237 123 : fock%isppol=0
1238 :
1239 123 : ABI_SFREE(fock%symrec)
1240 :
1241 : !* [description of divergence in |q+G|=0]
1242 : !* Put the real (dp) to 0
1243 123 : fock%gsqcut=zero
1244 123 : fock%hyb_mixing=zero
1245 123 : fock%hyb_mixing_sr=zero
1246 123 : fock%hyb_range_dft=zero
1247 123 : fock%hyb_range_fock=zero
1248 :
1249 : DBG_EXIT("COLL")
1250 :
1251 123 : end subroutine fock_common_destroy
1252 : !!***
1253 :
1254 123 : subroutine fock_BZ_destroy(fock)
1255 :
1256 : !Arguments ------------------------------------
1257 : type(fock_BZ_type),pointer :: fock
1258 : ! *************************************************************************
1259 :
1260 : DBG_ENTER("COLL")
1261 :
1262 123 : ABI_SFREE(fock%cwaveocc_bz)
1263 123 : ABI_SFREE(fock%cgocc)
1264 123 : ABI_SFREE(fock%npwarr)
1265 123 : ABI_SFREE(fock%occ_bz)
1266 123 : if (allocated(fock%cwaveocc_prj)) then
1267 26 : call pawcprj_free(fock%cwaveocc_prj)
1268 1238 : ABI_FREE(fock%cwaveocc_prj)
1269 : end if
1270 : ! Deallocate integer arrays
1271 :
1272 123 : ABI_SFREE(fock%kg_bz)
1273 123 : ABI_SFREE(fock%nbandocc_bz)
1274 123 : ABI_SFREE(fock%istwfk_bz)
1275 123 : ABI_SFREE(fock%calc_phase)
1276 123 : ABI_SFREE(fock%timerev)
1277 123 : ABI_SFREE(fock%tab_ibg)
1278 123 : ABI_SFREE(fock%tab_icg)
1279 123 : ABI_SFREE(fock%tab_icp)
1280 123 : ABI_SFREE(fock%tab_ikpt)
1281 123 : ABI_SFREE(fock%tab_symkpt)
1282 :
1283 : !* [description of IBZ and BZ]
1284 : !* Deallocate real arrays
1285 123 : ABI_SFREE(fock%wtk_bz)
1286 123 : ABI_SFREE(fock%kptns_bz)
1287 123 : ABI_SFREE(fock%phase)
1288 : !* Put the integer to 0
1289 123 : fock%nkpt_bz=0
1290 :
1291 : !* Deallocate real arrays
1292 :
1293 : !* Deallocate integer arrays
1294 123 : ABI_SFREE(fock%gbound_bz)
1295 :
1296 : !* [description of size of arrays/pointers]
1297 : !* Put the integer to 0
1298 123 : fock%mkpt=0
1299 123 : fock%mkptband=0
1300 123 : call destroy_mpi_enreg(fock%mpi_enreg)
1301 :
1302 : DBG_EXIT("COLL")
1303 :
1304 123 : end subroutine fock_BZ_destroy
1305 : !!***
1306 :
1307 : !!****f* m_fock/fock_ACE_destroy
1308 : !! NAME
1309 : !! fock_ACE_destroy
1310 : !!
1311 : !! FUNCTION
1312 : !! Clean and destroy fock datastructure.
1313 : !!
1314 : !! INPUTS
1315 : !! fockACE <type(fock_ACE_type)>= all the quantities to calculate Fock exact exchange in the ACE context
1316 : !!
1317 : !! SOURCE
1318 :
1319 123 : subroutine fock_ACE_destroy(fockACE)
1320 :
1321 : !Arguments ------------------------------------
1322 : type(fock_ACE_type),pointer :: fockACE(:,:)
1323 :
1324 : !Local variables-------------------------------
1325 : integer :: dim1,dim2,ii,jj
1326 : ! *************************************************************************
1327 :
1328 : DBG_ENTER("COLL")
1329 :
1330 123 : dim1=size(fockACE,1)
1331 123 : dim2=size(fockACE,2)
1332 260 : do jj=1,dim2
1333 957 : do ii=1,dim1
1334 834 : if (allocated(fockACE(ii,jj)%xi)) then
1335 697 : ABI_FREE(fockACE(ii,jj)%xi)
1336 : end if
1337 : end do
1338 : end do
1339 : DBG_EXIT("COLL")
1340 :
1341 123 : end subroutine fock_ACE_destroy
1342 : !!***
1343 :
1344 :
1345 : !!****f* m_fock/fock_calc_ene
1346 : !! NAME
1347 : !! fock_calc_ene
1348 : !!
1349 : !! FUNCTION
1350 : !! Calculate the Fock contribution to the total energy
1351 : !!
1352 : !! INPUTS
1353 : !! fock <type(fock_type)>= all the quantities to calculate Fock exact exchange
1354 : !! ikpt= reduced planewave coordinates.
1355 : !!
1356 : !! OUTPUT
1357 : !! none
1358 : !!
1359 : !! SIDE EFFECTS
1360 : !! energies <type(energies_type)>=storage for energies computed here :
1361 : !! | e_exactX = Fock contribution to the total energy (Hartree)
1362 : !!
1363 : !! NOTES
1364 : !! If the cgocc_bz are not updated at each iteration, be careful to calculate Fock energy at the same frequency.
1365 : !! TO CHECK == CHANGE IN SOME DEFINTIONS
1366 : !!
1367 : !! SOURCE
1368 :
1369 0 : subroutine fock_calc_ene(dtset,fock,fock_energy,ikpt,nband,occ)
1370 :
1371 : !Arguments ------------------------------------
1372 : !scalars
1373 : integer,intent(in) :: ikpt,nband
1374 : real(dp),intent(inout) :: fock_energy
1375 : type(dataset_type),intent(in) :: dtset
1376 : type(fock_common_type),pointer :: fock
1377 : !arrays
1378 : real(dp),intent(in) :: occ(nband)
1379 :
1380 : !Local variables-------------------------------
1381 : integer :: iband
1382 : ! *************************************************************************
1383 :
1384 : ABI_UNUSED(fock_energy)
1385 :
1386 0 : do iband=1,nband
1387 :
1388 : ! Select only the occupied states (such that fock%occ_bz > 10^-8)
1389 0 : if (abs(occ(iband))>tol8) then
1390 : ! fock_energy=fock_energy + half*fock%eigen_ikpt(iband)*occ(iband)*dtset%wtk(ikpt)
1391 : !* Sum the contribution of each occupied states at point k_i
1392 : !* No need to multiply %wtk by ucvol since there is no factor 1/ucvol in the definition of %wtk
1393 :
1394 : !* accumulate Fock contributions to the forces.
1395 : ! if (fock%optfor) then
1396 0 : fock%forces(:,:)=fock%forces(:,:)+occ(iband)*dtset%wtk(ikpt)*fock%forces_ikpt(:,:,iband)
1397 : ! end if
1398 : end if
1399 : end do
1400 :
1401 0 : end subroutine fock_calc_ene
1402 : !!***
1403 :
1404 : !!****f* m_fock/fock_update_exc
1405 : !! NAME
1406 : !! fock_update_exc
1407 : !!
1408 : !! FUNCTION
1409 : !! Update the value of energies%e_xc and energies%e_xcdc with Fock contribution
1410 : !!
1411 : !! INPUTS
1412 : !!
1413 : !! OUTPUT
1414 : !! none
1415 : !!
1416 : !! energies <type(energies_type)>=storage for energies computed here :
1417 : !! | e_fock= Fock contribution to the total energy (Hartree)
1418 : !!
1419 : !! NOTES
1420 : !! If the cgocc_bz are not updated at each iteration, be careful to calculate Fock energy at the same frequency.
1421 : !!
1422 : !! SOURCE
1423 :
1424 0 : subroutine fock_update_exc(fock_energy,xc_energy,xcdc_energy)
1425 :
1426 : !Arguments ------------------------------------
1427 : real(dp),intent(in) :: fock_energy
1428 : real(dp),intent(inout) :: xc_energy,xcdc_energy
1429 : ! *************************************************************************
1430 :
1431 : !xc_energy = fock%hyb_mixing*fock_energy
1432 : !xcdc_energy = two*fock%hyb_mixing*fock_energy
1433 0 : xc_energy = fock_energy
1434 0 : xcdc_energy = two*fock_energy
1435 : !CMartins : For an atom, ewald should be set to zero (at the beginning of the loop) and
1436 : !the contribution in !|q+G|=0 should be an approximation to the missing component of Vloc in G=0
1437 : !energies%e_ewald=energies%e_ewald-half*fock%divgq0*fock%wtk_bz(1)*piinv
1438 :
1439 0 : end subroutine fock_update_exc
1440 : !!***
1441 :
1442 : !----------------------------------------------------------------------
1443 :
1444 : !!****f* m_fock/fock_updatecwaveocc
1445 : !! NAME
1446 : !! fock_updatecwaveocc
1447 : !!
1448 : !! FUNCTION
1449 : !! Update in the fock datastructure the fields relative to the occupied states.
1450 : !!
1451 : !! INPUTS
1452 : !! cg(2,mcg)= Input wavefunctions
1453 : !! cprj(natom,mcprj) <type(pawcprj_type)>= projected input wave functions <Proj_i|Cnk> with NL projectors
1454 : !! dtset <type(dataset_type)>=all input variables for this dataset
1455 : !! fock <type(fock_type)>= all the quantities to calculate Fock exact exchange
1456 : !! indsym(4,nsym,natom) :: 1:3 shift, and 4 final atom, of symmetry isym operating on iatom
1457 : !! (S^{-1}(R - t) = r0 + L, see symatm.F90
1458 : !! mcg=size of wave-functions array (cg) =mpw*nspinor*mband*mkmem*nsppol
1459 : !! mcprj=size of projected wave-functions array (cprj) =nspinor*mband*mkmem*nsppol
1460 : !! mpi_enreg=information about MPI parallelization
1461 : !! npwarr(nkpt)=number of planewaves in basis at this k point
1462 : !! occ(mband*nkpt*nsppol)= occupation number for each band (often 2) at each k point
1463 : !! ucvol= unit cell volume ($\textrm{bohr}^{3}$)
1464 : !!
1465 : !! OUTPUT
1466 : !!
1467 : !! SIDE EFFECTS
1468 : !! The field fock%cgocc_bz contains the table cg at the end.
1469 : !! The fields kg_bz, occ_bz and fock%cwaveocc_prj are simultaneously updated.
1470 : !!
1471 : !! NOTES
1472 : !!
1473 : !! ############################
1474 : !! ### Not fully tested yet ###
1475 : !! ############################
1476 : !!
1477 : !! May be improved by selecting only the occupied states with the same spin isppol.
1478 : !!
1479 : !! SOURCE
1480 :
1481 1238 : subroutine fock_updatecwaveocc(cg,cprj,dtset,fock,indsym,mcg,mcprj,&
1482 1238 : mpi_enreg,nattyp,npwarr,occ,ucvol)
1483 :
1484 : !scalars
1485 : integer, intent(in) :: mcg,mcprj
1486 : real(dp), intent(in) :: ucvol
1487 : type(dataset_type),intent(in) :: dtset
1488 : type(fock_type),intent(inout),pointer :: fock
1489 : type(MPI_type),intent(in) :: mpi_enreg
1490 : !arrays
1491 : integer, intent(in) :: indsym(4,dtset%nsym,dtset%natom),nattyp(dtset%ntypat),npwarr(dtset%nkpt)
1492 : real(dp),intent(in) :: cg(2,mcg),occ(dtset%mband*dtset%nkpt*dtset%nsppol)
1493 : type(pawcprj_type),intent(in) :: cprj(dtset%natom,mcprj)
1494 :
1495 : !Local variables-------------------------------
1496 : !scalars
1497 : integer,parameter :: tim_fourwf0=0
1498 : integer :: iatm,iatom,iband,iband0,iband_cprj,ibg,icg,icp,ier,ikpt,ilmn,isize,ispinor,isppol,itypat,jbg,jcg,jkg,jkpt,jpw,jstwfk!,ii1,ii2
1499 : integer :: lmnmax,mband,mband0,mgfft,mkpt,mpw,my_jsppol,my_jband,my_jkpt
1500 : integer :: nband,ncpgr,n4,n5,n6,nkpt_bz,npwj,nsppol,nspinor
1501 : real(dp),parameter :: weight1=one
1502 : real(dp) :: cgre,cgim,invucvol
1503 : character(len=500) :: message
1504 : ! arrays
1505 : integer :: ngfft(18)
1506 1238 : integer, contiguous, pointer :: gbound_k(:,:),kg_k(:,:)
1507 1238 : integer,allocatable :: dimlmn(:),indlmn(:,:,:),indsym_(:,:,:),typat_srt(:)
1508 : real(dp) :: tsec(2),tsec2(2),dcp(3)
1509 1238 : real(dp),allocatable :: cgocc_tmp(:),cgocc(:,:),dummytab2(:,:),dummytab3(:,:,:),phase_jkpt(:,:)
1510 1238 : type(pawcprj_type),allocatable :: cprj_tmp(:,:)
1511 : type(fock_common_type),pointer :: fockcommon
1512 : type(fock_BZ_type),pointer :: fockbz
1513 : ! *************************************************************************
1514 :
1515 1238 : call timab(1502,1,tsec)
1516 :
1517 1238 : ABI_CHECK(associated(fock),"fock must be associated")
1518 :
1519 1238 : if (associated(fock)) then
1520 :
1521 1238 : fockcommon=>fock%fock_common
1522 1238 : fockbz=> fock%fock_BZ
1523 :
1524 1238 : invucvol=1.d0/sqrt(ucvol)
1525 : ! Local variables = useful dimensions
1526 1238 : mband=fockcommon%mband
1527 1238 : mkpt=fockbz%mkpt
1528 1238 : mpw=dtset%mpw
1529 1238 : mgfft=dtset%mgfft
1530 23522 : ngfft=dtset%ngfft
1531 1238 : nkpt_bz=fockbz%nkpt_bz
1532 1238 : nsppol=dtset%nsppol
1533 1238 : nspinor=1
1534 1238 : ncpgr=0
1535 :
1536 : ! Local variables : useful arrays
1537 3714 : ABI_MALLOC(cgocc,(2,mpw))
1538 1466249 : cgocc=zero
1539 3714 : ABI_MALLOC(cgocc_tmp,(2*mpw+1))
1540 979150 : cgocc_tmp=zero
1541 1238 : if (fockcommon%usepaw==1) then
1542 204 : mgfft=dtset%mgfftdg
1543 3876 : ngfft=dtset%ngfftdg
1544 1224 : ABI_MALLOC(cprj_tmp,(dtset%natom,nspinor))
1545 612 : ABI_MALLOC(dimlmn,(dtset%natom))
1546 204 : call pawcprj_getdim(dimlmn,dtset%natom,nattyp,dtset%ntypat,dtset%typat,fockcommon%pawtab,"O")
1547 : ncpgr = 0
1548 204 : if (dtset%optforces== 1) ncpgr = 3
1549 : ! if (dtset%optstress /= 0) ncpgr = 6
1550 204 : call pawcprj_alloc(cprj_tmp,ncpgr,dimlmn)
1551 :
1552 504 : lmnmax=maxval(fockcommon%pawtab(:)%lmn_size)
1553 816 : ABI_MALLOC(indlmn,(6,lmnmax,dtset%ntypat))
1554 504 : do itypat=1,dtset%ntypat
1555 300 : isize=size(fockcommon%pawtab(itypat)%indlmn,2)
1556 13272 : indlmn(:,1:isize,itypat)=fockcommon%pawtab(itypat)%indlmn(:,1:isize)
1557 : end do
1558 816 : ABI_MALLOC(indsym_,(4,dtset%nsym,dtset%natom))
1559 408 : ABI_MALLOC(typat_srt,(dtset%natom))
1560 :
1561 204 : if (dtset%nsym==1) then
1562 0 : indsym_=0
1563 0 : do iatom=1,dtset%natom
1564 0 : iatm=fockcommon%atindx(iatom)
1565 0 : typat_srt(iatm)=dtset%typat(iatom)
1566 0 : indsym_(4,:,iatom)=iatom
1567 : end do
1568 : else
1569 612 : do iatom=1,dtset%natom
1570 408 : iatm=fockcommon%atindx(iatom)
1571 408 : typat_srt(iatm)=dtset%typat(iatom)
1572 35000 : indsym_(1:3,:,iatm)=indsym(1:3,:,iatom)
1573 9260 : indsym_(4,:,iatm)=fockcommon%atindx(indsym(4,:,iatom))
1574 : end do
1575 : end if
1576 : end if
1577 :
1578 : ! Local variables to perform FFT
1579 1238 : n4=ngfft(4) ; n5=ngfft(5) ; n6=ngfft(6)
1580 6190 : ABI_MALLOC(dummytab3,(n4,n5,n6))
1581 :
1582 :
1583 4772 : if(ANY(fockbz%calc_phase(:)/=0)) then
1584 518 : ABI_MALLOC(phase_jkpt,(2,mpw))
1585 205240 : phase_jkpt=zero
1586 : end if
1587 :
1588 :
1589 : ! =======================================================
1590 : ! === Update the data relative to the occupied states ===
1591 : ! =======================================================
1592 : !* The arrays cgocc_bz, kg_bz, occ_bz and npwarr_bz are already allocated with the maximal size.
1593 : ! if ((dtset%kptopt>=1).and.(dtset%kptopt<=4)) then
1594 : ! if (dtset%kptopt/=3) then
1595 :
1596 2611 : do isppol=1,nsppol
1597 1373 : jbg=0 ; jcg=0 ; jkg=0 ; icp=0
1598 1373 : my_jsppol=isppol
1599 1373 : if ((isppol==2).and.(mpi_enreg%nproc_spkpt/=1)) my_jsppol=1
1600 : !* Both spins are treated on the same proc., only in the case where nproc_spkpt=1;
1601 : !* otherwise each proc. treats only one spin.
1602 :
1603 : ! MG: This loop is not effient!
1604 : ! Ok the number of k-points in the BZ is usually `small` when hybrids are used
1605 : ! but what happens if we use a 12x12x12.
1606 : ! One should loop over the IBZ, broadcast and reconstruct the star of the k-point.
1607 1373 : my_jkpt=0
1608 9068 : do jkpt=1,nkpt_bz
1609 :
1610 6457 : if (proc_distrb_cycle(mpi_enreg%distrb_hf,jkpt,1,mband,1,mpi_enreg%me_hf)) cycle
1611 :
1612 : !* In this case, the processor does not calculate the exchange with any occupied state on jkpt.
1613 :
1614 : ! if (.NOT.(proc_distrb_cycle(mpi_enreg%proc_distrb,jkpt,1,dtset%nbandhf,jsppol,mpi_enreg%me_kpt))) then
1615 : !* The state (jkpt,jband,jsppol) is stored in the array cg of this processor and copied in cgocc_tmp.
1616 : ! icg=icg+dtset%nband(jkpt)*npwj
1617 : ! end if
1618 : ! ibg=ibg+dtset%nband(jkpt)
1619 : ! cycle
1620 : ! end if
1621 6457 : my_jkpt=my_jkpt+1
1622 :
1623 6457 : ikpt=fockbz%tab_ikpt(my_jkpt)
1624 :
1625 : !* ikpt = the point of IBZ that jkpt is an image of in BZ
1626 6457 : npwj=npwarr(ikpt)
1627 : !* npwj= number of plane wave in basis for the wavefunction
1628 6457 : jstwfk=fockbz%istwfk_bz(my_jkpt)
1629 : !* jstwfk= how is stored the wavefunction
1630 6457 : ibg=fockbz%tab_ibg(my_jkpt,my_jsppol)
1631 : !* ibg = shift to be applied on the location of data in the array occ
1632 6457 : icg=fockbz%tab_icg(my_jkpt,my_jsppol)
1633 : !* icg = shift to be applied on the location of data in the array cg
1634 6457 : icp=fockbz%tab_icp(my_jkpt,my_jsppol)
1635 : !* icp = shift to be applied on the location of data in the array cprj
1636 6457 : gbound_k => fockbz%gbound_bz(:,:,my_jkpt)
1637 : !* boundary of the basis sphere of G vectors
1638 6457 : kg_k => fockbz%kg_bz(:,1+jkg:npwj+jkg)
1639 : !* reduced plean wave coordinates
1640 6457 : if (fockbz%calc_phase(my_jkpt)==1) then
1641 737484 : phase_jkpt(:,1:npwj)=fockbz%phase(:,1+jkg:npwj+jkg)
1642 : end if
1643 : !* phase factor at k-point j
1644 :
1645 : !* Initialize the band counter
1646 6457 : my_jband=0
1647 : !FBru: Here run over all the nbandhf bands instead of just the truly occupied states
1648 : ! this is a very tiny waste, but solves parallelization issues
1649 33837 : do iband=1,dtset%nbandhf
1650 :
1651 :
1652 12867116 : cgocc_tmp=zero
1653 27380 : if (fockcommon%usepaw==1) then
1654 2470 : call pawcprj_set_zero(cprj_tmp)
1655 : end if
1656 :
1657 : !* To avoid segmentation fault, my_jband should not be greater than nbandhf
1658 : !FBru: this error should never happen in practice since we now limit the loop to nbandhf
1659 27380 : if ((my_jband+1)>mband) then
1660 0 : write(message,*) 'The number of occupied band',my_jband+1,' at k-point',&
1661 0 : & ikpt,' is greater than the value of nbandhf ', mband
1662 0 : ABI_ERROR(message)
1663 : end if
1664 :
1665 : !* If the processor does not calculate the exchange with the occupied state (jkpt,my_jband), cycle
1666 : ! if (mpi_enreg%distrb_hf(jkpt,(my_jband+1),1)/=mpi_enreg%me_hf) cycle
1667 27380 : if (mpi_enreg%distrb_hf(jkpt,iband,1)/=mpi_enreg%me_hf) cycle
1668 : ! if (mpi_enreg%proc_distrb(jkpt,jband,jsppol)==mpi_enreg%me_kpt) then
1669 : !* The state (jkpt,jband,jsppol) is stored in the array cg of this processor ; shift are incremented.
1670 : ! icg=icg+npwj
1671 : ! end if
1672 : ! ibg=ibg+1
1673 : !* Skip the end of the loop
1674 : ! cycle
1675 : ! end if
1676 :
1677 : !* increment the number of occupied bands treated on this processor
1678 27380 : my_jband = my_jband+1
1679 :
1680 : !* In this case, the processor calculates the exchange with the occupied state (jkpt,my_jband).
1681 27380 : if (mpi_enreg%proc_distrb(ikpt,iband,isppol)==mpi_enreg%me_kpt) then
1682 : !* The state (ikpt,iband,isppol) is stored in the array cg of this processor and copied in cgocc_tmp.
1683 23444 : if(icg==-1) then
1684 0 : write(100,*) 'icg=-1',mpi_enreg%me,isppol,my_jsppol,jkpt,my_jkpt,ikpt,iband
1685 : end if
1686 : ! MG: Why packing re and im part?
1687 23444 : cgocc_tmp(1)=occ(iband+ibg)
1688 4988621 : cgocc_tmp(2:npwj+1)=cg(1,1+(iband-1)*npwj+icg:iband*npwj+icg)
1689 4988621 : cgocc_tmp(npwj+2:2*npwj+1)=cg(2,1+(iband-1)*npwj+icg:iband*npwj+icg)
1690 23444 : if (fockcommon%usepaw==1) then
1691 2470 : call pawcprj_copy(cprj(:,icp+iband:icp+iband+nspinor-1),cprj_tmp)
1692 : end if
1693 : end if
1694 :
1695 : !* Broadcast the state (ikpt,iband,isppol) to all the processors of comm_kpt for cgocc
1696 27380 : call timab(1503,1,tsec2)
1697 27380 : call xmpi_bcast(cgocc_tmp,mpi_enreg%proc_distrb(ikpt,iband,isppol),mpi_enreg%comm_kpt,ier)
1698 :
1699 : !* Broadcast the state (ikpt,iband,isppol) to all the processors of comm_kpt for cprj
1700 27380 : if (fockcommon%usepaw==1) then
1701 : call pawcprj_bcast(cprj_tmp,dtset%natom,nspinor,dimlmn,ncpgr,mpi_enreg%proc_distrb(ikpt,iband,isppol),&
1702 2470 : & mpi_enreg%comm_kpt,ier)
1703 : end if
1704 27380 : call timab(1503,2,tsec2)
1705 : !* Keep the processors in %comm_kpt which needs the values in cgocc_tmp to build their own %cwaveocc and %occ_bz.
1706 27380 : if ((mpi_enreg%nproc_spkpt/=1).and.(nsppol==2)) then
1707 0 : if (fockbz%timerev(my_jkpt)==mpi_enreg%my_isppoltab(isppol)) cycle
1708 : !* In the case of a parallel spin-polarized calculation
1709 : !* when time reversal symmetry is applied at this k-point (timrev==1), only the processors with the opposite spin (my_isppoltab==0) are kept.
1710 : !* when time reversal symmetry is not applied at this k-point (timrev==0), only the processors with the same spin (my_isppoltab==1) are kept.
1711 :
1712 : ! if (fock%timerev(my_jkpt)==1)) then
1713 : ! if (mpi_enreg%my_isppoltab(isppol)==1) cycle
1714 : !* In the case of a parallel spin-polarized calculation and when time reversal symmetry is applied at this k-point,
1715 : !* only the processors with the opposite spin are kept.
1716 : ! else
1717 : ! if (mpi_enreg%my_isppoltab(isppol)==0) cycle
1718 : !* only the processors with isppol are kept.
1719 : ! end if
1720 : end if
1721 :
1722 : !* Copy the values of cgocc_tmp in the arrays cgocc and %occ_bz
1723 27380 : fockbz%occ_bz(my_jband+jbg,my_jsppol) = cgocc_tmp(1)
1724 6214285 : cgocc(1,1:npwj) = cgocc_tmp(2:npwj+1)
1725 6214285 : cgocc(2,1:npwj) = cgocc_tmp(npwj+2:2*npwj+1)
1726 :
1727 : !* calculate cg and store it in cgocc_bz
1728 27380 : if (fockbz%calc_phase(my_jkpt)==1) then
1729 1229388 : do jpw=1,npwj
1730 1222956 : cgre=cgocc(1,jpw) ; cgim=cgocc(2,jpw)
1731 1222956 : cgocc(1,jpw) = phase_jkpt(1,jpw)*cgre - phase_jkpt(2,jpw)*cgim
1732 1229388 : cgocc(2,jpw) = phase_jkpt(1,jpw)*cgim + phase_jkpt(2,jpw)*cgre
1733 : end do
1734 : end if ! phase
1735 :
1736 : !* apply time reversal symmetry if necessary
1737 27380 : if (fockbz%timerev(my_jkpt)==1) then
1738 0 : cgocc(2,:) = - cgocc(2,:)
1739 0 : if((mpi_enreg%nproc_spkpt==1).and.(nsppol==2)) my_jsppol=mod(my_jsppol,2)+1
1740 : !* exchange spin (1 ->2 ; 2-> 1) in the sequential case.
1741 : end if
1742 :
1743 : !* apply FFT to get cwaveocc in real space
1744 :
1745 27380 : if (allocated(fockbz%cwaveocc_bz)) then
1746 :
1747 0 : ABI_MALLOC(dummytab2,(2,npwj))
1748 : call fourwf(1,dummytab3,cgocc(:,1:npwj),dummytab2,fockbz%cwaveocc_bz(:,:,:,:,my_jband+jbg,my_jsppol), &
1749 : & gbound_k,gbound_k,jstwfk,kg_k,kg_k,mgfft,mpi_enreg,1,ngfft,&
1750 0 : & npwj,npwj,n4,n5,n6,tim_fourwf0,0,weight1,weight1,gpu_option=dtset%gpu_option)
1751 0 : ABI_FREE(dummytab2)
1752 :
1753 : else
1754 18588095 : fockbz%cgocc(:,jcg+1+(my_jband-1)*npwj:jcg+my_jband*npwj,my_jsppol)=cgocc(:,1:npwj)
1755 : end if
1756 :
1757 : !* calculate cprj and store it in cwaveocc_prj
1758 61217 : if (fockcommon%usepaw==1) then
1759 2470 : iband_cprj=(my_jsppol-1)*fockbz%mkptband+jbg+my_jband
1760 2470 : nband=1;mband0=1;iband0=1
1761 : call pawcprj_symkn(fockbz%cwaveocc_prj(:,iband_cprj:iband_cprj+nspinor-1),cprj_tmp(:,1:nspinor),&
1762 : & indsym_,dimlmn,iband0,indlmn,&
1763 : & fockbz%tab_symkpt(my_jkpt),fockbz%timerev(my_jkpt),dtset%kptns(:,ikpt),fockbz%pawang%l_max-1,lmnmax,&
1764 2470 : & mband0,dtset%natom,nband,nspinor,dtset%nsym,dtset%ntypat,typat_srt,fockbz%pawang%zarot)
1765 :
1766 2470 : if(dtset%optforces==1) then
1767 2310 : do iatom=1,dtset%natom
1768 1540 : iatm=fockcommon%atindx(iatom)
1769 3850 : do ispinor=iband_cprj,iband_cprj+nspinor-1
1770 12220 : do ilmn=1,fockcommon%pawtab(dtset%typat(iatom))%lmn_size
1771 : dcp(:)= MATMUL(TRANSPOSE(fockcommon%symrec(:,:,fockbz%tab_symkpt(my_jkpt))),&
1772 228500 : & fockbz%cwaveocc_prj(iatm,ispinor)%dcp(1,:,ilmn))
1773 36560 : fockbz%cwaveocc_prj(iatm,ispinor)%dcp(1,:,ilmn)=dcp(:)
1774 : dcp(:)= MATMUL(TRANSPOSE(fockcommon%symrec(:,:,fockbz%tab_symkpt(my_jkpt))),&
1775 228500 : & fockbz%cwaveocc_prj(iatm,ispinor)%dcp(2,:,ilmn))
1776 38100 : fockbz%cwaveocc_prj(iatm,ispinor)%dcp(2,:,ilmn)=dcp(:)
1777 : end do
1778 : end do
1779 : end do
1780 : end if
1781 :
1782 : end if
1783 :
1784 : !* update the shift to apply to occ in all case because this array is not distributed among the proc.
1785 : ! ibg=ibg+1
1786 :
1787 : end do ! iband
1788 :
1789 : !* Save the true number of occupied bands in the array %nbandocc_bz
1790 6457 : fockbz%nbandocc_bz(my_jkpt,my_jsppol) = my_jband
1791 :
1792 : !* update the shifts to apply
1793 6457 : jbg=jbg+my_jband
1794 6457 : jcg=jcg+npwj*my_jband
1795 7830 : jkg=jkg+npwj
1796 : end do ! ikpt
1797 : end do ! isppol
1798 1238 : if (allocated(fockbz%cwaveocc_bz)) then
1799 0 : fockbz%cwaveocc_bz=fockbz%cwaveocc_bz*invucvol
1800 : end if
1801 :
1802 1238 : ABI_FREE(cgocc_tmp)
1803 1238 : ABI_FREE(cgocc)
1804 1238 : if (fockcommon%usepaw==1) then
1805 204 : ABI_FREE(indlmn)
1806 204 : ABI_FREE(indsym_)
1807 204 : ABI_FREE(typat_srt)
1808 204 : ABI_FREE(dimlmn)
1809 204 : call pawcprj_free(cprj_tmp)
1810 612 : ABI_FREE(cprj_tmp)
1811 : end if
1812 1238 : if(allocated(phase_jkpt)) then
1813 259 : ABI_FREE(phase_jkpt)
1814 : end if
1815 1238 : ABI_FREE(dummytab3)
1816 :
1817 :
1818 : ! Restricted or unrestricted HF
1819 1238 : if (nsppol==1) then
1820 : !* Update the array %occ_bz => May be limited to the occupied states only
1821 27516 : fockbz%occ_bz(:,:)=half*fockbz%occ_bz(:,:)
1822 :
1823 : ! If nsppol=1, this is a restricted Hartree-Fock calculation.
1824 : ! If nsppol=2, this is an unrestricted Hartree-Fock calculation.
1825 : end if
1826 :
1827 : end if
1828 :
1829 1238 : call timab(1502,2,tsec)
1830 :
1831 2476 : end subroutine fock_updatecwaveocc
1832 : !!***
1833 :
1834 : !----------------------------------------------------------------------
1835 :
1836 : !!****f* m_fock/fock_set_getghc_call
1837 : !! NAME
1838 : !! fock_set_getghc_call
1839 : !!
1840 : !! FUNCTION
1841 : !! Set the value of fock%getghc_call, Returns the old value
1842 : !!
1843 : !! SOURCE
1844 :
1845 0 : integer function fock_set_getghc_call(fock, new) result(old)
1846 :
1847 : !Arguments ------------------------------------
1848 : !scalars
1849 : type(fock_common_type),intent(inout) :: fock
1850 : integer,intent(in) :: new
1851 : ! *************************************************************************
1852 :
1853 0 : old = fock%getghc_call_
1854 0 : fock%getghc_call_ = new
1855 :
1856 0 : end function fock_set_getghc_call
1857 : !!***
1858 :
1859 : !----------------------------------------------------------------------
1860 :
1861 : !!****f* m_fock/fock_get_getghc_call
1862 : !! NAME
1863 : !! fock_get_getghc_call
1864 : !!
1865 : !! FUNCTION
1866 : !! Returns the value of fock%getghc_call_
1867 : !!
1868 : !! SOURCE
1869 :
1870 155370 : pure integer function fock_get_getghc_call(fock)
1871 :
1872 : !Arguments ------------------------------------
1873 : type(fock_common_type),intent(in) :: fock
1874 : ! *************************************************************************
1875 :
1876 155370 : fock_get_getghc_call = fock%getghc_call_
1877 :
1878 155370 : end function fock_get_getghc_call
1879 : !!***
1880 :
1881 : !----------------------------------------------------------------------
1882 :
1883 : !!****f* m_fock/fock_print
1884 : !! NAME
1885 : !! fock_print
1886 : !!
1887 : !! FUNCTION
1888 : !! Print info on the fock_type data type
1889 : !!
1890 : !! INPUTS
1891 : !! fock<crystal_t>=The object
1892 : !! [unit]=Unit number for output
1893 : !! [prtvol]=Verbosity level
1894 : !! [mode_paral]=Either "COLL" or "PERS"
1895 : !! [header]=String to be printed as header for additional info.
1896 : !!
1897 : !! OUTPUT
1898 : !! Only printing
1899 : !!
1900 : !! SOURCE
1901 :
1902 123 : subroutine fock_print(fockcommon,fockbz,header,unit,mode_paral,prtvol)
1903 :
1904 : !Arguments ------------------------------------
1905 : !scalars
1906 : integer,optional,intent(in) :: unit,prtvol
1907 : character(len=4),optional,intent(in) :: mode_paral
1908 : character(len=*),optional,intent(in) :: header
1909 : type(fock_common_type),intent(in) :: fockcommon
1910 : type(fock_BZ_type),intent(in) :: fockbz
1911 :
1912 : !Local variables-------------------------------
1913 : integer :: my_unt,my_prtvol
1914 : character(len=4) :: my_mode
1915 : character(len=500) :: msg
1916 : ! *********************************************************************
1917 :
1918 123 : my_unt=std_out; if (PRESENT(unit)) my_unt=unit
1919 123 : my_prtvol=0 ; if (PRESENT(prtvol)) my_prtvol=prtvol
1920 123 : my_mode='COLL' ; if (PRESENT(mode_paral)) my_mode=mode_paral
1921 :
1922 123 : msg=' ==== Info on fock_type ==== '
1923 123 : if (PRESENT(header)) msg=' ==== '//TRIM(ADJUSTL(header))//' ==== '
1924 123 : call wrtout(my_unt,msg,my_mode)
1925 :
1926 : ! Important dimensions
1927 123 : call wrtout(my_unt,sjoin(" my_nsppol ...",itoa(fockcommon%my_nsppol)),my_mode)
1928 123 : call wrtout(my_unt,sjoin(" nkpt_bz .....",itoa(fockbz%nkpt_bz)),my_mode)
1929 :
1930 : ! Options
1931 123 : call wrtout(my_unt,sjoin(" nnsclo_hf .......",itoa(fockcommon%nnsclo_hf)),my_mode)
1932 123 : call wrtout(my_unt,sjoin(" ixc .............",itoa(fockcommon%ixc)),my_mode)
1933 123 : call wrtout(my_unt,sjoin(" hybrid mixing....",ftoa(fockcommon%hyb_mixing)),my_mode)
1934 123 : call wrtout(my_unt,sjoin(" hybrid SR mixing ",ftoa(fockcommon%hyb_mixing_sr)),my_mode)
1935 123 : call wrtout(my_unt,sjoin(" hybrid range DFT ",ftoa(fockcommon%hyb_range_dft)),my_mode)
1936 123 : call wrtout(my_unt,sjoin(" hybrid range Fock",ftoa(fockcommon%hyb_range_fock)),my_mode)
1937 :
1938 : ! write(msg,"(a,f12.1,a)")" Memory required for HF u(r) states: ",product(shape(fockbz%cwaveocc_bz)) * dp * b2Mb, " [Mb]"
1939 : ! call wrtout(my_unt,msg,my_mode)
1940 :
1941 : ! Extra info.
1942 : !if (my_prtvol > 0) then
1943 : ! call wrtout(my_unt,"Extra info not available",my_mode)
1944 : !end if
1945 :
1946 123 : end subroutine fock_print
1947 : !!***
1948 :
1949 : !----------------------------------------------------------------------
1950 :
1951 : !!****f* ABINIT/bare_vqg
1952 : !! NAME
1953 : !! bare_vqg
1954 : !!
1955 : !! FUNCTION
1956 : !! Compute bare coulomb term in G-space on the FFT mesh i.e. 4pi/(G+q)**2 for a specified qpoint
1957 : !!
1958 : !! INPUTS
1959 : !! qpoint(3)=reduced coordinates for the phonon wavelength
1960 : !! fockcommon=all the technical details of the Fock operator
1961 : !! gmet(3,3)=metrix tensor in G space in Bohr**-2.
1962 : !! nfft=Total number of FFT grid points.
1963 : !! nkpt_bz=total number of kpoints in the full BZ
1964 : !! ngfft(18)=contain all needed information about 3D FFT, see ~abinit/doc/variables/vargs.htm#ngfft
1965 : !! ucvol=unitcell volume
1966 : !!
1967 : !! OUTPUT
1968 : !! vqg(nfft)=4pi/(G+q)**2, G=0 component is set to an analytic value if q = Gamma.
1969 : !!
1970 : !! NOTES
1971 : !! This routine operates on the full FFT mesh. DO NOT PASS MPI_TYPE
1972 : !! One can easily implemente MPI-FFT by just calling this routine and then
1973 : !! extracting the G-vectors treated by the node.
1974 : !!
1975 : !! SOURCE
1976 :
1977 215486 : subroutine bare_vqg(qpoint,fockcommon,gmet,nfft,nkpt_bz,ngfft,ucvol,vqg)
1978 :
1979 : !Arguments ------------------------------------
1980 : !scalars
1981 : type(fock_common_type),intent(in) :: fockcommon
1982 : integer,intent(in) :: nfft,nkpt_bz
1983 : real(dp),intent(in) :: ucvol
1984 : !arrays
1985 : integer,intent(in) :: ngfft(18)
1986 : real(dp),intent(in) :: qpoint(3)
1987 : real(dp),intent(inout) :: gmet(3,3)
1988 : real(dp),intent(out) :: vqg(nfft)
1989 :
1990 : !Local variables-------------------------------
1991 : !scalars
1992 : integer :: izero
1993 : real(dp) :: rcut !,gs2,gs3 ! gqgm12,gqgm13,gqgm23,
1994 430972 : real(dp) :: vqg_sr(nfft)
1995 : ! *************************************************************************
1996 :
1997 215486 : if (abs(fockcommon%hyb_mixing_sr)>tol8.and.abs(fockcommon%hyb_range_fock)<tol8) then
1998 0 : ABI_BUG('SR mixing<>0 while range separation=0!')
1999 : end if
2000 :
2001 215486 : izero = fockcommon%usepaw
2002 :
2003 910108658 : vqg = zero
2004 :
2005 215486 : if (abs(fockcommon%hyb_mixing)>tol8) then
2006 132282 : call barevcoul(fockcommon%rcut,fockcommon%fock_icutcoul,qpoint,fockcommon%gsqcut,gmet,nfft,nkpt_bz,ngfft,ucvol,izero,vqg)
2007 : ! Rescale the interaction with the factor hyb_mixing
2008 579933498 : vqg = vqg * fockcommon%hyb_mixing
2009 : end if
2010 :
2011 215486 : if (abs(fockcommon%hyb_mixing_sr)>tol8) then
2012 81956 : rcut= one / fockcommon%hyb_range_fock
2013 328017368 : vqg_sr = zero
2014 81956 : call barevcoul(rcut,fockcommon%fock_icutcoul,qpoint,fockcommon%gsqcut,gmet,nfft,nkpt_bz,ngfft,ucvol,izero,vqg_sr,shortrange=.true.)
2015 : ! Rescale the interaction with the factor hyb_mixing_sr and add it to the full range one
2016 328017368 : vqg = vqg + vqg_sr * fockcommon%hyb_mixing_sr
2017 : end if
2018 :
2019 215486 : end subroutine bare_vqg
2020 : !!***
2021 :
2022 : !!****f* ABINIT/strfock
2023 : !! NAME
2024 : !! strfock
2025 : !!
2026 : !! FUNCTION
2027 : !! Compute Fock energy contribution to stress tensor (Cartesian coordinates).
2028 : !!
2029 : !! INPUTS
2030 : !! fockcommon= basic information for fock calculations
2031 : !! gprimd(3,3)=reciprocal space dimensional primitive translations
2032 : !! mpi_enreg=information about MPI parallelization
2033 : !! nfft=(effective) number of FFT grid points (for this processor)
2034 : !! ngfft(18)=contain all needed information about 3D FFT, see ~abinit/doc/variables/vargs.htm#ngfft
2035 : !! nkpt_bz= number of k points in the BZ
2036 : !! qphon(3)=reduced coordinates for the phonon wavelength (needed if cplex==2).
2037 : !! rhog(2,nfft)=Fourier transform of charge density (bohr^-3)
2038 : !! rhog2(2,nfft)= optional argument: Fourier transform of a second charge density (bohr^-3)
2039 : !! ucvol=unit cell volume (bohr^3)
2040 : !!
2041 : !! OUTPUT
2042 : !! fockstr(6)=components of Fock part of stress tensor
2043 : !! (Cartesian coordinates, symmetric tensor) in hartree/bohr^3
2044 : !! Definition of symmetric tensor storage: store 6 unique components
2045 : !! in the order 11, 22, 33, 32, 31, 21 (suggested by Xavier Gonze).
2046 : !!
2047 : !! SOURCE
2048 :
2049 12960 : subroutine strfock(fockcommon,gprimd,fockstr,mpi_enreg,nfft,ngfft,&
2050 12960 : nkpt_bz,ndat,rhog,ucvol,qphon,&
2051 0 : rhog2,gpu_option) ! optional arguments
2052 :
2053 : !Arguments ------------------------------------
2054 : !scalars
2055 : type(fock_common_type),intent(in) :: fockcommon
2056 : integer,intent(in) :: nfft,nkpt_bz,ndat
2057 : integer,intent(in),optional :: gpu_option
2058 : real(dp),intent(in) :: ucvol
2059 : type(MPI_type),intent(in) :: mpi_enreg
2060 : !arrays
2061 : integer,intent(in) :: ngfft(18)
2062 : real(dp),intent(in) :: gprimd(3,3),rhog(2,nfft,ndat),qphon(3)
2063 : real(dp),intent(in),optional :: rhog2(2,nfft,ndat)
2064 : real(dp),intent(out) :: fockstr(6,ndat)
2065 :
2066 : !Local variables-------------------------------
2067 : !scalars
2068 : integer,parameter :: im=2,re=1
2069 : integer :: i1,i2,i3,id1,id2,id3,ierr,ig1,ig2,ig3,ii,irho2,idat,me_fft,n1,n2,n3,nproc_fft
2070 : real(dp) :: arg,gsquar,rcut,rhogsq,tot,tot1 !tolfix=1.000000001_dp,
2071 : logical :: rcut_spencer_alavi
2072 : #ifdef HAVE_OPENMP_OFFLOAD
2073 : real(dp) :: hyb_mixing,hyb_mixing_sr,hyb_range_fock
2074 : ! Cray has trouble with reduction on array, so we use 6 scalars instead
2075 : real(dp) :: fockstr1,fockstr2,fockstr3,fockstr4,fockstr5,fockstr6
2076 : #endif
2077 : !character(len=500) :: msg
2078 : !arrays
2079 25920 : real(dp) :: gcart(3),tsec(2),gmet(3,3),vqg(nfft)
2080 12960 : real(dp), allocatable :: v_gcart(:,:,:,:)
2081 12960 : integer, contiguous, pointer :: fftn2_distrib(:),ffti2_local(:)
2082 12960 : integer, contiguous, pointer :: fftn3_distrib(:),ffti3_local(:)
2083 : ! *************************************************************************
2084 :
2085 12960 : call timab(568,1,tsec)
2086 :
2087 12960 : if (abs(fockcommon%hyb_mixing_sr)>tol8.and.abs(fockcommon%hyb_range_fock)<tol8) then
2088 0 : ABI_BUG('strfock: SR mixing<>0 while range separation=0!')
2089 : end if
2090 :
2091 518400 : gmet = MATMUL(TRANSPOSE(gprimd),gprimd)
2092 12960 : call bare_vqg(qphon,fockcommon,gmet,nfft,nkpt_bz,ngfft,ucvol,vqg)
2093 :
2094 : !if(gpu_option==ABI_GPU_DISABLED) then
2095 441080 : fockstr(:,:)=zero
2096 : !else(gpu_option==ABI_GPU_OPENMP) then
2097 : ! gpu_set_to_zero(fockstr, 6*ndat)
2098 : !end if
2099 :
2100 : ! fockcommon%rcut is zero, rcut is a function of the cell volume (Spencer-Alavi scheme)
2101 : ! Therefore gives a contribution to the stress
2102 12960 : rcut_spencer_alavi = fockcommon%rcut<tol8
2103 12960 : if(rcut_spencer_alavi) then
2104 12864 : rcut = (three*nkpt_bz*ucvol/four_pi)**(one/three)
2105 : else
2106 : rcut = fockcommon%rcut
2107 : endif
2108 12960 : irho2=0;if (present(rhog2)) irho2=1
2109 :
2110 : !Conduct looping over all fft grid points to find G vecs inside fockcommon%gsqcut
2111 :
2112 12960 : n1=ngfft(1) ; n2=ngfft(2) ; n3=ngfft(3)
2113 12960 : me_fft=ngfft(11)
2114 12960 : nproc_fft=ngfft(10)
2115 12960 : id1=n1/2+2
2116 12960 : id2=n2/2+2
2117 12960 : id3=n3/2+2
2118 :
2119 :
2120 12960 : ii=0
2121 : ! Get the distrib associated with this fft_grid
2122 12960 : call ptabs_fourdp(mpi_enreg,n2,n3,fftn2_distrib,ffti2_local,fftn3_distrib,ffti3_local)
2123 :
2124 12960 : if(gpu_option==ABI_GPU_DISABLED) then
2125 : !$OMP PARALLEL DO &
2126 : !$OMP& PRIVATE(idat,i3,i2,i1,ig3,ig2,ig1,tot,tot1,ii,gcart,gsquar,rhogsq,arg)
2127 74120 : do idat=1,ndat
2128 1070035 : do i3=1,n3
2129 995915 : ig3=i3-(i3/id3)*n3-1
2130 17745894 : do i2=1,n2
2131 16688819 : ig2=i2-(i2/id2)*n2-1
2132 17684734 : if (fftn2_distrib(i2)==me_fft) then
2133 317020057 : do i1=1,n1
2134 300331238 : tot=zero; tot1=zero
2135 300331238 : ig1=i1-(i1/id1)*n1-1
2136 300331238 : ii=i1+n1*(ffti2_local(i2)-1+(n2/nproc_fft)*(i3-1))
2137 :
2138 : ! Compute cartesian components of G
2139 300331238 : gcart(1)=gprimd(1,1)*(dble(ig1)+qphon(1))+gprimd(1,2)*(dble(ig2)+qphon(2))+gprimd(1,3)*(dble(ig3)+qphon(3))
2140 300331238 : gcart(2)=gprimd(2,1)*(dble(ig1)+qphon(1))+gprimd(2,2)*(dble(ig2)+qphon(2))+gprimd(2,3)*(dble(ig3)+qphon(3))
2141 300331238 : gcart(3)=gprimd(3,1)*(dble(ig1)+qphon(1))+gprimd(3,2)*(dble(ig2)+qphon(2))+gprimd(3,3)*(dble(ig3)+qphon(3))
2142 : ! Compute |G+q|^2
2143 300331238 : gsquar=gcart(1)**2+gcart(2)**2+gcart(3)**2
2144 :
2145 :
2146 :
2147 : ! take |rho(G)|^2 for complex rhog
2148 300331238 : if (irho2==0) then
2149 300331238 : rhogsq=rhog(re,ii,idat)**2+rhog(im,ii,idat)**2
2150 : else
2151 0 : rhogsq=rhog(re,ii,idat)*rhog2(re,ii,idat)+rhog(im,ii,idat)*rhog2(im,ii,idat)
2152 : end if
2153 : ! Case G=0:
2154 300331238 : if(gsquar<tol10) then
2155 3790 : if (abs(fockcommon%hyb_mixing_sr)>tol8) cycle
2156 2835 : if (abs(fockcommon%hyb_mixing)>tol8) then
2157 2799 : if (rcut_spencer_alavi) then
2158 : ! vqg(1) already contains the factor fockcommon%hyb_mixing
2159 2751 : fockstr(1,idat)=fockstr(1,idat)+vqg(1)/3.0_dp*rhogsq
2160 2751 : fockstr(2,idat)=fockstr(2,idat)+vqg(1)/3.0_dp*rhogsq
2161 2751 : fockstr(3,idat)=fockstr(3,idat)+vqg(1)/3.0_dp*rhogsq
2162 : endif
2163 : cycle
2164 : end if
2165 : end if
2166 :
2167 : ! Spherical cutoff screening
2168 300327484 : if (abs(fockcommon%hyb_mixing)>tol8) then
2169 222776987 : arg=two_pi*rcut*sqrt(gsquar)
2170 222776987 : tot=fockcommon%hyb_mixing*rhogsq*piinv/(gsquar**2)*(1-cos(arg)-arg*sin(arg)/two)
2171 222776987 : if (rcut_spencer_alavi) then
2172 221204171 : tot1=fockcommon%hyb_mixing*rhogsq/three*rcut*sin(arg)/sqrt(gsquar)
2173 : end if
2174 : end if
2175 :
2176 : ! Erfc screening
2177 300327484 : if (abs(fockcommon%hyb_mixing_sr)>tol8) then
2178 76555169 : arg=-gsquar*pi**2/(fockcommon%hyb_range_fock**2)
2179 76555169 : tot=tot+fockcommon%hyb_mixing_sr*rhogsq*piinv/(gsquar**2)*(1.d0-exp(arg)*(1-arg))
2180 : end if
2181 300327484 : fockstr(1,idat)=fockstr(1,idat)+tot*gcart(1)*gcart(1)+tot1
2182 300327484 : fockstr(2,idat)=fockstr(2,idat)+tot*gcart(2)*gcart(2)+tot1
2183 300327484 : fockstr(3,idat)=fockstr(3,idat)+tot*gcart(3)*gcart(3)+tot1
2184 300327484 : fockstr(4,idat)=fockstr(4,idat)+tot*gcart(3)*gcart(2)
2185 300327484 : fockstr(5,idat)=fockstr(5,idat)+tot*gcart(3)*gcart(1)
2186 317017258 : fockstr(6,idat)=fockstr(6,idat)+tot*gcart(2)*gcart(1)
2187 : end do
2188 : end if
2189 : end do
2190 : end do
2191 : end do !ndat
2192 0 : else if(gpu_option==ABI_GPU_OPENMP) then
2193 0 : ABI_MALLOC(v_gcart, (3,n1,n2,n3))
2194 : #ifdef HAVE_OPENMP_OFFLOAD
2195 : hyb_mixing = fockcommon%hyb_mixing
2196 : hyb_mixing_sr = fockcommon%hyb_mixing_sr
2197 : hyb_range_fock = fockcommon%hyb_range_fock
2198 :
2199 : !$OMP TARGET ENTER DATA MAP(alloc:v_gcart)
2200 : !$OMP TARGET ENTER DATA MAP(to:gprimd,qphon,vqg,ffti2_local,fftn2_distrib)
2201 :
2202 : !$OMP TARGET TEAMS DISTRIBUTE PARALLEL DO &
2203 : !$OMP& PRIVATE(idat,i3,i2,i1,ig3,ig2,ig1,tot,tot1,ii,gcart,gsquar,rhogsq,arg) &
2204 : !$OMP& MAP(to:v_gcart,gprimd,qphon)
2205 : do i3=1,n3
2206 : do i2=1,n2
2207 : do i1=1,n1
2208 : ig3=i3-(i3/id3)*n3-1
2209 : ig2=i2-(i2/id2)*n2-1
2210 : ig1=i1-(i1/id1)*n1-1
2211 :
2212 : ! Compute cartesian components of G
2213 : v_gcart(1,i1,i2,i3)=gprimd(1,1)*(dble(ig1)+qphon(1))+gprimd(1,2)*(dble(ig2)+qphon(2))+gprimd(1,3)*(dble(ig3)+qphon(3))
2214 : v_gcart(2,i1,i2,i3)=gprimd(2,1)*(dble(ig1)+qphon(1))+gprimd(2,2)*(dble(ig2)+qphon(2))+gprimd(2,3)*(dble(ig3)+qphon(3))
2215 : v_gcart(3,i1,i2,i3)=gprimd(3,1)*(dble(ig1)+qphon(1))+gprimd(3,2)*(dble(ig2)+qphon(2))+gprimd(3,3)*(dble(ig3)+qphon(3))
2216 : end do
2217 : end do
2218 : end do
2219 :
2220 : !$OMP TARGET TEAMS DISTRIBUTE &
2221 : !$OMP& PRIVATE(idat,fockstr1,fockstr2,fockstr3,fockstr4,fockstr5,fockstr6) &
2222 : !$OMP& MAP(to:rhog,v_gcart,vqg,ffti2_local,fftn2_distrib) MAP(tofrom:fockstr)
2223 : do idat=1,ndat
2224 : fockstr1=zero
2225 : fockstr2=zero
2226 : fockstr3=zero
2227 : fockstr4=zero
2228 : fockstr5=zero
2229 : fockstr6=zero
2230 : !$OMP PARALLEL DO COLLAPSE(3) PRIVATE(i3,i2,i1,tot,tot1,ii,gsquar,rhogsq,arg) &
2231 : !$OMP& REDUCTION(+:fockstr1,fockstr2,fockstr3,fockstr4,fockstr5,fockstr6)
2232 : do i3=1,n3
2233 : do i2=1,n2
2234 : do i1=1,n1
2235 : tot=zero; tot1=zero
2236 : ii=i1+n1*(ffti2_local(i2)-1+(n2/nproc_fft)*(i3-1))
2237 : if (fftn2_distrib(i2)==me_fft) then
2238 : ! Compute |G+q|^2
2239 : gsquar=v_gcart(1,i1,i2,i3)**2+v_gcart(2,i1,i2,i3)**2+v_gcart(3,i1,i2,i3)**2
2240 : ! take |rho(G)|^2 for complex rhog
2241 : rhogsq=rhog(re,ii,idat)**2+rhog(im,ii,idat)**2
2242 : ! Case G=0:
2243 : if(gsquar<tol10) then
2244 : if (abs(hyb_mixing)>tol8 .and. abs(hyb_mixing_sr)<tol8) then
2245 : ! vqg(1) already contains the factor fockcommon%hyb_mixing
2246 : if (rcut_spencer_alavi) then
2247 : fockstr1=fockstr1+vqg(1)/3.0_dp*rhogsq
2248 : fockstr2=fockstr2+vqg(1)/3.0_dp*rhogsq
2249 : fockstr3=fockstr3+vqg(1)/3.0_dp*rhogsq
2250 : end if
2251 : end if
2252 :
2253 : else
2254 :
2255 : ! Spherical cutoff screening
2256 : if (abs(hyb_mixing)>tol8) then
2257 : arg=two_pi*rcut*sqrt(gsquar)
2258 : tot=hyb_mixing*rhogsq*piinv/(gsquar**2)*(1-cos(arg)-arg*sin(arg)/two)
2259 : if (rcut_spencer_alavi) then
2260 : tot1=hyb_mixing*rhogsq/three*rcut*sin(arg)/sqrt(gsquar)
2261 : end if
2262 : end if
2263 :
2264 : ! Erfc screening
2265 : if (abs(hyb_mixing_sr)>tol8) then
2266 : arg=-gsquar*pi**2/(hyb_range_fock**2)
2267 : tot=tot+hyb_mixing_sr*rhogsq*piinv/(gsquar**2)*(1.d0-exp(arg)*(1-arg))
2268 : end if
2269 : fockstr1=fockstr1+tot*v_gcart(1,i1,i2,i3)*v_gcart(1,i1,i2,i3)+tot1
2270 : fockstr2=fockstr2+tot*v_gcart(2,i1,i2,i3)*v_gcart(2,i1,i2,i3)+tot1
2271 : fockstr3=fockstr3+tot*v_gcart(3,i1,i2,i3)*v_gcart(3,i1,i2,i3)+tot1
2272 : fockstr4=fockstr4+tot*v_gcart(3,i1,i2,i3)*v_gcart(2,i1,i2,i3)
2273 : fockstr5=fockstr5+tot*v_gcart(3,i1,i2,i3)*v_gcart(1,i1,i2,i3)
2274 : fockstr6=fockstr6+tot*v_gcart(2,i1,i2,i3)*v_gcart(1,i1,i2,i3)
2275 : end if
2276 : end if
2277 : end do
2278 : end do
2279 : end do
2280 : fockstr(1,idat)=fockstr1
2281 : fockstr(2,idat)=fockstr2
2282 : fockstr(3,idat)=fockstr3
2283 : fockstr(4,idat)=fockstr4
2284 : fockstr(5,idat)=fockstr5
2285 : fockstr(6,idat)=fockstr6
2286 : end do !ndat
2287 :
2288 : !$OMP TARGET EXIT DATA MAP(delete:v_gcart,gprimd,qphon,vqg,ffti2_local,fftn2_distrib)
2289 : #endif
2290 0 : ABI_FREE(v_gcart)
2291 : end if
2292 :
2293 : !Init mpi_comm
2294 12960 : if(mpi_enreg%nproc_fft>1)then
2295 0 : call timab(48,1,tsec)
2296 0 : call xmpi_sum(fockstr,mpi_enreg%comm_fft ,ierr)
2297 0 : call timab(48,2,tsec)
2298 : end if
2299 :
2300 :
2301 : !Normalize and add term -efock/ucvol on diagonal
2302 : !efock has been set to zero because it is not yet known. It will be added later.
2303 74120 : fockstr(1,:)=-fockstr(1,:)
2304 74120 : fockstr(2,:)=-fockstr(2,:)
2305 74120 : fockstr(3,:)=-fockstr(3,:)
2306 74120 : fockstr(4,:)=-fockstr(4,:)
2307 74120 : fockstr(5,:)=-fockstr(5,:)
2308 74120 : fockstr(6,:)=-fockstr(6,:)
2309 :
2310 12960 : call timab(568,2,tsec)
2311 :
2312 12960 : end subroutine strfock
2313 : !!***
2314 :
2315 18280 : end module m_fock
2316 : !!***
|