Advertisement
Guest User

Untitled

a guest
Feb 1st, 2014
239
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 2.94 KB | None | 0 0
  1. <?
  2. /* The Computer Language Benchmarks Game
  3. http://benchmarksgame.alioth.debian.org/
  4.  
  5. contributed by anon
  6. modified by Sergey Khripunov
  7. */
  8.  
  9. function energy(&$b) {
  10.    $e = 0.0;
  11.    for ($i=0,$m=sizeof($b);$i<$m;$i++) {
  12.        $b1=$b[$i];
  13.        $e += 0.5*$b1[6]*($b1[3]*$b1[3]+$b1[4]*$b1[4]+$b1[5]*$b1[5]);
  14.        for ($j=$i+1; $j<$m; $j++) {
  15.     $b2=$b[$j];
  16.     $dx=$b1[0]-$b2[0]; $dy=$b1[1]-$b2[1]; $dz=$b1[2]-$b2[2];
  17.     $e -= ($b1[6]*$b2[6])/sqrt($dx*$dx + $dy*$dy + $dz*$dz);
  18.        }
  19.    }
  20.    return $e;
  21. }
  22.  
  23. $pi=3.141592653589793;
  24. $solar_mass=4*$pi*$pi;
  25. $days_per_year=365.24;
  26.  
  27. $bodies = array(array(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, $solar_mass), //Sun
  28.     array(4.84143144246472090E+00, // Jupiter
  29.           -1.16032004402742839E+00,
  30.           -1.03622044471123109E-01,
  31.           1.66007664274403694E-03 * $days_per_year,
  32.           7.69901118419740425E-03 * $days_per_year,
  33.           -6.90460016972063023E-05 * $days_per_year,
  34.           9.54791938424326609E-04 * $solar_mass),
  35.     array(8.34336671824457987E+00, // Saturn
  36.           4.12479856412430479E+00,
  37.           -4.03523417114321381E-01,
  38.           -2.76742510726862411E-03 * $days_per_year,
  39.           4.99852801234917238E-03 * $days_per_year,
  40.           2.30417297573763929E-05 * $days_per_year,
  41.           2.85885980666130812E-04 * $solar_mass),
  42.     array(1.28943695621391310E+01, // Uranus
  43.           -1.51111514016986312E+01,
  44.           -2.23307578892655734E-01,
  45.           2.96460137564761618E-03 * $days_per_year,
  46.           2.37847173959480950E-03 * $days_per_year,
  47.           -2.96589568540237556E-05 * $days_per_year,
  48.           4.36624404335156298E-05 * $solar_mass),
  49.     array(1.53796971148509165E+01, // Neptune
  50.           -2.59193146099879641E+01,
  51.           1.79258772950371181E-01,
  52.           2.68067772490389322E-03 * $days_per_year,
  53.           1.62824170038242295E-03 * $days_per_year,
  54.           -9.51592254519715870E-05 * $days_per_year,
  55.           5.15138902046611451E-05 * $solar_mass));
  56.  
  57. // offset_momentum
  58. $px=$py=$pz=0.0;
  59. foreach ($bodies as &$e) {
  60.     $px+=$e[3]*$e[6];
  61.     $py+=$e[4]*$e[6];
  62.     $pz+=$e[5]*$e[6];
  63. }
  64. $bodies[0][3]=-$px/$solar_mass;
  65. $bodies[0][4]=-$py/$solar_mass;
  66. $bodies[0][5]=-$pz/$solar_mass;
  67.  
  68. $pairs = array();
  69. for ($i=0,$m=count($bodies); $i<$m; $i++)
  70.    for ($j=$i+1; $j<$m; $j++)
  71.       $pairs[] = array(&$bodies[$i], &$bodies[$j]);
  72.  
  73. $n = 500000;
  74.  
  75. printf("%0.9f\n", energy($bodies));
  76.  
  77. $i=0;
  78. do {
  79.  
  80.     foreach ($pairs as &$p) {
  81.   $a=&$p[0]; $b=&$p[1];
  82.   $dx=$a[0]-$b[0]; $dy=$a[1]-$b[1]; $dz=$a[2]-$b[2];
  83.  
  84.   $dist = sqrt($dx*$dx + $dy*$dy + $dz*$dz);
  85.   $mag = 0.01/($dist*$dist*$dist);
  86.   $mag_a = $a[6]*$mag; $mag_b = $b[6]*$mag;
  87.  
  88.   $a[3]-=$dx*$mag_b; $a[4]-=$dy*$mag_b; $a[5]-=$dz*$mag_b;
  89.   $b[3]+=$dx*$mag_a; $b[4]+=$dy*$mag_a; $b[5]+=$dz*$mag_a;
  90.     }
  91.  
  92.     foreach ($bodies as &$b) {
  93.         $b[0]+=0.01*$b[3]; $b[1]+=0.01*$b[4]; $b[2]+=0.01*$b[5];
  94.     }
  95.  
  96. } while(++$i<$n);
  97.  
  98. printf("%0.9f\n", energy($bodies));
  99.  
  100. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement