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])
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])
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)
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)
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])