Branch data Line data Source code
1 : : !!****m* ABINIT/m_wannier_io
2 : : !! NAME
3 : : !! m_wannier_io
4 : : !!
5 : : !! FUNCTION
6 : : !! subroutines for writting Wannier90 related files.
7 : : !!
8 : : !! COPYRIGHT
9 : : !! Copyright (C) 2005-2026 ABINIT group (BAmadon, CEspejo, FJollet, TRangel, DRH, hexu)
10 : : !! This file is distributed under the terms of the
11 : : !! GNU General Public License, see ~abinit/COPYING
12 : : !! or http://www.gnu.org/copyleft/gpl.txt .
13 : : !!
14 : : !! SOURCE
15 : :
16 : : #if defined HAVE_CONFIG_H
17 : : #include "config.h"
18 : : #endif
19 : :
20 : : #include "abi_common.h"
21 : :
22 : : module m_wannier_io
23 : :
24 : : use defs_basis
25 : : use defs_wannier90
26 : : use m_abicore
27 : : use m_errors
28 : : use m_atomdata
29 : : use m_xmpi
30 : : use m_sort
31 : : use m_dtfil
32 : : #ifdef FC_NAG
33 : : use f90_unix_dir
34 : : #endif
35 : :
36 : : use m_dtset, only : dataset_type
37 : : use defs_abitypes, only : MPI_type
38 : : use m_fft, only: fourwf
39 : : use m_io_tools, only : open_file, get_unit
40 : : use m_fftcore, only : sphereboundary
41 : : use m_abstract_wf, only: abstract_wf, cg_cprj, wfd_wf
42 : : use m_ebands, only : ebands_t
43 : :
44 : : implicit none
45 : :
46 : : private
47 : :
48 : : public :: write_Amn
49 : : public :: compute_and_write_unk
50 : : public :: write_eigenvalues
51 : : public :: write_Mmn
52 : : public :: read_chkunit
53 : : !!***
54 : :
55 : : contains
56 : :
57 : : ! Write amn file
58 [ - + ]: 19 : subroutine write_Amn(A_matrix, fname, nsppol, mband, nkpt, num_bands, nwan, band_in, test_matrix_output)
59 : : ! TODO use the A_matrix sizes instead of the nsppol, mband, nkpt, nwan
60 : : complex(dp),pointer :: A_matrix(:,:,:,:)
61 : : !type(dataset_type),intent(in) :: dtset
62 : : logical, intent(in) :: band_in(:, :), test_matrix_output
63 : : integer, intent(in) :: nsppol, num_bands(nsppol), nwan(nsppol), mband, nkpt
64 : : character(len=fnlen), intent(in) :: fname(nsppol)
65 : :
66 : : !Local variables-------------------------------
67 : : !scalars
68 : : character(len=1000) :: msg
69 : 19 : integer :: iun(nsppol), units(2)
70 : : integer :: isppol, ikpt, iband, iwan, jband, ii, jj
71 : :
72 [ + + ]: 57 : units = [std_out, ab_out]
73 : :
74 : : ! below is copied/modified from m_mlwfovlp.F90
75 [ + + ]: 39 : do isppol=1,nsppol
76 : : ! TODO : relpace this.
77 [ + - - + ]: 20 : if (open_file(trim(fname(isppol)), msg, newunit=iun(isppol), form="formatted", status="unknown", action="write") /= 0) then
78 : 0 : ABI_ERROR(msg)
79 : : end if
80 : 20 : write(iun(isppol),*) 'Projections from Abinit : mband,nkpt,nwan. indices: iband1,iwan,ikpt'
81 : 39 : write(iun(isppol),*) num_bands(isppol),nkpt,nwan(isppol)
82 : : end do
83 : :
84 [ + + ]: 39 : do isppol=1,nsppol
85 [ + + ]: 743 : do ikpt=1,nkpt
86 [ + + ]: 5364 : do iwan=1,nwan(isppol)
87 : 4640 : jband=0
88 [ + + ]: 72608 : do iband=1,mband
89 [ + + ]: 71904 : if(band_in(iband,isppol)) then
90 : 59648 : jband=jband+1
91 : 59648 : write(iun(isppol),'(3i6,13x,3x,2f18.14)')jband,iwan,ikpt,A_matrix(jband,iwan,ikpt,isppol)
92 : : end if !band_in
93 : : end do !iband
94 : : end do !iwan
95 : : end do !ikpt
96 : : end do !isppol
97 : : !
98 [ + + ]: 39 : do isppol=1,nsppol
99 : 20 : close(iun(isppol))
100 [ + - ]: 20 : write(msg, '(3a)' )' ',trim(fname(isppol)),' written'
101 : 39 : call wrtout(std_out,msg)
102 : : end do
103 : :
104 : : ! Individual matrix elements are gauge-dependent for spinor wavefunctions,
105 : : ! especially inside degenerate subspaces. The caller disables this test-only
106 : : ! output for nspinor == 2, while the complete .amn file is still written.
107 [ + + ]: 19 : if (.not. test_matrix_output) return
108 : : !
109 : : ! Write down part of the matrix to the output file
110 : : ! This is for the automatic tests
111 : : !
112 : 17 : write(msg, '(4a)' ) ch10,&
113 : 17 : ' Writing top of the initial projections matrix: A_mn(ik)',ch10,&
114 : 34 : ' m=1:3, n=1:3, ik=1'
115 : 17 : call wrtout(units, msg)
116 : : !
117 : : ! just write down the first 3 elements
118 : : !
119 [ + + ]: 35 : do isppol=1,nsppol
120 : 18 : write(msg, '( " " )')
121 [ + + ]: 18 : if (nsppol>1 ) then
122 [ + + ]: 2 : if (isppol==1) write(msg,'(2a)')trim(msg),' spin up:'
123 [ + + ]: 2 : if (isppol==2) write(msg,'(2a)')trim(msg),' spin down:'
124 : : end if
125 [ + + ]: 72 : do ii=1,3
126 [ - + ]: 54 : if(ii>num_bands(isppol)) cycle
127 : 54 : write(msg,'(3a)') trim(msg),ch10,'; ( '
128 [ + + ]: 216 : do jj=1,3
129 [ - + ]: 162 : if(jj>nwan(isppol))cycle
130 : 162 : write(msg, '(a,2f11.6,a)') trim(msg),&
131 : 378 : & A_matrix(ii,jj,1,isppol),' , '
132 : : end do
133 : 72 : write(msg,'(2a)') trim(msg),' ) '
134 : : end do
135 : 35 : call wrtout(units, msg)
136 : : end do
137 : : !
138 : : ! Now write down bottom of the matrix
139 : : !
140 : 17 : write(msg, '(4a)' ) ch10,&
141 : 17 : & ' Writing bottom of the initial projections matrix: A_mn(ik)',ch10,&
142 : 34 : & ' m=num_bands-2:num_bands, n=nwan-2:nwan, ik=nkpt'
143 : 17 : call wrtout(units, msg)
144 : :
145 [ + + ]: 35 : do isppol=1,nsppol
146 : 18 : write(msg, '( " " )')
147 [ + + ]: 18 : if (nsppol>1 ) then
148 [ + + ]: 2 : if (isppol==1) write(msg,'(2a)')trim(msg),' spin up:'
149 [ + + ]: 2 : if (isppol==2) write(msg,'(2a)')trim(msg),' spin down:'
150 : : end if
151 [ + + ]: 72 : do ii=num_bands(isppol)-2,num_bands(isppol)
152 [ - + ]: 54 : if(ii<1) cycle
153 : 54 : write(msg,'(3a)') trim(msg),ch10,'; ( '
154 [ + + ]: 216 : do jj=nwan(isppol)-2,nwan(isppol)
155 [ - + ]: 162 : if(jj<1)cycle
156 : 162 : write(msg, '(a,2f11.6,a)') trim(msg),&
157 : 378 : & A_matrix(ii,jj,nkpt,isppol),' , '
158 : : end do
159 : 72 : write(msg,'(2a)') trim(msg),' ) '
160 : : end do
161 : 35 : call wrtout(units, msg)
162 : : end do !isppol
163 : :
164 : : end subroutine write_Amn
165 : :
166 : :
167 : : !-----------------------------------------------------------------------
168 : : !@brief Write down the unk matrix
169 : : !-----------------------------------------------------------------------
170 : 4 : subroutine compute_and_write_unk(wfnname, usepaw, w90prtunk, &
171 : : & mpi_enreg, ngfft, nsppol, nspinor, &
172 [ - + ]: 4 : & nkpt, mband, mpw, mgfftc, mkmem, nprocs, rank, npwarr, &
173 [ - + ]: 4 : & band_in, dtset, kg, mywfc)
174 : : !TODO split the calculation of unk with writting.
175 : : character(len=fnlen), intent(inout) :: wfnname
176 : : integer ,intent(in) :: usepaw
177 : : integer, intent(in) ::w90prtunk
178 : : type(MPI_type),intent(in) :: mpi_enreg
179 : : integer, intent(in) :: ngfft(18), nsppol, nspinor, nkpt, mpw, mgfftc, mband, mkmem
180 : : integer, intent(in) :: nprocs, rank, npwarr(:)
181 : : logical, intent(in) :: band_in(:, :)
182 : : type(dataset_type),intent(in) :: dtset
183 : :
184 : : !integer, intent(in) :: iwav(:, :,:,:),kg(3,mpw*mkmem)
185 : : integer, intent(in) :: kg(3,mpw*mkmem)
186 : : !real(dp),intent(in) :: cg(2,mpw*nspinor*mband*mkmem*nsppol)
187 : : class(abstract_wf), intent(inout) :: mywfc
188 : :
189 : : !Local variables-------------------------------
190 : : !scalars
191 : : integer :: iun_plot
192 : : integer :: isppol, ikpt, ikg, iband, ig
193 : : integer :: n1, n2, n3, n4, n5, n6, cplex, mgfft, npw_k
194 : : integer :: tim_fourwf
195 : : real(dp) :: weight
196 : 8 : integer :: spacing, nband_inc(nsppol)
197 : 4 : integer,allocatable:: kg_k(:,:)
198 : 4 : real(dp),allocatable :: denpot(:,:,:), cwavef(:,:), fofgout(:,:),fofr(:,:,:,:)
199 : 4 : integer,allocatable :: gbound(:,:)
200 : : integer :: n1tmp, n2tmp, n3tmp, jj1, jj2, jj3, ipw, ispinor
201 : : character(len=1000) :: msg
202 : :
203 [ + + ]: 4 : if(usepaw==1) then
204 : 2 : write(msg, '( a,a,a,a,a,a,a,a,a)')ch10,&
205 : 2 : & " WARNING: The UNK matrices will not contain the correct wavefunctions ",ch10,&
206 : 2 : & " since we are just writing the plane wave contribution.",ch10,&
207 : 2 : & " The contribution from inside the spheres is missing. ",ch10,&
208 : 4 : & " However, these files can be used for plotting purposes",ch10
209 : 2 : call wrtout(std_out, msg)
210 : : end if
211 : : !
212 : 4 : spacing = w90prtunk
213 : 4 : write(msg, '( 8a,i3,2a)')ch10,&
214 : 4 : & " UNK files will be written.",ch10,&
215 : 4 : & " According to the chosen value of w90prtunk",ch10,&
216 : 4 : & " the wavefunctions are to be written ",ch10, &
217 : 8 : & " at every ", spacing," records.",ch10
218 : 4 : call wrtout(std_out, msg)
219 : : !
220 [ - + + - : 12 : ABI_MALLOC(kg_k,(3,mpw))
+ - + - -
+ - + ]
221 : 4 : n1=ngfft(1)
222 : 4 : n2=ngfft(2)
223 : 4 : n3=ngfft(3)
224 : 4 : n4=ngfft(4)
225 : 4 : n5=ngfft(5)
226 : 4 : n6=ngfft(6)
227 : 4 : cplex=1
228 : 4 : mgfft=mgfftc ! error
229 [ + + ]: 8 : do isppol=1,nsppol
230 : 4 : ikg=0
231 [ + + ]: 96 : do ikpt=1,nkpt
232 : : !
233 : : ! MPI:cycle over k-points not treated by this node
234 : : !
235 [ - + ]: 88 : if (nprocs>1 ) then !sometimes we can have just one processor
236 [ # # ]: 0 : if ( ABS(MPI_enreg%proc_distrb(ikpt,1,isppol)-rank) /=0) CYCLE
237 : : end if
238 : : !
239 : 88 : npw_k=npwarr(ikpt)
240 [ + + + + ]: 109456 : kg_k(:,1:npw_k)=kg(:,1+ikg:npw_k+ikg)
241 [ - + + - : 440 : ABI_MALLOC(denpot,(cplex*n4,n5,n6))
- + + - -
+ + - + -
+ - - + -
+ ]
242 [ - + + - : 264 : ABI_MALLOC(cwavef,(2,npw_k))
+ - + - -
+ - + ]
243 [ - + + - : 440 : ABI_MALLOC(fofr,(2,n4,n5,n6))
- + + - -
+ + - + -
+ - - + -
+ ]
244 [ + - - + : 352 : ABI_MALLOC(gbound,(2*mgfft+8,2))
+ - + - +
- + - - +
- + ]
245 [ - + + - : 176 : ABI_MALLOC(fofgout,(2,npw_k))
- + - + ]
246 : :
247 : : !iun_plot=1000+ikpt+ikpt*(isppol-1)
248 [ + - ]: 88 : if (nspinor == 1) then
249 : 88 : write(wfnname,'("UNK",I5.5,".",I1)') ikpt, isppol
250 [ # # ]: 0 : else if (nspinor == 2) then
251 : 0 : write(wfnname,'("UNK",I5.5,".NC")') ikpt
252 : : end if
253 [ - + ]: 88 : if (open_file(trim(wfnname), msg, newunit=iun_plot, &
254 : : form="unformatted", status="unknown", action="write") /= 0) then
255 : 0 : ABI_ERROR(msg)
256 : : endif
257 : :
258 : : ! open (unit=iun_plot, file=wfnname,form='formatted')
259 : : ! open(unit=iun_plot, file=wfnname,form='unformatted')
260 : : ! optimizing grid for UNK files
261 : 88 : n1tmp = n1/spacing
262 : 88 : n2tmp = n2/spacing
263 : 88 : n3tmp = n3/spacing
264 [ - + ]: 88 : if( mod(n1,spacing) /= 0) then
265 : 0 : n1tmp = n1tmp + 1
266 : : end if
267 [ - + ]: 88 : if( mod(n2,spacing) /= 0) then
268 : 0 : n2tmp = n2tmp + 1
269 : : end if
270 [ - + ]: 88 : if( mod(n3,spacing) /= 0) then
271 : 0 : n3tmp = n3tmp + 1
272 : : end if
273 : : ! write(iun_plot,*) n1tmp,n2tmp,n3tmp,ikpt,nband_inc
274 : 88 : write(iun_plot) n1tmp,n2tmp,n3tmp,ikpt,nband_inc(isppol)
275 : : ! gbound=zero
276 : 88 : call sphereboundary(gbound,mywfc%hdr%istwfk(ikpt),kg_k,mgfft,npw_k)
277 : 88 : write(std_out,*) " writes UNK file for ikpt, spin=",ikpt,isppol
278 [ + + + + : 2506536 : denpot(:,:,:)=zero
+ + ]
279 : 88 : weight = one
280 [ + + ]: 1080 : do iband=1,mband
281 [ + - ]: 1080 : if(band_in(iband,isppol)) then
282 : : ! TODO: check if this is the right order.
283 [ + + ]: 1984 : do ispinor = 1, nspinor
284 [ + + + + ]: 606806 : cwavef = zero
285 [ + + ]: 202930 : do ipw = 1, npw_k
286 : : !do ig=1,npw_k*dtset%nspinor
287 : : !cwavef(1,ig)=cg(1,ipw+iwav(ispinor, iband,ikpt,isppol))
288 : : !cwavef(2,ig)=cg(2,ipw+iwav(ispinor, iband,ikpt,isppol))
289 : : !ig = ipw + (ispinor-1)*npw_k
290 : 201938 : ig = ipw
291 : 201938 : cwavef(1,ig)=mywfc%cg_elem(1,ipw, ispinor, iband, ikpt, isppol)
292 : 202930 : cwavef(2,ig)=mywfc%cg_elem(2,ipw, ispinor, iband, ikpt, isppol)
293 : : end do
294 : 992 : tim_fourwf=0
295 : : call fourwf(cplex,denpot,cwavef,fofgout,fofr,&
296 : : & gbound,gbound,mywfc%hdr%istwfk(ikpt),kg_k,kg_k,mgfft,&
297 : : & mpi_enreg,1,ngfft,npw_k,npw_k,n4,n5,n6,0,&
298 : 992 : & tim_fourwf,weight,weight,gpu_option=dtset%gpu_option)
299 : : ! do jj3=1,n3,spacing
300 : : ! do jj2=1,n2,spacing
301 : : ! do jj1=1,n1,spacing
302 : : ! write(iun_plot,*) fofr(1,jj1,jj2,jj3), fofr(2,jj1,jj2,jj3)
303 : : ! end do !jj1
304 : : ! end do !jj2
305 : : ! end do !jj3
306 : : ! unformatted (must be one record)
307 : 27241344 : write(iun_plot) (((fofr(1,jj1,jj2,jj3),fofr(2,jj1,jj2,jj3),&
308 [ - + - - : 27273824 : jj1=1,n1,spacing),jj2=1,n2,spacing),jj3=1,n3,spacing)
+ - - + -
- + - - +
- - - + -
+ + + + -
+ + + - +
+ ]
309 : : end do !ispinor
310 : : end if !iband
311 : : end do ! iband
312 [ - + ]: 88 : ABI_FREE(cwavef)
313 [ - + ]: 88 : ABI_FREE(fofr)
314 [ - + ]: 88 : ABI_FREE(gbound)
315 [ - + ]: 88 : ABI_FREE(denpot)
316 [ - + ]: 88 : ABI_FREE(fofgout)
317 : 88 : ikg=ikg+npw_k
318 : 92 : close(iun_plot)
319 : : end do ! ikpt
320 : : end do ! nsppol
321 [ - + ]: 4 : ABI_FREE(kg_k)
322 : : !
323 : 4 : write(msg, '(4a)' )ch10, ' ','UNK files written',ch10
324 : 4 : call wrtout(std_out, msg)
325 : 4 : end subroutine compute_and_write_unk
326 : :
327 : : !-----------------------------------------------------------------------
328 : : ! This subroutine writes the eigenvalues in the w90 format
329 : : ! (see w90io.F90 in w90 package)
330 : : !-----------------------------------------------------------------------
331 [ - + - + ]: 19 : subroutine write_eigenvalues(filew90_eig,eigen, band_in, eigenvalues_w, &
332 : : & nsppol, nkpt, mband, dtset, rank, master )
333 : :
334 : : integer, intent(in) :: nsppol, nkpt, mband, rank, master
335 : : character(len=fnlen),intent(in) :: filew90_eig(nsppol)
336 : : logical, intent(in) :: band_in(:, :)
337 : : real(dp), intent(in) :: eigen(mband,nkpt,nsppol)
338 : : real(dp), intent(inout) :: eigenvalues_w(:, :, :)
339 : : type(dataset_type),intent(in) :: dtset
340 : :
341 : : !Local variables-------------------------------
342 : : !scalars
343 : 38 : integer :: iun(nsppol), isppol, band_index, iband, jband, nband_k, ikpt
344 : : character(len=1000) :: msg
345 : : ! Assign file unit numbers
346 [ + - ]: 19 : if(rank==master) then
347 [ + + ]: 39 : do isppol=1,nsppol
348 [ + - - + ]: 20 : if (open_file(trim(filew90_eig(isppol)), msg, newunit=iun(isppol), &
349 : 19 : form="formatted", status="unknown", action="write") /= 0) then
350 : 0 : ABI_ERROR(msg)
351 : : endif
352 : : end do
353 : : end if !rank==master
354 : : ! Loop to write eigenvalues
355 : : band_index=0
356 [ + + ]: 39 : do isppol=1,nsppol
357 [ + + ]: 743 : do ikpt=1,nkpt
358 : 704 : nband_k=dtset%nband(ikpt+(isppol-1)*nkpt)
359 : 704 : jband=0
360 [ + + ]: 9232 : do iband=1,mband
361 [ + + ]: 9232 : if(band_in(iband,isppol)) then
362 : 6656 : jband=jband+1
363 : : ! Writing data
364 [ + - ]: 6656 : if (rank==master) then
365 : 6656 : write(iun(isppol), '(2i6,4x,f10.5)' ) jband,ikpt,Ha_eV*eigen(iband, ikpt, isppol)
366 : : end if
367 : : !eigen(iband+band_index)
368 : : ! save eigenvalues
369 : 6656 : eigenvalues_w(jband,ikpt,isppol)=Ha_eV*eigen(iband, ikpt, isppol)
370 : : !eigen(iband+band_index)
371 : : end if
372 : : end do !iband
373 : 20 : band_index=band_index+nband_k
374 : : end do !ikpt
375 : : end do !nsppol
376 [ + - ]: 19 : if(rank==master) then
377 [ + + ]: 39 : do isppol=1,nsppol
378 : 39 : close(iun(isppol))
379 : : end do
380 : 19 : write(msg, '(a,a)' ) ch10,' mlwfovlp : eigenvalues written'
381 : 19 : call wrtout(std_out, msg)
382 : : end if !master
383 : :
384 : 19 : end subroutine write_eigenvalues
385 : :
386 : :
387 : : !-----------------------------------------------------------------------
388 : : ! This subroutine writes the overlap matrix in the w90 format
389 : : ! (see w90io.F90 in w90 package)
390 : : !-----------------------------------------------------------------------
391 : : ! TODO: this routine is doing much more than writing Mmn!! It also calculates etc. The io module should be segregated and cleaned
392 [ - + - + : 19 : subroutine write_Mmn(filew90_mmn, band_in, cm1, ovikp, g1, M_matrix, &
- + ]
393 [ - + - + ]: 19 : & nkpt, nsppol, nntot, mband, num_bands, msg, iam_master, test_matrix_output)
394 : :
395 : : integer, intent(in) :: nsppol, nntot, nkpt
396 : : integer, intent(in) :: mband, num_bands(:)
397 : : character(len=fnlen), intent(in) :: filew90_mmn(nsppol)
398 : : logical, intent(in) :: band_in(mband, nsppol)
399 : : integer,intent(in):: ovikp(:,:)
400 : : integer, intent(in) :: g1(:, :, :)
401 : : real(dp), intent(in) :: cm1(:,:,:,:,:,:)
402 : : logical, intent(in) :: iam_master, test_matrix_output
403 : : complex(dp),intent(inout) :: M_matrix(:,:,:,:,:)
404 : :
405 : : !Local variables-------------------------------
406 : : !scalars
407 : : integer :: isppol, ikpt1, intot,ii, jj,jband1, iband1, jband2, iband2
408 : 38 : integer :: iun(nsppol), units(2)
409 : : character(len=1000) :: msg
410 : :
411 [ + + ]: 57 : units = [std_out, ab_out]
412 : :
413 [ + + ]: 39 : do isppol=1,nsppol !we write separate output files for each isppol
414 : 20 : iun(isppol)=220+isppol
415 [ + - ]: 39 : if (iam_master) then
416 : 20 : open(unit=iun(isppol),file=filew90_mmn(isppol),form='formatted',status='unknown')
417 : 20 : write(iun(isppol),*) "nnkp version 90"
418 : 20 : write(iun(isppol),*) num_bands(isppol),nkpt,nntot
419 : : end if
420 : : end do
421 : :
422 [ + + ]: 39 : do isppol=1,nsppol
423 [ + + ]: 724 : do ikpt1=1,nkpt
424 [ + + ]: 7108 : do intot=1,nntot
425 [ + - ]: 6384 : if( iam_master) then
426 : 6384 : write(iun(isppol),'(2i6,3x,3x,3i5)') ikpt1,ovikp(ikpt1,intot),(g1(jj,ikpt1,intot),jj=1,3)
427 : : end if
428 : : jband2=0
429 [ + + ]: 87536 : do iband2=1,mband ! the first index is faster
430 [ + + ]: 86832 : if(band_in(iband2,isppol)) then
431 : 65472 : jband2=jband2+1
432 : 65472 : jband1=0
433 [ + + ]: 1061056 : do iband1=1,mband
434 [ + + ]: 1061056 : if(band_in(iband1,isppol)) then
435 : 907008 : jband1=jband1+1
436 [ + - ]: 907008 : if(iam_master) write(iun(isppol),*) cm1(1,iband1,iband2,intot,ikpt1,isppol),cm1(2,iband1,iband2,intot,ikpt1,isppol)
437 : : M_matrix(jband1,jband2,intot,ikpt1,isppol)=&
438 : 907008 : & cmplx(cm1(1,iband1,iband2,intot,ikpt1,isppol),cm1(2,iband1,iband2,intot,ikpt1,isppol), kind=dp )
439 : : ! write(2211,*) ikpt1,intot,iband1,iband2
440 : : ! write(2211,*) cm1(1,iband1,iband2,intot,ikpt1,isppol),cm1(2,iband1,iband2,intot,ikpt1,isppol)
441 : : end if ! band_in(iband1)
442 : : end do ! iband1
443 : : end if ! band_in(iband2)
444 : : end do ! iband2
445 : : end do !intot
446 : : end do !ikpt
447 [ + - ]: 39 : if( iam_master ) then
448 : 20 : close(iun(isppol))
449 [ + - ]: 20 : write(msg, '(3a)' ) ' ',trim(filew90_mmn(isppol)),' written'
450 : 20 : call wrtout(std_out, msg)
451 : : end if !rank==master
452 : : end do !isppol
453 : :
454 : :
455 : : ! Individual spinor overlap elements depend on the arbitrary gauge selected
456 : : ! in degenerate subspaces. The complete .mmn file above is always written.
457 [ + - + + ]: 19 : if(iam_master .and. test_matrix_output) then
458 : 17 : write(msg, '(4a)' ) ch10,&
459 : 17 : ' Writing top of the overlap matrix: M_mn(ikb,ik)',ch10,&
460 : 34 : ' m=n=1:3, ikb=1, ik=1'
461 : 17 : call wrtout(units, msg)
462 : :
463 : : ! just write down the first 3 elements
464 [ + + ]: 35 : do isppol=1,nsppol
465 : 18 : write(msg, '( " " )')
466 [ + + ]: 18 : if (nsppol>1 ) then
467 [ + + ]: 2 : if (isppol==1) write(msg,'(2a)')trim(msg),' spin up:'
468 [ + + ]: 2 : if (isppol==2) write(msg,'(2a)')trim(msg),' spin down:'
469 : : end if
470 [ + + ]: 72 : do ii=1,3
471 [ - + ]: 54 : if(ii>num_bands(isppol)) cycle
472 : 54 : write(msg,'(3a)') trim(msg),ch10,'; ( '
473 [ + + ]: 216 : do jj=1,3
474 [ - + ]: 162 : if(jj>num_bands(isppol))cycle
475 : 216 : write(msg, '(a,2f11.6,a)') trim(msg),M_matrix(ii,jj,1,1,isppol),' , '
476 : : end do
477 : 72 : write(msg,'(2a)') trim(msg),' ) '
478 : : end do
479 : 35 : call wrtout(units, msg)
480 : : end do
481 : :
482 : : ! Now write down bottom of the matrix
483 : 17 : write(msg, '(4a)' ) ch10,&
484 : 17 : ' Writing bottom of the overlap matrix: M_mn(ikb,ik)',ch10,&
485 : 34 : ' m=n=num_bands-2:num_bands, ikb=nntot, ik=nkpt'
486 : 17 : call wrtout(units, msg)
487 : :
488 [ + + ]: 35 : do isppol=1,nsppol
489 : 18 : write(msg, '( " " )')
490 [ + + ]: 18 : if (nsppol>1 ) then
491 [ + + ]: 2 : if (isppol==1) write(msg,'(2a)')trim(msg),' spin up:'
492 [ + + ]: 2 : if (isppol==2) write(msg,'(2a)')trim(msg),' spin down:'
493 : : end if
494 [ + + ]: 72 : do ii=num_bands(isppol)-2,num_bands(isppol)
495 [ - + ]: 54 : if(ii<1) cycle
496 : 54 : write(msg,'(3a)') trim(msg),ch10,'; ( '
497 [ + + ]: 216 : do jj=num_bands(isppol)-2,num_bands(isppol)
498 [ - + ]: 162 : if(jj<1)cycle
499 : 216 : write(msg, '(a,2f11.6,a)') trim(msg),M_matrix(ii,jj,nntot,nkpt,isppol),' , '
500 : : end do !j
501 : 72 : write(msg,'(2a)') trim(msg),' ) '
502 : : end do !ii
503 : 35 : call wrtout(units, msg)
504 : : end do !isppol
505 : : end if !rank==master
506 : :
507 : 19 : end subroutine write_Mmn
508 : :
509 : : !!****f* mlwfovlp/read_chkunit
510 : : !! NAME
511 : : !! read_chkunit
512 : : !!
513 : : !! FUNCTION
514 : : !! Function which reads the .chk file produced by Wannier90
515 : : !!
516 : : !! INPUTS
517 : : !!
518 : : !! OUTPUT
519 : : !!
520 : : !! SOURCE
521 : :
522 : 0 : subroutine read_chkunit(seed_name,nkpt,ndimwin,ierr)
523 : :
524 : : !Arguments ------------------------------------
525 : : !scalars
526 : : integer,intent(in) :: nkpt
527 : : character(len=*),intent(in) :: seed_name
528 : : integer,intent(out) :: ierr
529 : : !arrays
530 : : integer,intent(out) :: ndimwin(nkpt)
531 : :
532 : : !Local variables-------------------------------
533 : : !string
534 : : character(len=fnlen) :: fname
535 : : !scalars
536 : : integer :: chk_unit,ios,ikpt
537 : : logical :: have_disentangled
538 : :
539 : : !************************************************************************
540 : :
541 : 0 : chk_unit=get_unit()
542 [ # # ]: 0 : fname=TRIM(seed_name)//'.chk'
543 : 0 : open(unit=chk_unit,file=fname,form='unformatted',status='old',iostat=ios)
544 : :
545 : 0 : ierr=0
546 : 0 : read(chk_unit) ! header ! Date and time
547 : 0 : read(chk_unit) ! ((real_lattice(i,j),i=1,3),j=1,3) ! Real lattice
548 : 0 : read(chk_unit) ! ((recip_lattice(i,j),i=1,3),j=1,3) ! Reciprocal lattice
549 : 0 : read(chk_unit) ! num_kpts
550 : 0 : read(chk_unit) ! ((kpt_latt(i,nkp),i=1,3),nkp=1,num_kpts) ! K-points
551 : 0 : read(chk_unit) ! nntot ! Number of nearest k-point neighbours
552 : 0 : read(chk_unit) ! num_wann ! Number of wannier functions
553 : 0 : read(chk_unit) ! chkpt1 ! Position of checkpoint
554 : 0 : read(chk_unit) have_disentangled ! Whether a disentanglement has been performed
555 [ # # ]: 0 : if (have_disentangled) then
556 : : !read(chk_unit) ! omega_invariant ! Omega invariant
557 : : !read(chk_unit) ((lwindow(i,nkp),i=1,num_bands),nkp=1,num_kpts)
558 : 0 : read(chk_unit) (ndimwin(ikpt),ikpt=1,nkpt)
559 : : !read(chk_unit) (((u_matrix_opt(i,j,nkp),i=1,num_bands),j=1,num_wann),nkp=1,num_kpts)
560 : : else
561 : : ! this is not expected. we should have disentanglement. Report the error.
562 : 0 : ierr=-1
563 : : end if
564 : : !read(chk_unit) (((u_matrix(i,j,k),i=1,num_wann),j=1,num_wann),k=1,num_kpts) ! U_matrix
565 : : !read(chk_unit) ((((m_matrix(i,j,k,l,1),i=1,num_wann),j=1,num_wann),k=1,nntot),l=1,num_kpts) ! M_matrix
566 : : !read(chk_unit) ((wannier_centres(i,j),i=1,3),j=1,num_wann)
567 : 0 : close(chk_unit)
568 : :
569 : 0 : end subroutine read_chkunit
570 : : !!***
571 : :
572 : : end module m_wannier_io
|