Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
tsoc
openmm
Commits
39557436
"openmmapi/vscode:/vscode.git/clone" did not exist on "4ab645ea6911bf29e9ec6fd13b50ba1e196cbc40"
Commit
39557436
authored
Oct 27, 2008
by
Peter Eastman
Browse files
Created Cuda implementation of BrownianIntegrator
parent
62c4fd53
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
405 additions
and
50 deletions
+405
-50
platforms/cuda/src/CudaKernelFactory.cpp
platforms/cuda/src/CudaKernelFactory.cpp
+2
-2
platforms/cuda/src/CudaKernels.cpp
platforms/cuda/src/CudaKernels.cpp
+90
-9
platforms/cuda/src/CudaKernels.h
platforms/cuda/src/CudaKernels.h
+27
-33
platforms/cuda/src/CudaPlatform.cpp
platforms/cuda/src/CudaPlatform.cpp
+1
-1
platforms/cuda/tests/TestCudaBrownianIntegrator.cpp
platforms/cuda/tests/TestCudaBrownianIntegrator.cpp
+183
-0
platforms/cuda/tests/TestCudaRandom.cpp
platforms/cuda/tests/TestCudaRandom.cpp
+96
-0
platforms/reference/tests/TestReferenceBrownianIntegrator.cpp
...forms/reference/tests/TestReferenceBrownianIntegrator.cpp
+6
-5
No files found.
platforms/cuda/src/CudaKernelFactory.cpp
View file @
39557436
...
...
@@ -53,8 +53,8 @@ KernelImpl* CudaKernelFactory::createKernelImpl(std::string name, const Platform
// return new CudaIntegrateVerletStepKernel(name, platform);
if
(
name
==
IntegrateLangevinStepKernel
::
Name
())
return
new
CudaIntegrateLangevinStepKernel
(
name
,
platform
,
data
);
//
if (name == IntegrateBrownianStepKernel::Name())
//
return new CudaIntegrateBrownianStepKernel(name, platform);
if
(
name
==
IntegrateBrownianStepKernel
::
Name
())
return
new
CudaIntegrateBrownianStepKernel
(
name
,
platform
,
data
);
// if (name == ApplyAndersenThermostatKernel::Name())
// return new CudaApplyAndersenThermostatKernel(name, platform);
if
(
name
==
CalcKineticEnergyKernel
::
Name
())
...
...
platforms/cuda/src/CudaKernels.cpp
View file @
39557436
...
...
@@ -413,15 +413,96 @@ void CudaIntegrateLangevinStepKernel::execute(OpenMMContextImpl& context, const
kUpdatePart2
(
gpu
);
kApplySecondShake
(
gpu
);
}
//
//CudaIntegrateBrownianStepKernel::~CudaIntegrateBrownianStepKernel() {
//}
//
//void CudaIntegrateBrownianStepKernel::initialize(const System& system, const BrownianIntegrator& integrator) {
//}
//
//void CudaIntegrateBrownianStepKernel::execute(OpenMMContextImpl& context, const BrownianIntegrator& integrator) {
//}
CudaIntegrateBrownianStepKernel
::~
CudaIntegrateBrownianStepKernel
()
{
}
void
CudaIntegrateBrownianStepKernel
::
initialize
(
const
System
&
system
,
const
BrownianIntegrator
&
integrator
)
{
// Set masses.
_gpuContext
*
gpu
=
data
.
gpu
;
int
numParticles
=
system
.
getNumParticles
();
vector
<
float
>
mass
(
numParticles
);
for
(
int
i
=
0
;
i
<
numParticles
;
i
++
)
mass
[
i
]
=
(
float
)
system
.
getParticleMass
(
i
);
gpuSetMass
(
gpu
,
mass
);
// Set constraints.
int
numConstraints
=
system
.
getNumConstraints
();
vector
<
int
>
particle1
(
numConstraints
);
vector
<
int
>
particle2
(
numConstraints
);
vector
<
float
>
distance
(
numConstraints
);
vector
<
float
>
invMass1
(
numConstraints
);
vector
<
float
>
invMass2
(
numConstraints
);
for
(
int
i
=
0
;
i
<
numConstraints
;
i
++
)
{
int
particle1Index
,
particle2Index
;
double
constraintDistance
;
system
.
getConstraintParameters
(
i
,
particle1Index
,
particle2Index
,
constraintDistance
);
particle1
[
i
]
=
particle1Index
;
particle2
[
i
]
=
particle2Index
;
distance
[
i
]
=
(
float
)
constraintDistance
;
invMass1
[
i
]
=
1.0
f
/
mass
[
particle1Index
];
invMass2
[
i
]
=
1.0
f
/
mass
[
particle2Index
];
}
gpuSetShakeParameters
(
gpu
,
particle1
,
particle2
,
distance
,
invMass1
,
invMass2
);
// Initialize any terms that haven't already been handled by a Force.
if
(
!
data
.
hasBonds
)
gpuSetBondParameters
(
gpu
,
vector
<
int
>
(),
vector
<
int
>
(),
vector
<
float
>
(),
vector
<
float
>
());
if
(
!
data
.
hasAngles
)
gpuSetBondAngleParameters
(
gpu
,
vector
<
int
>
(),
vector
<
int
>
(),
vector
<
int
>
(),
vector
<
float
>
(),
vector
<
float
>
());
if
(
!
data
.
hasPeriodicTorsions
)
gpuSetDihedralParameters
(
gpu
,
vector
<
int
>
(),
vector
<
int
>
(),
vector
<
int
>
(),
vector
<
int
>
(),
vector
<
float
>
(),
vector
<
float
>
(),
vector
<
int
>
());
if
(
!
data
.
hasRB
)
gpuSetRbDihedralParameters
(
gpu
,
vector
<
int
>
(),
vector
<
int
>
(),
vector
<
int
>
(),
vector
<
int
>
(),
vector
<
float
>
(),
vector
<
float
>
(),
vector
<
float
>
(),
vector
<
float
>
(),
vector
<
float
>
(),
vector
<
float
>
());
if
(
!
data
.
hasNonbonded
)
{
gpuSetCoulombParameters
(
gpu
,
138.935485
f
,
vector
<
int
>
(),
vector
<
float
>
(),
vector
<
float
>
(),
vector
<
float
>
(),
vector
<
char
>
(),
vector
<
vector
<
int
>
>
());
gpuSetLJ14Parameters
(
gpu
,
138.935485
f
,
1.0
f
,
vector
<
int
>
(),
vector
<
int
>
(),
vector
<
float
>
(),
vector
<
float
>
(),
vector
<
float
>
(),
vector
<
float
>
());
}
// Finish initialization.
gpuBuildThreadBlockWorkList
(
gpu
);
gpuBuildExclusionList
(
gpu
);
gpuBuildOutputBuffers
(
gpu
);
gpuSetConstants
(
gpu
);
kCalculateObcGbsaBornSum
(
gpu
);
kReduceObcGbsaBornSum
(
gpu
);
kClearBornForces
(
gpu
);
kClearForces
(
gpu
);
cudaThreadSynchronize
();
prevStepSize
=
-
1.0
;
}
void
CudaIntegrateBrownianStepKernel
::
execute
(
OpenMMContextImpl
&
context
,
const
BrownianIntegrator
&
integrator
)
{
_gpuContext
*
gpu
=
data
.
gpu
;
double
temperature
=
integrator
.
getTemperature
();
double
friction
=
integrator
.
getFriction
();
double
stepSize
=
integrator
.
getStepSize
();
if
(
temperature
!=
prevTemp
||
friction
!=
prevFriction
||
stepSize
!=
prevStepSize
)
{
// Initialize the GPU parameters.
double
tau
=
(
friction
==
0.0
?
0.0
:
1.0
/
friction
);
gpuSetBrownianIntegrationParameters
(
gpu
,
tau
,
stepSize
,
temperature
);
gpuSetConstants
(
gpu
);
kGenerateRandoms
(
gpu
);
prevTemp
=
temperature
;
prevFriction
=
friction
;
prevStepSize
=
stepSize
;
}
kBrownianUpdatePart1
(
gpu
);
kApplyFirstShake
(
gpu
);
if
(
data
.
removeCM
)
{
int
step
=
context
.
getTime
()
/
stepSize
;
if
(
step
%
data
.
cmMotionFrequency
==
0
)
gpu
->
bCalculateCM
=
true
;
}
kBrownianUpdatePart2
(
gpu
);
}
//
//CudaApplyAndersenThermostatKernel::~CudaApplyAndersenThermostatKernel() {
//}
...
...
platforms/cuda/src/CudaKernels.h
View file @
39557436
...
...
@@ -310,39 +310,33 @@ private:
CudaPlatform
::
PlatformData
&
data
;
double
prevTemp
,
prevFriction
,
prevStepSize
;
};
//
///**
// * This kernel is invoked by BrownianIntegrator to take one time step.
// */
//class CudaIntegrateBrownianStepKernel : public IntegrateBrownianStepKernel {
//public:
// CudaIntegrateBrownianStepKernel(std::string name, const Platform& platform) : IntegrateBrownianStepKernel(name, platform),
// dynamics(0), shake(0), masses(0), shakeParameters(0), constraintIndices(0) {
// }
// ~CudaIntegrateBrownianStepKernel();
// /**
// * Initialize the kernel.
// *
// * @param system the System this kernel will be applied to
// * @param integrator the BrownianIntegrator this kernel will be used for
// */
// void initialize(const System& system, const BrownianIntegrator& integrator);
// /**
// * Execute the kernel.
// *
// * @param context the context in which to execute this kernel
// * @param integrator the BrownianIntegrator this kernel is being used for
// */
// void execute(OpenMMContextImpl& context, const BrownianIntegrator& integrator);
//private:
// CudaBrownianDynamics* dynamics;
// CudaShakeAlgorithm* shake;
// RealOpenMM* masses;
// RealOpenMM** shakeParameters;
// int** constraintIndices;
// int numConstraints;
// double prevTemp, prevFriction, prevStepSize;
//};
/**
* This kernel is invoked by BrownianIntegrator to take one time step.
*/
class
CudaIntegrateBrownianStepKernel
:
public
IntegrateBrownianStepKernel
{
public:
CudaIntegrateBrownianStepKernel
(
std
::
string
name
,
const
Platform
&
platform
,
CudaPlatform
::
PlatformData
&
data
)
:
IntegrateBrownianStepKernel
(
name
,
platform
),
data
(
data
)
{
}
~
CudaIntegrateBrownianStepKernel
();
/**
* Initialize the kernel.
*
* @param system the System this kernel will be applied to
* @param integrator the BrownianIntegrator this kernel will be used for
*/
void
initialize
(
const
System
&
system
,
const
BrownianIntegrator
&
integrator
);
/**
* Execute the kernel.
*
* @param context the context in which to execute this kernel
* @param integrator the BrownianIntegrator this kernel is being used for
*/
void
execute
(
OpenMMContextImpl
&
context
,
const
BrownianIntegrator
&
integrator
);
private:
CudaPlatform
::
PlatformData
&
data
;
double
prevTemp
,
prevFriction
,
prevStepSize
;
};
//
///**
// * This kernel is invoked by AndersenThermostat at the start of each time step to adjust the particle velocities.
...
...
platforms/cuda/src/CudaPlatform.cpp
View file @
39557436
...
...
@@ -48,7 +48,7 @@ CudaPlatform::CudaPlatform() {
registerKernelFactory
(
CalcGBSAOBCForceFieldKernel
::
Name
(),
factory
);
// registerKernelFactory(IntegrateVerletStepKernel::Name(), factory);
registerKernelFactory
(
IntegrateLangevinStepKernel
::
Name
(),
factory
);
//
registerKernelFactory(IntegrateBrownianStepKernel::Name(), factory);
registerKernelFactory
(
IntegrateBrownianStepKernel
::
Name
(),
factory
);
// registerKernelFactory(ApplyAndersenThermostatKernel::Name(), factory);
registerKernelFactory
(
CalcKineticEnergyKernel
::
Name
(),
factory
);
registerKernelFactory
(
RemoveCMMotionKernel
::
Name
(),
factory
);
...
...
platforms/cuda/tests/TestCudaBrownianIntegrator.cpp
0 → 100644
View file @
39557436
/* -------------------------------------------------------------------------- *
* OpenMM *
* -------------------------------------------------------------------------- *
* This is part of the OpenMM molecular simulation toolkit originating from *
* Simbios, the NIH National Center for Physics-Based Simulation of *
* Biological Structures at Stanford, funded under the NIH Roadmap for *
* Medical Research, grant U54 GM072970. See https://simtk.org. *
* *
* Portions copyright (c) 2008 Stanford University and the Authors. *
* Authors: Peter Eastman *
* Contributors: *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the "Software"), *
* to deal in the Software without restriction, including without limitation *
* the rights to use, copy, modify, merge, publish, distribute, sublicense, *
* and/or sell copies of the Software, and to permit persons to whom the *
* Software is furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included in *
* all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
* THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *
* USE OR OTHER DEALINGS IN THE SOFTWARE. *
* -------------------------------------------------------------------------- */
#include "System.h"
/**
* This tests the Cuda implementation of BrownianIntegrator.
*/
#include "../../../tests/AssertionUtilities.h"
#include "OpenMMContext.h"
#include "CudaPlatform.h"
#include "HarmonicBondForce.h"
#include "NonbondedForce.h"
#include "System.h"
#include "BrownianIntegrator.h"
#include "../src/SimTKUtilities/SimTKOpenMMRealType.h"
#include "../src/sfmt/SFMT.h"
#include <iostream>
#include <vector>
using
namespace
OpenMM
;
using
namespace
std
;
const
double
TOL
=
1e-5
;
void
testSingleBond
()
{
CudaPlatform
platform
;
System
system
(
2
,
0
);
system
.
setParticleMass
(
0
,
2.0
);
system
.
setParticleMass
(
1
,
2.0
);
double
dt
=
0.01
;
BrownianIntegrator
integrator
(
0
,
0.1
,
dt
);
HarmonicBondForce
*
forceField
=
new
HarmonicBondForce
(
1
);
forceField
->
setBondParameters
(
0
,
0
,
1
,
1.5
,
1
);
system
.
addForce
(
forceField
);
OpenMMContext
context
(
system
,
integrator
,
platform
);
vector
<
Vec3
>
positions
(
2
);
positions
[
0
]
=
Vec3
(
-
1
,
0
,
0
);
positions
[
1
]
=
Vec3
(
1
,
0
,
0
);
context
.
setPositions
(
positions
);
// This is simply an overdamped harmonic oscillator, so compare it to the analytical solution.
double
rate
=
2
*
1.0
/
0.1
;
for
(
int
i
=
0
;
i
<
1000
;
++
i
)
{
State
state
=
context
.
getState
(
State
::
Positions
|
State
::
Velocities
);
double
time
=
state
.
getTime
();
double
expectedDist
=
1.5
+
0.5
*
std
::
exp
(
-
rate
*
time
);
ASSERT_EQUAL_VEC
(
Vec3
(
-
0.5
*
expectedDist
,
0
,
0
),
state
.
getPositions
()[
0
],
0.02
);
ASSERT_EQUAL_VEC
(
Vec3
(
0.5
*
expectedDist
,
0
,
0
),
state
.
getPositions
()[
1
],
0.02
);
if
(
i
>
0
)
{
double
expectedSpeed
=
-
0.5
*
rate
*
std
::
exp
(
-
rate
*
(
time
-
0.5
*
dt
));
ASSERT_EQUAL_VEC
(
Vec3
(
-
0.5
*
expectedSpeed
,
0
,
0
),
state
.
getVelocities
()[
0
],
0.11
);
ASSERT_EQUAL_VEC
(
Vec3
(
0.5
*
expectedSpeed
,
0
,
0
),
state
.
getVelocities
()[
1
],
0.11
);
}
integrator
.
step
(
1
);
}
}
void
testTemperature
()
{
const
int
numParticles
=
8
;
const
int
numBonds
=
numParticles
-
1
;
const
double
temp
=
100.0
;
CudaPlatform
platform
;
System
system
(
numParticles
,
0
);
BrownianIntegrator
integrator
(
temp
,
2.0
,
0.01
);
HarmonicBondForce
*
forceField
=
new
HarmonicBondForce
(
numBonds
);
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
system
.
setParticleMass
(
i
,
2.0
);
for
(
int
i
=
0
;
i
<
numBonds
;
++
i
)
forceField
->
setBondParameters
(
i
,
i
,
i
+
1
,
1.0
,
i
+
1
);
system
.
addForce
(
forceField
);
OpenMMContext
context
(
system
,
integrator
,
platform
);
vector
<
Vec3
>
positions
(
numParticles
);
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
positions
[
i
]
=
Vec3
(
i
,
0
,
0
);
context
.
setPositions
(
positions
);
// Let it equilibrate.
integrator
.
step
(
1000
);
// Now run it for a while and see if the temperature is correct.
double
pe
=
0.0
;
const
int
steps
=
10000
;
for
(
int
i
=
0
;
i
<
steps
;
++
i
)
{
State
state
=
context
.
getState
(
State
::
Energy
);
pe
+=
state
.
getPotentialEnergy
();
integrator
.
step
(
1
);
}
pe
/=
steps
;
double
expected
=
0.5
*
numBonds
*
BOLTZ
*
temp
;
expected
*=
sqrt
(
2.0
);
ASSERT_EQUAL_TOL
(
expected
,
pe
,
4
*
expected
/
std
::
sqrt
(
steps
));
}
void
testConstraints
()
{
const
int
numParticles
=
8
;
const
int
numConstraints
=
numParticles
/
2
;
const
double
temp
=
20.0
;
CudaPlatform
platform
;
System
system
(
numParticles
,
numConstraints
);
BrownianIntegrator
integrator
(
temp
,
2.0
,
0.001
);
NonbondedForce
*
forceField
=
new
NonbondedForce
(
numParticles
,
0
);
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
{
system
.
setParticleMass
(
i
,
10.0
);
forceField
->
setParticleParameters
(
i
,
(
i
%
2
==
0
?
0.2
:
-
0.2
),
0.5
,
5.0
);
}
for
(
int
i
=
0
;
i
<
numConstraints
;
++
i
)
system
.
setConstraintParameters
(
i
,
2
*
i
,
2
*
i
+
1
,
1.0
);
system
.
addForce
(
forceField
);
OpenMMContext
context
(
system
,
integrator
,
platform
);
vector
<
Vec3
>
positions
(
numParticles
);
vector
<
Vec3
>
velocities
(
numParticles
);
init_gen_rand
(
0
);
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
{
positions
[
i
]
=
Vec3
(
i
,
0
,
0
);
velocities
[
i
]
=
Vec3
(
genrand_real2
()
-
0.5
,
genrand_real2
()
-
0.5
,
genrand_real2
()
-
0.5
);
}
context
.
setPositions
(
positions
);
context
.
setVelocities
(
velocities
);
// Simulate it and see whether the constraints remain satisfied.
for
(
int
i
=
0
;
i
<
1000
;
++
i
)
{
State
state
=
context
.
getState
(
State
::
Positions
);
for
(
int
j
=
0
;
j
<
numConstraints
;
++
j
)
{
int
particle1
,
particle2
;
double
distance
;
system
.
getConstraintParameters
(
j
,
particle1
,
particle2
,
distance
);
Vec3
p1
=
state
.
getPositions
()[
particle1
];
Vec3
p2
=
state
.
getPositions
()[
particle2
];
double
dist
=
std
::
sqrt
((
p1
[
0
]
-
p2
[
0
])
*
(
p1
[
0
]
-
p2
[
0
])
+
(
p1
[
1
]
-
p2
[
1
])
*
(
p1
[
1
]
-
p2
[
1
])
+
(
p1
[
2
]
-
p2
[
2
])
*
(
p1
[
2
]
-
p2
[
2
]));
ASSERT_EQUAL_TOL
(
distance
,
dist
,
2e-4
);
}
integrator
.
step
(
1
);
}
}
int
main
()
{
try
{
testSingleBond
();
testTemperature
();
testConstraints
();
}
catch
(
const
exception
&
e
)
{
cout
<<
"exception: "
<<
e
.
what
()
<<
endl
;
return
1
;
}
cout
<<
"Done"
<<
endl
;
return
0
;
}
platforms/cuda/tests/TestCudaRandom.cpp
0 → 100644
View file @
39557436
/* -------------------------------------------------------------------------- *
* OpenMM *
* -------------------------------------------------------------------------- *
* This is part of the OpenMM molecular simulation toolkit originating from *
* Simbios, the NIH National Center for Physics-Based Simulation of *
* Biological Structures at Stanford, funded under the NIH Roadmap for *
* Medical Research, grant U54 GM072970. See https://simtk.org. *
* *
* Portions copyright (c) 2008 Stanford University and the Authors. *
* Authors: Peter Eastman *
* Contributors: *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the "Software"), *
* to deal in the Software without restriction, including without limitation *
* the rights to use, copy, modify, merge, publish, distribute, sublicense, *
* and/or sell copies of the Software, and to permit persons to whom the *
* Software is furnished to do so, subject to the following conditions: *
* *
* The above copyright notice and this permission notice shall be included in *
* all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
* THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *
* USE OR OTHER DEALINGS IN THE SOFTWARE. *
* -------------------------------------------------------------------------- */
/**
* This tests the Cuda implementation of random number generation.
*/
#include "../../../tests/AssertionUtilities.h"
#include "../src/kernels/gpuTypes.h"
#include "../src/kernels/cudaKernels.h"
#include <iostream>
using
namespace
OpenMM
;
using
namespace
std
;
static
const
float
KILO
=
1e3
;
// Thousand
static
const
float
BOLTZMANN
=
1.380658e-23
f
;
// (J/K)
static
const
float
AVOGADRO
=
6.0221367e23
f
;
// ()
static
const
float
RGAS
=
BOLTZMANN
*
AVOGADRO
;
// (J/(mol K))
static
const
float
BOLTZ
=
(
RGAS
/
KILO
);
// (kJ/(mol K))
void
testGaussian
()
{
_gpuContext
*
gpu
=
(
_gpuContext
*
)
gpuInit
(
1000
);
gpu
->
sim
.
Yv
=
1.0
;
gpu
->
sim
.
Yx
=
1.0
;
gpu
->
sim
.
V
=
1.0
;
gpu
->
sim
.
X
=
1.0
;
gpuSetConstants
(
gpu
);
kGenerateRandoms
(
gpu
);
const
int
numValues
=
4
*
gpu
->
psRandom4
->
_length
;
gpu
->
psRandom4
->
Download
();
float
*
data
=
reinterpret_cast
<
float
*>
(
gpu
->
psRandom4
->
_pSysData
);
double
mean
=
0.0
;
double
var
=
0.0
;
double
skew
=
0.0
;
double
kurtosis
=
0.0
;
for
(
int
i
=
0
;
i
<
numValues
;
i
++
)
{
double
value
=
data
[
i
];
mean
+=
value
;
var
+=
value
*
value
;
skew
+=
value
*
value
*
value
;
kurtosis
+=
value
*
value
*
value
*
value
;
}
gpuShutDown
(
gpu
);
mean
/=
numValues
;
var
/=
numValues
;
skew
/=
numValues
;
kurtosis
/=
numValues
;
double
c2
=
var
-
mean
*
mean
;
double
c3
=
skew
-
3
*
var
*
mean
+
2
*
mean
*
mean
*
mean
;
double
c4
=
kurtosis
-
4
*
skew
*
mean
-
3
*
var
*
var
+
12
*
var
*
mean
*
mean
-
6
*
mean
*
mean
*
mean
*
mean
;
ASSERT_EQUAL_TOL
(
0.0
,
mean
,
0.01
);
ASSERT_EQUAL_TOL
(
1.0
,
c2
,
0.01
);
ASSERT_EQUAL_TOL
(
0.0
,
c3
,
0.01
);
ASSERT_EQUAL_TOL
(
0.0
,
c4
,
0.01
);
}
int
main
()
{
try
{
testGaussian
();
}
catch
(
const
exception
&
e
)
{
cout
<<
"exception: "
<<
e
.
what
()
<<
endl
;
return
1
;
}
cout
<<
"Done"
<<
endl
;
return
0
;
}
platforms/reference/tests/TestReferenceBrownianIntegrator.cpp
View file @
39557436
...
...
@@ -94,10 +94,9 @@ void testTemperature() {
HarmonicBondForce
*
forceField
=
new
HarmonicBondForce
(
numBonds
);
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
{
system
.
setParticleMass
(
i
,
2.0
);
// forceField->setParticleParameters(i, (i%2 == 0 ? 1.0 : -1.0), 1.0, 5.0);
}
for
(
int
i
=
0
;
i
<
numBonds
;
++
i
)
forceField
->
setBondParameters
(
i
,
i
,
i
+
1
,
1.0
,
i
);
forceField
->
setBondParameters
(
i
,
i
,
i
+
1
,
1.0
,
i
+
1
);
system
.
addForce
(
forceField
);
OpenMMContext
context
(
system
,
integrator
,
platform
);
vector
<
Vec3
>
positions
(
numParticles
);
...
...
@@ -112,14 +111,16 @@ void testTemperature() {
// Now run it for a while and see if the temperature is correct.
double
pe
=
0.0
;
for
(
int
i
=
0
;
i
<
1000
;
++
i
)
{
const
int
steps
=
50000
;
for
(
int
i
=
0
;
i
<
steps
;
++
i
)
{
State
state
=
context
.
getState
(
State
::
Energy
);
pe
+=
state
.
getPotentialEnergy
();
integrator
.
step
(
1
);
}
pe
/=
1000
;
pe
/=
steps
;
double
expected
=
0.5
*
numBonds
*
BOLTZ
*
temp
;
ASSERT_EQUAL_TOL
(
expected
,
pe
,
3
*
expected
/
std
::
sqrt
(
1000.0
));
expected
*=
sqrt
(
2.0
);
ASSERT_EQUAL_TOL
(
expected
,
pe
,
4
*
expected
/
std
::
sqrt
(
steps
));
}
void
testConstraints
()
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment