void Integrator::initialize( ContextImpl &contextRef ) { context = &contextRef; if( context->getSystem().getNumConstraints() > 0 ) { throw OpenMMException( "LTMD Integrator does not support constraints" ); } kernel = context->getPlatform().createKernel( StepKernel::Name(), contextRef ); ( ( StepKernel & )( kernel.getImpl() ) ).initialize( contextRef.getSystem(), *this ); //(dynamic_cast<StepKernel &>( kernel.getImpl() )).initialize( contextRef.getSystem(), *this ); }
void throwException(const char* file, int line, const std::string& details) { std::string fn(file); std::string::size_type pos = fn.find_last_of("/\\"); if (pos+1>=fn.size()) pos=0; std::string filename(fn,(int)(pos+1),(int)(fn.size()-(pos+1))); std::stringstream message; message << "Assertion failure at "<<filename<<":"<<line; if (details.size() > 0) message << ". "<<details; throw OpenMMException(message.str()); }
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 ); } } }