Jump to content

N-body problem: Difference between revisions

Line 4,332:
t = 0.18 : +2.919e-10 +3.488e-18 +0.000e+00 +1.500e+11 +5.376e+03 +0.000e+00 +1.497e+11 +5.563e+03 +0.000e+00 +3.243e-09 +5.814e-17 +0.000e+00 -1.078e-03 +2.987e+04 +0.000e+00 -2.712e-04 +3.090e+04 +0.000e+00
t = 0.19 : +3.252e-10 +4.102e-18 +0.000e+00 +1.500e+11 +5.674e+03 +0.000e+00 +1.497e+11 +5.872e+03 +0.000e+00 +3.423e-09 +6.477e-17 +0.000e+00 -1.138e-03 +2.987e+04 +0.000e+00 -2.863e-04 +3.090e+04 +0.000e+00</pre>
 
=={{header|Phix}}==
{{trans|Kotlin}}
<lang Phix>sequence origin = {0,0,0}
constant nbody = """
0.01 3 20
1
0 0 0
0.01 0 0
0.1
1 1 0
0 0 0.02
0.001
0 1 1
0.01 -0.01 -0.01
"""
 
sequence lines = split(nbody,"\n")
atom {{grav_constant,bodies,timeSteps}} = scanf(lines[1],"%f %f %f")
sequence {masses, positions, velocities, accelerations} @= repeat(0,bodies)
for i=1 to bodies do
{{masses[i]}} = scanf(lines[i*3-1],"%f")
{positions[i]} = scanf(lines[i*3],"%f %f %f")
{velocities[i]} = scanf(lines[i*3+1],"%f %f %f")
end for
printf(1,"Body : x y z |")
printf(1," vx vy vz\n")
 
function vmod(sequence a)
return sqrt(sum(sq_mul(a,a)))
end function
 
procedure computeAccelerations()
for i=1 to bodies do
sequence ai = origin
for j=1 to bodies do
if i!=j then
sequence t = sq_sub(positions[j],positions[i])
atom temp = grav_constant*masses[j]/power(vmod(t),3)
ai = sq_add(ai,sq_mul(t,temp))
end if
end for
accelerations[i] = ai
end for
end procedure
procedure computePositions()
positions = sq_add(positions,sq_add(velocities,sq_mul(accelerations,0.5)))
end procedure
 
procedure computeVelocities()
velocities = sq_add(velocities,accelerations)
end procedure
 
procedure resolveCollisions()
for i=1 to bodies do
for j=i+1 to bodies do
if positions[i]=positions[j] then
{velocities[i],velocities[j]} = {velocities[j],velocities[i]}
end if
end for
end for
end procedure
 
procedure simulate()
computeAccelerations()
computePositions()
computeVelocities()
resolveCollisions()
end procedure
procedure printResults()
string fmt = "Body %d : %9.6f %9.6f %9.6f | %9.6f %9.6f %9.6f\n"
for i=1 to bodies do
printf(1,fmt,{i}&positions[i]&velocities[i])
end for
end procedure
for i=1 to timeSteps do
printf(1,"\nCycle %d\n",i)
simulate()
printResults()
end for</lang>
Output same as Python (and C and Kotlin and Go)
 
=={{header|Python}}==
7,828

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.