aims 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +1 -1
- data/bin/aims_output.rb +26 -9
- data/bin/aims_summary.rb +3 -3
- data/lib/aims.rb +2 -1
- data/lib/aims/Tetragonal.rb +31 -0
- data/lib/aims/atom.rb +16 -7
- data/lib/aims/geometry.rb +9 -8
- data/lib/aims/geometry_parser.rb +11 -1
- data/lib/aims/output.rb +4 -2
- data/lib/aims/volume.rb +7 -2
- data/lib/aims/zinc_blende.rb +43 -41
- data/spec/zinc_blende_spec.rb +27 -0
- metadata +6 -4
data/README.rdoc
CHANGED
@@ -73,7 +73,7 @@ And here is how you get a (100) surface with 7 layers and 20 angstrom of vacuum
|
|
73
73
|
And here is how you can constrain the bottom three layers
|
74
74
|
constrain = 3
|
75
75
|
puts zb.get_001_surface(layers, vacuum, constrain)
|
76
|
-
|
76
|
+
|
77
77
|
== Scripts that come with the Aims GEM
|
78
78
|
|
79
79
|
There are currently two scripts that come with the GEM
|
data/bin/aims_output.rb
CHANGED
@@ -55,9 +55,18 @@ begin
|
|
55
55
|
exit
|
56
56
|
end
|
57
57
|
outputs = files.collect{|f|
|
58
|
-
|
58
|
+
Aims::OutputParser.parse(f)
|
59
59
|
}
|
60
60
|
|
61
|
+
int_format = "%-20s %20i"
|
62
|
+
float_format = "%-20s %20.5f"
|
63
|
+
exp_format = "%-20s %20.5e"
|
64
|
+
|
65
|
+
sciter_format = "%-20s %20i"
|
66
|
+
timings_format = "%-35s %20.5f"
|
67
|
+
energy_format = "%-35s %20.5f"
|
68
|
+
force_format = "%-35s %20.5e"
|
69
|
+
|
61
70
|
total_sc_iterations = 0
|
62
71
|
total_relaxations = 0
|
63
72
|
|
@@ -91,11 +100,6 @@ begin
|
|
91
100
|
|
92
101
|
total_relaxations += 1
|
93
102
|
total_sc_iterations += step.sc_iterations.size
|
94
|
-
|
95
|
-
sciter_format = "%-20s %20i"
|
96
|
-
timings_format = "%-35s %20.5f"
|
97
|
-
energy_format = "%-35s %20.5f"
|
98
|
-
force_format = "%-35s %20.5e"
|
99
103
|
|
100
104
|
puts "= Relaxation Step #{step.step_num} ="
|
101
105
|
|
@@ -122,9 +126,9 @@ begin
|
|
122
126
|
puts " == SC Iteration #{iter} =="
|
123
127
|
|
124
128
|
# Output convergence criterion
|
125
|
-
puts indent +
|
126
|
-
puts indent +
|
127
|
-
puts indent +
|
129
|
+
puts indent + exp_format % ["Change in total energy", sc_iter.d_etot]
|
130
|
+
puts indent + exp_format % ["Change in sum of eigenvalues", sc_iter.d_eev]
|
131
|
+
puts indent + exp_format % ["Change in charge density", sc_iter.d_rho]
|
128
132
|
|
129
133
|
# Output timings if requested
|
130
134
|
if options[:timings]
|
@@ -145,10 +149,23 @@ begin
|
|
145
149
|
|
146
150
|
}
|
147
151
|
|
152
|
+
puts "= Calculation Summary ="
|
148
153
|
unless output.geometry_converged
|
149
154
|
puts "Warning Geometry not converged!"
|
150
155
|
end
|
151
156
|
|
157
|
+
puts int_format % ["Number of SC Iterations found:", total_sc_iterations]
|
158
|
+
puts int_format % ["Number of Relaxation Steps found:", total_relaxations]
|
159
|
+
puts float_format % ["Total CPU time", output.total_cpu_time]
|
160
|
+
|
161
|
+
output.computational_steps.each{|cs|
|
162
|
+
puts int_format % [cs[:description], cs[:value]]
|
163
|
+
}
|
164
|
+
if options[:timings]
|
165
|
+
output.timings.each{|t| puts " " +timings_format % [t[:description], t[:cpu_time]]}
|
166
|
+
end
|
167
|
+
# puts timings_format % ["Total Wall time", output.total_wall_time]
|
168
|
+
|
152
169
|
if options[:geometry_delta]
|
153
170
|
puts "= Change in atomic positions for calculation"
|
154
171
|
puts output.geometry_steps.last.geometry.delta(output.geometry_steps.first.geometry)
|
data/bin/aims_summary.rb
CHANGED
@@ -8,13 +8,13 @@ if files.empty?
|
|
8
8
|
end
|
9
9
|
|
10
10
|
STDOUT.sync = true
|
11
|
-
puts "%-
|
12
|
-
format = "%-
|
11
|
+
puts "%-40s \t %-15s \t %9s \t %7s \t %10s \t %12s \t %8s \t %10s" % %w(FILE TOTAL_ENERGY NUM_ATOMS K-GRID CONVERGED RELAX_STEPS SC_ITERS TOTAL_TIME)
|
12
|
+
format = "%-40s \t %+15f \t %9i \t %7s \t %10s \t %12i \t %8i \t %10.2f"
|
13
13
|
files.each{|f|
|
14
14
|
run = f.split(".").last
|
15
15
|
begin
|
16
16
|
o = Aims::OutputParser.parse(f)
|
17
|
-
puts format % [
|
17
|
+
puts format % [f[0...40],
|
18
18
|
(o.total_energy.nan? ? Float::NAN : o.total_energy),
|
19
19
|
(o.n_atoms or -1),
|
20
20
|
(o.k_grid ? o.k_grid.squeeze : "-"),
|
data/lib/aims.rb
CHANGED
@@ -0,0 +1,31 @@
|
|
1
|
+
module Aims
|
2
|
+
# A factory class for generating tetragonal geometries
|
3
|
+
class Tetragonal < Geometry
|
4
|
+
|
5
|
+
# @param species [String] The atomic species
|
6
|
+
# @param a [Float] The length of the a vector
|
7
|
+
# @param c [Float] The length of the c vector
|
8
|
+
def initialize(species, a, c)
|
9
|
+
a = Atom.new(0,0,0,species)
|
10
|
+
v1 = Vector[a, 0, 0]
|
11
|
+
v2 = Vector[0, a, 0]
|
12
|
+
v3 = Vector[a/2.0, a/2.0, c/2.0]
|
13
|
+
super(a, [v1, v2, v3])
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class Gallium < Geometry
|
18
|
+
def initialize(a, b, c, u, v)
|
19
|
+
v1 = Vector[a/2.0, -b/2.0, 0]
|
20
|
+
v2 = Vector[a/2.0, b/2.0, 0]
|
21
|
+
v3 = Vector[0, 0, c]
|
22
|
+
|
23
|
+
atoms = [Atom.new(0, u*b, v*c, "Ga"),
|
24
|
+
Atom.new(0, -u*b, -v*c, "Ga"),
|
25
|
+
Atom.new(0, (0.5+u)*b, (0.5-v)*c, "Ga"),
|
26
|
+
Atom.new(0, (0.5-u)*b, (0.5+v)*c, "Ga")]
|
27
|
+
super(atoms, [v1, v2, v3])
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
data/lib/aims/atom.rb
CHANGED
@@ -17,16 +17,17 @@ module Aims
|
|
17
17
|
# The relaxation constraints of this atom
|
18
18
|
attr_accessor :constrain
|
19
19
|
# Two atoms are equal if their coordinates are the same to this precision
|
20
|
-
attr_accessor :precision
|
20
|
+
attr_accessor :precision # Seems like it should really be a class variable
|
21
21
|
|
22
22
|
include Enumerable
|
23
23
|
|
24
24
|
# Create an atom of the specified species at the given coordinates
|
25
|
-
#
|
26
|
-
#
|
27
|
-
#
|
28
|
-
#
|
29
|
-
#
|
25
|
+
# @param [Float] x The x coordinate of the atom in angstrom
|
26
|
+
# @param [Float] y The y coordinate of the atom in angstrom
|
27
|
+
# @param [Float] z The z coordinate of the atom in angstrom
|
28
|
+
# @param [String, nil] s The atomic species ex. "C", "Si", "S", etc. (can be nil)
|
29
|
+
# @param [Boolean, String, Array<String>] c The relaxation constraints. valid values are TRUE, FALSE, ".true.", ".false.", "x", "y", "z" or %w(x y z)
|
30
|
+
# @return [Atom] a new Atom
|
30
31
|
def initialize(x=nil, y=nil, z=nil, s=nil, c=Array.new)
|
31
32
|
self.x = x
|
32
33
|
self.y = y
|
@@ -93,11 +94,19 @@ module Aims
|
|
93
94
|
Math.sqrt((self.x - atom.x)**2 + (self.y - atom.y)**2 + (self.z - atom.z)**2)
|
94
95
|
end
|
95
96
|
|
96
|
-
# A deep copy of the atom
|
97
|
+
# A deep copy of the atom, but with a unique id
|
97
98
|
def copy
|
98
99
|
Atom.new(self.x, self.y, self.z, self.species, self.constrain)
|
99
100
|
end
|
100
101
|
|
102
|
+
# An exact clone of the atom. Same ID and everything
|
103
|
+
def clone
|
104
|
+
a = Atom.new(self.x, self.y, self.z, self.species, self.constrain)
|
105
|
+
a.id = self.id
|
106
|
+
return a
|
107
|
+
end
|
108
|
+
|
109
|
+
|
101
110
|
# Return a new atom with the same species and relaxation constraints
|
102
111
|
# but with coordinates displaced by +x+, +y+, +z+
|
103
112
|
def displace(x,y,z)
|
data/lib/aims/geometry.rb
CHANGED
@@ -99,8 +99,8 @@ module Aims
|
|
99
99
|
# Return the atoms in this unit cell. By default returns
|
100
100
|
# only the visible atoms, but this method will return all of the atoms
|
101
101
|
# if called with (visibleOnly = false)
|
102
|
-
def atoms(
|
103
|
-
if visibleOnly and 0 < @clip_planes.size
|
102
|
+
def atoms(visibility = :visibleOnly)
|
103
|
+
if (visibility == :visibleOnly) and (0 < @clip_planes.size)
|
104
104
|
@visibleAtoms
|
105
105
|
else
|
106
106
|
@atoms
|
@@ -237,7 +237,7 @@ module Aims
|
|
237
237
|
|
238
238
|
# Recompute the atoms that are behind all the clip planes
|
239
239
|
# Atoms that are in front of any clip-plane are considered invisible.
|
240
|
-
def recache_visible_atoms
|
240
|
+
def recache_visible_atoms(makeBonds = false)
|
241
241
|
|
242
242
|
plane_count = (@clip_planes ? @clip_planes.length : 0)
|
243
243
|
return if plane_count == 0
|
@@ -255,7 +255,7 @@ module Aims
|
|
255
255
|
@visibleAtoms << a if i == 0
|
256
256
|
}
|
257
257
|
|
258
|
-
make_bonds
|
258
|
+
make_bonds if makeBonds
|
259
259
|
end
|
260
260
|
|
261
261
|
# Rotate the geometry in 3 dimensions. The rotation is
|
@@ -312,6 +312,7 @@ module Aims
|
|
312
312
|
atoms.size
|
313
313
|
end
|
314
314
|
|
315
|
+
|
315
316
|
# Return a two element array contaiing two artificial Aims::Atom objects whose coordinates
|
316
317
|
# represent the lower-left and upper-right corners of the Geometry's bounding box.
|
317
318
|
def bounding_box(visible_only = true)
|
@@ -377,7 +378,7 @@ module Aims
|
|
377
378
|
|
378
379
|
# Return a new unit cell with all the atoms displaced by the amount x,y,z
|
379
380
|
def displace(x,y,z)
|
380
|
-
Geometry.new(atoms.collect{|a|
|
381
|
+
Geometry.new(atoms(:all).collect{|a|
|
381
382
|
a.displace(x,y,z)
|
382
383
|
}, self.lattice_vectors)
|
383
384
|
#TODO copy miller indices
|
@@ -401,9 +402,9 @@ module Aims
|
|
401
402
|
nz_sign = (0 < nz) ? 1 : -1
|
402
403
|
|
403
404
|
new_atoms = []
|
404
|
-
nx.abs.times do |i|
|
405
|
-
ny.abs.times do |j|
|
406
|
-
nz.abs.times do |k|
|
405
|
+
nx.to_i.abs.times do |i|
|
406
|
+
ny.to_i.abs.times do |j|
|
407
|
+
nz.to_i.abs.times do |k|
|
407
408
|
new_atoms << self.displace(nx_sign*i*v1[0] + ny_sign*j*v2[0] + nz_sign*k*v3[0],
|
408
409
|
nx_sign*i*v1[1] + ny_sign*j*v2[1] + nz_sign*k*v3[1],
|
409
410
|
nx_sign*i*v1[2] + ny_sign*j*v2[2] + nz_sign*k*v3[2]).atoms
|
data/lib/aims/geometry_parser.rb
CHANGED
@@ -3,7 +3,17 @@ module Aims
|
|
3
3
|
|
4
4
|
# Utility class for parsing an Aims geometry file
|
5
5
|
# Example Usage:
|
6
|
-
#
|
6
|
+
# geom = Aims::GeometryParser.parse("geometry.in")
|
7
|
+
#
|
8
|
+
# # Constrain atoms below some z value
|
9
|
+
# geom.each{|atom|
|
10
|
+
# if (atom.z < someValue)
|
11
|
+
# atom.constrain = true
|
12
|
+
# end
|
13
|
+
# }
|
14
|
+
# File.open("new_geometry.in", "w") do |f|
|
15
|
+
# f.puts geom.format_geometry_in
|
16
|
+
# end
|
7
17
|
class GeometryParser
|
8
18
|
|
9
19
|
# Parse a String representation of a geometry.in file
|
data/lib/aims/output.rb
CHANGED
@@ -150,6 +150,7 @@ module Aims
|
|
150
150
|
total += a[1][:cpu_time]
|
151
151
|
}
|
152
152
|
end
|
153
|
+
|
153
154
|
end
|
154
155
|
|
155
156
|
# A single self-consistency iteration
|
@@ -231,6 +232,7 @@ module Aims
|
|
231
232
|
self.geometry_steps = Array.new
|
232
233
|
self.geometry_converged = false
|
233
234
|
self.timings = {}
|
235
|
+
self.computational_steps = Array.new
|
234
236
|
end
|
235
237
|
|
236
238
|
# Returns the best available value of the total energy
|
@@ -411,8 +413,8 @@ module Aims
|
|
411
413
|
|
412
414
|
when /Begin self-consistency iteration/
|
413
415
|
retval.geometry_step.sc_iterations << SCIteration.new
|
414
|
-
|
415
|
-
when /End self-consistency iteration/, /End scf initialization - timings/
|
416
|
+
|
417
|
+
when /End self-consistency iteration/, /End scf initialization - timings/, /End scf reinitialization - timings/
|
416
418
|
retval.sc_iteration.timings = OutputParser.parse_sc_timings(f)
|
417
419
|
|
418
420
|
when /Change of charge density/
|
data/lib/aims/volume.rb
CHANGED
@@ -4,8 +4,11 @@ module Aims
|
|
4
4
|
# of four points. The normals of the planes must all point outward. This is tested
|
5
5
|
#
|
6
6
|
class Volume
|
7
|
-
|
8
|
-
|
7
|
+
|
8
|
+
# Add Vectorize as class methods
|
9
|
+
class<<self
|
10
|
+
include Vectorize
|
11
|
+
end
|
9
12
|
|
10
13
|
# Quick recursive method for calculating combinations
|
11
14
|
def Volume.choose(list, num, head = [])
|
@@ -31,6 +34,8 @@ module Aims
|
|
31
34
|
# Return an array of tuples that define the
|
32
35
|
# vertices of intersection of these planes
|
33
36
|
# Vertices are removed that lie in front of any plane
|
37
|
+
# @param [Array<Plane>] planes An array of Planes that define the boundaries of the volume
|
38
|
+
# @return [Array] An array of tuples that define the vertices of intersection of these planes
|
34
39
|
def Volume.intersection_points(planes)
|
35
40
|
combos = Volume.choose(planes, 3)
|
36
41
|
points = []
|
data/lib/aims/zinc_blende.rb
CHANGED
@@ -46,43 +46,45 @@ module Aims
|
|
46
46
|
end
|
47
47
|
|
48
48
|
# Fill the given volume with atoms
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
end
|
49
|
+
# This method is still under development. It is removed for the 0.2.0 release
|
50
|
+
#
|
51
|
+
# def fill_volume(volume)
|
52
|
+
#
|
53
|
+
# # First fill a cube that bounds the volume
|
54
|
+
# max = volume.max_point
|
55
|
+
# min = volume.min_point
|
56
|
+
#
|
57
|
+
# dx = max[0] - min[0]
|
58
|
+
# dy = max[1] - min[1]
|
59
|
+
# dz = max[2] - min[2]
|
60
|
+
#
|
61
|
+
# bulk = get_bulk
|
62
|
+
#
|
63
|
+
# # This inverse matrix gives the number of repetitions
|
64
|
+
# m = Matrix[[dx,0,0], [0,dy,0], [0,0,dz]]
|
65
|
+
# v = Matrix[bulk.lattice_vectors[0].to_a,
|
66
|
+
# bulk.lattice_vectors[1].to_a,
|
67
|
+
# bulk.lattice_vectors[2].to_a]
|
68
|
+
# rep_mat = m*(v.inverse)
|
69
|
+
#
|
70
|
+
# # The only way I can figure out how to do this for an
|
71
|
+
# # arbitrary set of lattice vectors is to fill the volume
|
72
|
+
# # out along each edge of the super-cube and then eliminate duplicates
|
73
|
+
# atoms = []
|
74
|
+
# 3.times do |i|
|
75
|
+
# # this vector is the number of repetitions in the unit cell
|
76
|
+
# # to fill the volume out along the i-th edge of the super-cube
|
77
|
+
# n_repeat = rep_mat.row(i)
|
78
|
+
#
|
79
|
+
# # Give the proper sign to the repeat
|
80
|
+
# nx = (n_repeat[0] < 0) ? n_repeat[0].floor-1 : n_repeat[0].ceil+1
|
81
|
+
# ny = (n_repeat[1] < 0) ? n_repeat[1].floor-1 : n_repeat[1].ceil+1
|
82
|
+
# nz = (n_repeat[2] < 0) ? n_repeat[2].floor-1 : n_repeat[2].ceil+1
|
83
|
+
#
|
84
|
+
# atoms += bulk.repeat(nx, ny, nz).atoms.find_all{|a| volume.contains_point(a.x, a.y, a.z)}
|
85
|
+
# end
|
86
|
+
# Geometry.new(atoms.uniq)
|
87
|
+
# end
|
86
88
|
|
87
89
|
# Return a unit cell for a slab of 001
|
88
90
|
# Specify the number of atomic monolayers,
|
@@ -107,7 +109,7 @@ module Aims
|
|
107
109
|
if 0 < vacuum
|
108
110
|
# Add vacuum
|
109
111
|
monolayerSep = v3[2]/2
|
110
|
-
zb.lattice_vectors[2] = Vector[0, 0, monolayers*monolayerSep.abs + vacuum.to_f]
|
112
|
+
zb.lattice_vectors[2] = Vector[0, 0, (monolayers-1)*monolayerSep.abs + vacuum.to_f]
|
111
113
|
# Move everything into a nice tidy unit cell.
|
112
114
|
zb = zb.correct
|
113
115
|
end
|
@@ -192,7 +194,7 @@ module Aims
|
|
192
194
|
zb = zb.repeat(1,1,monolayers+1)
|
193
195
|
|
194
196
|
bilayerSep = v3[2]
|
195
|
-
zb.lattice_vectors[2] = Vector[0, 0, monolayers*(bilayerSep.abs) + vacuum]
|
197
|
+
zb.lattice_vectors[2] = Vector[0, 0, (monolayers-1)*(bilayerSep.abs) + vacuum]
|
196
198
|
|
197
199
|
# Strip off the top and bottom atom
|
198
200
|
minZ = zb.atoms.min{|a,b| a.z <=> b.z}.z
|
@@ -287,10 +289,10 @@ module Aims
|
|
287
289
|
zb = zb.repeat(1,1,monolayers)
|
288
290
|
|
289
291
|
|
292
|
+
monolayerSep = v3[2]
|
290
293
|
if 0 < vacuum
|
291
294
|
# Add vacuum
|
292
|
-
|
293
|
-
zb.lattice_vectors[2] = Vector[0, 0, monolayers*monolayerSep.abs + vacuum.to_f]
|
295
|
+
zb.lattice_vectors[2] = Vector[0, 0, (monolayers-1)*monolayerSep.abs + vacuum.to_f]
|
294
296
|
# Move everything into a nice tidy unit cell.
|
295
297
|
zb = zb.correct
|
296
298
|
end
|
data/spec/zinc_blende_spec.rb
CHANGED
@@ -34,6 +34,13 @@ describe ZincBlende do
|
|
34
34
|
s.atoms.size.should eq(6)
|
35
35
|
end
|
36
36
|
|
37
|
+
it "should have 20AA of vacuum" do
|
38
|
+
maxz = s.atoms.max{|a,b| a.z <=> b.z}.z
|
39
|
+
minz = s.atoms.min{|a,b| a.z <=> b.z}.z
|
40
|
+
z_vector = s.lattice_vectors[2][2]
|
41
|
+
(z_vector - (maxz - minz)).should eq (20)
|
42
|
+
end
|
43
|
+
|
37
44
|
it "should have i constrained atoms" do
|
38
45
|
s.atoms.find_all{|a| a.constrained?}.size.should eq(i)
|
39
46
|
end
|
@@ -49,6 +56,13 @@ describe ZincBlende do
|
|
49
56
|
# The 110 surface has 2 atoms per monolayer
|
50
57
|
s.atoms.size.should eq(i*2)
|
51
58
|
end
|
59
|
+
|
60
|
+
it "should have 20AA of vacuum" do
|
61
|
+
maxz = s.atoms.max{|a,b| a.z <=> b.z}.z
|
62
|
+
minz = s.atoms.min{|a,b| a.z <=> b.z}.z
|
63
|
+
z_vector = s.lattice_vectors[2][2]
|
64
|
+
(z_vector - (maxz - minz)).should eq (20)
|
65
|
+
end
|
52
66
|
end
|
53
67
|
|
54
68
|
5.times do |i|
|
@@ -59,5 +73,18 @@ describe ZincBlende do
|
|
59
73
|
end
|
60
74
|
end
|
61
75
|
|
76
|
+
context "111 Slab" do
|
77
|
+
s = zb.get_110_surface(5, 20)
|
78
|
+
it "should have 10 atoms" do
|
79
|
+
# The 110 surface has 2 atoms per monolayer
|
80
|
+
s.atoms.size.should eq(10)
|
81
|
+
end
|
82
|
+
it "should have 20AA of vacuum" do
|
83
|
+
maxz = s.atoms.max{|a,b| a.z <=> b.z}.z
|
84
|
+
minz = s.atoms.min{|a,b| a.z <=> b.z}.z
|
85
|
+
z_vector = s.lattice_vectors[2][2]
|
86
|
+
(z_vector - (maxz - minz)).should eq (20)
|
87
|
+
end
|
88
|
+
end
|
62
89
|
|
63
90
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aims
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-08-01 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &3864410 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,7 +21,7 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *3864410
|
25
25
|
description: Support for generation and parsing of input and output files for FHI-AIMS
|
26
26
|
DFT package
|
27
27
|
email: joshua.shapiro@gmail.com
|
@@ -40,6 +40,7 @@ files:
|
|
40
40
|
- lib/aims/geometry_parser.rb
|
41
41
|
- lib/aims/output.rb
|
42
42
|
- lib/aims/plane.rb
|
43
|
+
- lib/aims/Tetragonal.rb
|
43
44
|
- lib/aims/vectorize.rb
|
44
45
|
- lib/aims/volume.rb
|
45
46
|
- lib/aims/wurtzite.rb
|
@@ -80,3 +81,4 @@ test_files:
|
|
80
81
|
- spec/bond_spec.rb
|
81
82
|
- spec/output_spec.rb
|
82
83
|
- spec/zinc_blende_spec.rb
|
84
|
+
has_rdoc:
|