00001
00022 #include "gpu_integrator.cuh"
00023
00024 __global__ void gpuIntegratorLeapFrog(FLOAT_ARRAY_TYPE *dPos, FLOAT_ARRAY_TYPE *dVel, FLOAT_ARRAY_TYPE *dForce, int N, float dt, float boxsize, float *dmax, float maxDisplacement, bool *needListUpdate)
00025 {
00026 int tid = threadIdx.x;
00027 int idx = blockDim.x * blockIdx.x + tid;
00028 if (idx < N)
00029 {
00030 float dx, dy, dz;
00031
00032 dVel[idx].x = dVel[idx].x + dt * dForce[idx].x;
00033 dVel[idx].y = dVel[idx].y + dt * dForce[idx].y;
00034 dVel[idx].z = dVel[idx].z + dt * dForce[idx].z;
00035
00036 dx = dt * dVel[idx].x;
00037 dy = dt * dVel[idx].y;
00038 dz = dt * dVel[idx].z;
00039 dPos[idx].x = dPos[idx].x + dx;
00040 dPos[idx].y = dPos[idx].y + dy;
00041 dPos[idx].z = dPos[idx].z + dz;
00042
00043 dmax[idx] += sqrt(dx * dx + dy * dy + dz * dz);
00044 if ( dmax[idx] > maxDisplacement )
00045 {
00046 (*needListUpdate) = true;
00047 }
00048
00049 checkPBC( &dPos[idx], &boxsize);
00050 }
00051 }
00052
00053 __global__ void gpuInitialBackstep(FLOAT_ARRAY_TYPE *dVel, FLOAT_ARRAY_TYPE *dForce, int N, float dt)
00054 {
00055 int tid = threadIdx.x;
00056 int idx = blockDim.x * blockIdx.x + tid;
00057 if (idx < N)
00058 {
00059
00060 dVel[idx].x = dVel[idx].x - 0.5f * dt * dForce[idx].x;
00061 dVel[idx].y = dVel[idx].y - 0.5f * dt * dForce[idx].y;
00062 dVel[idx].z = dVel[idx].z - 0.5f * dt * dForce[idx].z;
00063 }
00064 }