Commit 589390a7 authored by Mark Friedrichs's avatar Mark Friedrichs
Browse files

Fixed problem w/ initialization of velocities

parent 1fde85e7
...@@ -5114,7 +5114,7 @@ void testEnergyForceByFiniteDifference( std::string parameterFileName, MapString ...@@ -5114,7 +5114,7 @@ void testEnergyForceByFiniteDifference( std::string parameterFileName, MapString
} }
(void) fprintf( summaryFile, "FD %30s %15.7e %14.6e %15.7e at %18.1f %8.1f delta %15.7e %20s %s\n", (void) fprintf( summaryFile, "FD %30s %15.7e %14.6e %15.7e at %18.1f %8.1f delta %15.7e %20s %s\n",
forceString.c_str(), statistics[0], statistics[1], statistics[4], statistics[5], statistics[6], forceString.c_str(), statistics[0], statistics[1], statistics[4], statistics[5], statistics[6],
parameterFileName.c_str(), energyForceDelta, context->getPlatform().getName().c_str() ); energyForceDelta, parameterFileName.c_str(), context->getPlatform().getName().c_str() );
(void) fflush( summaryFile ); (void) fflush( summaryFile );
} }
} }
...@@ -5243,22 +5243,24 @@ static void setVelocitiesBasedOnTemperature( const System& system, std::vector<V ...@@ -5243,22 +5243,24 @@ static void setVelocitiesBasedOnTemperature( const System& system, std::vector<V
// set velocities based on temperature // set velocities based on temperature
temperature *= BOLTZ; double scaledTemperature = temperature*2.0*BOLTZ;
double kineticEnergy = 0.0; double kineticEnergy = 0.0;
for( unsigned int ii = 0; ii < velocities.size(); ii++ ){ for( unsigned int ii = 0; ii < velocities.size(); ii++ ){
double mass = system.getParticleMass(ii); double mass = system.getParticleMass(ii);
double velocityScale = std::sqrt( temperature/mass ); double velocityScale = std::sqrt( scaledTemperature/mass );
randomValues[0] = SimTKOpenMMUtilities::getNormallyDistributedRandomNumber(); randomValues[0] = SimTKOpenMMUtilities::getNormallyDistributedRandomNumber();
randomValues[1] = SimTKOpenMMUtilities::getNormallyDistributedRandomNumber(); randomValues[1] = SimTKOpenMMUtilities::getNormallyDistributedRandomNumber();
randomValues[2] = SimTKOpenMMUtilities::getNormallyDistributedRandomNumber(); randomValues[2] = SimTKOpenMMUtilities::getNormallyDistributedRandomNumber();
velocities[ii] = Vec3( randomValues[0]*velocityScale, randomValues[1]*velocityScale, randomValues[2]*velocityScale ); velocities[ii] = Vec3( randomValues[0]*velocityScale, randomValues[1]*velocityScale, randomValues[2]*velocityScale );
kineticEnergy += mass*(velocities[ii][0]*velocities[ii][0] + velocities[ii][1]*velocities[ii][1] + velocities[ii][2]*velocities[ii][2]); kineticEnergy += mass*(velocities[ii][0]*velocities[ii][0] + velocities[ii][1]*velocities[ii][1] + velocities[ii][2]*velocities[ii][2]);
} }
kineticEnergy *= 0.5;
double degreesOfFreedom = static_cast<double>(3*velocities.size() - system.getNumConstraints() - 3 ); //double degreesOfFreedom = static_cast<double>(3*velocities.size() - system.getNumConstraints() - 3 );
double degreesOfFreedom = static_cast<double>(3*velocities.size() );
double approximateT = (kineticEnergy)/(degreesOfFreedom*BOLTZ); double approximateT = (kineticEnergy)/(degreesOfFreedom*BOLTZ);
if( approximateT > 0.0 ){ if( approximateT > 0.0 ){
double scale = sqrt(temperature/approximateT); double scale = approximateT > 0.0 ? std::sqrt(temperature/approximateT) : 1.0;
for( unsigned int ii = 0; ii < velocities.size(); ii++ ){ for( unsigned int ii = 0; ii < velocities.size(); ii++ ){
velocities[ii][0] *= scale; velocities[ii][0] *= scale;
velocities[ii][1] *= scale; velocities[ii][1] *= scale;
...@@ -5274,7 +5276,7 @@ static void setVelocitiesBasedOnTemperature( const System& system, std::vector<V ...@@ -5274,7 +5276,7 @@ static void setVelocitiesBasedOnTemperature( const System& system, std::vector<V
} }
(void) fprintf( log, "%s KE=%15.7e approximateT=%15.7e desiredT=%15.7e dof=%12.3f final KE=%12.3e\n", (void) fprintf( log, "%s KE=%15.7e approximateT=%15.7e desiredT=%15.7e dof=%12.3f final KE=%12.3e\n",
methodName.c_str(), kineticEnergy, approximateT, temperature/BOLTZ, methodName.c_str(), kineticEnergy, approximateT, temperature,
degreesOfFreedom, 0.5*finalKineticEnergy ); degreesOfFreedom, 0.5*finalKineticEnergy );
} }
...@@ -5360,6 +5362,7 @@ static void getVerletKineticEnergy( Context& context, double& currentTime, doubl ...@@ -5360,6 +5362,7 @@ static void getVerletKineticEnergy( Context& context, double& currentTime, doubl
kineticEnergy += velocity*system.getParticleMass(ii); kineticEnergy += velocity*system.getParticleMass(ii);
} }
kineticEnergy *= 0.125; kineticEnergy *= 0.125;
//kineticEnergy = statePlus1.getKineticEnergy();
return; return;
} }
...@@ -5634,10 +5637,10 @@ void testEnergyConservation( std::string parameterFileName, MapStringInt& forceM ...@@ -5634,10 +5637,10 @@ void testEnergyConservation( std::string parameterFileName, MapStringInt& forceM
} }
if( log ){ if( log ){
(void) fprintf( log, "Equilibration/simulation times [%12.3f %12.3f] timeBetweenReports [ %12.3e %12.3e] ratios [%12.4f %12.4f] variable=%d\n", (void) fprintf( log, "Equilibration/simulation times [%12.3f %12.3f] timeBetweenReports [ %12.3e %12.3e] ratios [%12.4f %12.4f] variableIntegrator=%d VerletIntegrator=%d\n",
equilibrationTime, simulationTime, equilibrationTime, simulationTime,
equilibrationTimeBetweenReports, simulationTimeBetweenReports, equilibrationTimeBetweenReports, simulationTimeBetweenReports,
equilibrationTimeBetweenReportsRatio, simulationTimeBetweenReportsRatio, isVariableIntegrator ); equilibrationTimeBetweenReportsRatio, simulationTimeBetweenReportsRatio, isVariableIntegrator, isVerletIntegrator );
(void) fflush( log ); (void) fflush( log );
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment