You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
197 lines
7.3 KiB
197 lines
7.3 KiB
#!/usr/bin/env python3 |
|
import os |
|
import argparse |
|
import sys |
|
from cmmde_dftb import xyz2gen |
|
import numpy as np |
|
from cmmde_surface import surface |
|
from cmmde_formats import read, write |
|
from cmmde_dftb import xyz2gen |
|
from cmmde_tools import sort |
|
from cmmde_decahedron import Decahedron |
|
from cmmde_icosahedron import Icosahedron |
|
from cmmde_tetrahedron import Tetrahedron |
|
from cmmde_cubic import FaceCenteredCubic, SimpleCubic, BodyCenteredCubic |
|
import pymatgen.analysis.adsorption as pa |
|
import pymatgen.core.structure as st |
|
from pymatgen.core import Structure |
|
import argparse |
|
import sys |
|
import warnings |
|
warnings.filterwarnings("ignore") |
|
|
|
parser = argparse.ArgumentParser(description='CMMDEPRE: Program untuk modifikasi input file') |
|
parser.add_argument('-i','--input', type=str, default='None',help='Input geometri dalam berbagai format. Format yang didukung: .smi, .mol2, dan semua format yang didukung oleh openbabel.') |
|
parser.add_argument('-j','--job', type=str, default='sp',help='Jenis pekerjaan yang dilakukan.') |
|
parser.add_argument('-s','--size',type=str,help='Ukuran supersel yang ingin dibuat.') |
|
parser.add_argument('-hkl','--hkl',type=str,help='Indeks Miller (hkl) permukaan yang akan dibuat.') |
|
parser.add_argument('-v', '--vacuum', type=float, default=20, help='Tebal lapisan vakum yang dibuat (dalam angstrom). Default: 20 Angstrom.') |
|
parser.add_argument('-n', '--layer', type=int, help='Jumlah lapisan permukaan atau klaster yang akan dibuat.') |
|
parser.add_argument('-ads','--ads',type=str, help='File koordinat Cartesian berisikan molekul adsorbat') |
|
parser.add_argument('-d','--distance',type=float,default=1.5,help='Jarak adsorbat dari lapisan teratas permukaan (Angstrom). Default: 1.5 Angstrom.') |
|
parser.add_argument('-height','--height',type=float,default=2.0, help='Tebal lapisan sisi aktif (Angstrom). Default: 2.0.') |
|
parser.add_argument('-dyn','--dyn',type=float,default=3.5, help='Tebal lapisan bawah permukaan yang dibuat kaku (Angstrom). Default: 3.0.') |
|
parser.add_argument('-e', '--element', type=str, help='Unsur yang akan dibuat klaster' ) |
|
parser.add_argument('-t', '--type', type=str, help='Tipe klaster yang akan dibuat. Pilihan: decahedron dan icosahedron') |
|
parser.add_argument('-lc', '--lc', type=float, help='Panjang sel satuan kristal ruah jika dianggap kubus.' ) |
|
# Setup untuk klaster decahedron |
|
parser.add_argument('-npar', '--parallel', type=int, help='Jumlah atom pada sisi sejajar dengan ekuatorial.' ) |
|
parser.add_argument('-nper', '--perpendicular', type=int, help='Jumlah atom pada sisi tegak lurus dengan ekuatorial.' ) |
|
opt = parser.parse_args(sys.argv[1:]) |
|
|
|
|
|
opt = parser.parse_args(sys.argv[1:]) |
|
|
|
|
|
if opt.job == 'smi2xyz': |
|
os.system("echo '{}' > geom.smi".format(opt.input)) |
|
with open('run_babel.sh', 'w') as fout: |
|
print("""#!/bin/bash |
|
#SBATCH --nodes=1 |
|
#SBATCH --ntasks=1 |
|
#SBATCH --cpus-per-task=1 |
|
#SBATCH --time=168:0:0 |
|
export OMP_NUM_THREADS=1 |
|
cd $PWD |
|
obabel geom.smi -O geom.xyz --gen3d""",file=fout) |
|
os.system('sbatch run_babel.sh') |
|
if opt.job == 'mol2xyz' or opt.job == 'pdb2xyz': |
|
with open('run_babel.sh', 'w') as fout: |
|
print("""#!/bin/bash |
|
#SBATCH --nodes=1 |
|
#SBATCH --ntasks=1 |
|
#SBATCH --cpus-per-task=1 |
|
#SBATCH --time=168:0:0 |
|
export OMP_NUM_THREADS=1 |
|
cd $PWD |
|
obabel {} -O geom.xyz""".format(opt.input),file=fout) |
|
os.system('sbatch run_babel.sh') |
|
if opt.job == 'gen2poscar': |
|
from cmmde_gen2poscar import gen2poscar |
|
gen2poscar(opt.input) |
|
|
|
if '.mol2' in opt.input and 'charge' in opt.job: |
|
charges = [] |
|
with open(opt.input,'r') as f: |
|
lines = f.readlines() |
|
Natom = int(lines[2].split()[0]) |
|
for i in range(1,Natom+1): |
|
charges.append(float(lines[7+i].split()[8])) |
|
charges = np.array(charges) |
|
print("Muatan total = {}".format(round(sum(charges)))) |
|
|
|
if opt.job == 'combinexyz': |
|
xyz = opt.input.split(' ') |
|
natom = 0 |
|
coord = [] |
|
for i in xyz: |
|
with open(i, 'r') as f: |
|
natom+=int(next(f)) |
|
next(f) |
|
for line in f: |
|
coord.append(line.strip()) |
|
with open('geom.xyz','w') as f: |
|
print(natom,file=f) |
|
print('Complex file generated by CMMDE',file=f) |
|
for i in coord: |
|
print(i,file=f) |
|
|
|
if opt.job == 'supercell': |
|
cell = opt.size.split('x') |
|
filename = opt.input.split('.')[0] |
|
os.system('aflow --supercell={},{},{} < {} > {}_{}{}{}.vasp'.format(cell[0],cell[1],cell[2],opt.input,filename,cell[0],cell[1],cell[2])) |
|
|
|
if opt.job == 'surface': |
|
hkl = [int(x) for x in str(opt.hkl)] |
|
|
|
bulk = read(opt.input) |
|
|
|
slab = surface(bulk, (hkl[0],hkl[1],hkl[2]), opt.layer, vacuum=opt.vacuum) |
|
size = opt.size.split('x') |
|
superslab = slab*(int(size[0]),int(size[1]),1) |
|
superslab_sorted = sort(superslab) |
|
|
|
write('slab_{}{}{}.xyz'.format(hkl[0],hkl[1],hkl[2]), superslab_sorted) |
|
# write('slab.vasp', slab*(int(size[0]),int(size[1]),1)) |
|
x = [] |
|
y = [] |
|
z = [] |
|
sym = [] |
|
a1 = 0 |
|
b1 = 0 |
|
c1 = 0 |
|
a2 = 0 |
|
b2 = 0 |
|
c2 = 0 |
|
a3 = 0 |
|
b3 = 0 |
|
c3 = 0 |
|
with open('slab_{}{}{}.xyz'.format(hkl[0],hkl[1],hkl[2]),'r') as f: |
|
Natoms = int(next(f)) |
|
lat = next(f).split('Lattice=')[1].split() |
|
a1+=float(lat[0].strip('"')) |
|
a2+=float(lat[1]) |
|
a3+=float(lat[2]) |
|
b1+=float(lat[3]) |
|
b2+=float(lat[4]) |
|
b3+=float(lat[5]) |
|
c1+=float(lat[6]) |
|
c2+=float(lat[7]) |
|
c3+=float(lat[8].strip('"')) |
|
xyz2gen('slab_{}{}{}.xyz'.format(hkl[0],hkl[1],hkl[2]),a1,a2,a3,b1,b2,b3,c1,c2,c3) |
|
from cmmde_gen2poscar import gen2poscar |
|
gen2poscar("in.gen") |
|
os.system("mv in.vasp slab_{}{}{}.vasp".format(hkl[0],hkl[1],hkl[2])) |
|
|
|
|
|
if opt.job == 'adsorb': |
|
os.system('cmmde_adsorbate.py -s {} -ad {} -all true -dyn {} -height {} -d {}'.format(opt.input,opt.ads,opt.dyn, opt.height, opt.distance)) |
|
|
|
if opt.job == 'clusadsorb': |
|
os.system('cmmde_xyz2poscar.rb {} > POSCAR'.format(opt.input)) |
|
os.system('cmmde_adsorbate.py -s POSCAR -ad {} -all true -dyn {} -height {} -d {}'.format(opt.ads,opt.dyn, opt.height, opt.distance)) |
|
|
|
if opt.job == 'poscar2xyz': |
|
os.system('cmmde_poscar2gen.rb {} > in.gen'.format(opt.input)) |
|
filename = opt.input.split('.')[0] |
|
os.system('cmmde_gen2xyz.rb in.gen > {}.xyz'.format(filename)) |
|
|
|
if opt.job == 'surfinfo': |
|
moveatoms = [] |
|
frozen = [] |
|
index = 0 |
|
with open(opt.input, 'r') as f: |
|
next(f) |
|
next(f) |
|
next(f) |
|
next(f) |
|
next(f) |
|
next(f) |
|
next(f) |
|
next(f) |
|
next(f) |
|
for line in f: |
|
arr = line.split() |
|
index += 1 |
|
if (arr[3] == "T" and arr[4] == "T" and arr[5] == "T"): |
|
moveatoms.append(index) |
|
else: |
|
frozen.append(index) |
|
print('Serial Atom-atom beku:') |
|
for i in frozen: |
|
print(i, end=' ') |
|
print('') |
|
print('Serial Atom-atom aktif:') |
|
for i in moveatoms: |
|
print(i, end=' ') |
|
print('') |
|
|
|
if opt.job == 'cluster': |
|
if (opt.type == "icosahedron"): |
|
struct = Icosahedron(opt.element,opt.layer, opt.lc) |
|
struct.write("{}_{}_{}.xyz".format(opt.element,opt.type,opt.layer)) |
|
if (opt.type == "decahedron"): |
|
struct = Decahedron(opt.element,opt.perpendicular,opt.parallel,0,opt.lc) |
|
struct.write("{}_{}_{}_{}.xyz".format(opt.element,opt.type,opt.parallel,opt.perpendicular)) |
|
if (opt.type == "tetrahedron"): |
|
struct = Tetrahedron(opt.element)
|
|
|