Branch data Line data Source code
1 : : !!****m* ABINIT/m_io_kss
2 : : !! NAME
3 : : !! m_io_kss
4 : : !!
5 : : !! FUNCTION
6 : : !! This module contains procedured dealing with the IO of the KSS file.
7 : : !!
8 : : !! COPYRIGHT
9 : : !! Copyright (C) 1999-2026 ABINIT group (MG, MT, VO, AR, LR, RWG, MM, XG, RShaltaf)
10 : : !! This file is distributed under the terms of the
11 : : !! GNU General Public License, see ~abinit/COPYING
12 : : !! or http://www.gnu.org/copyleft/gpl.txt .
13 : : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt .
14 : : !!
15 : : !! SOURCE
16 : :
17 : : #if defined HAVE_CONFIG_H
18 : : #include "config.h"
19 : : #endif
20 : :
21 : : #include "abi_common.h"
22 : :
23 : : MODULE m_io_kss
24 : :
25 : : use defs_basis
26 : : use m_abicore
27 : : use m_xmpi
28 : : use m_errors
29 : : use m_nctk
30 : : use netcdf
31 : : use m_hdr
32 : : use m_wfk
33 : : use m_cgtools
34 : : use m_hamiltonian
35 : : use m_electronpositron
36 : : use m_pawtab
37 : : use m_paw_ij
38 : : use m_pawcprj
39 : : use m_pawfgr
40 : : use m_dtfil
41 : : use m_dtset
42 : :
43 : : use defs_datatypes, only : pseudopotential_type
44 : : use defs_abitypes, only : MPI_type
45 : : use m_time, only : timab
46 : : use m_io_tools, only : open_file
47 : : use m_fstrings, only : sjoin, itoa, strcat
48 : : use m_hide_lapack, only : xheevx_cplex, xhegvx_cplex
49 : : use m_geometry, only : metric, remove_inversion
50 : : use m_mpinfo, only : destroy_mpi_enreg, proc_distrb_cycle
51 : : use m_fftcore, only : get_kg, sphere
52 : : use m_fft, only : fftpac
53 : : use m_crystal , only : crystal_t
54 : : use m_gsphere, only : table_gbig2kg, merge_and_sort_kg
55 : : use m_kg, only : mkkin, mkkpg
56 : : use m_ksdiago, only : ksdiago, init_ddiago_ctl, ddiago_ctl_type
57 : : use m_mkffnl, only : mkffnl
58 : : use m_getghc, only : getghc
59 : : use m_fourier_interpol, only : transgrid
60 : :
61 : : implicit none
62 : :
63 : : private
64 : :
65 : : public :: write_kss_header ! Writes the header of the KSS file.
66 : : !private :: write_vkb ! Writes the KB form factors and derivates on file for a single k-point.
67 : : public :: write_kss_wfgk ! Write the Gamma-centered wavefunctions and energies on the KSS file for a single k-point.
68 : : public :: k2gamma_centered ! Convert a set of wavefunctions from the k-centered to the gamma-centered basis set.
69 : : public :: make_gvec_kss ! Build the list of G-vectors for the KSS file.
70 : : public :: outkss ! Generate KSS file
71 : :
72 : : CONTAINS !===========================================================
73 : : !!***
74 : :
75 : : !!****f* m_io_kss/write_kss_header
76 : : !! NAME
77 : : !! write_kss_header
78 : : !!
79 : : !! FUNCTION
80 : : !! Write the header of the KSS file either using plain Fortran-IO or netcdf with ETSF-IO format.
81 : : !! Returns the unit number to be used for further writing.
82 : : !! It should be executed by master node only.
83 : : !!
84 : : !! INPUTS
85 : : !! filekss(len=fnlen)=The name of the KSS file.
86 : : !! kss_npw=Number of planewaves used for the wavefunctions in the KSS files.
87 : : !! ishm=Max number of shells written on file
88 : : !! shlim(ishm)=The cumulative number of G"s in each shell.
89 : : !! nbandksseff=Number of bands to be written.
90 : : !! mband=The maximum number of bands treated by abinit.
91 : : !! nsym2=Number of symmetry operations to be written on the header.
92 : : !! symrel2(3,3,nsym2)=The symmetry operations in real space to be written.
93 : : !! tnons2(3,nsym2)=The fractional translations associateed to symrel2.
94 : : !! gbig(3,kss_npw)=The set of G-vectors for the KSS wavefunctions (Gamma-centered)
95 : : !! Hdr<hdr_type>=The abinit header.
96 : : !! Dtset <dataset_type>=all input variables for this dataset
97 : : !! Psps<pseudopotential_type>=Structure gathering info on the pseudopotentials.
98 : : !! iomode=Input variables specifying the fileformat. (0-->Fortran,3-->netcdf with ETSF-IO format).
99 : : !! occ(mband*nkpt*nsppol)=The occupation factors.
100 : : !!
101 : : !! OUTPUT
102 : : !! kss_unt=The unit number of the opened file.
103 : : !!
104 : : !! SIDE EFFECTS
105 : : !! The KSS Header is written on file.
106 : : !!
107 : : !! SOURCE
108 : :
109 : 3 : subroutine write_kss_header(filekss,kss_npw,ishm,nbandksseff,mband,nsym2,symrel2,tnons2,occ,gbig,shlim,&
110 : : crystal,Dtset,Hdr,Psps,iomode,kss_unt)
111 : :
112 : : !Arguments ------------------------------------
113 : : !scalars
114 : : integer,intent(in) :: iomode,kss_npw,nbandksseff,ishm,nsym2,mband
115 : : integer,intent(out) :: kss_unt
116 : : character(len=fnlen),intent(in) :: filekss
117 : : type(crystal_t),intent(in) :: crystal
118 : : type(pseudopotential_type),intent(in) :: Psps
119 : : type(Hdr_type),intent(in) :: Hdr
120 : : type(Dataset_type),intent(in) :: Dtset
121 : : !arrays
122 : : integer,intent(in) :: symrel2(3,3,nsym2)
123 : : integer,intent(in) :: gbig(3,kss_npw),shlim(ishm)
124 : : real(dp),intent(in) :: tnons2(3,nsym2)
125 : : real(dp),intent(in) :: occ(mband*Dtset%nkpt*Dtset%nsppol)
126 : :
127 : : !Local variables-------------------------------
128 : : !scalars
129 : : integer :: nspinor,nsppol,nkpt,itypat,ierr
130 : : integer :: nb,isppol,ik,fform,ii,jj,kk,ig
131 : : integer :: il,il0,ilmn,in,ind1,ind2
132 : : character(len=80) :: title
133 : : character(len=500) :: msg
134 : 3 : type(hdr_type) :: my_Hdr
135 [ + + + + : 384 : type(dataset_type) :: Dtset_cpy
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + +
+ ]
136 : : integer :: ncerr
137 : : !arrays
138 : 3 : integer,allocatable :: vkbsign_int(:,:,:)
139 : 3 : real(dp),allocatable :: vkbsign(:,:)
140 : :
141 : : ! *********************************************************************
142 : :
143 : : DBG_ENTER("COLL")
144 : :
145 : 3 : nsppol = Dtset%nsppol
146 : 3 : nkpt = Dtset%nkpt
147 : 3 : nspinor= Dtset%nspinor
148 : :
149 : 3 : write(msg,'(3a)')ch10,' Opening file for KS structure output: ',TRIM(filekss)
150 : 3 : call wrtout(std_out,msg,'COLL')
151 : :
152 : 3 : write(msg,'(a,i6)') ' number of Gamma centered plane waves ',kss_npw
153 : 3 : call wrtout(std_out,msg,'COLL')
154 : 3 : call wrtout(ab_out,msg,'COLL')
155 : 3 : write(msg,'(a,i6)') ' number of Gamma centered shells ',ishm
156 : 3 : call wrtout(std_out,msg,'COLL')
157 : 3 : call wrtout(ab_out,msg,'COLL')
158 : 3 : write(msg,'(a,i6)') ' number of bands ',nbandksseff
159 : 3 : call wrtout(std_out,msg,'COLL')
160 : 3 : call wrtout(ab_out,msg,'COLL')
161 : 3 : write(msg,'(a,i6)') ' maximum angular momentum components ',Psps%mpsang
162 : 3 : call wrtout(std_out,msg,'COLL')
163 : 3 : call wrtout(ab_out,msg,'COLL')
164 : 3 : write(msg,'(a,i2,a)')' number of symmetry operations ',nsym2,' (without inversion)'
165 : 3 : call wrtout(std_out,msg,'COLL')
166 : :
167 : : !Copy the header so that we can change some basic dimensions using the KSS values:
168 : : !(bantot, npwarr, nband) and the occupation factors
169 : :
170 : : !Note that nsym and symrel might have been changed this has to be fixed
171 : : !carefully in the next patch since in the new implementation symmorphy=0 should be dafault
172 : 3 : call hdr%copy(my_Hdr)
173 : :
174 [ + + ]: 34 : my_Hdr%npwarr =kss_npw
175 [ + + ]: 34 : my_Hdr%nband =nbandksseff
176 [ + + ]: 34 : my_hdr%mband = maxval(my_hdr%nband)
177 : 3 : my_Hdr%bantot =nbandksseff*nkpt*nsppol
178 : :
179 [ + + ]: 34 : my_Hdr%istwfk = 1 ! KSS file does not support istwfk/=1 even though the GS run
180 : : ! can take advantage of time-reversal symmetry.
181 : :
182 : : !Copy the occ number in the new header with correct dimensions
183 : : !fill with zero the rest since mband can be < nbandksseff
184 : : !write(std_out,*)associated(my_Hdr%occ)
185 [ - + ]: 3 : ABI_FREE(my_Hdr%occ)
186 [ - + + - : 9 : ABI_MALLOC(my_Hdr%occ,(my_Hdr%bantot))
+ - + - -
+ - + ]
187 : : !mband = MAXVAL(Hdr%nband)
188 : :
189 [ + + ]: 1323 : my_Hdr%occ=zero; nb=MIN(mband,nbandksseff)
190 [ + + ]: 6 : do isppol=1,nsppol
191 [ + + ]: 37 : do ik=1,nkpt
192 : 31 : ind1=1+(ik-1)*nbandksseff+(isppol-1)*nkpt*nbandksseff
193 : 31 : ind2=1+(ik-1)*mband +(isppol-1)*nkpt*mband
194 [ + + ]: 444 : my_Hdr%occ(ind1:ind1+nb-1) = occ(ind2:ind2+nb-1)
195 : : end do
196 : : end do
197 : :
198 : : !Change dimension in the local Dtset_cpy as well.
199 : 3 : dtset_cpy = Dtset%copy()
200 : 3 : Dtset_cpy%mpw = kss_npw
201 : 3 : Dtset_cpy%mband = nbandksseff
202 : :
203 : 3 : fform=502
204 : :
205 : 3 : SELECT CASE (iomode)
206 : :
207 : : CASE (IO_MODE_FORTRAN)
208 : :
209 [ # # ]: 0 : if (open_file(filekss, msg, newunit=kss_unt, form="unformatted") /= 0) then
210 : 0 : ABI_ERROR(msg)
211 : : end if
212 : :
213 : 0 : call my_hdr%fort_write(kss_unt, fform, ierr)
214 [ # # ]: 0 : ABI_CHECK(ierr == 0, "hdr_Fort_write returned ierr != 0")
215 : :
216 : 0 : title='Results from ABINIT code'; write(kss_unt) title(1:80)
217 : 0 : title='Ab-initio plane waves calculation'; write(kss_unt) title(1:80)
218 : :
219 : 0 : write(kss_unt) nsym2,nbandksseff,kss_npw,ishm,Psps%mpsang ! To be modified to deal with more than one projector
220 : 0 : write(kss_unt) (((symrel2(ii,jj,kk),ii=1,3),jj=1,3),kk=1,nsym2)
221 : 0 : write(kss_unt) ((tnons2(ii,kk),ii=1,3),kk=1,nsym2)
222 : 0 : write(kss_unt) ((gbig(ii,ig),ii=1,3),ig=1,kss_npw)
223 : 0 : write(kss_unt) (shlim(in),in=1,ishm)
224 : :
225 : : ! Write vkbsign for NC pseudos with Fortran IO
226 : : ! MG FIXME: only one projector in each angular channel is treated.
227 : : ! Moreover the allocation is done in the wrong order for dimensions...
228 : : ! but if I change this code, compatibility with external codes is broken.
229 [ # # ]: 0 : if (Psps%usepaw==0) then
230 [ # # # # : 0 : ABI_MALLOC(vkbsign,(Psps%ntypat,Psps%mpsang))
# # # # #
# # # # #
# # ]
231 [ # # # # ]: 0 : vkbsign(:,:)=zero
232 [ # # ]: 0 : do itypat=1,Psps%ntypat
233 : 0 : il0=0
234 [ # # ]: 0 : do ilmn=1,Psps%lmnmax
235 : 0 : il=1+Psps%indlmn(1,ilmn,itypat)
236 : 0 : in=Psps%indlmn(3,ilmn,itypat)
237 [ # # ]: 0 : if (il/=il0 .and. in==1) then
238 : 0 : il0=il
239 : 0 : vkbsign(itypat,il)=DSIGN(one,Psps%ekb(ilmn,itypat))
240 : : end if
241 : : end do
242 : : end do
243 [ # # # # ]: 0 : write(kss_unt) ((vkbsign(itypat,il),il=1,Psps%mpsang),itypat=1,Psps%ntypat)
244 [ # # ]: 0 : ABI_FREE(vkbsign)
245 : : end if
246 : :
247 : : CASE (IO_MODE_ETSF)
248 : :
249 : : ! Create file.
250 [ - + ]: 3 : NCF_CHECK(nctk_open_create(kss_unt, nctk_ncify(filekss), xmpi_comm_self))
251 : :
252 : : ! Add additional info from abinit header.
253 [ - + ]: 3 : NCF_CHECK(my_hdr%ncwrite(kss_unt, fform, nc_define=.True.))
254 : :
255 : : ! Add info on crystalline structure
256 : : ! FIXME: Check symmorphi trick and crystal%symrel!
257 : : ! We currently use the dataset symmetries, as defined in the Hdr structure
258 : : ! instead of the symmetries recomputed in outkss.
259 [ - + ]: 3 : NCF_CHECK(crystal%ncwrite(kss_unt))
260 : :
261 : : ! Defined G-vectors and wavefunctions.
262 : 3 : call wfk_ncdef_dims_vars(kss_unt, my_hdr, fform, iskss=.True.)
263 : : !call abi_etsf_init(Dtset_cpy, filekss, 4, .false., my_Hdr%lmn_size, Psps, Dummy_wfs)
264 : :
265 : : ! If NC pseudos, write vkbsign.
266 : : ! Here multi-projectors are supported, array is dimensioned according to etsf-io standard.
267 [ + + ]: 3 : if (psps%usepaw == 0) then
268 : :
269 : : ! Define dims and variables needed for KB matrix elements.
270 : : ncerr = nctk_def_dims(kss_unt, [ &
271 : : nctkdim_t("max_number_of_angular_momenta", psps%mpsang), &
272 : : nctkdim_t("max_number_of_projectors", psps%mproj) &
273 [ + + ]: 6 : ])
274 [ - + ]: 2 : NCF_CHECK(ncerr)
275 : :
276 : : ncerr = nctk_def_arrays(kss_unt, [ &
277 : : nctkarr_t("kb_formfactor_sign", "int", &
278 : : &"max_number_of_projectors, max_number_of_angular_momenta, number_of_atom_species"), &
279 : : nctkarr_t("kb_formfactors", "dp", &
280 : : &"max_number_of_coefficients, number_of_kpoints, max_number_of_projectors,&
281 : : &max_number_of_angular_momenta, number_of_atom_species"), &
282 : : nctkarr_t("kb_formfactor_derivative", "dp", &
283 : : &"max_number_of_coefficients, number_of_kpoints, max_number_of_projectors,&
284 : : &max_number_of_angular_momenta, number_of_atom_species") &
285 [ + + ]: 8 : ])
286 [ - + ]: 2 : NCF_CHECK(ncerr)
287 : :
288 [ - + + - : 10 : ABI_MALLOC(vkbsign_int, (psps%mproj, Psps%mpsang, Psps%ntypat))
- + + - -
+ + - + -
+ - - + -
+ ]
289 [ + + + + : 19 : vkbsign_int=0
+ + ]
290 [ + + ]: 5 : do itypat=1,Psps%ntypat
291 [ + + ]: 9 : do ilmn=1,Psps%lmnmax
292 : 4 : il=1+Psps%indlmn(1,ilmn,itypat)
293 : 4 : in=Psps%indlmn(3,ilmn,itypat)
294 : 7 : vkbsign_int(in,il,itypat)=NINT(DSIGN(one,Psps%ekb(ilmn,itypat)))
295 : : end do
296 : : end do
297 : :
298 [ - + ]: 2 : NCF_CHECK(nctk_set_datamode(kss_unt))
299 : :
300 : : ! Write KB sign here
301 [ - + ]: 2 : NCF_CHECK(nf90_put_var(kss_unt, nctk_idname(kss_unt, "kb_formfactor_sign"), vkbsign_int))
302 [ - + ]: 2 : ABI_FREE(vkbsign_int)
303 : : end if
304 : :
305 [ - + ]: 3 : NCF_CHECK(nctk_set_datamode(kss_unt))
306 : :
307 : : CASE DEFAULT
308 [ - + - ]: 3 : ABI_ERROR(sjoin("Unsupported value for iomode:", itoa(iomode)))
309 : : END SELECT
310 : :
311 : 3 : call Dtset_cpy%free()
312 : 3 : call my_Hdr%free()
313 : :
314 : : DBG_EXIT("COLL")
315 : :
316 [ - + - + : 3 : end subroutine write_kss_header
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- - - - -
- - - - -
- - - - -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + ]
317 : : !!***
318 : :
319 : : !----------------------------------------------------------------------
320 : :
321 : : !!****f* m_io_kss/write_vkb
322 : : !! NAME
323 : : !! write_vkb
324 : : !!
325 : : !! FUNCTION
326 : : !! Writes the KB form factors and derivates on file for a single k-point.
327 : : !! Supports plain Fortran IO and netcdf with ETSF-IO format
328 : : !!
329 : : !! INPUTS
330 : : !! kss_unt=The unit number of the file
331 : : !! ikpt=The index of the k-point
332 : : !! kpoint(3)=The k-point in reduced coordinates.
333 : : !! kss_npw=Number of planewaves used for the wavefunctions in the KSS files.
334 : : !! npw_k=Number of planewaves at this k-point in the k-centered basis set used in abinit (ecut).
335 : : !! ecut=cutoff energy used in abinit.
336 : : !! rprimd(3,3)=dimensional primitive translations for real space (bohr).
337 : : !! Psps<Pseudopotential_type>=Datatype gathering data on the Pseudopotentials.
338 : : !! iomode=Input variables specifying the fileformat. (0-->Fortran,3-->netcdf with ETSF-IO).
339 : : !! gbig(3,kss_npw)=Set of G-vectors used in the KSS file.
340 : : !!
341 : : !! OUTPUT
342 : : !! Only writing.
343 : : !!
344 : : !! SOURCE
345 : :
346 : 20 : subroutine write_vkb(kss_unt,ikpt,kpoint,kss_npw,gbig,rprimd,Psps,iomode)
347 : :
348 : : !Arguments ------------------------------------
349 : : !scalars
350 : : integer,intent(in) :: ikpt,iomode,kss_npw,kss_unt
351 : : type(Pseudopotential_type),intent(in) :: Psps
352 : : !arrays
353 : : integer,intent(in) :: gbig(3,kss_npw)
354 : : real(dp),intent(in) :: kpoint(3),rprimd(3,3)
355 : :
356 : : !Local variables-------------------------------
357 : : !scalars
358 : : integer :: itypat,il,ig,mpsang,ntypat
359 : : !array
360 : 20 : real(dp),allocatable :: vkb(:,:,:),vkbd(:,:,:)
361 : 20 : real(dp),allocatable :: dum_vkbsign(:,:)
362 : : integer :: ncerr,varid
363 : 20 : real(dp),allocatable,target :: vkb_tgt(:,:,:,:), vkbd_tgt(:,:,:,:)
364 : : ! *********************************************************************
365 : :
366 : 20 : mpsang = Psps%mpsang; ntypat = Psps%ntypat
367 : :
368 [ - + + - : 100 : ABI_MALLOC(vkb ,(kss_npw,ntypat,mpsang))
- + + - -
+ + - + -
+ - - + -
+ ]
369 [ - + + - : 80 : ABI_MALLOC(vkbd,(kss_npw,ntypat,mpsang))
- + + - -
+ + - - +
- + ]
370 [ - + + - : 80 : ABI_MALLOC(dum_vkbsign,(ntypat,mpsang))
- + + - +
- + - - +
- + ]
371 : :
372 : 20 : call kss_calc_vkb(Psps,kpoint,kss_npw,gbig,rprimd,dum_vkbsign,vkb,vkbd)
373 [ - + ]: 20 : ABI_FREE(dum_vkbsign)
374 : :
375 : 20 : SELECT CASE (iomode)
376 : :
377 : : CASE (IO_MODE_FORTRAN)
378 [ # # ]: 0 : do itypat=1,ntypat
379 [ # # ]: 0 : do il=1,mpsang
380 : 0 : write(kss_unt) (vkb (ig,itypat,il),ig=1,kss_npw)
381 : 0 : write(kss_unt) (vkbd(ig,itypat,il),ig=1,kss_npw)
382 : : end do
383 : : end do
384 : :
385 : : CASE (IO_MODE_ETSF)
386 [ - + + - : 100 : ABI_MALLOC(vkb_tgt ,(kss_npw,1,mpsang,ntypat))
- + + - -
+ + - + -
+ - - + -
+ ]
387 [ - + + - : 80 : ABI_MALLOC(vkbd_tgt,(kss_npw,1,mpsang,ntypat))
- + + - -
+ + - - +
- + ]
388 [ + + ]: 50 : do itypat=1,ntypat
389 [ + + ]: 120 : do il=1,mpsang
390 [ + + ]: 89990 : do ig=1,kss_npw
391 : 89890 : vkb_tgt (ig,1,il,itypat)=vkb (ig,itypat,il)
392 : 89960 : vkbd_tgt(ig,1,il,itypat)=vkbd(ig,itypat,il)
393 : : end do
394 : : end do
395 : : end do
396 : :
397 : : ! FIXME: Multiple projectors
398 : : !ABI_MALLOC(vkbd, (npw, psps%lnmax, cryst%ntypat))
399 : : !call calc_vkb(cryst,psps,kpoint,npw,npw,gvec,vkbsign,vkb,vkbd)
400 : : !ABI_FREE(vkbsign)
401 : : !ABI_FREE(vkb)
402 : : !ABI_FREE(vkbd)
403 : :
404 : : ! The shape of the variable on disk is (Fortran API):
405 : : ! (max_number_of_coefficients, number_of_kpoints, max_number_of_projectors,
406 : : ! max_number_of_angular_momenta, number_of_atom_species)
407 : 20 : varid = nctk_idname(kss_unt, "kb_formfactors")
408 [ + + + + ]: 220 : ncerr = nf90_put_var(kss_unt, varid, vkb_tgt, start=[1,ikpt,1,1,1], count=[kss_npw,1,1,mpsang,ntypat])
409 [ - + ]: 20 : NCF_CHECK(ncerr)
410 : :
411 : 20 : varid = nctk_idname(kss_unt, "kb_formfactor_derivative")
412 [ + + + + ]: 220 : ncerr = nf90_put_var(kss_unt, varid, vkbd_tgt, start=[1,ikpt,1,1,1], count=[kss_npw,1,1,mpsang,ntypat])
413 [ - + ]: 20 : NCF_CHECK(ncerr)
414 : :
415 [ - + ]: 20 : ABI_FREE(vkb_tgt)
416 [ - + ]: 20 : ABI_FREE(vkbd_tgt)
417 : :
418 : : CASE DEFAULT
419 [ - + - ]: 20 : ABI_ERROR(sjoin("Unsupported value for iomode:", itoa(iomode)))
420 : : END SELECT
421 : :
422 [ - + ]: 20 : ABI_FREE(vkb)
423 [ - + ]: 20 : ABI_FREE(vkbd)
424 : :
425 [ - + - + ]: 20 : end subroutine write_vkb
426 : : !!***
427 : :
428 : : !----------------------------------------------------------------------
429 : :
430 : : !!****f* m_io_kss/write_kss_wfgk
431 : : !! NAME
432 : : !! write_kss_wfgk
433 : : !!
434 : : !! FUNCTION
435 : : !! Write the Gamma-centered wavefunctions and energies on the KSS file for a single k-point.
436 : : !! (Only the master node should call this routine).
437 : : !!
438 : : !! INPUTS
439 : : !! kss_unt=The unit number of the file
440 : : !! ikpt=The index of the k-point
441 : : !! isppol=The spin index.
442 : : !! nspinor=number of spinorial components (on current proc)
443 : : !! kss_npw=Number of planewaves used for the wavefunctions in the KSS files.
444 : : !! npw_k=Number of plane-waves in the k-centered basis set.
445 : : !! nbandksseff=Number of bands to be written.
446 : : !! natom=Number of atoms.
447 : : !! Psps<Pseudopotential_type>=Structure gathering pseudopotential data.
448 : : !! kpoint(3)=The k-points in reduced coordinates.
449 : : !! ene_k(nbandksseff)=Energies at this k-point
450 : : !! occ_k(nbandksseff)=Occupation factors at this k-point.
451 : : !! rprimd(3,3)=dimensional primitive translations for real space (bohr).
452 : : !! gbig(3,kss_npw)=The set of G-vectors for the KSS wavefunctions (Gamma-centered)
453 : : !! wfg(2,kss_npw*nspinor,nbandksseff)=The wavefunction Fourier coefficients.
454 : : !! iomode=Input variables specifying the fileformat. (0-->Fortran,3--> netcdf with ETSF-IO format).
455 : : !!
456 : : !! OUTPUT
457 : : !! Only writing.
458 : : !!
459 : : !! SOURCE
460 : :
461 : 31 : subroutine write_kss_wfgk(kss_unt,ikpt,isppol,kpoint,nspinor,kss_npw,&
462 : 31 : & nbandksseff,natom,Psps,ene_k,occ_k,rprimd,gbig,wfg,Cprjnk_k,iomode)
463 : :
464 : : !Arguments ------------------------------------
465 : : !scalars
466 : : integer,intent(in) :: ikpt,isppol,iomode,kss_npw,nspinor,kss_unt,nbandksseff
467 : : integer,intent(in) :: natom
468 : : type(pseudopotential_type),intent(in) :: Psps
469 : : !arrays
470 : : integer,intent(in) :: gbig(3,kss_npw)
471 : : real(dp),intent(in) :: kpoint(3),rprimd(3,3)
472 : : real(dp),intent(in) :: ene_k(nbandksseff),occ_k(nbandksseff)
473 : : real(dp),intent(in) :: wfg(2,kss_npw*nspinor,nbandksseff)
474 : : type(pawcprj_type),intent(in) :: Cprjnk_k(natom,nspinor*nbandksseff*Psps%usepaw)
475 : :
476 : : !Local variables-------------------------------
477 : : !scalars
478 : : integer :: ib,ibsp,ig,ispinor,iatom,ii !,ierr
479 : : integer :: kg_varid,cg_varid,ncerr
480 : : character(len=nctk_slen) :: kdep
481 : : ! *********************************************************************
482 : :
483 : : ! Calculate and write KB form factors and derivative at this k-point.
484 [ + + ]: 31 : if (Psps%usepaw==0) call write_vkb(kss_unt,ikpt,kpoint,kss_npw,gbig,rprimd,Psps,iomode)
485 : :
486 : : ! ============================================================
487 : : ! ==== Write wavefunctions and PAW matrix elements on disk ====
488 : : ! ============================================================
489 : 31 : SELECT CASE (iomode)
490 : :
491 : : CASE (IO_MODE_FORTRAN)
492 : 0 : write(kss_unt) (ene_k(ib),ib=1,nbandksseff)
493 : :
494 : 0 : ibsp=0
495 [ # # ]: 0 : do ib=1,nbandksseff
496 [ # # # # ]: 0 : write(kss_unt) (wfg(:,ig,ib),ig=1,kss_npw*nspinor)
497 [ # # ]: 0 : if (Psps%usepaw==1) then ! Remember that cprj are unsorted.
498 [ # # ]: 0 : do ispinor=1,nspinor
499 : 0 : ibsp=ibsp+1
500 [ # # ]: 0 : do iatom=1,natom
501 : 0 : ii=Cprjnk_k(iatom,ibsp)%nlmn
502 [ # # # # ]: 0 : write(kss_unt) (Cprjnk_k(iatom,ibsp)%cp(:,1:ii))
503 : : end do
504 : : end do
505 : : end if
506 : : end do
507 : :
508 : : CASE (IO_MODE_ETSF)
509 [ + + ]: 31 : if (Psps%usepaw==1) then
510 : 11 : ABI_WARNING("PAW output with ETSF-IO netcdf: cprj won't be written")
511 : : end if
512 : :
513 : : ! Write G-vectors (gbig because it's not k-dependent)
514 [ - + ]: 31 : NCF_CHECK(nf90_inq_varid(kss_unt, "reduced_coordinates_of_plane_waves", kg_varid))
515 [ - + ]: 31 : NCF_CHECK(nf90_get_att(kss_unt, kg_varid, "k_dependent", kdep))
516 [ + - ]: 31 : if (kdep == "no") then
517 [ + + ]: 93 : ncerr = nf90_put_var(kss_unt, kg_varid, gbig, start=[1,1], count=[3,kss_npw])
518 : : else
519 [ # # # # ]: 0 : ncerr = nf90_put_var(kss_unt, kg_varid, gbig, start=[1,1,ikpt], count=[3,kss_npw,1])
520 : : end if
521 [ - + ]: 31 : NCF_CHECK_MSG(ncerr, "putting gibg")
522 : :
523 : : ! Write wavefunctions
524 : : ! The coefficients_of_wavefunctions on file have shape [cplex, mpw, nspinor, mband, nkpt, nsppol]
525 [ - + ]: 31 : NCF_CHECK(nf90_inq_varid(kss_unt, "coefficients_of_wavefunctions", cg_varid))
526 : : ncerr = nf90_put_var(kss_unt, cg_varid, wfg, start=[1,1,1,1,ikpt,isppol], &
527 [ + + + + ]: 403 : count=[2,kss_npw,nspinor,nbandksseff,1,1])
528 [ - + ]: 31 : NCF_CHECK_MSG(ncerr, "putting cg_k")
529 : :
530 : : ! Write eigenvalues and occupations
531 [ + + - + : 124 : NCF_CHECK(nf90_put_var(kss_unt, nctk_idname(kss_unt, "eigenvalues"), ene_k, start=[1,ikpt,isppol]))
- - ]
532 [ + + - + : 124 : NCF_CHECK(nf90_put_var(kss_unt, nctk_idname(kss_unt, "occupations"), occ_k, start=[1,ikpt,isppol]))
- - ]
533 : :
534 : : CASE DEFAULT
535 [ - + - ]: 31 : ABI_ERROR(sjoin("Unsupported iomode:", itoa(iomode)))
536 : : END SELECT
537 : :
538 : 31 : end subroutine write_kss_wfgk
539 : : !!***
540 : :
541 : : !----------------------------------------------------------------------
542 : :
543 : : !!****f* m_io_kss/k2gamma_centered
544 : : !! NAME
545 : : !! k2gamma_centered
546 : : !!
547 : : !! FUNCTION
548 : : !! Helper function to translate a set of wavefunctions from the k-centered G-sphere
549 : : !! to the Gamma-centered G-sphere used for GW calculations.
550 : : !!
551 : : !! INPUTS
552 : : !! npw_k=Number of planewaves in the k-centered basis set.
553 : : !! kss_npw=Number of planewaves in the Gamma-centered G-sphere.
554 : : !! nspinor=Number of spinorial component.
555 : : !! nbandksseff=Number of bands in input-output arrays.
556 : : !! [icg]=Shift to be used when accessing the cg array. 0 if not specified (usually k_index).
557 : : !! [eig_vec(2,npw_k*nspinor,nbandksseff)]=wavefunctions defined on the k-centered G-sphere.
558 : : !! [cg(2,ikg+1:ikg+npw_k*nspinor*nbandksseff)]=wavefunctions defined on the k-centered G-sphere.
559 : : !! ngfft(18)=Info on the FFT.
560 : : !! MPI_enreg<MPI_type>=Structure gathering info on the parallelization.
561 : : !! istwf_k
562 : : !! ecut
563 : : !! gbig(3,kss_npw)
564 : : !! kg_k(3,npw_k)
565 : : !! gmet(3,3)
566 : : !! kpoint(3)
567 : : !!
568 : : !! OUTPUT
569 : : !! wfg(2,kss_npw*nspinor,nbandksseff)=Wavefunctions in the Gamma-centered representation.
570 : : !!
571 : : !! NOTES
572 : : !! 1) icg is used only if cg is present.
573 : : !! 2) cg and eig_vec are mutually exclusive. One and only one can be passed to the routine.
574 : : !!
575 : : !! SOURCE
576 : :
577 : 62 : subroutine k2gamma_centered(kpoint,npw_k,istwf_k,ecut,kg_k,kss_npw,nspinor,nbandksseff,ngfft,gmet,&
578 [ + + + - : 52 : & MPI_enreg,gbig,ug,icg,cg,eig_vec)
- + ]
579 : :
580 : : !Arguments ------------------------------------
581 : : !scalars
582 : : integer,intent(in) :: nbandksseff,nspinor,kss_npw,npw_k,istwf_k
583 : : integer,optional,intent(in) :: icg
584 : : real(dp),intent(in) :: ecut
585 : : type(MPI_type),intent(inout) :: MPI_enreg
586 : : !arrays
587 : : integer,intent(in) :: gbig(3,kss_npw)
588 : : integer,intent(in) :: kg_k(3,npw_k)
589 : : integer,intent(in) :: ngfft(18)
590 : : real(dp),intent(in) :: gmet(3,3),kpoint(3)
591 : : real(dp),intent(out) :: ug(2,kss_npw*nspinor,nbandksseff)
592 : : real(dp),optional,intent(in) :: eig_vec(2,npw_k*nspinor,nbandksseff)
593 : : real(dp),optional,intent(in) :: cg(:,:)
594 : :
595 : : !Local variables-------------------------------
596 : : !scalars
597 : : integer,parameter :: tobox=1,tosph=-1
598 : : integer :: band,ispinor,spinor_shift2,spinor_shift1,ig,my_icg,ierr
599 : : integer :: n1,n2,n3,n4,n5,n6,ndat,full_npw_k,ii
600 : : character(len=500) :: msg
601 : : !arrays
602 : : integer :: identity(3,3)=RESHAPE((/1,0,0,0,1,0,0,0,1/),(/3,3/))
603 : : integer :: no_shift(3)=(/0,0,0/)
604 : 31 : integer,allocatable :: trsl(:),full_kg_k(:,:)
605 : 31 : real(dp),allocatable :: cfft(:,:,:,:)
606 : 31 : real(dp),allocatable :: full_cg(:,:),tmp_cg(:,:)
607 : :
608 : : ! *********************************************************************
609 : :
610 [ - + ]: 31 : if (PRESENT(cg).and.PRESENT(eig_vec)) then
611 : 0 : ABI_ERROR("Both cg and eig_vec are present!")
612 : : end if
613 : :
614 : : ! Mapping between the gamma-centered basis set and the k-centered one.
615 : : ! trsl(ig)=npw_k+1 if vector ig is not inside the k-centered G-sphere.
616 [ - + + - : 93 : ABI_MALLOC(trsl,(kss_npw))
+ - + - -
+ - + ]
617 : :
618 : 31 : n1=ngfft(1); n2=ngfft(2); n3=ngfft(3)
619 : 31 : n4=ngfft(4); n5=ngfft(5); n6=ngfft(6)
620 : :
621 [ + - ]: 31 : if (istwf_k==1) then ! Full k-centered G-sphere.
622 : 31 : call table_gbig2kg(npw_k,kg_k,kss_npw,gbig,trsl,ierr)
623 [ - + - - ]: 31 : if (ierr/=0.and.(kss_npw>=npw_k)) then
624 : 0 : ABI_ERROR(' The set of G vectors is inconsistent')
625 : : end if
626 : :
627 : : else ! Calculate full kg with istwf_k=1 then do the mapping.
628 : 0 : call get_kg(kpoint,1,ecut,gmet,full_npw_k,full_kg_k)
629 : :
630 : 0 : call table_gbig2kg(full_npw_k,full_kg_k,kss_npw,gbig,trsl,ierr)
631 [ # # # # ]: 0 : if (ierr/=0.and.(kss_npw>=npw_k)) then
632 : 0 : ABI_ERROR(' The set of G vectors is inconsistent')
633 : : end if
634 : : end if
635 : : !
636 : : ! Branching, depending on optional arguments.
637 [ + + ]: 31 : if (PRESENT(cg)) then
638 [ + - ]: 10 : my_icg=0; if (PRESENT(icg)) my_icg=icg
639 : :
640 : : SELECT CASE (istwf_k)
641 : :
642 : : CASE (1)
643 [ + + ]: 110 : do band=1,nbandksseff
644 [ + + ]: 210 : do ispinor=1,nspinor
645 : 100 : spinor_shift1=(ispinor-1)*kss_npw
646 : 100 : spinor_shift2=(ispinor-1)*npw_k
647 [ + + ]: 188700 : do ig=1,kss_npw ! Retrieve the correct components
648 [ + + ]: 188600 : if (trsl(ig)<=npw_k) then
649 [ + + ]: 414660 : ug(:,ig+spinor_shift1,band)=cg(:,trsl(ig)+spinor_shift2+(band-1)*npw_k*nspinor+my_icg)
650 : : else
651 [ + + ]: 150840 : ug(:,ig+spinor_shift1,band)=zero
652 : : end if
653 : : end do
654 : : end do
655 : : end do
656 : :
657 : : CASE (2:9)
658 : :
659 [ # # ]: 0 : ABI_CHECK(nspinor==1,"nspinor/=1!")
660 : : !
661 : : ! Convert input wfs from reduced to full G-sphere.
662 : 0 : ndat=1
663 [ # # # # : 0 : ABI_MALLOC(cfft,(2,n4,n5,n6*ndat))
# # # # #
# # # # #
# # # # #
# ]
664 [ # # # # : 0 : ABI_MALLOC(full_cg,(2,full_npw_k*ndat))
# # # # #
# # # ]
665 [ # # # # : 0 : ABI_MALLOC(tmp_cg,(2,npw_k*ndat))
# # # # #
# # # ]
666 : :
667 : : !write(std_out,*)"npw_k, full_kg_k",npw_k,full_npw_k
668 : :
669 [ # # ]: 0 : do band=1,nbandksseff
670 : 0 : ii = (band-1)*npw_k
671 [ # # # # : 0 : tmp_cg = cg(:,my_icg+ii+1:my_icg+ii+npw_k)
# # # # #
# # # ]
672 : : !write(776,*)"band= ",band,tmp_cg !cg(1:,my_icg+1+ii:my_icg+ii+npw_k)
673 : :
674 : 0 : call sphere(tmp_cg,ndat,npw_k,cfft,n1,n2,n3,n4,n5,n6,kg_k,istwf_k,tobox,MPI_enreg%me_g0,no_shift,identity,one)
675 : :
676 : 0 : call sphere(full_cg,ndat,full_npw_k,cfft,n1,n2,n3,n4,n5,n6,full_kg_k,1,tosph,MPI_enreg%me_g0,no_shift,identity,one)
677 : : !write(777,*)"band= ",band,full_cg(:,:)
678 : :
679 [ # # ]: 0 : do ig=1,kss_npw ! Retrieve the correct components
680 [ # # ]: 0 : if (trsl(ig)<=full_npw_k) then
681 [ # # ]: 0 : ug(:,ig,band)=full_cg(:,trsl(ig))
682 : : else
683 [ # # ]: 0 : ug(:,ig,band)=zero
684 : : end if
685 : : end do
686 : : end do !band
687 : :
688 [ # # ]: 0 : ABI_FREE(cfft)
689 [ # # ]: 0 : ABI_FREE(tmp_cg)
690 [ # # ]: 0 : ABI_FREE(full_cg)
691 : :
692 : : CASE DEFAULT
693 [ + - - ]: 10 : ABI_BUG("Wrong istwf_k")
694 : : END SELECT
695 : :
696 [ + - ]: 21 : else if (PRESENT(eig_vec)) then
697 : :
698 : : SELECT CASE (istwf_k)
699 : :
700 : : CASE (1)
701 [ + + ]: 1241 : do band=1,nbandksseff
702 [ + + ]: 2461 : do ispinor=1,nspinor
703 : 1220 : spinor_shift1=(ispinor-1)*kss_npw
704 : 1220 : spinor_shift2=(ispinor-1)*npw_k
705 [ + + ]: 623380 : do ig=1,kss_npw ! Retrieve the correct components
706 [ + + ]: 622160 : if (trsl(ig)<=npw_k) then
707 [ + + ]: 1176480 : ug(:,ig+spinor_shift1,band)=eig_vec(:,trsl(ig)+spinor_shift2,band)
708 : : else
709 [ + + ]: 686340 : ug(:,ig+spinor_shift1,band)=zero
710 : : end if
711 : : end do
712 : : end do
713 : : end do
714 : :
715 : : CASE DEFAULT
716 : 0 : write(msg,'(a,i0)')" Unsupported value for istwf_k: ",istwf_k
717 [ + - ]: 21 : ABI_ERROR(msg)
718 : : END SELECT
719 : :
720 : : else
721 : 0 : ABI_ERROR("neither cg not eig_vec are in input")
722 : : end if
723 : :
724 [ - + ]: 31 : ABI_FREE(trsl)
725 [ - + ]: 31 : if (allocated(full_kg_k)) then
726 : 0 : ABI_FREE(full_kg_k)
727 : : end if
728 : :
729 [ + + - + ]: 62 : end subroutine k2gamma_centered
730 : : !!***
731 : :
732 : : !----------------------------------------------------------------------
733 : :
734 : : !!****f* m_io_kss/make_gvec_kss
735 : : !! NAME
736 : : !! make_gvec_kss
737 : : !!
738 : : !! FUNCTION
739 : : !! Build the list of G-vectors using the KSS convention.
740 : : !!
741 : : !! INPUTS
742 : : !! nkpt=Number of k-points.
743 : : !! nsym=Number of symmetries.
744 : : !! prtvol=Verbosity option.
745 : : !! symmorphi=
746 : : !! 0 : Old (Obsolete) implementation => Suppress inversion from symmetries list
747 : : !! 1 : Use input symrel, tnons.
748 : : !! ecut_eff=Effective cutoff
749 : : !! symrel(3,3,nsym)= Symmetry operation in real space.
750 : : !! tnons(3,nsym)=Fractional translations
751 : : !! kptns(3,nkpt)=K-points in reduced coordinates.
752 : : !!
753 : : !! OUTPUT
754 : : !! npwkss = Input: Initial guess for the number of G-vectors required. Use 0 to have the
755 : : !! full list of G-vectors that form a closed shell.
756 : : !! Output: Actual number of G-vectors that form a set of closed shells
757 : : !! gvec_kss(:,:) = Input: null pointer. Output: gvec_kss(3,npwkss), list of G-vectors (closed shells)
758 : : !! ierr=Status error
759 : : !!
760 : : !! SOURCE
761 : :
762 : 357 : subroutine make_gvec_kss(nkpt,kptns,ecut_eff,symmorphi,nsym,symrel,tnons,gprimd,prtvol,npwkss,gvec_kss,ierr)
763 : :
764 : : !Arguments ------------------------------------
765 : : !scalars
766 : : integer,intent(in) :: nkpt,nsym,prtvol,symmorphi
767 : : integer,intent(out) :: ierr
768 : : integer,intent(inout) :: npwkss
769 : : real(dp),intent(in) :: ecut_eff
770 : : !arrays
771 : : integer,intent(in) :: symrel(3,3,nsym)
772 : : integer,pointer :: gvec_kss(:,:)
773 : : real(dp),intent(in) :: tnons(3,nsym),kptns(3,nkpt)
774 : : real(dp),intent(in) :: gprimd(3,3)
775 : :
776 : : !Local variables-------------------------------
777 : : !scalars
778 : : integer :: ii,ishm,maxpw,nbase
779 : : integer :: nrst1,nrst2,nsym2,pinv
780 : 357 : integer,pointer :: gbig(:,:)
781 : : character(len=500) :: msg
782 : : !arrays
783 : 357 : integer,pointer :: symrel2(:,:,:),shlim(:)
784 : 357 : real(dp),pointer :: tnons2(:,:)
785 : : ! *********************************************************************
786 : :
787 : 357 : ierr = 0
788 : 357 : write(msg,'(2a)')ch10,' Sorting g-vecs for an output of states on an unique "big" PW basis.'
789 : 357 : call wrtout(std_out,msg,'COLL')
790 : :
791 : : !ecut_eff = ecut * Dtset%dilatmx**2 ! Use ecut_eff instead of ecut_eff since otherwise
792 : : !
793 : : !============================================================
794 : : !=== Prepare set containing all G-vectors sorted by stars ===
795 : : !============================================================
796 : : !
797 : : !=== Analyze symmetry operations ===
798 [ + + ]: 357 : if (symmorphi==0) then ! Old (Obsolete) implementation: Suppress inversion from symmetries list:
799 : 15 : nullify(symrel2,tnons2)
800 : 15 : call remove_inversion(nsym,symrel,tnons,nsym2,symrel2,tnons2,pinv)
801 [ + + + + : 1279 : if (ANY(ABS(tnons2(:,1:nsym2))>tol8)) then
+ - - + ]
802 : : write(msg,'(3a)')&
803 : 0 : & ' Non-symmorphic operations still remain in the symmetries list ',ch10,&
804 : 0 : & ' Program does not stop but _KSS file will not be created...'
805 : 0 : ABI_WARNING(msg)
806 : 0 : ierr=ierr+1 ; RETURN
807 : : end if
808 [ + - ]: 342 : else if (symmorphi==1) then
809 : : ! If in the input file symmorphi==1 all the symmetry operations are retained:
810 : : ! both identity and inversion (if any) as well as non-symmorphic operations.
811 : 342 : nsym2=nsym ; pinv=1
812 [ - + + - : 1026 : ABI_MALLOC(symrel2,(3,3,nsym))
+ - + - -
+ - + ]
813 [ - + + - : 1026 : ABI_MALLOC(tnons2,(3,nsym))
+ - + - -
+ - + ]
814 [ + + + + : 185098 : symrel2(:,:,:)=symrel(:,:,1:nsym)
+ + ]
815 [ + + + + ]: 57190 : tnons2(:,:) =tnons(:,1:nsym)
816 : : else
817 : : write(msg,'(a,i4,3a)')&
818 : 0 : & ' symmorphi = ',symmorphi,' while it must be 0 or 1',ch10,&
819 : 0 : & ' Program does not stop but KSS file will not be created...'
820 : 0 : ABI_WARNING(msg)
821 : 0 : ierr=ierr+1 ; RETURN
822 : : end if
823 : : !
824 : : !===================================================================
825 : : !==== Merge the set of k-centered G-spheres into a big set gbig ====
826 : : !===================================================================
827 : : !* Vectors in gbig are ordered by shells
828 : : !
829 : 357 : nullify(gbig,shlim)
830 [ - + ]: 357 : call merge_and_sort_kg(nkpt,kptns,ecut_eff,nsym2,pinv,symrel2,gprimd,gbig,prtvol,shlim_p=shlim)
831 : :
832 : 357 : nbase = SIZE(shlim) ! Number of independent G in the big sphere.
833 : 357 : maxpw = shlim(nbase) ! Total number of G"s in the big sphere.
834 : : !
835 : : ! * Determine optimal number of bands and G"s to be written.
836 : : !npwkss=Dtset%npwkss
837 [ + + + - ]: 357 : if ((npwkss==0).or.(npwkss>=maxpw)) then
838 : 357 : npwkss=maxpw
839 : : write(msg,'(5a)')&
840 : 357 : & ' Since the number of g''s to be written on file',ch10,&
841 : 357 : & ' was 0 or too large, it has been set to the max. value.,',ch10,&
842 : 714 : & ' computed from the union of the sets of G vectors for the different k-points.'
843 : 357 : call wrtout(std_out,msg,'COLL')
844 : : end if
845 : :
846 : 357 : ishm=0
847 [ + + ]: 20668 : do ii=1,nbase
848 [ + - ]: 20668 : if (shlim(ii)<=npwkss) then
849 : 20311 : ishm=ii
850 : : else
851 : : EXIT
852 : : end if
853 : : end do
854 : : !ishm=bisect(shlim,npwkss)
855 : :
856 [ - + ]: 357 : if (shlim(ishm)/=npwkss) then
857 : 0 : nrst1=shlim(ishm)
858 : 0 : nrst2=MIN0(shlim(MIN0(ishm+1,nbase)),maxpw)
859 [ # # ]: 0 : if (IABS(npwkss-nrst2)<IABS(npwkss-nrst1)) nrst1=nrst2
860 : 0 : npwkss=nrst1
861 : 0 : if (shlim(ishm)<npwkss) ishm=ishm+1
862 : : write(msg,'(3a)')&
863 : 0 : & ' The number of G''s to be written on file is not a whole number of stars ',ch10,&
864 : 0 : & ' the program set it to the nearest star limit.'
865 : 0 : call wrtout(std_out,msg,'COLL')
866 : : end if
867 : :
868 : 357 : write(msg,'(a,i5)')' Number of G-vectors is: ',npwkss
869 : 357 : call wrtout(std_out,msg,'COLL')
870 : :
871 [ - + + - : 1071 : ABI_MALLOC(gvec_kss,(3,npwkss))
+ - + - -
+ - + ]
872 [ + - + + : 2069597 : gvec_kss = gbig(:,1:npwkss)
+ + + + +
+ ]
873 : :
874 [ - + ]: 357 : ABI_FREE(gbig)
875 [ - + ]: 357 : ABI_FREE(symrel2)
876 [ - + ]: 357 : ABI_FREE(tnons2)
877 [ - + ]: 357 : ABI_FREE(shlim)
878 : :
879 : 357 : end subroutine make_gvec_kss
880 : : !!***
881 : :
882 : : !----------------------------------------------------------------------
883 : :
884 : : !!****f* m_io_kss/kss_calc_vkb
885 : : !! NAME
886 : : !! kss_calc_vkb
887 : : !!
888 : : !! FUNCTION
889 : : !! This routine calculates the Kleynman-Bylander form factors and its derivatives
890 : : !! needed for the evaluation of the matrix elements of the dipole operator <phi1|r|phi2>.
891 : : !!
892 : : !! INPUTS
893 : : !! npw_k=Number of plane waves for this k-point.
894 : : !! Psps<pseudopotential_type>=Structured datatype gathering information on the pseudopotentials.
895 : : !! kg_k(3,npw_k)=Reduced coordinates of the G-vectors.
896 : : !! kpoint(3)=The k-point in reduced coordinates.
897 : : !! rprimd(3,3)=dimensional primitive translations for real space (bohr)
898 : : !!
899 : : !! OUTPUT
900 : : !! vkb (npw_k,Psps%ntypat,Psps%mpsang)=KB form factors.
901 : : !! vkbd(npw_k,Psps%ntypat,Psps%mpsang)=KB form factor derivatives.
902 : : !! vkbsign(Psps%mpsang,Psps%ntypat) =KS dyadic sign.
903 : : !!
904 : : !! NOTES
905 : : !! This piece of code has been extracted from outkss.F90. The implementation is consistent
906 : : !! with the KSS file formata (Fortran version) but it presents two design flaws.
907 : : !!
908 : : !! 1) Pseudo with more that one projector per l-channel are not supported.
909 : : !! 2) Ordering of dimensions in vkb and vkbd is not optimal. We are not programming C!!!
910 : : !!
911 : : !! TODO
912 : : !! *) Spinorial case is not implemented.
913 : : !!
914 : : !! SOURCE
915 : :
916 : 20 : subroutine kss_calc_vkb(Psps,kpoint,npw_k,kg_k,rprimd,vkbsign,vkb,vkbd)
917 : :
918 : : !Arguments ------------------------------------
919 : : !scalars
920 : : integer,intent(in) :: npw_k
921 : : type(Pseudopotential_type),intent(in) :: Psps
922 : : !arrays
923 : : integer,intent(in) :: kg_k(3,npw_k)
924 : : real(dp),intent(in) :: kpoint(3),rprimd(3,3)
925 : : real(dp),intent(out) :: vkb (npw_k,Psps%ntypat,Psps%mpsang)
926 : : real(dp),intent(out) :: vkbd(npw_k,Psps%ntypat,Psps%mpsang)
927 : : real(dp),intent(out) :: vkbsign(Psps%mpsang,Psps%ntypat)
928 : :
929 : : !Local variables ------------------------------
930 : : !scalars
931 : : integer :: dimffnl,ider,idir,itypat,nkpg,il0,in
932 : : integer :: il,ilmn,ig,is
933 : : real(dp) :: ucvol,effmass_free,ecutsm,ecut
934 : : !arrays
935 : : real(dp) :: gmet(3,3),gprimd(3,3),rmet(3,3)
936 : 20 : real(dp),allocatable :: ffnl(:,:,:,:),kpg_dum(:,:),modkplusg(:), ylm(:,:),ylm_gr(:,:,:),ylm_k(:,:)
937 : : ! *************************************************************************
938 : :
939 : : DBG_ENTER("COLL")
940 : :
941 [ - + ]: 20 : ABI_CHECK(Psps%usepaw==0,"You should not be here!")
942 [ - + ]: 20 : ABI_CHECK(Psps%useylm==0,"useylm/=0 not considered!")
943 : :
944 : 20 : call metric(gmet,gprimd,-1,rmet,rprimd,ucvol)
945 : : !
946 : : ! === Save KB dyadic sign (integer-valued) ===
947 [ + + + + ]: 120 : vkbsign=zero
948 [ + + ]: 50 : do itypat=1,Psps%ntypat
949 : 30 : il0=0
950 [ + + ]: 90 : do ilmn=1,Psps%lmnmax
951 : 40 : il=1+Psps%indlmn(1,ilmn,itypat)
952 : 40 : in=Psps%indlmn(3,ilmn,itypat)
953 [ + - ]: 70 : if (il/=il0 .and. in==1) then
954 : 40 : il0=il
955 : 40 : vkbsign(il,itypat)=DSIGN(one,Psps%ekb(ilmn,itypat))
956 : : end if
957 : : end do
958 : : end do
959 : :
960 : : ! === Allocate KB form factor and derivative wrt k+G ===
961 : : ! * Here we do not use correct ordering for dimensions
962 : :
963 : 20 : ider=1; dimffnl=2 ! To retrieve the first derivative.
964 : 20 : idir=0; nkpg=0
965 : : !
966 : : ! Quantities used only if useylm==1
967 [ - + + - : 80 : ABI_MALLOC(ylm,(npw_k,Psps%mpsang**2*Psps%useylm))
+ - - - +
- - + - +
- + ]
968 [ - + + - : 100 : ABI_MALLOC(ylm_gr,(npw_k,3+6*(ider/2),Psps%mpsang**2*Psps%useylm))
+ - + - -
- + - - +
- + - + ]
969 [ - + + - : 60 : ABI_MALLOC(ylm_k,(npw_k,Psps%mpsang**2*Psps%useylm))
+ - - - -
+ - + ]
970 [ - + + - : 40 : ABI_MALLOC(kpg_dum,(npw_k,nkpg))
- + - + ]
971 : :
972 [ - + + - : 120 : ABI_MALLOC(ffnl,(npw_k,dimffnl,Psps%lmnmax,Psps%ntypat))
+ - - + +
- - + + -
+ - + - -
+ - + ]
973 : :
974 : : call mkffnl(Psps%dimekb,dimffnl,Psps%ekb,ffnl,Psps%ffspl,gmet,gprimd,ider,idir,Psps%indlmn,&
975 : : kg_k,kpg_dum,kpoint,Psps%lmnmax,Psps%lnmax,Psps%mpsang,Psps%mqgrid_ff,nkpg,npw_k,&
976 : 20 : Psps%ntypat,Psps%pspso,Psps%qgrid_ff,rmet,Psps%usepaw,Psps%useylm,ylm_k,ylm_gr)
977 : :
978 [ - + ]: 20 : ABI_FREE(kpg_dum)
979 [ - + ]: 20 : ABI_FREE(ylm)
980 [ - + ]: 20 : ABI_FREE(ylm_gr)
981 [ - + ]: 20 : ABI_FREE(ylm_k)
982 : :
983 [ - + + - : 60 : ABI_MALLOC(modkplusg,(npw_k))
+ - + - -
+ - + ]
984 : :
985 : 20 : effmass_free=one; ecutsm=zero; ecut=HUGE(one)
986 : : ! call mkkin(ecut,ecutsm,effmass_free,gmet,kg_k,modkplusg,kpoint,npw_k)
987 : 20 : call mkkin(ecut,ecutsm,effmass_free,gmet,kg_k,modkplusg,kpoint,npw_k,0,0)
988 [ + + ]: 23700 : modkplusg(:)=SQRT(half/pi**2*modkplusg(:))
989 [ + + ]: 23700 : modkplusg(:)=MAX(modkplusg(:),tol10)
990 : :
991 : : !do ig=1,npw_k
992 : : ! kpg(:)= kpoint(:)+kg_k(:,ig)
993 : : ! modkplusg(ig) = normv(kpg,gmet,"G")
994 : : !end do
995 : :
996 : : ! Calculate matrix elements.
997 [ + + + + : 180040 : vkb=zero; vkbd=zero
+ + + + +
+ + + ]
998 : :
999 [ + + ]: 50 : do is=1,Psps%ntypat
1000 : : il0=0
1001 [ + + ]: 90 : do ilmn=1,Psps%lmnmax
1002 : 40 : il=1+Psps%indlmn(1,ilmn,is)
1003 : 40 : in=Psps%indlmn(3,ilmn,is)
1004 [ + - ]: 70 : if ((il/=il0).and.(in==1)) then
1005 : 40 : il0=il
1006 [ + - ]: 40 : if (ABS(Psps%ekb(ilmn,is))>1.0d-10) then
1007 [ + + ]: 40 : if (il==1) then
1008 [ + + ]: 42560 : vkb (1:npw_k,is,il) = ffnl(:,1,ilmn,is)
1009 [ + + ]: 42560 : vkbd(1:npw_k,is,il) = ffnl(:,2,ilmn,is)*modkplusg(:)/two_pi
1010 [ + - ]: 10 : else if (il==2) then
1011 [ + + ]: 4840 : vkb(1:npw_k,is,il) = ffnl(:,1,ilmn,is)*modkplusg(:)
1012 [ + + ]: 4840 : do ig=1,npw_k
1013 : : vkbd(ig,is,il) = ((ffnl(ig,2,ilmn,is)*modkplusg(ig)*modkplusg(ig))+&
1014 : 4840 : ffnl(ig,1,ilmn,is) )/two_pi
1015 : : end do
1016 [ # # ]: 0 : else if (il==3) then
1017 [ # # ]: 0 : vkb (1:npw_k,is,il) = ffnl(:,1,ilmn,is)*modkplusg(:)**2
1018 : : vkbd(1:npw_k,is,il) = (ffnl(:,2,ilmn,is)*modkplusg(:)**3+&
1019 [ # # ]: 0 : 2*ffnl(:,1,ilmn,is)*modkplusg(:) )/two_pi
1020 [ # # ]: 0 : else if (il==4) then
1021 [ # # ]: 0 : vkb (1:npw_k,is,il) = ffnl(:,1,ilmn,is)*modkplusg(:)**3
1022 : : vkbd(1:npw_k,is,il) = (ffnl(:,2,ilmn,is)*modkplusg(:)**4+&
1023 [ # # ]: 0 : 3*ffnl(:,1,ilmn,is)*modkplusg(:)**2 )/two_pi
1024 : : end if
1025 [ + + ]: 47400 : vkb (:,is,il) = SQRT(4*pi/ucvol*(2*il-1)*ABS(Psps%ekb(ilmn,is)))*vkb (:,is,il)
1026 [ + + ]: 47400 : vkbd(:,is,il) = SQRT(4*pi/ucvol*(2*il-1)*ABS(Psps%ekb(ilmn,is)))*vkbd(:,is,il)
1027 : : else
1028 [ # # ]: 0 : vkb (:,is,il)=zero
1029 [ # # ]: 0 : vkbd(:,is,il)=zero
1030 : : end if
1031 : : end if
1032 : : end do
1033 : : end do
1034 : :
1035 [ - + ]: 20 : ABI_FREE(ffnl)
1036 [ - + ]: 20 : ABI_FREE(modkplusg)
1037 : :
1038 : : DBG_EXIT("COLL")
1039 : :
1040 : 20 : end subroutine kss_calc_vkb
1041 : : !!***
1042 : :
1043 : : !!****f* m_io_kss/outkss
1044 : : !! NAME
1045 : : !! outkss
1046 : : !!
1047 : : !! FUNCTION
1048 : : !! This routine creates an output file containing the Kohn-Sham electronic Structure
1049 : : !! for a large number of eigenstates (energies and eigen-functions).
1050 : : !! The resulting file (_KSS) is needed for a GW post-treatment.
1051 : : !!
1052 : : !! The routine drives the following operations:
1053 : : !! - Re-ordering G-vectors according to stars (sets of Gs related by symmetry operations).
1054 : : !! A set of g for all k-points is created.
1055 : : !! - Creating and opening the output "_KSS'" file
1056 : : !! - Printing out output file header information...
1057 : : !! ... and, for each k-point:
1058 : : !! According to 'kssform', either
1059 : : !! - Re-computing <G|H|G_prim> matrix elements for all (G, G_prim).
1060 : : !! Diagonalizing H in the plane-wave basis.
1061 : : !! or - Taking eigenvalues/vectors from congugate-gradient ones.
1062 : : !! - Writing out eigenvalues and eigenvectors.
1063 : : !!
1064 : : !! INPUTS
1065 : : !! cg(2,mcg)=planewave coefficients of wavefunctions.
1066 : : !! usecprj=1 if cprj datastructure has been allocated (ONLY PAW)
1067 : : !! Cprj(natom,mcprj*usecprj) <type(pawcprj_type)>=
1068 : : !! projected input wave functions <Proj_i|Cnk> with all NL projectors (only for PAW)
1069 : : !! NOTE that Cprj are unsorted, see ctoprj.F90
1070 : : !! Dtfil <type(datafiles_type)>=variables related to files
1071 : : !! Dtset <type(dataset_type)>=all input variables for this dataset
1072 : : !! ecut=cut-off energy for plane wave basis sphere (Ha)
1073 : : !! eigen(mband*nkpt*nsppol)=array for holding eigenvalues (hartree)
1074 : : !! gmet(3,3)=reciprocal space metric tensor in bohr**-2.
1075 : : !! gprimd(3,3)=dimensional reciprocal space primitive translations
1076 : : !! Hdr <type(hdr_type)>=the header of wf, den and pot files
1077 : : !! kssform=govern the Kohn-Sham Structure file format
1078 : : !! mband=maximum number of bands
1079 : : !! mcg=size of wave-functions array (cg) =mpw*nspinor*mband*mkmem*nsppol
1080 : : !! mcprj=size of projected wave-functions array (cprj) =nspinor*mband*mkmem*nsppol
1081 : : !! mgfft=maximum size of 1D FFTs
1082 : : !! mkmem =number of k points treated by this node.
1083 : : !! MPI_enreg=information about MPI parallelization
1084 : : !! mpsang= 1+maximum angular momentum for nonlocal pseudopotentials
1085 : : !! mpw=maximum dimensioned size of npw.
1086 : : !! my_natom=number of atoms treated by current processor
1087 : : !! natom=number of atoms in cell.
1088 : : !! nfft=(effective) number of FFT grid points (for this processor)
1089 : : !! nkpt=number of k points.
1090 : : !! npwarr(nkpt)=number of planewaves in basis at this k point
1091 : : !! nsppol=1 for unpolarized, 2 for spin-polarized
1092 : : !! nspden=number of density components
1093 : : !! nsym=number of symmetries in space group
1094 : : !! ntypat=number of types of atoms in unit cell.
1095 : : !! occ(mband*nkpt*nsppol)=occupation number for each band (usually 2) for each k.
1096 : : !! Pawtab(Psps%ntypat*Psps%usepaw) <type(pawtab_type)>=paw tabulated starting data
1097 : : !! Pawfgr<pawfgr_type>=fine grid parameters and related data
1098 : : !! prtvol=control print volume and debugging output
1099 : : !! Psps <type(pseudopotential_type)>=variables related to pseudopotentials
1100 : : !! rprimd(3,3)=dimensional primitive translations for real space (bohr)
1101 : : !! vtrial(nfft,nspden)=the trial potential
1102 : : !! xred(3,natom)=reduced dimensionless atomic coordinates
1103 : : !!
1104 : : !! OUTPUT
1105 : : !! Output is written on file.
1106 : : !! ierr=Status error.
1107 : : !!
1108 : : !! NOTES
1109 : : !!
1110 : : !! * This routine is maintained for legacy reasons. Abinit8 is not able to read KSS files
1111 : : !! anymore hence KSS files should be used only to interface Abinit with external codes
1112 : : !! that are still using the old KSS format.
1113 : : !!
1114 : : !! * The routine can be time consuming (in particular when computing
1115 : : !! <G|H|G_prim> elements for all (G, G_prim)) (kssform=1).
1116 : : !! So, it is recommended to call it once per run...
1117 : : !!
1118 : : !! * The IO code is not parallelized and this represents a serious bottleneck when np is large.
1119 : : !!
1120 : : !! * when kssform==1, the routine RE-computes all Hamiltonian terms.
1121 : : !! So it is equivalent to an additional electronic SC cycle.
1122 : : !! (This has no effect is convergence was reach...
1123 : : !! If not, eigenvalues/vectors may differs from the congugaste gradient ones)
1124 : : !!
1125 : : !! * The KB form factors and derivatives are not calculated correctly if there are
1126 : : !! pseudos with more than one projector in an angular momentum channel.
1127 : : !!
1128 : : !! * In the ETSF output format (Dtset%iomode == 3), the complete symmetry set
1129 : : !! is output. So, if reading programs need only the symmorphic symmetries, they
1130 : : !! will need to remove themselves the non-symmorphic ones.
1131 : : !!
1132 : : !! * There exists two file formats:
1133 : : !! kssform==1 diagonalized file _KSS in real(dp) is generated.
1134 : : !! kssform==3 same as kssform=1 but the wavefunctions are not diagonalized
1135 : : !! (they are taken from conjugate-gradient ones)
1136 : : !! Old kssform=0 and kssform=2 are obsolete and no longer available
1137 : : !!
1138 : : !! TESTS
1139 : : !! * ETSF_IO output is tested in tests/etsf_io/t02.
1140 : : !!
1141 : : !! SOURCE
1142 : :
1143 : 6 : subroutine outkss(crystal,Dtfil,Dtset,ecut,gmet,gprimd,Hdr,&
1144 : : & kssform,mband,mcg,mcprj,mgfft,mkmem,MPI_enreg,mpsang,mpw,my_natom,natom,&
1145 : 6 : & nfft,nkpt,npwarr,nspden,nsppol,nsym,ntypat,occ,Pawtab,Pawfgr,Paw_ij,&
1146 : 6 : & prtvol,Psps,rprimd,vtrial,xred,cg,usecprj,Cprj,eigen,ierr)
1147 : :
1148 : : use m_linalg_interfaces
1149 : :
1150 : : !Arguments ------------------------------------
1151 : : !scalars
1152 : : integer,intent(in) :: kssform,mband,mcg,mcprj,mgfft,mkmem,mpsang,mpw,my_natom,natom,usecprj
1153 : : integer,intent(in) :: nfft,nkpt,nsppol,nspden,nsym,ntypat,prtvol
1154 : : integer,intent(out) :: ierr
1155 : : real(dp),intent(in) :: ecut
1156 : : type(MPI_type),intent(inout) :: MPI_enreg
1157 : : type(Datafiles_type),intent(in) :: Dtfil
1158 : : type(Dataset_type),intent(in) :: Dtset
1159 : : type(Hdr_type),intent(inout) :: Hdr
1160 : : type(Pseudopotential_type),intent(in) :: Psps
1161 : : type(pawfgr_type), intent(in) :: Pawfgr
1162 : : type(crystal_t),intent(in) :: crystal
1163 : : !arrays
1164 : : integer,intent(in),target :: npwarr(nkpt)
1165 : : real(dp),intent(in) :: gmet(3,3),gprimd(3,3),occ(mband*nkpt*nsppol)
1166 : : real(dp),intent(in) :: rprimd(3,3)
1167 : : real(dp),intent(inout) :: vtrial(nfft,nspden)
1168 : : real(dp),intent(in) :: xred(3,natom)
1169 : : real(dp),intent(in) :: cg(2,mcg),eigen(mband*nkpt*nsppol)
1170 : : type(pawcprj_type),intent(in) :: Cprj(natom,mcprj*usecprj)
1171 : : type(Pawtab_type),intent(in) :: Pawtab(Psps%ntypat*Psps%usepaw)
1172 : : type(paw_ij_type),intent(inout),target :: Paw_ij(my_natom*Psps%usepaw)
1173 : :
1174 : : !Local variables-------------------------------
1175 : : !scalars
1176 : : integer,parameter :: tim_rwwf=0,bufnb=20
1177 : : integer :: untkss,onband_diago
1178 : : integer :: bdtot_index,i,ib,ibp,iomode
1179 : : integer :: ibsp,ibsp1,ibsp2,ibg,ig,ii,ikpt
1180 : : integer :: master,receiver,sender,spinor_shift1,shift
1181 : : integer :: ishm,ispinor,isppol,istwf_k,my_rank,j
1182 : : integer :: k_index,maxpw,mproj,mtag,n1,n2,n2dim,n3,n4,n5,n6,nband_k
1183 : : integer :: nbandkss_k,nbandksseff,nbase,nprocs,npw_k,onpw_k,npwkss
1184 : : integer :: nrst1,nrst2,nsym2,ntemp,pinv,sizepw,spaceComm,comm_self
1185 : : integer :: pad1,pad2
1186 : : integer :: bufrt,bufsz
1187 : : real(dp) :: cinf=1.0e24,csup=zero,einf=1.0e24,esup=zero
1188 : : real(dp) :: norm,cfact,ecut_eff
1189 : : logical :: do_diago,found,ltest,lhack
1190 : : logical,parameter :: skip_test_ortho=.FALSE.
1191 : : character(len=500) :: msg
1192 : : character(len=80) :: frmt1,frmt2
1193 : : character(len=10) :: stag(2)=(/' ',' '/)
1194 : : !arrays
1195 : 12 : integer :: nbandkssk(nkpt)
1196 : 6 : integer,pointer :: symrel2(:,:,:)
1197 : 6 : integer,pointer :: gbig(:,:)
1198 : 6 : integer,pointer :: shlim(:)
1199 : 6 : integer,allocatable :: kg_k(:,:)
1200 : 6 : integer,allocatable :: dimlmn(:)
1201 : : integer :: nattyp_dum(0)
1202 : : real(dp) :: ovlp(2),kpoint(3),tsec(2)
1203 : 6 : real(dp),pointer :: tnons2(:,:)
1204 : 6 : real(dp),allocatable :: ene(:)
1205 : 6 : real(dp),pointer :: eig_ene(:),eig_vec(:,:,:)
1206 : 6 : real(dp),allocatable :: occ_k(:)
1207 : 6 : real(dp),allocatable,target :: wfg(:,:,:)
1208 : 6 : real(dp),contiguous, pointer :: ug1(:,:),ug2(:,:)
1209 : 6 : type(pawcprj_type),allocatable :: Cprjnk_k(:,:)
1210 : 6 : type(pawcprj_type),pointer :: Cprj_diago_k(:,:)
1211 : : type(ddiago_ctl_type) :: Diago_ctl
1212 : 6 : type(paw_ij_type),pointer :: Paw_ij_all(:)
1213 : : ! *********************************************************************
1214 : :
1215 : : ABI_UNUSED(mkmem)
1216 : :
1217 : : DBG_ENTER("COLL")
1218 : :
1219 : 6 : call timab(933,1,tsec) ! outkss
1220 : 6 : call timab(934,1,tsec) ! outkss(Gsort+hd)
1221 : :
1222 : 6 : spaceComm=MPI_enreg%comm_cell
1223 : 6 : my_rank=xmpi_comm_rank(spaceComm)
1224 : 6 : nprocs=xmpi_comm_size(spaceComm)
1225 : 6 : master=0
1226 : :
1227 : 6 : iomode = Dtset%iomode
1228 : 6 : nullify(eig_ene)
1229 : 6 : nullify(eig_vec)
1230 : 6 : nullify(Cprj_diago_k)
1231 : :
1232 : : ! JB: Valgrind complains about non initialized value. Set to -1 so if an array
1233 : : ! should be allocated with this "unintialized value" it crashes
1234 : 6 : onband_diago = -1
1235 : :
1236 : : !MG: since in seq case MPI_enreg%proc_distrb is not defined
1237 : : !we hack a bit the data type in order to get rid of MPI preprocessing options.
1238 : : !The previous status of %proc_distrb is restored before exiting.
1239 : : !Note that in case of seq run MPI_enreg%proc_distrb is nullified at the very beginning of abinit.F90
1240 : : !
1241 : : !FIXME this is a design flaw that should be solved: proc_distrb should always
1242 : : !be allocated and filled with my_rank in case of sequential run otherwise checks like
1243 : : !if (nprocs>1.and.MPI_enreg%proc_distrb(ii)==me) leads to SIGFAULT under gfortran.
1244 : : !as the second array is not allocated.
1245 : 6 : lhack=.FALSE.
1246 [ + + ]: 6 : if (nprocs==1) then
1247 : 2 : ltest=allocated(MPI_enreg%proc_distrb)
1248 [ - + ]: 2 : if (.not.ltest) then
1249 [ # # # # : 0 : ABI_MALLOC(MPI_enreg%proc_distrb,(nkpt,mband,nsppol))
# # # # #
# # # # #
# # # # #
# # # ]
1250 [ # # # # : 0 : MPI_enreg%proc_distrb=my_rank
# # ]
1251 : : lhack=.TRUE.
1252 : : end if
1253 [ + + + + : 213 : ltest=ALL(MPI_enreg%proc_distrb==my_rank)
+ + + - ]
1254 [ - + ]: 2 : ABI_CHECK(ltest,'wrong values in %proc_distrb')
1255 : : end if
1256 : : !
1257 : : !============================
1258 : : !==== Perform some tests ====
1259 : : !============================
1260 : 6 : ierr=0
1261 : :
1262 [ + - ]: 6 : if (iomode==IO_MODE_ETSF) then
1263 : : write(msg,'(3a)')&
1264 : 6 : & 'when iomode==3 in outkss, support for netcdf ',ch10,&
1265 : 12 : & 'must be compiled. Use --enable-netcdf when configuring '
1266 : : end if
1267 : :
1268 [ + + ]: 6 : if (kssform==3) then
1269 : 5 : write(msg,'(a,70("="),4a)')ch10,ch10,&
1270 : 5 : & ' Calculating and writing out Kohn-Sham electronic Structure file',ch10, &
1271 : 10 : & ' Using conjugate gradient wavefunctions and energies (kssform=3)'
1272 [ + - ]: 1 : else if (kssform==1) then
1273 : 1 : write(msg,'(a,70("="),4a,i1,a)') ch10,ch10, &
1274 : 1 : & ' Calculating and writing out Kohn-Sham electronic Structure file',ch10, &
1275 : 2 : & ' Using diagonalized wavefunctions and energies (kssform=',kssform,')'
1276 : : else
1277 : : write(msg,'(a,i0,2a)')&
1278 : 0 : & " Unsupported value for kssform: ",kssform,ch10,&
1279 : 0 : & " Program does not stop but _KSS file will not be created..."
1280 : 0 : ierr=ierr+1
1281 : : end if
1282 : 6 : call wrtout(std_out,msg,'COLL')
1283 : 6 : call wrtout(ab_out,msg,'COLL')
1284 : : !
1285 : : !* Check whether nband is constant in metals
1286 [ + + + - : 70 : if ( (Dtset%occopt>=2.and.Dtset%occopt<=8) .and. (ANY(Dtset%nband(1:nkpt*nsppol)/=Dtset%nband(1))) ) then
+ + - + ]
1287 : : write(msg,'(3a,i4,a,i3,a,i4,3a)')&
1288 : 0 : & ' The number of bands must be the same for all k-points ',ch10,&
1289 : 0 : & ' but nband(1)=',Dtset%nband(1),' is different of nband(',&
1290 : 0 : & ikpt+(isppol-1)*nkpt,')=',Dtset%nband(ikpt+(isppol-1)*nkpt),'.',ch10,&
1291 : 0 : & ' Program does not stop but _KSS file will not be created...'
1292 : 0 : ABI_WARNING(msg)
1293 : 0 : ierr=ierr+1
1294 : : end if
1295 : : !* istwfk must be 1 for each k-point
1296 [ + + + - : 70 : if (ANY(Dtset%istwfk(1:nkpt)/=1).and.kssform/=3) then
- + - - ]
1297 : : write(msg,'(7a)')&
1298 : 0 : & ' istwfk/=1 not allowed when kssform/=3 :',ch10,&
1299 : 0 : & ' States output not programmed for time-reversal symmetry.',ch10,&
1300 : 0 : & ' Action : change istwfk in input file (put it to 1 for all kpt).',ch10,&
1301 : 0 : & ' Program does not stop but _KSS file will not be created...'
1302 : 0 : ABI_WARNING(msg)
1303 : 0 : ierr=ierr+1
1304 : : end if
1305 : : !* Check spin-orbit
1306 [ - + ]: 6 : if (Psps%mpssoang/=mpsang) then
1307 : : write(msg,'(3a)')&
1308 : 0 : & ' Variable mpspso should be 1 !',ch10,&
1309 : 0 : & ' Program does not stop but _KSS file will not be created...'
1310 : 0 : ABI_WARNING(msg)
1311 : 0 : ierr=ierr+1
1312 : : end if
1313 : : !* Check mproj
1314 [ + + + + ]: 89 : mproj=MAXVAL(Psps%indlmn(3,:,:))
1315 [ + + - + ]: 6 : if (mproj>1.and.Psps%usepaw==0) then ! TODO One has to derive the expression for [Vnl,r], in particular HGH and GTH psps
1316 : 0 : write(msg,'(8a)')ch10,&
1317 : 0 : & ' outkss : COMMENT - ',ch10,&
1318 : 0 : & ' At least one NC pseudopotential has more that one projector per angular channel',ch10,&
1319 : 0 : & ' Note that inclvkb==0 should be used in screening, since the evaluation of the commutator',ch10,&
1320 : 0 : & ' for this particular case is not implemented yet'
1321 : 0 : call wrtout(std_out,msg,'COLL')
1322 : 0 : call wrtout(ab_out,msg,'COLL')
1323 : : end if
1324 : : !* Check max angular momentum
1325 [ + + + + : 89 : if (MAXVAL(Psps%indlmn(1,:,:))+1 >= 5) then
- + ]
1326 : : write(msg,'(3a)')&
1327 : 0 : & ' Pseudopotentials with f-projectors not implemented',ch10,&
1328 : 0 : & ' Program does not stop but _KSS file will not be created...'
1329 : 0 : ABI_WARNING(msg)
1330 : 0 : ierr=ierr+1
1331 : : end if
1332 : : !* Check useylm
1333 [ + + - + ]: 6 : if (Psps%useylm/=0.and.Psps%usepaw==0) then
1334 : : write(msg,'(3a)')&
1335 : 0 : & ' The present version of outkss does not work with useylm/=0 !',ch10,&
1336 : 0 : & ' Program does not stop but _KSS file will not be created...'
1337 : 0 : ABI_WARNING(msg)
1338 : 0 : ierr=ierr+1
1339 : : end if
1340 : : !* Check PAW and kssform value
1341 [ + + ]: 6 : if (Psps%usepaw/=0) then
1342 [ + - - + ]: 4 : if (nprocs>1.and.kssform==1) then
1343 : : write(msg,'(3a)')&
1344 : 0 : & ' Parallel PAW with kssform=1, not yet allowed',ch10,&
1345 : 0 : & ' Program does not stop but _KSS file will not be created...'
1346 : 0 : ABI_WARNING(msg)
1347 : 0 : ierr=ierr+1
1348 : : end if
1349 [ + - - + ]: 4 : if (kssform==3.and.usecprj/=1) then
1350 : : write(msg,'(3a)')&
1351 : 0 : & ' If PAW and kssform=3, usecprj must be 1',ch10,&
1352 : 0 : & ' Program does not stop but _KSS file will not be created...'
1353 : 0 : ABI_WARNING(msg)
1354 : 0 : ierr=ierr+1
1355 : : end if
1356 : : end if
1357 : : !* Check parallelization
1358 [ - + ]: 6 : if (MPI_enreg%paralbd/=0) then
1359 : : write(msg,'(3a)')&
1360 : 0 : & ' outkss cannot be used with parallelization on bands (paralbd/=0) !',ch10,&
1361 : 0 : & ' Program does not stop but _KSS file will not be created...'
1362 : 0 : ABI_WARNING(msg)
1363 : 0 : ierr=ierr+1
1364 : : end if
1365 [ - + ]: 6 : if (MPI_enreg%paral_spinor/=0) then
1366 : : write(msg,'(3a)')&
1367 : 0 : & ' outkss cannot be used yet with parallelization on nspinors !',ch10,&
1368 : 0 : & ' Program does not stop but _KSS file will not be created...'
1369 : 0 : ABI_WARNING(msg)
1370 : 0 : ierr=ierr+1
1371 : :
1372 : : endif
1373 [ - + ]: 6 : if (ierr/=0) then
1374 : : write(msg,'(3a)')&
1375 : 0 : & ' outkss: Not allowed options found !',ch10,&
1376 : 0 : & ' Program does not stop but _KSS file will not be created...'
1377 : 0 : call wrtout(std_out,msg,'COLL')
1378 : 0 : call wrtout(ab_out,msg,'COLL')
1379 : 0 : write(msg,'(a)')' outkss: see the log file for more information.'
1380 : 0 : call wrtout(ab_out,msg,'COLL')
1381 : 0 : RETURN ! Houston we have a problem!
1382 : : end if
1383 : : !
1384 : : !Estimate required memory in case of diagonalization.
1385 : : !TODO to be modified to take into account the case nsppol=2
1386 [ + + ]: 6 : if (kssform/=3) then
1387 : 1 : call memkss(mband,mgfft,mproj,Psps%mpssoang,mpw,natom,Dtset%ngfft,nkpt,dtset%nspinor,nsym,ntypat)
1388 : : end if
1389 : : !
1390 : : !=== Initialize some variables ===
1391 [ - + - - ]: 6 : if (nsppol==2) stag(:)=(/'SPIN UP: ','SPIN DOWN:'/)
1392 : 6 : n1=Dtset%ngfft(1); n2=Dtset%ngfft(2); n3=Dtset%ngfft(3)
1393 : 6 : n4=Dtset%ngfft(4); n5=Dtset%ngfft(5); n6=Dtset%ngfft(6)
1394 : 6 : ecut_eff = ecut * Dtset%dilatmx**2 ! Use ecut_eff instead of ecut_eff since otherwise
1395 : : !one cannot restart from a previous density file
1396 : 6 : sizepw=2*mpw ; do_diago=(kssform/=3)
1397 [ + + + - : 18 : ABI_MALLOC(dimlmn,(natom*Psps%usepaw))
+ - + + -
+ - + ]
1398 [ + + ]: 6 : if (Psps%usepaw==1) then
1399 : 4 : call pawcprj_getdim(dimlmn,natom,nattyp_dum,ntypat,Dtset%typat,pawtab,'R')
1400 : : end if
1401 : : !
1402 : : !============================================================
1403 : : !=== Prepare set containing all G-vectors sorted by stars ===
1404 : : !============================================================
1405 : 6 : write(msg,'(2a)')ch10,' Sorting g-vecs for an output of states on an unique "big" PW basis.'
1406 : 6 : call wrtout(std_out,msg,'COLL')
1407 : : !
1408 : : !=== Analyze symmetry operations ===
1409 [ - + ]: 6 : if (Dtset%symmorphi==0) then ! Old (Obsolete) implementation: Suppress inversion from symmetries list:
1410 : 0 : nullify(symrel2,tnons2)
1411 : 0 : call remove_inversion(nsym,Dtset%symrel,Dtset%tnons,nsym2,symrel2,tnons2,pinv)
1412 [ # # # # : 0 : if (ANY(ABS(tnons2(:,1:nsym2))>tol8)) then
# # # # ]
1413 : : write(msg,'(3a)')&
1414 : 0 : & ' Non-symmorphic operations still remain in the symmetries list ',ch10,&
1415 : 0 : & ' Program does not stop but _KSS file will not be created...'
1416 : 0 : ABI_WARNING(msg)
1417 : 0 : ierr=ierr+1 ; RETURN
1418 : : end if
1419 [ + - ]: 6 : else if (Dtset%symmorphi==1) then
1420 : : ! If in the input file symmorphi==1 all the symmetry operations are retained:
1421 : : ! both identity and inversion (if any) as well as non-symmorphic operations.
1422 : 6 : nsym2=nsym ; pinv=1
1423 [ - + + - : 18 : ABI_MALLOC(symrel2,(3,3,nsym))
+ - + - -
+ - + ]
1424 [ - + + - : 18 : ABI_MALLOC(tnons2,(3,nsym))
+ - + - -
+ - + ]
1425 [ + + + + : 3750 : symrel2(:,:,:)=Dtset%symrel(:,:,1:nsym)
+ + ]
1426 [ + + + + ]: 1158 : tnons2(:,:) =Dtset%tnons(:,1:nsym)
1427 : : else
1428 : : write(msg,'(a,i4,3a)')&
1429 : 0 : & ' symmorphi = ',Dtset%symmorphi,' while it must be 0 or 1',ch10,&
1430 : 0 : & ' Program does not stop but KSS file will not be created...'
1431 : 0 : ABI_WARNING(msg)
1432 : 0 : ierr=ierr+1 ; RETURN
1433 : : end if
1434 : : !
1435 : : !===================================================================
1436 : : !==== Merge the set of k-centered G-spheres into a big set gbig ====
1437 : : !===================================================================
1438 : : !* Vectors in gbig are ordered by shells
1439 : : !
1440 : 6 : nullify(gbig,shlim)
1441 [ - + ]: 6 : call merge_and_sort_kg(nkpt,Dtset%kptns,ecut_eff,nsym2,pinv,symrel2,gprimd,gbig,prtvol,shlim_p=shlim)
1442 : :
1443 : 6 : nbase = SIZE(shlim) ! Number of independent G in the big sphere.
1444 : 6 : maxpw = shlim(nbase) ! Total number of G"s in the big sphere.
1445 : : !
1446 : : !* Determine optimal number of bands and G"s to be written.
1447 : 6 : npwkss=Dtset%npwkss
1448 [ + - ]: 6 : if ((npwkss==0).or.(npwkss>=maxpw)) then
1449 : 6 : npwkss=maxpw
1450 : : write(msg,'(5a)')&
1451 : 6 : & ' Since the number of g''s to be written on file',ch10,&
1452 : 6 : & ' was 0 or too large, it has been set to the max. value.,',ch10,&
1453 : 12 : & ' computed from the union of the sets of G vectors for the different k-points.'
1454 : 6 : call wrtout(std_out,msg,'COLL')
1455 : : end if
1456 : :
1457 : 6 : ishm=0
1458 [ + + ]: 212 : do ii=1,nbase
1459 [ + - ]: 212 : if (shlim(ii)<=npwkss) then
1460 : 206 : ishm=ii
1461 : : else
1462 : : EXIT
1463 : : end if
1464 : : end do
1465 : :
1466 [ - + ]: 6 : if (shlim(ishm)/=npwkss) then
1467 : 0 : nrst1=shlim(ishm)
1468 : 0 : nrst2=MIN0(shlim(MIN0(ishm+1,nbase)),maxpw)
1469 [ # # ]: 0 : if (IABS(npwkss-nrst2)<IABS(npwkss-nrst1)) nrst1=nrst2
1470 : 0 : npwkss=nrst1
1471 [ # # ]: 0 : if (shlim(ishm)<npwkss) ishm=ishm+1
1472 : : write(msg,'(3a)')&
1473 : 0 : & ' The number of G''s to be written on file is not a whole number of stars ',ch10,&
1474 : 0 : & ' the program set it to the nearest star limit.'
1475 : 0 : call wrtout(std_out,msg,'COLL')
1476 : : end if
1477 : :
1478 : 6 : write(msg,'(a,i5)')' Number of g-vectors written on file is: ',npwkss
1479 : 6 : call wrtout(std_out,msg,'COLL')
1480 : : !
1481 : : !=== Check on the number of stored bands ===
1482 [ + + ]: 6 : if (do_diago) then
1483 : :
1484 [ + - - + ]: 1 : if (Dtset%nbandkss==-1.or.Dtset%nbandkss>=maxpw) then
1485 [ # # ]: 0 : nbandkssk(1:nkpt)=npwarr(1:nkpt)
1486 : 0 : write(msg,'(6a)')ch10,&
1487 : 0 : & ' Since the number of bands to be computed was (-1) or',ch10,&
1488 : 0 : & ' too large, it has been set to the max. value. allowed for each k,',ch10,&
1489 : 0 : & ' thus, the minimum of the number of plane waves for each k point.'
1490 : 0 : call wrtout(std_out,msg,'COLL')
1491 : : else
1492 [ + + ]: 11 : nbandkssk(1:nkpt)=Dtset%nbandkss
1493 : 1 : found=.FALSE.
1494 [ + + ]: 11 : do ikpt=1,nkpt
1495 [ - + ]: 11 : if (Dtset%nbandkss>npwarr(ikpt)) then
1496 : 0 : nbandkssk(ikpt)=npwarr(ikpt)
1497 : 0 : found=.TRUE.
1498 : : end if
1499 : : end do
1500 [ - + ]: 1 : if (found) then
1501 : : write(msg,'(7a)')&
1502 : 0 : & ' The value choosen for the number of bands in file',ch10,&
1503 : 0 : & ' (nbandkss) was greater than at least one number of plane waves ',ch10,&
1504 : 0 : & ' for a given k-point (npw_k).',ch10,' It has been modified consequently.'
1505 : 0 : ABI_WARNING(msg)
1506 : : end if
1507 : : end if
1508 : 1 : found=.FALSE.
1509 [ + + ]: 11 : do ikpt=1,nkpt
1510 [ - + ]: 11 : if (nbandkssk(ikpt)>npwkss) then
1511 : 0 : nbandkssk(ikpt)=npwkss
1512 : 0 : found=.TRUE.
1513 : : end if
1514 : : end do
1515 [ - + ]: 1 : if (found) then
1516 : : write(msg,'(5a)')&
1517 : 0 : & ' The number of bands to be computed (for one k) was',ch10,&
1518 : 0 : & ' greater than the number of g-vectors to be written.',ch10,&
1519 : 0 : & ' It has been modified consequently.'
1520 : 0 : ABI_WARNING(msg)
1521 : : end if
1522 [ + + ]: 11 : nbandksseff=MINVAL(nbandkssk)
1523 : :
1524 : : else ! .not. do_diago
1525 [ + + ]: 59 : do ikpt=1,nkpt
1526 [ + + ]: 113 : do isppol=1,nsppol
1527 : 108 : nbandkssk(ikpt)=Dtset%nband(ikpt+(isppol-1)*nkpt)
1528 : : end do
1529 : : end do
1530 [ + + ]: 59 : nbandksseff=MINVAL(nbandkssk)
1531 [ + - - + ]: 5 : if (Dtset%nbandkss>0 .and. Dtset%nbandkss<nbandksseff) then
1532 : : write(msg,'(a,i5,a,i5,2a)')&
1533 : 0 : & ' Number of bands calculated=',nbandksseff,', greater than nbandkss=',Dtset%nbandkss,ch10,&
1534 : 0 : & ' will write nbandkss bands on the KSS file'
1535 : 0 : ABI_COMMENT(msg)
1536 : 0 : nbandksseff=Dtset%nbandkss
1537 : : end if
1538 : : end if
1539 : :
1540 : 6 : write(msg,'(a,i5)')' Number of bands written on file is: ',nbandksseff
1541 : 6 : call wrtout(std_out,msg,'COLL')
1542 : :
1543 [ + - - + ]: 6 : found= ANY(nbandkssk(1:nkpt)<npwarr(1:nkpt))
1544 : :
1545 [ + + ]: 6 : if (do_diago) then
1546 [ + - ]: 1 : if (found) then
1547 : 1 : write(msg,'(6a)')ch10,&
1548 : 1 : & ' Since the number of bands to be computed',ch10,&
1549 : 1 : & ' is less than the number of G-vectors found,',ch10,&
1550 : 2 : & ' the program will perform partial diagonalizations.'
1551 : : else
1552 : 0 : write(msg,'(6a)')ch10,&
1553 : 0 : & ' Since the number of bands to be computed',ch10,&
1554 : 0 : & ' is equal to the nb of G-vectors found for each k-pt,',ch10,&
1555 : 0 : & ' the program will perform complete diagonalizations.'
1556 : : end if
1557 : 1 : call wrtout(std_out,msg,'COLL')
1558 : : end if
1559 : : !
1560 : : !==========================================================================
1561 : : !=== Open KSS file for output, write header with dimensions and kb sign ===
1562 : : !==========================================================================
1563 : : !
1564 : : !* Output required disk space.
1565 : 6 : call dsksta(ishm,Psps%usepaw,nbandksseff,mpsang,natom,ntypat,npwkss,nkpt,dtset%nspinor,nsppol,nsym2,dimlmn)
1566 : :
1567 [ + + ]: 6 : if (my_rank==master) then
1568 : : call write_kss_header(dtfil%fnameabo_kss,npwkss,ishm,nbandksseff,mband,nsym2,symrel2,tnons2,occ,gbig,shlim,&
1569 [ - + - + : 3 : & crystal,Dtset,Hdr,Psps,iomode,untkss)
- + - + ]
1570 : : end if
1571 : :
1572 [ - + ]: 6 : ABI_FREE(shlim)
1573 : :
1574 [ + + ]: 6 : if ( do_diago) msg = ' Diagonalized eigenvalues'
1575 : 5 : if (.not.do_diago) msg = ' Conjugate gradient eigenvalues'
1576 : 6 : call wrtout(ab_out,msg,'COLL')
1577 : :
1578 [ - + ]: 6 : if (Dtset%enunit==1) then
1579 : 0 : msg=' k eigenvalues [eV]'
1580 : : else
1581 : 6 : msg=' k eigenvalues [Hartree]'
1582 : : end if
1583 : 6 : call wrtout(ab_out,msg,'COLL')
1584 : : !
1585 : : !=== In case of PAW distributed atomic sites, need to retrieve the full paw_ij%dij ===
1586 [ + + - + : 6 : if (do_diago.and.Psps%usepaw==1.and.MPI_enreg%nproc_atom>1) then
- - ]
1587 [ # # # # : 0 : ABI_MALLOC(Paw_ij_all,(dtset%natom))
# # # # #
# # # #
# ]
1588 : 0 : call paw_ij_gather(Paw_ij,Paw_ij_all,-1,MPI_enreg%comm_atom)
1589 : : else
1590 : 6 : paw_ij_all => paw_ij
1591 : : end if
1592 : :
1593 : :
1594 : 6 : call timab(934,2,tsec) ! outkss(Gsort+hd)
1595 : : !
1596 : :
1597 : 6 : k_index=0; bdtot_index=0; ibg=0
1598 : :
1599 [ + + ]: 12 : do isppol=1,nsppol ! Loop over spins
1600 : : !
1601 [ + + ]: 76 : do ikpt=1,nkpt ! Loop over k-points.
1602 : 64 : call timab(935,1,tsec) ! outkss(k-Loop)
1603 : :
1604 : 64 : nband_k =Dtset%nband(ikpt+(isppol-1)*nkpt)
1605 : 64 : npw_k =npwarr(ikpt)
1606 : 64 : istwf_k =Dtset%istwfk(ikpt)
1607 [ + + ]: 256 : kpoint =Dtset%kptns(:,ikpt)
1608 : 64 : nbandkss_k=nbandkssk(ikpt)
1609 : 64 : mtag =5*(ikpt+(isppol-1)*nkpt)
1610 : :
1611 : :
1612 : : ! Get G-vectors, for this k-point.
1613 [ - + ]: 64 : call get_kg(kpoint,istwf_k,ecut_eff,gmet,onpw_k,kg_k)
1614 [ - + ]: 64 : ABI_CHECK(onpw_k==npw_k,"Mismatch in npw_k")
1615 : : !
1616 : : ! ============================================
1617 : : ! ==== Parallelism over k-points and spin ====
1618 : : ! ============================================
1619 [ + + ]: 64 : if (MPI_enreg%proc_distrb(ikpt,1,isppol)==my_rank) then
1620 : :
1621 : 31 : write(msg,'(2a,i3,3x,a)')ch10,' k-point ',ikpt,stag(isppol)
1622 : 31 : call wrtout(std_out, msg)
1623 : :
1624 [ + + ]: 31 : if (do_diago) then
1625 : : ! Direct diagonalization of the KS Hamiltonian.
1626 [ - + ]: 10 : ABI_SFREE_PTR(eig_ene)
1627 [ - + ]: 10 : ABI_SFREE_PTR(eig_vec)
1628 : 10 : comm_self = xmpi_comm_self
1629 : :
1630 : 10 : call timab(936,1,tsec)
1631 : :
1632 : : call init_ddiago_ctl(Diago_ctl,"Vectors",isppol,dtset%nspinor,ecut_eff,Dtset%kptns(:,ikpt),Dtset%nloalg,gmet,&
1633 : 10 : nband_k=nbandkssk(ikpt),effmass_free=Dtset%effmass_free,istwf_k=Dtset%istwfk(ikpt),prtvol=Dtset%prtvol)
1634 : :
1635 : : call ksdiago(Diago_ctl,nbandkssk(ikpt),Dtset%nfft,mgfft,Dtset%ngfft,natom,&
1636 : : Dtset%typat,nfft,dtset%nspinor,nspden,nsppol,Pawtab,Pawfgr,Paw_ij_all,&
1637 [ - + ]: 10 : Psps,rprimd,vtrial,xred,onband_diago,eig_ene,eig_vec,Cprj_diago_k,comm_self,ierr)
1638 : :
1639 : 10 : call timab(936,2,tsec)
1640 : : end if
1641 : :
1642 : : end if ! END of kpt+spin parallelism.
1643 : : !
1644 : : ! ===========================================================
1645 : : ! ==== Transfer data between master and the working proc ====
1646 : : ! ===========================================================
1647 : 64 : call timab(937,1,tsec) !outkss(MPI_exch)
1648 [ - + - + ]: 64 : ABI_MALLOC(Cprjnk_k,(0,0))
1649 [ + + ]: 64 : if (nprocs==1) then
1650 : :
1651 [ - + ]: 20 : if (Psps%usepaw==1) then ! Copy projectors for this k-point
1652 : 0 : n2dim=min(nbandksseff*dtset%nspinor,onband_diago)
1653 [ # # ]: 0 : if (kssform==3) n2dim=nband_k*dtset%nspinor
1654 [ # # ]: 0 : ABI_FREE(Cprjnk_k)
1655 [ # # # # : 0 : ABI_MALLOC(Cprjnk_k,(natom,n2dim))
# # # # #
# # # # #
# # # # #
# ]
1656 : 0 : call pawcprj_alloc(Cprjnk_k,0,dimlmn)
1657 [ # # ]: 0 : if (kssform==3) then
1658 : 0 : call pawcprj_copy(Cprj(:,ibg+1:ibg+dtset%nspinor*nband_k),Cprjnk_k)
1659 : : else
1660 : : !ABI_WARNING("Here I have to use onband_diago") !FIXME
1661 : 0 : call pawcprj_copy(Cprj_diago_k(:,1:n2dim),Cprjnk_k)
1662 : : end if
1663 : : end if
1664 : :
1665 : : else
1666 : : !parallel case
1667 : :
1668 : 44 : receiver=master; sender=MPI_enreg%proc_distrb(ikpt,1,isppol)
1669 : :
1670 : 44 : bufsz=nbandksseff/bufnb; bufrt=nbandksseff-bufnb*bufsz
1671 : :
1672 [ + + ]: 44 : if (my_rank==receiver.or.my_rank==sender) then
1673 : :
1674 [ + - - - ]: 19 : if (do_diago.and.(my_rank==receiver.and.my_rank/=sender)) then ! Alloc arrays if not done yet.
1675 [ # # # # : 0 : ABI_MALLOC(eig_ene,(npw_k*dtset%nspinor))
# # # # #
# # # ]
1676 [ # # # # : 0 : ABI_MALLOC(eig_vec,(2,npw_k*dtset%nspinor,nbandkssk(ikpt)))
# # # # #
# # # # #
# # ]
1677 : : end if
1678 : :
1679 : : if (.not.do_diago) then
1680 : :
1681 [ - + + - : 76 : ABI_MALLOC(eig_vec,(2,npw_k*dtset%nspinor,nbandkssk(ikpt)))
- + + - +
- + - - +
- + ]
1682 : :
1683 [ + + ]: 19 : if (my_rank==sender) then
1684 [ + + ]: 231 : do ib=1,nbandksseff
1685 : 220 : shift = k_index + (ib-1)*npw_k*dtset%nspinor
1686 [ + + ]: 102791 : do ig=1,npw_k*dtset%nspinor
1687 [ + + ]: 307900 : eig_vec(:,ig,ib)=cg(:,ig+shift)
1688 : : end do
1689 : : end do
1690 : : end if
1691 : : !
1692 : : ! In case of PAW and kssform==3, retrieve matrix elements of the PAW projectors for this k-point
1693 [ + - ]: 19 : if (Psps%usepaw==1) then
1694 : 19 : n2dim=min(nbandksseff*dtset%nspinor,onband_diago)
1695 [ + - ]: 19 : if (kssform==3) n2dim=nband_k*dtset%nspinor
1696 [ - + ]: 19 : ABI_FREE(Cprjnk_k)
1697 [ - + + - : 836 : ABI_MALLOC(Cprjnk_k,(natom,n2dim))
- + + - +
- + - - +
- + + + +
+ ]
1698 : 19 : call pawcprj_alloc(Cprjnk_k,0,dimlmn)
1699 [ + + ]: 19 : if (my_rank==sender) then
1700 [ + - ]: 11 : if (kssform==3) then
1701 : 11 : call pawcprj_copy(Cprj(:,ibg+1:ibg+dtset%nspinor*nband_k),Cprjnk_k)
1702 : : else
1703 : : !ABI_WARNING("Here I have to use onband_diago") !FIXME
1704 : 0 : call pawcprj_copy(Cprj_diago_k(:,1:n2dim),Cprjnk_k)
1705 : : end if
1706 : : end if
1707 [ + + ]: 19 : if (sender/=receiver) then
1708 : 16 : call pawcprj_mpi_exch(natom,n2dim,dimlmn,0,Cprjnk_k,Cprjnk_k,sender,receiver,spaceComm,mtag+4,ierr)
1709 : : end if
1710 : : end if ! usepaw
1711 : :
1712 : : else ! do_diago
1713 : 0 : call xmpi_exch(eig_ene,nbandksseff,sender,eig_ene,receiver,spaceComm,mtag+1,ierr)
1714 : : end if
1715 : :
1716 : : ! Exchange eigenvectors.
1717 [ + - ]: 19 : if (bufsz>0) then
1718 [ + + ]: 399 : do i=0,bufnb-1
1719 : : call xmpi_exch(eig_vec(:,:,i*bufsz+1:(i+1)*bufsz),2*npw_k*dtset%nspinor*bufsz,&
1720 : 399 : & sender,eig_vec(:,:,i*bufsz+1:(i+1)*bufsz),receiver,spaceComm,mtag+2,ierr)
1721 : : end do
1722 : : end if
1723 [ - + ]: 19 : if (bufrt>0) then
1724 : : call xmpi_exch(eig_vec(:,:,bufnb*bufsz+1:bufnb*bufsz+bufrt),2*npw_k*dtset%nspinor*bufrt,&
1725 : 0 : & sender,eig_vec(:,:,bufnb*bufsz+1:bufnb*bufsz+bufrt),receiver,spaceComm,mtag+3,ierr)
1726 : : end if
1727 : :
1728 : : end if
1729 : : end if !nprocs > 1
1730 : 64 : call timab(937,2,tsec) !outkss(MPI_exch)
1731 : :
1732 : 64 : call timab(938,1,tsec) !outkss(write)
1733 : :
1734 [ + + ]: 64 : if (my_rank==master) then ! Prepare data for writing on disk.
1735 [ - + + - : 93 : ABI_MALLOC(ene,(nbandksseff))
+ - + - -
+ - + ]
1736 [ - + + - : 124 : ABI_MALLOC(wfg,(2,npwkss*dtset%nspinor,nbandksseff))
- + + - +
- + - - +
- + ]
1737 [ + + + + : 2430991 : ene=zero; wfg=zero
+ + + + ]
1738 : :
1739 [ + + ]: 31 : if (.not.do_diago) then
1740 [ + + ]: 341 : ene(1:nbandksseff)=eigen(1+bdtot_index:nbandksseff+bdtot_index)
1741 : :
1742 [ + + ]: 21 : if (nprocs>1) then
1743 : : call k2gamma_centered(kpoint,npw_k,istwf_k,ecut_eff,kg_k,npwkss,dtset%nspinor,nbandksseff,Dtset%ngfft,gmet,&
1744 [ - + - + ]: 11 : & MPI_enreg,gbig,wfg,eig_vec=eig_vec)
1745 : : else
1746 : : call k2gamma_centered(kpoint,npw_k,istwf_k,ecut_eff,kg_k,npwkss,dtset%nspinor,nbandksseff,Dtset%ngfft,gmet,&
1747 [ - + ]: 10 : & MPI_enreg,gbig,wfg,icg=k_index,cg=cg)
1748 : : end if
1749 : :
1750 : : else ! Direct diagonalization.
1751 [ + + ]: 1010 : ene(1:nbandksseff)=eig_ene(1:nbandksseff)
1752 : :
1753 : : ! FIXME: receiver does not know Diago_ctl%npw_k
1754 : : call k2gamma_centered(kpoint,npw_k,istwf_k,ecut_eff,kg_k,npwkss,dtset%nspinor,nbandksseff,Dtset%ngfft,gmet,&
1755 [ - + - + ]: 10 : & MPI_enreg,gbig,wfg,eig_vec=eig_vec)
1756 : :
1757 : : ! * Check diagonalized eigenvalues with respect to conjugate gradient ones
1758 : 10 : ntemp=MIN(nbandksseff,nband_k)
1759 [ + + + - : 100 : if (ANY(ABS(ene(1:ntemp)-eigen(1+bdtot_index:ntemp+bdtot_index))>tol3)) then
- + ]
1760 : : write(msg,'(3a)')&
1761 : 0 : & ' The diagonalized eigenvalues differ by more than 10^-3 Hartree',ch10,&
1762 : 0 : & ' with respect to the conjugated gradient values.'
1763 : 0 : ABI_WARNING(msg)
1764 : : end if
1765 : : end if
1766 : : !
1767 : : ! * Write out energies
1768 [ - + ]: 31 : if (Dtset%enunit==1) then
1769 : 0 : cfact=Ha_eV ; frmt1='(i4,4x,9(1x,f7.2))' ; frmt2='(8x,9(1x,f7.2))'
1770 : 0 : write(msg,'(a,i3,3x,a)')' Eigenvalues in eV for ikpt= ',ikpt,stag(isppol)
1771 : : else
1772 : 31 : cfact=one ; frmt1='(i4,4x,9(1x,f7.4))' ; frmt2='(8x,9(1x,f7.4))'
1773 : 31 : write(msg,'(a,i3,3x,a)')' Eigenvalues in Hartree for ikpt= ',ikpt,stag(isppol)
1774 : : end if
1775 : 31 : call wrtout(std_out,msg,'COLL')
1776 : :
1777 [ + - + + ]: 310 : write(msg,frmt1)ikpt,(ene(ib)*cfact,ib=1,MIN(9,nbandksseff))
1778 : 31 : call wrtout(std_out,msg,'COLL')
1779 : 31 : call wrtout(ab_out,msg,'COLL')
1780 : :
1781 [ + - ]: 31 : if (nbandksseff>9) then
1782 [ - + + + ]: 173 : do j=10,nbandksseff,9
1783 [ + - + + ]: 1183 : write(msg,frmt2) (ene(ib)*cfact,ib=j,MIN(j+8,nbandksseff))
1784 : 142 : call wrtout(std_out,msg,'COLL')
1785 : 173 : call wrtout(ab_out,msg,'COLL')
1786 : : end do
1787 : : end if
1788 : :
1789 : : if (skip_test_ortho) then ! Set this if to FALSE to skip test below
1790 : : einf=one; esup=one; cinf=zero; csup=zero
1791 : : else
1792 : : !
1793 : : ! Test on the normalization of wavefunctions.
1794 : : ibsp=0
1795 [ + + ]: 1351 : do ib=1,nbandksseff
1796 : : norm=zero
1797 [ + + ]: 2640 : do ispinor=1,dtset%nspinor
1798 : 1320 : ibsp=ibsp+1
1799 : 1320 : spinor_shift1=(ispinor-1)*npwkss
1800 : 1320 : ug1 => wfg(:,1+spinor_shift1:npwkss+spinor_shift1,ib)
1801 : :
1802 : : !ovlp(1) =ddot(npwkss,ug1(1,:),1,ug1(1,:),1) + ddot(npwkss,ug1(2,:),1,ug1(2,:),1)
1803 : 1320 : ovlp(1) = cg_dznrm2(npwkss,ug1)
1804 : 1320 : ovlp(1) = ovlp(1)**2
1805 : 1320 : ovlp(2) = zero
1806 [ + + ]: 1320 : if (Psps%usepaw==1) ovlp = ovlp &
1807 : : & + paw_overlap(Cprjnk_k(:,ibsp:ibsp),Cprjnk_k(:,ibsp:ibsp),Dtset%typat,Pawtab,&
1808 [ + + ]: 660 : & spinor_comm=MPI_enreg%comm_spinor)
1809 : 2640 : norm = norm + DABS(ovlp(1))
1810 : : end do
1811 [ + + ]: 1320 : if (norm<einf) einf=norm
1812 [ + + ]: 1351 : if (norm>esup) esup=norm
1813 : : end do
1814 : : !
1815 : : ! Test on the orthogonalization of wavefunctions.
1816 [ + + ]: 1351 : do ib=1,nbandksseff
1817 : 1320 : pad1=(ib-1)*dtset%nspinor
1818 [ + + ]: 53391 : do ibp=ib+1,nbandksseff
1819 : 52040 : pad2=(ibp-1)*dtset%nspinor
1820 : 52040 : ovlp(:)=zero
1821 [ + + ]: 104080 : do ispinor=1,dtset%nspinor
1822 : 52040 : ibsp1=pad1+ispinor
1823 : 52040 : ibsp2=pad2+ispinor
1824 : 52040 : spinor_shift1=(ispinor-1)*npwkss
1825 : 52040 : ug1 => wfg(:,1+spinor_shift1:npwkss+spinor_shift1,ib )
1826 : 52040 : ug2 => wfg(:,1+spinor_shift1:npwkss+spinor_shift1,ibp)
1827 : :
1828 : : !ovlp(1)=ddot(npwkss,ug1(1,:),1,ug2(1,:),1) + ddot(npwkss,ug1(2,:),1,ug2(2,:),1)
1829 : : !ovlp(2)=ddot(npwkss,ug1(1,:),1,ug2(2,:),1) - ddot(npwkss,ug1(2,:),1,ug2(1,:),1)
1830 : 52040 : ovlp = cg_zdotc(npwkss,ug1,ug2)
1831 : :
1832 [ + + ]: 52040 : if (Psps%usepaw==1) ovlp= ovlp &
1833 : : & + paw_overlap(Cprjnk_k(:,ibsp1:ibsp1),Cprjnk_k(:,ibsp2:ibsp2),Dtset%typat,Pawtab,&
1834 [ + + ]: 58310 : & spinor_comm=MPI_enreg%comm_spinor)
1835 : : end do
1836 : 52040 : norm = DSQRT(ovlp(1)**2+ovlp(2)**2)
1837 [ + + ]: 52040 : if (norm<cinf) cinf=norm
1838 [ + + ]: 53360 : if (norm>csup) csup=norm
1839 : : end do
1840 : : end do
1841 : : end if
1842 : :
1843 : 31 : write(msg,'(a,i3,3x,a)')' Writing out eigenvalues/vectors for ikpt=',ikpt,stag(isppol)
1844 : 31 : call wrtout(std_out,msg,'COLL')
1845 : : !
1846 : : ! * Write occupation numbers on std_out.
1847 [ - + + - : 93 : ABI_MALLOC(occ_k,(MAX(nband_k,nbandksseff)))
+ - + - -
+ - + ]
1848 [ + + ]: 441 : occ_k(1:nband_k)=occ(1+bdtot_index:nband_k+bdtot_index)
1849 [ + + + + ]: 941 : if (nband_k < nbandksseff) occ_k(nband_k+1:nbandksseff)=zero
1850 : :
1851 : 31 : write(msg,'(a,i3,3x,a)')' Occupation numbers for ikpt=',ikpt,stag(isppol)
1852 : 31 : call wrtout(std_out,msg,'COLL')
1853 : 31 : write(msg,'(i4,4x,9(1x,f7.4))')ikpt,(occ_k(ib),ib=1,MIN(9,nbandksseff))
1854 : 31 : call wrtout(std_out,msg,'COLL')
1855 [ + - ]: 31 : if (nbandksseff>9) then
1856 [ - + + + ]: 173 : do j=10,nbandksseff,9
1857 : 142 : write(msg,'(8x,9(1x,f7.4))') (occ_k(ib),ib=j,MIN(j+8,nbandksseff))
1858 : 173 : call wrtout(std_out,msg,'COLL')
1859 : : end do
1860 : : end if
1861 : : !
1862 : : ! =================================================================
1863 : : ! ==== Write wavefunctions, KB and PAW matrix elements on disk ====
1864 : : ! =================================================================
1865 : : call write_kss_wfgk(untkss,ikpt,isppol,kpoint,dtset%nspinor,npwkss,&
1866 [ - + ]: 31 : nbandksseff,natom,Psps,ene,occ_k,rprimd,gbig,wfg,Cprjnk_k,iomode)
1867 : :
1868 [ - + ]: 31 : ABI_FREE(occ_k)
1869 [ - + ]: 31 : ABI_FREE(ene)
1870 [ - + ]: 31 : ABI_FREE(wfg)
1871 : :
1872 : : end if ! my_rank==master
1873 : 64 : call timab(938,2,tsec) !outkss(write)
1874 : :
1875 [ + + + + ]: 64 : if (my_rank==master.or.my_rank==MPI_enreg%proc_distrb(ikpt,1,isppol)) then
1876 [ + + ]: 39 : ABI_SFREE_PTR(eig_ene)
1877 [ + + ]: 39 : ABI_SFREE_PTR(eig_vec)
1878 [ + + ]: 39 : if (Psps%usepaw==1) call pawcprj_free(Cprjnk_k)
1879 : : end if
1880 [ + - + + : 444 : ABI_FREE(Cprjnk_k)
- + - + -
+ ]
1881 [ + - ]: 64 : ABI_SFREE(kg_k)
1882 : :
1883 : : ! if (MPI_enreg%paral_compil_kpt==1) then !cannot be used in seq run!
1884 [ + + ]: 64 : if (.not.(proc_distrb_cycle(MPI_enreg%proc_distrb,ikpt,1,nband_k,isppol,my_rank))) then
1885 : 31 : k_index=k_index+npw_k*nband_k*dtset%nspinor
1886 : 31 : ibg=ibg+dtset%nspinor*nband_k
1887 : : end if
1888 : 64 : bdtot_index=bdtot_index+nband_k
1889 : :
1890 : 64 : call xmpi_barrier(spaceComm) ! FIXME this barrier is detrimental in the case of direct diago!
1891 : :
1892 : 70 : call timab(935,2,tsec) !outkss(k-loop)
1893 : : end do ! ! End loop over k-points.
1894 : : end do ! spin
1895 : :
1896 : : write(msg,'(3a,f9.6,2a,f9.6,4a,f9.6,2a,f9.6,a)')&
1897 : 6 : & ' Test on the normalization of the wavefunctions',ch10,&
1898 : 6 : & ' min sum_G |a(n,k,G)| = ',einf,ch10,&
1899 : 6 : & ' max sum_G |a(n,k,G)| = ',esup,ch10,&
1900 : 6 : & ' Test on the orthogonalization of the wavefunctions',ch10,&
1901 : 6 : & ' min sum_G a(n,k,G)a(n'',k,G) = ',cinf,ch10,&
1902 : 12 : & ' max sum_G a(n,k,G)a(n'',k,G) = ',csup,ch10
1903 : 6 : call wrtout(std_out,msg,'COLL')
1904 : 6 : call wrtout(ab_out,msg,'COLL')
1905 : :
1906 [ - + ]: 6 : ABI_FREE(gbig)
1907 [ - + ]: 6 : ABI_FREE(symrel2)
1908 [ - + ]: 6 : ABI_FREE(tnons2)
1909 [ + + ]: 6 : if (Psps%usepaw==1) then
1910 [ - + ]: 4 : ABI_FREE(dimlmn)
1911 [ - + - - ]: 4 : if (do_diago.and.MPI_enreg%nproc_atom>1) then
1912 [ # # ]: 0 : ABI_FREE(Paw_ij_all)
1913 : : end if
1914 : : end if
1915 : : !
1916 : : !* Close file
1917 [ + + ]: 6 : if (my_rank==master) then
1918 [ - + ]: 3 : if (iomode==IO_MODE_FORTRAN) close(unit=untkss)
1919 [ + - ]: 3 : if (iomode==IO_MODE_ETSF) then
1920 [ - + ]: 3 : NCF_CHECK(nf90_close(untkss))
1921 : : end if
1922 : : end if
1923 : :
1924 [ - + ]: 6 : if (associated(Cprj_diago_k)) then
1925 : 0 : call pawcprj_free(Cprj_diago_k)
1926 [ # # ]: 0 : ABI_FREE(Cprj_diago_k)
1927 : : end if
1928 : :
1929 [ - + ]: 6 : if (lhack) then
1930 [ # # ]: 0 : ABI_FREE(MPI_enreg%proc_distrb)
1931 : : end if
1932 : :
1933 : 6 : call wrtout(std_out, "outkss done", "COLL")
1934 : 6 : call xmpi_barrier(spaceComm)
1935 : :
1936 : : DBG_EXIT("COLL")
1937 [ - + + + : 12 : call timab(933,2,tsec) ! outkss
- + - - -
- - - ]
1938 : :
1939 : : contains
1940 : : !!***
1941 : :
1942 : : !!****f* ABINIT/memkss
1943 : : !! NAME
1944 : : !! memkss
1945 : : !!
1946 : : !! FUNCTION
1947 : : !! This routine evaluates the additional amount of memory required
1948 : : !! by routine 'outkss'.
1949 : : !!
1950 : : !! INPUTS
1951 : : !! mband=maximum number of bands
1952 : : !! mgfft=maximum size of 1D FFTs
1953 : : !! mproj=maximum dimension for number of projection operators for each
1954 : : !! angular momentum for nonlocal pseudopotential
1955 : : !! mpsang= 1+maximum angular momentum for nonlocal pseudopotentials
1956 : : !! mpw=maximum dimensioned size of npw.
1957 : : !! natom=number of atoms in cell.
1958 : : !! ngfft(18)=contain all needed information about 3D FFT, see ~abinit/doc/variables/vargs.htm#ngfft
1959 : : !! nkpt=number of k points.
1960 : : !! nspinor=number of spinorial components of the wavefunctions
1961 : : !! nsym=number of symmetries in space group
1962 : : !! ntypat=number of types of atoms in unit cell.
1963 : : !!
1964 : : !! NOTES
1965 : : !! This routine is not available for paw calculations
1966 : : !!
1967 : : !! SOURCE
1968 : :
1969 : 1 : subroutine memkss(mband,mgfft,mproj,mpsang,mpw,natom,ngfft,nkpt,nspinor,nsym,ntypat)
1970 : :
1971 : : !Arguments ------------------------------------
1972 : : !scalars
1973 : : integer,intent(in) :: mband,mgfft,mproj,mpsang,mpw,natom,nkpt,nspinor
1974 : : integer,intent(in) :: nsym,ntypat
1975 : : !arrays
1976 : : integer,intent(in) :: ngfft(18)
1977 : :
1978 : : !Local variables-------------------------------
1979 : : !scalars
1980 : : integer(i8b) :: isize,memsize
1981 : : character(len=500) :: msg
1982 : :
1983 : : ! *********************************************************************
1984 : : !
1985 : 1 : isize=580+fnlen+4*(81+nkpt+9*nsym)+8*15 !non allocatable var.
1986 : 1 : if(xmpi_paral==1)then
1987 : : isize=isize+4*4 !kpt_distrb
1988 : : end if
1989 : 1 : memsize=isize
1990 : 1 : isize=isize+4*nkpt+12*mpw+20*nkpt*mpw !nbasek,gbasek,cnormk,gcurr
1991 : 1 : memsize=max(memsize,isize)
1992 : : if(xmpi_paral==1)then
1993 : 1 : isize=isize+12*mpw*nkpt !ibuf1,ibuf2,rbuf1
1994 : 1 : memsize=max(memsize,isize)
1995 : 1 : isize=isize-12*mpw*nkpt !ibuf1,ibuf2,rbuf1
1996 : : end if
1997 : 1 : isize=isize+40*mpw !gbase,cnorm
1998 : 1 : memsize=max(memsize,isize)
1999 : 1 : isize=isize-4*nkpt-20*mpw*nkpt !nbasek,gbasek,cnormk
2000 : 1 : isize=isize+4*mpw !insort
2001 : 1 : memsize=max(memsize,isize)
2002 : 1 : isize=isize-16*mpw !cnorm
2003 : 1 : isize=isize+28*mpw+24*nsym !gbig,nshell,gshell
2004 : 1 : memsize=max(memsize,isize)
2005 : 1 : isize=isize+4*mpw !shlim
2006 : 1 : memsize=max(memsize,isize)
2007 : 1 : isize=isize-44*mpw-24*nsym !gcurr,gbase,gshell,insort,nshell
2008 : 1 : isize=isize-4*mpw !shlim
2009 : : isize=isize+8*mpw*nspinor&
2010 : 1 : & +16*mpw*nspinor*(mpw*nspinor+1) !eigval,eigvec
2011 : 1 : memsize=max(memsize,isize)
2012 : : isize=isize+8*mpw+8*ngfft(4)&
2013 : 1 : & *ngfft(5)*ngfft(6) !ts,vlocal
2014 : 1 : memsize=max(memsize,isize)
2015 : 1 : isize=isize+8*mgfft+4+28*mpw !gbound,indpw_k,kg_k
2016 : 1 : memsize=max(memsize,isize)
2017 : : isize=isize+8*natom&
2018 : 1 : & +24*mpw*ntypat*mpsang*mproj !phkxred,ffnl,kinpw
2019 : 1 : memsize=max(memsize,isize)
2020 : 1 : isize=isize+16*mpw*natom !ph3d
2021 : 1 : memsize=max(memsize,isize)
2022 : : isize=isize+48*mpw*nspinor&
2023 : 1 : & +8*mpw*nspinor*(mpw*nspinor+1) !pwave,subghg,gvnlg
2024 [ - + ]: 1 : if (nspinor==2)&
2025 : 0 : & isize=isize+40*mpw*nspinor !pwave_so,subghg_so
2026 : 1 : memsize=max(memsize,isize)
2027 : 1 : isize=isize+8*mpw*nspinor*(mpw*nspinor+1) !ghg
2028 : 1 : memsize=max(memsize,isize)
2029 : 1 : isize=isize+8*ngfft(4)*ngfft(5)*ngfft(6) !work
2030 : 1 : memsize=max(memsize,isize)
2031 : 1 : isize=isize-8*ngfft(4)*ngfft(5)*ngfft(6) !work
2032 : : isize=isize-8*mgfft+4+28*mpw& !gbound,indpw_k,kg_k
2033 : : &-8*natom-24*mpw*ntypat*mpsang*mproj& !phkxred,ffnl,kinpw
2034 : 1 : &-16*mpw*natom !ph3d
2035 : : isize=isize-48*mpw*nspinor&
2036 : 1 : & -8*mpw*nspinor*(mpw*nspinor+1) !pwave,subghg,gvnlg
2037 [ - + ]: 1 : if (nspinor==2)&
2038 : 0 : & isize=isize-40*mpw*nspinor !pwave_so,subghg_so
2039 : :
2040 : 1 : isize=isize+56*mpw*nspinor !cwork,rwork
2041 : 1 : memsize=max(memsize,isize)
2042 : 1 : isize=isize-56*mpw*nspinor !cwork,rwork
2043 : 1 : isize=isize+112*mpw*nspinor !cwork,rwork,iwork,ifail
2044 : 1 : memsize=max(memsize,isize)
2045 : 1 : isize=isize-112*mpw*nspinor !cwork,rwork,iwork,ifail
2046 : 1 : isize=isize-8*mpw*nspinor*(mpw*nspinor+1) !ghg
2047 : 1 : isize=isize+8*mband !occ_k
2048 : 1 : memsize=max(memsize,isize)
2049 : : isize=isize-8*mband !occ_k
2050 : : isize=isize-8*mpw*nspinor&
2051 : 1 : & -16*mpw*nspinor*(mpw*nspinor+1) !eigval,eigvec
2052 : : isize=isize-32*mpw-8*ngfft(4)&
2053 : 1 : & *ngfft(5)*ngfft(6) !gbig,ts,vlocal
2054 : : if(xmpi_paral==1)then
2055 : : isize=isize-4*4 !kpt_distrb
2056 : : end if
2057 : 1 : isize=isize-580-fnlen-4*(81+nkpt+9*nsym)-8*15 !non allocatable var.
2058 : : !
2059 : 1 : write(msg,'(2a,f8.2,a)')ch10,&
2060 : 2 : & ' Additional amount of memory required by "outkss" routine=',memsize*b2Mb,' Mbytes.'
2061 : 1 : call wrtout(std_out,msg,'COLL')
2062 : : !
2063 : 1 : end subroutine memkss
2064 : : !!***
2065 : :
2066 : : !!****f* ABINIT/dsksta
2067 : : !! NAME
2068 : : !! dsksta
2069 : : !!
2070 : : !! FUNCTION
2071 : : !! This routine evaluates the amount of disk space required by the _KSS file.
2072 : : !!
2073 : : !! INPUTS
2074 : : !! dimlmn(natom*usepaw)=Number of nlm partial waves for each atom.
2075 : : !! ishm=Number of G-shells to be saved in _KSS file.
2076 : : !! mpsang=Max angular momentum +1 for pseudos.
2077 : : !! natom=Number of atoms in the unit cell.
2078 : : !! nbandkss=Number of desired bands to be saved in _KSS file
2079 : : !! nkpt=Number of k points.
2080 : : !! npwkss=Number of desired G-vectors to be saved in _KSS file.
2081 : : !! nspinor=Number of spinorial components.
2082 : : !! nsppol=Number of independent spin polarizations.
2083 : : !! ntypat=Number of type of atoms.
2084 : : !! nsym2=Number of symmetries in space group, without INV
2085 : : !! usepaw=1 if PAW.
2086 : : !!
2087 : : !! OUTPUT
2088 : : !! Writes on standard output
2089 : : !!
2090 : : !! SOURCE
2091 : :
2092 : 6 : subroutine dsksta(ishm,usepaw,nbandkss,mpsang,natom,ntypat,npwkss,nkpt,nspinor,nsppol,nsym2,dimlmn)
2093 : :
2094 : : !Arguments ------------------------------------
2095 : : !scalars
2096 : : integer,intent(in) :: usepaw,ishm,nbandkss,mpsang,natom,ntypat,nkpt
2097 : : integer,intent(in) :: npwkss,nspinor,nsppol,nsym2
2098 : : !arrays
2099 : : integer,intent(in) :: dimlmn(natom*usepaw)
2100 : :
2101 : : !Local variables-------------------------------
2102 : : !scalars
2103 : : integer :: bsize_tot,bsize_hdr,bsize_kb,bsize_wf,bsize_cprj
2104 : : character(len=500) :: msg
2105 : :
2106 : : ! *********************************************************************
2107 : :
2108 : : !The Abinit header is not considered.
2109 : : bsize_hdr= 80*2 + & !title
2110 : : &5*4 + & !nsym2,nbandksseff,npwkss,ishm,mpsang
2111 : : &nsym2*9*4 + & !symrel2
2112 : : &nsym2*3*8 + & !tnons
2113 : : &npwkss*3*4 + & !gbig
2114 : 6 : &ishm*4 !shlim
2115 : :
2116 : : !NOTE: vkb does not depend on nsppol, however the elements are written for each spin.
2117 : 6 : bsize_kb=0
2118 [ + + ]: 6 : if (usepaw==0) then
2119 : : bsize_kb= nsppol* &
2120 : : & ( mpsang*ntypat *8 + & !vkbsign
2121 : : & 2*(nkpt*mpsang*ntypat*npwkss*8) & !vkbd,vkbd
2122 : 2 : & )
2123 : : end if
2124 : :
2125 : : bsize_wf= nsppol* &
2126 : : & ( nkpt*nbandkss *8 + & !energies
2127 : : &nkpt*nbandkss*nspinor*npwkss*2*8 & !wfg
2128 : 6 : &)
2129 : :
2130 : : !For PAW add space required by projectors.
2131 : 6 : bsize_cprj=0
2132 [ + + ]: 6 : if (usepaw==1) then
2133 [ + + ]: 8 : bsize_cprj=SUM(dimlmn(:))*(nsppol*nkpt*nspinor*nbandkss*2*8)
2134 : : end if
2135 : :
2136 : 6 : bsize_tot = bsize_hdr + bsize_kb + bsize_wf + bsize_cprj
2137 : 6 : write(msg,'(2a,f8.2,4a,4(a,f8.2,2a))')ch10,&
2138 : 6 : & ' Total amount of disk space required by _KSS file = ',bsize_tot*b2Mb,' Mb.',ch10,&
2139 : 6 : & ' Subdivided into : ',ch10,&
2140 : 6 : & ' Header = ',bsize_hdr *b2Mb,' Mb.',ch10,&
2141 : 6 : & ' KB elements = ',bsize_kb *b2Mb,' Mb.',ch10,&
2142 : 6 : & ' Wavefunctions (PW) = ',bsize_wf *b2Mb,' Mb.',ch10,&
2143 : 12 : & ' PAW projectors = ',bsize_cprj*b2Mb,' Mb.',ch10
2144 : 6 : call wrtout(std_out,msg,'COLL')
2145 : :
2146 : 6 : end subroutine dsksta
2147 : : !!***
2148 : :
2149 : : end subroutine outkss
2150 : : !!***
2151 : :
2152 : : END MODULE m_io_kss
2153 : : !!***
|