Beispiel #1
0
class TestGeometry(object):
    def test_objects(self, setup):
        str(setup.g)
        assert len(setup.g) == 2
        assert len(setup.g.xyz) == 2
        assert np.allclose(setup.g[0], np.zeros([3]))
        assert np.allclose(setup.g[None, 0], setup.g.xyz[:, 0])

        i = 0
        for ia in setup.g:
            i += 1
        assert i == len(setup.g)
        assert setup.g.no_s == 2 * len(setup.g) * np.prod(setup.g.sc.nsc)

    def test_properties(self, setup):
        assert 2 == len(setup.g)
        assert 2 == setup.g.na
        assert 3 * 3 == setup.g.n_s
        assert 2 * 3 * 3 == setup.g.na_s
        assert 2 * 2 == setup.g.no
        assert 2 * 2 * 3 * 3 == setup.g.no_s

    def test_iter1(self, setup):
        i = 0
        for ia in setup.g:
            i += 1
        assert i == 2

    def test_iter2(self, setup):
        for ia in setup.g:
            assert np.allclose(setup.g[ia], setup.g.xyz[ia, :])

    def test_iter3(self, setup):
        i = 0
        for ia, io in setup.g.iter_orbitals(0):
            assert ia == 0
            assert io < 2
            i += 1
        for ia, io in setup.g.iter_orbitals(1):
            assert ia == 1
            assert io < 2
            i += 1
        assert i == 4
        i = 0
        for ia, io in setup.g.iter_orbitals():
            assert ia in [0, 1]
            assert io < 2
            i += 1
        assert i == 4

        i = 0
        for ia, io in setup.g.iter_orbitals(1, local=False):
            assert ia == 1
            assert io >= 2
            i += 1
        assert i == 2

    @pytest.mark.xfail(raises=ValueError)
    def test_tile0(self, setup):
        t = setup.g.tile(0, 0)

    def test_tile1(self, setup):
        cell = np.copy(setup.g.sc.cell)
        cell[0, :] *= 2
        t = setup.g.tile(2, 0)
        assert np.allclose(cell, t.sc.cell)
        cell[1, :] *= 2
        t = t.tile(2, 1)
        assert np.allclose(cell, t.sc.cell)
        cell[2, :] *= 2
        t = t.tile(2, 2)
        assert np.allclose(cell, t.sc.cell)

    def test_tile2(self, setup):
        cell = np.copy(setup.g.sc.cell)
        cell[:, :] *= 2
        t = setup.g.tile(2, 0).tile(2, 1).tile(2, 2)
        assert np.allclose(cell, t.sc.cell)

    def test_sort(self, setup):
        t = setup.g.tile(2, 0).tile(2, 1).tile(2, 2)
        ts = t.sort()
        t = setup.g.tile(2, 1).tile(2, 2).tile(2, 0)
        tS = t.sort()
        assert np.allclose(ts.xyz, tS.xyz)

    def test_tile3(self, setup):
        cell = np.copy(setup.g.sc.cell)
        cell[:, :] *= 2
        t1 = setup.g * 2
        cell = np.copy(setup.g.sc.cell)
        cell[0, :] *= 2
        t1 = setup.g * (2, 0)
        assert np.allclose(cell, t1.sc.cell)
        t = setup.g * ((2, 0), 'tile')
        assert np.allclose(cell, t.sc.cell)
        assert np.allclose(t1.xyz, t.xyz)
        cell[1, :] *= 2
        t1 = t * (2, 1)
        assert np.allclose(cell, t1.sc.cell)
        t = t * ((2, 1), 'tile')
        assert np.allclose(cell, t.sc.cell)
        assert np.allclose(t1.xyz, t.xyz)
        cell[2, :] *= 2
        t1 = t * (2, 2)
        assert np.allclose(cell, t1.sc.cell)
        t = t * ((2, 2), 'tile')
        assert np.allclose(cell, t.sc.cell)
        assert np.allclose(t1.xyz, t.xyz)

        # Full
        t = setup.g * [2, 2, 2]
        assert np.allclose(cell, t.sc.cell)
        assert np.allclose(t1.xyz, t.xyz)
        t = setup.g * ([2, 2, 2], 't')
        assert np.allclose(cell, t.sc.cell)
        assert np.allclose(t1.xyz, t.xyz)

    def test_tile4(self, setup):
        t1 = setup.g.tile(2, 0).tile(2, 2)
        t = setup.g * ([2, 0], 't') * [2, 2]
        assert np.allclose(t1.xyz, t.xyz)

    def test_tile5(self, setup):
        t = setup.g.tile(2, 0).tile(2, 2)
        assert np.allclose(t[:len(setup.g), :], setup.g.xyz)

    @pytest.mark.xfail(raises=ValueError)
    def test_repeat0(self, setup):
        t = setup.g.repeat(0, 0)

    def test_repeat1(self, setup):
        cell = np.copy(setup.g.sc.cell)
        cell[0, :] *= 2
        t = setup.g.repeat(2, 0)
        assert np.allclose(cell, t.sc.cell)
        cell[1, :] *= 2
        t = t.repeat(2, 1)
        assert np.allclose(cell, t.sc.cell)
        cell[2, :] *= 2
        t = t.repeat(2, 2)
        assert np.allclose(cell, t.sc.cell)

    def test_repeat2(self, setup):
        cell = np.copy(setup.g.sc.cell)
        cell[:, :] *= 2
        t = setup.g.repeat(2, 0).repeat(2, 1).repeat(2, 2)
        assert np.allclose(cell, t.sc.cell)

    def test_repeat3(self, setup):
        cell = np.copy(setup.g.sc.cell)
        cell[0, :] *= 2
        t1 = setup.g.repeat(2, 0)
        assert np.allclose(cell, t1.sc.cell)
        t = setup.g * ((2, 0), 'repeat')
        assert np.allclose(cell, t.sc.cell)
        assert np.allclose(t1.xyz, t.xyz)
        cell[1, :] *= 2
        t1 = t.repeat(2, 1)
        assert np.allclose(cell, t1.sc.cell)
        t = t * ((2, 1), 'r')
        assert np.allclose(cell, t.sc.cell)
        assert np.allclose(t1.xyz, t.xyz)
        cell[2, :] *= 2
        t1 = t.repeat(2, 2)
        assert np.allclose(cell, t1.sc.cell)
        t = t * ((2, 2), 'repeat')
        assert np.allclose(cell, t.sc.cell)
        assert np.allclose(t1.xyz, t.xyz)

        # Full
        t = setup.g * ([2, 2, 2], 'r')
        assert np.allclose(cell, t.sc.cell)
        assert np.allclose(t1.xyz, t.xyz)

    def test_repeat4(self, setup):
        t1 = setup.g.repeat(2, 0).repeat(2, 2)
        t = setup.g * ([2, 0], 'repeat') * ([2, 2], 'r')
        assert np.allclose(t1.xyz, t.xyz)

    def test_repeat5(self, setup):
        t = setup.g.repeat(2, 0).repeat(2, 2)
        assert np.allclose(t.xyz[::4, :], setup.g.xyz)

    def test_a2o1(self, setup):
        assert 0 == setup.g.a2o(0)
        assert setup.g.atom[0].no == setup.g.a2o(1)
        assert setup.g.no == setup.g.a2o(setup.g.na)

    def test_sub1(self, setup):
        assert len(setup.g.sub([0])) == 1
        assert len(setup.g.sub([0, 1])) == 2
        assert len(setup.g.sub([-1])) == 1

    def test_sub2(self, setup):
        assert len(setup.g.sub(range(1))) == 1
        assert len(setup.g.sub(range(2))) == 2

    def test_fxyz(self, setup):
        fxyz = setup.g.fxyz
        assert np.allclose(fxyz, [[0, 0, 0], [1. / 3, 1. / 3, 0]])
        assert np.allclose(np.dot(fxyz, setup.g.cell), setup.g.xyz)

    def test_axyz(self, setup):
        assert np.allclose(setup.g[:], setup.g.xyz[:])
        assert np.allclose(setup.g[0], setup.g.xyz[0, :])
        assert np.allclose(setup.g[2], setup.g.axyz(2))
        isc = setup.g.a2isc(2)
        off = setup.g.sc.offset(isc)
        assert np.allclose(setup.g.xyz[0] + off, setup.g.axyz(2))

    def test_rij1(self, setup):
        assert np.allclose(setup.g.rij(0, 1), 1.42)
        assert np.allclose(setup.g.rij(0, [0, 1]), [0., 1.42])

    def test_orij1(self, setup):
        assert np.allclose(setup.g.orij(0, 2), 1.42)
        assert np.allclose(setup.g.orij(0, [0, 2]), [0., 1.42])

    def test_Rij1(self, setup):
        assert np.allclose(setup.g.Rij(0, 1), [1.42, 0, 0])

    def test_oRij1(self, setup):
        assert np.allclose(setup.g.oRij(0, 1), [0., 0, 0])
        assert np.allclose(setup.g.oRij(0, 2), [1.42, 0, 0])
        assert np.allclose(setup.g.oRij(0, [0, 1, 2]),
                           [[0., 0, 0], [0., 0, 0], [1.42, 0, 0]])
        assert np.allclose(setup.g.oRij(0, 2), [1.42, 0, 0])

    def test_cut(self, setup):
        with pytest.warns(SislWarning) as warns:
            assert len(setup.g.cut(1, 1)) == 2
            assert len(setup.g.cut(2, 1)) == 1
            assert len(setup.g.cut(2, 1, 1)) == 1
        assert len(warns) == 2

    def test_cut2(self, setup):
        with pytest.warns(SislWarning) as warns:
            c1 = setup.g.cut(2, 1)
            c2 = setup.g.cut(2, 1, 1)
        assert len(warns) == 2
        assert np.allclose(c1.xyz[0, :], setup.g.xyz[0, :])
        assert np.allclose(c2.xyz[0, :], setup.g.xyz[1, :])

    def test_cut3(self, setup):
        nr = range(2, 5)
        g = setup.g.copy()
        for x in nr:
            gx = g.tile(x, 0)
            for y in nr:
                gy = gx.tile(y, 1)
                for z in nr:
                    gz = gy.tile(z, 2)
                    G = gz.cut(z, 2)
                    assert np.allclose(G.xyz, gy.xyz)
                    assert np.allclose(G.cell, gy.cell)
                G = gy.cut(y, 1)
                assert np.allclose(G.xyz, gx.xyz)
                assert np.allclose(G.cell, gx.cell)
            G = gx.cut(x, 0)
            assert np.allclose(G.xyz, g.xyz)
            assert np.allclose(G.cell, g.cell)

    def test_remove1(self, setup):
        assert len(setup.g.remove([0])) == 1
        assert len(setup.g.remove([])) == 2
        assert len(setup.g.remove([-1])) == 1
        assert len(setup.g.remove([-0])) == 1

    def test_remove2(self, setup):
        assert len(setup.g.remove(range(1))) == 1
        assert len(setup.g.remove(range(0))) == 2

    def test_copy(self, setup):
        assert setup.g == setup.g.copy()

    def test_nsc1(self, setup):
        sc = setup.g.sc.copy()
        nsc = np.copy(sc.nsc)
        sc.set_nsc([5, 5, 0])
        assert np.allclose([5, 5, 1], sc.nsc)
        assert len(sc.sc_off) == np.prod(sc.nsc)

    def test_nsc2(self, setup):
        sc = setup.g.sc.copy()
        nsc = np.copy(sc.nsc)
        sc.set_nsc([0, 1, 0])
        assert np.allclose([1, 1, 1], sc.nsc)
        assert len(sc.sc_off) == np.prod(sc.nsc)

    def test_rotation1(self, setup):
        rot = setup.g.rotate(180, [0, 0, 1])
        rot.sc.cell[2, 2] *= -1
        assert np.allclose(-rot.sc.cell, setup.g.sc.cell)
        assert np.allclose(-rot.xyz, setup.g.xyz)

        rot = setup.g.rotate(np.pi, [0, 0, 1], rad=True)
        rot.sc.cell[2, 2] *= -1
        assert np.allclose(-rot.sc.cell, setup.g.sc.cell)
        assert np.allclose(-rot.xyz, setup.g.xyz)

        rot = rot.rotate(180, [0, 0, 1])
        rot.sc.cell[2, 2] *= -1
        assert np.allclose(rot.sc.cell, setup.g.sc.cell)
        assert np.allclose(rot.xyz, setup.g.xyz)

    def test_rotation2(self, setup):
        rot = setup.g.rotate(180, [0, 0, 1], only='abc')
        rot.sc.cell[2, 2] *= -1
        assert np.allclose(-rot.sc.cell, setup.g.sc.cell)
        assert np.allclose(rot.xyz, setup.g.xyz)

        rot = setup.g.rotate(np.pi, [0, 0, 1], rad=True, only='abc')
        rot.sc.cell[2, 2] *= -1
        assert np.allclose(-rot.sc.cell, setup.g.sc.cell)
        assert np.allclose(rot.xyz, setup.g.xyz)

        rot = rot.rotate(180, [0, 0, 1], only='abc')
        rot.sc.cell[2, 2] *= -1
        assert np.allclose(rot.sc.cell, setup.g.sc.cell)
        assert np.allclose(rot.xyz, setup.g.xyz)

    def test_rotation3(self, setup):
        rot = setup.g.rotate(180, [0, 0, 1], only='xyz')
        assert np.allclose(rot.sc.cell, setup.g.sc.cell)
        assert np.allclose(-rot.xyz, setup.g.xyz)

        rot = setup.g.rotate(np.pi, [0, 0, 1], rad=True, only='xyz')
        assert np.allclose(rot.sc.cell, setup.g.sc.cell)
        assert np.allclose(-rot.xyz, setup.g.xyz)

        rot = rot.rotate(180, [0, 0, 1], only='xyz')
        assert np.allclose(rot.sc.cell, setup.g.sc.cell)
        assert np.allclose(rot.xyz, setup.g.xyz)

    def test_rotation4(self, setup):
        rot = setup.g.rotatea(180, only='xyz')
        rot = setup.g.rotateb(180, only='xyz')
        rot = setup.g.rotatec(180, only='xyz')

    def test_rotation5(self, setup):
        g = setup.g.copy()
        rot = g.rotatea(180, origo=g.center(what='xyz'), only='xyz')

    def test_translate(self, setup):
        t = setup.g.translate([0, 0, 1])
        assert np.allclose(setup.g.xyz[:, 0], t.xyz[:, 0])
        assert np.allclose(setup.g.xyz[:, 1], t.xyz[:, 1])
        assert np.allclose(setup.g.xyz[:, 2] + 1, t.xyz[:, 2])
        t = setup.g.move([0, 0, 1])
        assert np.allclose(setup.g.xyz[:, 0], t.xyz[:, 0])
        assert np.allclose(setup.g.xyz[:, 1], t.xyz[:, 1])
        assert np.allclose(setup.g.xyz[:, 2] + 1, t.xyz[:, 2])

    def test_iter_block1(self, setup):
        for i, iaaspec in enumerate(setup.g.iter_species()):
            ia, a, spec = iaaspec
            assert i == ia
            assert setup.g.atom[ia] == a
        for ia, a, spec in setup.g.iter_species([1]):
            assert 1 == ia
            assert setup.g.atom[ia] == a
        for ia in setup.g:
            assert ia >= 0
        i = 0
        for ias, idx in setup.g.iter_block():
            for ia in ias:
                i += 1
        assert i == len(setup.g)

        i = 0
        for ias, idx in setup.g.iter_block(atom=1):
            for ia in ias:
                i += 1
        assert i == 1

    @pytest.mark.slow
    def test_iter_block2(self, setup):
        g = setup.g.tile(30, 0).tile(30, 1)
        i = 0
        for ias, _ in g.iter_block():
            i += len(ias)
        assert i == len(g)

    def test_iter_shape1(self, setup):
        i = 0
        for ias, _ in setup.g.iter_block(method='sphere'):
            i += len(ias)
        assert i == len(setup.g)
        i = 0
        for ias, _ in setup.g.iter_block(method='cube'):
            i += len(ias)
        assert i == len(setup.g)

    @pytest.mark.slow
    def test_iter_shape2(self, setup):
        g = setup.g.tile(30, 0).tile(30, 1)
        i = 0
        for ias, _ in g.iter_block(method='sphere'):
            i += len(ias)
        assert i == len(g)
        i = 0
        for ias, _ in g.iter_block(method='cube'):
            i += len(ias)
        assert i == len(g)
        i = 0
        for ias, _ in g.iter_block_shape(Cube(g.maxR() * 20)):
            i += len(ias)
        assert i == len(g)

    @pytest.mark.slow
    def test_iter_shape3(self, setup):
        g = setup.g.tile(50, 0).tile(50, 1)
        i = 0
        for ias, _ in g.iter_block(method='sphere'):
            i += len(ias)
        assert i == len(g)
        i = 0
        for ias, _ in g.iter_block(method='cube'):
            i += len(ias)
        assert i == len(g)
        i = 0
        for ias, _ in g.iter_block_shape(Sphere(g.maxR() * 20)):
            i += len(ias)
        assert i == len(g)

    def test_swap(self, setup):
        s = setup.g.swap(0, 1)
        for i in [0, 1, 2]:
            assert np.allclose(setup.g.xyz[::-1, i], s.xyz[:, i])

    def test_append1(self, setup):
        for axis in [0, 1, 2]:
            s = setup.g.append(setup.g, axis)
            assert len(s) == len(setup.g) * 2
            assert np.allclose(s.cell[axis, :], setup.g.cell[axis, :] * 2)
            assert np.allclose(s.cell[axis, :], setup.g.cell[axis, :] * 2)
            s = setup.g.prepend(setup.g, axis)
            assert len(s) == len(setup.g) * 2
            assert np.allclose(s.cell[axis, :], setup.g.cell[axis, :] * 2)
            assert np.allclose(s.cell[axis, :], setup.g.cell[axis, :] * 2)
            s = setup.g.append(setup.g.sc, axis)
            assert len(s) == len(setup.g)
            assert np.allclose(s.cell[axis, :], setup.g.cell[axis, :] * 2)
            assert np.allclose(s.cell[axis, :], setup.g.cell[axis, :] * 2)
            s = setup.g.prepend(setup.g.sc, axis)
            assert len(s) == len(setup.g)
            assert np.allclose(s.cell[axis, :], setup.g.cell[axis, :] * 2)
            assert np.allclose(s.cell[axis, :], setup.g.cell[axis, :] * 2)

    def test_swapaxes(self, setup):
        s = setup.g.swapaxes(0, 1)
        assert np.allclose(setup.g.xyz[:, 0], s.xyz[:, 1])
        assert np.allclose(setup.g.xyz[:, 1], s.xyz[:, 0])
        assert np.allclose(setup.g.cell[0, :], s.cell[1, :])
        assert np.allclose(setup.g.cell[1, :], s.cell[0, :])

    def test_center(self, setup):
        one = setup.g.center(atom=[0])
        assert np.allclose(setup.g[0], one)
        al = setup.g.center()
        assert np.allclose(np.mean(setup.g.xyz, axis=0), al)
        al = setup.g.center(what='mass')
        al = setup.g.center(what='mm(xyz)')

    @pytest.mark.xfail(raises=ValueError)
    def test_center_raise(self, setup):
        al = setup.g.center(what='unknown')

    def test___add1__(self, setup):
        n = len(setup.g)
        double = setup.g + setup.g + setup.g.sc
        assert len(double) == n * 2
        assert np.allclose(setup.g.cell * 2, double.cell)
        assert np.allclose(setup.g.xyz[:n, :], double.xyz[:n, :])

        double = (setup.g, 1) + setup.g
        d = setup.g.prepend(setup.g, 1)
        assert len(double) == n * 2
        assert np.allclose(setup.g.cell[::2, :], double.cell[::2, :])
        assert np.allclose(double.xyz, d.xyz)

        double = setup.g + (setup.g, 1)
        d = setup.g.append(setup.g, 1)
        assert len(double) == n * 2
        assert np.allclose(setup.g.cell[::2, :], double.cell[::2, :])
        assert np.allclose(double.xyz, d.xyz)

    def test___add2__(self, setup):
        g1 = setup.g.rotatec(15)
        g2 = setup.g.rotatec(30)

        assert g1 != g2
        assert g1 + g2 == g1.add(g2)
        assert g1 + g2 != g2.add(g1)
        assert g2 + g1 == g2.add(g1)
        assert g2 + g1 != g1.add(g2)
        for i in range(3):
            assert g1 + (g2, i) == g1.append(g2, i)
            assert (g1, i) + g2 == g2.append(g1, i)

    def test___mul__(self, setup):
        g = setup.g.copy()
        assert g * 2 == g.tile(2, 0).tile(2, 1).tile(2, 2)
        assert g * [2, 1] == g.tile(2, 1)
        assert g * (2, 2, 2) == g.tile(2, 0).tile(2, 1).tile(2, 2)
        assert g * [1, 2, 2] == g.tile(1, 0).tile(2, 1).tile(2, 2)
        assert g * [1, 3, 2] == g.tile(1, 0).tile(3, 1).tile(2, 2)
        assert g * ([1, 3, 2], 'r') == g.repeat(1, 0).repeat(3, 1).repeat(2, 2)
        assert g * ([1, 3, 2], 'repeat') == g.repeat(1,
                                                     0).repeat(3,
                                                               1).repeat(2, 2)
        assert g * ([1, 3, 2], 'tile') == g.tile(1, 0).tile(3, 1).tile(2, 2)
        assert g * ([1, 3, 2], 't') == g.tile(1, 0).tile(3, 1).tile(2, 2)
        assert g * ([3, 2], 't') == g.tile(3, 2)
        assert g * ([3, 2], 'r') == g.repeat(3, 2)

    def test_add(self, setup):
        double = setup.g.add(setup.g)
        assert len(double) == len(setup.g) * 2
        assert np.allclose(setup.g.cell, double.cell)
        double = setup.g.add(setup.g).add(setup.g.sc)
        assert len(double) == len(setup.g) * 2
        assert np.allclose(setup.g.cell * 2, double.cell)

    def test_insert(self, setup):
        double = setup.g.insert(0, setup.g)
        assert len(double) == len(setup.g) * 2
        assert np.allclose(setup.g.cell, double.cell)

    def test_a2o(self, setup):
        # There are 2 orbitals per C atom
        assert setup.g.a2o(1) == setup.g.atom[0].no
        assert np.all(setup.g.a2o(1, True) == [2, 3])
        setup.g.reorder()

    def test_o2a(self, setup):
        # There are 2 orbitals per C atom
        assert setup.g.o2a(2) == 1
        assert setup.g.o2a(3) == 1
        assert setup.g.o2a(4) == 2
        assert np.all(setup.g.o2a([0, 2, 4]) == [0, 1, 2])

    def test_angle(self, setup):
        # There are 2 orbitals per C atom
        g = Geometry([[0] * 3, [1, 0, 0]])
        g.angle([0])
        g.angle([0], ref=1)

    def test_2uc(self, setup):
        # functions for any-thing to UC
        assert setup.g.sc2uc(2) == 0
        assert np.all(setup.g.sc2uc([2, 3]) == [0, 1])
        assert setup.g.asc2uc(2) == 0
        assert np.all(setup.g.asc2uc([2, 3]) == [0, 1])
        assert setup.g.osc2uc(4) == 0
        assert setup.g.osc2uc(5) == 1
        assert np.all(setup.g.osc2uc([4, 5]) == [0, 1])

    def test_2sc(self, setup):
        # functions for any-thing to SC
        c = setup.g.cell

        print(setup)
        # check indices
        assert np.all(setup.g.a2isc([1, 2]) == [[0, 0, 0], [-1, -1, 0]])
        assert np.all(setup.g.a2isc(2) == [-1, -1, 0])
        assert np.allclose(setup.g.a2sc(2), -c[0, :] - c[1, :])
        assert np.all(setup.g.o2isc([1, 5]) == [[0, 0, 0], [-1, -1, 0]])
        assert np.all(setup.g.o2isc(5) == [-1, -1, 0])
        assert np.allclose(setup.g.o2sc(5), -c[0, :] - c[1, :])

        # Check off-sets
        assert np.allclose(setup.g.a2sc([1, 2]),
                           [[0., 0., 0.], -c[0, :] - c[1, :]])
        assert np.allclose(setup.g.o2sc([1, 5]),
                           [[0., 0., 0.], -c[0, :] - c[1, :]])

    def test_reverse(self, setup):
        rev = setup.g.reverse()
        assert len(rev) == 2
        assert np.allclose(rev.xyz[::-1, :], setup.g.xyz)
        rev = setup.g.reverse(atom=list(range(len(setup.g))))
        assert len(rev) == 2
        assert np.allclose(rev.xyz[::-1, :], setup.g.xyz)

    def test_scale1(self, setup):
        two = setup.g.scale(2)
        assert len(two) == len(setup.g)
        assert np.allclose(two.xyz[:, :] / 2., setup.g.xyz)

    def test_close1(self, setup):
        three = range(3)
        for ia in setup.mol:
            i = setup.mol.close(ia, R=(0.1, 1.1), idx=three)
            if ia < 3:
                assert len(i[0]) == 1
            else:
                assert len(i[0]) == 0
            # Will only return results from [0,1,2]
            # but the fourth atom connects to
            # the third
            if ia in [0, 2, 3]:
                assert len(i[1]) == 1
            elif ia == 1:
                assert len(i[1]) == 2
            else:
                assert len(i[1]) == 0

    def test_close2(self, setup):
        mol = range(3, 5)
        for ia in setup.mol:
            i = setup.mol.close(ia, R=(0.1, 1.1), idx=mol)
            assert len(i) == 2
        i = setup.mol.close([100, 100, 100], R=0.1)
        assert len(i) == 0
        i = setup.mol.close([100, 100, 100], R=0.1, ret_rij=True)
        for el in i:
            assert len(el) == 0
        i = setup.mol.close([100, 100, 100], R=0.1, ret_rij=True, ret_xyz=True)
        for el in i:
            assert len(el) == 0

    @pytest.mark.slow
    def test_close4(self, setup):
        # 2 * 200 ** 2
        g = setup.g * (200, 200, 1)
        i = g.close(0, R=(0.1, 1.43))
        print(i)
        assert len(i) == 2
        assert len(i[0]) == 1
        assert len(i[1]) == 3

    def test_close_within1(self, setup):
        three = range(3)
        for ia in setup.mol:
            shapes = [Sphere(0.1, setup.mol[ia]), Sphere(1.1, setup.mol[ia])]
            i = setup.mol.close(ia, R=(0.1, 1.1), idx=three)
            ii = setup.mol.within(shapes, idx=three)
            assert np.all(i[0] == ii[0])
            assert np.all(i[1] == ii[1])

    def test_close_within2(self, setup):
        g = setup.g.repeat(6, 0).repeat(6, 1)
        for ia in g:
            shapes = [Sphere(0.1, g[ia]), Sphere(1.5, g[ia])]
            i = g.close(ia, R=(0.1, 1.5))
            ii = g.within(shapes)
            assert np.all(i[0] == ii[0])
            assert np.all(i[1] == ii[1])

    def test_close_within3(self, setup):
        g = setup.g.repeat(6, 0).repeat(6, 1)
        args = {'ret_xyz': True, 'ret_rij': True}
        for ia in g:
            shapes = [Sphere(0.1, g[ia]), Sphere(1.5, g[ia])]
            i, xa, d = g.close(ia, R=(0.1, 1.5), **args)
            ii, xai, di = g.within(shapes, **args)
            for j in [0, 1]:
                assert np.all(i[j] == ii[j])
                assert np.allclose(xa[j], xai[j])
                assert np.allclose(d[j], di[j])

    def test_within_inf1(self, setup):
        g = setup.g.translate([0.05] * 3)
        sc_3x3 = g.sc.tile(3, 0).tile(3, 1)
        assert len(g.within_inf(sc_3x3)[0]) == len(g) * 3**2

    def test_within_inf2(self, setup):
        g = setup.mol.translate([0.05] * 3)
        sc = SuperCell(1.5)
        for o in range(10):
            origo = [o - 0.5, -0.5, -0.5]
            sc.origo = origo
            idx = g.within_inf(sc)[0]
            assert len(idx) == 1
            assert idx[0] == o

    def test_within_inf_duplicates(self, setup):
        g = setup.g.copy()
        sc_3x3 = g.sc.tile(3, 0).tile(3, 1)
        assert len(
            g.within_inf(sc_3x3)[0]
        ) == len(g) * 3**2 + 7  # 3 per vector and 1 in the upper right corner

    def test_close_sizes(self, setup):
        point = 0

        # Return index
        idx = setup.mol.close(point, R=.1)
        assert len(idx) == 1
        # Return index of two things
        idx = setup.mol.close(point, R=(.1, 1.1))
        assert len(idx) == 2
        assert len(idx[0]) == 1
        assert not isinstance(idx[0], list)
        # Longer
        idx = setup.mol.close(point, R=(.1, 1.1, 2.1))
        assert len(idx) == 3
        assert len(idx[0]) == 1

        # Return index
        idx = setup.mol.close(point, R=.1, ret_xyz=True)
        assert len(idx) == 2
        assert len(idx[0]) == 1
        assert len(idx[1]) == 1
        assert idx[1].shape[0] == 1  # equivalent to above
        assert idx[1].shape[1] == 3

        # Return index of two things
        idx = setup.mol.close(point, R=(.1, 1.1), ret_xyz=True)
        # [[idx-1, idx-2], [coord-1, coord-2]]
        assert len(idx) == 2
        assert len(idx[0]) == 2
        assert len(idx[1]) == 2
        # idx-1
        assert len(idx[0][0].shape) == 1
        assert idx[0][0].shape[0] == 1
        # idx-2
        assert idx[0][1].shape[0] == 1
        # coord-1
        assert len(idx[1][0].shape) == 2
        assert idx[1][0].shape[1] == 3
        # coord-2
        assert idx[1][1].shape[1] == 3

        # Return index of two things
        idx = setup.mol.close(point, R=(.1, 1.1), ret_xyz=True, ret_rij=True)
        # [[idx-1, idx-2], [coord-1, coord-2], [dist-1, dist-2]]
        assert len(idx) == 3
        assert len(idx[0]) == 2
        assert len(idx[1]) == 2
        # idx-1
        assert len(idx[0][0].shape) == 1
        assert idx[0][0].shape[0] == 1
        # idx-2
        assert idx[0][1].shape[0] == 1
        # coord-1
        assert len(idx[1][0].shape) == 2
        assert idx[1][0].shape[1] == 3
        # coord-2
        assert idx[1][1].shape[1] == 3
        # dist-1
        assert len(idx[2][0].shape) == 1
        assert idx[2][0].shape[0] == 1
        # dist-2
        assert idx[2][1].shape[0] == 1

        # Return index of two things
        idx = setup.mol.close(point, R=(.1, 1.1), ret_rij=True)
        # [[idx-1, idx-2], [dist-1, dist-2]]
        assert len(idx) == 2
        assert len(idx[0]) == 2
        assert len(idx[1]) == 2
        # idx-1
        assert len(idx[0][0].shape) == 1
        assert idx[0][0].shape[0] == 1
        # idx-2
        assert idx[0][1].shape[0] == 1
        # dist-1
        assert len(idx[1][0].shape) == 1
        assert idx[1][0].shape[0] == 1
        # dist-2
        assert idx[1][1].shape[0] == 1

    def test_close_sizes_none(self, setup):
        point = [100., 100., 100.]

        # Return index
        idx = setup.mol.close(point, R=.1)
        assert len(idx) == 0
        # Return index of two things
        idx = setup.mol.close(point, R=(.1, 1.1))
        assert len(idx) == 2
        assert len(idx[0]) == 0
        assert not isinstance(idx[0], list)
        # Longer
        idx = setup.mol.close(point, R=(.1, 1.1, 2.1))
        assert len(idx) == 3
        assert len(idx[0]) == 0

        # Return index
        idx = setup.mol.close(point, R=.1, ret_xyz=True)
        assert len(idx) == 2
        assert len(idx[0]) == 0
        assert len(idx[1]) == 0
        assert idx[1].shape[0] == 0  # equivalent to above
        assert idx[1].shape[1] == 3

        # Return index of two things
        idx = setup.mol.close(point, R=(.1, 1.1), ret_xyz=True)
        # [[idx-1, idx-2], [coord-1, coord-2]]
        assert len(idx) == 2
        assert len(idx[0]) == 2
        assert len(idx[1]) == 2
        # idx-1
        assert len(idx[0][0].shape) == 1
        assert idx[0][0].shape[0] == 0
        # idx-2
        assert idx[0][1].shape[0] == 0
        # coord-1
        assert len(idx[1][0].shape) == 2
        assert idx[1][0].shape[1] == 3
        # coord-2
        assert idx[1][1].shape[1] == 3

        # Return index of two things
        idx = setup.mol.close(point, R=(.1, 1.1), ret_xyz=True, ret_rij=True)
        # [[idx-1, idx-2], [coord-1, coord-2], [dist-1, dist-2]]
        assert len(idx) == 3
        assert len(idx[0]) == 2
        assert len(idx[1]) == 2
        # idx-1
        assert len(idx[0][0].shape) == 1
        assert idx[0][0].shape[0] == 0
        # idx-2
        assert idx[0][1].shape[0] == 0
        # coord-1
        assert len(idx[1][0].shape) == 2
        assert idx[1][0].shape[0] == 0
        assert idx[1][0].shape[1] == 3
        # coord-2
        assert idx[1][1].shape[0] == 0
        assert idx[1][1].shape[1] == 3
        # dist-1
        assert len(idx[2][0].shape) == 1
        assert idx[2][0].shape[0] == 0
        # dist-2
        assert idx[2][1].shape[0] == 0

        # Return index of two things
        idx = setup.mol.close(point, R=(.1, 1.1), ret_rij=True)
        # [[idx-1, idx-2], [dist-1, dist-2]]
        assert len(idx) == 2
        assert len(idx[0]) == 2
        assert len(idx[1]) == 2
        # idx-1
        assert len(idx[0][0].shape) == 1
        assert idx[0][0].shape[0] == 0
        # idx-2
        assert idx[0][1].shape[0] == 0
        # dist-1
        assert len(idx[1][0].shape) == 1
        assert idx[1][0].shape[0] == 0
        # dist-2
        assert idx[1][1].shape[0] == 0

    def test_sparserij1(self, setup):
        rij = setup.g.sparserij()

    def test_bond_correct(self, setup):
        # Create ribbon
        rib = setup.g.tile(2, 1)
        # Convert the last atom to a H atom
        rib.atom[-1] = Atom[1]
        ia = len(rib) - 1
        # Get bond-length
        idx, d = rib.close(ia, R=(.1, 1000), ret_rij=True)
        i = np.argmin(d[1])
        d = d[1][i]
        rib.bond_correct(ia, idx[1][i])
        idx, d2 = rib.close(ia, R=(.1, 1000), ret_rij=True)
        i = np.argmin(d2[1])
        d2 = d2[1][i]
        assert d != d2
        # Calculate actual radius
        assert d2 == (Atom[1].radius() + Atom[6].radius())

    def test_unit_cell_estimation1(self, setup):
        # Create new geometry with only the coordinates
        # and atoms
        geom = Geometry(setup.g.xyz, Atom[6])
        # Only check the two distances we know have sizes
        for i in range(2):
            # It cannot guess skewed axis
            assert not np.allclose(geom.cell[i, :], setup.g.cell[i, :])

    def test_unit_cell_estimation2(self, setup):
        # Create new geometry with only the coordinates
        # and atoms
        s1 = SuperCell([2, 2, 2])
        g1 = Geometry([[0, 0, 0], [1, 1, 1]], sc=s1)
        g2 = Geometry(np.copy(g1.xyz))
        assert np.allclose(g1.cell, g2.cell)

        # Assert that it correctly calculates the bond-length in the
        # directions of actual distance
        g1 = Geometry([[0, 0, 0], [1, 1, 0]], atom='H', sc=s1)
        g2 = Geometry(np.copy(g1.xyz))
        for i in range(2):
            assert np.allclose(g1.cell[i, :], g2.cell[i, :])
        assert not np.allclose(g1.cell[2, :], g2.cell[2, :])

    @pytest.mark.xfail(raises=ValueError)
    def test_distance1(self, setup):
        geom = Geometry(setup.g.xyz, Atom[6])
        # maxR is undefined
        d = geom.distance()

    @pytest.mark.xfail(raises=ValueError)
    def test_distance2(self, setup):
        geom = Geometry(setup.g.xyz, Atom[6])
        d = geom.distance(R=1.42, method='unknown_numpy_function')

    def test_distance3(self, setup):
        geom = setup.g.copy()
        d = geom.distance()
        assert len(d) == 1
        assert np.allclose(d, [1.42])

    def test_distance4(self, setup):
        geom = setup.g.copy()
        d = geom.distance(method=np.min)
        assert len(d) == 1
        assert np.allclose(d, [1.42])
        d = geom.distance(method=np.max)
        assert len(d) == 1
        assert np.allclose(d, [1.42])
        d = geom.distance(method='max')
        assert len(d) == 1
        assert np.allclose(d, [1.42])

    def test_distance5(self, setup):
        geom = setup.g.copy()
        d = geom.distance(R=np.inf)
        assert len(d) == 6
        d = geom.distance(0, R=1.42)
        assert len(d) == 1
        assert np.allclose(d, [1.42])

    def test_distance6(self, setup):
        # Create a 1D chain
        geom = Geometry([0] * 3, Atom(1, R=1.), sc=1)
        geom.set_nsc([77, 1, 1])
        d = geom.distance(0)
        assert len(d) == 1
        assert np.allclose(d, [1.])

        # Do twice
        d = geom.distance(R=2)
        assert len(d) == 2
        assert np.allclose(d, [1., 2.])

        # Do all
        d = geom.distance(R=np.inf)
        assert len(d) == 77 // 2
        # Add one due arange not adding the last item
        assert np.allclose(d, range(1, 78 // 2))

        # Create a 2D grid
        geom.set_nsc([3, 3, 1])
        d = geom.distance(R=2, tol=[.4, .3, .2, .1])
        assert len(d) == 2  # 1, sqrt(2)
        # Add one due arange not adding the last item
        assert np.allclose(d, [1, 2**.5])

        # Create a 2D grid
        geom.set_nsc([5, 5, 1])
        d = geom.distance(R=2, tol=[.4, .3, .2, .1])
        assert len(d) == 3  # 1, sqrt(2), 2
        # Add one due arange not adding the last item
        assert np.allclose(d, [1, 2**.5, 2])

    def test_distance7(self, setup):
        # Create a 1D chain
        geom = Geometry([0] * 3, Atom(1, R=1.), sc=1)
        geom.set_nsc([77, 1, 1])
        # Try with a short R and a long tolerance list
        # We know that the tolerance list prevails, because
        d = geom.distance(R=1, tol=np.ones(10) * .5)
        assert len(d) == 1
        assert np.allclose(d, [1.])

    def test_distance8(self, setup):
        geom = Geometry([0] * 3, Atom(1, R=1.), sc=1)
        geom.set_nsc([77, 1, 1])
        d = geom.distance(0, method='min')
        assert len(d) == 1
        d = geom.distance(0, method='median')
        assert len(d) == 1
        d = geom.distance(0, method='mode')
        assert len(d) == 1

    def test_optimize_nsc1(self, setup):
        # Create a 1D chain
        geom = Geometry([0] * 3, Atom(1, R=1.), sc=1)
        geom.set_nsc([77, 77, 77])
        assert np.allclose(geom.optimize_nsc(), [3, 3, 3])
        geom.set_nsc([77, 77, 77])
        assert np.allclose(geom.optimize_nsc(1), [77, 3, 77])
        geom.set_nsc([77, 77, 77])
        assert np.allclose(geom.optimize_nsc([0, 2]), [3, 77, 3])
        geom.set_nsc([77, 77, 77])
        assert np.allclose(geom.optimize_nsc([0, 2], R=2.00000001), [5, 77, 5])
        geom.set_nsc([1, 1, 1])
        assert np.allclose(geom.optimize_nsc([0, 2], R=2.0000001), [5, 1, 5])
        geom.set_nsc([5, 1, 5])
        assert np.allclose(geom.optimize_nsc([0, 2], R=0.9999), [1, 1, 1])

    def test_optimize_nsc2(self, setup):
        # 2 ** 0.5 ensures lattice vectors with length 1
        geom = sisl_geom.fcc(2**0.5, Atom(1, R=1.0001))
        geom.set_nsc([77, 77, 77])
        assert np.allclose(geom.optimize_nsc(), [3, 3, 3])
        geom.set_nsc([77, 77, 77])
        assert np.allclose(geom.optimize_nsc(1), [77, 3, 77])
        geom.set_nsc([77, 77, 77])
        assert np.allclose(geom.optimize_nsc([0, 2]), [3, 77, 3])
        geom.set_nsc([77, 77, 77])
        assert np.allclose(geom.optimize_nsc([0, 2], R=2.000001), [5, 77, 5])
        geom.set_nsc([1, 1, 1])
        assert np.allclose(geom.optimize_nsc([0, 2], R=2.0000001), [5, 1, 5])
        geom.set_nsc([5, 1, 5])
        assert np.allclose(geom.optimize_nsc([0, 2], R=0.9999), [1, 1, 1])

    def test_argumentparser1(self, setup):
        setup.g.ArgumentParser()
        setup.g.ArgumentParser(**setup.g._ArgumentParser_args_single())

    def test_argumentparser2(self, setup, **kwargs):
        p, ns = setup.g.ArgumentParser(**kwargs)

        # Try all options
        opts = [
            '--origin',
            '--center-of',
            'mass',
            '--center-of',
            'xyz',
            '--center-of',
            'position',
            '--center-of',
            'cell',
            '--unit-cell',
            'translate',
            '--unit-cell',
            'mod',
            '--rotate',
            '90',
            'x',
            '--rotate',
            '90',
            'y',
            '--rotate',
            '90',
            'z',
            '--add',
            '0,0,0',
            '6',
            '--swap',
            '0',
            '1',
            '--repeat',
            '2',
            'x',
            '--repeat',
            '2',
            'y',
            '--repeat',
            '2',
            'z',
            '--tile',
            '2',
            'x',
            '--tile',
            '2',
            'y',
            '--tile',
            '2',
            'z',
            '--cut',
            '2',
            'z',
            '--cut',
            '2',
            'y',
            '--cut',
            '2',
            'x',
        ]
        if kwargs.get('limit_arguments', True):
            opts.extend([
                '--rotate', '-90', 'x', '--rotate', '-90', 'y', '--rotate',
                '-90', 'z'
            ])
        else:
            opts.extend([
                '--rotate-x', ' -90', '--rotate-y', ' -90', '--rotate-z',
                ' -90', '--repeat-x', '2', '--repeat-y', '2', '--repeat-z', '2'
            ])

        args = p.parse_args(opts, namespace=ns)

        if len(kwargs) == 0:
            self.test_argumentparser2(setup,
                                      **setup.g._ArgumentParser_args_single())

    def test_set_sc(self, setup):
        # Create new geometry with only the coordinates
        # and atoms
        s1 = SuperCell([2, 2, 2])
        g1 = Geometry([[0, 0, 0], [1, 1, 1]], sc=[2, 2, 1])
        g1.set_sc(s1)
        assert g1.sc == s1

    def test_attach1(self, setup):
        g = setup.g.attach(0, setup.mol, 0, dist=1.42, axis=2)
        g = setup.g.attach(0, setup.mol, 0, dist='calc', axis=2)
        g = setup.g.attach(0, setup.mol, 0, dist=[0, 0, 1.42])

    def test_mirror1(self, setup):
        for plane in ['xy', 'xz', 'yz']:
            setup.g.mirror(plane)

    def test_pickle(self, setup):
        import pickle as p
        s = p.dumps(setup.g)
        n = p.loads(s)
        assert n == setup.g

    def test_geometry_names(self):
        g = sisl_geom.graphene()

        assert len(g.names) == 0
        g['A'] = 1
        assert len(g.names) == 1
        g['B'] = [1, 2]
        assert len(g.names) == 2
        g.names.delete_name('B')
        assert len(g.names) == 1

        # Add new group
        g['B'] = [0, 2]

        for name in g.names:
            assert name in ['A', 'B']

        str(g)

        assert np.allclose(g['B'], g[[0, 2], :])
        assert np.allclose(g.axyz('B'), g[[0, 2], :])

        del g.names['B']
        assert len(g.names) == 1

    @pytest.mark.xfail(raises=SislError)
    def test_geometry_groups_raise(self):
        g = sisl_geom.graphene()
        g['A'] = 1
        g['A'] = [1, 2]

    @pytest.mark.parametrize("geometry", [
        sisl_geom.graphene(),
        sisl_geom.diamond(),
        sisl_geom.sc(1.4, Atom[1]),
        sisl_geom.fcc(1.4, Atom[1]),
        sisl_geom.bcc(1.4, Atom[1]),
        sisl_geom.hcp(1.4, Atom[1])
    ])
    def test_geometry_as_primary(self, geometry):
        prod = itertools.product
        x_reps = [1, 4, 3]
        y_reps = [1, 4, 5]
        z_reps = [1, 4, 6]
        tile_rep = ['r', 't']

        na_primary = len(geometry)
        for x, y, z in prod(x_reps, y_reps, z_reps):
            if x == y == z == 1:
                continue
            for a, b, c in prod(tile_rep, tile_rep, tile_rep):
                G = ((geometry * ([x, 1, 1], a)) *
                     ([1, y, 1], b)) * ([1, 1, z], c)
                p = G.as_primary(na_primary)
                assert np.allclose(p.xyz, geometry.xyz)
                assert np.allclose(p.cell, geometry.cell)

    def test_geometry_as_primary_without_super(self):
        g = sisl_geom.graphene()
        p = g.as_primary(len(g))
        assert g == p

        G = g.tile(2, 0).tile(3, 1)
        p, supercell = G.as_primary(len(g), ret_super=True)
        assert np.allclose(p.xyz, g.xyz)
        assert np.allclose(p.cell, g.cell)
        assert np.all(supercell == [2, 3, 1])
Beispiel #2
0
def get_H():
    s = geom.sc(1., Atom(1, 1.001))
    H = Hamiltonian(s)
    H.construct([(0.1, 1.001), (0.1, 0.5)])
    return H.tile(2, 0).tile(2, 1).tile(2, 2)