Method: PoscarCommand#substitute

Defined in:
bin/poscar

#substitute(*args) ⇒ Object



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'bin/poscar', line 63

def substitute(* args)
  usage = "Usage: #{File.basename("#{__FILE__}")} POSCAR old_elem new_elem"

  poscar, elem1, elem2 = * args
  old_poscar = VaspUtils::Poscar.load_file(poscar)

  unless elem1 && elem2
    num = old_poscar.elements.size
    width = 7
    printf("%7s" * num, * old_poscar.elements)
    puts
    printf("%7d" * num, * old_poscar.nums_elements)
    puts
    exit
  end

  new_poscar = old_poscar.substitute(elem1, elem2)

  sum_old_radius = 0.0
  old_poscar.elements.size.times do |i|
    radius = CrystalCell::Element.atomic_radius( old_poscar.elements[i])
    sum_old_radius+= radius * old_poscar.nums_elements[i]
  end
  sum_new_radius = 0.0
  new_poscar.elements.size.times do |i|
    radius = CrystalCell::Element.atomic_radius( new_poscar.elements[i])
    sum_new_radius+= radius * new_poscar.nums_elements[i]
  end

  new_poscar.axes = old_poscar.axes.map{|axis| axis.map{|v| v * sum_new_radius/sum_old_radius}}
  new_poscar.dump($stdout)
end