コード例 #1
0
ファイル: test_rsd.py プロジェクト: semodi/mlcf
def test_elfcs():
    """ Test whether the ElF algorithm reproduces the reference values for elf
    """
    # Test the ElF alignment (ElF rule)
    for i in [0, 3, 0]:
        print('======Testing {} =========='.format(i))
        angles1 = get_elfcs_angles(i, atoms.get_positions(), elf[i])
        print(angles1)
        rotated1 = rotate_tensor(elf[i], angles1, inverse=True)

        for it in range(10):
            rand_ang = np.random.rand(3) * 2 * np.pi
            elf_rotated = rotate_tensor(elf[i], rand_ang)
            coords_rotated = rotate_vector(atoms.get_positions()-\
                atoms.get_positions()[i], rand_ang)

            angles2 = get_elfcs_angles(i, coords_rotated, elf_rotated)
            rotated2 = rotate_tensor(elf_rotated, angles2, inverse=True)

            for key in rotated1:
                assert np.allclose(rotated1[key],
                                   rotated2[key],
                                   atol=1e-3,
                                   rtol=1e-3)

    # pickle.dump(rotated1, open('./test/elf_elfcs.dat','wb'))
    elf_ref = pickle.load(open('./test/elf_elfcs.dat', 'rb'))
    for key in elf[0]:
        assert np.allclose(rotated1[key], elf_ref[key])
コード例 #2
0
ファイル: test_rsd.py プロジェクト: semodi/mlcf
def test_rotate_tensor():
    """Test certain algebraic properties of the rotate_tensor() routine
    """
    # Test identity and inverse
    id = rotate_tensor(elf[0], [0, 0, 0])
    rotated = rotate_tensor(elf[0], [1.2, 0.3, 0.1])
    rotated = rotate_tensor(rotated, [1.2, 0.3, 0.1], inverse=True)
    for key in elf[0]:
        assert np.allclose(rotated[key], elf[0][key])
        assert np.allclose(id[key], elf[0][key])

    # Test if rotation preserves l2-norm
    for angles in [[1.0, 1.2, 0.2], [0.3, 3.6, 2.3]]:
        rotated = rotate_tensor(elf[0], angles)
        casimir = get_casimir(elf[0])
        casimir_rotated = get_casimir(rotated)
        for key in casimir:
            assert np.allclose(casimir[key], casimir_rotated[key])
コード例 #3
0
ファイル: utils.py プロジェクト: semodi/mlcf
def change_alignment(path, traj_path, new_method, save_as=None):
    """ Transform ElFs from one local coordinate system to another one specified in
    new_method

    Parameters
    ----------
        path: str
            file origin
        traj_path: str
            path to .traj or .xyz containing the atomic positions
        new_method: str
            {'elf','nn','water','neutral'}, method defining the local coordinate system
        save_as: str
            destination file to save ElFs, default=None (don't save)

    Returns
    ---------
        list of ElF
            if save_as == None returns list of electronic descriptors (ElFs)
            otherwise returns None

    """

    elfs = hdf5_to_elfs(path)
    atoms = read(traj_path, ':')

    with File(path) as file:
        basis = json.loads(file.attrs['basis'])

    # if new_method == basis['alignment']:
    # raise Exception('Already aligned with method: ' + new_method)
    # else:
    basis['alignment'] = new_method

    #Rotate to neutral
    for i, elf_system in enumerate(elfs):
        for j, elf in enumerate(elf_system):
            elfs[i][j].value = rotate_tensor(make_complex(
                elf.value, basis['n_rad_' + elf.species.lower()],
                basis['n_l_' + elf.species.lower()]),
                                             elf.angles,
                                             inverse=False)
            elfs[i][j].angles = np.array([0, 0, 0])
            elfs[i][j].unitcell = atoms[i].get_cell()
            elfs[i][j].basis = basis

    oriented_elfs = []

    for elfs_system, atoms_system in zip(elfs, atoms):
        oriented_elfs.append(orient_elfs(elfs_system, atoms_system,
                                         new_method))

    if save_as == None:
        return oriented_elfs
    else:
        elfs_to_hdf5(oriented_elfs, save_as)
コード例 #4
0
ファイル: test_rsd.py プロジェクト: semodi/mlcf
def test_watercs():
    """ Test whether nearest neighbor reproduces the reference values for elf
    """
    for i in [3, 1, 4, 0]:

        angles1 = get_water_angles(i, atoms.get_positions())
        rotated1 = rotate_tensor(elf[i], angles1, inverse=True)

        for it in range(5):
            rand_ang = np.random.rand(3) * 2 * np.pi
            elf_rotated = rotate_tensor(elf[i], rand_ang)
            coords_rotated = rotate_vector(atoms.get_positions()-\
                atoms.get_positions()[i], rand_ang)

            angles2 = get_water_angles(i, coords_rotated)
            rotated2 = rotate_tensor(elf_rotated, angles2, inverse=True)

            for key in rotated1:
                np.allclose(rotated1[key], rotated2[key], atol=1e-6)
コード例 #5
0
ファイル: test_rsd.py プロジェクト: semodi/mlcf
def test_nncs():
    """ Test whether nearest neighbor reproduces the reference values for elf
    """
    for i in [3, 1, 4, 0]:

        angles1 = get_nncs_angles(i, atoms.get_positions())
        rotated1 = rotate_tensor(elf[i], angles1, inverse=True)

        for it in range(5):
            rand_ang = np.random.rand(3) * 2 * np.pi
            elf_rotated = rotate_tensor(elf[i], rand_ang)
            coords_rotated = rotate_vector(atoms.get_positions()-\
                atoms.get_positions()[i], rand_ang)

            angles2 = get_nncs_angles(i, coords_rotated)
            rotated2 = rotate_tensor(elf_rotated, angles2, inverse=True)

            for key in rotated1:
                np.allclose(rotated1[key], rotated2[key], atol=1e-6)
    # pickle.dump(rotated1, open('./test/elf_nncs.dat','wb'))
    elf_ref = pickle.load(open('./test/elf_nncs.dat', 'rb'))
    for key in elf[0]:
        assert np.allclose(rotated1[key], elf_ref[key])