Wannier function visualization

From Ecal

Jump to: navigation, search

このページはKinoのメモの段階です。program はSakura さんのprogramを元に Miyakeさんによって作られています。

Contents

formulation

Bloch function : | \psi_{nk} \rangle. Periodic part of Bloch function :  | u_{k}^0\rangle

ψnk(r) = exp(ikr)unk(r) ---(f1)

rotated periodic part: |u_{k} \rangle= | u_{k}^0 \rangle U ---(f2)

Wannier orbital: |R n \rangle = \frac{V}{(2 \pi)^3} \int dk \exp( -i k R )| \psi_{nk} \rangle 

 ---(f3)

|0 n \rangle = \frac{V}{(2 \pi)^3} \int dk | \psi_{nk} \rangle, 
|T, n \rangle = \frac{V}{(2 \pi)^3} \int dk \exp(-ikT) | \psi_{nk} \rangle
---(f4)

ここでのTはtlat.

ψk(r)の表現

ψk(r) = ψPW,k(r) + ψMT,k(r) ---(f5)

ψPW,k(r) = exp(i(G + k)r)cG,k = exp(ikr)exp(iGr)geigG,k
GG

---(f6)

ψMT,k(r) = exp(ikRR(r) = exp(ikR)cphiiRfi(rR)
RiR

---(f7)

fi(rR)はRを中心とした原子のi番めの基底。ψPW,k(r)はMT外のみnonzero。ψMT,k(r)はMT内のみnonzero。

exp(ikR)はeikt(i1,i2,i3)に入っている。 exp(ikr)はeikr(i1,i2,i3)に入っている。

input

v3

rotate,unrotateの指定を入れました。

  • vis_action : wannier | norot, wannier関数のために波動関数を回転させるか、させないか。
  • vis_mesh : integer x 3, mesh数
  • vis_mesh_lbound : real x 3, meshの下限, plat単位
  • vis_mesh_ubound : real x 3, meshの上限, plat単位
  • vis_outputformat : xsf | cube | opendx
  • vis_wrt_rho: logical, rho.*を書くかどうか。

範囲の選択

vis_action=norotの時

  • vis_norot_nqbz : integer, n1*n2*n3 を与える(手動、必須)
  • vis_norot_band_range_id : integer x 2, band indexの始めと終わり。wannier関数を作るときにあたえたindexの最初が=1になります。

vis_action=wannierの時

  • vis_wan_tvec : integer x 3
  • vis_wan_band_range_id : integer x 2, band indexの始めと終わり


phi.*, wan.* は必ず出力されます。phi: (un)rotated wavefunction (k=0), wan: wannier function, rhoはband_rangeであたえた範囲の電荷の和です。


バンド計算そのままの波動関数|u^0_k\rangle. wannier関数にするために回転した波動関数 |u_k\rangle=|u^0_k\rangle U. 'wannier'の時はsetup_MLWF()を呼ぶだけの違いです。nqbzはこの時に設定されるので'wannier'でないときは手動で入れます。

wannier関数|u(R)\rangle=\int dk\; \exp(-ikR) |u_k\rangle. tvec=0のときはR=0になるので実際は|u(0)>。

vis_wan_tvec=Tとして |u(R+T)\rangle=\int dk\;\exp(-ik(R+T)) |u_k\rangle とする。原点をずらすということ。(R=0なので実際は|u(T)>になる。)

v2

GWinputに以下を書く。

  • vis_wan_band_n: integer, バンド数
  • vis_wan_band_id: integer x vis_wan_band_n, バンドindex, lmfのバンドindexでなく,hmaxlocのバンドindex
  • vis_wan_tvec: integer x 3, tlat(R)
  • vis_wan_unit: string, alat or abc
  • vis_wan_mesh: integer x 3, # of mesh
  • vis_wan_lbound: real x 3, lower bound in alat unit or abc unit
  • vis_wan_ubound: real x 3, upper bound in alat or abc unit
  • vis_wan_outputfomat: string, opendx, cube, xsf , default=xsf

The abc unit is faster than the alat unit.

cube: gaussian cube format, xsf: xcrysden format

old

3 ! # WF(nR)
1 2 3 ! orbitals(n)
1 1 1 ! tlat(R)
1 ! factor for interpolation
10 10 10 ! mesh(1:3)
-0.2  -0.2 -0.2 ! rini
1.2  1.2 1.2 ! rfin
F

WF(nR) wannier 関数の数

orbitals(n): どのorbitalを書き出すか選択.

tlat(1:3): translational vector (unit=cell? alat?) , supercell内でのshift. inputの座標でwannier orbiralを作っても、inputとprogram内の座標が便宜上異なっている場合があるためwannier orbiralψ(r)がinputの座標に局在していないかもしれない。riniからrfinまでのboxをしていしてもその中にないかもしれない。ψ(rtvec)として、中心をriniからrfinまでにするため。(rini,rfinを変更しても同じ。)

mesh(1:3): orbitalを描くmesh, riniからrfinまでのboxをmesh(1:3)で分割する。

rini(1:3), rfin(1:3): riniからrfinまでのboxでorbitalを描く。unit=alat, abcの軸ではなくて,直交座標系で指定する。出力はこの直交座標系になる。

DATA

GWから

  • DATA2GW_V2:  
  • GQcou:  
  • QGpsi: 
  • GphiGeig:  

hmaxlocから

  • MLW(U|D)

内部構造

基底

setup_MLWF()で変換行列dnkを読む

        do iqbz = 1,nqbz
           read(ifi)iqbz2,q(1:3)
           q(:) = q(:) - qtt(:,iqbz)
           if (sum(q(:)**2).gt.eps) stop 'MLWU/D: qbz error'
           if (iqbz2.ne.iqbz) stop 'MLWU/D: iqbz error'
           read(ifi)dnk(iko_ix:iko_fx,1:nwf,iqbz,isp)
        enddo

そして変換しておく

     do ikp = 1,nqbz
     do isp = 1,nsp
        do iwf = 1,nwf
        do ib = iko_ix,iko_fx
           geig(:,iwf,ikp,isp) = geig(:,iwf,ikp,isp) + 
    &           geig2(:,ib,ikp,isp)*dnk(ib,iwf,ikp,isp)
           cphi(:,iwf,ikp,isp) = cphi(:,iwf,ikp,isp) + 
    &           cphi2(:,ib,ikp,isp)*dnk(ib,iwf,ikp,isp)
        enddo ! ib
        enddo ! iwf
     enddo ! isp
     enddo ! ikp

geigとcphiは

     allocate(geig(ngpmx,nwf,nqtt,nsp)) !plane wave、MT外
     allocate(cphi(ldim2,nwf,nqtt,nsp))  !MT内


module m_MLWF

     integer :: nqbz,nwf,iko_ix,iko_fx
     double precision :: a
     double complex,allocatable :: dnk(:,:,:,:)

となっているが以降はgeig,cphiだけ使用されてdnkは使用されない。


mesh

mesh=(n1,n2,n3)

         do i3=1,n3+1          
         do i2=1,n2+1
         do i1=1,n1+1
           rtmp(1)=(i1-1)/dble(n1)
           rtmp(2)=(i2-1)/dble(n2)
           rtmp(3)=(i3-1)/dble(n3)
           r(:) = rini(:) + (rfin(:)-rini(:))*rtmp(:)
           r(1:3)=alat*r(1:3)

として座標を作成。

openDX format

     ang=0.529177d0
     alat_ang=alat*ang
!波動関数のデータを書き出す。
     call wfn2dx_2(alat_ang,plat,nsp,1,nband_wfn,qdum,bindx_wfn,
    &     mesh,rini,rfin,wanpw,wanaug,wantot)
!原子位置、unit cellを書き出す。
     call crystal2dx_2(alat_ang,plat,rini,rfin,
    &     nbas,bas,nclass,iclass,zz)
  • wanpw: MT外
  • wanaug: MT内
  • wantot: total

gaussian cube, xcrysden xsf format

実行方法

$ calc_wannier2 < input

結果

SVOの結果を cubeformatで出力してmolekelにより作画。

wannier関数

手前がz軸です。

bloch関数とwannier関数の比較

rotated bloch関数(k=0), eq.(f2)

wannier関数, eq.(f3)

TOTO list

  • MTのoverlapを考慮していない。
Personal tools