|
Scala example source code file (nbody.scala-2.scala)
The Scala nbody.scala-2.scala source code/* The Computer Language Shootout http://shootout.alioth.debian.org/ contributed by Isaac Gouy */ object nbody { def main(args: Array[String]) { var n = Integer.parseInt(args(0)) Console.printf("%.9f\n", JovianSystem.energy ) while (n > 0) { JovianSystem.advance(0.01); n -= 1 } Console.printf("%.9f\n", JovianSystem.energy ) } } abstract class NBodySystem { def energy() = { var e = 0.0 for (i <- Iterator.range(0,bodies.length)) { e = e + 0.5 * bodies(i).mass * ( bodies(i).vx * bodies(i).vx + bodies(i).vy * bodies(i).vy + bodies(i).vz * bodies(i).vz ) for (val j <- Iterator.range(i+1,bodies.length)) { val dx = bodies(i).x - bodies(j).x val dy = bodies(i).y - bodies(j).y val dz = bodies(i).z - bodies(j).z val distance = Math.sqrt(dx*dx + dy*dy + dz*dz) e = e - (bodies(i).mass * bodies(j).mass) / distance } } e } def advance(dt: Double) = { var i = 0 while (i < bodies.length) { var j = i+1 while (j < bodies.length) { val dx = bodies(i).x - bodies(j).x val dy = bodies(i).y - bodies(j).y val dz = bodies(i).z - bodies(j).z val distance = Math.sqrt(dx*dx + dy*dy + dz*dz) val mag = dt / (distance * distance * distance) bodies(i).vx = bodies(i).vx - dx * bodies(j).mass * mag bodies(i).vy = bodies(i).vy - dy * bodies(j).mass * mag bodies(i).vz = bodies(i).vz - dz * bodies(j).mass * mag bodies(j).vx = bodies(j).vx + dx * bodies(i).mass * mag bodies(j).vy = bodies(j).vy + dy * bodies(i).mass * mag bodies(j).vz = bodies(j).vz + dz * bodies(i).mass * mag j += 1 } i += 1 } i = 0 while (i < bodies.length) { bodies(i).x = bodies(i).x + dt * bodies(i).vx bodies(i).y = bodies(i).y + dt * bodies(i).vy bodies(i).z = bodies(i).z + dt * bodies(i).vz i += 1 } } protected val bodies: Array[Body] class Body() { var x = 0.0; var y = 0.0; var z = 0.0 var vx = 0.0; var vy = 0.0; var vz = 0.0 var mass = 0.0 } } object JovianSystem extends NBodySystem { protected val bodies = initialValues private def initialValues() = { val PI = 3.141592653589793 val SOLAR_MASS = 4 * PI * PI val DAYS_PER_YEAR = 365.24 val sun = new Body sun.mass = SOLAR_MASS val jupiter = new Body jupiter.x = 4.84143144246472090e+00 jupiter.y = -1.16032004402742839e+00 jupiter.z = -1.03622044471123109e-01 jupiter.vx = 1.66007664274403694e-03 * DAYS_PER_YEAR jupiter.vy = 7.69901118419740425e-03 * DAYS_PER_YEAR jupiter.vz = -6.90460016972063023e-05 * DAYS_PER_YEAR jupiter.mass = 9.54791938424326609e-04 * SOLAR_MASS val saturn = new Body saturn.x = 8.34336671824457987e+00 saturn.y = 4.12479856412430479e+00 saturn.z = -4.03523417114321381e-01 saturn.vx = -2.76742510726862411e-03 * DAYS_PER_YEAR saturn.vy = 4.99852801234917238e-03 * DAYS_PER_YEAR saturn.vz = 2.30417297573763929e-05 * DAYS_PER_YEAR saturn.mass = 2.85885980666130812e-04 * SOLAR_MASS val uranus = new Body uranus.x = 1.28943695621391310e+01 uranus.y = -1.51111514016986312e+01 uranus.z = -2.23307578892655734e-01 uranus.vx = 2.96460137564761618e-03 * DAYS_PER_YEAR uranus.vy = 2.37847173959480950e-03 * DAYS_PER_YEAR uranus.vz = -2.96589568540237556e-05 * DAYS_PER_YEAR uranus.mass = 4.36624404335156298e-05 * SOLAR_MASS val neptune = new Body neptune.x = 1.53796971148509165e+01 neptune.y = -2.59193146099879641e+01 neptune.z = 1.79258772950371181e-01 neptune.vx = 2.68067772490389322e-03 * DAYS_PER_YEAR neptune.vy = 1.62824170038242295e-03 * DAYS_PER_YEAR neptune.vz = -9.51592254519715870e-05 * DAYS_PER_YEAR neptune.mass = 5.15138902046611451e-05 * SOLAR_MASS val initialValues = Array ( sun, jupiter, saturn, uranus, neptune ) var px = 0.0; var py = 0.0; var pz = 0.0; for (b <- initialValues){ px = px + (b.vx * b.mass) py = py + (b.vy * b.mass) pz = pz + (b.vz * b.mass) } sun.vx = -px / SOLAR_MASS sun.vy = -py / SOLAR_MASS sun.vz = -pz / SOLAR_MASS initialValues } } Other Scala examples (source code examples)Here is a short list of links related to this Scala nbody.scala-2.scala source code file: |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.