A series of Python3 script to lower the barrier of computing and simulating molecular and material systems.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

91 lines
1.8 KiB

2 years ago
#!/usr/bin/env ruby
require 'ostruct'
input_file = ARGV[0]
def parsexyz(infile)
res = OpenStruct.new
res.coords = []
res.symbols = []
res.natoms = 0
res.title = "POSCAR"
res.tv = []
res.succ = true
res.nats = []
counting_map = {}
counting_map.default = 0
natoms = infile.gets.split[0].to_i
title = infile.gets
natoms.times do
line = infile.gets
arr = line.split
res.symbols << arr[0]
res.coords << arr
counting_map[arr[0]] += 1
end
3.times do
if line = infile.gets and line.include?("TV")
res.tv << line.split(" ")[1..-1]
else
res.tv = [ [20.0, 0.0, 0.0], [0.0, 20.0, 0.0], [0.0, 0.0, 20.0] ]
break
end
end
res.symbols.uniq!
res.symbols.each do |sym|
res.nats << counting_map[sym]
end
return res
end
def writePOSCAR(res)
if (res.title.size == 0)
puts "POSCAR"
else
puts res.title
end
puts 1.0
(0..2).each do |i|
puts res.tv[i].map{|x| "%16.12f" % x}.join(" ")
end
puts res.symbols.join(" ")
puts res.nats.join(" ")
puts "Cart"
res.coords.each do |line|
puts "#{line[1..-1].map{|x| "%16.12f" % x}.join(" ")} #{line[0]}"
end
end
File.open(input_file) do |infile|
num = 0
last_obj = OpenStruct.new
while infile.eof? == false
obj = parsexyz(infile)
num += 1
if obj.succ
last_obj = obj
# last_obj.marshal_load(obj.marshal_dump())
end
end
writePOSCAR(last_obj)
end
exit
File.open(output_file, "w") do |outfile|
outfile.puts [natoms, "C"].join(" ")
outfile.puts symbols.join(" ")
lines.each_with_index do |line, index|
outfile.puts [index+1, symbols.index(line[0])+1, line[1..3]].join(" ")
end
end