地域密着型エリア広告配信リクルートの地域密着型広告ドコイク?アドネットワーク Ads by ドコイク?[無料でホームページを作成] [通報・削除依頼]
[無料でホームページを作成] [通報・削除依頼]

分散表示変換プログラム

-------------------------------------------------------------------------------
■ PWscf 用 バンド図プロット F77 プログラム
-------------------------------------------------------------------------------
下記はSpin を入れた系に対するバンド図プロット用 Fortran77コードの例です。

□ コンパイルの仕方
1. テキストファイルに下記のプログラムをコピー&ペーストし、例えば pwscf_band2plot.f という名称でSAVEします。
2. 6100 continue などど 数値と continue のある行の最初に空白を入れてください。
3. Terminal を開いて、cd で pwscf_band2plot.f  のあるディレクトリをカレントディレクトにします。
4. gfortran pwscf_band2plot.f  -o pwscf_band2plot と入力します。そうすると、実行ファイルが作成されます。

□ 使い方
1. case.pw.out をコピーしてf01というファイル名にします。
2. 上記でコンパイルして作成された実行ファイル pwscf_band2plot を実行します。
3. 出力されたf10とf20がそれぞれupとdownの結果になります(non spinの場合 f10に結果が出力される)。プロットはWIEN2kと同じように、最後の2列をxとyに指定すれば良いです。
※ case.pw.outの結果を並べ替えただけですので、EFを0としたい場合はご自身で計算してください。

c=======================================================================
c  pwscf_band2plot.f
c    2012. 8.12  Version 1.00  written by ***
c=======================================================================
c  process
c --------------------------------------------------------------------
      IMPLICIT NONE

      integer*4 kpoint_num_para
      parameter (kpoint_num_para = 999)
      integer*4 eigen_num_para
      parameter (eigen_num_para = 9999)
     
      character*130 READOR
     
c spin
      integer*4 spin
c do loop
      integer*4 i, j, m, n
c number of kpoint
      integer*4 num_kpoint
c number of eigen
      integer*4 num_eigen
c read_eigen_line
      integer*4 read_eigen_line
     
c EF_eV
      real*8 EF_eV
c kpoint, h, k, l
      real*8 h(kpoint_num_para), k(kpoint_num_para), l(kpoint_num_para)
c temp_delta_kpoint
      real*8 temp_delta_kpoint
c deltal_kpoint_length = sqrt( temp_delta_kpoint)
      real*8 delta_kpoint_length(kpoint_num_para)
c total_kpoint_length
      real*8 total_kpoint_length(kpoint_num_para)
     
c up spin
c eigenvalue(eigenvalue, kpoint, spin)
      real*8 eigenvalue_up(eigen_num_para, kpoint_num_para)
c eigenvalue_ef = eigenvalue - EF
      real*8 eigenvalue_up_sub_ef(eigen_num_para, kpoint_num_para)
     
c down spin
c eigenvalue(eigenvalue, kpoint, spin)
      real*8 eigenvalue_down(eigen_num_para, kpoint_num_para)
c eigenvalue_ef = eigenvalue - EF
      real*8 eigenvalue_down_sub_ef(eigen_num_para, kpoint_num_para)
     
c read line start number
      integer*4 num_eigen_line
      integer*4 num_kpoint_line
     
      spin = 1

c f01 : read *.pw.out data
      open( 1, file = 'f01' )
     
c read basic data
      rewind(01)
      i = 0
      do
        i = i + 1
        read( 1,'( a130 )' ) READOR
        if( READOR(1:32) .eq. '     number of Kohn-Sham states=' ) then
          num_eigen_line = i
        end if
        if( READOR(1:24) .eq. '     number of k points=' ) then
          num_kpoint_line = i - 1
          goto 6100
        end if
      end do
6100 continue

      rewind(01)
      i = 0
      do
        i = i + 1
        if( num_eigen_line .eq. i ) then
          read( 1,'( 32x,i13 )' ) num_eigen
c          write( 6,'( 32x,i13 )' ) num_eigen
        else
          read( 1,'( a130 )' ) READOR
        end if
        if( num_kpoint_line .eq. i ) then
          read( 1,'( 24x,i8 )' ) num_kpoint
c          write( 6,'( 24x,i8 )' ) num_kpoint
          goto 6200
        end if
      end do
6200 continue

c read eigenvalue data
c      write(6,*) 'OK'
      do
       
        if( READOR(1:28) .eq. ' ------ SPIN UP ------------' ) then
          spin = 2
          j = 0
          total_kpoint_length(1) = 0.0
          read( 1,'( a130 )' ) READOR
          read( 1,'( a130 )' ) READOR
          do
            j = j + 1
            read( 1,'( 13x, 3f7.4 )' ) h(j), k(j), l(j)
            if( j .ge. 2 ) then
              temp_delta_kpoint =
     & (h(j) - h(j-1))**2 + (k(j) - k(j-1))**2 + (l(j) -l(j-1))**2
            delta_kpoint_length(j) = sqrt(temp_delta_kpoint)
            total_kpoint_length(j) = total_kpoint_length(j-1) +
     & delta_kpoint_length(j)
            end if
            read( 1,'( a130 )' ) READOR
c ----
            if( mod(num_eigen,8) .gt. 0)then
              read_eigen_line = int(num_eigen / 8) + 1
            else
              read_eigen_line = int(num_eigen / 8)
            end if
            do n = 1, read_eigen_line
              read( 1, '( 2x, 8(1x,f8.4) )' )
     & ( eigenvalue_up((m+(n-1)*8), j), m=1, 8)
c              write( 6, '( 2x, 8(1x,f8.4) )' )
c     & ( eigenvalue_up((m+(n-1)*8), j), m=1, 8)
            end do
c ----
            read( 1,'( a130 )' ) READOR
            if( j .ge. (num_kpoint/spin) ) then
              goto 6300
            end if
          end do
          write(6, *) 'SPIN UP OK'
        end if
6300 continue
       
       
        if( READOR(1:28) .eq. ' ------ SPIN DOWN ----------' ) then
          spin = 2
          j = 0
          total_kpoint_length(1) = 0.0
          read( 1,'( a130 )' ) READOR
          read( 1,'( a130 )' ) READOR
          do
            j = j + 1
            read( 1,'( 13x, 3f7.4 )' ) h(j), k(j), l(j)
            if( j .ge. 2 ) then
              temp_delta_kpoint =
     & (h(j) - h(j-1))**2 + (k(j) - k(j-1))**2 + (l(j) -l(j-1))**2
            delta_kpoint_length(j) = sqrt(temp_delta_kpoint)
            total_kpoint_length(j) = total_kpoint_length(j-1) +
     & delta_kpoint_length(j)
            end if
            read( 1,'( a130 )' ) READOR
c ----
            if( mod(num_eigen,8) .gt. 0)then
              read_eigen_line = int(num_eigen / 8) + 1
            else
              read_eigen_line = int(num_eigen / 8)
            end if
            do n = 1, read_eigen_line
              read( 1, '( 2x, 8(1x,f8.4) )' )
     & ( eigenvalue_down((m+(n-1)*8), j), m=1, 8)
c              write( 6, '( 2x, 8(1x,f8.4) )' )
c     & ( eigenvalue_down((m+(n-1)*8), j), m=1, 8)
            end do
c ----
            read( 1,'( a130 )' ) READOR
            if( j .ge. (num_kpoint/spin) ) then
              goto 6400
            end if
          end do
          write(6, *) 'SPIN DOWN OK'
        end if
6400 continue
       
        if( (READOR(1:12) .eq. '   JOB DONE.') .and.
     & (spin .eq. 2) ) then
          goto 6500
        end if
       
        read( 1,'( a130 )' ) READOR
        if( (READOR(1:12) .eq. '   JOB DONE.') .and.
     & (spin .eq. 1)) then
          rewind(01)
          do
            if( READOR(1:38) .eq.
     & '     End of band structure calculation' ) then
              spin = 1
              j = 0
              total_kpoint_length(1) = 0.0
              read( 1,'( a130 )' ) READOR
              do
                j = j + 1
                read( 1,'( 13x, 3f7.4 )' ) h(j), k(j), l(j)
                if( j .ge. 2 ) then
                  temp_delta_kpoint =
     & (h(j) - h(j-1))**2 + (k(j) - k(j-1))**2 + (l(j) -l(j-1))**2
                  delta_kpoint_length(j) = sqrt(temp_delta_kpoint)
                  total_kpoint_length(j) = total_kpoint_length(j-1) +
     & delta_kpoint_length(j)
                end if
                read( 1,'( a130 )' ) READOR
c ----
                if( mod(num_eigen,8) .gt. 0)then
                  read_eigen_line = int(num_eigen / 8) + 1
                else
                  read_eigen_line = int(num_eigen / 8)
                end if
                do n = 1, read_eigen_line
                  read( 1, '( 2x, 8(1x,f8.4) )' )
     & ( eigenvalue_up((m+(n-1)*8), j), m=1, 8)
c                  write( 6, '( 2x, 8(1x,f8.4) )' )
c     & ( eigenvalue_up((m+(n-1)*8), j), m=1, 8)
                end do
c ----
                read( 1,'( a130 )' ) READOR
                if( j .ge. (num_kpoint/spin) ) then
                  write(6, *) 'NON SPIN OK'
                  goto 6500
                end if
              end do
            end if
            read( 1,'( a130 )' ) READOR
          end do
        end if
      end do
6500 continue
      close(01)
     
c write output data
     
c f05 : band2igor up spin output
      open(10, file = 'f10' )
      do i = 1, num_eigen
        write( 10, '( i6 )' ) i
        do j = 1, (num_kpoint/spin)
          write( 10, '( 6(1x,f8.4) )' ) h(j),k(j),l(j),
     & delta_kpoint_length(j), total_kpoint_length(j),
     & eigenvalue_up(i, j)
        end do
      end do
      close(10)
     
c f06 : band2igor down spin output
      open(20, file = 'f20' )
      do i = 1, num_eigen
        write( 20, '( i6 )' ) i
        do j = 1, (num_kpoint/spin)
          write( 20, '( 6(1x,f8.4) )' ) h(j),k(j),l(j),
     & delta_kpoint_length(j), total_kpoint_length(j),
     & eigenvalue_down(i, j)
        end do
      end do
      close(20)
     
      stop
      end
-------------------------------------------------------------------------------


-------------------------------------------------------------------------------
■ abinit用バンド図プロット F77 プログラム
-------------------------------------------------------------------------------
 バンド図プロット用 Fortran77コードの例です。

□ コンパイルの仕方
1. テキストファイルに下記のプログラムをコピー&ペーストし、例えば abinit_band2plot.f という名称でSAVEします。
2. 6100 continue などど 数値と continue のある行の最初に空白を入れてください。
3. Terminal を開いて、cd で abinit_band2plot.f  のあるディレクトリをカレントディレクトにします。
4. gfortran abinit_band2plot.f  -o abinit_band2plot と入力します。そうすると、実行ファイルが作成されます。

□ 使い方
1. case.out をコピーしてf01というファイル名にします。
2. 上記でコンパイルして作成された実行ファイルabinit_band2plot を実行します。
3. 出力されたf10とf20がそれぞれupとdownの結果になります(non spinの場合 f10に結果が出力される)。プロットはWIEN2kと同じように、最後の2列をxとyに指定すれば良いです。
※ case.outの結果を並べ替えただけですので、EFを0としたい場合はご自身で計算してください。
-------------------------------------------------------------------------------
c=======================================================================
c  abinit_band2plot.f
c    2012. 8.11  Version 1.00  written by ***
c=======================================================================
c  process
c --------------------------------------------------------------------
      IMPLICIT NONE

      integer*4 band_num_para
      parameter (band_num_para = 999)
      integer*4 kpoint_num_para
      parameter (kpoint_num_para = 999)
      integer*4 eigen_num_para
      parameter (eigen_num_para = 9999)
     
      character*130 READOR
      character*7 CSPIN
     
c spin
      integer*4 spin
c spin
      integer*4 nband_const
c do loop
      integer*4 i, j, m, n, p, q
c number of kpoint
      integer*4 nband(band_num_para)
c number of kpoint
      integer*4 num_kpoint
c number of kpoint
      integer*4 now_kpoint(kpoint_num_para)
c number of eigen
      integer*4 num_eigen
c read_eigen_line
      integer*4 read_eigen_line
     
c EF_eV
      real*8 EF_eV
c kpoint, h, k, l
      real*8 h(kpoint_num_para), k(kpoint_num_para), l(kpoint_num_para)
c temp_delta_kpoint
      real*8 temp_delta_kpoint
c deltal_kpoint_length = sqrt( temp_delta_kpoint)
      real*8 delta_kpoint_length(kpoint_num_para)
c total_kpoint_length
      real*8 total_kpoint_length(kpoint_num_para)
     
c up and down spin
c eigenvalue(eigenvalue, kpoint, spin)
      real*8 eigenvalue(eigen_num_para, kpoint_num_para, 2)
c eigenvalue_ef = eigenvalue - EF
      real*8 eigenvalue_sub_ef(eigen_num_para, kpoint_num_para, 2)
     
c read line start number
      integer*4 num_eigen_line
      integer*4 num_kpoint_line

c f01 : read *.out data
      open( 1, file = 'f01' )
     
c read basic data
      rewind(01)
      i = 0
      do
        i = i + 1
        read( 1,'( a130 )' ) READOR
c        write(6,*) READOR(1:32)
        if( READOR(1:32) .eq. ' Eigenvalues (   eV  ) for nkpt=' ) then
          num_eigen_line = i - 1
          goto 6100
        end if
      end do
6100 continue

      rewind(01)
      i = 0
      do
        i = i + 1
        read( 1,'( a130 )' ) READOR
c        write(6,*) READOR(1:32)
        if( num_eigen_line .eq. i ) then
          read( 1,'( 32x,i4, 12x, a7 )' ) num_kpoint, CSPIN
c          write( 6,'(i4, a7, i4)' ) num_kpoint, CSPIN, i
           goto 6200
        end if
      end do
6200 continue

c read eigenvalue data
c      write(6,*) 'OK'
      if( CSPIN .eq. 'SPIN UP' ) then
        spin = 2
      else
        spin = 1
      end if
c ----
      j = 0
      delta_kpoint_length(1) = 0.0
      total_kpoint_length(1) = 0.0
     
      do p=1, spin
        do j = 1, num_kpoint
          read( 1,'( 5x, i4, 8x, i3, 21x, 3f8.4 )' )
     & now_kpoint(j), nband(j), h(j), k(j), l(j)
          if( j .ge. 2 ) then
            temp_delta_kpoint =
     & (h(j) - h(j-1))**2 + (k(j) - k(j-1))**2 + (l(j) -l(j-1))**2
            delta_kpoint_length(j) = sqrt(temp_delta_kpoint)
            total_kpoint_length(j) = total_kpoint_length(j-1) +
     & delta_kpoint_length(j)
          end if
c ----
          if( mod(nband(j),8) .gt. 0 )then
            read_eigen_line = int(nband(j)/8) + 1
          else
            read_eigen_line = int(nband(j)/8)
          end if
c ----
          do n = 1, read_eigen_line
            read( 1, '( 8(f10.5) )' )
     & ( eigenvalue((m+(n-1)*8), j, p), m=1, 8)
c            write( 6, '( 8(f10.5) )' )
c     & ( eigenvalue((m+(n-1)*8), j, p), m=1, 8)
          end do
        end do
c ----
        read( 1,'( a130 )' ) READOR
      end do
      write(6, *) 'read OK'
     
      close(01)
     
c write output data
     
      nband_const = nband(1)
     
c f05 : band2igor up spin output
      open(10, file = 'f10' )
      do i = 1, nband_const
        write( 10, '( i6 )' ) i
        do j = 1, num_kpoint
          write( 10, '( 6(1x,f8.4) )' ) h(j),k(j),l(j),
     & delta_kpoint_length(j), total_kpoint_length(j),
     & eigenvalue(i, j, 1)
        end do
      end do
      close(10)
     
c f06 : band2igor down spin output
      open(20, file = 'f20' )
      do i = 1, nband_const
        write( 20, '( i6 )' ) i
        do j = 1, num_kpoint
          write( 20, '( 6(1x,f8.4) )' ) h(j),k(j),l(j),
     & delta_kpoint_length(j), total_kpoint_length(j),
     & eigenvalue(i, j, 2)
        end do
      end do
      close(20)
     
      stop
      end
-------------------------------------------------------------------------------
QRコード
携帯用QRコード
アクセス数
ページビュー数