Branch data Line data Source code
1 : : !!****m* ABINIT/m_outqmc
2 : : !! NAME
3 : : !! m_outqmc
4 : : !!
5 : : !! FUNCTION
6 : : !! Interface with Cambridge quantum Monte Carlo program 'CASINO'
7 : : !! See www.tcm.phy.cam.ac.uk/~mdt26/casino.html for more details.
8 : : !! M.D.Towler (mdt26 at cam.ac.uk) November 2003
9 : : !! N.D.M.Hine (nicholas.hine at imperial.ac.uk) November 2004
10 : : !!
11 : : !! COPYRIGHT
12 : : !! Copyright (C) 1998-2026 ABINIT group (DCA, XG, GMR, JYR, MKV, MT, FJ)
13 : : !! This file is distributed under the terms of the
14 : : !! GNU General Public License, see ~abinit/COPYING
15 : : !! or http://www.gnu.org/copyleft/gpl.txt .
16 : : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt.
17 : : !!
18 : : !! SOURCE
19 : :
20 : : #if defined HAVE_CONFIG_H
21 : : #include "config.h"
22 : : #endif
23 : :
24 : : #include "abi_common.h"
25 : :
26 : : module m_outqmc
27 : :
28 : : use defs_basis
29 : : use m_errors
30 : : use m_abicore
31 : : use m_xmpi
32 : : use m_hdr
33 : : use m_dtset
34 : :
35 : :
36 : : use defs_datatypes, only : pseudopotential_type
37 : : use defs_abitypes, only : mpi_type
38 : : use m_io_tools, only : get_unit
39 : : use m_geometry, only : xred2xcart
40 : : use m_results_gs , only : results_gs_type
41 : :
42 : : implicit none
43 : :
44 : : private
45 : : public :: outqmc
46 : :
47 : : contains
48 : : !!***
49 : :
50 : : !!****f* m_outqmc/outqmc
51 : : !! NAME
52 : : !! outqmc
53 : : !!
54 : : !! FUNCTION
55 : : !! Write the wave function to a file in 'pwfn.data' format. This file can be
56 : : !! read by the Cambridge quantum Monte Carlo program 'CASINO' and used as
57 : : !! trial wave function input for a variational or diffusion Monte Carlo calculation.
58 : : !! See www.tcm.phy.cam.ac.uk/~mdt26/casino.html for more details.
59 : : !!
60 : : !! INPUTS
61 : : !! cg(2,mcg)=wavefunction coefficients
62 : : !! dtset <type(dataset_type)>=all input variables for this dataset
63 : : !! eigen(mband*nkpt*nsppol)=array for holding eigenvalues (hartree)
64 : : !! gprimd(3,3)=dimensional primitive translations for reciprocal space
65 : : !! hdr <type(hdr_type)>=the header of wf, den and pot files
66 : : !! kg(3,mpw*mkmem)=reduced planewave coordinates.
67 : : !! mcg=size of wave-functions array (cg) =mpw*nspinor*mband*mkmem*nsppol
68 : : !! mpi_enreg=information about MPI parallelization
69 : : !! npwarr(nkpt)=number of planewaves in basis and on boundary for each k
70 : : !! occ(mband*nkpt*nsppol)=occupation number for each band and k
71 : : !! psps <type(pseudopotential_type)>=all the information about psps
72 : : !! results_gs <type(results_gs_type)>=results (energy and its components,
73 : : !! forces and its components, the stress tensor) of a ground-state computation.
74 : : !!
75 : : !! OUTPUT
76 : : !! Writes the file pwfn.data
77 : : !!
78 : : !! SOURCE
79 : :
80 : 0 : subroutine outqmc(cg,dtset,eigen,gprimd,hdr,kg,mcg,mpi_enreg,npwarr,occ,psps,results_gs)
81 : :
82 : : !Arguments -------------------------------
83 : : !scalars
84 : : integer :: mcg
85 : : type(dataset_type) :: dtset
86 : : type(hdr_type) :: hdr
87 : : type(mpi_type) :: mpi_enreg
88 : : type(pseudopotential_type) :: psps
89 : : type(results_gs_type) :: results_gs
90 : : !arrays
91 : : integer :: kg(3,dtset%mpw*dtset%mkmem),npwarr(dtset%nkpt)
92 : : real(dp) :: cg(2,mcg)
93 : : real(dp) :: eigen(dtset%mband*dtset%nkpt*dtset%nsppol)
94 : : real(dp) :: gprimd(3,3),occ(dtset%mband*dtset%nkpt*dtset%nsppol)
95 : :
96 : : !Local variables -------------------------
97 : : !scalars
98 : : integer,parameter :: r2s_length=80
99 : : integer :: comm,iband,iband_kpt_shift,iband_sppol_shift,icg,icg_shift,icgfull
100 : : integer :: icgfull_shift,ii,ikg,ikg_shift,ikgfull,ikpt,ikpt_shift,io
101 : : integer :: iocc,isppol,jj,me,nband1,nband2,nelecs,nkgfull,ierr
102 : : real(dp) :: norm
103 : : logical :: am_master,foundkg
104 : : character(50) :: pwfnfilename
105 : : character(500) :: message
106 : : character(80) :: dft_functional,pseudo_name,pseudo_type
107 : : character(r2s_length) :: tmpr,tmpr2,tmpr3
108 : : !arrays
109 : 0 : integer :: kgfull(3,dtset%mpw*dtset%mkmem),kgmap(dtset%mpw*dtset%mkmem)
110 : 0 : real(dp) :: gcart_qmc(3),kptscart_qmc(3,dtset%nkpt)
111 : 0 : real(dp),allocatable :: cgfull(:,:),xcart_qmc(:,:)
112 : : ! *********************************************************************
113 : :
114 : : !Go away if I am not the master node.
115 : 0 : write(message,'(a,a)')ch10,' outqmc: enter '
116 : 0 : call wrtout(ab_out,message,'PERS')
117 : :
118 : 0 : am_master=.true.
119 : : if(xmpi_paral==1 .or. mpi_enreg%paral_kgb==1)then
120 : 0 : comm=mpi_enreg%comm_cell
121 : 0 : me=xmpi_comm_rank(comm)
122 [ # # ]: 0 : if(me/=0) am_master=.false.
123 : : end if
124 : : if(.not.am_master)return
125 : :
126 [ # # ]: 0 : if(mpi_enreg%paral_spinor==1)then
127 : 0 : message = ' Parallelization over spinors is not currently supported'
128 : 0 : ABI_ERROR(message)
129 : : end if
130 : :
131 : : !write(std_out,*)ch10,'outqmc: DEBUG: dtset%ndtset = ',dtset%ndtset,ch10
132 : : !Open CASINO pwfn.data file
133 [ # # ]: 0 : if (dtset%ndtset<2)then
134 : 0 : pwfnfilename='pwfn.data'
135 : : else
136 [ # # # # ]: 0 : pwfnfilename='pwfn'//trim(i2s(dtset%jdtset))//'.data'
137 : : end if
138 [ # # ]: 0 : call wrtout(ab_out,' outqmc: will open CASINO file: '//trim(pwfnfilename),'PERS')
139 : :
140 : 0 : io = get_unit()
141 : 0 : open(io,file=pwfnfilename,form='formatted',recl=300,status='unknown',iostat=ierr)
142 : :
143 [ # # ]: 0 : if(ierr/=0)then
144 [ # # ]: 0 : ABI_ERROR("Unable to open file: "//trim(pwfnfilename))
145 : : end if
146 : :
147 : : !Check if the full set of k vectors has been used in this calculation
148 [ # # ]: 0 : if (dtset%kptopt==1) then
149 : 0 : close(io,status='delete')
150 : 0 : write(message,'(3a)')' outqmc: ERROR - kptopt=1 so k-points have been ',&
151 : 0 : & 'generated in the irreducible Brillouin Zone only. ',&
152 : 0 : & 'Set kptopt=2 to obtain full set of k-points.'
153 : 0 : ABI_ERROR(message)
154 : : end if
155 : :
156 : : !Check if the full set of G vectors has been used in this calculation
157 [ # # ]: 0 : do ikpt=1,dtset%nkpt
158 [ # # ]: 0 : if (dtset%istwfk(ikpt)/=1) then
159 : 0 : close(io,status='delete')
160 : : write(message,'(a,i5,a,i2,a,a,a,a,a)')&
161 : 0 : & ' istwfk(',ikpt,')=',dtset%istwfk(ikpt),' (ie /= 1) so some ',&
162 : 0 : & 'G-vectors may not be present.',ch10,' Set istwfk=1 for each ',&
163 : 0 : & 'k-point to obtain full set.'
164 : 0 : ABI_ERROR(message)
165 : : end if
166 : : end do !ikpt
167 : :
168 : 0 : write(message,'(a)')' outqmc: QMC trial wave function file for CASINO generated by ABINIT'
169 : 0 : call wrtout(ab_out,message,'PERS')
170 : :
171 : : !Write the required quantities to pwfn.data
172 : 0 : write(io,"('QMC trial wave function file for CASINO generated by ABINIT (www.abinit.org).')")
173 : :
174 : 0 : write(io,fmt="(/'BASIC INFO'/'----------')")
175 : 0 : write(io,fmt="('Generated by:')")
176 : 0 : write(io,fmt="(' ABINIT ',a)")trim(hdr%codvsn)
177 : 0 : write(io,fmt="('Method:'/' DFT')")
178 : :
179 : 0 : write(io,fmt="('DFT Functional:')")
180 : 0 : select case (dtset%ixc)
181 : : case(0)
182 : 0 : dft_functional='No exchange-correlation.'
183 : : case(1)
184 : 0 : dft_functional='L(S)DA (Teter/Pade parametrization)'
185 : : case(2)
186 : 0 : dft_functional='LDA (Perdew-Zunger-Ceperley-Alder parametrization)'
187 : : case(3)
188 : 0 : dft_functional='LDA (old Teter rational polynomial parametrization)'
189 : : case(4)
190 : 0 : dft_functional='LDA (Wigner)'
191 : : case(5)
192 : 0 : dft_functional='LDA (Hedin-Lundqvist)'
193 : : case(6)
194 : 0 : dft_functional='LDA (X-alpha)'
195 : : case(7)
196 : 0 : dft_functional='L(S)DA (Perdew-Wang 92)'
197 : : case(8)
198 : 0 : dft_functional='L(S)DA (Perdew-Wang 92, exchange-only)'
199 : : case(9)
200 : 0 : dft_functional='L(S)DA (Perdew-Wang 92, exchange- and RPA-correlation)'
201 : : case(10)
202 : 0 : dft_functional='Diff. between ixc=7 and 9; use with accurate RPA corr. energy'
203 : : case(11)
204 : 0 : dft_functional='GGA (Perdew-Burke-Ernzerhof)'
205 : : case(12)
206 : 0 : dft_functional='GGA (Perdew-Burke-Ernzerhof, exchange-only)'
207 : : case(13)
208 : 0 : dft_functional='GGA (potential: van Leeuwen-Baerends ; energy: Perdew-Wang 92)'
209 : : case(14)
210 : 0 : dft_functional='GGA (RPBE of Zhang and Yang)'
211 : : case(15)
212 : 0 : dft_functional='GGA (RPBE of Hammer, Hansen and Norskov)'
213 : : case(16)
214 : 0 : dft_functional='GGA (HTCH)'
215 : : case(17)
216 : 0 : dft_functional='Not defined (as of 11/2003).'
217 : : case(18)
218 : 0 : dft_functional='Not defined (as of 11/2003).'
219 : : case(19)
220 : 0 : dft_functional='Not defined (as of 11/2003).'
221 : : case(20)
222 : 0 : dft_functional='Fermi-Amaldi xc for TDDFT'
223 : : case(21)
224 : 0 : dft_functional='Fermi-Amaldi xc for TDDFT with LDA xc kernel'
225 : : case(22)
226 : 0 : dft_functional='Fermi-Amaldi xc for TDDFT with Burke-Petersilka-Gross hybrid xc kernel'
227 : : case default
228 [ # # # # : 0 : dft_functional='Unknown type.'
# # # # #
# # # # #
# # # # #
# # # #
# ]
229 : : end select
230 : 0 : write(io,"(' ABINIT ixc = ',i2,' : ',a)")dtset%ixc,trim(dft_functional)
231 : :
232 : 0 : write(io,"('Pseudopotential (of first atom type)')")
233 : 0 : select case(psps%pspcod(1))
234 : : case(1)
235 : 0 : pseudo_type='ABINIT type 1' ; pseudo_name='Troullier-Martins'
236 : : case(2)
237 : 0 : pseudo_type='ABINIT type 2' ; pseudo_name='Goedecker-Teter-Hutter (GTH)'
238 : : case(3)
239 : 0 : pseudo_type='ABINIT type 3' ; pseudo_name='Hartwigsen-Goedecker-Hutter'
240 : : case(4)
241 : 0 : pseudo_type='ABINIT type 4'
242 : 0 : pseudo_name='Teter pseudo generated using the ATOM code'
243 : : case(5)
244 : 0 : pseudo_type='ABINIT type 5'
245 : 0 : pseudo_name='"Phoney" pseudo built on a Hamman grid'
246 : : case(6)
247 : 0 : pseudo_type='ABINIT type 6'
248 : 0 : pseudo_name='Fritz-Haber Institut (Troullier Martins)'
249 : : case default
250 [ # # # # : 0 : pseudo_type='Unknown pseudopotential type (as of 11/2003).' ; pseudo_name=''
# # # ]
251 : : end select
252 [ # # ]: 0 : if(dtset%ixc<10)then
253 : 0 : write(io,"(1x,a,2x,': ',a)")trim(pseudo_type),trim(pseudo_name)
254 : : else
255 : 0 : write(io,"(1x,a,3x,': ',a)")trim(pseudo_type),trim(pseudo_name)
256 : : end if
257 : :
258 : 0 : write(io,"('Plane wave cutoff (au)')")
259 : 0 : tmpr=r2s(hdr%ecut_eff,'(f12.3)')
260 : 0 : write(io,'(1x,a)')trim(tmpr)
261 : :
262 : 0 : write(io,"('Spin polarized:')")
263 : 0 : select case(dtset%nspden)
264 : : case(1)
265 : 0 : write(io,"(' .false.')")
266 : : case(2)
267 : 0 : write(io,"(' .true.')")
268 : : case(4)
269 : 0 : close(io,status='delete')
270 : 0 : write(message,'(a)')' outqmc: ERROR - nspden=4 but CASINO cannot yet deal with non-collinear spins.'
271 : 0 : ABI_ERROR(message)
272 : : case default
273 : 0 : close(io,status='delete')
274 [ # # # # ]: 0 : ABI_ERROR('Unrecognized value of nspden.')
275 : : end select
276 : :
277 : 0 : write(io,"('Total energy (au per primitive cell)')")
278 : 0 : tmpr=r2s(results_gs%etotal,'(f24.14)')
279 : 0 : write(io,'(1x,a)')trim(tmpr)
280 : 0 : write(io,"('Kinetic energy')")
281 : 0 : tmpr=r2s(results_gs%energies%e_kinetic,'(f24.14)')
282 : 0 : write(io,'(1x,a)')trim(tmpr)
283 : 0 : write(io,"('Local potential energy (Local pseudopotential energy eei + pseudopotential core-core energy eii)')")
284 : 0 : tmpr=r2s((results_gs%energies%e_localpsp+results_gs%energies%e_corepsp),'(f24.14)')
285 : 0 : write(io,'(1x,a)')trim(tmpr)
286 : 0 : write(io,"('Non-local potential energy')")
287 : 0 : tmpr=r2s(results_gs%energies%e_nlpsp_vfock,'(f24.14)')
288 : 0 : write(io,'(1x,a)')trim(tmpr)
289 : 0 : write(io,"('Electron-electron energy (Hartree Energy + Exchange-Correlation Energy)')")
290 : 0 : tmpr=r2s((results_gs%energies%e_hartree+results_gs%energies%e_xc),'(f24.14)')
291 : 0 : write(io,'(1x,a)')trim(tmpr)
292 : 0 : write(io,"('Ion-ion energy')")
293 : 0 : tmpr=r2s(results_gs%energies%e_ewald,'(f24.14)')
294 : 0 : write(io,'(1x,a)')trim(tmpr)
295 : 0 : write(io,"('Number of electrons per primitive cell')")
296 : :
297 : 0 : nelecs=0
298 [ # # ]: 0 : do ii=1,dtset%natom
299 : 0 : nelecs=nelecs+psps%ziontypat(dtset%typat(ii))
300 : : end do
301 : :
302 : 0 : write(io,'(1x,i3)')nelecs
303 : 0 : write(io,*)
304 : 0 : write(io,"('GEOMETRY'/'--------')")
305 : 0 : write(io,"('Number of atoms per primitive cell')")
306 : 0 : write(io,'(1x,i3)')dtset%natom
307 : 0 : write(io,"('Atomic numbers and positions of atoms (au)')")
308 : :
309 [ # # # # : 0 : ABI_MALLOC(xcart_qmc,(3,dtset%natom))
# # # # #
# # # ]
310 : 0 : call xred2xcart(dtset%natom,hdr%rprimd,xcart_qmc,hdr%xred)
311 [ # # ]: 0 : do ii=1,dtset%natom
312 : 0 : tmpr=r2s(xcart_qmc(1,ii),'(f24.14)')
313 : 0 : tmpr2=r2s(xcart_qmc(2,ii),'(f24.14)')
314 : 0 : tmpr3=r2s(xcart_qmc(3,ii),'(f24.14)')
315 : 0 : jj=psps%znucltypat(dtset%typat(ii))
316 : 0 : write(io,'(1x,i2,3(1x,a))')jj,trim(tmpr),trim(tmpr2),trim(tmpr3)
317 : : end do
318 [ # # ]: 0 : ABI_FREE(xcart_qmc)
319 : :
320 : 0 : write(io,"('Primitive lattice vectors (au)')")
321 [ # # ]: 0 : do ii=1,3
322 : 0 : tmpr=r2s(hdr%rprimd(1,ii),'(f24.14)')
323 : 0 : tmpr2=r2s(hdr%rprimd(2,ii),'(f24.14)')
324 : 0 : tmpr3=r2s(hdr%rprimd(3,ii),'(f24.14)')
325 : 0 : write(io,'(3(1x,a))')trim(tmpr),trim(tmpr2),trim(tmpr3)
326 : : end do
327 : :
328 : : !Copy the G vectors for the first k point into kgfull
329 : 0 : ikgfull=0
330 [ # # ]: 0 : do ikg=1,npwarr(1)
331 : 0 : ikgfull=ikgfull+1
332 [ # # ]: 0 : kgfull(1:3,ikgfull) = kg(1:3,ikg)
333 : 0 : kgmap(ikg)=ikgfull
334 : : end do
335 : 0 : ikg_shift = npwarr(1)
336 : : !Go through the other k points and look for any G vectors that haven't
337 : : !already been found and add them to the end of kgfull
338 [ # # ]: 0 : do ikpt=2,dtset%nkpt
339 [ # # ]: 0 : do ikg=ikg_shift,ikg_shift+npwarr(ikpt)
340 : 0 : foundkg = .false.
341 [ # # ]: 0 : do ii=1,ikgfull
342 : : if(kg(1,ikg)==kgfull(1,ii).and.kg(2,ikg)==kgfull(2,ii) &
343 [ # # # # : 0 : & .and.kg(3,ikg)==kgfull(3,ii)) then
# # ]
344 : 0 : foundkg=.true.
345 : 0 : kgmap(ikg)=ii
346 : : exit
347 : : end if
348 : : end do
349 : 0 : if(.not.foundkg)then
350 : 0 : ikgfull=ikgfull+1
351 [ # # ]: 0 : kgfull(1:3,ikgfull)=kg(1:3,ikg)
352 : 0 : kgmap(ikg)=ikgfull
353 : : end if
354 : : end do
355 : 0 : ikg_shift=ikg_shift+npwarr(ikpt)
356 : : end do
357 : 0 : nkgfull=ikgfull
358 : :
359 : 0 : write(io,*)
360 : 0 : write(io,"('G VECTORS'/'---------')")
361 : 0 : write(io,"('Number of G-vectors')")
362 : 0 : write(io,'(1x,i7)')nkgfull
363 : 0 : write(io,"('Gx Gy Gz (au)')")
364 : :
365 [ # # ]: 0 : do ikgfull=1,nkgfull
366 : : gcart_qmc=2*pi*(kgfull(1,ikgfull)*gprimd(1:3,1)&
367 [ # # ]: 0 : & +kgfull(2,ikgfull)*gprimd(1:3,2)+kgfull(3,ikgfull)*gprimd(1:3,3))
368 : 0 : write(io,*)gcart_qmc(1:3) ! '(3e26.16)'
369 : : end do
370 : :
371 : : !Populate the cgfull array, using the mapping in kgmap between the
372 : : !coefficients for kg in the per-kpoint list and the ones in the full list
373 : : !The number of xxx_shift's might seem excessive but the re-ordering of the
374 : : !list from (spin, kpt, band, kg) to (kpt, spin, band, kgfull) is quite
375 : : !complicated
376 [ # # # # : 0 : ABI_MALLOC(cgfull,(2,nkgfull*dtset%nspinor*dtset%nsppol*dtset%mband*dtset%nkpt))
# # # # #
# # # ]
377 [ # # # # ]: 0 : cgfull(1:2,1:nkgfull*dtset%nspinor*dtset%nsppol*dtset%mband*dtset%nkpt)=0
378 : 0 : icg_shift=1
379 [ # # ]: 0 : do isppol=1,dtset%nsppol
380 : 0 : ikg_shift=1
381 [ # # ]: 0 : if(isppol==2)then
382 : : ! Go back to the beginning of cgfull but skip the first set of isppol=1 bands
383 : 0 : icgfull_shift=nkgfull*dtset%nband(1)
384 : 0 : ikpt_shift=dtset%nkpt
385 : : else
386 : : icgfull_shift=0 ! Start at the beginning of cgfull
387 : : ikpt_shift=0
388 : : end if
389 [ # # ]: 0 : do ikpt=1,dtset%nkpt
390 [ # # ]: 0 : do iband=1,dtset%nband(ikpt+ikpt_shift)
391 : 0 : ikg=ikg_shift
392 : : ! Find the index in Abinit's coefficient list
393 [ # # ]: 0 : do icg=icg_shift,icg_shift+npwarr(ikpt)-1
394 : : ! Map it to an index in the full CASINO list with the mapping recorded
395 : : ! when kgfull was read in
396 : 0 : icgfull = kgmap(ikg)+icgfull_shift
397 [ # # ]: 0 : cgfull(1:2,icgfull)=cg(1:2,icg)
398 : 0 : ikg=ikg+1
399 : : end do !icg
400 : 0 : icg_shift=icg_shift+npwarr(ikpt)
401 : 0 : icgfull_shift=icgfull_shift+nkgfull
402 : : end do !iband
403 [ # # ]: 0 : if(isppol==2)then
404 : : ! Skip the isppol==1 bands
405 : 0 : icgfull_shift=icgfull_shift+nkgfull*dtset%nband(ikpt)
406 : : else
407 [ # # ]: 0 : if(dtset%nsppol==2)then
408 : : ! Skip the isppol==2 bands
409 : 0 : icgfull_shift=icgfull_shift+nkgfull*dtset%nband(ikpt+dtset%nkpt)
410 : : else
411 : : icgfull_shift=icgfull_shift ! Nothing to be skipped
412 : : end if
413 : : end if
414 : 0 : ikg_shift=ikg_shift+npwarr(ikpt)
415 : : end do !ikpt
416 : : end do !isppol
417 : :
418 : : !See if each orbital is normalised and check for integer occupancy of orbitals.
419 : : !These are checked by CASINO and it will complain if they are not as expected.
420 : 0 : icgfull_shift=1
421 : 0 : ii=0
422 : 0 : iocc=1
423 : :
424 [ # # ]: 0 : do ikpt=1,dtset%nkpt
425 [ # # ]: 0 : do isppol=1,dtset%nsppol
426 [ # # ]: 0 : do iband=1,dtset%nband(ikpt+(isppol-1)*dtset%nkpt)
427 [ # # ]: 0 : if(occ(iocc)/=int(occ(iocc)))then
428 : : write(message,'(a,i5,a,i1,a,i5,a,f11.8,a)')&
429 : 0 : & 'Non-integer occupation number for kpt ',ikpt,', sppol ',isppol,', band ',iband,': occ=',occ(iocc),'.'
430 : 0 : ABI_WARNING(message)
431 : : end if
432 : 0 : iocc=iocc+1
433 : 0 : norm=0
434 [ # # ]: 0 : do icgfull=icgfull_shift,icgfull_shift+nkgfull-1
435 : 0 : norm=norm+cgfull(1,icgfull)**2+cgfull(2,icgfull)**2
436 : : end do !icgfull
437 : 0 : icgfull_shift=icgfull_shift+nkgfull
438 [ # # # # ]: 0 : if((norm<0.999).or.(norm>1.001))then
439 : : write(message,'(a,i5,a,i1,a,i5,a,f11.8,a)')&
440 : 0 : & 'Incorrectly normalised orbital for kpt ',ikpt,', sppol ',isppol,', band ',iband,': norm=',norm,'.'
441 : 0 : ABI_WARNING(message)
442 : : end if
443 : : end do !iband
444 : : end do !isppol
445 : : end do !ikpt
446 : :
447 : 0 : write(io,*)
448 : 0 : write(io,"('WAVE FUNCTION'/'-------------')")
449 : 0 : write(io,"('Number of k-points')")
450 : 0 : write(io,'(1x,i5)') dtset%nkpt
451 : :
452 [ # # ]: 0 : do ikpt=1,dtset%nkpt
453 : : kptscart_qmc(1:3,ikpt)=2*pi*(dtset%kptns(1,ikpt)*gprimd(1:3,1)&
454 [ # # ]: 0 : & +dtset%kptns(2,ikpt)*gprimd(1:3,2)+dtset%kptns(3,ikpt)*gprimd(1:3,3))
455 : : end do !ikpt
456 : :
457 : 0 : iband_kpt_shift=0
458 : 0 : icg_shift=0
459 : 0 : icgfull_shift=0
460 [ # # ]: 0 : do ikpt=1,dtset%nkpt
461 : 0 : write(io,"('k-point # ; # of bands (up spin/down spin) ; k-point coords (au)')")
462 [ # # ]: 0 : if(dtset%nsppol==2)then
463 : 0 : nband1=dtset%nband(ikpt)
464 : 0 : nband2=dtset%nband(ikpt+dtset%nkpt)
465 : : else
466 : 0 : nband1=dtset%nband(ikpt)
467 : 0 : nband2=0
468 : : end if
469 : 0 : tmpr=r2s(kptscart_qmc(1,ikpt),'(f24.14)')
470 : 0 : tmpr2=r2s(kptscart_qmc(2,ikpt),'(f24.14)')
471 : 0 : tmpr3=r2s(kptscart_qmc(3,ikpt),'(f24.14)')
472 : 0 : write(io,'(3(1x,i5),3(1x,a))')ikpt,nband1,nband2,trim(tmpr),trim(tmpr2), &
473 : 0 : & trim(tmpr3)
474 [ # # ]: 0 : do isppol=1,dtset%nsppol
475 [ # # ]: 0 : if (isppol==2) then
476 [ # # ]: 0 : iband_sppol_shift=sum(dtset%nband(1:dtset%nkpt))
477 [ # # ]: 0 : iband_kpt_shift=sum(dtset%nband((dtset%nkpt+1):(dtset%nkpt+ikpt-1)))
478 : : else
479 : 0 : iband_sppol_shift=0
480 [ # # ]: 0 : iband_kpt_shift=sum(dtset%nband(1:(ikpt-1)))
481 : : end if
482 [ # # ]: 0 : do iband=1,dtset%nband(ikpt)
483 : 0 : write(io,"('Band, spin, eigenvalue (au)')")
484 : 0 : tmpr=r2s(eigen(iband_kpt_shift+iband_sppol_shift+iband),'(f24.14)')
485 : 0 : write(io,'(2(1x,i5),1x,a)')iband,isppol,tmpr
486 : 0 : write(io,"('Eigenvector coefficients')")
487 [ # # ]: 0 : do icgfull=1,nkgfull
488 : 0 : write(io,"(1x,'(',e23.16,',',e23.16,')')")cgfull(1:2,icgfull+icgfull_shift)
489 : : end do !icgfull
490 : 0 : icgfull_shift=icgfull_shift+nkgfull
491 : : end do !iband
492 : : end do !isppol
493 : : end do !ikpt
494 : :
495 : 0 : close(io)
496 : :
497 : 0 : write(message,'(a,a)')' outqmc: done with writing of QMC trial wave function file for CASINO',ch10
498 : 0 : call wrtout(ab_out,message,'PERS')
499 : :
500 [ # # ]: 0 : end subroutine outqmc
501 : : !!***
502 : :
503 : : !!****f* m_outqmc/i2s
504 : : !! NAME
505 : : !! i2s
506 : : !!
507 : : !! FUNCTION
508 : : !! Convert integers to left justified strings that can be printed in the
509 : : !! middle of a sentence without introducing large amounts of white space.
510 : : !! Calling routine is intended to include something like:
511 : : !! integer i
512 : : !! i=12
513 : : !! write(std_out,*)'Integer number ',trim(i2s(i)),' with words at the end.'
514 : : !!
515 : : !! INPUTS
516 : : !!
517 : : !! OUTPUT
518 : : !!
519 : : !! SOURCE
520 : :
521 : 0 : function i2s(n)
522 : :
523 : : !Arguments ----------------------
524 : : integer, intent(in) :: n
525 : : character(len=20) :: i2s
526 : :
527 : : !Local variables ----------------
528 : : integer :: i,j
529 : : character :: tmp,sign
530 : :
531 : : ! *********************************************************************
532 : :
533 [ # # ]: 0 : if(n==0)then
534 : 0 : i2s='0' ; return
535 : : end if
536 [ # # ]: 0 : sign=' ' ; if(n<0)sign='-'
537 : :
538 [ # # ]: 0 : do i=1,len(i2s)
539 : 0 : i2s(i:i)=' '
540 : : end do
541 : :
542 : 0 : i=abs(n)
543 [ # # ]: 0 : do j=1,len(i2s)
544 [ # # ]: 0 : if(i==0)exit
545 : 0 : i2s(j:j)=achar(ichar('0')+mod(i,10))
546 : 0 : i=i/10
547 : : end do
548 : :
549 : 0 : i=1 ; j=len_trim(i2s)
550 : 0 : do
551 [ # # ]: 0 : if(i>=j)exit
552 : 0 : tmp=i2s(j:j)
553 : 0 : i2s(j:j)=i2s(i:i)
554 : 0 : i2s(i:i)=tmp
555 : 0 : i=i+1
556 : 0 : j=j-1
557 : : end do
558 : :
559 : 0 : i2s=trim(sign)//i2s
560 : :
561 : : end function i2s
562 : : !!***
563 : :
564 : : !!****f* ABINIT/r2s
565 : : !! NAME
566 : : !! r2s
567 : : !!
568 : : !! FUNCTION
569 : : !! Converts real variable with arbitrary format to string that can be
570 : : !! trimmed and printed in the middle of a sentence without introducing
571 : : !! large amounts of white space, as you would if you did
572 : : !! write(std_out,'(f12.6)')12.0 or similar. Note you need to pass through the
573 : : !! format string e.g. f12.6.
574 : : !!
575 : : !! Calling routine is intended to include something like:
576 : : !! USE utilities
577 : : !! REAL(dp) r
578 : : !! r=12._dp
579 : : !! tmpr=r2s(r,'(f12.6)')
580 : : !! write(std_out,*)'Real number ',trim(tmpr),' with words at the end.'
581 : : !!
582 : : !! Note : DON'T USE R2S IN A WRITE STATEMENT SINCE THIS IS ILLEGAL
583 : : !! IN FORTRAN90 (ALTHOUGH NOT IN FORTRAN200X). IF ANYONE HAS TIME, FEEL
584 : : !! FREE TO WRITE A VERSION OF THIS WHICH ISN'T ILLEGAL - SIMILAR TO
585 : : !! I2S ABOVE - SO THAT PEOPLE WHO HAVEN'T READ THIS NOTE DON'T FEEL
586 : : !! TEMPTED TO CALL R2S IN A WRITE STATEMENT.
587 : : !!
588 : : !! INPUTS
589 : : !!
590 : : !! OUTPUT
591 : : !!
592 : : !! SIDE EFFECTS
593 : : !!
594 : : !! SOURCE
595 : :
596 : 0 : function r2s(r,real_format)
597 : :
598 : : !Arguments -------------------------
599 : : real(dp),intent(in) :: r
600 : : character(len=*),intent(in) :: real_format
601 : : character(len=80) :: r2s
602 : :
603 : : ! *********************************************************************
604 : :
605 : : if(len(r2s)>0)then
606 : 0 : write(r2s,real_format)r
607 : 0 : r2s=adjustl(r2s)
608 : : end if
609 : :
610 : 0 : end function r2s
611 : : !!***
612 : :
613 : : end module m_outqmc
614 : : !!***
|