Needs["OpenCLLink`"]

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

OpenCLInformation[]//TableForm

srcf=Import["https://th.if.uj.edu.pl/~odrzywolek/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/aa/init.clusters.dat","Table"];*)

(*dat=Import["https://th.if.uj.edu.pl/~odrzywolek/aa/init.pierscien.dat","Table"];*)

(*dat=Import["https://th.if.uj.edu.pl/~odrzywolek/aa/init.Slonce.Jowisz.heavy_disk.dat","Table"];*)

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

(*dat=Import["https://th.if.uj.edu.pl/~odrzywolek/aa/Plummer_16384.dat","Table"];*)

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

numParticles=dat[[1,1]]
deltaT=0.005;
epsSqr=0.001;

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}];

(*NBody[oldPos,oldVel,numParticles,deltaT,epsSqr,64*4,newPos,newVel,numParticles];
NBody[newPos,newVel,numParticles,deltaT,epsSqr,64*4,oldPos,oldVel,numParticles];*)

(*OpenCLMemoryGet[oldPos];*)

(*ListPointPlot3D[OpenCLMemoryGet[oldPos][[;;,1;;3]],PlotRange->3{{-1,1},{-1,1},{-1,1}},BoxRatios->{1,1}]*)

σ={}

trajektoria={}

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];
AppendTo[trajektoria,currentPos[[1,1;;3]]];
AppendTo[σ,Norm/@OpenCLMemoryGet[newVel]//StandardDeviation];
{
Graphics3D[
{
{AbsolutePointSize[2],Black,
Point[currentPos[[;;,1;;3]]]
}
},
Boxed->True,RotationAction->"Clip",PlotRange->6{{-1,1},{-1,1},{-1,1}},
ViewPoint->{0,0,16},ImageSize->300
],
ListPointPlot3D[trajektoria[[;;]],PlotRange->1.5{{-1,1},{-1,1},{-1,1}},BoxRatios->{1,1}],
ListPlot[σ,PlotLabel->σ[[-1]]]
}
,UpdateInterval->0]
]

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