Module: VaspUtils::Outcar

Defined in:
lib/vasputils/outcar.rb

Overview

! /usr/bin/env ruby coding: utf-8

OUTCAR をパースする。精確には行わず、必要な情報だけをピックアップする感じ。

あまり頑張らないことにした理由は以下。

OUTCAR がどう出力されるのかがよくわからない。
本来は vasp のソースを見て決めるべきだろう。
やるとすればかなり大掛かりなプロジェクトになるが、そのわりには旨味が少ない。
grep でなんとかなるし。

基本的に終了した計算から情報を取り出すには vasprun.xml を読む。だが、計算途中の状態を知りたいとうのもよくある要求。こういう場合には vasprun.xml はきちんと閉じた xmlにならないので使えない。OUTCAR は終了する前も含めてなんか簡単に見るために使う、という位置付けで。

Class Method Summary collapse

Class Method Details

.load_file(file) ⇒ Object

toten は全 electronic and ionic steps のを flat に並べただけのもの。必要なら構造化するが、現状その予定はない。attr_reader :name attr_reader :ionic_steps, :electronic_steps, :totens, :volumes, :elapsed_time

Raises:

  • (Errno::ENOENT)


24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/vasputils/outcar.rb', line 24

def self.load_file(file)
  raise Errno::ENOENT unless File.exist?(file)

  results = {}
  results[:name] = file
  #results[:irreducible_kpoints] = nil
  #results[:electronic_steps   ] = 0
  #results[:ionic_steps                ] = 0
  #results[:totens                         ] = []
  #results[:volumes                        ] = []
  results[:elapsed_time               ] = nil
  results[:normal_ended               ] = false

  lines = `grep Iteration #{file}`.split("\n")
  results[:electronic_steps] = lines.size
  /^-* Iteration\s+(\d+)/ =~ lines[-1]
  results[:ionic_steps         ] = $1.to_i

  results[:totens] = `grep TOTEN #{file}`.split("\n").map do |line|
    /TOTEN\s+=\s(.*)\s+eV/ =~ line
    $1.to_f
  end

  line = `tail -q -n 8 #{file}| head -n 1`
  if (/Elapsed time \(sec\):\s+(\d+\.\d+)/ =~ line)
    results[:elapsed_time] = $1.to_f
  end

  line = `tail -q -n 1 #{file}`
  results[:normal_ended] = true if (/Voluntary context switches:/ =~ line)

  results
end