customCompoundBond.cl 1.5 KB
Newer Older
1
2
3
/**
 * Compute the difference between two vectors, setting the fourth component to the squared magnitude.
 */
4
5
real4 ccb_delta(real4 vec1, real4 vec2, bool periodic, real4 periodicBoxSize, real4 invPeriodicBoxSize, 
        real4 periodicBoxVecX, real4 periodicBoxVecY, real4 periodicBoxVecZ) {
6
    real4 result = (real4) (vec1.x-vec2.x, vec1.y-vec2.y, vec1.z-vec2.z, 0);
7
8
    if (periodic)
        APPLY_PERIODIC_TO_DELTA(result);
9
10
11
12
13
14
15
    result.w = result.x*result.x + result.y*result.y + result.z*result.z;
    return result;
}

/**
 * Compute the angle between two vectors.  The w component of each vector should contain the squared magnitude.
 */
16
17
18
19
real ccb_computeAngle(real4 vec1, real4 vec2) {
    real dotProduct = vec1.x*vec2.x + vec1.y*vec2.y + vec1.z*vec2.z;
    real cosine = dotProduct*RSQRT(vec1.w*vec2.w);
    real angle;
20
21
22
    if (cosine > 0.99f || cosine < -0.99f) {
        // We're close to the singularity in acos(), so take the cross product and use asin() instead.

23
24
        real4 crossProduct = cross(vec1, vec2);
        real scale = vec1.w*vec2.w;
25
        angle = asin(SQRT(dot(crossProduct, crossProduct)/scale));
26
        if (cosine < 0)
27
28
29
30
31
32
33
34
35
36
            angle = M_PI-angle;
    }
    else
       angle = acos(cosine);
    return angle;
}

/**
 * Compute the cross product of two vectors, setting the fourth component to the squared magnitude.
 */
37
38
real4 ccb_computeCross(real4 vec1, real4 vec2) {
    real4 result = cross(vec1, vec2);
39
40
41
    result.w = result.x*result.x + result.y*result.y + result.z*result.z;
    return result;
}