#!/usr/bin/ruby # # Output displaced vector from equilibrium position, HF-forces, and atomic mass for displaced atoms. # These data are sufficient to construct Local harmonic model. # If one has an additive information of symmetry-weight factor of a particular atom, Fvib can be estimated. # # Require DISP file and vasprun.xml files. # # First written by k-fleak # Time-stamp: <05/10/20> # # Usage: (example) # > ruby forceForLH.rb move*/vasprun.xml # home = "." require "#{home}/makePosForce.rb" class VasprunRead < ForceForMaple def initialize(filename) super(filename) setData() @disp = ParseDISP.new() @dispAtom = @disp.getAtomIndex @dispPosition = @disp.getDispPos @atomWeight = setAtomWeight @absDispPosition = setAbsDispPosition end def printAll(i, index) printArray(@absDispPosition[i.to_i], @force[index.to_i-1], @atomWeight[index.to_i-1] ) printf("\n") end private def setAtomWeight tmpWeight = Array.new @vasprun.atomNum.each_with_index do |n,i| n.to_i.times do |j| tmpWeight << @vasprun.atomWeight[i] end end tmpWeight end protected def setAbsDispPosition multiply(@dispPosition, @basis) end end class ForceForLH def initialize @disp = ParseDISP.new() @atomIndex = @disp.getAtomIndex end def start ARGV.each_with_index do |filename,i| vasprun = VasprunRead.new(filename) vasprun.printAll(i, @atomIndex[i]) end end end forceLH = ForceForLH.new() forceLH.start()