00001 subroutine est_nkbi(N,SK,nkb1,nkb2,nkb3)
00002 implicit none
00003 integer::N,nkb1,nkb2,nkb3,NTK
00004 real(8)::SK(3,N)
00005 integer::i
00006 real(8)::x
00007
00008 x=1.0d0
00009 do i=1,N
00010 if(abs(SK(1,i))<1.0d-7) cycle
00011 if(abs(SK(1,i))<x) then
00012 x=abs(SK(1,i))
00013 endif
00014 enddo
00015 nkb1=nint(1.0d0/x)
00016
00017 x=1.0d0
00018 do i=1,N
00019 if(abs(SK(2,i))<1.0d-7) cycle
00020 if(abs(SK(2,i))<x) then
00021 x=abs(SK(2,i))
00022 endif
00023 enddo
00024 nkb2=nint(1.0d0/x)
00025
00026 x=1.0d0
00027 do i=1,N
00028 if(abs(SK(3,i))<1.0d-7) cycle
00029 if(abs(SK(3,i))<x) then
00030 x=abs(SK(3,i))
00031 endif
00032 enddo
00033 nkb3=nint(1.0d0/x)
00034
00035 NTK=nkb1*nkb2*nkb3
00036
00037
00038 return
00039 end
00040
00041
00042 subroutine est_NTK(Nk_irr,Nsymq,SKI,rg,NTK)
00043 implicit none
00044 integer::Nk_irr,Nsymq,N
00045 real(8)::SKI(3,Nk_irr)
00046 integer::rg(3,3,Nsymq)
00047 real(8),allocatable::SK0(:,:)
00048 real(8)::ktmp(3)
00049 integer::RWtmp(3)
00050 integer::jk,ik,iop,iik
00051 integer::NTK
00052
00053 N=Nk_irr*Nsymq*2
00054
00055
00056
00057 allocate(SK0(3,N));SK0(:,:)=0.0d0
00058
00059
00060
00061
00062 jk=0
00063 do ik=1,Nk_irr
00064 do iop=1,Nsymq
00065 ktmp(:)=0.0d0; RWtmp(:)=0
00066 ktmp(1)=dble(rg(1,1,iop))*SKI(1,ik)+dble(rg(1,2,iop))*SKI(2,ik)+dble(rg(1,3,iop))*SKI(3,ik)
00067 ktmp(2)=dble(rg(2,1,iop))*SKI(1,ik)+dble(rg(2,2,iop))*SKI(2,ik)+dble(rg(2,3,iop))*SKI(3,ik)
00068 ktmp(3)=dble(rg(3,1,iop))*SKI(1,ik)+dble(rg(3,2,iop))*SKI(2,ik)+dble(rg(3,3,iop))*SKI(3,ik)
00069 call kcheck(ktmp(1),RWtmp(1))
00070 do iik=1,jk
00071 if(abs(SK0(1,iik)-ktmp(1))<1.0d-4.and.abs(SK0(2,iik)-ktmp(2))<1.0d-4.and.abs(SK0(3,iik)-ktmp(3))<1.0d-4) goto 1000
00072 enddo
00073 jk=jk+1
00074 SK0(:,jk)=ktmp(:)
00075
00076 1000 ktmp(:)=0.0d0; RWtmp(:)=0
00077 ktmp(1)=dble(rg(1,1,iop))*SKI(1,ik)+dble(rg(1,2,iop))*SKI(2,ik)+dble(rg(1,3,iop))*SKI(3,ik)
00078 ktmp(2)=dble(rg(2,1,iop))*SKI(1,ik)+dble(rg(2,2,iop))*SKI(2,ik)+dble(rg(2,3,iop))*SKI(3,ik)
00079 ktmp(3)=dble(rg(3,1,iop))*SKI(1,ik)+dble(rg(3,2,iop))*SKI(2,ik)+dble(rg(3,3,iop))*SKI(3,ik)
00080 call kcheck_trs(ktmp(1),RWtmp(1))
00081 do iik=1,jk
00082 if(abs(SK0(1,iik)-(-ktmp(1)))<1.0d-4.and.abs(SK0(2,iik)-(-ktmp(2)))<1.0d-4.and.abs(SK0(3,iik)-(-ktmp(3)))<1.0d-4) goto 2000
00083 enddo
00084 jk=jk+1
00085 SK0(:,jk)=-ktmp(:)
00086
00087 2000 enddo
00088 enddo
00089
00090 NTK=jk
00091 if(NTK>N)then
00092 write(6,*)'Estimated NTK is too large; stop'
00093 write(6,*)'NTK, N=',NTK, N
00094 stop
00095 endif
00096
00097 return
00098 end