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
047934e2
"platforms/vscode:/vscode.git/clone" did not exist on "a63645c0913af551f99b77f7d82982e654a0274d"
Commit
047934e2
authored
Mar 01, 2017
by
Rafal P. Wiewiora
Browse files
Merge remote-tracking branch 'upstream/master'
parents
ce3a5dc0
d12c9bd1
Changes
351
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
482 additions
and
541 deletions
+482
-541
platforms/reference/include/ReferencePME.h
platforms/reference/include/ReferencePME.h
+37
-15
platforms/reference/include/ReferencePairIxn.h
platforms/reference/include/ReferencePairIxn.h
+5
-5
platforms/reference/include/ReferencePlatform.h
platforms/reference/include/ReferencePlatform.h
+1
-1
platforms/reference/include/ReferenceProperDihedralBond.h
platforms/reference/include/ReferenceProperDihedralBond.h
+5
-5
platforms/reference/include/ReferenceRbDihedralBond.h
platforms/reference/include/ReferenceRbDihedralBond.h
+5
-5
platforms/reference/include/ReferenceSETTLEAlgorithm.h
platforms/reference/include/ReferenceSETTLEAlgorithm.h
+7
-7
platforms/reference/include/ReferenceStochasticDynamics.h
platforms/reference/include/ReferenceStochasticDynamics.h
+16
-18
platforms/reference/include/ReferenceVariableStochasticDynamics.h
...s/reference/include/ReferenceVariableStochasticDynamics.h
+18
-20
platforms/reference/include/ReferenceVariableVerletDynamics.h
...forms/reference/include/ReferenceVariableVerletDynamics.h
+8
-8
platforms/reference/include/ReferenceVerletDynamics.h
platforms/reference/include/ReferenceVerletDynamics.h
+5
-5
platforms/reference/include/ReferenceVirtualSites.h
platforms/reference/include/ReferenceVirtualSites.h
+3
-3
platforms/reference/include/SimTKOpenMMRealType.h
platforms/reference/include/SimTKOpenMMRealType.h
+1
-43
platforms/reference/include/SimTKOpenMMUtilities.h
platforms/reference/include/SimTKOpenMMUtilities.h
+18
-18
platforms/reference/include/fftpack.h
platforms/reference/include/fftpack.h
+4
-5
platforms/reference/src/ReferenceKernels.cpp
platforms/reference/src/ReferenceKernels.cpp
+274
-254
platforms/reference/src/ReferencePlatform.cpp
platforms/reference/src/ReferencePlatform.cpp
+12
-12
platforms/reference/src/SimTKReference/ObcParameters.cpp
platforms/reference/src/SimTKReference/ObcParameters.cpp
+24
-23
platforms/reference/src/SimTKReference/ReferenceAndersenThermostat.cpp
...erence/src/SimTKReference/ReferenceAndersenThermostat.cpp
+5
-4
platforms/reference/src/SimTKReference/ReferenceAngleBondIxn.cpp
...ms/reference/src/SimTKReference/ReferenceAngleBondIxn.cpp
+30
-65
platforms/reference/src/SimTKReference/ReferenceBondForce.cpp
...forms/reference/src/SimTKReference/ReferenceBondForce.cpp
+4
-25
No files found.
platforms/reference/include/ReferencePME.h
View file @
047934e2
...
...
@@ -32,13 +32,13 @@
#ifndef __ReferencePME_H__
#define __ReferencePME_H__
#include "
Real
Vec.h"
#include "
openmm/
Vec
3
.h"
#include "openmm/internal/windowsExport.h"
#include <vector>
namespace
OpenMM
{
typedef
RealOpenMM
rvec
[
3
];
typedef
double
rvec
[
3
];
typedef
struct
pme
*
...
...
@@ -59,12 +59,12 @@ pme_t;
* epsilon_r Dielectric coefficient, typically 1.0.
*/
int
OPENMM_EXPORT
pme_init
(
pme_t
*
ppme
,
RealOpenMM
ewaldcoeff
,
int
natoms
,
const
int
ngrid
[
3
],
int
pme_order
,
RealOpenMM
epsilon_r
);
pme_init
(
pme_t
*
ppme
,
double
ewaldcoeff
,
int
natoms
,
const
int
ngrid
[
3
],
int
pme_order
,
double
epsilon_r
);
/*
* Evaluate reciprocal space PME energy and forces.
...
...
@@ -79,12 +79,34 @@ pme_init(pme_t * ppme,
* energy Total energy (will be written in units of kJ/mol)
*/
int
OPENMM_EXPORT
pme_exec
(
pme_t
pme
,
const
std
::
vector
<
OpenMM
::
RealVec
>&
atomCoordinates
,
std
::
vector
<
OpenMM
::
RealVec
>&
forces
,
const
std
::
vector
<
RealOpenMM
>&
charges
,
const
OpenMM
::
RealVec
periodicBoxVectors
[
3
],
RealOpenMM
*
energy
);
pme_exec
(
pme_t
pme
,
const
std
::
vector
<
OpenMM
::
Vec3
>&
atomCoordinates
,
std
::
vector
<
OpenMM
::
Vec3
>&
forces
,
const
std
::
vector
<
double
>&
charges
,
const
OpenMM
::
Vec3
periodicBoxVectors
[
3
],
double
*
energy
);
/**
* Evaluate reciprocal space PME dispersion energy and forces.
*
* Args:
*
* pme Opaque pme_t object, must have been initialized with pme_init()
* x Pointer to coordinate data array (nm)
* f Pointer to force data array (will be written as kJ/mol/nm)
* c6s Array of c6 coefficients (units of sqrt(kJ/mol).nm^3 )
* box Simulation cell dimensions (nm)
* energy Total energy (will be written in units of kJ/mol)
*/
int
OPENMM_EXPORT
pme_exec_dpme
(
pme_t
pme
,
const
std
::
vector
<
OpenMM
::
Vec3
>&
atomCoordinates
,
std
::
vector
<
OpenMM
::
Vec3
>&
forces
,
const
std
::
vector
<
double
>&
c6s
,
const
OpenMM
::
Vec3
periodicBoxVectors
[
3
],
double
*
energy
);
...
...
@@ -94,4 +116,4 @@ pme_destroy(pme_t pme);
}
// namespace OpenMM
#endif // __ReferencePME_H__
\ No newline at end of file
#endif // __ReferencePME_H__
platforms/reference/include/ReferencePairIxn.h
View file @
047934e2
...
...
@@ -25,7 +25,7 @@
#ifndef __ReferencePairIxn_H__
#define __ReferencePairIxn_H__
#include "
Real
Vec.h"
#include "
openmm/
Vec
3
.h"
#include "openmm/internal/windowsExport.h"
#include <vector>
...
...
@@ -68,10 +68,10 @@ class OPENMM_EXPORT ReferencePairIxn {
--------------------------------------------------------------------------------------- */
virtual
void
calculatePairIxn
(
int
numberOfAtoms
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
atomCoordinates
,
RealOpenMM
**
atomParameters
,
int
**
exclusions
,
RealOpenMM
*
fixedParameters
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
forces
,
RealOpenMM
*
energyByAtom
,
RealOpenMM
*
totalEnergy
)
const
=
0
;
virtual
void
calculatePairIxn
(
int
numberOfAtoms
,
std
::
vector
<
OpenMM
::
Vec
3
>&
atomCoordinates
,
double
**
atomParameters
,
int
**
exclusions
,
double
*
fixedParameters
,
std
::
vector
<
OpenMM
::
Vec
3
>&
forces
,
double
*
energyByAtom
,
double
*
totalEnergy
)
const
=
0
;
};
...
...
platforms/reference/include/ReferencePlatform.h
View file @
047934e2
...
...
@@ -56,7 +56,7 @@ public:
void
contextDestroyed
(
ContextImpl
&
context
)
const
;
};
class
ReferencePlatform
::
PlatformData
{
class
OPENMM_EXPORT
ReferencePlatform
::
PlatformData
{
public:
PlatformData
(
const
System
&
system
);
~
PlatformData
();
...
...
platforms/reference/include/ReferenceProperDihedralBond.h
View file @
047934e2
...
...
@@ -34,7 +34,7 @@ class OPENMM_EXPORT ReferenceProperDihedralBond : public ReferenceBondIxn {
private:
bool
usePeriodic
;
Real
Vec
boxVectors
[
3
];
Vec
3
boxVectors
[
3
];
public:
...
...
@@ -62,7 +62,7 @@ class OPENMM_EXPORT ReferenceProperDihedralBond : public ReferenceBondIxn {
--------------------------------------------------------------------------------------- */
void
setPeriodic
(
OpenMM
::
Real
Vec
*
vectors
);
void
setPeriodic
(
OpenMM
::
Vec
3
*
vectors
);
/**---------------------------------------------------------------------------------------
...
...
@@ -78,9 +78,9 @@ class OPENMM_EXPORT ReferenceProperDihedralBond : public ReferenceBondIxn {
--------------------------------------------------------------------------------------- */
void
calculateBondIxn
(
int
*
atomIndices
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
atomCoordinates
,
RealOpenMM
*
parameters
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
forces
,
RealOpenMM
*
totalEnergy
,
double
*
energyParamDerivs
);
void
calculateBondIxn
(
int
*
atomIndices
,
std
::
vector
<
OpenMM
::
Vec
3
>&
atomCoordinates
,
double
*
parameters
,
std
::
vector
<
OpenMM
::
Vec
3
>&
forces
,
double
*
totalEnergy
,
double
*
energyParamDerivs
);
};
...
...
platforms/reference/include/ReferenceRbDihedralBond.h
View file @
047934e2
...
...
@@ -34,7 +34,7 @@ class OPENMM_EXPORT ReferenceRbDihedralBond : public ReferenceBondIxn {
private:
bool
usePeriodic
;
Real
Vec
boxVectors
[
3
];
Vec
3
boxVectors
[
3
];
public:
...
...
@@ -62,7 +62,7 @@ class OPENMM_EXPORT ReferenceRbDihedralBond : public ReferenceBondIxn {
--------------------------------------------------------------------------------------- */
void
setPeriodic
(
OpenMM
::
Real
Vec
*
vectors
);
void
setPeriodic
(
OpenMM
::
Vec
3
*
vectors
);
/**---------------------------------------------------------------------------------------
...
...
@@ -76,9 +76,9 @@ class OPENMM_EXPORT ReferenceRbDihedralBond : public ReferenceBondIxn {
--------------------------------------------------------------------------------------- */
void
calculateBondIxn
(
int
*
atomIndices
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
atomCoordinates
,
RealOpenMM
*
parameters
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
forces
,
RealOpenMM
*
totalEnergy
,
double
*
energyParamDerivs
);
void
calculateBondIxn
(
int
*
atomIndices
,
std
::
vector
<
OpenMM
::
Vec
3
>&
atomCoordinates
,
double
*
parameters
,
std
::
vector
<
OpenMM
::
Vec
3
>&
forces
,
double
*
totalEnergy
,
double
*
energyParamDerivs
);
};
...
...
platforms/reference/include/ReferenceSETTLEAlgorithm.h
View file @
047934e2
...
...
@@ -44,7 +44,7 @@ namespace OpenMM {
class
OPENMM_EXPORT
ReferenceSETTLEAlgorithm
:
public
ReferenceConstraintAlgorithm
{
public:
ReferenceSETTLEAlgorithm
(
const
std
::
vector
<
int
>&
atom1
,
const
std
::
vector
<
int
>&
atom2
,
const
std
::
vector
<
int
>&
atom3
,
const
std
::
vector
<
RealOpenMM
>&
distance1
,
const
std
::
vector
<
RealOpenMM
>&
distance2
,
std
::
vector
<
RealOpenMM
>&
masses
);
const
std
::
vector
<
double
>&
distance1
,
const
std
::
vector
<
double
>&
distance2
,
std
::
vector
<
double
>&
masses
);
/**
* Get the number of clusters.
...
...
@@ -60,7 +60,7 @@ public:
* @param distance1 the distance between atoms 1 and 2
* @param distance2 the distance between atoms 2 and 3
*/
void
getClusterParameters
(
int
index
,
int
&
atom1
,
int
&
atom2
,
int
&
atom3
,
RealOpenMM
&
distance1
,
RealOpenMM
&
distance2
)
const
;
void
getClusterParameters
(
int
index
,
int
&
atom1
,
int
&
atom2
,
int
&
atom3
,
double
&
distance1
,
double
&
distance2
)
const
;
/**
* Apply the constraint algorithm.
*
...
...
@@ -69,7 +69,7 @@ public:
* @param inverseMasses 1/mass
* @param tolerance the constraint tolerance
*/
void
apply
(
std
::
vector
<
OpenMM
::
Real
Vec
>&
atomCoordinates
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
atomCoordinatesP
,
std
::
vector
<
RealOpenMM
>&
inverseMasses
,
RealOpenMM
tolerance
);
void
apply
(
std
::
vector
<
OpenMM
::
Vec
3
>&
atomCoordinates
,
std
::
vector
<
OpenMM
::
Vec
3
>&
atomCoordinatesP
,
std
::
vector
<
double
>&
inverseMasses
,
double
tolerance
);
/**
* Apply the constraint algorithm to velocities.
...
...
@@ -79,14 +79,14 @@ public:
* @param inverseMasses 1/mass
* @param tolerance the constraint tolerance
*/
void
applyToVelocities
(
std
::
vector
<
OpenMM
::
Real
Vec
>&
atomCoordinates
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
velocities
,
std
::
vector
<
RealOpenMM
>&
inverseMasses
,
RealOpenMM
tolerance
);
void
applyToVelocities
(
std
::
vector
<
OpenMM
::
Vec
3
>&
atomCoordinates
,
std
::
vector
<
OpenMM
::
Vec
3
>&
velocities
,
std
::
vector
<
double
>&
inverseMasses
,
double
tolerance
);
private:
std
::
vector
<
int
>
atom1
;
std
::
vector
<
int
>
atom2
;
std
::
vector
<
int
>
atom3
;
std
::
vector
<
RealOpenMM
>
distance1
;
std
::
vector
<
RealOpenMM
>
distance2
;
std
::
vector
<
RealOpenMM
>
masses
;
std
::
vector
<
double
>
distance1
;
std
::
vector
<
double
>
distance2
;
std
::
vector
<
double
>
masses
;
};
}
// namespace OpenMM
...
...
platforms/reference/include/ReferenceStochasticDynamics.h
View file @
047934e2
/* Portions copyright (c) 2006-201
2
Stanford University and Simbios.
/* Portions copyright (c) 2006-201
6
Stanford University and Simbios.
* Contributors: Pande Group
*
* Permission is hereby granted, free of charge, to any person obtaining
...
...
@@ -34,9 +34,9 @@ class OPENMM_EXPORT ReferenceStochasticDynamics : public ReferenceDynamics {
protected:
std
::
vector
<
OpenMM
::
Real
Vec
>
xPrime
;
std
::
vector
<
RealOpenMM
>
inverseMasses
;
RealOpenMM
_tau
;
std
::
vector
<
OpenMM
::
Vec
3
>
xPrime
;
std
::
vector
<
double
>
inverseMasses
;
double
friction
;
public:
...
...
@@ -46,12 +46,12 @@ class OPENMM_EXPORT ReferenceStochasticDynamics : public ReferenceDynamics {
@param numberOfAtoms number of atoms
@param deltaT delta t for dynamics
@param
tau viscosity
@param
friction friction coefficient
@param temperature temperature
--------------------------------------------------------------------------------------- */
ReferenceStochasticDynamics
(
int
numberOfAtoms
,
RealOpenMM
deltaT
,
RealOpenMM
tau
,
RealOpenMM
temperature
);
ReferenceStochasticDynamics
(
int
numberOfAtoms
,
double
deltaT
,
double
friction
,
double
temperature
);
/**---------------------------------------------------------------------------------------
...
...
@@ -63,13 +63,11 @@ class OPENMM_EXPORT ReferenceStochasticDynamics : public ReferenceDynamics {
/**---------------------------------------------------------------------------------------
Get tau
@return tau
Get friction coefficient
--------------------------------------------------------------------------------------- */
RealOpenMM
getTau
()
const
;
double
getFriction
()
const
;
/**---------------------------------------------------------------------------------------
...
...
@@ -84,8 +82,8 @@ class OPENMM_EXPORT ReferenceStochasticDynamics : public ReferenceDynamics {
--------------------------------------------------------------------------------------- */
void
update
(
const
OpenMM
::
System
&
system
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
atomCoordinates
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
velocities
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
forces
,
std
::
vector
<
RealOpenMM
>&
masses
,
RealOpenMM
tolerance
);
void
update
(
const
OpenMM
::
System
&
system
,
std
::
vector
<
OpenMM
::
Vec
3
>&
atomCoordinates
,
std
::
vector
<
OpenMM
::
Vec
3
>&
velocities
,
std
::
vector
<
OpenMM
::
Vec
3
>&
forces
,
std
::
vector
<
double
>&
masses
,
double
tolerance
);
/**---------------------------------------------------------------------------------------
...
...
@@ -100,8 +98,8 @@ class OPENMM_EXPORT ReferenceStochasticDynamics : public ReferenceDynamics {
--------------------------------------------------------------------------------------- */
virtual
void
updatePart1
(
int
numberOfAtoms
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
atomCoordinates
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
velocities
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
forces
,
std
::
vector
<
RealOpenMM
>&
inverseMasses
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
xPrime
);
virtual
void
updatePart1
(
int
numberOfAtoms
,
std
::
vector
<
OpenMM
::
Vec
3
>&
atomCoordinates
,
std
::
vector
<
OpenMM
::
Vec
3
>&
velocities
,
std
::
vector
<
OpenMM
::
Vec
3
>&
forces
,
std
::
vector
<
double
>&
inverseMasses
,
std
::
vector
<
OpenMM
::
Vec
3
>&
xPrime
);
/**---------------------------------------------------------------------------------------
...
...
@@ -115,8 +113,8 @@ class OPENMM_EXPORT ReferenceStochasticDynamics : public ReferenceDynamics {
--------------------------------------------------------------------------------------- */
virtual
void
updatePart2
(
int
numberOfAtoms
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
atomCoordinates
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
velocities
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
forces
,
std
::
vector
<
RealOpenMM
>&
inverseMasses
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
xPrime
);
virtual
void
updatePart2
(
int
numberOfAtoms
,
std
::
vector
<
OpenMM
::
Vec
3
>&
atomCoordinates
,
std
::
vector
<
OpenMM
::
Vec
3
>&
velocities
,
std
::
vector
<
OpenMM
::
Vec
3
>&
forces
,
std
::
vector
<
double
>&
inverseMasses
,
std
::
vector
<
OpenMM
::
Vec
3
>&
xPrime
);
/**---------------------------------------------------------------------------------------
...
...
@@ -129,8 +127,8 @@ class OPENMM_EXPORT ReferenceStochasticDynamics : public ReferenceDynamics {
--------------------------------------------------------------------------------------- */
virtual
void
updatePart3
(
int
numberOfAtoms
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
atomCoordinates
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
velocities
,
std
::
vector
<
RealOpenMM
>&
inverseMasses
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
xPrime
);
virtual
void
updatePart3
(
int
numberOfAtoms
,
std
::
vector
<
OpenMM
::
Vec
3
>&
atomCoordinates
,
std
::
vector
<
OpenMM
::
Vec
3
>&
velocities
,
std
::
vector
<
double
>&
inverseMasses
,
std
::
vector
<
OpenMM
::
Vec
3
>&
xPrime
);
};
}
// namespace OpenMM
...
...
platforms/reference/include/ReferenceVariableStochasticDynamics.h
View file @
047934e2
/* Portions copyright (c) 2006-201
2
Stanford University and Simbios.
/* Portions copyright (c) 2006-201
6
Stanford University and Simbios.
* Contributors: Pande Group
*
* Permission is hereby granted, free of charge, to any person obtaining
...
...
@@ -33,9 +33,9 @@ class ReferenceVariableStochasticDynamics : public ReferenceDynamics {
private:
std
::
vector
<
OpenMM
::
Real
Vec
>
xPrime
;
std
::
vector
<
RealOpenMM
>
inverseMasses
;
RealOpenMM
_tau
,
_accuracy
;
std
::
vector
<
OpenMM
::
Vec
3
>
xPrime
;
std
::
vector
<
double
>
inverseMasses
;
double
friction
,
_accuracy
;
public:
...
...
@@ -44,13 +44,13 @@ class ReferenceVariableStochasticDynamics : public ReferenceDynamics {
Constructor
@param numberOfAtoms number of atoms
@param
tau viscosity
@param
friction friction coefficient
@param temperature temperature
@param accuracy required accuracy
--------------------------------------------------------------------------------------- */
ReferenceVariableStochasticDynamics
(
int
numberOfAtoms
,
RealOpenMM
tau
,
RealOpenMM
temperature
,
RealOpenMM
accuracy
);
ReferenceVariableStochasticDynamics
(
int
numberOfAtoms
,
double
friction
,
double
temperature
,
double
accuracy
);
/**---------------------------------------------------------------------------------------
...
...
@@ -62,13 +62,11 @@ class ReferenceVariableStochasticDynamics : public ReferenceDynamics {
/**---------------------------------------------------------------------------------------
Get tau
@return tau
Get friction coefficient
--------------------------------------------------------------------------------------- */
RealOpenMM
getTau
()
const
;
double
getFriction
()
const
;
/**---------------------------------------------------------------------------------------
...
...
@@ -78,7 +76,7 @@ class ReferenceVariableStochasticDynamics : public ReferenceDynamics {
--------------------------------------------------------------------------------------- */
RealOpenMM
getAccuracy
()
const
;
double
getAccuracy
()
const
;
/**---------------------------------------------------------------------------------------
...
...
@@ -86,7 +84,7 @@ class ReferenceVariableStochasticDynamics : public ReferenceDynamics {
--------------------------------------------------------------------------------------- */
void
setAccuracy
(
RealOpenMM
accuracy
);
void
setAccuracy
(
double
accuracy
);
/**---------------------------------------------------------------------------------------
...
...
@@ -102,8 +100,8 @@ class ReferenceVariableStochasticDynamics : public ReferenceDynamics {
--------------------------------------------------------------------------------------- */
void
update
(
const
OpenMM
::
System
&
system
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
atomCoordinates
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
velocities
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
forces
,
std
::
vector
<
RealOpenMM
>&
masses
,
RealOpenMM
maxStepSize
,
RealOpenMM
tolerance
);
void
update
(
const
OpenMM
::
System
&
system
,
std
::
vector
<
OpenMM
::
Vec
3
>&
atomCoordinates
,
std
::
vector
<
OpenMM
::
Vec
3
>&
velocities
,
std
::
vector
<
OpenMM
::
Vec
3
>&
forces
,
std
::
vector
<
double
>&
masses
,
double
maxStepSize
,
double
tolerance
);
/**---------------------------------------------------------------------------------------
...
...
@@ -120,9 +118,9 @@ class ReferenceVariableStochasticDynamics : public ReferenceDynamics {
--------------------------------------------------------------------------------------- */
void
updatePart1
(
int
numberOfAtoms
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
atomCoordinates
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
velocities
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
forces
,
std
::
vector
<
RealOpenMM
>&
masses
,
std
::
vector
<
RealOpenMM
>&
inverseMasses
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
xPrime
,
RealOpenMM
maxStepSize
);
void
updatePart1
(
int
numberOfAtoms
,
std
::
vector
<
OpenMM
::
Vec
3
>&
atomCoordinates
,
std
::
vector
<
OpenMM
::
Vec
3
>&
velocities
,
std
::
vector
<
OpenMM
::
Vec
3
>&
forces
,
std
::
vector
<
double
>&
masses
,
std
::
vector
<
double
>&
inverseMasses
,
std
::
vector
<
OpenMM
::
Vec
3
>&
xPrime
,
double
maxStepSize
);
/**---------------------------------------------------------------------------------------
...
...
@@ -136,9 +134,9 @@ class ReferenceVariableStochasticDynamics : public ReferenceDynamics {
--------------------------------------------------------------------------------------- */
void
updatePart2
(
int
numberOfAtoms
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
atomCoordinates
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
velocities
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
forces
,
std
::
vector
<
RealOpenMM
>&
inverseMasses
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
xPrime
);
void
updatePart2
(
int
numberOfAtoms
,
std
::
vector
<
OpenMM
::
Vec
3
>&
atomCoordinates
,
std
::
vector
<
OpenMM
::
Vec
3
>&
velocities
,
std
::
vector
<
OpenMM
::
Vec
3
>&
forces
,
std
::
vector
<
double
>&
inverseMasses
,
std
::
vector
<
OpenMM
::
Vec
3
>&
xPrime
);
};
...
...
platforms/reference/include/ReferenceVariableVerletDynamics.h
View file @
047934e2
...
...
@@ -33,9 +33,9 @@ class ReferenceVariableVerletDynamics : public ReferenceDynamics {
private:
std
::
vector
<
OpenMM
::
Real
Vec
>
xPrime
;
std
::
vector
<
RealOpenMM
>
inverseMasses
;
RealOpenMM
_accuracy
;
std
::
vector
<
OpenMM
::
Vec
3
>
xPrime
;
std
::
vector
<
double
>
inverseMasses
;
double
_accuracy
;
public:
...
...
@@ -48,7 +48,7 @@ class ReferenceVariableVerletDynamics : public ReferenceDynamics {
--------------------------------------------------------------------------------------- */
ReferenceVariableVerletDynamics
(
int
numberOfAtoms
,
RealOpenMM
accuracy
);
ReferenceVariableVerletDynamics
(
int
numberOfAtoms
,
double
accuracy
);
/**---------------------------------------------------------------------------------------
...
...
@@ -66,7 +66,7 @@ class ReferenceVariableVerletDynamics : public ReferenceDynamics {
--------------------------------------------------------------------------------------- */
RealOpenMM
getAccuracy
()
const
;
double
getAccuracy
()
const
;
/**---------------------------------------------------------------------------------------
...
...
@@ -74,7 +74,7 @@ class ReferenceVariableVerletDynamics : public ReferenceDynamics {
--------------------------------------------------------------------------------------- */
void
setAccuracy
(
RealOpenMM
accuracy
);
void
setAccuracy
(
double
accuracy
);
/**---------------------------------------------------------------------------------------
...
...
@@ -90,8 +90,8 @@ class ReferenceVariableVerletDynamics : public ReferenceDynamics {
--------------------------------------------------------------------------------------- */
void
update
(
const
OpenMM
::
System
&
system
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
atomCoordinates
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
velocities
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
forces
,
std
::
vector
<
RealOpenMM
>&
masses
,
RealOpenMM
maxStepSize
,
RealOpenMM
tolerance
);
void
update
(
const
OpenMM
::
System
&
system
,
std
::
vector
<
OpenMM
::
Vec
3
>&
atomCoordinates
,
std
::
vector
<
OpenMM
::
Vec
3
>&
velocities
,
std
::
vector
<
OpenMM
::
Vec
3
>&
forces
,
std
::
vector
<
double
>&
masses
,
double
maxStepSize
,
double
tolerance
);
};
...
...
platforms/reference/include/ReferenceVerletDynamics.h
View file @
047934e2
...
...
@@ -33,8 +33,8 @@ class ReferenceVerletDynamics : public ReferenceDynamics {
private:
std
::
vector
<
OpenMM
::
Real
Vec
>
xPrime
;
std
::
vector
<
RealOpenMM
>
inverseMasses
;
std
::
vector
<
OpenMM
::
Vec
3
>
xPrime
;
std
::
vector
<
double
>
inverseMasses
;
public:
...
...
@@ -49,7 +49,7 @@ class ReferenceVerletDynamics : public ReferenceDynamics {
--------------------------------------------------------------------------------------- */
ReferenceVerletDynamics
(
int
numberOfAtoms
,
RealOpenMM
deltaT
);
ReferenceVerletDynamics
(
int
numberOfAtoms
,
double
deltaT
);
/**---------------------------------------------------------------------------------------
...
...
@@ -72,8 +72,8 @@ class ReferenceVerletDynamics : public ReferenceDynamics {
--------------------------------------------------------------------------------------- */
void
update
(
const
OpenMM
::
System
&
system
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
atomCoordinates
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
velocities
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
forces
,
std
::
vector
<
RealOpenMM
>&
masses
,
RealOpenMM
tolerance
);
void
update
(
const
OpenMM
::
System
&
system
,
std
::
vector
<
OpenMM
::
Vec
3
>&
atomCoordinates
,
std
::
vector
<
OpenMM
::
Vec
3
>&
velocities
,
std
::
vector
<
OpenMM
::
Vec
3
>&
forces
,
std
::
vector
<
double
>&
masses
,
double
tolerance
);
};
...
...
platforms/reference/include/ReferenceVirtualSites.h
View file @
047934e2
...
...
@@ -33,7 +33,7 @@
#define __ReferenceVirtualSites_H__
#include "openmm/System.h"
#include "
Real
Vec.h"
#include "
openmm/
Vec
3
.h"
#include <vector>
namespace
OpenMM
{
...
...
@@ -43,11 +43,11 @@ public:
/**
* Compute the positions of all virtual sites.
*/
static
void
computePositions
(
const
OpenMM
::
System
&
system
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
atomCoordinates
);
static
void
computePositions
(
const
OpenMM
::
System
&
system
,
std
::
vector
<
OpenMM
::
Vec
3
>&
atomCoordinates
);
/**
* Distribute forces from virtual sites to the atoms they are based on.
*/
static
void
distributeForces
(
const
OpenMM
::
System
&
system
,
const
std
::
vector
<
OpenMM
::
Real
Vec
>&
atomCoordinates
,
std
::
vector
<
OpenMM
::
Real
Vec
>&
forces
);
static
void
distributeForces
(
const
OpenMM
::
System
&
system
,
const
std
::
vector
<
OpenMM
::
Vec
3
>&
atomCoordinates
,
std
::
vector
<
OpenMM
::
Vec
3
>&
forces
);
};
}
// namespace OpenMM
...
...
platforms/reference/include/SimTKOpenMMRealType.h
View file @
047934e2
/* Portions copyright (c) 2006 Stanford University and Simbios.
/* Portions copyright (c) 2006
-2017
Stanford University and Simbios.
* Contributors: Pande Group
*
* Permission is hereby granted, free of charge, to any person obtaining
...
...
@@ -28,46 +28,6 @@
#include <cmath>
// Set RealOpenMMType to 2 for double precision, 1 for float
#ifndef RealOpenMMType
#define RealOpenMMType 2
#endif
#if RealOpenMMType == 1
#define RealOpenMM float
#define SQRT sqrtf
#define POW powf
#define SIN sinf
#define COS cosf
#define TAN tanf
// LOG is used in Vishal's gpu code; modifying LOG -> LN
#define LN logf
#define EXP expf
#define FABS fabsf
#define ACOS acosf
#define ASIN asinf
#define ATAN atanf
#define TANH tanhf
#define FLOOR floorf
#define ATOF atoff
#define PI_M 3.141592653589f
#define TWO_SIX 1.122462048309372981f
#define RADIAN 57.29577951308f
#define RADIAN_TO_DEGREE 57.29577951308f
#define LOG_TEN 2.302585092994045684f
#define SQRT_TWO 1.41421356237309504f
#define DEGREE_TO_RADIAN 0.01745329252f
#define RADIAN_INVERSE 0.01745329252f
#else
#define RealOpenMM double
#define SQRT sqrt
#define POW pow
...
...
@@ -98,8 +58,6 @@
#define DEGREE_TO_RADIAN 0.01745329252
#define RADIAN_INVERSE 0.01745329252
#endif
#define DOT3(u,v) ((u[0])*(v[0]) + (u[1])*(v[1]) + (u[2])*(v[2]))
#define MATRIXDOT3(u,v) u[0]*v[0] + u[1]*v[1] + u[2]*v[2] + \
...
...
platforms/reference/include/SimTKOpenMMUtilities.h
View file @
047934e2
...
...
@@ -27,7 +27,7 @@
// class of shared, static utility methods
#include "
RealVec
.h"
#include "
SimTKOpenMMRealType
.h"
#include "sfmt/SFMT.h"
#include "openmm/internal/windowsExport.h"
...
...
@@ -49,7 +49,7 @@ class OPENMM_EXPORT SimTKOpenMMUtilities {
static
uint32_t
_randomNumberSeed
;
static
bool
_randomInitialized
;
static
bool
nextGaussianIsValid
;
static
RealOpenMM
nextGaussian
;
static
double
nextGaussian
;
static
OpenMM_SFMT
::
SFMT
sfmt
;
public:
...
...
@@ -61,7 +61,7 @@ class OPENMM_EXPORT SimTKOpenMMUtilities {
/**---------------------------------------------------------------------------------------
Allocate 1D
RealOpenMM
array (Simbios)
Allocate 1D
double
array (Simbios)
array[i]
...
...
@@ -75,13 +75,13 @@ class OPENMM_EXPORT SimTKOpenMMUtilities {
--------------------------------------------------------------------------------------- */
static
RealOpenMM
*
allocateOneDRealOpenMMArray
(
int
iSize
,
RealOpenMM
*
array1D
,
int
initialize
,
RealOpenMM
initialValue
,
static
double
*
allocateOneDRealOpenMMArray
(
int
iSize
,
double
*
array1D
,
int
initialize
,
double
initialValue
,
const
std
::
string
&
idString
=
std
::
string
(
"1DArray"
));
/**---------------------------------------------------------------------------------------
Allocate 2D
RealOpenMM
array (Simbios)
Allocate 2D
double
array (Simbios)
array[i][j]
...
...
@@ -96,14 +96,14 @@ class OPENMM_EXPORT SimTKOpenMMUtilities {
--------------------------------------------------------------------------------------- */
static
RealOpenMM
**
allocateTwoDRealOpenMMArray
(
int
iSize
,
int
jSize
,
RealOpenMM
**
array2D
,
int
initialize
,
RealOpenMM
initialValue
,
static
double
**
allocateTwoDRealOpenMMArray
(
int
iSize
,
int
jSize
,
double
**
array2D
,
int
initialize
,
double
initialValue
,
const
std
::
string
&
idString
=
std
::
string
(
"2DArray"
));
/* ---------------------------------------------------------------------------------------
Free 2D
RealOpenMM
array (Simbios)
Free 2D
double
array (Simbios)
array[i][j]
...
...
@@ -112,12 +112,12 @@ class OPENMM_EXPORT SimTKOpenMMUtilities {
--------------------------------------------------------------------------------------- */
static
void
freeOneDRealOpenMMArray
(
RealOpenMM
*
array1D
,
static
void
freeOneDRealOpenMMArray
(
double
*
array1D
,
const
std
::
string
&
idString
=
std
::
string
(
"1DArray"
));
/* ---------------------------------------------------------------------------------------
Free 2D
RealOpenMM
array (Simbios)
Free 2D
double
array (Simbios)
array[i][j]
...
...
@@ -126,12 +126,12 @@ class OPENMM_EXPORT SimTKOpenMMUtilities {
--------------------------------------------------------------------------------------- */
static
void
freeTwoDRealOpenMMArray
(
RealOpenMM
**
array2D
,
static
void
freeTwoDRealOpenMMArray
(
double
**
array2D
,
const
std
::
string
&
idString
=
std
::
string
(
"2DArray"
));
/**---------------------------------------------------------------------------------------
Initialize 2D
RealOpenMM
array (Simbios)
Initialize 2D
double
array (Simbios)
array[i][j]
...
...
@@ -143,7 +143,7 @@ class OPENMM_EXPORT SimTKOpenMMUtilities {
--------------------------------------------------------------------------------------- */
static
void
initialize2DRealOpenMMArray
(
int
iSize
,
int
jSize
,
RealOpenMM
**
array2D
,
RealOpenMM
initialValue
);
double
**
array2D
,
double
initialValue
);
/**---------------------------------------------------------------------------------------
...
...
@@ -159,7 +159,7 @@ class OPENMM_EXPORT SimTKOpenMMUtilities {
--------------------------------------------------------------------------------------- */
static
void
crossProductVector3
(
RealOpenMM
*
vectorX
,
RealOpenMM
*
vectorY
,
RealOpenMM
*
vectorZ
);
static
void
crossProductVector3
(
double
*
vectorX
,
double
*
vectorY
,
double
*
vectorZ
);
/**---------------------------------------------------------------------------------------
...
...
@@ -169,7 +169,7 @@ class OPENMM_EXPORT SimTKOpenMMUtilities {
--------------------------------------------------------------------------------------- */
static
RealOpenMM
getNormallyDistributedRandomNumber
();
static
double
getNormallyDistributedRandomNumber
();
/**---------------------------------------------------------------------------------------
...
...
@@ -179,7 +179,7 @@ class OPENMM_EXPORT SimTKOpenMMUtilities {
--------------------------------------------------------------------------------------- */
static
RealOpenMM
getUniformlyDistributedRandomNumber
();
static
double
getUniformlyDistributedRandomNumber
();
/**---------------------------------------------------------------------------------------
...
...
platforms/reference/include/fftpack.h
View file @
047934e2
...
...
@@ -20,7 +20,6 @@
#include <stdio.h>
#include "RealVec.h"
#include "openmm/internal/windowsExport.h"
#ifdef __cplusplus
...
...
@@ -33,15 +32,15 @@ extern "C" {
class
t_complex
{
public:
RealOpenMM
re
;
RealOpenMM
im
;
double
re
;
double
im
;
t_complex
()
:
re
(
0.0
),
im
(
0.0
)
{
}
t_complex
(
RealOpenMM
re
,
RealOpenMM
im
)
:
re
(
re
),
im
(
im
)
{
t_complex
(
double
re
,
double
im
)
:
re
(
re
),
im
(
im
)
{
}
t_complex
(
const
t_complex
&
c
)
:
re
(
c
.
re
),
im
(
c
.
im
)
{
}
t_complex
operator
*
(
RealOpenMM
r
)
{
t_complex
operator
*
(
double
r
)
{
return
t_complex
(
re
*
r
,
im
*
r
);
}
t_complex
operator
+
(
const
t_complex
&
c
)
const
{
...
...
platforms/reference/src/ReferenceKernels.cpp
View file @
047934e2
...
...
@@ -94,10 +94,10 @@ static int** allocateIntArray(int length, int width) {
return
array
;
}
static
RealOpenMM
**
allocateRealArray
(
int
length
,
int
width
)
{
RealOpenMM
**
array
=
new
RealOpenMM
*
[
length
];
static
double
**
allocateRealArray
(
int
length
,
int
width
)
{
double
**
array
=
new
double
*
[
length
];
for
(
int
i
=
0
;
i
<
length
;
++
i
)
array
[
i
]
=
new
RealOpenMM
[
width
];
array
[
i
]
=
new
double
[
width
];
return
array
;
}
...
...
@@ -109,7 +109,7 @@ static void disposeIntArray(int** array, int size) {
}
}
static
void
disposeRealArray
(
RealOpenMM
**
array
,
int
size
)
{
static
void
disposeRealArray
(
double
**
array
,
int
size
)
{
if
(
array
)
{
for
(
int
i
=
0
;
i
<
size
;
++
i
)
delete
[]
array
[
i
];
...
...
@@ -117,29 +117,29 @@ static void disposeRealArray(RealOpenMM** array, int size) {
}
}
static
vector
<
Real
Vec
>&
extractPositions
(
ContextImpl
&
context
)
{
static
vector
<
Vec
3
>&
extractPositions
(
ContextImpl
&
context
)
{
ReferencePlatform
::
PlatformData
*
data
=
reinterpret_cast
<
ReferencePlatform
::
PlatformData
*>
(
context
.
getPlatformData
());
return
*
((
vector
<
Real
Vec
>*
)
data
->
positions
);
return
*
((
vector
<
Vec
3
>*
)
data
->
positions
);
}
static
vector
<
Real
Vec
>&
extractVelocities
(
ContextImpl
&
context
)
{
static
vector
<
Vec
3
>&
extractVelocities
(
ContextImpl
&
context
)
{
ReferencePlatform
::
PlatformData
*
data
=
reinterpret_cast
<
ReferencePlatform
::
PlatformData
*>
(
context
.
getPlatformData
());
return
*
((
vector
<
Real
Vec
>*
)
data
->
velocities
);
return
*
((
vector
<
Vec
3
>*
)
data
->
velocities
);
}
static
vector
<
Real
Vec
>&
extractForces
(
ContextImpl
&
context
)
{
static
vector
<
Vec
3
>&
extractForces
(
ContextImpl
&
context
)
{
ReferencePlatform
::
PlatformData
*
data
=
reinterpret_cast
<
ReferencePlatform
::
PlatformData
*>
(
context
.
getPlatformData
());
return
*
((
vector
<
Real
Vec
>*
)
data
->
forces
);
return
*
((
vector
<
Vec
3
>*
)
data
->
forces
);
}
static
Real
Vec
&
extractBoxSize
(
ContextImpl
&
context
)
{
static
Vec
3
&
extractBoxSize
(
ContextImpl
&
context
)
{
ReferencePlatform
::
PlatformData
*
data
=
reinterpret_cast
<
ReferencePlatform
::
PlatformData
*>
(
context
.
getPlatformData
());
return
*
(
Real
Vec
*
)
data
->
periodicBoxSize
;
return
*
(
Vec
3
*
)
data
->
periodicBoxSize
;
}
static
Real
Vec
*
extractBoxVectors
(
ContextImpl
&
context
)
{
static
Vec
3
*
extractBoxVectors
(
ContextImpl
&
context
)
{
ReferencePlatform
::
PlatformData
*
data
=
reinterpret_cast
<
ReferencePlatform
::
PlatformData
*>
(
context
.
getPlatformData
());
return
(
Real
Vec
*
)
data
->
periodicBoxVectors
;
return
(
Vec
3
*
)
data
->
periodicBoxVectors
;
}
static
ReferenceConstraints
&
extractConstraints
(
ContextImpl
&
context
)
{
...
...
@@ -168,14 +168,14 @@ static void validateVariables(const Lepton::ExpressionTreeNode& node, const set<
* for a leapfrog integrator.
*/
static
double
computeShiftedKineticEnergy
(
ContextImpl
&
context
,
vector
<
double
>&
masses
,
double
timeShift
)
{
vector
<
Real
Vec
>&
posData
=
extractPositions
(
context
);
vector
<
Real
Vec
>&
velData
=
extractVelocities
(
context
);
vector
<
Real
Vec
>&
forceData
=
extractForces
(
context
);
vector
<
Vec
3
>&
posData
=
extractPositions
(
context
);
vector
<
Vec
3
>&
velData
=
extractVelocities
(
context
);
vector
<
Vec
3
>&
forceData
=
extractForces
(
context
);
int
numParticles
=
context
.
getSystem
().
getNumParticles
();
// Compute the shifted velocities.
vector
<
Real
Vec
>
shiftedVel
(
numParticles
);
vector
<
Vec
3
>
shiftedVel
(
numParticles
);
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
{
if
(
masses
[
i
]
>
0
)
shiftedVel
[
i
]
=
velData
[
i
]
+
forceData
[
i
]
*
(
timeShift
/
masses
[
i
]);
...
...
@@ -203,13 +203,13 @@ void ReferenceCalcForcesAndEnergyKernel::initialize(const System& system) {
}
void
ReferenceCalcForcesAndEnergyKernel
::
beginComputation
(
ContextImpl
&
context
,
bool
includeForces
,
bool
includeEnergy
,
int
groups
)
{
vector
<
Real
Vec
>&
forceData
=
extractForces
(
context
);
vector
<
Vec
3
>&
forceData
=
extractForces
(
context
);
if
(
includeForces
)
{
int
numParticles
=
context
.
getSystem
().
getNumParticles
();
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
{
forceData
[
i
][
0
]
=
(
RealOpenMM
)
0.0
;
forceData
[
i
][
1
]
=
(
RealOpenMM
)
0.0
;
forceData
[
i
][
2
]
=
(
RealOpenMM
)
0.0
;
forceData
[
i
][
0
]
=
0.0
;
forceData
[
i
][
1
]
=
0.0
;
forceData
[
i
][
2
]
=
0.0
;
}
}
else
...
...
@@ -239,7 +239,7 @@ void ReferenceUpdateStateDataKernel::setTime(ContextImpl& context, double time)
void
ReferenceUpdateStateDataKernel
::
getPositions
(
ContextImpl
&
context
,
std
::
vector
<
Vec3
>&
positions
)
{
int
numParticles
=
context
.
getSystem
().
getNumParticles
();
vector
<
Real
Vec
>&
posData
=
extractPositions
(
context
);
vector
<
Vec
3
>&
posData
=
extractPositions
(
context
);
positions
.
resize
(
numParticles
);
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
positions
[
i
]
=
Vec3
(
posData
[
i
][
0
],
posData
[
i
][
1
],
posData
[
i
][
2
]);
...
...
@@ -247,17 +247,17 @@ void ReferenceUpdateStateDataKernel::getPositions(ContextImpl& context, std::vec
void
ReferenceUpdateStateDataKernel
::
setPositions
(
ContextImpl
&
context
,
const
std
::
vector
<
Vec3
>&
positions
)
{
int
numParticles
=
context
.
getSystem
().
getNumParticles
();
vector
<
Real
Vec
>&
posData
=
extractPositions
(
context
);
vector
<
Vec
3
>&
posData
=
extractPositions
(
context
);
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
{
posData
[
i
][
0
]
=
(
RealOpenMM
)
positions
[
i
][
0
];
posData
[
i
][
1
]
=
(
RealOpenMM
)
positions
[
i
][
1
];
posData
[
i
][
2
]
=
(
RealOpenMM
)
positions
[
i
][
2
];
posData
[
i
][
0
]
=
positions
[
i
][
0
];
posData
[
i
][
1
]
=
positions
[
i
][
1
];
posData
[
i
][
2
]
=
positions
[
i
][
2
];
}
}
void
ReferenceUpdateStateDataKernel
::
getVelocities
(
ContextImpl
&
context
,
std
::
vector
<
Vec3
>&
velocities
)
{
int
numParticles
=
context
.
getSystem
().
getNumParticles
();
vector
<
Real
Vec
>&
velData
=
extractVelocities
(
context
);
vector
<
Vec
3
>&
velData
=
extractVelocities
(
context
);
velocities
.
resize
(
numParticles
);
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
velocities
[
i
]
=
Vec3
(
velData
[
i
][
0
],
velData
[
i
][
1
],
velData
[
i
][
2
]);
...
...
@@ -265,17 +265,17 @@ void ReferenceUpdateStateDataKernel::getVelocities(ContextImpl& context, std::ve
void
ReferenceUpdateStateDataKernel
::
setVelocities
(
ContextImpl
&
context
,
const
std
::
vector
<
Vec3
>&
velocities
)
{
int
numParticles
=
context
.
getSystem
().
getNumParticles
();
vector
<
Real
Vec
>&
velData
=
extractVelocities
(
context
);
vector
<
Vec
3
>&
velData
=
extractVelocities
(
context
);
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
{
velData
[
i
][
0
]
=
(
RealOpenMM
)
velocities
[
i
][
0
];
velData
[
i
][
1
]
=
(
RealOpenMM
)
velocities
[
i
][
1
];
velData
[
i
][
2
]
=
(
RealOpenMM
)
velocities
[
i
][
2
];
velData
[
i
][
0
]
=
velocities
[
i
][
0
];
velData
[
i
][
1
]
=
velocities
[
i
][
1
];
velData
[
i
][
2
]
=
velocities
[
i
][
2
];
}
}
void
ReferenceUpdateStateDataKernel
::
getForces
(
ContextImpl
&
context
,
std
::
vector
<
Vec3
>&
forces
)
{
int
numParticles
=
context
.
getSystem
().
getNumParticles
();
vector
<
Real
Vec
>&
forceData
=
extractForces
(
context
);
vector
<
Vec
3
>&
forceData
=
extractForces
(
context
);
forces
.
resize
(
numParticles
);
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
forces
[
i
]
=
Vec3
(
forceData
[
i
][
0
],
forceData
[
i
][
1
],
forceData
[
i
][
2
]);
...
...
@@ -286,18 +286,18 @@ void ReferenceUpdateStateDataKernel::getEnergyParameterDerivatives(ContextImpl&
}
void
ReferenceUpdateStateDataKernel
::
getPeriodicBoxVectors
(
ContextImpl
&
context
,
Vec3
&
a
,
Vec3
&
b
,
Vec3
&
c
)
const
{
Real
Vec
*
vectors
=
extractBoxVectors
(
context
);
Vec
3
*
vectors
=
extractBoxVectors
(
context
);
a
=
vectors
[
0
];
b
=
vectors
[
1
];
c
=
vectors
[
2
];
}
void
ReferenceUpdateStateDataKernel
::
setPeriodicBoxVectors
(
ContextImpl
&
context
,
const
Vec3
&
a
,
const
Vec3
&
b
,
const
Vec3
&
c
)
{
Real
Vec
&
box
=
extractBoxSize
(
context
);
box
[
0
]
=
(
RealOpenMM
)
a
[
0
];
box
[
1
]
=
(
RealOpenMM
)
b
[
1
];
box
[
2
]
=
(
RealOpenMM
)
c
[
2
];
Real
Vec
*
vectors
=
extractBoxVectors
(
context
);
Vec
3
&
box
=
extractBoxSize
(
context
);
box
[
0
]
=
a
[
0
];
box
[
1
]
=
b
[
1
];
box
[
2
]
=
c
[
2
];
Vec
3
*
vectors
=
extractBoxVectors
(
context
);
vectors
[
0
]
=
a
;
vectors
[
1
]
=
b
;
vectors
[
2
]
=
c
;
...
...
@@ -307,12 +307,12 @@ void ReferenceUpdateStateDataKernel::createCheckpoint(ContextImpl& context, ostr
int
version
=
2
;
stream
.
write
((
char
*
)
&
version
,
sizeof
(
int
));
stream
.
write
((
char
*
)
&
data
.
time
,
sizeof
(
data
.
time
));
vector
<
Real
Vec
>&
posData
=
extractPositions
(
context
);
stream
.
write
((
char
*
)
&
posData
[
0
],
sizeof
(
Real
Vec
)
*
posData
.
size
());
vector
<
Real
Vec
>&
velData
=
extractVelocities
(
context
);
stream
.
write
((
char
*
)
&
velData
[
0
],
sizeof
(
Real
Vec
)
*
velData
.
size
());
Real
Vec
*
vectors
=
extractBoxVectors
(
context
);
stream
.
write
((
char
*
)
vectors
,
3
*
sizeof
(
Real
Vec
));
vector
<
Vec
3
>&
posData
=
extractPositions
(
context
);
stream
.
write
((
char
*
)
&
posData
[
0
],
sizeof
(
Vec
3
)
*
posData
.
size
());
vector
<
Vec
3
>&
velData
=
extractVelocities
(
context
);
stream
.
write
((
char
*
)
&
velData
[
0
],
sizeof
(
Vec
3
)
*
velData
.
size
());
Vec
3
*
vectors
=
extractBoxVectors
(
context
);
stream
.
write
((
char
*
)
vectors
,
3
*
sizeof
(
Vec
3
));
SimTKOpenMMUtilities
::
createCheckpoint
(
stream
);
}
...
...
@@ -322,12 +322,12 @@ void ReferenceUpdateStateDataKernel::loadCheckpoint(ContextImpl& context, istrea
if
(
version
!=
2
)
throw
OpenMMException
(
"Checkpoint was created with a different version of OpenMM"
);
stream
.
read
((
char
*
)
&
data
.
time
,
sizeof
(
data
.
time
));
vector
<
Real
Vec
>&
posData
=
extractPositions
(
context
);
stream
.
read
((
char
*
)
&
posData
[
0
],
sizeof
(
Real
Vec
)
*
posData
.
size
());
vector
<
Real
Vec
>&
velData
=
extractVelocities
(
context
);
stream
.
read
((
char
*
)
&
velData
[
0
],
sizeof
(
Real
Vec
)
*
velData
.
size
());
Real
Vec
*
vectors
=
extractBoxVectors
(
context
);
stream
.
read
((
char
*
)
vectors
,
3
*
sizeof
(
Real
Vec
));
vector
<
Vec
3
>&
posData
=
extractPositions
(
context
);
stream
.
read
((
char
*
)
&
posData
[
0
],
sizeof
(
Vec
3
)
*
posData
.
size
());
vector
<
Vec
3
>&
velData
=
extractVelocities
(
context
);
stream
.
read
((
char
*
)
&
velData
[
0
],
sizeof
(
Vec
3
)
*
velData
.
size
());
Vec
3
*
vectors
=
extractBoxVectors
(
context
);
stream
.
read
((
char
*
)
vectors
,
3
*
sizeof
(
Vec
3
));
SimTKOpenMMUtilities
::
loadCheckpoint
(
stream
);
}
...
...
@@ -336,7 +336,7 @@ void ReferenceApplyConstraintsKernel::initialize(const System& system) {
masses
.
resize
(
numParticles
);
inverseMasses
.
resize
(
numParticles
);
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
{
masses
[
i
]
=
static_cast
<
RealOpenMM
>
(
system
.
getParticleMass
(
i
)
)
;
masses
[
i
]
=
system
.
getParticleMass
(
i
);
inverseMasses
[
i
]
=
1.0
/
masses
[
i
];
}
}
...
...
@@ -345,14 +345,14 @@ ReferenceApplyConstraintsKernel::~ReferenceApplyConstraintsKernel() {
}
void
ReferenceApplyConstraintsKernel
::
apply
(
ContextImpl
&
context
,
double
tol
)
{
vector
<
Real
Vec
>&
positions
=
extractPositions
(
context
);
vector
<
Vec
3
>&
positions
=
extractPositions
(
context
);
extractConstraints
(
context
).
apply
(
positions
,
positions
,
inverseMasses
,
tol
);
ReferenceVirtualSites
::
computePositions
(
context
.
getSystem
(),
positions
);
}
void
ReferenceApplyConstraintsKernel
::
applyToVelocities
(
ContextImpl
&
context
,
double
tol
)
{
vector
<
Real
Vec
>&
positions
=
extractPositions
(
context
);
vector
<
Real
Vec
>&
velocities
=
extractVelocities
(
context
);
vector
<
Vec
3
>&
positions
=
extractPositions
(
context
);
vector
<
Vec
3
>&
velocities
=
extractVelocities
(
context
);
extractConstraints
(
context
).
applyToVelocities
(
positions
,
velocities
,
inverseMasses
,
tol
);
}
...
...
@@ -360,7 +360,7 @@ void ReferenceVirtualSitesKernel::initialize(const System& system) {
}
void
ReferenceVirtualSitesKernel
::
computePositions
(
ContextImpl
&
context
)
{
vector
<
Real
Vec
>&
positions
=
extractPositions
(
context
);
vector
<
Vec
3
>&
positions
=
extractPositions
(
context
);
ReferenceVirtualSites
::
computePositions
(
context
.
getSystem
(),
positions
);
}
...
...
@@ -379,16 +379,16 @@ void ReferenceCalcHarmonicBondForceKernel::initialize(const System& system, cons
force
.
getBondParameters
(
i
,
particle1
,
particle2
,
length
,
k
);
bondIndexArray
[
i
][
0
]
=
particle1
;
bondIndexArray
[
i
][
1
]
=
particle2
;
bondParamArray
[
i
][
0
]
=
(
RealOpenMM
)
length
;
bondParamArray
[
i
][
1
]
=
(
RealOpenMM
)
k
;
bondParamArray
[
i
][
0
]
=
length
;
bondParamArray
[
i
][
1
]
=
k
;
}
usePeriodic
=
force
.
usesPeriodicBoundaryConditions
();
}
double
ReferenceCalcHarmonicBondForceKernel
::
execute
(
ContextImpl
&
context
,
bool
includeForces
,
bool
includeEnergy
)
{
vector
<
Real
Vec
>&
posData
=
extractPositions
(
context
);
vector
<
Real
Vec
>&
forceData
=
extractForces
(
context
);
RealOpenMM
energy
=
0
;
vector
<
Vec
3
>&
posData
=
extractPositions
(
context
);
vector
<
Vec
3
>&
forceData
=
extractForces
(
context
);
double
energy
=
0
;
ReferenceBondForce
refBondForce
;
ReferenceHarmonicBondIxn
harmonicBond
;
if
(
usePeriodic
)
...
...
@@ -411,8 +411,8 @@ void ReferenceCalcHarmonicBondForceKernel::copyParametersToContext(ContextImpl&
throw
OpenMMException
(
"updateParametersInContext: The set of particles in a bond has changed"
);
bondIndexArray
[
i
][
0
]
=
particle1
;
bondIndexArray
[
i
][
1
]
=
particle2
;
bondParamArray
[
i
][
0
]
=
(
RealOpenMM
)
length
;
bondParamArray
[
i
][
1
]
=
(
RealOpenMM
)
k
;
bondParamArray
[
i
][
0
]
=
length
;
bondParamArray
[
i
][
1
]
=
k
;
}
}
...
...
@@ -437,7 +437,7 @@ void ReferenceCalcCustomBondForceKernel::initialize(const System& system, const
bondIndexArray
[
i
][
0
]
=
particle1
;
bondIndexArray
[
i
][
1
]
=
particle2
;
for
(
int
j
=
0
;
j
<
numParameters
;
j
++
)
bondParamArray
[
i
][
j
]
=
(
RealOpenMM
)
params
[
j
];
bondParamArray
[
i
][
j
]
=
params
[
j
];
}
// Parse the expression used to calculate the force.
...
...
@@ -462,9 +462,9 @@ void ReferenceCalcCustomBondForceKernel::initialize(const System& system, const
}
double
ReferenceCalcCustomBondForceKernel
::
execute
(
ContextImpl
&
context
,
bool
includeForces
,
bool
includeEnergy
)
{
vector
<
Real
Vec
>&
posData
=
extractPositions
(
context
);
vector
<
Real
Vec
>&
forceData
=
extractForces
(
context
);
RealOpenMM
energy
=
0
;
vector
<
Vec
3
>&
posData
=
extractPositions
(
context
);
vector
<
Vec
3
>&
forceData
=
extractForces
(
context
);
double
energy
=
0
;
map
<
string
,
double
>
globalParameters
;
for
(
int
i
=
0
;
i
<
(
int
)
globalParameterNames
.
size
();
i
++
)
globalParameters
[
globalParameterNames
[
i
]]
=
context
.
getParameter
(
globalParameterNames
[
i
]);
...
...
@@ -494,7 +494,7 @@ void ReferenceCalcCustomBondForceKernel::copyParametersToContext(ContextImpl& co
if
(
particle1
!=
bondIndexArray
[
i
][
0
]
||
particle2
!=
bondIndexArray
[
i
][
1
])
throw
OpenMMException
(
"updateParametersInContext: The set of particles in a bond has changed"
);
for
(
int
j
=
0
;
j
<
numParameters
;
j
++
)
bondParamArray
[
i
][
j
]
=
(
RealOpenMM
)
params
[
j
];
bondParamArray
[
i
][
j
]
=
params
[
j
];
}
}
...
...
@@ -514,16 +514,16 @@ void ReferenceCalcHarmonicAngleForceKernel::initialize(const System& system, con
angleIndexArray
[
i
][
0
]
=
particle1
;
angleIndexArray
[
i
][
1
]
=
particle2
;
angleIndexArray
[
i
][
2
]
=
particle3
;
angleParamArray
[
i
][
0
]
=
(
RealOpenMM
)
angle
;
angleParamArray
[
i
][
1
]
=
(
RealOpenMM
)
k
;
angleParamArray
[
i
][
0
]
=
angle
;
angleParamArray
[
i
][
1
]
=
k
;
}
usePeriodic
=
force
.
usesPeriodicBoundaryConditions
();
}
double
ReferenceCalcHarmonicAngleForceKernel
::
execute
(
ContextImpl
&
context
,
bool
includeForces
,
bool
includeEnergy
)
{
vector
<
Real
Vec
>&
posData
=
extractPositions
(
context
);
vector
<
Real
Vec
>&
forceData
=
extractForces
(
context
);
RealOpenMM
energy
=
0
;
vector
<
Vec
3
>&
posData
=
extractPositions
(
context
);
vector
<
Vec
3
>&
forceData
=
extractForces
(
context
);
double
energy
=
0
;
ReferenceBondForce
refBondForce
;
ReferenceAngleBondIxn
angleBond
;
if
(
usePeriodic
)
...
...
@@ -544,8 +544,8 @@ void ReferenceCalcHarmonicAngleForceKernel::copyParametersToContext(ContextImpl&
force
.
getAngleParameters
(
i
,
particle1
,
particle2
,
particle3
,
angle
,
k
);
if
(
particle1
!=
angleIndexArray
[
i
][
0
]
||
particle2
!=
angleIndexArray
[
i
][
1
]
||
particle3
!=
angleIndexArray
[
i
][
2
])
throw
OpenMMException
(
"updateParametersInContext: The set of particles in an angle has changed"
);
angleParamArray
[
i
][
0
]
=
(
RealOpenMM
)
angle
;
angleParamArray
[
i
][
1
]
=
(
RealOpenMM
)
k
;
angleParamArray
[
i
][
0
]
=
angle
;
angleParamArray
[
i
][
1
]
=
k
;
}
}
...
...
@@ -571,7 +571,7 @@ void ReferenceCalcCustomAngleForceKernel::initialize(const System& system, const
angleIndexArray
[
i
][
1
]
=
particle2
;
angleIndexArray
[
i
][
2
]
=
particle3
;
for
(
int
j
=
0
;
j
<
numParameters
;
j
++
)
angleParamArray
[
i
][
j
]
=
(
RealOpenMM
)
params
[
j
];
angleParamArray
[
i
][
j
]
=
params
[
j
];
}
// Parse the expression used to calculate the force.
...
...
@@ -596,9 +596,9 @@ void ReferenceCalcCustomAngleForceKernel::initialize(const System& system, const
}
double
ReferenceCalcCustomAngleForceKernel
::
execute
(
ContextImpl
&
context
,
bool
includeForces
,
bool
includeEnergy
)
{
vector
<
Real
Vec
>&
posData
=
extractPositions
(
context
);
vector
<
Real
Vec
>&
forceData
=
extractForces
(
context
);
RealOpenMM
energy
=
0
;
vector
<
Vec
3
>&
posData
=
extractPositions
(
context
);
vector
<
Vec
3
>&
forceData
=
extractForces
(
context
);
double
energy
=
0
;
map
<
string
,
double
>
globalParameters
;
for
(
int
i
=
0
;
i
<
(
int
)
globalParameterNames
.
size
();
i
++
)
globalParameters
[
globalParameterNames
[
i
]]
=
context
.
getParameter
(
globalParameterNames
[
i
]);
...
...
@@ -628,7 +628,7 @@ void ReferenceCalcCustomAngleForceKernel::copyParametersToContext(ContextImpl& c
if
(
particle1
!=
angleIndexArray
[
i
][
0
]
||
particle2
!=
angleIndexArray
[
i
][
1
]
||
particle3
!=
angleIndexArray
[
i
][
2
])
throw
OpenMMException
(
"updateParametersInContext: The set of particles in an angle has changed"
);
for
(
int
j
=
0
;
j
<
numParameters
;
j
++
)
angleParamArray
[
i
][
j
]
=
(
RealOpenMM
)
params
[
j
];
angleParamArray
[
i
][
j
]
=
params
[
j
];
}
}
...
...
@@ -649,17 +649,17 @@ void ReferenceCalcPeriodicTorsionForceKernel::initialize(const System& system, c
torsionIndexArray
[
i
][
1
]
=
particle2
;
torsionIndexArray
[
i
][
2
]
=
particle3
;
torsionIndexArray
[
i
][
3
]
=
particle4
;
torsionParamArray
[
i
][
0
]
=
(
RealOpenMM
)
k
;
torsionParamArray
[
i
][
1
]
=
(
RealOpenMM
)
phase
;
torsionParamArray
[
i
][
2
]
=
(
RealOpenMM
)
periodicity
;
torsionParamArray
[
i
][
0
]
=
k
;
torsionParamArray
[
i
][
1
]
=
phase
;
torsionParamArray
[
i
][
2
]
=
periodicity
;
}
usePeriodic
=
force
.
usesPeriodicBoundaryConditions
();
}
double
ReferenceCalcPeriodicTorsionForceKernel
::
execute
(
ContextImpl
&
context
,
bool
includeForces
,
bool
includeEnergy
)
{
vector
<
Real
Vec
>&
posData
=
extractPositions
(
context
);
vector
<
Real
Vec
>&
forceData
=
extractForces
(
context
);
RealOpenMM
energy
=
0
;
vector
<
Vec
3
>&
posData
=
extractPositions
(
context
);
vector
<
Vec
3
>&
forceData
=
extractForces
(
context
);
double
energy
=
0
;
ReferenceBondForce
refBondForce
;
ReferenceProperDihedralBond
periodicTorsionBond
;
if
(
usePeriodic
)
...
...
@@ -680,9 +680,9 @@ void ReferenceCalcPeriodicTorsionForceKernel::copyParametersToContext(ContextImp
force
.
getTorsionParameters
(
i
,
particle1
,
particle2
,
particle3
,
particle4
,
periodicity
,
phase
,
k
);
if
(
particle1
!=
torsionIndexArray
[
i
][
0
]
||
particle2
!=
torsionIndexArray
[
i
][
1
]
||
particle3
!=
torsionIndexArray
[
i
][
2
]
||
particle4
!=
torsionIndexArray
[
i
][
3
])
throw
OpenMMException
(
"updateParametersInContext: The set of particles in a torsion has changed"
);
torsionParamArray
[
i
][
0
]
=
(
RealOpenMM
)
k
;
torsionParamArray
[
i
][
1
]
=
(
RealOpenMM
)
phase
;
torsionParamArray
[
i
][
2
]
=
(
RealOpenMM
)
periodicity
;
torsionParamArray
[
i
][
0
]
=
k
;
torsionParamArray
[
i
][
1
]
=
phase
;
torsionParamArray
[
i
][
2
]
=
periodicity
;
}
}
...
...
@@ -703,20 +703,20 @@ void ReferenceCalcRBTorsionForceKernel::initialize(const System& system, const R
torsionIndexArray
[
i
][
1
]
=
particle2
;
torsionIndexArray
[
i
][
2
]
=
particle3
;
torsionIndexArray
[
i
][
3
]
=
particle4
;
torsionParamArray
[
i
][
0
]
=
(
RealOpenMM
)
c0
;
torsionParamArray
[
i
][
1
]
=
(
RealOpenMM
)
c1
;
torsionParamArray
[
i
][
2
]
=
(
RealOpenMM
)
c2
;
torsionParamArray
[
i
][
3
]
=
(
RealOpenMM
)
c3
;
torsionParamArray
[
i
][
4
]
=
(
RealOpenMM
)
c4
;
torsionParamArray
[
i
][
5
]
=
(
RealOpenMM
)
c5
;
torsionParamArray
[
i
][
0
]
=
c0
;
torsionParamArray
[
i
][
1
]
=
c1
;
torsionParamArray
[
i
][
2
]
=
c2
;
torsionParamArray
[
i
][
3
]
=
c3
;
torsionParamArray
[
i
][
4
]
=
c4
;
torsionParamArray
[
i
][
5
]
=
c5
;
}
usePeriodic
=
force
.
usesPeriodicBoundaryConditions
();
}
double
ReferenceCalcRBTorsionForceKernel
::
execute
(
ContextImpl
&
context
,
bool
includeForces
,
bool
includeEnergy
)
{
vector
<
Real
Vec
>&
posData
=
extractPositions
(
context
);
vector
<
Real
Vec
>&
forceData
=
extractForces
(
context
);
RealOpenMM
energy
=
0
;
vector
<
Vec
3
>&
posData
=
extractPositions
(
context
);
vector
<
Vec
3
>&
forceData
=
extractForces
(
context
);
double
energy
=
0
;
ReferenceBondForce
refBondForce
;
ReferenceRbDihedralBond
rbTorsionBond
;
if
(
usePeriodic
)
...
...
@@ -737,12 +737,12 @@ void ReferenceCalcRBTorsionForceKernel::copyParametersToContext(ContextImpl& con
force
.
getTorsionParameters
(
i
,
particle1
,
particle2
,
particle3
,
particle4
,
c0
,
c1
,
c2
,
c3
,
c4
,
c5
);
if
(
particle1
!=
torsionIndexArray
[
i
][
0
]
||
particle2
!=
torsionIndexArray
[
i
][
1
]
||
particle3
!=
torsionIndexArray
[
i
][
2
]
||
particle4
!=
torsionIndexArray
[
i
][
3
])
throw
OpenMMException
(
"updateParametersInContext: The set of particles in a torsion has changed"
);
torsionParamArray
[
i
][
0
]
=
(
RealOpenMM
)
c0
;
torsionParamArray
[
i
][
1
]
=
(
RealOpenMM
)
c1
;
torsionParamArray
[
i
][
2
]
=
(
RealOpenMM
)
c2
;
torsionParamArray
[
i
][
3
]
=
(
RealOpenMM
)
c3
;
torsionParamArray
[
i
][
4
]
=
(
RealOpenMM
)
c4
;
torsionParamArray
[
i
][
5
]
=
(
RealOpenMM
)
c5
;
torsionParamArray
[
i
][
0
]
=
c0
;
torsionParamArray
[
i
][
1
]
=
c1
;
torsionParamArray
[
i
][
2
]
=
c2
;
torsionParamArray
[
i
][
3
]
=
c3
;
torsionParamArray
[
i
][
4
]
=
c4
;
torsionParamArray
[
i
][
5
]
=
c5
;
}
}
...
...
@@ -774,9 +774,9 @@ void ReferenceCalcCMAPTorsionForceKernel::initialize(const System& system, const
}
double
ReferenceCalcCMAPTorsionForceKernel
::
execute
(
ContextImpl
&
context
,
bool
includeForces
,
bool
includeEnergy
)
{
vector
<
Real
Vec
>&
posData
=
extractPositions
(
context
);
vector
<
Real
Vec
>&
forceData
=
extractForces
(
context
);
RealOpenMM
totalEnergy
=
0
;
vector
<
Vec
3
>&
posData
=
extractPositions
(
context
);
vector
<
Vec
3
>&
forceData
=
extractForces
(
context
);
double
totalEnergy
=
0
;
ReferenceCMAPTorsionIxn
torsion
(
coeff
,
torsionMaps
,
torsionIndices
);
if
(
usePeriodic
)
torsion
.
setPeriodic
(
extractBoxVectors
(
context
));
...
...
@@ -841,7 +841,7 @@ void ReferenceCalcCustomTorsionForceKernel::initialize(const System& system, con
torsionIndexArray
[
i
][
2
]
=
particle3
;
torsionIndexArray
[
i
][
3
]
=
particle4
;
for
(
int
j
=
0
;
j
<
numParameters
;
j
++
)
torsionParamArray
[
i
][
j
]
=
(
RealOpenMM
)
params
[
j
];
torsionParamArray
[
i
][
j
]
=
params
[
j
];
}
// Parse the expression used to calculate the force.
...
...
@@ -866,9 +866,9 @@ void ReferenceCalcCustomTorsionForceKernel::initialize(const System& system, con
}
double
ReferenceCalcCustomTorsionForceKernel
::
execute
(
ContextImpl
&
context
,
bool
includeForces
,
bool
includeEnergy
)
{
vector
<
Real
Vec
>&
posData
=
extractPositions
(
context
);
vector
<
Real
Vec
>&
forceData
=
extractForces
(
context
);
RealOpenMM
energy
=
0
;
vector
<
Vec
3
>&
posData
=
extractPositions
(
context
);
vector
<
Vec
3
>&
forceData
=
extractForces
(
context
);
double
energy
=
0
;
map
<
string
,
double
>
globalParameters
;
for
(
int
i
=
0
;
i
<
(
int
)
globalParameterNames
.
size
();
i
++
)
globalParameters
[
globalParameterNames
[
i
]]
=
context
.
getParameter
(
globalParameterNames
[
i
]);
...
...
@@ -898,7 +898,7 @@ void ReferenceCalcCustomTorsionForceKernel::copyParametersToContext(ContextImpl&
if
(
particle1
!=
torsionIndexArray
[
i
][
0
]
||
particle2
!=
torsionIndexArray
[
i
][
1
]
||
particle3
!=
torsionIndexArray
[
i
][
2
]
||
particle4
!=
torsionIndexArray
[
i
][
3
])
throw
OpenMMException
(
"updateParametersInContext: The set of particles in a torsion has changed"
);
for
(
int
j
=
0
;
j
<
numParameters
;
j
++
)
torsionParamArray
[
i
][
j
]
=
(
RealOpenMM
)
params
[
j
];
torsionParamArray
[
i
][
j
]
=
params
[
j
];
}
}
...
...
@@ -936,9 +936,9 @@ void ReferenceCalcNonbondedForceKernel::initialize(const System& system, const N
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
{
double
charge
,
radius
,
depth
;
force
.
getParticleParameters
(
i
,
charge
,
radius
,
depth
);
particleParamArray
[
i
][
0
]
=
static_cast
<
RealOpenMM
>
(
0.5
*
radius
)
;
particleParamArray
[
i
][
1
]
=
static_cast
<
RealOpenMM
>
(
2.0
*
sqrt
(
depth
)
)
;
particleParamArray
[
i
][
2
]
=
static_cast
<
RealOpenMM
>
(
charge
)
;
particleParamArray
[
i
][
0
]
=
0.5
*
radius
;
particleParamArray
[
i
][
1
]
=
2.0
*
sqrt
(
depth
);
particleParamArray
[
i
][
2
]
=
charge
;
}
this
->
exclusions
=
exclusions
;
for
(
int
i
=
0
;
i
<
num14
;
++
i
)
{
...
...
@@ -947,12 +947,12 @@ void ReferenceCalcNonbondedForceKernel::initialize(const System& system, const N
force
.
getExceptionParameters
(
nb14s
[
i
],
particle1
,
particle2
,
charge
,
radius
,
depth
);
bonded14IndexArray
[
i
][
0
]
=
particle1
;
bonded14IndexArray
[
i
][
1
]
=
particle2
;
bonded14ParamArray
[
i
][
0
]
=
static_cast
<
RealOpenMM
>
(
radius
)
;
bonded14ParamArray
[
i
][
1
]
=
static_cast
<
RealOpenMM
>
(
4.0
*
depth
)
;
bonded14ParamArray
[
i
][
2
]
=
static_cast
<
RealOpenMM
>
(
charge
)
;
bonded14ParamArray
[
i
][
0
]
=
radius
;
bonded14ParamArray
[
i
][
1
]
=
4.0
*
depth
;
bonded14ParamArray
[
i
][
2
]
=
charge
;
}
nonbondedMethod
=
CalcNonbondedForceKernel
::
NonbondedMethod
(
force
.
getNonbondedMethod
());
nonbondedCutoff
=
(
RealOpenMM
)
force
.
getCutoffDistance
();
nonbondedCutoff
=
force
.
getCutoffDistance
();
if
(
nonbondedMethod
==
NoCutoff
)
{
neighborList
=
NULL
;
useSwitchingFunction
=
false
;
...
...
@@ -965,14 +965,22 @@ void ReferenceCalcNonbondedForceKernel::initialize(const System& system, const N
if
(
nonbondedMethod
==
Ewald
)
{
double
alpha
;
NonbondedForceImpl
::
calcEwaldParameters
(
system
,
force
,
alpha
,
kmax
[
0
],
kmax
[
1
],
kmax
[
2
]);
ewaldAlpha
=
(
RealOpenMM
)
alpha
;
ewaldAlpha
=
alpha
;
}
else
if
(
nonbondedMethod
==
PME
)
{
double
alpha
;
NonbondedForceImpl
::
calcPMEParameters
(
system
,
force
,
alpha
,
gridSize
[
0
],
gridSize
[
1
],
gridSize
[
2
]);
ewaldAlpha
=
(
RealOpenMM
)
alpha
;
NonbondedForceImpl
::
calcPMEParameters
(
system
,
force
,
alpha
,
gridSize
[
0
],
gridSize
[
1
],
gridSize
[
2
],
false
);
ewaldAlpha
=
alpha
;
}
else
if
(
nonbondedMethod
==
LJPME
)
{
double
alpha
;
NonbondedForceImpl
::
calcPMEParameters
(
system
,
force
,
alpha
,
gridSize
[
0
],
gridSize
[
1
],
gridSize
[
2
],
false
);
ewaldAlpha
=
alpha
;
NonbondedForceImpl
::
calcPMEParameters
(
system
,
force
,
alpha
,
dispersionGridSize
[
0
],
dispersionGridSize
[
1
],
dispersionGridSize
[
2
],
true
);
ewaldDispersionAlpha
=
alpha
;
useSwitchingFunction
=
false
;
}
rfDielectric
=
(
RealOpenMM
)
force
.
getReactionFieldDielectric
();
rfDielectric
=
force
.
getReactionFieldDielectric
();
if
(
force
.
getUseDispersionCorrection
())
dispersionCoefficient
=
NonbondedForceImpl
::
calcDispersionCorrection
(
system
,
force
);
else
...
...
@@ -980,19 +988,20 @@ void ReferenceCalcNonbondedForceKernel::initialize(const System& system, const N
}
double
ReferenceCalcNonbondedForceKernel
::
execute
(
ContextImpl
&
context
,
bool
includeForces
,
bool
includeEnergy
,
bool
includeDirect
,
bool
includeReciprocal
)
{
vector
<
Real
Vec
>&
posData
=
extractPositions
(
context
);
vector
<
Real
Vec
>&
forceData
=
extractForces
(
context
);
RealOpenMM
energy
=
0
;
vector
<
Vec
3
>&
posData
=
extractPositions
(
context
);
vector
<
Vec
3
>&
forceData
=
extractForces
(
context
);
double
energy
=
0
;
ReferenceLJCoulombIxn
clj
;
bool
periodic
=
(
nonbondedMethod
==
CutoffPeriodic
);
bool
ewald
=
(
nonbondedMethod
==
Ewald
);
bool
pme
=
(
nonbondedMethod
==
PME
);
bool
ljpme
=
(
nonbondedMethod
==
LJPME
);
if
(
nonbondedMethod
!=
NoCutoff
)
{
computeNeighborListVoxelHash
(
*
neighborList
,
numParticles
,
posData
,
exclusions
,
extractBoxVectors
(
context
),
periodic
||
ewald
||
pme
,
nonbondedCutoff
,
0.0
);
computeNeighborListVoxelHash
(
*
neighborList
,
numParticles
,
posData
,
exclusions
,
extractBoxVectors
(
context
),
periodic
||
ewald
||
pme
||
ljpme
,
nonbondedCutoff
,
0.0
);
clj
.
setUseCutoff
(
nonbondedCutoff
,
*
neighborList
,
rfDielectric
);
}
if
(
periodic
||
ewald
||
pme
)
{
Real
Vec
*
boxVectors
=
extractBoxVectors
(
context
);
if
(
periodic
||
ewald
||
pme
||
ljpme
)
{
Vec
3
*
boxVectors
=
extractBoxVectors
(
context
);
double
minAllowedSize
=
1.999999
*
nonbondedCutoff
;
if
(
boxVectors
[
0
][
0
]
<
minAllowedSize
||
boxVectors
[
1
][
1
]
<
minAllowedSize
||
boxVectors
[
2
][
2
]
<
minAllowedSize
)
throw
OpenMMException
(
"The periodic box size has decreased to less than twice the nonbonded cutoff."
);
...
...
@@ -1002,6 +1011,10 @@ double ReferenceCalcNonbondedForceKernel::execute(ContextImpl& context, bool inc
clj
.
setUseEwald
(
ewaldAlpha
,
kmax
[
0
],
kmax
[
1
],
kmax
[
2
]);
if
(
pme
)
clj
.
setUsePME
(
ewaldAlpha
,
gridSize
);
if
(
ljpme
){
clj
.
setUsePME
(
ewaldAlpha
,
gridSize
);
clj
.
setUseLJPME
(
ewaldDispersionAlpha
,
dispersionGridSize
);
}
if
(
useSwitchingFunction
)
clj
.
setUseSwitchingFunction
(
switchingDistance
);
clj
.
calculatePairIxn
(
numParticles
,
posData
,
particleParamArray
,
exclusions
,
0
,
forceData
,
0
,
includeEnergy
?
&
energy
:
NULL
,
includeDirect
,
includeReciprocal
);
...
...
@@ -1010,7 +1023,7 @@ double ReferenceCalcNonbondedForceKernel::execute(ContextImpl& context, bool inc
ReferenceLJCoulomb14
nonbonded14
;
refBondForce
.
calculateForce
(
num14
,
bonded14IndexArray
,
posData
,
bonded14ParamArray
,
forceData
,
includeEnergy
?
&
energy
:
NULL
,
nonbonded14
);
if
(
periodic
||
ewald
||
pme
)
{
Real
Vec
*
boxVectors
=
extractBoxVectors
(
context
);
Vec
3
*
boxVectors
=
extractBoxVectors
(
context
);
energy
+=
dispersionCoefficient
/
(
boxVectors
[
0
][
0
]
*
boxVectors
[
1
][
1
]
*
boxVectors
[
2
][
2
]);
}
}
...
...
@@ -1036,9 +1049,9 @@ void ReferenceCalcNonbondedForceKernel::copyParametersToContext(ContextImpl& con
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
{
double
charge
,
radius
,
depth
;
force
.
getParticleParameters
(
i
,
charge
,
radius
,
depth
);
particleParamArray
[
i
][
0
]
=
static_cast
<
RealOpenMM
>
(
0.5
*
radius
)
;
particleParamArray
[
i
][
1
]
=
static_cast
<
RealOpenMM
>
(
2.0
*
sqrt
(
depth
)
)
;
particleParamArray
[
i
][
2
]
=
static_cast
<
RealOpenMM
>
(
charge
)
;
particleParamArray
[
i
][
0
]
=
0.5
*
radius
;
particleParamArray
[
i
][
1
]
=
2.0
*
sqrt
(
depth
);
particleParamArray
[
i
][
2
]
=
charge
;
}
for
(
int
i
=
0
;
i
<
num14
;
++
i
)
{
int
particle1
,
particle2
;
...
...
@@ -1046,9 +1059,9 @@ void ReferenceCalcNonbondedForceKernel::copyParametersToContext(ContextImpl& con
force
.
getExceptionParameters
(
nb14s
[
i
],
particle1
,
particle2
,
charge
,
radius
,
depth
);
bonded14IndexArray
[
i
][
0
]
=
particle1
;
bonded14IndexArray
[
i
][
1
]
=
particle2
;
bonded14ParamArray
[
i
][
0
]
=
static_cast
<
RealOpenMM
>
(
radius
)
;
bonded14ParamArray
[
i
][
1
]
=
static_cast
<
RealOpenMM
>
(
4.0
*
depth
)
;
bonded14ParamArray
[
i
][
2
]
=
static_cast
<
RealOpenMM
>
(
charge
)
;
bonded14ParamArray
[
i
][
0
]
=
radius
;
bonded14ParamArray
[
i
][
1
]
=
4.0
*
depth
;
bonded14ParamArray
[
i
][
2
]
=
charge
;
}
// Recompute the coefficient for the dispersion correction.
...
...
@@ -1059,14 +1072,23 @@ void ReferenceCalcNonbondedForceKernel::copyParametersToContext(ContextImpl& con
}
void
ReferenceCalcNonbondedForceKernel
::
getPMEParameters
(
double
&
alpha
,
int
&
nx
,
int
&
ny
,
int
&
nz
)
const
{
if
(
nonbondedMethod
!=
PME
)
throw
OpenMMException
(
"getPMEParametersInContext: This Context is not using PME"
);
if
(
nonbondedMethod
!=
PME
&&
nonbondedMethod
!=
LJPME
)
throw
OpenMMException
(
"getPMEParametersInContext: This Context is not using PME
or LJPME
"
);
alpha
=
ewaldAlpha
;
nx
=
gridSize
[
0
];
ny
=
gridSize
[
1
];
nz
=
gridSize
[
2
];
}
void
ReferenceCalcNonbondedForceKernel
::
getLJPMEParameters
(
double
&
alpha
,
int
&
nx
,
int
&
ny
,
int
&
nz
)
const
{
if
(
nonbondedMethod
!=
LJPME
)
throw
OpenMMException
(
"getPMEParametersInContext: This Context is not using LJPME"
);
alpha
=
ewaldDispersionAlpha
;
nx
=
dispersionGridSize
[
0
];
ny
=
dispersionGridSize
[
1
];
nz
=
dispersionGridSize
[
2
];
}
ReferenceCalcCustomNonbondedForceKernel
::~
ReferenceCalcCustomNonbondedForceKernel
()
{
disposeRealArray
(
particleParamArray
,
numParticles
);
if
(
neighborList
!=
NULL
)
...
...
@@ -1096,10 +1118,10 @@ void ReferenceCalcCustomNonbondedForceKernel::initialize(const System& system, c
vector
<
double
>
parameters
;
force
.
getParticleParameters
(
i
,
parameters
);
for
(
int
j
=
0
;
j
<
numParameters
;
j
++
)
particleParamArray
[
i
][
j
]
=
static_cast
<
RealOpenMM
>
(
parameters
[
j
]
)
;
particleParamArray
[
i
][
j
]
=
parameters
[
j
];
}
nonbondedMethod
=
CalcCustomNonbondedForceKernel
::
NonbondedMethod
(
force
.
getNonbondedMethod
());
nonbondedCutoff
=
(
RealOpenMM
)
force
.
getCutoffDistance
();
nonbondedCutoff
=
force
.
getCutoffDistance
();
if
(
nonbondedMethod
==
NoCutoff
)
{
neighborList
=
NULL
;
useSwitchingFunction
=
false
;
...
...
@@ -1167,10 +1189,10 @@ void ReferenceCalcCustomNonbondedForceKernel::initialize(const System& system, c
}
double
ReferenceCalcCustomNonbondedForceKernel
::
execute
(
ContextImpl
&
context
,
bool
includeForces
,
bool
includeEnergy
)
{
vector
<
Real
Vec
>&
posData
=
extractPositions
(
context
);
vector
<
Real
Vec
>&
forceData
=
extractForces
(
context
);
Real
Vec
*
boxVectors
=
extractBoxVectors
(
context
);
RealOpenMM
energy
=
0
;
vector
<
Vec
3
>&
posData
=
extractPositions
(
context
);
vector
<
Vec
3
>&
forceData
=
extractForces
(
context
);
Vec
3
*
boxVectors
=
extractBoxVectors
(
context
);
double
energy
=
0
;
ReferenceCustomNonbondedIxn
ixn
(
energyExpression
,
forceExpression
,
parameterNames
,
energyParamDerivExpressions
);
bool
periodic
=
(
nonbondedMethod
==
CutoffPeriodic
);
if
(
nonbondedMethod
!=
NoCutoff
)
{
...
...
@@ -1225,7 +1247,7 @@ void ReferenceCalcCustomNonbondedForceKernel::copyParametersToContext(ContextImp
vector
<
double
>
parameters
;
force
.
getParticleParameters
(
i
,
parameters
);
for
(
int
j
=
0
;
j
<
numParameters
;
j
++
)
particleParamArray
[
i
][
j
]
=
static_cast
<
RealOpenMM
>
(
parameters
[
j
]
)
;
particleParamArray
[
i
][
j
]
=
parameters
[
j
];
}
// If necessary, recompute the long range correction.
...
...
@@ -1247,31 +1269,31 @@ ReferenceCalcGBSAOBCForceKernel::~ReferenceCalcGBSAOBCForceKernel() {
void
ReferenceCalcGBSAOBCForceKernel
::
initialize
(
const
System
&
system
,
const
GBSAOBCForce
&
force
)
{
int
numParticles
=
system
.
getNumParticles
();
charges
.
resize
(
numParticles
);
vector
<
RealOpenMM
>
atomicRadii
(
numParticles
);
vector
<
RealOpenMM
>
scaleFactors
(
numParticles
);
vector
<
double
>
atomicRadii
(
numParticles
);
vector
<
double
>
scaleFactors
(
numParticles
);
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
{
double
charge
,
radius
,
scalingFactor
;
force
.
getParticleParameters
(
i
,
charge
,
radius
,
scalingFactor
);
charges
[
i
]
=
static_cast
<
RealOpenMM
>
(
charge
)
;
atomicRadii
[
i
]
=
static_cast
<
RealOpenMM
>
(
radius
)
;
scaleFactors
[
i
]
=
static_cast
<
RealOpenMM
>
(
scalingFactor
)
;
charges
[
i
]
=
charge
;
atomicRadii
[
i
]
=
radius
;
scaleFactors
[
i
]
=
scalingFactor
;
}
ObcParameters
*
obcParameters
=
new
ObcParameters
(
numParticles
,
ObcParameters
::
ObcTypeII
);
obcParameters
->
setAtomicRadii
(
atomicRadii
);
obcParameters
->
setScaledRadiusFactors
(
scaleFactors
);
obcParameters
->
setSolventDielectric
(
static_cast
<
RealOpenMM
>
(
force
.
getSolventDielectric
())
)
;
obcParameters
->
setSoluteDielectric
(
static_cast
<
RealOpenMM
>
(
force
.
getSoluteDielectric
())
)
;
obcParameters
->
setSolventDielectric
(
force
.
getSolventDielectric
());
obcParameters
->
setSoluteDielectric
(
force
.
getSoluteDielectric
());
obcParameters
->
setPi4Asolv
(
4
*
M_PI
*
force
.
getSurfaceAreaEnergy
());
if
(
force
.
getNonbondedMethod
()
!=
GBSAOBCForce
::
NoCutoff
)
obcParameters
->
setUseCutoff
(
static_cast
<
RealOpenMM
>
(
force
.
getCutoffDistance
())
)
;
obcParameters
->
setUseCutoff
(
force
.
getCutoffDistance
());
isPeriodic
=
(
force
.
getNonbondedMethod
()
==
GBSAOBCForce
::
CutoffPeriodic
);
obc
=
new
ReferenceObc
(
obcParameters
);
obc
->
setIncludeAceApproximation
(
true
);
}
double
ReferenceCalcGBSAOBCForceKernel
::
execute
(
ContextImpl
&
context
,
bool
includeForces
,
bool
includeEnergy
)
{
vector
<
Real
Vec
>&
posData
=
extractPositions
(
context
);
vector
<
Real
Vec
>&
forceData
=
extractForces
(
context
);
vector
<
Vec
3
>&
posData
=
extractPositions
(
context
);
vector
<
Vec
3
>&
forceData
=
extractForces
(
context
);
if
(
isPeriodic
)
obc
->
getObcParameters
()
->
setPeriodic
(
extractBoxVectors
(
context
));
return
obc
->
computeBornEnergyForces
(
posData
,
charges
,
forceData
);
...
...
@@ -1285,14 +1307,14 @@ void ReferenceCalcGBSAOBCForceKernel::copyParametersToContext(ContextImpl& conte
// Record the values.
vector
<
RealOpenMM
>
atomicRadii
(
numParticles
);
vector
<
RealOpenMM
>
scaleFactors
(
numParticles
);
vector
<
double
>
atomicRadii
(
numParticles
);
vector
<
double
>
scaleFactors
(
numParticles
);
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
{
double
charge
,
radius
,
scalingFactor
;
force
.
getParticleParameters
(
i
,
charge
,
radius
,
scalingFactor
);
charges
[
i
]
=
(
RealOpenMM
)
charge
;
atomicRadii
[
i
]
=
(
RealOpenMM
)
radius
;
scaleFactors
[
i
]
=
(
RealOpenMM
)
scalingFactor
;
charges
[
i
]
=
charge
;
atomicRadii
[
i
]
=
radius
;
scaleFactors
[
i
]
=
scalingFactor
;
}
obcParameters
->
setAtomicRadii
(
atomicRadii
);
obcParameters
->
setScaledRadiusFactors
(
scaleFactors
);
...
...
@@ -1337,14 +1359,14 @@ void ReferenceCalcCustomGBForceKernel::initialize(const System& system, const Cu
vector
<
double
>
parameters
;
force
.
getParticleParameters
(
i
,
parameters
);
for
(
int
j
=
0
;
j
<
numPerParticleParameters
;
j
++
)
particleParamArray
[
i
][
j
]
=
static_cast
<
RealOpenMM
>
(
parameters
[
j
]
)
;
particleParamArray
[
i
][
j
]
=
parameters
[
j
];
}
for
(
int
i
=
0
;
i
<
numPerParticleParameters
;
i
++
)
particleParameterNames
.
push_back
(
force
.
getPerParticleParameterName
(
i
));
for
(
int
i
=
0
;
i
<
force
.
getNumGlobalParameters
();
i
++
)
globalParameterNames
.
push_back
(
force
.
getGlobalParameterName
(
i
));
nonbondedMethod
=
CalcCustomGBForceKernel
::
NonbondedMethod
(
force
.
getNonbondedMethod
());
nonbondedCutoff
=
(
RealOpenMM
)
force
.
getCutoffDistance
();
nonbondedCutoff
=
force
.
getCutoffDistance
();
if
(
nonbondedMethod
==
NoCutoff
)
neighborList
=
NULL
;
else
...
...
@@ -1442,9 +1464,9 @@ void ReferenceCalcCustomGBForceKernel::initialize(const System& system, const Cu
}
double
ReferenceCalcCustomGBForceKernel
::
execute
(
ContextImpl
&
context
,
bool
includeForces
,
bool
includeEnergy
)
{
vector
<
Real
Vec
>&
posData
=
extractPositions
(
context
);
vector
<
Real
Vec
>&
forceData
=
extractForces
(
context
);
RealOpenMM
energy
=
0
;
vector
<
Vec
3
>&
posData
=
extractPositions
(
context
);
vector
<
Vec
3
>&
forceData
=
extractForces
(
context
);
double
energy
=
0
;
ReferenceCustomGBIxn
ixn
(
valueExpressions
,
valueDerivExpressions
,
valueGradientExpressions
,
valueParamDerivExpressions
,
valueNames
,
valueTypes
,
energyExpressions
,
energyDerivExpressions
,
energyGradientExpressions
,
energyParamDerivExpressions
,
energyTypes
,
particleParameterNames
);
bool
periodic
=
(
nonbondedMethod
==
CutoffPeriodic
);
...
...
@@ -1477,11 +1499,11 @@ void ReferenceCalcCustomGBForceKernel::copyParametersToContext(ContextImpl& cont
vector
<
double
>
parameters
;
force
.
getParticleParameters
(
i
,
parameters
);
for
(
int
j
=
0
;
j
<
numParameters
;
j
++
)
particleParamArray
[
i
][
j
]
=
static_cast
<
RealOpenMM
>
(
parameters
[
j
]
)
;
particleParamArray
[
i
][
j
]
=
parameters
[
j
];
}
}
ReferenceCalcCustomExternalForceKernel
::
PeriodicDistanceFunction
::
PeriodicDistanceFunction
(
Real
Vec
**
boxVectorHandle
)
:
boxVectorHandle
(
boxVectorHandle
)
{
ReferenceCalcCustomExternalForceKernel
::
PeriodicDistanceFunction
::
PeriodicDistanceFunction
(
Vec
3
**
boxVectorHandle
)
:
boxVectorHandle
(
boxVectorHandle
)
{
}
int
ReferenceCalcCustomExternalForceKernel
::
PeriodicDistanceFunction
::
getNumArguments
()
const
{
...
...
@@ -1489,8 +1511,8 @@ int ReferenceCalcCustomExternalForceKernel::PeriodicDistanceFunction::getNumArgu
}
double
ReferenceCalcCustomExternalForceKernel
::
PeriodicDistanceFunction
::
evaluate
(
const
double
*
arguments
)
const
{
Real
Vec
*
boxVectors
=
*
boxVectorHandle
;
Real
Vec
delta
=
Real
Vec
(
arguments
[
0
],
arguments
[
1
],
arguments
[
2
])
-
Real
Vec
(
arguments
[
3
],
arguments
[
4
],
arguments
[
5
]);
Vec
3
*
boxVectors
=
*
boxVectorHandle
;
Vec
3
delta
=
Vec
3
(
arguments
[
0
],
arguments
[
1
],
arguments
[
2
])
-
Vec
3
(
arguments
[
3
],
arguments
[
4
],
arguments
[
5
]);
delta
-=
boxVectors
[
2
]
*
floor
(
delta
[
2
]
/
boxVectors
[
2
][
2
]
+
0.5
);
delta
-=
boxVectors
[
1
]
*
floor
(
delta
[
1
]
/
boxVectors
[
1
][
1
]
+
0.5
);
delta
-=
boxVectors
[
0
]
*
floor
(
delta
[
0
]
/
boxVectors
[
0
][
0
]
+
0.5
);
...
...
@@ -1506,8 +1528,8 @@ double ReferenceCalcCustomExternalForceKernel::PeriodicDistanceFunction::evaluat
argIndex
=
i
;
}
}
Real
Vec
*
boxVectors
=
*
boxVectorHandle
;
Real
Vec
delta
=
Real
Vec
(
arguments
[
0
],
arguments
[
1
],
arguments
[
2
])
-
Real
Vec
(
arguments
[
3
],
arguments
[
4
],
arguments
[
5
]);
Vec
3
*
boxVectors
=
*
boxVectorHandle
;
Vec
3
delta
=
Vec
3
(
arguments
[
0
],
arguments
[
1
],
arguments
[
2
])
-
Vec
3
(
arguments
[
3
],
arguments
[
4
],
arguments
[
5
]);
delta
-=
boxVectors
[
2
]
*
floor
(
delta
[
2
]
/
boxVectors
[
2
][
2
]
+
0.5
);
delta
-=
boxVectors
[
1
]
*
floor
(
delta
[
1
]
/
boxVectors
[
1
][
1
]
+
0.5
);
delta
-=
boxVectors
[
0
]
*
floor
(
delta
[
0
]
/
boxVectors
[
0
][
0
]
+
0.5
);
...
...
@@ -1539,7 +1561,7 @@ void ReferenceCalcCustomExternalForceKernel::initialize(const System& system, co
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
{
force
.
getParticleParameters
(
i
,
particles
[
i
],
params
);
for
(
int
j
=
0
;
j
<
numParameters
;
j
++
)
particleParamArray
[
i
][
j
]
=
(
RealOpenMM
)
params
[
j
];
particleParamArray
[
i
][
j
]
=
params
[
j
];
}
// Parse the expression used to calculate the force.
...
...
@@ -1566,10 +1588,10 @@ void ReferenceCalcCustomExternalForceKernel::initialize(const System& system, co
}
double
ReferenceCalcCustomExternalForceKernel
::
execute
(
ContextImpl
&
context
,
bool
includeForces
,
bool
includeEnergy
)
{
vector
<
Real
Vec
>&
posData
=
extractPositions
(
context
);
vector
<
Real
Vec
>&
forceData
=
extractForces
(
context
);
vector
<
Vec
3
>&
posData
=
extractPositions
(
context
);
vector
<
Vec
3
>&
forceData
=
extractForces
(
context
);
boxVectors
=
extractBoxVectors
(
context
);
RealOpenMM
energy
=
0
;
double
energy
=
0
;
map
<
string
,
double
>
globalParameters
;
for
(
int
i
=
0
;
i
<
(
int
)
globalParameterNames
.
size
();
i
++
)
globalParameters
[
globalParameterNames
[
i
]]
=
context
.
getParameter
(
globalParameterNames
[
i
]);
...
...
@@ -1594,7 +1616,7 @@ void ReferenceCalcCustomExternalForceKernel::copyParametersToContext(ContextImpl
if
(
particle
!=
particles
[
i
])
throw
OpenMMException
(
"updateParametersInContext: A particle index has changed"
);
for
(
int
j
=
0
;
j
<
numParameters
;
j
++
)
particleParamArray
[
i
][
j
]
=
static_cast
<
RealOpenMM
>
(
parameters
[
j
]
)
;
particleParamArray
[
i
][
j
]
=
parameters
[
j
];
}
}
...
...
@@ -1632,7 +1654,7 @@ void ReferenceCalcCustomHbondForceKernel::initialize(const System& system, const
donorParticles
[
i
].
push_back
(
d2
);
donorParticles
[
i
].
push_back
(
d3
);
for
(
int
j
=
0
;
j
<
numDonorParameters
;
j
++
)
donorParamArray
[
i
][
j
]
=
static_cast
<
RealOpenMM
>
(
parameters
[
j
]
)
;
donorParamArray
[
i
][
j
]
=
parameters
[
j
];
}
vector
<
vector
<
int
>
>
acceptorParticles
(
numAcceptors
);
int
numAcceptorParameters
=
force
.
getNumPerAcceptorParameters
();
...
...
@@ -1645,10 +1667,10 @@ void ReferenceCalcCustomHbondForceKernel::initialize(const System& system, const
acceptorParticles
[
i
].
push_back
(
a2
);
acceptorParticles
[
i
].
push_back
(
a3
);
for
(
int
j
=
0
;
j
<
numAcceptorParameters
;
j
++
)
acceptorParamArray
[
i
][
j
]
=
static_cast
<
RealOpenMM
>
(
parameters
[
j
]
)
;
acceptorParamArray
[
i
][
j
]
=
parameters
[
j
];
}
NonbondedMethod
nonbondedMethod
=
CalcCustomHbondForceKernel
::
NonbondedMethod
(
force
.
getNonbondedMethod
());
nonbondedCutoff
=
(
RealOpenMM
)
force
.
getCutoffDistance
();
nonbondedCutoff
=
force
.
getCutoffDistance
();
// Create custom functions for the tabulated functions.
...
...
@@ -1682,11 +1704,11 @@ void ReferenceCalcCustomHbondForceKernel::initialize(const System& system, const
}
double
ReferenceCalcCustomHbondForceKernel
::
execute
(
ContextImpl
&
context
,
bool
includeForces
,
bool
includeEnergy
)
{
vector
<
Real
Vec
>&
posData
=
extractPositions
(
context
);
vector
<
Real
Vec
>&
forceData
=
extractForces
(
context
);
vector
<
Vec
3
>&
posData
=
extractPositions
(
context
);
vector
<
Vec
3
>&
forceData
=
extractForces
(
context
);
if
(
isPeriodic
)
ixn
->
setPeriodic
(
extractBoxVectors
(
context
));
RealOpenMM
energy
=
0
;
double
energy
=
0
;
map
<
string
,
double
>
globalParameters
;
for
(
int
i
=
0
;
i
<
(
int
)
globalParameterNames
.
size
();
i
++
)
globalParameters
[
globalParameterNames
[
i
]]
=
context
.
getParameter
(
globalParameterNames
[
i
]);
...
...
@@ -1711,7 +1733,7 @@ void ReferenceCalcCustomHbondForceKernel::copyParametersToContext(ContextImpl& c
if
(
d1
!=
donorAtoms
[
i
][
0
]
||
d2
!=
donorAtoms
[
i
][
1
]
||
d3
!=
donorAtoms
[
i
][
2
])
throw
OpenMMException
(
"updateParametersInContext: The set of particles in a donor group has changed"
);
for
(
int
j
=
0
;
j
<
numDonorParameters
;
j
++
)
donorParamArray
[
i
][
j
]
=
static_cast
<
RealOpenMM
>
(
parameters
[
j
]
)
;
donorParamArray
[
i
][
j
]
=
parameters
[
j
];
}
int
numAcceptorParameters
=
force
.
getNumPerAcceptorParameters
();
const
vector
<
vector
<
int
>
>&
acceptorAtoms
=
ixn
->
getAcceptorAtoms
();
...
...
@@ -1721,7 +1743,7 @@ void ReferenceCalcCustomHbondForceKernel::copyParametersToContext(ContextImpl& c
if
(
a1
!=
acceptorAtoms
[
i
][
0
]
||
a2
!=
acceptorAtoms
[
i
][
1
]
||
a3
!=
acceptorAtoms
[
i
][
2
])
throw
OpenMMException
(
"updateParametersInContext: The set of particles in an acceptor group has changed"
);
for
(
int
j
=
0
;
j
<
numAcceptorParameters
;
j
++
)
acceptorParamArray
[
i
][
j
]
=
static_cast
<
RealOpenMM
>
(
parameters
[
j
]
)
;
acceptorParamArray
[
i
][
j
]
=
parameters
[
j
];
}
}
...
...
@@ -1751,7 +1773,7 @@ void ReferenceCalcCustomCentroidBondForceKernel::initialize(const System& system
vector
<
double
>
parameters
;
force
.
getBondParameters
(
i
,
bondGroups
[
i
],
parameters
);
for
(
int
j
=
0
;
j
<
numBondParameters
;
j
++
)
bondParamArray
[
i
][
j
]
=
static_cast
<
RealOpenMM
>
(
parameters
[
j
]
)
;
bondParamArray
[
i
][
j
]
=
parameters
[
j
];
}
// Create custom functions for the tabulated functions.
...
...
@@ -1786,9 +1808,9 @@ void ReferenceCalcCustomCentroidBondForceKernel::initialize(const System& system
}
double
ReferenceCalcCustomCentroidBondForceKernel
::
execute
(
ContextImpl
&
context
,
bool
includeForces
,
bool
includeEnergy
)
{
vector
<
Real
Vec
>&
posData
=
extractPositions
(
context
);
vector
<
Real
Vec
>&
forceData
=
extractForces
(
context
);
RealOpenMM
energy
=
0
;
vector
<
Vec
3
>&
posData
=
extractPositions
(
context
);
vector
<
Vec
3
>&
forceData
=
extractForces
(
context
);
double
energy
=
0
;
map
<
string
,
double
>
globalParameters
;
for
(
int
i
=
0
;
i
<
(
int
)
globalParameterNames
.
size
();
i
++
)
globalParameters
[
globalParameterNames
[
i
]]
=
context
.
getParameter
(
globalParameterNames
[
i
]);
...
...
@@ -1818,7 +1840,7 @@ void ReferenceCalcCustomCentroidBondForceKernel::copyParametersToContext(Context
if
(
groups
[
j
]
!=
bondGroups
[
i
][
j
])
throw
OpenMMException
(
"updateParametersInContext: The set of groups in a bond has changed"
);
for
(
int
j
=
0
;
j
<
numParameters
;
j
++
)
bondParamArray
[
i
][
j
]
=
(
RealOpenMM
)
params
[
j
];
bondParamArray
[
i
][
j
]
=
params
[
j
];
}
}
...
...
@@ -1841,7 +1863,7 @@ void ReferenceCalcCustomCompoundBondForceKernel::initialize(const System& system
vector
<
double
>
parameters
;
force
.
getBondParameters
(
i
,
bondParticles
[
i
],
parameters
);
for
(
int
j
=
0
;
j
<
numBondParameters
;
j
++
)
bondParamArray
[
i
][
j
]
=
static_cast
<
RealOpenMM
>
(
parameters
[
j
]
)
;
bondParamArray
[
i
][
j
]
=
parameters
[
j
];
}
// Create custom functions for the tabulated functions.
...
...
@@ -1876,9 +1898,9 @@ void ReferenceCalcCustomCompoundBondForceKernel::initialize(const System& system
}
double
ReferenceCalcCustomCompoundBondForceKernel
::
execute
(
ContextImpl
&
context
,
bool
includeForces
,
bool
includeEnergy
)
{
vector
<
Real
Vec
>&
posData
=
extractPositions
(
context
);
vector
<
Real
Vec
>&
forceData
=
extractForces
(
context
);
RealOpenMM
energy
=
0
;
vector
<
Vec
3
>&
posData
=
extractPositions
(
context
);
vector
<
Vec
3
>&
forceData
=
extractForces
(
context
);
double
energy
=
0
;
map
<
string
,
double
>
globalParameters
;
for
(
int
i
=
0
;
i
<
(
int
)
globalParameterNames
.
size
();
i
++
)
globalParameters
[
globalParameterNames
[
i
]]
=
context
.
getParameter
(
globalParameterNames
[
i
]);
...
...
@@ -1908,7 +1930,7 @@ void ReferenceCalcCustomCompoundBondForceKernel::copyParametersToContext(Context
if
(
particles
[
j
]
!=
bondAtoms
[
i
][
j
])
throw
OpenMMException
(
"updateParametersInContext: The set of particles in a bond has changed"
);
for
(
int
j
=
0
;
j
<
numParameters
;
j
++
)
bondParamArray
[
i
][
j
]
=
(
RealOpenMM
)
params
[
j
];
bondParamArray
[
i
][
j
]
=
params
[
j
];
}
}
...
...
@@ -1940,14 +1962,14 @@ void ReferenceCalcCustomManyParticleForceKernel::initialize(const System& system
}
double
ReferenceCalcCustomManyParticleForceKernel
::
execute
(
ContextImpl
&
context
,
bool
includeForces
,
bool
includeEnergy
)
{
vector
<
Real
Vec
>&
posData
=
extractPositions
(
context
);
vector
<
Real
Vec
>&
forceData
=
extractForces
(
context
);
RealOpenMM
energy
=
0
;
vector
<
Vec
3
>&
posData
=
extractPositions
(
context
);
vector
<
Vec
3
>&
forceData
=
extractForces
(
context
);
double
energy
=
0
;
map
<
string
,
double
>
globalParameters
;
for
(
int
i
=
0
;
i
<
(
int
)
globalParameterNames
.
size
();
i
++
)
globalParameters
[
globalParameterNames
[
i
]]
=
context
.
getParameter
(
globalParameterNames
[
i
]);
if
(
nonbondedMethod
==
CutoffPeriodic
)
{
Real
Vec
*
boxVectors
=
extractBoxVectors
(
context
);
Vec
3
*
boxVectors
=
extractBoxVectors
(
context
);
double
minAllowedSize
=
2
*
cutoffDistance
;
if
(
boxVectors
[
0
][
0
]
<
minAllowedSize
||
boxVectors
[
1
][
1
]
<
minAllowedSize
||
boxVectors
[
2
][
2
]
<
minAllowedSize
)
throw
OpenMMException
(
"The periodic box size has decreased to less than twice the nonbonded cutoff."
);
...
...
@@ -1970,7 +1992,7 @@ void ReferenceCalcCustomManyParticleForceKernel::copyParametersToContext(Context
int
type
;
force
.
getParticleParameters
(
i
,
parameters
,
type
);
for
(
int
j
=
0
;
j
<
numParameters
;
j
++
)
particleParamArray
[
i
][
j
]
=
static_cast
<
RealOpenMM
>
(
parameters
[
j
]
)
;
particleParamArray
[
i
][
j
]
=
parameters
[
j
];
}
}
...
...
@@ -2002,20 +2024,20 @@ void ReferenceIntegrateVerletStepKernel::initialize(const System& system, const
int
numParticles
=
system
.
getNumParticles
();
masses
.
resize
(
numParticles
);
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
masses
[
i
]
=
static_cast
<
RealOpenMM
>
(
system
.
getParticleMass
(
i
)
)
;
masses
[
i
]
=
system
.
getParticleMass
(
i
);
}
void
ReferenceIntegrateVerletStepKernel
::
execute
(
ContextImpl
&
context
,
const
VerletIntegrator
&
integrator
)
{
double
stepSize
=
integrator
.
getStepSize
();
vector
<
Real
Vec
>&
posData
=
extractPositions
(
context
);
vector
<
Real
Vec
>&
velData
=
extractVelocities
(
context
);
vector
<
Real
Vec
>&
forceData
=
extractForces
(
context
);
vector
<
Vec
3
>&
posData
=
extractPositions
(
context
);
vector
<
Vec
3
>&
velData
=
extractVelocities
(
context
);
vector
<
Vec
3
>&
forceData
=
extractForces
(
context
);
if
(
dynamics
==
0
||
stepSize
!=
prevStepSize
)
{
// Recreate the computation objects with the new parameters.
if
(
dynamics
)
delete
dynamics
;
dynamics
=
new
ReferenceVerletDynamics
(
context
.
getSystem
().
getNumParticles
(),
static_cast
<
RealOpenMM
>
(
stepSize
)
)
;
dynamics
=
new
ReferenceVerletDynamics
(
context
.
getSystem
().
getNumParticles
(),
stepSize
);
dynamics
->
setReferenceConstraintAlgorithm
(
&
extractConstraints
(
context
));
prevStepSize
=
stepSize
;
}
...
...
@@ -2037,7 +2059,7 @@ void ReferenceIntegrateLangevinStepKernel::initialize(const System& system, cons
int
numParticles
=
system
.
getNumParticles
();
masses
.
resize
(
numParticles
);
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
masses
[
i
]
=
static_cast
<
RealOpenMM
>
(
system
.
getParticleMass
(
i
)
)
;
masses
[
i
]
=
system
.
getParticleMass
(
i
);
SimTKOpenMMUtilities
::
setRandomNumberSeed
((
unsigned
int
)
integrator
.
getRandomNumberSeed
());
}
...
...
@@ -2045,20 +2067,19 @@ void ReferenceIntegrateLangevinStepKernel::execute(ContextImpl& context, const L
double
temperature
=
integrator
.
getTemperature
();
double
friction
=
integrator
.
getFriction
();
double
stepSize
=
integrator
.
getStepSize
();
vector
<
Real
Vec
>&
posData
=
extractPositions
(
context
);
vector
<
Real
Vec
>&
velData
=
extractVelocities
(
context
);
vector
<
Real
Vec
>&
forceData
=
extractForces
(
context
);
vector
<
Vec
3
>&
posData
=
extractPositions
(
context
);
vector
<
Vec
3
>&
velData
=
extractVelocities
(
context
);
vector
<
Vec
3
>&
forceData
=
extractForces
(
context
);
if
(
dynamics
==
0
||
temperature
!=
prevTemp
||
friction
!=
prevFriction
||
stepSize
!=
prevStepSize
)
{
// Recreate the computation objects with the new parameters.
if
(
dynamics
)
delete
dynamics
;
RealOpenMM
tau
=
static_cast
<
RealOpenMM
>
(
friction
==
0.0
?
0.0
:
1.0
/
friction
);
dynamics
=
new
ReferenceStochasticDynamics
(
context
.
getSystem
().
getNumParticles
(),
static_cast
<
RealOpenMM
>
(
stepSize
)
,
static_cast
<
RealOpenMM
>
(
tau
)
,
static_cast
<
RealOpenMM
>
(
temperature
)
)
;
stepSize
,
friction
,
temperature
);
dynamics
->
setReferenceConstraintAlgorithm
(
&
extractConstraints
(
context
));
prevTemp
=
temperature
;
prevFriction
=
friction
;
...
...
@@ -2082,7 +2103,7 @@ void ReferenceIntegrateBrownianStepKernel::initialize(const System& system, cons
int
numParticles
=
system
.
getNumParticles
();
masses
.
resize
(
numParticles
);
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
masses
[
i
]
=
static_cast
<
RealOpenMM
>
(
system
.
getParticleMass
(
i
)
)
;
masses
[
i
]
=
system
.
getParticleMass
(
i
);
SimTKOpenMMUtilities
::
setRandomNumberSeed
((
unsigned
int
)
integrator
.
getRandomNumberSeed
());
}
...
...
@@ -2090,9 +2111,9 @@ void ReferenceIntegrateBrownianStepKernel::execute(ContextImpl& context, const B
double
temperature
=
integrator
.
getTemperature
();
double
friction
=
integrator
.
getFriction
();
double
stepSize
=
integrator
.
getStepSize
();
vector
<
Real
Vec
>&
posData
=
extractPositions
(
context
);
vector
<
Real
Vec
>&
velData
=
extractVelocities
(
context
);
vector
<
Real
Vec
>&
forceData
=
extractForces
(
context
);
vector
<
Vec
3
>&
posData
=
extractPositions
(
context
);
vector
<
Vec
3
>&
velData
=
extractVelocities
(
context
);
vector
<
Vec
3
>&
forceData
=
extractForces
(
context
);
if
(
dynamics
==
0
||
temperature
!=
prevTemp
||
friction
!=
prevFriction
||
stepSize
!=
prevStepSize
)
{
// Recreate the computation objects with the new parameters.
...
...
@@ -2100,9 +2121,9 @@ void ReferenceIntegrateBrownianStepKernel::execute(ContextImpl& context, const B
delete
dynamics
;
dynamics
=
new
ReferenceBrownianDynamics
(
context
.
getSystem
().
getNumParticles
(),
static_cast
<
RealOpenMM
>
(
stepSize
)
,
static_cast
<
RealOpenMM
>
(
friction
)
,
static_cast
<
RealOpenMM
>
(
temperature
)
)
;
stepSize
,
friction
,
temperature
);
dynamics
->
setReferenceConstraintAlgorithm
(
&
extractConstraints
(
context
));
prevTemp
=
temperature
;
prevFriction
=
friction
;
...
...
@@ -2126,7 +2147,7 @@ void ReferenceIntegrateVariableLangevinStepKernel::initialize(const System& syst
int
numParticles
=
system
.
getNumParticles
();
masses
.
resize
(
numParticles
);
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
masses
[
i
]
=
static_cast
<
RealOpenMM
>
(
system
.
getParticleMass
(
i
)
)
;
masses
[
i
]
=
system
.
getParticleMass
(
i
);
SimTKOpenMMUtilities
::
setRandomNumberSeed
((
unsigned
int
)
integrator
.
getRandomNumberSeed
());
}
...
...
@@ -2134,22 +2155,21 @@ double ReferenceIntegrateVariableLangevinStepKernel::execute(ContextImpl& contex
double
temperature
=
integrator
.
getTemperature
();
double
friction
=
integrator
.
getFriction
();
double
errorTol
=
integrator
.
getErrorTolerance
();
vector
<
Real
Vec
>&
posData
=
extractPositions
(
context
);
vector
<
Real
Vec
>&
velData
=
extractVelocities
(
context
);
vector
<
Real
Vec
>&
forceData
=
extractForces
(
context
);
vector
<
Vec
3
>&
posData
=
extractPositions
(
context
);
vector
<
Vec
3
>&
velData
=
extractVelocities
(
context
);
vector
<
Vec
3
>&
forceData
=
extractForces
(
context
);
if
(
dynamics
==
0
||
temperature
!=
prevTemp
||
friction
!=
prevFriction
||
errorTol
!=
prevErrorTol
)
{
// Recreate the computation objects with the new parameters.
if
(
dynamics
)
delete
dynamics
;
RealOpenMM
tau
=
static_cast
<
RealOpenMM
>
(
friction
==
0.0
?
0.0
:
1.0
/
friction
);
dynamics
=
new
ReferenceVariableStochasticDynamics
(
context
.
getSystem
().
getNumParticles
(),
(
RealOpenMM
)
tau
,
(
RealOpenMM
)
temperature
,
(
RealOpenMM
)
errorTol
);
dynamics
=
new
ReferenceVariableStochasticDynamics
(
context
.
getSystem
().
getNumParticles
(),
friction
,
temperature
,
errorTol
);
dynamics
->
setReferenceConstraintAlgorithm
(
&
extractConstraints
(
context
));
prevTemp
=
temperature
;
prevFriction
=
friction
;
prevErrorTol
=
errorTol
;
}
RealOpenMM
maxStepSize
=
(
RealOpenMM
)
(
maxTime
-
data
.
time
)
;
double
maxStepSize
=
maxTime
-
data
.
time
;
dynamics
->
update
(
context
.
getSystem
(),
posData
,
velData
,
forceData
,
masses
,
maxStepSize
,
integrator
.
getConstraintTolerance
());
data
.
time
+=
dynamics
->
getDeltaT
();
if
(
dynamics
->
getDeltaT
()
==
maxStepSize
)
...
...
@@ -2171,24 +2191,24 @@ void ReferenceIntegrateVariableVerletStepKernel::initialize(const System& system
int
numParticles
=
system
.
getNumParticles
();
masses
.
resize
(
numParticles
);
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
masses
[
i
]
=
static_cast
<
RealOpenMM
>
(
system
.
getParticleMass
(
i
)
)
;
masses
[
i
]
=
system
.
getParticleMass
(
i
);
}
double
ReferenceIntegrateVariableVerletStepKernel
::
execute
(
ContextImpl
&
context
,
const
VariableVerletIntegrator
&
integrator
,
double
maxTime
)
{
double
errorTol
=
integrator
.
getErrorTolerance
();
vector
<
Real
Vec
>&
posData
=
extractPositions
(
context
);
vector
<
Real
Vec
>&
velData
=
extractVelocities
(
context
);
vector
<
Real
Vec
>&
forceData
=
extractForces
(
context
);
vector
<
Vec
3
>&
posData
=
extractPositions
(
context
);
vector
<
Vec
3
>&
velData
=
extractVelocities
(
context
);
vector
<
Vec
3
>&
forceData
=
extractForces
(
context
);
if
(
dynamics
==
0
||
errorTol
!=
prevErrorTol
)
{
// Recreate the computation objects with the new parameters.
if
(
dynamics
)
delete
dynamics
;
dynamics
=
new
ReferenceVariableVerletDynamics
(
context
.
getSystem
().
getNumParticles
(),
(
RealOpenMM
)
errorTol
);
dynamics
=
new
ReferenceVariableVerletDynamics
(
context
.
getSystem
().
getNumParticles
(),
errorTol
);
dynamics
->
setReferenceConstraintAlgorithm
(
&
extractConstraints
(
context
));
prevErrorTol
=
errorTol
;
}
RealOpenMM
maxStepSize
=
(
RealOpenMM
)
(
maxTime
-
data
.
time
)
;
double
maxStepSize
=
maxTime
-
data
.
time
;
dynamics
->
update
(
context
.
getSystem
(),
posData
,
velData
,
forceData
,
masses
,
maxStepSize
,
integrator
.
getConstraintTolerance
());
data
.
time
+=
dynamics
->
getDeltaT
();
if
(
dynamics
->
getDeltaT
()
==
maxStepSize
)
...
...
@@ -2210,7 +2230,7 @@ void ReferenceIntegrateCustomStepKernel::initialize(const System& system, const
int
numParticles
=
system
.
getNumParticles
();
masses
.
resize
(
numParticles
);
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
masses
[
i
]
=
static_cast
<
RealOpenMM
>
(
system
.
getParticleMass
(
i
)
)
;
masses
[
i
]
=
system
.
getParticleMass
(
i
);
perDofValues
.
resize
(
integrator
.
getNumPerDofVariables
());
for
(
int
i
=
0
;
i
<
(
int
)
perDofValues
.
size
();
i
++
)
perDofValues
[
i
].
resize
(
numParticles
);
...
...
@@ -2222,9 +2242,9 @@ void ReferenceIntegrateCustomStepKernel::initialize(const System& system, const
}
void
ReferenceIntegrateCustomStepKernel
::
execute
(
ContextImpl
&
context
,
CustomIntegrator
&
integrator
,
bool
&
forcesAreValid
)
{
vector
<
Real
Vec
>&
posData
=
extractPositions
(
context
);
vector
<
Real
Vec
>&
velData
=
extractVelocities
(
context
);
vector
<
Real
Vec
>&
forceData
=
extractForces
(
context
);
vector
<
Vec
3
>&
posData
=
extractPositions
(
context
);
vector
<
Vec
3
>&
velData
=
extractVelocities
(
context
);
vector
<
Vec
3
>&
forceData
=
extractForces
(
context
);
// Record global variables.
...
...
@@ -2248,9 +2268,9 @@ void ReferenceIntegrateCustomStepKernel::execute(ContextImpl& context, CustomInt
}
double
ReferenceIntegrateCustomStepKernel
::
computeKineticEnergy
(
ContextImpl
&
context
,
CustomIntegrator
&
integrator
,
bool
&
forcesAreValid
)
{
vector
<
Real
Vec
>&
posData
=
extractPositions
(
context
);
vector
<
Real
Vec
>&
velData
=
extractVelocities
(
context
);
vector
<
Real
Vec
>&
forceData
=
extractForces
(
context
);
vector
<
Vec
3
>&
posData
=
extractPositions
(
context
);
vector
<
Vec
3
>&
velData
=
extractVelocities
(
context
);
vector
<
Vec
3
>&
forceData
=
extractForces
(
context
);
// Record global variables.
...
...
@@ -2293,18 +2313,18 @@ void ReferenceApplyAndersenThermostatKernel::initialize(const System& system, co
int
numParticles
=
system
.
getNumParticles
();
masses
.
resize
(
numParticles
);
for
(
int
i
=
0
;
i
<
numParticles
;
++
i
)
masses
[
i
]
=
static_cast
<
RealOpenMM
>
(
system
.
getParticleMass
(
i
)
)
;
masses
[
i
]
=
system
.
getParticleMass
(
i
);
this
->
thermostat
=
new
ReferenceAndersenThermostat
();
SimTKOpenMMUtilities
::
setRandomNumberSeed
((
unsigned
int
)
thermostat
.
getRandomNumberSeed
());
particleGroups
=
AndersenThermostatImpl
::
calcParticleGroups
(
system
);
}
void
ReferenceApplyAndersenThermostatKernel
::
execute
(
ContextImpl
&
context
)
{
vector
<
Real
Vec
>&
velData
=
extractVelocities
(
context
);
vector
<
Vec
3
>&
velData
=
extractVelocities
(
context
);
thermostat
->
applyThermostat
(
particleGroups
,
velData
,
masses
,
static_cast
<
RealOpenMM
>
(
context
.
getParameter
(
AndersenThermostat
::
Temperature
())
)
,
static_cast
<
RealOpenMM
>
(
context
.
getParameter
(
AndersenThermostat
::
CollisionFrequency
())
)
,
static_cast
<
RealOpenMM
>
(
context
.
getIntegrator
().
getStepSize
())
)
;
context
.
getParameter
(
AndersenThermostat
::
Temperature
()),
context
.
getParameter
(
AndersenThermostat
::
CollisionFrequency
()),
context
.
getIntegrator
().
getStepSize
());
}
ReferenceApplyMonteCarloBarostatKernel
::~
ReferenceApplyMonteCarloBarostatKernel
()
{
...
...
@@ -2318,13 +2338,13 @@ void ReferenceApplyMonteCarloBarostatKernel::initialize(const System& system, co
void
ReferenceApplyMonteCarloBarostatKernel
::
scaleCoordinates
(
ContextImpl
&
context
,
double
scaleX
,
double
scaleY
,
double
scaleZ
)
{
if
(
barostat
==
NULL
)
barostat
=
new
ReferenceMonteCarloBarostat
(
context
.
getSystem
().
getNumParticles
(),
context
.
getMolecules
());
vector
<
Real
Vec
>&
posData
=
extractPositions
(
context
);
Real
Vec
*
boxVectors
=
extractBoxVectors
(
context
);
vector
<
Vec
3
>&
posData
=
extractPositions
(
context
);
Vec
3
*
boxVectors
=
extractBoxVectors
(
context
);
barostat
->
applyBarostat
(
posData
,
boxVectors
,
scaleX
,
scaleY
,
scaleZ
);
}
void
ReferenceApplyMonteCarloBarostatKernel
::
restoreCoordinates
(
ContextImpl
&
context
)
{
vector
<
Real
Vec
>&
posData
=
extractPositions
(
context
);
vector
<
Vec
3
>&
posData
=
extractPositions
(
context
);
barostat
->
restorePositions
(
posData
);
}
...
...
@@ -2338,17 +2358,17 @@ void ReferenceRemoveCMMotionKernel::initialize(const System& system, const CMMot
void
ReferenceRemoveCMMotionKernel
::
execute
(
ContextImpl
&
context
)
{
if
(
data
.
stepCount
%
frequency
!=
0
)
return
;
vector
<
Real
Vec
>&
velData
=
extractVelocities
(
context
);
vector
<
Vec
3
>&
velData
=
extractVelocities
(
context
);
// Calculate the center of mass momentum.
RealOpenMM
momentum
[]
=
{
0.0
,
0.0
,
0.0
};
RealOpenMM
mass
=
0.0
;
double
momentum
[]
=
{
0.0
,
0.0
,
0.0
};
double
mass
=
0.0
;
for
(
size_t
i
=
0
;
i
<
masses
.
size
();
++
i
)
{
momentum
[
0
]
+=
static_cast
<
RealOpenMM
>
(
masses
[
i
]
*
velData
[
i
][
0
]
)
;
momentum
[
1
]
+=
static_cast
<
RealOpenMM
>
(
masses
[
i
]
*
velData
[
i
][
1
]
)
;
momentum
[
2
]
+=
static_cast
<
RealOpenMM
>
(
masses
[
i
]
*
velData
[
i
][
2
]
)
;
mass
+=
static_cast
<
RealOpenMM
>
(
masses
[
i
]
)
;
momentum
[
0
]
+=
masses
[
i
]
*
velData
[
i
][
0
];
momentum
[
1
]
+=
masses
[
i
]
*
velData
[
i
][
1
];
momentum
[
2
]
+=
masses
[
i
]
*
velData
[
i
][
2
];
mass
+=
masses
[
i
];
}
// Adjust the particle velocities.
...
...
platforms/reference/src/ReferencePlatform.cpp
View file @
047934e2
...
...
@@ -35,7 +35,7 @@
#include "ReferenceKernels.h"
#include "openmm/internal/ContextImpl.h"
#include "SimTKOpenMMRealType.h"
#include "
Real
Vec.h"
#include "
openmm/
Vec
3
.h"
#include <map>
#include <vector>
...
...
@@ -82,7 +82,7 @@ double ReferencePlatform::getSpeed() const {
}
bool
ReferencePlatform
::
supportsDoublePrecision
()
const
{
return
(
sizeof
(
RealOpenMM
)
>=
sizeof
(
double
))
;
return
true
;
}
void
ReferencePlatform
::
contextCreated
(
ContextImpl
&
context
,
const
map
<
string
,
string
>&
properties
)
const
{
...
...
@@ -95,21 +95,21 @@ void ReferencePlatform::contextDestroyed(ContextImpl& context) const {
}
ReferencePlatform
::
PlatformData
::
PlatformData
(
const
System
&
system
)
:
time
(
0.0
),
stepCount
(
0
),
numParticles
(
system
.
getNumParticles
())
{
positions
=
new
vector
<
Real
Vec
>
(
numParticles
);
velocities
=
new
vector
<
Real
Vec
>
(
numParticles
);
forces
=
new
vector
<
Real
Vec
>
(
numParticles
);
periodicBoxSize
=
new
Real
Vec
();
periodicBoxVectors
=
new
Real
Vec
[
3
];
positions
=
new
vector
<
Vec
3
>
(
numParticles
);
velocities
=
new
vector
<
Vec
3
>
(
numParticles
);
forces
=
new
vector
<
Vec
3
>
(
numParticles
);
periodicBoxSize
=
new
Vec
3
();
periodicBoxVectors
=
new
Vec
3
[
3
];
constraints
=
new
ReferenceConstraints
(
system
);
energyParameterDerivatives
=
new
map
<
string
,
double
>
();
}
ReferencePlatform
::
PlatformData
::~
PlatformData
()
{
delete
(
vector
<
Real
Vec
>*
)
positions
;
delete
(
vector
<
Real
Vec
>*
)
velocities
;
delete
(
vector
<
Real
Vec
>*
)
forces
;
delete
(
Real
Vec
*
)
periodicBoxSize
;
delete
[]
(
Real
Vec
*
)
periodicBoxVectors
;
delete
(
vector
<
Vec
3
>*
)
positions
;
delete
(
vector
<
Vec
3
>*
)
velocities
;
delete
(
vector
<
Vec
3
>*
)
forces
;
delete
(
Vec
3
*
)
periodicBoxSize
;
delete
[]
(
Vec
3
*
)
periodicBoxVectors
;
delete
(
ReferenceConstraints
*
)
constraints
;
delete
(
map
<
string
,
double
>*
)
energyParameterDerivatives
;
}
platforms/reference/src/SimTKReference/ObcParameters.cpp
View file @
047934e2
...
...
@@ -28,6 +28,7 @@
#include "openmm/OpenMMException.h"
#include "ObcParameters.h"
#include "SimTKOpenMMRealType.h"
using
std
::
vector
;
using
namespace
OpenMM
;
...
...
@@ -121,7 +122,7 @@ void ObcParameters::setObcTypeParameters(ObcParameters::ObcType obcType) {
--------------------------------------------------------------------------------------- */
RealOpenMM
ObcParameters
::
getDielectricOffset
()
const
{
double
ObcParameters
::
getDielectricOffset
()
const
{
return
_dielectricOffset
;
}
...
...
@@ -133,7 +134,7 @@ RealOpenMM ObcParameters::getDielectricOffset() const {
--------------------------------------------------------------------------------------- */
RealOpenMM
ObcParameters
::
getAlphaObc
()
const
{
double
ObcParameters
::
getAlphaObc
()
const
{
return
_alphaObc
;
}
...
...
@@ -145,7 +146,7 @@ RealOpenMM ObcParameters::getAlphaObc() const {
--------------------------------------------------------------------------------------- */
RealOpenMM
ObcParameters
::
getBetaObc
()
const
{
double
ObcParameters
::
getBetaObc
()
const
{
return
_betaObc
;
}
...
...
@@ -157,7 +158,7 @@ RealOpenMM ObcParameters::getBetaObc() const {
--------------------------------------------------------------------------------------- */
RealOpenMM
ObcParameters
::
getGammaObc
()
const
{
double
ObcParameters
::
getGammaObc
()
const
{
return
_gammaObc
;
}
...
...
@@ -169,7 +170,7 @@ RealOpenMM ObcParameters::getGammaObc() const {
--------------------------------------------------------------------------------------- */
RealOpenMM
ObcParameters
::
getSolventDielectric
()
const
{
double
ObcParameters
::
getSolventDielectric
()
const
{
return
_solventDielectric
;
}
...
...
@@ -181,7 +182,7 @@ RealOpenMM ObcParameters::getSolventDielectric() const {
--------------------------------------------------------------------------------------- */
void
ObcParameters
::
setSolventDielectric
(
RealOpenMM
solventDielectric
)
{
void
ObcParameters
::
setSolventDielectric
(
double
solventDielectric
)
{
_solventDielectric
=
solventDielectric
;
}
/**---------------------------------------------------------------------------------------
...
...
@@ -192,7 +193,7 @@ void ObcParameters::setSolventDielectric(RealOpenMM solventDielectric) {
--------------------------------------------------------------------------------------- */
RealOpenMM
ObcParameters
::
getSoluteDielectric
()
const
{
double
ObcParameters
::
getSoluteDielectric
()
const
{
return
_soluteDielectric
;
}
...
...
@@ -204,7 +205,7 @@ RealOpenMM ObcParameters::getSoluteDielectric() const {
--------------------------------------------------------------------------------------- */
void
ObcParameters
::
setSoluteDielectric
(
RealOpenMM
soluteDielectric
)
{
void
ObcParameters
::
setSoluteDielectric
(
double
soluteDielectric
)
{
_soluteDielectric
=
soluteDielectric
;
}
...
...
@@ -216,7 +217,7 @@ void ObcParameters::setSoluteDielectric(RealOpenMM soluteDielectric) {
--------------------------------------------------------------------------------------- */
RealOpenMM
ObcParameters
::
getElectricConstant
()
const
{
double
ObcParameters
::
getElectricConstant
()
const
{
return
_electricConstant
;
}
...
...
@@ -228,7 +229,7 @@ RealOpenMM ObcParameters::getElectricConstant() const {
--------------------------------------------------------------------------------------- */
RealOpenMM
ObcParameters
::
getProbeRadius
()
const
{
double
ObcParameters
::
getProbeRadius
()
const
{
return
_probeRadius
;
}
...
...
@@ -240,25 +241,25 @@ RealOpenMM ObcParameters::getProbeRadius() const {
--------------------------------------------------------------------------------------- */
void
ObcParameters
::
setProbeRadius
(
RealOpenMM
probeRadius
)
{
void
ObcParameters
::
setProbeRadius
(
double
probeRadius
)
{
_probeRadius
=
probeRadius
;
}
/**---------------------------------------------------------------------------------------
Get pi*4*Asolv: used in ACE approximation for nonpolar term
((RealOpenMM)
M_PI
)
*4.0f*0.0049*1000.0; (Still)
((RealOpenMM)
M_PI
)
*4.0f*0.0054*1000.0; (OBC)
M_PI*4.0f*0.0049*1000.0; (Still)
M_PI*4.0f*0.0054*1000.0; (OBC)
@return pi4Asolv
--------------------------------------------------------------------------------------- */
RealOpenMM
ObcParameters
::
getPi4Asolv
()
const
{
double
ObcParameters
::
getPi4Asolv
()
const
{
return
_pi4Asolv
;
}
void
ObcParameters
::
setPi4Asolv
(
RealOpenMM
pi4Asolv
)
{
void
ObcParameters
::
setPi4Asolv
(
double
pi4Asolv
)
{
_pi4Asolv
=
pi4Asolv
;
}
...
...
@@ -270,7 +271,7 @@ void ObcParameters::setPi4Asolv(RealOpenMM pi4Asolv) {
--------------------------------------------------------------------------------------- */
const
vector
<
RealOpenMM
>&
ObcParameters
::
getAtomicRadii
()
const
{
const
vector
<
double
>&
ObcParameters
::
getAtomicRadii
()
const
{
return
_atomicRadii
;
}
...
...
@@ -282,7 +283,7 @@ const vector<RealOpenMM>& ObcParameters::getAtomicRadii() const {
--------------------------------------------------------------------------------------- */
void
ObcParameters
::
setAtomicRadii
(
const
vector
<
RealOpenMM
>&
atomicRadii
)
{
void
ObcParameters
::
setAtomicRadii
(
const
vector
<
double
>&
atomicRadii
)
{
if
(
atomicRadii
.
size
()
==
_atomicRadii
.
size
())
{
for
(
unsigned
int
ii
=
0
;
ii
<
atomicRadii
.
size
();
ii
++
)
{
...
...
@@ -306,7 +307,7 @@ void ObcParameters::setAtomicRadii(const vector<RealOpenMM>& atomicRadii) {
--------------------------------------------------------------------------------------- */
const
vector
<
RealOpenMM
>&
ObcParameters
::
getScaledRadiusFactors
()
const
{
const
vector
<
double
>&
ObcParameters
::
getScaledRadiusFactors
()
const
{
return
_scaledRadiusFactors
;
}
...
...
@@ -318,7 +319,7 @@ const vector<RealOpenMM>& ObcParameters::getScaledRadiusFactors() const {
--------------------------------------------------------------------------------------- */
void
ObcParameters
::
setScaledRadiusFactors
(
const
vector
<
RealOpenMM
>&
scaledRadiusFactors
)
{
void
ObcParameters
::
setScaledRadiusFactors
(
const
vector
<
double
>&
scaledRadiusFactors
)
{
if
(
scaledRadiusFactors
.
size
()
==
_scaledRadiusFactors
.
size
())
{
for
(
unsigned
int
ii
=
0
;
ii
<
scaledRadiusFactors
.
size
();
ii
++
)
{
...
...
@@ -342,7 +343,7 @@ void ObcParameters::setScaledRadiusFactors(const vector<RealOpenMM>& scaledRadiu
--------------------------------------------------------------------------------------- */
void
ObcParameters
::
setUseCutoff
(
RealOpenMM
distance
)
{
void
ObcParameters
::
setUseCutoff
(
double
distance
)
{
_cutoff
=
true
;
_cutoffDistance
=
distance
;
...
...
@@ -364,7 +365,7 @@ bool ObcParameters::getUseCutoff() const {
--------------------------------------------------------------------------------------- */
RealOpenMM
ObcParameters
::
getCutoffDistance
()
const
{
double
ObcParameters
::
getCutoffDistance
()
const
{
return
_cutoffDistance
;
}
...
...
@@ -378,7 +379,7 @@ RealOpenMM ObcParameters::getCutoffDistance() const {
--------------------------------------------------------------------------------------- */
void
ObcParameters
::
setPeriodic
(
OpenMM
::
Real
Vec
*
vectors
)
{
void
ObcParameters
::
setPeriodic
(
OpenMM
::
Vec
3
*
vectors
)
{
assert
(
_cutoff
);
...
...
@@ -408,6 +409,6 @@ bool ObcParameters::getPeriodic() {
--------------------------------------------------------------------------------------- */
const
OpenMM
::
Real
Vec
*
ObcParameters
::
getPeriodicBox
()
{
const
OpenMM
::
Vec
3
*
ObcParameters
::
getPeriodicBox
()
{
return
_periodicBoxVectors
;
}
platforms/reference/src/SimTKReference/ReferenceAndersenThermostat.cpp
View file @
047934e2
...
...
@@ -22,6 +22,7 @@
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <cmath>
#include <string.h>
#include <sstream>
...
...
@@ -61,10 +62,10 @@ using namespace OpenMM;
--------------------------------------------------------------------------------------- */
void
ReferenceAndersenThermostat
::
applyThermostat
(
const
vector
<
vector
<
int
>
>&
atomGroups
,
vector
<
Real
Vec
>&
atomVelocities
,
vector
<
RealOpenMM
>&
atomMasses
,
RealOpenMM
temperature
,
RealOpenMM
collisionFrequency
,
RealOpenMM
stepSize
)
const
{
void
ReferenceAndersenThermostat
::
applyThermostat
(
const
vector
<
vector
<
int
>
>&
atomGroups
,
vector
<
Vec
3
>&
atomVelocities
,
vector
<
double
>&
atomMasses
,
double
temperature
,
double
collisionFrequency
,
double
stepSize
)
const
{
const
RealOpenMM
collisionProbability
=
1.0
f
-
EXP
(
-
collisionFrequency
*
stepSize
);
const
double
collisionProbability
=
1.0
f
-
exp
(
-
collisionFrequency
*
stepSize
);
for
(
int
i
=
0
;
i
<
(
int
)
atomGroups
.
size
();
++
i
)
{
if
(
SimTKOpenMMUtilities
::
getUniformlyDistributedRandomNumber
()
<
collisionProbability
)
{
...
...
@@ -73,7 +74,7 @@ using namespace OpenMM;
for
(
int
j
=
0
;
j
<
(
int
)
atomGroups
[
i
].
size
();
j
++
)
{
int
atom
=
atomGroups
[
i
][
j
];
if
(
atomMasses
[
atom
]
!=
0
)
{
const
RealOpenMM
velocityScale
=
static_cast
<
RealOpenMM
>
(
sqrt
(
BOLTZ
*
temperature
/
atomMasses
[
atom
]));
const
double
velocityScale
=
static_cast
<
double
>
(
sqrt
(
BOLTZ
*
temperature
/
atomMasses
[
atom
]));
atomVelocities
[
atom
][
0
]
=
velocityScale
*
SimTKOpenMMUtilities
::
getNormallyDistributedRandomNumber
();
atomVelocities
[
atom
][
1
]
=
velocityScale
*
SimTKOpenMMUtilities
::
getNormallyDistributedRandomNumber
();
atomVelocities
[
atom
][
2
]
=
velocityScale
*
SimTKOpenMMUtilities
::
getNormallyDistributedRandomNumber
();
...
...
platforms/reference/src/SimTKReference/ReferenceAngleBondIxn.cpp
View file @
047934e2
...
...
@@ -39,13 +39,6 @@ using namespace OpenMM;
--------------------------------------------------------------------------------------- */
ReferenceAngleBondIxn
::
ReferenceAngleBondIxn
()
:
usePeriodic
(
false
)
{
// ---------------------------------------------------------------------------------------
// static const char* methodName = "\nReferenceAngleBondIxn::ReferenceAngleBondIxn";
// ---------------------------------------------------------------------------------------
}
/**---------------------------------------------------------------------------------------
...
...
@@ -55,16 +48,9 @@ ReferenceAngleBondIxn::ReferenceAngleBondIxn() : usePeriodic(false) {
--------------------------------------------------------------------------------------- */
ReferenceAngleBondIxn
::~
ReferenceAngleBondIxn
()
{
// ---------------------------------------------------------------------------------------
// static const char* methodName = "\nReferenceAngleBondIxn::~ReferenceAngleBondIxn";
// ---------------------------------------------------------------------------------------
}
void
ReferenceAngleBondIxn
::
setPeriodic
(
OpenMM
::
Real
Vec
*
vectors
)
{
void
ReferenceAngleBondIxn
::
setPeriodic
(
OpenMM
::
Vec
3
*
vectors
)
{
usePeriodic
=
true
;
boxVectors
[
0
]
=
vectors
[
0
];
boxVectors
[
1
]
=
vectors
[
1
];
...
...
@@ -83,32 +69,22 @@ void ReferenceAngleBondIxn::setPeriodic(OpenMM::RealVec* vectors) {
--------------------------------------------------------------------------------------- */
void
ReferenceAngleBondIxn
::
getPrefactorsGivenAngleCosine
(
RealOpenMM
cosine
,
RealOpenMM
*
angleParameters
,
RealOpenMM
*
dEdR
,
RealOpenMM
*
energyTerm
)
const
{
// ---------------------------------------------------------------------------------------
// static const std::string methodName = "\nReferenceAngleBondIxn::getPrefactorsGivenAngleCosine";
static
const
RealOpenMM
zero
=
0.0
;
static
const
RealOpenMM
one
=
1.0
;
static
const
RealOpenMM
half
=
0.5
;
void
ReferenceAngleBondIxn
::
getPrefactorsGivenAngleCosine
(
double
cosine
,
double
*
angleParameters
,
double
*
dEdR
,
double
*
energyTerm
)
const
{
// ---------------------------------------------------------------------------------------
RealOpenMM
angle
;
if
(
cosine
>=
one
)
{
angle
=
zero
;
}
else
if
(
cosine
<=
-
one
)
{
double
angle
;
if
(
cosine
>=
1.0
)
{
angle
=
0.0
;
}
else
if
(
cosine
<=
-
1.0
)
{
angle
=
PI_M
;
}
else
{
angle
=
ACOS
(
cosine
);
angle
=
acos
(
cosine
);
}
RealOpenMM
deltaIdeal
=
angle
-
angleParameters
[
0
];
RealOpenMM
deltaIdeal2
=
deltaIdeal
*
deltaIdeal
;
double
deltaIdeal
=
angle
-
angleParameters
[
0
];
double
deltaIdeal2
=
deltaIdeal
*
deltaIdeal
;
*
dEdR
=
angleParameters
[
1
]
*
deltaIdeal
;
*
energyTerm
=
half
*
angleParameters
[
1
]
*
deltaIdeal2
;
*
energyTerm
=
0.5
*
angleParameters
[
1
]
*
deltaIdeal2
;
}
...
...
@@ -126,24 +102,14 @@ void ReferenceAngleBondIxn::getPrefactorsGivenAngleCosine(RealOpenMM cosine, Rea
--------------------------------------------------------------------------------------- */
void
ReferenceAngleBondIxn
::
calculateBondIxn
(
int
*
atomIndices
,
vector
<
RealVec
>&
atomCoordinates
,
RealOpenMM
*
parameters
,
vector
<
RealVec
>&
forces
,
RealOpenMM
*
totalEnergy
,
double
*
energyParamDerivs
)
{
// constants -- reduce Visual Studio warnings regarding conversions between float & double
static
const
RealOpenMM
zero
=
0.0
;
static
const
RealOpenMM
one
=
1.0
;
static
const
RealOpenMM
two
=
2.0
;
static
const
RealOpenMM
three
=
3.0
;
static
const
RealOpenMM
oneM
=
-
1.0
;
static
const
int
threeI
=
3
;
vector
<
Vec3
>&
atomCoordinates
,
double
*
parameters
,
vector
<
Vec3
>&
forces
,
double
*
totalEnergy
,
double
*
energyParamDerivs
)
{
static
const
int
LastAtomIndex
=
3
;
static
const
int
LastAtomIndex
=
3
;
RealOpenMM
deltaR
[
2
][
ReferenceForce
::
LastDeltaRIndex
];
double
deltaR
[
2
][
ReferenceForce
::
LastDeltaRIndex
];
// ---------------------------------------------------------------------------------------
...
...
@@ -161,37 +127,36 @@ void ReferenceAngleBondIxn::calculateBondIxn(int* atomIndices,
ReferenceForce
::
getDeltaR
(
atomCoordinates
[
atomCIndex
],
atomCoordinates
[
atomBIndex
],
deltaR
[
1
]);
}
RealOpenMM
pVector
[
threeI
];
double
pVector
[
3
];
SimTKOpenMMUtilities
::
crossProductVector3
(
deltaR
[
0
],
deltaR
[
1
],
pVector
);
RealOpenMM
rp
=
DOT3
(
pVector
,
pVector
);
rp
=
SQRT
(
rp
);
double
rp
=
sqrt
(
DOT3
(
pVector
,
pVector
));
if
(
rp
<
1.0e-06
)
{
rp
=
(
RealOpenMM
)
1.0e-06
;
rp
=
1.0e-06
;
}
RealOpenMM
dot
=
DOT3
(
deltaR
[
0
],
deltaR
[
1
]);
RealOpenMM
cosine
=
dot
/
SQRT
((
deltaR
[
0
][
ReferenceForce
::
R2Index
]
*
deltaR
[
1
][
ReferenceForce
::
R2Index
]));
double
dot
=
DOT3
(
deltaR
[
0
],
deltaR
[
1
]);
double
cosine
=
dot
/
sqrt
((
deltaR
[
0
][
ReferenceForce
::
R2Index
]
*
deltaR
[
1
][
ReferenceForce
::
R2Index
]));
RealOpenMM
dEdR
;
RealOpenMM
energy
;
double
dEdR
;
double
energy
;
getPrefactorsGivenAngleCosine
(
cosine
,
parameters
,
&
dEdR
,
&
energy
);
RealOpenMM
termA
=
dEdR
/
(
deltaR
[
0
][
ReferenceForce
::
R2Index
]
*
rp
);
RealOpenMM
termC
=
-
dEdR
/
(
deltaR
[
1
][
ReferenceForce
::
R2Index
]
*
rp
);
double
termA
=
dEdR
/
(
deltaR
[
0
][
ReferenceForce
::
R2Index
]
*
rp
);
double
termC
=
-
dEdR
/
(
deltaR
[
1
][
ReferenceForce
::
R2Index
]
*
rp
);
RealOpenMM
deltaCrossP
[
LastAtomIndex
][
threeI
];
double
deltaCrossP
[
LastAtomIndex
][
3
];
SimTKOpenMMUtilities
::
crossProductVector3
(
deltaR
[
0
],
pVector
,
deltaCrossP
[
0
]);
SimTKOpenMMUtilities
::
crossProductVector3
(
deltaR
[
1
],
pVector
,
deltaCrossP
[
2
]);
for
(
int
ii
=
0
;
ii
<
threeI
;
ii
++
)
{
for
(
int
ii
=
0
;
ii
<
3
;
ii
++
)
{
deltaCrossP
[
0
][
ii
]
*=
termA
;
deltaCrossP
[
2
][
ii
]
*=
termC
;
deltaCrossP
[
1
][
ii
]
=
oneM
*
(
deltaCrossP
[
0
][
ii
]
+
deltaCrossP
[
2
][
ii
]);
deltaCrossP
[
1
][
ii
]
=
-
(
deltaCrossP
[
0
][
ii
]
+
deltaCrossP
[
2
][
ii
]);
}
// accumulate forces
for
(
int
jj
=
0
;
jj
<
LastAtomIndex
;
jj
++
)
{
for
(
int
ii
=
0
;
ii
<
threeI
;
ii
++
)
{
for
(
int
ii
=
0
;
ii
<
3
;
ii
++
)
{
forces
[
atomIndices
[
jj
]][
ii
]
+=
deltaCrossP
[
jj
][
ii
];
}
}
...
...
platforms/reference/src/SimTKReference/ReferenceBondForce.cpp
View file @
047934e2
...
...
@@ -38,13 +38,6 @@ using namespace OpenMM;
--------------------------------------------------------------------------------------- */
ReferenceBondForce
::
ReferenceBondForce
()
{
// ---------------------------------------------------------------------------------------
// static const char* methodName = "\nReferenceBondForce::ReferenceBondForce";
// ---------------------------------------------------------------------------------------
}
/**---------------------------------------------------------------------------------------
...
...
@@ -54,13 +47,6 @@ ReferenceBondForce::ReferenceBondForce() {
--------------------------------------------------------------------------------------- */
ReferenceBondForce
::~
ReferenceBondForce
()
{
// ---------------------------------------------------------------------------------------
// static const char* methodName = "\nReferenceBondForce::~ReferenceBondForce";
// ---------------------------------------------------------------------------------------
}
/**---------------------------------------------------------------------------------------
...
...
@@ -79,19 +65,12 @@ ReferenceBondForce::~ReferenceBondForce() {
--------------------------------------------------------------------------------------- */
void
ReferenceBondForce
::
calculateForce
(
int
numberOfBonds
,
int
**
atomIndices
,
vector
<
Real
Vec
>&
atomCoordinates
,
RealOpenMM
**
parameters
,
vector
<
Real
Vec
>&
forces
,
RealOpenMM
*
totalEnergy
,
vector
<
Vec
3
>&
atomCoordinates
,
double
**
parameters
,
vector
<
Vec
3
>&
forces
,
double
*
totalEnergy
,
ReferenceBondIxn
&
referenceBondIxn
)
{
// ---------------------------------------------------------------------------------------
static
const
char
*
methodName
=
"
\n
ReferenceBondForce::calculateForce"
;
// ---------------------------------------------------------------------------------------
for
(
int
ii
=
0
;
ii
<
numberOfBonds
;
ii
++
)
{
// calculate bond ixn
...
...
Prev
1
…
6
7
8
9
10
11
12
13
14
…
18
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