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