Needs["OpenCLLink`"]

OpenCLQ[] (* Wymagany działający OpenCL *)

OpenCLInformation[][[2]]

srcf=Import["https://th.if.uj.edu.pl/~odrzywolek/homepage/students/aa/NBody2.cl","Text"];

GeForce={"Platform"->2,"Device"->1} (* Bez karty graficznej symulacja działa tak wolno, że nie ma sensu jej uruchamiać *)

(*Radeon={"Platform"->2,"Device"->2}*)

(*CPU={"Platform"->1,"Device"->1}*)

NBody = OpenCLFunctionLoad[srcf,"nbody_sim",{{"Float",_,"Input"},{"Float",_,"Input"},_Integer,"Float","Float",{"Local","Float"},{"Float",_,"Output"},{"Float",_,"Output"}},64,GeForce,"ShellOutputFunction"->Print];

dat=Import["https://th.if.uj.edu.pl/~odrzywolek/homepage/students/aa/init.Disk.dat","Table"];

numParticles=dat[[1,1]]
deltaT=0.05;
epsSqr=0.0001;

initPos=RotateLeft/@dat[[2;;,1;;4]];

initVel=Table[Join[dat[[ii,5;;]],{0.0}],{ii,2,numParticles+1}];

Length[initVel]==Length[initPos]

oldPos=OpenCLMemoryLoad[initPos,"Float"];
oldVel=OpenCLMemoryLoad[initVel,"Float"];

newPos=OpenCLMemoryAllocate["Float",{numParticles,4}];
newVel=OpenCLMemoryAllocate["Float",{numParticles,4}];

Dynamic[
Refresh[
NBody[oldPos,oldVel,numParticles,deltaT,epsSqr,256,newPos,newVel,numParticles];
NBody[newPos,newVel,numParticles,deltaT,epsSqr,256,oldPos,oldVel,numParticles];
currentPos=OpenCLMemoryGet[oldPos];
Graphics3D[
{
{AbsolutePointSize[1],Black,
Point[currentPos[[;;,1;;3]]]
}
},
Boxed->True,RotationAction->"Clip",PlotRange->6{{-1,1},{-1,1},{-1,1}},
ViewPoint->{0,0,-16},ImageSize->600
]
,UpdateInterval->0]
]

(* Aby zatrzymać, należy usunąć ostatnią komórkę z wizualizacją ! UWAGA: karta graficzna może się przegrzać, obciążenie 100% !!!! *)