def calculate(name, system, **kwargs): print('Calculate', name, system) label = 'ink-%s' % name kwargs0 = dict(stdout="'stdout.txt'", FromScratch=True, RestartWrite=False, command='mpirun -np 4 octopus') kwargs.update(**kwargs0) calc = Octopus(label=label, **kwargs) system.calc = calc E = system.get_potential_energy() eig = calc.get_eigenvalues() check_interface(calc) restartcalc = Octopus(label) check_interface(restartcalc) # Check reconstruction of Atoms object new_atoms = restartcalc.get_atoms() print('new') print(new_atoms.positions) calc2 = Octopus(label='ink-restart-%s' % name, **kwargs) new_atoms.calc = calc2 E2 = new_atoms.get_potential_energy() #print('energy', E, E2) eig2 = calc2.get_eigenvalues() eig_err = np.abs(eig - eig2).max() e_err = abs(E - E2) print('Restart E err', e_err) print('Restart eig err', eig_err) assert e_err < 5e-5 assert eig_err < 5e-5 return calc
def test_integrals(pbc=True): system = molecule('H2O') a = 2.6006 # So the spacing does not divide exactly system.cell = (a, a, a) system.center() system.pbc = pbc spacing = 0.2 calc = Octopus(**getkwargs(label='ink-integrals-pbc-%s' % pbc, # Restart destroys normalization of output # ...........sometimes. RestartWrite=False, Output='density + potential + wfs', OutputHow='cube + xcrysden', ExtraStates=0, Spacing=spacing, SCFCalculateDipole=True)) system.set_calculator(calc) E = system.get_potential_energy() if pbc: Eref = -496.98663392 else: Eref = -451.05348602 err = E - Eref print('Energy=%f :: err=%e' % (E, err)) assert err < 1e-7 rho = calc.get_pseudo_density(pad=False) v = calc.get_effective_potential(pad=False) if pbc: # spacing adjusted but cell constant dv = system.get_volume() / rho.size else: # cell adjusted but spacing constant dv = spacing**3 ne = rho.sum() * dv err = abs(ne - 8.0) print('nelectrons: %f, err: %e' % (ne, err)) assert err < 1e-12 for n in range(calc.get_number_of_bands()): psi = calc.get_pseudo_wave_function(band=n, pad=True) norm = (np.abs(psi)**2).sum() * dv err = abs(norm - 1) print('norm=%f :: err=%e' % (norm, err)) assert err < 1e-12 eps = calc.get_eigenvalues() f = calc.get_occupation_numbers() E_band = (eps * f).sum() E_nv = (rho * v).sum() * dv if pbc: E_nl = -155.16024733 # Reference value from output. E_kin_ref = 377.899824 else: E_nl = -151.28372313 # Ref from output. E_kin_ref = 396.66270596 E_kin_ours = E_band - E_nv - E_nl err = abs(E_kin_ours - E_kin_ref) print('E_band=%f :: E_nv=%f :: E_kin_ours=%f :: err=%e' % (E_band, E_nv, E_kin_ours, err)) assert err < 5e-4 # Orig err: 6.8e-05 (pbc=False) and 3.47e-07 (pbc=True) errs = check_interface(calc) for err in errs: if err.code == 'not implemented': continue else: raise AssertionError(err.error)
def test_integrals(pbc=True): system = molecule('H2O') a = 2.6006 # So the spacing does not divide exactly system.cell = (a, a, a) system.center() system.pbc = pbc spacing = 0.2 calc = Octopus(**getkwargs( label='ink-integrals-pbc-%s' % pbc, # Restart destroys normalization of output # ...........sometimes. RestartWrite=False, Output='density + potential + wfs', OutputFormat='cube + xcrysden', ExtraStates=0, Spacing=spacing, SCFCalculateDipole=True)) system.set_calculator(calc) E = system.get_potential_energy() if pbc: Eref = -496.98663392 else: Eref = -451.05348602 err = abs(E - Eref) #print('Energy=%f :: err=%e' % (E, err)) # The reference has changed between version 5 and trunk, # so we will not check the total energy. # Checks of individual contributions that are physical and therefore # trustworthy will have to be sufficient. #assert err < 5e-3 rho = calc.get_pseudo_density(pad=False) v = calc.get_effective_potential(pad=False) if pbc: # spacing adjusted but cell constant dv = system.get_volume() / rho.size else: # cell adjusted but spacing constant dv = spacing**3 ne = rho.sum() * dv err = abs(ne - 8.0) print('nelectrons: %f, err: %e' % (ne, err)) assert err < 1e-12 for n in range(calc.get_number_of_bands()): psi = calc.get_pseudo_wave_function(band=n, pad=True) norm = (np.abs(psi)**2).sum() * dv err = abs(norm - 1) print('norm=%f :: err=%e' % (norm, err)) assert err < 1e-12 eps = calc.get_eigenvalues() f = calc.get_occupation_numbers() E_band = (eps * f).sum() E_nv = (rho * v).sum() * dv if pbc: E_nl = -155.16024733 # Reference value from output. E_kin_ref = 377.899824 else: E_nl = -151.28372313 # Ref from output. E_kin_ref = 396.66270596 E_kin_ours = E_band - E_nv - E_nl err = abs(E_kin_ours - E_kin_ref) print('E_band=%f :: E_nv=%f :: E_kin_ours=%f :: err=%e' % (E_band, E_nv, E_kin_ours, err)) assert err < 5e-3 # Orig err: 6.8e-05 (pbc=False) and 3.47e-07 (pbc=True) errs = check_interface(calc) for err in errs: if err.code == 'not implemented': continue else: raise AssertionError(err.error)