본문 바로가기

DFT/Calculation

10. Energy band of monolayer MoS2(2023년 7월 30일 수정)

본 매뉴얼은 리눅스(UBUNTU 20.04)환경에서 Terminal에 명령을 내리는 방식으로 작성되었습니다.
사용자는 UBUNTU 20.04 이상의 환경에서 리눅스 환경에 익숙해지는 과정을 거치면서 매뉴얼을 사용하시기 바랍니다.

https://sites.google.com/view/seoulqmt

 

University of Seoul QMT

Research Electronic properties of twisted bilayer graphene and other moire materials. Magnetism in 2D materials.

sites.google.com

이제 Band Energy 를 그릴 차례이다. 여기서는 이제 세 가지 파일을 필요로 한다.
SCF, NSCF, bands

1)  Bands.sh 파일

우선은 vi Bands.sh 라고 Terminal 창에 입력해서 새 파일을 연다. 그리고 다음과 같이 입력한다.

#!/bin/bash
Name=MoS2
cat > $Name.SCF.in << EOF
&CONTROL
      calculation  = 'scf'
      restart_mode = 'from_scratch'
      prefix = '$Name'
      pseudo_dir = '(Pseudopotential파일 디렉토리)'
      outdir = './tmp'
      disk_io = 'low'
      etot_conv_thr = 1.0D-8 
      forc_conv_thr = 1.0D-4
      /
&SYSTEM
      ibrav=0
      A = 3.161
      nat = 3
      ntyp = 2
      ecutwfc=80.0
      nbnd = 60
      /
 
&ELECTRONS
   electron_maxstep = 100
   conv_thr =  1.0e-10
   mixing_beta = 0.3

   /
   ATOMIC_SPECIES
Mo 95.94  Mo_ONCV_PBE-1.2.upf
S  32.065 S_ONCV_PBE-1.2.upf
CELL_PARAMETERS (alat=  5.97342431)
   1.007712043   0.000000000   0.000000000
  -0.503856021   0.872704229   0.000000000
   0.000000000   0.000000000   6.327111674
 
ATOMIC_POSITIONS (crystal)
Mo       0.666666619   0.333333314   0.750000039
S        0.333333360   0.666666714   0.671806602
S        0.333333360   0.666666714   0.828193398
   K_POINTS {automatic}
   16 16 1 0 0 0
EOF
cat > $Name.NSCF.in << EOF
&CONTROL
      calculation  = 'bands'
      restart_mode = 'from_scratch'
      prefix = '$Name'
      pseudo_dir = '(pseudopotential파일 디렉토리)'
      outdir = './tmp'
      disk_io = 'low'
      etot_conv_thr = 1.0D-8 
      forc_conv_thr = 1.0D-4
      /
&SYSTEM
      ibrav=0
      A = 3.161
      nat = 3
      ntyp = 2
      ecutwfc=80.0
      nbnd = 60
      /
 
&ELECTRONS
   electron_maxstep = 100
   conv_thr =  1.0e-10
   mixing_beta = 0.3

   /
   ATOMIC_SPECIES
Mo 95.94  Mo_ONCV_PBE-1.2.upf
S  32.065 S_ONCV_PBE-1.2.upf
CELL_PARAMETERS (alat=  5.97342431)
   1.007712043   0.000000000   0.000000000
  -0.503856021   0.872704229   0.000000000
   0.000000000   0.000000000   6.327111674
ATOMIC_POSITIONS (crystal)
Mo       0.666666619   0.333333314   0.750000039
S        0.333333360   0.666666714   0.671806602
S        0.333333360   0.666666714   0.828193398
K_POINTS crystal_b
  4
 0.0000 0.0000 0.00 50
 0.5000 0.0000 0.00 50
 0.3333 0.3333 0.00 30
 0.0 0.0 0.0 3
EOF
cat > $Name.bands.in << EOF
 &bands
    prefix  = '$Name'
    outdir = './tmp'
    filband = 'bands.dat'
 /
EOF
 

EOF 는 End of file 의 약자이다. 이것을 기준으로 파일들을 나누게 될 것이다.
이렇게 입력한 뒤에 저장하고, 터미널 창에 chmod +x Bands.sh 를 입력하여 shellscript 파일로 바꾼다. 그리고 ./Bands 를 입력해서 실행한다. 그러면 다음과 같은 input file들이 자동으로 생성될 것이다.

 

2)  SCF

SCF란, Self Consistent Field 이다. http://www.chm.bris.ac.uk/webprojects2002/grant/webcomp/scf.html#:~:text=The%20self%2Dconsistent%20field%20method%20is%20an%20iterative%20method%20that,theses%20until%20the%20results%20converge.
이 파일은 다음과 같다.

&CONTROL
      calculation  = 'scf'
      restart_mode = 'from_scratch'
      prefix = 'MoS2'
      pseudo_dir = '(Pseudopotential파일 디렉토리)'
      outdir = './tmp'
      disk_io = 'low'
      etot_conv_thr = 1.0D-8
      forc_conv_thr = 1.0D-4
      /
&SYSTEM
      ibrav=0
      A = 3.161
      nat = 3
      ntyp = 2
      ecutwfc=80.0
      nbnd = 60
      /
 
&ELECTRONS
   electron_maxstep = 100
   conv_thr =  1.0e-10, mixing_beta = 0.3
   /
   ATOMIC_SPECIES
Mo 95.94  Mo_ONCV_PBE-1.2.upf
S  32.065 S_ONCV_PBE-1.2.upf
CELL_PARAMETERS (alat=  5.97342431)
   1.007712043   0.000000000   0.000000000
  -0.503856021   0.872704229   0.000000000
   0.000000000   0.000000000   6.327111674
 
ATOMIC_POSITIONS (crystal)
Mo       0.666666619   0.333333314   0.750000039
S        0.333333360   0.666666714   0.671806602
S        0.333333360   0.666666714   0.828193398
   K_POINTS {automatic}
   16 16 1 0 0 0

우선, calcuation의 방식을 scf 로 바꾸고, ibrav 는 0으로 둔다. 그리고 CELL_PARAMETER에 원자들의 좌표 정보를 넣는 것이다. (vasp 파일에서 가져온다.)
band 의 갯수를 60개로 하였다.

3)  NSCF

Non Self Consistent Field 라는 의미이다.  여기서는 주어진 시스템에서의 Eigenvalue를 계산하여 SCF 계산으로부터 잘 정의된 k-point 격자를 만들어내는 것이 목표다.

&CONTROL
      calculation  = 'bands'
      restart_mode = 'from_scratch'
      prefix = 'MoS2'
      pseudo_dir = 'Pseudopotential파일 디렉토리'
      outdir = './tmp'
      disk_io = 'low'
      etot_conv_thr = 1.0D-8
      forc_conv_thr = 1.0D-4
      /
&SYSTEM
      ibrav=0
      A = 3.161
      nat = 3
      ntyp = 2
      ecutwfc=80.0
      nbnd = 60
      /
 
&ELECTRONS
   electron_maxstep = 100
   conv_thr =  1.0e-10, mixing_beta = 0.3
   /
   ATOMIC_SPECIES
Mo 95.94  Mo_ONCV_PBE-1.2.upf
S  32.065 S_ONCV_PBE-1.2.upf
CELL_PARAMETERS (alat=  5.97342431)
   1.007712043   0.000000000   0.000000000
  -0.503856021   0.872704229   0.000000000
   0.000000000   0.000000000   6.327111674
ATOMIC_POSITIONS (crystal)
Mo       0.666666619   0.333333314   0.750000039
S        0.333333360   0.666666714   0.671806602
S        0.333333360   0.666666714   0.828193398
K_POINTS crystal_b
  4
 0.0000 0.0000 0.00 50
 0.5000 0.0000 0.00 50
 0.3333 0.3333 0.00 30
 0.0 0.0 0.0 3

 

4)  Bands

&bands
 prefix  = 'MoS2'
outdir = './tmp'
filband = 'bands.dat'
/

Bands 는 별로 코드가 길지 않다. 앞서 SCF, NSCF 에서 계산한 내용들이 대부분이기 때문.
‘band’계산에서는 이 시스템에서IBZ 영역에서 잘 정의된 k path를 따라 Eigenvalue를 계산하는 것이다.

 

SCF,NSCF의 경우는 input file 에 대해서 output file 만 하나씩 나오는데 반해, band 는 여러 개의 파일들이 동시에 생성된다.

bands 파일에서는 pw.x를 이용해서 실행하는 것이 아니라 bands.x를 이용한다.
mpirun -np 2 /bin/bands.x < MoS2.bands.in > MoS2.bands.out

 

다음 화면을 보자.

 

여러 파일이 생성된 모습.

 

이처럼 bands.dat, bands.dat.gnu, bands.dat,rap 등의 여러 파일이 생성된다.
우선, SCF output file 을 열어서 highest occupied energy를 확인한다. 이것이 fermi energy이다.

 

Fermi Energy를 확인한다.

 

 

 

 

이제 계산을 시작한다.

앞서 output을 계산할 때 사용했던 pw.x 가 있는 위치를 알고 있을 것이다. 터미널 창에 그 위치를 입력하고, 이번에는 앞에 ‘mpirun~’ 을 쓰지 않는다. 그리고  pw.x 대신에 plotband.x 파일을 사용한다. 그리고 뒤에는 ‘<’ 없이 bands.dat 라고 쓴 뒤 실행한다

터미널 창에 (Plotband 디렉토리)/plotband.x bands.dat 을 입력하면 다음과 같은 창을 볼 수 있다.

 

*변경 사항
2023 8월 기준으로 Quantum Espresso 7.4 에서는 plotband.x를 호출하면 
Input file > 
이라는 창이 나옵니다.

여기에 우리가 넣으려던 input file로 'bands.dat'을 쓰고 엔터를 누르면 됩니다. 

 

에너지의 범위를 입력하고, 파일 이름, 그리고 페르미 에너지를 입력한다. delta E 는 원하는 구간의 크기를 말한다.

 

 

그러면 이제 우리가 그릴 에너지의 범위를 물어본다. MoS2에서는 -61.8610~ 25.3210 eV를 제시한다. 이에 맞춰서 우리가 원하는 구간을 입력해 주면 된다. 하이라이트 된 부분이 우리가 입력해야 하는 것들이다.

그러면 high -symmetry point 들을 쭉 알려준다. 이 숫자들은 적어두는 것이 좋다.

이 high-symmetry point 가 4개가 나오는지 꼭 확인하여야 한다.

 

그 뒤에 output file을 gnuplot으로 저장할 것인지 xmgr 로 저장할 것인지를 묻는데, 확장자 .gnu 로 끝나는 이름으로 저장해 두자, linux에서 사용하는 프로그램 gv를 이용해 band 를 볼 수 있다.
그리고 ps 파일도 저장해 주고, Efermi 에는 앞서 알아둔 highest energy 를 입력하면 된다. deltaE에는 원하는 에너지 간격을 입력하고, reference E 에는 Efermi에 입력한 값과 똑같은 값을 넣으면 완성이다.

 

이제 bands.dat.gnu 파일을 열어보면 데이터들이 나와 있을 것이다. 이 데이터들이 band energy이다. 이제 그래프를 그리면 되는데, 본 매뉴얼에서는 파이썬 언어를 사용하고 컴파일러로는 Jupyter Notebook을 쓰겠다.
(데이터 파일을 저장할 때 주의할 점은 하이라이트 된 부분과 같은 기호가 나와 있어야만 한다는 것이다. 파일을 불러올 때 반드시 이렇게 되어 있어야 파일을 제대로 불러온다.
이 기호를 일일이 다 칠수는 없으니bands.dat.gnu파일에 있는 데이터들을 Linux에서 지원하는 LibreOffice Calc라는 어플리케이션에 복사해서 붙여넣었다가 다시 Jupyter Notebook의txt파일에 붙여 넣으면 이런 구분선이 자동으로 생성된다.)

 

Jupyternotebook 을 이용해서 코드를 입력하였다. Pandas 모듈을 이용함

 

그러면 다음과 같은 Energy Band 그림이 나온다.

 

 

완성된 monolayer MoS2의 밴드 에너지.

 

K 축에서 극대와 극소가 같이 나오는, 이른바 direct band gap 이 나와야 정상이다.


이렇게 나오지 않았다면 Input file 에서 무언가 잘못된 것이다. 이 계산 결과는 인터넷에도 많이 나와 있으니 구글링을 통해서 자신이 그린 그래프와 인터넷(Materials project등의 사이트, 그 외에 다른 논문들)에 나오는 그래프가 잘 맞는지 한번 확인해 보는 것을 추천한다.

 

나머지 WSe2, WS2, MoSe2 등도 같은 과정을 거쳐서 완성한다.
이렇게 해서 Monolayer 밴드 에너지 계산이 완료되었다.