def testGaussianSchellModel1DX(self): x_coordinates = np.linspace(-12, 12, 1000) y_coordinates = np.array([0.0]) gsm = GaussianSchellModel2D(A=1, sigma_s_x=1.5, sigma_g_x=1.5, sigma_s_y=10000000, sigma_g_y=10000000) eigenmoder = SilentEigenmoder(x_coordinates, y_coordinates) f = lambda r1, r2: gsm.evaluate(r1, r2) twoform = eigenmoder.eigenmodes(f) for n in range(min(len(twoform.eigenvalues()), 15)): y = twoform.eigenvectors()[n, :, 0] phi = gsm.phi_nm(n, 0, x_coordinates, [0.0])[:, 0] phi /= np.linalg.norm(phi) diff_norm_eig = np.sum(np.abs(phi - y)) diff_norm_neg = np.sum(np.abs(-1 * phi - y)) if diff_norm_eig > diff_norm_neg: phi *= -1 diff_norm = np.sum(np.abs(phi - y)) self.assertLess(diff_norm, 1e-8)
def testGaussianSchellModel1DY(self): x_coordinates = np.array([0.0]) y_coordinates = np.linspace(-15, 15, 100) gsm = GaussianSchellModel2D(A=1, sigma_s_x=10000000, sigma_g_x=10000000, sigma_s_y=2.0, sigma_g_y=1.5) eigenmoder = SilentEigenmoder(x_coordinates, y_coordinates) f = lambda r1, r2: gsm.evaluate(r1, r2) twoform = eigenmoder.eigenmodes(f) for n in range(min(len(twoform.eigenvalues()), 15)): x = twoform.eigenvectors()[n, 0, :] x = x / np.sqrt(np.trapz(np.abs(x)**2, y_coordinates)) phi = np.array([gsm._mode_y.phi(n, y) for y in y_coordinates]) diff_norm_eig = np.sum(np.abs(phi - x)) diff_norm_neg = np.sum(np.abs(-1 * phi - x)) if diff_norm_eig > diff_norm_neg: phi *= -1 diff_norm = np.sum(np.abs(phi - x)) self.assertLess(diff_norm, 1 * 1e-8)
def testEigenmodesNormalVsFast(self): f = lambda r1, r2: np.exp(-(r1[0] - r2[0])**2 - (r1[1] - r2[1])**2) + 0 * 1j x_coordinates, y_coordinates = testCoordinates(n_x=30, n_y=30) eigenmoder = SilentEigenmoder(x_coordinates, y_coordinates) twoform_normal = eigenmoder.eigenmodes(f) twoform_fast = eigenmoder.eigenmodes_fast(f, None) number_samples = 5 for i_x_1 in np.random.randint(0, len(x_coordinates), number_samples): x_1 = x_coordinates[i_x_1] for i_y_1 in np.random.randint(0, len(y_coordinates), number_samples): y_1 = y_coordinates[i_y_1] r_1 = (x_1, y_1) for i_x_2 in np.random.randint(0, len(x_coordinates), number_samples): x_2 = x_coordinates[i_x_2] for i_y_2 in np.random.randint(0, len(y_coordinates), number_samples): y_2 = y_coordinates[i_y_2] r_2 = (x_2, y_2) f_r = twoform_fast.evaluate(r_1, r_2) t_r = twoform_normal.evaluate(r_1, r_2) dr = f_r - t_r if abs(f_r) > 10e-8: self.assertLess(abs(dr), 1e-8)
def testGaussianSchellModel1D(self): x_coordinates = np.linspace(-10, 10, 100) y_coordinates = np.array([0.0]) gsm = GaussianSchellModel1D(1.0, 1.0, 1.0) eigenmoder = SilentEigenmoder(x_coordinates, y_coordinates) f = lambda r1, r2: gsm.evaluate(r1[0], r2[0]) twoform = eigenmoder.eigenmodes(f) for n in range(min(len(twoform.eigenvalues()), 15)): y = twoform.eigenvectors()[n, :, 0] phi = [gsm.phi(n, x) for x in x_coordinates] phi /= np.linalg.norm(phi) diff_norm_eig = np.sum(np.abs(phi - y)) diff_norm_neg = np.sum(np.abs(-1 * phi - y)) if diff_norm_eig > diff_norm_neg: phi *= -1 diff_norm = np.sum(np.abs(phi - y)) self.assertLess(diff_norm, 5 * 1e-10)
def testEigenmodesAllRandomNoSymmetry(self): f = lambda r1, r2: np.exp(-((r1[0] - r2[0])**2) / 2.0 - (r1[1] - r2[1])**2) + 0 * 1j x_coordinates, y_coordinates = testCoordinates(n_x=30, n_y=30) eigenmoder = SilentEigenmoder(x_coordinates, y_coordinates) twoform = eigenmoder.eigenmodes(f) number_samples = 8 for i_x_1 in np.random.randint(0, len(x_coordinates), number_samples): x_1 = x_coordinates[i_x_1] for i_y_1 in np.random.randint(0, len(y_coordinates), number_samples): y_1 = y_coordinates[i_y_1] r_1 = (x_1, y_1) for i_x_2 in np.random.randint(0, len(x_coordinates), number_samples): x_2 = x_coordinates[i_x_2] for i_y_2 in np.random.randint(0, len(y_coordinates), number_samples): y_2 = y_coordinates[i_y_2] r_2 = (x_2, y_2) f_r = f(r_1, r_2) t_r = twoform.evaluate(r_1, r_2) dr = f_r - t_r if abs(f_r) > 10e-6: self.assertLess(abs(dr), 1e-12)
def testCreateWorkMatrixAllVsByUpperHalf(self): f = lambda r1, r2: np.exp(-(r1[0] - r2[0])**2 - (r1[1] - r2[1])**2) + ( r1[0] - r2[0]) * 1j + (r1[1] - r2[1]) * 1j x_coordinates, y_coordinates = testCoordinates(n_x=30, n_y=30) eigenmoder = SilentEigenmoder(x_coordinates, y_coordinates) work_matrix_all = eigenmoder._createWorkMatrixAll(f) work_matrix_by_upp_half = eigenmoder._createWorkMatrixByUpperHalf(f) diff = np.linalg.norm(work_matrix_all - work_matrix_by_upp_half) self.assertLess(diff, 1e-10)
def testEigenmoder1DY(self): x_coordinates = np.array([0.0]) y_coordinates = np.linspace(-3, 3, 100) f = lambda r1, r2: np.exp(-(r1[0] - r2[0])**2) eigenmoder = SilentEigenmoder(x_coordinates, y_coordinates) twoform = eigenmoder.eigenmodes(f) x = [twoform.evaluate([0.0, y], [0.0, 1.0]) for y in y_coordinates] x_f = [f([0.0, y], [0.0, 1.0]) for y in y_coordinates] d_x = np.array(x) - np.array(x_f) self.assertLess(np.linalg.norm(d_x), 1e-8)
def testEigenmoder1DX(self): x_coordinates = np.linspace(-3, 3, 100) y_coordinates = np.array([0.0]) f = lambda r1, r2: np.exp(-(r1[0] - r2[0])**2) eigenmoder = SilentEigenmoder(x_coordinates, y_coordinates) twoform = eigenmoder.eigenmodes(f) y = [twoform.evaluate([x, 0.0], [1, 0.0]) for x in x_coordinates] y_f = [f([x, 0.0], [1, 0.0]) for x in x_coordinates] d_y = np.array(y) - np.array(y_f) self.assertLess(np.linalg.norm(d_y), 1e-8)
def testEigenmodesSavedIntensity(self): f = lambda r1, r2: np.exp(-(r1[0] - r2[0])**2 - (r1[1] - r2[1])**2) + 0 * 1j x_coordinates, y_coordinates = testCoordinates(n_x=30, n_y=30) eigenmoder = SilentEigenmoder(x_coordinates, y_coordinates) twoform = eigenmoder.eigenmodes(f) for i_x_1, x_1 in enumerate(x_coordinates): for i_y_1, y_1 in enumerate(y_coordinates): r_1 = (x_1, y_1) f_r = f(r_1, r_1) t_r = twoform.intensity()[i_x_1, i_y_1] dr = f_r - t_r self.assertLess(abs(dr), 1e-12)