Source code for ase2sprkkr.potentials.test.test_potential

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

import os
from ..potentials import Potential
from ..potential_sections import PotentialSection
from ..potential_definitions import PotentialDefinition
from ase.spacegroup import crystal
import io
from ...common.grammar import generate_grammar
from datetime import datetime
from ...sprkkr.calculator import SPRKKR

[docs]class TestPotential(TestCase):
[docs] def test_grammar(self): g=Potential.potential_definition.grammar() def check(x, prefix=''): if '\n' in x.whiteChars: raise Exception(f'The potential grammar has newline in whitespace, which is illegal:\n {x}: {prefix}:{x.whiteChars}') if hasattr(x, 'expr'): check(x.expr, prefix + '.expr') if hasattr(x, 'exprs'): for i,e in enumerate(x.exprs): check(e, prefix + f'.exprs[{i}]') check(g)
[docs] def test_potential(self): a = 5.64 nacl = crystal(['Na', 'Cl'], [(0, 0, 0), (0.5, 0.5, 0.5)], spacegroup=225, cellpar=[a, a, a, 90, 90, 90]) sio = io.StringIO() p1 = Potential.from_atoms(nacl) p1.atoms.symbols[0] = 'K' p1.save_to_file(sio) sio.seek(0) p2 = Potential.from_file(sio) self.assertIsNotNone(p2.atoms) a1 = p1.atoms a2 = p2.atoms self.assertEqual(a2.cell * 1, a1.cell * 1) self.assertEqual(a2.positions, a1.positions) self.assertEqual(str(a2.symbols), str(a1.symbols))
[docs] def test_2D(self): path = os.path.join(os.path.dirname(__file__), '..','examples','GeTe.pot') p=Potential.from_file(path) if os.environ.get('DO_NOT_RUN_SPRKKR', '') == '': SPRKKR().calculate(potential=p, options={'NITER':1}, directory=False) else: SPRKKR().save_input(potential=p, options={'NITER':1}, directory=False)
[docs] def test_examples(self): path = os.path.join(os.path.dirname(__file__), '..','examples') i = 0 #import cProfile, pstats, io #from pstats import Stats #with cProfile.Profile() as pr for x in os.listdir(path): if not x.endswith('.pot'): continue i+=1 pot = Potential.from_file(os.path.join(path, x)) self.assertTrue(isinstance(pot, Potential)) self.assertTrue(pot.atoms.positions.shape[0] > 0) #Stats(pr).sort_stats('cumtime').print_stats(0.05) self.assertTrue(i >= 2)
[docs] def test_sequence(self): p = Potential() self.assertEqual(7, p.HEADER.FORMAT.VERSION) p.HEADER.FORMAT.VERSION=5 self.assertEqual(5, p.HEADER.FORMAT.VERSION) p.HEADER.FORMAT[0] = 8 self.assertEqual(8, p.HEADER.FORMAT.VERSION) self.assertEqual(datetime, p.HEADER.FORMAT.DATE.__class__) self.assertEqual(datetime, p.HEADER.FORMAT[1].__class__)
[docs] def test_reset(self): pot = Potential.from_file(os.path.join(os.path.dirname(__file__), '../examples/fp_new.pot')) pot.atoms.sites[0].mesh.r1 = 1. pot.MESH_INFORMATION.DATA()[0][0]=2. self.assertNotEqual(pot.SCF_INFO.SCFSTATUS(), 'START') #the reset of the potential is just reseting all non-mandatory #properties. The mandatory are currently not set to defaults! pot.reset() self.assertEqual(2., pot.atoms.sites[0].mesh.r1) self.assertEqual(2., pot.MESH_INFORMATION.DATA()[0][0]) self.assertRaises(AttributeError, lambda: pot.CHARGE) self.assertRaises(AttributeError, lambda: pot.POTENTIAL) self.assertTrue(isinstance(pot.LATTICE, PotentialSection)) self.assertEqual(pot.SCF_INFO.SCFSTATUS(), 'START') #a more hard version - it resets all the informations pot.atoms.reset_sprkkr_potential() self.assertEqual(pot.MESH_INFORMATION.DATA()[0][0], pot.atoms.sites[0].mesh.r1) self.assertNotEqual(1., pot.atoms.sites[0].mesh.r1) self.assertNotEqual(2., pot.MESH_INFORMATION.DATA()[0][0])