qeqwew

Untitled

Nov 6th, 2019
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.29 KB | None | 0 0
  1. import io, array, arrayUnsafe
  2.  
  3. native
  4. declare call [email protected](float %val) .
  5.  
  6. def sqrt = self : Float native
  7. %1 = call float @llvm.sqrt.f32(float %self)
  8. ret float %1 .Float
  9.  
  10. def offsetMomentum = b : Array[Body], nbody : Int do
  11. px = 0
  12. py = 0
  13. pz = 0
  14. i = 0
  15.  
  16. while i < nbody do
  17. bi = b(i)
  18. local bim = bi.mass
  19. px = px + (bi.vx * bim)
  20. py = py + (bi.vy * bim)
  21. pz = pz + (bi.vz * bim)
  22. i = i + 1 .
  23.  
  24. b(0).vx = -px / SOLAR_MASS
  25. b(0).vy = -py / SOLAR_MASS
  26. b(0).vz = -pz / SOLAR_MASS .
  27.  
  28. def advance = bodies : Array[Body], nbody : Int, dt : Float do
  29. i = 0
  30. j = 0
  31. while i < nbody do
  32. bi = bodies(i)
  33. bix = bi.x
  34. biy = bi.y
  35. biz = bi.z
  36. bimass = bi.mass
  37. bivx = bi.vx
  38. bivy = bi.vy
  39. bivz = bi.vz
  40.  
  41. while j=i+1 < nbody do
  42. bj = bodies(j)
  43. dx = bix-bj.x
  44. dy = biy-bj.y
  45. dz = biz-bj.z
  46. mag = sqrt(dx*dx + dy*dy + dz*dz)
  47. mag = dt / (mag * mag * mag)
  48. bm = bj.mass*mag
  49. bivx = bivx - (dx * bm)
  50. bivy = bivy - (dy * bm)
  51. bivz = bivz - (dz * bm)
  52. bm = bimass*mag
  53. bj.vx = bj.vx + (dx * bm)
  54. bj.vy = bj.vy + (dy * bm)
  55. bj.vz = bj.vz + (dz * bm)
  56. j = j + 1 .
  57.  
  58. bi.vx = bivx
  59. bi.vy = bivy
  60. bi.vz = bivz
  61. bi.x = bix + dt * bivx
  62. bi.y = biy + dt * bivy
  63. bi.z = biz + dt * bivz
  64. i = i + 1.
  65. .
  66.  
  67. def energy = bodies : Array[Body], nbody : Int
  68. i = 0
  69. j = 0
  70. e = 0
  71. while i < nbody do
  72. bi = bodies(i)
  73. vx = bi.vx
  74. vy = bi.vy
  75. vz = bi.vz
  76. bim = bi.mass
  77. e = e + (0.5 * bim * (vx*vx + vy*vy + vz*vz))
  78.  
  79. while j=i+1 < 0 do
  80. bj = bodies(j)
  81. dx = bi.x-bj.x
  82. dy = bi.y-bj.y
  83. dz = bi.z-bj.z
  84. distance = sqrt(dx*dx + dy*dy + dz*dz)
  85. e = e - ((bim * bj.mass) / distance)
  86. j = j + 1
  87. .
  88. i = i + 1
  89. .
  90. --how to return number e
  91. .
  92.  
  93. def main =
  94. PI = 3.141592653589793 -- closure ?
  95. SOLAR_MASS = 4 * PI * PI
  96. DAYS_PER_YEAR = 365.24
  97. NBODY = 5
  98.  
  99. type Body = (x: Float, y: Float, vx: Float, vy: Float, vz: Float, mass: Float)
  100.  
  101. sun = Body(0, 0, 0, 0, 0, 0, SOLAR_MASS)
  102.  
  103. jupiter = Body(4.84143144246472090e+00,
  104. -1.16032004402742839e+00,
  105. -1.03622044471123109e-01,
  106. 1.66007664274403694e-03 * DAYS_PER_YEAR,
  107. 7.69901118419740425e-03 * DAYS_PER_YEAR,
  108. -6.90460016972063023e-05 * DAYS_PER_YEAR,
  109. 9.54791938424326609e-04 * SOLAR_MASS)
  110.  
  111. saturn = Body(8.34336671824457987e+00,
  112. 4.12479856412430479e+00,
  113. -4.03523417114321381e-01,
  114. -2.76742510726862411e-03 * DAYS_PER_YEAR,
  115. 4.99852801234917238e-03 * DAYS_PER_YEAR,
  116. 2.30417297573763929e-05 * DAYS_PER_YEAR,
  117. 2.85885980666130812e-04 * SOLAR_MASS)
  118.  
  119. uranus = Body(1.28943695621391310e+01,
  120. -1.51111514016986312e+01,
  121. -2.23307578892655734e-01,
  122. 2.96460137564761618e-03 * DAYS_PER_YEAR,
  123. 2.37847173959480950e-03 * DAYS_PER_YEAR,
  124. -2.96589568540237556e-05 * DAYS_PER_YEAR,
  125. 4.36624404335156298e-05 * SOLAR_MASS)
  126.  
  127. neptune = Body(1.53796971148509165e+01,
  128. -2.59193146099879641e+01,
  129. 1.79258772950371181e-01,
  130. 2.68067772490389322e-03 * DAYS_PER_YEAR,
  131. 1.62824170038242295e-03 * DAYS_PER_YEAR,
  132. -9.51592254519715870e-05 * DAYS_PER_YEAR,
  133. 5.15138902046611451e-05 * SOLAR_MASS)
  134.  
  135.  
  136. bodies: Array[Body] = unsafeArray.alloc(NBODY)
  137. setInit(bodies, 0, sun)
  138. setInit(bodies, 1, jupiter)
  139. setInit(bodies, 2, saturn)
  140. setInit(bodies, 3, uranus)
  141. setInit(bodies, 4, neptune)
  142.  
  143. N = 1000
  144.  
  145. offsetMomentum(bodies,NBODY)
  146. io.print('\n')
  147. io.printInt(energy(bodies, nbody))
  148. io.print('\n')
  149.  
  150. i = 0
  151.  
  152. while i < N
  153. advance(bodies, NBODY, 0.01)
  154. i = i + 1
  155. .
  156. io.printInt(energy(bodies, nbody))
  157. io.print('\n') .
Advertisement
Add Comment
Please, Sign In to add comment