lib/vasputils/outcar.rb in vasputils-0.0.12 vs lib/vasputils/outcar.rb in vasputils-0.1.1

- old
+ new

@@ -1,5 +1,8 @@ +#! /usr/bin/env ruby +# coding: utf-8 +# #require "vasputils.rb" # OUTCAR をパースする。 # 精確には行わず、必要な情報だけをピックアップする感じ。 # @@ -8,67 +11,49 @@ # 本来は vasp のソースを見て決めるべきだろう。 # やるとすればかなり大掛かりなプロジェクトになるが、そのわりには旨味が少ない。 # grep でなんとかなるし。 # # 基本的に終了した計算から情報を取り出すには vasprun.xml を読む。 +# だが、計算途中の状態を知りたいとうのもよくある要求。 +# こういう場合には vasprun.xml はきちんと閉じた xmlにならないので +# 使えない。 # OUTCAR は終了する前も含めてなんか簡単に見るために使う、という位置付けで。 module VaspUtils::Outcar - #toten は全 electronic and ionic steps のを flat に並べただけのもの。 - #必要なら構造化するが、現状その予定はない。 - #attr_reader :name - #attr_reader :ionic_steps, :electronic_steps, :totens, :volumes, :elapsed_time + #toten は全 electronic and ionic steps のを flat に並べただけのもの。 + #必要なら構造化するが、現状その予定はない。 + #attr_reader :name + #attr_reader :ionic_steps, :electronic_steps, :totens, :volumes, :elapsed_time - def self.load_file(file) - raise Errno::ENOENT unless File.exist?(file) + 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 + 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 = File.readlines(file) - #lines.each do |line| - # #if /Found\s+(\d+)\s+irreducible k-points/i =~ line - # # results[:irreducible_kpoints] = $1.to_i - # #end + lines = `grep Iteration #{file}`.split("\n") + results[:electronic_steps] = lines.size + /^-* Iteration\s+(\d+)/ =~ lines[-1] + results[:ionic_steps ] = $1.to_i - # #if /^-* Iteration\s+(\d+)/ =~ line - # # results[:ionic_steps ] = $1.to_i - # # results[:electronic_steps] += 1 - # #end + results[:totens] = `grep TOTEN #{file}`.split("\n").map do |line| + /TOTEN\s+=\s(.*)\s+eV/ =~ line + $1.to_f + end - # ##if /free\s+energy\s+TOTEN\s+=\s(.*)\s+eV/ =~ line - # #if /TOTEN\s+=\s(.*)\s+eV/ =~ line - # # results[:totens] << $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 - # #if /volume of cell :\s+(\d+\.\d+)$/ =~ line - # # results[:volumes] << $1.to_f - # #end - #end + line = `tail -q -n 1 #{file}` + results[:normal_ended] = true if (/Voluntary context switches:/ =~ line) - 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 + results + end end