-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathnbody.cl
51 lines (35 loc) · 1.15 KB
/
nbody.cl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#define SOFT 1e-9f
__kernel void bodyForces(const int nBody, const float dt,
__global float * px, __global float * py, __global float * pz,
__global float * vx, __global float * vy, __global float * vz){
int i = get_global_id(0);
if (i < nBody) {
float Fx = 0.0f;
float Fy = 0.0f;
float Fz = 0.0f;
for (int j=0; j<nBody; j++){
float dx = px[j] - px[i];
float dy = py[j] - py[i];
float dz = pz[j] - pz[i];
float distSqr = dx*dx + dy*dy + dz*dz + SOFT;
float invDist = rsqrt(distSqr);
float invDist3 = invDist * invDist * invDist;
Fx += dx * invDist3;
Fy += dy * invDist3;
Fz += dz * invDist3;
}
vx[i] += dt*Fx;
vy[i] += dt*Fy;
vz[i] += dt*Fz;
}
}
__kernel void integrateBodies(const int nBody, const float dt,
__global float * px, __global float * py, __global float * pz,
__global float * vx, __global float * vy, __global float * vz){
int i = get_global_id(0);
if (i < nBody) {
px[i] += dt*vx[i];
py[i] += dt*vy[i];
pz[i] += dt*vz[i];
}
}