示例#1
0
    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)
示例#2
0
    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)
示例#3
0
    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)
示例#4
0
    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)
示例#5
0
    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)
示例#6
0
    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)
示例#7
0
    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)
示例#8
0
    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)
示例#9
0
    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)