Source code for ase2sprkkr.sprkkr.test.test_sites

import numpy as np
import pytest
from ase.build import bulk
import ase.io
import os

if __package__:
   from .init_tests import TestCase, patch_package, run_sprkkr
else:
   from init_tests import TestCase, patch_package, run_sprkkr
__package__, __name__ = patch_package(__package__, __name__)

if True:
    from ..sites import SiteType
    from ..radial_meshes import ExponentialMesh
    from ..radial import RadialPotential, RadialCharge
    from ..sprkkr_atoms import SPRKKRAtoms
    from ..calculator import SPRKKR


[docs] class TestSites(TestCase):
[docs] def test_adding(self): atoms=SPRKKRAtoms(symbols='NK',pbc=True) atoms.cell = [[1,0,0], [0,1,1],[0,0,1]] assert atoms.sites[0].site_type != atoms.sites[1].site_type out = atoms + atoms assert len(out) == 4 assert id(out.sites[0]) != id(atoms.sites[0]) assert id(out.sites[0].site_type) != id(atoms.sites[0].site_type) half = out[:2] assert id(out.sites[0]) != id(half.sites[0]) assert id(out.sites[0].site_type) != id(half.sites[0].site_type)
[docs] def test_potential(self): a=SPRKKRAtoms('NaCl') m1 = ExponentialMesh(1.,0.005,None,None,200, None) m2 = ExponentialMesh(0.9,0.005,None,None,200, None) s0 = a.sites[0] s1 = a.sites[1] s0.potential = RadialPotential(m1.coors, m1, 2) s1.potential = s0.potential.copy() self.assertEqual(s0.potential(2.), 2.) self.assertEqual(s0.potential(1.), 1.) self.assertEqual(s0.potential(1.5), 1.5) self.assertEqual(s1.potential(2.), 2.) s1.potential = s0.potential.copy() self.assertNotEqual(s0.mesh, s1.mesh) s1.remesh(s0.mesh) self.assertEqual(s0.mesh, s1.mesh) s0.potential = p2 = RadialPotential(m2.coors * 2, m2, 2) self.assertEqual(s0.potential(2.), 4.) self.assertEqual(s0.mesh, s1.mesh) s0.mesh = m1 self.assertEqual(s0.mesh, m1) self.assertEqual(s0.potential.mesh, m1) self.assertEqual(s0.potential.mesh, s0.mesh) self.assertEqual(s0.potential(2.), 4.) self.assertEqual(s0.potential(1.), 2.) self.assertEqual(s0.potential(1.5), 3.) self.assertEqual(s0.potential(2.), 4.) self.assertNotEqual(s0.mesh, s1.mesh) self.assertNotEqual(s0.potential.mesh, s1.mesh) s1.remesh(s0.mesh) self.assertEqual(s0.mesh, s1.mesh) self.assertEqual(s0.potential.mesh, s1.mesh) s0.charge = m1.coors * 3 self.assertEqual(s0.mesh, s1.mesh) self.assertEqual(s0.charge(2.), 6.) self.assertEqual(s0.charge(1.), 3.) s0.potential = p2 self.assertNotEqual(s0.mesh, m2) self.assertNotEqual(s0.potential.mesh, m2) self.assertNotEqual(s0.charge.mesh, m2) self.assertEqual(s0.charge(2.), 6.) self.assertEqual(s0.charge(1.), 3.) s0.charge = RadialCharge(s1.potential._value, m1) self.assertEqual(s0.mesh, m1) self.assertEqual(s0.potential.mesh, m1) self.assertEqual(s0.charge.mesh, m1) s0.potential = [ m1.coors, m1.coors * 2 ] self.assertEqual(s0.potential.interpolate(1.5), np.asarray([1.5,3])) # test 1/r interpolation s0.potential = [ 1 / m1.coors, 1 / m1.coors * 2 ] self.assertEqual(s0.potential.interpolate(1.5), np.asarray([1 / 1.5,1 / 1.5 * 2]))
[docs] def test_vacuum(self): a=SPRKKRAtoms('NaCl') site=SiteType(a, { 'Na' : 1.0 }) self.assertFalse(site.is_vacuum()) site=SiteType(a, { 'Na' : 0.5, 'Cl': 0.5 }) self.assertFalse(site.is_vacuum()) site=SiteType(a, { 'Na' : 0.5, 'Vc': 0.5 }) self.assertFalse(site.is_vacuum()) site=SiteType(a, { 'Vc': 1.0 }) self.assertTrue(site.is_vacuum()) a=SPRKKRAtoms('NaX') self.assertFalse(a.sites[0].is_vacuum()) self.assertTrue(a.sites[1].is_vacuum()) a.sites[1].atomic_types[0]='Li' self.assertFalse(a.sites[1].is_vacuum())
[docs] def test_occupancy(self): a=SPRKKRAtoms('Na') site = a.sites[0] site.occupation = { 'Na' : 0.7, 'Cl' : None } self.assertAlmostEqual(0.3, site.occupation[1]) self.assertAlmostEqual(0.3, site.occupation['Cl']) site.occupation['Cl'] = 0.6 self.assertEqual('Cl', a.symbols) self.assertAlmostEqual(0.4, site.occupation[0]) site.occupation['N'] = 0.5 self.assertAlmostEqual(0.2, site.occupation[0]) self.assertAlmostEqual(0.3, site.occupation[1]) self.assertAlmostEqual(0.5, site.occupation[2]) self.assertAlmostEqual(0.5, site.occupation['N']) self.assertEqual('N', a.symbols) site.occupation[0] = 0. self.assertEqual(0., site.occupation[0]) self.assertAlmostEqual(0.3 * 5. / 4., site.occupation[1]) self.assertAlmostEqual(0.5 * 5. / 4., site.occupation[2]) self.assertEqual(3, len(site.occupation)) site.occupation.clean() self.assertEqual(2, len(site.occupation)) self.assertAlmostEqual(0.3 * 5. / 4., site.occupation[0]) self.assertAlmostEqual(0.5 * 5. / 4., site.occupation[1])
[docs] @pytest.mark.skip @run_sprkkr def test_charge(self, temporary_dir): atoms = bulk('Li') calc = SPRKKR(atoms=atoms, **self.calc_args()) calc.input_parameters.SCF.MIX=1.0 for i in atoms.sites: i.mesh.jrws = 30 i.mesh.r1 =1e-6 out = calc.calculate(options={'NITER' : 2}, atoms=atoms) # , directory='./b') atoms2 = out.atoms out = calc.calculate(options={'NITER' : 0}, atoms=atoms) # , directory='./a') atoms1 = out.atoms self.assertNotEqual(atoms2.sites[0].potential.vt, atoms1.sites[0].potential.vt) out2 = calc.calculate(atoms=atoms1, options={'NITER': 1}) # , directory='./d') self.assertEqual(atoms2.sites[0].potential.vt, out2.atoms.sites[0].potential.vt) self.assertEqual(atoms2.sites[0].potential.bt, out2.atoms.sites[0].potential.bt) self.assertEqual(atoms2.sites[0].charge.raw_value, out2.atoms.sites[0].charge.raw_value) # calc.save_input(atoms=zero.atoms, directory='a', options={'NITER' : 2}) atoms1.atoms.sites[0].potential.vt*=2 atoms1.atoms.sites[0].potential.bt*=2 # calc.save_input(atoms=zero.atoms, directory='b', options={'NITER' : 2}) out3 = calc.calculate(atoms=atoms1, options={'NITER': 1}) self.assertNotEqual(atoms2.sites[0].potential.vt, out3.atoms.sites[0].potential.vt)
[docs] def test_occupancy_and_spacegroup_kinds(self): ciffile='test2.cif' atoms = ase.io.read(os.path.join( os.path.dirname(__file__), ciffile )) SPRKKRAtoms.promote_ase_atoms(atoms) assert str(atoms.symbols) == 'X2I2FeX11' atoms.sites assert str(atoms.symbols) == 'X2I2FeX11'