def _test_disp_corr_matrix(ph3): supercell_phonon = get_supercell_phonon(ph3) uu = DispCorrMatrix(supercell_phonon) uu.run(300.0) sqrt_masses = np.repeat(np.sqrt(ph3.supercell.masses), 3) uu_inv = mass_inv(uu.psi_matrix, sqrt_masses) np.testing.assert_allclose(uu.upsilon_matrix, uu_inv, atol=1e-8, rtol=0) rd = RandomDisplacements(ph3.supercell, ph3.primitive, ph3.fc2) rd.run_correlation_matrix(300) rd_uu_inv = np.transpose(rd.uu_inv, axes=[0, 2, 1, 3]).reshape(uu_inv.shape) np.testing.assert_allclose(uu.upsilon_matrix, rd_uu_inv, atol=1e-8, rtol=0)
def test_NaCl(self): """Test by fixed random numbers of np.random.normal randn_ii and randn_ij were created by np.random.seed(seed=100) randn_ii = np.random.normal(size=(N_ii, 1, num_band)) randn_ij = np.random.normal(size=(N_ij, 2, 1, num_band)). numpy v1.16.4 (py37h6b0580a_0) on macOS installed from conda-forge was used. """ phonon = self._get_phonon_NaCl() rd = RandomDisplacements(phonon.supercell, phonon.primitive, phonon.force_constants, cutoff_frequency=0.01) num_band = len(phonon.primitive) * 3 N = int(np.rint(phonon.supercell.volume / phonon.primitive.volume)) N_ij = N - len(rd.qpoints) N_ii = N - N_ij * 2 shape_ii = (N_ii, 1, num_band) randn_ii = np.fromstring(randn_ii_str.replace('\n', ' '), dtype=float, sep=' ').reshape(shape_ii) shape_ij = (N_ij, 2, 1, num_band) randn_ij = np.zeros(shape_ij, dtype=float) randn_ij[:, 0, 0, :] = np.fromstring(randn_ij_str_1.replace('\n', ' '), dtype=float, sep=' ').reshape(N_ij, num_band) randn_ij[:, 1, 0, :] = np.fromstring(randn_ij_str_2.replace('\n', ' '), dtype=float, sep=' ').reshape(N_ij, num_band) rd.run(500, randn=(randn_ii, randn_ij)) data = np.fromstring(disp_str.replace('\n', ' '), dtype=float, sep=' ') np.testing.assert_allclose(data, rd.u.ravel(), atol=1e-5)
def test_random_displacements(ph_nacl): """Test by fixed random numbers of np.random.normal randn_ii and randn_ij were created by np.random.seed(seed=100) randn_ii = np.random.normal(size=(N_ii, 1, num_band)) randn_ij = np.random.normal(size=(N_ij, 2, 1, num_band)). numpy v1.16.4 (py37h6b0580a_0) on macOS installed from conda-forge was used. """ ph = ph_nacl rd = RandomDisplacements(ph.supercell, ph.primitive, ph.force_constants, cutoff_frequency=0.01) num_band = len(ph.primitive) * 3 N = len(ph.supercell) // len(ph.primitive) # N = N_ii + N_ij * 2 # len(rd.qpoints) = N_ii + N_ij N_ij = N - len(rd.qpoints) N_ii = N - N_ij * 2 shape_ii = (N_ii, 1, num_band) randn_ii = np.fromstring(randn_ii_str.replace('\n', ' '), dtype=float, sep=' ').reshape(shape_ii) shape_ij = (N_ij, 2, 1, num_band) randn_ij = np.zeros(shape_ij, dtype=float) randn_ij[:, 0, 0, :] = np.fromstring( randn_ij_str_1.replace('\n', ' '), dtype=float, sep=' ').reshape(N_ij, num_band) randn_ij[:, 1, 0, :] = np.fromstring( randn_ij_str_2.replace('\n', ' '), dtype=float, sep=' ').reshape(N_ij, num_band) rd.run(500, randn=(randn_ii, randn_ij)) # for line in rd.u.ravel().reshape(-1, 6): # print(("%.7f, " * 6) % tuple(line)) data = np.array(disp_ref) np.testing.assert_allclose(data, rd.u.ravel(), atol=1e-5) rd.run_d2f() np.testing.assert_allclose(rd.force_constants, ph.force_constants, atol=1e-5, rtol=1e-5) rd = RandomDisplacements(ph.supercell, ph.primitive, ph.force_constants) rd.run_correlation_matrix(500) shape = (len(ph.supercell) * 3, len(ph.supercell) * 3) uu = np.transpose(rd.uu, axes=[0, 2, 1, 3]).reshape(shape) uu_inv = np.transpose(rd.uu_inv, axes=[0, 2, 1, 3]).reshape(shape) sqrt_masses = np.repeat(np.sqrt(ph.supercell.masses), 3) uu_bare = mass_sand(uu, sqrt_masses) uu_inv_bare = np.linalg.pinv(uu_bare) _uu_inv = mass_sand(uu_inv_bare, sqrt_masses) np.testing.assert_allclose(_uu_inv, uu_inv, atol=1e-5, rtol=1e-5)
def test_NaCl(self): phonon = self._get_phonon_NaCl() np.random.seed(19680801) rd = RandomDisplacements(phonon.dynamical_matrix, cutoff_frequency=0.01)
def test_random_displacements_all_atoms_TiPN3(ph_tipn3): """Test by fixed random numbers of np.random.normal randn_ii and randn_ij were created by np.random.seed(seed=100) randn_ii = np.random.normal(size=(N_ii, 1, num_band)) randn_ij = np.random.normal(size=(N_ij, 2, 1, num_band)). Precalculated eigenvectors are used because those depend on eigensolvers such as openblas, mkl, blis, or netlib. Eigenvalues are expected to be equivalent over the eigensolvers. So the eigenvalues calculated on the fly are used. """ ph = ph_tipn3 rd = RandomDisplacements(ph.supercell, ph.primitive, ph.force_constants) num_band = len(ph.primitive) * 3 N = len(ph.supercell) // len(ph.primitive) # N = N_ii + N_ij * 2 # len(rd.qpoints) = N_ii + N_ij N_ij = N - len(rd.qpoints) N_ii = N - N_ij * 2 shape_ii = (N_ii, 1, num_band) shape_ij = (N_ij, 2, 1, num_band) randn_ii = np.reshape(randn_ii_TiPN3, shape_ii) randn_ij = np.reshape(randn_ij_TiPN3, shape_ij) eigvecs_ii = np.reshape( np.loadtxt(os.path.join(current_dir, "eigvecs_ii_TiPN3.txt")), (N_ii, num_band, num_band)) eigvecs_ij = np.reshape( np.loadtxt(os.path.join(current_dir, "eigvecs_ij_TiPN3.txt"), dtype=complex), (N_ij, num_band, num_band)) rd._eigvecs_ii = eigvecs_ii rd._eigvecs_ij = eigvecs_ij rd.run(500, randn=(randn_ii, randn_ij)) # for line in rd.u.ravel().reshape(-1, 6): # print(("%.7f, " * 6) % tuple(line)) data = np.array(disp_ref_TiPN3) np.testing.assert_allclose(data, rd.u.ravel(), atol=1e-5) rd.run_d2f() np.testing.assert_allclose(rd.force_constants, ph.force_constants, atol=1e-5, rtol=1e-5) rd.run_correlation_matrix(500) shape = (len(ph.supercell) * 3, len(ph.supercell) * 3) uu = np.transpose(rd.uu, axes=[0, 2, 1, 3]).reshape(shape) uu_inv = np.transpose(rd.uu_inv, axes=[0, 2, 1, 3]).reshape(shape) sqrt_masses = np.repeat(np.sqrt(ph.supercell.masses), 3) uu_bare = _mass_sand(uu, sqrt_masses) uu_inv_bare = np.linalg.pinv(uu_bare) _uu_inv = _mass_sand(uu_inv_bare, sqrt_masses) np.testing.assert_allclose(_uu_inv, uu_inv, atol=1e-5, rtol=1e-5)