wannier.F

Go to the documentation of this file.
00001       PROGRAM WANNIER          
00002       use m_rdinput       
00003       use fft_3d
00004       use m_bvector, only: generate_bvectors
00005       use m_frmsf_wan, only: wrt_frmsf_wan
00006       use m_dos, only: calculate_dos 
00007       use m_eigenstate, only: calculate_eigenstate
00008       use m_wrt_frmsf, only: wrt_frmsf 
00009       use m_wrt_model  
00010       use m_dmx, only: calculate_dmx 
00011       use m_fat_band, only: calc_fat_band 
00012       include "config.h"
00013       !--
00014       call read_input
00015       NGAUSS=n_occ!TOTAL NUMBER OF WANNIER ORBITAL  
00016       !
00017       !20191216 Jean Moree
00018       !
00019       !E_LOWER=E_LOWER/au 
00020       !E_UPPER=E_UPPER/au 
00021       !write(6,*)'E_LOWER in au',E_LOWER 
00022       !write(6,*)'E_UPPER in au',E_UPPER 
00023       !
00024       if(flg_specify_energywindow)then
00025          E_LOWER=E_LOWER/au 
00026          E_UPPER=E_UPPER/au 
00027          write(6,*)'E_LOWER in au',E_LOWER 
00028          write(6,*)'E_UPPER in au',E_UPPER 
00029       endif
00030       !
00031       E_LOWER_inner=E_LOWER_inner/au 
00032       E_UPPER_inner=E_UPPER_inner/au 
00033       write(6,*)'E_LOWER_inner in au',E_LOWER_inner 
00034       write(6,*)'E_UPPER_inner in au',E_UPPER_inner 
00035 !--
00036 !      do ig=1,nigs 
00037 !       write(6,*) vec_ini(ig) 
00038 !      enddo 
00039 !--
00040 !      do ix=1,3 
00041 !       write(6,'(100f10.5)')(SK_sym_pts(ix,ik),ik=1,N_sym_points)
00042 !      enddo 
00043 !--
00044       WRITE(6,*) 
00045       WRITE(6,*)'=========================================='
00046       WRITE(6,*)'=== WANNIER FUNCTION CALCULATION START ==='
00047       WRITE(6,*)'=========================================='
00048       WRITE(6,*) 
00049 !--
00050 !OPEN(117,R,FILE='dat.bandcalc') 
00051       OPEN(117,FILE='./dir-wfn/dat.bandcalc') 
00052       rewind(117) 
00053       read(117,*) Ecut_for_psi 
00054       read(117,*) FermiEnergy  
00055       read(117,*) Etot
00056       write(6,*)'Ecut_for_psi=',Ecut_for_psi 
00057       write(6,*)'FermiEnergy=',FermiEnergy  
00058       write(6,*)'Etot=',Etot
00059 !--
00060 !OPEN(105,R,FILE='dat.lattice')
00061       OPEN(105,FILE='./dir-wfn/dat.lattice') 
00062       REWIND(105)
00063       READ(105,*) a1(1),a1(2),a1(3)!a1 vector
00064       READ(105,*) a2(1),a2(2),a2(3)!a2 vector
00065       READ(105,*) a3(1),a3(2),a3(3)!a3 vector
00066       CLOSE(105)
00067       !--
00068       call OUTER_PRODUCT(a2(1),a3(1),b1(1))
00069       VOLUME=a1(1)*b1(1)+a1(2)*b1(2)+a1(3)*b1(3)
00070       b1(:)=b1(:)*tpi/VOLUME 
00071       call OUTER_PRODUCT(a3(1),a1(1),b2(1))
00072       b2(:)=b2(:)*tpi/VOLUME 
00073       call OUTER_PRODUCT(a1(1),a2(1),b3(1))
00074       b3(:)=b3(:)*tpi/VOLUME 
00075       !--
00076       write(6,*) 
00077       write(6,*)'=============='
00078       write(6,*)'LATTICE VECTOR'
00079       write(6,*)'=============='
00080       write(6,*) 
00081       write(6,*) a1(1), a1(2), a1(3)
00082       write(6,*) a2(1), a2(2), a2(3)
00083       write(6,*) a3(1), a3(2), a3(3)
00084       write(6,*) 
00085       write(6,*)'VOLUME OF UNIT CELL=',VOLUME  
00086       write(6,*) 
00087       write(6,*)'========================='
00088       write(6,*)'RECIPROCAL LATTICE VECTOR'
00089       write(6,*)'========================='
00090       write(6,*) 
00091       write(6,*) b1(1), b1(2), b1(3)
00092       write(6,*) b2(1), b2(2), b2(3)
00093       write(6,*) b3(1), b3(2), b3(3)
00094       write(6,*) 
00095       write(6,*)'======================'
00096       write(6,*)'CHECK OF (A_VEC*B_VEC)'
00097       write(6,*)'======================'
00098       write(6,*) 
00099       write(6,*)'a1*b1=',b1(1)*a1(1)+b1(2)*a1(2)+b1(3)*a1(3)
00100       write(6,*)'a2*b2=',b2(1)*a2(1)+b2(2)*a2(2)+b2(3)*a2(3)
00101       write(6,*)'a3*b3=',b3(1)*a3(1)+b3(2)*a3(2)+b3(3)*a3(3)
00102       call est_latparam(a1(1),a2(1),a3(1),a,b,c,alp,bet,gmm) 
00103       write(6,'(6f15.10)') a,b,c,alp,bet,gmm 
00104 !--
00105 !OPEN(107,R,FILE='dat.atom_kind')
00106 !      OPEN(107,FILE='./dir-wfn/dat.atom_kind') 
00107 !      rewind(107)
00108 !      read(107,*) nkd 
00109 !      allocate(zo(nkd));zo=0.0d0
00110 !      allocate(zn(nkd));zn=0.0d0
00111 !      do i=1,nkd 
00112 !       read(107,*) zo(i),zn(i)
00113 !      enddo
00114 !      close(107)
00115 !--
00116 !OPEN(108,R,FILE='dat.atom_position')
00117 !      OPEN(108,FILE='./dir-wfn/dat.atom_position') 
00118 !      rewind(108)
00119 !      read(108,*) nsi 
00120 !      allocate(kd(nsi));kd=0 
00121 !      allocate(asi(3,nsi));asi=0.0d0
00122 !      do i=1,nsi  
00123 !       read(108,*) kd(i),(asi(j,i),j=1,3) 
00124 !      enddo 
00125 !      close(108)
00126 !--
00127 !OPEN(108,R,FILE='dat.atom_position')
00128       OPEN(108,FILE='./dir-wfn/dat.atom_position') 
00129       rewind(108)
00130       read(108,*) nsi 
00131       allocate(chemical_species(nsi))
00132       allocate(asi(3,nsi));asi=0.0d0
00133       do i=1,nsi  
00134        read(108,*) chemical_species(i),(asi(j,i),j=1,3) 
00135       enddo 
00136       close(108)
00137 !--
00138 !OPEN(100,R,FILE='dat.symmetry') 
00139       OPEN(100,FILE='./dir-wfn/dat.symmetry') 
00140       rewind(100) 
00141       read(100,*) nsymq 
00142       read(100,*) nnp 
00143       write(6,*)'nsymq=',nsymq 
00144       write(6,*)'nnp=',nnp 
00145       allocate(rg(3,3,nsymq));rg=0
00146       allocate(pg(3,nsymq));pg=0
00147       allocate(rginv(3,3,nsymq));rginv=0.0d0 
00148       do iop=1,nsymq
00149        read(100,*)((rg(i,j,iop),i=1,3),j=1,3) 
00150        read(100,*)(pg(i,iop),i=1,3)   
00151       enddo 
00152       close(100) 
00153       !--
00154       write(6,*) 
00155       write(6,*)'========'
00156       write(6,*)'SYMMETRY'
00157       write(6,*)'========'
00158       write(6,*) 
00159       do iop=1,nsymq  
00160        write(6,'(a5,i4)')'sym=',iop
00161        write(6,'(a10)')'rg and pg' 
00162        do i=1,3
00163         write(6,'(3i5,5x,i5)')(rg(i,j,iop),j=1,3),pg(i,iop) 
00164        enddo
00165        write(6,*) 
00166       enddo
00167       !--
00168       rginv=rg 
00169       do iop=1,nsymq
00170        call invmat(3,rginv(1,1,iop)) 
00171       enddo 
00172       !--
00173       do iop=1,nsymq  
00174        write(6,'(a5,i4)')'sym=',iop
00175        write(6,'(a10)')'rginv' 
00176        do i=1,3
00177         write(6,'(3f10.5)')(rginv(i,j,iop),j=1,3) 
00178        enddo
00179        write(6,*) 
00180       enddo
00181       write(6,*)'finish read dat.symmetry'
00182 !--
00183 !OPEN(101,R,FILE='dat.sample-k') 
00184       OPEN(101,FILE='./dir-wfn/dat.sample-k') 
00185       rewind(101) 
00186       read(101,*) Nk_irr 
00187       allocate(SKI(3,Nk_irr));SKI(:,:)=0.0D0 
00188       do ik=1,Nk_irr 
00189        read(101,*)(SKI(i,IK),i=1,3) 
00190       enddo 
00191       close(101) 
00192       !call est_NTK(NK_irr,SKI(1,1),NTK,nkb1,nkb2,nkb3)  
00193       !write(6,'(a24,4i10)')'nkb1,nkb2,nkb3,NTK=',nkb1,nkb2,nkb3,NTK  
00194       !Na1=nkb1/2;Na2=nkb2/2;Na3=nkb3/2
00195       !write(6,'(a24,3i10)')'Na1,Na2,Na3=',Na1,Na2,Na3 
00196 !--
00197 !OPEN(132,R,FILE='dat.nkm') 
00198       OPEN(132,FILE='./dir-wfn/dat.nkm') 
00199       allocate(NGI(Nk_irr));NGI(:)=0
00200       rewind(132)
00201       do ik=1,Nk_irr 
00202        read(132,*) NGI(ik) 
00203       enddo 
00204       close(132) 
00205       NTG=maxval(abs(NGI(:))) 
00206       write(6,'(a10,i10)')'NTG=',NTG  
00207 !--
00208 !OPEN(104,R,FILE='dat.kg') 
00209       OPEN(104,FILE='./dir-wfn/dat.kg') 
00210       rewind(104) 
00211       allocate(KGI(3,NTG,Nk_irr));KGI=0 
00212       do ik=1,Nk_irr 
00213        read(104,*) NKG_tmp
00214        if(NKG_tmp/=NGI(ik)) then 
00215         write(6,*)'ERROR; STOP; NKG_tmp should be NGI(ik)'   
00216         write(6,*)'NKG_tmp=',NKG_tmp,'NGI(ik)=',NGI(ik)
00217         stop 
00218        endif 
00219        do ig=1,NKG_tmp
00220         read(104,*)(KGI(i,ig,ik),i=1,3) 
00221        enddo!ig 
00222       enddo!ik  
00223       close(104)
00224       !--
00225       L1=maxval(abs(KGI(1,:,:)))+1; write(6,*)'L1=',L1 
00226       L2=maxval(abs(KGI(2,:,:)))+1; write(6,*)'L2=',L2 
00227       L3=maxval(abs(KGI(3,:,:)))+1; write(6,*)'L3=',L3 
00228       allocate(packing(-L1:L1,-L2:L2,-L3:L3,Nk_irr))   
00229       packing(:,:,:,:)=0 
00230       do ik=1,Nk_irr 
00231        do ig=1,NGI(ik) 
00232         i1=KGI(1,ig,ik); j1=KGI(2,ig,ik); k1=KGI(3,ig,ik) 
00233         packing(i1,j1,k1,ik)=ig 
00234        enddo 
00235       enddo 
00236       !--
00237       allocate(LKGI(NTG,Nk_irr));LKGI=0.0d0 
00238       do ik=1,Nk_irr 
00239        do ig=1,NGI(ik) 
00240        ktmp(1)=(SKI(1,ik)+dble(KGI(1,ig,ik)))*b1(1)
00241      +        +(SKI(2,ik)+dble(KGI(2,ig,ik)))*b2(1) 
00242      +        +(SKI(3,ik)+dble(KGI(3,ig,ik)))*b3(1) 
00243 
00244        ktmp(2)=(SKI(1,ik)+dble(KGI(1,ig,ik)))*b1(2)
00245      +        +(SKI(2,ik)+dble(KGI(2,ig,ik)))*b2(2) 
00246      +        +(SKI(3,ik)+dble(KGI(3,ig,ik)))*b3(2) 
00247 
00248        ktmp(3)=(SKI(1,ik)+dble(KGI(1,ig,ik)))*b1(3)
00249      +        +(SKI(2,ik)+dble(KGI(2,ig,ik)))*b2(3) 
00250      +        +(SKI(3,ik)+dble(KGI(3,ig,ik)))*b3(3) 
00251        LKGI(ig,ik)=ktmp(1)**2+ktmp(2)**2+ktmp(3)**2
00252        enddo!ig 
00253        write(6,*) maxval(LKGI(:,ik))
00254       enddo!ik 
00255       write(6,*) 
00256       write(6,*) maxval(LKGI(:,:))
00257       Ecut_for_psi=maxval(LKGI(:,:))+1.0d-8
00258       write(6,*)'Ecut_for_psi=',Ecut_for_psi 
00259 !--
00260 !fft grid
00261       !--
00262       !m1=maxval(abs(KGI(1,:,:))) 
00263       !m2=maxval(abs(KGI(2,:,:))) 
00264       !m3=maxval(abs(KGI(3,:,:))) 
00265       !nwx2=algn235(2*m1) 
00266       !nwy2=algn235(2*m2) 
00267       !nwz2=algn235(2*m3) 
00268       !--
00269       htmp=dsqrt(dot_product(a1,a1))
00270       h1(:)=a1(:)/htmp 
00271       htmp=dsqrt(dot_product(a2,a2))
00272       h2(:)=a2(:)/htmp 
00273       htmp=dsqrt(dot_product(a3,a3)) 
00274       h3(:)=a3(:)/htmp 
00275       d1=abs(dot_product(b1,h1)) 
00276       d2=abs(dot_product(b2,h2)) 
00277       d3=abs(dot_product(b3,h3)) 
00278       qwf=2.0d0*dsqrt(Ecut_for_psi) 
00279       !--
00280       !nwx2=algn235(int(qwf/d1)+1,1)!wrong 
00281       !nwy2=algn235(int(qwf/d2)+1,1)!wrong 
00282       !nwz2=algn235(int(qwf/d3)+1,1)!wrong 
00283       !--
00284       nwx2=algn235(int(qwf/d1)+1)!20180412 by Y.Nomura 
00285       nwy2=algn235(int(qwf/d2)+1)!20180412 by Y.Nomura 
00286       nwz2=algn235(int(qwf/d3)+1)!20180412 by Y.Nomura 
00287       !--
00288       nfft1=nwx2+1;nfft2=nwy2+1;nfft3=nwz2+1
00289       Nl123=nfft1*nfft2*nfft3 
00290       write(6,'(a20,i10)')'nwx2:',nwx2 
00291       write(6,'(a20,i10)')'nwy2:',nwy2 
00292       write(6,'(a20,i10)')'nwz2:',nwz2 
00293       write(6,'(a20,i10)')'nfft1:',nfft1 
00294       write(6,'(a20,i10)')'nfft2:',nfft2 
00295       write(6,'(a20,i10)')'nfft3:',nfft3 
00296       write(6,'(a20,i10)')'NL123:',Nl123  
00297 !--
00298 !call fft3_init(nwx2,nwy2,nwz2,nfft1,nfft2,nfft3,fs) 
00299 !--
00300 !OPEN(111,R,FILE='dat.eigenvalue') 
00301       OPEN(111,FILE='./dir-wfn/dat.eigenvalue') 
00302       rewind(111)
00303       read(111,*) NBAND 
00304       allocate(E_EIGI(NBAND,Nk_irr));E_EIGI=0.0d0
00305       do ik=1,Nk_irr 
00306        do ib=1,NBAND 
00307         read(111,*) E_EIGI(ib,ik)
00308        enddo!ib
00309       enddo!ik          
00310       !--
00311       !
00312       !20191216 Jean Moree
00313       !
00314       ! call calc_NB_start_end(NK_irr,NBAND,E_EIGI(1,1),E_LOWER,E_UPPER,
00315       !+     NB_start,NB_end) 
00316       !
00317       if(flg_specify_energywindow)then
00318          call calc_NB_start_end(NK_irr,NBAND,E_EIGI(1,1),
00319      +        E_LOWER,E_UPPER,NB_start,NB_end) 
00320       !--    
00321       endif
00322       if(flg_specify_bandindices)then
00323          write(6,'(3a)') "WARNING : ",
00324      +        "flg_specify_bandindices=.true. : ",
00325      +        "setting NB_start,NB_end to bandindex_min,bandindex_max"
00326          NB_start=bandindex_min
00327          NB_end=bandindex_max
00328       endif
00329       !--
00330       NTB_glb=NBAND 
00331       NTB=NB_end-NB_start+1!TOTAL NUMBER OF CONSIDERED BAND in wannier  
00332       write(6,'(a20,i10)')'NTB_glb:',NTB_glb  
00333       write(6,'(a20,i10)')'NB_start:',NB_start 
00334       write(6,'(a20,i10)')'NB_end:',NB_end 
00335       write(6,'(a20,i10)')'NTB:',NTB 
00336       deallocate(E_EIGI) 
00337 !--
00338 !OPEN(111,R,FILE='dat.eigenvalue') 
00339       OPEN(111,FILE='./dir-wfn/dat.eigenvalue') 
00340       rewind(111)
00341       read(111,*) NBAND 
00342       allocate(E_EIGI(NTB,Nk_irr));E_EIGI=0.0d0
00343       do ik=1,Nk_irr 
00344        do ib=1,NBAND!NBI(ik) 
00345         if((ib.ge.NB_start).and.(ib.le.NB_end)) then  
00346          read(111,*) E_EIGI(ib-NB_start+1,ik)
00347         else 
00348          read(111,*) 
00349         endif 
00350        enddo!ib
00351       enddo!ik          
00352 !--
00353       call est_NTK(Nk_irr,Nsymq,SKI(1,1),rg(1,1,1),NTK)
00354       write(6,'(a20,i10)')'Estimated NTK:',NTK 
00355 !--
00356 !SK0,numirr,numrot,trs,RW
00357       allocate(SK0(3,NTK));SK0(:,:)=0.0d0
00358       allocate(numirr(NTK));numirr(:)=0
00359       allocate(numrot(NTK));numrot(:)=0
00360       allocate(trs(NTK));trs(:)=0
00361       allocate(RW(3,NTK));RW(:,:)=0
00362 !--
00363 !      do ik=1,Nk_irr 
00364 !       SK0(:,ik)=SKI(:,ik) 
00365 !       numirr(ik)=ik;numrot(ik)=1;trs(ik)=1;RW(1:3,ik)=0
00366 !      enddo 
00367 !      jk=Nk_irr 
00368 !--
00369       jk=0
00370       do ik=1,Nk_irr
00371        !write(6,*)'--' 
00372        !write(6,'(a8,i8,3f15.10)')'ik=',ik,SKI(:,ik)  
00373        !write(6,*)'--' 
00374       do iop=1,Nsymq
00375 !sym
00376        ktmp(:)=0.0d0;RWtmp(:)=0  
00377        ktmp(1)=rg(1,1,iop)*SKI(1,ik)+rg(1,2,iop)*SKI(2,ik)
00378      +        +rg(1,3,iop)*SKI(3,ik)
00379        ktmp(2)=rg(2,1,iop)*SKI(1,ik)+rg(2,2,iop)*SKI(2,ik)
00380      +        +rg(2,3,iop)*SKI(3,ik)
00381        ktmp(3)=rg(3,1,iop)*SKI(1,ik)+rg(3,2,iop)*SKI(2,ik)
00382      +        +rg(3,3,iop)*SKI(3,ik)
00383        call kcheck(ktmp(1),RWtmp(1))!rewind check 
00384        do iik=1,jk
00385         if(abs(SK0(1,iik)-ktmp(1))<1.0d-4.and. 
00386      +     abs(SK0(2,iik)-ktmp(2))<1.0d-4.and. 
00387      +     abs(SK0(3,iik)-ktmp(3))<1.0d-4)goto 1000
00388        enddo!iik
00389        jk=jk+1
00390        !write(6,'(a8,i8,3f15.10)')'jk=',jk,ktmp(:)  
00391        SK0(:,jk)=ktmp(:)
00392        numirr(jk)=ik;numrot(jk)=iop;trs(jk)=1;RW(:,jk)=RWtmp(:)
00393        !if(.true.)goto 2000
00394 !time-reversal
00395 1000   ktmp(:)=0.0d0;RWtmp(:)=0  
00396        ktmp(1)=rg(1,1,iop)*SKI(1,ik)+rg(1,2,iop)*SKI(2,ik)
00397      +        +rg(1,3,iop)*SKI(3,ik)
00398        ktmp(2)=rg(2,1,iop)*SKI(1,ik)+rg(2,2,iop)*SKI(2,ik)
00399      +        +rg(2,3,iop)*SKI(3,ik)
00400        ktmp(3)=rg(3,1,iop)*SKI(1,ik)+rg(3,2,iop)*SKI(2,ik)
00401      +        +rg(3,3,iop)*SKI(3,ik)
00402        call kcheck_trs(ktmp(1),RWtmp(1))!rewind check modified 20170316  
00403        do iik=1,jk
00404         if(abs(SK0(1,iik)-(-ktmp(1)))<1.0d-4.and. 
00405      +     abs(SK0(2,iik)-(-ktmp(2)))<1.0d-4.and. 
00406      +     abs(SK0(3,iik)-(-ktmp(3)))<1.0d-4)goto 2000
00407        enddo!iik
00408        jk=jk+1
00409        !write(6,'(a8,i8,3f15.10)')'jk=',jk,ktmp(:)  
00410        SK0(:,jk)=-ktmp(:) 
00411        numirr(jk)=ik;numrot(jk)=iop;trs(jk)=-1;RW(:,jk)=RWtmp(:) 
00412 2000  enddo 
00413       enddo 
00414       !--
00415       if(NTK/=jk) then 
00416        write(6,*)'ERROR;STOP;NTK should be jk'   
00417        write(6,*)'NTK=',NTK,'jk=',jk;STOP
00418       endif 
00419       !--
00420       write(6,*) 
00421       write(6,*)'====================='
00422       write(6,*)'WRITE SAMPLE K-POINTS'
00423       write(6,*)'====================='
00424       do ik=1,NTK
00425        WRITE(6,'(I5,3F15.10)') ik,SK0(:,ik) 
00426       enddo  
00427 !--
00428 !      do ik=1,NTK 
00429 !       write(6,*) ik,numrot(ik) 
00430 !      enddo 
00431 !--
00432       call est_nkbi(NTK,SK0(1,1),nkb1,nkb2,nkb3)  
00433       write(6,*) 
00434       write(6,'(a24,4i10)')'nkb1,nkb2,nkb3,NTK=',nkb1,nkb2,nkb3,NTK  
00435       Na1=nkb1/2;Na2=nkb2/2;Na3=nkb3/2
00436       write(6,'(a24,3i10)')'Na1,Na2,Na3=',Na1,Na2,Na3 
00437 !--
00438       call system('rm -rf dir-wan') 
00439       call system('mkdir dir-wan') 
00440 !--
00441 !write Fermi surface 
00442       if(CALC_FERMISURFACE)then 
00443         write(6,*) 
00444         write(6,'(a30)')'write Fermi surface'
00445         write(6,*) 
00446         allocate(E_EIG(NTB,NTK));E_EIG(:,:)=0.0d0
00447         do jk=1,NTK 
00448          if(trs(jk)==1) then 
00449           ik=numirr(jk) 
00450           E_EIG(:,jk)=E_EIGI(:,ik) 
00451          elseif(trs(jk)==-1)then  
00452           ik=numirr(jk) 
00453           E_EIG(:,jk)=E_EIGI(:,ik) 
00454          endif 
00455         enddo!jk  
00456         filename='./dir-wan/dat.frmsf'
00457         call wrt_frmsf(NTB,NTK,nkb1,nkb2,nkb3,E_EIG(1,1),SK0(1,1),
00458      +       FermiEnergy,filename,b1(1),b2(1),b3(1)) 
00459         deallocate(E_EIG)
00460       endif 
00461 !-- 
00462 !write global DOS
00463       if(CALC_GLOBAL_DOS)then 
00464         write(6,*) 
00465         write(6,'(a30)')'write global DOS'
00466         write(6,*) 
00467         allocate(E_EIG(NTB,NTK));E_EIG(:,:)=0.0d0
00468         allocate(V_EIG(NTB,NTB,NTK));V_EIG(:,:,:)=0.0d0
00469         do jk=1,NTK 
00470          if(trs(jk)==1) then 
00471           ik=numirr(jk) 
00472           E_EIG(:,jk)=E_EIGI(:,ik) 
00473          elseif(trs(jk)==-1)then  
00474           ik=numirr(jk) 
00475           E_EIG(:,jk)=E_EIGI(:,ik) 
00476          endif 
00477         enddo!jk  
00478         filename='./dir-wan/dat.dos.global'
00479         call calculate_dos(NTB,NTK,nkb1,nkb2,nkb3,0.0d0,FermiEnergy,
00480      +   filename,b1(1),b2(1),b3(1),SK0(1,1),E_EIG(1,1),V_EIG(1,1,1))
00481         deallocate(E_EIG,V_EIG)
00482       endif 
00483 !--
00484 !OPEN(102,R,FILE='dat.wfn',FORM='unformatted') 
00485       OPEN(102,FILE='./dir-wfn/dat.wfn',FORM='unformatted') 
00486 !old--
00487 !      allocate(CIR(NTG,NTB,Nk_irr));CIR=0.0d0  
00488 !      rewind(102)
00489 !      do ik=1,Nk_irr 
00490 !       do ib=1,NBAND!NBI(ik) 
00491 !        if((ib.ge.NB_start).and.(ib.le.NB_end)) then  
00492 !         read(102)(CIR(IG,ib-NB_start+1,ik),IG=1,NGI(ik))
00493 !        else 
00494 !         read(102) 
00495 !        endif 
00496 !       enddo!ib 
00497 !      enddo!ik          
00498 !      close(102) 
00499 !new--
00500       rewind(102)
00501       read(102) ncomp 
00502       if(ncomp/=1)then 
00503        write(6,*)'This program not suport ncomp/=1; then stop'
00504        stop
00505       endif 
00506       allocate(CIR(NTG,NTB,Nk_irr));CIR=0.0d0  
00507       do ik=1,Nk_irr 
00508        do ib=1,NBAND 
00509         if((ib.ge.NB_start).and.(ib.le.NB_end)) then  
00510          read(102)(CIR(IG,ib-NB_start+1,ik),IG=1,NGI(ik))
00511         else 
00512          read(102) 
00513         endif 
00514        enddo!ib 
00515       enddo!ik          
00516       close(102) 
00517 !--
00518 !gen(C0,E_EIG,NG0,NB0,KG0) 
00519       allocate(C0(NTG,NTB,NTK));C0(:,:,:)=0.0d0
00520       allocate(E_EIG(NTB,NTK));E_EIG(:,:)=0.0d0
00521       allocate(NB0(NTK));NB0(:)=0
00522       allocate(NG0(NTK));NG0(:)=0
00523       allocate(KG0(3,NTG,NTK));KG0(:,:,:)=0 
00524       allocate(KGtmp(3,NTG));KGtmp(:,:)=0 
00525 !20161207
00526 !      do jk=1,Nk_irr 
00527 !       C0(:,:,jk)=CIR(:,:,jk) 
00528 !       E_EIG(:,jk)=E_EIGI(:,jk) 
00529 !       NB0(jk)=NBI(jk)
00530 !       NG0(jk)=NGI(jk)
00531 !       KG0(:,:,jk)=KGI(:,:,jk)
00532 !      enddo 
00533 !      do jk=Nk_irr+1,NTK 
00534 !--
00535        do jk=1,NTK 
00536        if(trs(jk)==1) then 
00537         ik=numirr(jk);iop=numrot(jk) 
00538         ktmp(1)=rg(1,1,iop)*SKI(1,ik)+rg(1,2,iop)*SKI(2,ik)
00539      +         +rg(1,3,iop)*SKI(3,ik)+dble(RW(1,jk)) 
00540         ktmp(2)=rg(2,1,iop)*SKI(1,ik)+rg(2,2,iop)*SKI(2,ik)
00541      +         +rg(2,3,iop)*SKI(3,ik)+dble(RW(2,jk))  
00542         ktmp(3)=rg(3,1,iop)*SKI(1,ik)+rg(3,2,iop)*SKI(2,ik)
00543      +         +rg(3,3,iop)*SKI(3,ik)+dble(RW(3,jk))  
00544         E_EIG(:,jk)=E_EIGI(:,ik) 
00545         NB0(jk)=NBAND!NBI(ik)
00546 !--
00547 !20170316 KG0s are generated by original KGI
00548 !        NG0(jk)=NGI(ik) 
00549 !        do ig=1,NG0(jk)  
00550 !         i1=rg(1,1,iop)*KGI(1,ig,ik)
00551 !     +     +rg(1,2,iop)*KGI(2,ig,ik)
00552 !     +     +rg(1,3,iop)*KGI(3,ig,ik)-RW(1,jk) 
00553 !         i2=rg(2,1,iop)*KGI(1,ig,ik)
00554 !     +     +rg(2,2,iop)*KGI(2,ig,ik)
00555 !     +     +rg(2,3,iop)*KGI(3,ig,ik)-RW(2,jk) 
00556 !         i3=rg(3,1,iop)*KGI(1,ig,ik)
00557 !     +     +rg(3,2,iop)*KGI(2,ig,ik)
00558 !     +     +rg(3,3,iop)*KGI(3,ig,ik)-RW(3,jk) 
00559 !         KG0(1,ig,jk)=i1 
00560 !         KG0(2,ig,jk)=i2 
00561 !         KG0(3,ig,jk)=i3 
00562 !         phase=tpi*(dble(i1)*dble(pg(1,iop))
00563 !     +             +dble(i2)*dble(pg(2,iop))
00564 !     +             +dble(i3)*dble(pg(3,iop))) 
00565 !         pf=exp(-ci*phase/dble(nnp)) 
00566 !         C0(ig,:,jk)=CIR(ig,:,ik)*pf 
00567 !        enddo!ig  
00568 !       write(6,'(i5,3f15.10,i5)') jk,ktmp(:),trs(jk)  
00569 !--
00570         call make_KG0(NTG,b1(1),b2(1),b3(1),Ecut_for_psi,
00571      +       ktmp(1),ktmp(2),ktmp(3),KG0(1,1,jk),NG_for_psi)
00572         if(NG_for_psi/=NGI(ik)) then 
00573          write(6,*)'ERROR; STOP; NG_for_psi should be NGI(ik)'   
00574          write(6,*)'NG_for_psi=',NG_for_psi,'NG0(ik)=',NGI(ik)
00575          write(6,*)'ik,jk',ik,jk;STOP
00576         endif 
00577         NG0(jk)=NG_for_psi  
00578         call make_C0(NTG,NTB,trs(jk),NG0(jk),KG0(1,1,jk),RW(1,jk),
00579      +  rginv(1,1,iop),pg(1,iop),nnp,L1,L2,L3,packing(-L1,-L2,-L3,ik),
00580      +  CIR(1,1,ik),C0(1,1,jk)) 
00581        !--
00582        elseif(trs(jk)==-1)then  
00583         ik=numirr(jk);iop=numrot(jk) 
00584         ktmp(1)=rg(1,1,iop)*SKI(1,ik)+rg(1,2,iop)*SKI(2,ik)
00585      +         +rg(1,3,iop)*SKI(3,ik)+dble(RW(1,jk)) 
00586         ktmp(2)=rg(2,1,iop)*SKI(1,ik)+rg(2,2,iop)*SKI(2,ik)
00587      +         +rg(2,3,iop)*SKI(3,ik)+dble(RW(2,jk))  
00588         ktmp(3)=rg(3,1,iop)*SKI(1,ik)+rg(3,2,iop)*SKI(2,ik)
00589      +         +rg(3,3,iop)*SKI(3,ik)+dble(RW(3,jk))  
00590         !write(6,'(i5,3f15.10,i5)') jk,ktmp(:),trs(jk)  
00591         E_EIG(:,jk)=E_EIGI(:,ik) 
00592         NB0(jk)=NBAND!NBI(ik)
00593         KGtmp(:,:)=0 
00594         call make_KG0(NTG,b1(1),b2(1),b3(1),Ecut_for_psi,
00595      +       ktmp(1),ktmp(2),ktmp(3),KGtmp(1,1),NG_for_psi)
00596         if(NG_for_psi/=NGI(ik))then 
00597          write(6,*)'ERROR; STOP; NG_for_psi should be NGI(ik)'   
00598          write(6,*)'NG_for_psi=',NG_for_psi,'NGI(ik)=',NGI(ik);STOP
00599         endif 
00600         NG0(jk)=NG_for_psi  
00601         KG0(:,:,jk)=-KGtmp(:,:)!notice on '-' sign 
00602         call make_C0(NTG,NTB,trs(jk),NG0(jk),KGtmp(1,1),RW(1,jk), 
00603      +  rginv(1,1,iop),pg(1,iop),nnp,L1,L2,L3,packing(-L1,-L2,-L3,ik),
00604      +  CIR(1,1,ik),C0(1,1,jk))!modified 20170316 KG0->KGtmp 
00605        endif 
00606       enddo 
00607       !--
00608       WRITE(6,*) 
00609       write(6,*)'==================='
00610       write(6,*)'CALCULATED K-POINTS'
00611       write(6,*)'==================='
00612       WRITE(6,*) 
00613       do ik=1,NTK
00614        write(6,'(i5,3f15.10,i5)') ik,SK0(:,ik),trs(ik)  
00615       enddo 
00616 !--
00617 !     WRITE(6,*) 
00618 !     write(6,*)'====================='
00619 !     write(6,*)'WRITE ALL EIGENVALUES'
00620 !     write(6,*)'====================='
00621 !     WRITE(6,*) 
00622 !     do ik=1,NTK
00623 !      write(6,'(5F15.10)')(E_EIG(ib,ik),ib=1,NTB) 
00624 !     enddo 
00625 !--
00626 !
00627 !=========================================================
00628 !=== CALCULATE THE NUMBER OF BANDS INSIDE OUTER WINDOW ===
00629 !=========================================================
00630 
00631       allocate(N_BAND(NTK));N_BAND(:)=0
00632       allocate(N_BAND_BTM(NTK));N_BAND_BTM(:)=0
00633       !
00634       !20191216 Jean Moree
00635       !
00636       !do ik=1,NTK       
00637       ! SUM_INT=0        
00638       ! do ib=1,NTB        
00639       !  IF(E_LOWER<=E_EIG(ib,ik).AND.E_EIG(ib,ik)<=E_UPPER)THEN    
00640       !   SUM_INT=SUM_INT+1         
00641       !   IF(SUM_INT==1) N_BAND_BTM(ik)=ib-1  
00642       !  ENDIF        
00643       ! enddo!ib 
00644       ! N_BAND(ik)=SUM_INT 
00645       !enddo!ik       
00646       !
00647       write(6,*) 
00648       write(6,'(2a)') "###STEP : ",
00649      +     "Calculate number of bands inside outer window"
00650       write(6,*) 
00651       if(flg_specify_energywindow)then
00652          do ik=1,NTK       
00653             SUM_INT=0        
00654             do ib=1,NTB        
00655                IF(E_LOWER<=E_EIG(ib,ik).AND.E_EIG(ib,ik)<=E_UPPER)THEN  
00656                   IF(SUM_INT==0) N_BAND_BTM(ik)=ib-1  
00657                   SUM_INT=SUM_INT+1
00658                   write(6,'(a,2i8,f8.4,a,2f8.4)') "ik,ib=",
00659      +                 ik,ib,E_EIG(ib,ik),
00660      +                 " inside  ",E_LOWER,E_UPPER
00661                else           
00662                   write(6,'(a,2i8,f8.4,a,2f8.4)') "ik,ib=",
00663      +                 ik,ib,E_EIG(ib,ik),
00664      +                 " outside ",E_LOWER,E_UPPER
00665                ENDIF        
00666             enddo!ib 
00667             N_BAND(ik)=SUM_INT 
00668          enddo!ik
00669       endif
00670       if(flg_specify_bandindices)then
00671          do ik=1,NTK
00672             N_BAND(ik)=NTB
00673             N_BAND_BTM(ik)=0
00674          enddo!ik 
00675       endif
00676       !
00677       write(6,*) 
00678       write(6,*)'===================================='
00679       write(6,*)'BAND INFO INSIDE OUTER ENERGY WINDOW'
00680       write(6,*)'===================================='
00681       write(6,*) 
00682       !
00683       if(maxval(N_BAND)/=NTB)then
00684        write(6,'(a)')'maxval(N_BAND) SHOULD BE THE SAME AS NTB; STOP'
00685       endif 
00686       !
00687       do ik=1,NTK
00688 !check N_BAND(ik) >= N_wannier 
00689        if(N_BAND(ik)<N_wannier)then 
00690         write(6,'(a)')'energy window setting: WRONG'
00691         write(6,'(a)')'N_BAND(ik) SHOULD BE LARGER THAN N_wannier: STOP'
00692         write(6,'(a,3i8)')'ik, N_BAND(ik), N_wannier',
00693      +                     ik, N_BAND(ik), N_wannier 
00694         stop 
00695        endif  
00696        write(6,*) ik,N_BAND_BTM(ik),N_BAND(ik) 
00697       enddo!ik 
00698       write(6,*) 
00699 !--
00700 !OPEN(149,W,FILE='dat.ns-nb')
00701       OPEN(149,FILE='./dir-wan/dat.ns-nb') 
00702       rewind(149)
00703       do ik=1,NTK
00704        write(149,*) N_BAND_BTM(ik)+NB_start-1,N_BAND(ik) 
00705       enddo!ik 
00706 !--
00707 !20180906 
00708       if(CALC_REAL_SPACE_BLOCH)then 
00709        write(6,*) 
00710        write(6,*)'================================'
00711        write(6,*)'=== VISUALIZE BLOCH FUNCTION ==='
00712        write(6,*)'================================'
00713        write(6,*) 
00714        !--
00715        nfft1=nwx2+1;nfft2=nwy2+1;nfft3=nwz2+1
00716        Nl123=nfft1*nfft2*nfft3 
00717        write(6,'(a20,3i10)')'nwx2,nwy2,nwz2:',nwx2,nwy2,nwz2 
00718        write(6,'(a20,3i10)')'nfft1,nfft2,nfft2:',nfft1,nfft2,nfft3 
00719        write(6,'(a20,i10)')'Nl123:',Nl123 
00720        call fft3_init(nwx2,nwy2,nwz2,nfft1,nfft2,nfft3,fs) 
00721        allocate(fftwk(Nl123*2),stat=err) 
00722        allocate(wfunc(Nl123*2),stat=err) 
00723        !--
00724        write(6,'(a20,3f15.10)')'calc_k:',calc_k
00725        call search_ik(NTK,SK0(1,1),calc_k(1),ik) 
00726        write(6,'(a20,i10)')'ik:',ik 
00727        !
00728        amax=1; bmax=1; cmax=1 
00729        if(CALC_BLOCH_VIS_RANGE)then 
00730         write(6,*) 
00731         write(6,'(a40)')'CALCULATE BLOCH VISUALIZATION RANGE'
00732         write(6,*) 
00733         call search_vis_range(calc_k(1),amin,amax,bmin,bmax,cmin,cmax) 
00734        endif  
00735        !
00736        write(6,'(a20,3i10)')'supercell:',amax,bmax,cmax 
00737        allocate(BF_REALSPACE((amin)*nwx2:(amax)*nwx2-1,
00738      +                       (bmin)*nwy2:(bmax)*nwy2-1, 
00739      +                       (cmin)*nwz2:(cmax)*nwz2-1))!<--complex(8)
00740        !-- 
00741        do ib=1,N_BAND(ik)
00742         BF_REALSPACE=0.0d0           
00743         call make_pw(C0(1,N_BAND_BTM(ik)+ib,ik),wfunc(1),fftwk(1),
00744      +   NG0(ik),KG0(1,1,ik),NTG,nwx2,nwy2,nwz2,nfft1,nfft2,Nl123,fs,
00745      +   amin,amax,bmin,bmax,cmin,cmax,SK0(1,ik),
00746      +   BF_REALSPACE(amin*nwx2,bmin*nwy2,cmin*nwz2)) 
00747         call phase_fix_bf(nwx2,nwy2,nwz2,amin,amax,bmin,bmax,
00748      +   cmin,cmax,BF_REALSPACE(amin*nwx2,bmin*nwy2,cmin*nwz2)) 
00749         !--
00750         !normalize 
00751         !BF_REALSPACE=BF_REALSPACE/DBLE(NTK)/DSQRT(VOLUME)
00752         !--
00753         !OUTPUT by VESTA format 
00754         !OPEN(116,W,FILE='dat.bf-realspace-xxx.grd')
00755         write(filename,"('dat.bf-realspace-',i3.3,'.grd')")ib 
00756         OPEN(116,FILE=filename) 
00757         REWIND(116)
00758         na_grid=nwx2 
00759         nb_grid=nwy2
00760         nc_grid=nwz2 
00761         aa1=a1*dble(amax-amin)
00762         aa2=a2*dble(bmax-bmin)
00763         aa3=a3*dble(cmax-cmin)
00764         call est_latparam(aa1(1),aa2(1),aa3(1),a,b,c,alp,bet,gmm) 
00765         write(116,'(a40,f10.5)')'Electron density and energy (eV)',
00766      +  E_EIG(N_BAND_BTM(ik)+ib,ik)*au 
00767         write(116,'(6f15.10)') a*bohr,b*bohr,c*bohr,alp,bet,gmm  
00768         write(116,'(3I5)')
00769      +  (amax-amin)*na_grid,(bmax-bmin)*nb_grid,(cmax-cmin)*nc_grid 
00770         write(116,'(6g25.16)')(((dble(BF_REALSPACE(i1,i2,i3)),
00771      +  i3=(cmin)*nc_grid,(cmax)*nc_grid-1),
00772      +  i2=(bmin)*nb_grid,(bmax)*nb_grid-1),
00773      +  i1=(amin)*na_grid,(amax)*na_grid-1)
00774         CLOSE(116)
00775        enddo!ib 
00776        deallocate(BF_REALSPACE,fftwk,wfunc)
00777        !--
00778        !gencif 20180906  
00779        call gencif(a1(1),a2(1),a3(1),amin,amax,bmin,bmax,cmin,cmax,
00780      +      nsi,chemical_species(1),asi(1,1))
00781        !--
00782        write(6,*) 
00783        write(6,*)'==================================='
00784        write(6,*)'FINIDH VISUALIZE BLOCH FUNCTION ==='
00785        write(6,*)'!!!!!! We stop calculation !!!!!!!!'
00786        write(6,*)'==================================='
00787        write(6,*) 
00788        stop
00789       endif!CALC_REAL_SPACE_BLOCH 
00790       !--
00791       WRITE(6,*) 
00792       WRITE(6,*)'========================================='
00793       WRITE(6,*)'=== WE NOW CALCULATE WANNIER FUNCTION ==='
00794       WRITE(6,*)'========================================='
00795       WRITE(6,*) 
00796 
00797 !================================
00798 !=== SET B-VECTORS AND WEIGHT ===
00799 !================================
00800 
00801       select case(icell) 
00802       case(0)!=== CASE(0) ===      
00803 !
00804 !== Automatic generation of b-vectors by TERUMASA TADANO ==
00805 !
00806        allocate(b_LAT(3,NBMAX));b_LAT(:,:)=0.0D0 
00807        allocate(VEC_b(3,NBMAX));VEC_b(:,:)=0.0d0                 
00808        allocate(WEIGHT_b(NBMAX));WEIGHT_b(:)=0.0D0             
00809        call generate_bvectors(b1(1),b2(1),b3(1),nkb1,nkb2,nkb3, 
00810      + NBMAX,maxshell,verbosity,NB,b_LAT(1,1),VEC_b(1,1),WEIGHT_b(1))
00811       !--
00812       case(1)!=== CASE(1) SIMPLE CUBIC CELL ===      
00813        NB=6
00814        allocate(b_LAT(3,NB));b_LAT(:,:)=0.0D0 
00815        allocate(VEC_b(3,NB));VEC_b(:,:)=0.0d0                 
00816        allocate(WEIGHT_b(NB));WEIGHT_b(:)=0.0D0             
00817        b_LAT(:,:) = 0.0D0 
00818        b_LAT(1,1) =  (1.0D0/DBLE(nkb1))
00819        b_LAT(2,2) =  (1.0D0/DBLE(nkb1))
00820        b_LAT(3,3) =  (1.0D0/DBLE(nkb1))
00821        b_LAT(1,4) = -(1.0D0/DBLE(nkb1))
00822        b_LAT(2,5) = -(1.0D0/DBLE(nkb1))
00823        b_LAT(3,6) = -(1.0D0/DBLE(nkb1))
00824        VEC_b(:,:) = 0.0D0                            
00825        VEC_b(:,1) =  (1.0D0/DBLE(nkb1)) * b1(:) 
00826        VEC_b(:,2) =  (1.0D0/DBLE(nkb1)) * b2(:) 
00827        VEC_b(:,3) =  (1.0D0/DBLE(nkb1)) * b3(:) 
00828        VEC_b(:,4) = -(1.0D0/DBLE(nkb1)) * b1(:)
00829        VEC_b(:,5) = -(1.0D0/DBLE(nkb1)) * b2(:) 
00830        VEC_b(:,6) = -(1.0D0/DBLE(nkb1)) * b3(:) 
00831        VEC_b2=VEC_b(1,1)**2+VEC_b(2,1)**2+VEC_b(3,1)**2 
00832        WEIGHT_b(:) = 3.0d0/dble(NB)/VEC_b2              
00833        !WEIGHT_b(:) = (3.0D0/6.0D0)*(alat*nkb1/tpi)**2 
00834       !--
00835       case(2)!=== CASE(2) FCC PRIMITIVE CELL ===      
00836        NB=8
00837        allocate(b_LAT(3,NB));b_LAT(:,:)=0.0D0 
00838        allocate(VEC_b(3,NB));VEC_b(:,:)=0.0d0                 
00839        allocate(WEIGHT_b(NB));WEIGHT_b(:)=0.0D0             
00840        b_LAT(:,:) = 0.0D0 
00841        b_LAT(1,1) =  (1.0D0/DBLE(nkb1))
00842        b_LAT(2,2) =  (1.0D0/DBLE(nkb1))
00843        b_LAT(3,3) =  (1.0D0/DBLE(nkb1))
00844        b_LAT(1,4) =  (1.0D0/DBLE(nkb1))
00845        b_LAT(2,4) =  (1.0D0/DBLE(nkb1))
00846        b_LAT(3,4) =  (1.0D0/DBLE(nkb1))
00847        b_LAT(1,5) = -(1.0D0/DBLE(nkb1))
00848        b_LAT(2,6) = -(1.0D0/DBLE(nkb1))
00849        b_LAT(3,7) = -(1.0D0/DBLE(nkb1))
00850        b_LAT(1,8) = -(1.0D0/DBLE(nkb1))
00851        b_LAT(2,8) = -(1.0D0/DBLE(nkb1))
00852        b_LAT(3,8) = -(1.0D0/DBLE(nkb1))
00853        VEC_b(:,:) = 0.0D0                            
00854        VEC_b(:,1) =  (1.0D0/DBLE(nkb1)) * b1(:) 
00855        VEC_b(:,2) =  (1.0D0/DBLE(nkb1)) * b2(:) 
00856        VEC_b(:,3) =  (1.0D0/DBLE(nkb1)) * b3(:) 
00857        VEC_b(:,4) =  (1.0D0/DBLE(nkb1)) *(b1(:)+b2(:)+b3(:))  
00858        VEC_b(:,5) = -(1.0D0/DBLE(nkb1)) * b1(:) 
00859        VEC_b(:,6) = -(1.0D0/DBLE(nkb1)) * b2(:) 
00860        VEC_b(:,7) = -(1.0D0/DBLE(nkb1)) * b3(:) 
00861        VEC_b(:,8) = -(1.0D0/DBLE(nkb1)) *(b1(:)+b2(:)+b3(:))  
00862        VEC_b2=VEC_b(1,1)**2+VEC_b(2,1)**2+VEC_b(3,1)**2 
00863        WEIGHT_b(:) = 3.0d0/dble(NB)/VEC_b2              
00864        !WEIGHT_b(:) = (1.0D0/8.0D0)*(alat*nkb1/tpi)**2 
00865       !--
00866       case(3)!=== CASE(3) BCC PRIMITIVE CELL ===      
00867        NB=12 
00868        allocate(b_LAT(3,NB));b_LAT(:,:)=0.0D0 
00869        allocate(VEC_b(3,NB));VEC_b(:,:)=0.0d0                 
00870        allocate(WEIGHT_b(NB));WEIGHT_b(:)=0.0D0             
00871        b_LAT(:,:) = 0.0D0 
00872        b_LAT(1, 1) =  (1.0D0/DBLE(nkb1))
00873        b_LAT(2, 2) =  (1.0D0/DBLE(nkb1))
00874        b_LAT(3, 3) =  (1.0D0/DBLE(nkb1))
00875        b_LAT(1, 4) =  (1.0D0/DBLE(nkb1))
00876        b_LAT(2, 4) = -(1.0D0/DBLE(nkb1))
00877        b_LAT(2, 5) =  (1.0D0/DBLE(nkb1))
00878        b_LAT(3, 5) = -(1.0D0/DBLE(nkb1))
00879        b_LAT(3, 6) =  (1.0D0/DBLE(nkb1))
00880        b_LAT(1, 6) = -(1.0D0/DBLE(nkb1))
00881        b_LAT(1, 7) = -(1.0D0/DBLE(nkb1))
00882        b_LAT(2, 8) = -(1.0D0/DBLE(nkb1))
00883        b_LAT(3, 9) = -(1.0D0/DBLE(nkb1))
00884        b_LAT(1,10) = -(1.0D0/DBLE(nkb1))
00885        b_LAT(2,10) =  (1.0D0/DBLE(nkb1))
00886        b_LAT(2,11) = -(1.0D0/DBLE(nkb1))
00887        b_LAT(3,11) =  (1.0D0/DBLE(nkb1))
00888        b_LAT(3,12) = -(1.0D0/DBLE(nkb1))
00889        b_LAT(1,12) =  (1.0D0/DBLE(nkb1))
00890        VEC_b(:,:) = 0.0D0                            
00891        VEC_b(:, 1) =  (1.0D0/DBLE(nkb1)) * b1(:) 
00892        VEC_b(:, 2) =  (1.0D0/DBLE(nkb1)) * b2(:) 
00893        VEC_b(:, 3) =  (1.0D0/DBLE(nkb1)) * b3(:) 
00894        VEC_b(:, 4) =  (1.0D0/DBLE(nkb1)) *(b1(:)-b2(:))      
00895        VEC_b(:, 5) =  (1.0D0/DBLE(nkb1)) *(b2(:)-b3(:))      
00896        VEC_b(:, 6) =  (1.0D0/DBLE(nkb1)) *(b3(:)-b1(:))      
00897        VEC_b(:, 7) = -(1.0D0/DBLE(nkb1)) * b1(:) 
00898        VEC_b(:, 8) = -(1.0D0/DBLE(nkb1)) * b2(:) 
00899        VEC_b(:, 9) = -(1.0D0/DBLE(nkb1)) * b3(:) 
00900        VEC_b(:,10) = -(1.0D0/DBLE(nkb1)) *(b1(:)-b2(:))   
00901        VEC_b(:,11) = -(1.0D0/DBLE(nkb1)) *(b2(:)-b3(:))   
00902        VEC_b(:,12) = -(1.0D0/DBLE(nkb1)) *(b3(:)-b1(:))   
00903        VEC_b2=VEC_b(1,1)**2+VEC_b(2,1)**2+VEC_b(3,1)**2 
00904        WEIGHT_b(:) = 3.0d0/dble(NB)/VEC_b2              
00905        !WEIGHT_b(:) = (1.0D0/8.0D0)*(alat*nkb1/tpi)**2 
00906       !--
00907       case(4)!=== CASE(4) HCP PRIMITIVE CELL ===      
00908        NB=8 
00909        allocate(b_LAT(3,NB));b_LAT(:,:)=0.0D0 
00910        allocate(VEC_b(3,NB));VEC_b(:,:)=0.0d0                 
00911        allocate(WEIGHT_b(NB));WEIGHT_b(:)=0.0D0             
00912        b_LAT(:,:) = 0.0D0 
00913        b_LAT(1,1) =  (1.0D0/DBLE(nkb1))
00914        b_LAT(2,2) =  (1.0D0/DBLE(nkb2))
00915        b_LAT(1,3) =  (1.0D0/DBLE(nkb1))
00916        b_LAT(2,3) = -(1.0D0/DBLE(nkb2))!SiO2(hcp)
00917        !b_LAT(2,3) =  (1.0D0/DBLE(nkb2))!Re(hcp)
00918        b_LAT(1,4) = -(1.0D0/DBLE(nkb1))
00919        b_LAT(2,5) = -(1.0D0/DBLE(nkb2))
00920        b_LAT(1,6) = -(1.0D0/DBLE(nkb1))
00921        b_LAT(2,6) =  (1.0D0/DBLE(nkb2))!SiO2(hcp) 
00922        !b_LAT(2,6) = -(1.0D0/DBLE(nkb2))!Re(hcp)
00923        b_LAT(3,7) =  (1.0D0/DBLE(nkb3))
00924        b_LAT(3,8) = -(1.0D0/DBLE(nkb3))
00925        VEC_b(:,:) = 0.0D0                            
00926        VEC_b(:,1) =  (1.0D0/DBLE(nkb1)) * b1(:) 
00927        VEC_b(:,2) =  (1.0D0/DBLE(nkb2)) * b2(:) 
00928        VEC_b(:,3) =  (1.0D0/DBLE(nkb1)) * b1(:) 
00929      +            -  (1.0D0/DBLE(nkb2)) * b2(:)!SiO2(hcp) 
00930 !+            +  (1.0D0/DBLE(nkb2)) * b2(:)!Re(hcp) 
00931        VEC_b(:,4) = -(1.0D0/DBLE(nkb1)) * b1(:) 
00932        VEC_b(:,5) = -(1.0D0/DBLE(nkb2)) * b2(:) 
00933        VEC_b(:,6) = -(1.0D0/DBLE(nkb1)) * b1(:) 
00934      +            +  (1.0D0/DBLE(nkb2)) * b2(:)!SiO2(hcp)  
00935 !+            -  (1.0D0/DBLE(nkb2)) * b2(:)!Re(hcp)
00936        VEC_b(:,7) =  (1.0D0/DBLE(nkb3)) * b3(:) 
00937        VEC_b(:,8) = -(1.0D0/DBLE(nkb3)) * b3(:)            
00938        La = DSQRT( a1(1)**2 + a1(2)**2 + a1(3)**2 )     
00939        Lc = DSQRT( a3(1)**2 + a3(2)**2 + a3(3)**2 )     
00940        WEIGHT_b(:) = 0.0D0             
00941        WEIGHT_b(1) = (1.0D0/4.0D0)*(La*nkb1/tpi)**2 
00942        WEIGHT_b(2) = (1.0D0/4.0D0)*(La*nkb1/tpi)**2 
00943        WEIGHT_b(3) = (1.0D0/4.0D0)*(La*nkb1/tpi)**2 
00944        WEIGHT_b(4) = (1.0D0/4.0D0)*(La*nkb1/tpi)**2 
00945        WEIGHT_b(5) = (1.0D0/4.0D0)*(La*nkb1/tpi)**2 
00946        WEIGHT_b(6) = (1.0D0/4.0D0)*(La*nkb1/tpi)**2 
00947        WEIGHT_b(7) = (1.0D0/2.0D0)*(Lc*nkb3/tpi)**2 
00948        WEIGHT_b(8) = (1.0D0/2.0D0)*(Lc*nkb3/tpi)**2 
00949       !--
00950       case(5)!=== CASE(5) ORTHORHOMBIC OR TETRAGONAL CELL ===
00951        NB=6 
00952        allocate(b_LAT(3,NB));b_LAT(:,:)=0.0D0 
00953        allocate(VEC_b(3,NB));VEC_b(:,:)=0.0d0                 
00954        allocate(WEIGHT_b(NB));WEIGHT_b(:)=0.0D0             
00955        b_LAT(:,:) = 0.0D0 
00956        b_LAT(1,1) =  (1.0D0/DBLE(nkb1))
00957        b_LAT(2,2) =  (1.0D0/DBLE(nkb2))
00958        b_LAT(3,3) =  (1.0D0/DBLE(nkb3))
00959        b_LAT(1,4) = -(1.0D0/DBLE(nkb1))
00960        b_LAT(2,5) = -(1.0D0/DBLE(nkb2))
00961        b_LAT(3,6) = -(1.0D0/DBLE(nkb3))
00962        VEC_b(:,:) = 0.0D0                            
00963        VEC_b(:,1) =  (1.0D0/DBLE(nkb1)) * b1(:) 
00964        VEC_b(:,2) =  (1.0D0/DBLE(nkb2)) * b2(:) 
00965        VEC_b(:,3) =  (1.0D0/DBLE(nkb3)) * b3(:) 
00966        VEC_b(:,4) = -(1.0D0/DBLE(nkb1)) * b1(:)
00967        VEC_b(:,5) = -(1.0D0/DBLE(nkb2)) * b2(:) 
00968        VEC_b(:,6) = -(1.0D0/DBLE(nkb3)) * b3(:) 
00969        La = DSQRT( a1(1)**2 + a1(2)**2 + a1(3)**2 )     
00970        Lb = DSQRT( a2(1)**2 + a2(2)**2 + a2(3)**2 )     
00971        Lc = DSQRT( a3(1)**2 + a3(2)**2 + a3(3)**2 )     
00972        WEIGHT_b(:) = 0.0D0             
00973        WEIGHT_b(1) = (1.0D0/2.0D0)*(La*nkb1/tpi)**2 
00974        WEIGHT_b(2) = (1.0D0/2.0D0)*(Lb*nkb2/tpi)**2 
00975        WEIGHT_b(3) = (1.0D0/2.0D0)*(Lc*nkb3/tpi)**2 
00976        WEIGHT_b(4) = (1.0D0/2.0D0)*(La*nkb1/tpi)**2 
00977        WEIGHT_b(5) = (1.0D0/2.0D0)*(Lb*nkb2/tpi)**2 
00978        WEIGHT_b(6) = (1.0D0/2.0D0)*(Lc*nkb3/tpi)**2 
00979       !--
00980       case(6)!=== CASE(6) MONOCLINIC CELL === 
00981        NB=8
00982        allocate(b_LAT(3,NB));b_LAT(:,:)=0.0D0 
00983        allocate(VEC_b(3,NB));VEC_b(:,:)=0.0d0                 
00984        allocate(WEIGHT_b(NB));WEIGHT_b(:)=0.0D0             
00985        b_LAT(:,:) = 0.0D0 
00986        b_LAT(1,1) =  (1.0D0/DBLE(nkb1))
00987        b_LAT(3,2) =  (1.0D0/DBLE(nkb3))
00988        b_LAT(1,3) =  (1.0D0/DBLE(nkb1))
00989        b_LAT(3,3) = -(1.0D0/DBLE(nkb3))
00990        b_LAT(1,4) = -(1.0D0/DBLE(nkb1))
00991        b_LAT(3,5) = -(1.0D0/DBLE(nkb3))
00992        b_LAT(1,6) = -(1.0D0/DBLE(nkb1))
00993        b_LAT(3,6) =  (1.0D0/DBLE(nkb3))
00994        b_LAT(2,7) =  (1.0D0/DBLE(nkb2))
00995        b_LAT(2,8) = -(1.0D0/DBLE(nkb2))
00996        VEC_b(:,:) = 0.0D0                            
00997        VEC_b(:,1) = (1.0D0/DBLE(nkb1))*b1(:) 
00998        VEC_b(:,2) = (1.0D0/DBLE(nkb3))*b3(:) 
00999        VEC_b(:,3) = VEC_b(:,1)-VEC_b(:,2)
01000        VEC_b(:,4) =-VEC_b(:,1)
01001        VEC_b(:,5) =-VEC_b(:,2)
01002        VEC_b(:,6) =-VEC_b(:,3)
01003        VEC_b(:,7) = (1.0D0/DBLE(nkb2))*b2(:) 
01004        VEC_b(:,8) =-VEC_b(:,7)
01005        s = VEC_b(1,1)
01006        t = VEC_b(3,1)
01007        u = VEC_b(3,2)
01008        v = VEC_b(2,7) 
01009        WEIGHT_b(:) = 0.0D0             
01010        WEIGHT_b(1) = (u-t)/(2.0d0*(s**2)*u) 
01011        WEIGHT_b(2) = (s**2-t*(u-t))/(2.0d0*(s**2)*(u**2))
01012        WEIGHT_b(3) = t/(2.0d0*(s**2)*u) 
01013        WEIGHT_b(4) = WEIGHT_b(1)
01014        WEIGHT_b(5) = WEIGHT_b(2)
01015        WEIGHT_b(6) = WEIGHT_b(3)
01016        WEIGHT_b(7) = 1.0d0/(2.0d0*(v**2)) 
01017        WEIGHT_b(8) = WEIGHT_b(7) 
01018       !--
01019       case(8)!=== CASE(8) BCT CELL === 2011/1/4 by Y.Nomura ===
01020        write(6,*) 
01021        write(6,*)'==============================='
01022        write(6,*)' body centered tetragonal cell '
01023        write(6,*)'==============================='
01024        write(6,*) 
01025        NB=10
01026        allocate(b_LAT(3,NB));b_LAT(:,:)=0.0D0 
01027        allocate(VEC_b(3,NB));VEC_b(:,:)=0.0d0                 
01028        allocate(WEIGHT_b(NB));WEIGHT_b(:)=0.0D0             
01029        if(nkb1/=nkb2)stop'nkb1/=nkb2'
01030        if(nkb1/=nkb3)stop'nkb1/=nkb3'
01031        if(nkb2/=nkb3)stop'nkb2/=nkb3'
01032        b_LAT(:,:)=0.0D0 
01033        b_LAT(1,1)=(1.0D0/DBLE(nkb1))
01034        b_LAT(2,1)=(1.0D0/DBLE(nkb2))
01035        b_LAT(3,1)=-(1.0D0/DBLE(nkb3))
01036        b_LAT(1,2)=(1.0D0/DBLE(nkb1))
01037        b_LAT(2,3)=(1.0D0/DBLE(nkb2))
01038        b_LAT(1,4)=(1.0D0/DBLE(nkb1))
01039        b_LAT(3,4)=-(1.0D0/DBLE(nkb3))
01040        b_LAT(2,5)=(1.0D0/DBLE(nkb2))
01041        b_LAT(3,5)=-(1.0D0/DBLE(nkb3))
01042        b_LAT(:,6)=-b_LAT(:,1)
01043        b_LAT(:,7)=-b_LAT(:,2)
01044        b_LAT(:,8)=-b_LAT(:,3)
01045        b_LAT(:,9)=-b_LAT(:,4)
01046        b_LAT(:,10)=-b_LAT(:,5)
01047        VEC_b(:,:)=0.0D0                            
01048        VEC_b(:,1)=(1.0D0/DBLE(nkb1))*(b1(:)+b2(:)-b3(:))
01049        VEC_b(:,2)=(1.0D0/DBLE(nkb1))*b1(:) 
01050        VEC_b(:,3)=(1.0D0/DBLE(nkb2))*b2(:) 
01051        VEC_b(:,4)=(1.0D0/DBLE(nkb1))*b1(:)-(1.0D0/DBLE(nkb3))*b3(:)
01052        VEC_b(:,5)=(1.0D0/DBLE(nkb2))*b2(:)-(1.0D0/DBLE(nkb3))*b3(:)
01053        VEC_b(:,6)=-VEC_b(:,1)
01054        VEC_b(:,7)=-VEC_b(:,2)
01055        VEC_b(:,8)=-VEC_b(:,3)
01056        VEC_b(:,9)=-VEC_b(:,4)
01057        VEC_b(:,10)=-VEC_b(:,5)
01058 !--
01059 !NUMPACK
01060 !       NBh=NB/2 
01061 !       allocate(VEC_d(6));VEC_d(:)=0.0d0                  
01062 !       allocate(bb(NBh,6));bb(:,:)=0.0d0 
01063 !       allocate(aa(NBh,6));aa(:,:)=0.0d0 
01064 !       do ib=1,Nbh 
01065 !        ab=0
01066 !        do ix=1,3
01067 !         do jx=ix,3
01068 !          ab=ab+1
01069 !          bb(ib,ab)=VEC_b(ix,ib)*VEC_b(jx,ib)
01070 !         enddo 
01071 !        enddo 
01072 !       enddo 
01073 !       aa=bb 
01074 !!do i=1,NBh 
01075 !! write(6,'(10f20.5)')(bb(i,j),j=1,6)!org 
01076 !!enddo 
01077 !       call inv_ge(NBh,6,aa(1,1)) 
01078 !!do i=1,NBh 
01079 !! write(6,'(10f20.5)')(aa(i,j),j=1,6)!inv
01080 !!enddo 
01081 !!write(6,*) 
01082 !!write(6,*)'CHECK BB*AA=1'       
01083 !!write(6,*) 
01084 !!do i=1,NBh
01085 !! do j=1,NBh 
01086 !!  SUM_REAL=0.0d0
01087 !!  do k=1,6 
01088 !!   SUM_REAL=SUM_REAL+bb(i,k)*aa(j,k)
01089 !!  enddo 
01090 !!  write(6,'(i5,i5,f15.10)') i,j,SUM_REAL 
01091 !! enddo
01092 !!enddo 
01093 !--
01094 !LAPACK
01095        NBh=NB/2 
01096        allocate(VEC_d(6));VEC_d(:)=0.0d0!tmp                   
01097        allocate(aa(6,6));aa(:,:)=0.0d0!matrix A tmp
01098        allocate(bb(6,6));bb(:,:)=0.0d0!matrix A^-1 tmp
01099        do ib=1,Nbh 
01100         ab=0
01101         do ix=1,3
01102          do jx=ix,3
01103           ab=ab+1
01104           aa(ib,ab)=VEC_b(ix,ib)*VEC_b(jx,ib)
01105          enddo 
01106         enddo 
01107        enddo 
01108        !--
01109        !bb<-aa 
01110        do i=1,6
01111         do j=1,6
01112          bb(j,i)=aa(i,j) 
01113         enddo
01114        enddo 
01115 !--
01116 !do i=1,n 
01117 ! write(6,'(10f15.10)')(bb(i,j),j=1,n)!org 
01118 !enddo 
01119 !--
01120        call inv_ge_lapack(6,NBh,bb(1,1)) 
01121 !--
01122 !write(6,*) 
01123 !do i=1,n 
01124 ! write(6,'(10f15.10)')(bb(i,j),j=1,n)!inv
01125 !enddo 
01126 !--
01127 !      write(6,*) 
01128 !      write(6,*)'CHECK BB*AA=1'       
01129 !      write(6,*) 
01130 !      do i=1,NBh
01131 !       do j=1,NBh 
01132 !        s=0.0d0
01133 !        do k=1,n 
01134 !         s=s+aa(i,k)*bb(j,k)
01135 !        enddo 
01136 !        write(6,'(i5,i5,f15.10)') i,j,s
01137 !       enddo
01138 !      enddo 
01139 !--
01140        VEC_d(1)=0.5d0!xx
01141        VEC_d(2)=0.0d0!xy
01142        VEC_d(3)=0.0d0!xz
01143        VEC_d(4)=0.5d0!yy 
01144        VEC_d(5)=0.0d0!yz 
01145        VEC_d(6)=0.5d0!zz
01146        !--
01147        WEIGHT_b(:)=0.0D0             
01148        do ib=1,Nbh
01149         ab=0
01150         SUM_REAL=0.0d0 
01151         do ix=1,3
01152          do jx=ix,3
01153           ab=ab+1
01154           !SUM_REAL=SUM_REAL+VEC_d(ab)*aa(ib,ab)!NUMPACK
01155           SUM_REAL=SUM_REAL+VEC_d(ab)*bb(ib,ab)!LAPACK 
01156          enddo 
01157         enddo 
01158         WEIGHT_b(ib)=SUM_REAL 
01159        enddo 
01160        WEIGHT_b(6)=WEIGHT_b(1)
01161        WEIGHT_b(7)=WEIGHT_b(2)
01162        WEIGHT_b(8)=WEIGHT_b(3) 
01163        WEIGHT_b(9)=WEIGHT_b(4) 
01164        WEIGHT_b(10)=WEIGHT_b(5) 
01165       !--
01166       case(7)!=== CASE(7) TRICLINIC CELL ===* 
01167        NB=12 
01168        allocate(b_LAT(3,NB));b_LAT(:,:)=0.0D0 
01169        allocate(VEC_b(3,NB));VEC_b(:,:)=0.0d0                 
01170        allocate(WEIGHT_b(NB));WEIGHT_b(:)=0.0D0             
01171        NBh=NB/2 
01172        b_LAT(:,:) = 0.0D0 
01173        b_LAT(1,1) =  (1.0D0/DBLE(nkb1))
01174        b_LAT(2,2) =  (1.0D0/DBLE(nkb2))
01175        b_LAT(3,3) =  (1.0D0/DBLE(nkb3))
01176        b_LAT(1,4) =  (1.0D0/DBLE(nkb1))
01177        b_LAT(2,4) = -(1.0D0/DBLE(nkb2))
01178        b_LAT(2,5) =  (1.0D0/DBLE(nkb2))
01179        b_LAT(3,5) = -(1.0D0/DBLE(nkb3))
01180        b_LAT(3,6) =  (1.0D0/DBLE(nkb3))
01181        b_LAT(1,6) = -(1.0D0/DBLE(nkb1))
01182        b_LAT(:,7) = -b_LAT(:,1) 
01183        b_LAT(:,8) = -b_LAT(:,2) 
01184        b_LAT(:,9) = -b_LAT(:,3) 
01185        b_LAT(:,10)= -b_LAT(:,4) 
01186        b_LAT(:,11)= -b_LAT(:,5) 
01187        b_LAT(:,12)= -b_LAT(:,6) 
01188        VEC_b(:,:) = 0.0D0                            
01189        VEC_b(:,1) = (1.0D0/DBLE(nkb1))*b1(:) 
01190        VEC_b(:,2) = (1.0D0/DBLE(nkb2))*b2(:) 
01191        VEC_b(:,3) = (1.0D0/DBLE(nkb3))*b3(:) 
01192        VEC_b(:,4) = VEC_b(:,1)-VEC_b(:,2)
01193        VEC_b(:,5) = VEC_b(:,2)-VEC_b(:,3)
01194        VEC_b(:,6) = VEC_b(:,3)-VEC_b(:,1)
01195        VEC_b(:,7) =-VEC_b(:,1)
01196        VEC_b(:,8) =-VEC_b(:,2)
01197        VEC_b(:,9) =-VEC_b(:,3)
01198        VEC_b(:,10)=-VEC_b(:,4)
01199        VEC_b(:,11)=-VEC_b(:,5)
01200        VEC_b(:,12)=-VEC_b(:,6)
01201        allocate(VEC_d(NBh));VEC_d(:)=0.0d0                  
01202        allocate(bb(NBh,NBh));bb(:,:)=0.0d0 
01203        do ib=1,Nbh 
01204         ab=0
01205         do ix=1,3
01206          do jx=ix,3
01207           ab=ab+1
01208           bb(ib,ab)=VEC_b(ix,ib)*VEC_b(jx,ib)
01209          enddo 
01210         enddo 
01211        enddo 
01212        call invmat(Nbh,bb(1,1)) 
01213        VEC_d(1)=0.5d0 !xx
01214        VEC_d(2)=0.0d0 !xy
01215        VEC_d(3)=0.0d0 !xz
01216        VEC_d(4)=0.5d0 !yy 
01217        VEC_d(5)=0.0d0 !yz 
01218        VEC_d(6)=0.5d0 !zz
01219        WEIGHT_b(:)=0.0D0             
01220        do ib=1,Nbh
01221         ab=0
01222         SUM_REAL=0.0d0 
01223         do ix=1,3
01224          do jx=ix,3
01225           ab=ab+1
01226           SUM_REAL=SUM_REAL+VEC_d(ab)*bb(ab,ib)
01227          enddo 
01228         enddo 
01229         WEIGHT_b(ib)=SUM_REAL
01230        enddo 
01231        WEIGHT_b(7) = WEIGHT_b(1)
01232        WEIGHT_b(8) = WEIGHT_b(2) 
01233        WEIGHT_b(9) = WEIGHT_b(3) 
01234        WEIGHT_b(10)= WEIGHT_b(4) 
01235        WEIGHT_b(11)= WEIGHT_b(5) 
01236        WEIGHT_b(12)= WEIGHT_b(6) 
01237       end select 
01238       !--
01239       do ibvec=1,NB 
01240        write(6,*) b_LAT(:,ibvec)       
01241       enddo 
01242       write(6,*) 
01243       SUM_REAL=0.0D0          
01244       Do ibvec=1,NB 
01245        SUM_REAL=SUM_REAL+WEIGHT_b(ibvec) 
01246       ENDDO           
01247       WEIGHT=SUM_REAL          
01248       !--
01249       write(6,*)'WEIGHT_b=',WEIGHT_b(:) 
01250       write(6,*)'WEIGHT  =',WEIGHT              
01251  
01252 !======================
01253 !=== CHECK SUM RULE ===
01254 !======================
01255 
01256       write(6,*) 
01257       write(6,*)'SUM RULE CHECK OF B-VEC'       
01258       write(6,*) 
01259       Do IC=1,3   
01260        Do JC=1,3   
01261         SUM_REAL=0.0D0 
01262         Do ibvec=1,NB      
01263          SUM_REAL
01264      +  =SUM_REAL+WEIGHT_b(ibvec)*VEC_b(IC,ibvec)*VEC_b(JC,ibvec)
01265         ENDDO!ibvec            
01266         write(6,*) IC,JC,SUM_REAL          
01267        ENDDO!JC    
01268       ENDDO!IC    
01269 
01270 !=========================
01271 !=== INTERSTATE MATRIX ===
01272 !=========================
01273 
01274       WRITE(6,*) 
01275       WRITE(6,*)'==================='
01276       WRITE(6,*)' INTERSTATE MATRIX '
01277       WRITE(6,*)'==================='
01278       WRITE(6,*) 
01279       allocate(OVERLAP(NTB,NTB,NTK,NB));OVERLAP=0.0D0   
01280       allocate(KPT(NTK,NB));KPT=0  
01281       nvx=nwx2+1;nvy=nwy2+1;nvz=nwz2+1 
01282 !--
01283 !$OMP PARALLEL PRIVATE(ik,C0_BRA,ig,ibvec,SHIFT_b,ik_ib,C0_KET,
01284 !$OMP&  OVERLAP_TMP)
01285       allocate(C0_BRA(0:NTG,NTB));C0_BRA(0,:)=0.0D0       
01286       allocate(C0_KET(0:NTG,NTB));C0_KET(0,:)=0.0D0       
01287       allocate(SHIFT_b(3));SHIFT_b=0 
01288       allocate(OVERLAP_TMP(NTB,NTB));OVERLAP_TMP=0.0d0 
01289 !$OMP DO 
01290       do ik=1,NTK       
01291 !C0_BRA
01292        C0_BRA(0,:)=0.0D0       
01293        do ig=1,NG0(ik) 
01294         C0_BRA(ig,:)=C0(ig,:,ik)  
01295        enddo 
01296 !SHIFT VECTOR
01297        do ibvec=1,NB               
01298         call make_shift_vector(NTK,NB,ik,ibvec,SK0(1,1),b_LAT(1,1),
01299      +  SHIFT_b(1),ik_ib)
01300         KPT(ik,ibvec)=ik_ib                
01301 !C0_KET
01302         C0_KET(0,:)=0.0D0       
01303         do ig=1,NG0(ik_ib) 
01304          C0_KET(ig,:)=C0(ig,:,ik_ib)  
01305         enddo 
01306 !CALC OVERLAP 
01307         CALL CALC_OVERLAP(NTK,NTB,NTG,nvx,nvy,nvz,ik,ik_ib,NG0(1),
01308      +  KG0(1,1,1),N_BAND(1),SHIFT_b(1),C0_BRA(0,1),C0_KET(0,1),
01309      +  OVERLAP_TMP(1,1),N_BAND_BTM(1))  
01310         OVERLAP(:,:,ik,ibvec)=OVERLAP_TMP(:,:)          
01311        !--
01312        enddo!ibvec                
01313       enddo!ik                           
01314 !$OMP END DO 
01315       deallocate(C0_BRA,C0_KET,SHIFT_b,OVERLAP_TMP) 
01316 !$OMP END PARALLEL 
01317       write(6,*)'finish calc ISM' 
01318       !--
01319       WRITE(6,*) 
01320       write(6,*)'================================================='
01321       write(6,*)' LOG{det[M(k,k+b)]} only when M is square matrix '
01322       write(6,*)'=================================================' 
01323       WRITE(6,*) 
01324       do ik=1,NTK       
01325        do ibvec=1,NB               
01326         ik_ib=KPT(ik,ibvec) 
01327         if(N_BAND(ik)==N_BAND(ik_ib))then 
01328          nm=N_BAND(ik) 
01329          allocate(mat_tmp(nm,nm));mat_tmp=0.0d0 
01330          mat_tmp(1:nm,1:nm)=OVERLAP(1:nm,1:nm,ik,ibvec) 
01331          call calcdet(nm,mat_tmp(1,1),DET) 
01332          write(6,'(a8,i6,a8,i6,a8,2f15.10)')
01333      +   'ik=',ik,'ik_ib=',ik_ib,'log=',log(DET) 
01334          deallocate(mat_tmp) 
01335         endif 
01336        enddo!ibvec                
01337       enddo!ik                           
01338 
01339 !==============================================
01340 !=== INITIAL GUESS FOR OMEGA_I MINIMIZATION ===
01341 !==============================================
01342 
01343       allocate(orbtype(nigs)) 
01344       allocate(ALPHA_GAUSS(nigs));ALPHA_GAUSS(:)=0.0d0
01345       allocate(TAU_GAUSS(3,nigs));TAU_GAUSS(:,:)=0.0d0
01346       allocate(NORM_GAUSS(nigs));NORM_GAUSS(:)=0.0d0
01347       allocate(loc_x(3,nigs));loc_x=0.0d0
01348       allocate(loc_y(3,nigs));loc_y=0.0d0
01349       allocate(loc_z(3,nigs));loc_z=0.0d0
01350       !--
01351       do ig=1,nigs 
01352        orbtype(ig)=vec_ini(ig)%orb
01353        ALPHA_GAUSS(ig)=vec_ini(ig)%a 
01354        TAU_GAUSS(1,ig)=vec_ini(ig)%x
01355        TAU_GAUSS(2,ig)=vec_ini(ig)%y 
01356        TAU_GAUSS(3,ig)=vec_ini(ig)%z 
01357        loc_x(:,ig)=vec_ini(ig)%lx(:)
01358        loc_y(:,ig)=vec_ini(ig)%ly(:)
01359        loc_z(:,ig)=vec_ini(ig)%lz(:)
01360       enddo 
01361 !--
01362 !20170406 
01363       allocate(LGAUSS(nigs));LGAUSS(:)=0 
01364       allocate(MGAUSS(nigs));MGAUSS(:)=0 
01365       do ig=1,nigs 
01366        if(orbtype(ig)=='s')then 
01367         LGAUSS(ig)=1;MGAUSS(ig)=1   
01368        endif 
01369        if(orbtype(ig)=='px')then 
01370         LGAUSS(ig)=2;MGAUSS(ig)=1   
01371        endif 
01372        if(orbtype(ig)=='py')then 
01373         LGAUSS(ig)=2;MGAUSS(ig)=2   
01374        endif 
01375        if(orbtype(ig)=='pz')then 
01376         LGAUSS(ig)=2;MGAUSS(ig)=3   
01377        endif 
01378        if(orbtype(ig)=='dxy')then 
01379         LGAUSS(ig)=3;MGAUSS(ig)=1   
01380        endif 
01381        if(orbtype(ig)=='dyz')then 
01382         LGAUSS(ig)=3;MGAUSS(ig)=2   
01383        endif 
01384        if(orbtype(ig)=='dz2')then 
01385         LGAUSS(ig)=3;MGAUSS(ig)=3   
01386        endif 
01387        if(orbtype(ig)=='dzx')then 
01388         LGAUSS(ig)=3;MGAUSS(ig)=4   
01389        endif 
01390        if(orbtype(ig)=='dx2')then 
01391         LGAUSS(ig)=3;MGAUSS(ig)=5   
01392        endif 
01393       enddo!ig 
01394 !--
01395 !NORMALIZE
01396       Do ig=1,nigs
01397        iL=LGAUSS(ig) 
01398        IF(iL==1)THEN 
01399         NORM_GAUSS(ig)
01400      +  =(8.0D0*ALPHA_GAUSS(ig)/pi)**0.25D0
01401      +  *(4.0D0*ALPHA_GAUSS(ig)/1.0D0)**0.50D0    
01402        ENDIF 
01403        IF(iL==2)THEN 
01404         NORM_GAUSS(ig)
01405      +  =(8.0D0*ALPHA_GAUSS(ig)/pi)**0.25D0    
01406      +  *(4.0D0*ALPHA_GAUSS(ig)/1.0D0)**0.50D0    
01407      +  *(4.0D0*ALPHA_GAUSS(ig)/3.0D0)**0.50D0    
01408        ENDIF 
01409        IF(iL==3)THEN 
01410         NORM_GAUSS(ig)
01411      +  =(8.0D0*ALPHA_GAUSS(ig)/pi)**0.25D0    
01412      +  *(4.0D0*ALPHA_GAUSS(ig)/1.0D0)**0.50D0    
01413      +  *(4.0D0*ALPHA_GAUSS(ig)/3.0D0)**0.50D0    
01414      +  *(4.0D0*ALPHA_GAUSS(ig)/5.0D0)**0.50D0    
01415        ENDIF 
01416       ENDDO!ig 
01417       !--
01418       write(6,*) 
01419       write(6,*)'=================='
01420       write(6,*)'INITIAL GUESS DATA'
01421       write(6,*)'=================='
01422       write(6,*) 
01423       do ig=1,nigs 
01424        write(6,'(2i5,4f15.10)')
01425      + LGAUSS(ig),MGAUSS(ig),ALPHA_GAUSS(ig),TAU_GAUSS(:,ig)
01426       enddo 
01427       write(6,*) 
01428       write(6,*)'=================='
01429       write(6,*)'COORD IN CARTESIAN'
01430       write(6,*)'=================='
01431       write(6,*) 
01432       do ig=1,nigs
01433        tmp(:)=TAU_GAUSS(:,ig)  
01434        TAU_GAUSS(:,ig)=tmp(1)*a1(:)+tmp(2)*a2(:)+tmp(3)*a3(:) 
01435        write(6,'(3f20.12)') TAU_GAUSS(:,ig) 
01436       enddo 
01437       write(6,*) 
01438 !--
01439 !A_MAT
01440       write(6,*) 
01441       write(6,*)'=========='
01442       write(6,*)'CALC A_MAT' 
01443       write(6,*)'=========='
01444       write(6,*) 
01445       allocate(A_MAT(NTB,nigs,NTK));A_MAT=0.0d0          
01446 !--
01447 !$OMP PARALLEL PRIVATE(ik,A_TMP)
01448       allocate(A_TMP(NTB,nigs));A_TMP=0.0d0 
01449 !$OMP DO 
01450       do ik=1,NTK         
01451        call make_amat(nigs,NTB,NTG,NG0(ik),SK0(1,ik),KG0(1,1,ik),
01452      + b1(1),b2(1),b3(1),TAU_GAUSS(1,1),ALPHA_GAUSS(1),
01453      + loc_x(1,1),loc_y(1,1),loc_z(1,1),LGAUSS(1),MGAUSS(1),
01454      + N_BAND(ik),C0(1,1,ik),N_BAND_BTM(ik),NORM_GAUSS(1),VOLUME,
01455      + A_TMP(1,1)) 
01456        A_MAT(:,:,ik)=A_TMP(:,:) 
01457       enddo!ik           
01458 !$OMP END DO 
01459       deallocate(A_TMP) 
01460 !$OMP END PARALLEL 
01461 !--
01462 !     do ik=1,NTK 
01463 !      WRITE(6,*)'ik=',ik 
01464 !      do i_band=1,N_BAND(ik)       
01465 !       do j_gauss=1,nigs 
01466 !        write(6,'(2i5,2f15.10)')i_band,j_gauss,A_MAT(i_band,j_gauss,ik)
01467 !       enddo!j_gauss
01468 !      enddo!i_band 
01469 !      WRITE(6,*) 
01470 !     enddo!ik  
01471 !     WRITE(6,*) 
01472 !--
01473 !BMAT 
01474 !SP2 WF 
01475 !      B_MAT(:,:) = 0.0D0 
01476 !      B_MAT(1,1) = DSQRT(1.0D0/3.0D0)  
01477 !      B_MAT(1,2) = DSQRT(1.0D0/3.0D0)  
01478 !      B_MAT(1,3) = DSQRT(1.0D0/3.0D0)  
01479 !      B_MAT(2,1) =-DSQRT(2.0D0/3.0D0)  
01480 !      B_MAT(2,2) = DSQRT(1.0D0/6.0D0)  
01481 !      B_MAT(2,3) = DSQRT(1.0D0/6.0D0)  
01482 !      B_MAT(3,4) = 1.0D0 
01483 !      B_MAT(4,2) = DSQRT(1.0D0/2.0D0)  
01484 !      B_MAT(4,3) =-DSQRT(1.0D0/2.0D0)  
01485 !      B_MAT(5,5) = DSQRT(1.0D0/3.0D0)  
01486 !      B_MAT(5,6) = DSQRT(1.0D0/3.0D0)  
01487 !      B_MAT(5,7) = DSQRT(1.0D0/3.0D0)  
01488 !      B_MAT(6,5) = DSQRT(2.0D0/3.0D0)  
01489 !      B_MAT(6,6) =-DSQRT(1.0D0/6.0D0)  
01490 !      B_MAT(6,7) =-DSQRT(1.0D0/6.0D0)  
01491 !      B_MAT(7,8) = 1.0D0 
01492 !      B_MAT(8,6) =-DSQRT(1.0D0/2.0D0)  
01493 !      B_MAT(8,7) = DSQRT(1.0D0/2.0D0)  
01494 !SP3 WF 
01495 !      B_MAT(:,:) = 0.0D0 
01496 !      B_MAT(1,1) =  0.5D0  
01497 !      B_MAT(1,2) =  0.5D0  
01498 !      B_MAT(1,3) =  0.5D0  
01499 !      B_MAT(1,4) =  0.5D0  
01500 !      B_MAT(2,1) = -0.5D0  
01501 !      B_MAT(2,2) =  0.5D0  
01502 !      B_MAT(2,3) = -0.5D0  
01503 !      B_MAT(2,4) =  0.5D0  
01504 !      B_MAT(3,1) =  0.5D0  
01505 !      B_MAT(3,2) = -0.5D0  
01506 !      B_MAT(3,3) = -0.5D0  
01507 !      B_MAT(3,4) =  0.5D0  
01508 !      B_MAT(4,1) = -0.5D0  
01509 !      B_MAT(4,2) = -0.5D0  
01510 !      B_MAT(4,3) =  0.5D0  
01511 !      B_MAT(4,4) =  0.5D0  
01512 !      B_MAT(5,5) =  0.5D0  
01513 !      B_MAT(5,6) =  0.5D0  
01514 !      B_MAT(5,7) =  0.5D0  
01515 !      B_MAT(5,8) =  0.5D0  
01516 !      B_MAT(6,5) =  0.5D0  
01517 !      B_MAT(6,6) = -0.5D0  
01518 !      B_MAT(6,7) =  0.5D0  
01519 !      B_MAT(6,8) = -0.5D0  
01520 !      B_MAT(7,5) = -0.5D0  
01521 !      B_MAT(7,6) =  0.5D0  
01522 !      B_MAT(7,7) =  0.5D0  
01523 !      B_MAT(7,8) = -0.5D0  
01524 !      B_MAT(8,5) =  0.5D0  
01525 !      B_MAT(8,6) =  0.5D0  
01526 !      B_MAT(8,7) = -0.5D0  
01527 !      B_MAT(8,8) = -0.5D0  
01528 !--
01529 !A_MAT=A_MAT*B_MAT
01530       allocate(A_TMP(NTB,nigs));A_TMP=0.0d0 
01531       do ik=1,NTK 
01532        A_TMP(:,:)=A_MAT(:,:,ik) 
01533        do ib=1,N_BAND(ik)
01534         do ig=1,NGAUSS
01535          SUM_CMPX=0.0D0 
01536          do jg=1,nigs
01537           SUM_CMPX=SUM_CMPX+A_TMP(ib,jg)*B_MAT(jg,ig) 
01538          ENDDO 
01539          A_MAT(ib,ig,ik)=SUM_CMPX 
01540         ENDDO!ig 
01541        ENDDO!ib
01542       ENDDO!ik 
01543       write(6,*)'finish calc A_MAT' 
01544       !--
01545       allocate(S_MAT(NGAUSS,NGAUSS));S_MAT(:,:)=0.0D0
01546       allocate(S_TMP(NGAUSS,NGAUSS));S_TMP(:,:)=0.0d0
01547       allocate(S_EIG(NGAUSS));S_EIG(:)=0.0D0
01548       allocate(X_MAT(NGAUSS,NGAUSS));X_MAT(:,:)=0.0D0
01549       allocate(S_HALF_MAT(NGAUSS,NGAUSS));S_HALF_MAT(:,:)=0.0D0
01550       allocate(C_MAT(NTB,NGAUSS,NTK));C_MAT(:,:,:)=0.0D0          
01551       !--
01552       do ik=1,NTK        
01553 !S_MAT
01554        S_MAT(:,:)=0.0d0 
01555        do ig=1,NGAUSS
01556         do jg=1,NGAUSS
01557          SUM_CMPX=0.0D0         
01558          do ib=1,N_BAND(ik)        
01559           SUM_CMPX=SUM_CMPX+CONJG(A_MAT(ib,ig,ik))*A_MAT(ib,jg,ik)   
01560          enddo!ib
01561          S_MAT(ig,jg)=SUM_CMPX 
01562         enddo!jg
01563        enddo!ig       
01564 !--
01565 !      write(6,*)'IK=',ik     
01566 !       do ig=1,NGAUSS
01567 !        do jg=1,NGAUSS
01568 !         write(6,'(2i5,2f15.10)') ig,jg,S_MAT(ig,jg) 
01569 !        enddo!ig       
01570 !       enddo!jg       
01571 !       write(6,*) 
01572 !diag S_MAT
01573        S_EIG(:)=0.0D0                
01574        S_TMP(:,:)=S_MAT(:,:) 
01575        call diagV(NGAUSS,S_TMP(1,1),S_EIG(1)) 
01576        X_MAT(:,:)=S_TMP(:,:)
01577        do ig=1,NGAUSS 
01578         if(S_EIG(ig)<=0.0D0)then 
01579          write(6,*)'WARNING diag S_MAT' 
01580          write(6,*) ig,S_EIG(ig) 
01581          S_EIG(ig)=1.0D-10 
01582         endif 
01583        enddo 
01584 !S_HALF_MAT
01585        S_HALF_MAT(:,:)=0.0D0 
01586        S_EIG(:)=1.0D0/DSQRT(S_EIG(:)) 
01587        do ig=1,NGAUSS
01588         do jg=1,NGAUSS
01589          SUM_CMPX=0.0D0         
01590          do kg=1,NGAUSS      
01591           SUM_CMPX=SUM_CMPX+X_MAT(ig,kg)*S_EIG(kg)*CONJG(X_MAT(jg,kg)) 
01592          enddo!kg 
01593          S_HALF_MAT(ig,jg)=SUM_CMPX  
01594         enddo!jg 
01595        enddo!ig 
01596 !C_MAT
01597        do ib=1,N_BAND(ik)         
01598         do jg=1,NGAUSS
01599          SUM_CMPX=0.0D0             
01600          do kg=1,NGAUSS             
01601           SUM_CMPX=SUM_CMPX+A_MAT(ib,kg,ik)*S_HALF_MAT(kg,jg)        
01602          enddo 
01603          C_MAT(ib,jg,ik)=SUM_CMPX         
01604         enddo!jg       
01605        enddo!ib    
01606       enddo!ik ===CONSTRUCT C_MAT ROOP===      
01607       deallocate(S_MAT,S_TMP,S_EIG,X_MAT,S_HALF_MAT)
01608       ! 
01609       !write(6,*)'C_MAT'
01610       !write(6,*) C_MAT 
01611       ! 
01612 !--
01613 !      WRITE(6,*) 
01614 !      WRITE(6,*)'==========================='
01615 !      WRITE(6,*)'CHECK OF UNITALITY OF C_MAT'
01616 !      WRITE(6,*)'==========================='
01617 !      WRITE(6,*) 
01618 !      do ik=1,NTK      
01619 !       do i_gauss=1,NGAUSS       
01620 !        do j_gauss=1,NGAUSS
01621 !         SUM_CMPX=0.0D0             
01622 !         do i_band=1,N_BAND(ik)        
01623 !          SUM_CMPX 
01624 !     +   =SUM_CMPX 
01625 !     +   +CONJG(C_MAT(i_band,i_gauss,ik))  
01626 !     +   *      C_MAT(i_band,j_gauss,ik)        
01627 !         enddo 
01628 !         write(6,'(2I5,2F20.15)') i_gauss,j_gauss,SUM_CMPX
01629 !        enddo!j_gauss     
01630 !       enddo!i_gauss     
01631 !       write(6,*) 
01632 !      enddo!ik            
01633 !
01634 !=========================================================
01635 !=== CALCULATE THE NUMBER OF BANDS INSIDE INNER WINDOW ===
01636 !=========================================================
01637 
01638       if(set_inner_window)then 
01639        allocate(N_BAND_inner(NTK));N_BAND_inner=0
01640        allocate(N_BAND_BTM_inner(NTK));N_BAND_BTM_inner=0
01641        allocate(inner(NTB,NTK));inner=0
01642        write(6,*) 
01643        write(6,*)'===================================='
01644        write(6,*)'BAND INFO INSIDE INNER ENERGY WINDOW'
01645        write(6,*)'===================================='
01646        write(6,*) 
01647        do ik=1,NTK 
01648         SUM_INT=0 
01649         do ib=1,N_BAND(ik) 
01650          if(E_LOWER_inner<=E_EIG(N_BAND_BTM(ik)+ib,ik).and.
01651      +      E_EIG(N_BAND_BTM(ik)+ib,ik)<=E_UPPER_inner)then 
01652           inner(ib,ik)=1
01653           SUM_INT=SUM_INT+1 
01654           if(SUM_INT==1) N_BAND_BTM_inner(ik)=ib-1  
01655          endif 
01656         enddo 
01657         N_BAND_inner(ik)=SUM_INT
01658 !--
01659 !check N_BAND_inner(ik) <= N_wannier 
01660         if(N_BAND_inner(ik)>N_wannier)then 
01661          write(6,'(a)')'inner energy window setting: WRONG'
01662          write(6,'(a)')'NBAND_inner SHOULD BE SMALLER THAN N_wannier'
01663          write(6,'(a,3i8)')'ik, N_BAND_inner(ik), N_wannier',
01664      +                      ik, N_BAND_inner(ik), N_wannier 
01665          stop 
01666         endif  
01667         write(6,*) ik,N_BAND_BTM_inner(ik),N_BAND_inner(ik) 
01668        enddo!ik  
01669        write(6,*) 
01670 !--
01671 !initial CMAT
01672        do ik=1,NTK 
01673 !X=QPQ 
01674         allocate(P_MAT(NTB,NTB));P_MAT=0.0d0
01675         do ib=1,N_BAND(ik)
01676          do jb=1,N_BAND(ik)
01677           SUM_CMPX=0.0d0 
01678           do jg=1,NGAUSS 
01679            SUM_CMPX=SUM_CMPX+C_MAT(ib,jg,ik)*CONJG(C_MAT(jb,jg,ik)) 
01680           enddo 
01681           P_MAT(ib,jb)=SUM_CMPX 
01682          enddo!jb  
01683         enddo!ib
01684         allocate(Qin(NTB,NTB));Qin=0.0d0
01685         do ib=1,N_BAND(ik)
01686          if(inner(ib,ik)==1)cycle 
01687          Qin(ib,ib)=1.0d0 
01688         enddo 
01689 !--
01690 !        do ib=1,N_BAND_inner(ik)
01691 !         do jb=1,N_BAND_inner(ik) 
01692 !          Qin(ib+N_BAND_BTM_inner(ik),jb+N_BAND_BTM_inner(ik)) 
01693 !     +   =Qin(ib+N_BAND_BTM_inner(ik),jb+N_BAND_BTM_inner(ik)) 
01694 !     +   -P_MAT(ib+N_BAND_BTM_inner(ik),jb+N_BAND_BTM_inner(ik)) 
01695 !         enddo 
01696 !        enddo 
01697 !--
01698         allocate(X_MAT(NTB,NTB));X_MAT=0.0d0  
01699         do ib=1,N_BAND(ik)
01700          do jb=1,N_BAND(ik) 
01701           SUM_CMPX=0.0d0 
01702           do k=1,N_BAND(ik) 
01703            do l=1,N_BAND(ik) 
01704             SUM_CMPX=SUM_CMPX+CONJG(Qin(k,ib))*P_MAT(k,l)*Qin(l,jb) 
01705            enddo!l 
01706           enddo!k 
01707           X_MAT(ib,jb)=SUM_CMPX 
01708          enddo!jb
01709         enddo!ib  
01710 !XC=Cx
01711         nm=N_BAND(ik) 
01712         allocate(mat_tmp(nm,nm));mat_tmp(:,:)=0.0d0 
01713         allocate(eig_tmp(nm));eig_tmp(:)=0.0d0        
01714         mat_tmp(1:nm,1:nm)=X_MAT(1:nm,1:nm) 
01715         call diagV(nm,mat_tmp(1,1),eig_tmp(1)) 
01716 !descending order
01717         X_MAT=0.0d0 
01718         do ib=1,nm 
01719          X_MAT(1:nm,ib)=mat_tmp(1:nm,nm-ib+1) 
01720         enddo 
01721         deallocate(mat_tmp,eig_tmp) 
01722 !CMAT 
01723         do jg=1,NGAUSS-N_BAND_inner(ik) 
01724          C_MAT(:,jg,ik)=X_MAT(:,jg) 
01725         enddo               
01726         do jg=1,N_BAND_inner(ik) 
01727          C_MAT(:,NGAUSS-N_BAND_inner(ik)+jg,ik)=0.0d0 
01728         enddo 
01729         do ib=1,N_BAND_inner(ik)
01730          i=N_BAND_BTM_inner(ik)+ib 
01731          j=NGAUSS-N_BAND_inner(ik)+ib 
01732          C_MAT(i,j,ik)=1.0d0 
01733         enddo 
01734         deallocate(P_MAT,Qin,X_MAT) 
01735        enddo!ik   
01736       else
01737        allocate(N_BAND_inner(NTK));N_BAND_inner=0
01738        allocate(N_BAND_BTM_inner(NTK));N_BAND_BTM_inner=0
01739        allocate(inner(NTB,NTK));inner=0
01740       endif!set_inner_window 
01741 !--
01742 !      write(6,*)'INNER'
01743 !      do ik=1,NTK 
01744 !       write(6,*) ik,N_BAND_BTM_inner(ik),N_BAND_inner(ik) 
01745 !      enddo 
01746 !--
01747       WRITE(6,*) 
01748       WRITE(6,*)'==========================================='        
01749       WRITE(6,*)'=== MINIMIZATION OF SPILLAGE FUNCTIONAL ==='
01750       WRITE(6,*)'==========================================='        
01751       WRITE(6,*) 
01752       !--
01753       allocate(Z_EIG(NTB));Z_EIG(:)=0.0D0            
01754       allocate(Z_MAT(NTB,NTB,NTK));Z_MAT(:,:,:)=0.0D0        
01755       allocate(Z_TMP(NTB,NTB));Z_TMP(:,:)=0.0D0               
01756       allocate(C_TMP(NTB,NTB));C_TMP(:,:)=0.0D0      
01757       allocate(M_MAT(NTB,NTB,NTK,NB));M_MAT(:,:,:,:)=0.0D0            
01758 !--
01759 !N    : NGAUSS  
01760 !N_k  : N_BAND(ik) 
01761 !N_k+b: N_BAND(ik_ib) 
01762 !M_k  : N_BAND_inner(ik) 
01763 !--
01764       I_SCF=0           
01765       DEL_OMEGA_I=1.0D0 
01766       OMEGA_I_OLD=0.0D0        
01767       do while(DEL_OMEGA_I>EPS_SPILLAGE) 
01768 !make M_MAT: size = N_k * N_k+b 
01769        M_MAT(:,:,:,:)=0.0D0            
01770        do ik=1,NTK         
01771         do ibvec=1,NB 
01772          ik_ib=KPT(ik,ibvec)       
01773          do ib=1,N_BAND(ik)       
01774           do jg=1,NGAUSS 
01775            SUM_CMPX=0.0D0             
01776            do kb=1,N_BAND(ik_ib)         
01777             SUM_CMPX=SUM_CMPX+OVERLAP(ib,kb,ik,ibvec)*C_MAT(kb,jg,ik_ib)
01778            enddo 
01779            M_MAT(ib,jg,ik,ibvec)=SUM_CMPX       
01780           enddo!jg
01781          enddo!ib     
01782         enddo!ibvec  
01783        enddo!ik         
01784        !--
01785        SUM_REAL=0.0D0           
01786        OMEGA_I_NEW=0.0D0           
01787        C_MAT(:,:,:)=0.0D0 
01788        do ik=1,NTK           
01789 !make Z_TMP: size = N_k * N_k 
01790         Z_TMP(:,:)=0.0D0               
01791         do ib=1,N_BAND(ik)    
01792          do jb=1,N_BAND(ik)    
01793           SUM_CMPX=0.0D0                
01794           do ibvec=1,NB          
01795            do jg=1,NGAUSS 
01796             SUM_CMPX
01797      +     =SUM_CMPX
01798      +     +WEIGHT_b(ibvec)
01799      +     *M_MAT(ib,jg,ik,ibvec)*CONJG(M_MAT(jb,jg,ik,ibvec))  
01800            enddo 
01801           enddo 
01802           Z_TMP(ib,jb)=SUM_CMPX                  
01803          enddo!jb         
01804         enddo!ib         
01805 !make Z_MAT: damped Z_TMP
01806         IF(I_SCF==0) THEN  
01807          Z_MAT(:,:,ik)=Z_TMP(:,:)          
01808         ELSE 
01809          Z_MAT(:,:,ik)=DAMP*Z_TMP(:,:)+(1.0D0-DAMP)*Z_MAT(:,:,ik)   
01810         ENDIF        
01811 !make X: size = (N_k-M_k)*(N_k-M_k) 
01812         nm=N_BAND(ik)-N_BAND_inner(ik)!inner window    
01813         allocate(mat_tmp(nm,nm));mat_tmp(:,:)=0.0d0 
01814         allocate(eig_tmp(nm));eig_tmp(:)=0.0d0        
01815         i=0 
01816         do ib=1,N_BAND(ik) 
01817          if(inner(ib,ik)==1)cycle 
01818          i=i+1 
01819          j=0 
01820          do jb=1,N_BAND(ik) 
01821           if(inner(jb,ik)==1)cycle
01822           j=j+1 
01823           mat_tmp(i,j)=Z_MAT(ib,jb,ik)
01824          enddo 
01825         enddo   
01826 !diag X: XC'=C'x 
01827         eig_tmp(:)=0.0d0 
01828         !--
01829         !20180412 by Y.Nomura 
01830         !--
01831         if(nm>0)then
01832          call diagV(nm,mat_tmp(1,1),eig_tmp(1)) 
01833         endif 
01834         !--
01835 !descending order
01836         Z_EIG(:)=0.0D0            
01837         C_TMP(:,:)=0.0d0 
01838         do ib=1,nm
01839          Z_EIG(ib)=eig_tmp(nm-ib+1)
01840          C_TMP(1:nm,ib)=mat_tmp(1:nm,nm-ib+1) 
01841         enddo 
01842         deallocate(mat_tmp,eig_tmp) 
01843 !make C_MAT: size = N_k * N 
01844         i=0 
01845         do ib=1,N_BAND(ik) 
01846          if(inner(ib,ik)==0)then 
01847           i=i+1
01848           !C_MAT(ib,:,ik)=C_TMP(i,:) ###bag### 20171208
01849           C_MAT(ib,1:NGAUSS-N_BAND_inner(ik),ik)
01850      +   =C_TMP(i ,1:NGAUSS-N_BAND_inner(ik)) 
01851          else!(inner(ib,ik)==1) 
01852           C_MAT(ib,:,ik)=0.0d0 
01853          endif 
01854         enddo!ib  
01855         do jg=1,N_BAND_inner(ik) 
01856          C_MAT(:,NGAUSS-N_BAND_inner(ik)+jg,ik)=0.0d0 
01857         enddo 
01858         do ib=1,N_BAND_inner(ik)
01859          i=N_BAND_BTM_inner(ik)+ib 
01860          j=NGAUSS-N_BAND_inner(ik)+ib 
01861          C_MAT(i,j,ik)=1.0d0 
01862         enddo 
01863 !--
01864 !SPILLAGE 
01865         do ig=1,NGAUSS
01866          do jb=1,N_BAND(ik)
01867           do ib=1,N_BAND(ik)
01868            SUM_REAL
01869      +    =SUM_REAL 
01870      +    +dble(conjg(C_MAT(ib,ig,ik))*Z_MAT(ib,jb,ik)*C_MAT(jb,ig,ik)) 
01871           enddo 
01872          enddo 
01873         enddo 
01874         OMEGA_I_NEW=OMEGA_I_NEW+dble(NGAUSS)*WEIGHT 
01875 !--
01876 !        nm=NGAUSS-N_BAND_inner(ik)!inner window
01877 !        do jg=1,nm
01878 !         SUM_REAL=SUM_REAL+Z_EIG(jg) 
01879 !        enddo 
01880 !        OMEGA_I_NEW=OMEGA_I_NEW+dble(nm)*WEIGHT 
01881 !--
01882        enddo!ik 
01883        OMEGA_I_NEW=(OMEGA_I_NEW-SUM_REAL)/DBLE(NTK)      
01884        DEL_OMEGA_I=DABS(OMEGA_I_NEW-OMEGA_I_OLD)            
01885        OMEGA_I_OLD=OMEGA_I_NEW          
01886        I_SCF=I_SCF+1                                       
01887        write(6,'(A8,I5,A15,F20.10,A10,F20.10)')'I_SCF=',I_SCF, 
01888      +         'DEL_OMEGA_I=',DEL_OMEGA_I,'OMEGA_I',OMEGA_I_NEW        
01889       enddo!do-while##### OMEGA_I MINIMIZATION ##### 
01890 !--
01891 !      do ik=1,NTK 
01892 !       if(N_BAND_inner(ik)/=0)then 
01893 !        write(6,*)'CMAT(fns) ik=',ik  
01894 !        do ib=1,N_BAND(ik) 
01895 !         write(6,'(100f10.5)')(C_MAT(ib,jg,ik),jg=1,NGAUSS)  
01896 !        enddo 
01897 !        write(6,*) 
01898 !       endif 
01899 !      enddo!ik
01900 !===============================================
01901 !=== PSEUDO EIGENSTATE AND PSEUDO EIGENVALUE === 
01902 !===============================================
01903 
01904       allocate(PSEUDO_EIG(NGAUSS,NTK));PSEUDO_EIG(:,:)=0.0D0    
01905       allocate(PSEUDO_MAT(NGAUSS,NGAUSS,NTK));PSEUDO_MAT(:,:,:)=0.0D0 
01906       allocate(P_EIG(NGAUSS));P_EIG(:)=0.0d0 
01907       allocate(P_MAT_IN(NGAUSS,NGAUSS));P_MAT_IN(:,:)=0.0D0 
01908       allocate(P_MAT_OUT(NGAUSS,NGAUSS));P_MAT_OUT(:,:)=0.0D0 
01909       !--
01910       do ik=1,NTK               
01911 !PSEUDO-KS 
01912        P_MAT_IN(:,:)=0.0D0          
01913        do ig=1,NGAUSS            
01914         do jg=1,NGAUSS           
01915          SUM_CMPX=0.0D0           
01916          do kb=1,N_BAND(ik)                 
01917           SUM_CMPX 
01918      +   =SUM_CMPX 
01919      +   +CONJG(C_MAT(kb,ig,ik))          
01920      +   *E_EIG(kb+N_BAND_BTM(ik),ik)      
01921      +   *C_MAT(kb,jg,ik)                     
01922          enddo 
01923          P_MAT_IN(ig,jg)=SUM_CMPX              
01924         enddo!jg        
01925        enddo!ig        
01926 !diag PSEUDO-KS 
01927        P_EIG(:)=0.0D0            
01928        call diagV(NGAUSS,P_MAT_IN(1,1),P_EIG(1)) 
01929        P_MAT_OUT(:,:)=P_MAT_IN(:,:) 
01930        PSEUDO_MAT(:,:,ik)=P_MAT_OUT(:,:)          
01931        PSEUDO_EIG(:,ik)=P_EIG(:)          
01932       enddo!ik                    
01933       !deallocate(E_EIG) 
01934 !--
01935 !     do ik=1,NTK                  
01936 !      write(6,'(30F15.10)')PSEUDO_EIG(:,ik)*au 
01937 !     enddo 
01938 !
01939 !====================================================
01940 !=== PREPARE INITIAL GUESS FOR OMEGA MINIMIZATION ===
01941 !====================================================
01942 
01943       allocate(S_MAT(NGAUSS,NGAUSS));S_MAT(:,:)=0.0D0
01944       allocate(S_TMP(NGAUSS,NGAUSS));S_TMP(:,:)=0.0d0
01945       allocate(S_EIG(NGAUSS));S_EIG(:)=0.0D0
01946       allocate(X_MAT(NGAUSS,NGAUSS));X_MAT(:,:)=0.0D0
01947       allocate(S_HALF_MAT(NGAUSS,NGAUSS));S_HALF_MAT(:,:)=0.0D0
01948       Z_MAT(:,:,:)=0.0D0!INITIAL GUESS <---> CELL-PERIODIC 
01949       do ik=1,NTK               
01950 !A_TMP
01951        A_TMP(:,:)=0.0D0             
01952        do ib=1,n_occ        
01953         do jg=1,NGAUSS          
01954          SUM_CMPX=0.0D0           
01955          do kb=1,N_BAND(ik)          
01956           do lg=1,NGAUSS    
01957            SUM_CMPX
01958      +    =SUM_CMPX
01959      +    +CONJG(PSEUDO_MAT(lg,ib,ik))          
01960      +    *CONJG(C_MAT(kb,lg,ik))          
01961      +    *A_MAT(kb,jg,ik)               
01962           ENDDO 
01963          ENDDO 
01964          A_TMP(ib,jg)=SUM_CMPX               
01965         ENDDO!jg      
01966        ENDDO!ib            
01967 !S_MAT
01968        S_MAT(:,:)=0.0D0                   
01969        Do ig=1,NGAUSS
01970         Do jg=1,NGAUSS
01971          SUM_CMPX=0.0D0         
01972          Do kb=1,n_occ                      
01973           SUM_CMPX 
01974      +   =SUM_CMPX 
01975      +   +CONJG(A_TMP(kb,ig))
01976      +   *A_TMP(kb,jg) 
01977          ENDDO!kb
01978           S_MAT(ig,jg)=SUM_CMPX 
01979         ENDDO!jg
01980        ENDDO!ig       
01981 !diag S_MAT
01982        S_EIG(:)=0.0D0            
01983        call diagV(NGAUSS,S_MAT(1,1),S_EIG(1)) 
01984        X_MAT(:,:)=S_MAT(:,:) 
01985        Do ig=1,NGAUSS 
01986         IF(S_EIG(ig)<=0.0D0) THEN 
01987          write(6,*) ig,S_EIG(ig) 
01988          S_EIG(ig)=1.0D-10 
01989         ENDIF       
01990        ENDDO 
01991 !S_HALF_MAT
01992        S_EIG(:)=1.0D0/DSQRT(S_EIG(:)) 
01993        S_HALF_MAT(:,:)=0.0D0         
01994        Do ig=1,NGAUSS
01995         Do jg=1,NGAUSS
01996          SUM_CMPX=0.0D0         
01997          Do kg=1,NGAUSS      
01998           SUM_CMPX 
01999      +   =SUM_CMPX 
02000      +   +X_MAT(ig,kg) 
02001      +   *S_EIG(kg) 
02002      +   *CONJG(X_MAT(jg,kg))          
02003          ENDDO 
02004          S_HALF_MAT(ig,jg)=SUM_CMPX  
02005         ENDDO!jg 
02006        ENDDO!ig 
02007 !A_MAT
02008        A_MAT(:,:,ik)=0.0D0         
02009        Do ib=1,n_occ              
02010         Do jg=1,NGAUSS
02011          SUM_CMPX=0.0D0             
02012          Do kg=1,NGAUSS             
02013           SUM_CMPX 
02014      +   =SUM_CMPX 
02015      +   +A_TMP(ib,kg) 
02016      +   *S_HALF_MAT(kg,jg)        
02017          ENDDO              
02018          A_MAT(ib,jg,ik)=SUM_CMPX         
02019         ENDDO!jg       
02020        ENDDO!ib    
02021 !Z_MAT 
02022        Do ib=1,N_BAND(ik)          
02023         Do jg=1,NGAUSS 
02024          SUM_CMPX=0.0D0                   
02025          Do kg=1,NGAUSS 
02026           Do llb=1,n_occ                
02027            SUM_CMPX 
02028      +    =SUM_CMPX 
02029      +    +C_MAT(ib,kg,ik) 
02030      +    *PSEUDO_MAT(kg,llb,ik) 
02031      +    *A_MAT(llb,jg,ik)
02032           ENDDO 
02033          ENDDO 
02034          Z_MAT(ib,jg,ik)=SUM_CMPX          
02035         ENDDO!jg         
02036        ENDDO!ib          
02037       ENDDO!ik ##### INITIAL GUESS FOR OMEGA MINIMIZATION #####
02038       deallocate(S_MAT,S_TMP,S_EIG,X_MAT,S_HALF_MAT)
02039 !--
02040 !      WRITE(6,*) 
02041 !      WRITE(6,*)'==========================='
02042 !      WRITE(6,*)'CHECK OF UNITALITY OF Z_MAT'
02043 !      WRITE(6,*)'==========================='
02044 !      WRITE(6,*) 
02045 !      do ik=1,NTK      
02046 !       do i_gauss=1,NGAUSS       
02047 !        do j_gauss=1,NGAUSS
02048 !         SUM_CMPX=0.0D0             
02049 !         do i_band=1,N_BAND(ik)        
02050 !          SUM_CMPX 
02051 !     +   =SUM_CMPX 
02052 !     +   +CONJG(Z_MAT(i_band,i_gauss,ik))  
02053 !     +   *Z_MAT(i_band,j_gauss,ik)        
02054 !         enddo               
02055 !         write(6,'(2i5,2f20.15)') i_gauss,j_gauss,SUM_CMPX
02056 !        enddo!j_gauss     
02057 !       enddo!i_gauss     
02058 !       write(6,*)  
02059 !      enddo!ik            
02060 !
02061 !=========================================
02062 !=== MINIMIZATION OF SPREAD FUNCTIONAL ===
02063 !=========================================
02064 
02065       WRITE(6,*) 
02066       WRITE(6,*)'====================================='
02067       WRITE(6,*)'INTERSTATE MATRIX; LOG{det[M(k,k+b)]}'
02068       WRITE(6,*)'====================================='
02069       WRITE(6,*) 
02070 
02071       M_MAT(:,:,:,:)=OVERLAP(:,:,:,:)                      
02072       OVERLAP(:,:,:,:)=0.0D0                                          
02073       Do ik=1,NTK 
02074        Do ibvec=1,NB      
02075         ik_ib=KPT(ik,ibvec)        
02076         Do i_band=1,n_occ!NOTICE n_occ=NGAUSS  
02077          Do j_band=1,n_occ!NOTICE n_occ=NGAUSS  
02078           SUM_CMPX=0.0D0           
02079           Do k_band=1,N_BAND(ik)      
02080            Do l_band=1,N_BAND(ik_ib)      
02081             SUM_CMPX 
02082      +     =SUM_CMPX 
02083      +     +CONJG(Z_MAT(k_band,i_band,ik)) 
02084      +     *      M_MAT(k_band,l_band,ik,ibvec)            
02085      +     *      Z_MAT(l_band,j_band,ik_ib) 
02086            ENDDO 
02087           ENDDO 
02088           OVERLAP(i_band,j_band,ik,ibvec)=SUM_CMPX          
02089          ENDDO!j_band        
02090         ENDDO!i_band        
02091         !--
02092         !DET
02093          nm=n_occ 
02094          allocate(mat_tmp(nm,nm));mat_tmp(:,:)=0.0d0 
02095          mat_tmp(1:nm,1:nm)=OVERLAP(1:nm,1:nm,ik,ibvec) 
02096          call calcdet(nm,mat_tmp(1,1),DET) 
02097          deallocate(mat_tmp) 
02098         !--
02099         write(6,'(a8,i5,a8,i5,a8,2f15.10)')
02100      +  'IK=',ik,'IK_IB=',ik_ib,'LOG=',LOG(DET) 
02101        ENDDO!ibvec                
02102        WRITE(6,*) 
02103       ENDDO!ik                           
02104 
02105 !=================================
02106 !=== INITIAL SPREAD FUNCTIONAL ===
02107 !=================================
02108 
02109       allocate(WF_CHARGE(n_occ,NTK,NB));WF_CHARGE(:,:,:)=0.0d0       
02110       allocate(TR_GRAD(NTK));TR_GRAD(:)=0.0d0 
02111       allocate(TR_GRAD_OLD(NTK));TR_GRAD_OLD(:)=0.0d0   
02112       allocate(GRADIENT(n_occ,n_occ,NTK));GRADIENT(:,:,:)=0.0d0     
02113       allocate(DIRECTION(n_occ,n_occ,NTK));DIRECTION(:,:,:)=0.0d0      
02114       allocate(DIRECTION2(n_occ,n_occ,NTK));DIRECTION2(:,:,:)=0.0d0 
02115       allocate(UNITARY(n_occ,n_occ,NTK));UNITARY(:,:,:)=0.0d0        
02116       allocate(U_ORG(n_occ,n_occ,NTK));U_ORG(:,:,:)=0.0d0               
02117       allocate(U_OLD(n_occ,n_occ,NTK));U_OLD(:,:,:)=0.0d0               
02118       !--
02119       ILS=1           
02120       CALL CALC_OMEGA(NTK,NTB,n_occ,NB,VEC_b,ILS,WEIGHT_b,OVERLAP,
02121      +     WF_CHARGE,OMEGA_I,OMEGA_OD,OMEGA_D)                   
02122       !--
02123       write(6,*)'OMEGA_I =',OMEGA_I 
02124       write(6,*)'OMEGA_OD=',OMEGA_OD      
02125       write(6,*)'OMEGA_D =',OMEGA_D 
02126       write(6,*)'OMEGA_total=',OMEGA_I+OMEGA_D+OMEGA_OD
02127       WRITE(6,*) 
02128       WRITE(6,*)'========================================='        
02129       WRITE(6,*)'=== MINIMIZATION OF SPREAD FUNCTIONAL ==='
02130       WRITE(6,*)'========================================='        
02131       WRITE(6,*) 
02132       !--
02133       M_MAT(:,:,:,:)=OVERLAP(:,:,:,:)                      
02134       DEL_SPREAD=1.0d0!EPS_SPREAD=1.0D-6 default
02135       SPREAD_OLD=0.0D0 
02136       I_STEP=1        
02137       SPREAD=OMEGA_I+OMEGA_OD+OMEGA_D               
02138       do while(DEL_SPREAD>EPS_SPREAD) 
02139 !--
02140 !initial step 
02141       ILS=0 
02142       DELTA(1)=0.0D0  
02143       OMEGA(1)=SPREAD       
02144       write(6,*)'ILS=',ILS,DELTA(1),OMEGA(1)
02145 !--
02146 !CALC GRADIENT
02147       CALL CALC_GRADIENT(NTK,NTB,n_occ,NB,WF_CHARGE,WEIGHT_b,OVERLAP,
02148      +                   tci,GRADIENT,TR_GRAD) 
02149       DIRECTION(:,:,:)=GRADIENT(:,:,:) 
02150 !--
02151 !CONJUGATE GRADIENT
02152 !      IF(I_STEP==1) THEN 
02153 !       DIRECTION(:,:,:)=GRADIENT(:,:,:) 
02154 !      ELSE                 
02155 !       Do ik=1,NTK 
02156 !         DIRECTION(:,:,ik) 
02157 !     + = GRADIENT(:,:,ik) 
02158 !     + + (TR_GRAD(ik)/TR_GRAD_OLD(ik)) 
02159 !     + * DIRECTION(:,:,ik) 
02160 !       ENDDO          
02161 !      ENDIF              
02162 !      TR_GRAD_OLD(:)=TR_GRAD(:) 
02163 !--
02164 !DIRECTION^2
02165       DIRECTION2(:,:,:)=0.0D0        
02166       Do ik=1,NTK        
02167        Do i_band=1,n_occ       
02168         Do j_band=1,n_occ       
02169          SUM_CMPX=0.0D0 
02170          Do k_band=1,n_occ    
02171           SUM_CMPX 
02172      +   =SUM_CMPX 
02173      +   +DIRECTION(i_band,k_band,ik)     
02174      +   *DIRECTION(k_band,j_band,ik) 
02175          ENDDO!k_band     
02176          DIRECTION2(i_band,j_band,ik)=SUM_CMPX                
02177         ENDDO!j_band           
02178        ENDDO!i_band           
02179       ENDDO!ik       
02180 !===
02181 !=== ONE-DIMENSIONAL SEARCH 
02182 !===
02183       ILS=1           
02184       STEP_LENGTH=MAX_STEP_LENGTH/4.0D0/WEIGHT 
02185       DELTA(2)=STEP_LENGTH 
02186       CALL UNITARY_GEN(NTK,n_occ,ILS,DIRECTION(1,1,1),DIRECTION2(1,1,1),
02187      +     STEP_LENGTH,UNITARY(1,1,1),U_ORG(1,1,1),U_OLD(1,1,1))   
02188       OVERLAP(:,:,:,:)=M_MAT(:,:,:,:) 
02189       CALL UPDATE_OVERLAP(NTK,NTB,n_occ,NB,KPT,UNITARY,OVERLAP)
02190       CALL CALC_OMEGA(NTK,NTB,n_occ,NB,VEC_b,ILS,      
02191      +     WEIGHT_b,OVERLAP,WF_CHARGE,OMEGA_I,OMEGA_OD,OMEGA_D) 
02192       OMEGA(2)=OMEGA_I+OMEGA_D+OMEGA_OD
02193       write(6,*)'ILS=',ILS,DELTA(2),OMEGA(2)
02194 !20170917
02195       if(abs(OMEGA(1)-OMEGA(2))<1.0d-10)then
02196 !update M_MAT
02197        M_MAT(:,:,:,:)=OVERLAP(:,:,:,:)                      
02198 !update A_MAT
02199        CALL A_MAT_UPDATE(NTK,NTB,NGAUSS,n_occ,UNITARY,A_MAT)      
02200 !CONVERGENCE CHECK
02201        SPREAD_OLD=OMEGA(1) 
02202        SPREAD=OMEGA(2) 
02203        DEL_SPREAD=ABS(SPREAD-SPREAD_OLD) 
02204        SPREAD_OLD=OMEGA(2)               
02205        write(6,*) 
02206        write(6,'(a47)')'==============================================' 
02207        write(6,'(a47)')' SPREAD HAS ALREADY CONVERGED IN INITIAL STEP ' 
02208        write(6,'(a47)')'=============================================='
02209        write(6,*) 
02210        write(6,'(a26,i8,2f20.10)')'I_STEP SPREAD DEL_SPREAD:', 
02211      +                             I_STEP,SPREAD,DEL_SPREAD 
02212        write(6,*)  
02213        I_STEP=I_STEP+1          
02214       else
02215        do while(OMEGA(1)>OMEGA(2)) 
02216         ILS=ILS+1           
02217         DELTA(3) = DELTA(2)+STEP_LENGTH 
02218         CALL UNITARY_GEN(NTK,n_occ,ILS,DIRECTION(1,1,1),
02219      +  DIRECTION2(1,1,1),STEP_LENGTH,UNITARY(1,1,1),
02220      +  U_ORG(1,1,1),U_OLD(1,1,1))          
02221         OVERLAP(:,:,:,:)=M_MAT(:,:,:,:) 
02222         CALL UPDATE_OVERLAP(NTK,NTB,n_occ,NB,
02223      +                      KPT,UNITARY,OVERLAP)                       
02224         CALL CALC_OMEGA(NTK,NTB,n_occ,NB,VEC_b,ILS,          
02225      +                  WEIGHT_b,OVERLAP,WF_CHARGE,
02226      +                  OMEGA_I,OMEGA_OD,OMEGA_D)                   
02227         OMEGA(3)=OMEGA_I+OMEGA_D+OMEGA_OD
02228         write(6,*) 'ILS=',ILS,DELTA(3),OMEGA(3) 
02229         IF(OMEGA(2)<OMEGA(3)) EXIT 
02230         DELTA(1)=DELTA(2) 
02231         OMEGA(1)=OMEGA(2) 
02232         DELTA(2)=DELTA(3) 
02233         OMEGA(2)=OMEGA(3) 
02234        enddo!do while 
02235        !--
02236        DELTA(4)=0.5D0*(OMEGA(1)*(DELTA(2)**2-DELTA(3)**2) 
02237      +                +OMEGA(2)*(DELTA(3)**2-DELTA(1)**2)
02238      +                +OMEGA(3)*(DELTA(1)**2-DELTA(2)**2))
02239      +               /(OMEGA(1)*(DELTA(2)-DELTA(3))        
02240      +                +OMEGA(2)*(DELTA(3)-DELTA(1))        
02241      +                +OMEGA(3)*(DELTA(1)-DELTA(2)))       
02242        ILS=1           
02243        STEP_LENGTH=DELTA(4) 
02244        CALL UNITARY_GEN(NTK,n_occ,ILS,DIRECTION(1,1,1),
02245      +      DIRECTION2(1,1,1),STEP_LENGTH,UNITARY(1,1,1),
02246      +      U_ORG(1,1,1),U_OLD(1,1,1))      
02247        OVERLAP(:,:,:,:) = M_MAT(:,:,:,:) 
02248        CALL UPDATE_OVERLAP(NTK,NTB,n_occ,NB,KPT,UNITARY,OVERLAP) 
02249        CALL CALC_OMEGA(NTK,NTB,n_occ,NB,VEC_b,ILS,         
02250      +      WEIGHT_b,OVERLAP,WF_CHARGE,OMEGA_I,OMEGA_OD,OMEGA_D)
02251        OMEGA(4) = OMEGA_I+OMEGA_D+OMEGA_OD
02252        write(6,*)'DELTA_OPT=',DELTA(4),'OMEGA_OPT=',OMEGA(4) 
02253        write(6,*)'OMEGA_I =',OMEGA_I 
02254        write(6,*)'OMEGA_OD=',OMEGA_OD
02255        write(6,*)'OMEGA_D =',OMEGA_D
02256 !update M_MAT
02257        M_MAT(:,:,:,:)=OVERLAP(:,:,:,:)                      
02258 !update A_MAT
02259        CALL A_MAT_UPDATE(NTK,NTB,NGAUSS,n_occ,UNITARY,A_MAT)      
02260 !CONVERGENCE CHECK
02261        SPREAD=OMEGA(4) 
02262        DEL_SPREAD=ABS(SPREAD-SPREAD_OLD) 
02263        SPREAD_OLD=OMEGA(4)               
02264        write(6,'(a26,i8,2f20.10)')'I_STEP SPREAD DEL_SPREAD:', 
02265      +                             I_STEP,SPREAD,DEL_SPREAD 
02266        write(6,*)  
02267        I_STEP=I_STEP+1
02268       endif
02269       !--           
02270       ENDDO!##### SPREAD-MINIMIZATION ROOP #####         
02271 !--
02272 !      WRITE(6,*) 
02273 !      WRITE(6,*)'========================'
02274 !      WRITE(6,*)'UNITALITY CHECK OF A_MAT'
02275 !      WRITE(6,*)'========================'
02276 !      WRITE(6,*)  
02277 !      do ik=1,NTK 
02278 !       do ib=1,n_occ   
02279 !        do jb=1,n_occ   
02280 !         SUM_CMPX=0.0D0            
02281 !         do kb=1,n_occ       
02282 !          SUM_CMPX=SUM_CMPX+CONJG(A_MAT(kb,ib,ik))*A_MAT(kb,jb,ik) 
02283 !         enddo 
02284 !         write(6,*) ib,jb,SUM_CMPX        
02285 !        enddo  
02286 !       enddo  
02287 !       write(6,*)       
02288 !      enddo!ik        
02289 !--
02290 !wannier center 
02291       allocate(wannier_center(3,n_occ));wannier_center(:,:)=0.0d0  
02292       wannier_center(:,:)=0.0D0            
02293       Do i_band=1,n_occ       
02294        tmp(:)=0.0D0          
02295        Do ik=1,NTK        
02296         Do ibvec=1,NB           
02297          tmp(:) 
02298      +  =tmp(:) 
02299      +  +WEIGHT_b(ibvec) 
02300      +  *VEC_b(:,ibvec) 
02301      +  *AIMAG(LOG(OVERLAP(i_band,i_band,ik,ibvec)))
02302         ENDDO!ibvec            
02303        ENDDO!ik       
02304        wannier_center(:,i_band)=-tmp(:)/DBLE(NTK)   
02305       ENDDO!i_band           
02306 !--
02307 !OPEN(134,W,FILE='dat.wan-center') 
02308       OPEN(134,FILE='./dir-wan/dat.wan-center') 
02309       rewind(134)
02310       write(134,'(a)')'#Wannier center'
02311       write(134,'(a)')'#1:x, 2:y, 3:z (in xyz coord)'
02312       do i_band=1,n_occ 
02313        write(134,"(3F20.10)")(wannier_center(i,i_band),i=1,3)  
02314       enddo 
02315 !-- 
02316 !OPEN(113,W,FILE='dat.wan',FORM='unformatted') 
02317       OPEN(113,FILE='./dir-wan/dat.wan',FORM='unformatted') 
02318       allocate(C0_TMP_1(NTG,NTB))    
02319       allocate(C0_TMP_2(NTG,NTB))    
02320       REWIND(113)       
02321       write(113) n_occ!20170331(n_occ=NWF) 
02322       do ik=1,NTK 
02323        A_TMP(:,:)=0.0D0 
02324        do ib=1,N_BAND(ik)        
02325         do jb=1,n_occ        
02326          SUM_CMPX=0.0D0             
02327          do k=1,n_occ       
02328           do l=1,n_occ         
02329            SUM_CMPX
02330      +    =SUM_CMPX
02331      +    +C_MAT(ib,k,ik)*PSEUDO_MAT(k,l,ik)*A_MAT(l,jb,ik)
02332           enddo!l 
02333          enddo!k 
02334          A_TMP(ib,jb)=SUM_CMPX 
02335         enddo!jb
02336        enddo!ib
02337        C0_TMP_1(:,:)=C0(:,:,ik)        
02338        C0_TMP_2(:,:)=0.0D0     
02339 !--
02340 !write BF 
02341 !       A_TMP(:,:)=0.d0 
02342 !       do k_band=1,N_BAND(ik)
02343 !        A_TMP(k_band,k_band)=1.0d0
02344 !       enddo 
02345 !--
02346        do ig=1,NG0(ik)  
02347         do jb=1,n_occ        
02348          SUM_CMPX=0.0D0             
02349          do kb=1,N_BAND(ik)       
02350           SUM_CMPX 
02351      +   =SUM_CMPX 
02352      +   +C0_TMP_1(ig,kb+N_BAND_BTM(ik))*A_TMP(kb,jb) 
02353          enddo!kb 
02354          C0_TMP_2(ig,jb)=SUM_CMPX  
02355         enddo!jb 
02356        enddo!ig             
02357        write(113)((C0_TMP_2(ig,ib),ig=1,NG0(ik)),ib=1,n_occ) 
02358        !--
02359        !20180519
02360        !do ib=1,n_occ
02361        ! write(113) (C0_TMP_2(ig,ib),ig=1,NG0(ik))
02362        !enddo!ib 
02363        !--
02364       enddo!ik              
02365 !-- 
02366 !OPEN(113,R,FILE='dat.wan',FORM='unformatted') 
02367       ierr=CHDIR("./dir-wan") 
02368       call system('pwd') 
02369       REWIND(113)       
02370       read(113) NWF 
02371       allocate(C0WN(NTG,NWF,NTK));C0WN(:,:,:)=0.0D0 
02372       do ik=1,NTK 
02373        read(113)((C0WN(ig,jb,ik),ig=1,NG0(ik)),jb=1,NWF) 
02374        !--
02375        !20180519
02376        !do jb=1,NWF 
02377        ! read(113)(C0WN(ig,jb,ik),ig=1,NG0(ik))
02378        !enddo!jb 
02379        !--
02380       enddo!ik
02381       write(6,*)'FINISH REDING C0_WN'
02382       ierr=CHDIR("..") 
02383       call system('pwd') 
02384 !--
02385 !OPEN(150,W,FILE='dat.umat')
02386       OPEN(150,FILE='./dir-wan/dat.umat') 
02387       rewind(150) 
02388       Mb=maxval(N_BAND) 
02389       write(6,*)"Mb=",Mb 
02390       write(150,*) n_occ!20170331(n_occ=NWF) 
02391       allocate(UNT(Mb,n_occ,NTK));UNT(:,:,:)=0.0d0 
02392       do ik=1,NTK 
02393        do ib=1,N_BAND(ik)
02394         do jb=1,n_occ 
02395          SUM_CMPX=0.0d0 
02396          do ig=1,NG0(ik)  
02397           SUM_CMPX 
02398      +   =SUM_CMPX
02399      +   +conjg(C0(ig,ib+N_BAND_BTM(ik),ik))*C0WN(ig,jb,ik)
02400          enddo 
02401          UNT(ib,jb,ik)=SUM_CMPX 
02402         enddo 
02403        enddo 
02404       enddo 
02405       deallocate(C0WN) 
02406       do ik=1,NTK 
02407        do ib=1,N_BAND(ik)
02408         write(150,*)(UNT(ib,jb,ik),jb=1,n_occ)
02409        enddo 
02410       enddo 
02411 !--
02412 !      WRITE(6,*) 
02413 !      WRITE(6,*)'============================='
02414 !      WRITE(6,*)'UNITALITY CHECK OF UMAT:<n|m>'
02415 !      WRITE(6,*)'============================='
02416 !      WRITE(6,*)  
02417 !      do ik=1,NTK 
02418 !       nm=n_occ 
02419 !       allocate(mat_tmp(nm,nm));mat_tmp=0.0d0 
02420 !       do iw=1,nm 
02421 !        do jw=1,nm 
02422 !         SUM_CMPX=0.0D0            
02423 !         do ib=1,N_BAND(ik) 
02424 !          SUM_CMPX=SUM_CMPX+CONJG(UNT(ib,iw,ik))*UNT(ib,jw,ik) 
02425 !         enddo!ib  
02426 !         mat_tmp(iw,jw)=SUM_CMPX 
02427 !        enddo!jw  
02428 !       enddo!iw   
02429 !       do iw=1,nm 
02430 !        write(6,'(300f10.5)')(mat_tmp(iw,jw),jw=1,nm)  
02431 !       enddo 
02432 !       write(6,*)       
02433 !       deallocate(mat_tmp) 
02434 !      enddo!ik        
02435 !--
02436       WRITE(6,*) 
02437       WRITE(6,*)'============================='
02438       WRITE(6,*)'UNITALITY CHECK OF UMAT:<a|b>'
02439       WRITE(6,*)'============================='
02440       WRITE(6,*)
02441       do ik=1,NTK 
02442        nm=N_BAND(ik) 
02443        allocate(mat_tmp(nm,nm));mat_tmp=0.0d0 
02444        do ib=1,nm 
02445         do jb=1,nm 
02446          SUM_CMPX=0.0D0            
02447          do iw=1,n_occ       
02448           SUM_CMPX=SUM_CMPX+CONJG(UNT(ib,iw,ik))*UNT(jb,iw,ik) 
02449          enddo!iw  
02450          mat_tmp(ib,jb)=SUM_CMPX 
02451         enddo!jb  
02452        enddo!ib   
02453        !--
02454        SUM_CMPX=0.0d0 
02455        do ib=1,nm 
02456         SUM_CMPX=SUM_CMPX+mat_tmp(ib,ib) 
02457        enddo!ib 
02458        write(6,'(a8,x,i8,2f15.10)')'ik=',ik,SUM_CMPX 
02459        write(6,'(300f10.5)')(mat_tmp(ib,ib),ib=1,nm)  
02460        write(6,*)       
02461        !--
02462        if(N_BAND_inner(ik)/=0)then  
02463         do ib=1,nm 
02464          write(6,'(300f10.5)')(mat_tmp(ib,jb),jb=1,nm)  
02465         enddo 
02466         write(6,*)       
02467        endif 
02468        !--
02469        deallocate(mat_tmp) 
02470       enddo!ik        
02471 
02472 !====================================
02473 !=== INTERPOLATED BAND DISPERSION ===
02474 !====================================
02475 
02476       allocate(H_MAT_K(n_occ,n_occ,NTK));H_MAT_K(:,:,:)=0.0D0      
02477       allocate(E_TMP(n_occ));E_TMP(:)=0.0d0            
02478       allocate(H_TMP_IN(n_occ,n_occ));H_TMP_IN(:,:)=0.0d0           
02479       allocate(H_MAT_R(n_occ,n_occ,-Na1:Na1,-Na2:Na2,-Na3:Na3)) 
02480       allocate(WEIGHT_R(-Na1:Na1,-Na2:Na2,-Na3:Na3)) 
02481 !--
02482 !(1) SAMPLE k-POINTS FOR INTERPOLATED BAND DISPERSION 
02483       NSK_BAND_DISP=Ndiv*(N_sym_points-1)+1
02484       !
02485       !20191210 Kazuma Nakamura
02486       !
02487       allocate(H_TMP_OUT(n_occ,n_occ,NSK_BAND_DISP));H_TMP_OUT(:,:,:)=0.0d0
02488       !
02489       allocate(SK_BAND_DISP(3,NSK_BAND_DISP));SK_BAND_DISP(:,:)=0.0d0 
02490       allocate(E_BAND_DISP(n_occ,NSK_BAND_DISP));E_BAND_DISP(:,:)=0.0d0 
02491       call makekpts(Ndiv,N_sym_points,NSK_BAND_DISP,SK_sym_pts(1,1),
02492      +              SK_BAND_DISP(1,1))
02493       write(6,*) 
02494       write(6,*)'====================================='
02495       write(6,*)' CALCULATED kpts FOR BAND DISPERSION '
02496       write(6,*)'====================================='
02497       write(6,*) 
02498       write(6,'(a20,i15)')'NSK_BAND_DISP=',NSK_BAND_DISP
02499       write(6,*) 
02500       do ik=1,NSK_BAND_DISP 
02501        write(6,*) SK_BAND_DISP(:,ik)
02502       enddo 
02503 !--
02504 !(2) H_MAT(k) IN WANNIER BASIS 
02505       H_MAT_K(:,:,:)=0.0D0            
02506       Do ik=1,NTK 
02507        Do i_band=1,n_occ   
02508         Do j_band=1,n_occ   
02509          SUM_CMPX=0.0D0            
02510          Do k_band=1,n_occ       
02511           SUM_CMPX 
02512      +   =SUM_CMPX 
02513      +   +CONJG(A_MAT(k_band,i_band,ik))        
02514      +   *PSEUDO_EIG(k_band,ik)             
02515      +   *A_MAT(k_band,j_band,ik) 
02516          ENDDO 
02517          H_MAT_K(i_band,j_band,ik)=SUM_CMPX        
02518         ENDDO!j_band    
02519        ENDDO!i_band    
02520       ENDDO!ik        
02521 !--
02522 !(3) H_MAT(R) IN WANNIER BASIS 
02523       H_MAT_R(:,:,:,:,:)=0.0D0            
02524       Do ia1=-Na1,Na1!-1
02525        Do ia2=-Na2,Na2!-1
02526         Do ia3=-Na3,Na3!-1
02527          Do i_band=1,n_occ          
02528           Do j_band=1,n_occ          
02529            SUM_CMPX=0.0D0                             
02530            Do ik=1,NTK           
02531             PHASE=tpi*(SK0(1,ik)*DBLE(ia1) 
02532      +                +SK0(2,ik)*DBLE(ia2) 
02533      +                +SK0(3,ik)*DBLE(ia3))                
02534             PHASE_FACTOR=EXP(-ci*PHASE)         
02535             SUM_CMPX 
02536      +     =SUM_CMPX 
02537      +     +H_MAT_K(i_band,j_band,ik) 
02538      +     *PHASE_FACTOR                
02539            ENDDO               
02540            H_MAT_R(i_band,j_band,ia1,ia2,ia3)=SUM_CMPX/DBLE(NTK)     
02541           ENDDO!j_band
02542          ENDDO!i_band
02543         ENDDO!ia3      
02544        ENDDO!ia2       
02545       ENDDO!ia1         
02546 !-- 
02547 !(4) PRINT H_MAT(R) IN WANNIER BASIS 
02548       !
02549       !OPEN(122,W,FILE='dat.h_mat_r') 
02550       !
02551       OPEN(122,FILE='./dir-wan/dat.h_mat_r') 
02552       REWIND(122)
02553       write(122,'(a)')'#transfer'
02554       write(122,'(a)')'#1:R1, 2:R2, 3:R3 (lattice vector)'
02555       write(122,'(a)')'#1:i, 2:j, 3:Re(t_ij) [eV], 4:Im(t_ij) [eV]' 
02556       do ia1=-Na1,Na1!-1
02557        do ia2=-Na2,Na2!-1
02558         do ia3=-Na3,Na3!-1
02559          write(122,*) ia1,ia2,ia3           
02560          do ib=1,n_occ          
02561           do jb=1,n_occ  
02562            write(122,'(i5,i5,2f20.10)') 
02563      +     ib,jb,H_MAT_R(ib,jb,ia1,ia2,ia3)*au 
02564           enddo!jb 
02565          enddo!ib 
02566          write(122,*) 
02567         enddo 
02568        enddo 
02569       enddo 
02570       CLOSE(122) 
02571       !--
02572       write(6,*) 
02573       write(6,*)'============='
02574       write(6,*)'H_MAT_R in eV'
02575       write(6,*)'============='
02576       write(6,*) 
02577       do ia1=-Na1,Na1!-1
02578        do ia2=-Na2,Na2!-1
02579         do ia3=-Na3,Na3!-1
02580          write(6,*) ia1,ia2,ia3           
02581          do ib=1,n_occ          
02582           write(6,'(300f15.8)')
02583      +    (DBLE(H_MAT_R(ib,jb,ia1,ia2,ia3)*au),jb=1,n_occ)
02584          enddo 
02585          write(6,*) 
02586         enddo      
02587        enddo      
02588       enddo      
02589 !--
02590 !(5) WEIGHT_R 20170317 by Y.Nomura 
02591       write(6,'(a40)')'WEIGHT CALCULATED' 
02592       WEIGHT_R=1.0d0; SUM_REAL=0.0d0 
02593       do ia1=-Na1,Na1!-1         
02594        do ia2=-Na2,Na2!-1         
02595         do ia3=-Na3,Na3!-1         
02596          if(abs(ia1)==Na1.and.mod(nkb1,2)==0.and.Na1/=0) 
02597      +    WEIGHT_R(ia1,ia2,ia3)=WEIGHT_R(ia1,ia2,ia3)*0.5d0 
02598          if(abs(ia2)==Na2.and.mod(nkb2,2)==0.and.Na2/=0) 
02599      +    WEIGHT_R(ia1,ia2,ia3)=WEIGHT_R(ia1,ia2,ia3)*0.5d0 
02600          if(abs(ia3)==Na3.and.mod(nkb3,2)==0.and.Na3/=0) 
02601      +    WEIGHT_R(ia1,ia2,ia3)=WEIGHT_R(ia1,ia2,ia3)*0.5d0 
02602          SUM_REAL=SUM_REAL+WEIGHT_R(ia1,ia2,ia3)
02603         enddo
02604        enddo
02605       enddo 
02606       write(6,'(a40,f15.8,i8)')'SUM_WEIGHT,NTK',SUM_REAL,NTK  
02607       if(abs(SUM_REAL-dble(NTK))>1.0d-6)then 
02608        write(6,'(a40)')'SUM_WEIGHT/=NTK'
02609        stop 
02610       endif 
02611 !--
02612 !(6) OUTPUT Hphi/mVMC DATA 
02613       write(6,*) 
02614       write(6,'(a40)')'+++ write transfers in dir-model +++'
02615       write(6,*) 
02616       call system('rm -rf dir-model') 
02617       call system('mkdir dir-model') 
02618       !
02619       call wrt_model_hr(Na1,Na2,Na3,n_occ,H_MAT_R(1,1,-Na1,-Na2,-Na3),
02620      +     WEIGHT_R(-Na1,-Na2,-Na3)) 
02621       call wrt_model_wcenter(n_occ,a1(1),a2(1),a3(1),
02622      +     wannier_center(1,1))
02623       call wrt_model_SK_BAND_DISP(Ndiv,N_sym_points,NSK_BAND_DISP,
02624      +     SK_BAND_DISP(1,1)) 
02625       call wrt_model_SK0(NTK,SK0(1,1)) 
02626       call wrt_model_ef(FermiEnergy) 
02627       !
02628       !ELECTRON NUMBER == 0.0 -> DMX IS EVALUATED WITH BAND-CALC EF
02629       !
02630       if(elec_num==0.0d0)then 
02631        call calculate_dmx(NTB,NTK,NWF,nkb1,nkb2,nkb3,Na1,Na2,Na3,!NWF=n_occ 
02632      +      FermiEnergy,a1(1),a2(1),a3(1),b1(1),b2(1),b3(1),SK0(1,1),
02633      +      E_EIG(1,1),UNT(1,1,1)) 
02634       endif 
02635       deallocate(E_EIG) 
02636 !--
02637 !(7) H_MAT(k') IN WANNIER BASIS. AND DIAGONALIZE 
02638       do ik=1,NSK_BAND_DISP          
02639        H_TMP_IN(:,:)=0.0D0               
02640        do ib=1,n_occ      
02641         do jb=1,n_occ      
02642          SUM_CMPX=0.0D0                    
02643          do ia1=-Na1,Na1!-1         
02644           do ia2=-Na2,Na2!-1         
02645            do ia3=-Na3,Na3!-1         
02646             !--
02647             !-- NEAREST R SEARCH BY YOSHIHIDE YOSHIMOTO 
02648             !--
02649             call search_Rmin(ia1,ia2,ia3,nkb1,nkb2,nkb3,
02650      +      a1(1),a2(1),a3(1),ia1min,ia2min,ia3min)
02651             PHASE=tpi*(SK_BAND_DISP(1,ik)*DBLE(ia1min) 
02652      +                +SK_BAND_DISP(2,ik)*DBLE(ia2min) 
02653      +                +SK_BAND_DISP(3,ik)*DBLE(ia3min))                
02654             !--
02655             PHASE_FACTOR=EXP(ci*PHASE)*WEIGHT_R(ia1,ia2,ia3)!20170317 
02656             SUM_CMPX=SUM_CMPX+H_MAT_R(ib,jb,ia1,ia2,ia3)*PHASE_FACTOR 
02657            enddo!ia3            
02658           enddo!ia2                       
02659          enddo!ia1
02660          H_TMP_IN(ib,jb)=SUM_CMPX           
02661         enddo!jb
02662        enddo!ib
02663        !--
02664        E_TMP(:)=0.0D0                
02665        call diagV(n_occ,H_TMP_IN(1,1),E_TMP(1)) 
02666        !
02667        !20191210 Kazuma Nakamura 
02668        !
02669        H_TMP_OUT(:,:,ik)=H_TMP_IN(:,:)
02670        !
02671        E_BAND_DISP(:,ik)=E_TMP(:)            
02672       ENDDO!ik           
02673 !--
02674 !      write(6,*) 
02675 !      do ik=1,NSK_BAND_DISP          
02676 !       do i_band=1,n_occ 
02677 !        write(6,*) E_BAND_DISP(i_band,ik)*27.21151D0  
02678 !       enddo 
02679 !      enddo 
02680 !--
02681 !(8) WRITE BAND DISPERSION 
02682       allocate(DIST_K(NSK_BAND_DISP));DIST_K(:)=0.0d0 
02683       allocate(dist(0:N_sym_points-1));dist(:)=0.0d0 
02684       !--
02685       dist(0)=0.0d0 
02686       do ix=1,N_sym_points-1 
02687        ks=(ix-1)*Ndiv+1
02688        ke=(ix)*Ndiv+1
02689        do ik=ks,ke 
02690         DIST_B(:)
02691      + =(SK_BAND_DISP(1,ik)-SK_BAND_DISP(1,ks))*b1(:)
02692      + +(SK_BAND_DISP(2,ik)-SK_BAND_DISP(2,ks))*b2(:)
02693      + +(SK_BAND_DISP(3,ik)-SK_BAND_DISP(3,ks))*b3(:)
02694         DIST_KSPACE
02695      + =DSQRT(DIST_B(1)**2+DIST_B(2)**2+DIST_B(3)**2)
02696         DIST_K(ik)=DIST_KSPACE+dist(ix-1) 
02697        enddo!ik 
02698        dist(ix)=dist(ix-1)+DIST_KSPACE
02699       enddo!ix 
02700       !
02701       !OPEN(114,W,FILE='dat.iband') 
02702       !
02703       OPEN(114,FILE='./dir-wan/dat.iband') 
02704       write(114,'(a)')'#Wannier interpolaed band'
02705       write(114,'(a)')'#1:k, 2:Energy [eV]' 
02706       REVERSE=.TRUE.        
02707       do ib=1,n_occ             
02708        if(REVERSE) then 
02709         do ik=1,NSK_BAND_DISP                     
02710          write(114,*) DIST_K(ik)/DIST_K(NSK_BAND_DISP),
02711      +                E_BAND_DISP(ib,ik)*au
02712         enddo!ik        
02713         REVERSE=.FALSE.        
02714        else         
02715         do ik=NSK_BAND_DISP,1,-1          
02716          write(114,*) DIST_K(ik)/DIST_K(NSK_BAND_DISP),
02717      +                E_BAND_DISP(ib,ik)*au
02718         enddo!ik        
02719         REVERSE=.TRUE.        
02720        endif!REVERSE                   
02721       enddo!ib                      
02722       !
02723       !20191210 Kazuma Nakamura 
02724       !
02725       !PLOT FATBAND
02726       !OPEN(119x,W,FILE='dat.iband.fat-xxx') 
02727       ![NOTE] trnspose 
02728       !(before) H_TMP_OUT(ib,jb):: ib: basis, jb: eigenvector
02729       !( after) H_TMP_OUT(jb,ib):: jb: eigenvector, ib: basis 
02730       !
02731       do ik=1,NSK_BAND_DISP
02732        H_TMP_IN=0.0d0           
02733        do ib=1,n_occ!NWF
02734         do jb=1,n_occ!NWF
02735          H_TMP_IN(jb,ib)=H_TMP_OUT(ib,jb,ik) 
02736         enddo
02737        enddo
02738        H_TMP_OUT(:,:,ik)=H_TMP_IN(:,:) 
02739       enddo!ik           
02740       !
02741       call calc_fat_band(NWF,NSK_BAND_DISP,DIST_K(1),E_BAND_DISP(1,1),
02742      + H_TMP_OUT(1,1,1))
02743 !--
02744 !(9) WRITE FERMISURFACE WITH WANNIER INTERPOLATION 
02745       IF(ALL(dense(1:3)/=0)) THEN
02746          CALL wrt_frmsf_wan(Na1,Na2,Na3,nkb1,nkb2,nkb3,
02747      +                      a1,a2,a3,b1,b2,b3,FermiEnergy,
02748      +                      WEIGHT_R,H_MAT_R)
02749       ENDIF
02750 
02751 !============================================================
02752 !=== DENSITY OF STATE and DENSITY MATRIX IN WANNIER SPACE ===
02753 !============================================================
02754    
02755       write(6,*) 
02756       write(6,'(a40)')'==============================='
02757       write(6,'(a40)')' CALCULATE WANNIER DOS AND DMX '
02758       write(6,'(a40)')'==============================='
02759       write(6,*) 
02760       allocate(E_EIG(NWF,NTK)); E_EIG(:,:)=0.0d0
02761       allocate(V_EIG(NWF,NWF,NTK)); V_EIG(:,:,:)=0.0d0
02762       call calculate_eigenstate(NWF,Na1,Na2,Na3,
02763      +     H_MAT_R(1,1,-Na1,-Na2,-Na3),NTK,nkb1,nkb2,nkb3,
02764      +     a1(1),a2(1),a3(1),1,NTK,SK0(1,1),E_EIG(1,1),V_EIG(1,1,1))   
02765       filename='./dir-wan/dat.dos.wan'
02766       !
02767       !ELECTRON NUMBER == 0.0 -> DOS IS EVALUATED WITH BAND-CALC EF
02768       !
02769       if(elec_num==0.0d0)then 
02770        call calculate_dos(NWF,NTK,nkb1,nkb2,nkb3,elec_num,FermiEnergy,
02771      +      filename,b1(1),b2(1),b3(1),SK0(1,1),E_EIG(1,1),V_EIG(1,1,1))
02772       endif 
02773       !
02774       !ELECTRON NUMBER /= 0.0 -> DOS & DMX ARE EVALUATED WITH RECALC EF
02775       !
02776       if(elec_num/=0.0d0)then  
02777        call calculate_dos(NWF,NTK,nkb1,nkb2,nkb3,elec_num,FermiEnergy,
02778      +      filename,b1(1),b2(1),b3(1),SK0(1,1),E_EIG(1,1),V_EIG(1,1,1))
02779        call calculate_dmx(NWF,NTK,NWF,nkb1,nkb2,nkb3,Na1,Na2,Na3,!NWF=n_occ 
02780      +      FermiEnergy,a1(1),a2(1),a3(1),b1(1),b2(1),b3(1),SK0(1,1),
02781      +      E_EIG(1,1),V_EIG(1,1,1)) 
02782       endif 
02783       deallocate(E_EIG,V_EIG)
02784 
02785 !==================================
02786 !=== VISUALIZE WANNIER FUNCTION ===
02787 !==================================
02788 
02789       if(CALC_REAL_SPACE_WANNIER)then 
02790        !--
02791        write(6,*) 
02792       write(6,'(a40)')'============================='
02793       write(6,'(a40)')' CALCULATE REALSPACE WANNIER '
02794       write(6,'(a40)')'============================='
02795        write(6,*) 
02796        nfft1=nwx2+1;nfft2=nwy2+1;nfft3=nwz2+1
02797        Nl123=nfft1*nfft2*nfft3 
02798        write(6,'(a40,i5,i5,i5)')'nwx2,nwy2,nwz2',nwx2,nwy2,nwz2 
02799        write(6,'(a40,i5,i5,i5)')'nfft1,nfft2,nfft2',nfft1,nfft2,nfft3 
02800        write(6,'(a40,i10)')'Nl123',Nl123 
02801        call fft3_init(nwx2,nwy2,nwz2,nfft1,nfft2,nfft3,fs) 
02802        !--
02803        mem_size=dble((xmax-xmin)*nwx2+(ymax-ymin)*nwy2+(zmax-zmin)*nwz2)
02804        mem_size=mem_size*16.0d0/1024.0d0/1024.0d0/1024.0d0 
02805        write(6,'(a40,f20.15)')'mem size realspace wannier (GB)',mem_size
02806        if(mem_size>1.0d0)then 
02807         write(6,'(a40,f20.15)')'mem size > 1 GB; skipp' 
02808         go to 9999
02809        endif  
02810        !--
02811        allocate(WANNIER_REALSPACE((xmin)*nwx2:(xmax)*nwx2-1,
02812      +                            (ymin)*nwy2:(ymax)*nwy2-1, 
02813      +                            (zmin)*nwz2:(zmax)*nwz2-1))
02814        !--
02815        !OPEN(113,R,FILE='dat.wan',FORM='unformatted') 
02816        ierr=CHDIR("./dir-wan") 
02817        call system('pwd') 
02818        REWIND(113)       
02819        read(113) NWF!20170331(n_occ=NWF) 
02820        allocate(C0WN(NTG,NWF,NTK));C0WN(:,:,:)=0.0D0 
02821        do ik=1,NTK 
02822         read(113)((C0WN(ig,jb,ik),ig=1,NG0(ik)),jb=1,NWF) 
02823         !
02824         !20180519
02825         !do jb=1,NWF 
02826         ! read(113)(C0WN(ig,jb,ik),ig=1,NG0(ik))
02827         !enddo!jb 
02828         !
02829        enddo!ik 
02830        !write(6,*)'FINISH REDING C0_WN'
02831        !--
02832        do ix=1,N_write_wannier!NWF 
02833         iw=wrt_list(ix)!20170406  
02834         WANNIER_REALSPACE=0.0d0           
02835 !$OMP PARALLEL PRIVATE(ik,C0_I,wfunc,fftwk,pw) 
02836         allocate(C0_I(NTG));C0_I=0.0D0 
02837         allocate(fftwk(Nl123*2),stat=err) 
02838         allocate(wfunc(Nl123*2),stat=err) 
02839         allocate(pw((xmin)*nwx2:(xmax)*nwx2-1,
02840      +              (ymin)*nwy2:(ymax)*nwy2-1, 
02841      +              (zmin)*nwz2:(zmax)*nwz2-1));pw=0.0d0           
02842 !$OMP DO 
02843         do ik=1,NTK
02844          C0_I(:)=C0WN(:,iw,ik) 
02845          call make_pw(C0_I(1),wfunc(1),fftwk(1),NG0(ik),KG0(1,1,ik),NTG,
02846      +    nwx2,nwy2,nwz2,nfft1,nfft2,Nl123,fs,
02847      +    xmin,xmax,ymin,ymax,zmin,zmax,SK0(1,ik),
02848      +    pw(xmin*nwx2,ymin*nwy2,zmin*nwz2)) 
02849         enddo!ik         
02850 !$OMP END DO
02851 !$OMP CRITICAL
02852         WANNIER_REALSPACE=WANNIER_REALSPACE+pw 
02853 !$OMP END CRITICAL
02854         deallocate(C0_I,fftwk,wfunc,pw)
02855 !$OMP END PARALLEL
02856         !--
02857         !normalize 
02858         WANNIER_REALSPACE=WANNIER_REALSPACE/DBLE(NTK)/DSQRT(VOLUME)
02859         !--
02860         !OUTPUT by VESTA format 
02861         !OPEN(116,W,FILE='dat.wan-realspace-xxx.grd')
02862         write(filename,"('dat.wan-realspace-',i3.3,'.grd')") iw 
02863         OPEN(116,FILE=filename) 
02864         REWIND(116)
02865         na_grid=nwx2 
02866         nb_grid=nwy2
02867         nc_grid=nwz2 
02868         aa1=a1*dble(xmax-xmin)
02869         aa2=a2*dble(ymax-ymin)
02870         aa3=a3*dble(zmax-zmin)
02871         call est_latparam(aa1(1),aa2(1),aa3(1),a,b,c,alp,bet,gmm) 
02872         write(116,*)'Electron density'
02873         write(116,'(6f15.10)')
02874      +  a*bohr,b*bohr,c*bohr,alp,bet,gmm!bohr->angstrom
02875         write(116,'(3I5)') 
02876      +  (xmax-xmin)*na_grid,(ymax-ymin)*nb_grid,(zmax-zmin)*nc_grid 
02877         write(116,"(6g25.16)") (((dble(WANNIER_REALSPACE(i1,i2,i3)),
02878      +  i3=(zmin)*nc_grid,(zmax)*nc_grid-1),
02879      +  i2=(ymin)*nb_grid,(ymax)*nb_grid-1),
02880      +  i1=(xmin)*na_grid,(xmax)*na_grid-1)
02881         CLOSE(116)
02882         !
02883         !20190515 check whether wannier is real
02884         !
02885         !do i1=(xmin)*na_grid,(xmax)*na_grid-1
02886         ! do i2=(ymin)*nb_grid,(ymax)*nb_grid-1
02887         !  do i3=(zmin)*nc_grid,(zmax)*nc_grid-1
02888         !   write(6,"(2f15.10)") WANNIER_REALSPACE(i1,i2,i3)
02889         !  enddo!i3
02890         ! enddo!i2
02891         !enddo!i1
02892         !
02893        enddo!ix 
02894        !--
02895        !gencif 20180906  
02896        call gencif(a1(1),a2(1),a3(1),xmin,xmax,ymin,ymax,zmin,zmax,
02897      +  nsi,chemical_species(1),asi(1,1))
02898        !--
02899        ierr=CHDIR("..") 
02900        call system('pwd') 
02901 9999  endif!CALC_REAL_SPACE_WANNIER 
02902       !--
02903       STOP 
02904       END        

Generated on 17 Nov 2020 for respack by  doxygen 1.6.1