customGBGradientChainRule.cc 846 Bytes
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
/**
 * Compute chain rule terms for computed values that depend explicitly on particle coordinates.
 */

KERNEL void computeGradientChainRuleTerms(GLOBAL const real4* RESTRICT posq,
    GLOBAL mm_long* RESTRICT forceBuffers
        PARAMETER_ARGUMENTS) {
    INIT_PARAM_DERIVS
    const real scale = RECIP((real) 0x100000000);
    for (int index = GLOBAL_ID; index < NUM_ATOMS; index += GLOBAL_SIZE) {
        real4 pos = posq[index];
        real3 force = make_real3(scale*forceBuffers[index], scale*forceBuffers[index+PADDED_NUM_ATOMS], scale*forceBuffers[index+PADDED_NUM_ATOMS*2]);
        COMPUTE_FORCES
14
15
16
        forceBuffers[index] = realToFixedPoint(force.x);
        forceBuffers[index+PADDED_NUM_ATOMS] = realToFixedPoint(force.y);
        forceBuffers[index+PADDED_NUM_ATOMS*2] = realToFixedPoint(force.z);
17
18
19
    }
    SAVE_PARAM_DERIVS
}