Networking.
This commit is contained in:
Vendored
+148
@@ -0,0 +1,148 @@
|
||||
import "os" for Process
|
||||
|
||||
class Body {
|
||||
construct new(x, y, z, vx, vy, vz, mass) {
|
||||
_x = x
|
||||
_y = y
|
||||
_z = z
|
||||
_vx = vx
|
||||
_vy = vy
|
||||
_vz = vz
|
||||
_mass = mass
|
||||
}
|
||||
|
||||
x { _x }
|
||||
x=(v) { _x = v }
|
||||
y { _y }
|
||||
y=(v) { _y = v }
|
||||
z { _z }
|
||||
z=(v) { _z = v }
|
||||
vx { _vx }
|
||||
vx=(v) { _vx = v }
|
||||
vy { _vy }
|
||||
vy=(v) { _vy = v }
|
||||
vz { _vz }
|
||||
vz=(v) { _vz = v }
|
||||
mass { _mass }
|
||||
|
||||
offsetMomentum(px, py, pz) {
|
||||
_vx = -px / 0.01227246237529089
|
||||
_vy = -py / 0.01227246237529089
|
||||
_vz = -pz / 0.01227246237529089
|
||||
}
|
||||
}
|
||||
|
||||
class NBody {
|
||||
static init() {
|
||||
var pi = 3.141592653589793
|
||||
var solarMass = 4 * pi * pi
|
||||
var daysPerYear = 365.24
|
||||
|
||||
__bodies = [
|
||||
// Sun
|
||||
Body.new(0, 0, 0, 0, 0, 0, solarMass),
|
||||
// Jupiter
|
||||
Body.new(
|
||||
4.84143144246472090e+00,
|
||||
-1.16032004402742839e+00,
|
||||
-1.03622044471123109e-01,
|
||||
1.66007664274403694e-03 * daysPerYear,
|
||||
7.69901118419740425e-03 * daysPerYear,
|
||||
-6.90460016972063023e-05 * daysPerYear,
|
||||
9.54791938424326609e-04 * solarMass),
|
||||
// Saturn
|
||||
Body.new(
|
||||
8.34336671824457987e+00,
|
||||
4.12479856412430479e+00,
|
||||
-4.03523417114321381e-01,
|
||||
-2.76742510726862411e-03 * daysPerYear,
|
||||
4.99852801234917238e-03 * daysPerYear,
|
||||
2.30417297573763929e-05 * daysPerYear,
|
||||
2.85885980666130812e-04 * solarMass),
|
||||
// Uranus
|
||||
Body.new(
|
||||
1.28943695618239209e+01,
|
||||
-1.51111514016986312e+01,
|
||||
-2.23307578892655734e-01,
|
||||
2.96460137564761618e-03 * daysPerYear,
|
||||
2.37847173959480950e-03 * daysPerYear,
|
||||
-2.96589568540237556e-05 * daysPerYear,
|
||||
4.36624404335156298e-05 * solarMass),
|
||||
// Neptune
|
||||
Body.new(
|
||||
1.53796971148509165e+01,
|
||||
-2.59193146099879641e+01,
|
||||
1.79258772950371181e-01,
|
||||
2.68067772490389322e-03 * daysPerYear,
|
||||
1.62824170038242295e-03 * daysPerYear,
|
||||
-9.51592254519715870e-05 * daysPerYear,
|
||||
5.15138902046611451e-05 * solarMass)
|
||||
]
|
||||
|
||||
var px = 0
|
||||
var py = 0
|
||||
var pz = 0
|
||||
for (b in __bodies) {
|
||||
px = px + b.vx * b.mass
|
||||
py = py + b.vy * b.mass
|
||||
pz = pz + b.vz * b.mass
|
||||
}
|
||||
__bodies[0].offsetMomentum(px, py, pz)
|
||||
}
|
||||
|
||||
static energy() {
|
||||
var e = 0
|
||||
for (i in 0...__bodies.count) {
|
||||
var bi = __bodies[i]
|
||||
e = e + 0.5 * bi.mass * (bi.vx * bi.vx + bi.vy * bi.vy + bi.vz * bi.vz)
|
||||
for (j in i + 1...__bodies.count) {
|
||||
var bj = __bodies[j]
|
||||
var dx = bi.x - bj.x
|
||||
var dy = bi.y - bj.y
|
||||
var dz = bi.z - bj.z
|
||||
var distance = (dx * dx + dy * dy + dz * dz).sqrt
|
||||
e = e - (bi.mass * bj.mass) / distance
|
||||
}
|
||||
}
|
||||
return e
|
||||
}
|
||||
|
||||
static advance(dt) {
|
||||
for (i in 0...__bodies.count) {
|
||||
var bi = __bodies[i]
|
||||
for (j in i + 1...__bodies.count) {
|
||||
var bj = __bodies[j]
|
||||
var dx = bi.x - bj.x
|
||||
var dy = bi.y - bj.y
|
||||
var dz = bi.z - bj.z
|
||||
var d2 = dx * dx + dy * dy + dz * dz
|
||||
var mag = dt / (d2 * d2.sqrt)
|
||||
|
||||
bi.vx = bi.vx - dx * bj.mass * mag
|
||||
bi.vy = bi.vy - dy * bj.mass * mag
|
||||
bi.vz = bi.vz - dz * bj.mass * mag
|
||||
|
||||
bj.vx = bj.vx + dx * bi.mass * mag
|
||||
bj.vy = bj.vy + dy * bi.mass * mag
|
||||
bj.vz = bj.vz + dz * bi.mass * mag
|
||||
}
|
||||
}
|
||||
|
||||
for (b in __bodies) {
|
||||
b.x = b.x + dt * b.vx
|
||||
b.y = b.y + dt * b.vy
|
||||
b.z = b.z + dt * b.vz
|
||||
}
|
||||
}
|
||||
|
||||
static run(n) {
|
||||
init()
|
||||
System.print(energy())
|
||||
for (i in 0...n) advance(0.01)
|
||||
System.print(energy())
|
||||
}
|
||||
}
|
||||
|
||||
var start = System.clock
|
||||
NBody.run(100000)
|
||||
System.print("Elapsed: " + (System.clock - start).toString + "s")
|
||||
Reference in New Issue
Block a user