Пример #1
0
    def setUp(self):
        # without spin polarization:
        are_coops = False
        is_spin_polarized = False
        list_atom2 = ['K2', 'K2', 'K2', 'K2', 'K2', 'K2']
        list_icohp = [{Spin.up: -0.40075}, {Spin.up: -0.40074}, {Spin.up: -0.40079}, {Spin.up: -0.40079},
                      {Spin.up: -0.40074}, {Spin.up: -0.40075}]
        list_icoop = [{Spin.up: 0.02342}, {Spin.up: 0.02342}, {Spin.up: 0.02343}, {Spin.up: 0.02343},
                      {Spin.up: 0.02342}, {Spin.up: 0.02342}]
        list_labels = ['1', '2', '3', '4', '5', '6']
        list_length = [2.71199, 2.71199, 2.71199, 2.71199, 2.71199, 2.71199]
        list_num = [1, 1, 1, 1, 1, 1]
        list_atom1 = ['F1', 'F1', 'F1', 'F1', 'F1', 'F1']
        list_translation = [[0, -1, -1], [-1, 0, -1], [0, 0, -1], [-1, -1, 0], [0, -1, 0], [-1, 0, 0]]
        self.icohpcollection_KF = IcohpCollection(is_spin_polarized=is_spin_polarized, are_coops=are_coops,
                                                  list_labels=list_labels, list_atom1=list_atom1, list_atom2=list_atom2,
                                                  list_length=list_length, list_translation=list_translation,
                                                  list_num=list_num, list_icohp=list_icohp)

        self.icoopcollection_KF = IcohpCollection(is_spin_polarized=is_spin_polarized, are_coops=True,
                                                  list_labels=list_labels, list_atom1=list_atom1, list_atom2=list_atom2,
                                                  list_length=list_length, list_translation=list_translation,
                                                  list_num=list_num, list_icohp=list_icoop)

        # with spin polarization:
        list_atom2_sp = ['Fe7', 'Fe9']
        list_labels_sp = ['1', '2']
        list_translation_sp = [[0, 0, 0], [0, 0, 0]]
        list_length_sp = [2.83189, 2.45249]
        list_atom1_sp = ['Fe8', 'Fe8']
        is_spin_polarized_sp = True
        are_coops_sp = False
        list_num_sp = [2, 1]
        list_icohp_sp = [{Spin.up: -0.10218, Spin.down: -0.19701}, {Spin.up: -0.28485, Spin.down: -0.58279}]
        list_icoop_sp = [{Spin.up: -0.11389, Spin.down: -0.20828}, {Spin.up: -0.04087, Spin.down: -0.05756}]

        self.icohpcollection_Fe = IcohpCollection(is_spin_polarized=is_spin_polarized_sp, are_coops=are_coops_sp,
                                                  list_labels=list_labels_sp, list_atom1=list_atom1_sp,
                                                  list_atom2=list_atom2_sp, list_length=list_length_sp,
                                                  list_translation=list_translation_sp, list_num=list_num_sp,
                                                  list_icohp=list_icohp_sp)
        self.icoopcollection_Fe = IcohpCollection(is_spin_polarized=is_spin_polarized_sp, are_coops=True,
                                                  list_labels=list_labels_sp, list_atom1=list_atom1_sp,
                                                  list_atom2=list_atom2_sp, list_length=list_length_sp,
                                                  list_translation=list_translation_sp, list_num=list_num_sp,
                                                  list_icohp=list_icoop_sp)
Пример #2
0
    def setUp(self):
        # without spin polarization:
        are_coops = False
        is_spin_polarized = False
        list_atom2 = ['K2', 'K2', 'K2', 'K2', 'K2', 'K2']
        list_icohp = [{Spin.up: -0.40075}, {Spin.up: -0.40074}, {Spin.up: -0.40079}, {Spin.up: -0.40079},
                      {Spin.up: -0.40074}, {Spin.up: -0.40075}]
        list_icoop = [{Spin.up: 0.02342}, {Spin.up: 0.02342}, {Spin.up: 0.02343}, {Spin.up: 0.02343},
                      {Spin.up: 0.02342}, {Spin.up: 0.02342}]
        list_labels = ['1', '2', '3', '4', '5', '6']
        list_length = [2.71199, 2.71199, 2.71199, 2.71199, 2.71199, 2.71199]
        list_num = [1, 1, 1, 1, 1, 1]
        list_atom1 = ['F1', 'F1', 'F1', 'F1', 'F1', 'F1']
        list_translation = [[0, -1, -1], [-1, 0, -1], [0, 0, -1], [-1, -1, 0], [0, -1, 0], [-1, 0, 0]]
        self.icohpcollection_KF = IcohpCollection(is_spin_polarized=is_spin_polarized, are_coops=are_coops,
                                                  list_labels=list_labels, list_atom1=list_atom1, list_atom2=list_atom2,
                                                  list_length=list_length, list_translation=list_translation,
                                                  list_num=list_num, list_icohp=list_icohp)

        self.icoopcollection_KF = IcohpCollection(is_spin_polarized=is_spin_polarized, are_coops=True,
                                                  list_labels=list_labels, list_atom1=list_atom1, list_atom2=list_atom2,
                                                  list_length=list_length, list_translation=list_translation,
                                                  list_num=list_num, list_icohp=list_icoop)

        # with spin polarization:
        list_atom2_sp = ['Fe7', 'Fe9']
        list_labels_sp = ['1', '2']
        list_translation_sp = [[0, 0, 0], [0, 0, 0]]
        list_length_sp = [2.83189, 2.45249]
        list_atom1_sp = ['Fe8', 'Fe8']
        is_spin_polarized_sp = True
        are_coops_sp = False
        list_num_sp = [2, 1]
        list_icohp_sp = [{Spin.up: -0.10218, Spin.down: -0.19701}, {Spin.up: -0.28485, Spin.down: -0.58279}]
        list_icoop_sp = [{Spin.up: -0.11389, Spin.down: -0.20828}, {Spin.up: -0.04087, Spin.down: -0.05756}]

        self.icohpcollection_Fe = IcohpCollection(is_spin_polarized=is_spin_polarized_sp, are_coops=are_coops_sp,
                                                  list_labels=list_labels_sp, list_atom1=list_atom1_sp,
                                                  list_atom2=list_atom2_sp, list_length=list_length_sp,
                                                  list_translation=list_translation_sp, list_num=list_num_sp,
                                                  list_icohp=list_icohp_sp)
        self.icoopcollection_Fe = IcohpCollection(is_spin_polarized=is_spin_polarized_sp, are_coops=True,
                                                  list_labels=list_labels_sp, list_atom1=list_atom1_sp,
                                                  list_atom2=list_atom2_sp, list_length=list_length_sp,
                                                  list_translation=list_translation_sp, list_num=list_num_sp,
                                                  list_icohp=list_icoop_sp)
Пример #3
0
    def setUp(self):
        # without spin polarization:
        are_coops = False
        is_spin_polarized = False
        list_atom2 = ["K2", "K2", "K2", "K2", "K2", "K2"]
        list_icohp = [
            {Spin.up: -0.40075},
            {Spin.up: -0.40074},
            {Spin.up: -0.40079},
            {Spin.up: -0.40079},
            {Spin.up: -0.40074},
            {Spin.up: -0.40075},
        ]
        list_icoop = [
            {Spin.up: 0.02342},
            {Spin.up: 0.02342},
            {Spin.up: 0.02343},
            {Spin.up: 0.02343},
            {Spin.up: 0.02342},
            {Spin.up: 0.02342},
        ]
        list_labels = ["1", "2", "3", "4", "5", "6"]
        list_length = [2.71199, 2.71199, 2.71199, 2.71199, 2.71199, 2.71199]
        list_num = [1, 1, 1, 1, 1, 1]
        list_atom1 = ["F1", "F1", "F1", "F1", "F1", "F1"]
        list_translation = [
            [0, -1, -1],
            [-1, 0, -1],
            [0, 0, -1],
            [-1, -1, 0],
            [0, -1, 0],
            [-1, 0, 0],
        ]
        self.icohpcollection_KF = IcohpCollection(
            is_spin_polarized=is_spin_polarized,
            are_coops=are_coops,
            list_labels=list_labels,
            list_atom1=list_atom1,
            list_atom2=list_atom2,
            list_length=list_length,
            list_translation=list_translation,
            list_num=list_num,
            list_icohp=list_icohp,
        )

        self.icoopcollection_KF = IcohpCollection(
            is_spin_polarized=is_spin_polarized,
            are_coops=True,
            list_labels=list_labels,
            list_atom1=list_atom1,
            list_atom2=list_atom2,
            list_length=list_length,
            list_translation=list_translation,
            list_num=list_num,
            list_icohp=list_icoop,
        )

        # with spin polarization:
        list_atom2_sp = ["Fe7", "Fe9"]
        list_labels_sp = ["1", "2"]
        list_translation_sp = [[0, 0, 0], [0, 0, 0]]
        list_length_sp = [2.83189, 2.45249]
        list_atom1_sp = ["Fe8", "Fe8"]
        is_spin_polarized_sp = True
        are_coops_sp = False
        list_num_sp = [2, 1]
        list_icohp_sp = [
            {Spin.up: -0.10218, Spin.down: -0.19701},
            {Spin.up: -0.28485, Spin.down: -0.58279},
        ]
        list_icoop_sp = [
            {Spin.up: -0.11389, Spin.down: -0.20828},
            {Spin.up: -0.04087, Spin.down: -0.05756},
        ]

        self.icohpcollection_Fe = IcohpCollection(
            is_spin_polarized=is_spin_polarized_sp,
            are_coops=are_coops_sp,
            list_labels=list_labels_sp,
            list_atom1=list_atom1_sp,
            list_atom2=list_atom2_sp,
            list_length=list_length_sp,
            list_translation=list_translation_sp,
            list_num=list_num_sp,
            list_icohp=list_icohp_sp,
        )
        self.icoopcollection_Fe = IcohpCollection(
            is_spin_polarized=is_spin_polarized_sp,
            are_coops=True,
            list_labels=list_labels_sp,
            list_atom1=list_atom1_sp,
            list_atom2=list_atom2_sp,
            list_length=list_length_sp,
            list_translation=list_translation_sp,
            list_num=list_num_sp,
            list_icohp=list_icoop_sp,
        )
Пример #4
0
class CombinedIcohpTest(unittest.TestCase):
    def setUp(self):
        # without spin polarization:
        are_coops = False
        is_spin_polarized = False
        list_atom2 = ["K2", "K2", "K2", "K2", "K2", "K2"]
        list_icohp = [
            {Spin.up: -0.40075},
            {Spin.up: -0.40074},
            {Spin.up: -0.40079},
            {Spin.up: -0.40079},
            {Spin.up: -0.40074},
            {Spin.up: -0.40075},
        ]
        list_icoop = [
            {Spin.up: 0.02342},
            {Spin.up: 0.02342},
            {Spin.up: 0.02343},
            {Spin.up: 0.02343},
            {Spin.up: 0.02342},
            {Spin.up: 0.02342},
        ]
        list_labels = ["1", "2", "3", "4", "5", "6"]
        list_length = [2.71199, 2.71199, 2.71199, 2.71199, 2.71199, 2.71199]
        list_num = [1, 1, 1, 1, 1, 1]
        list_atom1 = ["F1", "F1", "F1", "F1", "F1", "F1"]
        list_translation = [
            [0, -1, -1],
            [-1, 0, -1],
            [0, 0, -1],
            [-1, -1, 0],
            [0, -1, 0],
            [-1, 0, 0],
        ]
        self.icohpcollection_KF = IcohpCollection(
            is_spin_polarized=is_spin_polarized,
            are_coops=are_coops,
            list_labels=list_labels,
            list_atom1=list_atom1,
            list_atom2=list_atom2,
            list_length=list_length,
            list_translation=list_translation,
            list_num=list_num,
            list_icohp=list_icohp,
        )

        self.icoopcollection_KF = IcohpCollection(
            is_spin_polarized=is_spin_polarized,
            are_coops=True,
            list_labels=list_labels,
            list_atom1=list_atom1,
            list_atom2=list_atom2,
            list_length=list_length,
            list_translation=list_translation,
            list_num=list_num,
            list_icohp=list_icoop,
        )

        # with spin polarization:
        list_atom2_sp = ["Fe7", "Fe9"]
        list_labels_sp = ["1", "2"]
        list_translation_sp = [[0, 0, 0], [0, 0, 0]]
        list_length_sp = [2.83189, 2.45249]
        list_atom1_sp = ["Fe8", "Fe8"]
        is_spin_polarized_sp = True
        are_coops_sp = False
        list_num_sp = [2, 1]
        list_icohp_sp = [
            {Spin.up: -0.10218, Spin.down: -0.19701},
            {Spin.up: -0.28485, Spin.down: -0.58279},
        ]
        list_icoop_sp = [
            {Spin.up: -0.11389, Spin.down: -0.20828},
            {Spin.up: -0.04087, Spin.down: -0.05756},
        ]

        self.icohpcollection_Fe = IcohpCollection(
            is_spin_polarized=is_spin_polarized_sp,
            are_coops=are_coops_sp,
            list_labels=list_labels_sp,
            list_atom1=list_atom1_sp,
            list_atom2=list_atom2_sp,
            list_length=list_length_sp,
            list_translation=list_translation_sp,
            list_num=list_num_sp,
            list_icohp=list_icohp_sp,
        )
        self.icoopcollection_Fe = IcohpCollection(
            is_spin_polarized=is_spin_polarized_sp,
            are_coops=True,
            list_labels=list_labels_sp,
            list_atom1=list_atom1_sp,
            list_atom2=list_atom2_sp,
            list_length=list_length_sp,
            list_translation=list_translation_sp,
            list_num=list_num_sp,
            list_icohp=list_icoop_sp,
        )

    def test_get_icohp_by_label(self):
        # without spin polarization

        # ICOHPs
        self.assertEqual(self.icohpcollection_KF.get_icohp_by_label("1"), -0.40075)
        self.assertEqual(self.icohpcollection_KF.get_icohp_by_label("2"), -0.40074)
        self.assertEqual(self.icohpcollection_KF.get_icohp_by_label("3"), -0.40079)
        self.assertEqual(self.icohpcollection_KF.get_icohp_by_label("4"), -0.40079)
        self.assertEqual(self.icohpcollection_KF.get_icohp_by_label("5"), -0.40074)
        self.assertEqual(self.icohpcollection_KF.get_icohp_by_label("6"), -0.40075)

        # with spin polarization
        # summed spin
        # ICOHPs
        self.assertEqual(
            self.icohpcollection_Fe.get_icohp_by_label("1"), -0.10218 - 0.19701
        )
        self.assertEqual(
            self.icohpcollection_Fe.get_icohp_by_label("2"), -0.28485 - 0.58279
        )

        # Spin up
        # ICOHPs
        self.assertEqual(
            self.icohpcollection_Fe.get_icohp_by_label("1", summed_spin_channels=False),
            -0.10218,
        )
        self.assertEqual(
            self.icohpcollection_Fe.get_icohp_by_label("2", summed_spin_channels=False),
            -0.28485,
        )

        # Spin down
        # ICOHPs
        self.assertEqual(
            self.icohpcollection_Fe.get_icohp_by_label(
                "1", summed_spin_channels=False, spin=Spin.down
            ),
            -0.19701,
        )
        self.assertEqual(
            self.icohpcollection_Fe.get_icohp_by_label(
                "2", summed_spin_channels=False, spin=Spin.down
            ),
            -0.58279,
        )

    def test_get_summed_icohp_by_label_list(self):
        # without spin polarization
        self.assertAlmostEqual(
            self.icohpcollection_KF.get_summed_icohp_by_label_list(
                ["1", "2", "3", "4", "5", "6"], divisor=6.0
            ),
            -0.40076,
        )

        # with spin polarization
        sum1 = (-0.10218 - 0.19701 - 0.28485 - 0.58279) / 2.0
        sum2 = (-0.10218 - 0.28485) / 2.0
        sum3 = (-0.19701 - 0.58279) / 2.0
        self.assertAlmostEqual(
            self.icohpcollection_Fe.get_summed_icohp_by_label_list(
                ["1", "2"], divisor=2.0
            ),
            sum1,
        )
        self.assertAlmostEqual(
            self.icohpcollection_Fe.get_summed_icohp_by_label_list(
                ["1", "2"], summed_spin_channels=False, divisor=2.0
            ),
            sum2,
        )
        self.assertAlmostEqual(
            self.icohpcollection_Fe.get_summed_icohp_by_label_list(
                ["1", "2"], summed_spin_channels=False, spin=Spin.down, divisor=2.0
            ),
            sum3,
        )

    def test_get_icohp_dict_by_bondlengths(self):
        # without spin polarization
        icohpvalue = {}
        icohpvalue["1"] = {
            "@module": "pymatgen.electronic_structure.cohp",
            "num": 1,
            "length": 2.71199,
            "icohp": {Spin.up: -0.40075},
            "are_coops": False,
            "label": "1",
            "atom2": "K2",
            "@class": "IcohpValue",
            "atom1": "F1",
            "translation": [0, -1, -1],
        }
        icohpvalue["2"] = {
            "@module": "pymatgen.electronic_structure.cohp",
            "num": 1,
            "length": 2.71199,
            "icohp": {Spin.up: -0.40074},
            "are_coops": False,
            "label": "2",
            "atom2": "K2",
            "@class": "IcohpValue",
            "atom1": "F1",
            "translation": [-1, 0, -1],
        }
        icohpvalue["3"] = {
            "@module": "pymatgen.electronic_structure.cohp",
            "num": 1,
            "length": 2.71199,
            "icohp": {Spin.up: -0.40079},
            "are_coops": False,
            "label": "3",
            "atom2": "K2",
            "@class": "IcohpValue",
            "atom1": "F1",
            "translation": [0, 0, -1],
        }
        icohpvalue["4"] = {
            "@module": "pymatgen.electronic_structure.cohp",
            "num": 1,
            "length": 2.71199,
            "icohp": {Spin.up: -0.40079},
            "are_coops": False,
            "label": "4",
            "atom2": "K2",
            "@class": "IcohpValue",
            "atom1": "F1",
            "translation": [-1, -1, 0],
        }
        icohpvalue["5"] = {
            "@module": "pymatgen.electronic_structure.cohp",
            "num": 1,
            "length": 2.71199,
            "icohp": {Spin.up: -0.40074},
            "are_coops": False,
            "label": "5",
            "atom2": "K2",
            "@class": "IcohpValue",
            "atom1": "F1",
            "translation": [0, -1, 0],
        }
        icohpvalue["6"] = {
            "@module": "pymatgen.electronic_structure.cohp",
            "num": 1,
            "length": 2.71199,
            "icohp": {Spin.up: -0.40075},
            "are_coops": False,
            "label": "6",
            "atom2": "K2",
            "@class": "IcohpValue",
            "atom1": "F1",
            "translation": [-1, 0, 0],
        }

        dict_KF = self.icohpcollection_KF.get_icohp_dict_by_bondlengths(
            minbondlength=0.0, maxbondlength=8.0
        )
        for key, value in sorted(dict_KF.items()):
            v = value.as_dict()
            if "@version" in v:
                v.pop("@version")
            self.assertDictEqual(v, icohpvalue[key])

        self.assertDictEqual(
            {},
            self.icohpcollection_KF.get_icohp_dict_by_bondlengths(
                minbondlength=0.0, maxbondlength=1.0
            ),
        )

        # with spin polarization
        icohpvalue_spin = {}
        icohpvalue_spin["1"] = {
            "num": 2,
            "atom2": "Fe7",
            "translation": [0, 0, 0],
            "@module": "pymatgen.electronic_structure.cohp",
            "are_coops": False,
            "atom1": "Fe8",
            "label": "1",
            "length": 2.83189,
            "@class": "IcohpValue",
            "icohp": {Spin.up: -0.10218, Spin.down: -0.19701},
        }
        icohpvalue_spin["2"] = {
            "num": 1,
            "atom2": "Fe9",
            "translation": [0, 0, 0],
            "@module": "pymatgen.electronic_structure.cohp",
            "are_coops": False,
            "atom1": "Fe8",
            "label": "2",
            "length": 2.45249,
            "@class": "IcohpValue",
            "icohp": {Spin.up: -0.28485, Spin.down: -0.58279},
        }

        dict_Fe = self.icohpcollection_Fe.get_icohp_dict_by_bondlengths(
            minbondlength=0.0, maxbondlength=8.0
        )
        for key, value in sorted(dict_Fe.items()):
            v = value.as_dict()
            if "@version" in v:
                v.pop("@version")
            self.assertDictEqual(v, icohpvalue_spin[key])

        dict_Fe2 = self.icohpcollection_Fe.get_icohp_dict_by_bondlengths(
            minbondlength=2.5, maxbondlength=2.9
        )
        self.assertEqual(len(dict_Fe2), 1)
        for key, value in sorted(dict_Fe2.items()):
            v = value.as_dict()
            if "@version" in v:
                v.pop("@version")
            self.assertDictEqual(v, icohpvalue_spin[key])

    def test_get_icohp_dict_of_site(self):
        # without spin polarization
        icohpvalue = {}
        icohpvalue["1"] = {
            "translation": [0, -1, -1],
            "are_coops": False,
            "@module": "pymatgen.electronic_structure.cohp",
            "length": 2.71199,
            "atom2": "K2",
            "@class": "IcohpValue",
            "atom1": "F1",
            "num": 1,
            "label": "1",
            "icohp": {Spin.up: -0.40075},
        }
        icohpvalue["2"] = {
            "translation": [-1, 0, -1],
            "are_coops": False,
            "@module": "pymatgen.electronic_structure.cohp",
            "length": 2.71199,
            "atom2": "K2",
            "@class": "IcohpValue",
            "atom1": "F1",
            "num": 1,
            "label": "2",
            "icohp": {Spin.up: -0.40074},
        }
        icohpvalue["3"] = {
            "translation": [0, 0, -1],
            "are_coops": False,
            "@module": "pymatgen.electronic_structure.cohp",
            "length": 2.71199,
            "atom2": "K2",
            "@class": "IcohpValue",
            "atom1": "F1",
            "num": 1,
            "label": "3",
            "icohp": {Spin.up: -0.40079},
        }
        icohpvalue["4"] = {
            "translation": [-1, -1, 0],
            "are_coops": False,
            "@module": "pymatgen.electronic_structure.cohp",
            "length": 2.71199,
            "atom2": "K2",
            "@class": "IcohpValue",
            "atom1": "F1",
            "num": 1,
            "label": "4",
            "icohp": {Spin.up: -0.40079},
        }
        icohpvalue["5"] = {
            "translation": [0, -1, 0],
            "are_coops": False,
            "@module": "pymatgen.electronic_structure.cohp",
            "length": 2.71199,
            "atom2": "K2",
            "@class": "IcohpValue",
            "atom1": "F1",
            "num": 1,
            "label": "5",
            "icohp": {Spin.up: -0.40074},
        }
        icohpvalue["6"] = {
            "translation": [-1, 0, 0],
            "are_coops": False,
            "@module": "pymatgen.electronic_structure.cohp",
            "length": 2.71199,
            "atom2": "K2",
            "@class": "IcohpValue",
            "atom1": "F1",
            "num": 1,
            "label": "6",
            "icohp": {Spin.up: -0.40075},
        }

        dict_KF = self.icohpcollection_KF.get_icohp_dict_of_site(site=0)

        for key, value in sorted(dict_KF.items()):
            v = value.as_dict()
            if "@version" in v:
                v.pop("@version")
            self.assertDictEqual(v, icohpvalue[key])

        # compare number of results dependent on minsummedicohp, maxsummedicohp,minbondlength, maxbondlength, and
        # only_bonds_to
        dict_KF_2 = self.icohpcollection_KF.get_icohp_dict_of_site(
            site=0,
            minsummedicohp=None,
            maxsummedicohp=-0.0,
            minbondlength=0.0,
            maxbondlength=8.0,
        )
        dict_KF_3 = self.icohpcollection_KF.get_icohp_dict_of_site(
            site=0,
            minsummedicohp=None,
            maxsummedicohp=-0.5,
            minbondlength=0.0,
            maxbondlength=8.0,
        )
        dict_KF_4 = self.icohpcollection_KF.get_icohp_dict_of_site(
            site=0,
            minsummedicohp=0.0,
            maxsummedicohp=None,
            minbondlength=0.0,
            maxbondlength=8.0,
        )
        dict_KF_5 = self.icohpcollection_KF.get_icohp_dict_of_site(
            site=0,
            minsummedicohp=None,
            maxsummedicohp=None,
            minbondlength=0.0,
            maxbondlength=2.0,
        )
        dict_KF_6 = self.icohpcollection_KF.get_icohp_dict_of_site(
            site=0,
            minsummedicohp=None,
            maxsummedicohp=None,
            minbondlength=3.0,
            maxbondlength=8.0,
        )
        dict_KF_7 = self.icohpcollection_KF.get_icohp_dict_of_site(
            site=0, only_bonds_to=["K"]
        )
        dict_KF_8 = self.icohpcollection_KF.get_icohp_dict_of_site(
            site=1, only_bonds_to=["K"]
        )
        dict_KF_9 = self.icohpcollection_KF.get_icohp_dict_of_site(
            site=1, only_bonds_to=["F"]
        )

        self.assertEqual(len(dict_KF_2), 6)
        self.assertEqual(len(dict_KF_3), 0)
        self.assertEqual(len(dict_KF_4), 0)
        self.assertEqual(len(dict_KF_5), 0)
        self.assertEqual(len(dict_KF_6), 0)
        self.assertEqual(len(dict_KF_7), 6)
        self.assertEqual(len(dict_KF_8), 0)
        self.assertEqual(len(dict_KF_9), 6)

        # spin polarization

        dict_Fe = self.icohpcollection_Fe.get_icohp_dict_of_site(site=0)
        self.assertEqual(len(dict_Fe), 0)

        # Fe8
        dict_Fe2 = self.icohpcollection_Fe.get_icohp_dict_of_site(site=7)
        self.assertEqual(len(dict_Fe2), 2)
        # Test the values

        icohplist_Fe = {}
        icohplist_Fe["1"] = {
            "are_coops": False,
            "translation": [0, 0, 0],
            "icohp": {Spin.down: -0.19701, Spin.up: -0.10218},
            "length": 2.83189,
            "@module": "pymatgen.electronic_structure.cohp",
            "atom1": "Fe8",
            "atom2": "Fe7",
            "label": "1",
            "@class": "IcohpValue",
            "num": 2,
        }
        icohplist_Fe["2"] = {
            "are_coops": False,
            "translation": [0, 0, 0],
            "icohp": {Spin.down: -0.58279, Spin.up: -0.28485},
            "length": 2.45249,
            "@module": "pymatgen.electronic_structure.cohp",
            "atom1": "Fe8",
            "atom2": "Fe9",
            "label": "2",
            "@class": "IcohpValue",
            "num": 1,
        }

        for key, value in sorted(dict_Fe2.items()):
            v = value.as_dict()
            if "@version" in v:
                v.pop("@version")
            self.assertEqual(v, icohplist_Fe[key])

        # Fe9
        dict_Fe3 = self.icohpcollection_Fe.get_icohp_dict_of_site(site=8)
        self.assertEqual(len(dict_Fe3), 1)

        # compare number of results dependent on minsummedicohp, maxsummedicohp,minbondlength, maxbondlength
        # Fe8
        dict_Fe4 = self.icohpcollection_Fe.get_icohp_dict_of_site(
            site=7,
            minsummedicohp=-0.3,
            maxsummedicohp=None,
            minbondlength=0.0,
            maxbondlength=8.0,
        )
        self.assertEqual(len(dict_Fe4), 1)
        values = []
        for key, value in dict_Fe4.items():
            values.append(value)
        v = values[0].as_dict()
        if "@version" in v:
            v.pop("@version")
        self.assertDictEqual(v, icohplist_Fe["1"])

        dict_Fe5 = self.icohpcollection_Fe.get_icohp_dict_of_site(
            site=7,
            minsummedicohp=None,
            maxsummedicohp=-0.3,
            minbondlength=0.0,
            maxbondlength=8.0,
        )
        self.assertEqual(len(dict_Fe5), 1)
        values = []
        for key, value in dict_Fe5.items():
            values.append(value)
        v = values[0].as_dict()
        if "@version" in v:
            v.pop("@version")
        self.assertDictEqual(v, icohplist_Fe["2"])

        dict_Fe6 = self.icohpcollection_Fe.get_icohp_dict_of_site(
            site=7,
            minsummedicohp=None,
            maxsummedicohp=None,
            minbondlength=0.0,
            maxbondlength=2.5,
        )

        self.assertEqual(len(dict_Fe6), 1)
        values = []
        for key, value in dict_Fe6.items():
            values.append(value)
        v = values[0].as_dict()
        if "@version" in v:
            v.pop("@version")
        self.assertDictEqual(v, icohplist_Fe["2"])

        dict_Fe7 = self.icohpcollection_Fe.get_icohp_dict_of_site(
            site=7,
            minsummedicohp=None,
            maxsummedicohp=None,
            minbondlength=2.5,
            maxbondlength=8.0,
        )
        self.assertEqual(len(dict_Fe7), 1)
        values = []
        for key, value in dict_Fe7.items():
            values.append(value)
        v = values[0].as_dict()
        if "@version" in v:
            v.pop("@version")
        self.assertDictEqual(v, icohplist_Fe["1"])

    def test_extremum_icohpvalue(self):
        # without spin polarization
        # ICOHPs
        self.assertEqual(self.icohpcollection_KF.extremum_icohpvalue(), -0.40079)
        # ICOOPs
        self.assertEqual(self.icoopcollection_KF.extremum_icohpvalue(), 0.02343)
        # with spin polarization
        # summed spin
        # ICOHPs
        self.assertEqual(self.icohpcollection_Fe.extremum_icohpvalue(), -0.86764)
        self.assertAlmostEqual(
            self.icoopcollection_Fe.extremum_icohpvalue(), -0.09842999999999999
        )
        # ICOOPs
        # spin up
        # ICOHPs
        self.assertEqual(
            self.icohpcollection_Fe.extremum_icohpvalue(summed_spin_channels=False),
            -0.28485,
        )
        # ICOOPs
        self.assertEqual(
            self.icoopcollection_Fe.extremum_icohpvalue(summed_spin_channels=False),
            -0.04087,
        )
        # spin down
        # ICOHPs
        self.assertEqual(
            self.icohpcollection_Fe.extremum_icohpvalue(
                summed_spin_channels=False, spin=Spin.down
            ),
            -0.58279,
        )
        # ICOOPs
        self.assertEqual(
            self.icoopcollection_Fe.extremum_icohpvalue(
                summed_spin_channels=False, spin=Spin.down
            ),
            -0.05756,
        )
Пример #5
0
    def __init__(self, are_coops=False, filename=None):

        self.are_coops = are_coops
        if filename is None:
            filename = "ICOOPLIST.lobster" if are_coops \
                else "ICOHPLIST.lobster"

        # LOBSTER list files have an extra trailing blank line
        # and we don't need the header.
        with zopen(filename) as f:
            data = f.read().split("\n")[1:-1]
        if len(data) == 0:
            raise IOError("ICOHPLIST file contains no data.")

        # Which Lobster version?
        if len(data[0].split()) == 8:
            version = '3.1.1'
        elif len(data[0].split()) == 6:
            version = '2.2.1'
            warnings.warn(
                'Please consider using the new Lobster version. See www.cohp.de.'
            )
        else:
            raise ValueError

        # If the calculation is spin polarized, the line in the middle
        # of the file will be another header line.
        if "distance" in data[len(data) // 2]:
            num_bonds = len(data) // 2
            if num_bonds == 0:
                raise IOError("ICOHPLIST file contains no data.")
            self.is_spin_polarized = True
        else:
            num_bonds = len(data)
            self.is_spin_polarized = False

        list_labels = []
        list_atom1 = []
        list_atom2 = []
        list_length = []
        list_translation = []
        list_num = []
        list_icohp = []
        for bond in range(num_bonds):
            line = data[bond].split()
            icohp = {}
            if version == '2.2.1':
                label = "%s" % (line[0])
                atom1 = str(line[1])
                atom2 = str(line[2])
                length = float(line[3])
                icohp[Spin.up] = float(line[4])
                num = int(line[5])
                translation = [0, 0, 0]
                if self.is_spin_polarized:
                    icohp[Spin.down] = float(data[bond + num_bonds +
                                                  1].split()[4])

            elif version == '3.1.1':
                label = "%s" % (line[0])
                atom1 = str(line[1])
                atom2 = str(line[2])
                length = float(line[3])
                translation = [int(line[4]), int(line[5]), int(line[6])]
                icohp[Spin.up] = float(line[7])
                num = int(1)

                if self.is_spin_polarized:
                    icohp[Spin.down] = float(data[bond + num_bonds +
                                                  1].split()[7])

            list_labels.append(label)
            list_atom1.append(atom1)
            list_atom2.append(atom2)
            list_length.append(length)
            list_translation.append(translation)
            list_num.append(num)
            list_icohp.append(icohp)

        # to avoid circular dependencies
        from pymatgen.electronic_structure.cohp import IcohpCollection
        self._icohpcollection = IcohpCollection(
            are_coops=are_coops,
            list_labels=list_labels,
            list_atom1=list_atom1,
            list_atom2=list_atom2,
            list_length=list_length,
            list_translation=list_translation,
            list_num=list_num,
            list_icohp=list_icohp,
            is_spin_polarized=self.is_spin_polarized)
Пример #6
0
class CombinedIcohpTest(unittest.TestCase):
    def setUp(self):
        # without spin polarization:
        are_coops = False
        is_spin_polarized = False
        list_atom2 = ['K2', 'K2', 'K2', 'K2', 'K2', 'K2']
        list_icohp = [{
            Spin.up: -0.40075
        }, {
            Spin.up: -0.40074
        }, {
            Spin.up: -0.40079
        }, {
            Spin.up: -0.40079
        }, {
            Spin.up: -0.40074
        }, {
            Spin.up: -0.40075
        }]
        list_icoop = [{
            Spin.up: 0.02342
        }, {
            Spin.up: 0.02342
        }, {
            Spin.up: 0.02343
        }, {
            Spin.up: 0.02343
        }, {
            Spin.up: 0.02342
        }, {
            Spin.up: 0.02342
        }]
        list_labels = ['1', '2', '3', '4', '5', '6']
        list_length = [2.71199, 2.71199, 2.71199, 2.71199, 2.71199, 2.71199]
        list_num = [1, 1, 1, 1, 1, 1]
        list_atom1 = ['F1', 'F1', 'F1', 'F1', 'F1', 'F1']
        list_translation = [[0, -1, -1], [-1, 0, -1], [0, 0, -1], [-1, -1, 0],
                            [0, -1, 0], [-1, 0, 0]]
        self.icohpcollection_KF = IcohpCollection(
            is_spin_polarized=is_spin_polarized,
            are_coops=are_coops,
            list_labels=list_labels,
            list_atom1=list_atom1,
            list_atom2=list_atom2,
            list_length=list_length,
            list_translation=list_translation,
            list_num=list_num,
            list_icohp=list_icohp)

        self.icoopcollection_KF = IcohpCollection(
            is_spin_polarized=is_spin_polarized,
            are_coops=True,
            list_labels=list_labels,
            list_atom1=list_atom1,
            list_atom2=list_atom2,
            list_length=list_length,
            list_translation=list_translation,
            list_num=list_num,
            list_icohp=list_icoop)

        # with spin polarization:
        list_atom2_sp = ['Fe7', 'Fe9']
        list_labels_sp = ['1', '2']
        list_translation_sp = [[0, 0, 0], [0, 0, 0]]
        list_length_sp = [2.83189, 2.45249]
        list_atom1_sp = ['Fe8', 'Fe8']
        is_spin_polarized_sp = True
        are_coops_sp = False
        list_num_sp = [2, 1]
        list_icohp_sp = [{
            Spin.up: -0.10218,
            Spin.down: -0.19701
        }, {
            Spin.up: -0.28485,
            Spin.down: -0.58279
        }]
        list_icoop_sp = [{
            Spin.up: -0.11389,
            Spin.down: -0.20828
        }, {
            Spin.up: -0.04087,
            Spin.down: -0.05756
        }]

        self.icohpcollection_Fe = IcohpCollection(
            is_spin_polarized=is_spin_polarized_sp,
            are_coops=are_coops_sp,
            list_labels=list_labels_sp,
            list_atom1=list_atom1_sp,
            list_atom2=list_atom2_sp,
            list_length=list_length_sp,
            list_translation=list_translation_sp,
            list_num=list_num_sp,
            list_icohp=list_icohp_sp)
        self.icoopcollection_Fe = IcohpCollection(
            is_spin_polarized=is_spin_polarized_sp,
            are_coops=True,
            list_labels=list_labels_sp,
            list_atom1=list_atom1_sp,
            list_atom2=list_atom2_sp,
            list_length=list_length_sp,
            list_translation=list_translation_sp,
            list_num=list_num_sp,
            list_icohp=list_icoop_sp)

    def test_get_icohp_by_label(self):
        # without spin polarization

        # ICOHPs
        self.assertEqual(self.icohpcollection_KF.get_icohp_by_label("1"),
                         -0.40075)
        self.assertEqual(self.icohpcollection_KF.get_icohp_by_label("2"),
                         -0.40074)
        self.assertEqual(self.icohpcollection_KF.get_icohp_by_label("3"),
                         -0.40079)
        self.assertEqual(self.icohpcollection_KF.get_icohp_by_label("4"),
                         -0.40079)
        self.assertEqual(self.icohpcollection_KF.get_icohp_by_label("5"),
                         -0.40074)
        self.assertEqual(self.icohpcollection_KF.get_icohp_by_label("6"),
                         -0.40075)

        # with spin polarization
        # summed spin
        # ICOHPs
        self.assertEqual(self.icohpcollection_Fe.get_icohp_by_label("1"),
                         -0.10218 - 0.19701)
        self.assertEqual(self.icohpcollection_Fe.get_icohp_by_label("2"),
                         -0.28485 - 0.58279)

        # Spin up
        # ICOHPs
        self.assertEqual(
            self.icohpcollection_Fe.get_icohp_by_label(
                "1", summed_spin_channels=False), -0.10218)
        self.assertEqual(
            self.icohpcollection_Fe.get_icohp_by_label(
                "2", summed_spin_channels=False), -0.28485)

        # Spin down
        # ICOHPs
        self.assertEqual(
            self.icohpcollection_Fe.get_icohp_by_label(
                "1", summed_spin_channels=False, spin=Spin.down), -0.19701)
        self.assertEqual(
            self.icohpcollection_Fe.get_icohp_by_label(
                "2", summed_spin_channels=False, spin=Spin.down), -0.58279)

    def test_get_summed_icohp_by_labellist(self):
        # without spin polarization
        self.assertAlmostEqual(
            self.icohpcollection_KF.get_summed_icohp_by_labellist(
                ["1", "2", "3", "4", "5", "6"], divisor=6.0), -0.40076)

        # with spin polarization
        sum1 = (-0.10218 - 0.19701 - 0.28485 - 0.58279) / 2.0
        sum2 = (-0.10218 - 0.28485) / 2.0
        sum3 = (-0.19701 - 0.58279) / 2.0
        self.assertAlmostEqual(
            self.icohpcollection_Fe.get_summed_icohp_by_labellist(["1", "2"],
                                                                  divisor=2.0),
            sum1)
        self.assertAlmostEqual(
            self.icohpcollection_Fe.get_summed_icohp_by_labellist(
                ["1", "2"], summed_spin_channels=False, divisor=2.0), sum2)
        self.assertAlmostEqual(
            self.icohpcollection_Fe.get_summed_icohp_by_labellist(
                ["1", "2"],
                summed_spin_channels=False,
                spin=Spin.down,
                divisor=2.0), sum3)

    def test_get_icohp_dict_by_bondlengths(self):
        # without spin polarization
        icohpvalue = {}
        icohpvalue["1"] = {
            '@module': 'pymatgen.electronic_structure.cohp',
            'num': 1,
            'length': 2.71199,
            'icohp': {
                Spin.up: -0.40075
            },
            'are_coops': False,
            'label': '1',
            'atom2': 'K2',
            '@class': 'IcohpValue',
            'atom1': 'F1',
            'translation': [0, -1, -1]
        }
        icohpvalue["2"] = {
            '@module': 'pymatgen.electronic_structure.cohp',
            'num': 1,
            'length': 2.71199,
            'icohp': {
                Spin.up: -0.40074
            },
            'are_coops': False,
            'label': '2',
            'atom2': 'K2',
            '@class': 'IcohpValue',
            'atom1': 'F1',
            'translation': [-1, 0, -1]
        }
        icohpvalue["3"] = {
            '@module': 'pymatgen.electronic_structure.cohp',
            'num': 1,
            'length': 2.71199,
            'icohp': {
                Spin.up: -0.40079
            },
            'are_coops': False,
            'label': '3',
            'atom2': 'K2',
            '@class': 'IcohpValue',
            'atom1': 'F1',
            'translation': [0, 0, -1]
        }
        icohpvalue["4"] = {
            '@module': 'pymatgen.electronic_structure.cohp',
            'num': 1,
            'length': 2.71199,
            'icohp': {
                Spin.up: -0.40079
            },
            'are_coops': False,
            'label': '4',
            'atom2': 'K2',
            '@class': 'IcohpValue',
            'atom1': 'F1',
            'translation': [-1, -1, 0]
        }
        icohpvalue["5"] = {
            '@module': 'pymatgen.electronic_structure.cohp',
            'num': 1,
            'length': 2.71199,
            'icohp': {
                Spin.up: -0.40074
            },
            'are_coops': False,
            'label': '5',
            'atom2': 'K2',
            '@class': 'IcohpValue',
            'atom1': 'F1',
            'translation': [0, -1, 0]
        }
        icohpvalue["6"] = {
            '@module': 'pymatgen.electronic_structure.cohp',
            'num': 1,
            'length': 2.71199,
            'icohp': {
                Spin.up: -0.40075
            },
            'are_coops': False,
            'label': '6',
            'atom2': 'K2',
            '@class': 'IcohpValue',
            'atom1': 'F1',
            'translation': [-1, 0, 0]
        }

        dict_KF = self.icohpcollection_KF.get_icohp_dict_by_bondlengths(
            minbondlength=0.0, maxbondlength=8.0)
        for key, value in sorted(dict_KF.items()):
            self.assertDictEqual(value.as_dict(), icohpvalue[key])

        self.assertDictEqual(
            {},
            self.icohpcollection_KF.get_icohp_dict_by_bondlengths(
                minbondlength=0.0, maxbondlength=1.0))

        # with spin polarization
        icohpvalue_spin = {}
        icohpvalue_spin["1"] = {
            'num': 2,
            'atom2': 'Fe7',
            'translation': [0, 0, 0],
            '@module': 'pymatgen.electronic_structure.cohp',
            'are_coops': False,
            'atom1': 'Fe8',
            'label': '1',
            'length': 2.83189,
            '@class': 'IcohpValue',
            'icohp': {
                Spin.up: -0.10218,
                Spin.down: -0.19701
            }
        }
        icohpvalue_spin["2"] = {
            'num': 1,
            'atom2': 'Fe9',
            'translation': [0, 0, 0],
            '@module': 'pymatgen.electronic_structure.cohp',
            'are_coops': False,
            'atom1': 'Fe8',
            'label': '2',
            'length': 2.45249,
            '@class': 'IcohpValue',
            'icohp': {
                Spin.up: -0.28485,
                Spin.down: -0.58279
            }
        }

        dict_Fe = self.icohpcollection_Fe.get_icohp_dict_by_bondlengths(
            minbondlength=0.0, maxbondlength=8.0)
        for key, value in sorted(dict_Fe.items()):
            self.assertDictEqual(value.as_dict(), icohpvalue_spin[key])

        dict_Fe2 = self.icohpcollection_Fe.get_icohp_dict_by_bondlengths(
            minbondlength=2.5, maxbondlength=2.9)
        self.assertEqual(len(dict_Fe2), 1)
        for key, value in sorted(dict_Fe2.items()):
            self.assertDictEqual(value.as_dict(), icohpvalue_spin[key])

    def test_get_icohp_dict_of_certain_site(self):
        # without spin polarization
        icohpvalue = {}
        icohpvalue["1"] = {
            'translation': [0, -1, -1],
            'are_coops': False,
            '@module': 'pymatgen.electronic_structure.cohp',
            'length': 2.71199,
            'atom2': 'K2',
            '@class': 'IcohpValue',
            'atom1': 'F1',
            'num': 1,
            'label': '1',
            'icohp': {
                Spin.up: -0.40075
            }
        }
        icohpvalue["2"] = {
            'translation': [-1, 0, -1],
            'are_coops': False,
            '@module': 'pymatgen.electronic_structure.cohp',
            'length': 2.71199,
            'atom2': 'K2',
            '@class': 'IcohpValue',
            'atom1': 'F1',
            'num': 1,
            'label': '2',
            'icohp': {
                Spin.up: -0.40074
            }
        }
        icohpvalue["3"] = {
            'translation': [0, 0, -1],
            'are_coops': False,
            '@module': 'pymatgen.electronic_structure.cohp',
            'length': 2.71199,
            'atom2': 'K2',
            '@class': 'IcohpValue',
            'atom1': 'F1',
            'num': 1,
            'label': '3',
            'icohp': {
                Spin.up: -0.40079
            }
        }
        icohpvalue["4"] = {
            'translation': [-1, -1, 0],
            'are_coops': False,
            '@module': 'pymatgen.electronic_structure.cohp',
            'length': 2.71199,
            'atom2': 'K2',
            '@class': 'IcohpValue',
            'atom1': 'F1',
            'num': 1,
            'label': '4',
            'icohp': {
                Spin.up: -0.40079
            }
        }
        icohpvalue["5"] = {
            'translation': [0, -1, 0],
            'are_coops': False,
            '@module': 'pymatgen.electronic_structure.cohp',
            'length': 2.71199,
            'atom2': 'K2',
            '@class': 'IcohpValue',
            'atom1': 'F1',
            'num': 1,
            'label': '5',
            'icohp': {
                Spin.up: -0.40074
            }
        }
        icohpvalue["6"] = {
            'translation': [-1, 0, 0],
            'are_coops': False,
            '@module': 'pymatgen.electronic_structure.cohp',
            'length': 2.71199,
            'atom2': 'K2',
            '@class': 'IcohpValue',
            'atom1': 'F1',
            'num': 1,
            'label': '6',
            'icohp': {
                Spin.up: -0.40075
            }
        }

        dict_KF = self.icohpcollection_KF.get_icohp_dict_of_certain_site(
            site=0)

        for key, value in sorted(dict_KF.items()):
            self.assertDictEqual(value.as_dict(), icohpvalue[key])

        # compare number of results dependent on minsummedicohp, maxsummedicohp,minbondlength, maxbondlength
        dict_KF_2 = self.icohpcollection_KF.get_icohp_dict_of_certain_site(
            site=0,
            minsummedicohp=None,
            maxsummedicohp=-0.0,
            minbondlength=0.0,
            maxbondlength=8.0)
        dict_KF_3 = self.icohpcollection_KF.get_icohp_dict_of_certain_site(
            site=0,
            minsummedicohp=None,
            maxsummedicohp=-0.5,
            minbondlength=0.0,
            maxbondlength=8.0)
        dict_KF_4 = self.icohpcollection_KF.get_icohp_dict_of_certain_site(
            site=0,
            minsummedicohp=0.0,
            maxsummedicohp=None,
            minbondlength=0.0,
            maxbondlength=8.0)
        dict_KF_5 = self.icohpcollection_KF.get_icohp_dict_of_certain_site(
            site=0,
            minsummedicohp=None,
            maxsummedicohp=None,
            minbondlength=0.0,
            maxbondlength=2.0)
        dict_KF_6 = self.icohpcollection_KF.get_icohp_dict_of_certain_site(
            site=0,
            minsummedicohp=None,
            maxsummedicohp=None,
            minbondlength=3.0,
            maxbondlength=8.0)

        self.assertEqual(len(dict_KF_2), 6)
        self.assertEqual(len(dict_KF_3), 0)
        self.assertEqual(len(dict_KF_4), 0)
        self.assertEqual(len(dict_KF_5), 0)
        self.assertEqual(len(dict_KF_6), 0)

        # spin polarization

        dict_Fe = self.icohpcollection_Fe.get_icohp_dict_of_certain_site(
            site=0)
        self.assertEqual(len(dict_Fe), 0)

        # Fe8
        dict_Fe2 = self.icohpcollection_Fe.get_icohp_dict_of_certain_site(
            site=7)
        self.assertEqual(len(dict_Fe2), 2)
        # Test the values

        icohplist_Fe = {}
        icohplist_Fe["1"] = {
            'are_coops': False,
            'translation': [0, 0, 0],
            'icohp': {
                Spin.down: -0.19701,
                Spin.up: -0.10218
            },
            'length': 2.83189,
            '@module': 'pymatgen.electronic_structure.cohp',
            'atom1': 'Fe8',
            'atom2': 'Fe7',
            'label': '1',
            '@class': 'IcohpValue',
            'num': 2
        }
        icohplist_Fe["2"] = {
            'are_coops': False,
            'translation': [0, 0, 0],
            'icohp': {
                Spin.down: -0.58279,
                Spin.up: -0.28485
            },
            'length': 2.45249,
            '@module': 'pymatgen.electronic_structure.cohp',
            'atom1': 'Fe8',
            'atom2': 'Fe9',
            'label': '2',
            '@class': 'IcohpValue',
            'num': 1
        }

        for key, value in sorted(dict_Fe2.items()):
            self.assertEqual(value.as_dict(), icohplist_Fe[key])

        # Fe9
        dict_Fe3 = self.icohpcollection_Fe.get_icohp_dict_of_certain_site(
            site=8)
        self.assertEqual(len(dict_Fe3), 1)

        # compare number of results dependent on minsummedicohp, maxsummedicohp,minbondlength, maxbondlength
        # Fe8
        dict_Fe4 = self.icohpcollection_Fe.get_icohp_dict_of_certain_site(
            site=7,
            minsummedicohp=-0.3,
            maxsummedicohp=None,
            minbondlength=0.0,
            maxbondlength=8.0)
        self.assertEqual(len(dict_Fe4), 1)
        values = []
        for key, value in dict_Fe4.items():
            values.append(value)
        self.assertDictEqual(values[0].as_dict(), icohplist_Fe["1"])

        dict_Fe5 = self.icohpcollection_Fe.get_icohp_dict_of_certain_site(
            site=7,
            minsummedicohp=None,
            maxsummedicohp=-0.3,
            minbondlength=0.0,
            maxbondlength=8.0)
        self.assertEqual(len(dict_Fe5), 1)
        values = []
        for key, value in dict_Fe5.items():
            values.append(value)
        self.assertDictEqual(values[0].as_dict(), icohplist_Fe["2"])

        dict_Fe6 = self.icohpcollection_Fe.get_icohp_dict_of_certain_site(
            site=7,
            minsummedicohp=None,
            maxsummedicohp=None,
            minbondlength=0.0,
            maxbondlength=2.5)

        self.assertEqual(len(dict_Fe6), 1)
        values = []
        for key, value in dict_Fe6.items():
            values.append(value)
        self.assertDictEqual(values[0].as_dict(), icohplist_Fe["2"])

        dict_Fe7 = self.icohpcollection_Fe.get_icohp_dict_of_certain_site(
            site=7,
            minsummedicohp=None,
            maxsummedicohp=None,
            minbondlength=2.5,
            maxbondlength=8.0)
        self.assertEqual(len(dict_Fe7), 1)
        values = []
        for key, value in dict_Fe7.items():
            values.append(value)
        self.assertDictEqual(values[0].as_dict(), icohplist_Fe["1"])

    def test_extremum_icohpvalue(self):
        # without spin polarization
        # ICOHPs
        self.assertEqual(self.icohpcollection_KF.extremum_icohpvalue(),
                         -0.40079)
        # ICOOPs
        self.assertEqual(self.icoopcollection_KF.extremum_icohpvalue(),
                         0.02343)
        # with spin polarization
        # summed spin
        # ICOHPs
        self.assertEqual(self.icohpcollection_Fe.extremum_icohpvalue(),
                         -0.86764)
        self.assertAlmostEqual(self.icoopcollection_Fe.extremum_icohpvalue(),
                               -0.09842999999999999)
        # ICOOPs
        # spin up
        # ICOHPs
        self.assertEqual(
            self.icohpcollection_Fe.extremum_icohpvalue(
                summed_spin_channels=False), -0.28485)
        # ICOOPs
        self.assertEqual(
            self.icoopcollection_Fe.extremum_icohpvalue(
                summed_spin_channels=False), -0.04087)
        # spin down
        # ICOHPs
        self.assertEqual(
            self.icohpcollection_Fe.extremum_icohpvalue(
                summed_spin_channels=False, spin=Spin.down), -0.58279)
        # ICOOPs
        self.assertEqual(
            self.icoopcollection_Fe.extremum_icohpvalue(
                summed_spin_channels=False, spin=Spin.down), -0.05756)
Пример #7
0
class CombinedIcohpTest(unittest.TestCase):
    def setUp(self):
        # without spin polarization:
        are_coops = False
        is_spin_polarized = False
        list_atom2 = ['K2', 'K2', 'K2', 'K2', 'K2', 'K2']
        list_icohp = [{Spin.up: -0.40075}, {Spin.up: -0.40074}, {Spin.up: -0.40079}, {Spin.up: -0.40079},
                      {Spin.up: -0.40074}, {Spin.up: -0.40075}]
        list_icoop = [{Spin.up: 0.02342}, {Spin.up: 0.02342}, {Spin.up: 0.02343}, {Spin.up: 0.02343},
                      {Spin.up: 0.02342}, {Spin.up: 0.02342}]
        list_labels = ['1', '2', '3', '4', '5', '6']
        list_length = [2.71199, 2.71199, 2.71199, 2.71199, 2.71199, 2.71199]
        list_num = [1, 1, 1, 1, 1, 1]
        list_atom1 = ['F1', 'F1', 'F1', 'F1', 'F1', 'F1']
        list_translation = [[0, -1, -1], [-1, 0, -1], [0, 0, -1], [-1, -1, 0], [0, -1, 0], [-1, 0, 0]]
        self.icohpcollection_KF = IcohpCollection(is_spin_polarized=is_spin_polarized, are_coops=are_coops,
                                                  list_labels=list_labels, list_atom1=list_atom1, list_atom2=list_atom2,
                                                  list_length=list_length, list_translation=list_translation,
                                                  list_num=list_num, list_icohp=list_icohp)

        self.icoopcollection_KF = IcohpCollection(is_spin_polarized=is_spin_polarized, are_coops=True,
                                                  list_labels=list_labels, list_atom1=list_atom1, list_atom2=list_atom2,
                                                  list_length=list_length, list_translation=list_translation,
                                                  list_num=list_num, list_icohp=list_icoop)

        # with spin polarization:
        list_atom2_sp = ['Fe7', 'Fe9']
        list_labels_sp = ['1', '2']
        list_translation_sp = [[0, 0, 0], [0, 0, 0]]
        list_length_sp = [2.83189, 2.45249]
        list_atom1_sp = ['Fe8', 'Fe8']
        is_spin_polarized_sp = True
        are_coops_sp = False
        list_num_sp = [2, 1]
        list_icohp_sp = [{Spin.up: -0.10218, Spin.down: -0.19701}, {Spin.up: -0.28485, Spin.down: -0.58279}]
        list_icoop_sp = [{Spin.up: -0.11389, Spin.down: -0.20828}, {Spin.up: -0.04087, Spin.down: -0.05756}]

        self.icohpcollection_Fe = IcohpCollection(is_spin_polarized=is_spin_polarized_sp, are_coops=are_coops_sp,
                                                  list_labels=list_labels_sp, list_atom1=list_atom1_sp,
                                                  list_atom2=list_atom2_sp, list_length=list_length_sp,
                                                  list_translation=list_translation_sp, list_num=list_num_sp,
                                                  list_icohp=list_icohp_sp)
        self.icoopcollection_Fe = IcohpCollection(is_spin_polarized=is_spin_polarized_sp, are_coops=True,
                                                  list_labels=list_labels_sp, list_atom1=list_atom1_sp,
                                                  list_atom2=list_atom2_sp, list_length=list_length_sp,
                                                  list_translation=list_translation_sp, list_num=list_num_sp,
                                                  list_icohp=list_icoop_sp)

    def test_get_icohp_by_label(self):
        # without spin polarization

        # ICOHPs
        self.assertEqual(self.icohpcollection_KF.get_icohp_by_label("1"), -0.40075)
        self.assertEqual(self.icohpcollection_KF.get_icohp_by_label("2"), -0.40074)
        self.assertEqual(self.icohpcollection_KF.get_icohp_by_label("3"), -0.40079)
        self.assertEqual(self.icohpcollection_KF.get_icohp_by_label("4"), -0.40079)
        self.assertEqual(self.icohpcollection_KF.get_icohp_by_label("5"), -0.40074)
        self.assertEqual(self.icohpcollection_KF.get_icohp_by_label("6"), -0.40075)

        # with spin polarization
        # summed spin
        # ICOHPs
        self.assertEqual(self.icohpcollection_Fe.get_icohp_by_label("1"), -0.10218 - 0.19701)
        self.assertEqual(self.icohpcollection_Fe.get_icohp_by_label("2"), -0.28485 - 0.58279)

        # Spin up
        # ICOHPs
        self.assertEqual(self.icohpcollection_Fe.get_icohp_by_label("1", summed_spin_channels=False), -0.10218)
        self.assertEqual(self.icohpcollection_Fe.get_icohp_by_label("2", summed_spin_channels=False), -0.28485)

        # Spin down
        # ICOHPs
        self.assertEqual(self.icohpcollection_Fe.get_icohp_by_label("1", summed_spin_channels=False, spin=Spin.down),
                         -0.19701)
        self.assertEqual(self.icohpcollection_Fe.get_icohp_by_label("2", summed_spin_channels=False, spin=Spin.down),
                         -0.58279)

    def test_get_summed_icohp_by_labellist(self):
        # without spin polarization
        self.assertAlmostEqual(
            self.icohpcollection_KF.get_summed_icohp_by_labellist(["1", "2", "3", "4", "5", "6"], divisor=6.0),
            -0.40076)

        # with spin polarization
        sum1 = (-0.10218 - 0.19701 - 0.28485 - 0.58279) / 2.0
        sum2 = (-0.10218 - 0.28485) / 2.0
        sum3 = (-0.19701 - 0.58279) / 2.0
        self.assertAlmostEqual(self.icohpcollection_Fe.get_summed_icohp_by_labellist(["1", "2"], divisor=2.0), sum1)
        self.assertAlmostEqual(
            self.icohpcollection_Fe.get_summed_icohp_by_labellist(["1", "2"], summed_spin_channels=False, divisor=2.0),
            sum2)
        self.assertAlmostEqual(
            self.icohpcollection_Fe.get_summed_icohp_by_labellist(["1", "2"], summed_spin_channels=False,
                                                                  spin=Spin.down, divisor=2.0), sum3)

    def test_get_icohp_dict_by_bondlengths(self):
        # without spin polarization
        icohpvalue = {}
        icohpvalue["1"] = {'@module': 'pymatgen.electronic_structure.cohp', 'num': 1, 'length': 2.71199,
                           'icohp': {Spin.up: -0.40075},
                           'are_coops': False, 'label': '1', 'atom2': 'K2', '@class': 'IcohpValue', 'atom1': 'F1',
                           'translation': [0, -1, -1]}
        icohpvalue["2"] = {'@module': 'pymatgen.electronic_structure.cohp', 'num': 1, 'length': 2.71199,
                           'icohp': {Spin.up: -0.40074},
                           'are_coops': False, 'label': '2', 'atom2': 'K2', '@class': 'IcohpValue', 'atom1': 'F1',
                           'translation': [-1, 0, -1]}
        icohpvalue["3"] = {'@module': 'pymatgen.electronic_structure.cohp', 'num': 1, 'length': 2.71199,
                           'icohp': {Spin.up: -0.40079},
                           'are_coops': False, 'label': '3', 'atom2': 'K2', '@class': 'IcohpValue', 'atom1': 'F1',
                           'translation': [0, 0, -1]}
        icohpvalue["4"] = {'@module': 'pymatgen.electronic_structure.cohp', 'num': 1, 'length': 2.71199,
                           'icohp': {Spin.up: -0.40079},
                           'are_coops': False, 'label': '4', 'atom2': 'K2', '@class': 'IcohpValue', 'atom1': 'F1',
                           'translation': [-1, -1, 0]}
        icohpvalue["5"] = {'@module': 'pymatgen.electronic_structure.cohp', 'num': 1, 'length': 2.71199,
                           'icohp': {Spin.up: -0.40074},
                           'are_coops': False, 'label': '5', 'atom2': 'K2', '@class': 'IcohpValue', 'atom1': 'F1',
                           'translation': [0, -1, 0]}
        icohpvalue["6"] = {'@module': 'pymatgen.electronic_structure.cohp', 'num': 1, 'length': 2.71199,
                           'icohp': {Spin.up: -0.40075},
                           'are_coops': False, 'label': '6', 'atom2': 'K2', '@class': 'IcohpValue', 'atom1': 'F1',
                           'translation': [-1, 0, 0]}

        dict_KF = self.icohpcollection_KF.get_icohp_dict_by_bondlengths(minbondlength=0.0, maxbondlength=8.0)
        for key, value in sorted(dict_KF.items()):
            self.assertDictEqual(value.as_dict(), icohpvalue[key])

        self.assertDictEqual({}, self.icohpcollection_KF.get_icohp_dict_by_bondlengths(minbondlength=0.0,
                                                                                       maxbondlength=1.0))

        # with spin polarization
        icohpvalue_spin = {}
        icohpvalue_spin["1"] = {'num': 2, 'atom2': 'Fe7', 'translation': [0, 0, 0],
                                '@module': 'pymatgen.electronic_structure.cohp',
                                'are_coops': False, 'atom1': 'Fe8',
                                'label': '1', 'length': 2.83189, '@class': 'IcohpValue',
                                'icohp': {Spin.up: -0.10218, Spin.down: -0.19701}}
        icohpvalue_spin["2"] = {'num': 1, 'atom2': 'Fe9', 'translation': [0, 0, 0],
                                '@module': 'pymatgen.electronic_structure.cohp',
                                'are_coops': False, 'atom1': 'Fe8',
                                'label': '2', 'length': 2.45249, '@class': 'IcohpValue',
                                'icohp': {Spin.up: -0.28485, Spin.down: -0.58279}}

        dict_Fe = self.icohpcollection_Fe.get_icohp_dict_by_bondlengths(minbondlength=0.0, maxbondlength=8.0)
        for key, value in sorted(dict_Fe.items()):
            self.assertDictEqual(value.as_dict(), icohpvalue_spin[key])

        dict_Fe2 = self.icohpcollection_Fe.get_icohp_dict_by_bondlengths(minbondlength=2.5, maxbondlength=2.9)
        self.assertEqual(len(dict_Fe2), 1)
        for key, value in sorted(dict_Fe2.items()):
            self.assertDictEqual(value.as_dict(), icohpvalue_spin[key])

    def test_get_icohp_dict_of_certain_site(self):
        # without spin polarization
        icohpvalue = {}
        icohpvalue["1"] = {'translation': [0, -1, -1], 'are_coops': False,
                           '@module': 'pymatgen.electronic_structure.cohp', 'length': 2.71199,
                           'atom2': 'K2',
                           '@class': 'IcohpValue', 'atom1': 'F1', 'num': 1, 'label': '1', 'icohp': {Spin.up: -0.40075}}
        icohpvalue["2"] = {'translation': [-1, 0, -1], 'are_coops': False,
                           '@module': 'pymatgen.electronic_structure.cohp', 'length': 2.71199,
                           'atom2': 'K2',
                           '@class': 'IcohpValue', 'atom1': 'F1', 'num': 1, 'label': '2', 'icohp': {Spin.up: -0.40074}}
        icohpvalue["3"] = {'translation': [0, 0, -1], 'are_coops': False,
                           '@module': 'pymatgen.electronic_structure.cohp', 'length': 2.71199,
                           'atom2': 'K2',
                           '@class': 'IcohpValue', 'atom1': 'F1', 'num': 1, 'label': '3', 'icohp': {Spin.up: -0.40079}}
        icohpvalue["4"] = {'translation': [-1, -1, 0], 'are_coops': False,
                           '@module': 'pymatgen.electronic_structure.cohp', 'length': 2.71199,
                           'atom2': 'K2',
                           '@class': 'IcohpValue', 'atom1': 'F1', 'num': 1, 'label': '4', 'icohp': {Spin.up: -0.40079}}
        icohpvalue["5"] = {'translation': [0, -1, 0], 'are_coops': False,
                           '@module': 'pymatgen.electronic_structure.cohp', 'length': 2.71199,
                           'atom2': 'K2',
                           '@class': 'IcohpValue', 'atom1': 'F1', 'num': 1, 'label': '5', 'icohp': {Spin.up: -0.40074}}
        icohpvalue["6"] = {'translation': [-1, 0, 0], 'are_coops': False,
                           '@module': 'pymatgen.electronic_structure.cohp', 'length': 2.71199,
                           'atom2': 'K2',
                           '@class': 'IcohpValue', 'atom1': 'F1', 'num': 1, 'label': '6', 'icohp': {Spin.up: -0.40075}}

        dict_KF = self.icohpcollection_KF.get_icohp_dict_of_certain_site(site=0)

        for key, value in sorted(dict_KF.items()):
            self.assertDictEqual(value.as_dict(), icohpvalue[key])

        # compare number of results dependent on minsummedicohp, maxsummedicohp,minbondlength, maxbondlength
        dict_KF_2 = self.icohpcollection_KF.get_icohp_dict_of_certain_site(site=0, minsummedicohp=None,
                                                                           maxsummedicohp=-0.0, minbondlength=0.0,
                                                                           maxbondlength=8.0)
        dict_KF_3 = self.icohpcollection_KF.get_icohp_dict_of_certain_site(site=0, minsummedicohp=None,
                                                                           maxsummedicohp=-0.5, minbondlength=0.0,
                                                                           maxbondlength=8.0)
        dict_KF_4 = self.icohpcollection_KF.get_icohp_dict_of_certain_site(site=0, minsummedicohp=0.0,
                                                                           maxsummedicohp=None, minbondlength=0.0,
                                                                           maxbondlength=8.0)
        dict_KF_5 = self.icohpcollection_KF.get_icohp_dict_of_certain_site(site=0, minsummedicohp=None,
                                                                           maxsummedicohp=None, minbondlength=0.0,
                                                                           maxbondlength=2.0)
        dict_KF_6 = self.icohpcollection_KF.get_icohp_dict_of_certain_site(site=0, minsummedicohp=None,
                                                                           maxsummedicohp=None, minbondlength=3.0,
                                                                           maxbondlength=8.0)

        self.assertEqual(len(dict_KF_2), 6)
        self.assertEqual(len(dict_KF_3), 0)
        self.assertEqual(len(dict_KF_4), 0)
        self.assertEqual(len(dict_KF_5), 0)
        self.assertEqual(len(dict_KF_6), 0)

        # spin polarization

        dict_Fe = self.icohpcollection_Fe.get_icohp_dict_of_certain_site(site=0)
        self.assertEqual(len(dict_Fe), 0)

        # Fe8
        dict_Fe2 = self.icohpcollection_Fe.get_icohp_dict_of_certain_site(site=7)
        self.assertEqual(len(dict_Fe2), 2)
        # Test the values

        icohplist_Fe = {}
        icohplist_Fe["1"] = {'are_coops': False, 'translation': [0, 0, 0],
                             'icohp': {Spin.down: -0.19701, Spin.up: -0.10218}, 'length': 2.83189,
                             '@module': 'pymatgen.electronic_structure.cohp', 'atom1': 'Fe8', 'atom2': 'Fe7',
                             'label': '1',
                             '@class': 'IcohpValue', 'num': 2}
        icohplist_Fe["2"] = {'are_coops': False, 'translation': [0, 0, 0],
                             'icohp': {Spin.down: -0.58279, Spin.up: -0.28485}, 'length': 2.45249,
                             '@module': 'pymatgen.electronic_structure.cohp', 'atom1': 'Fe8', 'atom2': 'Fe9',
                             'label': '2',
                             '@class': 'IcohpValue', 'num': 1}

        for key, value in sorted(dict_Fe2.items()):
            self.assertEqual(value.as_dict(), icohplist_Fe[key])

        # Fe9
        dict_Fe3 = self.icohpcollection_Fe.get_icohp_dict_of_certain_site(site=8)
        self.assertEqual(len(dict_Fe3), 1)

        # compare number of results dependent on minsummedicohp, maxsummedicohp,minbondlength, maxbondlength
        # Fe8
        dict_Fe4 = self.icohpcollection_Fe.get_icohp_dict_of_certain_site(site=7, minsummedicohp=-0.3,
                                                                          maxsummedicohp=None, minbondlength=0.0,
                                                                          maxbondlength=8.0)
        self.assertEqual(len(dict_Fe4), 1)
        values = []
        for key, value in dict_Fe4.items():
            values.append(value)
        self.assertDictEqual(values[0].as_dict(), icohplist_Fe["1"])

        dict_Fe5 = self.icohpcollection_Fe.get_icohp_dict_of_certain_site(site=7, minsummedicohp=None,
                                                                          maxsummedicohp=-0.3, minbondlength=0.0,
                                                                          maxbondlength=8.0)
        self.assertEqual(len(dict_Fe5), 1)
        values = []
        for key, value in dict_Fe5.items():
            values.append(value)
        self.assertDictEqual(values[0].as_dict(), icohplist_Fe["2"])

        dict_Fe6 = self.icohpcollection_Fe.get_icohp_dict_of_certain_site(site=7, minsummedicohp=None,
                                                                          maxsummedicohp=None, minbondlength=0.0,
                                                                          maxbondlength=2.5)

        self.assertEqual(len(dict_Fe6), 1)
        values = []
        for key, value in dict_Fe6.items():
            values.append(value)
        self.assertDictEqual(values[0].as_dict(), icohplist_Fe["2"])

        dict_Fe7 = self.icohpcollection_Fe.get_icohp_dict_of_certain_site(site=7, minsummedicohp=None,
                                                                          maxsummedicohp=None, minbondlength=2.5,
                                                                          maxbondlength=8.0)
        self.assertEqual(len(dict_Fe7), 1)
        values = []
        for key, value in dict_Fe7.items():
            values.append(value)
        self.assertDictEqual(values[0].as_dict(), icohplist_Fe["1"])

    def test_extremum_icohpvalue(self):
        # without spin polarization
        # ICOHPs
        self.assertEqual(self.icohpcollection_KF.extremum_icohpvalue(), -0.40079)
        # ICOOPs
        self.assertEqual(self.icoopcollection_KF.extremum_icohpvalue(), 0.02343)
        # with spin polarization
        # summed spin
        # ICOHPs
        self.assertEqual(self.icohpcollection_Fe.extremum_icohpvalue(), -0.86764)
        self.assertAlmostEqual(self.icoopcollection_Fe.extremum_icohpvalue(), -0.09842999999999999)
        # ICOOPs
        # spin up
        # ICOHPs
        self.assertEqual(self.icohpcollection_Fe.extremum_icohpvalue(summed_spin_channels=False), -0.28485)
        # ICOOPs
        self.assertEqual(self.icoopcollection_Fe.extremum_icohpvalue(summed_spin_channels=False), -0.04087)
        # spin down
        # ICOHPs
        self.assertEqual(self.icohpcollection_Fe.extremum_icohpvalue(summed_spin_channels=False, spin=Spin.down),
                         -0.58279)
        # ICOOPs
        self.assertEqual(self.icoopcollection_Fe.extremum_icohpvalue(summed_spin_channels=False, spin=Spin.down),
                         -0.05756)