vasputils 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.8
1
+ 0.0.9
data/bin/checkvasp ADDED
@@ -0,0 +1,79 @@
1
+ #! /usr/bin/env ruby
2
+ # coding: utf-8
3
+
4
+ # Show state of vasp geometry optimization calculations.
5
+
6
+ #require "vasputils/calcseries.rb"
7
+ require "rubygems"
8
+ gem "vasputils"
9
+
10
+ require "vasputils/vaspgeomopt.rb"
11
+ require "vasputils/vaspdir.rb"
12
+ require "pp"
13
+ #require "optparse"
14
+
15
+ LONGEST_STATE = :terminated.size
16
+ KLASSES = [VaspDir, VaspGeomOpt]
17
+
18
+ dirs = ARGV
19
+ dirs = Dir.glob("*").sort if ARGV.empty?
20
+
21
+ def guess(dir)
22
+ KLASSES.each do |klass|
23
+ begin
24
+ vd = klass.new(dir)
25
+ return klass
26
+ rescue klass::InitializeError
27
+ end
28
+ end
29
+ raise "Cannot identify class for directory #{dir}."
30
+ end
31
+
32
+ dirs.each do |dir|
33
+ next unless File.directory? dir
34
+
35
+ begin
36
+ klass = guess(dir)
37
+ klass_name = klass.to_s
38
+ rescue
39
+ klass_name = "UnknownDir"
40
+ end
41
+
42
+ printf "%-11s ", klass_name
43
+
44
+ case klass_name
45
+ when "VaspDir"
46
+ calc = klass.new(dir)
47
+ printf "%-10s ", calc.state
48
+ #pp calc.outcar
49
+ printf "%5s ", ""
50
+ begin
51
+ outcar = calc.outcar
52
+ printf "%8.3f %3d (%3d) ",
53
+ outcar[:totens][-1], outcar[:ionic_steps], outcar[:electronic_steps]
54
+ rescue
55
+ printf "%8s %3s (%3s) ", " "*8, " "*3, " "*3
56
+ end
57
+
58
+ when "VaspGeomOpt"
59
+ calc = klass.new(dir)
60
+ printf "%-10s ", calc.state
61
+
62
+ ld = calc.latest_dir
63
+ printf "%5s ", ld.dir.sub(/.*try/, "try")
64
+ begin
65
+ outcar = ld.outcar
66
+ printf "%8.3f %3d (%3d) ",
67
+ outcar[:totens][-1], outcar[:ionic_steps], outcar[:electronic_steps]
68
+ rescue
69
+ printf "%8s %3s (%3s) ", " "*8, " "*3, " "*3
70
+ end
71
+
72
+ when "UnknownDir"
73
+ printf "-" * 35
74
+ printf " "
75
+
76
+ end
77
+ puts dir
78
+
79
+ end
data/bin/runvasp CHANGED
@@ -12,17 +12,35 @@ require "vasputils/vaspgeomopt.rb"
12
12
  require "optparse"
13
13
 
14
14
  ## option analysis
15
- OPTIONS = {}
15
+ opts = {}
16
16
  op = OptionParser.new
17
- op.on("-g" , "--geom-opt", "Geometry optimization"){OPTIONS[:g] = true}
17
+ op.on("-g" , "--geom-opt", "Geometry optimization"){opts[:geom] = true}
18
+ op.on("-c" , "--cond-find", "Condition finding" ){opts[:cond] = true}
18
19
  op.parse!(ARGV)
19
20
 
20
21
  dir = ARGV[0] || "."
21
22
 
22
- if OPTIONS[:g]
23
- calc_dir = VaspGeomOpt.new(dir)
23
+ if opts[:geom] && opts[:cond]
24
+ puts "-g and -c must not be duplicated."
25
+ exit
26
+ end
27
+
28
+ if opts[:geom]
29
+ begin
30
+ calc_dir = VaspGeomOpt.new(dir)
31
+ rescue VaspGeomOpt::NoVaspDirError
32
+ puts "Not suitable for VaspGeomOpt: #{dir}"
33
+ exit
34
+ end
35
+ elsif opts[:cond]
36
+ TODO
24
37
  else
25
- calc_dir = VaspDir.new(dir)
38
+ begin
39
+ calc_dir = VaspDir.new(dir)
40
+ rescue VaspDir::InitializeError
41
+ puts "Not VaspDir: #{dir}"
42
+ exit
43
+ end
26
44
  end
27
45
 
28
46
  #pp calc_dir.class.ancestors
@@ -40,6 +40,12 @@ class VaspDir < ComputationManager
40
40
  Outcar.load_file("#{@dir}/OUTCAR")
41
41
  end
42
42
 
43
+ # 配下の POSCAR を Cell2 インスタンスにして返す。
44
+ # 存在しなければ例外 Errno::ENOENT を返す。
45
+ def poscar
46
+ Poscar.load_file("#{@dir}/POSCAR")
47
+ end
48
+
43
49
  # 配下の CONTCAR を Cell2 インスタンスにして返す。
44
50
  # 存在しなければ例外 Errno::ENOENT を返す。
45
51
  def contcar
@@ -70,6 +70,25 @@ class VaspGeomOpt < ComputationManager
70
70
  return true
71
71
  end
72
72
 
73
+ # Find latest VaspDir.
74
+ # Return a last VaspDir which has the name by name sort
75
+ # and which can be made as a VaspDir instance.
76
+ # Note: in a series of geometry optimization,
77
+ # the directory names should have a rule of naming
78
+ # which can define a method <=>.
79
+ # Usually, it is simple sort of String.
80
+ def latest_dir
81
+ Dir.glob("#{@dir}/*").sort.reverse.find do |dir|
82
+ begin
83
+ vd = VaspDir.new(dir)
84
+ return vd
85
+ rescue VaspDir::InitializeError
86
+ next
87
+ end
88
+ end
89
+ raise NoVaspDirError, @dir
90
+ end
91
+
73
92
  private
74
93
 
75
94
  # Generate next directory of latest_dir.
@@ -92,24 +111,5 @@ class VaspGeomOpt < ComputationManager
92
111
  VaspDir.new(new_dir)
93
112
  end
94
113
 
95
- # Find latest VaspDir.
96
- # Return a last VaspDir which has the name by name sort
97
- # and which can be made as a VaspDir instance.
98
- # Note: in a series of geometry optimization,
99
- # the directory names should have a rule of naming
100
- # which can define a method <=>.
101
- # Usually, it is simple sort of String.
102
- def latest_dir
103
- Dir.glob("#{@dir}/*").sort.reverse.find do |dir|
104
- begin
105
- vd = VaspDir.new(dir)
106
- return vd
107
- rescue VaspDir::InitializeError
108
- next
109
- end
110
- end
111
- raise NoVaspDirError, @dir
112
- end
113
-
114
114
  end
115
115
 
@@ -0,0 +1,72 @@
1
+ #! /usr/bin/env ruby
2
+ # coding: utf-8
3
+
4
+ require "vasputils/vaspdir.rb"
5
+
6
+ #
7
+ #
8
+ #
9
+ class VaspKpointsFinder
10
+
11
+
12
+ def initialize(dir)
13
+ @dir = dir # redefine in subclass.
14
+ @lockdir = "lock_vaspkfind"
15
+ @alive_time = 3600
16
+
17
+ @previous_kpoints = nil
18
+ @kpoints = [ 0, 0, 0 ] #indicate ka, kb, kc
19
+
20
+ @kpoint_candidates = list_kpoints
21
+ end
22
+
23
+ private
24
+
25
+ def calculate
26
+ @previous_kpoints = Marshal.load(Marshal.dump(@kpoints))
27
+
28
+ #@kpoints を起点として、
29
+ #ka の最適化し、精度以下となる最低の条件を @kpoints に登録。
30
+ #kb の最適化し、精度以下となる最低の条件を @kpoints に登録。
31
+ #kc の最適化し、精度以下となる最低の条件を @kpoints に登録。
32
+ 3.times do |i| # each three k axis.
33
+
34
+ end
35
+
36
+ #k の gamma center / hexagonal
37
+ #k の shift
38
+ #spin の有無。当面は有りを前提。INCAR で ISPIN をチェックする。
39
+ end
40
+
41
+ # Do nothing.
42
+ def prepare_next
43
+ end
44
+
45
+ def finished?
46
+ @previous_kpoints == @kpoints
47
+ end
48
+
49
+ # Using lattice constants of POSCAR, which is an initial value.
50
+ #
51
+ def list_kpoints
52
+ #vd = VaspDir.new(Dir.glob(@dir + "/*/try00")[0])
53
+ #results = []
54
+ #vd.poscar.axes.get_lattice_constants[0..2].map do |length|
55
+ #end
56
+ end
57
+ end
58
+
59
+
60
+ #def lowest_encut
61
+ # min_dir = Dir.glob(@dir + "/*/*").min_by { |dir| VaspDir.new(dir).incar["ENCUT"] }
62
+ # VaspDir.new(min_dir).incar["ENCUT"].to_i
63
+ #end
64
+
65
+ #def list_encuts
66
+ # results = []
67
+ # (lowest_encut/100).upto 10 do |i|
68
+ # results << i * 100
69
+ # end
70
+ # results
71
+ #end
72
+
data/memo.txt CHANGED
@@ -1,5 +1,10 @@
1
1
  #
2
2
 
3
+ 0.0.9 release
4
+ Add VaspDir.poscar
5
+ Add bin/checkvasp
6
+ Delete bin/lsvasp, bin/lsvaspdir, bin/lsvaspseries
7
+
3
8
  0.0.8 release
4
9
  Modified bin/qsubvasp, add -g option.
5
10
 
@@ -5,47 +5,47 @@ require "test/unit"
5
5
  require "vasputils/calcinspector.rb"
6
6
 
7
7
  class YetCalc
8
- def started? ; return false; end
9
- def normal_ended? ; return false; end
10
- def to_be_continued?; return false; end
11
- def finished? ; return false; end
8
+ def started? ; return false; end
9
+ def normal_ended? ; return false; end
10
+ def to_be_continued?; return false; end
11
+ def finished? ; return false; end
12
12
  end
13
13
 
14
14
  class StartedCalc
15
- def started? ; return true ; end
16
- def normal_ended? ; return false; end
17
- def to_be_continued?; return false; end
18
- def finished? ; return false; end
15
+ def started? ; return true ; end
16
+ def normal_ended? ; return false; end
17
+ def to_be_continued?; return false; end
18
+ def finished? ; return false; end
19
19
  end
20
20
 
21
21
  class NextCalc
22
- def started? ; return true ; end
23
- def normal_ended? ; return true ; end
24
- def to_be_continued?; return true ; end
25
- def finished? ; return false; end
22
+ def started? ; return true ; end
23
+ def normal_ended? ; return true ; end
24
+ def to_be_continued?; return true ; end
25
+ def finished? ; return false; end
26
26
  end
27
27
 
28
28
  class FinishedCalc
29
- def started? ; return true ; end
30
- def normal_ended? ; return true ; end
31
- def to_be_continued?; return false; end
32
- def finished? ; return true ; end
29
+ def started? ; return true ; end
30
+ def normal_ended? ; return true ; end
31
+ def to_be_continued?; return false; end
32
+ def finished? ; return true ; end
33
33
  end
34
34
 
35
35
  class TC_ListCalculation < Test::Unit::TestCase
36
- def setup
37
- @dc00 = YetCalc.new
38
- @dc01 = StartedCalc.new
39
- @dc02 = NextCalc.new
40
- @dc03 = FinishedCalc.new
41
- end
42
-
43
- def test_self_inspect
44
- assert_equal("YET", CalcInspector.inspect(@dc00))
45
- assert_equal("STARTED", CalcInspector.inspect(@dc01))
46
- assert_equal("NEXT", CalcInspector.inspect(@dc02))
47
- assert_equal("FINISHED", CalcInspector.inspect(@dc03))
48
- end
36
+ def setup
37
+ @dc00 = YetCalc.new
38
+ @dc01 = StartedCalc.new
39
+ @dc02 = NextCalc.new
40
+ @dc03 = FinishedCalc.new
41
+ end
42
+
43
+ def test_self_inspect
44
+ assert_equal("YET", CalcInspector.inspect(@dc00))
45
+ assert_equal("STARTED", CalcInspector.inspect(@dc01))
46
+ assert_equal("NEXT", CalcInspector.inspect(@dc02))
47
+ assert_equal("FINISHED", CalcInspector.inspect(@dc03))
48
+ end
49
49
 
50
50
 
51
51
 
data/test/test_incar.rb CHANGED
@@ -5,122 +5,122 @@ require "test/unit"
5
5
  require "vasputils/incar.rb"
6
6
  require "stringio"
7
7
 
8
- # assert_equal( cor, data)
9
- # assert_in_delta( cor, data, $tolerance )
10
- # assert_raise( RuntimeError ){}
8
+ # assert_equal( cor, data)
9
+ # assert_in_delta( cor, data, $tolerance )
10
+ # assert_raise( RuntimeError ){}
11
11
 
12
12
  class TC_Incar < Test::Unit::TestCase
13
- #def setup
14
- # @k = Incar.new
15
- #end
16
-
17
- SAMPLE_PAIRS = {
18
- "SYSTEM" => "Untitled",
19
- "PREC" => "High",
20
- "IBRION" => "2",
21
- "NSW" => "100",
22
- "ISIF" => "2",
23
- "ENCUT" => "400",
24
- "NELM" => "60",
25
- "NELMIN" => "2",
26
- "EDIFF" => "1.0e-05",
27
- "EDIFFG" => "-0.02",
28
- "VOSKOWN" => "1",
29
- "NBLOCK" => "1",
30
- "ISPIN" => "1",
31
- "INIWAV" => "1",
32
- "ISTART" => "1",
33
- "ICHARG" => "1",
34
- "LWAVE" => ".TRUE.",
35
- "LCHARG" => ".TRUE.",
36
- "ISMEAR" => "0",
37
- "SIGMA" => "0.1",
38
- "IALGO" => "38",
39
- "LREAL" => "Auto",
40
- "NGX" => "36",
41
- "NGY" => "36",
42
- "NGZ" => "42",
43
- }
13
+ #def setup
14
+ # @k = Incar.new
15
+ #end
16
+
17
+ SAMPLE_PAIRS = {
18
+ "SYSTEM" => "Untitled",
19
+ "PREC" => "High",
20
+ "IBRION" => "2",
21
+ "NSW" => "100",
22
+ "ISIF" => "2",
23
+ "ENCUT" => "400",
24
+ "NELM" => "60",
25
+ "NELMIN" => "2",
26
+ "EDIFF" => "1.0e-05",
27
+ "EDIFFG" => "-0.02",
28
+ "VOSKOWN" => "1",
29
+ "NBLOCK" => "1",
30
+ "ISPIN" => "1",
31
+ "INIWAV" => "1",
32
+ "ISTART" => "1",
33
+ "ICHARG" => "1",
34
+ "LWAVE" => ".TRUE.",
35
+ "LCHARG" => ".TRUE.",
36
+ "ISMEAR" => "0",
37
+ "SIGMA" => "0.1",
38
+ "IALGO" => "38",
39
+ "LREAL" => "Auto",
40
+ "NGX" => "36",
41
+ "NGY" => "36",
42
+ "NGZ" => "42",
43
+ }
44
44
 
45
- def test_self_parse
46
- io = StringIO.new
47
- io.puts "# SCF input for VASP"
48
- io.puts "# Note that VASP uses the FIRST occurence of a keyword"
49
- io.puts "# if single point calc, IBRION = -1, NSW = 0, and comment out ISIF"
50
- io.puts ""
51
- io.puts "SYSTEM = Untitled (VASP)"
52
- io.puts " PREC = High"
53
- io.puts " IBRION = 2 #-1:atoms not moved, 1:quasi-Newton, 2:conjugate-gradient"
54
- io.puts " NSW = 100 #maximum number of ionic steps"
55
- io.puts " ISIF = 2"
56
- io.puts " ENCUT = 400"
57
- io.puts " NELM = 60 #maximum number of electronic steps"
58
- io.puts " NELMIN = 2 #minimum number of electronic steps"
59
- io.puts " EDIFF = 1.0e-05"
60
- io.puts " EDIFFG = -0.02"
61
- io.puts " VOSKOWN = 1"
62
- io.puts " NBLOCK = 1"
63
- io.puts " ISPIN = 1 #1:non spin polarized, 2:spin polarized"
64
- io.puts " INIWAV = 1"
65
- io.puts " ISTART = 1"
66
- io.puts " ICHARG = 1"
67
- io.puts " LWAVE = .TRUE."
68
- io.puts " LCHARG = .TRUE."
69
- io.puts " ISMEAR = 0"
70
- io.puts " SIGMA = 0.1"
71
- io.puts " IALGO = 38 #38:KosugiAlgorithm, 48:RMM-DIIS"
72
- io.puts " LREAL = Auto #fast & not accurate"
73
- io.puts " NGX = 36"
74
- io.puts " NGY = 36"
75
- io.puts " NGZ = 42"
76
- io.rewind
77
- pairs = Incar.parse(io)
78
- assert_equal(SAMPLE_PAIRS, pairs)
79
- end
45
+ def test_self_parse
46
+ io = StringIO.new
47
+ io.puts "# SCF input for VASP"
48
+ io.puts "# Note that VASP uses the FIRST occurence of a keyword"
49
+ io.puts "# if single point calc, IBRION = -1, NSW = 0, and comment out ISIF"
50
+ io.puts ""
51
+ io.puts "SYSTEM = Untitled (VASP)"
52
+ io.puts " PREC = High"
53
+ io.puts " IBRION = 2 #-1:atoms not moved, 1:quasi-Newton, 2:conjugate-gradient"
54
+ io.puts " NSW = 100 #maximum number of ionic steps"
55
+ io.puts " ISIF = 2"
56
+ io.puts " ENCUT = 400"
57
+ io.puts " NELM = 60 #maximum number of electronic steps"
58
+ io.puts " NELMIN = 2 #minimum number of electronic steps"
59
+ io.puts " EDIFF = 1.0e-05"
60
+ io.puts " EDIFFG = -0.02"
61
+ io.puts " VOSKOWN = 1"
62
+ io.puts " NBLOCK = 1"
63
+ io.puts " ISPIN = 1 #1:non spin polarized, 2:spin polarized"
64
+ io.puts " INIWAV = 1"
65
+ io.puts " ISTART = 1"
66
+ io.puts " ICHARG = 1"
67
+ io.puts " LWAVE = .TRUE."
68
+ io.puts " LCHARG = .TRUE."
69
+ io.puts " ISMEAR = 0"
70
+ io.puts " SIGMA = 0.1"
71
+ io.puts " IALGO = 38 #38:KosugiAlgorithm, 48:RMM-DIIS"
72
+ io.puts " LREAL = Auto #fast & not accurate"
73
+ io.puts " NGX = 36"
74
+ io.puts " NGY = 36"
75
+ io.puts " NGZ = 42"
76
+ io.rewind
77
+ pairs = Incar.parse(io)
78
+ assert_equal(SAMPLE_PAIRS, pairs)
79
+ end
80
80
 
81
- def test_self_load_file
82
- pairs = Incar.load_file "test/incar/INCAR.00"
83
- assert_equal(SAMPLE_PAIRS, pairs)
81
+ def test_self_load_file
82
+ pairs = Incar.load_file "test/incar/INCAR.00"
83
+ assert_equal(SAMPLE_PAIRS, pairs)
84
84
 
85
- corrects = {
86
- "SYSTEM" => "Untitled",
87
- "PREC" => "High",
88
- "IBRION" => "2",
89
- "NSW" => "0",
90
- "ISIF" => "2",
91
- "ENCUT" => "400",
92
- "NELM" => "60",
93
- "NELMIN" => "2",
94
- "EDIFF" => "1.0e-05",
95
- "EDIFFG" => "-0.02",
96
- "VOSKOWN" => "1",
97
- "NBLOCK" => "1",
98
- "ISPIN" => "1",
99
- "INIWAV" => "1",
100
- "ISTART" => "1",
101
- "ICHARG" => "1",
102
- "LWAVE" => ".TRUE.",
103
- "LCHARG" => ".TRUE.",
104
- "ISMEAR" => "0",
105
- "SIGMA" => "0.1",
106
- "IALGO" => "38",
107
- "LREAL" => "Auto",
108
- "NGX" => "36",
109
- "NGY" => "36",
110
- "NGZ" => "42",
111
- }
112
- pairs = Incar.load_file "test/incar/INCAR.01"
113
- assert_equal(corrects, pairs)
85
+ corrects = {
86
+ "SYSTEM" => "Untitled",
87
+ "PREC" => "High",
88
+ "IBRION" => "2",
89
+ "NSW" => "0",
90
+ "ISIF" => "2",
91
+ "ENCUT" => "400",
92
+ "NELM" => "60",
93
+ "NELMIN" => "2",
94
+ "EDIFF" => "1.0e-05",
95
+ "EDIFFG" => "-0.02",
96
+ "VOSKOWN" => "1",
97
+ "NBLOCK" => "1",
98
+ "ISPIN" => "1",
99
+ "INIWAV" => "1",
100
+ "ISTART" => "1",
101
+ "ICHARG" => "1",
102
+ "LWAVE" => ".TRUE.",
103
+ "LCHARG" => ".TRUE.",
104
+ "ISMEAR" => "0",
105
+ "SIGMA" => "0.1",
106
+ "IALGO" => "38",
107
+ "LREAL" => "Auto",
108
+ "NGX" => "36",
109
+ "NGY" => "36",
110
+ "NGZ" => "42",
111
+ }
112
+ pairs = Incar.load_file "test/incar/INCAR.01"
113
+ assert_equal(corrects, pairs)
114
114
 
115
- # not exist
116
- assert_raise(Errno::ENOENT){Incar.load_file("")}
117
- end
115
+ # not exist
116
+ assert_raise(Errno::ENOENT){Incar.load_file("")}
117
+ end
118
118
 
119
- #def test_dump
120
- #
121
- #
122
- # TODO
123
- #end
119
+ #def test_dump
120
+ #
121
+ #
122
+ # TODO
123
+ #end
124
124
 
125
125
  end
126
126