andersenThermostat.cl 797 Bytes
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
 * Apply the Andersen thermostat to adjust particle velocities.
 */

__kernel void applyAndersenThermostat(float collisionFrequency, float kT, __global float4* velm, __global float2* stepSize, __global float4* random, unsigned int randomIndex) {
    randomIndex += get_global_id(0);
    float collisionProbability = 1.0f-exp(-collisionFrequency*stepSize[0].y);
    for (int index = get_global_id(0); index < NUM_ATOMS; index += get_global_size(0)) {
        float4 velocity = velm[index];
        float4 rand = random[randomIndex];
        float scale = (rand.w < collisionProbability ? 0.0 : 1.0);
        float add = (1.0-scale)*sqrt(kT*velocity.w);
        velocity.xyz = scale*velocity.xyz + add*rand.xyz;
        velm[index] = velocity;
        randomIndex += get_global_size(0);
    }
}