82 lines
2.7 KiB
Python
Executable File
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() |