void ReferenceIntegrateDrudeSCFStepKernel::execute(ContextImpl& context, const DrudeSCFIntegrator& integrator) { vector<RealVec>& pos = extractPositions(context); vector<RealVec>& vel = extractVelocities(context); vector<RealVec>& force = extractForces(context); // Update the positions and velocities. int numParticles = particleInvMass.size(); vector<RealVec> xPrime(numParticles); RealOpenMM dt = integrator.getStepSize(); for (int i = 0; i < numParticles; i++) { if (particleInvMass[i] != 0.0) { vel[i] += force[i]*particleInvMass[i]*dt; xPrime[i] = pos[i]+vel[i]*dt; } } // Apply constraints. if (constraints != NULL) constraints->apply(numParticles, pos, xPrime, particleInvMass); // Record the constrained positions and velocities. RealOpenMM dtInv = 1.0/dt; for (int i = 0; i < numParticles; i++) { if (particleInvMass[i] != 0.0) { vel[i] = (xPrime[i]-pos[i])*dtInv; pos[i] = xPrime[i]; } } // Update the positions of virtual sites and Drude particles. ReferenceVirtualSites::computePositions(context.getSystem(), pos); minimize(context, integrator.getMinimizationErrorTolerance()); data.time += integrator.getStepSize(); data.stepCount++; }
void CudaIntegrateDrudeSCFStepKernel::execute(ContextImpl& context, const DrudeSCFIntegrator& integrator) { cu.setAsCurrent(); CudaIntegrationUtilities& integration = cu.getIntegrationUtilities(); int numAtoms = cu.getNumAtoms(); int paddedNumAtoms = cu.getPaddedNumAtoms(); double dt = integrator.getStepSize(); if (dt != prevStepSize) { if (cu.getUseDoublePrecision() || cu.getUseMixedPrecision()) { vector<double2> stepSizeVec(1); stepSizeVec[0] = make_double2(dt, dt); cu.getIntegrationUtilities().getStepSize().upload(stepSizeVec); } else { vector<float2> stepSizeVec(1); stepSizeVec[0] = make_float2((float) dt, (float) dt); cu.getIntegrationUtilities().getStepSize().upload(stepSizeVec); } prevStepSize = dt; } // Call the first integration kernel. CUdeviceptr posCorrection = (cu.getUseMixedPrecision() ? cu.getPosqCorrection().getDevicePointer() : 0); void* args1[] = {&numAtoms, &paddedNumAtoms, &cu.getIntegrationUtilities().getStepSize().getDevicePointer(), &cu.getPosq().getDevicePointer(), &posCorrection, &cu.getVelm().getDevicePointer(), &cu.getForce().getDevicePointer(), &integration.getPosDelta().getDevicePointer()}; cu.executeKernel(kernel1, args1, numAtoms); // Apply constraints. integration.applyConstraints(integrator.getConstraintTolerance()); // Call the second integration kernel. void* args2[] = {&numAtoms, &cu.getIntegrationUtilities().getStepSize().getDevicePointer(), &cu.getPosq().getDevicePointer(), &posCorrection, &cu.getVelm().getDevicePointer(), &integration.getPosDelta().getDevicePointer()}; cu.executeKernel(kernel2, args2, numAtoms); // Update the positions of virtual sites and Drude particles. integration.computeVirtualSites(); minimize(context, integrator.getMinimizationErrorTolerance()); // Update the time and step count. cu.setTime(cu.getTime()+dt); cu.setStepCount(cu.getStepCount()+1); cu.reorderAtoms(); }
double ReferenceIntegrateDrudeSCFStepKernel::computeKineticEnergy(ContextImpl& context, const DrudeSCFIntegrator& integrator) { return computeShiftedKineticEnergy(context, particleInvMass, 0.5*integrator.getStepSize(), constraints); }
double CudaIntegrateDrudeSCFStepKernel::computeKineticEnergy(ContextImpl& context, const DrudeSCFIntegrator& integrator) { return cu.getIntegrationUtilities().computeKineticEnergy(0.5*integrator.getStepSize()); }