Advertisement
qeqwew

Untitled

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