Source code for iDEA.test_LDA

""" Tests for the local density approximation

""" 
from __future__ import absolute_import
from . import LDA
from . import input
import unittest
import numpy as np
import numpy.testing as nt
import scipy.sparse as sps

[docs]class LDATestHarmonic(unittest.TestCase): """ Tests on the harmonic oscillator potential """
[docs] def setUp(self): """ Sets up harmonic oscillator system """ pm = input.Input() pm.run.name = 'unittest' pm.run.LDA = True pm.run.save = False pm.run.verbosity = 'low' ### system parameters sys = pm.sys sys.NE = 2 #: Number of electrons sys.grid = 201 #: Number of grid points (must be odd) sys.xmax = 6.0 #: Size of the system sys.tmax = 1.0 #: Total real time sys.imax = 1000 #: Number of real time iterations sys.acon = 1.0 #: Smoothing of the Coloumb interaction sys.interaction_strength = 1#: Scales the strength of the Coulomb interaction sys.im = 0 #: Use imaginary potentials def v_ext(x): """Initial external potential""" omega = 0.5 return 0.5*(omega**2)*(x**2) sys.v_ext = v_ext pm.lda.NE = 2 pm.setup_space() self.pm = pm
[docs] def test_total_energy_1(self): r"""Compares total energy computed via two methods One method uses the energy eigenvalues + correction terms. The other uses it only for the kinetic part, while the rest is computed usin energy functinals. """ pm = self.pm results = LDA.main(pm) eigf = results.gs_lda2_eigf eigv = results.gs_lda2_eigv # check that eigenfunctions are normalised as expected norms = np.sum(eigf*eigf.conj(), axis=1) * pm.sys.deltax nt.assert_allclose(norms, np.ones(len(eigf))) E1 = LDA.total_energy_eigv(pm, eigenvalues=eigv, orbitals=eigf.T) E2 = LDA.total_energy_eigf(pm, orbitals=eigf.T) self.assertAlmostEqual(E1,E2, delta=1e-12)
[docs] def test_kinetic_energy_1(self): r"""Checks kinetic energy Constructs Hamiltonian with KS-potential set to zero and computes expectation values. """ pm = self.pm results = LDA.main(pm) eigf = results.gs_lda2_eigf[:pm.sys.NE].T #eigv = results.gs_lda_eigv n = LDA.electron_density(pm, orbitals=eigf) v_ks = 0 H = LDA.banded_to_full(pm, H=LDA.hamiltonian(pm, v_ks=v_ks)) H_psi = np.dot(H,eigf) T_1 = 0 for i in range(pm.sys.NE): T_1 += np.dot(eigf[:,i].T, H_psi[:,i]) * pm.sys.deltax T_2 = LDA.kinetic_energy(pm, orbitals=eigf) self.assertAlmostEqual(T_1, T_2)
[docs] def test_banded_hamiltonian_1(self): r"""Test construction of Hamiltonian Hamiltonian is constructed in banded form for speed. This checks that the construction actually works. """ pm = self.pm v_ext = pm.space.v_ext H = LDA.banded_to_full(pm, H=LDA.hamiltonian(pm, v_ks=v_ext)) grid = pm.sys.grid sd = pm.space.second_derivative sd_ind = pm.space.second_derivative_indices T = -0.5 * sps.diags(sd,sd_ind,shape=(grid,grid), dtype=np.float, format='csr') V = sps.diags(v_ext, 0, shape=(grid,grid), dtype=np.float, format='csr') H2 = (T+V).toarray() nt.assert_allclose(H,H2)