Advertisement
fivemack

Python RK integrator

Nov 27th, 2019
331
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.46 KB | None | 0 0
  1. # bad N-body integrator
  2.  
  3. from math import sqrt
  4. import copy
  5.  
  6. G=6.673e-11
  7. AU=1.49597e11
  8. masses=[1.989e30, 5.972e24]
  9. massy=[0,0,0, 0,-(29800*masses[1]/masses[0]),0, AU,0,0, 0,29800,0]
  10. DRO=1.2
  11. LEO=6371000+800000 # low Earth orbit is above Earth's surface not Earth's core
  12. zeromass=[DRO*AU,0,0,0,24320,0, AU,LEO,0, 7455,29800,0]
  13.  
  14. universe=[masses, massy, zeromass]
  15.  
  16. dt=60.0
  17.  
  18. def derivs(masses, massy, zeromass):
  19. n=len(massy)/6
  20. v=[0 for i in range(6*n)]
  21. for i in range(n):
  22. # x_i dot is xdot_i
  23. v[6*i]=massy[6*i+3]
  24. v[6*i+1]=massy[6*i+4]
  25. v[6*i+2]=massy[6*i+5]
  26. # xdot_i dot is GMr/r^3
  27. ddx=0; ddy=0; ddz=0
  28. for j in range(n):
  29. if (i!=j):
  30. rx=massy[6*j]-massy[6*i]
  31. ry=massy[6*j+1]-massy[6*i+1]
  32. rz=massy[6*j+2]-massy[6*i+2]
  33. r=sqrt(rx*rx+ry*ry+rz*rz)
  34. ddx=ddx+G*masses[j]*rx/(r**3)
  35. ddy=ddy+G*masses[j]*ry/(r**3)
  36. ddz=ddz+G*masses[j]*rz/(r**3)
  37. v[6*i+3]=ddx
  38. v[6*i+4]=ddy
  39. v[6*i+5]=ddz
  40. nz=len(zeromass)/6
  41. vz=[0 for i in range(6*nz)]
  42. for i in range(nz):
  43. for ee in [0,1,2]:
  44. vz[6*i+ee]=zeromass[6*i+ee+3]
  45. ddx=0; ddy=0; ddz=0;
  46. for j in range(n):
  47. rx=massy[6*j]-zeromass[6*i]
  48. ry=massy[6*j+1]-zeromass[6*i+1]
  49. rz=massy[6*j+2]-zeromass[6*i+2]
  50. r=sqrt(rx*rx+ry*ry+rz*rz)
  51. ddx=ddx+G*masses[j]*rx/(r**3)
  52. ddy=ddy+G*masses[j]*ry/(r**3)
  53. ddz=ddz+G*masses[j]*rz/(r**3)
  54. vz[6*i+3]=ddx
  55. vz[6*i+4]=ddy
  56. vz[6*i+5]=ddz
  57.  
  58. return [v,vz]
  59.  
  60. f=open("pingle-RK","w")
  61. T = 0
  62. for q in range(1000000):
  63. olduniverse=copy.deepcopy(universe)
  64. # distance Earth->Sun
  65. ug = sqrt((universe[1][6]-universe[1][0])**2+(universe[1][7]-universe[1][1])**2+(universe[1][8]-universe[1][2])**2)
  66. # two velocities
  67. v1 = sqrt(sum(t**2 for t in universe[1][3:5]))
  68. v2 = sqrt(sum(t**2 for t in universe[1][9:11]))
  69. towrite=[T,ug,v1,v2,universe[1][9],universe[1][10],universe[1][6],universe[1][7],universe[2][0],universe[2][1],universe[2][6],universe[2][7]]
  70. towrite=[T,sqrt((universe[2][6]-universe[1][6])**2+(universe[2][7]-universe[1][7])**2)]
  71. for u in towrite:
  72. f.write(str(u))
  73. f.write(" ")
  74. f.write("\n")
  75.  
  76. # runge-kutta
  77. midpoint=copy.deepcopy(universe)
  78. # k1 based on f(y0)
  79. Ds1 = derivs(universe[0],universe[1],universe[2])
  80.  
  81. D=Ds1[0]; Dz=Ds1[1]
  82. for i in range(len(D)):
  83. midpoint[1][i] = universe[1][i] + dt/2 * D[i]
  84. for i in range(len(Dz)):
  85. midpoint[2][i] = universe[2][i] + dt/2 * Dz[i]
  86.  
  87. # k2 based on f(y0 + k1/2)
  88. Ds2 = derivs(midpoint[0],midpoint[1],midpoint[2])
  89. D=Ds2[0]; Dz=Ds2[1]
  90. for i in range(len(D)):
  91. midpoint[1][i] = universe[1][i] + dt/2 * D[i]
  92. for i in range(len(Dz)):
  93. midpoint[2][i] = universe[2][i] + dt/2 * Dz[i]
  94.  
  95. # k3 based on f(y0 + k2/2)
  96. Ds3 = derivs(midpoint[0],midpoint[1],midpoint[2])
  97. D=Ds3[0]; Dz=Ds3[1]
  98. for i in range(len(D)):
  99. midpoint[1][i] = universe[1][i] + dt * D[i]
  100. for i in range(len(Dz)):
  101. midpoint[2][i] = universe[2][i] + dt * Dz[i]
  102.  
  103. # k4 based on f(y0+k3)
  104. Ds4 = derivs(midpoint[0],midpoint[1],midpoint[2])
  105.  
  106. # print "Ds1=%s\nDs2=%s\nDs3=%s\nDs4=%s\n\n"%(Ds1, Ds2, Ds3, Ds4)
  107.  
  108. for slice in [0,1]:
  109. for i in range(len(Ds1[slice])):
  110. universe[slice+1][i] = universe[slice+1][i] + dt * (Ds1[slice][i]+2*Ds2[slice][i]+2*Ds3[slice][i]+Ds4[slice][i])/6.0
  111.  
  112. if (universe[1][3]>0 and olduniverse[1][3]<0):
  113. print "X velocity of planet changes sign at ",T
  114. if (universe[2][3]>0 and olduniverse[2][3]<0):
  115. print "X velocity of satellite changes sign at ",T
  116. T=T+dt
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement