# File ms2body.rb, line 80 def yo6(dt) d = [0.784513610477560e0, 0.235573213359357e0, -1.17767998417887e0, 1.31518632068391e0] for i in 0..2 do leapfrog(dt*d[i]) end leapfrog(dt*d[3]) for i in 0..2 do leapfrog(dt*d[2-i]) end end def yo8(dt) d = [0.104242620869991e1, 0.182020630970714e1, 0.157739928123617e0, 0.244002732616735e1, -0.716989419708120e-2, -0.244699182370524e1, -0.161582374150097e1, -0.17808286265894516e1] for i in 0..6 do leapfrog(dt*d[i]) end leapfrog(dt*d[7]) for i in 0..6 do leapfrog(dt*d[6-i]) end end def ms2(dt) if @nsteps == 0 @prev_acc = acc rk2(dt) else old_acc = acc jdt = old_acc - @prev_acc @pos += vel*dt + old_acc*0.5*dt*dt @vel += old_acc*dt + jdt*0.5*dt @prev_acc = old_acc end end def ms2pc(dt) if @nsteps == 0 @prev_acc = acc rk2(dt) @old_acc = acc else old_pos = pos jdt = @old_acc - @prev_acc @pos += vel*dt + @old_acc*0.5*dt*dt new_acc = acc jdt = new_acc - @old_acc @pos = old_pos + vel*dt + @old_acc*0.5*dt*dt @vel += @old_acc*dt + jdt*0.5*dt @prev_acc = @old_acc @old_acc = new_acc end end def ekin # kinetic energy 0.5*(@vel*@vel) # per unit of reduced mass end def epot # potential energy -@mass/sqrt(@pos*@pos) # per unit of reduced mass end def e_init # initial total energy @e0 = ekin + epot # per unit of reduced mass end def write_diagnostics(time) etot = ekin + epot STDERR.print "at time t = \#{sprintf(\"%g\", time)}, after \#{@nsteps} steps :\n E_kin = \#{sprintf(\"%.3g\", ekin)} ,\\\n E_pot = \#{sprintf(\"%.3g\", epot)} ,\\\n E_tot = \#{sprintf(\"%.3g\", etot)}\n E_tot - E_init = \#{sprintf(\"%.3g\", etot-@e0)}\n (E_tot - E_init) / E_init =\#{sprintf(\"%.3g\", (etot - @e0) / @e0 )}\nEND\n end\n\n def to_s\n \" mass = \" + @mass.to_s + \"\\n\" +\n \" pos = \" + @pos.join(\", \") + \"\\n\" +\n \" vel = \" + @vel.join(\", \") + \"\\n\"\n end\n\n def pp \# pretty print\n print to_s\n end\n\n def simple_print\n printf(\"%24.16e\\n\", @mass)\n @pos.each{|x| printf(\"%24.16e\", x)}; print \"\\n\"\n @vel.each{|x| printf(\"%24.16e\", x)}; print \"\\n\"\n end\n\n def simple_read\n @mass = gets.to_f\n @pos = gets.split.map{|x| x.to_f}.to_v\n @vel = gets.split.map{|x| x.to_f}.to_v\n end\n\nend\n"