#!/usr/bin/ruby # Create displaced POSCAR files for phonon calculation. # Require "DISP" and "SPOSCAR" files. # # First written by k-fleak # Time-stamp: <05/10/03> # # Usage: makePhonPOSCAR.rb [OPTION] # # OPTION (int or float (default=1.0)) # : Normalize factor for displacement of "DISP" file. require "./parseDISP.rb" require "./parsePoscar.rb" class PositionInfo def initialize poscar = ParsePoscar.new("SPOSCAR") @initPos = poscar.getPosition dataDISP = ParseDISP.new("DISP") @disp = dataDISP.getDispPos @atomIndex = dataDISP.getAtomIndex end def getFinalPosition(dispNum, fact=1.0) @finalPos = moveAtoms(dispNum, fact) end def getMoveAtomIndex @atomIndex end def getNumDisp @atomIndex.size end def writePosition(dispNum) header = File.open("SPOSCAR") file = File.new( "POSCAR-disp#{dispNum}", "w") header.each_with_index do |lines, i| printf(file, "#{lines}") break if i >= 6 end @finalPos.each do |f| printf(file, "%12.8f %12.8f %12.8f\n", f[0], f[1], f[2]) end header.close file.close end private def moveAtoms(dispNum,fact) tmpPos = Marshal.load(Marshal.dump(@initPos)) 3.times do |j| tmpPos[@atomIndex[dispNum]-1][j] += @disp[dispNum][j]*fact end tmpPos end end if ARGV[0] =~ /^\d+|^\f+/ then afactor = ARGV[0].to_f else afactor = 1.0 end position = PositionInfo.new() position.getNumDisp.times do |i| position.getFinalPosition(i, afactor) position.writePosition(i) end