Advertisement
Guest User

Untitled

a guest
Mar 13th, 2016
266
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.10 KB | None | 0 0
  1. import numpy as N
  2. import scipy.constants as S
  3. import scipy.special as SS
  4. import matplotlib.pyplot as plt
  5.  
  6.  
  7. #Definitions
  8.  
  9. def rkstepn(f,x,y,h):
  10.     n=len(y)
  11.     k1=[]
  12.     k2=[]
  13.     k3=[]
  14.     k4=[]
  15.     yplus=[]
  16.     for i in range(n):
  17.         k1.append(f[i](x,y))
  18.     for i in range(n):
  19.         k2.append(f[i](x+h/2,map(lambda j: j+h/2*k1[i], y)))
  20.     for i in range(n):
  21.         k3.append(f[i](x+h/2,map(lambda j: j+h/2*k2[i], y)))
  22.     for i in range(n):
  23.         k4.append(f[i](x+h,map(lambda j: j+h*k3[i], y)))
  24.     for i in range(n):
  25.         yplus.append(y[i]+h/6*(k1[i]+2*k2[i]+2*k3[i]+k4[i]))
  26.     return yplus
  27.  
  28. def restrain(x):
  29.     if x>N.pi: return restrain(x-2*N.pi)
  30.     elif x<-N.pi: return restrain(x+2*N.pi)
  31.     else: return x
  32.  
  33. #alpha and beta
  34. def func(x,thetas):
  35.     return thetas[0]*N.arctan(thetas[1]*x+thetas[2])+thetas[3]
  36.  
  37. def alpha(x):
  38.     return func(x, thetasa)
  39.  
  40. def beta(x):
  41.     return func(x, thetasb)
  42.  
  43. # new equations: dphi dp dgamma
  44. # y=[p,phi,xi]
  45.  
  46. def dp(t,y):
  47.     return -alpha(y[2])*N.sin(y[1])
  48.  
  49. def dxi(t,y):
  50.     return y[0]/N.sqrt(1+y[0]**2)
  51.  
  52. def dphi(t,y):
  53.     return 2*N.pi*((y[0]/N.sqrt(1+y[0]**2))*(1/beta(y[2]))-1)
  54.  
  55. def f2(xi,p,xik,pk):
  56.     def z(x): return x*wavelength
  57.     def mu(m): return SS.jn_zeros(0,m+1)[m]
  58.     def s(m): return SS.jn(1,mu(m)*r/a)**2/((mu(m)**4)*(SS.jn(1,mu(m))**2))
  59.     def g(m,x): return N.sign(x)*(1-N.exp(-mu(m)*abs(x)/a))
  60.     def b(m,x): return 2*g(m,x)-g(m,x+2*d)-g(m,x-2*d)
  61.     result=0
  62.     for m in range(1,11):
  63.         result+=s(m)*b(m,N.sqrt(1+p**2))*(z(xik)-z(xi))
  64.     return result
  65.  
  66. #Initial conditions
  67. p0=0.404 #starting impulse is const
  68. #phi0=0 #phase, will do -1.57, 0, 1.57
  69. beta0=0.374 #initial speed of particles
  70. phimin=-N.pi
  71. phimax=N.pi
  72. number=10
  73. a=0.01 #aperture
  74. d=0.002 #disk thickness
  75. r=0.002 #disk radius
  76. wavelength=0.12
  77. current=4 #0,0.2,0.4
  78. const=(current*wavelength**2*a**2*S.e)/(2*N.pi*S.epsilon_0*d**2*r**2*S.m_e*S.c**3)
  79.  
  80. #(S.e*wavelength)/(S.m_e*S.c**2)*(current*wavelength)/(S.c*n*N.pi*r**2*2*d)*(a**2)/(S.epsilon_0*d) #constant
  81.  
  82. thetasa=[ 0.71920001,  2.82683308, -3.39808784,  1.30348301]
  83. thetasb=[-0.25580129, -1.66465201,  2.53513356,  0.66269095]
  84. h=0.01
  85. L=7.8
  86.  
  87. class Particle:
  88.     def __init__(self, phi0):
  89.         self.phi = restrain(phi0)
  90.         self.t = -(self.phi/N.pi-1)/2
  91.         self.p=p0
  92.         self.xi=0
  93.         self.states=[[self.t,self.p,self.phi,self.xi]]
  94.         self.ts=[self.t]
  95.         self.ps=[self.p]
  96.         self.phis=[self.phi]
  97.         self.xis=[self.xi]
  98.     def newstate(self):
  99.         self.phi=restrain(self.phi)
  100.         self.states.append([self.t,self.p,self.phi,self.xi])
  101.         self.ts.append(self.t)
  102.         self.ps.append(self.p)
  103.         self.phis.append(self.phi)
  104.         self.xis.append(self.xi)
  105.  
  106. t0s=[.1,.2,.3,.4,.5,.6,.7,.8,.9,1]
  107. particles=[]
  108. for phi0 in N.linspace(phimin, phimax, number):
  109.     particles.append(Particle(phi0))
  110.  
  111. t=0
  112. particlesOut=[]
  113. #while particles:
  114. while t<100:
  115.     for part in particles:
  116.         if t>part.t:
  117.             integral=0
  118.             for part2 in particles:
  119.                 integral+=f2(part.xi,part.p,part2.xi,part2.p)
  120.             integral*=const/len(particles)
  121.             fs=[lambda t,y: dp(t,y)+integral,dphi,dxi]
  122.             ys=[part.p,part.phi,part.xi]
  123.             rk=rkstepn(fs,t,ys,h)
  124.             part.t=t
  125.             part.p=rk[0]
  126.             part.phi=rk[1]
  127.             part.xi=rk[2]
  128.             part.newstate()
  129.             if part.xi>=L:
  130.                 particlesOut.append(part)
  131.                 particles.remove(part)
  132.     if not particles: break
  133.     t+=h
  134.  
  135. for part in particlesOut:
  136.     print str(part.phis[0]) +': ' + str(part.xi)
  137.  
  138. print "---"
  139. for part in particles:
  140.     print str(part.phis[0]) +': ' + str(part.xi)
  141. #    for i in range(len(part.states)):
  142. #        print '[' + str(part.states[i][3]) + ',' +  str(part.states[i][2]) + ']'
  143.  
  144. plt.figure()
  145. for part in particlesOut:
  146.     plt.plot(part.xis, part.phis, label=r'$\tau_0$='+str(part.ts[0]))
  147. plt.xlabel(r'$\xi$',fontsize=16)
  148. plt.ylabel(r'$phi$',fontsize=16)
  149. plt.yticks([-N.pi,0,N.pi],[r'$-\pi$',r'$0$',r'$\pi$'])
  150. #plt.legend()
  151. plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement