Commit ff8bd4e1 authored by Mark Friedrichs's avatar Mark Friedrichs
Browse files

Brook SD code

parent a475f0a6
...@@ -89,6 +89,10 @@ const std::string BrookCommon::ShakeXCons2Stream ...@@ -89,6 +89,10 @@ const std::string BrookCommon::ShakeXCons2Stream
const std::string BrookCommon::ShakeXCons3Stream = "ShakeXCons3Stream"; const std::string BrookCommon::ShakeXCons3Stream = "ShakeXCons3Stream";
const std::string BrookCommon::ShakeInverseMapStream = "ShakeInverseMapStream"; const std::string BrookCommon::ShakeInverseMapStream = "ShakeInverseMapStream";
// Random number streams
const std::string BrookCommon::ShuffleStream = "ShuffleStream";
/** /**
* Constructor * Constructor
* *
......
...@@ -104,6 +104,10 @@ class BrookCommon { ...@@ -104,6 +104,10 @@ class BrookCommon {
static const std::string ShakeXCons3Stream; static const std::string ShakeXCons3Stream;
static const std::string ShakeInverseMapStream; static const std::string ShakeInverseMapStream;
// Random number generator streams
static const std::string ShuffleStream;
// --------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------
/** /**
...@@ -224,7 +228,7 @@ class BrookCommon { ...@@ -224,7 +228,7 @@ class BrookCommon {
FILE* getLog( void ) const; FILE* getLog( void ) const;
/** /**
* Be verbose flag * Get verbose flag
* *
* @return verbosity flag * @return verbosity flag
* *
...@@ -239,7 +243,7 @@ class BrookCommon { ...@@ -239,7 +243,7 @@ class BrookCommon {
* *
*/ */
int setVerbosity( int verbositym); int setVerbosity( int verbosity );
/* /*
* Given number of stream elements and width, returns the appropriate * Given number of stream elements and width, returns the appropriate
......
...@@ -46,6 +46,7 @@ BrookIntegrateLangevinStepKernel::BrookIntegrateLangevinStepKernel( std::string ...@@ -46,6 +46,7 @@ BrookIntegrateLangevinStepKernel::BrookIntegrateLangevinStepKernel( std::string
_brookStochasticDynamics = NULL; _brookStochasticDynamics = NULL;
_brookShakeAlgorithm = NULL; _brookShakeAlgorithm = NULL;
_brookRandomNumberGenerator = NULL;
} }
...@@ -59,6 +60,7 @@ BrookIntegrateLangevinStepKernel::~BrookIntegrateLangevinStepKernel( ){ ...@@ -59,6 +60,7 @@ BrookIntegrateLangevinStepKernel::~BrookIntegrateLangevinStepKernel( ){
delete _brookStochasticDynamics; delete _brookStochasticDynamics;
delete _brookShakeAlgorithm; delete _brookShakeAlgorithm;
delete _brookRandomNumberGenerator;
} }
...@@ -77,6 +79,9 @@ void BrookIntegrateLangevinStepKernel::initialize( const vector<double>& masses, ...@@ -77,6 +79,9 @@ void BrookIntegrateLangevinStepKernel::initialize( const vector<double>& masses,
_brookShakeAlgorithm = new BrookShakeAlgorithm( ); _brookShakeAlgorithm = new BrookShakeAlgorithm( );
_brookShakeAlgorithm->setup( masses, constraintIndices, constraintLengths, getPlatform() ); _brookShakeAlgorithm->setup( masses, constraintIndices, constraintLengths, getPlatform() );
_brookRandomNumberGenerator = new BrookRandomNumberGenerator( );
_brookRandomNumberGenerator->setup( (int) masses.size(), getPlatform() );
} }
/** /**
...@@ -116,6 +121,7 @@ void BrookIntegrateLangevinStepKernel::execute( Stream& positions, Stream& veloc ...@@ -116,6 +121,7 @@ void BrookIntegrateLangevinStepKernel::execute( Stream& positions, Stream& veloc
if( fabs( differences[0] ) < epsilon || fabs( differences[1] ) < epsilon || fabs( differences[2] ) < epsilon ){ if( fabs( differences[0] ) < epsilon || fabs( differences[1] ) < epsilon || fabs( differences[2] ) < epsilon ){
_brookStochasticDynamics->updateParameters( temperature, friction, stepSize ); _brookStochasticDynamics->updateParameters( temperature, friction, stepSize );
} }
_brookStochasticDynamics->update( positions, velocities, forces, *_brookShakeAlgorithm ); _brookStochasticDynamics->update( positions, velocities, forces, (_brookShakeAlgorithm ? *_brookShakeAlgorithm : NULL),
*_brookRandomNumberGenerator );
} }
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include "kernels.h" #include "kernels.h"
#include "BrookStochasticDynamics.h" #include "BrookStochasticDynamics.h"
#include "BrookShakeAlgorithm.h" #include "BrookShakeAlgorithm.h"
#include "BrookRandomNumberGenerator.h"
namespace OpenMM { namespace OpenMM {
...@@ -91,6 +92,7 @@ class BrookIntegrateLangevinStepKernel : public IntegrateLangevinStepKernel { ...@@ -91,6 +92,7 @@ class BrookIntegrateLangevinStepKernel : public IntegrateLangevinStepKernel {
BrookStochasticDynamics* _brookStochasticDynamics; BrookStochasticDynamics* _brookStochasticDynamics;
BrookShakeAlgorithm* _brookShakeAlgorithm; BrookShakeAlgorithm* _brookShakeAlgorithm;
BrookRandomNumberGenerator* _brookRandomNumberGenerator;
}; };
......
...@@ -145,8 +145,8 @@ void BrookPlatform::_initializeKernelFactory( void ){ ...@@ -145,8 +145,8 @@ void BrookPlatform::_initializeKernelFactory( void ){
registerKernelFactory( CalcStandardMMForceFieldKernel::Name(), factory); registerKernelFactory( CalcStandardMMForceFieldKernel::Name(), factory);
// registerKernelFactory( CalcGBSAOBCForceFieldKernel::Name(), factory); // registerKernelFactory( CalcGBSAOBCForceFieldKernel::Name(), factory);
registerKernelFactory( IntegrateVerletStepKernel::Name(), factory); //registerKernelFactory( IntegrateVerletStepKernel::Name(), factory);
//registerKernelFactory( IntegrateLangevinStepKernel::Name(), factory); registerKernelFactory( IntegrateLangevinStepKernel::Name(), factory);
//registerKernelFactory( IntegrateBrownianStepKernel::Name(), factory); //registerKernelFactory( IntegrateBrownianStepKernel::Name(), factory);
//registerKernelFactory( ApplyAndersenThermostatKernel::Name(), factory); //registerKernelFactory( ApplyAndersenThermostatKernel::Name(), factory);
registerKernelFactory( CalcKineticEnergyKernel::Name(), factory); registerKernelFactory( CalcKineticEnergyKernel::Name(), factory);
...@@ -180,7 +180,7 @@ void BrookPlatform::_setBrookRuntime( const std::string& runtime ){ ...@@ -180,7 +180,7 @@ void BrookPlatform::_setBrookRuntime( const std::string& runtime ){
} }
if( getLog() ){ if( getLog() ){
(void) fprintf( getLog(), "%s Brook initializing to runtime=<%s>", methodName.c_str(), _runtime.c_str() ); (void) fprintf( getLog(), "%s Brook initializing to runtime=<%s>\n", methodName.c_str(), _runtime.c_str() );
(void) fflush( getLog() ); (void) fflush( getLog() );
} }
......
...@@ -32,12 +32,6 @@ ...@@ -32,12 +32,6 @@
* USE OR OTHER DEALINGS IN THE SOFTWARE. * * USE OR OTHER DEALINGS IN THE SOFTWARE. *
* -------------------------------------------------------------------------- */ * -------------------------------------------------------------------------- */
#include <vector>
#include <set>
#include "BrookFloatStreamInternal.h"
#include "BrookShakeAlgorithm.h"
#include "BrookPlatform.h"
#include "BrookCommon.h" #include "BrookCommon.h"
namespace OpenMM { namespace OpenMM {
...@@ -52,6 +46,10 @@ class BrookRandomNumberGenerator : public BrookCommon { ...@@ -52,6 +46,10 @@ class BrookRandomNumberGenerator : public BrookCommon {
public: public:
// toggle between original rng & Kiss (Nvidia) code
static const int UseOriginalRng = 1;
/** /**
* Constructor * Constructor
* *
...@@ -67,98 +65,38 @@ class BrookRandomNumberGenerator : public BrookCommon { ...@@ -67,98 +65,38 @@ class BrookRandomNumberGenerator : public BrookCommon {
~BrookRandomNumberGenerator(); ~BrookRandomNumberGenerator();
/** /**
* Get tau * Get number of random number streams
*
* @return tau
*/
BrookOpenMMFloat getTau( void ) const;
/**
* Get friction
*
* @return friction
*/
BrookOpenMMFloat getFriction( void ) const;
/**
* Get temperature
*
* @return temperature
*/
BrookOpenMMFloat getTemperature( void ) const;
/**
* Get step size
*
* @return step size
*/
BrookOpenMMFloat getStepSize( void ) const;
/**
*
* Get array of derived parameters indexed by 'DerivedParameters' enums
*
* @return array
* *
*/ * @return number of random number streams
const BrookOpenMMFloat* getDerivedParameters( void ) const;
/**
* Get StochasticDynamics atom stream width
* *
* @return atom stream width
*/ */
int getStochasticDynamicsAtomStreamWidth( void ) const; int getNumberOfRandomNumberStreams( void ) const;
/** /**
* Get StochasticDynamics atom stream height * Get stream width
* *
* @return atom stream height * @return stream width
*/ */
int getStochasticDynamicsAtomStreamHeight( void ) const; int getRandomNumberStreamWidth( void ) const;
/** /**
* Get StochasticDynamics atom stream size * Get stream height
* *
* @return atom stream size * @return stream height
*/ */
int getStochasticDynamicsAtomStreamSize( void ) const; int getRandomNumberStreamHeight( void ) const;
/** /**
* Update parameters * Get stream size
*
* @param temperature temperature
* @param friction friction
* @param step size step size
*
* @return DefaultReturnValue
* *
* @return stream size
*/ */
int updateParameters( double temperature, double friction, double stepSize ); int getRandomNumberStreamSize( void ) const;
/**
* Update
*
* @param positions atom positions
* @param velocities atom velocities
* @param forces atom forces
* @param brookShakeAlgorithm BrookShakeAlgorithm reference
*
* @return DefaultReturnValue
*
*/
int update( Stream& positions, Stream& velocities,
const Stream& forces, BrookShakeAlgorithm& brookShakeAlgorithm );
/** /**
* Get array of StochasticDynamics streams * Get array of StochasticDynamics streams
* *
...@@ -169,16 +107,16 @@ class BrookRandomNumberGenerator : public BrookCommon { ...@@ -169,16 +107,16 @@ class BrookRandomNumberGenerator : public BrookCommon {
BrookFloatStreamInternal** getStreams( void ); BrookFloatStreamInternal** getStreams( void );
/* /*
* Setup of StochasticDynamics parameters * Setup of RNG parameters
* *
* @param masses atom masses * @param numberOfAtoms number of atoms
* @param platform Brook platform * @param platform Brook platform
* *
* @return ErrorReturnValue value if error, else DefaultReturnValue * @return ErrorReturnValue value if error, else DefaultReturnValue
* *
* */ * */
int setup( const std::vector<double>& masses, const Platform& platform ); int setup( int numberOfAtoms, const Platform& platform );
/* /*
* Get contents of object * Get contents of object
...@@ -192,104 +130,93 @@ class BrookRandomNumberGenerator : public BrookCommon { ...@@ -192,104 +130,93 @@ class BrookRandomNumberGenerator : public BrookCommon {
std::string getContentsString( int level = 0 ) const; std::string getContentsString( int level = 0 ) const;
/** /**
* Get SDPC1 stream * Get random number stream
* *
* @return SDPC1 stream * @param index random number stream index
*
* @return random number stream
* *
*/ */
BrookFloatStreamInternal* getSDPC1Stream( void ) const; BrookFloatStreamInternal* getRandomNumberStream( int index ) const;
/** /**
* Get SDPC2 stream * Get random number seed
*
* @return SDPC2 stream
* *
* @return random number seed
*/ */
BrookFloatStreamInternal* getSDPC2Stream( void ) const; unsigned long int getRandomNumberSeed( void ) const;
/** /**
* Get shuffle stream * Increment random number seed
* *
* @return Shuffle stream * @param increment amount to increment random number seed; default = 1
* *
* @return updated random number seed
*/ */
BrookFloatStreamInternal* getShuffleStream( void ) const; unsigned long int incrementRandomNumberSeed( unsigned long int increment = 1 );
/** /**
* Generate a random number using algorithm in Gromacs * Set random number seed
*
* @param ig seed
* *
* @return random number * @param new random number seed; default = 1
* *
* @return random number seed
*/ */
BrookOpenMMFloat generateGromacsRandomNumber( int* ig ); unsigned long int setRandomNumberSeed( unsigned long int seed = 1 );
/** /**
* Generate a random number using algorithm in Nvidia code * Get index of rv texture
* http://www.helsbreth.org/random/rng_kiss.html
*
* @param randomV1 output random value
* @param randomV2 output random value
* @param randomV3 output random value
* @param state state
* *
* @return index of rv texture
*/ */
void generateRandomsAlaNvidia( float* randomV1, float* randomV2, float* randomV3, int getRvStreamIndex( void ) const;
unsigned int state[4] );
/** /**
* Load random number streams using Nvidia algorithm * Get max shuffles
* *
* @return max shuffles
* *
* @return DefaultReturnValue;
*/ */
int loadRandomNumberStreamsNvidia( void ); int getMaxShuffles( void ) const;
/** /**
* Get random number seed * Advance random values stream index
* *
* @return random number seed * @param numberOfEntriesToAdvance number of entries consumed in previous iteration
*/
unsigned long int getRandomNumberSeed( void ) const;
/**
* Increment random number seed
* *
* @param increment amount to increment random number seed; default = 1 * @return DefaultReturnValue
* *
* @return updated random number seed
*/ */
unsigned long int incrementRandomNumberSeed( unsigned long int increment = 1 ); int advanceGVCursor( int numberOfEntriesToAdvance );
/** /**
* Set random number seed * Get random value stream offset
* *
* @param new random number seed; default = 1 * @return random value stream offset
* *
* @return random number seed
*/ */
unsigned long int setRandomNumberSeed( unsigned long int seed = 1 ); int getRvStreamOffset( void ) const;
private: private:
// streams indices // streams indices
enum BrookRandomNumberGeneratorStreams { enum BrookRandomNumberGeneratorStreams {
RandomNumberStream,
ShuffleStream, ShuffleStream,
LastStreamIndex LastStreamIndex
}; };
BrookFloatStreamInternal* _auxiliaryStreams[LastStreamIndex];
BrookFloatStreamInternal** _randomNumberGeneratorStreams;
// randomNumberSeed // randomNumberSeed
unsigned long int _randomNumberSeed; unsigned long int _randomNumberSeed;
...@@ -304,6 +231,16 @@ class BrookRandomNumberGenerator : public BrookCommon { ...@@ -304,6 +231,16 @@ class BrookRandomNumberGenerator : public BrookCommon {
int _randomNumberStreamHeight; int _randomNumberStreamHeight;
int _randomNumberStreamSize; int _randomNumberStreamSize;
// control variables
int _rvStreamIndex;
int _rvStreamOffset;
int _numberOfShuffles;
int _maxShuffles;
float* _loadBuffer;
int* _shuffleIndices;
/* /*
* Setup of stream dimensions * Setup of stream dimensions
* *
...@@ -340,15 +277,125 @@ class BrookRandomNumberGenerator : public BrookCommon { ...@@ -340,15 +277,125 @@ class BrookRandomNumberGenerator : public BrookCommon {
int _initializeStreams( const Platform& platform ); int _initializeStreams( const Platform& platform );
/** /**
* Set masses * Increment random number offset
*
* @param increment increment for offset
*
* @return random number offset
*/
int _incrementRvOffset( int increment );
/**
* Get shuffle stream
*
* @return Shuffle stream
*
*/
BrookFloatStreamInternal* _getShuffleStream( void ) const;
/**
* Generate a random number using algorithm in Gromacs
*
* @param ig seed
*
* @return random number
*
*/
BrookOpenMMFloat _generateGromacsRandomNumber( unsigned long int* ig );
/**
* Generate a random number using Kiss (algorithm in Kiss code)
* http://www.helsbreth.org/random/rng_kiss.html
*
* @param randomV1 output random value
* @param randomV2 output random value
* @param randomV3 output random value
* @param state state
*
*/
void _generateRandomsKiss( float* randomV1, float* randomV2, float* randomV3,
unsigned int state[4] );
/**
* Load random number streams using Kiss algorithm
*
*
* @return DefaultReturnValue;
*/
int _loadRandomNumberStreamsKiss( void );
/**
* Load random number streams using original gpu algorithm
*
*
* @return DefaultReturnValue;
*/
int _loadGVStreamsOriginal( void );
/**
* Loads a permutation of indices from 0 to gvSize-1 in
* sdp->strShuffle. To make sure that the order of the
* permutation is atleast NGVSHUFFLE, we create the
* permutation by introducing a random number of p-cycles
* where p is randomly determined from 2,3,5,7 and 11.
* The LCM of these numbers is 2310.
* Ofcourse the p-cycles are not necessarily disjoint
* the way it's done here, but there's a good chance
* there will enough disjoint cycles to make the
* order of the permutation larger than NGVSHUFFLE
*
*
* This function is only called once at startup
*
* @return DefaultReturnValue;
**/
int _loadGVShuffle( void );
/**
* Get number of shuffles
* *
* @param masses atomic masses * @return number of shuffles
* *
*/ */
int _setInverseSqrtMasses( const std::vector<double>& masses ); int _getNumberOfShuffles( void ) const;
/**
* Load buffer
*
* @return ptr to load buffer
*
* @throw OpenMMException if rv stream size is < 1
*
**/
float* _getLoadBuffer( void );
/**
* Get ptr to shuffle indices
*
* @return ptr to shuffle indices
*
* @throw OpenMMException if size is < 1
*
**/
int* _getShuffleIndices( int size );
/**
* Shuffle streams
*
* @return DefaultReturnValue;
*/
int _shuffleGVStreams( void );
}; };
......
...@@ -34,6 +34,8 @@ ...@@ -34,6 +34,8 @@
#include "BrookPlatform.h" #include "BrookPlatform.h"
#include "OpenMMException.h" #include "OpenMMException.h"
#include "BrookStreamImpl.h" #include "BrookStreamImpl.h"
#include "kshakeh.h"
#include "kupdatesd.h"
// use random number generator // use random number generator
...@@ -330,6 +332,7 @@ int BrookStochasticDynamics::updateParameters( double temperature, double fricti ...@@ -330,6 +332,7 @@ int BrookStochasticDynamics::updateParameters( double temperature, double fricti
* @param velocities atom velocities * @param velocities atom velocities
* @param forces atom forces * @param forces atom forces
* @param brookShakeAlgorithm BrookShakeAlgorithm reference * @param brookShakeAlgorithm BrookShakeAlgorithm reference
* @param brookRandomNumberGenerator BrookRandomNumberGenerator reference
* *
* @return DefaultReturnValue * @return DefaultReturnValue
* *
...@@ -337,7 +340,8 @@ int BrookStochasticDynamics::updateParameters( double temperature, double fricti ...@@ -337,7 +340,8 @@ int BrookStochasticDynamics::updateParameters( double temperature, double fricti
int BrookStochasticDynamics::update( Stream& positions, Stream& velocities, int BrookStochasticDynamics::update( Stream& positions, Stream& velocities,
const Stream& forces, const Stream& forces,
BrookShakeAlgorithm& brookShakeAlgorithm ){ BrookShakeAlgorithm& brookShakeAlgorithm,
BrookRandomNumberGenerator& brookRandomNumberGenerator ){
// --------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------
...@@ -349,26 +353,25 @@ int BrookStochasticDynamics::update( Stream& positions, Stream& velocities, ...@@ -349,26 +353,25 @@ int BrookStochasticDynamics::update( Stream& positions, Stream& velocities,
// --------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------
BrookOpenMMFloat* derivedParameters = getDerivedParameters(); const BrookOpenMMFloat* derivedParameters = getDerivedParameters();
BrookStreamImpl& positionStream = dynamic_cast<BrookStreamImpl&> (positions.getImpl()); BrookStreamImpl& positionStream = dynamic_cast<BrookStreamImpl&> (positions.getImpl());
BrookStreamImpl& velocityStream = dynamic_cast<BrookStreamImpl&> (velocities.getImpl()); BrookStreamImpl& velocityStream = dynamic_cast<BrookStreamImpl&> (velocities.getImpl());
BrookStreamImpl& forceStreamC = dynamic_cast<BrookStreamImpl&> (forces.getImpl()); const BrookStreamImpl& forceStreamC = dynamic_cast<const BrookStreamImpl&> (forces.getImpl());
const BrookStreamImpl& forceStream = dynamic_cast<const BrookStreamImpl&> (forceStream.getImpl()); BrookStreamImpl& forceStream = const_cast<BrookStreamImpl&> (forceStreamC);
// first integration step // first integration step
kupdate_sd1_fix1( kupdate_sd1_fix1(
(float) getStochasticDynamicsAtomStreamWidth(), (float) getStochasticDynamicsAtomStreamWidth(),
(float) sdp->gvWidth, (float) brookRandomNumberGenerator.getRandomNumberStreamWidth(),
(float) sdp->gvOffset, (float) brookRandomNumberGenerator.getRvStreamOffset(),
derivedParameters[EM], derivedParameters[EM],
derivedParameters[Sd1pc1], derivedParameters[Sd1pc1],
derivedParameters[Sd1pc2], derivedParameters[Sd1pc2],
derivedParameters[Sd1pc3], derivedParameters[Sd1pc3],
getSDPC1Stream()->getBrookStream(), getSDPC1Stream()->getBrookStream(),
sdp->strVGauss[ sdp->gvCurStream ], brookRandomNumberGenerator.getRandomNumberStream( brookRandomNumberGenerator.getRvStreamIndex() )->getBrookStream(),
getSD2XStream()->getBrookStream(), getSD2XStream()->getBrookStream(),
positionStream.getBrookStream(), positionStream.getBrookStream(),
forceStream.getBrookStream(), forceStream.getBrookStream(),
...@@ -379,100 +382,104 @@ sdp->strVGauss[ sdp->gvCurStream ], ...@@ -379,100 +382,104 @@ sdp->strVGauss[ sdp->gvCurStream ],
getXPrimeStream()->getBrookStream() getXPrimeStream()->getBrookStream()
); );
AdvanceGVCursor( sdp, gpu, step ); // advance random number cursor
brookRandomNumberGenerator.advanceGVCursor( 2*getNumberOfAtoms() );
// first Shake step // first Shake step
kshakeh_fix1( kshakeh_fix1(
10.0f, 10.0f,
(float) getStochasticDynamicsAtomStreamWidth(), (float) getStochasticDynamicsAtomStreamWidth(),
brookShakeAlgorithm->getInverseHydrogenMass(), brookShakeAlgorithm.getInverseHydrogenMass(),
omega, omega,
brookShakeAlgorithm->getShakeAtomIndicesStream()->getBrookStream(), brookShakeAlgorithm.getShakeAtomIndicesStream()->getBrookStream(),
positionStream.getBrookStream(), positionStream.getBrookStream(),
getXPrimeStream()->getBrookStream(), getXPrimeStream()->getBrookStream(),
brookShakeAlgorithm->getShakeAtomParameterStream()->getBrookStream(), brookShakeAlgorithm.getShakeAtomParameterStream()->getBrookStream(),
brookShakeAlgorithm->getShakeXCons0Stream()->getBrookStream(), brookShakeAlgorithm.getShakeXCons0Stream()->getBrookStream(),
brookShakeAlgorithm->getShakeXCons1Stream()->getBrookStream(), brookShakeAlgorithm.getShakeXCons1Stream()->getBrookStream(),
brookShakeAlgorithm->getShakeXCons2Stream()->getBrookStream(), brookShakeAlgorithm.getShakeXCons2Stream()->getBrookStream(),
brookShakeAlgorithm->getShakeXCons3Stream()->getBrookStream() ); brookShakeAlgorithm.getShakeXCons3Stream()->getBrookStream() );
// first Shake gather // first Shake gather
kshakeh_update1_fix1( kshakeh_update1_fix1(
(float) getStochasticDynamicsAtomStreamWidth(), (float) getStochasticDynamicsAtomStreamWidth(),
derivedParameters[Sd2pc1], derivedParameters[Sd2pc1],
brookShakeAlgorithm->getShakeInverseMapStream()->getBrookStream(), brookShakeAlgorithm.getShakeInverseMapStream()->getBrookStream(),
positionStream.getBrookStream(), positionStream.getBrookStream(),
getXPrimeStream()->getBrookStream(), getXPrimeStream()->getBrookStream(),
getVPrimeStream()->getBrookStream(), getVPrimeStream()->getBrookStream(),
brookShakeAlgorithm->getShakeXCons0Stream()->getBrookStream(), brookShakeAlgorithm.getShakeXCons0Stream()->getBrookStream(),
brookShakeAlgorithm->getShakeXCons1Stream()->getBrookStream(), brookShakeAlgorithm.getShakeXCons1Stream()->getBrookStream(),
brookShakeAlgorithm->getShakeXCons2Stream()->getBrookStream(), brookShakeAlgorithm.getShakeXCons2Stream()->getBrookStream(),
brookShakeAlgorithm->getShakeXCons3Stream()->getBrookStream(), brookShakeAlgorithm.getShakeXCons3Stream()->getBrookStream(),
getXPrimeStream()->getBrookStream() ); getXPrimeStream()->getBrookStream() );
// second integration step // second integration step
kupdate_sd2_fix1( kupdate_sd2_fix1(
(float) getStochasticDynamicsAtomStreamWidth(), (float) getStochasticDynamicsAtomStreamWidth(),
(float) sdp->gvWidth, (float) brookRandomNumberGenerator.getRandomNumberStreamWidth(),
(float) sdp->gvOffset, (float) brookRandomNumberGenerator.getRvStreamOffset(),
derivedParameters[Sd2pc1], derivedParameters[Sd2pc1],
derivedParameters[Sd2pc2], derivedParameters[Sd2pc2],
getSDPC2Stream()->getBrookStream(), getSDPC2Stream()->getBrookStream(),
sdp->strVGauss[ sdp->gvCurStream ], brookRandomNumberGenerator.getRandomNumberStream( brookRandomNumberGenerator.getRvStreamIndex() )->getBrookStream(),
getSD1VStream()->getBrookStream(), getSD1VStream()->getBrookStream(),
positionStream.getBrookStream(), positionStream.getBrookStream(),
getXPrimeStream()->getBrookStream(), getXPrimeStream()->getBrookStream(),
getVPrimeStream()->getBrookStream(), getVPrimeStream()->getBrookStream(),
getS2XStream()->getBrookStream(), getSD2XStream()->getBrookStream(),
velocityStream.getBrookStream(), velocityStream.getBrookStream(),
getXPrimeStream()->getBrookStream() getXPrimeStream()->getBrookStream()
); );
AdvanceGVCursor( sdp, gpu, step ); // advance random number cursor
brookRandomNumberGenerator.advanceGVCursor( 2*getNumberOfAtoms() );
// second Shake step // second Shake step
kshakeh_fix1( kshakeh_fix1(
10.0f, 10.0f,
(float) getStochasticDynamicsAtomStreamWidth(), (float) getStochasticDynamicsAtomStreamWidth(),
brookShakeAlgorithm->getInverseHydrogenMass(), brookShakeAlgorithm.getInverseHydrogenMass(),
omega, omega,
brookShakeAlgorithm->getShakeAtomIndicesStream()->getBrookStream(), brookShakeAlgorithm.getShakeAtomIndicesStream()->getBrookStream(),
positionStream.getBrookStream(), positionStream.getBrookStream(),
getXPrimeStream()->getBrookStream(), getXPrimeStream()->getBrookStream(),
brookShakeAlgorithm->getShakeAtomParameterStream()->getBrookStream(), brookShakeAlgorithm.getShakeAtomParameterStream()->getBrookStream(),
brookShakeAlgorithm->getShakeXCons0Stream()->getBrookStream(), brookShakeAlgorithm.getShakeXCons0Stream()->getBrookStream(),
brookShakeAlgorithm->getShakeXCons1Stream()->getBrookStream(), brookShakeAlgorithm.getShakeXCons1Stream()->getBrookStream(),
brookShakeAlgorithm->getShakeXCons2Stream()->getBrookStream(), brookShakeAlgorithm.getShakeXCons2Stream()->getBrookStream(),
brookShakeAlgorithm->getShakeXCons3Stream()->getBrookStream() ); brookShakeAlgorithm.getShakeXCons3Stream()->getBrookStream() );
// second Shake gather // second Shake gather
kshakeh_update1_fix1( kshakeh_update1_fix1(
(float) getStochasticDynamicsAtomStreamWidth(), (float) getStochasticDynamicsAtomStreamWidth(),
derivedParameters[Sd2pc1], derivedParameters[Sd2pc1],
brookShakeAlgorithm->getShakeInverseMapStream()->getBrookStream(), brookShakeAlgorithm.getShakeInverseMapStream()->getBrookStream(),
positionStream.getBrookStream(), positionStream.getBrookStream(),
getXPrimeStream()->getBrookStream(), getXPrimeStream()->getBrookStream(),
getVPrimeStream()->getBrookStream(), getVPrimeStream()->getBrookStream(),
brookShakeAlgorithm->getShakeXCons0Stream()->getBrookStream(), brookShakeAlgorithm.getShakeXCons0Stream()->getBrookStream(),
brookShakeAlgorithm->getShakeXCons1Stream()->getBrookStream(), brookShakeAlgorithm.getShakeXCons1Stream()->getBrookStream(),
brookShakeAlgorithm->getShakeXCons2Stream()->getBrookStream(), brookShakeAlgorithm.getShakeXCons2Stream()->getBrookStream(),
brookShakeAlgorithm->getShakeXCons3Stream()->getBrookStream(), brookShakeAlgorithm.getShakeXCons3Stream()->getBrookStream(),
getXPrimeStream()->getBrookStream() ); getXPrimeStream()->getBrookStream() );
kshakeh_update2_fix1( kshakeh_update2_fix1(
(float) getStochasticDynamicsAtomStreamWidth(), (float) getStochasticDynamicsAtomStreamWidth(),
brookShakeAlgorithm->getShakeInverseMapStream()->getBrookStream(), brookShakeAlgorithm.getShakeInverseMapStream()->getBrookStream(),
positionStream.getBrookStream(), positionStream.getBrookStream(),
getXPrimeStream()->getBrookStream(), getXPrimeStream()->getBrookStream(),
brookShakeAlgorithm->getShakeXCons0Stream()->getBrookStream(), brookShakeAlgorithm.getShakeXCons0Stream()->getBrookStream(),
brookShakeAlgorithm->getShakeXCons1Stream()->getBrookStream(), brookShakeAlgorithm.getShakeXCons1Stream()->getBrookStream(),
brookShakeAlgorithm->getShakeXCons2Stream()->getBrookStream(), brookShakeAlgorithm.getShakeXCons2Stream()->getBrookStream(),
brookShakeAlgorithm->getShakeXCons3Stream()->getBrookStream(), brookShakeAlgorithm.getShakeXCons3Stream()->getBrookStream(),
positionStream.getBrookStream() ); positionStream.getBrookStream() );
return DefaultReturnValue; return DefaultReturnValue;
......
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include "BrookFloatStreamInternal.h" #include "BrookFloatStreamInternal.h"
#include "BrookShakeAlgorithm.h" #include "BrookShakeAlgorithm.h"
#include "BrookRandomNumberGenerator.h"
#include "BrookPlatform.h" #include "BrookPlatform.h"
#include "BrookCommon.h" #include "BrookCommon.h"
...@@ -152,13 +153,15 @@ class BrookStochasticDynamics : public BrookCommon { ...@@ -152,13 +153,15 @@ class BrookStochasticDynamics : public BrookCommon {
* @param velocities atom velocities * @param velocities atom velocities
* @param forces atom forces * @param forces atom forces
* @param brookShakeAlgorithm BrookShakeAlgorithm reference * @param brookShakeAlgorithm BrookShakeAlgorithm reference
* @param brookRandomNumberGenerator BrookRandomNumberGenerator reference
* *
* @return DefaultReturnValue * @return DefaultReturnValue
* *
*/ */
int update( Stream& positions, Stream& velocities, int update( Stream& positions, Stream& velocities,
const Stream& forces, BrookShakeAlgorithm& brookShakeAlgorithm ); const Stream& forces, BrookShakeAlgorithm& brookShakeAlgorithm,
BrookRandomNumberGenerator& brookRandomNumberGenerator );
/** /**
* Get array of StochasticDynamics streams * Get array of StochasticDynamics streams
* *
...@@ -227,6 +230,33 @@ class BrookStochasticDynamics : public BrookCommon { ...@@ -227,6 +230,33 @@ class BrookStochasticDynamics : public BrookCommon {
BrookFloatStreamInternal* getSD1VStream( void ) const; BrookFloatStreamInternal* getSD1VStream( void ) const;
/**
* Get V-prime stream
*
* @return V-prime stream
*
*/
BrookFloatStreamInternal* getVPrimeStream( void ) const;
/**
* Get X-prime stream
*
* @return X-prime stream
*
*/
BrookFloatStreamInternal* getXPrimeStream( void ) const;
/**
* Get inverse sqrt masses
*
* @return inverse sqrt masses stream
*
*/
BrookFloatStreamInternal* getInverseMassStream( void ) const;
private: private:
enum DerivedParameters { GDT, EPH, EMH, EP, EM, B, C, D, V, X, Yv, Yx, enum DerivedParameters { GDT, EPH, EMH, EP, EM, B, C, D, V, X, Yv, Yx,
...@@ -385,8 +415,6 @@ class BrookStochasticDynamics : public BrookCommon { ...@@ -385,8 +415,6 @@ class BrookStochasticDynamics : public BrookCommon {
int _setInverseSqrtMasses( const std::vector<double>& masses ); int _setInverseSqrtMasses( const std::vector<double>& masses );
}; };
} // namespace OpenMM } // namespace OpenMM
......
...@@ -56,7 +56,9 @@ BrookStreamFactory::BrookStreamFactory( void ){ ...@@ -56,7 +56,9 @@ BrookStreamFactory::BrookStreamFactory( void ){
// --------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------
_defaultDangleValue = 1.0e+38; _defaultDangleValue = 1.0e+38;
_defaultAtomStreamWidth = 32; _defaultAtomStreamWidth = DefaultStreamAtomWidth;
_defaultStreamRandomNumberWidth = DefaultStreamRandomNumberWidth;
_defaultStreamRandomNumberSize = DefaultStreamRandomNumberSize;
} }
...@@ -121,7 +123,111 @@ int BrookStreamFactory::setDefaultAtomStreamWidth( int atomStreamWidth ){ ...@@ -121,7 +123,111 @@ int BrookStreamFactory::setDefaultAtomStreamWidth( int atomStreamWidth ){
} }
/** /**
* get default dangle value * Get randomNumber stream width
*
* @return randomNumberStreamWidth
*
*/
int BrookStreamFactory::getDefaultRandomNumberStreamWidth( void ) const {
// ---------------------------------------------------------------------------------------
//static const std::string methodName = "BrookStreamFactory::getDefaultRandomNumberStreamWidth";
// ---------------------------------------------------------------------------------------
return _defaultStreamRandomNumberWidth;
}
/**
* Set randomNumber stream width
*
* @param randomNumberStreamWidth randomNumber stream width
*
* @return DefaultReturnValue
*
* @throw OpenMMException if randomNumberStreamWidth < 1
*
*/
int BrookStreamFactory::setDefaultRandomNumberStreamWidth( int randomNumberStreamWidth ){
// ---------------------------------------------------------------------------------------
static const std::string methodName = "BrookStreamFactory::setDefaultRandomNumberStreamWidth";
// ---------------------------------------------------------------------------------------
// validate randomNumber stream width
if( randomNumberStreamWidth < 1 ){
std::stringstream message;
message << methodName << " randomNumberStreamWidth=" << randomNumberStreamWidth << " is less than 1.";
throw OpenMMException( message.str() );
return ErrorReturnValue;
}
_defaultStreamRandomNumberWidth = randomNumberStreamWidth;
return DefaultReturnValue;
}
/*
* Get randomNumber stream size
*
* @return randomNumberStreamSize
*
*/
int BrookStreamFactory::getDefaultRandomNumberStreamSize( void ) const {
// ---------------------------------------------------------------------------------------
//static const std::string methodName = "BrookStreamFactory::getDefaultRandomNumberStreamSize";
// ---------------------------------------------------------------------------------------
return _defaultStreamRandomNumberSize;
}
/**
* Set randomNumber stream size
*
* @param randomNumberStreamSize randomNumber stream size
*
* @return DefaultReturnValue
*
* @throw OpenMMException if randomNumberStreamSize < 1
*
*/
int BrookStreamFactory::setDefaultRandomNumberStreamSize( int randomNumberStreamSize ){
// ---------------------------------------------------------------------------------------
static const std::string methodName = "BrookStreamFactory::setDefaultRandomNumberStreamSize";
// ---------------------------------------------------------------------------------------
// validate randomNumber stream size
if( randomNumberStreamSize < 1 ){
std::stringstream message;
message << methodName << " randomNumberStreamSize=" << randomNumberStreamSize << " is less than 1.";
throw OpenMMException( message.str() );
return ErrorReturnValue;
}
_defaultStreamRandomNumberSize = randomNumberStreamSize;
return DefaultReturnValue;
}
/**
* Get default dangle value
* *
* @return default dangle value * @return default dangle value
* *
......
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