void SimCalcs::rotateAtom(int aIdx, int pivotIdx, Real rotX, Real rotY, Real rotZ, Real** aCoords) { Real pX = aCoords[X_COORD][pivotIdx]; Real pY = aCoords[Y_COORD][pivotIdx]; Real pZ = aCoords[Z_COORD][pivotIdx]; translateAtom(aIdx, -pX, -pY, -pZ, aCoords); rotateX(aIdx, rotX, aCoords); rotateY(aIdx, rotY, aCoords); rotateZ(aIdx, rotZ, aCoords); translateAtom(aIdx, pX, pY, pZ, aCoords); }
void SimCalcs::intermolecularMove(int molIdx) { Real maxT = sb->maxTranslate; Real maxR = sb->maxRotate; int molStart = sb->moleculeData[MOL_START][molIdx]; int molLen = sb->moleculeData[MOL_LEN][molIdx]; int vertexIdx = (int)randomReal(0, molLen); const Real deltaX = randomReal(-maxT, maxT); const Real deltaY = randomReal(-maxT, maxT); const Real deltaZ = randomReal(-maxT, maxT); const Real rotX = randomReal(-maxR, maxR); const Real rotY = randomReal(-maxR, maxR); const Real rotZ = randomReal(-maxR, maxR); Real** rBCoords = GPUCopy::rollBackCoordinatesPtr(); Real** aCoords = GPUCopy::atomCoordinatesPtr(); Real* bSize = GPUCopy::sizePtr(); int* pIdxes = GPUCopy::primaryIndexesPtr(); int** molData = GPUCopy::moleculeDataPtr(); // Do the move here #pragma acc parallel loop deviceptr(aCoords, rBCoords) \ if (on_gpu) for (int i = 0; i < molLen; i++) { for (int j = 0; j < NUM_DIMENSIONS; j++) { rBCoords[j][i] = aCoords[j][molStart + i]; } if (i == vertexIdx) continue; rotateAtom(molStart + i, molStart + vertexIdx, rotX, rotY, rotZ, aCoords); translateAtom(molStart + i, deltaX, deltaY, deltaZ, aCoords); } #pragma acc parallel loop deviceptr(aCoords, molData, pIdxes, bSize) \ if (on_gpu) for (int i = 0; i < 1; i++) { aCoords[0][molStart + vertexIdx] += deltaX; aCoords[1][molStart + vertexIdx] += deltaY; aCoords[2][molStart + vertexIdx] += deltaZ; keepMoleculeInBox(molIdx, aCoords, molData, pIdxes, bSize); } }
void testTranslateAtom() { cout << "Testing TranslateAtom" << endl; srand(time(NULL)); Atom testAtom; for (int i = 0; i < 2; i++) { double random = ((double) rand() / RAND_MAX) * 15; switch(i) { case 0: testAtom.x = random; break; case 1: testAtom.y = random; break; case 2: testAtom.z = random; break; default: break; } } double oldX = testAtom.x; double oldY = testAtom.y; double oldZ = testAtom.z; double translateX = ((double) rand() / RAND_MAX) * 15; double translateY = ((double) rand() / RAND_MAX) * 15; double translateZ = ((double) rand() / RAND_MAX) * 15; testAtom = translateAtom(testAtom, translateX, translateY, translateZ); assert(testAtom.x == oldX + translateX); assert(testAtom.y == oldY + translateY); assert(testAtom.z == oldZ + translateZ); cout << "Testing TranslateAtom Complete\n" << endl; }
// Descr: evident TEST(GeometryTest, TranslateAtom) { srand(time(NULL)); Atom testAtom; for (int i = 0; i < 2; i++) { double random = ((double) rand() / RAND_MAX) * 15; switch(i) { case 0: testAtom.x = random; break; case 1: testAtom.y = random; break; case 2: testAtom.z = random; break; default: break; } } double oldX = testAtom.x; double oldY = testAtom.y; double oldZ = testAtom.z; double translateX = ((double) rand() / RAND_MAX) * 15; double translateY = ((double) rand() / RAND_MAX) * 15; double translateZ = ((double) rand() / RAND_MAX) * 15; testAtom = translateAtom(testAtom, translateX, translateY, translateZ); EXPECT_NEAR( oldX + translateX , testAtom.x, .1); EXPECT_NEAR( oldY + translateY , testAtom.y, .1); EXPECT_NEAR( oldZ + translateZ , testAtom.z, .1); }