コード例 #1
0
    def testNumerical_f_dzSimgple(self):
        sigma_matrix = SigmaWaist(sigma_x=3e-6,
                                            sigma_y=1e-6,
                                            sigma_x_prime=5e-6,
                                            sigma_y_prime=4e-6)
        wavenumber = 1e+11

        x_coordinates = np.linspace(-10e-6, 10e-6, 15)
        y_coordinates = np.linspace(-10e-6, 10e-6, 10)

        tester = Numerical_f_dz(sigma_matrix, z=0.0, delta=0.0)

        prefactor = 2 * np.pi * sigma_matrix.sigma_x_prime() * sigma_matrix.sigma_y_prime()

        for x in x_coordinates:
            for y in y_coordinates:
                vec_x_y = np.array([x, y])
                for dx in x_coordinates:
                    for dy in y_coordinates:
                        vec_dr = np.array([dx, dy])

                        result_tester = tester.evaluateAnalytical(k=wavenumber,
                                                                  vec_x_y=vec_x_y,
                                                                  vec_dr=vec_dr)

                        result_analytic = prefactor * \
                                          np.exp(-0.5 * ((x**2/sigma_matrix.sigma_x()**2)+(y**2/sigma_matrix.sigma_y()**2))) * \
                                          np.exp(-0.5 * wavenumber**2 * ((dx**2 * sigma_matrix.sigma_x_prime()**2)+(dy**2 * sigma_matrix.sigma_y_prime()**2)))

                        diff = np.abs(1 - (result_tester / result_analytic))
                        self.assertLess(diff, 1e-12)
コード例 #2
0
    def testCalculateRhoPhase(self):
        sigma_matrix = SigmaWaist(sigma_x=3e-6,
                                  sigma_y=1e-6,
                                  sigma_x_prime=5e-6,
                                  sigma_y_prime=5e-6)

        x_coordinates = np.linspace(-1e-5, 1e-5, 50)
        y_coordinates = np.linspace(-1e-5, 1e-5, 50)
        wavenumber = 1e+11

        density = PhaseSpaceDensity(sigma_matrix, wavenumber)

        e_field = createGaussian2D(sigma_x=1.0e-6,
                                   sigma_y=1.0e-6,
                                   x_coordinates=x_coordinates,
                                   y_coordinates=y_coordinates)
        e_field = e_field + 0j

        strategy = BuilderStrategyPython(x_coordinates, y_coordinates, density,
                                         x_coordinates, y_coordinates,
                                         e_field[np.newaxis, :, :])

        for x in x_coordinates[::5]:
            for y in y_coordinates[::2]:
                norm_diff = np.linalg.norm(
                    strategy.calculateRhoPhase((x, y)) -
                    strategy.calculateRhoPhaseSlow((x, y)))
                self.assertLess(norm_diff, 1e-10)
コード例 #3
0
    def testIntegrationPartGaussian(self):
        sigma_x = 3e-6
        sigma_y = 1e-6
        sigma_matrix = SigmaWaist(sigma_x=sigma_x,
                                  sigma_y=sigma_y,
                                  sigma_x_prime=5e-6,
                                  sigma_y_prime=4e-6)
        wavenumber = 1e+11

        density = PhaseSpaceDensity(sigma_matrix, wavenumber)

        x_coordinates = np.linspace(-15e-6, 15e-6, 200)
        y_coordinates = np.linspace(-7e-6, 7e-6, 200)

        for dx in x_coordinates:
            diff = density.integrationPartGaussian(delta=0.0, z=0.0, x=dx, y=0.0) - np.exp(-dx**2/(2*sigma_matrix.sigma_x()**2))
            self.assertLess(diff, 1e-12)

        for dy in y_coordinates:
            diff = density.integrationPartGaussian(delta=0.0, z=0.0, x=0.0, y=dy) - np.exp(-dy**2/(2*sigma_matrix.sigma_y()**2))
            self.assertLess(diff, 1e-12)

        rho = np.zeros((x_coordinates.size, y_coordinates.size), dtype=np.complex128)
        for i_x, dx in enumerate(x_coordinates):
            for i_y, dy in enumerate(y_coordinates):
                rho[i_x, i_y] = density.integrationPartGaussian(delta=0.0, z=0.0, x=dx, y=dy)

        norm_1 = np.trapz(np.trapz(np.abs(rho), y_coordinates), x_coordinates)
        self.assertLess(1-norm_1/(2*np.pi*sigma_x*sigma_y), 1e-6)
コード例 #4
0
    def testNumerical_f_dz(self):
        sigma_matrix = SigmaWaist(sigma_x=3e-6,
                                  sigma_y=1e-6,
                                  sigma_x_prime=5e-6,
                                  sigma_y_prime=4e-6)

        sigma_matrix = sigma_matrix.SigmaMatrix()
        sigma_matrix[0, 1] = sigma_matrix[0, 0] * 0.0001
        sigma_matrix[1, 0] = sigma_matrix[0, 1]
        sigma_matrix[2, 3] = sigma_matrix[2, 2] * 0.00003
        sigma_matrix[3, 2] = sigma_matrix[2, 3]

        sigma_matrix[4, 4] = 90000
        sigma_matrix[5, 5] = 60000
        sigma_matrix[4, 5] = 11000
        sigma_matrix[5, 4] = 11000

        sigma_matrix = SigmaMatrix(sigma_matrix)

        x_coordinates = np.linspace(-1e-6, 1e-6, 3)
        y_coordinates = np.linspace(-1e-6, 1e-6, 2)
        tester = Numerical_f_dz(sigma_matrix,
                                z=0.01,
                                delta=0.005,
                                integration_points=100)

        # It is very expansive to converge for high frequency...
        for wavenumber in [1e9, 1e1, 1e11, 5e11]:
            for x in x_coordinates:
                for y in y_coordinates:
                    vec_x_y = np.array([x, y])
                    for dx in x_coordinates:
                        for dy in y_coordinates:
                            vec_dr = np.array([dx, dy])

                            result_analytic = tester.evaluateAnalytical(
                                k=wavenumber, vec_x_y=vec_x_y, vec_dr=vec_dr)

                            result_numerical = tester.evaluateNumerical(
                                k=wavenumber, vec_x_y=vec_x_y, vec_dr=vec_dr)

                            diff = np.abs(1 -
                                          (result_analytic / result_numerical))

                            #print(diff,wavenumber/10e10,x,y,dx,dy)
                            self.assertLess(diff, 2e-3)
コード例 #5
0
    def testNumerical_f_dzSimgple(self):
        sigma_matrix = SigmaWaist(sigma_x=3e-6,
                                  sigma_y=1e-6,
                                  sigma_x_prime=5e-6,
                                  sigma_y_prime=4e-6)
        wavenumber = 1e+11

        x_coordinates = np.linspace(-10e-6, 10e-6, 15)
        y_coordinates = np.linspace(-10e-6, 10e-6, 10)

        tester = Numerical_f_dz(sigma_matrix, z=0.0, delta=0.0)

        prefactor = 2 * np.pi * sigma_matrix.sigma_x_prime(
        ) * sigma_matrix.sigma_y_prime()

        for x in x_coordinates:
            for y in y_coordinates:
                vec_x_y = np.array([x, y])
                for dx in x_coordinates:
                    for dy in y_coordinates:
                        vec_dr = np.array([dx, dy])

                        result_tester = tester.evaluateAnalytical(
                            k=wavenumber, vec_x_y=vec_x_y, vec_dr=vec_dr)

                        result_analytic = prefactor * \
                                          np.exp(-0.5 * ((x**2/sigma_matrix.sigma_x()**2)+(y**2/sigma_matrix.sigma_y()**2))) * \
                                          np.exp(-0.5 * wavenumber**2 * ((dx**2 * sigma_matrix.sigma_x_prime()**2)+(dy**2 * sigma_matrix.sigma_y_prime()**2)))

                        diff = np.abs(1 - (result_tester / result_analytic))
                        self.assertLess(diff, 1e-12)
コード例 #6
0
    def testIntegrationPartGaussian(self):
        sigma_x = 3e-6
        sigma_y = 1e-6
        sigma_matrix = SigmaWaist(sigma_x=sigma_x,
                                  sigma_y=sigma_y,
                                  sigma_x_prime=5e-6,
                                  sigma_y_prime=4e-6)
        wavenumber = 1e+11

        density = PhaseSpaceDensity(sigma_matrix, wavenumber)

        x_coordinates = np.linspace(-15e-6, 15e-6, 200)
        y_coordinates = np.linspace(-7e-6, 7e-6, 200)

        for dx in x_coordinates:
            diff = density.integrationPartGaussian(
                delta=0.0, z=0.0, x=dx, y=0.0) - np.exp(
                    -dx**2 / (2 * sigma_matrix.sigma_x()**2))
            self.assertLess(diff, 1e-12)

        for dy in y_coordinates:
            diff = density.integrationPartGaussian(
                delta=0.0, z=0.0, x=0.0, y=dy) - np.exp(
                    -dy**2 / (2 * sigma_matrix.sigma_y()**2))
            self.assertLess(diff, 1e-12)

        rho = np.zeros((x_coordinates.size, y_coordinates.size),
                       dtype=np.complex128)
        for i_x, dx in enumerate(x_coordinates):
            for i_y, dy in enumerate(y_coordinates):
                rho[i_x, i_y] = density.integrationPartGaussian(delta=0.0,
                                                                z=0.0,
                                                                x=dx,
                                                                y=dy)

        norm_1 = np.trapz(np.trapz(np.abs(rho), y_coordinates), x_coordinates)
        self.assertLess(1 - norm_1 / (2 * np.pi * sigma_x * sigma_y), 1e-6)
コード例 #7
0
    def testStaticElectronDensity(self):
        sigma_x = 3e-6
        sigma_y = 1e-6
        sigma_matrix = SigmaWaist(sigma_x=sigma_x,
                                  sigma_y=sigma_y,
                                  sigma_x_prime=5e-6,
                                  sigma_y_prime=4e-6)
        wavenumber = 1e+11

        density = PhaseSpaceDensity(sigma_matrix, wavenumber)

        x_coordinates = np.linspace(-10e-6, 10e-6, 100)
        y_coordinates = np.linspace(-10e-6, 10e-6, 100)

        prefactor = 1.0 / (2 * np.pi * sigma_matrix.sigma_x()**2 * sigma_matrix.sigma_y()**2 * sigma_matrix.sigma_d()**2)

        #TODO prefactor not correct!
        prefactor = density.staticPart(np.array([0,0]))

        diff_prefactor = prefactor / density.staticPart(np.array([0,0]))

        self.assertLess(np.abs(1-diff_prefactor), 1e-12)


        dy = 0.0
        for dx in x_coordinates:
            dr = np.array([dx, dy])
            diff = density.staticPart(delta_r=dr) / \
                   (prefactor * np.exp(-(dx-dy)**2 * (0.5*wavenumber**2*sigma_matrix.sigma_x_prime()**2)))
            self.assertLess(np.abs(1-diff), 1e-12)

        dx = 0.0
        for dy in y_coordinates:
            dr = np.array([dx, dy])
            diff = density.staticPart(delta_r=dr) / \
                   (prefactor * np.exp(-(dx-dy)**2 * (0.5*wavenumber**2*sigma_matrix.sigma_y_prime()**2)))
            self.assertLess(np.abs(1-diff), 1e-12)
コード例 #8
0
    def testConvolutionVisual(self):
        sigma_matrix = SigmaWaist(sigma_x=3e-6,
                                  sigma_y=1e-6,
                                  sigma_x_prime=5e-6,
                                  sigma_y_prime=5e-6)

        x_coordinates = np.linspace(-1e-5, 1e-5, 50)
        y_coordinates = np.linspace(-1e-5, 1e-5, 50)
        wavenumber = 1e+11

        e_field = createGaussian2D(sigma_x=1.0e-6,
                                   sigma_y=1.0e-6,
                                   x_coordinates=x_coordinates,
                                   y_coordinates=y_coordinates)
        e_field = e_field + 0j

        af = AutocorrelationBuilder(N_e=0.0000001,
                                    sigma_matrix=sigma_matrix,
                                    field=e_field,
                                    x_coordinates=x_coordinates,
                                    y_coordinates=y_coordinates,
                                    k=wavenumber)

        f = np.zeros((x_coordinates.shape[0], y_coordinates.shape[0]),
                     dtype=np.complex128)

        # damping along y should be higher than along x because sigma_x > sigma_y for the density.
        for y in (0.0, 1.5e-6, -1.5e-6):
            for i_x_1, x_1 in enumerate(x_coordinates):
                for i_x_2, x_2 in enumerate(x_coordinates):
                    r_1 = np.array([x_1 + x_2, y])
                    r_2 = np.array([x_1 - x_2, y])

                    f[i_x_1, i_x_2] = af.evaluate(r_1, r_2)

            plotSurface(x_coordinates, x_coordinates, f, False)

        for x in (0.0, 1.5e-6, -1.5e-6):
            for i_y_1, y_1 in enumerate(y_coordinates):
                for i_y_2, y_2 in enumerate(y_coordinates):
                    r_1 = np.array([x, y_1 + y_2])
                    r_2 = np.array([x, y_1 - y_2])

                    f[i_y_1, i_y_2] = af.evaluate(r_1, r_2)

            plotSurface(y_coordinates, y_coordinates, f, False)
コード例 #9
0
    def testFredholm(self):
        Sigma_x = 0.75e-6
        Sigma_y = 1e-6
        sigma_matrix = SigmaWaist(sigma_x=Sigma_x,
                                  sigma_y=Sigma_y,
                                  sigma_x_prime=1e-6,
                                  sigma_y_prime=1e-6)

        x_coordinates = np.linspace(-1e-5, 1e-5, 60)
        y_coordinates = np.linspace(-1e-5, 1e-5, 60)
        wavenumber = 1e+11

        sigma_x = 1.0e-6
        sigma_y = 1.0e-6
        e_field = createGaussian2D(sigma_x=sigma_x,
                                   sigma_y=sigma_y,
                                   x_coordinates=x_coordinates,
                                   y_coordinates=y_coordinates)
        e_field = e_field + 0j

        af = AutocorrelationBuilder(N_e=0.0000001,
                                    sigma_matrix=sigma_matrix,
                                    field=e_field,
                                    x_coordinates=x_coordinates,
                                    y_coordinates=y_coordinates,
                                    k=wavenumber)

        x_coordinates = af._field_x_coordinates
        y_coordinates = af._field_y_coordinates

        f2d = np.zeros((x_coordinates.shape[0], y_coordinates.shape[0]),
                       dtype=np.complex128)
        f = np.zeros((x_coordinates.shape[0] * y_coordinates.shape[0]),
                     dtype=np.complex128)

        r_1 = np.array([x_coordinates[0], y_coordinates[0]])
        r_2 = np.array([x_coordinates[0], y_coordinates[0]])
        res = af.evaluate(r_1, r_2)

        f2d[0, 0] = 1.0
        res_f = af.fredholmAction(f2d)

        print(res)
        print(res_f[0, 0])
コード例 #10
0
    def testStaticPartFixedR1(self):
        sigma_matrix = SigmaWaist(sigma_x=3e-6,
                                  sigma_y=1e-6,
                                  sigma_x_prime=5e-6,
                                  sigma_y_prime=4e-6)
        wavenumber = 1e+11

        density = PhaseSpaceDensity(sigma_matrix, wavenumber)

        x_coordinates = np.linspace(-10e-6, 10e-6, 100)
        y_coordinates = np.linspace(-10e-6, 10e-6, 100)

        r_1 = np.array([0.0, 0.0])
        density.setAllStaticPartCoordinates(x_coordinates, y_coordinates)

        values = density.staticPartFixedR1(r_1)
        for i_x, x in enumerate(x_coordinates):
            for i_y, y in enumerate(y_coordinates):
                dr = r_1 - np.array([x, y])
                diff = np.abs(1 - values[i_x, i_y] / density.staticPart(dr))
                self.assertLess(diff, 1e-12)
コード例 #11
0
    def testNumerical(self):

        x_coordinates_gaussian = np.linspace(-3e-7, 3e-7, 100)
        y_coordinates_gaussian = np.linspace(-3e-7, 3e-7, 100)

        field = createGaussian2D(sigma_x=1e-7,
                                 sigma_y=1e-7,
                                 x_coordinates=x_coordinates_gaussian,
                                 y_coordinates=y_coordinates_gaussian)

        sigma_matrix = SigmaWaist(sigma_x=3e-6,
                                  sigma_y=1e-6,
                                  sigma_x_prime=5e-6,
                                  sigma_y_prime=4e-6)
        wavenumber = 1e+11

        tester = NumericalPhaseSpaceDensity(
            N_e=1,
            field_x_coordinates=x_coordinates_gaussian,
            field_y_coordinates=y_coordinates_gaussian,
            efield=field,
            sigma_matrix=sigma_matrix,
            z=0.0,
            delta=0.0,
            wavenumber=wavenumber)

        x_coordinates = np.linspace(-10e-6, 10e-6, 15)
        y_coordinates = np.linspace(-10e-6, 10e-6, 15)

        work_buff = np.zeros((x_coordinates.shape[0], y_coordinates.shape[0]),
                             dtype=np.complex128)

        for i_x, x in enumerate(x_coordinates):
            for i_y, y in enumerate(y_coordinates):
                r_1 = np.array([x, y])
                r_2 = r_1
                work_buff[i_x, i_y] = tester.evaluate(r_1, r_2)

        plotSurface(x_coordinates, y_coordinates, work_buff, True)
コード例 #12
0
    def testStaticElectronDensity(self):
        sigma_x = 3e-6
        sigma_y = 1e-6
        sigma_matrix = SigmaWaist(sigma_x=sigma_x,
                                  sigma_y=sigma_y,
                                  sigma_x_prime=5e-6,
                                  sigma_y_prime=4e-6)
        wavenumber = 1e+11

        density = PhaseSpaceDensity(sigma_matrix, wavenumber)

        x_coordinates = np.linspace(-10e-6, 10e-6, 100)
        y_coordinates = np.linspace(-10e-6, 10e-6, 100)

        prefactor = 1.0 / (2 * np.pi * sigma_matrix.sigma_x()**2 *
                           sigma_matrix.sigma_y()**2 *
                           sigma_matrix.sigma_d()**2)

        #TODO prefactor not correct!
        prefactor = density.staticPart(np.array([0, 0]))

        diff_prefactor = prefactor / density.staticPart(np.array([0, 0]))

        self.assertLess(np.abs(1 - diff_prefactor), 1e-12)

        dy = 0.0
        for dx in x_coordinates:
            dr = np.array([dx, dy])
            diff = density.staticPart(delta_r=dr) / \
                   (prefactor * np.exp(-(dx-dy)**2 * (0.5*wavenumber**2*sigma_matrix.sigma_x_prime()**2)))
            self.assertLess(np.abs(1 - diff), 1e-12)

        dx = 0.0
        for dy in y_coordinates:
            dr = np.array([dx, dy])
            diff = density.staticPart(delta_r=dr) / \
                   (prefactor * np.exp(-(dx-dy)**2 * (0.5*wavenumber**2*sigma_matrix.sigma_y_prime()**2)))
            self.assertLess(np.abs(1 - diff), 1e-12)
コード例 #13
0
    def testConvolution(self):
        Sigma_x = 0.75e-6
        Sigma_y = 1e-6
        sigma_matrix = SigmaWaist(sigma_x=Sigma_x,
                                  sigma_y=Sigma_y,
                                  sigma_x_prime=1e-60,
                                  sigma_y_prime=1e-60,
                                  sigma_dd=0.89e-03)

        x_coordinates = np.linspace(-0.5e-5, 0.5e-5, 200)
        y_coordinates = np.linspace(-0.5e-5, 0.5e-5, 200)
        wavenumber = 1e+11

        sigma_x = 1.0e-6
        sigma_y = 1.0e-6
        e_field = createGaussian2D(sigma_x=sigma_x,
                                   sigma_y=sigma_y,
                                   x_coordinates=x_coordinates,
                                   y_coordinates=y_coordinates)
        e_field = e_field + 0j
        e_field = e_field[np.newaxis, :, :]

        tester_x = ConvolutionTester(Sigma_x=Sigma_x, A=2.0, sigma_x=sigma_x)
        tester_y = ConvolutionTester(Sigma_x=Sigma_y, A=2.0, sigma_x=sigma_y)

        af = AutocorrelationBuilder(N_e=0.0000001,
                                    sigma_matrix=sigma_matrix,
                                    weighted_fields=e_field,
                                    x_coordinates=x_coordinates,
                                    y_coordinates=y_coordinates,
                                    k=wavenumber)

        f = np.zeros((x_coordinates.shape[0], y_coordinates.shape[0]),
                     dtype=np.complex128)
        t = np.zeros_like(f)

        # Test along y slices
        for y in y_coordinates:
            for i_x_1, x_1 in enumerate(x_coordinates):
                for i_x_2, x_2 in enumerate(x_coordinates):
                    r_1 = np.array([x_1 + x_2, y])
                    r_2 = np.array([x_1 - x_2, y])

                    f[i_x_1, i_x_2] = af.evaluate(r_1, r_2)
                    t[i_x_1, i_x_2] = tester_x.evaluateAnalytical(
                        r_1[0], r_2[0]) * tester_y.evaluateAnalytical(
                            r_1[1], r_2[1])

            f /= norm2D(x_coordinates, x_coordinates, f)
            t /= norm2D(x_coordinates, x_coordinates, t)

            diff = norm2D(x_coordinates, x_coordinates, f - t)

            plotSurface(x_coordinates, x_coordinates, f)
            plotSurface(x_coordinates, x_coordinates, t)

            self.assertLess(diff, 1e-10)

        # Test along x slices
        for x in x_coordinates:
            for i_y_1, y_1 in enumerate(y_coordinates):
                for i_y_2, y_2 in enumerate(y_coordinates):
                    r_1 = np.array([x, y_1 + y_2])
                    r_2 = np.array([x, y_1 - y_2])

                    f[i_y_1, i_y_2] = af.evaluate(r_1, r_2)
                    t[i_y_1, i_y_2] = tester_x.evaluateAnalytical(
                        r_1[0], r_2[0]) * tester_y.evaluateAnalytical(
                            r_1[1], r_2[1])

            f /= norm2D(y_coordinates, y_coordinates, f)
            t /= norm2D(y_coordinates, y_coordinates, t)

            diff = norm2D(y_coordinates, y_coordinates, f - t)
            print(diff)
            self.assertLess(diff, 1e-10)
コード例 #14
0
def createStraightSectionTestMatrix():
    sigma_matrix = SigmaWaist(sigma_x=3e-6,
                                    sigma_y=1e-6,
                                    sigma_x_prime=5e-6,
                                    sigma_y_prime=4e-6)
    return sigma_matrix