def dr(traj='poscar.gen', batch_size=1, nn=False): ffield = 'ffield.json' if nn else 'ffield' atoms = read(traj) e, ei = [], [] ir = IRFF(atoms=atoms, libfile=ffield, nn=False, bo_layer=[8, 4]) ir.get_potential_energy(atoms)
def g(gen='poscar.gen'): atoms = read(gen) ir = IRFF(atoms=atoms, libfile='ffield.json', nn=True, autograd=True) ir.calculate(atoms) print(ir.grad) ir_ = IRFF_TF(atoms=atoms, libfile='ffield.json', nn=True) ir_.calculate(atoms) print(ir_.grad.numpy())
def md(gen='poscar.gen', index=0, totstep=100): atoms = read(gen, index=index) atoms.calc = IRFF(atoms=atoms, libfile='ffield.json', rcut=None, nn=True) # dyn = BFGS(atoms) dyn = VelocityVerlet(atoms, 0.1 * units.fs) # 5 fs time step. def printenergy(a=atoms): """Function to print the potential, kinetic and total energy""" natom = len(a) epot = a.get_potential_energy() / natom ekin = a.get_kinetic_energy() / natom T = ekin / (1.5 * units.kB) try: assert T <= 8000.0, 'Temperature goes too high!' except: print('Temperature goes too high, stop at step %d.' % dyn.nsteps) dyn.max_steps = dyn.nsteps - 1 # print(a.get_forces()) print('Energy per atom: Epot = %.3feV Ekin = %.3feV (T=%3.0fK) ' 'Etot = %.3feV' % (epot, ekin, T, epot + ekin)) traj = Trajectory('md.traj', 'w', atoms) dyn = VelocityVerlet(atoms, 0.1 * units.fs) # 5 fs time step. dyn.attach(printenergy, interval=1) dyn.attach(traj.write, interval=1) dyn.run(totstep)
def dt(traj='siesta.traj', batch_size=1, nn=True, frame=0): ffield = 'ffield.json' if nn else 'ffield' images = Trajectory(traj) atoms = images[frame] his = TrajectoryWriter('tmp.traj', mode='w') his.write(atoms=atoms) his.close() from irff.irff import IRFF ir = IRFF(atoms=atoms, libfile=ffield, nn=nn) ir.get_potential_energy(atoms) eb = ir.Ebond.numpy() et = ir.etor.numpy() ef = ir.efcon.numpy() f10 = ir.f_10.numpy() f11 = ir.f_11.numpy() sijk = ir.s_ijk.numpy() sjkl = ir.s_jkl.numpy() f = ir.fijkl.numpy() v1 = ir.v1.numpy() v2 = ir.v2.numpy() v3 = ir.v3.numpy() expv2 = ir.expv2.numpy() boij = ir.botij.numpy() bojk = ir.botjk.numpy() bokl = ir.botkl.numpy() cosw = ir.cos_w.numpy() cos2w = ir.cos2w.numpy() w = ir.w.numpy() Etor = ir.Etor.numpy() del IRFF from irff.reax import ReaxFF rn = ReaxFF(libfile=ffield, direcs={'tmp': 'tmp.traj'}, dft='siesta', opt=[], optword='nocoul', batch_size=batch_size, atomic=True, clip_op=False, InitCheck=False, nn=nn, bo_layer=[9, 2], pkl=False, to_train=False) molecules = rn.initialize() # rn.calculate(rn.p,rn.m) rn.session(learning_rate=3.0 - 4, method='AdamOptimizer') mol = 'tmp' torlab = rn.lk.torlab tors = [] for tor in ir.tors: tors.append(list(tor)) print(tor) eb_ = rn.get_value(rn.ebond[mol]) et_ = rn.get_value(rn.ETOR) ef_ = rn.get_value(rn.Efcon) f10_ = rn.get_value(rn.f_10) f11_ = rn.get_value(rn.f_11) sijk_ = rn.get_value(rn.s_ijk) sjkl_ = rn.get_value(rn.s_jkl) f_ = rn.get_value(rn.fijkl) boij_ = rn.get_value(rn.BOtij) bojk_ = rn.get_value(rn.BOtjk) bokl_ = rn.get_value(rn.BOtkl) v1_ = rn.get_value(rn.v1) v2_ = rn.get_value(rn.v2) v3_ = rn.get_value(rn.v3) expv2_ = rn.get_value(rn.expv2) cosw_ = rn.get_value(rn.cos_w) cos2w_ = rn.get_value(rn.cos2w) w_ = rn.get_value(rn.w) for tor in rn.tors: for a_ in range(rn.ntor[tor]): a = torlab[tor][a_][1:] if a not in tors: a.reverse() i, j, k, l = a if a in tors: ai = tors.index(a) # if abs(et_[tor][a_][0]-et[ai])>0.0001: print( '- %2d%s-%2d%s-%2d%s-%2d%s:' % (i, ir.atom_name[i], j, ir.atom_name[j], k, ir.atom_name[k], l, ir.atom_name[l]), 'etor: %10.8f %10.8f' % (et_[tor][a_][0], et[ai]), 'sijk: %10.8f %10.8f' % (sijk_[tor][a_][0], sijk[ai]), 'sjkl: %10.8f %10.8f' % (sjkl_[tor][a_][0], sjkl[ai]), 'boij: %10.8f %10.8f' % (boij_[tor][a_][0], boij[ai]), 'bojk: %10.8f %10.8f' % (bojk_[tor][a_][0], bojk[ai]), 'bokl: %10.8f %10.8f' % (bokl_[tor][a_][0], bokl[ai]), 'fijkl: %10.8f %10.8f' % (f_[tor][a_][0], f[ai]), 'v1: %10.8f %10.8f' % (v1_[tor][a_][0], v1[ai]), 'v2: %10.8f %10.8f' % (v2_[tor][a_][0], v2[ai]), 'v3: %10.8f %10.8f' % (v3_[tor][a_][0], v3[ai]), 'expv2: %10.8f %10.8f' % (expv2_[tor][a_][0], expv2[ai]), 'ptor1: %10.8f %10.8f' % (rn.p_['tor1_' + tor], ir.P['tor1'][ai]), # 'cosw: %10.8f %10.8f' %(cosw_[tor][a_][0],cosw[ai]), # 'cos2w: %10.8f %10.8f' %(cos2w_[tor][a_][0],cos2w[ai]), # 'v1: %10.8f %10.8f' %(0.5*rn.p_['V1_'+tor]*(1.0+cosw_[tor][a_][0]), # 0.5*ir.P['V1'][ai]*(1.0+cosw[ai])), # 'w: %10.8f %10.8f' %(w_[tor][a_][0],w[ai]), # 'efcon: %10.8f %10.8f' %(ef_[tor][a_][0],ef[ai]), # 'f_10: %10.8f %10.8f' %(f10_[tor][a_][0],f10[ai]), # 'f_11: %10.8f %10.8f' %(f11_[tor][a_][0],f11[ai]), ) Etor_ = rn.get_value(rn.etor) print('\n- torsion energy:', Etor, Etor_[mol][0], end='\n') print('\n- Bond energy:', eb, eb_, end='\n') del ReaxFF
def da(traj='siesta.traj', batch_size=1, nn=False, frame=0): ffield = 'ffield.json' if nn else 'ffield' images = Trajectory(traj) atoms = images[frame] his = TrajectoryWriter('tmp.traj', mode='w') his.write(atoms=atoms) his.close() ir = IRFF(atoms=atoms, libfile=ffield, nn=False, bo_layer=[8, 4]) ir.get_potential_energy(atoms) rn = ReaxFF(libfile=ffield, direcs={'tmp': 'tmp.traj'}, dft='siesta', opt=[], optword='nocoul', batch_size=batch_size, atomic=True, clip_op=False, InitCheck=False, nn=nn, pkl=False, to_train=False) molecules = rn.initialize() rn.session(learning_rate=1.0e-10, method='AdamOptimizer') mol = 'tmp' anglab = rn.lk.anglab angs = [] for ang in ir.angs: angs.append(list(ang)) ea_ = rn.get_value(rn.EANG) ea = ir.eang.numpy() f7_ = rn.get_value(rn.f_7) f7 = ir.f_7.numpy() f8_ = rn.get_value(rn.f_8) f8 = ir.f_8.numpy() expang_ = rn.get_value(rn.expang) expang = ir.expang.numpy() expaij_ = rn.get_value(rn.expaij) expaij = ir.expaij.numpy() expajk_ = rn.get_value(rn.expajk) expajk = ir.expajk.numpy() theta_ = rn.get_value(rn.theta) theta = ir.theta.numpy() theta0_ = rn.get_value(rn.theta0) theta0 = ir.thet0.numpy() sbo3_ = rn.get_value(rn.SBO3) sbo3 = ir.SBO3.numpy() fa = open('ang.txt', 'w') for ang in rn.angs: for a_ in range(rn.nang[ang]): a = anglab[ang][a_][1:] if a not in angs: a.reverse() i, j, k = a if a in angs: ai = angs.index(a) print('- %2d%s-%2d%s-%2d%s:' % (i, ir.atom_name[i], j, ir.atom_name[j], k, ir.atom_name[k]), 'eang: %10.8f %10.8f' % (ea_[ang][a_][0], ea[ai]), 'f7: %10.8f %10.8f' % (f7_[ang][a_][0], f7[ai]), 'f8: %10.8f %10.8f' % (f8_[ang][a_][0], f8[ai]), 'expang: %10.8f %10.8f' % (expang_[ang][a_][0], expang[ai]), 'expaij: %10.8f %10.8f' % (expaij_[ang][a_][0], expaij[ai]), 'expajk: %10.8f %10.8f' % (expajk_[ang][a_][0], expajk[ai]), 'theta: %10.8f %10.8f' % (theta_[ang][a_][0], theta[ai]), 'sbo3: %10.8f %10.8f' % (sbo3_[ang][a_][0], sbo3[ai]), 'theta0: %10.8f %10.8f' % (theta0_[ang][a_][0], theta0[ai]), file=fa) else: print( '- %2d%s-%2d%s-%2d%s:' % (i, ir.atom_name[i], j, ir.atom_name[j], k, ir.atom_name[k]), 'eang: %10.8f' % (ea_[ang][a_][0]), 'f7: %10.8f' % (f7_[ang][a_][0]), 'f8: %10.8f' % (f8_[ang][a_][0]), 'expang: %10.8f' % (expang_[ang][a_][0]), 'expang: %10.8f' % (expang_[ang][a_][0]), 'expaij: %10.8f' % (expaij_[ang][a_][0]), 'expajk: %10.8f' % (expajk_[ang][a_][0]), 'theta: %10.8f' % (theta_[ang][a_][0]), 'sbo3: %10.8f' % (sbo3_[ang][a_][0]), 'theta0: %10.8f' % (theta0_[ang][a_][0])) fa.close() print('\n- angel energy:', ir.Eang.numpy(), rn.eang[mol].numpy()[0], end='\n')
def dl(traj='siesta.traj', batch_size=1, nn=False, frame=0): ffield = 'ffield.json' if nn else 'ffield' images = Trajectory(traj) atoms = images[frame] his = TrajectoryWriter('tmp.traj', mode='w') his.write(atoms=atoms) his.close() ir = IRFF(atoms=atoms, libfile=ffield, nn=False, bo_layer=[8, 4]) ir.get_potential_energy(atoms) el = ir.elone.numpy() Dle = ir.Delta_e.numpy() Dlp = ir.Delta_lp.numpy() de = ir.DE.numpy() nlp = ir.nlp.numpy() elp = ir.explp.numpy() eu = ir.eunder.numpy() eu1 = ir.eu1.numpy() eu2 = ir.eu2.numpy() eu3 = ir.expeu3.numpy() rn = ReaxFF(libfile=ffield, direcs={'tmp': 'tmp.traj'}, dft='siesta', opt=[], optword='nocoul', batch_size=batch_size, atomic=True, clip_op=False, InitCheck=False, nn=nn, pkl=False, to_train=False) molecules = rn.initialize() rn.session(learning_rate=1.0e-10, method='AdamOptimizer') mol = 'tmp' el_ = rn.get_value(rn.EL) Dle_ = rn.get_value(rn.Delta_e) Dlp_ = rn.get_value(rn.Delta_lp) de_ = rn.get_value(rn.DE) nlp_ = rn.get_value(rn.nlp) elp_ = rn.get_value(rn.explp) eu_ = rn.get_value(rn.EUN) eu1_ = rn.get_value(rn.eu1) eu2_ = rn.get_value(rn.eu2) eu3_ = rn.get_value(rn.expeu3) alab = rn.lk.atlab bosi = ir.bosi.numpy() for i in range(ir.natom): a = ir.atom_name[i] al = [mol, i] na = alab[a].index(al) print( '- %d %s:' % (i, ir.atom_name[i]), 'elone: %10.8f %10.8f' % (el_[a][na], el[i]), # 'Delta_e: %10.8f %10.8f' %(Dle_[a][na],Dle[i]), # 'Delta_lp: %10.8f %10.8f' %(Dlp_[a][na],Dlp[i]), # 'nlp: %10.8f %10.8f' %(nlp_[a][na],nlp[i]), 'eunder: %10.8f %10.8f' % (eu_[a][na], eu[i]), # 'eu1: %10.8f %10.8f' %(eu1_[a][na],eu1[i]), 'eu2: %10.8f %10.8f' % (eu2_[a][na], eu2[i]), 'eu3: %10.8f %10.8f' % (eu3_[a][na], eu3[i])) print('\n- under energy:', ir.Eunder.numpy(), rn.eunder[mol].numpy()[0], end='\n')
def e(traj='siesta.traj', batch_size=50, nn=True): ffield = 'ffield.json' if nn else 'ffield' images = Trajectory(traj) e = [] eb, el, eo, eu = [], [], [], [] ea, ep, etc = [], [], [] et, ef = [], [] ev, eh, ec = [], [], [] from irff.irff import IRFF ir = IRFF(atoms=images[0], libfile=ffield, nn=nn) for i, atoms in enumerate(images): ir.get_potential_energy(atoms) e.append(ir.E.numpy()) eb.append(ir.Ebond.numpy()) el.append(ir.Elone.numpy()) eo.append(ir.Eover.numpy()) eu.append(ir.Eunder.numpy()) ea.append(ir.Eang.numpy()) ep.append(ir.Epen.numpy()) et.append(ir.Etor.numpy()) ef.append(ir.Efcon.numpy()) etc.append(ir.Etcon.numpy()) ev.append(ir.Evdw.numpy()) eh.append(ir.Ehb.numpy()) ec.append(ir.Ecoul.numpy()) from irff.mpnn import MPNN rn = MPNN(libfile=ffield, direcs={'tmp': traj}, dft='siesta', opt=[], optword='nocoul', batch_size=batch_size, atomic=True, clip_op=False, InitCheck=False, nn=nn, bo_layer=[9, 2], pkl=False) molecules = rn.initialize() rn.session(learning_rate=1.0e-10, method='AdamOptimizer') mol = 'tmp' e_ = rn.get_value(rn.E[mol]) eb_ = rn.get_value(rn.ebond[mol]) el_ = rn.get_value(rn.elone[mol]) eu_ = rn.get_value(rn.eunder[mol]) eo_ = rn.get_value(rn.eover[mol]) ea_ = rn.get_value(rn.eang[mol]) ep_ = rn.get_value(rn.epen[mol]) etc_ = rn.get_value(rn.tconj[mol]) et_ = rn.get_value(rn.etor[mol]) ef_ = rn.get_value(rn.efcon[mol]) ev_ = rn.get_value(rn.evdw[mol]) ec_ = rn.get_value(rn.ecoul[mol]) eh_ = rn.get_value(rn.ehb[mol]) e_reax = { 'Energy': e, 'Ebond': eb, 'Eunger': eu, 'Eover': eo, 'Eang': ea, 'Epen': ep, 'Elone': el, 'Etcon': etc, 'Etor': et, 'Efcon': ef, 'Evdw': ev, 'Ecoul': ec, 'Ehbond': eh } e_irff = { 'Energy': e_, 'Ebond': eb_, 'Eunger': eu_, 'Eover': eo_, 'Eang': ea_, 'Epen': ep_, 'Elone': el_, 'Etcon': etc_, 'Etor': et_, 'Efcon': ef_, 'Evdw': ev_, 'Ecoul': ec_, 'Ehbond': eh_ } for key in e_reax: plt.figure() plt.ylabel('%s (eV)' % key) plt.xlabel('Step') plt.plot(e_reax[key], alpha=0.01, linestyle='-.', marker='o', markerfacecolor='none', markeredgewidth=1, markeredgecolor='b', markersize=4, color='blue', label='ReaxFF') plt.plot(e_irff[key], alpha=0.01, linestyle=':', marker='^', markerfacecolor='none', markeredgewidth=1, markeredgecolor='red', markersize=4, color='red', label='IRFF') plt.legend(loc='best', edgecolor='yellowgreen') # lower left upper right plt.savefig('%s.eps' % key) plt.close()
def db(gen='C3H7O1-0.traj', batch_size=50, nn=True, frame=7): ffield = 'ffield.json' if nn else 'ffield' # atoms = read(gen,index=1) images = Trajectory(gen) atoms = images[frame] # his = TrajectoryWriter('tmp.traj',mode='w') # calc = SinglePointCalculator(atoms,energy=0.0,free_energy=0.0) # atoms.set_calculator(calc) # his.write(atoms=atoms) # his.close() from irff.irff import IRFF e, ei = [], [] ir = IRFF(atoms=atoms, libfile=ffield, nn=nn) ir.get_potential_energy(atoms) ei.append(ir.Ebond) ebond = ir.ebond.numpy() from irff.mpnn import MPNN rn = MPNN(libfile=ffield, direcs={'tmp': gen}, dft='siesta', opt=[], optword='nocoul', batch_size=batch_size, atomic=True, clip_op=False, InitCheck=False, nn=nn, bo_layer=[9, 2], pkl=False) molecules = rn.initialize() rn.session(learning_rate=1.0e-10, method='AdamOptimizer') mol = 'tmp' er = rn.get_value(rn.ebond[mol]) blab = rn.lk.bdlab bosi = ir.bosi.numpy() bopsi = ir.bop_si.numpy() boppi = ir.bop_pi.numpy() boppp = ir.bop_pp.numpy() bopow3 = ir.bopow3.numpy() eterm3 = ir.eterm3.numpy() bop = ir.bop.numpy() bo = ir.bo0.numpy() eterm1 = ir.eterm1.numpy() bopow1 = ir.bopow1.numpy() bodiv1 = ir.bodiv1.numpy() r = ir.r.numpy() # F = ir.F.numpy() # Fi = ir.Fi.numpy() # Fj = ir.Fj.numpy() D_ = rn.get_value(rn.Deltap) D = ir.Deltap.numpy() for bd in rn.bonds: for nb in range(rn.nbd[bd]): ebd = rn.get_value(rn.EBD[bd]) mol_, i, j = blab[bd][nb] bosi_ = rn.get_value(rn.bosi[bd]) bopsi_ = rn.get_value(rn.bop_si[bd]) boppi_ = rn.get_value(rn.bop_pi[bd]) boppp_ = rn.get_value(rn.bop_pp[bd]) bopow3_ = rn.get_value(rn.bopow3[bd]) eterm3_ = rn.get_value(rn.eterm3[bd]) bop_ = rn.get_value(rn.bop[bd]) bo_ = rn.get_value(rn.bo0[bd]) eterm1_ = rn.get_value(rn.eterm1[bd]) bopow1_ = rn.get_value(rn.bopow1[bd]) bodiv1_ = rn.get_value(rn.bodiv1[bd]) rbd = rn.get_value(rn.rbd[bd]) # if abs(bo_[nb][0]-bo[i][j])>0.00001: print( '- %s %2d %2d:' % (bd, i, j), 'rbd %10.7f %10.7f' % (rbd[nb][frame], r[i][j]), 'bop %10.7f %10.7f' % (bop_[nb][frame], bop[i][j]), 'Di %10.7f %10.7f' % (D_[i][frame], D[i]), 'Dj %10.7f %10.7f' % (D_[j][frame], D[j]), 'bo %10.7f %10.7f' % (bo_[nb][frame], bo[i][j]), # 'F %10.7f %10.7f' %(F_[nb][0],F[i][j]), # 'Fi %10.7f %10.7f' %(Fi_[nb][0],Fi[i][j]), # 'Fj %10.7f %10.7f' %(Fj_[nb][0],Fj[i][j]), 'ebond %10.7f %10.7f' % (ebd[nb][frame], ebond[i][j])) rcbo = rn.get_value(rn.rc_bo) eb = rn.get_value(rn.ebond[mol]) # print(rcbo) print('\n- bond energy:', ir.Ebond.numpy(), eb[frame], end='\n')
def e(traj='md.traj', nn=True): ffield = 'ffield.json' if nn else 'ffield' images = Trajectory(traj) atoms = images[0] e, e_ = [], [] eb, el, eo, eu = [], [], [], [] ea, ep, etc = [], [], [] et, ef = [], [] ev, eh, ec = [], [], [] eb_, el_, eo_, eu_ = [], [], [], [] ea_, ep_, etc_ = [], [], [] et_, ef_ = [], [] ev_, eh_, ec_ = [], [], [] ir = IRFF(atoms=atoms, libfile=ffield, nn=nn, autograd=False) for i, atoms in enumerate(images): ir.calculate(atoms) e.append(ir.E) eb.append(ir.Ebond.numpy()) el.append(ir.Elone.numpy()) eo.append(ir.Eover.numpy()) eu.append(ir.Eunder.numpy()) ea.append(ir.Eang.numpy()) ep.append(ir.Epen.numpy()) et.append(ir.Etor.numpy()) ef.append(ir.Efcon.numpy()) etc.append(ir.Etcon.numpy()) ev.append(ir.Evdw.numpy()) eh.append(ir.Ehb.numpy()) ec.append(ir.Ecoul.numpy()) ir_ = IRFF_NP(atoms=atoms, libfile=ffield, nn=nn) for i, atoms in enumerate(images): ir_.calculate(atoms) e_.append(ir_.E) eb_.append(ir_.Ebond) el_.append(ir_.Elone) eo_.append(ir_.Eover) eu_.append(ir_.Eunder) ea_.append(ir_.Eang) ep_.append(ir_.Epen) et_.append(ir_.Etor) ef_.append(ir_.Efcon) etc_.append(ir_.Etcon) ev_.append(ir_.Evdw) eh_.append(ir_.Ehb) ec_.append(ir_.Ecoul) e_irffnp = { 'Energy': e, 'Ebond': eb, 'Eunger': eu, 'Eover': eo, 'Eang': ea, 'Epen': ep, 'Elone': el, 'Etcon': etc, 'Etor': et, 'Efcon': ef, 'Evdw': ev, 'Ecoul': ec, 'Ehbond': eh } e_irff = { 'Energy': e_, 'Ebond': eb_, 'Eunger': eu_, 'Eover': eo_, 'Eang': ea_, 'Epen': ep_, 'Elone': el_, 'Etcon': etc_, 'Etor': et_, 'Efcon': ef_, 'Evdw': ev_, 'Ecoul': ec_, 'Ehbond': eh_ } for key in e_irffnp: plt.figure() plt.ylabel('%s (eV)' % key) plt.xlabel('Step') plt.plot(e_irffnp[key], alpha=0.01, linestyle='-.', marker='o', markerfacecolor='none', markeredgewidth=1, markeredgecolor='b', markersize=4, color='blue', label='IRFF_NP') plt.plot(e_irff[key], alpha=0.01, linestyle=':', marker='^', markerfacecolor='none', markeredgewidth=1, markeredgecolor='red', markersize=4, color='red', label='IRFF') plt.legend(loc='best', edgecolor='yellowgreen') # lower left upper right plt.savefig('%s.eps' % key) plt.close()
def BDE(traj='c2h6-CC.traj', iatom=0, jatom=3): images = Trajectory(traj) e, ei, ei_, ebud, d_irff, eg, erdx, d_reax = [], [], [], [], [], [], [], [] ir_mpnn = IRFF(atoms=images[0], libfile='ffield.json', nn=True) # ir_mat = IRFF(atoms=images[0],libfile='ffield.reax.mattsson',nn=False) ir_reax = IRFF(atoms=images[0], libfile='ffield', nn=False) r, v = [], [] for i, atoms in enumerate(images): if i % 2 != 0: continue emp = ir_mpnn.get_potential_energy(atoms) r_ = ir_mpnn.r[iatom][jatom].detach().numpy() # if r_>1.7: # continue e.append(atoms.get_potential_energy()) ei.append(emp) ei_.append(ir_reax.get_potential_energy(atoms)) eg.append(get_gulp_energy(atoms, lib='reax_mat')) ebud.append(get_gulp_energy(atoms, lib='reax_bud')) # erdx.append(get_gulp_energy(atoms,lib='reax_rdx')) d_irff.append(abs(e[-1] - ei[-1])) d_reax.append(abs(e[-1] - ei_[-1])) v.append(atoms.get_volume()) r.append(r_) print(' * energy: ', e[-1], ei[-1], ei_[-1], d_irff[-1], ' radius: ', r[-1]) # stress = atoms.get_stress() # print(stress) print(' * mean difference: ', np.mean(d_irff), np.mean(d_reax)) e_min = min(e) e_max = max(e) e = np.array(e) - e_min ei = np.array(ei) - min(ei) ei_ = np.array(ei_) - min(ei_) ebud = np.array(ebud) - min(ebud) eg = np.array(eg) - min(eg) # erdx = np.array(erdx) - min(erdx) plt.figure() plt.ylabel(r'$Energy$ ($eV$)') plt.xlabel(r'$Radius$ ($\AA$)') # plt.xlim(0,i) # plt.ylim(0,np.max(hist)+0.01) plt.plot(r, ei, alpha=0.9, linestyle='-', marker='o', markerfacecolor='none', markeredgecolor='k', markersize=5, color='k', label='IRFF(MPNN)') plt.plot(r, e, alpha=0.9, linestyle='-', marker='s', markerfacecolor='none', markeredgecolor='r', markersize=5, color='r', label='DFT(SIESTA)') plt.plot(r, ei_, alpha=0.9, linestyle='-', marker='^', markerfacecolor='none', markeredgecolor='b', markersize=5, color='b', label='ReaxFF(trained)') plt.plot(r, ebud, alpha=0.9, linestyle='-', marker='+', markerfacecolor='none', markeredgecolor='g', markersize=5, color='g', label='ReaxFF(Thompson)') plt.plot(r, eg, alpha=0.9, linestyle='-', marker='v', markerfacecolor='none', markeredgecolor='mediumslateblue', markersize=5, color='mediumslateblue', label='ReaxFF(Mattsson)') # plt.plot(r,eg,alpha=0.9, # linestyle='-',marker='d',markerfacecolor='none',markeredgecolor='steelblue', # markersize=5, # color='steelblue',label='ReaxFF(RDX)') err = np.abs(ei - e) err_ = np.abs(ei_ - e) plt.fill_between(r, e - err, e + err, color='darkorange', alpha=0.2) plt.fill_between( r, e - err_, e + err_, color='palegreen', # palegreen alpha=0.2) plt.text(0.0, e_max, '%.3f ' % e_min, fontdict={ 'size': 10.5, 'color': 'k' }) plt.legend(loc='best', edgecolor='yellowgreen') # lower left upper right plt.savefig('Energy.svg', transparent=True) plt.close()
#!/usr/bin/env python from ase.io import read from ase.units import kJ # ,GPa from ase.eos import EquationOfState from ase.optimize import BFGS, FIRE from irff.md import opt from irff.irff import IRFF from ase.io.trajectory import Trajectory import matplotlib.pyplot as plt images = Trajectory('pre_opt.traj', mode='r') ir = IRFF(atoms=images[0], libfile='ffield.json', rcut=None, nn=True) GPa = 1.60217662 * 1.0e2 v_, p = [], [] v0 = images[0].get_volume() for atoms_ in images: ir.calculate(atoms=atoms_, CalStress=True) stress = ir.results['stress'] nonzero = 0 stre_ = 0.0 for _ in range(3): if abs(stress[_]) > 0.0000001: nonzero += 1 stre_ += -stress[_] pressure = stre_ * GPa / nonzero p.append(pressure)
def e(traj='eos_dft.traj', batch_size=100): images = Trajectory(traj) e, ei, ei_, diff = [], [], [], [] ir_mpnn = IRFF(atoms=images[0], libfile='ffield.json', nn=True) ir_mpnn.get_potential_energy(images[0]) ir_reax = IRFF(atoms=images[0], libfile='ffield', nn=False) ir_reax.get_potential_energy(images[0]) v = [] for i, atoms in enumerate(images): e.append(atoms.get_potential_energy()) ei.append(ir_mpnn.get_potential_energy(atoms)) ei_.append(ir_reax.get_potential_energy(atoms)) diff.append(abs(e[-1] - ei[-1])) print(' * energy: ', e[-1], ei[-1], ei_[-1], diff[-1]) v.append(atoms.get_volume()) # stress = atoms.get_stress() # print(stress) print(' * mean difference: ', np.mean(diff)) e_min = min(e) e_max = max(e) e = np.array(e) - e_min e_min = min(ei) ei = np.array(ei) - e_min e_min = min(ei_) ei_ = np.array(ei_) - e_min plt.figure() plt.ylabel(r'$Energy$ ($eV$)') plt.xlabel(r'$Volume$ ($\AA^3$)') # plt.xlim(0,i) # plt.ylim(0,np.max(hist)+0.01) plt.plot(v, ei, alpha=0.9, linestyle='-', marker='o', markerfacecolor='k', markersize=5, color='k', label='IRFF(MPNN)') # plt.plot(v,ei,alpha=0.9, # linestyle='-',marker='^',markerfacecolor='none', # markeredgewidth=1,markeredgecolor='blue',markersize=5, # color='blue',label='IRFF') err = np.abs(ei - e) err_ = np.abs(ei_ - e) plt.errorbar(v, e, yerr=err, fmt='s', ecolor='r', color='r', ms=6, markerfacecolor='none', mec='r', elinewidth=2, capsize=2, label='DFT (SIESTA)') plt.plot(v, ei_, alpha=0.9, linestyle='-', marker='^', markerfacecolor='b', markersize=5, color='b', label='ReaxFF(trained)') plt.fill_between(v, e - err, e + err, color='darkorange', alpha=0.2) plt.fill_between( v, e - err_, e + err_, color='palegreen', # palegreen alpha=0.2) plt.text(0.0, e_max, '%.3f' % e_min, fontdict={'size': 10.5, 'color': 'k'}) plt.legend(loc='best', edgecolor='yellowgreen') # lower left upper right plt.savefig('Energy.svg', transparent=True) plt.close()
def e(traj='pre_dft.traj',batch_size=100,nn=True): ffield = 'ffield.json' if nn else 'ffield' images = Trajectory(traj) e,ei,ei_ = [],[],[] ir = IRFF(atoms=images[0], libfile=ffield, nn=True) ir.get_potential_energy(images[0]) ir_reax = IRFF(atoms=images[0], libfile='ffield', nn=False) ir_reax.get_potential_energy(images[0]) v_,pdft,pml,preax,diff = [],[],[],[],[] v0 = images[0].get_volume() for i,atoms in enumerate(images): v=atoms.get_volume() e.append(atoms.get_potential_energy()) stress_ = atoms.get_stress() if v/v0 < 0.86: pdft.append(calculate_pressure(stress_)) ir.calculate(atoms=atoms,CalStress=True) ei.append(ir.E) stress = ir.results['stress'] pml.append(calculate_pressure(stress)) ir_reax.calculate(atoms=atoms,CalStress=True) ei_.append(ir.E) stress = ir_reax.results['stress'] preax.append(calculate_pressure(stress)) v_.append(v/v0) diff.append(abs(pml[-1]-pdft[-1])) print(' * V/V0',v_[-1],v,pml[-1],pdft[-1],' diff: ',diff[-1]) print(' * mean error:',np.mean(diff)) e_min = min(e) e_max = max(e) e = np.array(e) - e_min e_min = min(ei) ei = np.array(ei) - e_min plt.figure() plt.ylabel(r'$Pressure$ ($GPa$)') plt.xlabel(r'$V/V_0$') # plt.xlim(0,i) # plt.ylim(0,np.max(hist)+0.01) ax = plt.gca() pml = np.array(pml) pdft = np.array(pdft) plt.plot(v_,pml,alpha=0.9, linestyle='-',marker='o',markerfacecolor='none',markersize=7, color='b',label='IRFF(MPNN)') plt.plot(v_,preax,alpha=0.9, linestyle='-',marker='^',markerfacecolor='none',markersize=7, color='g',label='ReaxFF(trained)') plt.plot(v_,pdft,alpha=0.9, linestyle='-',marker='s',markerfacecolor='none',markersize=7, color='r',label='DFT(SIESTA)') pdiff = np.abs(pdft - pml) plt.fill_between(v_, pdft - pdiff, pdft + pdiff, color='darkorange', alpha=0.2) pdiff = np.abs(pdft - preax) plt.fill_between(v_, pdft - pdiff, pdft + pdiff, color='palegreen', alpha=0.2) plt.legend(loc='best',edgecolor='yellowgreen') # lower left upper right plt.savefig('compare-pv.svg',transparent=True) plt.close()
def e(traj='siesta.traj',batch_size=100,nn=False): ffield = 'ffield.json' if nn else 'ffield' images = Trajectory(traj) e,ei = [],[] ir = IRFF(atoms=images[0], libfile='ffield', nn=False, bo_layer=[8,4]) ir.get_potential_energy(images[0]) for i,atoms in enumerate(images): e.append(atoms.get_potential_energy()) ei.append(ir.get_potential_energy(atoms)) e_max = max(e) e = np.array(e) - e_max rn = ReaxFF(libfile=ffield, direcs={'tmp':'siesta.traj'}, dft='siesta', opt=[],optword='nocoul', batch_size=batch_size, atomic=True, clip_op=False, InitCheck=False, nn=nn, pkl=False, to_train=False) molecules = rn.initialize() rn.session(learning_rate=1.0e-10,method='AdamOptimizer') mol = 'tmp' er = rn.get_value(rn.E[mol]) dfte = rn.get_value(rn.dft_energy[mol]) zpe = rn.get_value(rn.zpe[mol]) er = er - e_max ei = np.array(ei) - e_max plt.figure() plt.ylabel('Energy (eV)') plt.xlabel('Step') plt.xlim(0,i) # plt.ylim(0,np.max(hist)+0.01) ax = plt.gca() ax.spines['right'].set_color('none') ax.spines['top'].set_color('none') # ax.spines['left'].set_position(('data',0)) # ax.spines['bottom'].set_position(('data', 0)) plt.plot(e,alpha=0.01, linestyle='-',marker='s',markerfacecolor='none', markeredgewidth=1,markeredgecolor='r',markersize=4, color='red',label='DFT (SIESTA)') plt.plot(er,alpha=0.01, linestyle='-',marker='o',markerfacecolor='none', markeredgewidth=1,markeredgecolor='b',markersize=4, color='blue',label='ReaxFF') plt.plot(ei,alpha=0.01, linestyle='-',marker='^',markerfacecolor='none', markeredgewidth=1,markeredgecolor='g',markersize=4, color='blue',label='IRFF') plt.text( 0.0, 0.5, '%.3f' %e_max, fontdict={'size':10.5, 'color': 'k'}) plt.legend(loc='upper left',edgecolor='yellowgreen') # lower left upper right plt.savefig('Energy.eps',transparent=True) plt.close()
def geo_opt(): # parameters atoms = read('nm.gen') atoms.calc = IRFF(atoms=atoms, nn=True, libfile='ffield.json') optimizer = BFGS(atoms, trajectory="opt.traj") optimizer.run(0.02, 100)
def dh(traj='siesta.traj', batch_size=1, nn=True, frame=7): ffield = 'ffield.json' if nn else 'ffield' images = Trajectory(traj) atoms = images[frame] his = TrajectoryWriter('tmp.traj', mode='w') his.write(atoms=atoms) his.close() from irff.irff import IRFF ir = IRFF(atoms=atoms, libfile=ffield, nn=nn, bo_layer=[9, 2]) ir.get_potential_energy(atoms) from irff.reax import ReaxFF rn = ReaxFF(libfile=ffield, direcs={'tmp': 'tmp.traj'}, dft='siesta', opt=[], optword='nocoul', batch_size=batch_size, atomic=True, clip_op=False, InitCheck=False, nn=nn, pkl=False, to_train=False) molecules = rn.initialize() rn.session(learning_rate=1.0e-10, method='AdamOptimizer') mol = 'tmp' hblab = rn.lk.hblab hbs = [] for hb in ir.hbs: hbs.append(list(hb)) eh_ = rn.get_value(rn.EHB) # eh = ir.ehb.numpy() rhb_ = rn.get_value(rn.rhb) # rhb = ir.rhb.numpy() frhb_ = rn.get_value(rn.frhb) # frhb = ir.frhb.numpy() sin4_ = rn.get_value(rn.sin4) # sin4 = ir.sin4.numpy() # exphb1_= rn.get_value(rn.exphb1) # exphb2_= rn.get_value(rn.exphb2) # exphb1 = ir.exphb1.numpy() # exphb2 = ir.exphb2.numpy() # hbsum_ = rn.get_value(rn.hbsum) # hbsum = ir.hbsum.numpy() for hb in rn.hbs: for a_ in range(rn.nhb[hb]): a = hblab[hb][a_][1:] i, j, k = a if a in hbs: ai = hbs.index(a) # if eh_[hb][a_][0]<-0.000001: print( '- %2d%s-%2d%s-%2d%s:' % (i, ir.atom_name[i], j, ir.atom_name[j], k, ir.atom_name[k]), 'ehb: %10.8f' % (eh_[hb][a_][0]), 'rhb: %10.8f' % (rhb_[hb][a_][0]), 'frhb: %10.8f' % (frhb_[hb][a_][0]), 'sin4: %10.8f' % (sin4_[hb][a_][0]))
def db(traj='opt.traj', batch_size=50, ef=3, nn=True, frame=40): ffield = 'ffield.json' if nn else 'ffield' images = Trajectory(traj) atoms = images[frame] e, ei = [], [] ir = IRFF(atoms=atoms, libfile=ffield, nn=nn, autograd=False) ir.calculate(atoms) ei.append(ir.Ebond) ebond = ir.ebond # .numpy() rn = MPNN(libfile=ffield, direcs={'tmp': traj}, dft='siesta', opt=[], optword='nocoul', batch_size=batch_size, atomic=True, clip_op=False, InitCheck=False, nn=nn, bo_layer=[9, 2], EnergyFunction=ef, pkl=False) molecules = rn.initialize() rn.session(learning_rate=1.0e-10, method='AdamOptimizer') mol = 'tmp' er = rn.get_value(rn.ebond[mol]) blab = rn.lk.bdlab bosi = ir.bosi.numpy() bopsi = ir.bop_si.numpy() boppi = ir.bop_pi.numpy() boppp = ir.bop_pp.numpy() bopow3 = ir.bopow3.numpy() eterm3 = ir.eterm3.numpy() bop = ir.bop.numpy() bo = ir.bo0.numpy() eterm1 = ir.eterm1.numpy() bopow1 = ir.bopow1.numpy() bodiv1 = ir.bodiv1.numpy() r = ir.r.numpy() D_ = rn.get_value(rn.Deltap) D = ir.Deltap.numpy() ebd_ = np.zeros([ir.natom, ir.natom]) for bd in rn.bonds: for nb in range(rn.nbd[bd]): ebd = rn.get_value(rn.EBD[bd]) mol_, i, j = blab[bd][nb] bosi_ = rn.get_value(rn.bosi[bd]) bopsi_ = rn.get_value(rn.bop_si[bd]) boppi_ = rn.get_value(rn.bop_pi[bd]) boppp_ = rn.get_value(rn.bop_pp[bd]) bopow3_ = rn.get_value(rn.bopow3[bd]) eterm3_ = rn.get_value(rn.eterm3[bd]) bop_ = rn.get_value(rn.bop[bd]) bo_ = rn.get_value(rn.bo0[bd]) eterm1_ = rn.get_value(rn.eterm1[bd]) bopow1_ = rn.get_value(rn.bopow1[bd]) bodiv1_ = rn.get_value(rn.bodiv1[bd]) rbd = rn.get_value(rn.rbd[bd]) ebd_[i][j] = ebd[nb][frame] ebd_[j][i] = ebd[nb][frame] # if abs(bo_[nb][0]-bo[i][j])>0.00001: print('- %s %2d %2d:' % (bd, i, j), 'rbd %10.7f %10.7f' % (rbd[nb][frame], r[i][j]), 'bop %10.7f %10.7f' % (bop_[nb][frame], bop[i][j]), 'Di %10.7f %10.7f' % (D_[i][frame], D[i]), 'Dj %10.7f %10.7f' % (D_[j][frame], D[j]), 'bo %10.7f %10.7f' % (bo_[nb][frame], bo[i][j]), 'ebond %10.7f %10.7f' % (ebd[nb][frame], ebond[i][j])) rcbo = rn.get_value(rn.rc_bo) eb = rn.get_value(rn.ebond[mol]) print('\n- bond energy:', ir.Ebond.numpy(), eb[frame], end='\n') for i in range(ir.natom): for j in range(ir.natom): if abs(ebd_[i][j] - ebond[i][j]) > 0.00001: print('- %s %2d %2d:' % (bd, i, j), 'rbd %10.7f' % (r[i][j]), 'bop %10.7f' % (bop[i][j]), 'Di %10.7f %10.7f' % (D_[i][frame], D[i]), 'Dj %10.7f %10.7f' % (D_[j][frame], D[j]), 'bo %10.7f' % (bo[i][j]), 'ebond %10.7f %10.7f' % (ebd_[i][j], ebond[i][j])) # print(rcbo) print('\n- bond energy:', ir.Ebond.numpy(), eb[frame], end='\n')
from ase.optimize import BFGS, FIRE from irff.md import opt from irff.irff import IRFF from ase.io.trajectory import TrajectoryWriter import matplotlib.pyplot as plt traj = TrajectoryWriter('pre_opt.traj', mode='w') atoms = read('sc.gen') cell = atoms.get_cell() atoms_ = atoms.copy() configs = [] GPa = 1.60217662 * 1.0e2 s = 1.0 i = 0 ir = IRFF(atoms=atoms_, libfile='ffield.json', nn=True) v_, p = [], [] v0 = atoms.get_volume() while s > 0.59: print(' * lattice step:', i) f = s**(1.0 / 3.0) cell_ = cell.copy() cell_ = cell * f atoms_.set_cell(cell_) atoms_ = opt(atoms=atoms_, fmax=0.02, step=120, optimizer=FIRE) configs.append(atoms_) traj.write(atoms=atoms_) ir.calculate(atoms=atoms_, CalStress=True) stress = ir.results['stress']
def da(traj='opt.traj', batch_size=50, ef=3, nn=True, frame=44): ffield = 'ffield.json' if nn else 'ffield' images = Trajectory(traj) atoms = images[frame] his = TrajectoryWriter('tmp.traj', mode='w') his.write(atoms=atoms) # his.write(atoms=images[frame+1]) his.close() ir = IRFF(atoms=atoms, libfile=ffield, nn=nn, autograd=False) ir.calculate(atoms) rn = MPNN(libfile=ffield, direcs={'tmp': 'tmp.traj'}, dft='siesta', opt=[], optword='nocoul', batch_size=batch_size, atomic=True, clip_op=False, InitCheck=False, nn=nn, bo_layer=[9, 2], EnergyFunction=ef, pkl=False) molecules = rn.initialize() rn.session(learning_rate=1.0e-10, method='AdamOptimizer') mol = 'tmp' anglab = rn.lk.anglab angs = [] for ang in ir.angs: angs.append(list(ang)) ea_ = rn.get_value(rn.EANG) ea = ir.eang.numpy() f7_ = rn.get_value(rn.f_7) f7 = ir.f_7.numpy() f8_ = rn.get_value(rn.f_8) f8 = ir.f_8.numpy() expang_ = rn.get_value(rn.expang) expang = ir.expang.numpy() theta_ = rn.get_value(rn.theta) theta = ir.theta.numpy() theta0_ = rn.get_value(rn.theta0) theta0 = ir.thet0.numpy() sbo3_ = rn.get_value(rn.SBO3) sbo3 = ir.SBO3.numpy() fa = open('ang.txt', 'w') for ang in rn.angs: for a_ in range(rn.nang[ang]): a = anglab[ang][a_][1:] if a not in angs: a.reverse() i, j, k = a if a in angs: ai = angs.index(a) print( ' * %2d%s-%2d%s-%2d%s:' % (i, ir.atom_name[i], j, ir.atom_name[j], k, ir.atom_name[k]), #'eang: %10.8f %10.8f' %(ea_[ang][a_][0],ea[ai]), 'f7: %10.8f %10.8f' % (f7_[ang][a_][0], f7[ai]), 'f8: %10.8f %10.8f' % (f8_[ang][a_][0], f8[ai]), 'expang: %10.8f %10.8f' % (expang_[ang][a_][0], expang[ai]), 'theta: %10.8f %10.8f' % (theta_[ang][a_][0], theta[ai]), # 'sbo3: %10.8f %10.8f' %(sbo3_[ang][a_][0],sbo3[ai]), 'theta0: %10.8f %10.8f' % (theta0_[ang][a_][0], theta0[ai]), file=fa) else: print( ' * %2d%s-%2d%s-%2d%s:' % (i, ir.atom_name[i], j, ir.atom_name[j], k, ir.atom_name[k]), #'eang: %10.8f' %(ea_[ang][a_][0]), 'f7: %10.8f' % (f7_[ang][a_][0]), 'f8: %10.8f' % (f8_[ang][a_][0]), 'expang: %10.8f' % (expang_[ang][a_][0]), 'expang: %10.8f' % (expang_[ang][a_][0]), 'theta: %10.8f' % (theta_[ang][a_][0]), # 'sbo3: %10.8f' %(sbo3_[ang][a_][0]), 'theta0: %10.8f' % (theta0_[ang][a_][0])) fa.close() epen = rn.get_value(rn.epen) eang = rn.get_value(rn.eang) print(' * penalty energy:', ir.Epen.numpy(), epen[mol][0]) print(' * angel energy:', ir.Eang.numpy(), eang[mol][0])
#!/usr/bin/env python # -*- coding: utf-8 -*- # from irff.plot.reax_plot import plbo # from irff.plot import reax_pldd,reax_plbd from irff.irff import IRFF from irff.reax_eager import ReaxFF from ase.io import read, write import numpy as np # direcs={'tatb2':'/home/feng/siesta/tatb2_4'} atoms = read('siesta.traj', index=29) ir = IRFF(atoms=atoms, libfile='ffield.json', rcut=None, nn=True) ir.get_pot_energy(atoms) # print('\n- ebond:\n',ir.Ebond.numpy()) # # print('\n- ebond:\n',ir.Delta.numpy()) # print('\n- elone:\n',ir.Elone.numpy()) # print('\n- eover:\n',ir.Eover.numpy()) # print('\n- eunder:\n',ir.Eunder.numpy()) # print('\n- etor:\n',ir.Etor.numpy()) # print('\n- efcon:\n',ir.Efcon.numpy()) # print('\n- ehb:\n',ir.Ehb.numpy()) grad = ir.tape.gradient(ir.E, ir.positions) print('\n- gradient:\n', grad.numpy()) # rn = ReaxFF(libfile='ffield.json', # direcs={'tmp':'siesta.traj'}, # dft='siesta',
def static_compress(): traj = TrajectoryWriter('pre_opt.traj', mode='w') atoms = read('nm.gen') cell = atoms.get_cell() atoms_ = atoms.copy() configs = [] GPa = 1.60217662 * 1.0e2 s = 1.0 i = 0 ir = IRFF(atoms=atoms_, libfile='ffield.json', nn=True) v_, p = [], [] v0 = atoms.get_volume() while s > 0.66: print(' * lattice step:', i) f = s**(1.0 / 3.0) cell_ = cell.copy() cell_ = cell * f ir.CalStress = False atoms_.set_cell(cell_) atoms_ = opt(atoms=atoms_, fmax=0.02, step=120, optimizer=FIRE) configs.append(atoms_) traj.write(atoms=atoms_) ir.CalStress = True ir.calculate(atoms=atoms_) stress = ir.results['stress'] nonzero = 0 stre_ = 0.0 for _ in range(3): if abs(stress[_]) > 0.0000001: nonzero += 1 stre_ += -stress[_] pressure = stre_ * GPa / nonzero p.append(pressure) v = atoms_.get_volume() v_.append(v / v0) print(' * V/V0', v_[-1], v, pressure) s = s * 0.98 i += 1 fig, ax = plt.subplots() plt.ylabel(r'$Pressure$ ($GPa$)') plt.xlabel(r'$V/V_0$') plt.plot(v_, p, label=r'$IRFF-MPNN$', color='blue', marker='o', markerfacecolor='none', markeredgewidth=1, ms=5, alpha=0.8, linewidth=1, linestyle='-') plt.legend(loc='best', edgecolor='yellowgreen') plt.savefig('pv.pdf') plt.close()