js/src/jit-test/tests/sunspider/check-access-nbody.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/js/src/jit-test/tests/sunspider/check-access-nbody.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,171 @@
     1.4 +/* The Great Computer Language Shootout
     1.5 +   http://shootout.alioth.debian.org/
     1.6 +   contributed by Isaac Gouy */
     1.7 +
     1.8 +var PI = 3.141592653589793;
     1.9 +var SOLAR_MASS = 4 * PI * PI;
    1.10 +var DAYS_PER_YEAR = 365.24;
    1.11 +
    1.12 +function Body(x,y,z,vx,vy,vz,mass){
    1.13 +   this.x = x;
    1.14 +   this.y = y;
    1.15 +   this.z = z;
    1.16 +   this.vx = vx;
    1.17 +   this.vy = vy;
    1.18 +   this.vz = vz;
    1.19 +   this.mass = mass;
    1.20 +}
    1.21 +
    1.22 +Body.prototype.offsetMomentum = function(px,py,pz) {
    1.23 +   this.vx = -px / SOLAR_MASS;
    1.24 +   this.vy = -py / SOLAR_MASS;
    1.25 +   this.vz = -pz / SOLAR_MASS;
    1.26 +   return this;
    1.27 +}
    1.28 +
    1.29 +function Jupiter(){
    1.30 +   return new Body(
    1.31 +      4.84143144246472090e+00,
    1.32 +      -1.16032004402742839e+00,
    1.33 +      -1.03622044471123109e-01,
    1.34 +      1.66007664274403694e-03 * DAYS_PER_YEAR,
    1.35 +      7.69901118419740425e-03 * DAYS_PER_YEAR,
    1.36 +      -6.90460016972063023e-05 * DAYS_PER_YEAR,
    1.37 +      9.54791938424326609e-04 * SOLAR_MASS
    1.38 +   );
    1.39 +}
    1.40 +
    1.41 +function Saturn(){
    1.42 +   return new Body(
    1.43 +      8.34336671824457987e+00,
    1.44 +      4.12479856412430479e+00,
    1.45 +      -4.03523417114321381e-01,
    1.46 +      -2.76742510726862411e-03 * DAYS_PER_YEAR,
    1.47 +      4.99852801234917238e-03 * DAYS_PER_YEAR,
    1.48 +      2.30417297573763929e-05 * DAYS_PER_YEAR,
    1.49 +      2.85885980666130812e-04 * SOLAR_MASS
    1.50 +   );
    1.51 +}
    1.52 +
    1.53 +function Uranus(){
    1.54 +   return new Body(
    1.55 +      1.28943695621391310e+01,
    1.56 +      -1.51111514016986312e+01,
    1.57 +      -2.23307578892655734e-01,
    1.58 +      2.96460137564761618e-03 * DAYS_PER_YEAR,
    1.59 +      2.37847173959480950e-03 * DAYS_PER_YEAR,
    1.60 +      -2.96589568540237556e-05 * DAYS_PER_YEAR,
    1.61 +      4.36624404335156298e-05 * SOLAR_MASS
    1.62 +   );
    1.63 +}
    1.64 +
    1.65 +function Neptune(){
    1.66 +   return new Body(
    1.67 +      1.53796971148509165e+01,
    1.68 +      -2.59193146099879641e+01,
    1.69 +      1.79258772950371181e-01,
    1.70 +      2.68067772490389322e-03 * DAYS_PER_YEAR,
    1.71 +      1.62824170038242295e-03 * DAYS_PER_YEAR,
    1.72 +      -9.51592254519715870e-05 * DAYS_PER_YEAR,
    1.73 +      5.15138902046611451e-05 * SOLAR_MASS
    1.74 +   );
    1.75 +}
    1.76 +
    1.77 +function Sun(){
    1.78 +   return new Body(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, SOLAR_MASS);
    1.79 +}
    1.80 +
    1.81 +
    1.82 +function NBodySystem(bodies){
    1.83 +   this.bodies = bodies;
    1.84 +   var px = 0.0;
    1.85 +   var py = 0.0;
    1.86 +   var pz = 0.0;
    1.87 +   var size = this.bodies.length;
    1.88 +   for (var i=0; i<size; i++){
    1.89 +      var b = this.bodies[i];
    1.90 +      var m = b.mass;
    1.91 +      px += b.vx * m;
    1.92 +      py += b.vy * m;
    1.93 +      pz += b.vz * m;
    1.94 +   }
    1.95 +   this.bodies[0].offsetMomentum(px,py,pz);
    1.96 +}
    1.97 +
    1.98 +NBodySystem.prototype.advance = function(dt){
    1.99 +   var dx, dy, dz, distance, mag;
   1.100 +   var size = this.bodies.length;
   1.101 +
   1.102 +   for (var i=0; i<size; i++) {
   1.103 +      var bodyi = this.bodies[i];
   1.104 +      for (var j=i+1; j<size; j++) {
   1.105 +         var bodyj = this.bodies[j];
   1.106 +         dx = bodyi.x - bodyj.x;
   1.107 +         dy = bodyi.y - bodyj.y;
   1.108 +         dz = bodyi.z - bodyj.z;
   1.109 +
   1.110 +         distance = Math.sqrt(dx*dx + dy*dy + dz*dz);
   1.111 +         mag = dt / (distance * distance * distance);
   1.112 +
   1.113 +         bodyi.vx -= dx * bodyj.mass * mag;
   1.114 +         bodyi.vy -= dy * bodyj.mass * mag;
   1.115 +         bodyi.vz -= dz * bodyj.mass * mag;
   1.116 +
   1.117 +         bodyj.vx += dx * bodyi.mass * mag;
   1.118 +         bodyj.vy += dy * bodyi.mass * mag;
   1.119 +         bodyj.vz += dz * bodyi.mass * mag;
   1.120 +      }
   1.121 +   }
   1.122 +
   1.123 +   for (var i=0; i<size; i++) {
   1.124 +      var body = this.bodies[i];
   1.125 +      body.x += dt * body.vx;
   1.126 +      body.y += dt * body.vy;
   1.127 +      body.z += dt * body.vz;
   1.128 +   }
   1.129 +}
   1.130 +
   1.131 +NBodySystem.prototype.energy = function(){
   1.132 +   var dx, dy, dz, distance;
   1.133 +   var e = 0.0;
   1.134 +   var size = this.bodies.length;
   1.135 +
   1.136 +   for (var i=0; i<size; i++) {
   1.137 +      var bodyi = this.bodies[i];
   1.138 +
   1.139 +      e += 0.5 * bodyi.mass *
   1.140 +         ( bodyi.vx * bodyi.vx
   1.141 +         + bodyi.vy * bodyi.vy
   1.142 +         + bodyi.vz * bodyi.vz );
   1.143 +
   1.144 +      for (var j=i+1; j<size; j++) {
   1.145 +         var bodyj = this.bodies[j];
   1.146 +         dx = bodyi.x - bodyj.x;
   1.147 +         dy = bodyi.y - bodyj.y;
   1.148 +         dz = bodyi.z - bodyj.z;
   1.149 +
   1.150 +         distance = Math.sqrt(dx*dx + dy*dy + dz*dz);
   1.151 +         e -= (bodyi.mass * bodyj.mass) / distance;
   1.152 +      }
   1.153 +   }
   1.154 +   return e;
   1.155 +}
   1.156 +
   1.157 +var ret;
   1.158 +
   1.159 +for ( var n = 3; n <= 24; n *= 2 ) {
   1.160 +    (function(){
   1.161 +        var bodies = new NBodySystem( Array(
   1.162 +           Sun(),Jupiter(),Saturn(),Uranus(),Neptune()
   1.163 +        ));
   1.164 +        var max = n * 100;
   1.165 +        
   1.166 +        ret = bodies.energy();
   1.167 +        for (var i=0; i<max; i++){
   1.168 +            bodies.advance(0.01);
   1.169 +        }
   1.170 +        ret = bodies.energy();
   1.171 +    })();
   1.172 +}
   1.173 +
   1.174 +assertEq(ret, -0.16906933525822856)

mercurial