void CpuIntegrateLangevinStepKernel::initialize(const System& system, const LangevinIntegrator& integrator) { int numParticles = system.getNumParticles(); masses.resize(numParticles); for (int i = 0; i < numParticles; ++i) masses[i] = static_cast<RealOpenMM>(system.getParticleMass(i)); data.random.initialize(integrator.getRandomNumberSeed(), data.threads.getNumThreads()); }
void CpuIntegrateLangevinStepKernel::execute(ContextImpl& context, const LangevinIntegrator& integrator) { double temperature = integrator.getTemperature(); double friction = integrator.getFriction(); double stepSize = integrator.getStepSize(); vector<RealVec>& posData = extractPositions(context); vector<RealVec>& velData = extractVelocities(context); vector<RealVec>& forceData = extractForces(context); if (dynamics == 0 || temperature != prevTemp || friction != prevFriction || stepSize != prevStepSize) { // Recreate the computation objects with the new parameters. if (dynamics) delete dynamics; RealOpenMM tau = (friction == 0.0 ? 0.0 : 1.0/friction); dynamics = new CpuLangevinDynamics(context.getSystem().getNumParticles(), stepSize, tau, temperature, data.threads, data.random); dynamics->setReferenceConstraintAlgorithm(&extractConstraints(context)); prevTemp = temperature; prevFriction = friction; prevStepSize = stepSize; } dynamics->update(context.getSystem(), posData, velData, forceData, masses, integrator.getConstraintTolerance()); ReferencePlatform::PlatformData* refData = reinterpret_cast<ReferencePlatform::PlatformData*>(context.getPlatformData()); refData->time += stepSize; refData->stepCount++; }
void testSerializeLangevinIntegrator() { LangevinIntegrator *intg = new LangevinIntegrator(372.4, 1.234, 0.0018); stringstream ss; XmlSerializer::serialize<Integrator>(intg, "LangevinIntegrator", ss); LangevinIntegrator *intg2 = dynamic_cast<LangevinIntegrator*>(XmlSerializer::deserialize<Integrator>(ss)); ASSERT_EQUAL(intg->getConstraintTolerance(), intg2->getConstraintTolerance()); ASSERT_EQUAL(intg->getStepSize(), intg2->getStepSize()); ASSERT_EQUAL(intg->getTemperature(), intg2->getTemperature()); ASSERT_EQUAL(intg->getFriction(), intg2->getFriction()); ASSERT_EQUAL(intg->getRandomNumberSeed(), intg2->getRandomNumberSeed()); delete intg; delete intg2; }
double CpuIntegrateLangevinStepKernel::computeKineticEnergy(ContextImpl& context, const LangevinIntegrator& integrator) { return computeShiftedKineticEnergy(context, masses, 0.5*integrator.getStepSize()); }
void ValidateOpenMM::writeIntegrator( FILE* filePtr, const Integrator& integrator ) const { // LangevinIntegrator try { const LangevinIntegrator langevinIntegrator = dynamic_cast<const LangevinIntegrator&>(integrator); (void) fprintf( filePtr, "Integrator LangevinIntegrator\n" ); (void) fprintf( filePtr, "StepSize %14.7e\n", langevinIntegrator.getStepSize() ); (void) fprintf( filePtr, "ConstraintTolerance %14.7e\n", langevinIntegrator.getConstraintTolerance() ); (void) fprintf( filePtr, "Temperature %14.7e\n", langevinIntegrator.getTemperature() ); (void) fprintf( filePtr, "Friction %14.7e\n", langevinIntegrator.getFriction() ); (void) fprintf( filePtr, "RandomNumberSeed %d\n", langevinIntegrator.getRandomNumberSeed() ); return; } catch( std::bad_cast ){ } // VariableLangevinIntegrator try { const VariableLangevinIntegrator& langevinIntegrator = dynamic_cast<const VariableLangevinIntegrator&>(integrator); (void) fprintf( filePtr, "Integrator VariableLangevinIntegrator\n" ); (void) fprintf( filePtr, "StepSize %14.7e\n", langevinIntegrator.getStepSize() ); (void) fprintf( filePtr, "ConstraintTolerance %14.7e\n", langevinIntegrator.getConstraintTolerance() ); (void) fprintf( filePtr, "Temperature %14.7e\n", langevinIntegrator.getTemperature() ); (void) fprintf( filePtr, "Friction %14.7e\n", langevinIntegrator.getFriction() ); (void) fprintf( filePtr, "RandomNumberSeed %d\n", langevinIntegrator.getRandomNumberSeed() ); (void) fprintf( filePtr, "ErrorTolerance %14.7e\n", langevinIntegrator.getErrorTolerance() ); return; } catch( std::bad_cast ){ } // VerletIntegrator try { const VerletIntegrator& verletIntegrator = dynamic_cast<const VerletIntegrator&>(integrator); (void) fprintf( filePtr, "Integrator VerletIntegrator\n" ); (void) fprintf( filePtr, "StepSize %14.7e\n", verletIntegrator.getStepSize() ); (void) fprintf( filePtr, "ConstraintTolerance %14.7e\n", verletIntegrator.getConstraintTolerance() ); return; } catch( std::bad_cast ){ } // VariableVerletIntegrator try { const VariableVerletIntegrator & variableVerletIntegrator = dynamic_cast<const VariableVerletIntegrator&>(integrator); (void) fprintf( filePtr, "Integrator VariableVerletIntegrator\n" ); (void) fprintf( filePtr, "StepSize %14.7e\n", variableVerletIntegrator.getStepSize() ); (void) fprintf( filePtr, "ConstraintTolerance %14.7e\n", variableVerletIntegrator.getConstraintTolerance() ); (void) fprintf( filePtr, "ErrorTolerance %14.7e\n", variableVerletIntegrator.getErrorTolerance() ); return; } catch( std::bad_cast ){ } // BrownianIntegrator try { const BrownianIntegrator& brownianIntegrator = dynamic_cast<const BrownianIntegrator&>(integrator); (void) fprintf( filePtr, "Integrator BrownianIntegrator\n" ); (void) fprintf( filePtr, "StepSize %14.7e\n", brownianIntegrator.getStepSize() ); (void) fprintf( filePtr, "ConstraintTolerance %14.7e\n", brownianIntegrator.getConstraintTolerance() ); (void) fprintf( filePtr, "Temperature %14.7e\n", brownianIntegrator.getTemperature() ); (void) fprintf( filePtr, "Friction %14.7e\n", brownianIntegrator.getFriction() ); (void) fprintf( filePtr, "RandomNumberSeed %d\n", brownianIntegrator.getRandomNumberSeed() ); return; } catch( std::bad_cast ){ } if( getLog() ){ (void) fprintf( getLog(), "Integrator not recognized." ); (void) fflush( getLog() ); } return; }