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.
225 lines
11 KiB
225 lines
11 KiB
import os |
|
from cmmde_hubbard import hubbard, azimuth |
|
def dcdftb(job,method,geom,charge,mult,dispersion,para_path,temp,pressure,ensembel,thermostat,deltat,step,mdprint,a1,a2,a3,b1,b2,b3,c1,c2,c3,restart,traject,velocity,dftbinp,softpot,softtype,softrange,softcenter,metarest,metafreq,metaheight,cvtype,metawidth,pow1,pow2,rcut,fesstart,fesend,fesbin,ag1,ag2,ag3,ag4,solvent,nroots,target,transmult,ocsstr,writetrans,lc,bufrad,delta,opttype,freqtype,econv,dconv): |
|
symb = [] |
|
x = [] |
|
y = [] |
|
z = [] |
|
with open(geom, 'r') as f: |
|
Natom = int(next(f).strip()) |
|
next(f) |
|
for line in f: |
|
arr = line.split() |
|
symb.append(arr[0]) |
|
x.append(arr[1]) |
|
y.append(arr[2]) |
|
z.append(arr[3]) |
|
# Menghitung jumlah atom |
|
|
|
elements = list(set(symb)) |
|
Numelements = len(elements) |
|
if 'TV' in elements: |
|
elements.remove('TV') |
|
Numelements = len(elements) |
|
with open("cmmd.in",'w') as f: |
|
if method == "DFTB2_gammah": |
|
print("DC=FALSE",file=f) |
|
print("SCC=(LC={} DAMPXH=TRUE DAMPXHZETA=4.5 ECONV={} DCONV={})".format(lc,econv,dconv), file=f) |
|
elif method == "DFTB2": |
|
print("DC=FALSE",file=f) |
|
print("SCC=(LC={} ECONV={} DCONV={})".format(lc, econv, dconv), file=f) |
|
elif method == "DFTB3": |
|
print("DC=FALSE",file=f) |
|
if dispersion != 'D3H5': |
|
print("SCC=(THIRDFULL=TRUE DAMPXH=TRUE DAMPXHZETA=4.0 LC={} ECONV={} DCONV={})".format(lc, econv, dconv),file=f) |
|
else: |
|
print("SCC=(THIRDFULL=TRUE DAMPXH=FALSE LC={} ECONV={} DCONV={})".format(lc, econv, dconv),file=f) |
|
|
|
elif method == "DFTB3-diag": |
|
print("DC=FALSE",file=f) |
|
print("SCC=(THIRDDIAG=TRUE DAMPXH=TRUE DAMPXHZETA=4.95 LC={} ECONV={} DCONV={})".format(lc, econv, dconv),file=f) |
|
elif method == "DCDFTB2_gammah": |
|
print("DC=(BUFRAD={} DELTARXYZ={})".format(bufrad,delta),file=f) |
|
print("SCC=(LC={} DAMPXH=TRUE DAMPXHZETA=4.5 ECONV={} DCONV={})".format(lc,econv,dconv), file=f) |
|
elif method == "DCDFTB2": |
|
print("DC=(BUFRAD={} DELTARXYZ={})".format(bufrad,delta),file=f) |
|
print("SCC=(LC={} ECONV={} DCONV={})".foramt(lc, econv, dconv),file=f) |
|
elif method == "DCDFTB3": |
|
print("DC=(BUFRAD={} DELTARXYZ={})".format(bufrad,delta),file=f) |
|
print("SCC=(THIRDFULL=TRUE DAMPXH=TRUE DAMPXHZETA=4.0 LC={} ECONV={} DCONV={})".format(lc, econv, dconv),file=f) |
|
elif method == "DCDFTB3-diag": |
|
print("DC=(BUFRAD={} DELTARXYZ={}))".format(bufrad,delta),file=f) |
|
print("SCC=(THIRDDIAG=TRUE DAMPXH=TRUE DAMPXHZETA=4.95 LC={} ECONV={} DCONV={})".format(lc, econv, dconv),file=f) |
|
# Mapping pelarut implisit |
|
gbsolventtype = { 'water': '1','acetonitril': '2','dimethylsulfoxide':'3','methanol':'4','chloroform':'5','dichloromethane':'6','benzene':'7','toluene':'8','acetone':'9','tetrahydrofuran':'10','diethylether':'11','carbondisulfide':'12','dimethylformamide':'13','hexane':'14','nitromethane':'15','furan':'16','dioxane':'17','ethylacetate':'18','phenol':'19','aniline':'20','benzaldehyde':'21','octanol':'23','dimethylacetamide':'26','ethanol':'25','formamide':'27','methylethylketone':'28'} |
|
if solvent != 'none': |
|
if job == 'td': |
|
if solvent == 'ethanol': gbsolventtype[solvent] = 4 |
|
print("SCC=(ALPB=TRUE GBSOLVENTTYPE={} GBPARAMTYPE=7)".format(gbsolventtype[solvent]),file=f) |
|
print("SCC=(SA=TRUE GBSAHBOND=TRUE)",file=f) |
|
else: |
|
print("SCC=(ALPB=TRUE GBSOLVENTTYPE={} GBPARAMTYPE=4)".format(gbsolventtype[solvent]),file=f) |
|
print("SCC=(SA=TRUE GBSAHBOND=TRUE)",file=f) |
|
if job == 'td': |
|
print("TD = (NSTATE={} TARGETSTATE={} MULT={} OSCSTR={} WRITETRANSITION = {})".format(nroots,target,transmult,ocsstr,writetrans),file=f) |
|
if dispersion == "D3": |
|
print("DISPERSION=(DISPTYPE=4)",file=f) |
|
elif dispersion == "D2": |
|
print("DISPERSION=(DISPTYPE=1)",file=f) |
|
elif dispersion == "SK": |
|
print("DISPERSION=(DISPTYPE=2)",file=f) |
|
elif dispersion == "LJ": |
|
print("DISPERSION=(DISPTYPE=3)",file=f) |
|
elif dispersion == "D3": |
|
print("DISPERSION=(DISPTYPE=4)",file=f) |
|
elif dispersion == "D3BJ": |
|
print("DISPERSION=(DISPTYPE=5)",file=f) |
|
elif dispersion == "D3H4": |
|
print("DISPERSION=(DISPTYPE=6)",file=f) |
|
elif dispersion == "DFTulg": |
|
print("DISPERSION=(DISPTYPE=7)",file=f) |
|
elif dispersion == "dDMC": |
|
print("DISPERSION=(DISPTYPE=8)",file=f) |
|
elif dispersion == "D3H5": |
|
print("DISPERSION=(DISPTYPE=9)",file=f) |
|
elif dispersion == "kubilius": |
|
print("DISPERSION=(DISPTYPE=10)",file=f) |
|
elif dispersion == "goursot": |
|
print("DISPERSION=(DISPTYPE=11)",file=f) |
|
elif dispersion == "vdwts": |
|
print("DISPERSION=(DISPTYPE=12)",file=f) |
|
elif dispersion == "manybody": |
|
print("DISPERSION=(DISPTYPE=13)",file=f) |
|
elif dispersion == "D4": |
|
print("DISPERSION=(DISPTYPE=14)",file=f) |
|
|
|
if "opt" in job: |
|
opt_type={'bfgs':'1','sd':'2','cg':'3','qm':'4','fire':'5'} |
|
print("OPT=(MAXITER=1000 OPTTYPE={})".format(opt_type[opttype]),file=f) |
|
if "freq" in job: |
|
print("FREQ=(THERMOTEMP={} THERMOPRES={} FREQTYPE={})".format(temp,pressure,freqtype),file=f) |
|
if ensembel == 'NVE': |
|
nvt = 'FALSE' |
|
elif ensembel == 'NVT': |
|
nvt = 'TRUE' |
|
if thermostat == 'nose': |
|
thermo = 3 |
|
elif thermostat == 'berendsen': |
|
thermo = 4 |
|
elif thermostat == 'andersen': |
|
thermo = 5 |
|
if job == "md": |
|
if ensembel == 'NVT': |
|
nvt = 'TRUE' |
|
else: |
|
nvt = 'FALSE' |
|
print('MD=(NVT={} NVTTYPE={} BATHTEMP={} ERRORTEMP=100)'.format(nvt,thermo,temp),file=f) |
|
print('MD=(DELTAT={} NSTEP={} PRINT={})'.format(deltat*1e-15,step,mdprint),file=f) |
|
if softpot == 'true': |
|
print('MD=(SOFT=TRUE SOFTSHAPETYPE={} SOFTRANGE={} SOFTCENTERTYPE={})'.format(softtype,softrange,softcenter)) |
|
if restart == 'true': |
|
print('MD=(READVELOCITY=TRUE)',file=f) |
|
if job == "mtd": |
|
if ensembel == 'NVT': |
|
nvt = 'TRUE' |
|
else: |
|
nvt = 'FALSE' |
|
if metarest == 'false': |
|
metarest = 'FALSE' |
|
else: |
|
metarest = 'TRUE' |
|
print('MD=(NVT={} NVTTYPE={} BATHTEMP={} ERRORTEMP=100)'.format(nvt,thermo,temp),file=f) |
|
print('MD=(DELTAT={} NSTEP={} PRINT={})'.format(deltat*1e-15,step,mdprint),file=f) |
|
print('MD=(METADYNAMICS=TRUE METARESTART={} METAPRINTFES=TRUE METAFREQ={} METAHEIGHT={})'.format(metarest,metafreq,metaheight),file=f) |
|
if softpot == 'true': |
|
print('MD=(SOFT=TRUE SOFTSHAPETYPE={} SOFTRANGE={} SOFTCENTERTYPE={})'.format(softtype,softrange,softcenter),file=f) |
|
if restart == 'true': |
|
print('MD=(READVELOCITY=TRUE)',file=f) |
|
|
|
with open('metacv.dat','w') as fcv: |
|
atomgroup1 = ag1.split() |
|
atomgroup2 = ag2.split() |
|
nag1 = len(atomgroup1) |
|
nag2 = len(atomgroup2) |
|
if cvtype == 'coordnum': |
|
print("""RATIONALCOORDINATIONNUMBER {} {} {} {} {} {} LABELS AVERAGE {} {} {} |
|
{} |
|
{} |
|
""".format(metawidth,nag1,nag2,pow1,pow2,rcut,fesstart,fesend,fesbin,ag1,ag2),file=fcv) |
|
if cvtype == 'distance': |
|
print("BONDDISTANCE {} {} {} {} {} {}".format(metawidth,ag1,ag2,fesstart,fesend,fesbin),file=fcv) |
|
if cvtype == 'angle': |
|
print("BONDANGLE {} {} {} {} {} {} {}".format(metawidth,ag1,ag2,ag3,fesstart,fesend,fesbin),file=fcv) |
|
if cvtype == 'dihedral': |
|
print("BONDDIHEDRAL {} {} {} {} {} {} {} {}".format(metawidth,ag1,ag2,ag3,ag4,fesstart,fesend,fesbin), file=fcv) |
|
if cvtype == 'distancediff': |
|
print("BONDDISTANCEDIFFERENCE {} {} {} {} {} {} {} {}".format(metawidth,ag1,ag2,ag3,ag4,fesstart,fesend,fesbin),file=fcv) |
|
if cvtype == 'distanceadd': |
|
print("BONDDISTANCEADDITION {} {} {} {} {} {} {} {}".format(metawidth,ag1,ag2,ag3,ag4,fesstart,fesend,fesbin),file=fcv) |
|
if cvtype == 'meandistance': |
|
print("""MEANDISTANCE {} {} {} {} LABELS {} {} {} |
|
{} |
|
{} |
|
""".format(metawidth,nag1,nag2,pow1,fesstart,fesend,fesbin,ag1,ag2),file=fcv) |
|
if cvtype == 'pointplanedistance': |
|
print("ATOMPOINTPLANCEDISTANCE {} {} {} {} {}".format(metawidth,ag1,ag2,ag3,ag4),file=fcv) |
|
|
|
print("",file=f) |
|
print("DCDFTB input generated from CMMDE code",file=f) |
|
print("",file=f) |
|
print(Numelements,file=f) |
|
# Pemetaan turunan Hubbard untuk atom-atom tertentu: |
|
for element in elements: |
|
if method == 'DFTB2' or method == 'DCDFTB2' or method == 'DFTB3-diag' or method == 'DCDFTB3-diag' or method == 'DFTB2_gammah' or method == 'DCDFTB2_gammah': |
|
print(element,azimuth(element),file=f) |
|
elif method == 'DFTB3' or method == 'DCDFTB3' or method == 'DCDFTB3-diag': |
|
print(element,azimuth(element),hubbard(element),file=f) |
|
|
|
ind = 0 |
|
for element2 in elements: |
|
os.system("cp {}/{}-{}.skf .".format(para_path,element,element2)) |
|
if ind < len(elements): |
|
print(element+'-'+element2+'.skf',end=' ',file=f) |
|
ind+=1 |
|
if ind == len(elements): |
|
print(' ',file=f) |
|
print("",file=f) |
|
print("{} {} {}".format(Natom,charge,mult),file=f) |
|
if restart == 'false': |
|
for symb, x, y, z in zip(symb,x,y,z): |
|
print("{} {} {} {}".format(symb,x,y,z), file=f) |
|
else: |
|
with open(traject, 'r') as ftraj: |
|
lines = ftraj.readlines() |
|
coords = [] |
|
for i in range(-Natom,0): |
|
coords.append(lines[i].strip('\n')) |
|
with open(velocity,'r') as fvel: |
|
lines = fvel.readlines() |
|
velocities = [] |
|
for i in range(-Natom,0): |
|
velocities.append(lines[i].strip('\n')) |
|
with open('veloc.dat','w') as fveloc: |
|
for i in velocities: |
|
print(i[3:], file=fveloc) |
|
|
|
with open(dftbinp, 'r') as inp: |
|
latt_info = [] |
|
for line in inp: |
|
if 'TV' in line: |
|
arr = line.strip('\n') |
|
latt_info.append(arr) |
|
|
|
for i in coords: |
|
print(i, file=f) |
|
for i in latt_info: |
|
print(i, file=f) |
|
|
|
if a1 != 0: |
|
print("""TV {} {} {} |
|
TV {} {} {} |
|
TV {} {} {}""".format(a1,a2,a3,b1,b2,b3,c1,c2,c3),file=f) |
|
print(" ",file=f) |
|
|
|
|
|
|
|
|