コード例 #1
0
    def test_generate_sqs_from_supercells(self):
        """Test generation of SQS structure from list of supercells"""
        target_conc = {'Au': 0.5, 'Pd': 0.5}
        kwargs = dict(cluster_space=self.cs,
                      target_concentrations=target_conc,
                      n_steps=500,
                      random_seed=42,
                      optimality_weight=0.0)

        supercells = [self.prim.repeat((2, 2, 1)), self.prim.repeat((2, 1, 1))]
        structure = generate_sqs_from_supercells(supercells=supercells,
                                                 **kwargs)
        target_cv = [1., 0., 0., -1., 0., 1., 0., 0., 0., 0., 0., 0., 0.]
        self.assertTrue(
            np.allclose(self.cs.get_cluster_vector(structure), target_cv))

        # Log output to StringIO stream
        for handler in logger.handlers:
            handler.close()
            logger.removeHandler(handler)

        # Test with supercell that does not match
        supercells = [self.prim]
        logfile = NamedTemporaryFile(mode='w+', encoding='utf-8')
        set_log_config(filename=logfile.name)
        with self.assertRaises(ValueError) as cm:
            generate_sqs_from_supercells(supercells=supercells, **kwargs)
        logfile.seek(0)
        lines = logfile.readlines()
        logfile.close()
        self.assertEqual(len(lines), 1)
        self.assertIn('At least one supercell was not commensurate', lines[0])
        self.assertIn('No supercells that may host the specified',
                      str(cm.exception))
コード例 #2
0
    def test_generate_target_from_supercells(self):
        """Test generation of a structure based on a target cluster vector and a list
        of supercells"""
        target_cv = [1., 0., 0., -1., 0., 1., 0., 0., 0., 0., 0., 0., 0.]
        target_conc = {'Au': 0.5, 'Pd': 0.5}
        kwargs = dict(cluster_space=self.cs,
                      target_concentrations=target_conc,
                      target_cluster_vector=target_cv,
                      n_steps=500,
                      random_seed=42,
                      optimality_weight=0.3)

        supercells = [self.prim.repeat((2, 2, 1)), self.prim.repeat((2, 1, 1))]
        # This should be simple enough to always work
        structure = generate_target_structure_from_supercells(
            supercells=supercells, **kwargs)
        self.assertTrue(
            np.allclose(self.cs.get_cluster_vector(structure), target_cv))

        # Log output to StringIO stream
        for handler in logger.handlers:
            handler.close()
            logger.removeHandler(handler)

        # Use supercells that do not fit
        supercells = [self.prim.repeat((2, 2, 1)), self.prim.repeat((3, 1, 1))]
        logfile = NamedTemporaryFile(mode='w+', encoding='utf-8')
        set_log_config(filename=logfile.name)
        structure = generate_target_structure_from_supercells(
            supercells=supercells, **kwargs)
        logfile.seek(0)
        lines = logfile.readlines()
        logfile.close()
        self.assertIn('At least one supercell was not commensurate', lines[0])
        self.assertTrue(
            np.allclose(self.cs.get_cluster_vector(structure), target_cv))

        # Use two supercells that do not fit
        supercells = [self.prim.repeat((3, 3, 1)), self.prim.repeat((3, 1, 1))]
        logfile = NamedTemporaryFile(mode='w+', encoding='utf-8')
        set_log_config(filename=logfile.name)
        with self.assertRaises(ValueError) as cm:
            generate_target_structure_from_supercells(supercells=supercells,
                                                      **kwargs)
        logfile.seek(0)
        lines = logfile.readlines()
        logfile.close()
        self.assertEqual(len(lines), 1)  # Warning should be issued once
        self.assertIn('At least one supercell was not commensurate', lines[0])
        self.assertIn('No supercells that may host the specified',
                      str(cm.exception))
コード例 #3
0
 def test_mapping(structure,
                  reference=None,
                  expected_drmax=0.276249887,
                  expected_dravg=0.139034051,
                  expected_chemical_formula='H3Au6Pd2X5',
                  **kwargs):
     """
     Convenience wrapper for testing mapping.
     """
     if reference is None:
         reference = self.reference
     logfile = NamedTemporaryFile(mode='w+', encoding='utf-8')
     set_log_config(filename=logfile.name)
     mapped, info = map_structure_to_reference(structure, reference,
                                               **kwargs)
     self.assertEqual(len(info), 6)
     self.assertAlmostEqual(info['drmax'], expected_drmax)
     self.assertAlmostEqual(info['dravg'], expected_dravg)
     self.assertEqual(mapped.get_chemical_formula(),
                      expected_chemical_formula)
     logfile.seek(0)
     lines = logfile.readlines()
     logfile.close()
     return lines, info
コード例 #4
0
    # Log ClusterSpace output to StringIO stream
    for handler in logger.handlers:
        logger.removeHandler(handler)

    stream = StringIO()
    stream_handler = logging.StreamHandler(stream)
    stream_handler.setFormatter(formatter)
    logger.addHandler(stream_handler)
    stream_handler.setLevel(logging.INFO)

    cs = ClusterSpace(structure, cutoffs, symbols)
    stream_handler.flush()
    lines1 = stream.getvalue().split('\n')[:-1]  # remove last blank line

    # Log ClusterSpace output to file
    for handler in logger.handlers:
        logger.removeHandler(handler)

    logfile = tempfile.NamedTemporaryFile(mode='w+', encoding='utf-8')
    set_log_config(filename=logfile.name, level=logging.INFO)

    cs = ClusterSpace(structure, cutoffs, symbols)
    logfile.seek(0)
    lines2 = [l.replace('\n', '') for l in logfile.readlines()]

    # assert lines1 (from stringIO stream) and lines (from file stream) are equal
    assert len(lines1) == len(lines2)
    for l1, l2 in zip(lines1, lines2):
        assert l1 == l2
コード例 #5
0
"""
This example demonstrates how to generate special quasirandom structure.
"""

# Import modules
from ase import Atom
from ase.build import bulk
from icet import ClusterSpace
from icet.tools.structure_generation import (generate_sqs,
                                             generate_sqs_from_supercells,
                                             generate_sqs_by_enumeration,
                                             generate_target_structure)

from icet.input_output.logging_tools import set_log_config
set_log_config(level='INFO')

# Generate SQS for binary fcc, 50 % concentration
primitive_structure = bulk('Au')
cs = ClusterSpace(primitive_structure, [8.0, 4.0], ['Au', 'Pd'])
target_concentrations = {'Au': 0.5, 'Pd': 0.5}
sqs = generate_sqs(cluster_space=cs,
                   max_size=8,
                   target_concentrations=target_concentrations)
print('Cluster vector of generated structure:', cs.get_cluster_vector(sqs))

# Generate SQS for binary fcc with specified supercells
supercells = [primitive_structure.repeat((1, 2, 4))]
sqs = generate_sqs_from_supercells(cluster_space=cs,
                                   supercells=supercells,
                                   n_steps=10000,
                                   target_concentrations=target_concentrations)
コード例 #6
0
import os
import unittest

import numpy as np
from ase import Atoms
from ase.build import bulk

from icet import ClusterExpansion, ClusterSpace
from icet.input_output.logging_tools import set_log_config
from mchammer.calculators import ClusterExpansionCalculator
from mchammer.ensembles import WangLandauEnsemble
from mchammer.observers.base_observer import BaseObserver

set_log_config(level=100)


class ConcreteObserver(BaseObserver):
    """Child class of BaseObserver created for testing."""
    def __init__(self, interval, tag='ConcreteObserver'):
        super().__init__(interval=interval, return_type=int, tag=tag)

    def get_observable(self, structure):
        """Returns number of Au atoms."""
        return structure.get_chemical_symbols().count('Au')


class TestEnsemble(unittest.TestCase):
    """Container for tests of the class functionality."""
    def __init__(self, *args, **kwargs):
        super(TestEnsemble, self).__init__(*args, **kwargs)
コード例 #7
0
ファイル: main.py プロジェクト: dengxiongshi/icet-master
    tests.sort()
    for test in tests:
        if test.endswith('__.py'):
            continue
        test = ScriptTestCase(filename=test)
        suite.addTest(test)


if __name__ == "__main__":

    from generate_structures_for_testing import create_database

    create_database()

    set_log_config(level='ERROR')

    # Find testing dirs
    main_dir = os.path.dirname(__file__)
    unittest_dir = os.path.join(main_dir, 'unittest')
    integration_dir = os.path.join(main_dir, 'integration')

    # Collect tests
    suite = unittest.TestLoader().discover(unittest_dir, pattern="*.py")
    find_script_tests(suite, integration_dir)

    # Run tests
    ttr = unittest.TextTestRunner(stream=sys.stdout, verbosity=2)
    results = ttr.run(suite)

    assert len(results.failures) == 0, "At least one test failed"