Files
VASP_calc/neb.py
2026-01-08 19:47:32 +03:00

82 lines
2.7 KiB
Python
Executable File

#!/usr/bin/env python3
"""
NEB path generator for VASP
Usage: python neb.py -n 5 00/POSCAR 0N/POSCAR
"""
import numpy as np
import os
import sys
import argparse
from ase import Atoms
from ase.io import read, write
from ase.neb import NEB
from ase.calculators.vasp import Vasp
def create_interpolated_images(initial, final, n_images):
"""Create NEB images between initial and final structures"""
images = [initial]
# Create intermediate images
for i in range(1, n_images):
image = initial.copy()
# Linear interpolation
image.positions = initial.positions + i/(n_images+1) * (final.positions - initial.positions)
images.append(image)
images.append(final)
# Create NEB object for interpolation
neb = NEB(images)
neb.interpolate()
return images
def main():
parser = argparse.ArgumentParser(description='Generate NEB images for VASP')
parser.add_argument('-n', '--n_images', type=int, default=3,
help='Number of intermediate images')
parser.add_argument('initial_poscar', help='Path to initial POSCAR')
parser.add_argument('final_poscar', help='Path to final POSCAR')
parser.add_argument('--method', default='idpp',
help='Interpolation method (idpp or linear)')
args = parser.parse_args()
# Read structures
initial = read(args.initial_poscar, format='vasp')
final = read(args.final_poscar, format='vasp')
print(f"Initial structure: {len(initial)} atoms")
print(f"Final structure: {len(final)} atoms")
# Check atom count
if len(initial) != len(final):
print("ERROR: Initial and final structures must have same number of atoms!")
sys.exit(1)
# Create images
images = create_interpolated_images(initial, final, args.n_images)
# Create directories and write POSCAR files
for i, image in enumerate(images):
dir_name = f"{i:02d}"
os.makedirs(dir_name, exist_ok=True)
write(f"{dir_name}/POSCAR", image, format='vasp', direct=True)
print(f"Created {dir_name}/POSCAR")
# Write NEB information
with open('NEB_INFO.txt', 'w') as f:
f.write(f"NEB calculation with {len(images)} images\n")
f.write(f"Initial: {args.initial_poscar}\n")
f.write(f"Final: {args.final_poscar}\n")
f.write(f"Intermediate images: {args.n_images}\n")
print(f"\nCreated {len(images)} images in directories 00-{len(images)-1:02d}")
print("Next steps:")
print("1. Copy INCAR, KPOINTS, POTCAR to all image directories")
print("2. Run VASP in the main directory")
print("3. Check convergence in OUTCAR files")
if __name__ == '__main__':
main()