def bench_random(self): print() print(' Shifting periodic functions') print('==============================') print(' size | optimized | naive') print('------------------------------') for size,repeat in [(100,1500),(1000,300), (256,1500), (512,1000), (1024,500), (2048,200), (2048*2,100), (2048*4,50), ]: print('%6s' % size, end=' ') sys.stdout.flush() x = arange(size)*2*pi/size a = 1 if size < 2000: f = sin(x)*cos(4*x)+exp(sin(3*x)) sf = sin(x+a)*cos(4*(x+a))+exp(sin(3*(x+a))) else: f = sin(x)*cos(4*x) sf = sin(x+a)*cos(4*(x+a)) assert_array_almost_equal(direct_shift(f,1),sf) assert_array_almost_equal(shift(f,1),sf) print('| %9.2f' % measure('shift(f,a)',repeat), end=' ') sys.stdout.flush() print('| %9.2f' % measure('direct_shift(f,a)',repeat), end=' ') sys.stdout.flush() print(' (secs for %s calls)' % (repeat))
def relacion_dispersion(npuntos_malla, npasos_temporales, nparticulas, E_acumulador, dt, longitud_malla): # Se calcula la frecuencia angular y espacial minima y maxima (Ver codigo KEMPO1): omega_min = 2 * sp.pi / (dt) / 2 / (npasos_temporales / 2) omega_max = omega_min * (npasos_temporales / 2) k_min = 2 * sp.pi / (npuntos_malla) k_max = k_min * ((npuntos_malla / 2) - 1) # Se crean los vectores de frecuencias espacial y angular simuladas: nxtp2 = nextpow2(npuntos_malla) k_simulada = sp.linspace(-k_max, k_max, nxtp2) * 10 omega_simulada = sp.linspace(-omega_max, omega_max, nxtp2) / 10 #El diez es normalizando con respecto a vt # Se genera una matriz de frecuencias angular y espacial: K, W = sp.meshgrid(k_simulada, omega_simulada) # Se muestrea la matriz espacio-temporal: E_acumulador_muestreado = E_acumulador[0:npuntos_malla:1, 0:npasos_temporales:5] # Se efectua la FFT sobre la matriz espacio temporal muestreada, luego el # valor absoluto de dicha matriz y el corrimiento al cero de las frecuencias: E_wk = fft2( E_acumulador_muestreado, (nextpow2(npuntos_malla), nextpow2(npuntos_malla))) / longitud_malla E_wk_absoluto = abs(E_wk) E_wk_shift = shift(E_wk_absoluto) # plt.xticks(np.linspace(0,0.7,6), fontsize = 18) # plt.yticks(np.linspace(0,1,5), fontsize = 18) # Se grafica la relacion de dispersion simulada: plt.contourf(-K, W, E_wk_shift, 8, alpha=.75, cmap='rainbow') # plt.xlim(0,0.7) # plt.ylim(0.0,1.1) clb = plt.colorbar() clb.ax.set_title('|E|') plt.savefig('Graficas/Relaciondispersion.png')
def bench_random(self): print print ' Shifting periodic functions' print '==============================' print ' size | optimized | naive' print '------------------------------' for size,repeat in [(100,1500),(1000,300), (256,1500), (512,1000), (1024,500), (2048,200), (2048*2,100), (2048*4,50), ]: print '%6s' % size, sys.stdout.flush() x = arange (size)*2*pi/size a = 1 if size<2000: f = sin(x)*cos(4*x)+exp(sin(3*x)) sf = sin(x+a)*cos(4*(x+a))+exp(sin(3*(x+a))) else: f = sin(x)*cos(4*x) sf = sin(x+a)*cos(4*(x+a)) assert_array_almost_equal(direct_shift(f,1),sf) assert_array_almost_equal(shift(f,1),sf) print '| %9.2f' % measure('shift(f,a)',repeat), sys.stdout.flush() print '| %9.2f' % measure('direct_shift(f,a)',repeat), sys.stdout.flush() print ' (secs for %s calls)' % (repeat)
def test_definition(self): for n in [18,17,64,127,32,2048,256]: x = arange(n)*2*pi/n for a in [0.1,3]: assert_array_almost_equal(shift(sin(x),a),direct_shift(sin(x),a)) assert_array_almost_equal(shift(sin(x),a),sin(x+a)) assert_array_almost_equal(shift(cos(x),a),cos(x+a)) assert_array_almost_equal(shift(cos(2*x)+sin(x),a), cos(2*(x+a))+sin(x+a)) assert_array_almost_equal(shift(exp(sin(x)),a),exp(sin(x+a))) assert_array_almost_equal(shift(sin(x),2*pi),sin(x)) assert_array_almost_equal(shift(sin(x),pi),-sin(x)) assert_array_almost_equal(shift(sin(x),pi/2),cos(x))
def time_shift(self, size, soltype): if soltype == 'fft': shift(self.f, self.a) else: direct_shift(self.f, self.a)
def relacion_dispersion(distribucion): global npuntos_malla, longitud_malla, dt, npasos_temporales, vh, dx, rhot, Ex global E_acumulador # Frecuencia del plasma omegap = 1 # Vector de frecuencia del plasma omegapp = omegap * sp.ones(nparticulas) # Se calcula la frecuencia angular y espacial minima y maxima (Ver codigo KEMPO1): omega_min = 2 * sp.pi / (dt) / 2 / (npasos_temporales / 2) omega_max = omega_min * (npasos_temporales / 2) k_min = 2 * sp.pi / (npuntos_malla) k_max = k_min * ((npuntos_malla / 2) - 1) # Se crean los vectores de frecuencias espacial y angular teoricas y simuladas: k_t = sp.linspace(0, k_max, nparticulas) k_simulada = sp.linspace(-k_max, k_max, nextpow2(npuntos_malla)) omega_t = sp.linspace(0, longitud_malla, npuntos_malla + 1) omega_simulada = sp.linspace(-omega_max, omega_max, nextpow2(npuntos_malla)) # Se genera una matriz de frecuencias angular y espacial: K, W = sp.meshgrid(k_simulada, omega_simulada) # Se muestrea la matriz espacio-temporal: E_acumulador_muestreado = E_acumulador[0:npuntos_malla:1, 0:npasos_temporales:( 5 * npasos_temporales / npasos_temporales)] # Se efectua la FFT sobre la matriz espacio temporal muestreada, luego el # valor absoluto de dicha matriz y el corrimiento al cero de las frecuencias: E_wk = fft2( E_acumulador_muestreado, (nextpow2(npuntos_malla), nextpow2(npuntos_malla))) / longitud_malla E_wk_absoluto = abs(E_wk) E_wk_shift = shift(E_wk_absoluto) if (distribucion == 0): # Relacion de dispersion teorica para el plasma frio plt.figure('Relacion dispersion (Plasma frio)') plt.cla() plt.plot(k_t, omegapp, 'k', label='$\omega_{p}$') plt.xlabel('k', fontsize=18) plt.ylabel('$\omega$', fontsize=18) plt.xticks(np.linspace(0, 2, 8), fontsize=18) plt.yticks(np.linspace(0, 1, 5), fontsize=18) # Relacion de dispersion "simulada" para el plasma frio plt.contourf(K, W, E_wk_shift, 8, alpha=.75, cmap='jet') plt.xlim(0, 1.2) plt.ylim(0.25, 1.1) if os.path.exists("RelacionesDeDispersion") and\ os.path.isfile("RelacionesDeDispersion/relaciondispersionplasmafrio.png")==\ True: os.remove( "RelacionesDeDispersion/relaciondispersionplasmafrio.png") plt.savefig('relaciondispersionplasmafrio.png', dpi=360) shutil.move('relaciondispersionplasmafrio.png', "RelacionesDeDispersion") elif os.path.exists("RelacionesDeDispersion") and\ os.path.isfile("RelacionesDeDispersion/relaciondispersiontwostream.png")==\ True: plt.savefig('relaciondispersionplasmafrio.png', dpi=360) shutil.move('relaciondispersionplasmafrio.png', "RelacionesDeDispersion") else: os.mkdir("RelacionesDeDispersion") plt.savefig('relaciondispersionplasmafrio.png', dpi=360) shutil.move('relaciondispersionplasmafrio.png', "RelacionesDeDispersion") if (distribucion == 1): # Relacion de dispersion teorica inestabilidad Two-Stream: omega_t = -1j * (sp.sqrt((vh * k_t)**2 + omegap**2 - omegap * sp.sqrt(4 * (k_t * vh)**2 + omegap**2))) # Se grafica la relacion de dispersion teorica y la simulada: plt.figure('Relacion dispersion (Two-Stream)') plt.cla() plt.plot(k_t, omega_t, 'k', label='Relacion de dispersion teorica') plt.plot(k_t, omegapp, 'k', label='$\omega_{p}$') plt.xlabel('k', fontsize=18) plt.ylabel('$\omega$', fontsize=18) plt.xticks(np.linspace(0, 0.7, 6), fontsize=18) plt.yticks(np.linspace(0, 1, 5), fontsize=18) # Se grafica la relacion de dispersion simulada: plt.contourf(K, W, E_wk_shift, 8, alpha=.75, cmap='jet') plt.xlim(0, 0.7) plt.ylim(0.0, 1.1) if os.path.exists("RelacionesDeDispersion") and\ os.path.isfile("RelacionesDeDispersion/relaciondispersiontwostream.png")==\ True: os.remove("RelacionesDeDispersion/relaciondispersiontwostream.png") plt.savefig('relaciondispersiontwostream.png', dpi=360) shutil.move('relaciondispersiontwostream.png', "RelacionesDeDispersion") elif os.path.exists("RelacionesDeDispersion") and\ os.path.isfile("RelacionesDeDispersion/relaciondispersionplasmafrio.png")==\ True: plt.savefig('relaciondispersiontwostream.png', dpi=360) shutil.move('relaciondispersiontwostream.png', "RelacionesDeDispersion") else: os.mkdir("RelacionesDeDispersion") plt.savefig('relaciondispersiontwostream.png', dpi=360) shutil.move('relaciondispersiontwostream.png', "RelacionesDeDispersion") return True