void StepKernel::Integrate( OpenMM::ContextImpl &context, const Integrator &integrator ) { ProjectionVectors( integrator ); #ifdef FAST_NOISE // Add noise for step kFastNoise( &fastmodule, data.contexts[0], integrator.getNumProjectionVectors(), ( float )( BOLTZ * integrator.getTemperature() ), iterations, *modes, *modeWeights, integrator.getMaxEigenvalue(), *NoiseValues, *pPosqP, integrator.getStepSize() ); #endif // Calculate Constants const double friction = integrator.getFriction(); context.updateContextState(); // Do Step kNMLUpdate( &updatemodule, data.contexts[0], integrator.getStepSize(), friction == 0.0f ? 0.0f : 1.0f / friction, ( float )( BOLTZ * integrator.getTemperature() ), integrator.getNumProjectionVectors(), kIterations, *modes, *modeWeights, *NoiseValues ); // TMC setting parameters for this }
void StepKernel::ProjectionVectors( const Integrator &integrator ) { //check if projection vectors changed bool modesChanged = integrator.getProjVecChanged(); //projection vectors changed or never allocated if( modesChanged || modes == NULL ) { int numModes = integrator.getNumProjectionVectors(); //valid vectors? if( numModes == 0 ) { throw OpenMMException( "Projection vector size is zero." ); } //if( modes != NULL && modes->_length != numModes * mParticles ) { if( modes != NULL && modes->getSize() != numModes * mParticles ) { delete modes; delete modeWeights; modes = NULL; modeWeights = NULL; } if( modes == NULL ) { /*modes = new CUDAStream<float4>( numModes * mParticles, 1, "NormalModes" ); modeWeights = new CUDAStream<float>( numModes > data.gpu->sim.blocks ? numModes : data.gpu->sim.blocks, 1, "NormalModeWeights" );*/ //cu->getNumThreadBlocks()*cu->ThreadBlockSize modes = new CudaArray( *( data.contexts[0] ), numModes * mParticles, sizeof( float4 ), "NormalModes" ); modeWeights = new CudaArray( *( data.contexts[0] ), ( numModes > data.contexts[0]->getNumThreadBlocks()*data.contexts[0]->ThreadBlockSize ? numModes : data.contexts[0]->getNumThreadBlocks()*data.contexts[0]->ThreadBlockSize ), sizeof( float ), "NormalModeWeights" ); oldpos = new CudaArray( *( data.contexts[0] ), data.contexts[0]->getPaddedNumAtoms(), sizeof( float4 ), "OldPositions" ); pPosqP = new CudaArray( *( data.contexts[0] ), data.contexts[0]->getPaddedNumAtoms(), sizeof( float4 ), "MidIntegPositions" ); modesChanged = true; } if( modesChanged ) { int index = 0; const std::vector<std::vector<Vec3> > &modeVectors = integrator.getProjectionVectors(); std::vector<float4> tmp( numModes * mParticles );; for( int i = 0; i < numModes; i++ ) { for( int j = 0; j < mParticles; j++ ) { tmp[index++] = make_float4( ( float ) modeVectors[i][j][0], ( float ) modeVectors[i][j][1], ( float ) modeVectors[i][j][2], 0.0f ); } } modes->upload( tmp ); } } }
void StepKernel::LinearMinimize( OpenMM::ContextImpl &context, const Integrator &integrator, const double energy ) { ProjectionVectors( integrator ); lastPE = energy; kNMLLinearMinimize( &linmodule, data.contexts[0], integrator.getNumProjectionVectors(), integrator.getMaxEigenvalue(), *pPosqP, *modes, *modeWeights ); }