evv = EhrenfestVelocityVerlet(tdcalc) traj = Trajectory(traj_file, 'w', tdcalc.get_atoms()) trajdiv = 1 # number of timesteps between trajectory images densdiv = 10 # number of timesteps between saved electron densities niters = 100 # total number of timesteps to propagate for i in range(niters): # Stopping condition when projectile z coordinate passes threshold if evv.x[proj_idx, 2] < delta_stop: tdcalc.write(strbody + '_end.gpw', mode='all') break # Saving trajectory file every trajdiv timesteps if i % trajdiv == 0: F_av = evv.F * Hartree / Bohr # forces converted from atomic units v_av = evv.v * Bohr / AUT # velocities converted from atomic units epot = tdcalc.get_td_energy() * Hartree # energy atoms = tdcalc.get_atoms().copy() atoms.set_velocities(v_av) traj.write(atoms, energy=epot, forces=F_av) # Saving electron density every densdiv timesteps if (i != 0 and i % densdiv == 0): tdcalc.write(strbody + '_step' + str(i) + '.gpw') evv.propagate(timestep) traj.close()
del atoms, calc time.sleep(10) while not os.path.isfile(name + '_gs.gpw'): print('Node %d waiting for file...' % world.rank) time.sleep(10) world.barrier() tdcalc = TDDFT(name + '_gs.gpw', txt=name + '_td.txt', propagator='EFSICN') ehrenfest = EhrenfestVelocityVerlet(tdcalc) traj = PickleTrajectory(name + '_td.traj', 'w', tdcalc.get_atoms()) t0 = time.time() f = paropen(name + '_td.log', 'w') for i in range(1, niter+1): ehrenfest.propagate(timestep) if i % ndiv == 0: rate = 60 * ndiv / (time.time()-t0) ekin = tdcalc.atoms.get_kinetic_energy() epot = tdcalc.get_td_energy() * Hartree F_av = ehrenfest.F * Hartree / Bohr print('i=%06d (%6.2f min^-1), ekin=%13.9f, epot=%13.9f, etot=%13.9f' % (i, rate, ekin, epot, ekin+epot), file=f) t0 = time.time() # Hack to prevent calls to GPAW::get_potential_energy when saving spa = tdcalc.get_atoms() spc = SinglePointCalculator(epot, F_av, None, None, spa) spa.set_calculator(spc) traj.write(spa) f.close()
d = 4.0 atoms = Atoms('NaCl', [(0, 0, 0), (0, 0, d)]) atoms.center(vacuum=4.5) gs_calc = GPAW(nbands=4, eigensolver='cg', gpts=(32, 32, 44), xc='LDA', setups={'Na': '1'}) atoms.set_calculator(gs_calc) atoms.get_potential_energy() gs_calc.write('nacl_gs.gpw', 'all') td_calc = TDDFT('nacl_gs.gpw', propagator='EFSICN') evv = EhrenfestVelocityVerlet(td_calc, 0.001) i = 0 evv.get_energy() r = evv.x[1][2] - evv.x[0][2] # print 'E = ', [i, r, evv.Etot, evv.Ekin, evv.e_coulomb] for i in range(5): evv.propagate(1.0) evv.get_energy() r = evv.x[1][2] - evv.x[0][2] print('E = ', [i + 1, r, evv.Etot, evv.Ekin, evv.e_coulomb]) equal(r, 7.558883144, 1e-6) equal(evv.Etot, -0.1036763317, 1e-7)
while not os.path.isfile(name + '_esx.gpw'): print('Node %d waiting for %s...' % (world.rank, name + '_esx.gpw')) time.sleep(10) world.barrier() tdcalc = TDDFT(name + '_esx.gpw', txt=name + '_td.txt', propagator='EFSICN') ehrenfest = EhrenfestVelocityVerlet(tdcalc) traj = PickleTrajectory(name + '_td.traj', 'w', tdcalc.get_atoms()) t0 = time.time() f = paropen(name + '_td.log', 'w') for i in range(1, niter + 1): ehrenfest.propagate(timestep) if i % ndiv == 0: rate = 60 * ndiv / (time.time() - t0) ekin = tdcalc.atoms.get_kinetic_energy() epot = tdcalc.get_td_energy() * Hartree F_av = ehrenfest.F * Hartree / Bohr print( 'i=%06d (%6.2f min^-1), ekin=%13.9f, epot=%13.9f, etot=%13.9f' % (i, rate, ekin, epot, ekin + epot), file=f) t0 = time.time() # Hack to prevent calls to GPAW::get_potential_energy when saving spa = tdcalc.get_atoms() spc = SinglePointCalculator(epot, F_av, None, None, spa)
from gpaw.tddft.ehrenfest import EhrenfestVelocityVerlet from gpaw.test import equal d = 4.0 atoms = Atoms('NaCl', [(0,0,0),(0,0,d)]) atoms.center(vacuum=4.5) gs_calc = GPAW(nbands=4, eigensolver='cg', gpts=(32, 32, 44), xc='LDA', setups={'Na': '1'}) atoms.set_calculator(gs_calc) atoms.get_potential_energy() gs_calc.write('nacl_gs.gpw', 'all') td_calc = TDDFT('nacl_gs.gpw', propagator='EFSICN') evv = EhrenfestVelocityVerlet(td_calc, 0.001) i=0 evv.get_energy() r = evv.x[1][2] - evv.x[0][2] # print 'E = ', [i, r, evv.Etot, evv.Ekin, evv.Epot] for i in range(5): evv.propagate(1.0) evv.get_energy() r = evv.x[1][2] - evv.x[0][2] print 'E = ', [i+1, r, evv.Etot, evv.Ekin, evv.Epot] equal(r, 7.558883144, 1e-7) equal(evv.Etot, -0.1036763317, 1e-7)