solver='BiCGStab', txt=strbody + '_td.txt', parallel=parallel) proj_idx = 50 # atomic index of the projectile delta_stop = 5.0 / Bohr # stop condition when ion is within 5 A of boundary. # Setting the initial velocity according to the kinetic energy. amu_to_aumass = _amu / _me Mproj = tdcalc.atoms.get_masses()[proj_idx] * amu_to_aumass Ekin *= 1 / Hartree v = np.zeros((proj_idx + 1, 3)) v[proj_idx, 2] = -np.sqrt((2 * Ekin) / Mproj) * Bohr / AUT tdcalc.atoms.set_velocities(v) 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
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)
N_c = 8 * np.round(cell_c / (0.2 * 8)) calc = GPAW(gpts=N_c, nbands=5, basis='dzp', txt=name + '_gs.txt', eigensolver='rmm-diis') atoms.set_calculator(calc) atoms.get_potential_energy() calc.write(name + '_gs.gpw', mode='all') 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()
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)