Extract data from OUTCAR to series XYZ files as GAP training set (Bash)¶
requires ASE installed (recommended)
#!/home/lipai/anaconda3/bin/python
#!lipai@mail.ustc.edu.cn
from ase.io import read, write
b=read("OUTCAR",index=":")
for i in b:
i.info['virial']=-i.calc.results['stress']*i.get_volume()
del i.calc.results['stress']
i.pbc=True # ASE parse OUTCAR, incorrectly missed the pbc=True set
write("out.xyz",b)
or use bash
#!/bin/sh
# lipai@mail.ustc.edu.cn
# creat xyz files using OUTCAR only
if [ $# = 0 ]; then
out="OUTCAR"
name=""
else
out=$1
name=$1"-"
fi
echo "Input filename:" $out
rm *.temp
# total number of ions in the system
num_atom=`grep -m 1 "NIONS =" $out|awk '{print $12}'`
echo "Total number of ions: $num_atom"
# create temp files for writing xyz files
typenum=`grep -m 1 'ions per type' $out |head -1 |awk '{print NF}' `
typenum=$(($typenum-4)) # how many types of ions
for i in `seq $typenum`
do
elename=`grep -m $i POTCAR $out |tail -1 |awk '{print $3}'`
j=$(($i+4))
elenum=`grep -m 1 "ions per type" $out |awk -v j=$j '{print $j}'`
echo $elename $elenum
for j in `seq $elenum`
do
echo $elename >> type.temp
done
done
grep -A 3 -m 1 "direct lattice vectors" $out \
|tail -3 |awk '{printf("%f %f %f ",$1,$2,$3)}' >primvec.temp
grep "energy without " $out |awk '{print $4}' >energy.temp
awk '/POSITION/,/drift/{ if(NF==6) print $0 }' $out > pos.temp
lines=`wc pos.temp|awk '{print $1}'`
num_str=`echo "$lines/$num_atom" |bc` # how many structures
echo "Number of structures: $num_str"
if [ -f all.xyz ]; then
rm all.xyz
fi
for i in `seq $num_str`
do
energy=`head -n $i energy.temp|tail -1`
echo "$num_atom" >> str_$i.xyz
echo -n "Lattice=\"" >> str_$i.xyz
cat primvec.temp >> str_$i.xyz
echo -n "\" Properties=species:S:1:pos:R:3:forces:R:3 " >> str_$i.xyz
echo "energy=$energy pbc=\"T T T\"" >> str_$i.xyz
end=`echo "$i*$num_atom" |bc `
head -n $end pos.temp|tail -n $num_atom >pos_i.temp
paste type.temp pos_i.temp >> str_$i.xyz
mv str_$i.xyz $name$i.xyz
cat $name$i.xyz >>all.xyz
done
#rm *.temp
if [ ! -d "struc" ]; then
mkdir struc
fi
mv *xyz struc
mv struc/all.xyz .
rm *.temp