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
29e3fa57
Commit
29e3fa57
authored
Apr 17, 2009
by
Peter Eastman
Browse files
Redesigned the API for specifying exclusions and 1-4 interactions.
parent
afd06645
Changes
34
Show whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
236 additions
and
325 deletions
+236
-325
platforms/cuda/tests/TestCudaNonbondedForce.cpp
platforms/cuda/tests/TestCudaNonbondedForce.cpp
+68
-48
platforms/cuda/tests/TestCudaSettle.cpp
platforms/cuda/tests/TestCudaSettle.cpp
+4
-4
platforms/cuda/tests/TestCudaVerletIntegrator.cpp
platforms/cuda/tests/TestCudaVerletIntegrator.cpp
+2
-2
platforms/reference/src/ReferenceKernels.cpp
platforms/reference/src/ReferenceKernels.cpp
+20
-3
platforms/reference/src/ReferenceKernels.h
platforms/reference/src/ReferenceKernels.h
+1
-4
platforms/reference/tests/TestReferenceAndersenThermostat.cpp
...forms/reference/tests/TestReferenceAndersenThermostat.cpp
+4
-4
platforms/reference/tests/TestReferenceBrownianIntegrator.cpp
...forms/reference/tests/TestReferenceBrownianIntegrator.cpp
+4
-4
platforms/reference/tests/TestReferenceCMMotionRemover.cpp
platforms/reference/tests/TestReferenceCMMotionRemover.cpp
+2
-2
platforms/reference/tests/TestReferenceEwald.cpp
platforms/reference/tests/TestReferenceEwald.cpp
+3
-3
platforms/reference/tests/TestReferenceGBSAOBCForce.cpp
platforms/reference/tests/TestReferenceGBSAOBCForce.cpp
+3
-3
platforms/reference/tests/TestReferenceLangevinIntegrator.cpp
...forms/reference/tests/TestReferenceLangevinIntegrator.cpp
+6
-6
platforms/reference/tests/TestReferenceNonbondedForce.cpp
platforms/reference/tests/TestReferenceNonbondedForce.cpp
+61
-39
platforms/reference/tests/TestReferenceVerletIntegrator.cpp
platforms/reference/tests/TestReferenceVerletIntegrator.cpp
+2
-2
tests/TestFindExclusions.cpp
tests/TestFindExclusions.cpp
+56
-201
No files found.
platforms/cuda/tests/TestCudaNonbondedForce.cpp
View file @
29e3fa57
...
...
@@ -58,9 +58,9 @@ void testCoulomb() {
CudaPlatform
platform
;
System
system
(
2
,
0
);
LangevinIntegrator
integrator
(
0.0
,
0.1
,
0.01
);
NonbondedForce
*
forceField
=
new
NonbondedForce
(
2
,
0
);
forceField
->
set
Particle
Parameters
(
0
,
0.5
,
1
,
0
);
forceField
->
set
Particle
Parameters
(
1
,
-
1.5
,
1
,
0
);
NonbondedForce
*
forceField
=
new
NonbondedForce
();
forceField
->
add
Particle
(
0.5
,
1
,
0
);
forceField
->
add
Particle
(
-
1.5
,
1
,
0
);
system
.
addForce
(
forceField
);
OpenMMContext
context
(
system
,
integrator
,
platform
);
vector
<
Vec3
>
positions
(
2
);
...
...
@@ -79,9 +79,9 @@ void testLJ() {
CudaPlatform
platform
;
System
system
(
2
,
0
);
LangevinIntegrator
integrator
(
0.0
,
0.1
,
0.01
);
NonbondedForce
*
forceField
=
new
NonbondedForce
(
2
,
0
);
forceField
->
set
Particle
Parameters
(
0
,
0
,
1.2
,
1
);
forceField
->
set
Particle
Parameters
(
1
,
0
,
1.4
,
2
);
NonbondedForce
*
forceField
=
new
NonbondedForce
();
forceField
->
add
Particle
(
0
,
1.2
,
1
);
forceField
->
add
Particle
(
0
,
1.4
,
2
);
system
.
addForce
(
forceField
);
OpenMMContext
context
(
system
,
integrator
,
platform
);
vector
<
Vec3
>
positions
(
2
);
...
...
@@ -102,13 +102,25 @@ void testExclusionsAnd14() {
CudaPlatform
platform
;
System
system
(
5
,
0
);
LangevinIntegrator
integrator
(
0.0
,
0.1
,
0.01
);
HarmonicBondForce
*
bonds
=
new
HarmonicBondForce
(
4
);
bonds
->
setBondParameters
(
0
,
0
,
1
,
1
,
0
);
bonds
->
setBondParameters
(
1
,
1
,
2
,
1
,
0
);
bonds
->
setBondParameters
(
2
,
2
,
3
,
1
,
0
);
bonds
->
setBondParameters
(
3
,
3
,
4
,
1
,
0
);
system
.
addForce
(
bonds
);
NonbondedForce
*
nonbonded
=
new
NonbondedForce
(
5
,
2
);
NonbondedForce
*
nonbonded
=
new
NonbondedForce
();
for
(
int
i
=
0
;
i
<
5
;
++
i
)
nonbonded
->
addParticle
(
0
,
1.5
,
0
);
vector
<
pair
<
int
,
int
>
>
bonds
;
bonds
.
push_back
(
pair
<
int
,
int
>
(
0
,
1
));
bonds
.
push_back
(
pair
<
int
,
int
>
(
1
,
2
));
bonds
.
push_back
(
pair
<
int
,
int
>
(
2
,
3
));
bonds
.
push_back
(
pair
<
int
,
int
>
(
3
,
4
));
nonbonded
->
createExceptionsFromBonds
(
bonds
,
0.0
,
0.0
);
int
first14
,
second14
;
for
(
int
i
=
0
;
i
<
nonbonded
->
getNumExceptions
();
i
++
)
{
int
particle1
,
particle2
;
double
chargeProd
,
sigma
,
epsilon
;
nonbonded
->
getExceptionParameters
(
i
,
particle1
,
particle2
,
chargeProd
,
sigma
,
epsilon
);
if
((
particle1
==
0
&&
particle2
==
3
)
||
(
particle1
==
3
&&
particle2
==
0
))
first14
=
i
;
if
((
particle1
==
1
&&
particle2
==
4
)
||
(
particle1
==
4
&&
particle2
==
1
))
second14
=
i
;
}
system
.
addForce
(
nonbonded
);
for
(
int
i
=
1
;
i
<
5
;
++
i
)
{
...
...
@@ -122,8 +134,8 @@ void testExclusionsAnd14() {
}
nonbonded
->
setParticleParameters
(
0
,
0
,
1.5
,
1
);
nonbonded
->
setParticleParameters
(
i
,
0
,
1.5
,
1
);
nonbonded
->
set
Nonbonded14
Parameters
(
0
,
0
,
3
,
0
,
1.5
,
i
==
3
?
0.5
:
0.0
);
nonbonded
->
set
Nonbonded14
Parameters
(
1
,
1
,
4
,
0
,
1.5
,
0.0
);
nonbonded
->
set
Exception
Parameters
(
first14
,
0
,
3
,
0
,
1.5
,
i
==
3
?
0.5
:
0.0
);
nonbonded
->
set
Exception
Parameters
(
second14
,
1
,
4
,
0
,
1.5
,
0.0
);
positions
[
i
]
=
Vec3
(
r
,
0
,
0
);
OpenMMContext
context
(
system
,
integrator
,
platform
);
context
.
setPositions
(
positions
);
...
...
@@ -149,8 +161,8 @@ void testExclusionsAnd14() {
nonbonded
->
setParticleParameters
(
0
,
2
,
1.5
,
0
);
nonbonded
->
setParticleParameters
(
i
,
2
,
1.5
,
0
);
nonbonded
->
set
Nonbonded14
Parameters
(
0
,
0
,
3
,
i
==
3
?
4
/
1.2
:
0
,
1.5
,
0
);
nonbonded
->
set
Nonbonded14
Parameters
(
1
,
1
,
4
,
0
,
1.5
,
0
);
nonbonded
->
set
Exception
Parameters
(
first14
,
0
,
3
,
i
==
3
?
4
/
1.2
:
0
,
1.5
,
0
);
nonbonded
->
set
Exception
Parameters
(
second14
,
1
,
4
,
0
,
1.5
,
0
);
OpenMMContext
context2
(
system
,
integrator
,
platform
);
context2
.
setPositions
(
positions
);
state
=
context2
.
getState
(
State
::
Forces
|
State
::
Energy
);
...
...
@@ -175,10 +187,10 @@ void testCutoff() {
CudaPlatform
platform
;
System
system
(
3
,
0
);
LangevinIntegrator
integrator
(
0.0
,
0.1
,
0.01
);
NonbondedForce
*
forceField
=
new
NonbondedForce
(
3
,
0
);
forceField
->
set
Particle
Parameters
(
0
,
1.0
,
1
,
0
);
forceField
->
set
Particle
Parameters
(
1
,
1.0
,
1
,
0
);
forceField
->
set
Particle
Parameters
(
2
,
1.0
,
1
,
0
);
NonbondedForce
*
forceField
=
new
NonbondedForce
();
forceField
->
add
Particle
(
1.0
,
1
,
0
);
forceField
->
add
Particle
(
1.0
,
1
,
0
);
forceField
->
add
Particle
(
1.0
,
1
,
0
);
forceField
->
setNonbondedMethod
(
NonbondedForce
::
CutoffNonPeriodic
);
const
double
cutoff
=
2.9
;
forceField
->
setCutoffDistance
(
cutoff
);
...
...
@@ -208,18 +220,28 @@ void testCutoff14() {
CudaPlatform
platform
;
System
system
(
5
,
0
);
LangevinIntegrator
integrator
(
0.0
,
0.1
,
0.01
);
HarmonicBondForce
*
bonds
=
new
HarmonicBondForce
(
4
);
bonds
->
setBondParameters
(
0
,
0
,
1
,
1
,
0
);
bonds
->
setBondParameters
(
1
,
1
,
2
,
1
,
0
);
bonds
->
setBondParameters
(
2
,
2
,
3
,
1
,
0
);
bonds
->
setBondParameters
(
3
,
3
,
4
,
1
,
0
);
system
.
addForce
(
bonds
);
NonbondedForce
*
nonbonded
=
new
NonbondedForce
(
5
,
2
);
NonbondedForce
*
nonbonded
=
new
NonbondedForce
();
nonbonded
->
setNonbondedMethod
(
NonbondedForce
::
CutoffNonPeriodic
);
nonbonded
->
setNonbonded14Parameters
(
0
,
0
,
3
,
0
,
1.5
,
0.0
);
nonbonded
->
setNonbonded14Parameters
(
1
,
1
,
4
,
0
,
1.5
,
0.
0
);
for
(
int
i
=
0
;
i
<
5
;
++
i
)
nonbonded
->
addParticle
(
0
,
1.5
,
0
);
const
double
cutoff
=
3.5
;
nonbonded
->
setCutoffDistance
(
cutoff
);
vector
<
pair
<
int
,
int
>
>
bonds
;
bonds
.
push_back
(
pair
<
int
,
int
>
(
0
,
1
));
bonds
.
push_back
(
pair
<
int
,
int
>
(
1
,
2
));
bonds
.
push_back
(
pair
<
int
,
int
>
(
2
,
3
));
bonds
.
push_back
(
pair
<
int
,
int
>
(
3
,
4
));
nonbonded
->
createExceptionsFromBonds
(
bonds
,
0.0
,
0.0
);
int
first14
,
second14
;
for
(
int
i
=
0
;
i
<
nonbonded
->
getNumExceptions
();
i
++
)
{
int
particle1
,
particle2
;
double
chargeProd
,
sigma
,
epsilon
;
nonbonded
->
getExceptionParameters
(
i
,
particle1
,
particle2
,
chargeProd
,
sigma
,
epsilon
);
if
((
particle1
==
0
&&
particle2
==
3
)
||
(
particle1
==
3
&&
particle2
==
0
))
first14
=
i
;
if
((
particle1
==
1
&&
particle2
==
4
)
||
(
particle1
==
4
&&
particle2
==
1
))
second14
=
i
;
}
system
.
addForce
(
nonbonded
);
OpenMMContext
context
(
system
,
integrator
,
platform
);
vector
<
Vec3
>
positions
(
5
);
...
...
@@ -236,8 +258,8 @@ void testCutoff14() {
for
(
int
j
=
1
;
j
<
5
;
++
j
)
nonbonded
->
setParticleParameters
(
j
,
0
,
1.5
,
0
);
nonbonded
->
setParticleParameters
(
i
,
0
,
1.5
,
1
);
nonbonded
->
set
Nonbonded14
Parameters
(
0
,
0
,
3
,
0
,
1.5
,
i
==
3
?
0.5
:
0.0
);
nonbonded
->
set
Nonbonded14
Parameters
(
1
,
1
,
4
,
0
,
1.5
,
0.0
);
nonbonded
->
set
Exception
Parameters
(
first14
,
0
,
3
,
0
,
1.5
,
i
==
3
?
0.5
:
0.0
);
nonbonded
->
set
Exception
Parameters
(
second14
,
1
,
4
,
0
,
1.5
,
0.0
);
context
.
reinitialize
();
context
.
setPositions
(
positions
);
State
state
=
context
.
getState
(
State
::
Forces
|
State
::
Energy
);
...
...
@@ -264,8 +286,8 @@ void testCutoff14() {
const
double
q
=
0.7
;
nonbonded
->
setParticleParameters
(
0
,
q
,
1.5
,
0
);
nonbonded
->
setParticleParameters
(
i
,
q
,
1.5
,
0
);
nonbonded
->
set
Nonbonded14
Parameters
(
0
,
0
,
3
,
i
==
3
?
q
*
q
/
1.2
:
0
,
1.5
,
0
);
nonbonded
->
set
Nonbonded14
Parameters
(
1
,
1
,
4
,
0
,
1.5
,
0
);
nonbonded
->
set
Exception
Parameters
(
first14
,
0
,
3
,
i
==
3
?
q
*
q
/
1.2
:
0
,
1.5
,
0
);
nonbonded
->
set
Exception
Parameters
(
second14
,
1
,
4
,
0
,
1.5
,
0
);
context
.
reinitialize
();
context
.
setPositions
(
positions
);
state
=
context
.
getState
(
State
::
Forces
|
State
::
Energy
);
...
...
@@ -293,13 +315,11 @@ void testPeriodic() {
CudaPlatform
platform
;
System
system
(
3
,
0
);
LangevinIntegrator
integrator
(
0.0
,
0.1
,
0.01
);
HarmonicBondForce
*
bonds
=
new
HarmonicBondForce
(
1
);
bonds
->
setBondParameters
(
0
,
0
,
1
,
1
,
0
);
system
.
addForce
(
bonds
);
NonbondedForce
*
nonbonded
=
new
NonbondedForce
(
3
,
0
);
nonbonded
->
setParticleParameters
(
0
,
1.0
,
1
,
0
);
nonbonded
->
setParticleParameters
(
1
,
1.0
,
1
,
0
);
nonbonded
->
setParticleParameters
(
2
,
1.0
,
1
,
0
);
NonbondedForce
*
nonbonded
=
new
NonbondedForce
();
nonbonded
->
addParticle
(
1.0
,
1
,
0
);
nonbonded
->
addParticle
(
1.0
,
1
,
0
);
nonbonded
->
addParticle
(
1.0
,
1
,
0
);
nonbonded
->
addException
(
0
,
1
,
0.0
,
1.0
,
0.0
);
nonbonded
->
setNonbondedMethod
(
NonbondedForce
::
CutoffPeriodic
);
const
double
cutoff
=
2.0
;
nonbonded
->
setCutoffDistance
(
cutoff
);
...
...
@@ -333,19 +353,19 @@ void testLargeSystem() {
ReferencePlatform
reference
;
System
system
(
numParticles
,
0
);
VerletIntegrator
integrator
(
0.01
);
NonbondedForce
*
nonbonded
=
new
NonbondedForce
(
numParticles
,
0
);
NonbondedForce
*
nonbonded
=
new
NonbondedForce
();
HarmonicBondForce
*
bonds
=
new
HarmonicBondForce
(
numMolecules
);
vector
<
Vec3
>
positions
(
numParticles
);
vector
<
Vec3
>
velocities
(
numParticles
);
init_gen_rand
(
0
);
for
(
int
i
=
0
;
i
<
numMolecules
;
i
++
)
{
if
(
i
<
numMolecules
/
2
)
{
nonbonded
->
set
Particle
Parameters
(
2
*
i
,
1.0
,
0.2
,
0.1
);
nonbonded
->
set
Particle
Parameters
(
2
*
i
+
1
,
1.0
,
0.1
,
0.1
);
nonbonded
->
add
Particle
(
1.0
,
0.2
,
0.1
);
nonbonded
->
add
Particle
(
1.0
,
0.1
,
0.1
);
}
else
{
nonbonded
->
set
Particle
Parameters
(
2
*
i
,
1.0
,
0.2
,
0.2
);
nonbonded
->
set
Particle
Parameters
(
2
*
i
+
1
,
1.0
,
0.1
,
0.2
);
nonbonded
->
add
Particle
(
1.0
,
0.2
,
0.2
);
nonbonded
->
add
Particle
(
1.0
,
0.1
,
0.2
);
}
positions
[
2
*
i
]
=
Vec3
(
boxSize
*
genrand_real2
(),
boxSize
*
genrand_real2
(),
boxSize
*
genrand_real2
());
positions
[
2
*
i
+
1
]
=
Vec3
(
positions
[
2
*
i
][
0
]
+
1.0
,
positions
[
2
*
i
][
1
],
positions
[
2
*
i
][
2
]);
...
...
@@ -405,11 +425,11 @@ void testBlockInteractions(bool periodic) {
CudaPlatform
cuda
;
System
system
(
numParticles
,
0
);
VerletIntegrator
integrator
(
0.01
);
NonbondedForce
*
nonbonded
=
new
NonbondedForce
(
numParticles
,
0
);
NonbondedForce
*
nonbonded
=
new
NonbondedForce
();
vector
<
Vec3
>
positions
(
numParticles
);
init_gen_rand
(
0
);
for
(
int
i
=
0
;
i
<
numParticles
;
i
++
)
{
nonbonded
->
set
Particle
Parameters
(
i
,
1.0
,
0.2
,
0.2
);
nonbonded
->
add
Particle
(
1.0
,
0.2
,
0.2
);
positions
[
i
]
=
Vec3
(
boxSize
*
(
3
*
genrand_real2
()
-
1
),
boxSize
*
(
3
*
genrand_real2
()
-
1
),
boxSize
*
(
3
*
genrand_real2
()
-
1
));
}
nonbonded
->
setNonbondedMethod
(
periodic
?
NonbondedForce
::
CutoffPeriodic
:
NonbondedForce
::
CutoffNonPeriodic
);
...
...
platforms/cuda/tests/TestCudaSettle.cpp
View file @
29e3fa57
...
...
@@ -56,14 +56,14 @@ void testConstraints() {
System
system
(
numParticles
,
numConstraints
);
LangevinIntegrator
integrator
(
temp
,
2.0
,
0.001
);
integrator
.
setConstraintTolerance
(
1e-5
);
NonbondedForce
*
forceField
=
new
NonbondedForce
(
numParticles
,
0
);
NonbondedForce
*
forceField
=
new
NonbondedForce
();
for
(
int
i
=
0
;
i
<
numMolecules
;
++
i
)
{
system
.
setParticleMass
(
i
*
3
,
16.0
);
system
.
setParticleMass
(
i
*
3
+
1
,
1.0
);
system
.
setParticleMass
(
i
*
3
+
2
,
1.0
);
forceField
->
set
Particle
Parameters
(
i
*
3
,
-
0.82
,
0.317
,
0.65
);
forceField
->
set
Particle
Parameters
(
i
*
3
+
1
,
0.41
,
1.0
,
0.0
);
forceField
->
set
Particle
Parameters
(
i
*
3
+
2
,
0.41
,
1.0
,
0.0
);
forceField
->
add
Particle
(
-
0.82
,
0.317
,
0.65
);
forceField
->
add
Particle
(
0.41
,
1.0
,
0.0
);
forceField
->
add
Particle
(
0.41
,
1.0
,
0.0
);
system
.
setConstraintParameters
(
i
*
3
,
i
*
3
,
i
*
3
+
1
,
0.1
);
system
.
setConstraintParameters
(
i
*
3
+
1
,
i
*
3
,
i
*
3
+
2
,
0.1
);
system
.
setConstraintParameters
(
i
*
3
+
2
,
i
*
3
+
1
,
i
*
3
+
2
,
0.163
);
...
...
platforms/cuda/tests/TestCudaVerletIntegrator.cpp
View file @
29e3fa57
...
...
@@ -93,10 +93,10 @@ void testConstraints() {
System
system
(
numParticles
,
numConstraints
);
VerletIntegrator
integrator
(
0.001
);
integrator
.
setConstraintTolerance
(
1e-5
);
NonbondedForce
*
forceField
=
new
NonbondedForce
(
numParticles
,
0
);
NonbondedForce
*
forceField
=
new
NonbondedForce
();
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
{
system
.
setParticleMass
(
i
,
10.0
);
forceField
->
set
Particle
Parameters
(
i
,
(
i
%
2
==
0
?
0.2
:
-
0.2
),
0.5
,
5.0
);
forceField
->
add
Particle
(
(
i
%
2
==
0
?
0.2
:
-
0.2
),
0.5
,
5.0
);
}
system
.
setConstraintParameters
(
0
,
0
,
1
,
1.0
);
system
.
setConstraintParameters
(
1
,
1
,
2
,
1.0
);
...
...
platforms/reference/src/ReferenceKernels.cpp
View file @
29e3fa57
...
...
@@ -306,9 +306,26 @@ ReferenceCalcNonbondedForceKernel::~ReferenceCalcNonbondedForceKernel() {
delete
neighborList
;
}
void
ReferenceCalcNonbondedForceKernel
::
initialize
(
const
System
&
system
,
const
NonbondedForce
&
force
,
const
std
::
vector
<
std
::
set
<
int
>
>&
exclusions
)
{
void
ReferenceCalcNonbondedForceKernel
::
initialize
(
const
System
&
system
,
const
NonbondedForce
&
force
)
{
// Identify which exceptions are 1-4 interactions.
numParticles
=
force
.
getNumParticles
();
num14
=
force
.
getNumNonbonded14
();
exclusions
.
resize
(
numParticles
);
vector
<
int
>
nb14s
;
for
(
int
i
=
0
;
i
<
force
.
getNumExceptions
();
i
++
)
{
int
particle1
,
particle2
;
double
chargeProd
,
sigma
,
epsilon
;
force
.
getExceptionParameters
(
i
,
particle1
,
particle2
,
chargeProd
,
sigma
,
epsilon
);
exclusions
[
particle1
].
insert
(
particle2
);
exclusions
[
particle2
].
insert
(
particle1
);
if
(
chargeProd
!=
0.0
||
epsilon
!=
0.0
)
nb14s
.
push_back
(
i
);
}
// Build the arrays.
num14
=
nb14s
.
size
();
bonded14IndexArray
=
allocateIntArray
(
num14
,
2
);
bonded14ParamArray
=
allocateRealArray
(
num14
,
3
);
particleParamArray
=
allocateRealArray
(
numParticles
,
3
);
...
...
@@ -332,7 +349,7 @@ void ReferenceCalcNonbondedForceKernel::initialize(const System& system, const N
for
(
int
i
=
0
;
i
<
num14
;
++
i
)
{
int
particle1
,
particle2
;
double
charge
,
radius
,
depth
;
force
.
get
Nonbonded14
Parameters
(
i
,
particle1
,
particle2
,
charge
,
radius
,
depth
);
force
.
get
Exception
Parameters
(
nb14s
[
i
]
,
particle1
,
particle2
,
charge
,
radius
,
depth
);
bonded14IndexArray
[
i
][
0
]
=
particle1
;
bonded14IndexArray
[
i
][
1
]
=
particle2
;
bonded14ParamArray
[
i
][
0
]
=
static_cast
<
RealOpenMM
>
(
radius
);
...
...
platforms/reference/src/ReferenceKernels.h
View file @
29e3fa57
...
...
@@ -216,11 +216,8 @@ public:
*
* @param system the System this kernel will be applied to
* @param force the NonbondedForce this kernel will be used for
* @param exclusions the i'th element lists the indices of all particles with which the i'th particle should not interact through
* nonbonded forces. Bonded 1-4 pairs are also included in this list, since they should be omitted from
* the standard nonbonded calculation.
*/
void
initialize
(
const
System
&
system
,
const
NonbondedForce
&
force
,
const
std
::
vector
<
std
::
set
<
int
>
>&
exclusions
);
void
initialize
(
const
System
&
system
,
const
NonbondedForce
&
force
);
/**
* Execute the kernel to calculate the forces.
*
...
...
platforms/reference/tests/TestReferenceAndersenThermostat.cpp
View file @
29e3fa57
...
...
@@ -55,10 +55,10 @@ void testTemperature() {
ReferencePlatform
platform
;
System
system
(
numParticles
,
0
);
VerletIntegrator
integrator
(
0.01
);
NonbondedForce
*
forceField
=
new
NonbondedForce
(
numParticles
,
0
);
NonbondedForce
*
forceField
=
new
NonbondedForce
();
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
{
system
.
setParticleMass
(
i
,
2.0
);
forceField
->
set
Particle
Parameters
(
i
,
(
i
%
2
==
0
?
1.0
:
-
1.0
),
1.0
,
5.0
);
forceField
->
add
Particle
(
(
i
%
2
==
0
?
1.0
:
-
1.0
),
1.0
,
5.0
);
}
system
.
addForce
(
forceField
);
AndersenThermostat
*
thermstat
=
new
AndersenThermostat
(
temp
,
collisionFreq
);
...
...
@@ -93,10 +93,10 @@ void testRandomSeed() {
ReferencePlatform
platform
;
System
system
(
numParticles
,
0
);
VerletIntegrator
integrator
(
0.01
);
NonbondedForce
*
forceField
=
new
NonbondedForce
(
numParticles
,
0
);
NonbondedForce
*
forceField
=
new
NonbondedForce
();
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
{
system
.
setParticleMass
(
i
,
2.0
);
forceField
->
set
Particle
Parameters
(
i
,
(
i
%
2
==
0
?
1.0
:
-
1.0
),
1.0
,
5.0
);
forceField
->
add
Particle
(
(
i
%
2
==
0
?
1.0
:
-
1.0
),
1.0
,
5.0
);
}
system
.
addForce
(
forceField
);
AndersenThermostat
*
thermostat
=
new
AndersenThermostat
(
temp
,
collisionFreq
);
...
...
platforms/reference/tests/TestReferenceBrownianIntegrator.cpp
View file @
29e3fa57
...
...
@@ -129,10 +129,10 @@ void testConstraints() {
System
system
(
numParticles
,
numParticles
-
1
);
BrownianIntegrator
integrator
(
temp
,
2.0
,
0.001
);
integrator
.
setConstraintTolerance
(
1e-5
);
NonbondedForce
*
forceField
=
new
NonbondedForce
(
numParticles
,
0
);
NonbondedForce
*
forceField
=
new
NonbondedForce
();
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
{
system
.
setParticleMass
(
i
,
10.0
);
forceField
->
set
Particle
Parameters
(
i
,
(
i
%
2
==
0
?
0.2
:
-
0.2
),
0.5
,
5.0
);
forceField
->
add
Particle
(
(
i
%
2
==
0
?
0.2
:
-
0.2
),
0.5
,
5.0
);
}
for
(
int
i
=
0
;
i
<
numParticles
-
1
;
++
i
)
system
.
setConstraintParameters
(
i
,
i
,
i
+
1
,
1.0
);
...
...
@@ -169,10 +169,10 @@ void testRandomSeed() {
ReferencePlatform
platform
;
System
system
(
numParticles
,
0
);
BrownianIntegrator
integrator
(
temp
,
2.0
,
0.001
);
NonbondedForce
*
forceField
=
new
NonbondedForce
(
numParticles
,
0
);
NonbondedForce
*
forceField
=
new
NonbondedForce
();
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
{
system
.
setParticleMass
(
i
,
2.0
);
forceField
->
set
Particle
Parameters
(
i
,
(
i
%
2
==
0
?
1.0
:
-
1.0
),
1.0
,
5.0
);
forceField
->
add
Particle
(
(
i
%
2
==
0
?
1.0
:
-
1.0
),
1.0
,
5.0
);
}
system
.
addForce
(
forceField
);
vector
<
Vec3
>
positions
(
numParticles
);
...
...
platforms/reference/tests/TestReferenceCMMotionRemover.cpp
View file @
29e3fa57
...
...
@@ -69,10 +69,10 @@ void testMotionRemoval() {
HarmonicBondForce
*
bonds
=
new
HarmonicBondForce
(
1
);
bonds
->
setBondParameters
(
0
,
2
,
3
,
2.0
,
0.5
);
system
.
addForce
(
bonds
);
NonbondedForce
*
nonbonded
=
new
NonbondedForce
(
numParticles
,
0
);
NonbondedForce
*
nonbonded
=
new
NonbondedForce
();
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
{
system
.
setParticleMass
(
i
,
i
+
1
);
nonbonded
->
set
Particle
Parameters
(
i
,
(
i
%
2
==
0
?
1.0
:
-
1.0
),
1.0
,
5.0
);
nonbonded
->
add
Particle
(
(
i
%
2
==
0
?
1.0
:
-
1.0
),
1.0
,
5.0
);
}
system
.
addForce
(
nonbonded
);
CMMotionRemover
*
remover
=
new
CMMotionRemover
();
...
...
platforms/reference/tests/TestReferenceEwald.cpp
View file @
29e3fa57
...
...
@@ -53,9 +53,9 @@ void testEwald() {
ReferencePlatform
platform
;
System
system
(
2
,
0
);
VerletIntegrator
integrator
(
0.01
);
NonbondedForce
*
nonbonded
=
new
NonbondedForce
(
2
,
0
);
nonbonded
->
set
Particle
Parameters
(
0
,
1.0
,
1
,
0
);
nonbonded
->
set
Particle
Parameters
(
1
,
-
1.0
,
1
,
0
);
NonbondedForce
*
nonbonded
=
new
NonbondedForce
();
nonbonded
->
add
Particle
(
1.0
,
1
,
0
);
nonbonded
->
add
Particle
(
-
1.0
,
1
,
0
);
nonbonded
->
setNonbondedMethod
(
NonbondedForce
::
Ewald
);
const
double
cutoff
=
2.0
;
nonbonded
->
setCutoffDistance
(
cutoff
);
...
...
platforms/reference/tests/TestReferenceGBSAOBCForce.cpp
View file @
29e3fa57
...
...
@@ -76,11 +76,11 @@ void testCutoffAndPeriodic() {
System
system
(
2
,
0
);
LangevinIntegrator
integrator
(
0
,
0.1
,
0.01
);
GBSAOBCForce
*
gbsa
=
new
GBSAOBCForce
(
2
);
NonbondedForce
*
nonbonded
=
new
NonbondedForce
(
2
,
0
);
NonbondedForce
*
nonbonded
=
new
NonbondedForce
();
gbsa
->
setParticleParameters
(
0
,
-
1
,
0.15
,
1
);
nonbonded
->
set
Particle
Parameters
(
0
,
-
1
,
1
,
0
);
nonbonded
->
add
Particle
(
-
1
,
1
,
0
);
gbsa
->
setParticleParameters
(
1
,
1
,
0.15
,
1
);
nonbonded
->
set
Particle
Parameters
(
1
,
1
,
1
,
0
);
nonbonded
->
add
Particle
(
1
,
1
,
0
);
const
double
cutoffDistance
=
3.0
;
const
double
boxSize
=
10.0
;
nonbonded
->
setCutoffDistance
(
cutoffDistance
);
...
...
platforms/reference/tests/TestReferenceLangevinIntegrator.cpp
View file @
29e3fa57
...
...
@@ -100,10 +100,10 @@ void testTemperature() {
ReferencePlatform
platform
;
System
system
(
numParticles
,
0
);
LangevinIntegrator
integrator
(
temp
,
2.0
,
0.01
);
NonbondedForce
*
forceField
=
new
NonbondedForce
(
numParticles
,
0
);
NonbondedForce
*
forceField
=
new
NonbondedForce
();
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
{
system
.
setParticleMass
(
i
,
2.0
);
forceField
->
set
Particle
Parameters
(
i
,
(
i
%
2
==
0
?
1.0
:
-
1.0
),
1.0
,
5.0
);
forceField
->
add
Particle
(
(
i
%
2
==
0
?
1.0
:
-
1.0
),
1.0
,
5.0
);
}
system
.
addForce
(
forceField
);
OpenMMContext
context
(
system
,
integrator
,
platform
);
...
...
@@ -136,10 +136,10 @@ void testConstraints() {
System
system
(
numParticles
,
numParticles
-
1
);
LangevinIntegrator
integrator
(
temp
,
2.0
,
0.01
);
integrator
.
setConstraintTolerance
(
1e-5
);
NonbondedForce
*
forceField
=
new
NonbondedForce
(
numParticles
,
0
);
NonbondedForce
*
forceField
=
new
NonbondedForce
();
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
{
system
.
setParticleMass
(
i
,
10.0
);
forceField
->
set
Particle
Parameters
(
i
,
(
i
%
2
==
0
?
0.2
:
-
0.2
),
0.5
,
5.0
);
forceField
->
add
Particle
(
(
i
%
2
==
0
?
0.2
:
-
0.2
),
0.5
,
5.0
);
}
for
(
int
i
=
0
;
i
<
numParticles
-
1
;
++
i
)
system
.
setConstraintParameters
(
i
,
i
,
i
+
1
,
1.0
);
...
...
@@ -176,10 +176,10 @@ void testRandomSeed() {
ReferencePlatform
platform
;
System
system
(
numParticles
,
0
);
LangevinIntegrator
integrator
(
temp
,
2.0
,
0.01
);
NonbondedForce
*
forceField
=
new
NonbondedForce
(
numParticles
,
0
);
NonbondedForce
*
forceField
=
new
NonbondedForce
();
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
{
system
.
setParticleMass
(
i
,
2.0
);
forceField
->
set
Particle
Parameters
(
i
,
(
i
%
2
==
0
?
1.0
:
-
1.0
),
1.0
,
5.0
);
forceField
->
add
Particle
(
(
i
%
2
==
0
?
1.0
:
-
1.0
),
1.0
,
5.0
);
}
system
.
addForce
(
forceField
);
vector
<
Vec3
>
positions
(
numParticles
);
...
...
platforms/reference/tests/TestReferenceNonbondedForce.cpp
View file @
29e3fa57
...
...
@@ -53,9 +53,9 @@ void testCoulomb() {
ReferencePlatform
platform
;
System
system
(
2
,
0
);
VerletIntegrator
integrator
(
0.01
);
NonbondedForce
*
forceField
=
new
NonbondedForce
(
2
,
0
);
forceField
->
set
Particle
Parameters
(
0
,
0.5
,
1
,
0
);
forceField
->
set
Particle
Parameters
(
1
,
-
1.5
,
1
,
0
);
NonbondedForce
*
forceField
=
new
NonbondedForce
();
forceField
->
add
Particle
(
0.5
,
1
,
0
);
forceField
->
add
Particle
(
-
1.5
,
1
,
0
);
system
.
addForce
(
forceField
);
OpenMMContext
context
(
system
,
integrator
,
platform
);
vector
<
Vec3
>
positions
(
2
);
...
...
@@ -74,9 +74,9 @@ void testLJ() {
ReferencePlatform
platform
;
System
system
(
2
,
0
);
VerletIntegrator
integrator
(
0.01
);
NonbondedForce
*
forceField
=
new
NonbondedForce
(
2
,
0
);
forceField
->
set
Particle
Parameters
(
0
,
0
,
1.2
,
1
);
forceField
->
set
Particle
Parameters
(
1
,
0
,
1.4
,
2
);
NonbondedForce
*
forceField
=
new
NonbondedForce
();
forceField
->
add
Particle
(
0
,
1.2
,
1
);
forceField
->
add
Particle
(
0
,
1.4
,
2
);
system
.
addForce
(
forceField
);
OpenMMContext
context
(
system
,
integrator
,
platform
);
vector
<
Vec3
>
positions
(
2
);
...
...
@@ -97,13 +97,25 @@ void testExclusionsAnd14() {
ReferencePlatform
platform
;
System
system
(
5
,
0
);
VerletIntegrator
integrator
(
0.01
);
HarmonicBondForce
*
bonds
=
new
HarmonicBondForce
(
4
);
bonds
->
setBondParameters
(
0
,
0
,
1
,
1
,
0
);
bonds
->
setBondParameters
(
1
,
1
,
2
,
1
,
0
);
bonds
->
setBondParameters
(
2
,
2
,
3
,
1
,
0
);
bonds
->
setBondParameters
(
3
,
3
,
4
,
1
,
0
);
system
.
addForce
(
bonds
);
NonbondedForce
*
nonbonded
=
new
NonbondedForce
(
5
,
2
);
NonbondedForce
*
nonbonded
=
new
NonbondedForce
();
for
(
int
i
=
0
;
i
<
5
;
i
++
)
nonbonded
->
addParticle
(
0
,
1.5
,
0
);
vector
<
pair
<
int
,
int
>
>
bonds
;
bonds
.
push_back
(
pair
<
int
,
int
>
(
0
,
1
));
bonds
.
push_back
(
pair
<
int
,
int
>
(
1
,
2
));
bonds
.
push_back
(
pair
<
int
,
int
>
(
2
,
3
));
bonds
.
push_back
(
pair
<
int
,
int
>
(
3
,
4
));
nonbonded
->
createExceptionsFromBonds
(
bonds
,
0.0
,
0.0
);
int
first14
,
second14
;
for
(
int
i
=
0
;
i
<
nonbonded
->
getNumExceptions
();
i
++
)
{
int
particle1
,
particle2
;
double
chargeProd
,
sigma
,
epsilon
;
nonbonded
->
getExceptionParameters
(
i
,
particle1
,
particle2
,
chargeProd
,
sigma
,
epsilon
);
if
((
particle1
==
0
&&
particle2
==
3
)
||
(
particle1
==
3
&&
particle2
==
0
))
first14
=
i
;
if
((
particle1
==
1
&&
particle2
==
4
)
||
(
particle1
==
4
&&
particle2
==
1
))
second14
=
i
;
}
system
.
addForce
(
nonbonded
);
OpenMMContext
context
(
system
,
integrator
,
platform
);
for
(
int
i
=
1
;
i
<
5
;
++
i
)
{
...
...
@@ -118,8 +130,8 @@ void testExclusionsAnd14() {
}
nonbonded
->
setParticleParameters
(
0
,
0
,
1.5
,
1
);
nonbonded
->
setParticleParameters
(
i
,
0
,
1.5
,
1
);
nonbonded
->
set
Nonbonded14
Parameters
(
0
,
0
,
3
,
0
,
1.5
,
i
==
3
?
0.5
:
0.0
);
nonbonded
->
set
Nonbonded14
Parameters
(
1
,
1
,
4
,
0
,
1.5
,
0.0
);
nonbonded
->
set
Exception
Parameters
(
first14
,
0
,
3
,
0
,
1.5
,
i
==
3
?
0.5
:
0.0
);
nonbonded
->
set
Exception
Parameters
(
second14
,
1
,
4
,
0
,
1.5
,
0.0
);
positions
[
i
]
=
Vec3
(
r
,
0
,
0
);
context
.
reinitialize
();
context
.
setPositions
(
positions
);
...
...
@@ -145,8 +157,8 @@ void testExclusionsAnd14() {
nonbonded
->
setParticleParameters
(
0
,
2
,
1.5
,
0
);
nonbonded
->
setParticleParameters
(
i
,
2
,
1.5
,
0
);
nonbonded
->
set
Nonbonded14
Parameters
(
0
,
0
,
3
,
i
==
3
?
4
/
1.2
:
0
,
1.5
,
0
);
nonbonded
->
set
Nonbonded14
Parameters
(
1
,
1
,
4
,
0
,
1.5
,
0
);
nonbonded
->
set
Exception
Parameters
(
first14
,
0
,
3
,
i
==
3
?
4
/
1.2
:
0
,
1.5
,
0
);
nonbonded
->
set
Exception
Parameters
(
second14
,
1
,
4
,
0
,
1.5
,
0
);
context
.
reinitialize
();
context
.
setPositions
(
positions
);
state
=
context
.
getState
(
State
::
Forces
|
State
::
Energy
);
...
...
@@ -171,10 +183,10 @@ void testCutoff() {
ReferencePlatform
platform
;
System
system
(
3
,
0
);
VerletIntegrator
integrator
(
0.01
);
NonbondedForce
*
forceField
=
new
NonbondedForce
(
3
,
0
);
forceField
->
set
Particle
Parameters
(
0
,
1.0
,
1
,
0
);
forceField
->
set
Particle
Parameters
(
1
,
1.0
,
1
,
0
);
forceField
->
set
Particle
Parameters
(
2
,
1.0
,
1
,
0
);
NonbondedForce
*
forceField
=
new
NonbondedForce
();
forceField
->
add
Particle
(
1.0
,
1
,
0
);
forceField
->
add
Particle
(
1.0
,
1
,
0
);
forceField
->
add
Particle
(
1.0
,
1
,
0
);
forceField
->
setNonbondedMethod
(
NonbondedForce
::
CutoffNonPeriodic
);
const
double
cutoff
=
2.9
;
forceField
->
setCutoffDistance
(
cutoff
);
...
...
@@ -204,16 +216,28 @@ void testCutoff14() {
ReferencePlatform
platform
;
System
system
(
5
,
0
);
VerletIntegrator
integrator
(
0.01
);
HarmonicBondForce
*
bonds
=
new
HarmonicBondForce
(
4
);
bonds
->
setBondParameters
(
0
,
0
,
1
,
1
,
0
);
bonds
->
setBondParameters
(
1
,
1
,
2
,
1
,
0
);
bonds
->
setBondParameters
(
2
,
2
,
3
,
1
,
0
);
bonds
->
setBondParameters
(
3
,
3
,
4
,
1
,
0
);
system
.
addForce
(
bonds
);
NonbondedForce
*
nonbonded
=
new
NonbondedForce
(
5
,
2
);
NonbondedForce
*
nonbonded
=
new
NonbondedForce
();
for
(
int
i
=
0
;
i
<
5
;
i
++
)
nonbonded
->
addParticle
(
0
,
1.5
,
0
);
nonbonded
->
setNonbondedMethod
(
NonbondedForce
::
CutoffNonPeriodic
);
const
double
cutoff
=
3.5
;
nonbonded
->
setCutoffDistance
(
cutoff
);
vector
<
pair
<
int
,
int
>
>
bonds
;
bonds
.
push_back
(
pair
<
int
,
int
>
(
0
,
1
));
bonds
.
push_back
(
pair
<
int
,
int
>
(
1
,
2
));
bonds
.
push_back
(
pair
<
int
,
int
>
(
2
,
3
));
bonds
.
push_back
(
pair
<
int
,
int
>
(
3
,
4
));
nonbonded
->
createExceptionsFromBonds
(
bonds
,
0.0
,
0.0
);
int
first14
,
second14
;
for
(
int
i
=
0
;
i
<
nonbonded
->
getNumExceptions
();
i
++
)
{
int
particle1
,
particle2
;
double
chargeProd
,
sigma
,
epsilon
;
nonbonded
->
getExceptionParameters
(
i
,
particle1
,
particle2
,
chargeProd
,
sigma
,
epsilon
);
if
((
particle1
==
0
&&
particle2
==
3
)
||
(
particle1
==
3
&&
particle2
==
0
))
first14
=
i
;
if
((
particle1
==
1
&&
particle2
==
4
)
||
(
particle1
==
4
&&
particle2
==
1
))
second14
=
i
;
}
system
.
addForce
(
nonbonded
);
OpenMMContext
context
(
system
,
integrator
,
platform
);
vector
<
Vec3
>
positions
(
5
);
...
...
@@ -230,8 +254,8 @@ void testCutoff14() {
for
(
int
j
=
1
;
j
<
5
;
++
j
)
nonbonded
->
setParticleParameters
(
j
,
0
,
1.5
,
0
);
nonbonded
->
setParticleParameters
(
i
,
0
,
1.5
,
1
);
nonbonded
->
set
Nonbonded14
Parameters
(
0
,
0
,
3
,
0
,
1.5
,
i
==
3
?
0.5
:
0.0
);
nonbonded
->
set
Nonbonded14
Parameters
(
1
,
1
,
4
,
0
,
1.5
,
0.0
);
nonbonded
->
set
Exception
Parameters
(
first14
,
0
,
3
,
0
,
1.5
,
i
==
3
?
0.5
:
0.0
);
nonbonded
->
set
Exception
Parameters
(
second14
,
1
,
4
,
0
,
1.5
,
0.0
);
context
.
reinitialize
();
context
.
setPositions
(
positions
);
State
state
=
context
.
getState
(
State
::
Forces
|
State
::
Energy
);
...
...
@@ -258,8 +282,8 @@ void testCutoff14() {
const
double
q
=
0.7
;
nonbonded
->
setParticleParameters
(
0
,
q
,
1.5
,
0
);
nonbonded
->
setParticleParameters
(
i
,
q
,
1.5
,
0
);
nonbonded
->
set
Nonbonded14
Parameters
(
0
,
0
,
3
,
i
==
3
?
q
*
q
/
1.2
:
0
,
1.5
,
0
);
nonbonded
->
set
Nonbonded14
Parameters
(
1
,
1
,
4
,
0
,
1.5
,
0
);
nonbonded
->
set
Exception
Parameters
(
first14
,
0
,
3
,
i
==
3
?
q
*
q
/
1.2
:
0
,
1.5
,
0
);
nonbonded
->
set
Exception
Parameters
(
second14
,
1
,
4
,
0
,
1.5
,
0
);
context
.
reinitialize
();
context
.
setPositions
(
positions
);
state
=
context
.
getState
(
State
::
Forces
|
State
::
Energy
);
...
...
@@ -287,13 +311,11 @@ void testPeriodic() {
ReferencePlatform
platform
;
System
system
(
3
,
0
);
VerletIntegrator
integrator
(
0.01
);
HarmonicBondForce
*
bonds
=
new
HarmonicBondForce
(
1
);
bonds
->
setBondParameters
(
0
,
0
,
1
,
1
,
0
);
system
.
addForce
(
bonds
);
NonbondedForce
*
nonbonded
=
new
NonbondedForce
(
3
,
0
);
nonbonded
->
setParticleParameters
(
0
,
1.0
,
1
,
0
);
nonbonded
->
setParticleParameters
(
1
,
1.0
,
1
,
0
);
nonbonded
->
setParticleParameters
(
2
,
1.0
,
1
,
0
);
NonbondedForce
*
nonbonded
=
new
NonbondedForce
();
nonbonded
->
addParticle
(
1.0
,
1
,
0
);
nonbonded
->
addParticle
(
1.0
,
1
,
0
);
nonbonded
->
addParticle
(
1.0
,
1
,
0
);
nonbonded
->
addException
(
0
,
1
,
0.0
,
1.0
,
0.0
);
nonbonded
->
setNonbondedMethod
(
NonbondedForce
::
CutoffPeriodic
);
const
double
cutoff
=
2.0
;
nonbonded
->
setCutoffDistance
(
cutoff
);
...
...
platforms/reference/tests/TestReferenceVerletIntegrator.cpp
View file @
29e3fa57
...
...
@@ -92,10 +92,10 @@ void testConstraints() {
System
system
(
numParticles
,
numParticles
-
1
);
VerletIntegrator
integrator
(
0.002
);
integrator
.
setConstraintTolerance
(
1e-5
);
NonbondedForce
*
forceField
=
new
NonbondedForce
(
numParticles
,
0
);
NonbondedForce
*
forceField
=
new
NonbondedForce
();
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
{
system
.
setParticleMass
(
i
,
10.0
);
forceField
->
set
Particle
Parameters
(
i
,
(
i
%
2
==
0
?
0.2
:
-
0.2
),
0.5
,
5.0
);
forceField
->
add
Particle
(
(
i
%
2
==
0
?
0.2
:
-
0.2
),
0.5
,
5.0
);
}
for
(
int
i
=
0
;
i
<
numParticles
-
1
;
++
i
)
system
.
setConstraintParameters
(
i
,
i
,
i
+
1
,
1.0
);
...
...
tests/TestFindExclusions.cpp
View file @
29e3fa57
...
...
@@ -6,7 +6,7 @@
* 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.
*
* Portions copyright (c) 2008
-2009
Stanford University and the Authors. *
* Authors: Peter Eastman *
* Contributors: *
* *
...
...
@@ -30,7 +30,7 @@
* -------------------------------------------------------------------------- */
/**
* This tests the
findExclusion
s() method of NonbondedForce
Impl
, which identifies pairs of atoms
* This tests the
createExceptionsFromBond
s() method of NonbondedForce, which identifies pairs of atoms
* whose nonbonded atoms are either excluded or decreased. The test system is a chain with branches:
*
* 1 3 5 7 9 11 13 15 17 19
...
...
@@ -39,19 +39,8 @@
*/
#include "AssertionUtilities.h"
#include "Kernel.h"
#include "KernelFactory.h"
#include "OpenMMContext.h"
#include "Platform.h"
#include "NonbondedForce.h"
#include "Stream.h"
#include "StreamFactory.h"
#include "System.h"
#include "VerletIntegrator.h"
#include "kernels.h"
#include <algorithm>
#include <iostream>
#include <iterator>
#include <set>
#include <vector>
...
...
@@ -64,207 +53,73 @@ static const int NUM_ATOMS = 20;
* Add a pair of atoms to the list of exclusions.
*/
void
addAtomsToExclusions
(
int
atom1
,
int
atom2
,
vector
<
set
<
int
>
>&
exclusions
)
{
void
addAtomsToExclusions
(
int
atom1
,
int
atom2
,
vector
<
set
<
int
>
>&
exclusions
,
int
&
totalExclusions
)
{
if
(
atom2
<
NUM_ATOMS
)
{
exclusions
[
atom1
].
insert
(
atom2
);
exclusions
[
atom2
].
insert
(
atom1
);
totalExclusions
++
;
}
}
/**
* Verify that the exclusions are what we expect.
*/
void
verifyExclusions
(
const
vector
<
set
<
int
>
>&
exclusions
)
{
vector
<
set
<
int
>
>
expected
(
NUM_ATOMS
);
for
(
int
i
=
0
;
i
<
NUM_ATOMS
;
i
+=
2
)
{
addAtomsToExclusions
(
i
,
i
+
1
,
expected
);
addAtomsToExclusions
(
i
,
i
+
2
,
expected
);
addAtomsToExclusions
(
i
,
i
+
3
,
expected
);
addAtomsToExclusions
(
i
,
i
+
4
,
expected
);
addAtomsToExclusions
(
i
,
i
+
5
,
expected
);
addAtomsToExclusions
(
i
,
i
+
6
,
expected
);
addAtomsToExclusions
(
i
+
1
,
i
+
2
,
expected
);
addAtomsToExclusions
(
i
+
1
,
i
+
3
,
expected
);
addAtomsToExclusions
(
i
+
1
,
i
+
4
,
expected
);
}
ASSERT_EQUAL
(
expected
.
size
(),
exclusions
.
size
());
for
(
int
i
=
0
;
i
<
NUM_ATOMS
;
++
i
)
{
ASSERT_EQUAL
(
expected
[
i
].
size
(),
exclusions
[
i
].
size
());
vector
<
int
>
intersection
(
0
);
insert_iterator
<
vector
<
int
>
>
inserter
(
intersection
,
intersection
.
begin
());
set_intersection
(
exclusions
[
i
].
begin
(),
exclusions
[
i
].
end
(),
expected
[
i
].
begin
(),
expected
[
i
].
end
(),
inserter
);
ASSERT_EQUAL
(
expected
[
i
].
size
(),
intersection
.
size
());
int
main
()
{
try
{
NonbondedForce
nonbonded
;
vector
<
pair
<
int
,
int
>
>
bonds
;
for
(
int
i
=
0
;
i
<
NUM_ATOMS
;
i
++
)
nonbonded
.
addParticle
(
1.0
,
1.0
,
2.0
);
// loop over all main-chain atoms (even numbered atoms)
for
(
int
i
=
0
;
i
<
NUM_ATOMS
-
1
;
i
+=
2
)
{
// side-chain bonds
bonds
.
push_back
(
pair
<
int
,
int
>
(
i
,
i
+
1
));
// main-chain bonds
if
(
i
<
NUM_ATOMS
-
2
)
// penultimate atom (NUM_ATOMS-2) has no subsequent main-chain atom
bonds
.
push_back
(
pair
<
int
,
int
>
(
i
,
i
+
2
));
}
}
/**
* Add a pair of atoms to the list of 1-4 pairs.
*/
nonbonded
.
createExceptionsFromBonds
(
bonds
,
0.2
,
0.4
);
void
addAtomsTo14List
(
int
atom1
,
int
atom2
,
set
<
pair
<
int
,
int
>
>&
bonded14Indices
)
{
if
(
atom2
<
NUM_ATOMS
)
bonded14Indices
.
insert
(
pair
<
int
,
int
>
(
atom1
,
atom2
));
}
// Build lists of the expected exclusions and 1-4s.
/**
* Verify that the 1-4 pairs are what we expect.
*/
void
verify14
(
const
vector
<
vector
<
int
>
>&
bonded14Indices
)
{
set
<
pair
<
int
,
int
>
>
expected
,
found
;
vector
<
set
<
int
>
>
expectedExclusions
(
NUM_ATOMS
);
int
totalExclusions
=
0
;
for
(
int
i
=
0
;
i
<
NUM_ATOMS
;
i
+=
2
)
{
addAtomsTo14List
(
i
,
i
+
5
,
expected
);
addAtomsTo14List
(
i
,
i
+
6
,
expected
);
addAtomsTo14List
(
i
+
1
,
i
+
3
,
expected
);
addAtomsTo14List
(
i
+
1
,
i
+
4
,
expected
);
}
ASSERT_EQUAL
(
expected
.
size
(),
bonded14Indices
.
size
());
for
(
size_t
i
=
0
;
i
<
bonded14Indices
.
size
();
++
i
)
{
int
atom1
=
bonded14Indices
[
i
][
0
];
int
atom2
=
bonded14Indices
[
i
][
1
];
found
.
insert
(
pair
<
int
,
int
>
(
min
(
atom1
,
atom2
),
max
(
atom1
,
atom2
)));
}
vector
<
pair
<
int
,
int
>
>
intersection
(
0
);
insert_iterator
<
vector
<
pair
<
int
,
int
>
>
>
inserter
(
intersection
,
intersection
.
begin
());
set_intersection
(
expected
.
begin
(),
expected
.
end
(),
found
.
begin
(),
found
.
end
(),
inserter
);
ASSERT_EQUAL
(
expected
.
size
(),
intersection
.
size
());
}
/**
* The following classes define a Platform whose job is to check whether the correct values were passed
* to the initialize() methods.
*/
class
DummyBondedKernel
:
public
CalcHarmonicBondForceKernel
{
public:
DummyBondedKernel
(
string
name
,
const
Platform
&
platform
)
:
CalcHarmonicBondForceKernel
(
name
,
platform
)
{
}
void
initialize
(
const
System
&
system
,
const
HarmonicBondForce
&
force
)
{
}
void
executeForces
(
OpenMMContextImpl
&
context
)
{
}
double
executeEnergy
(
OpenMMContextImpl
&
context
)
{
return
0.0
;
}
};
class
DummyNonbondedKernel
:
public
CalcNonbondedForceKernel
{
public:
DummyNonbondedKernel
(
string
name
,
const
Platform
&
platform
)
:
CalcNonbondedForceKernel
(
name
,
platform
)
{
}
void
initialize
(
const
System
&
system
,
const
NonbondedForce
&
force
,
const
std
::
vector
<
std
::
set
<
int
>
>&
exclusions
)
{
verifyExclusions
(
exclusions
);
// verify14(bonded14Indices);
}
void
executeForces
(
OpenMMContextImpl
&
context
)
{
}
double
executeEnergy
(
OpenMMContextImpl
&
context
)
{
return
0.0
;
}
};
class
DummyIntegratorKernel
:
public
IntegrateVerletStepKernel
{
public:
DummyIntegratorKernel
(
string
name
,
const
Platform
&
platform
)
:
IntegrateVerletStepKernel
(
name
,
platform
)
{
}
void
initialize
(
const
System
&
system
,
const
VerletIntegrator
&
integrator
)
{
}
void
execute
(
OpenMMContextImpl
&
context
,
const
VerletIntegrator
&
integrator
)
{
}
};
class
DummyKEKernel
:
public
CalcKineticEnergyKernel
{
public:
DummyKEKernel
(
string
name
,
const
Platform
&
platform
)
:
CalcKineticEnergyKernel
(
name
,
platform
)
{
}
void
initialize
(
const
System
&
system
)
{
}
double
execute
(
OpenMMContextImpl
&
context
)
{
return
0.0
;
addAtomsToExclusions
(
i
,
i
+
1
,
expectedExclusions
,
totalExclusions
);
addAtomsToExclusions
(
i
,
i
+
2
,
expectedExclusions
,
totalExclusions
);
addAtomsToExclusions
(
i
,
i
+
3
,
expectedExclusions
,
totalExclusions
);
addAtomsToExclusions
(
i
,
i
+
4
,
expectedExclusions
,
totalExclusions
);
addAtomsToExclusions
(
i
+
1
,
i
+
2
,
expectedExclusions
,
totalExclusions
);
}
vector
<
set
<
int
>
>
expected14
(
NUM_ATOMS
);
int
total14
=
0
;
for
(
int
i
=
0
;
i
<
NUM_ATOMS
;
i
+=
2
)
{
addAtomsToExclusions
(
i
,
i
+
5
,
expected14
,
total14
);
addAtomsToExclusions
(
i
,
i
+
6
,
expected14
,
total14
);
addAtomsToExclusions
(
i
+
1
,
i
+
3
,
expected14
,
total14
);
addAtomsToExclusions
(
i
+
1
,
i
+
4
,
expected14
,
total14
);
}
};
class
DummyStreamImpl
:
public
StreamImpl
{
public:
DummyStreamImpl
(
string
name
,
int
size
,
Stream
::
DataType
type
,
const
Platform
&
platform
)
:
StreamImpl
(
name
,
size
,
type
,
platform
)
{
}
void
loadFromArray
(
const
void
*
array
)
{
}
void
saveToArray
(
void
*
array
)
{
}
void
fillWithValue
(
void
*
value
)
{
}
};
// Compare them to the exceptions that were generated.
class
DummyKernelFactory
:
public
KernelFactory
{
public:
KernelImpl
*
createKernelImpl
(
string
name
,
const
Platform
&
platform
,
OpenMMContextImpl
&
context
)
const
{
if
(
name
==
CalcHarmonicBondForceKernel
::
Name
())
return
new
DummyBondedKernel
(
name
,
platform
);
if
(
name
==
CalcNonbondedForceKernel
::
Name
())
return
new
DummyNonbondedKernel
(
name
,
platform
);
if
(
name
==
IntegrateVerletStepKernel
::
Name
())
return
new
DummyIntegratorKernel
(
name
,
platform
);
if
(
name
==
CalcKineticEnergyKernel
::
Name
())
return
new
DummyKEKernel
(
name
,
platform
);
return
0
;
}
};
ASSERT_EQUAL
(
totalExclusions
+
total14
,
nonbonded
.
getNumExceptions
());
for
(
int
i
=
0
;
i
<
nonbonded
.
getNumExceptions
();
i
++
)
{
int
particle1
,
particle2
;
double
chargeProd
,
sigma
,
epsilon
;
nonbonded
.
getExceptionParameters
(
i
,
particle1
,
particle2
,
chargeProd
,
sigma
,
epsilon
);
if
(
chargeProd
==
0
)
{
// This is an exclusion.
class
DummyStreamFactory
:
public
StreamFactory
{
public:
StreamImpl
*
createStreamImpl
(
string
name
,
int
size
,
Stream
::
DataType
type
,
const
Platform
&
platform
,
OpenMMContextImpl
&
context
)
const
{
return
new
DummyStreamImpl
(
name
,
size
,
type
,
platform
);
ASSERT_EQUAL
(
0.0
,
epsilon
);
ASSERT
(
expectedExclusions
[
particle1
].
find
(
particle2
)
!=
expectedExclusions
[
particle2
].
end
());
}
};
else
{
// This is a 1-4.
class
DummyPlatform
:
public
Platform
{
public:
DummyPlatform
()
{
registerKernelFactory
(
CalcHarmonicBondForceKernel
::
Name
(),
new
DummyKernelFactory
());
registerKernelFactory
(
CalcNonbondedForceKernel
::
Name
(),
new
DummyKernelFactory
());
registerKernelFactory
(
IntegrateVerletStepKernel
::
Name
(),
new
DummyKernelFactory
());
registerKernelFactory
(
CalcKineticEnergyKernel
::
Name
(),
new
DummyKernelFactory
());
ASSERT_EQUAL_TOL
(
0.2
,
chargeProd
,
1e-10
);
ASSERT_EQUAL_TOL
(
1.0
,
sigma
,
1e-10
);
ASSERT_EQUAL_TOL
(
0.8
,
epsilon
,
1e-10
);
ASSERT
(
expected14
[
particle1
].
find
(
particle2
)
!=
expected14
[
particle2
].
end
());
}
string
getName
()
const
{
return
"Dummy"
;
}
double
getSpeed
()
const
{
return
1.0
;
}
bool
supportsDoublePrecision
()
const
{
return
true
;
}
const
StreamFactory
&
getDefaultStreamFactory
()
const
{
return
streamFactory
;
}
private:
DummyStreamFactory
streamFactory
;
};
int
main
()
{
try
{
DummyPlatform
platform
;
System
system
(
NUM_ATOMS
,
0
);
VerletIntegrator
integrator
(
0.01
);
HarmonicBondForce
*
bonds
=
new
HarmonicBondForce
(
NUM_ATOMS
-
1
);
NonbondedForce
*
nonbonded
=
new
NonbondedForce
(
NUM_ATOMS
,
0
);
// loop over all main-chain atoms (even numbered atoms)
for
(
int
i
=
0
;
i
<
NUM_ATOMS
-
1
;
i
+=
2
)
{
// side-chain bonds
bonds
->
setBondParameters
(
i
,
i
,
i
+
1
,
1.0
,
1.0
);
// main-chain bonds
if
(
i
<
NUM_ATOMS
-
2
)
// penultimate atom (NUM_ATOMS-2) has no subsequent main-chain atom
bonds
->
setBondParameters
(
i
+
1
,
i
,
i
+
2
,
1.0
,
1.0
);
}
system
.
addForce
(
bonds
);
system
.
addForce
(
nonbonded
);
OpenMMContext
context
(
system
,
integrator
,
platform
);
}
catch
(
const
exception
&
e
)
{
cout
<<
"exception: "
<<
e
.
what
()
<<
endl
;
...
...
Prev
1
2
Next
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