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
54e47d2d
Commit
54e47d2d
authored
Oct 16, 2013
by
peastman
Browse files
Converted lots of ExpressionPrograms to CompiledExpressions
parent
8b3bfc92
Changes
16
Show whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
285 additions
and
170 deletions
+285
-170
openmmapi/include/openmm/internal/CustomNonbondedForceImpl.h
openmmapi/include/openmm/internal/CustomNonbondedForceImpl.h
+3
-3
openmmapi/src/CustomNonbondedForceImpl.cpp
openmmapi/src/CustomNonbondedForceImpl.cpp
+20
-10
platforms/reference/include/ReferenceCustomAngleIxn.h
platforms/reference/include/ReferenceCustomAngleIxn.h
+10
-7
platforms/reference/include/ReferenceCustomBondIxn.h
platforms/reference/include/ReferenceCustomBondIxn.h
+10
-7
platforms/reference/include/ReferenceCustomExternalIxn.h
platforms/reference/include/ReferenceCustomExternalIxn.h
+17
-10
platforms/reference/include/ReferenceCustomNonbondedIxn.h
platforms/reference/include/ReferenceCustomNonbondedIxn.h
+12
-10
platforms/reference/include/ReferenceCustomTorsionIxn.h
platforms/reference/include/ReferenceCustomTorsionIxn.h
+10
-7
platforms/reference/include/ReferenceForce.h
platforms/reference/include/ReferenceForce.h
+14
-2
platforms/reference/include/ReferenceKernels.h
platforms/reference/include/ReferenceKernels.h
+6
-5
platforms/reference/src/ReferenceKernels.cpp
platforms/reference/src/ReferenceKernels.cpp
+12
-12
platforms/reference/src/SimTKReference/ReferenceCustomAngleIxn.cpp
.../reference/src/SimTKReference/ReferenceCustomAngleIxn.cpp
+24
-17
platforms/reference/src/SimTKReference/ReferenceCustomBondIxn.cpp
...s/reference/src/SimTKReference/ReferenceCustomBondIxn.cpp
+24
-17
platforms/reference/src/SimTKReference/ReferenceCustomExternalIxn.cpp
...ference/src/SimTKReference/ReferenceCustomExternalIxn.cpp
+53
-22
platforms/reference/src/SimTKReference/ReferenceCustomNonbondedIxn.cpp
...erence/src/SimTKReference/ReferenceCustomNonbondedIxn.cpp
+33
-21
platforms/reference/src/SimTKReference/ReferenceCustomTorsionIxn.cpp
...eference/src/SimTKReference/ReferenceCustomTorsionIxn.cpp
+25
-19
platforms/reference/src/SimTKReference/ReferenceForce.cpp
platforms/reference/src/SimTKReference/ReferenceForce.cpp
+12
-1
No files found.
openmmapi/include/openmm/internal/CustomNonbondedForceImpl.h
View file @
54e47d2d
...
...
@@ -9,7 +9,7 @@
* Biological Structures at Stanford, funded under the NIH Roadmap for *
* Medical Research, grant U54 GM072970. See https://simtk.org. *
* *
* Portions copyright (c) 2008-201
2
Stanford University and the Authors. *
* Portions copyright (c) 2008-201
3
Stanford University and the Authors. *
* Authors: Peter Eastman *
* Contributors: *
* *
...
...
@@ -35,7 +35,7 @@
#include "ForceImpl.h"
#include "openmm/CustomNonbondedForce.h"
#include "openmm/Kernel.h"
#include "lepton/Expression
Program
.h"
#include "lepton/
Compiled
Expression.h"
#include <utility>
#include <map>
#include <string>
...
...
@@ -68,7 +68,7 @@ public:
static
double
calcLongRangeCorrection
(
const
CustomNonbondedForce
&
force
,
const
Context
&
context
);
private:
class
TabulatedFunction
;
static
double
integrateInteraction
(
const
Lepton
::
Expression
Program
&
expression
,
const
std
::
vector
<
double
>&
params1
,
const
std
::
vector
<
double
>&
params2
,
static
double
integrateInteraction
(
Lepton
::
Compiled
Expression
&
expression
,
const
std
::
vector
<
double
>&
params1
,
const
std
::
vector
<
double
>&
params2
,
const
CustomNonbondedForce
&
force
,
const
Context
&
context
);
const
CustomNonbondedForce
&
owner
;
Kernel
kernel
;
...
...
openmmapi/src/CustomNonbondedForceImpl.cpp
View file @
54e47d2d
...
...
@@ -182,7 +182,7 @@ double CustomNonbondedForceImpl::calcLongRangeCorrection(const CustomNonbondedFo
force
.
getFunctionParameters
(
i
,
name
,
values
,
min
,
max
);
functions
[
name
]
=
new
TabulatedFunction
(
min
,
max
,
values
);
}
Lepton
::
Expression
Program
expression
=
Lepton
::
Parser
::
parse
(
force
.
getEnergyFunction
(),
functions
).
optimize
().
createProgram
();
Lepton
::
Compiled
Expression
expression
=
Lepton
::
Parser
::
parse
(
force
.
getEnergyFunction
(),
functions
).
createCompiledExpression
();
// Identify all particle classes (defined by parameters), and record the class of each particle.
...
...
@@ -251,25 +251,35 @@ double CustomNonbondedForceImpl::calcLongRangeCorrection(const CustomNonbondedFo
return
2
*
M_PI
*
numParticles
*
numParticles
*
sum
;
}
double
CustomNonbondedForceImpl
::
integrateInteraction
(
const
Lepton
::
Expression
Program
&
expression
,
const
vector
<
double
>&
params1
,
const
vector
<
double
>&
params2
,
double
CustomNonbondedForceImpl
::
integrateInteraction
(
Lepton
::
Compiled
Expression
&
expression
,
const
vector
<
double
>&
params1
,
const
vector
<
double
>&
params2
,
const
CustomNonbondedForce
&
force
,
const
Context
&
context
)
{
map
<
std
::
string
,
double
>
v
ariables
;
const
set
<
string
>&
variables
=
expression
.
getV
ariables
()
;
for
(
int
i
=
0
;
i
<
force
.
getNumPerParticleParameters
();
i
++
)
{
stringstream
name1
,
name2
;
name1
<<
force
.
getPerParticleParameterName
(
i
)
<<
1
;
name2
<<
force
.
getPerParticleParameterName
(
i
)
<<
2
;
variables
[
name1
.
str
()]
=
params1
[
i
];
variables
[
name2
.
str
()]
=
params2
[
i
];
if
(
variables
.
find
(
name1
.
str
())
!=
variables
.
end
())
expression
.
getVariableReference
(
name1
.
str
())
=
params1
[
i
];
if
(
variables
.
find
(
name2
.
str
())
!=
variables
.
end
())
expression
.
getVariableReference
(
name2
.
str
())
=
params2
[
i
];
}
for
(
int
i
=
0
;
i
<
force
.
getNumGlobalParameters
();
i
++
)
{
const
string
&
name
=
force
.
getGlobalParameterName
(
i
);
variables
[
name
]
=
context
.
getParameter
(
name
);
if
(
variables
.
find
(
name
)
!=
variables
.
end
())
expression
.
getVariableReference
(
name
)
=
context
.
getParameter
(
name
);
}
// To integrate from r_cutoff to infinity, make the change of variables x=r_cutoff/r and integrate from 0 to 1.
// This introduces another r^2 into the integral, which along with the r^2 in the formula for the correction
// means we multiply the function by r^4. Use the midpoint method.
double
*
rPointer
;
try
{
rPointer
=
&
expression
.
getVariableReference
(
"r"
);
}
catch
(
exception
&
ex
)
{
throw
OpenMMException
(
"CustomNonbondedForce: Cannot use long range correction with a force that does not depend on r."
);
}
double
cutoff
=
force
.
getCutoffDistance
();
double
sum
=
0
;
int
numPoints
=
1
;
...
...
@@ -281,9 +291,9 @@ double CustomNonbondedForceImpl::integrateInteraction(const Lepton::ExpressionPr
continue
;
double
x
=
(
i
+
0.5
)
/
numPoints
;
double
r
=
cutoff
/
x
;
variables
[
"r"
]
=
r
;
*
rPointer
=
r
;
double
r2
=
r
*
r
;
newSum
+=
expression
.
evaluate
(
variables
)
*
r2
*
r2
;
newSum
+=
expression
.
evaluate
()
*
r2
*
r2
;
}
sum
=
newSum
/
numPoints
+
oldSum
/
3
;
if
(
iteration
>
2
&&
(
fabs
((
sum
-
oldSum
)
/
sum
)
<
1e-5
||
sum
==
0
))
...
...
@@ -309,8 +319,8 @@ double CustomNonbondedForceImpl::integrateInteraction(const Lepton::ExpressionPr
double
x
=
(
i
+
0.5
)
/
numPoints
;
double
r
=
rswitch
+
x
*
(
cutoff
-
rswitch
);
double
switchValue
=
x
*
x
*
x
*
(
10
+
x
*
(
-
15
+
x
*
6
));
variables
[
"r"
]
=
r
;
newSum
+=
switchValue
*
expression
.
evaluate
(
variables
)
*
r
*
r
;
*
rPointer
=
r
;
newSum
+=
switchValue
*
expression
.
evaluate
()
*
r
*
r
;
}
sum2
=
newSum
/
numPoints
+
oldSum
/
3
;
if
(
iteration
>
2
&&
(
fabs
((
sum2
-
oldSum
)
/
sum2
)
<
1e-5
||
sum2
==
0
))
...
...
platforms/reference/include/ReferenceCustomAngleIxn.h
View file @
54e47d2d
/* Portions copyright (c) 2010 Stanford University and Simbios.
/* Portions copyright (c) 2010
-2013
Stanford University and Simbios.
* Contributors: Peter Eastman
*
* Permission is hereby granted, free of charge, to any person obtaining
...
...
@@ -25,17 +25,20 @@
#define __ReferenceCustomAngleIxn_H__
#include "ReferenceBondIxn.h"
#include "lepton/Expression
Program
.h"
#include "lepton/
Compiled
Expression.h"
// ---------------------------------------------------------------------------------------
class
ReferenceCustomAngleIxn
:
public
ReferenceBondIxn
{
private:
Lepton
::
ExpressionProgram
energyExpression
;
Lepton
::
ExpressionProgram
forceExpression
;
std
::
vector
<
std
::
string
>
paramNames
;
std
::
map
<
std
::
string
,
double
>
globalParameters
;
Lepton
::
CompiledExpression
energyExpression
;
Lepton
::
CompiledExpression
forceExpression
;
std
::
vector
<
double
*>
energyParams
;
std
::
vector
<
double
*>
forceParams
;
double
*
energyTheta
;
double
*
forceTheta
;
int
numParameters
;
public:
...
...
@@ -45,7 +48,7 @@ class ReferenceCustomAngleIxn : public ReferenceBondIxn {
--------------------------------------------------------------------------------------- */
ReferenceCustomAngleIxn
(
const
Lepton
::
Expression
Program
&
energyExpression
,
const
Lepton
::
Expression
Program
&
forceExpression
,
ReferenceCustomAngleIxn
(
const
Lepton
::
Compiled
Expression
&
energyExpression
,
const
Lepton
::
Compiled
Expression
&
forceExpression
,
const
std
::
vector
<
std
::
string
>&
parameterNames
,
std
::
map
<
std
::
string
,
double
>
globalParameters
);
/**---------------------------------------------------------------------------------------
...
...
platforms/reference/include/ReferenceCustomBondIxn.h
View file @
54e47d2d
/* Portions copyright (c) 2009 Stanford University and Simbios.
/* Portions copyright (c) 2009
-2013
Stanford University and Simbios.
* Contributors: Peter Eastman
*
* Permission is hereby granted, free of charge, to any person obtaining
...
...
@@ -26,17 +26,20 @@
#define __ReferenceCustomBondIxn_H__
#include "ReferenceBondIxn.h"
#include "lepton/Expression
Program
.h"
#include "lepton/
Compiled
Expression.h"
// ---------------------------------------------------------------------------------------
class
ReferenceCustomBondIxn
:
public
ReferenceBondIxn
{
private:
Lepton
::
ExpressionProgram
energyExpression
;
Lepton
::
ExpressionProgram
forceExpression
;
std
::
vector
<
std
::
string
>
paramNames
;
std
::
map
<
std
::
string
,
double
>
globalParameters
;
Lepton
::
CompiledExpression
energyExpression
;
Lepton
::
CompiledExpression
forceExpression
;
std
::
vector
<
double
*>
energyParams
;
std
::
vector
<
double
*>
forceParams
;
double
*
energyR
;
double
*
forceR
;
int
numParameters
;
public:
...
...
@@ -46,7 +49,7 @@ class ReferenceCustomBondIxn : public ReferenceBondIxn {
--------------------------------------------------------------------------------------- */
ReferenceCustomBondIxn
(
const
Lepton
::
Expression
Program
&
energyExpression
,
const
Lepton
::
Expression
Program
&
forceExpression
,
ReferenceCustomBondIxn
(
const
Lepton
::
Compiled
Expression
&
energyExpression
,
const
Lepton
::
Compiled
Expression
&
forceExpression
,
const
std
::
vector
<
std
::
string
>&
parameterNames
,
std
::
map
<
std
::
string
,
double
>
globalParameters
);
/**---------------------------------------------------------------------------------------
...
...
platforms/reference/include/ReferenceCustomExternalIxn.h
View file @
54e47d2d
/* Portions copyright (c) 2009 Stanford University and Simbios.
/* Portions copyright (c) 2009
-2013
Stanford University and Simbios.
* Contributors: Peter Eastman
*
* Permission is hereby granted, free of charge, to any person obtaining
...
...
@@ -26,19 +26,26 @@
#define __ReferenceCustomExternalIxn_H__
#include "ReferenceCustomExternalIxn.h"
#include "lepton/Expression
Program
.h"
#include "lepton/
Compiled
Expression.h"
// ---------------------------------------------------------------------------------------
class
ReferenceCustomExternalIxn
{
private:
Lepton
::
ExpressionProgram
energyExpression
;
Lepton
::
ExpressionProgram
forceExpressionX
;
Lepton
::
ExpressionProgram
forceExpressionY
;
Lepton
::
ExpressionProgram
forceExpressionZ
;
std
::
vector
<
std
::
string
>
paramNames
;
std
::
map
<
std
::
string
,
double
>
globalParameters
;
Lepton
::
CompiledExpression
energyExpression
;
Lepton
::
CompiledExpression
forceExpressionX
;
Lepton
::
CompiledExpression
forceExpressionY
;
Lepton
::
CompiledExpression
forceExpressionZ
;
std
::
vector
<
double
*>
energyParams
;
std
::
vector
<
double
*>
forceXParams
;
std
::
vector
<
double
*>
forceYParams
;
std
::
vector
<
double
*>
forceZParams
;
double
*
energyX
,
*
energyY
,
*
energyZ
;
double
*
forceXX
,
*
forceXY
,
*
forceXZ
;
double
*
forceYX
,
*
forceYY
,
*
forceYZ
;
double
*
forceZX
,
*
forceZY
,
*
forceZZ
;
int
numParameters
;
public:
...
...
@@ -48,8 +55,8 @@ class ReferenceCustomExternalIxn {
--------------------------------------------------------------------------------------- */
ReferenceCustomExternalIxn
(
const
Lepton
::
Expression
Program
&
energyExpression
,
const
Lepton
::
Expression
Program
&
forceExpressionX
,
const
Lepton
::
Expression
Program
&
forceExpressionY
,
const
Lepton
::
Expression
Program
&
forceExpressionZ
,
ReferenceCustomExternalIxn
(
const
Lepton
::
Compiled
Expression
&
energyExpression
,
const
Lepton
::
Compiled
Expression
&
forceExpressionX
,
const
Lepton
::
Compiled
Expression
&
forceExpressionY
,
const
Lepton
::
Compiled
Expression
&
forceExpressionZ
,
const
std
::
vector
<
std
::
string
>&
parameterNames
,
std
::
map
<
std
::
string
,
double
>
globalParameters
);
/**---------------------------------------------------------------------------------------
...
...
platforms/reference/include/ReferenceCustomNonbondedIxn.h
View file @
54e47d2d
/* Portions copyright (c) 2009 Stanford University and Simbios.
/* Portions copyright (c) 2009
-2013
Stanford University and Simbios.
* Contributors: Peter Eastman
*
* Permission is hereby granted, free of charge, to any person obtaining
...
...
@@ -27,7 +27,7 @@
#include "ReferencePairIxn.h"
#include "ReferenceNeighborList.h"
#include "lepton/Expression
Program
.h"
#include "lepton/
Compiled
Expression.h"
#include <map>
#include <set>
#include <utility>
...
...
@@ -45,10 +45,13 @@ class ReferenceCustomNonbondedIxn {
const
OpenMM
::
NeighborList
*
neighborList
;
RealOpenMM
periodicBoxSize
[
3
];
RealOpenMM
cutoffDistance
,
switchingDistance
;
Lepton
::
Expression
Program
energyExpression
;
Lepton
::
Expression
Program
forceExpression
;
Lepton
::
Compiled
Expression
energyExpression
;
Lepton
::
Compiled
Expression
forceExpression
;
std
::
vector
<
std
::
string
>
paramNames
;
std
::
vector
<
std
::
string
>
particleParamNames
;
std
::
vector
<
double
*>
energyParticleParams
;
std
::
vector
<
double
*>
forceParticleParams
;
double
*
energyR
;
double
*
forceR
;
std
::
vector
<
std
::
pair
<
std
::
set
<
int
>
,
std
::
set
<
int
>
>
>
interactionGroups
;
/**---------------------------------------------------------------------------------------
...
...
@@ -65,9 +68,8 @@ class ReferenceCustomNonbondedIxn {
--------------------------------------------------------------------------------------- */
void
calculateOneIxn
(
int
atom1
,
int
atom2
,
std
::
vector
<
OpenMM
::
RealVec
>&
atomCoordinates
,
std
::
map
<
std
::
string
,
double
>&
variables
,
std
::
vector
<
OpenMM
::
RealVec
>&
forces
,
RealOpenMM
*
energyByAtom
,
RealOpenMM
*
totalEnergy
)
const
;
void
calculateOneIxn
(
int
atom1
,
int
atom2
,
std
::
vector
<
OpenMM
::
RealVec
>&
atomCoordinates
,
std
::
vector
<
OpenMM
::
RealVec
>&
forces
,
RealOpenMM
*
energyByAtom
,
RealOpenMM
*
totalEnergy
);
public:
...
...
@@ -78,7 +80,7 @@ class ReferenceCustomNonbondedIxn {
--------------------------------------------------------------------------------------- */
ReferenceCustomNonbondedIxn
(
const
Lepton
::
Expression
Program
&
energyExpression
,
const
Lepton
::
Expression
Program
&
forceExpression
,
ReferenceCustomNonbondedIxn
(
const
Lepton
::
Compiled
Expression
&
energyExpression
,
const
Lepton
::
Compiled
Expression
&
forceExpression
,
const
std
::
vector
<
std
::
string
>&
parameterNames
);
/**---------------------------------------------------------------------------------------
...
...
@@ -153,7 +155,7 @@ class ReferenceCustomNonbondedIxn {
void
calculatePairIxn
(
int
numberOfAtoms
,
std
::
vector
<
OpenMM
::
RealVec
>&
atomCoordinates
,
RealOpenMM
**
atomParameters
,
std
::
vector
<
std
::
set
<
int
>
>&
exclusions
,
RealOpenMM
*
fixedParameters
,
const
std
::
map
<
std
::
string
,
double
>&
globalParameters
,
std
::
vector
<
OpenMM
::
RealVec
>&
forces
,
RealOpenMM
*
energyByAtom
,
RealOpenMM
*
totalEnergy
)
const
;
std
::
vector
<
OpenMM
::
RealVec
>&
forces
,
RealOpenMM
*
energyByAtom
,
RealOpenMM
*
totalEnergy
);
// ---------------------------------------------------------------------------------------
...
...
platforms/reference/include/ReferenceCustomTorsionIxn.h
View file @
54e47d2d
/* Portions copyright (c) 2010 Stanford University and Simbios.
/* Portions copyright (c) 2010
-2013
Stanford University and Simbios.
* Contributors: Peter Eastman
*
* Permission is hereby granted, free of charge, to any person obtaining
...
...
@@ -25,17 +25,20 @@
#define __ReferenceCustomTorsionIxn_H__
#include "ReferenceBondIxn.h"
#include "lepton/Expression
Program
.h"
#include "lepton/
Compiled
Expression.h"
// ---------------------------------------------------------------------------------------
class
ReferenceCustomTorsionIxn
:
public
ReferenceBondIxn
{
private:
Lepton
::
ExpressionProgram
energyExpression
;
Lepton
::
ExpressionProgram
forceExpression
;
std
::
vector
<
std
::
string
>
paramNames
;
std
::
map
<
std
::
string
,
double
>
globalParameters
;
Lepton
::
CompiledExpression
energyExpression
;
Lepton
::
CompiledExpression
forceExpression
;
std
::
vector
<
double
*>
energyParams
;
std
::
vector
<
double
*>
forceParams
;
double
*
energyTheta
;
double
*
forceTheta
;
int
numParameters
;
public:
...
...
@@ -45,7 +48,7 @@ class ReferenceCustomTorsionIxn : public ReferenceBondIxn {
--------------------------------------------------------------------------------------- */
ReferenceCustomTorsionIxn
(
const
Lepton
::
Expression
Program
&
energyExpression
,
const
Lepton
::
Expression
Program
&
forceExpression
,
ReferenceCustomTorsionIxn
(
const
Lepton
::
Compiled
Expression
&
energyExpression
,
const
Lepton
::
Compiled
Expression
&
forceExpression
,
const
std
::
vector
<
std
::
string
>&
parameterNames
,
std
::
map
<
std
::
string
,
double
>
globalParameters
);
/**---------------------------------------------------------------------------------------
...
...
platforms/reference/include/ReferenceForce.h
View file @
54e47d2d
/* Portions copyright (c) 2006 Stanford University and Simbios.
/* Portions copyright (c) 2006-2013 Stanford University and Simbios.
* Contributors: Pande Group
*
* Permission is hereby granted, free of charge, to any person obtaining
...
...
@@ -25,6 +24,7 @@
#ifndef __ReferenceForce_H__
#define __ReferenceForce_H__
#include "lepton/CompiledExpression.h"
#include "openmm/internal/windowsExport.h"
// ---------------------------------------------------------------------------------------
...
...
@@ -109,6 +109,18 @@ class OPENMM_EXPORT ReferenceForce {
static
void
getDeltaROnly
(
const
RealOpenMM
*
atomCoordinatesI
,
const
RealOpenMM
*
atomCoordinatesJ
,
RealOpenMM
*
deltaR
);
/**
* Get a pointer to the memory for setting a variable in a CompiledExpression. If the expression
* does not use the specified variable, return NULL.
*/
static
double
*
getVariablePointer
(
Lepton
::
CompiledExpression
&
expression
,
const
std
::
string
&
name
);
/**
* Set the value of a variable in a CompiledExpression, using the pointer that was returned by getVariablePointer().
*/
static
void
setVariable
(
double
*
pointer
,
double
value
);
};
// ---------------------------------------------------------------------------------------
...
...
platforms/reference/include/ReferenceKernels.h
View file @
54e47d2d
...
...
@@ -36,6 +36,7 @@
#include "openmm/kernels.h"
#include "SimTKOpenMMRealType.h"
#include "ReferenceNeighborList.h"
#include "lepton/CompiledExpression.h"
#include "lepton/ExpressionProgram.h"
class
CpuObc
;
...
...
@@ -316,7 +317,7 @@ private:
int
numBonds
;
int
**
bondIndexArray
;
RealOpenMM
**
bondParamArray
;
Lepton
::
Expression
Program
energyExpression
,
forceExpression
;
Lepton
::
Compiled
Expression
energyExpression
,
forceExpression
;
std
::
vector
<
std
::
string
>
parameterNames
,
globalParameterNames
;
};
...
...
@@ -392,7 +393,7 @@ private:
int
numAngles
;
int
**
angleIndexArray
;
RealOpenMM
**
angleParamArray
;
Lepton
::
Expression
Program
energyExpression
,
forceExpression
;
Lepton
::
Compiled
Expression
energyExpression
,
forceExpression
;
std
::
vector
<
std
::
string
>
parameterNames
,
globalParameterNames
;
};
...
...
@@ -534,7 +535,7 @@ private:
int
numTorsions
;
int
**
torsionIndexArray
;
RealOpenMM
**
torsionParamArray
;
Lepton
::
Expression
Program
energyExpression
,
forceExpression
;
Lepton
::
Compiled
Expression
energyExpression
,
forceExpression
;
std
::
vector
<
std
::
string
>
parameterNames
,
globalParameterNames
;
};
...
...
@@ -621,7 +622,7 @@ private:
CustomNonbondedForce
*
forceCopy
;
std
::
map
<
std
::
string
,
double
>
globalParamValues
;
std
::
vector
<
std
::
set
<
int
>
>
exclusions
;
Lepton
::
Expression
Program
energyExpression
,
forceExpression
;
Lepton
::
Compiled
Expression
energyExpression
,
forceExpression
;
std
::
vector
<
std
::
string
>
parameterNames
,
globalParameterNames
;
std
::
vector
<
std
::
pair
<
std
::
set
<
int
>
,
std
::
set
<
int
>
>
>
interactionGroups
;
NonbondedMethod
nonbondedMethod
;
...
...
@@ -781,7 +782,7 @@ private:
int
numParticles
;
std
::
vector
<
int
>
particles
;
RealOpenMM
**
particleParamArray
;
Lepton
::
Expression
Program
energyExpression
,
forceExpressionX
,
forceExpressionY
,
forceExpressionZ
;
Lepton
::
Compiled
Expression
energyExpression
,
forceExpressionX
,
forceExpressionY
,
forceExpressionZ
;
std
::
vector
<
std
::
string
>
parameterNames
,
globalParameterNames
;
};
...
...
platforms/reference/src/ReferenceKernels.cpp
View file @
54e47d2d
...
...
@@ -420,8 +420,8 @@ void ReferenceCalcCustomBondForceKernel::initialize(const System& system, const
// Parse the expression used to calculate the force.
Lepton
::
ParsedExpression
expression
=
Lepton
::
Parser
::
parse
(
force
.
getEnergyFunction
()).
optimize
();
energyExpression
=
expression
.
create
Program
();
forceExpression
=
expression
.
differentiate
(
"r"
).
optimize
().
createProgram
();
energyExpression
=
expression
.
create
CompiledExpression
();
forceExpression
=
expression
.
differentiate
(
"r"
).
createCompiledExpression
();
for
(
int
i
=
0
;
i
<
numParameters
;
i
++
)
parameterNames
.
push_back
(
force
.
getPerBondParameterName
(
i
));
for
(
int
i
=
0
;
i
<
force
.
getNumGlobalParameters
();
i
++
)
...
...
@@ -534,8 +534,8 @@ void ReferenceCalcCustomAngleForceKernel::initialize(const System& system, const
// Parse the expression used to calculate the force.
Lepton
::
ParsedExpression
expression
=
Lepton
::
Parser
::
parse
(
force
.
getEnergyFunction
()).
optimize
();
energyExpression
=
expression
.
create
Program
();
forceExpression
=
expression
.
differentiate
(
"theta"
).
optimize
().
createProgram
();
energyExpression
=
expression
.
create
CompiledExpression
();
forceExpression
=
expression
.
differentiate
(
"theta"
).
createCompiledExpression
();
for
(
int
i
=
0
;
i
<
numParameters
;
i
++
)
parameterNames
.
push_back
(
force
.
getPerAngleParameterName
(
i
));
for
(
int
i
=
0
;
i
<
force
.
getNumGlobalParameters
();
i
++
)
...
...
@@ -744,8 +744,8 @@ void ReferenceCalcCustomTorsionForceKernel::initialize(const System& system, con
// Parse the expression used to calculate the force.
Lepton
::
ParsedExpression
expression
=
Lepton
::
Parser
::
parse
(
force
.
getEnergyFunction
()).
optimize
();
energyExpression
=
expression
.
create
Program
();
forceExpression
=
expression
.
differentiate
(
"theta"
).
optimize
().
createProgram
();
energyExpression
=
expression
.
create
CompiledExpression
();
forceExpression
=
expression
.
differentiate
(
"theta"
).
createCompiledExpression
();
for
(
int
i
=
0
;
i
<
numParameters
;
i
++
)
parameterNames
.
push_back
(
force
.
getPerTorsionParameterName
(
i
));
for
(
int
i
=
0
;
i
<
force
.
getNumGlobalParameters
();
i
++
)
...
...
@@ -1028,8 +1028,8 @@ void ReferenceCalcCustomNonbondedForceKernel::initialize(const System& system, c
// Parse the various expressions used to calculate the force.
Lepton
::
ParsedExpression
expression
=
Lepton
::
Parser
::
parse
(
force
.
getEnergyFunction
(),
functions
).
optimize
();
energyExpression
=
expression
.
create
Program
();
forceExpression
=
expression
.
differentiate
(
"r"
).
optimize
().
createProgram
();
energyExpression
=
expression
.
create
CompiledExpression
();
forceExpression
=
expression
.
differentiate
(
"r"
).
createCompiledExpression
();
for
(
int
i
=
0
;
i
<
numParameters
;
i
++
)
parameterNames
.
push_back
(
force
.
getPerParticleParameterName
(
i
));
for
(
int
i
=
0
;
i
<
force
.
getNumGlobalParameters
();
i
++
)
{
...
...
@@ -1426,10 +1426,10 @@ void ReferenceCalcCustomExternalForceKernel::initialize(const System& system, co
// Parse the expression used to calculate the force.
Lepton
::
ParsedExpression
expression
=
Lepton
::
Parser
::
parse
(
force
.
getEnergyFunction
()).
optimize
();
energyExpression
=
expression
.
create
Program
();
forceExpressionX
=
expression
.
differentiate
(
"x"
).
optimize
().
createProgram
();
forceExpressionY
=
expression
.
differentiate
(
"y"
).
optimize
().
createProgram
();
forceExpressionZ
=
expression
.
differentiate
(
"z"
).
optimize
().
createProgram
();
energyExpression
=
expression
.
create
CompiledExpression
();
forceExpressionX
=
expression
.
differentiate
(
"x"
).
createCompiledExpression
();
forceExpressionY
=
expression
.
differentiate
(
"y"
).
createCompiledExpression
();
forceExpressionZ
=
expression
.
differentiate
(
"z"
).
createCompiledExpression
();
for
(
int
i
=
0
;
i
<
numParameters
;
i
++
)
parameterNames
.
push_back
(
force
.
getPerParticleParameterName
(
i
));
for
(
int
i
=
0
;
i
<
force
.
getNumGlobalParameters
();
i
++
)
...
...
platforms/reference/src/SimTKReference/ReferenceCustomAngleIxn.cpp
View file @
54e47d2d
/* Portions copyright (c) 2010 Stanford University and Simbios.
/* Portions copyright (c) 2010
-2013
Stanford University and Simbios.
* Contributors: Peter Eastman
*
* Permission is hereby granted, free of charge, to any person obtaining
...
...
@@ -39,16 +39,21 @@ using namespace std;
--------------------------------------------------------------------------------------- */
ReferenceCustomAngleIxn
::
ReferenceCustomAngleIxn
(
const
Lepton
::
ExpressionProgram
&
energyExpression
,
const
Lepton
::
ExpressionProgram
&
forceExpression
,
const
vector
<
string
>&
parameterNames
,
map
<
string
,
double
>
globalParameters
)
:
energyExpression
(
energyExpression
),
forceExpression
(
forceExpression
),
paramNames
(
parameterNames
),
globalParameters
(
globalParameters
)
{
// ---------------------------------------------------------------------------------------
// static const char* methodName = "\nReferenceCustomAngleIxn::ReferenceCustomAngleIxn";
// ---------------------------------------------------------------------------------------
ReferenceCustomAngleIxn
::
ReferenceCustomAngleIxn
(
const
Lepton
::
CompiledExpression
&
energyExpression
,
const
Lepton
::
CompiledExpression
&
forceExpression
,
const
vector
<
string
>&
parameterNames
,
map
<
string
,
double
>
globalParameters
)
:
energyExpression
(
energyExpression
),
forceExpression
(
forceExpression
)
{
energyTheta
=
ReferenceForce
::
getVariablePointer
(
this
->
energyExpression
,
"theta"
);
forceTheta
=
ReferenceForce
::
getVariablePointer
(
this
->
forceExpression
,
"theta"
);
numParameters
=
parameterNames
.
size
();
for
(
int
i
=
0
;
i
<
(
int
)
numParameters
;
i
++
)
{
energyParams
.
push_back
(
ReferenceForce
::
getVariablePointer
(
this
->
energyExpression
,
parameterNames
[
i
]));
forceParams
.
push_back
(
ReferenceForce
::
getVariablePointer
(
this
->
forceExpression
,
parameterNames
[
i
]));
}
for
(
map
<
string
,
double
>::
const_iterator
iter
=
globalParameters
.
begin
();
iter
!=
globalParameters
.
end
();
++
iter
)
{
ReferenceForce
::
setVariable
(
ReferenceForce
::
getVariablePointer
(
this
->
energyExpression
,
iter
->
first
),
iter
->
second
);
ReferenceForce
::
setVariable
(
ReferenceForce
::
getVariablePointer
(
this
->
forceExpression
,
iter
->
first
),
iter
->
second
);
}
}
/**---------------------------------------------------------------------------------------
...
...
@@ -91,9 +96,10 @@ void ReferenceCustomAngleIxn::calculateBondIxn( int* atomIndices,
static
const
RealOpenMM
one
=
1.0
;
RealOpenMM
deltaR
[
2
][
ReferenceForce
::
LastDeltaRIndex
];
map
<
string
,
double
>
variables
=
globalParameters
;
for
(
int
i
=
0
;
i
<
(
int
)
paramNames
.
size
();
++
i
)
variables
[
paramNames
[
i
]]
=
parameters
[
i
];
for
(
int
i
=
0
;
i
<
numParameters
;
i
++
)
{
ReferenceForce
::
setVariable
(
energyParams
[
i
],
parameters
[
i
]);
ReferenceForce
::
setVariable
(
forceParams
[
i
],
parameters
[
i
]);
}
// ---------------------------------------------------------------------------------------
...
...
@@ -118,12 +124,13 @@ void ReferenceCustomAngleIxn::calculateBondIxn( int* atomIndices,
angle
=
PI_M
;
else
angle
=
ACOS
(
cosine
);
variables
[
"theta"
]
=
angle
;
ReferenceForce
::
setVariable
(
energyTheta
,
angle
);
ReferenceForce
::
setVariable
(
forceTheta
,
angle
);
// Compute the force and energy, and apply them to the atoms.
RealOpenMM
energy
=
(
RealOpenMM
)
energyExpression
.
evaluate
(
variables
);
RealOpenMM
dEdR
=
(
RealOpenMM
)
forceExpression
.
evaluate
(
variables
);
RealOpenMM
energy
=
(
RealOpenMM
)
energyExpression
.
evaluate
();
RealOpenMM
dEdR
=
(
RealOpenMM
)
forceExpression
.
evaluate
();
RealOpenMM
termA
=
dEdR
/
(
deltaR
[
0
][
ReferenceForce
::
R2Index
]
*
rp
);
RealOpenMM
termC
=
-
dEdR
/
(
deltaR
[
1
][
ReferenceForce
::
R2Index
]
*
rp
);
...
...
platforms/reference/src/SimTKReference/ReferenceCustomBondIxn.cpp
View file @
54e47d2d
/* Portions copyright (c) 2009 Stanford University and Simbios.
/* Portions copyright (c) 2009
-2013
Stanford University and Simbios.
* Contributors: Peter Eastman
*
* Permission is hereby granted, free of charge, to any person obtaining
...
...
@@ -40,16 +40,20 @@ using namespace OpenMM;
--------------------------------------------------------------------------------------- */
ReferenceCustomBondIxn
::
ReferenceCustomBondIxn
(
const
Lepton
::
ExpressionProgram
&
energyExpression
,
const
Lepton
::
ExpressionProgram
&
forceExpression
,
const
vector
<
string
>&
parameterNames
,
map
<
string
,
double
>
globalParameters
)
:
energyExpression
(
energyExpression
),
forceExpression
(
forceExpression
),
paramNames
(
parameterNames
),
globalParameters
(
globalParameters
)
{
// ---------------------------------------------------------------------------------------
// static const char* methodName = "\nReferenceCustomBondIxn::ReferenceCustomBondIxn";
// ---------------------------------------------------------------------------------------
ReferenceCustomBondIxn
::
ReferenceCustomBondIxn
(
const
Lepton
::
CompiledExpression
&
energyExpression
,
const
Lepton
::
CompiledExpression
&
forceExpression
,
const
vector
<
string
>&
parameterNames
,
map
<
string
,
double
>
globalParameters
)
:
energyExpression
(
energyExpression
),
forceExpression
(
forceExpression
)
{
energyR
=
ReferenceForce
::
getVariablePointer
(
this
->
energyExpression
,
"r"
);
forceR
=
ReferenceForce
::
getVariablePointer
(
this
->
forceExpression
,
"r"
);
numParameters
=
parameterNames
.
size
();
for
(
int
i
=
0
;
i
<
(
int
)
numParameters
;
i
++
)
{
energyParams
.
push_back
(
ReferenceForce
::
getVariablePointer
(
this
->
energyExpression
,
parameterNames
[
i
]));
forceParams
.
push_back
(
ReferenceForce
::
getVariablePointer
(
this
->
forceExpression
,
parameterNames
[
i
]));
}
for
(
map
<
string
,
double
>::
const_iterator
iter
=
globalParameters
.
begin
();
iter
!=
globalParameters
.
end
();
++
iter
)
{
ReferenceForce
::
setVariable
(
ReferenceForce
::
getVariablePointer
(
this
->
energyExpression
,
iter
->
first
),
iter
->
second
);
ReferenceForce
::
setVariable
(
ReferenceForce
::
getVariablePointer
(
this
->
forceExpression
,
iter
->
first
),
iter
->
second
);
}
}
/**---------------------------------------------------------------------------------------
...
...
@@ -95,9 +99,10 @@ void ReferenceCustomBondIxn::calculateBondIxn( int* atomIndices,
static
const
RealOpenMM
half
=
0.5
;
RealOpenMM
deltaR
[
ReferenceForce
::
LastDeltaRIndex
];
map
<
string
,
double
>
variables
=
globalParameters
;
for
(
int
i
=
0
;
i
<
(
int
)
paramNames
.
size
();
++
i
)
variables
[
paramNames
[
i
]]
=
parameters
[
i
];
for
(
int
i
=
0
;
i
<
numParameters
;
i
++
)
{
ReferenceForce
::
setVariable
(
energyParams
[
i
],
parameters
[
i
]);
ReferenceForce
::
setVariable
(
forceParams
[
i
],
parameters
[
i
]);
}
// ---------------------------------------------------------------------------------------
...
...
@@ -106,8 +111,10 @@ void ReferenceCustomBondIxn::calculateBondIxn( int* atomIndices,
int
atomAIndex
=
atomIndices
[
0
];
int
atomBIndex
=
atomIndices
[
1
];
ReferenceForce
::
getDeltaR
(
atomCoordinates
[
atomAIndex
],
atomCoordinates
[
atomBIndex
],
deltaR
);
variables
[
"r"
]
=
deltaR
[
ReferenceForce
::
RIndex
];
RealOpenMM
dEdR
=
(
RealOpenMM
)
forceExpression
.
evaluate
(
variables
);
ReferenceForce
::
setVariable
(
energyR
,
deltaR
[
ReferenceForce
::
RIndex
]);
ReferenceForce
::
setVariable
(
forceR
,
deltaR
[
ReferenceForce
::
RIndex
]);
RealOpenMM
dEdR
=
(
RealOpenMM
)
forceExpression
.
evaluate
();
dEdR
=
deltaR
[
ReferenceForce
::
RIndex
]
>
zero
?
(
dEdR
/
deltaR
[
ReferenceForce
::
RIndex
])
:
zero
;
forces
[
atomAIndex
][
0
]
+=
dEdR
*
deltaR
[
ReferenceForce
::
XIndex
];
...
...
@@ -119,5 +126,5 @@ void ReferenceCustomBondIxn::calculateBondIxn( int* atomIndices,
forces
[
atomBIndex
][
2
]
-=
dEdR
*
deltaR
[
ReferenceForce
::
ZIndex
];
if
(
totalEnergy
!=
NULL
)
*
totalEnergy
+=
(
RealOpenMM
)
energyExpression
.
evaluate
(
variables
);
*
totalEnergy
+=
(
RealOpenMM
)
energyExpression
.
evaluate
();
}
platforms/reference/src/SimTKReference/ReferenceCustomExternalIxn.cpp
View file @
54e47d2d
/* Portions copyright (c) 2009 Stanford University and Simbios.
/* Portions copyright (c) 2009
-2013
Stanford University and Simbios.
* Contributors: Peter Eastman
*
* Permission is hereby granted, free of charge, to any person obtaining
...
...
@@ -40,18 +40,37 @@ using namespace OpenMM;
--------------------------------------------------------------------------------------- */
ReferenceCustomExternalIxn
::
ReferenceCustomExternalIxn
(
const
Lepton
::
Expression
Program
&
energyExpression
,
const
Lepton
::
Expression
Program
&
forceExpressionX
,
const
Lepton
::
Expression
Program
&
forceExpressionY
,
const
Lepton
::
Expression
Program
&
forceExpressionZ
,
const
vector
<
string
>&
parameterNames
,
map
<
string
,
double
>
globalParameters
)
:
ReferenceCustomExternalIxn
::
ReferenceCustomExternalIxn
(
const
Lepton
::
Compiled
Expression
&
energyExpression
,
const
Lepton
::
Compiled
Expression
&
forceExpressionX
,
const
Lepton
::
Compiled
Expression
&
forceExpressionY
,
const
Lepton
::
Compiled
Expression
&
forceExpressionZ
,
const
vector
<
string
>&
parameterNames
,
map
<
string
,
double
>
globalParameters
)
:
energyExpression
(
energyExpression
),
forceExpressionX
(
forceExpressionX
),
forceExpressionY
(
forceExpressionY
),
forceExpressionZ
(
forceExpressionZ
),
paramNames
(
parameterNames
),
globalParameters
(
globalParameters
)
{
// ---------------------------------------------------------------------------------------
// static const char* methodName = "\nReferenceCustomExternalIxn::ReferenceCustomExternalIxn";
// ---------------------------------------------------------------------------------------
forceExpressionZ
(
forceExpressionZ
)
{
energyX
=
ReferenceForce
::
getVariablePointer
(
this
->
energyExpression
,
"x"
);
energyY
=
ReferenceForce
::
getVariablePointer
(
this
->
energyExpression
,
"y"
);
energyZ
=
ReferenceForce
::
getVariablePointer
(
this
->
energyExpression
,
"z"
);
forceXX
=
ReferenceForce
::
getVariablePointer
(
this
->
forceExpressionX
,
"x"
);
forceXY
=
ReferenceForce
::
getVariablePointer
(
this
->
forceExpressionX
,
"y"
);
forceXZ
=
ReferenceForce
::
getVariablePointer
(
this
->
forceExpressionX
,
"z"
);
forceYX
=
ReferenceForce
::
getVariablePointer
(
this
->
forceExpressionY
,
"x"
);
forceYY
=
ReferenceForce
::
getVariablePointer
(
this
->
forceExpressionY
,
"y"
);
forceYZ
=
ReferenceForce
::
getVariablePointer
(
this
->
forceExpressionY
,
"z"
);
forceZX
=
ReferenceForce
::
getVariablePointer
(
this
->
forceExpressionZ
,
"x"
);
forceZY
=
ReferenceForce
::
getVariablePointer
(
this
->
forceExpressionZ
,
"y"
);
forceZZ
=
ReferenceForce
::
getVariablePointer
(
this
->
forceExpressionZ
,
"z"
);
numParameters
=
parameterNames
.
size
();
for
(
int
i
=
0
;
i
<
(
int
)
numParameters
;
i
++
)
{
energyParams
.
push_back
(
ReferenceForce
::
getVariablePointer
(
this
->
energyExpression
,
parameterNames
[
i
]));
forceXParams
.
push_back
(
ReferenceForce
::
getVariablePointer
(
this
->
forceExpressionX
,
parameterNames
[
i
]));
forceYParams
.
push_back
(
ReferenceForce
::
getVariablePointer
(
this
->
forceExpressionY
,
parameterNames
[
i
]));
forceZParams
.
push_back
(
ReferenceForce
::
getVariablePointer
(
this
->
forceExpressionZ
,
parameterNames
[
i
]));
}
for
(
map
<
string
,
double
>::
const_iterator
iter
=
globalParameters
.
begin
();
iter
!=
globalParameters
.
end
();
++
iter
)
{
ReferenceForce
::
setVariable
(
ReferenceForce
::
getVariablePointer
(
this
->
energyExpression
,
iter
->
first
),
iter
->
second
);
ReferenceForce
::
setVariable
(
ReferenceForce
::
getVariablePointer
(
this
->
forceExpressionX
,
iter
->
first
),
iter
->
second
);
ReferenceForce
::
setVariable
(
ReferenceForce
::
getVariablePointer
(
this
->
forceExpressionY
,
iter
->
first
),
iter
->
second
);
ReferenceForce
::
setVariable
(
ReferenceForce
::
getVariablePointer
(
this
->
forceExpressionZ
,
iter
->
first
),
iter
->
second
);
}
}
/**---------------------------------------------------------------------------------------
...
...
@@ -90,18 +109,30 @@ void ReferenceCustomExternalIxn::calculateForce( int atomIndex,
static
const
std
::
string
methodName
=
"
\n
ReferenceCustomExternalIxn::calculateBondIxn"
;
map
<
string
,
double
>
variables
=
globalParameters
;
for
(
int
i
=
0
;
i
<
(
int
)
paramNames
.
size
();
++
i
)
variables
[
paramNames
[
i
]]
=
parameters
[
i
];
variables
[
"x"
]
=
atomCoordinates
[
atomIndex
][
0
];
variables
[
"y"
]
=
atomCoordinates
[
atomIndex
][
1
];
variables
[
"z"
]
=
atomCoordinates
[
atomIndex
][
2
];
for
(
int
i
=
0
;
i
<
numParameters
;
i
++
)
{
ReferenceForce
::
setVariable
(
energyParams
[
i
],
parameters
[
i
]);
ReferenceForce
::
setVariable
(
forceXParams
[
i
],
parameters
[
i
]);
ReferenceForce
::
setVariable
(
forceYParams
[
i
],
parameters
[
i
]);
ReferenceForce
::
setVariable
(
forceZParams
[
i
],
parameters
[
i
]);
}
ReferenceForce
::
setVariable
(
energyX
,
atomCoordinates
[
atomIndex
][
0
]);
ReferenceForce
::
setVariable
(
energyY
,
atomCoordinates
[
atomIndex
][
1
]);
ReferenceForce
::
setVariable
(
energyZ
,
atomCoordinates
[
atomIndex
][
2
]);
ReferenceForce
::
setVariable
(
forceXX
,
atomCoordinates
[
atomIndex
][
0
]);
ReferenceForce
::
setVariable
(
forceXY
,
atomCoordinates
[
atomIndex
][
1
]);
ReferenceForce
::
setVariable
(
forceXZ
,
atomCoordinates
[
atomIndex
][
2
]);
ReferenceForce
::
setVariable
(
forceYX
,
atomCoordinates
[
atomIndex
][
0
]);
ReferenceForce
::
setVariable
(
forceYY
,
atomCoordinates
[
atomIndex
][
1
]);
ReferenceForce
::
setVariable
(
forceYZ
,
atomCoordinates
[
atomIndex
][
2
]);
ReferenceForce
::
setVariable
(
forceZX
,
atomCoordinates
[
atomIndex
][
0
]);
ReferenceForce
::
setVariable
(
forceZY
,
atomCoordinates
[
atomIndex
][
1
]);
ReferenceForce
::
setVariable
(
forceZZ
,
atomCoordinates
[
atomIndex
][
2
]);
// ---------------------------------------------------------------------------------------
forces
[
atomIndex
][
0
]
-=
(
RealOpenMM
)
forceExpressionX
.
evaluate
(
variables
);
forces
[
atomIndex
][
1
]
-=
(
RealOpenMM
)
forceExpressionY
.
evaluate
(
variables
);
forces
[
atomIndex
][
2
]
-=
(
RealOpenMM
)
forceExpressionZ
.
evaluate
(
variables
);
forces
[
atomIndex
][
0
]
-=
(
RealOpenMM
)
forceExpressionX
.
evaluate
();
forces
[
atomIndex
][
1
]
-=
(
RealOpenMM
)
forceExpressionY
.
evaluate
();
forces
[
atomIndex
][
2
]
-=
(
RealOpenMM
)
forceExpressionZ
.
evaluate
();
if
(
energy
!=
NULL
)
*
energy
+=
(
RealOpenMM
)
energyExpression
.
evaluate
(
variables
);
*
energy
+=
(
RealOpenMM
)
energyExpression
.
evaluate
();
}
platforms/reference/src/SimTKReference/ReferenceCustomNonbondedIxn.cpp
View file @
54e47d2d
/* Portions copyright (c) 2009 Stanford University and Simbios.
/* Portions copyright (c) 2009
-2013
Stanford University and Simbios.
* Contributors: Peter Eastman
*
* Permission is hereby granted, free of charge, to any person obtaining
...
...
@@ -45,8 +45,8 @@ using OpenMM::RealVec;
--------------------------------------------------------------------------------------- */
ReferenceCustomNonbondedIxn
::
ReferenceCustomNonbondedIxn
(
const
Lepton
::
Expression
Program
&
energyExpression
,
const
Lepton
::
Expression
Program
&
forceExpression
,
const
vector
<
string
>&
parameterNames
)
:
ReferenceCustomNonbondedIxn
::
ReferenceCustomNonbondedIxn
(
const
Lepton
::
Compiled
Expression
&
energyExpression
,
const
Lepton
::
Compiled
Expression
&
forceExpression
,
const
vector
<
string
>&
parameterNames
)
:
cutoff
(
false
),
useSwitch
(
false
),
periodic
(
false
),
energyExpression
(
energyExpression
),
forceExpression
(
forceExpression
),
paramNames
(
parameterNames
)
{
// ---------------------------------------------------------------------------------------
...
...
@@ -55,11 +55,14 @@ ReferenceCustomNonbondedIxn::ReferenceCustomNonbondedIxn(const Lepton::Expressio
// ---------------------------------------------------------------------------------------
energyR
=
ReferenceForce
::
getVariablePointer
(
this
->
energyExpression
,
"r"
);
forceR
=
ReferenceForce
::
getVariablePointer
(
this
->
forceExpression
,
"r"
);
for
(
int
i
=
0
;
i
<
(
int
)
paramNames
.
size
();
i
++
)
{
for
(
int
j
=
1
;
j
<
3
;
j
++
)
{
stringstream
name
;
name
<<
paramNames
[
i
]
<<
j
;
particleParamNames
.
push_back
(
name
.
str
());
energyParticleParams
.
push_back
(
ReferenceForce
::
getVariablePointer
(
this
->
energyExpression
,
name
.
str
()));
forceParticleParams
.
push_back
(
ReferenceForce
::
getVariablePointer
(
this
->
forceExpression
,
name
.
str
()));
}
}
}
...
...
@@ -166,9 +169,12 @@ void ReferenceCustomNonbondedIxn::setUseSwitchingFunction( RealOpenMM distance )
void
ReferenceCustomNonbondedIxn
::
calculatePairIxn
(
int
numberOfAtoms
,
vector
<
RealVec
>&
atomCoordinates
,
RealOpenMM
**
atomParameters
,
vector
<
set
<
int
>
>&
exclusions
,
RealOpenMM
*
fixedParameters
,
const
map
<
string
,
double
>&
globalParameters
,
vector
<
RealVec
>&
forces
,
RealOpenMM
*
energyByAtom
,
RealOpenMM
*
totalEnergy
)
const
{
RealOpenMM
*
energyByAtom
,
RealOpenMM
*
totalEnergy
)
{
map
<
string
,
double
>
variables
=
globalParameters
;
for
(
map
<
string
,
double
>::
const_iterator
iter
=
globalParameters
.
begin
();
iter
!=
globalParameters
.
end
();
++
iter
)
{
ReferenceForce
::
setVariable
(
ReferenceForce
::
getVariablePointer
(
energyExpression
,
iter
->
first
),
iter
->
second
);
ReferenceForce
::
setVariable
(
ReferenceForce
::
getVariablePointer
(
forceExpression
,
iter
->
first
),
iter
->
second
);
}
if
(
interactionGroups
.
size
()
>
0
)
{
// The user has specified interaction groups, so compute only the requested interactions.
...
...
@@ -182,10 +188,12 @@ void ReferenceCustomNonbondedIxn::calculatePairIxn( int numberOfAtoms, vector<Re
if
(
*
atom1
>
*
atom2
&&
set1
.
find
(
*
atom2
)
!=
set1
.
end
()
&&
set2
.
find
(
*
atom1
)
!=
set2
.
end
())
continue
;
// Both atoms are in both sets, so skip duplicate interactions.
for
(
int
j
=
0
;
j
<
(
int
)
paramNames
.
size
();
j
++
)
{
variables
[
particleParamNames
[
j
*
2
]]
=
atomParameters
[
*
atom1
][
j
];
variables
[
particleParamNames
[
j
*
2
+
1
]]
=
atomParameters
[
*
atom2
][
j
];
ReferenceForce
::
setVariable
(
energyParticleParams
[
j
*
2
],
atomParameters
[
*
atom1
][
j
]);
ReferenceForce
::
setVariable
(
energyParticleParams
[
j
*
2
+
1
],
atomParameters
[
*
atom2
][
j
]);
ReferenceForce
::
setVariable
(
forceParticleParams
[
j
*
2
],
atomParameters
[
*
atom1
][
j
]);
ReferenceForce
::
setVariable
(
forceParticleParams
[
j
*
2
+
1
],
atomParameters
[
*
atom2
][
j
]);
}
calculateOneIxn
(
*
atom1
,
*
atom2
,
atomCoordinates
,
variables
,
forces
,
energyByAtom
,
totalEnergy
);
calculateOneIxn
(
*
atom1
,
*
atom2
,
atomCoordinates
,
forces
,
energyByAtom
,
totalEnergy
);
}
}
}
...
...
@@ -196,10 +204,12 @@ void ReferenceCustomNonbondedIxn::calculatePairIxn( int numberOfAtoms, vector<Re
for
(
int
i
=
0
;
i
<
(
int
)
neighborList
->
size
();
i
++
)
{
OpenMM
::
AtomPair
pair
=
(
*
neighborList
)[
i
];
for
(
int
j
=
0
;
j
<
(
int
)
paramNames
.
size
();
j
++
)
{
variables
[
particleParamNames
[
j
*
2
]]
=
atomParameters
[
pair
.
first
][
j
];
variables
[
particleParamNames
[
j
*
2
+
1
]]
=
atomParameters
[
pair
.
second
][
j
];
ReferenceForce
::
setVariable
(
energyParticleParams
[
j
*
2
],
atomParameters
[
pair
.
first
][
j
]);
ReferenceForce
::
setVariable
(
energyParticleParams
[
j
*
2
+
1
],
atomParameters
[
pair
.
second
][
j
]);
ReferenceForce
::
setVariable
(
forceParticleParams
[
j
*
2
],
atomParameters
[
pair
.
first
][
j
]);
ReferenceForce
::
setVariable
(
forceParticleParams
[
j
*
2
+
1
],
atomParameters
[
pair
.
second
][
j
]);
}
calculateOneIxn
(
pair
.
first
,
pair
.
second
,
atomCoordinates
,
variables
,
forces
,
energyByAtom
,
totalEnergy
);
calculateOneIxn
(
pair
.
first
,
pair
.
second
,
atomCoordinates
,
forces
,
energyByAtom
,
totalEnergy
);
}
}
else
{
...
...
@@ -209,10 +219,12 @@ void ReferenceCustomNonbondedIxn::calculatePairIxn( int numberOfAtoms, vector<Re
for
(
int
jj
=
ii
+
1
;
jj
<
numberOfAtoms
;
jj
++
)
{
if
(
exclusions
[
jj
].
find
(
ii
)
==
exclusions
[
jj
].
end
())
{
for
(
int
j
=
0
;
j
<
(
int
)
paramNames
.
size
();
j
++
)
{
variables
[
particleParamNames
[
j
*
2
]]
=
atomParameters
[
ii
][
j
];
variables
[
particleParamNames
[
j
*
2
+
1
]]
=
atomParameters
[
jj
][
j
];
ReferenceForce
::
setVariable
(
energyParticleParams
[
j
*
2
],
atomParameters
[
ii
][
j
]);
ReferenceForce
::
setVariable
(
energyParticleParams
[
j
*
2
+
1
],
atomParameters
[
jj
][
j
]);
ReferenceForce
::
setVariable
(
forceParticleParams
[
j
*
2
],
atomParameters
[
ii
][
j
]);
ReferenceForce
::
setVariable
(
forceParticleParams
[
j
*
2
+
1
],
atomParameters
[
jj
][
j
]);
}
calculateOneIxn
(
ii
,
jj
,
atomCoordinates
,
variables
,
forces
,
energyByAtom
,
totalEnergy
);
calculateOneIxn
(
ii
,
jj
,
atomCoordinates
,
forces
,
energyByAtom
,
totalEnergy
);
}
}
}
...
...
@@ -233,9 +245,8 @@ void ReferenceCustomNonbondedIxn::calculatePairIxn( int numberOfAtoms, vector<Re
--------------------------------------------------------------------------------------- */
void
ReferenceCustomNonbondedIxn
::
calculateOneIxn
(
int
ii
,
int
jj
,
vector
<
RealVec
>&
atomCoordinates
,
map
<
string
,
double
>&
variables
,
vector
<
RealVec
>&
forces
,
RealOpenMM
*
energyByAtom
,
RealOpenMM
*
totalEnergy
)
const
{
void
ReferenceCustomNonbondedIxn
::
calculateOneIxn
(
int
ii
,
int
jj
,
vector
<
RealVec
>&
atomCoordinates
,
vector
<
RealVec
>&
forces
,
RealOpenMM
*
energyByAtom
,
RealOpenMM
*
totalEnergy
)
{
// ---------------------------------------------------------------------------------------
...
...
@@ -266,9 +277,10 @@ void ReferenceCustomNonbondedIxn::calculateOneIxn( int ii, int jj, vector<RealVe
// accumulate forces
variables
[
"r"
]
=
r
;
RealOpenMM
dEdR
=
(
RealOpenMM
)
(
forceExpression
.
evaluate
(
variables
)
/
(
deltaR
[
ReferenceForce
::
RIndex
]));
RealOpenMM
energy
=
(
RealOpenMM
)
energyExpression
.
evaluate
(
variables
);
ReferenceForce
::
setVariable
(
energyR
,
r
);
ReferenceForce
::
setVariable
(
forceR
,
r
);
RealOpenMM
dEdR
=
(
RealOpenMM
)
(
forceExpression
.
evaluate
()
/
(
deltaR
[
ReferenceForce
::
RIndex
]));
RealOpenMM
energy
=
(
RealOpenMM
)
energyExpression
.
evaluate
();
if
(
useSwitch
)
{
if
(
r
>
switchingDistance
)
{
RealOpenMM
t
=
(
r
-
switchingDistance
)
/
(
cutoffDistance
-
switchingDistance
);
...
...
platforms/reference/src/SimTKReference/ReferenceCustomTorsionIxn.cpp
View file @
54e47d2d
/* Portions copyright (c) 2010 Stanford University and Simbios.
/* Portions copyright (c) 2010
-2013
Stanford University and Simbios.
* Contributors: Peter Eastman
*
* Permission is hereby granted, free of charge, to any person obtaining
...
...
@@ -39,16 +39,21 @@ using namespace OpenMM;
--------------------------------------------------------------------------------------- */
ReferenceCustomTorsionIxn
::
ReferenceCustomTorsionIxn
(
const
Lepton
::
ExpressionProgram
&
energyExpression
,
const
Lepton
::
ExpressionProgram
&
forceExpression
,
const
vector
<
string
>&
parameterNames
,
map
<
string
,
double
>
globalParameters
)
:
energyExpression
(
energyExpression
),
forceExpression
(
forceExpression
),
paramNames
(
parameterNames
),
globalParameters
(
globalParameters
)
{
// ---------------------------------------------------------------------------------------
// static const char* methodName = "\nReferenceCustomTorsionIxn::ReferenceCustomTorsionIxn";
// ---------------------------------------------------------------------------------------
ReferenceCustomTorsionIxn
::
ReferenceCustomTorsionIxn
(
const
Lepton
::
CompiledExpression
&
energyExpression
,
const
Lepton
::
CompiledExpression
&
forceExpression
,
const
vector
<
string
>&
parameterNames
,
map
<
string
,
double
>
globalParameters
)
:
energyExpression
(
energyExpression
),
forceExpression
(
forceExpression
)
{
energyTheta
=
ReferenceForce
::
getVariablePointer
(
this
->
energyExpression
,
"theta"
);
forceTheta
=
ReferenceForce
::
getVariablePointer
(
this
->
forceExpression
,
"theta"
);
numParameters
=
parameterNames
.
size
();
for
(
int
i
=
0
;
i
<
(
int
)
numParameters
;
i
++
)
{
energyParams
.
push_back
(
ReferenceForce
::
getVariablePointer
(
this
->
energyExpression
,
parameterNames
[
i
]));
forceParams
.
push_back
(
ReferenceForce
::
getVariablePointer
(
this
->
forceExpression
,
parameterNames
[
i
]));
}
for
(
map
<
string
,
double
>::
const_iterator
iter
=
globalParameters
.
begin
();
iter
!=
globalParameters
.
end
();
++
iter
)
{
ReferenceForce
::
setVariable
(
ReferenceForce
::
getVariablePointer
(
this
->
energyExpression
,
iter
->
first
),
iter
->
second
);
ReferenceForce
::
setVariable
(
ReferenceForce
::
getVariablePointer
(
this
->
forceExpression
,
iter
->
first
),
iter
->
second
);
}
}
/**---------------------------------------------------------------------------------------
...
...
@@ -91,9 +96,10 @@ void ReferenceCustomTorsionIxn::calculateBondIxn( int* atomIndices,
static
const
RealOpenMM
one
=
1.0
;
RealOpenMM
deltaR
[
3
][
ReferenceForce
::
LastDeltaRIndex
];
map
<
string
,
double
>
variables
=
globalParameters
;
for
(
int
i
=
0
;
i
<
(
int
)
paramNames
.
size
();
++
i
)
variables
[
paramNames
[
i
]]
=
parameters
[
i
];
for
(
int
i
=
0
;
i
<
numParameters
;
i
++
)
{
ReferenceForce
::
setVariable
(
energyParams
[
i
],
parameters
[
i
]);
ReferenceForce
::
setVariable
(
forceParams
[
i
],
parameters
[
i
]);
}
// ---------------------------------------------------------------------------------------
...
...
@@ -118,13 +124,13 @@ void ReferenceCustomTorsionIxn::calculateBondIxn( int* atomIndices,
RealOpenMM
dotDihedral
;
RealOpenMM
signOfAngle
;
variables
[
"theta"
]
=
getDihedralAngleBetweenThreeVectors
(
deltaR
[
0
],
deltaR
[
1
],
deltaR
[
2
],
crossProduct
,
&
dotDihedral
,
deltaR
[
0
],
&
signOfA
ngle
,
1
);
RealOpenMM
angle
=
getDihedralAngleBetweenThreeVectors
(
deltaR
[
0
],
deltaR
[
1
],
deltaR
[
2
],
crossProduct
,
&
dotDihedral
,
deltaR
[
0
],
&
signOfAngle
,
1
);
ReferenceForce
::
setVariable
(
energyTheta
,
angle
);
ReferenceForce
::
setVariable
(
forceTheta
,
a
ngle
);
// evaluate delta angle, dE/d(angle)
RealOpenMM
dEdAngle
=
(
RealOpenMM
)
forceExpression
.
evaluate
(
variables
);
RealOpenMM
dEdAngle
=
(
RealOpenMM
)
forceExpression
.
evaluate
();
// compute force
...
...
@@ -166,6 +172,6 @@ void ReferenceCustomTorsionIxn::calculateBondIxn( int* atomIndices,
// accumulate energies
if
(
totalEnergy
!=
NULL
)
*
totalEnergy
+=
(
RealOpenMM
)
energyExpression
.
evaluate
(
variables
);
*
totalEnergy
+=
(
RealOpenMM
)
energyExpression
.
evaluate
();
}
platforms/reference/src/SimTKReference/ReferenceForce.cpp
View file @
54e47d2d
/* Portions copyright (c) 2006 Stanford University and Simbios.
/* Portions copyright (c) 2006
-2013
Stanford University and Simbios.
* Contributors: Pande Group
*
* Permission is hereby granted, free of charge, to any person obtaining
...
...
@@ -161,3 +161,14 @@ void ReferenceForce::getDeltaROnly( const RealOpenMM* atomCoordinatesI,
deltaR
[
YIndex
]
=
atomCoordinatesJ
[
1
]
-
atomCoordinatesI
[
1
];
deltaR
[
ZIndex
]
=
atomCoordinatesJ
[
2
]
-
atomCoordinatesI
[
2
];
}
double
*
ReferenceForce
::
getVariablePointer
(
Lepton
::
CompiledExpression
&
expression
,
const
std
::
string
&
name
)
{
if
(
expression
.
getVariables
().
find
(
name
)
==
expression
.
getVariables
().
end
())
return
NULL
;
return
&
expression
.
getVariableReference
(
name
);
}
void
ReferenceForce
::
setVariable
(
double
*
pointer
,
double
value
)
{
if
(
pointer
!=
NULL
)
*
pointer
=
value
;
}
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